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

2D图形编程

开发平台:

Delphi

  1. unit GuiUtils;
  2. //---------------------------------------------------------------------------
  3. interface
  4. //---------------------------------------------------------------------------
  5. uses
  6.  Vectors2px, Types, Classes, SysUtils, Controls, AsphyreXML, AsphyreTypes,
  7.  GuiTypes;
  8. //---------------------------------------------------------------------------
  9. function MoveRect(const Rect: TRect; const Point: TPoint2px): TRect;
  10. //---------------------------------------------------------------------------
  11. function ShortRect(const Rect1, Rect2: TRect): TRect;
  12. function InvMoveRect(const Rect: TRect; const Point: TPoint): TRect;
  13. function RectLastPx(const Rect: TRect): TRect;
  14. function ShrinkRect(const Rect: TRect; const hIn, vIn: Integer): TRect;
  15. //---------------------------------------------------------------------------
  16. function Color4Visible(const Colors: TColor4): Boolean;
  17. procedure Color4toXML(const Colors: TColor4; Parent: TXMLNode);
  18. procedure XMLtoColor4(Node: TXMLNode; var Colors: TColor4);
  19. //---------------------------------------------------------------------------
  20. function EmbedStrings(const Text: string): string;
  21. function UnembedStrings(const Text: string): string;
  22. function Button2Gui(Button: TMouseButton): TMouseButtonType;
  23. function ShiftState2Special(Shift: TShiftState): TSpecialKeyState;
  24. //---------------------------------------------------------------------------
  25. procedure GuiFindSkin(var SkinIndex: Integer; var Skin: string);
  26. //---------------------------------------------------------------------------
  27. implementation
  28. //---------------------------------------------------------------------------
  29. uses
  30.  AsphyreUtils, AsphyreImages, MediaUtils;
  31. //---------------------------------------------------------------------------
  32. function MoveRect(const Rect: TRect; const Point: TPoint2px): TRect;
  33. begin
  34.  Result.Left  := Rect.Left   + Point.x;
  35.  Result.Top   := Rect.Top    + Point.y;
  36.  Result.Right := Rect.Right  + Point.x;
  37.  Result.Bottom:= Rect.Bottom + Point.y;
  38. end;
  39. //---------------------------------------------------------------------------
  40. function ShortRect(const Rect1, Rect2: TRect): TRect;
  41. begin
  42.  Result.Left  := Max2(Rect1.Left, Rect2.Left);
  43.  Result.Top   := Max2(Rect1.Top, Rect2.Top);
  44.  Result.Right := Min2(Rect1.Right, Rect2.Right);
  45.  Result.Bottom:= Min2(Rect1.Bottom, Rect2.Bottom);
  46. end;
  47. //---------------------------------------------------------------------------
  48. function InvMoveRect(const Rect: TRect; const Point: TPoint): TRect;
  49. begin
  50.  Result.Left  := Rect.Left   - Point.X;
  51.  Result.Top   := Rect.Top    - Point.Y;
  52.  Result.Right := Rect.Right  - Point.X;
  53.  Result.Bottom:= Rect.Bottom - Point.Y;
  54. end;
  55. //---------------------------------------------------------------------------
  56. function RectLastPx(const Rect: TRect): TRect;
  57. begin
  58.  Result.Left  := Rect.Left;
  59.  Result.Top   := Rect.Top;
  60.  Result.Right := Rect.Right  - 1;
  61.  Result.Bottom:= Rect.Bottom - 1;
  62. end;
  63. //---------------------------------------------------------------------------
  64. function ShrinkRect(const Rect: TRect; const hIn, vIn: Integer): TRect;
  65. begin
  66.  Result.Left:= Rect.Left + hIn;
  67.  Result.Top:= Rect.Top + vIn;
  68.  Result.Right:= Rect.Right - hIn;
  69.  Result.Bottom:= Rect.Bottom - vIn;
  70. end;
  71. //---------------------------------------------------------------------------
  72. function Color4Visible(const Colors: TColor4): Boolean;
  73. begin
  74.  Result:= (Colors[0] or Colors[1] or Colors[2] or Colors[3]) shr 24 > 0;
  75. end;
  76. //---------------------------------------------------------------------------
  77. procedure Color4toXML(const Colors: TColor4; Parent: TXMLNode);
  78. var
  79.  Node: TXMLNode;
  80. begin
  81.  Node:= Parent.AddChild('color4');
  82.  // -> "colors"
  83.  Node:= Node.AddChild('colors');
  84.  Node.AddField('c1', '#' + IntToHex(Colors[0] and $FFFFFF, 6));
  85.  Node.AddField('c2', '#' + IntToHex(Colors[1] and $FFFFFF, 6));
  86.  Node.AddField('c3', '#' + IntToHex(Colors[2] and $FFFFFF, 6));
  87.  Node.AddField('c4', '#' + IntToHex(Colors[3] and $FFFFFF, 6));
  88.  // -> "alpha"
  89.  Node:= Node.AddChild('alphas');
  90.  Node.AddField('a1', IntToStr(Colors[0] shr 24));
  91.  Node.AddField('a2', IntToStr(Colors[1] shr 24));
  92.  Node.AddField('a3', IntToStr(Colors[2] shr 24));
  93.  Node.AddField('a4', IntToStr(Colors[3] shr 24));
  94. end;
  95. //---------------------------------------------------------------------------
  96. procedure XMLtoColor4(Node: TXMLNode; var Colors: TColor4);
  97. var
  98.  Child: TXMLNode;
  99. begin
  100.  if (LowerCase(Node.Name) <> 'color4') then Exit;
  101.  // -> "colors"
  102.  Child:= Node.ChildNode['colors'];
  103.  if (Child <> nil) then
  104.   begin
  105.    Colors[0]:= ParseColor(Child.FieldValue['c1']);
  106.    Colors[1]:= ParseColor(Child.FieldValue['c2']);
  107.    Colors[2]:= ParseColor(Child.FieldValue['c3']);
  108.    Colors[3]:= ParseColor(Child.FieldValue['c4']);
  109.   end;
  110.  // -> "alphas"
  111.  Child:= Node.ChildNode['alphas'];
  112.  if (Child <> nil) then
  113.   begin
  114.    Colors[0]:= (Colors[0] and $FFFFFF) or
  115.     (ParseCardinal(Child.FieldValue['a1']) shl 24);
  116.    Colors[1]:= (Colors[1] and $FFFFFF) or
  117.     (ParseCardinal(Child.FieldValue['a2']) shl 24);
  118.    Colors[2]:= (Colors[2] and $FFFFFF) or
  119.     (ParseCardinal(Child.FieldValue['a3']) shl 24);
  120.    Colors[3]:= (Colors[3] and $FFFFFF) or
  121.     (ParseCardinal(Child.FieldValue['a4']) shl 24);
  122.   end;
  123. end;
  124. //---------------------------------------------------------------------------
  125. function EmbedStrings(const Text: string): string;
  126. var
  127.  i: Integer;
  128. begin
  129.  Result:= '';
  130.  for i:= 1 to Length(Text) do
  131.   begin
  132.    if (Text[i] = #10) then Result:= Result + 'cl';
  133.    if (not (Text[i] in [#10, #13])) then Result:= Result + Text[i];
  134.   end;
  135. end;
  136. //---------------------------------------------------------------------------
  137. function UnembedStrings(const Text: string): string;
  138. var
  139.  i: Integer;
  140. begin
  141.  Result:= '';
  142.  i:= 1;
  143.  while (i <= Length(Text)) do
  144.   begin
  145.    if (i < Length(Text) - 3)and(Text[i] = '')and(Text[i + 1] = 'c')and
  146.     (Text[i + 2] = '')and(Text[i] = 'l') then
  147.     begin
  148.      Result:= Result + #13#10;
  149.      Inc(i, 4);
  150.     end else
  151.     begin
  152.      Result:= Result + Text[i];
  153.      Inc(i);
  154.     end;
  155.   end;
  156. end;
  157. //---------------------------------------------------------------------------
  158. function Button2Gui(Button: TMouseButton): TMouseButtonType;
  159. begin
  160.  Result:= mbtUnknown;
  161.  case Button of
  162.   mbLeft  : Result:= mbtLeft;
  163.   mbRight : Result:= mbtRight;
  164.   mbMiddle: Result:= mbtMiddle;
  165.  end;
  166. end;
  167. //---------------------------------------------------------------------------
  168. function ShiftState2Special(Shift: TShiftState): TSpecialKeyState;
  169. begin
  170.  Result:= [];
  171.  if (ssShift in Shift) then Result:= Result + [sksShift];
  172.  if (ssCtrl in Shift) then Result:= Result + [sksCtrl];
  173.  if (ssAlt in Shift) then Result:= Result + [sksAlt];
  174. end;
  175. //---------------------------------------------------------------------------
  176. procedure GuiFindSkin(var SkinIndex: Integer; var Skin: string);
  177. var
  178.  Image: TAsphyreCustomImage;
  179. begin
  180.  // check whether the skin index has been already resolved
  181.  if (SkinIndex <> -1) then
  182.   begin
  183.    Image:= GuiImages[SkinIndex];
  184.    if (Image <> nil)and(Image.Name = Skin) then Exit;
  185.    SkinIndex:= -1;
  186.   end;
  187.  // okay if no skin is specified
  188.  if (Skin = '') then Exit;
  189.  // resolve skin index
  190.  Image:= GuiImages.Image[Skin];
  191.  if (Image <> nil) then SkinIndex:= Image.ImageIndex else Skin:= '';
  192. end;
  193. //---------------------------------------------------------------------------
  194. end.