[Libreoffice-commits] core.git: 2 commits - sw/CppunitTest_sw_uwriter.mk sw/inc sw/qa sw/source
LuboÅ¡ LuÅák (via logerrit)
logerrit at kemper.freedesktop.org
Fri Oct 1 22:36:13 UTC 2021
sw/CppunitTest_sw_uwriter.mk | 1
sw/inc/swrect.hxx | 68 +++++++++++++++++++++++++++++++++++++
sw/qa/core/test_rect.cxx | 67 ++++++++++++++++++++++++++++++++++++
sw/source/core/bastyp/swrect.cxx | 44 -----------------------
sw/source/core/bastyp/swregion.cxx | 6 +--
5 files changed, 138 insertions(+), 48 deletions(-)
New commits:
commit 6702e8a93243c4807c80b53965a4397cdbfde8b5
Author: Luboš Luňák <l.lunak at collabora.com>
AuthorDate: Fri Oct 1 10:59:44 2021 +0200
Commit: Luboš Luňák <l.lunak at collabora.com>
CommitDate: Sat Oct 2 00:35:47 2021 +0200
add GetUnion/Intersection() to SwRect
This is a more readable and efficient way of first constructing
a copy SwRect and then using Union/Intersection() on it. Named
Get* because that's how tools::Rectangle names them.
Change-Id: Ib3033f1900c48792b23526771a941b4d4c1c07bd
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/122913
Tested-by: Jenkins
Reviewed-by: Luboš Luňák <l.lunak at collabora.com>
diff --git a/sw/CppunitTest_sw_uwriter.mk b/sw/CppunitTest_sw_uwriter.mk
index 7626039ca23e..aad626119569 100644
--- a/sw/CppunitTest_sw_uwriter.mk
+++ b/sw/CppunitTest_sw_uwriter.mk
@@ -20,6 +20,7 @@ $(eval $(call gb_CppunitTest_add_exception_objects,sw_uwriter, \
sw/qa/core/test_ToxLinkProcessor \
sw/qa/core/test_ToxTextGenerator \
sw/qa/core/test_ToxMiscTest \
+ sw/qa/core/test_rect \
sw/qa/core/test_region \
))
diff --git a/sw/inc/swrect.hxx b/sw/inc/swrect.hxx
index 039d2b414704..83416cf3969f 100644
--- a/sw/inc/swrect.hxx
+++ b/sw/inc/swrect.hxx
@@ -79,6 +79,9 @@ public:
SwRect &Union( const SwRect& rRect );
SwRect &Intersection( const SwRect& rRect );
+ SwRect GetUnion( const SwRect& rRect ) const;
+ SwRect GetIntersection( const SwRect& rRect ) const;
+
// Same as Intersection, only assume that Rects are overlapping!
SwRect &Intersection_( const SwRect &rRect );
@@ -359,6 +362,26 @@ inline bool SwRect::Overlaps( const SwRect& rRect ) const
(Bottom()>= rRect.Top());
}
+inline SwRect SwRect::GetUnion( const SwRect& rRect ) const
+{
+ return SwRect(
+ Point( std::min( Left(), rRect.Left()),
+ std::min( Top(), rRect.Top())),
+ Point( std::max( Right(), rRect.Right()),
+ std::max( Bottom(), rRect.Bottom())));
+}
+
+inline SwRect SwRect::GetIntersection( const SwRect& rRect ) const
+{
+ return Overlaps( rRect )
+ ? SwRect(
+ Point( std::max( Left(), rRect.Left()),
+ std::max( Top(), rRect.Top())),
+ Point( std::min( Right(), rRect.Right()),
+ std::min( Bottom(), rRect.Bottom())))
+ : SwRect();
+}
+
template< typename charT, typename traits >
inline std::basic_ostream<charT, traits> & operator <<(
diff --git a/sw/qa/core/test_rect.cxx b/sw/qa/core/test_rect.cxx
new file mode 100644
index 000000000000..3c6a47907915
--- /dev/null
+++ b/sw/qa/core/test_rect.cxx
@@ -0,0 +1,67 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ */
+
+#include <cppunit/TestAssert.h>
+#include <cppunit/TestFixture.h>
+#include <cppunit/extensions/HelperMacros.h>
+
+#include <swrect.hxx>
+
+class RectUnittest : public CppUnit::TestFixture
+{
+public:
+ void testUnion();
+ void testIntersection();
+
+ CPPUNIT_TEST_SUITE(RectUnittest);
+ CPPUNIT_TEST(testUnion);
+ CPPUNIT_TEST(testIntersection);
+ CPPUNIT_TEST_SUITE_END();
+};
+
+void RectUnittest::testUnion()
+{
+ SwRect rect1(Point(10, 10), Size(10, 10));
+ SwRect rect2(Point(15, 15), Size(10, 10));
+ SwRect rect3(Point(30, 30), Size(10, 10));
+ SwRect tmp;
+
+ tmp = rect1;
+ tmp.Union(rect2);
+ CPPUNIT_ASSERT_EQUAL(SwRect(Point(10, 10), Size(15, 15)), tmp);
+ CPPUNIT_ASSERT_EQUAL(SwRect(Point(10, 10), Size(15, 15)), rect1.GetUnion(rect2));
+
+ tmp = rect1;
+ 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));
+}
+
+void RectUnittest::testIntersection()
+{
+ SwRect rect1(Point(10, 10), Size(10, 10));
+ SwRect rect2(Point(15, 15), Size(10, 10));
+ SwRect rect3(Point(30, 30), Size(10, 10));
+ SwRect tmp;
+
+ tmp = rect1;
+ tmp.Intersection(rect2);
+ CPPUNIT_ASSERT_EQUAL(SwRect(Point(15, 15), Size(5, 5)), tmp);
+ CPPUNIT_ASSERT_EQUAL(SwRect(Point(15, 15), Size(5, 5)), rect1.GetIntersection(rect2));
+
+ tmp = rect1;
+ tmp.Intersection(rect3);
+ CPPUNIT_ASSERT(tmp.IsEmpty());
+ CPPUNIT_ASSERT(rect1.GetIntersection(rect3).IsEmpty());
+}
+
+CPPUNIT_TEST_SUITE_REGISTRATION(RectUnittest);
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/core/bastyp/swregion.cxx b/sw/source/core/bastyp/swregion.cxx
index 5b928a1ab9b0..b790bf14764f 100644
--- a/sw/source/core/bastyp/swregion.cxx
+++ b/sw/source/core/bastyp/swregion.cxx
@@ -202,10 +202,8 @@ void SwRegionRects::Compress( CompressType type )
// paints), the area of the union can be a little bit larger:
// ( 9622 * 141.5 = 1361513 ~= a quarter (1/4) centimeter wider
// than the width of an A4 page
- SwRect aUnion( (*this)[i] );
- aUnion.Union( (*this)[j] );
- SwRect aInter( (*this)[i] );
- aInter.Intersection( (*this)[j] );
+ SwRect aUnion = (*this)[i].GetUnion( (*this)[j] );
+ SwRect aInter = (*this)[i].GetIntersection( (*this)[j] );
if ( CalcArea( (*this)[i] ) + CalcArea( (*this)[j] ) - CalcArea( aInter )
+ nFuzzy >= CalcArea( aUnion ) )
{
commit 48895bef52bd59e30751ece0c8a8d57ef7864936
Author: Luboš Luňák <l.lunak at collabora.com>
AuthorDate: Fri Oct 1 10:25:00 2021 +0200
Commit: Luboš Luňák <l.lunak at collabora.com>
CommitDate: Sat Oct 2 00:35:35 2021 +0200
make some simple SwRect functions inline
They are not trivial, but having them inline should still give
the compiler more chances to optimize these.
Change-Id: Ia296282b64f64c801a057332047c12576d1d9604
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/122912
Tested-by: Jenkins
Reviewed-by: Luboš Luňák <l.lunak at collabora.com>
diff --git a/sw/inc/swrect.hxx b/sw/inc/swrect.hxx
index 3ba1f67d0882..039d2b414704 100644
--- a/sw/inc/swrect.hxx
+++ b/sw/inc/swrect.hxx
@@ -315,6 +315,51 @@ inline SwRect::SwRect( tools::Long X, tools::Long Y, tools::Long W, tools::Long
{
}
+inline Point SwRect::Center() const
+{
+ return Point( Left() + Width() / 2,
+ Top() + Height() / 2 );
+}
+
+inline bool SwRect::Contains( const SwRect& rRect ) const
+{
+ const tools::Long nRight = Right();
+ const tools::Long nBottom = Bottom();
+ const tools::Long nrRight = rRect.Right();
+ const tools::Long nrBottom= rRect.Bottom();
+ return (Left() <= rRect.Left()) && (rRect.Left()<= nRight) &&
+ (Left() <= nrRight) && (nrRight <= nRight) &&
+ (Top() <= rRect.Top()) && (rRect.Top() <= nBottom) &&
+ (Top() <= nrBottom) && (nrBottom <= nBottom);
+}
+
+inline bool SwRect::Contains( const Point& rPoint ) const
+{
+ return (Left() <= rPoint.X()) &&
+ (Top() <= rPoint.Y()) &&
+ (Right() >= rPoint.X()) &&
+ (Bottom()>= rPoint.Y());
+}
+
+// mouse moving of table borders
+inline bool SwRect::IsNear( const Point& rPoint, tools::Long nTolerance ) const
+{
+ bool bIsNearby = (((Left() - nTolerance) <= rPoint.X()) &&
+ ((Top() - nTolerance) <= rPoint.Y()) &&
+ ((Right() + nTolerance) >= rPoint.X()) &&
+ ((Bottom() + nTolerance) >= rPoint.Y()));
+ return Contains(rPoint) || bIsNearby;
+}
+
+inline bool SwRect::Overlaps( const SwRect& rRect ) const
+{
+ return (Top() <= rRect.Bottom()) &&
+ (Left() <= rRect.Right()) &&
+ (Right() >= rRect.Left()) &&
+ (Bottom()>= rRect.Top());
+}
+
+
template< typename charT, typename traits >
inline std::basic_ostream<charT, traits> & operator <<(
std::basic_ostream<charT, traits> & stream, const SwRect& rectangle )
diff --git a/sw/source/core/bastyp/swrect.cxx b/sw/source/core/bastyp/swrect.cxx
index 8f94cef23727..0825696f45c6 100644
--- a/sw/source/core/bastyp/swrect.cxx
+++ b/sw/source/core/bastyp/swrect.cxx
@@ -32,12 +32,6 @@ SwRect::SwRect( const tools::Rectangle &rRect ) :
m_Size.setHeight(rRect.IsHeightEmpty() ? 0 : rRect.Bottom() - rRect.Top() + 1);
}
-Point SwRect::Center() const
-{
- return Point( Left() + Width() / 2,
- Top() + Height() / 2 );
-}
-
SwRect& SwRect::Union( const SwRect& rRect )
{
if ( Top() > rRect.Top() )
@@ -90,44 +84,6 @@ SwRect& SwRect::Intersection_( const SwRect& rOther )
return *this;
}
-bool SwRect::Contains( const SwRect& rRect ) const
-{
- const tools::Long nRight = Right();
- const tools::Long nBottom = Bottom();
- const tools::Long nrRight = rRect.Right();
- const tools::Long nrBottom= rRect.Bottom();
- return (Left() <= rRect.Left()) && (rRect.Left()<= nRight) &&
- (Left() <= nrRight) && (nrRight <= nRight) &&
- (Top() <= rRect.Top()) && (rRect.Top() <= nBottom) &&
- (Top() <= nrBottom) && (nrBottom <= nBottom);
-}
-
-bool SwRect::Contains( const Point& rPoint ) const
-{
- return (Left() <= rPoint.X()) &&
- (Top() <= rPoint.Y()) &&
- (Right() >= rPoint.X()) &&
- (Bottom()>= rPoint.Y());
-}
-
-// mouse moving of table borders
-bool SwRect::IsNear( const Point& rPoint, tools::Long nTolerance ) const
-{
- bool bIsNearby = (((Left() - nTolerance) <= rPoint.X()) &&
- ((Top() - nTolerance) <= rPoint.Y()) &&
- ((Right() + nTolerance) >= rPoint.X()) &&
- ((Bottom() + nTolerance) >= rPoint.Y()));
- return Contains(rPoint) || bIsNearby;
-}
-
-bool SwRect::Overlaps( const SwRect& rRect ) const
-{
- return (Top() <= rRect.Bottom()) &&
- (Left() <= rRect.Right()) &&
- (Right() >= rRect.Left()) &&
- (Bottom()>= rRect.Top());
-}
-
void SwRect::Justify()
{
if ( m_Size.getHeight() < 0 )
More information about the Libreoffice-commits
mailing list