DEADSOFTWARE

tools: fix build with sdl2
[d2df-sdl.git] / src / flexui / fui_common.pas
index 76354c3b966c4acb99342519f15efcddb3768bef..38afcbb424d0a7d592f8e6aa963d4d05017e81b0 100644 (file)
@@ -3,8 +3,7 @@
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
+ * the Free Software Foundation, version 3 of the License ONLY.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -86,12 +85,39 @@ type
     function isOpaque (): Boolean; inline;
     function isTransparent (): Boolean; inline;
 
+    function toString (): AnsiString;
+
     // WARNING! This function does blending in RGB space, and RGB space is not linear!
     // alpha value of `self` doesn't matter
     // `aa` means: 255 for replace color, 0 for keep `self`
     function blend (ar, ag, ab, aa: Integer): TGxRGBA; inline;
   end;
 
+  TGxRect = packed record
+  public
+    x, y, w, h: Integer;
+
+  public
+    constructor Create (ax, ay, aw, ah: Integer);
+
+    function empty (): Boolean; inline; // invalid rects are empty too
+    function valid (): Boolean; inline;
+
+    function toString (): AnsiString;
+
+    // modifies this rect, so it won't be bigger than `r`
+    // returns `false` if this rect becomes empty
+    function intersect (constref r: TGxRect): Boolean; inline;
+  end;
+
+  TGxOfs = packed record
+  public
+    xofs, yofs: Integer;
+
+  public
+    constructor Create (axofs, ayofs: Integer);
+  end;
+
 
 // ////////////////////////////////////////////////////////////////////////// //
 // return `false` if destination rect is empty
@@ -105,7 +131,6 @@ implementation
 uses
   utils;
 
-
 // ////////////////////////////////////////////////////////////////////////// //
 constructor TLaySize.Create (aw, ah: Integer); begin w := aw; h := ah; end;
 function TLaySize.getIdx (idx: Integer): Integer; inline; begin if (idx = 0) then result := w else if (idx = 1) then result := h else result := -1; end;
@@ -173,6 +198,30 @@ begin
   result.a := a;
 end;
 
+function TGxRGBA.toString (): AnsiString;
+begin
+  if (a = 255) then result := formatstrf('rgb(%s,%s,%s)', [r, g, b])
+  else result := formatstrf('rgba(%s,%s,%s,%s)', [r, g, b, a]);
+end;
+
+
+// ////////////////////////////////////////////////////////////////////////// //
+constructor TGxRect.Create (ax, ay, aw, ah: Integer); begin x := ax; y := ay; w := aw; h := ah; end;
+
+function TGxRect.empty (): Boolean; inline; begin result := (w <= 0) or (h <= 0); end;
+function TGxRect.valid (): Boolean; inline; begin result := (w < 0) or (h < 0); end;
+
+function TGxRect.intersect (constref r: TGxRect): Boolean; inline;
+begin
+  result := intersectRect(x, y, w, h, r.x, r.y, r.w, r.h);
+end;
+
+function TGxRect.toString (): AnsiString; begin result := formatstrf('(%s,%s;%sx%s)', [x, y, w, h]); end;
+
+
+// ////////////////////////////////////////////////////////////////////////// //
+constructor TGxOfs.Create (axofs, ayofs: Integer); begin xofs := axofs; yofs := ayofs; end;
+
 
 // ////////////////////////////////////////////////////////////////////////// //
 //TODO: overflow checks