GXS.Color.pas 37 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046
  1. //
  2. // The graphics engine GXScene https://github.com/glscene
  3. //
  4. unit GXS.Color;
  5. (* All color types, constants and utilities should go here *)
  6. interface
  7. {$I GLScene.Defines.inc}
  8. uses
  9. Winapi.OpenGL,
  10. System.SysUtils,
  11. System.Classes,
  12. System.Types,
  13. System.UITypes,
  14. FMX.Dialogs,
  15. GLScene.VectorTypes,
  16. GLScene.VectorGeometry,
  17. GXS.PersistentClasses,
  18. GXS.BaseClasses;
  19. type
  20. PgxColorVector = ^TgxColorVector;
  21. TgxColorVector = TVector4f;
  22. PRGBColor = ^TRGBColor;
  23. TRGBColor = TVector3b;
  24. // Wraps an OpenGL color.
  25. TgxColor = class(TgxUpdateAbleObject)
  26. private
  27. FColor: TgxColorVector;
  28. FPDefaultColor: PgxColorVector;
  29. procedure SetColorVector(const aColor: TgxColorVector); overload;
  30. procedure SetColorComponent(index: Integer; value: Single);
  31. function GetColorComponent(const index: Integer): Single;
  32. procedure SetAsWinColor(const val: TColor);
  33. function GetAsWinColor: TColor;
  34. procedure SetDirectColorVector(const aColor: TgxColorVector);
  35. protected
  36. procedure DefineProperties(Filer: TFiler); override;
  37. procedure ReadData(Stream: TStream);
  38. procedure WriteData(Stream: TStream);
  39. function GetHSVA: TVector4f;
  40. procedure SetHSVA(const hsva: TVector4f);
  41. public
  42. constructor Create(AOwner: TPersistent); override;
  43. constructor CreateInitialized(AOwner: TPersistent;
  44. const Color: TgxColorVector; changeEvent: TNotifyEvent = nil);
  45. destructor Destroy; override;
  46. procedure NotifyChange(Sender: TObject); override;
  47. procedure Assign(Source: TPersistent); override;
  48. procedure Initialize(const Color: TgxColorVector);
  49. function AsAddress: PGLFloat;
  50. procedure RandomColor;
  51. procedure SetColor(red, green, blue: Single; alpha: Single = 1); overload;
  52. property Color: TgxColorVector read FColor write SetColorVector;
  53. property DirectColor: TgxColorVector read FColor write SetDirectColorVector;
  54. property AsWinColor: TColor read GetAsWinColor write SetAsWinColor;
  55. property HSVA: TVector4f read GetHSVA write SetHSVA;
  56. property DefaultColor: TgxColorVector read FColor;
  57. published
  58. property Red: Single index 0 read GetColorComponent write SetColorComponent
  59. stored False;
  60. property Green: Single index 1 read GetColorComponent
  61. write SetColorComponent stored False;
  62. property Blue: Single index 2 read GetColorComponent write SetColorComponent
  63. stored False;
  64. property Alpha: Single index 3 read GetColorComponent
  65. write SetColorComponent stored False;
  66. end;
  67. PColorEntry = ^TColorEntry;
  68. TColorEntry = record
  69. Name: String[31];
  70. Color: TgxColorVector;
  71. end;
  72. TgxColorManager = class(TList)
  73. public
  74. destructor Destroy; override;
  75. procedure AddColor(const aName: String; const aColor: TgxColorVector);
  76. procedure EnumColors(Proc: TGetStrProc); overload;
  77. procedure EnumColors(AValues: TStrings); overload;
  78. function FindColor(const aName: String): TgxColorVector;
  79. // Convert a clrXxxx or a '<red green blue alpha> to a color vector
  80. function GetColor(const aName: String): TgxColorVector;
  81. function GetColorName(const aColor: TgxColorVector): String;
  82. procedure RegisterDefaultColors;
  83. procedure RemoveColor(const aName: String);
  84. end;
  85. (* Builds a TColor from Red Green Blue components,
  86. there is a FMX.Imaging.GIFImg.TGIFColorMap.RGB2Color *)
  87. function RGB2Color(const r, g, b: Byte): TColor;
  88. function ColorManager: TgxColorManager;
  89. procedure RegisterColor(const aName: String; const aColor: TgxColorVector);
  90. procedure UnRegisterColor(const aName: String);
  91. function GetRValue(RGB: DWORD): Byte; {$NODEFINE GetRValue}
  92. function GetGValue(RGB: DWORD): Byte; {$NODEFINE GetGValue}
  93. function GetBValue(RGB: DWORD): Byte; {$NODEFINE GetBValue}
  94. procedure InitGLXceneColors;
  95. // Converts a delphi color into its RGB fragments and correct range.
  96. function ConvertWinColor(AColor: TColor; alpha: Single = 1): TgxColorVector;
  97. // Converts a color vector (containing float values)
  98. function ConvertColorVector(const AColor: TgxColorVector): TColor; overload;
  99. (* Converts a color vector (containing float values) and alter intensity.
  100. intensity is in [0..1] *)
  101. function ConvertColorVector(const AColor: TgxColorVector; intensity: Single): TColor; overload;
  102. // Converts RGB components into a color vector with correct range
  103. function ConvertRGBColor(const AColor: array of Byte): TgxColorVector;
  104. // color definitions
  105. const
  106. // Some extra colors, not declared in System.UITypes.pas
  107. clForeground = TColor(-1);
  108. clButton = TColor(-2);
  109. clLight = TColor(-3);
  110. clMidlight = TColor(-4);
  111. clDark = TColor(-5);
  112. clMid = TColor(-6);
  113. clText = TColor(-7);
  114. clBrightText = TColor(-8);
  115. clButtonText = TColor(-9);
  116. clBase = TColor(-10);
  117. clBackground = TColor(-11);
  118. clShadow = TColor(-12);
  119. clHighlight = TColor(-13);
  120. clHighlightedText = TColor(-14);
  121. { Mapped role offsets }
  122. cloNormal = 32;
  123. cloDisabled = 64;
  124. cloActive = 96;
  125. { Normal, mapped, pseudo, rgb values }
  126. clNormalForeground = TColor(clForeground - cloNormal);
  127. clNormalButton = TColor(clButton - cloNormal);
  128. clNormalLight = TColor(clLight - cloNormal);
  129. clNormalMidlight = TColor(clMidlight - cloNormal);
  130. clNormalDark = TColor(clDark - cloNormal);
  131. clNormalMid = TColor(clMid - cloNormal);
  132. clNormalText = TColor(clText - cloNormal);
  133. clNormalBrightText = TColor(clBrightText - cloNormal);
  134. clNormalButtonText = TColor(clButtonText - cloNormal);
  135. clNormalBase = TColor(clBase - cloNormal);
  136. clNormalBackground = TColor(clBackground - cloNormal);
  137. clNormalShadow = TColor(clShadow - cloNormal);
  138. clNormalHighlight = TColor(clHighlight - cloNormal);
  139. clNormalHighlightedText = TColor(clHighlightedText - cloNormal);
  140. { Disabled, mapped, pseudo, rgb values }
  141. clDisabledForeground = TColor(clForeground - cloDisabled);
  142. clDisabledButton = TColor(clButton - cloDisabled);
  143. clDisabledLight = TColor(clLight - cloDisabled);
  144. clDisabledMidlight = TColor(clMidlight - cloDisabled);
  145. clDisabledDark = TColor(clDark - cloDisabled);
  146. clDisabledMid = TColor(clMid - cloDisabled);
  147. clDisabledText = TColor(clText - cloDisabled);
  148. clDisabledBrightText = TColor(clBrightText - cloDisabled);
  149. clDisabledButtonText = TColor(clButtonText - cloDisabled);
  150. clDisabledBase = TColor(clBase - cloDisabled);
  151. clDisabledBackground = TColor(clBackground - cloDisabled);
  152. clDisabledShadow = TColor(clShadow - cloDisabled);
  153. clDisabledHighlight = TColor(clHighlight - cloDisabled);
  154. clDisabledHighlightedText = TColor(clHighlightedText - cloDisabled);
  155. { Active, mapped, pseudo, rgb values }
  156. clActiveForeground = TColor(clForeground - cloActive);
  157. clActiveButton = TColor(clButton - cloActive);
  158. clActiveLight = TColor(clLight - cloActive);
  159. clActiveMidlight = TColor(clMidlight - cloActive);
  160. clActiveDark = TColor(clDark - cloActive);
  161. clActiveMid = TColor(clMid - cloActive);
  162. clActiveText = TColor(clText - cloActive);
  163. clActiveBrightText = TColor(clBrightText - cloActive);
  164. clActiveButtonText = TColor(clButtonText - cloActive);
  165. clActiveBase = TColor(clBase - cloActive);
  166. clActiveBackground = TColor(clBackground - cloActive);
  167. clActiveShadow = TColor(clShadow - cloActive);
  168. clActiveHighlight = TColor(clHighlight - cloActive);
  169. clActiveHighlightedText = TColor(clHighlightedText - cloActive);
  170. clFirstSpecialColor = clActiveHighlightedText;
  171. clMask = TColorRec.White;
  172. clDontMask = TColorRec.Black;
  173. (* Window's colors (must be filled at program startup,
  174. since they depend on the desktop scheme) *)
  175. const
  176. {$J+ - allow change of the following typed constants}
  177. clrScrollBar: TgxColorVector = (X: 0; Y: 0; Z: 0; W: 1);
  178. clrBackground: TgxColorVector = (X: 0; Y: 0; Z: 0; W: 1);
  179. clrActiveCaption: TgxColorVector = (X: 0; Y: 0; Z: 0; W: 1);
  180. clrInactiveCaption: TgxColorVector = (X: 0; Y: 0; Z: 0; W: 1);
  181. clrMenu: TgxColorVector = (X: 0; Y: 0; Z: 0; W: 1);
  182. clrWindow: TgxColorVector = (X: 0; Y: 0; Z: 0; W: 1);
  183. clrWindowFrame: TgxColorVector = (X: 0; Y: 0; Z: 0; W: 1);
  184. clrMenuText: TgxColorVector = (X: 0; Y: 0; Z: 0; W: 1);
  185. clrWindowText: TgxColorVector = (X: 0; Y: 0; Z: 0; W: 1);
  186. clrCaptionText: TgxColorVector = (X: 0; Y: 0; Z: 0; W: 1);
  187. clrActiveBorder: TgxColorVector = (X: 0; Y: 0; Z: 0; W: 1);
  188. clrInactiveBorder: TgxColorVector = (X: 0; Y: 0; Z: 0; W: 1);
  189. clrAppWorkSpace: TgxColorVector = (X: 0; Y: 0; Z: 0; W: 1);
  190. clrHighlight: TgxColorVector = (X: 0; Y: 0; Z: 0; W: 1);
  191. clrHighlightText: TgxColorVector = (X: 0; Y: 0; Z: 0; W: 1);
  192. clrBtnFace: TgxColorVector = (X: 0; Y: 0; Z: 0; W: 1);
  193. clrBtnShadow: TgxColorVector = (X: 0; Y: 0; Z: 0; W: 1);
  194. clrGrayText: TgxColorVector = (X: 0; Y: 0; Z: 0; W: 1);
  195. clrBtnText: TgxColorVector = (X: 0; Y: 0; Z: 0; W: 1);
  196. clrInactiveCaptionText: TgxColorVector = (X: 0; Y: 0; Z: 0; W: 1);
  197. clrBtnHighlight: TgxColorVector = (X: 0; Y: 0; Z: 0; W: 1);
  198. clr3DDkShadow: TgxColorVector = (X: 0; Y: 0; Z: 0; W: 1);
  199. clr3DLight: TgxColorVector = (X: 0; Y: 0; Z: 0; W: 1);
  200. clrInfoText: TgxColorVector = (X: 0; Y: 0; Z: 0; W: 1);
  201. clrInfoBk: TgxColorVector = (X: 0; Y: 0; Z: 0; W: 1);
  202. {$J- - disable change of other typed constants}
  203. // 'static' color definitions sort of grays
  204. clrTransparent: TgxColorVector = (X: 0; Y: 0; Z: 0; W: 0);
  205. clrBlack: TgxColorVector = (X: 0; Y: 0; Z: 0; W: 1);
  206. clrGray05: TgxColorVector = (X: 0.05; Y: 0.05; Z: 0.05; W: 1);
  207. clrGray10: TgxColorVector = (X: 0.10; Y: 0.10; Z: 0.10; W: 1);
  208. clrGray15: TgxColorVector = (X: 0.15; Y: 0.15; Z: 0.15; W: 1);
  209. clrGray20: TgxColorVector = (X: 0.20; Y: 0.20; Z: 0.20; W: 1);
  210. clrGray25: TgxColorVector = (X: 0.25; Y: 0.25; Z: 0.25; W: 1);
  211. clrGray30: TgxColorVector = (X: 0.30; Y: 0.30; Z: 0.30; W: 1);
  212. clrGray35: TgxColorVector = (X: 0.35; Y: 0.35; Z: 0.35; W: 1);
  213. clrGray40: TgxColorVector = (X: 0.40; Y: 0.40; Z: 0.40; W: 1);
  214. clrGray45: TgxColorVector = (X: 0.45; Y: 0.45; Z: 0.45; W: 1);
  215. clrGray50: TgxColorVector = (X: 0.50; Y: 0.50; Z: 0.50; W: 1);
  216. clrGray55: TgxColorVector = (X: 0.55; Y: 0.55; Z: 0.55; W: 1);
  217. clrGray60: TgxColorVector = (X: 0.60; Y: 0.60; Z: 0.60; W: 1);
  218. clrGray65: TgxColorVector = (X: 0.65; Y: 0.65; Z: 0.65; W: 1);
  219. clrGray70: TgxColorVector = (X: 0.70; Y: 0.70; Z: 0.70; W: 1);
  220. clrGray75: TgxColorVector = (X: 0.75; Y: 0.75; Z: 0.75; W: 1);
  221. clrGray80: TgxColorVector = (X: 0.80; Y: 0.80; Z: 0.80; W: 1);
  222. clrGray85: TgxColorVector = (X: 0.85; Y: 0.85; Z: 0.85; W: 1);
  223. clrGray90: TgxColorVector = (X: 0.90; Y: 0.90; Z: 0.90; W: 1);
  224. clrGray95: TgxColorVector = (X: 0.95; Y: 0.95; Z: 0.95; W: 1);
  225. clrWhite: TgxColorVector = (X: 1; Y: 1; Z: 1; W: 1);
  226. // other grays
  227. clrDimGray: TgxColorVector = (X: 0.329412; Y: 0.329412; Z: 0.329412; W: 1);
  228. clrGray: TgxColorVector = (X: 0.752941; Y: 0.752941; Z: 0.752941; W: 1);
  229. clrLightGray: TgxColorVector = (X: 0.658824; Y: 0.658824; Z: 0.658824; W: 1);
  230. // colors en masse
  231. clrAquamarine: TgxColorVector = (X: 0.439216; Y: 0.858824; Z: 0.576471; W: 1);
  232. clrBlueViolet: TgxColorVector = (X: 0.62352; Y: 0.372549; Z: 0.623529; W: 1);
  233. clrBrown: TgxColorVector = (X: 0.647059; Y: 0.164706; Z: 0.164706; W: 1);
  234. clrCadetBlue: TgxColorVector = (X: 0.372549; Y: 0.623529; Z: 0.623529; W: 1);
  235. clrCoral: TgxColorVector = (X: 1; Y: 0.498039; Z: 0.0; W: 1);
  236. clrCornflowerBlue: TgxColorVector = (X: 0.258824; Y: 0.258824; Z: 0.435294; W: 1);
  237. clrDarkGreen: TgxColorVector = (X: 0.184314; Y: 0.309804; Z: 0.184314; W: 1);
  238. clrDarkOliveGreen: TgxColorVector = (X: 0.309804; Y: 0.309804; Z: 0.184314; W: 1);
  239. clrDarkOrchid: TgxColorVector = (X: 0.6; Y: 0.196078; Z: 0.8; W: 1);
  240. clrDarkSlateBlue: TgxColorVector = (X: 0.419608; Y: 0.137255; Z: 0.556863; W: 1);
  241. clrDarkSlateGray: TgxColorVector = (X: 0.184314; Y: 0.309804; Z: 0.309804; W: 1);
  242. clrDarkSlateGrey: TgxColorVector = (X: 0.184314; Y: 0.309804; Z: 0.309804; W: 1);
  243. clrDarkTurquoise: TgxColorVector = (X: 0.439216; Y: 0.576471; Z: 0.858824; W: 1);
  244. clrFirebrick: TgxColorVector = (X: 0.556863; Y: 0.137255; Z: 0.137255; W: 1);
  245. clrForestGreen: TgxColorVector = (X: 0.137255; Y: 0.556863; Z: 0.137255; W: 1);
  246. clrGold: TgxColorVector = (X: 0.8; Y: 0.498039; Z: 0.196078; W: 1);
  247. clrGoldenrod: TgxColorVector = (X: 0.858824; Y: 0.858824; Z: 0.439216; W: 1);
  248. clrGreenYellow: TgxColorVector = (X: 0.576471; Y: 0.858824; Z: 0.439216; W: 1);
  249. clrIndian: TgxColorVector = (X: 0.309804; Y: 0.184314; Z: 0.184314; W: 1);
  250. clrKhaki: TgxColorVector = (X: 0.623529; Y: 0.623529; Z: 0.372549; W: 1);
  251. clrLightBlue: TgxColorVector = (X: 0.74902; Y: 0.847059; Z: 0.847059; W: 1);
  252. clrLightSteelBlue: TgxColorVector = (X: 0.560784; Y: 0.560784; Z: 0.737255; W: 1);
  253. clrLimeGreen: TgxColorVector = (X: 0.196078; Y: 0.8; Z: 0.196078; W: 1);
  254. clrMaroon: TgxColorVector = (X: 0.556863; Y: 0.137255; Z: 0.419608; W: 1);
  255. clrMediumAquamarine: TgxColorVector = (X: 0.196078; Y: 0.8; Z: 0.6; W: 1);
  256. clrMediumBlue: TgxColorVector = (X: 0.196078; Y: 0.196078; Z: 0.8; W: 1);
  257. clrMediumForestGreen: TgxColorVector = (X: 0.419608; Y: 0.556863; Z: 0.137255; W: 1);
  258. clrMediumGoldenrod: TgxColorVector = (X: 0.917647; Y: 0.917647; Z: 0.678431; W: 1);
  259. clrMediumOrchid: TgxColorVector = (X: 0.576471; Y: 0.439216; Z: 0.858824; W: 1);
  260. clrMediumSeaGreen: TgxColorVector = (X: 0.258824; Y: 0.435294; Z: 0.258824; W: 1);
  261. clrMediumSlateBlue: TgxColorVector = (X: 0.498039; Y: 0; Z: 1; W: 1);
  262. clrMediumSpringGreen: TgxColorVector = (X: 0.498039; Y: 1; Z: 0; W: 1);
  263. clrMediumTurquoise: TgxColorVector = (X: 0.439216; Y: 0.858824; Z: 0.858824; W: 1);
  264. clrMediumViolet: TgxColorVector = (X: 0.858824; Y: 0.439216; Z: 0.576471; W: 1);
  265. clrMidnightBlue: TgxColorVector = (X: 0.184314; Y: 0.184314; Z: 0.309804; W: 1);
  266. clrNavy: TgxColorVector = (X: 0.137255; Y: 0.137255; Z: 0.556863; W: 1);
  267. clrNavyBlue: TgxColorVector = (X: 0.137255; Y: 0.137255; Z: 0.556863; W: 1);
  268. clrOrange: TgxColorVector = (X: 1; Y: 0.5; Z: 0.0; W: 1);
  269. clrOrangeRed: TgxColorVector = (X: 1; Y: 0.25; Z: 0; W: 1);
  270. clrOrchid: TgxColorVector = (X: 0.858824; Y: 0.439216; Z: 0.858824; W: 1);
  271. clrPaleGreen: TgxColorVector = (X: 0.560784; Y: 0.737255; Z: 0.560784; W: 1);
  272. clrPink: TgxColorVector = (X: 0.737255; Y: 0.560784; Z: 0.560784; W: 1);
  273. clrPlum: TgxColorVector = (X: 0.917647; Y: 0.678431; Z: 0.917647; W: 1);
  274. clrSalmon: TgxColorVector = (X: 0.435294; Y: 0.258824; Z: 0.258824; W: 1);
  275. clrSeaGreen: TgxColorVector = (X: 0.137255; Y: 0.556863; Z: 0.419608; W: 1);
  276. clrSienna: TgxColorVector = (X: 0.556863; Y: 0.419608; Z: 0.137255; W: 1);
  277. clrSkyBlue: TgxColorVector = (X: 0.196078; Y: 0.6; Z: 0.8; W: 1);
  278. clrSlateBlue: TgxColorVector = (X: 0; Y: 0.498039; Z: 1; W: 1);
  279. clrSpringGreen: TgxColorVector = (X: 0; Y: 1; Z: 0.498039; W: 1);
  280. clrSteelBlue: TgxColorVector = (X: 0.137255; Y: 0.419608; Z: 0.556863; W: 1);
  281. clrTan: TgxColorVector = (X: 0.858824; Y: 0.576471; Z: 0.439216; W: 1);
  282. clrThistle: TgxColorVector = (X: 0.847059; Y: 0.74902; Z: 0.847059; W: 1);
  283. clrTurquoise: TgxColorVector = (X: 0.678431; Y: 0.917647; Z: 0.917647; W: 1);
  284. clrViolet: TgxColorVector = (X: 0.309804; Y: 0.184314; Z: 0.309804; W: 1);
  285. clrVioletRed: TgxColorVector = (X: 0.8; Y: 0.196078; Z: 0.6; W: 1);
  286. clrWheat: TgxColorVector = (X: 0.847059; Y: 0.847059; Z: 0.74902; W: 1);
  287. clrYellowGreen: TgxColorVector = (X: 0.6; Y: 0.8; Z: 0.196078; W: 1);
  288. clrSummerSky: TgxColorVector = (X: 0.22; Y: 0.69; Z: 0.87; W: 1);
  289. clrRichBlue: TgxColorVector = (X: 0.35; Y: 0.35; Z: 0.67; W: 1);
  290. clrBrass: TgxColorVector = (X: 0.71; Y: 0.65; Z: 0.26; W: 1);
  291. clrCopper: TgxColorVector = (X: 0.72; Y: 0.45; Z: 0.20; W: 1);
  292. clrBronze: TgxColorVector = (X: 0.55; Y: 0.47; Z: 0.14; W: 1);
  293. clrBronze2: TgxColorVector = (X: 0.65; Y: 0.49; Z: 0.24; W: 1);
  294. clrSilver: TgxColorVector = (X: 0.90; Y: 0.91; Z: 0.98; W: 1);
  295. clrBrightGold: TgxColorVector = (X: 0.85; Y: 0.85; Z: 0.10; W: 1);
  296. clrOldGold: TgxColorVector = (X: 0.81; Y: 0.71; Z: 0.23; W: 1);
  297. clrFeldspar: TgxColorVector = (X: 0.82; Y: 0.57; Z: 0.46; W: 1);
  298. clrQuartz: TgxColorVector = (X: 0.85; Y: 0.85; Z: 0.95; W: 1);
  299. clrNeonPink: TgxColorVector = (X: 1.00; Y: 0.43; Z: 0.78; W: 1);
  300. clrDarkPurple: TgxColorVector = (X: 0.53; Y: 0.12; Z: 0.47; W: 1);
  301. clrNeonBlue: TgxColorVector = (X: 0.30; Y: 0.30; Z: 1.00; W: 1);
  302. clrCoolCopper: TgxColorVector = (X: 0.85; Y: 0.53; Z: 0.10; W: 1);
  303. clrMandarinOrange: TgxColorVector = (X: 0.89; Y: 0.47; Z: 0.20; W: 1);
  304. clrLightWood: TgxColorVector = (X: 0.91; Y: 0.76; Z: 0.65; W: 1);
  305. clrMediumWood: TgxColorVector = (X: 0.65; Y: 0.50; Z: 0.39; W: 1);
  306. clrDarkWood: TgxColorVector = (X: 0.52; Y: 0.37; Z: 0.26; W: 1);
  307. clrSpicyPink: TgxColorVector = (X: 1.00; Y: 0.11; Z: 0.68; W: 1);
  308. clrSemiSweetChoc: TgxColorVector = (X: 0.42; Y: 0.26; Z: 0.15; W: 1);
  309. clrBakersChoc: TgxColorVector = (X: 0.36; Y: 0.20; Z: 0.09; W: 1);
  310. clrFlesh: TgxColorVector = (X: 0.96; Y: 0.80; Z: 0.69; W: 1);
  311. clrNewTan: TgxColorVector = (X: 0.92; Y: 0.78; Z: 0.62; W: 1);
  312. clrNewMidnightBlue: TgxColorVector = (X: 0.00; Y: 0.00; Z: 0.61; W: 1);
  313. clrVeryDarkBrown: TgxColorVector = (X: 0.35; Y: 0.16; Z: 0.14; W: 1);
  314. clrDarkBrown: TgxColorVector = (X: 0.36; Y: 0.25; Z: 0.20; W: 1);
  315. clrDarkTan: TgxColorVector = (X: 0.59; Y: 0.41; Z: 0.31; W: 1);
  316. clrGreenCopper: TgxColorVector = (X: 0.32; Y: 0.49; Z: 0.46; W: 1);
  317. clrDkGreenCopper: TgxColorVector = (X: 0.29; Y: 0.46; Z: 0.43; W: 1);
  318. clrDustyRose: TgxColorVector = (X: 0.52; Y: 0.39; Z: 0.39; W: 1);
  319. clrHuntersGreen: TgxColorVector = (X: 0.13; Y: 0.37; Z: 0.31; W: 1);
  320. clrScarlet: TgxColorVector = (X: 0.55; Y: 0.09; Z: 0.09; W: 1);
  321. clrMediumPurple: TgxColorVector = (X: 0.73; Y: 0.16; Z: 0.96; W: 1);
  322. clrLightPurple: TgxColorVector = (X: 0.87; Y: 0.58; Z: 0.98; W: 1);
  323. clrVeryLightPurple: TgxColorVector = (X: 0.94; Y: 0.81; Z: 0.99; W: 1);
  324. clrGreen: TgxColorVector = (X: 0; Y: 0.5; Z: 0; W: 1);
  325. clrOlive: TgxColorVector = (X: 0.5; Y: 0.5; Z: 1; W: 1);
  326. clrPurple: TgxColorVector = (X: 1; Y: 0; Z: 1; W: 1);
  327. clrTeal: TgxColorVector = (X: 0; Y: 0.5; Z: 0.5; W: 1);
  328. clrRed: TgxColorVector = (X: 1; Y: 0; Z: 0; W: 1);
  329. clrLime: TgxColorVector = (X: 0; Y: 1; Z: 0; W: 1);
  330. clrYellow: TgxColorVector = (X: 1; Y: 1; Z: 0; W: 1);
  331. clrBlue: TgxColorVector = (X: 0; Y: 0; Z: 1; W: 1);
  332. clrFuchsia: TgxColorVector = (X: 1; Y: 0; Z: 1; W: 1);
  333. clrAqua: TgxColorVector = (X: 0; Y: 1; Z: 1; W: 1);
  334. cDefaultNormalMapScale = 0.125;
  335. {$J- - disallow change of the following typed constants}
  336. var
  337. (* Specifies if TgxColor should allocate memory for
  338. their default values (ie. design-time) or not (run-time) *)
  339. vUseDefaultColorSets: Boolean = False;
  340. //------------------------------------------------
  341. implementation
  342. //------------------------------------------------
  343. var
  344. vColorManager: TgxColorManager;
  345. function RGB2Color(const r, g, b: Byte): TColor;
  346. begin
  347. Result := r or (g shl 8) or (b shl 16);
  348. end;
  349. function ColorManager: TgxColorManager;
  350. begin
  351. if not Assigned(vColorManager) then
  352. begin
  353. vColorManager := TgxColorManager.Create;
  354. vColorManager.RegisterDefaultColors;
  355. end;
  356. Result := vColorManager;
  357. end;
  358. function ConvertWinColor(aColor: TColor; alpha: Single = 1): TgxColorVector;
  359. var
  360. winColor: Integer;
  361. begin
  362. // Convert to Windows color
  363. winColor := TColors.ColorToRGB(aColor);
  364. // convert 0..255 range into 0..1 range
  365. Result.X := (winColor and $FF) * (1 / 255);
  366. Result.Y := ((winColor shr 8) and $FF) * (1 / 255);
  367. Result.Z := ((winColor shr 16) and $FF) * (1 / 255);
  368. Result.W := alpha;
  369. end;
  370. function GetRValue(RGB: DWORD): Byte;
  371. begin
  372. Result := Byte(RGB);
  373. end;
  374. function GetGValue(RGB: DWORD): Byte;
  375. begin
  376. Result := Byte(RGB shr 8);
  377. end;
  378. function GetBValue(RGB: DWORD): Byte;
  379. begin
  380. Result := Byte(RGB shr 16);
  381. end;
  382. procedure InitGLXceneColors;
  383. begin
  384. clrScrollBar := ConvertWinColor(TColorRec.cSCROLLBAR);
  385. clrActiveCaption := ConvertWinColor(TColorRec.cACTIVECAPTION);
  386. clrInactiveCaption := ConvertWinColor(TColorRec.cINACTIVECAPTION);
  387. clrMenu := ConvertWinColor(TColorRec.cMENU);
  388. clrWindow := ConvertWinColor(TColorRec.cWINDOW);
  389. clrWindowFrame := ConvertWinColor(TColorRec.cWINDOWFRAME);
  390. clrMenuText := ConvertWinColor(TColorRec.cMENUTEXT);
  391. clrWindowText := ConvertWinColor(TColorRec.cWINDOWTEXT);
  392. clrCaptionText := ConvertWinColor(TColorRec.cCAPTIONTEXT);
  393. clrActiveBorder := ConvertWinColor(TColorRec.cACTIVEBORDER);
  394. clrInactiveBorder := ConvertWinColor(TColorRec.cINACTIVEBORDER);
  395. clrAppWorkSpace := ConvertWinColor(TColorRec.cAPPWORKSPACE);
  396. clrHighlightText := ConvertWinColor(TColorRec.cHIGHLIGHTTEXT);
  397. clrBtnFace := ConvertWinColor(TColorRec.cBTNFACE);
  398. clrBtnShadow := ConvertWinColor(TColorRec.cBTNSHADOW);
  399. clrGrayText := ConvertWinColor(TColorRec.cGRAYTEXT);
  400. clrBtnText := ConvertWinColor(TColorRec.cBTNTEXT);
  401. clrInactiveCaptionText := ConvertWinColor(TColorRec.cINACTIVECAPTIONTEXT);
  402. clrBtnHighlight := ConvertWinColor(TColorRec.cBTNHIGHLIGHT);
  403. clr3DDkShadow := ConvertWinColor(TColorRec.c3DDKSHADOW);
  404. clr3DLight := ConvertWinColor(TColorRec.c3DLIGHT);
  405. clrInfoText := ConvertWinColor(TColorRec.cINFOTEXT);
  406. clrInfoBk := ConvertWinColor(TColorRec.cINFOBK);
  407. end;
  408. function ConvertColorVector(const aColor: TgxColorVector): TColor;
  409. begin
  410. Result := RGB2Color(Round(255 * aColor.X), Round(255 * aColor.Y),
  411. Round(255 * aColor.Z));
  412. end;
  413. function ConvertColorVector(const aColor: TgxColorVector;
  414. intensity: Single): TColor;
  415. begin
  416. intensity := 255 * intensity;
  417. Result := RGB2Color(Round(intensity * aColor.X), Round(intensity * aColor.Y),
  418. Round(intensity * aColor.Z));
  419. end;
  420. function ConvertRGBColor(const aColor: array of Byte): TgxColorVector;
  421. var
  422. n: Integer;
  423. begin
  424. // convert 0..255 range into 0..1 range
  425. n := High(AColor);
  426. Result.X := AColor[0] * (1 / 255);
  427. if n > 0 then
  428. Result.Y := AColor[1] * (1 / 255)
  429. else
  430. Result.Y := 0;
  431. if n > 1 then
  432. Result.Z := AColor[2] * (1 / 255)
  433. else
  434. Result.Z := 0;
  435. if n > 2 then
  436. Result.W := AColor[3] * (1 / 255)
  437. else
  438. Result.W := 1;
  439. end;
  440. // ------------------
  441. // ------------------ TgxColor ------------------
  442. // ------------------
  443. constructor TgxColor.Create(AOwner: TPersistent);
  444. begin
  445. inherited;
  446. Initialize(clrBlack);
  447. end;
  448. constructor TgxColor.CreateInitialized(AOwner: TPersistent;
  449. const Color: TgxColorVector; changeEvent: TNotifyEvent = nil);
  450. begin
  451. Create(AOwner);
  452. Initialize(Color);
  453. OnNotifyChange := changeEvent;
  454. end;
  455. destructor TgxColor.Destroy;
  456. begin
  457. if Assigned(FPDefaultColor) then
  458. Dispose(FPDefaultColor);
  459. inherited;
  460. end;
  461. procedure TgxColor.Initialize(const Color: TgxColorVector);
  462. begin
  463. SetVector(FColor, Color);
  464. if vUseDefaultColorSets then
  465. begin
  466. if not Assigned(FPDefaultColor) then
  467. New(FPDefaultColor);
  468. SetVector(FPDefaultColor^, Color);
  469. end;
  470. end;
  471. procedure TgxColor.SetColorVector(const aColor: TgxColorVector);
  472. begin
  473. SetVector(FColor, AColor);
  474. NotifyChange(Self);
  475. end;
  476. procedure TgxColor.SetDirectColorVector(const aColor: TgxColorVector);
  477. begin
  478. SetVector(FColor, aColor);
  479. end;
  480. procedure TgxColor.SetColorComponent(index: Integer; value: Single);
  481. begin
  482. if FColor.V[index] <> value then
  483. begin
  484. FColor.V[index] := value;
  485. NotifyChange(Self);
  486. end;
  487. end;
  488. procedure TgxColor.SetAsWinColor(const val: TColor);
  489. begin
  490. FColor := ConvertWinColor(val);
  491. NotifyChange(Self);
  492. end;
  493. function TgxColor.GetAsWinColor: TColor;
  494. begin
  495. Result := ConvertColorVector(FColor);
  496. end;
  497. function TgxColor.GetColorComponent(const index: Integer): Single;
  498. begin
  499. Result := FColor.V[Index];
  500. end;
  501. procedure TgxColor.Assign(Source: TPersistent);
  502. begin
  503. if Assigned(Source) and (Source is TgxColor) then
  504. begin
  505. FColor := TgxColor(Source).FColor;
  506. NotifyChange(Self);
  507. end
  508. else
  509. inherited;
  510. end;
  511. procedure TgxColor.DefineProperties(Filer: TFiler);
  512. begin
  513. inherited;
  514. Filer.DefineBinaryProperty('Color', ReadData, WriteData,
  515. not(Assigned(FPDefaultColor) and VectorEquals(FColor, FPDefaultColor^)));
  516. end;
  517. procedure TgxColor.ReadData(Stream: TStream);
  518. begin
  519. Stream.Read(FColor, SizeOf(FColor));
  520. end;
  521. procedure TgxColor.WriteData(Stream: TStream);
  522. begin
  523. Stream.Write(FColor, SizeOf(FColor));
  524. end;
  525. procedure TgxColor.NotifyChange(Sender: TObject);
  526. var
  527. intf: IgxNotifyable;
  528. begin
  529. if Assigned(Owner) then
  530. begin
  531. if Supports(Owner, IgxNotifyable, intf) then
  532. intf.NotifyChange(Self);
  533. // if Owner is TgxBaseSceneObject then
  534. // TgxBaseSceneObject(Owner).StructureChanged;
  535. inherited;
  536. end;
  537. end;
  538. function TgxColor.AsAddress: PGLfloat;
  539. begin
  540. Result := @FColor;
  541. end;
  542. procedure TgxColor.RandomColor;
  543. begin
  544. red := Random;
  545. green := Random;
  546. blue := Random;
  547. end;
  548. procedure TgxColor.SetColor(red, green, blue: Single; alpha: Single = 1);
  549. begin
  550. FColor.X := red;
  551. FColor.Y := green;
  552. FColor.Z := blue;
  553. FColor.W := alpha;
  554. NotifyChange(Self);
  555. end;
  556. function TgxColor.GetHSVA: TVector4f;
  557. var
  558. delta, min: Single;
  559. const
  560. H = 0;
  561. S = 1;
  562. V = 2;
  563. begin
  564. min := MinFloat(PFloatVector(@FColor), 3);
  565. Result.V[V] := MaxFloat(PFloatVector(@FColor), 3);
  566. delta := Result.V[V] - min;
  567. // saturation is zero if R, G & B are zero
  568. // hue undefined (zero) if saturation is zero or color is gray (delta=zero)
  569. if (Result.V[V] = 0) or (delta = 0) then
  570. begin
  571. Result.V[S] := 0;
  572. Result.V[H] := 0;
  573. end
  574. else
  575. begin
  576. Result.V[S] := delta / Result.V[V];
  577. if red = Result.V[V] then
  578. // between yellow and magenta
  579. Result.V[H] := 60 * (green - blue) / delta
  580. else if green = Result.V[V] then
  581. // between cyan and yellow
  582. Result.V[H] := 120 + 60 * (blue - red) / delta
  583. else // between magenta and cyan
  584. Result.V[H] := 240 + 60 * (red - green) / delta;
  585. if Result.V[H] < 0 then // normalize H
  586. Result.V[H] := Result.V[H] + 360;
  587. end;
  588. Result.W := alpha;
  589. end;
  590. procedure TgxColor.SetHSVA(const hsva: TVector4f);
  591. var
  592. f, hTemp, p, q, t: Single;
  593. const
  594. H = 0;
  595. S = 1;
  596. V = 2;
  597. begin
  598. if hsva.V[S] = 0 then
  599. begin
  600. // gray (ignore hue)
  601. FColor.X := hsva.V[V];
  602. FColor.Y := hsva.V[V];
  603. FColor.Z := hsva.V[V];
  604. end
  605. else
  606. begin
  607. hTemp := hsva.V[H] * (1 / 60);
  608. f := Frac(hTemp);
  609. p := hsva.V[V] * (1 - hsva.V[S]);
  610. q := hsva.V[V] * (1 - (hsva.V[S] * f));
  611. t := hsva.V[V] * (1 - (hsva.V[S] * (1 - f)));
  612. case Trunc(hTemp) mod 6 of
  613. 0:
  614. begin
  615. FColor.X := hsva.V[V];
  616. FColor.Y := t;
  617. FColor.Z := p;
  618. end;
  619. 1:
  620. begin
  621. FColor.X := q;
  622. FColor.Y := hsva.V[V];
  623. FColor.Z := p;
  624. end;
  625. 2:
  626. begin
  627. FColor.X := p;
  628. FColor.Y := hsva.V[V];
  629. FColor.Z := t;
  630. end;
  631. 3:
  632. begin
  633. FColor.X := p;
  634. FColor.Y := q;
  635. FColor.Z := hsva.V[V];
  636. end;
  637. 4:
  638. begin
  639. FColor.X := t;
  640. FColor.Y := p;
  641. FColor.Z := hsva.V[V];
  642. end;
  643. 5:
  644. begin
  645. FColor.X := hsva.V[V];
  646. FColor.Y := p;
  647. FColor.Z := q;
  648. end;
  649. end
  650. end;
  651. FColor.W := hsva.W;
  652. NotifyChange(Self);
  653. end;
  654. // ------------------
  655. // ------------------ TgxColorManager ------------------
  656. // ------------------
  657. function TgxColorManager.FindColor(const aName: String): TgxColorVector;
  658. var
  659. i: Integer;
  660. begin
  661. Result := clrBlack;
  662. for i := 0 to Count - 1 do
  663. if CompareText(string(TColorEntry(Items[i]^).Name), aName) = 0 then
  664. begin
  665. SetVector(Result, TColorEntry(Items[i]^).Color);
  666. Break;
  667. end;
  668. end;
  669. function TgxColorManager.GetColor(const aName: String): TgxColorVector;
  670. var
  671. workCopy: String;
  672. delimiter: Integer;
  673. begin
  674. if aName = '' then
  675. Result := clrBlack
  676. else
  677. begin
  678. workCopy := Trim(aName);
  679. if CharInSet(aName[1], ['(', '[', '<']) then
  680. workCopy := Copy(workCopy, 2, Length(aName) - 2);
  681. if CompareText(Copy(workCopy, 1, 3), 'clr') = 0 then
  682. SetVector(Result, FindColor(workCopy))
  683. else
  684. try
  685. // initialize result
  686. Result := clrBlack;
  687. workCopy := Trim(workCopy);
  688. delimiter := Pos(' ', workCopy);
  689. if (Length(workCopy) > 0) and (delimiter > 0) then
  690. begin
  691. Result.X := StrToFloat(Copy(workCopy, 1, delimiter - 1));
  692. System.Delete(workCopy, 1, delimiter);
  693. workCopy := TrimLeft(workCopy);
  694. delimiter := Pos(' ', workCopy);
  695. if (Length(workCopy) > 0) and (delimiter > 0) then
  696. begin
  697. Result.Y := StrToFloat(Copy(workCopy, 1, delimiter - 1));
  698. System.Delete(workCopy, 1, delimiter);
  699. workCopy := TrimLeft(workCopy);
  700. delimiter := Pos(' ', workCopy);
  701. if (Length(workCopy) > 0) and (delimiter > 0) then
  702. begin
  703. Result.Z := StrToFloat(Copy(workCopy, 1, delimiter - 1));
  704. System.Delete(workCopy, 1, delimiter);
  705. workCopy := TrimLeft(workCopy);
  706. Result.W := StrToFloat(workCopy);
  707. end
  708. else
  709. Result.Z := StrToFloat(workCopy);
  710. end
  711. else
  712. Result.Y := StrToFloat(workCopy);
  713. end
  714. else
  715. Result.X := StrToFloat(workCopy);
  716. except
  717. ShowMessage('Wrong vector format. Use: ''<red green blue alpha>''!');
  718. Abort;
  719. end;
  720. end;
  721. end;
  722. // ------------------------------------------------------------------------------
  723. function TgxColorManager.GetColorName(const aColor: TgxColorVector): String;
  724. const
  725. MinDiff = 1E-6;
  726. var
  727. i: Integer;
  728. begin
  729. for i := 0 to Count - 1 do
  730. with TColorEntry(Items[i]^) do
  731. if (Abs(Color.X - aColor.X) < MinDiff) and
  732. (Abs(Color.Y - aColor.Y) < MinDiff) and
  733. (Abs(Color.Z - aColor.Z) < MinDiff) and
  734. (Abs(Color.W - aColor.W) < MinDiff) then
  735. Break;
  736. if i < Count then
  737. Result := string(TColorEntry(Items[i]^).Name)
  738. else
  739. Result := Format('<%.3f %.3f %.3f %.3f>', [aColor.X, aColor.Y, aColor.Z,
  740. aColor.W]);
  741. end;
  742. destructor TgxColorManager.Destroy;
  743. var
  744. i: Integer;
  745. begin
  746. for i := 0 to Count - 1 do
  747. FreeMem(Items[i], SizeOf(TColorEntry));
  748. inherited Destroy;
  749. end;
  750. procedure TgxColorManager.AddColor(const aName: String;
  751. const aColor: TgxColorVector);
  752. var
  753. newEntry: PColorEntry;
  754. begin
  755. New(newEntry);
  756. if newEntry = nil then
  757. raise Exception.Create('Could not allocate memory for color registration!');
  758. with newEntry^ do
  759. begin
  760. Name := shortstring(aName);
  761. SetVector(Color, aColor);
  762. end;
  763. Add(newEntry);
  764. end;
  765. procedure TgxColorManager.EnumColors(Proc: TGetStrProc);
  766. var
  767. i: Integer;
  768. begin
  769. for i := 0 to Count - 1 do
  770. Proc(string(TColorEntry(Items[i]^).Name));
  771. end;
  772. procedure TgxColorManager.EnumColors(AValues: TStrings);
  773. var
  774. i: Integer;
  775. begin
  776. for i := 0 to Count - 1 do
  777. AValues.Add(string(TColorEntry(Items[i]^).Name));
  778. end;
  779. procedure TgxColorManager.RegisterDefaultColors;
  780. begin
  781. Capacity := 150;
  782. AddColor('clrTransparent', clrTransparent);
  783. AddColor('clrBlack', clrBlack);
  784. AddColor('clrGray05', clrGray05);
  785. AddColor('clrGray10', clrGray10);
  786. AddColor('clrGray15', clrGray15);
  787. AddColor('clrGray20', clrGray20);
  788. AddColor('clrGray25', clrGray25);
  789. AddColor('clrGray30', clrGray30);
  790. AddColor('clrGray35', clrGray35);
  791. AddColor('clrGray40', clrGray40);
  792. AddColor('clrGray45', clrGray45);
  793. AddColor('clrGray50', clrGray50);
  794. AddColor('clrGray55', clrGray55);
  795. AddColor('clrGray60', clrGray60);
  796. AddColor('clrGray65', clrGray65);
  797. AddColor('clrGray70', clrGray70);
  798. AddColor('clrGray75', clrGray75);
  799. AddColor('clrGray80', clrGray80);
  800. AddColor('clrGray85', clrGray85);
  801. AddColor('clrGray90', clrGray90);
  802. AddColor('clrGray95', clrGray95);
  803. AddColor('clrWhite', clrWhite);
  804. AddColor('clrDimGray', clrDimGray);
  805. AddColor('clrGray', clrGray);
  806. AddColor('clrLightGray', clrLightGray);
  807. AddColor('clrAquamarine', clrAquamarine);
  808. AddColor('clrBakersChoc', clrBakersChoc);
  809. AddColor('clrBlueViolet', clrBlueViolet);
  810. AddColor('clrBrass', clrBrass);
  811. AddColor('clrBrightGold', clrBrightGold);
  812. AddColor('clrBronze', clrBronze);
  813. AddColor('clrBronze2', clrBronze2);
  814. AddColor('clrBrown', clrBrown);
  815. AddColor('clrCadetBlue', clrCadetBlue);
  816. AddColor('clrCoolCopper', clrCoolCopper);
  817. AddColor('clrCopper', clrCopper);
  818. AddColor('clrCoral', clrCoral);
  819. AddColor('clrCornflowerBlue', clrCornflowerBlue);
  820. AddColor('clrDarkBrown', clrDarkBrown);
  821. AddColor('clrDarkGreen', clrDarkGreen);
  822. AddColor('clrDarkOliveGreen', clrDarkOliveGreen);
  823. AddColor('clrDarkOrchid', clrDarkOrchid);
  824. AddColor('clrDarkPurple', clrDarkPurple);
  825. AddColor('clrDarkSlateBlue', clrDarkSlateBlue);
  826. AddColor('clrDarkSlateGray', clrDarkSlateGray);
  827. AddColor('clrDarkSlateGrey', clrDarkSlateGrey);
  828. AddColor('clrDarkTan', clrDarkTan);
  829. AddColor('clrDarkTurquoise', clrDarkTurquoise);
  830. AddColor('clrDarkWood', clrDarkWood);
  831. AddColor('clrDkGreenCopper', clrDkGreenCopper);
  832. AddColor('clrDustyRose', clrDustyRose);
  833. AddColor('clrFeldspar', clrFeldspar);
  834. AddColor('clrFirebrick', clrFirebrick);
  835. AddColor('clrFlesh', clrFlesh);
  836. AddColor('clrForestGreen', clrForestGreen);
  837. AddColor('clrGold', clrGold);
  838. AddColor('clrGoldenrod', clrGoldenrod);
  839. AddColor('clrGreenCopper', clrGreenCopper);
  840. AddColor('clrGreenYellow', clrGreenYellow);
  841. AddColor('clrHuntersGreen', clrHuntersGreen);
  842. AddColor('clrIndian', clrIndian);
  843. AddColor('clrKhaki', clrKhaki);
  844. AddColor('clrLightBlue', clrLightBlue);
  845. AddColor('clrLightPurple', clrLightPurple);
  846. AddColor('clrLightSteelBlue', clrLightSteelBlue);
  847. AddColor('clrLightWood', clrLightWood);
  848. AddColor('clrLimeGreen', clrLimeGreen);
  849. AddColor('clrMandarinOrange', clrMandarinOrange);
  850. AddColor('clrMaroon', clrMaroon);
  851. AddColor('clrMediumAquamarine', clrMediumAquamarine);
  852. AddColor('clrMediumBlue', clrMediumBlue);
  853. AddColor('clrMediumForestGreen', clrMediumForestGreen);
  854. AddColor('clrMediumGoldenrod', clrMediumGoldenrod);
  855. AddColor('clrMediumOrchid', clrMediumOrchid);
  856. AddColor('clrMediumPurple', clrMediumPurple);
  857. AddColor('clrMediumSeaGreen', clrMediumSeaGreen);
  858. AddColor('clrMediumSlateBlue', clrMediumSlateBlue);
  859. AddColor('clrMediumSpringGreen', clrMediumSpringGreen);
  860. AddColor('clrMediumTurquoise', clrMediumTurquoise);
  861. AddColor('clrMediumViolet', clrMediumViolet);
  862. AddColor('clrMediumWood', clrMediumWood);
  863. AddColor('clrMidnightBlue', clrMidnightBlue);
  864. AddColor('clrNavy', clrNavy);
  865. AddColor('clrNavyBlue', clrNavyBlue);
  866. AddColor('clrNeonBlue', clrNeonBlue);
  867. AddColor('clrNeonPink', clrNeonPink);
  868. AddColor('clrNewMidnightBlue', clrNewMidnightBlue);
  869. AddColor('clrNewTan', clrNewTan);
  870. AddColor('clrOldGold', clrOldGold);
  871. AddColor('clrOrange', clrOrange);
  872. AddColor('clrOrangeRed', clrOrangeRed);
  873. AddColor('clrOrchid', clrOrchid);
  874. AddColor('clrPaleGreen', clrPaleGreen);
  875. AddColor('clrPink', clrPink);
  876. AddColor('clrPlum', clrPlum);
  877. AddColor('clrQuartz', clrQuartz);
  878. AddColor('clrRichBlue', clrRichBlue);
  879. AddColor('clrSalmon', clrSalmon);
  880. AddColor('clrScarlet', clrScarlet);
  881. AddColor('clrSeaGreen', clrSeaGreen);
  882. AddColor('clrSemiSweetChoc', clrSemiSweetChoc);
  883. AddColor('clrSienna', clrSienna);
  884. AddColor('clrSilver', clrSilver);
  885. AddColor('clrSkyBlue', clrSkyBlue);
  886. AddColor('clrSlateBlue', clrSlateBlue);
  887. AddColor('clrSpicyPink', clrSpicyPink);
  888. AddColor('clrSpringGreen', clrSpringGreen);
  889. AddColor('clrSteelBlue', clrSteelBlue);
  890. AddColor('clrSummerSky', clrSummerSky);
  891. AddColor('clrTan', clrTan);
  892. AddColor('clrThistle', clrThistle);
  893. AddColor('clrTurquoise', clrTurquoise);
  894. AddColor('clrViolet', clrViolet);
  895. AddColor('clrVioletRed', clrVioletRed);
  896. AddColor('clrVeryDarkBrown', clrVeryDarkBrown);
  897. AddColor('clrVeryLightPurple', clrVeryLightPurple);
  898. AddColor('clrWheat', clrWheat);
  899. AddColor('clrYellowGreen', clrYellowGreen);
  900. AddColor('clrGreen', clrGreen);
  901. AddColor('clrOlive', clrOlive);
  902. AddColor('clrPurple', clrPurple);
  903. AddColor('clrTeal', clrTeal);
  904. AddColor('clrRed', clrRed);
  905. AddColor('clrLime', clrLime);
  906. AddColor('clrYellow', clrYellow);
  907. AddColor('clrBlue', clrBlue);
  908. AddColor('clrFuchsia', clrFuchsia);
  909. AddColor('clrAqua', clrAqua);
  910. AddColor('clrScrollBar', clrScrollBar);
  911. AddColor('clrBackground', clrBackground);
  912. AddColor('clrActiveCaption', clrActiveCaption);
  913. AddColor('clrInactiveCaption', clrInactiveCaption);
  914. AddColor('clrMenu', clrMenu);
  915. AddColor('clrWindow', clrWindow);
  916. AddColor('clrWindowFrame', clrWindowFrame);
  917. AddColor('clrMenuText', clrMenuText);
  918. AddColor('clrWindowText', clrWindowText);
  919. AddColor('clrCaptionText', clrCaptionText);
  920. AddColor('clrActiveBorder', clrActiveBorder);
  921. AddColor('clrInactiveBorder', clrInactiveBorder);
  922. AddColor('clrAppWorkSpace', clrAppWorkSpace);
  923. AddColor('clrHighlight', clrHighlight);
  924. AddColor('clrHighlightText', clrHighlightText);
  925. AddColor('clrBtnFace', clrBtnFace);
  926. AddColor('clrBtnShadow', clrBtnShadow);
  927. AddColor('clrGrayText', clrGrayText);
  928. AddColor('clrBtnText', clrBtnText);
  929. AddColor('clrInactiveCaptionText', clrInactiveCaptionText);
  930. AddColor('clrBtnHighlight', clrBtnHighlight);
  931. AddColor('clr3DDkShadow', clr3DDkShadow);
  932. AddColor('clr3DLight', clr3DLight);
  933. AddColor('clrInfoText', clrInfoText);
  934. AddColor('clrInfoBk', clrInfoBk);
  935. end;
  936. procedure TgxColorManager.RemoveColor(const aName: String);
  937. var
  938. i: Integer;
  939. begin
  940. for i := 0 to Count - 1 do
  941. begin
  942. if CompareText(string(TColorEntry(Items[i]^).Name), aName) = 0 then
  943. begin
  944. Delete(i);
  945. Break;
  946. end;
  947. end;
  948. end;
  949. procedure RegisterColor(const aName: String; const aColor: TgxColorVector);
  950. begin
  951. ColorManager.AddColor(aName, aColor);
  952. end;
  953. procedure UnRegisterColor(const aName: String);
  954. begin
  955. ColorManager.RemoveColor(aName);
  956. end;
  957. //====================================================
  958. initialization
  959. //====================================================
  960. InitGLXceneColors;
  961. finalization
  962. vColorManager.Free;
  963. end.