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

2D图形编程

开发平台:

Delphi

  1. unit TrueColors;
  2. //---------------------------------------------------------------------------
  3. interface
  4. //---------------------------------------------------------------------------
  5. uses
  6.  Direct3D9, AsphyreTypes;
  7. //---------------------------------------------------------------------------
  8. type
  9.  TTrueColor = record
  10.   r, g, b, a: Single;
  11.   class operator Add(const a, b: TTrueColor): TTrueColor;
  12.   class operator Subtract(const a, b: TTrueColor): TTrueColor;
  13.   class operator Multiply(const a, b: TTrueColor): TTrueColor;
  14.   class operator Divide(const a, b: TTrueColor): TTrueColor;
  15.   class operator Multiply(const c: TTrueColor; const k: Single): TTrueColor;
  16.   class operator Divide(const c: TTrueColor; const k: Single): TTrueColor;
  17.   class operator Implicit(const c: TTrueColor): Cardinal;
  18.   class operator Implicit(c: Cardinal): TTrueColor;
  19.   class operator Explicit(const c: TTrueColor): TD3DColorValue;
  20.   procedure ClampMax();
  21.   procedure ClampMin();
  22.   procedure Clamp();
  23.  end;
  24. //---------------------------------------------------------------------------
  25.  TTrueColor4 = array[0..3] of TTrueColor;
  26. //---------------------------------------------------------------------------
  27. function TrueColor(r, g, b, a: Single): TTrueColor;
  28. function TrueColor4to4(const Colors: TColor4): TTrueColor4;
  29. function AlphaBlendTC(const c1, c2: TTrueColor; Alpha: Single): TTrueColor;
  30. //---------------------------------------------------------------------------
  31. implementation
  32. //---------------------------------------------------------------------------
  33. class operator TTrueColor.Add(const a, b: TTrueColor): TTrueColor;
  34. begin
  35.  Result.r:= a.r + b.r;
  36.  Result.g:= a.g + b.g;
  37.  Result.b:= a.b + b.b;
  38.  Result.a:= a.a + b.a;
  39. end;
  40. //---------------------------------------------------------------------------
  41. class operator TTrueColor.Subtract(const a, b: TTrueColor): TTrueColor;
  42. begin
  43.  Result.r:= a.r - b.r;
  44.  Result.g:= a.g - b.g;
  45.  Result.b:= a.b - b.b;
  46.  Result.a:= a.a - b.a;
  47. end;
  48. //---------------------------------------------------------------------------
  49. class operator TTrueColor.Multiply(const a, b: TTrueColor): TTrueColor;
  50. begin
  51.  Result.r:= a.r * b.r;
  52.  Result.g:= a.g * b.g;
  53.  Result.b:= a.b * b.b;
  54.  Result.a:= a.a * b.a;
  55. end;
  56. //---------------------------------------------------------------------------
  57. class operator TTrueColor.Divide(const a, b: TTrueColor): TTrueColor;
  58. begin
  59.  Result.r:= a.r / b.r;
  60.  Result.g:= a.g / b.g;
  61.  Result.b:= a.b / b.b;
  62.  Result.a:= a.a / b.a;
  63. end;
  64. //---------------------------------------------------------------------------
  65. class operator TTrueColor.Multiply(const c: TTrueColor;
  66.  const k: Single): TTrueColor;
  67. begin
  68.  Result.r:= c.r * k;
  69.  Result.g:= c.g * k;
  70.  Result.b:= c.b * k;
  71.  Result.a:= c.a * k;
  72. end;
  73. //---------------------------------------------------------------------------
  74. class operator TTrueColor.Divide(const c: TTrueColor;
  75.  const k: Single): TTrueColor;
  76. begin
  77.  Result.r:= c.r / k;
  78.  Result.g:= c.g / k;
  79.  Result.b:= c.b / k;
  80.  Result.a:= c.a / k;
  81. end;
  82. //---------------------------------------------------------------------------
  83. class operator TTrueColor.Explicit(const c: TTrueColor): TD3DColorValue;
  84. begin
  85.  Result.r:= c.r;
  86.  Result.g:= c.g;
  87.  Result.b:= c.b;
  88.  Result.a:= c.a;
  89. end;
  90. //---------------------------------------------------------------------------
  91. class operator TTrueColor.Implicit(const c: TTrueColor): Cardinal;
  92. begin
  93.  Result:= Round(c.b * 255.0) or (Round(c.g * 255.0) shl 8) or
  94.   (Round(c.r * 255.0) shl 16) or (Round(c.a * 255.0) shl 24);
  95. end;
  96. //---------------------------------------------------------------------------
  97. class operator TTrueColor.Implicit(c: Cardinal): TTrueColor;
  98. begin
  99.  Result.r:= ((c shr 16) and $FF) / 255.0;
  100.  Result.g:= ((c shr 8) and $FF) / 255.0;
  101.  Result.b:= (c and $FF) / 255.0;
  102.  Result.a:= ((c shr 24) and $FF) / 255.0;
  103. end;
  104. //---------------------------------------------------------------------------
  105. procedure TTrueColor.ClampMax();
  106. begin
  107.  if (r > 1.0) then r:= 1.0;
  108.  if (g > 1.0) then g:= 1.0;
  109.  if (b > 1.0) then b:= 1.0;
  110.  if (a > 1.0) then a:= 1.0;
  111. end;
  112. //---------------------------------------------------------------------------
  113. procedure TTrueColor.ClampMin();
  114. begin
  115.  if (r < 0.0) then r:= 0.0;
  116.  if (g < 0.0) then g:= 0.0;
  117.  if (b < 0.0) then b:= 0.0;
  118.  if (a < 0.0) then a:= 0.0;
  119. end;
  120. //---------------------------------------------------------------------------
  121. procedure TTrueColor.Clamp();
  122. begin
  123.  ClampMin();
  124.  ClampMax();
  125. end;
  126. //---------------------------------------------------------------------------
  127. function TrueColor(r, g, b, a: Single): TTrueColor;
  128. begin
  129.  Result.r:= r;
  130.  Result.g:= g;
  131.  Result.b:= b;
  132.  Result.a:= a;
  133. end;
  134. //---------------------------------------------------------------------------
  135. function TrueColor4to4(const Colors: TColor4): TTrueColor4;
  136. var
  137.  i: Integer;
  138. begin
  139.  for i:= 0 to 3 do
  140.   Result[i]:= Colors[i];
  141. end;
  142. //---------------------------------------------------------------------------
  143. function AlphaBlendTC(const c1, c2: TTrueColor; Alpha: Single): TTrueColor;
  144. begin
  145.  Result.r:= c1.r + (c2.r - c1.r) * Alpha;
  146.  Result.g:= c1.g + (c2.g - c1.g) * Alpha;
  147.  Result.b:= c1.b + (c2.b - c1.b) * Alpha;
  148.  Result.a:= c1.a + (c2.a - c1.a) * Alpha;
  149. end;
  150. //---------------------------------------------------------------------------
  151. end.