AsphyreColors.pas
上传用户:ctlcnc
上传日期:2021-12-10
资源大小:4933k
文件大小:10k
源码类别:

2D图形编程

开发平台:

Delphi

  1. unit AsphyreColors;
  2. //---------------------------------------------------------------------------
  3. // AsphyreColors.pas                                    Modified: 27-Apr-2007
  4. // Fixed-point 24:8 true color implementation                    Version 1.02
  5. //---------------------------------------------------------------------------
  6. // Important Notice:
  7. //
  8. // If you modify/use this code or one of its parts either in original or
  9. // modified form, you must comply with Mozilla Public License v1.1,
  10. // specifically section 3, "Distribution Obligations". Failure to do so will
  11. // result in the license breach, which will be resolved in the court.
  12. // Remember that violating author's rights is considered a serious crime in
  13. // many countries. Thank you!
  14. //
  15. // !! Please *read* Mozilla Public License 1.1 document located at:
  16. //  http://www.mozilla.org/MPL/
  17. //
  18. // If you require any clarifications about the license, feel free to contact
  19. // us or post your question on our forums at: http://www.afterwarp.net
  20. //---------------------------------------------------------------------------
  21. // The contents of this file are subject to the Mozilla Public License
  22. // Version 1.1 (the "License"); you may not use this file except in
  23. // compliance with the License. You may obtain a copy of the License at
  24. // http://www.mozilla.org/MPL/
  25. //
  26. // Software distributed under the License is distributed on an "AS IS"
  27. // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
  28. // License for the specific language governing rights and limitations
  29. // under the License.
  30. //
  31. // The Original Code is AsphyreColors.pas.
  32. //
  33. // The Initial Developer of the Original Code is M. Sc. Yuriy Kotsarenko.
  34. // Portions created by M. Sc. Yuriy Kotsarenko are Copyright (C) 2007,
  35. // M. Sc. Yuriy Kotsarenko. All Rights Reserved.
  36. //---------------------------------------------------------------------------
  37. interface
  38. //---------------------------------------------------------------------------
  39. uses
  40.  Direct3D9;
  41. //---------------------------------------------------------------------------
  42. type
  43.  TAsphyreColor = record
  44.   r, g, b, a: Integer;
  45.   class operator Add(const a, b: TAsphyreColor): TAsphyreColor;
  46.   class operator Subtract(const a, b: TAsphyreColor): TAsphyreColor;
  47.   class operator Multiply(const a, b: TAsphyreColor): TAsphyreColor;
  48.   class operator Divide(const a, b: TAsphyreColor): TAsphyreColor;
  49.   class operator Multiply(const c: TAsphyreColor; k: Integer): TAsphyreColor;
  50.   class operator Divide(const c: TAsphyreColor; k: Integer): TAsphyreColor;
  51.   class operator Multiply(const c: TAsphyreColor; k: Real): TAsphyreColor;
  52.   class operator Divide(const c: TAsphyreColor; k: Real): TAsphyreColor;
  53.   class operator Implicit(const c: TAsphyreColor): Cardinal;
  54.   class operator Implicit(c: Cardinal): TAsphyreColor;
  55.   class operator Explicit(const c: TAsphyreColor): Cardinal;
  56.   class operator Explicit(c: Cardinal): TAsphyreColor;
  57.   class operator Implicit(const c: TAsphyreColor): TD3DColorValue;
  58.   class operator Implicit(const c: TD3DColorValue): TAsphyreColor;
  59.   class operator Explicit(const c: TAsphyreColor): TD3DColorValue;
  60.   class operator Explicit(const c: TD3DColorValue): TAsphyreColor;
  61.  end;
  62. //---------------------------------------------------------------------------
  63.  TAsphyreColor4 = array[0..3] of TAsphyreColor;
  64. //---------------------------------------------------------------------------
  65. function cColor(r, g, b, a: Integer): TAsphyreColor; overload;
  66. function cColor(Gray, Alpha: Integer): TAsphyreColor; overload;
  67. function cColor(Gray: Integer): TAsphyreColor; overload;
  68. function cNoAlpha(const Src: TAsphyreColor): TAsphyreColor;
  69. function cClamp(const c: TAsphyreColor): TAsphyreColor;
  70. function cBlend(const Src, Dest: TAsphyreColor;
  71.  Alpha: Integer): TAsphyreColor;
  72. //---------------------------------------------------------------------------
  73. implementation
  74. //---------------------------------------------------------------------------
  75. uses
  76.  AsphyreUtils, SysUtils;
  77. //---------------------------------------------------------------------------
  78. function Inc8to16(Value: Integer): Integer; inline;
  79. begin
  80.  Result:= (Value * 65535) div 255;
  81. end;
  82. //---------------------------------------------------------------------------
  83. function cColor(r, g, b, a: Integer): TAsphyreColor;
  84. begin
  85.  Result.r:= Inc8to16(r);
  86.  Result.g:= Inc8to16(g);
  87.  Result.b:= Inc8to16(b);
  88.  Result.a:= Inc8to16(a);
  89. end;
  90. //---------------------------------------------------------------------------
  91. function cColor(Gray, Alpha: Integer): TAsphyreColor;
  92. begin
  93.  Result:= cColor(Gray, Gray, Gray, Alpha);
  94. end;
  95. //---------------------------------------------------------------------------
  96. function cColor(Gray: Integer): TAsphyreColor;
  97. begin
  98.  Result:= cColor(Gray, 255);
  99. end;
  100. //---------------------------------------------------------------------------
  101. function cClamp(const c: TAsphyreColor): TAsphyreColor;
  102. begin
  103.  Result.r:= MinMax2(c.r, 0, 65535);
  104.  Result.g:= MinMax2(c.g, 0, 65535);
  105.  Result.b:= MinMax2(c.b, 0, 65535);
  106.  Result.a:= MinMax2(c.a, 0, 65535);
  107. end;
  108. //---------------------------------------------------------------------------
  109. function cBlend(const Src, Dest: TAsphyreColor;
  110.  Alpha: Integer): TAsphyreColor;
  111. begin
  112.  Result.r:= Src.r + iMul8(Dest.r - Src.r, Alpha);
  113.  Result.g:= Src.g + iMul8(Dest.g - Src.g, Alpha);
  114.  Result.b:= Src.b + iMul8(Dest.b - Src.b, Alpha);
  115.  Result.a:= Src.a + iMul8(Dest.a - Src.a, Alpha);
  116. end;
  117. //---------------------------------------------------------------------------
  118. function cNoAlpha(const Src: TAsphyreColor): TAsphyreColor;
  119. begin
  120.  Result.r:= Src.r;
  121.  Result.g:= Src.g;
  122.  Result.b:= Src.b;
  123.  Result.a:= 65535;
  124. end;
  125. //---------------------------------------------------------------------------
  126. class operator TAsphyreColor.Add(const a, b: TAsphyreColor): TAsphyreColor;
  127. begin
  128.  Result.r:= a.r + b.r;
  129.  Result.g:= a.g + b.g;
  130.  Result.b:= a.b + b.b;
  131.  Result.a:= a.a + b.a;
  132. end;
  133. //---------------------------------------------------------------------------
  134. class operator TAsphyreColor.Subtract(const a, b: TAsphyreColor): TAsphyreColor;
  135. begin
  136.  Result.r:= a.r - b.r;
  137.  Result.g:= a.g - b.g;
  138.  Result.b:= a.b - b.b;
  139.  Result.b:= a.a - b.a;
  140. end;
  141. //---------------------------------------------------------------------------
  142. class operator TAsphyreColor.Multiply(const a, b: TAsphyreColor): TAsphyreColor;
  143. begin
  144.  Result.r:= iMul16(a.r, b.r + 1);
  145.  Result.g:= iMul16(a.g, b.g + 1);
  146.  Result.b:= iMul16(a.b, b.b + 1);
  147.  Result.a:= iMul16(a.a, b.a + 1);
  148. end;
  149. //---------------------------------------------------------------------------
  150. class operator TAsphyreColor.Divide(const a, b: TAsphyreColor): TAsphyreColor;
  151. begin
  152.  Result.r:= iDiv16(a.r, b.r);
  153.  Result.g:= iDiv16(a.g, b.g);
  154.  Result.b:= iDiv16(a.b, b.b);
  155.  Result.a:= iDiv16(a.a, b.a);
  156. end;
  157. //---------------------------------------------------------------------------
  158. class operator TAsphyreColor.Multiply(const c: TAsphyreColor;
  159.  k: Integer): TAsphyreColor;
  160. begin
  161.  Result.r:= c.r * k;
  162.  Result.g:= c.g * k;
  163.  Result.b:= c.b * k;
  164.  Result.a:= c.a * k;
  165. end;
  166. //---------------------------------------------------------------------------
  167. class operator TAsphyreColor.Divide(const c: TAsphyreColor;
  168.  k: Integer): TAsphyreColor;
  169. begin
  170.  Result.r:= c.r div k;
  171.  Result.g:= c.g div k;
  172.  Result.b:= c.b div k;
  173.  Result.a:= c.a div k;
  174. end;
  175. //---------------------------------------------------------------------------
  176. class operator TAsphyreColor.Multiply(const c: TAsphyreColor;
  177.  k: Real): TAsphyreColor;
  178. begin
  179.  Result.r:= Round(c.r * k);
  180.  Result.g:= Round(c.g * k);
  181.  Result.b:= Round(c.b * k);
  182.  Result.a:= Round(c.a * k);
  183. end;
  184. //---------------------------------------------------------------------------
  185. class operator TAsphyreColor.Divide(const c: TAsphyreColor;
  186.  k: Real): TAsphyreColor;
  187. begin
  188.  Result.r:= Round(c.r / k);
  189.  Result.g:= Round(c.g / k);
  190.  Result.b:= Round(c.b / k);
  191.  Result.a:= Round(c.a / k);
  192. end;
  193. //---------------------------------------------------------------------------
  194. class operator TAsphyreColor.Implicit(c: Cardinal): TAsphyreColor;
  195. begin
  196.  Result.r:= Inc8to16((c shr 16) and $FF);
  197.  Result.b:= Inc8to16(c and $FF);
  198.  Result.g:= Inc8to16((c shr 8) and $FF);
  199.  Result.a:= Inc8to16((c shr 24) and $FF);
  200. end;
  201. //---------------------------------------------------------------------------
  202. class operator TAsphyreColor.Implicit(const c: TAsphyreColor): Cardinal;
  203. begin
  204.  Result:= (c.b shr 8) or ((c.g shr 8) shl 8) or ((c.r shr 8) shl 16) or
  205.   ((c.a shr 8) shl 24);
  206. end;
  207. //---------------------------------------------------------------------------
  208. class operator TAsphyreColor.Explicit(c: Cardinal): TAsphyreColor;
  209. begin
  210.  Result.r:= Inc8to16((c shr 16) and $FF);
  211.  Result.b:= Inc8to16(c and $FF);
  212.  Result.g:= Inc8to16((c shr 8) and $FF);
  213.  Result.a:= Inc8to16((c shr 24) and $FF);
  214. end;
  215. //---------------------------------------------------------------------------
  216. class operator TAsphyreColor.Explicit(const c: TAsphyreColor): Cardinal;
  217. begin
  218.  Result:= (c.b shr 8) or ((c.g shr 8) shl 8) or ((c.r shr 8) shl 16) or
  219.   ((c.a shr 8) shl 24);
  220. end;
  221. //---------------------------------------------------------------------------
  222. class operator TAsphyreColor.Implicit(const c: TD3DColorValue): TAsphyreColor;
  223. begin
  224.  Result.r:= Round(c.r * 65535.0);
  225.  Result.g:= Round(c.g * 65535.0);
  226.  Result.b:= Round(c.b * 65535.0);
  227.  Result.a:= Round(c.a * 65535.0);
  228. end;
  229. //---------------------------------------------------------------------------
  230. class operator TAsphyreColor.Implicit(const c: TAsphyreColor): TD3DColorValue;
  231. begin
  232.  Result.r:= c.r / 65535.0;
  233.  Result.g:= c.g / 65535.0;
  234.  Result.b:= c.b / 65535.0;
  235.  Result.a:= c.a / 65535.0;
  236. end;
  237. //---------------------------------------------------------------------------
  238. class operator TAsphyreColor.Explicit(const c: TD3DColorValue): TAsphyreColor;
  239. begin
  240.  Result.r:= Round(c.r * 65535);
  241.  Result.g:= Round(c.g * 65535);
  242.  Result.b:= Round(c.b * 65535);
  243.  Result.a:= Round(c.a * 65535);
  244. end;
  245. //---------------------------------------------------------------------------
  246. class operator TAsphyreColor.Explicit(const c: TAsphyreColor): TD3DColorValue;
  247. begin
  248.  Result.r:= c.r / 65535.0;
  249.  Result.g:= c.g / 65535.0;
  250.  Result.b:= c.b / 65535.0;
  251.  Result.a:= c.a / 65535.0;
  252. end;
  253. //---------------------------------------------------------------------------
  254. end.