GR32.Design.Color32.pas 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514
  1. unit GR32.Design.Color32;
  2. (* ***** BEGIN LICENSE BLOCK *****
  3. * Version: MPL 1.1 or LGPL 2.1 with linking exception
  4. *
  5. * The contents of this file are subject to the Mozilla Public License Version
  6. * 1.1 (the "License"); you may not use this file except in compliance with
  7. * the License. You may obtain a copy of the License at
  8. * http://www.mozilla.org/MPL/
  9. *
  10. * Software distributed under the License is distributed on an "AS IS" basis,
  11. * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  12. * for the specific language governing rights and limitations under the
  13. * License.
  14. *
  15. * Alternatively, the contents of this file may be used under the terms of the
  16. * Free Pascal modified version of the GNU Lesser General Public License
  17. * Version 2.1 (the "FPC modified LGPL License"), in which case the provisions
  18. * of this license are applicable instead of those above.
  19. * Please see the file LICENSE.txt for additional information concerning this
  20. * license.
  21. *
  22. * The Original Code is Graphics32
  23. *
  24. * The Initial Developer of the Original Code is
  25. * Alex A. Denisov
  26. *
  27. * Portions created by the Initial Developer are Copyright (C) 2000-2009
  28. * the Initial Developer. All Rights Reserved.
  29. *
  30. * ***** END LICENSE BLOCK ***** *)
  31. interface
  32. {$include GR32.inc}
  33. uses
  34. Classes, SysUtils,
  35. Generics.Collections,
  36. {$IFDEF FPC}
  37. RTLConsts, LazIDEIntf, PropEdits, Graphics, Dialogs, Forms,
  38. {$ifdef MSWINDOWS}
  39. Windows, Registry,
  40. {$ENDIF}
  41. {$ELSE}
  42. Consts,
  43. DesignIntf, DesignEditors, VCLEditors,
  44. Windows, Registry, Graphics, Dialogs, Forms, Controls,
  45. {$ENDIF}
  46. GR32, GR32_Image;
  47. type
  48. { TColorManager }
  49. TColorEntry = record
  50. Name: string;
  51. Color: TColor32;
  52. end;
  53. TColorManager = class(TList<TColorEntry>)
  54. public
  55. procedure AddColor(const AName: string; AColor: TColor32);
  56. procedure EnumColors(Proc: TGetStrProc);
  57. function FindColor(const AName: string): TColor32;
  58. function GetColor(const AName: string): TColor32;
  59. function GetColorName(AColor: TColor32): string;
  60. procedure RegisterDefaultColors;
  61. procedure RemoveColor(const AName: string);
  62. end;
  63. { TColor32Property }
  64. TColor32Property = class(TIntegerProperty
  65. {$IFDEF EXT_PROP_EDIT}
  66. , ICustomPropertyListDrawing, ICustomPropertyDrawing, ICustomPropertyDrawing80
  67. {$ENDIF}
  68. )
  69. public
  70. procedure Edit; override;
  71. function GetAttributes: TPropertyAttributes; override;
  72. function GetValue: string; override;
  73. procedure GetValues(Proc: TGetStrProc); override;
  74. procedure SetValue(const Value: string); override;
  75. {$IFDEF EXT_PROP_EDIT}
  76. { ICustomPropertyListDrawing }
  77. procedure ListMeasureWidth(const Value: string; ACanvas: TCanvas; var AWidth: Integer);
  78. procedure ListMeasureHeight(const Value: string; ACanvas: TCanvas; var AHeight: Integer);
  79. procedure ListDrawValue(const Value: string; ACanvas: TCanvas; const ARect: TRect; ASelected: Boolean);
  80. { ICustomPropertyDrawing }
  81. procedure PropDrawName(ACanvas: TCanvas; const ARect: TRect; ASelected: Boolean);
  82. procedure PropDrawValue(ACanvas: TCanvas; const ARect: TRect; ASelected: Boolean);
  83. { ICustomPropertyDrawing80 }
  84. function PropDrawNameRect(const ARect: TRect): TRect;
  85. function PropDrawValueRect(const ARect: TRect): TRect;
  86. {$ENDIF}
  87. end;
  88. procedure RegisterColor(const AName: string; AColor: TColor32);
  89. procedure UnregisterColor(const AName: string);
  90. var ColorManager: TColorManager;
  91. implementation
  92. uses
  93. GR32.Design.ColorPicker;
  94. { TColorManager }
  95. procedure TColorManager.AddColor(const AName: string; AColor: TColor32);
  96. var
  97. Entry: TColorEntry;
  98. begin
  99. Entry.Name := AName;
  100. Entry.Color := AColor;
  101. Add(Entry);
  102. end;
  103. procedure TColorManager.EnumColors(Proc: TGetStrProc);
  104. var
  105. Entry: TColorEntry;
  106. begin
  107. for Entry in Self do
  108. Proc(Entry.Name);
  109. end;
  110. function TColorManager.FindColor(const AName: string): TColor32;
  111. var
  112. Entry: TColorEntry;
  113. begin
  114. Result := clBlack32;
  115. for Entry in Self do
  116. if SameText(Entry.Name, AName) then
  117. begin
  118. Result := Entry.Color;
  119. break;
  120. end;
  121. end;
  122. function TColorManager.GetColor(const AName: string): TColor32;
  123. function HexToColor(const HexStr: string): Cardinal;
  124. var
  125. c: Char;
  126. begin
  127. Result := 0;
  128. for c in HexStr do
  129. begin
  130. case c of
  131. '0'..'9': Result := (Result shl 4) + Cardinal(Ord(c) - Ord('0'));
  132. 'A'..'F': Result := (Result shl 4) + Cardinal(Ord(c) - Ord('A') + 10);
  133. 'a'..'f': Result := (Result shl 4) + Cardinal(Ord(c) - Ord('a') + 10);
  134. else
  135. Result := clBlack32;
  136. break;
  137. end;
  138. if (Result >= $1FFFFFFF) then
  139. break; // Next digit would overflow
  140. end;
  141. end;
  142. var
  143. s: string;
  144. begin
  145. s := Trim(AName);
  146. if s[1] = '$' then
  147. System.Delete(s, 1, 1);
  148. if (s[1] = 'c') and (s[2] = 'l') then
  149. Result := FindColor(s)
  150. else
  151. Result := HexToColor(s);
  152. end;
  153. function TColorManager.GetColorName(AColor: TColor32): string;
  154. var
  155. Entry: TColorEntry;
  156. begin
  157. for Entry in Self do
  158. if Entry.Color = AColor then
  159. begin
  160. Result := string(Entry.Name);
  161. Exit;
  162. end;
  163. Result := '$' + IntToHex(AColor, 8);
  164. end;
  165. procedure TColorManager.RegisterDefaultColors;
  166. begin
  167. Capacity := 50;
  168. AddColor('clBlack32', clBlack32);
  169. AddColor('clDimGray32', clDimGray32);
  170. AddColor('clGray32', clGray32);
  171. AddColor('clLightGray32', clLightGray32);
  172. AddColor('clWhite32', clWhite32);
  173. AddColor('clMaroon32', clMaroon32);
  174. AddColor('clGreen32', clGreen32);
  175. AddColor('clOlive32', clOlive32);
  176. AddColor('clNavy32', clNavy32);
  177. AddColor('clPurple32', clPurple32);
  178. AddColor('clTeal32', clTeal32);
  179. AddColor('clRed32', clRed32);
  180. AddColor('clLime32', clLime32);
  181. AddColor('clYellow32', clYellow32);
  182. AddColor('clBlue32', clBlue32);
  183. AddColor('clFuchsia32', clFuchsia32);
  184. AddColor('clAqua32', clAqua32);
  185. AddColor('clTrWhite32', clTrWhite32);
  186. AddColor('clTrBlack32', clTrBlack32);
  187. AddColor('clTrRed32', clTrRed32);
  188. AddColor('clTrGreen32', clTrGreen32);
  189. AddColor('clTrBlue32', clTrBlue32);
  190. AddColor('clAliceBlue32', clAliceBlue32);
  191. AddColor('clAntiqueWhite32', clAntiqueWhite32);
  192. AddColor('clAquamarine32', clAquamarine32);
  193. AddColor('clAzure32', clAzure32);
  194. AddColor('clBeige32', clBeige32);
  195. AddColor('clBisque32', clBisque32);
  196. AddColor('clBlancheDalmond32', clBlancheDalmond32);
  197. AddColor('clBlueViolet32', clBlueViolet32);
  198. AddColor('clBrown32', clBrown32);
  199. AddColor('clBurlyWood32', clBurlyWood32);
  200. AddColor('clCadetblue32', clCadetblue32);
  201. AddColor('clChartReuse32', clChartReuse32);
  202. AddColor('clChocolate32', clChocolate32);
  203. AddColor('clCoral32', clCoral32);
  204. AddColor('clCornFlowerBlue32', clCornFlowerBlue32);
  205. AddColor('clCornSilk32', clCornSilk32);
  206. AddColor('clCrimson32', clCrimson32);
  207. AddColor('clDarkBlue32', clDarkBlue32);
  208. AddColor('clDarkCyan32', clDarkCyan32);
  209. AddColor('clDarkGoldenRod32', clDarkGoldenRod32);
  210. AddColor('clDarkGray32', clDarkGray32);
  211. AddColor('clDarkGreen32', clDarkGreen32);
  212. AddColor('clDarkGrey32', clDarkGrey32);
  213. AddColor('clDarkKhaki32', clDarkKhaki32);
  214. AddColor('clDarkMagenta32', clDarkMagenta32);
  215. AddColor('clDarkOliveGreen32', clDarkOliveGreen32);
  216. AddColor('clDarkOrange32', clDarkOrange32);
  217. AddColor('clDarkOrchid32', clDarkOrchid32);
  218. AddColor('clDarkRed32', clDarkRed32);
  219. AddColor('clDarkSalmon32', clDarkSalmon32);
  220. AddColor('clDarkSeaGreen32', clDarkSeaGreen32);
  221. AddColor('clDarkSlateBlue32', clDarkSlateBlue32);
  222. AddColor('clDarkSlateGray32', clDarkSlateGray32);
  223. AddColor('clDarkSlateGrey32', clDarkSlateGrey32);
  224. AddColor('clDarkTurquoise32', clDarkTurquoise32);
  225. AddColor('clDarkViolet32', clDarkViolet32);
  226. AddColor('clDeepPink32', clDeepPink32);
  227. AddColor('clDeepSkyBlue32', clDeepSkyBlue32);
  228. AddColor('clDodgerBlue32', clDodgerBlue32);
  229. AddColor('clFireBrick32', clFireBrick32);
  230. AddColor('clFloralWhite32', clFloralWhite32);
  231. AddColor('clGainsBoro32', clGainsBoro32);
  232. AddColor('clGhostWhite32', clGhostWhite32);
  233. AddColor('clGold32', clGold32);
  234. AddColor('clGoldenRod32', clGoldenRod32);
  235. AddColor('clGreenYellow32', clGreenYellow32);
  236. AddColor('clGrey32', clGrey32);
  237. AddColor('clHoneyDew32', clHoneyDew32);
  238. AddColor('clHotPink32', clHotPink32);
  239. AddColor('clIndianRed32', clIndianRed32);
  240. AddColor('clIndigo32', clIndigo32);
  241. AddColor('clIvory32', clIvory32);
  242. AddColor('clKhaki32', clKhaki32);
  243. AddColor('clLavender32', clLavender32);
  244. AddColor('clLavenderBlush32', clLavenderBlush32);
  245. AddColor('clLawnGreen32', clLawnGreen32);
  246. AddColor('clLemonChiffon32', clLemonChiffon32);
  247. AddColor('clLightBlue32', clLightBlue32);
  248. AddColor('clLightCoral32', clLightCoral32);
  249. AddColor('clLightCyan32', clLightCyan32);
  250. AddColor('clLightGoldenRodYellow32', clLightGoldenRodYellow32);
  251. AddColor('clLightGray32', clLightGray32);
  252. AddColor('clLightGreen32', clLightGreen32);
  253. AddColor('clLightGrey32', clLightGrey32);
  254. AddColor('clLightPink32', clLightPink32);
  255. AddColor('clLightSalmon32', clLightSalmon32);
  256. AddColor('clLightSeagreen32', clLightSeagreen32);
  257. AddColor('clLightSkyblue32', clLightSkyblue32);
  258. AddColor('clLightSlategray32', clLightSlategray32);
  259. AddColor('clLightSlategrey32', clLightSlategrey32);
  260. AddColor('clLightSteelblue32', clLightSteelblue32);
  261. AddColor('clLightYellow32', clLightYellow32);
  262. AddColor('clLtGray32', clLtGray32);
  263. AddColor('clMedGray32', clMedGray32);
  264. AddColor('clDkGray32', clDkGray32);
  265. AddColor('clMoneyGreen32', clMoneyGreen32);
  266. AddColor('clLegacySkyBlue32', clLegacySkyBlue32);
  267. AddColor('clCream32', clCream32);
  268. AddColor('clLimeGreen32', clLimeGreen32);
  269. AddColor('clLinen32', clLinen32);
  270. AddColor('clMediumAquamarine32', clMediumAquamarine32);
  271. AddColor('clMediumBlue32', clMediumBlue32);
  272. AddColor('clMediumOrchid32', clMediumOrchid32);
  273. AddColor('clMediumPurple32', clMediumPurple32);
  274. AddColor('clMediumSeaGreen32', clMediumSeaGreen32);
  275. AddColor('clMediumSlateBlue32', clMediumSlateBlue32);
  276. AddColor('clMediumSpringGreen32', clMediumSpringGreen32);
  277. AddColor('clMediumTurquoise32', clMediumTurquoise32);
  278. AddColor('clMediumVioletRed32', clMediumVioletRed32);
  279. AddColor('clMidnightBlue32', clMidnightBlue32);
  280. AddColor('clMintCream32', clMintCream32);
  281. AddColor('clMistyRose32', clMistyRose32);
  282. AddColor('clMoccasin32', clMoccasin32);
  283. AddColor('clNavajoWhite32', clNavajoWhite32);
  284. AddColor('clOldLace32', clOldLace32);
  285. AddColor('clOliveDrab32', clOliveDrab32);
  286. AddColor('clOrange32', clOrange32);
  287. AddColor('clOrangeRed32', clOrangeRed32);
  288. AddColor('clOrchid32', clOrchid32);
  289. AddColor('clPaleGoldenRod32', clPaleGoldenRod32);
  290. AddColor('clPaleGreen32', clPaleGreen32);
  291. AddColor('clPaleTurquoise32', clPaleTurquoise32);
  292. AddColor('clPaleVioletred32', clPaleVioletred32);
  293. AddColor('clPapayaWhip32', clPapayaWhip32);
  294. AddColor('clPeachPuff32', clPeachPuff32);
  295. AddColor('clPeru32', clPeru32);
  296. AddColor('clPlum32', clPlum32);
  297. AddColor('clPowderBlue32', clPowderBlue32);
  298. AddColor('clPurple32', clPurple32);
  299. AddColor('clRosyBrown32', clRosyBrown32);
  300. AddColor('clRoyalBlue32', clRoyalBlue32);
  301. AddColor('clSaddleBrown32', clSaddleBrown32);
  302. AddColor('clSalmon32', clSalmon32);
  303. AddColor('clSandyBrown32', clSandyBrown32);
  304. AddColor('clSeaGreen32', clSeaGreen32);
  305. AddColor('clSeaShell32', clSeaShell32);
  306. AddColor('clSienna32', clSienna32);
  307. AddColor('clSilver32', clSilver32);
  308. AddColor('clSkyblue32', clSkyblue32);
  309. AddColor('clSlateBlue32', clSlateBlue32);
  310. AddColor('clSlateGray32', clSlateGray32);
  311. AddColor('clSlateGrey32', clSlateGrey32);
  312. AddColor('clSnow32', clSnow32);
  313. AddColor('clSpringgreen32', clSpringgreen32);
  314. AddColor('clSteelblue32', clSteelblue32);
  315. AddColor('clTan32', clTan32);
  316. AddColor('clThistle32', clThistle32);
  317. AddColor('clTomato32', clTomato32);
  318. AddColor('clTurquoise32', clTurquoise32);
  319. AddColor('clViolet32', clViolet32);
  320. AddColor('clWheat32', clWheat32);
  321. AddColor('clWhitesmoke32', clWhitesmoke32);
  322. AddColor('clYellowgreen32', clYellowgreen32);
  323. end;
  324. procedure TColorManager.RemoveColor(const AName: string);
  325. var
  326. i: Integer;
  327. begin
  328. for i := 0 to Count - 1 do
  329. if SameText(Items[i].Name, AName) then
  330. begin
  331. Delete(i);
  332. break;
  333. end;
  334. end;
  335. procedure RegisterColor(const AName: string; AColor: TColor32);
  336. begin
  337. ColorManager.AddColor(AName, AColor);
  338. end;
  339. procedure UnregisterColor(const AName: string);
  340. begin
  341. ColorManager.RemoveColor(AName);
  342. end;
  343. { TColor32Property }
  344. procedure TColor32Property.Edit;
  345. var
  346. ColorPicker: TFormColorPicker;
  347. begin
  348. ColorPicker := TFormColorPicker.Create(nil);
  349. try
  350. ColorPicker.Color := GetOrdValue;
  351. if (ColorPicker.Execute) then
  352. SetOrdValue(Cardinal(ColorPicker.Color));
  353. finally
  354. ColorPicker.Free;
  355. end;
  356. end;
  357. function TColor32Property.GetAttributes: TPropertyAttributes;
  358. begin
  359. Result := [paMultiSelect, paValueList, paRevertable, paDialog];
  360. end;
  361. procedure TColor32Property.GetValues(Proc: TGetStrProc);
  362. begin
  363. try
  364. ColorManager.EnumColors(Proc);
  365. except
  366. on E: Exception do ShowMessage(E.Message);
  367. end;
  368. end;
  369. function TColor32Property.GetValue: string;
  370. begin
  371. try
  372. Result := ColorManager.GetColorName(Cardinal(GetOrdValue));
  373. except
  374. on E: Exception do ShowMessage(E.Message);
  375. end;
  376. end;
  377. procedure TColor32Property.SetValue(const Value: string);
  378. begin
  379. try
  380. SetOrdValue(Cardinal(ColorManager.GetColor(Value)));
  381. Modified;
  382. except
  383. on E: Exception do ShowMessage(E.Message);
  384. end;
  385. end;
  386. {$IFDEF EXT_PROP_EDIT}
  387. procedure TColor32Property.ListMeasureWidth(const Value: string; ACanvas: TCanvas; var AWidth: Integer);
  388. begin
  389. // implementation dummie to satisfy interface. Don't change default value.
  390. end;
  391. procedure TColor32Property.ListMeasureHeight(const Value: string; ACanvas: TCanvas; var AHeight: Integer);
  392. begin
  393. // implementation dummie to satisfy interface. Don't change default value.
  394. end;
  395. procedure TColor32Property.ListDrawValue(const Value: string; ACanvas: TCanvas;
  396. const ARect: TRect; ASelected: Boolean);
  397. var
  398. Right: Integer;
  399. C: TColor32;
  400. i, j: Integer;
  401. W, H: Integer;
  402. Bitmap32: TBitmap32;
  403. begin
  404. try
  405. Right := (ARect.Bottom - ARect.Top) + ARect.Left;
  406. Bitmap32 := TBitmap32.Create;
  407. try
  408. W := Right - ARect.Left - 2;
  409. H := ARect.Bottom - ARect.Top - 2;
  410. Bitmap32.SetSize(W, H);
  411. if Assigned(ColorManager) then
  412. C := ColorManager.GetColor(Value)
  413. else
  414. C := clWhite32;
  415. if (W > 8) and (H > 8) then
  416. begin
  417. if not (C and $FF000000 = $FF000000) then
  418. begin
  419. for j := 0 to H - 1 do
  420. for i := 0 to W - 1 do
  421. if Odd(i div 3) = Odd(j div 3) then
  422. Bitmap32[i, j] := clBlack32
  423. else
  424. Bitmap32[i, j] := clWhite32;
  425. end;
  426. Bitmap32.FillRectT(0, 0, W, H, C);
  427. end;
  428. Bitmap32.FrameRectTS(0, 0, W, H, $DF000000);
  429. Bitmap32.DrawTo(ACanvas.Handle, ARect.Left + 1, ARect.Top + 1);
  430. finally
  431. Bitmap32.Free;
  432. DefaultPropertyListDrawValue(Value, ACanvas,
  433. Rect(Right, ARect.Top, ARect.Right, ARect.Bottom), ASelected);
  434. end;
  435. except
  436. on E: Exception do ShowMessage(E.Message);
  437. end;
  438. end;
  439. procedure TColor32Property.PropDrawValue(ACanvas: TCanvas; const ARect: TRect;
  440. ASelected: Boolean);
  441. begin
  442. if GetVisualValue <> '' then
  443. ListDrawValue(GetVisualValue, ACanvas, ARect, True{ASelected})
  444. else
  445. DefaultPropertyDrawValue(Self, ACanvas, ARect);
  446. end;
  447. procedure TColor32Property.PropDrawName(ACanvas: TCanvas; const ARect: TRect;
  448. ASelected: Boolean);
  449. begin
  450. DefaultPropertyDrawName(Self, ACanvas, ARect);
  451. end;
  452. function TColor32Property.PropDrawNameRect(const ARect: TRect): TRect;
  453. begin
  454. Result := ARect;
  455. end;
  456. function TColor32Property.PropDrawValueRect(const ARect: TRect): TRect;
  457. begin
  458. Result := Rect(ARect.Left, ARect.Top, (ARect.Bottom - ARect.Top) + ARect.Left, ARect.Bottom);
  459. end;
  460. {$ENDIF}
  461. initialization
  462. ColorManager := TColorManager.Create;
  463. ColorManager.RegisterDefaultColors;
  464. finalization
  465. ColorManager.Free;
  466. end.