Parcourir la source

LibGfx: Add Rect::unite_{horizontally,vertically}()

These functions unite the rect with another rect, but only in one axis.
Andreas Kling il y a 2 ans
Parent
commit
d620dd516c
2 fichiers modifiés avec 42 ajouts et 0 suppressions
  1. 26 0
      Tests/LibGfx/TestRect.cpp
  2. 16 0
      Userland/Libraries/LibGfx/Rect.h

+ 26 - 0
Tests/LibGfx/TestRect.cpp

@@ -56,3 +56,29 @@ TEST_CASE(rect_closest_to)
     closest = screen_rect.closest_to(p);
     EXPECT_EQ(screen_rect.side(closest), Gfx::IntRect::Side::Top);
 }
+
+TEST_CASE(rect_unite_horizontally)
+{
+    Gfx::IntRect rect { 10, 10, 100, 100 };
+    Gfx::IntRect huge_rect { 0, 0, 1000, 1000 };
+
+    rect.unite_horizontally(huge_rect);
+
+    EXPECT_EQ(rect.left(), 0);
+    EXPECT_EQ(rect.right(), 1000);
+    EXPECT_EQ(rect.top(), 10);
+    EXPECT_EQ(rect.bottom(), 110);
+}
+
+TEST_CASE(rect_unite_vertically)
+{
+    Gfx::IntRect rect { 10, 10, 100, 100 };
+    Gfx::IntRect huge_rect { 0, 0, 1000, 1000 };
+
+    rect.unite_vertically(huge_rect);
+
+    EXPECT_EQ(rect.top(), 0);
+    EXPECT_EQ(rect.bottom(), 1000);
+    EXPECT_EQ(rect.left(), 10);
+    EXPECT_EQ(rect.right(), 110);
+}

+ 16 - 0
Userland/Libraries/LibGfx/Rect.h

@@ -870,6 +870,22 @@ public:
         return { { point.x() - size.width() / 2, point.y() - size.height() / 2 }, size };
     }
 
+    void unite_horizontally(Rect<T> const& other)
+    {
+        auto new_left = min(left(), other.left());
+        auto new_right = max(right(), other.right());
+        set_left(new_left);
+        set_right(new_right);
+    }
+
+    void unite_vertically(Rect<T> const& other)
+    {
+        auto new_top = min(top(), other.top());
+        auto new_bottom = max(bottom(), other.bottom());
+        set_top(new_top);
+        set_bottom(new_bottom);
+    }
+
     [[nodiscard]] Rect<T> united(Rect<T> const& other) const
     {
         if (is_empty())