1
2
3function CreateBitmapMask(BitmapDC: HDC; Width, Height: Integer; TransparentColor: TColor): HBITMAP;
4var
5  OldColor: COLORREF;
6  OldObj: HBITMAP;
7  MaskDC: HDC;
8begin
9  Result := Windows.CreateBitmap(Width,Height,1,1,nil);
10  MaskDC := Windows.CreateCompatibleDC(BitmapDC);
11
12  OldObj := Windows.SelectObject(MaskDC,Result);
13  OldColor := Windows.SetBkColor(BitmapDC, Windows.COLORREF(ColorToRGB(TransparentColor)));
14
15  Windows.BitBlt(MaskDC,0,0,Width,Height,BitmapDC,0,0,SRCCOPY);
16
17  Windows.SetBkColor(BitmapDC,OldColor);
18  Windows.SelectObject(MaskDC,OldObj);
19  Windows.DeleteDC(MaskDC);
20end;
21
22function DirectMaskBlt(DestDC: HDC; X, Y, Width, Height: Integer; SrcDC: HDC; XSrc, YSrc: Integer; Mask: HBITMAP): Boolean;
23var
24  MaskDC: HDC;
25  MaskObj: HGDIOBJ;
26  PrevTextColor, PrevBkColor: COLORREF;
27begin
28  //this is a stripped version of LCL.StretchMaskBlt
29  if Mask <> 0 then
30  begin
31    MaskDC := Windows.CreateCompatibleDC(DestDC);
32    MaskObj := Windows.SelectObject(MaskDC, Mask);
33
34    PrevTextColor := Windows.SetTextColor(DestDC, $00000000);
35    PrevBkColor := Windows.SetBkColor(DestDC, $00FFFFFF);
36
37    Windows.BitBlt(DestDC, X, Y, Width, Height, SrcDC,  XSrc, YSrc, SRCINVERT);
38    Windows.BitBlt(DestDC, X, Y, Width, Height, MaskDC, XSrc, YSrc, SRCAND);
39    Windows.BitBlt(DestDC, X, Y, Width, Height, SrcDC,  XSrc, YSrc, SRCINVERT);
40
41    Windows.SetTextColor(DestDC, PrevTextColor);
42    Windows.SetBkColor(DestDC, PrevBkColor);
43    Windows.SelectObject(MaskDC, MaskObj);
44    Windows.DeleteDC(MaskDC);
45  end
46  else
47    Result := Windows.BitBlt(DestDC, X, Y, Width, Height, SrcDC, XSrc, YSrc, SRCCOPY);
48end;
49
50function OptimalPixelFormat: TPixelFormat;
51begin
52  if ScreenInfo.ColorDepth = 32 then
53    Result := pf32bit
54  else
55    Result := pfDevice;
56end;
57
58function OSSupportsUTF16: Boolean;
59begin
60  Result := Win32Platform = VER_PLATFORM_WIN32_NT;
61end;
62