bcleaengrave.pas 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. {
  2. *****************************************************************************
  3. See the file COPYING.modifiedLGPL.txt, included in this distribution,
  4. for details about the license.
  5. *****************************************************************************
  6. Author: Boban Spasic
  7. }
  8. unit BCLeaEngrave;
  9. {$mode ObjFPC}{$H+}
  10. interface
  11. uses
  12. Classes, SysUtils, Controls, Graphics, ExtCtrls, LResources,
  13. BGRABitmapTypes, BGRABitmap, BGRATextFX, BGRATransform;
  14. type
  15. TBCLeaEngrave = class(TCustomControl)
  16. private
  17. FBitmap: TBGRABitmap;
  18. FFontShadowColor: TColor;
  19. FFontShadowOffsetX: integer;
  20. FFontShadowOffsetY: integer;
  21. FFontShadowRadius: integer;
  22. FLayerZoom: integer;
  23. FLayerOffsetX: integer;
  24. FLayerOffsetY: integer;
  25. FBlendOperation: TBlendOperation;
  26. FInvBlending: boolean;
  27. FLayerColor: TColor;
  28. FAngle: integer;
  29. procedure SetFFontShadowColor(AValue: TColor);
  30. procedure SetFFontShadowOffsetX(AValue: integer);
  31. procedure SetFFontShadowOffsetY(AValue: integer);
  32. procedure SetFFontShadowRadius(AValue: integer);
  33. procedure SetLayerZoom(AValue: integer);
  34. procedure SetBlendOperation(AValue: TBlendOperation);
  35. procedure SetInvBlending(AValue: boolean);
  36. procedure SetLayerColor(AValue: TColor);
  37. procedure SetLayerOffsetX(AValue: integer);
  38. procedure SetLayerOffsetY(AValue: integer);
  39. procedure SetAngle(AValue: integer);
  40. protected
  41. procedure SetVisible(Value: boolean); override;
  42. procedure Paint; override;
  43. procedure Redraw;
  44. public
  45. constructor Create(AOwner: TComponent); override;
  46. destructor Destroy; override;
  47. published
  48. property Align;
  49. property Caption;
  50. property Color default clBtnFace;
  51. property Cursor;
  52. property Font;
  53. property ParentShowHint;
  54. property ShowHint;
  55. property Anchors;
  56. property Constraints;
  57. property Visible;
  58. property FontShadowColor: TColor read FFontShadowColor write SetFFontShadowColor default clBlack;
  59. property FontShadowOffsetX: integer read FFontShadowOffsetX write SetFFontShadowOffsetX default 2;
  60. property FontShadowOffsetY: integer read FFontShadowOffsetY write SetFFontShadowOffsetY default 2;
  61. property FontShadowRadius: integer read FFontSHadowRadius write SetFFontShadowRadius default 4;
  62. property BlendOperation: TBlendOperation read FBlendOperation write SetBlendOperation default boSubtractInverse;
  63. property LayerZoom: integer read FLayerZoom write SetLayerZoom default 102;
  64. property InverseBlending: boolean read FInvBlending write SetInvBlending default False;
  65. property LayerColor: TColor read FLayerColor write SetLayerColor default clBlack;
  66. property LayerOffsetX: integer read FLayerOffsetX write SetLayerOffsetX default 0;
  67. property LayerOffsetY: integer read FLayerOffsetY write SetLayerOffsetY default 0;
  68. property Angle: integer read FAngle write SetAngle default 0;
  69. end;
  70. procedure Register;
  71. implementation
  72. procedure Register;
  73. begin
  74. RegisterComponents('BGRA Controls', [TBCLeaEngrave]);
  75. end;
  76. constructor TBCLeaEngrave.Create(AOwner: TComponent);
  77. begin
  78. inherited Create(AOwner);
  79. with GetControlClassDefaultSize do
  80. SetInitialBounds(0, 0, 100, 100);
  81. Font.Color := clBlack;
  82. Font.Height := 20;
  83. FLayerZoom := 102;
  84. FBlendOperation := boSubtractInverse;
  85. FFontShadowRadius := 4;
  86. FFontShadowOffsetX := 2;
  87. FFontShadowOffsetY := 2;
  88. FFontShadowColor := clBlack;
  89. Color := clBtnFace;
  90. FLayerColor := clBlack;
  91. FLayerOffsetX := 0;
  92. FLayerOffsetY := 0;
  93. FAngle := 0;
  94. FInvBlending := False;
  95. FBitmap := TBGRABitmap.Create(Width, Height, Color);
  96. end;
  97. destructor TBCLeaEngrave.Destroy;
  98. begin
  99. FreeAndNil(FBitmap);
  100. inherited Destroy;
  101. end;
  102. procedure TBCLeaEngrave.SetVisible(Value: boolean);
  103. begin
  104. inherited SetVisible(Value);
  105. Invalidate;
  106. end;
  107. procedure TBCLeaEngrave.Paint;
  108. begin
  109. inherited Paint;
  110. Redraw;
  111. end;
  112. procedure TBCLeaEngrave.Redraw;
  113. var
  114. TextBmp, LayerTextBmp: TBGRABitmap;
  115. Zoom, UnZoom, RotBmp: TBGRABitmap;
  116. CopyRect: TRect;
  117. ZFactor: single;
  118. Rad: single;
  119. Affine: TBGRAAffineBitmapTransform;
  120. begin
  121. ZFactor := FLayerZoom / 100;
  122. FBitmap.SetSize(Width, Height);
  123. FBitmap.Fill(Color);
  124. TextBmp := TextShadow(Width, Height, Caption, Font.Height,
  125. Font.Color, FontShadowColor, FontShadowOFfsetX,
  126. FontShadowOffsetY, FontShadowRadius, Font.Style, Font.Name) as TBGRABitmap;
  127. LayerTextBmp := TextShadow(Width, Height, Caption, Font.Height,
  128. LayerColor, FontShadowColor, FontShadowOFfsetX,
  129. FontShadowOffsetY, FontShadowRadius, Font.Style, Font.Name) as TBGRABitmap;
  130. Zoom := LayerTextBmp.Resample(round(Width * ZFactor), round(Height * ZFactor)) as TBGRABitmap;
  131. CopyRect.Left := (Zoom.Width - Width) div 2 + FLayerOffsetX;
  132. CopyRect.Right := CopyRect.Left + Width + FLayerOffsetX;
  133. CopyRect.Top := (Zoom.Height - Height) div 2 + FLayerOffsetY;
  134. CopyRect.Bottom := CopyRect.Top + Height + FLayerOffsetY;
  135. UnZoom := Zoom.GetPart(CopyRect) as TBGRABitmap;
  136. if FInvBlending then
  137. begin
  138. FBitmap.PutImage(0, 0, UnZoom, dmDrawWithTransparency);
  139. FBitmap.BlendImageOver(0, 0, TextBmp, FBlendOperation);
  140. end
  141. else
  142. begin
  143. FBitmap.PutImage(0, 0, TextBmp, dmDrawWithTransparency);
  144. FBitmap.BlendImageOver(0, 0, UnZoom, FBlendOperation);
  145. end;
  146. if FAngle <> 0 then
  147. begin
  148. RotBmp := TBGRABitmap.Create(Width, Height, Color);
  149. Affine := TBGRAAffineBitmapTransform.Create(FBitmap);
  150. Affine.Translate(-FBitmap.Width div 2, -FBitmap.Height div 2);
  151. Affine.RotateDeg(FAngle);
  152. Affine.Translate(FBitmap.Width div 2, FBitmap.Height div 2);
  153. RotBmp.Fill(Affine);
  154. FBitmap.Fill(Color);
  155. FBitmap.PutImage(0, 0, RotBmp, dmDrawWithTransparency);
  156. Affine.Free;
  157. RotBmp.Free;
  158. end;
  159. if Visible then
  160. FBitmap.Draw(Canvas, 0, 0, True);
  161. TextBmp.Free;
  162. Zoom.Free;
  163. UnZoom.Free;
  164. end;
  165. procedure TBCLeaEngrave.SetFFontShadowColor(AValue: TColor);
  166. begin
  167. if FFontShadowColor = AValue then
  168. Exit;
  169. FFontShadowColor := AValue;
  170. Invalidate;
  171. end;
  172. procedure TBCLeaEngrave.SetFFontShadowOffsetX(AValue: integer);
  173. begin
  174. if FFontShadowOffsetX = AValue then
  175. Exit;
  176. FFontShadowOffsetX := AValue;
  177. Invalidate;
  178. end;
  179. procedure TBCLeaEngrave.SetFFontShadowOffsetY(AValue: integer);
  180. begin
  181. if FFontShadowOffsetY = AValue then
  182. Exit;
  183. FFontShadowOffsetY := AValue;
  184. Invalidate;
  185. end;
  186. procedure TBCLeaEngrave.SetFFontShadowRadius(AValue: integer);
  187. begin
  188. if FFontSHadowRadius = AValue then
  189. Exit;
  190. FFontSHadowRadius := AValue;
  191. Invalidate;
  192. end;
  193. procedure TBCLeaEngrave.SetBlendOperation(AValue: TBlendOperation);
  194. begin
  195. if FBlendOperation = AValue then
  196. Exit;
  197. FBlendOperation := AValue;
  198. Invalidate;
  199. end;
  200. procedure TBCLeaEngrave.SetLayerZoom(AValue: integer);
  201. begin
  202. if FLayerZoom = AValue then
  203. Exit;
  204. FLayerZoom := AValue;
  205. Invalidate;
  206. end;
  207. procedure TBCLeaEngrave.SetInvBlending(AValue: boolean);
  208. begin
  209. if FInvBlending = AValue then
  210. Exit;
  211. FInvBlending := AValue;
  212. Invalidate;
  213. end;
  214. procedure TBCLeaEngrave.SetLayerColor(AValue: TColor);
  215. begin
  216. if FLayerColor = AValue then
  217. Exit;
  218. FLayerColor := AValue;
  219. Invalidate;
  220. end;
  221. procedure TBCLeaEngrave.SetLayerOffsetX(AValue: integer);
  222. begin
  223. if FLayerOffsetX = AValue then
  224. Exit;
  225. FLayerOffsetX := AValue;
  226. Invalidate;
  227. end;
  228. procedure TBCLeaEngrave.SetLayerOffsetY(AValue: integer);
  229. begin
  230. if FLayerOffsetY = AValue then
  231. Exit;
  232. FLayerOffsetY := AValue;
  233. Invalidate;
  234. end;
  235. procedure TBCLeaEngrave.SetAngle(AValue: integer);
  236. begin
  237. if FAngle = AValue then
  238. Exit;
  239. FAngle := AValue;
  240. Invalidate;
  241. end;
  242. end.