如何理解下面的步骤:
function Bitmap2Region( hBmp: TBitmap; TransColor: TColor; Tolerance: TColor): HRGN;
const
  ALLOC_UNIT = 100;
var 
  MemDC, DC: HDC; 
  BitmapInfo: TBitmapInfo;
  hbm32, holdBmp, holdMemBmp: HBitmap; 
  pbits32 : Pointer; 
  bm32 : BITMAP;
  maxRects: DWORD; 
  hData: HGLOBAL;
  pData: PRgnData;
  b, LR, LG, LB, HR, HG, HB: Byte; 
  p32: pByte; 
  x, x0, y: integer; 
  p: pLongInt; 
  pr: PRect; 
  h: HRGN;
begin
  Result := 0;
  if hBmp <> nil then 
  begin
   MemDC := CreateCompatibleDC(0);
    if MemDC <> 0 then 
    begin
      with BitmapInfo.bmiHeader do
      begin 
        biSize          := sizeof(TBitmapInfoHeader); 
        biWidth         := hBmp.Width; 
        biHeight        := hBmp.Height;
        biPlanes        := 1;
        biBitCount      := 32;
        biCompression   := BI_RGB; { (0) uncompressed format }
        biSizeImage     := 0; 
        biXPelsPerMeter := 0; 
        biYPelsPerMeter := 0; 
        biClrUsed       := 0;
        biClrImportant  := 0;
      end; 
      hbm32 := CreateDIBSection(MemDC, BitmapInfo, DIB_RGB_COLORS, pbits32,0, 0);
      if hbm32 <> 0 then
      begin
        holdMemBmp := SelectObject(MemDC, hbm32);
        GetObject(hbm32, SizeOf(bm32), @bm32);
        while (bm32.bmWidthBytes mod 4) > 0 do
          inc(bm32.bmWidthBytes); 
        DC := CreateCompatibleDC(MemDC);
        holdBmp := SelectObject(DC, hBmp.Handle);
        BitBlt(MemDC, 0, 0, hBmp.Width, hBmp.Height, DC, 0, 0, SRCCOPY);
        maxRects := ALLOC_UNIT; 
        hData := GlobalAlloc(GMEM_MOVEABLE, sizeof(TRgnDataHeader) +
           SizeOf(TRect) * maxRects); 
        pData := GlobalLock(hData);
        pData^.rdh.dwSize := SizeOf(TRgnDataHeader); 
        pData^.rdh.iType := RDH_RECTANGLES; 
        pData^.rdh.nCount := 0; 
        pData^.rdh.nRgnSize := 0; 
        SetRect(pData^.rdh.rcBound, MaxInt, MaxInt, 0, 0);  
        LR := GetRValue(ColorToRGB(TransColor)); 
        LG := GetGValue(ColorToRGB(TransColor)); 
        LB := GetBValue(ColorToRGB(TransColor)); 
        HR := MinByte($FF, LR + GetRValue(ColorToRGB(Tolerance))); 
        HG := MinByte($FF, LG + GetGValue(ColorToRGB(Tolerance))); 
        HB := MinByte($FF, LB + GetBValue(ColorToRGB(Tolerance))); 
        { 
          Scan each bitmap row from bottom to top, 
          the bitmap is inverted vertically 
        } 
        p32 := bm32.bmBits; 
        inc(PChar(p32), (bm32.bmHeight - 1) * bm32.bmWidthBytes); 
        for y := 0 to hBmp.Height-1 do 
        begin 
          { Scan each bitmap pixel from left to right } 
          x := -1; 
          while x+1 < hBmp.Width do 
          begin 
            inc(x); 
            x0 := x; 
            p := PLongInt(p32); 
            inc(PChar(p), x * SizeOf(LongInt)); 
            while x < hBmp.Width do 
            begin 
              b := GetBValue(p^);                 // Changed from GetRValue(p^) 
              if (b >= LR) and (b <= HR) then
              begin 
                b := GetGValue(p^);               // Left alone 
                if (b >= LG) and (b <= HG) then 
                begin 
                  b := GetRValue(p^);             // Changed from GetBValue(p^) 
                  if (b >= LB) and (b <= hb) then 
                    break; 
                end; 
              end; 
              inc(PChar(p), SizeOf(LongInt)); 
              inc(x); 
            end; 
            if x > x0 then 
            begin  
              if pData^.rdh.nCount >= maxRects then 
              begin 
                GlobalUnlock(hData); 
                inc(maxRects, ALLOC_UNIT); 
                hData := GlobalReAlloc(hData, SizeOf(TRgnDataHeader) + 
                   SizeOf(TRect) * maxRects, GMEM_MOVEABLE); 
                pData := GlobalLock(hData); 
                Assert(pData <> NIL); 
              end; 
              pr := @pData^.Buffer[pData^.rdh.nCount * SizeOf(TRect)]; 
              SetRect(pr^, x0, y, x, y+1); 
              if x0 < pData^.rdh.rcBound.Left then 
                pData^.rdh.rcBound.Left := x0; 
              if y < pData^.rdh.rcBound.Top then 
                pData^.rdh.rcBound.Top := y; 
              if x > pData^.rdh.rcBound.Right then 
                pData^.rdh.rcBound.Left := x; 
              if y+1 > pData^.rdh.rcBound.Bottom then 
                pData^.rdh.rcBound.Bottom := y+1; 
              inc(pData^.rdh.nCount); 
              if pData^.rdh.nCount = 2000 then 
              begin 
                h := ExtCreateRegion(NIL, SizeOf(TRgnDataHeader) +
                   (SizeOf(TRect) * maxRects), pData^); 
                Assert(h <> 0); 
                if Result <> 0 then 
                begin 
                  CombineRgn(Result, Result, h, RGN_OR); 
                  DeleteObject(h); 
                end else 
                  Result := h; 
                pData^.rdh.nCount := 0; 
                SetRect(pData^.rdh.rcBound, MaxInt, MaxInt, 0, 0); 
              end; 
            end; 
          end; 
          Dec(PChar(p32), bm32.bmWidthBytes); 
        end; 
        h := ExtCreateRegion(NIL, SizeOf(TRgnDataHeader) + 
           (SizeOf(TRect) * maxRects), pData^); 
        Assert(h <> 0); 
        if Result <> 0 then 
        begin 
          CombineRgn(Result, Result, h, RGN_OR); 
          DeleteObject(h); 
        end else
          Result := h; 
        { Clean up } 
        GlobalFree(hData); 
        SelectObject(DC, holdBmp); 
        DeleteDC(DC); 
        DeleteObject(SelectObject(MemDC, holdMemBmp));      end;
    end; 
    DeleteDC(MemDC);
  end;
end;