function TransparentStretchBlt(DstDC: HDC; DstX, DstY, DstW, DstH: Integer;
SrcDC: HDC; SrcX, SrcY, SrcW, SrcH: Integer; MaskDC: HDC; MaskX,
MaskY: Integer): Boolean;
const
ROP_DstCopy = $00AA0029;
var
MemDC: HDC;
MemBmp: HBITMAP;
BkMemDC: HDC;
BkMemBmp: HBITMAP;
Save: THandle;
BkSave: THandle;
SavePal: HPALETTE;
BkSavePal: HPALETTE;
begin
Result := True;
if (Win32Platform = VER_PLATFORM_WIN32_NT) and (SrcW = DstW) and (SrcH = DstH) then
begin
MemBmp := GDICheck(CreateCompatibleBitmap(SrcDC, 1, 1));
MemBmp := SelectObject(MaskDC, MemBmp);
try
MaskBlt(DstDC, DstX, DstY, DstW, DstH, SrcDC, SrcX, SrcY, MemBmp, MaskX,
MaskY, MakeRop4(ROP_DstCopy, SrcCopy));
finally
MemBmp := SelectObject(MaskDC, MemBmp);
DeleteObject(MemBmp);
end;
end
else
begin
MemDC := GDICheck(CreateCompatibleDC(0));
try
MemBmp := GDICheck(CreateCompatibleBitmap(SrcDC, SrcW, SrcH));
try
Save := SelectObject(MemDC, MemBmp);
try
SavePal := SelectPalette(SrcDC, SystemPalette16, False);
SelectPalette(SrcDC, SavePal, False);
if SavePal <> 0 then
SavePal := SelectPalette(MemDC, SavePal, True)
else
SavePal := SelectPalette(MemDC, SystemPalette16, True);
try
RealizePalette(MemDC);
BkMemDC := GDICheck(CreateCompatibleDC(0));
try
BkMemBmp := GDICheck(CreateCompatibleBitmap(SrcDC, DstW, DstH));
try
BkSave := SelectObject(BkMemDC, BkMemBmp);
try
BkSavePal := SelectPalette(SrcDC, SystemPalette16, False);
SelectPalette(SrcDC, BkSavePal, False);
if BkSavePal <> 0 then
BkSavePal := SelectPalette(BkMemDC, BkSavePal, True)
else
BkSavePal := SelectPalette(BkMemDC, SystemPalette16, True);
try
RealizePalette(BkMemDC);
StretchBlt(MemDC, 0, 0, SrcW, SrcH, MaskDC, MaskX, MaskY, SrcW, SrcH, SrcCopy);
StretchBlt(MemDC, 0, 0, SrcW, SrcH, SrcDC, SrcX, SrcY, SrcW, SrcH, SrcErase);
StretchBlt(BkMemDC, 0, 0, DstW, DstH, MaskDC, MaskX, MaskY, SrcW, SrcH, SrcCopy);
StretchBlt(BkMemDC, 0, 0, DstW, DstH, DstDC, DstX, DstY, DstW, DstH, SrcAnd);
StretchBlt(BkMemDC, 0, 0, DstW, DstH, MemDC, 0, 0, SrcW, SrcH, SrcInvert);
StretchBlt(DstDC, DstX, DstY, DstW, DstH, BkMemDC, 0, 0, DstW, DstH, SrcCopy);
finally
if BkSavePal <> 0 then SelectPalette(BkMemDC, BkSavePal, False);
end;
finally
if BkSave <> 0 then SelectObject(BkMemDC, BkSave);
end;
finally
DeleteObject(BkMemBmp);
end;
finally
DeleteDC(BkMemDC);
end;
finally
if SavePal <> 0 then SelectPalette(MemDC, SavePal, False);
end;
finally
if Save <> 0 then SelectObject(MemDC, Save);
end;
finally
DeleteObject(MemBmp);
end;
finally
DeleteDC(MemDC);
end;
end;
end; |