sw/inc/swrect.hxx | 2 +- sw/qa/core/test_rect.cxx | 18 ++++++++++++++++++ sw/source/core/bastyp/swrect.cxx | 7 +++++++ 3 files changed, 26 insertions(+), 1 deletion(-)
New commits: commit 01807ad5e04966abeb396b7599cbbbf822de6a03 Author: Luboš Luňák <l.lu...@collabora.com> AuthorDate: Fri Oct 1 12:30:15 2021 +0200 Commit: Luboš Luňák <l.lu...@collabora.com> CommitDate: Sat Oct 2 00:36:00 2021 +0200 fix SwRect::Union() with empty SwRect Empty SwRect is technically located at (0,0), so make sure the position of the union is not moved to include that. Change-Id: I4905c11c3d9f989d4448704e3cb8b297e45bc569 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/122914 Tested-by: Jenkins Reviewed-by: Luboš Luňák <l.lu...@collabora.com> diff --git a/sw/inc/swrect.hxx b/sw/inc/swrect.hxx index 83416cf3969f..f6d8430b9d11 100644 --- a/sw/inc/swrect.hxx +++ b/sw/inc/swrect.hxx @@ -364,7 +364,7 @@ inline bool SwRect::Overlaps( const SwRect& rRect ) const inline SwRect SwRect::GetUnion( const SwRect& rRect ) const { - return SwRect( + return IsEmpty() ? rRect : rRect.IsEmpty() ? *this : SwRect( Point( std::min( Left(), rRect.Left()), std::min( Top(), rRect.Top())), Point( std::max( Right(), rRect.Right()), diff --git a/sw/qa/core/test_rect.cxx b/sw/qa/core/test_rect.cxx index 3c6a47907915..755dbb91bb6e 100644 --- a/sw/qa/core/test_rect.cxx +++ b/sw/qa/core/test_rect.cxx @@ -42,6 +42,15 @@ void RectUnittest::testUnion() tmp.Union(rect3); CPPUNIT_ASSERT_EQUAL(SwRect(Point(10, 10), Size(30, 30)), tmp); CPPUNIT_ASSERT_EQUAL(SwRect(Point(10, 10), Size(30, 30)), rect1.GetUnion(rect3)); + + tmp = rect1; + tmp.Union(SwRect()); + CPPUNIT_ASSERT_EQUAL(rect1, tmp); + CPPUNIT_ASSERT_EQUAL(rect1, rect1.GetUnion(SwRect())); + tmp = SwRect(); + tmp.Union(rect1); + CPPUNIT_ASSERT_EQUAL(rect1, tmp); + CPPUNIT_ASSERT_EQUAL(rect1, SwRect().GetUnion(rect1)); } void RectUnittest::testIntersection() @@ -60,6 +69,15 @@ void RectUnittest::testIntersection() tmp.Intersection(rect3); CPPUNIT_ASSERT(tmp.IsEmpty()); CPPUNIT_ASSERT(rect1.GetIntersection(rect3).IsEmpty()); + + tmp = rect1; + tmp.Intersection(SwRect()); + CPPUNIT_ASSERT(tmp.IsEmpty()); + CPPUNIT_ASSERT(rect1.GetIntersection(SwRect()).IsEmpty()); + tmp = SwRect(); + tmp.Intersection(rect1); + CPPUNIT_ASSERT(tmp.IsEmpty()); + CPPUNIT_ASSERT(SwRect().GetIntersection(rect1).IsEmpty()); } CPPUNIT_TEST_SUITE_REGISTRATION(RectUnittest); diff --git a/sw/source/core/bastyp/swrect.cxx b/sw/source/core/bastyp/swrect.cxx index 0825696f45c6..8f7131aae47c 100644 --- a/sw/source/core/bastyp/swrect.cxx +++ b/sw/source/core/bastyp/swrect.cxx @@ -34,6 +34,13 @@ SwRect::SwRect( const tools::Rectangle &rRect ) : SwRect& SwRect::Union( const SwRect& rRect ) { + if( rRect.IsEmpty()) + return *this; + if( IsEmpty()) + { + *this = rRect; + return *this; + } if ( Top() > rRect.Top() ) Top( rRect.Top() ); if ( Left() > rRect.Left() )