diff --git a/SDL2pp/Rect.cc b/SDL2pp/Rect.cc index adbc503..af16f76 100644 --- a/SDL2pp/Rect.cc +++ b/SDL2pp/Rect.cc @@ -159,6 +159,18 @@ Rect Rect::GetUnion(const Rect& rect) const { ); } +Rect& Rect::Union(const Rect& rect) { + int nx = std::min(x, rect.x); + int ny = std::min(y, rect.y); + int nx2 = std::max(GetX2(), rect.GetX2()); + int ny2 = std::max(GetY2(), rect.GetY2()); + x = nx; + y = ny; + SetX2(nx2); + SetY2(ny2); + return *this; +} + Optional Rect::GetIntersection(const Rect& rect) const { if (!Intersects(rect)) return NullOpt; diff --git a/SDL2pp/Rect.hh b/SDL2pp/Rect.hh index 6cd7b71..e45eb0d 100644 --- a/SDL2pp/Rect.hh +++ b/SDL2pp/Rect.hh @@ -336,6 +336,16 @@ public: //////////////////////////////////////////////////////////// Rect GetUnion(const Rect& rect) const; + //////////////////////////////////////////////////////////// + /// \brief Union rect with another rect + /// + /// \param[in] rect Rect to union with + /// + /// \returns Reference to self + /// + //////////////////////////////////////////////////////////// + Rect& Union(const Rect& rect); + //////////////////////////////////////////////////////////// /// \brief Calculate intersection with another rect /// diff --git a/tests/test_pointrect.cc b/tests/test_pointrect.cc index 00884a1..780baf0 100644 --- a/tests/test_pointrect.cc +++ b/tests/test_pointrect.cc @@ -233,6 +233,11 @@ BEGIN_TEST() EXPECT_TRUE(Rect(30, 20, 1, 1).GetUnion(Rect(10, 40, 1, 1)) == Rect::FromCorners(10, 20, 30, 40)); EXPECT_TRUE(Rect(10, 40, 1, 1).GetUnion(Rect(30, 20, 1, 1)) == Rect::FromCorners(10, 20, 30, 40)); EXPECT_TRUE(Rect(30, 40, 1, 1).GetUnion(Rect(10, 20, 1, 1)) == Rect::FromCorners(10, 20, 30, 40)); + + EXPECT_TRUE(Rect(10, 20, 1, 1).Union(Rect(30, 40, 1, 1)) == Rect::FromCorners(10, 20, 30, 40)); + EXPECT_TRUE(Rect(30, 20, 1, 1).Union(Rect(10, 40, 1, 1)) == Rect::FromCorners(10, 20, 30, 40)); + EXPECT_TRUE(Rect(10, 40, 1, 1).Union(Rect(30, 20, 1, 1)) == Rect::FromCorners(10, 20, 30, 40)); + EXPECT_TRUE(Rect(30, 40, 1, 1).Union(Rect(10, 20, 1, 1)) == Rect::FromCorners(10, 20, 30, 40)); } {