utest.pas 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. unit utest;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs,
  6. BCImageButton, BGRAVirtualScreen, BGRABitmap, BGRABitmapTypes, BCTypes,
  7. BCFilters, BGRATextFX, Types;
  8. type
  9. { TForm1 }
  10. TForm1 = class(TForm)
  11. BCXButton1: TBCXButton;
  12. BCXButton2: TBCXButton;
  13. BCXButton3: TBCXButton;
  14. BCXButton4: TBCXButton;
  15. BCXButton5: TBCXButton;
  16. BCXButton6: TBCXButton;
  17. BCXButton7: TBCXButton;
  18. vs1: TBGRAVirtualScreen;
  19. procedure BCXButton1RenderControl(Sender: TObject; Bitmap: TBGRABitmap;
  20. State: TBCGraphicButtonState);
  21. procedure BCXButton3RenderControl(Sender: TObject; Bitmap: TBGRABitmap;
  22. State: TBCGraphicButtonState);
  23. procedure vs1Redraw(Sender: TObject; Bitmap: TBGRABitmap);
  24. procedure FormCreate(Sender: TObject);
  25. procedure FormDestroy(Sender: TObject);
  26. private
  27. { private declarations }
  28. public
  29. { public declarations }
  30. Image: TBGRABitmap;
  31. end;
  32. var
  33. Form1: TForm1;
  34. implementation
  35. uses
  36. Themes, LCLType;
  37. {$R *.lfm}
  38. { Button }
  39. procedure DrawBasicXButton(Sender: TObject; Bitmap: TBGRABitmap;
  40. State: TBCGraphicButtonState);
  41. begin
  42. case State of
  43. gbsNormal: Bitmap.Fill(BGRA(255, 0, 0, 100));
  44. gbsHover: Bitmap.Fill(BGRA(0, 255, 0, 100));
  45. gbsActive: Bitmap.Fill(BGRA(0, 0, 255, 100));
  46. gbsDisabled: Bitmap.Fill(BGRA(0, 0, 0, 100));
  47. end;
  48. end;
  49. procedure DrawGlassXButton(Sender: TObject; Bitmap, Background: TBGRABitmap;
  50. State: TBCGraphicButtonState);
  51. var
  52. tmp: TBGRABitmap;
  53. r: TRect;
  54. begin
  55. { Rect to copy backround }
  56. with TBCXButton(Sender) do
  57. r := Rect(Left, Top, Left + Width, Top + Height);
  58. { Copy background }
  59. tmp := Background.GetPart(r) as TBGRABitmap;
  60. { Apply blur }
  61. BGRAReplace(tmp, tmp.FilterBlurRadial(25, rbFast));
  62. { Blend }
  63. Bitmap.BlendImageOver(0, 0, tmp, boLinearBlend);
  64. tmp.Free;
  65. { Rect to draw borders }
  66. r := Rect(0, 0, Bitmap.Width, Bitmap.Height);
  67. { Draw borders }
  68. case State of
  69. gbsNormal:
  70. begin
  71. Bitmap.Rectangle(r, BGRA(0, 0, 0, 100), BGRA(255, 255, 255, 10),
  72. dmDrawWithTransparency);
  73. r := Rect(r.Left + 1, r.Top + 1, r.Right - 1, r.Bottom - 1);
  74. Bitmap.Rectangle(r, BGRA(255, 255, 255, 100), BGRAPixelTransparent,
  75. dmDrawWithTransparency);
  76. end;
  77. gbsHover:
  78. begin
  79. Bitmap.Rectangle(r, BGRA(0, 0, 0, 100), BGRA(255, 255, 255, 50),
  80. dmDrawWithTransparency);
  81. r := Rect(r.Left + 1, r.Top + 1, r.Right - 1, r.Bottom - 1);
  82. Bitmap.Rectangle(r, BGRA(255, 255, 255, 100), BGRAPixelTransparent,
  83. dmDrawWithTransparency);
  84. end;
  85. gbsActive:
  86. begin
  87. Bitmap.Rectangle(r, BGRA(0, 0, 0, 100), BGRA(100, 100, 100, 50),
  88. dmDrawWithTransparency);
  89. r := Rect(r.Left + 1, r.Top + 1, r.Right - 1, r.Bottom - 1);
  90. Bitmap.Rectangle(r, BGRA(255, 255, 255, 50), BGRAPixelTransparent,
  91. dmDrawWithTransparency);
  92. end;
  93. gbsDisabled:
  94. begin
  95. Bitmap.Rectangle(r, BGRA(0, 0, 0, 100), BGRA(100, 100, 100, 50),
  96. dmDrawWithTransparency);
  97. r := Rect(r.Left + 1, r.Top + 1, r.Right - 1, r.Bottom - 1);
  98. Bitmap.Rectangle(r, BGRA(100, 100, 100, 100), BGRAPixelTransparent,
  99. dmDrawWithTransparency);
  100. end;
  101. end;
  102. end;
  103. procedure DrawXButtonText(Sender: TObject; Bitmap: TBGRABitmap; State: TBCGraphicButtonState; Text: String);
  104. var
  105. tmp: TBGRABitmap;
  106. op: byte;
  107. begin
  108. if State = gbsDisabled then
  109. op := 100
  110. else
  111. op := 255;
  112. tmp := TextShadow(Bitmap.Width, Bitmap.Height, Text, 18, BGRA(255, 255, 255, op),
  113. BGRABlack, 1, 1, 2) as TBGRABitmap;
  114. Bitmap.BlendImageOver(0, 0, tmp, boLinearBlend);
  115. tmp.Free;
  116. end;
  117. { TForm1 }
  118. procedure TForm1.BCXButton1RenderControl(Sender: TObject; Bitmap: TBGRABitmap;
  119. State: TBCGraphicButtonState);
  120. var
  121. str: string;
  122. begin
  123. { Style }
  124. DrawGlassXButton(Sender, Bitmap, Image, State);
  125. //DrawBasicXButton(Sender, Bitmap, State);
  126. { Strings }
  127. str := TControl(Sender).Caption;
  128. { Text }
  129. DrawXButtonText(Sender, Bitmap, State, str);
  130. end;
  131. function SaveAlphaRect(ABitmap: TBGRABitmap; ARect: TRect): Pointer;
  132. var width,height,count,y: Integer;
  133. pAlphaData: PByte;
  134. pSrc: PBGRAPixel;
  135. begin
  136. IntersectRect(ARect,ARect,Classes.Rect(0,0,ABitmap.Width,ABitmap.Height));
  137. width := ARect.Right-ARect.Left;
  138. height := ARect.Bottom-ARect.Top;
  139. if (width <= 0) or (height <= 0) then result := nil;
  140. getmem(result, sizeof(longint)*2 + sizeof(byte)*width*height);
  141. PLongint(result)^ := width;
  142. (PLongint(result)+1)^ := height;
  143. pAlphaData := pbyte(plongint(result)+2);
  144. for y := ARect.Top to ARect.Bottom-1 do
  145. begin
  146. pSrc := ABitmap.ScanLine[y]+ARect.Left;
  147. count := width;
  148. while count > 0 do
  149. begin
  150. pAlphaData^ := pSrc^.alpha;
  151. inc(pAlphaData);
  152. inc(pSrc);
  153. dec(count);
  154. end;
  155. end;
  156. end;
  157. procedure RestoreAlphaRectAndFree(ABitmap: TBGRABitmap; AX,AY: integer; ASavedAlphaRect: Pointer);
  158. var width,height,count,y: Integer;
  159. pAlphaData: PByte;
  160. pSrc: PBGRAPixel;
  161. begin
  162. if ASavedAlphaRect = nil then exit;
  163. if AX < 0 then AX := 0;
  164. if AY < 0 then AY := 0;
  165. width := PLongint(ASavedAlphaRect)^;
  166. height := (PLongint(ASavedAlphaRect)+1)^;
  167. pAlphaData := pbyte(plongint(ASavedAlphaRect)+2);
  168. for y := AY to AY+height-1 do
  169. begin
  170. pSrc := ABitmap.ScanLine[y]+AX;
  171. count := width;
  172. while count > 0 do
  173. begin
  174. pSrc^.alpha := pAlphaData^;
  175. inc(pAlphaData);
  176. inc(pSrc);
  177. dec(count);
  178. end;
  179. end;
  180. freemem(ASavedAlphaRect);
  181. end;
  182. procedure TForm1.BCXButton3RenderControl(Sender: TObject; Bitmap: TBGRABitmap;
  183. State: TBCGraphicButtonState);
  184. var
  185. Details: TThemedElementDetails;
  186. PaintRect: TRect;
  187. AlphaRect: Pointer;
  188. begin
  189. PaintRect := Rect(0, 0, Bitmap.Width, Bitmap.Height);
  190. case State of
  191. gbsNormal: Details := ThemeServices.GetElementDetails(tbPushButtonNormal);
  192. gbsHover: Details := ThemeServices.GetElementDetails(tbPushButtonHot);
  193. gbsActive: Details := ThemeServices.GetElementDetails(tbPushButtonPressed);
  194. gbsDisabled: Details := ThemeServices.GetElementDetails(tbPushButtonDisabled);
  195. end;
  196. ThemeServices.DrawElement(Bitmap.Canvas.Handle, Details, PaintRect, nil);
  197. Bitmap.Canvas.Changed;
  198. PaintRect := ThemeServices.ContentRect(Bitmap.Canvas.Handle, Details, PaintRect);
  199. AlphaRect := SaveAlphaRect(Bitmap, PaintRect);
  200. ThemeServices.DrawText(Bitmap.Canvas, Details, TControl(Sender).Caption, PaintRect,
  201. DT_CENTER or DT_VCENTER or DT_SINGLELINE, 0);
  202. RestoreAlphaRectAndFree(Bitmap, PaintRect.Left,PaintRect.Top, AlphaRect);
  203. end;
  204. { Image }
  205. procedure TForm1.vs1Redraw(Sender: TObject; Bitmap: TBGRABitmap);
  206. begin
  207. Bitmap.BlendImageOver(0, 0, Image, boLinearBlend);
  208. end;
  209. procedure TForm1.FormCreate(Sender: TObject);
  210. begin
  211. BCXButton2.Enabled := False;
  212. BCXButton4.Enabled := False;
  213. Image := TBGRABitmap.Create(Application.Location + 'Desert.jpg');
  214. end;
  215. procedure TForm1.FormDestroy(Sender: TObject);
  216. begin
  217. Image.Free;
  218. end;
  219. end.