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

2D图形编程

开发平台:

Delphi

  1. unit AsphyreTypes;
  2. //---------------------------------------------------------------------------
  3. // AsphyreTypes.pas                                     Modified: 19-Feb-2007
  4. // Asphyre types definitions                                      Version 1.0
  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 AsphyreTypes.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. // Afterwarp Interactive. All Rights Reserved.
  36. //---------------------------------------------------------------------------
  37. interface
  38. //---------------------------------------------------------------------------
  39. {$include Asphyre4.inc}
  40. //---------------------------------------------------------------------------
  41. uses
  42.  Types, Vectors2, AsphyreColors;
  43. //---------------------------------------------------------------------------
  44. type
  45.  THorizontalAlign = (haLeft, haRight, haCenter, haJustified);
  46.  TVerticalAlign   = (vaTop, vaBottom, vaCenter);
  47. //---------------------------------------------------------------------------
  48.  TAntialiasType = (atNone, atNormal, atBest);
  49. //---------------------------------------------------------------------------
  50.  TMipmappingType = (mtNone, mtSingle, mtSmooth);
  51. //---------------------------------------------------------------------------
  52.  PColor2 = ^TColor2;
  53.  TColor2 = array[0..1] of Cardinal;
  54. //---------------------------------------------------------------------------
  55.  PColor4 = ^TColor4;
  56.  TColor4 = array[0..3] of Cardinal;
  57. //---------------------------------------------------------------------------
  58.  PPoint4 = ^TPoint4;
  59.  TPoint4 = array[0..3] of TPoint2;
  60. //---------------------------------------------------------------------------
  61.  PPoint4px = ^TPoint4px;
  62.  TPoint4px = array[0..3] of TPoint;
  63. //---------------------------------------------------------------------------
  64. const
  65.  clWhite1  : Cardinal = $FFFFFFFF;
  66.  clBlack1  : Cardinal = $FF000000;
  67.  clMaroon1 : Cardinal = $FF800000;
  68.  clGreen1  : Cardinal = $FF008000;
  69.  clOlive1  : Cardinal = $FF808000;
  70.  clNavy1   : Cardinal = $FF000080;
  71.  clPurple1 : Cardinal = $FF800080;
  72.  clTeal1   : Cardinal = $FF008080;
  73.  clGray1   : Cardinal = $FF808080;
  74.  clSilver1 : Cardinal = $FFC0C0C0;
  75.  clRed1    : Cardinal = $FFFF0000;
  76.  clLime1   : Cardinal = $FF00FF00;
  77.  clYellow1 : Cardinal = $FFFFFF00;
  78.  clBlue1   : Cardinal = $FF0000FF;
  79.  clFuchsia1: Cardinal = $FFFF00FF;
  80.  clAqua1   : Cardinal = $FF00FFFF;
  81.  clLtGray1 : Cardinal = $FFC0C0C0;
  82.  clDkGray1 : Cardinal = $FF808080;
  83.  clOpaque1 : Cardinal = $00FFFFFF;
  84.  clUnknown : Cardinal = $00000000;
  85. //---------------------------------------------------------------------------
  86.  clWhite2  : TColor2 = ($FFFFFFFF, $FFFFFFFF);
  87.  clBlack2  : TColor2 = ($FF000000, $FF000000);
  88.  clMaroon2 : TColor2 = ($FF800000, $FF800000);
  89.  clGreen2  : TColor2 = ($FF008000, $FF008000);
  90.  clOlive2  : TColor2 = ($FF808000, $FF808000);
  91.  clNavy2   : TColor2 = ($FF000080, $FF000080);
  92.  clPurple2 : TColor2 = ($FF800080, $FF800080);
  93.  clTeal2   : TColor2 = ($FF008080, $FF008080);
  94.  clGray2   : TColor2 = ($FF808080, $FF808080);
  95.  clSilver2 : TColor2 = ($FFC0C0C0, $FFC0C0C0);
  96.  clRed2    : TColor2 = ($FFFF0000, $FFFF0000);
  97.  clLime2   : TColor2 = ($FF00FF00, $FF00FF00);
  98.  clYellow2 : TColor2 = ($FFFFFF00, $FFFFFF00);
  99.  clBlue2   : TColor2 = ($FF0000FF, $FF0000FF);
  100.  clFuchsia2: TColor2 = ($FFFF00FF, $FFFF00FF);
  101.  clAqua2   : TColor2 = ($FF00FFFF, $FF00FFFF);
  102.  clLtGray2 : TColor2 = ($FFC0C0C0, $FFC0C0C0);
  103.  clDkGray2 : TColor2 = ($FF808080, $FF808080);
  104.  clOpaque2 : TColor2 = ($00FFFFFF, $00FFFFFF);
  105.  clUnknown2: TColor2 = ($00000000, $00000000);
  106. //---------------------------------------------------------------------------
  107.  clWhite4  : TColor4 = ($FFFFFFFF, $FFFFFFFF, $FFFFFFFF, $FFFFFFFF);
  108.  clBlack4  : TColor4 = ($FF000000, $FF000000, $FF000000, $FF000000);
  109.  clMaroon4 : TColor4 = ($FF800000, $FF800000, $FF800000, $FF800000);
  110.  clGreen4  : TColor4 = ($FF008000, $FF008000, $FF008000, $FF008000);
  111.  clOlive4  : TColor4 = ($FF808000, $FF808000, $FF808000, $FF808000);
  112.  clNavy4   : TColor4 = ($FF000080, $FF000080, $FF000080, $FF000080);
  113.  clPurple4 : TColor4 = ($FF800080, $FF800080, $FF800080, $FF800080);
  114.  clTeal4   : TColor4 = ($FF008080, $FF008080, $FF008080, $FF008080);
  115.  clGray4   : TColor4 = ($FF808080, $FF808080, $FF808080, $FF808080);
  116.  clSilver4 : TColor4 = ($FFC0C0C0, $FFC0C0C0, $FFC0C0C0, $FFC0C0C0);
  117.  clRed4    : TColor4 = ($FFFF0000, $FFFF0000, $FFFF0000, $FFFF0000);
  118.  clLime4   : TColor4 = ($FF00FF00, $FF00FF00, $FF00FF00, $FF00FF00);
  119.  clYellow4 : TColor4 = ($FFFFFF00, $FFFFFF00, $FFFFFF00, $FFFFFF00);
  120.  clBlue4   : TColor4 = ($FF0000FF, $FF0000FF, $FF0000FF, $FF0000FF);
  121.  clFuchsia4: TColor4 = ($FFFF00FF, $FFFF00FF, $FFFF00FF, $FFFF00FF);
  122.  clAqua4   : TColor4 = ($FF00FFFF, $FF00FFFF, $FF00FFFF, $FF00FFFF);
  123.  clLtGray4 : TColor4 = ($FFC0C0C0, $FFC0C0C0, $FFC0C0C0, $FFC0C0C0);
  124.  clDkGray4 : TColor4 = ($FF808080, $FF808080, $FF808080, $FF808080);
  125.  clOpaque4 : TColor4 = ($00FFFFFF, $00FFFFFF, $00FFFFFF, $00FFFFFF);
  126.  clUnknown4: TColor4 = ($00000000, $00000000, $00000000, $00000000);
  127. //---------------------------------------------------------------------------
  128.  TexFull4: TPoint4 = ((x: 0.0; y: 0.0), (x: 1.0; y: 0.0), (x: 1.0; y: 1.0),
  129.   (x: 0.0; y: 1.0));
  130.  TexZero4px: TPoint4px = ((x: 0; y: 0), (x: 0; y: 0), (x: 0; y: 0),
  131.   (x: 0; y: 0));
  132. //---------------------------------------------------------------------------
  133. function cRGB1(r, g, b: Cardinal; a: Cardinal = 255): Cardinal;
  134. function cGray1(Gray: Cardinal): Cardinal;
  135. function cAlpha1(Alpha: Cardinal): Cardinal;
  136. function cColorAlpha1(Color, Alpha: Cardinal): Cardinal;
  137. function cColorGrayAlpha1(Color, Gray, Alpha: Cardinal): Cardinal;
  138. //---------------------------------------------------------------------------
  139. function cColor2(Color0, Color1: Cardinal): TColor2; overload;
  140. function cColor2(Color: Cardinal): TColor2; overload;
  141. function cRGB2(r, g, b: Cardinal; a: Cardinal = 255): TColor2; overload;
  142. function cRGB2(r1, g1, b1, a1, r2, g2, b2, a2: Cardinal): TColor2; overload;
  143. function cGray2(Gray: Cardinal): TColor2; overload;
  144. function cGray2(Gray1, Gray2: Cardinal): TColor2; overload;
  145. function cAlpha2(Alpha: Cardinal): TColor2; overload;
  146. function cAlpha2(Alpha1, Alpha2: Cardinal): TColor2; overload;
  147. function cColorAlpha2(Color, Alpha: Cardinal): TColor2; overload;
  148. function cColorAlpha2(Color1, Color2, Alpha1, Alpha2: Cardinal): TColor2; overload;
  149. //---------------------------------------------------------------------------
  150. function cColor4(Color: Cardinal): TColor4; overload;
  151. function cColor4(Color1, Color2, Color3, Color4: Cardinal): TColor4; overload;
  152. function cRGB4(r, g, b: Cardinal; a: Cardinal = 255): TColor4; overload;
  153. function cRGB4(r1, g1, b1, a1, r2, g2, b2, a2: Cardinal): TColor4; overload;
  154. function cGray4(Gray: Cardinal): TColor4; overload;
  155. function cGray4(Gray1, Gray2, Gray3, Gray4: Cardinal): TColor4; overload;
  156. function cAlpha4(Alpha: Cardinal): TColor4; overload;
  157. function cAlpha4(Alpha1, Alpha2, Alpha3, Alpha4: Cardinal): TColor4; overload;
  158. function cGrayAlpha4(Gray, Alpha: Cardinal): TColor4; overload;
  159. function cGrayAlpha4(Gray1, Gray2, Gray3, Gray4, Alpha1, Alpha2, Alpha3,
  160.  Alpha4: Cardinal): TColor4; overload;
  161. function cColorAlpha4(Color, Alpha: Cardinal): TColor4; overload;
  162. function cColorAlpha4(Color1, Color2, Color3, Color4, Alpha1, Alpha2, Alpha3,
  163.  Alpha4: Cardinal): TColor4; overload;
  164. function cColorGrayAlpha4(Color, Gray, Alpha: Cardinal): TColor4; overload;
  165. function cColorGrayAlpha4(Color1, Color2, Color3, Color4,
  166.  Gray1, Gray2, Gray3, Gray4, Alpha1, Alpha2, Alpha3,
  167.  Alpha4: Cardinal): TColor4; overload;
  168. //---------------------------------------------------------------------------
  169. function ColorToFixed4(const Colors: TColor4): TAsphyreColor4;
  170. function FixedToColor4(const Colors: TAsphyreColor4): TColor4;
  171. //---------------------------------------------------------------------------
  172. // Point4 helper routines
  173. //---------------------------------------------------------------------------
  174. // point values -> TPoint4
  175. function Point4(x1, y1, x2, y2, x3, y3, x4, y4: Real): TPoint4; overload;
  176. function Point4(const p1, p2, p3, p4: TPoint2): TPoint4; overload;
  177. // rectangle coordinates -> TPoint4
  178. function pRect4(const Rect: TRect): TPoint4;
  179. // rectangle coordinates -> TPoint4
  180. function pBounds4(_Left, _Top, _Width, _Height: Real): TPoint4;
  181. // rectangle coordinates, scaled -> TPoint4
  182. function pBounds4s(_Left, _Top, _Width, _Height, Theta: Real): TPoint4;
  183. // rectangle coordinates, scaled / centered -> TPoint4
  184. function pBounds4sc(_Left, _Top, _Width, _Height, Theta: Real): TPoint4;
  185. // mirrors the coordinates
  186. function pMirror4(const Point4: TPoint4): TPoint4;
  187. // flips the coordinates
  188. function pFlip4(const Point4: TPoint4): TPoint4;
  189. // shift the given points by the specified amount
  190. function pShift4(const Points: TPoint4; const ShiftBy: TPoint2): TPoint4;
  191. // rotated rectangle (Origin + Size) around (Middle) with Angle and Scale
  192. function pRotate4(const Origin, Size, Middle: TPoint2; Angle: Real;
  193.  Theta: Real = 1.0): TPoint4;
  194. function pRotate4se(const Origin, Size, Middle: TPoint2; Angle: Real;
  195.  Theta: Real = 1.0): TPoint4;
  196. function pRotate4c(const Origin, Size: TPoint2; Angle: Real;
  197.  Theta: Real = 1.0): TPoint4;
  198. //---------------------------------------------------------------------------
  199. function pxBounds4(Left, Top, Width, Height: Integer): TPoint4px;
  200. function pxRect4(Left, Top, Right, Bottom: Integer): TPoint4px; overload;
  201. function pxRect4(const Rect: TRect): TPoint4px; overload;
  202. function pxRotate90r(const Points: TPoint4px): TPoint4px;
  203. //---------------------------------------------------------------------------
  204. implementation
  205. //---------------------------------------------------------------------------
  206. function cRGB1(r, g, b: Cardinal; a: Cardinal = 255): Cardinal;
  207. begin
  208.  Result:= r or (g shl 8) or (b shl 16) or (a shl 24);
  209. end;
  210. //---------------------------------------------------------------------------
  211. function cGray1(Gray: Cardinal): Cardinal;
  212. begin
  213.  Result:= ((Gray and $FF) or ((Gray and $FF) shl 8) or ((Gray and $FF) shl 16))
  214.   or $FF000000;
  215. end;
  216. //---------------------------------------------------------------------------
  217. function cAlpha1(Alpha: Cardinal): Cardinal;
  218. begin
  219.  Result:= $FFFFFF or ((Alpha and $FF) shl 24);
  220. end;
  221. //---------------------------------------------------------------------------
  222. function cColorAlpha1(Color, Alpha: Cardinal): Cardinal;
  223. begin
  224.  Result:= TAsphyreColor(Color) * TAsphyreColor(cAlpha1(Alpha));
  225. end;
  226. //---------------------------------------------------------------------------
  227. function cColorGrayAlpha1(Color, Gray, Alpha: Cardinal): Cardinal;
  228. begin
  229.  Result:= TAsphyreColor(Color) * cColor(Gray, Gray, Gray, Alpha);
  230. end;
  231. //---------------------------------------------------------------------------
  232. function cColor2(Color0, Color1: Cardinal): TColor2;
  233. begin
  234.  Result[0]:= Color0;
  235.  Result[1]:= Color1;
  236.  end;
  237. //---------------------------------------------------------------------------
  238. function cColor2(Color: Cardinal): TColor2;
  239. begin
  240.  Result[0]:= Color;
  241.  Result[1]:= Color;
  242. end;
  243. //---------------------------------------------------------------------------
  244. function cRGB2(r1, g1, b1, a1, r2, g2, b2, a2: Cardinal): TColor2; overload;
  245. begin
  246.  Result[0]:= cRGB1(r1, g1, b1, a1);
  247.  Result[1]:= cRGB1(r1, g1, b1, a1);
  248. end;
  249. //---------------------------------------------------------------------------
  250. function cRGB2(r, g, b: Cardinal; a: Cardinal = 255): TColor2; overload;
  251. begin
  252.  Result[0]:= cRGB1(r, g, b, a);
  253.  Result[1]:= Result[0];
  254. end;
  255. //---------------------------------------------------------------------------
  256. function cGray2(Gray: Cardinal): TColor2;
  257. begin
  258.  Result:= cColor2(((Gray and $FF) or ((Gray and $FF) shl 8) or
  259.   ((Gray and $FF) shl 16)) or $FF000000);
  260. end;
  261. //---------------------------------------------------------------------------
  262. function cGray2(Gray1, Gray2: Cardinal): TColor2;
  263. begin
  264.  Result[0]:= ((Gray1 and $FF) or ((Gray1 and $FF) shl 8) or
  265.   ((Gray1 and $FF) shl 16)) or $FF000000;
  266.  Result[1]:= ((Gray2 and $FF) or ((Gray2 and $FF) shl 8) or
  267.   ((Gray2 and $FF) shl 16)) or $FF000000;
  268. end;
  269. //---------------------------------------------------------------------------
  270. function cAlpha2(Alpha: Cardinal): TColor2;
  271. begin
  272.  Result:= cColor2($FFFFFF or ((Alpha and $FF) shl 24));
  273. end;
  274. //---------------------------------------------------------------------------
  275. function cAlpha2(Alpha1, Alpha2: Cardinal): TColor2;
  276. begin
  277.  Result[0]:= $FFFFFF or ((Alpha1 and $FF) shl 24);
  278.  Result[1]:= $FFFFFF or ((Alpha2 and $FF) shl 24);
  279. end;
  280. //---------------------------------------------------------------------------
  281. function cColorAlpha2(Color, Alpha: Cardinal): TColor2; overload;
  282. begin
  283.  Result:= cColor2((Color and $FFFFFF) or ((Alpha and $FF) shl 24));
  284. end;
  285. //---------------------------------------------------------------------------
  286. function cColorAlpha2(Color1, Color2, Alpha1, Alpha2: Cardinal): TColor2;
  287. begin
  288.  Result[0]:= cColorAlpha1(Color1, Alpha1);
  289.  Result[1]:= cColorAlpha1(Color2, Alpha2);
  290. end;
  291. //---------------------------------------------------------------------------
  292. function cColor4(Color: Cardinal): TColor4;
  293. begin
  294.  Result[0]:= Color;
  295.  Result[1]:= Color;
  296.  Result[2]:= Color;
  297.  Result[3]:= Color;
  298. end;
  299. //---------------------------------------------------------------------------
  300. function cColor4(Color1, Color2, Color3, Color4: Cardinal): TColor4;
  301. begin
  302.  Result[0]:= Color1;
  303.  Result[1]:= Color2;
  304.  Result[2]:= Color3;
  305.  Result[3]:= Color4;
  306. end;
  307. //---------------------------------------------------------------------------
  308. function cRGB4(r, g, b: Cardinal; a: Cardinal = 255): TColor4;
  309. begin
  310.  Result:= cColor4(cRGB1(r, g, b, a));
  311. end;
  312. //---------------------------------------------------------------------------
  313. function cRGB4(r1, g1, b1, a1, r2, g2, b2, a2: Cardinal): TColor4;
  314. begin
  315.  Result[0]:= cRGB1(r1, g1, b1, a1);
  316.  Result[1]:= Result[0];
  317.  Result[2]:= cRGB1(r2, g2, b2, a2);
  318.  Result[3]:= Result[2];
  319. end;
  320. //---------------------------------------------------------------------------
  321. function cGray4(Gray: Cardinal): TColor4;
  322. begin
  323.  Result:= cColor4(((Gray and $FF) or ((Gray and $FF) shl 8) or
  324.   ((Gray and $FF) shl 16)) or $FF000000);
  325. end;
  326. //---------------------------------------------------------------------------
  327. function cGray4(Gray1, Gray2, Gray3, Gray4: Cardinal): TColor4;
  328. begin
  329.  Result[0]:= ((Gray1 and $FF) or ((Gray1 and $FF) shl 8) or ((Gray1 and $FF)
  330.   shl 16)) or $FF000000;
  331.  Result[1]:= ((Gray2 and $FF) or ((Gray2 and $FF) shl 8) or ((Gray2 and $FF)
  332.   shl 16)) or $FF000000;
  333.  Result[2]:= ((Gray3 and $FF) or ((Gray3 and $FF) shl 8) or ((Gray3 and $FF)
  334.   shl 16)) or $FF000000;
  335.  Result[3]:= ((Gray4 and $FF) or ((Gray4 and $FF) shl 8) or ((Gray4 and $FF)
  336.   shl 16)) or $FF000000;
  337. end;
  338. //---------------------------------------------------------------------------
  339. function cAlpha4(Alpha: Cardinal): TColor4;
  340. begin
  341.  Result:= cColor4($FFFFFF or ((Alpha and $FF) shl 24));
  342. end;
  343. //---------------------------------------------------------------------------
  344. function cAlpha4(Alpha1, Alpha2, Alpha3, Alpha4: Cardinal): TColor4;
  345. begin
  346.  Result[0]:= $FFFFFF or ((Alpha1 and $FF) shl 24);
  347.  Result[1]:= $FFFFFF or ((Alpha2 and $FF) shl 24);
  348.  Result[2]:= $FFFFFF or ((Alpha3 and $FF) shl 24);
  349.  Result[3]:= $FFFFFF or ((Alpha4 and $FF) shl 24);
  350. end;
  351. //---------------------------------------------------------------------------
  352. function cGrayAlpha4(Gray, Alpha: Cardinal): TColor4;
  353. begin
  354.  Result:= cColor4(((Gray and $FF) or ((Gray and $FF) shl 8) or
  355.   ((Gray and $FF) shl 16)) or (Alpha shl 24));
  356. end;
  357. //---------------------------------------------------------------------------
  358. function cGrayAlpha4(Gray1, Gray2, Gray3, Gray4, Alpha1, Alpha2, Alpha3,
  359.  Alpha4: Cardinal): TColor4;
  360. begin
  361.  Result[0]:= ((Gray1 and $FF) or ((Gray1 and $FF) shl 8) or ((Gray1 and $FF)
  362.   shl 16)) or (Alpha1 shl 24);
  363.  Result[1]:= ((Gray2 and $FF) or ((Gray2 and $FF) shl 8) or ((Gray2 and $FF)
  364.   shl 16)) or (Alpha2 shl 24);
  365.  Result[2]:= ((Gray3 and $FF) or ((Gray3 and $FF) shl 8) or ((Gray3 and $FF)
  366.   shl 16)) or (Alpha3 shl 24);
  367.  Result[3]:= ((Gray4 and $FF) or ((Gray4 and $FF) shl 8) or ((Gray4 and $FF)
  368.   shl 16)) or (Alpha4 shl 24);
  369. end;
  370. //---------------------------------------------------------------------------
  371. function cColorAlpha4(Color, Alpha: Cardinal): TColor4; overload;
  372. begin
  373.  Result:= cColor4(cColorAlpha1(Color, Alpha));
  374. end;
  375. //---------------------------------------------------------------------------
  376. function cColorAlpha4(Color1, Color2, Color3, Color4, Alpha1, Alpha2, Alpha3,
  377.  Alpha4: Cardinal): TColor4;
  378. begin
  379.  Result[0]:= cColorAlpha1(Color1, Alpha1);
  380.  Result[1]:= cColorAlpha1(Color2, Alpha2);
  381.  Result[2]:= cColorAlpha1(Color3, Alpha3);
  382.  Result[3]:= cColorAlpha1(Color4, Alpha4);
  383. end;
  384. //---------------------------------------------------------------------------
  385. function cColorGrayAlpha4(Color, Gray, Alpha: Cardinal): TColor4; overload;
  386. begin
  387.  Result:= cColor4(cColorGrayAlpha1(Color, Gray, Alpha));
  388. end;
  389. //---------------------------------------------------------------------------
  390. function cColorGrayAlpha4(Color1, Color2, Color3, Color4,
  391.  Gray1, Gray2, Gray3, Gray4, Alpha1, Alpha2, Alpha3,
  392.  Alpha4: Cardinal): TColor4; overload;
  393. begin
  394.  Result[0]:= cColorGrayAlpha1(Color1, Gray1, Alpha1);
  395.  Result[1]:= cColorGrayAlpha1(Color2, Gray2, Alpha2);
  396.  Result[2]:= cColorGrayAlpha1(Color3, Gray3, Alpha3);
  397.  Result[3]:= cColorGrayAlpha1(Color4, Gray4, Alpha4);
  398. end;
  399. //---------------------------------------------------------------------------
  400. function ColorToFixed4(const Colors: TColor4): TAsphyreColor4;
  401. begin
  402.  Result[0]:= Colors[0];
  403.  Result[1]:= Colors[1];
  404.  Result[2]:= Colors[2];
  405.  Result[3]:= Colors[3];
  406. end;
  407. //---------------------------------------------------------------------------
  408. function FixedToColor4(const Colors: TAsphyreColor4): TColor4;
  409. begin
  410.  Result[0]:= Colors[0];
  411.  Result[1]:= Colors[1];
  412.  Result[2]:= Colors[2];
  413.  Result[3]:= Colors[3];
  414. end;
  415. //---------------------------------------------------------------------------
  416. function Point4(x1, y1, x2, y2, x3, y3, x4, y4: Real): TPoint4;
  417. begin
  418.  Result[0].x:= x1;
  419.  Result[0].y:= y1;
  420.  Result[1].x:= x2;
  421.  Result[1].y:= y2;
  422.  Result[2].x:= x3;
  423.  Result[2].y:= y3;
  424.  Result[3].x:= x4;
  425.  Result[3].y:= y4;
  426. end;
  427. //---------------------------------------------------------------------------
  428. function Point4(const p1, p2, p3, p4: TPoint2): TPoint4;
  429. begin
  430.  Result:= Point4(p1.x, p1.y, p2.x, p2.y, p3.x, p3.y, p4.x, p4.y);
  431. end;
  432. //---------------------------------------------------------------------------
  433. function pRect4(const Rect: TRect): TPoint4;
  434. begin
  435.  Result[0].x:= Rect.Left;
  436.  Result[0].y:= Rect.Top;
  437.  Result[1].x:= Rect.Right;
  438.  Result[1].y:= Rect.Top;
  439.  Result[2].x:= Rect.Right;
  440.  Result[2].y:= Rect.Bottom;
  441.  Result[3].x:= Rect.Left;
  442.  Result[3].y:= Rect.Bottom;
  443. end;
  444. //---------------------------------------------------------------------------
  445. function pBounds4(_Left, _Top, _Width, _Height: Real): TPoint4;
  446. begin
  447.  Result[0].X:= _Left;
  448.  Result[0].Y:= _Top;
  449.  Result[1].X:= _Left + _Width;
  450.  Result[1].Y:= _Top;
  451.  Result[2].X:= _Left + _Width;
  452.  Result[2].Y:= _Top + _Height;
  453.  Result[3].X:= _Left;
  454.  Result[3].Y:= _Top + _Height;
  455. end;
  456. //---------------------------------------------------------------------------
  457. function pBounds4s(_Left, _Top, _Width, _Height, Theta: Real): TPoint4;
  458. begin
  459.  Result:= pBounds4(_Left, _Top, Round(_Width * Theta), Round(_Height * Theta));
  460. end;
  461. //---------------------------------------------------------------------------
  462. function pBounds4sc(_Left, _Top, _Width, _Height, Theta: Real): TPoint4;
  463. var
  464.  Left, Top: Real;
  465.  Width, Height: Real;
  466. begin
  467.  if (Theta = 1.0) then
  468.   Result:= pBounds4(_Left, _Top, _Width, _Height)
  469.  else
  470.   begin
  471.    Width := _Width * Theta;
  472.    Height:= _Height * Theta;
  473.    Left  := _Left + ((_Width - Width) * 0.5);
  474.    Top   := _Top + ((_Height - Height) * 0.5);
  475.    Result:= pBounds4(Left, Top, Round(Width), Round(Height));
  476.   end;
  477. end;
  478. //---------------------------------------------------------------------------
  479. function pMirror4(const Point4: TPoint4): TPoint4;
  480. begin
  481.  Result[0].X:= Point4[1].X;
  482.  Result[0].Y:= Point4[0].Y;
  483.  Result[1].X:= Point4[0].X;
  484.  Result[1].Y:= Point4[1].Y;
  485.  Result[2].X:= Point4[3].X;
  486.  Result[2].Y:= Point4[2].Y;
  487.  Result[3].X:= Point4[2].X;
  488.  Result[3].Y:= Point4[3].Y;
  489. end;
  490. //---------------------------------------------------------------------------
  491. function pFlip4(const Point4: TPoint4): TPoint4;
  492. begin
  493.  Result[0].X:= Point4[0].X;
  494.  Result[0].Y:= Point4[2].Y;
  495.  Result[1].X:= Point4[1].X;
  496.  Result[1].Y:= Point4[3].Y;
  497.  Result[2].X:= Point4[2].X;
  498.  Result[2].Y:= Point4[0].Y;
  499.  Result[3].X:= Point4[3].X;
  500.  Result[3].Y:= Point4[1].Y;
  501. end;
  502. //---------------------------------------------------------------------------
  503. function pShift4(const Points: TPoint4; const ShiftBy: TPoint2): TPoint4;
  504. begin
  505.  Result[0].x:= Points[0].x + ShiftBy.x;
  506.  Result[0].y:= Points[0].y + ShiftBy.y;
  507.  Result[1].x:= Points[1].x + ShiftBy.x;
  508.  Result[1].y:= Points[1].y + ShiftBy.y;
  509.  Result[2].x:= Points[2].x + ShiftBy.x;
  510.  Result[2].y:= Points[2].y + ShiftBy.y;
  511.  Result[3].x:= Points[3].x + ShiftBy.x;
  512.  Result[3].y:= Points[3].y + ShiftBy.y;
  513. end;
  514. //---------------------------------------------------------------------------
  515. function pRotate4(const Origin, Size, Middle: TPoint2; Angle: Real;
  516.  Theta: Real): TPoint4;
  517. var
  518.  CosPhi: Real;
  519.  SinPhi: Real;
  520.  Index : Integer;
  521.  Points: TPoint4;
  522.  Point : TPoint2;
  523. begin
  524.  CosPhi:= Cos(Angle);
  525.  SinPhi:= Sin(Angle);
  526.  // create 4 points centered at (0, 0)
  527.  Points:= pBounds4(-Middle.x, -Middle.y, Size.x, Size.y);
  528.  // process the created points
  529.  for Index:= 0 to 3 do
  530.   begin
  531.    // scale the point
  532.    Points[Index].x:= Points[Index].x * Theta;
  533.    Points[Index].y:= Points[Index].y * Theta;
  534.    // rotate the point around Phi
  535.    Point.x:= (Points[Index].x * CosPhi) - (Points[Index].y * SinPhi);
  536.    Point.y:= (Points[Index].y * CosPhi) + (Points[Index].x * SinPhi);
  537.    // translate the point to (Origin)
  538.    Points[Index].x:= Point.x + Origin.x;
  539.    Points[Index].y:= Point.y + Origin.y;
  540.   end;
  541.  Result:= Points;
  542. end;
  543. //---------------------------------------------------------------------------
  544. function pRotate4se(const Origin, Size, Middle: TPoint2; Angle: Real;
  545.  Theta: Real): TPoint4;
  546. var
  547.  CosPhi: Real;
  548.  SinPhi: Real;
  549.  Index : Integer;
  550.  Points: TPoint4;
  551.  Point : TPoint2;
  552. begin
  553.  CosPhi:= Cos(Angle);
  554.  SinPhi:= Sin(Angle);
  555.  // create 4 points centered at (0, 0)
  556.  Points:= pBounds4(-Middle.x, -Middle.y, Size.x, Size.y);
  557.  // process the created points
  558.  for Index:= 0 to 3 do
  559.   begin
  560.    // scale the point
  561.    Points[Index].x:= Points[Index].x * Theta;
  562.    Points[Index].y:= Points[Index].y * Theta;
  563.    // rotate the point around Phi
  564.    Point.x:= (Points[Index].x * CosPhi) - (Points[Index].y * SinPhi);
  565.    Point.y:= (Points[Index].y * CosPhi) + (Points[Index].x * SinPhi);
  566.    // translate the point to (Origin)
  567.    Points[Index].x:= Point.x + Origin.x + Middle.x;
  568.    Points[Index].y:= Point.y + Origin.y + Middle.y;
  569.   end;
  570.  Result:= Points;
  571. end;
  572. //---------------------------------------------------------------------------
  573. function pRotate4c(const Origin, Size: TPoint2; Angle: Real;
  574.  Theta: Real): TPoint4;
  575. begin
  576.  Result:= pRotate4(Origin, Size, Point2(Size.x * 0.5, Size.y * 0.5), Angle,
  577.   Theta);
  578. end;
  579. //-----------------------------------------------------------------------------
  580. function pxBounds4(Left, Top, Width, Height: Integer): TPoint4px;
  581. begin
  582.  Result[0].X:= Left;
  583.  Result[0].Y:= Top;
  584.  Result[1].X:= Left + Width;
  585.  Result[1].Y:= Top;
  586.  Result[2].X:= Left + Width;
  587.  Result[2].Y:= Top + Height;
  588.  Result[3].X:= Left;
  589.  Result[3].Y:= Top + Height;
  590. end;
  591. //-----------------------------------------------------------------------------
  592. function pxRect4(Left, Top, Right, Bottom: Integer): TPoint4px;
  593. begin
  594.  Result[0].X:= Left;
  595.  Result[0].Y:= Top;
  596.  Result[1].X:= Right;
  597.  Result[1].Y:= Top;
  598.  Result[2].X:= Right;
  599.  Result[2].Y:= Bottom;
  600.  Result[3].X:= Left;
  601.  Result[3].Y:= Bottom;
  602. end;
  603. //---------------------------------------------------------------------------
  604. function pxRect4(const Rect: TRect): TPoint4px; overload;
  605. begin
  606.  Result:= pxRect4(Rect.Left, Rect.Top, Rect.Right, Rect.Bottom);
  607. end;
  608. //---------------------------------------------------------------------------
  609. function pxRotate90r(const Points: TPoint4px): TPoint4px;
  610. begin
  611.  Result[0]:= Points[3];
  612.  Result[1]:= Points[0];
  613.  Result[2]:= Points[1];
  614.  Result[3]:= Points[2];
  615. end;
  616. //---------------------------------------------------------------------------
  617. end.