basegfx/CppunitTest_basegfx.mk | 1 basegfx/source/range/b2drange.cxx | 12 - basegfx/test/B2DRangeTest.cxx | 17 ++ basegfx/test/B2IRangeTest.cxx | 47 +++++++ include/basegfx/range/Range2D.hxx | 178 ++++++++++++++++++++++++++++ include/basegfx/range/b2drange.hxx | 221 +++-------------------------------- include/basegfx/range/b2irange.hxx | 166 +++----------------------- include/basegfx/range/basicrange.hxx | 16 +- 8 files changed, 303 insertions(+), 355 deletions(-)
New commits: commit 04669a3a466d34d3452c88f4712b6ea6befb4d53 Author: Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk> AuthorDate: Tue May 10 21:06:22 2022 +0900 Commit: Tomaž Vajngerl <qui...@gmail.com> CommitDate: Wed May 11 10:12:59 2022 +0200 basegfx: generalize B2DRange and B2IRange with Range2D template Also add and/or re-arrange B2DRange and B2IRange tests Change-Id: I0f582b30c92776ffbab8b69810ec855da0931714 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/134111 Tested-by: Jenkins Reviewed-by: Tomaž Vajngerl <qui...@gmail.com> diff --git a/basegfx/CppunitTest_basegfx.mk b/basegfx/CppunitTest_basegfx.mk index 310424bd6446..d0a6739a34ef 100644 --- a/basegfx/CppunitTest_basegfx.mk +++ b/basegfx/CppunitTest_basegfx.mk @@ -23,6 +23,7 @@ $(eval $(call gb_CppunitTest_use_libraries,basegfx,\ $(eval $(call gb_CppunitTest_add_exception_objects,basegfx,\ basegfx/test/B2DRangeTest \ + basegfx/test/B2IRangeTest \ basegfx/test/B2DPolyRangeTest \ basegfx/test/B2DHomMatrixTest \ basegfx/test/B2DPointTest \ diff --git a/basegfx/source/range/b2drange.cxx b/basegfx/source/range/b2drange.cxx index be025cc64b1d..1f20cce90a48 100644 --- a/basegfx/source/range/b2drange.cxx +++ b/basegfx/source/range/b2drange.cxx @@ -23,12 +23,12 @@ namespace basegfx { - B2DRange::B2DRange( const B2IRange& rRange ) + B2DRange::B2DRange(const B2IRange& rRange) { - if( !rRange.isEmpty() ) + if (!rRange.isEmpty()) { - maRangeX = MyBasicRange(rRange.getMinX()); - maRangeY = MyBasicRange(rRange.getMinY()); + maRangeX = basegfx::BasicRange<ValueType, TraitsType>(rRange.getMinX()); + maRangeY = basegfx::BasicRange<ValueType, TraitsType>(rRange.getMinY()); maRangeX.expand(rRange.getMaxX()); maRangeY.expand(rRange.getMaxY()); @@ -48,9 +48,9 @@ namespace basegfx } } - B2DRange& B2DRange::operator*=( const ::basegfx::B2DHomMatrix& rMat ) + B2DRange& B2DRange::operator*=(const basegfx::B2DHomMatrix& rMatrix) { - transform(rMat); + transform(rMatrix); return *this; } diff --git a/basegfx/test/B2DRangeTest.cxx b/basegfx/test/B2DRangeTest.cxx index fb23398ef55f..862fe7e5ba64 100644 --- a/basegfx/test/B2DRangeTest.cxx +++ b/basegfx/test/B2DRangeTest.cxx @@ -27,7 +27,7 @@ class B2DRangeTest : public CppUnit::TestFixture { - void testRange() + void testCreation() { basegfx::B2DRange aRange(1.2, 2.3, 3.5, 4.8); CPPUNIT_ASSERT_EQUAL(1.2, aRange.getMinX()); @@ -37,17 +37,30 @@ class B2DRangeTest : public CppUnit::TestFixture CPPUNIT_ASSERT_EQUAL(2.3, aRange.getWidth()); CPPUNIT_ASSERT_EQUAL(2.5, aRange.getHeight()); + } + void testRound() + { + basegfx::B2DRange aRange(1.2, 2.3, 3.5, 4.8); CPPUNIT_ASSERT_EQUAL_MESSAGE("simple range rounding from double to integer", basegfx::B2IRange(1, 2, 4, 5), fround(aRange)); } + void testCenter() + { + basegfx::B2DRange aRange(1.0, 2.0, 2.0, 3.0); + CPPUNIT_ASSERT_EQUAL(1.5, aRange.getCenterX()); + CPPUNIT_ASSERT_EQUAL(2.5, aRange.getCenterY()); + } + // Change the following lines only, if you add, remove or rename // member functions of the current class, // because these macros are need by auto register mechanism. CPPUNIT_TEST_SUITE(B2DRangeTest); - CPPUNIT_TEST(testRange); + CPPUNIT_TEST(testCreation); + CPPUNIT_TEST(testRound); + CPPUNIT_TEST(testCenter); CPPUNIT_TEST_SUITE_END(); }; diff --git a/basegfx/test/B2IRangeTest.cxx b/basegfx/test/B2IRangeTest.cxx new file mode 100644 index 000000000000..89d0d029f9de --- /dev/null +++ b/basegfx/test/B2IRangeTest.cxx @@ -0,0 +1,47 @@ +/* -*- 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 <cppunit/plugin/TestPlugIn.h> + +#include <basegfx/range/b2irange.hxx> + +class B2IRangeTest : public CppUnit::TestFixture +{ + void testCreation() + { + basegfx::B2IRange aRange(1, 2, 3, 4); + CPPUNIT_ASSERT_EQUAL(sal_Int32(1), aRange.getMinX()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(3), aRange.getMaxX()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), aRange.getMinY()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(4), aRange.getMaxY()); + + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), aRange.getWidth()); + CPPUNIT_ASSERT_EQUAL(sal_Int32(2), aRange.getHeight()); + } + + void testCenter() + { + basegfx::B2IRange aRange(1, 2, 2, 3); + CPPUNIT_ASSERT_EQUAL(1.5, aRange.getCenterX()); + CPPUNIT_ASSERT_EQUAL(2.5, aRange.getCenterY()); + } + + CPPUNIT_TEST_SUITE(B2IRangeTest); + CPPUNIT_TEST(testCreation); + CPPUNIT_TEST(testCenter); + CPPUNIT_TEST_SUITE_END(); +}; + +CPPUNIT_TEST_SUITE_REGISTRATION(B2IRangeTest); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/basegfx/range/Range2D.hxx b/include/basegfx/range/Range2D.hxx new file mode 100644 index 000000000000..664887529d35 --- /dev/null +++ b/include/basegfx/range/Range2D.hxx @@ -0,0 +1,178 @@ +/* -*- 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/. + * + * This file incorporates work covered by the following license notice: + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed + * with this work for additional information regarding copyright + * ownership. The ASF licenses this file to you under the Apache + * License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of + * the License at http://www.apache.org/licenses/LICENSE-2.0 . + */ + +#pragma once + +#include <basegfx/basegfxdllapi.h> +#include <basegfx/range/basicrange.hxx> +#include <basegfx/tuple/Tuple2D.hxx> + +namespace basegfx +{ +template <typename TYPE, typename TRAITS> class Range2D +{ +protected: + basegfx::BasicRange<TYPE, TRAITS> maRangeX; + basegfx::BasicRange<TYPE, TRAITS> maRangeY; + +public: + typedef TYPE ValueType; + typedef TRAITS TraitsType; + + Range2D() = default; + + /// Create degenerate interval consisting of a single point + explicit Range2D(const Tuple2D<TYPE>& rTuple) + : maRangeX(rTuple.getX()) + , maRangeY(rTuple.getY()) + { + } + + /// Create proper interval between the two given points + Range2D(const Tuple2D<TYPE>& rTuple1, const Tuple2D<TYPE>& rTuple2) + : maRangeX(rTuple1.getX()) + , maRangeY(rTuple1.getY()) + { + expand(rTuple2); + } + + /// Create proper interval between the two given pairs + Range2D(TYPE x1, TYPE y1, TYPE x2, TYPE y2) + : maRangeX(x1) + , maRangeY(y1) + { + maRangeX.expand(x2); + maRangeY.expand(y2); + } + + /** Check if the interval set is empty + + @return false, if no value is in this set - having a + single point included will already return true. + */ + bool isEmpty() const { return maRangeX.isEmpty() || maRangeY.isEmpty(); } + + /// reset the object to empty state again, clearing all values + void reset() + { + maRangeX.reset(); + maRangeY.reset(); + } + + bool operator==(const Range2D& rRange) const + { + return maRangeX == rRange.maRangeX && maRangeY == rRange.maRangeY; + } + + bool operator!=(const Range2D& rRange) const + { + return maRangeX != rRange.maRangeX || maRangeY != rRange.maRangeY; + } + + bool equal(const Range2D& rRange) const + { + return maRangeX.equal(rRange.maRangeX) && maRangeY.equal(rRange.maRangeY); + } + + /// get lower bound of the set. returns arbitrary values for empty sets. + TYPE getMinX() const { return maRangeX.getMinimum(); } + + /// get lower bound of the set. returns arbitrary values for empty sets. + TYPE getMinY() const { return maRangeY.getMinimum(); } + + /// get upper bound of the set. returns arbitrary values for empty sets. + TYPE getMaxX() const { return maRangeX.getMaximum(); } + + /// get upper bound of the set. returns arbitrary values for empty sets. + TYPE getMaxY() const { return maRangeY.getMaximum(); } + + /// return difference between upper and lower X value. returns 0 for empty sets. + TYPE getWidth() const { return maRangeX.getRange(); } + + /// return difference between upper and lower Y value. returns 0 for empty sets. + TYPE getHeight() const { return maRangeY.getRange(); } + + /// return center X value of set. returns 0 for empty sets. + double getCenterX() const { return maRangeX.getCenter(); } + + /// return center Y value of set. returns 0 for empty sets. + double getCenterY() const { return maRangeY.getCenter(); } + + /// yields true if given point is contained in set + bool isInside(const Tuple2D<TYPE>& rTuple) const + { + return maRangeX.isInside(rTuple.getX()) && maRangeY.isInside(rTuple.getY()); + } + + /// yields true if rRange is inside, or equal to set + bool isInside(const Range2D& rRange) const + { + return maRangeX.isInside(rRange.maRangeX) && maRangeY.isInside(rRange.maRangeY); + } + + /// yields true if rRange at least partly inside set + bool overlaps(const Range2D& rRange) const + { + return maRangeX.overlaps(rRange.maRangeX) && maRangeY.overlaps(rRange.maRangeY); + } + + /// yields true if overlaps(rRange) does, and the overlap is larger than infinitesimal + bool overlapsMore(const Range2D& rRange) const + { + return maRangeX.overlapsMore(rRange.maRangeX) && maRangeY.overlapsMore(rRange.maRangeY); + } + + /// add point to the set, expanding as necessary + void expand(const Tuple2D<TYPE>& rTuple) + { + maRangeX.expand(rTuple.getX()); + maRangeY.expand(rTuple.getY()); + } + + /// add rRange to the set, expanding as necessary + void expand(const Range2D& rRange) + { + maRangeX.expand(rRange.maRangeX); + maRangeY.expand(rRange.maRangeY); + } + + /// calc set intersection + void intersect(const Range2D& rRange) + { + maRangeX.intersect(rRange.maRangeX); + maRangeY.intersect(rRange.maRangeY); + } + + /// grow set by fValue on all sides + void grow(TYPE fValue) + { + maRangeX.grow(fValue); + maRangeY.grow(fValue); + } + + /// clamp value on range + Tuple2D<TYPE> clamp(const Tuple2D<TYPE>& rTuple) const + { + return Tuple2D<TYPE>(maRangeX.clamp(rTuple.getX()), maRangeY.clamp(rTuple.getY())); + } +}; + +} // end of namespace basegfx + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/include/basegfx/range/b2drange.hxx b/include/basegfx/range/b2drange.hxx index f6aa7f311108..3fce8df1a629 100644 --- a/include/basegfx/range/b2drange.hxx +++ b/include/basegfx/range/b2drange.hxx @@ -22,11 +22,12 @@ #include <ostream> #include <vector> +#include <basegfx/basegfxdllapi.h> #include <basegfx/vector/b2dvector.hxx> #include <basegfx/point/b2dpoint.hxx> #include <basegfx/tuple/b2dtuple.hxx> #include <basegfx/range/basicrange.hxx> -#include <basegfx/basegfxdllapi.h> +#include <basegfx/range/Range2D.hxx> namespace basegfx { @@ -49,117 +50,31 @@ namespace basegfx @see B1DRange */ - class SAL_WARN_UNUSED B2DRange + class SAL_WARN_UNUSED B2DRange : public Range2D<double, DoubleTraits> { public: - typedef double ValueType; - typedef DoubleTraits TraitsType; - - B2DRange() {} + B2DRange() + : Range2D() + {} /// Create degenerate interval consisting of a single point - explicit B2DRange(const B2DTuple& rTuple) - : maRangeX(rTuple.getX()), - maRangeY(rTuple.getY()) - { - } - - /// Create proper interval between the two given double pairs - B2DRange(double x1, - double y1, - double x2, - double y2) - : maRangeX(x1), - maRangeY(y1) + explicit B2DRange(const Tuple2D<ValueType>& rTuple) + : Range2D(rTuple) { - maRangeX.expand(x2); - maRangeY.expand(y2); } /// Create proper interval between the two given points - B2DRange(const B2DTuple& rTuple1, - const B2DTuple& rTuple2) - : maRangeX(rTuple1.getX()), - maRangeY(rTuple1.getY()) - { - expand( rTuple2 ); - } - - BASEGFX_DLLPUBLIC explicit B2DRange(const B2IRange& rRange); - - /** Check if the interval set is empty - - @return false, if no value is in this set - having a - single point included will already return true. - */ - bool isEmpty() const - { - return ( - maRangeX.isEmpty() - || maRangeY.isEmpty() - ); - } - - /// reset the object to empty state again, clearing all values - void reset() - { - maRangeX.reset(); - maRangeY.reset(); - } - - bool operator==( const B2DRange& rRange ) const - { - return (maRangeX == rRange.maRangeX - && maRangeY == rRange.maRangeY); - } - - bool operator!=( const B2DRange& rRange ) const + B2DRange(const Tuple2D<ValueType>& rTuple1, + const Tuple2D<ValueType>& rTuple2) + : Range2D(rTuple1, rTuple2) { - return (maRangeX != rRange.maRangeX - || maRangeY != rRange.maRangeY); } - bool equal(const B2DRange& rRange) const - { - return (maRangeX.equal(rRange.maRangeX) - && maRangeY.equal(rRange.maRangeY)); - } - - /// get lower bound of the set. returns arbitrary values for empty sets. - double getMinX() const - { - return maRangeX.getMinimum(); - } - - /// get lower bound of the set. returns arbitrary values for empty sets. - double getMinY() const - { - return maRangeY.getMinimum(); - } - - /// get upper bound of the set. returns arbitrary values for empty sets. - double getMaxX() const - { - return maRangeX.getMaximum(); - } - - /// get upper bound of the set. returns arbitrary values for empty sets. - double getMaxY() const - { - return maRangeY.getMaximum(); - } - - /// return difference between upper and lower X value. returns 0 for empty sets. - double getWidth() const - { - return maRangeX.getRange(); - } + B2DRange(ValueType x1, ValueType y1, ValueType x2, ValueType y2) + : Range2D(x1, y1, x2, y2) + {} - /// return difference between upper and lower Y value. returns 0 for empty sets. - double getHeight() const - { - return maRangeY.getRange(); - } + BASEGFX_DLLPUBLIC explicit B2DRange(const B2IRange& rRange); /// get lower bound of the set. returns arbitrary values for empty sets. B2DPoint getMinimum() const @@ -197,90 +112,6 @@ namespace basegfx ); } - /// return center X value of set. returns 0 for empty sets. - double getCenterX() const - { - return maRangeX.getCenter(); - } - - /// return center Y value of set. returns 0 for empty sets. - double getCenterY() const - { - return maRangeY.getCenter(); - } - - /// yields true if given point is contained in set - bool isInside(const B2DTuple& rTuple) const - { - return ( - maRangeX.isInside(rTuple.getX()) - && maRangeY.isInside(rTuple.getY()) - ); - } - - /// yields true if rRange is inside, or equal to set - bool isInside(const B2DRange& rRange) const - { - return ( - maRangeX.isInside(rRange.maRangeX) - && maRangeY.isInside(rRange.maRangeY) - ); - } - - /// yields true if rRange at least partly inside set - bool overlaps(const B2DRange& rRange) const - { - return ( - maRangeX.overlaps(rRange.maRangeX) - && maRangeY.overlaps(rRange.maRangeY) - ); - } - - /// yields true if overlaps(rRange) does, and the overlap is larger than infinitesimal - bool overlapsMore(const B2DRange& rRange) const - { - return ( - maRangeX.overlapsMore(rRange.maRangeX) - && maRangeY.overlapsMore(rRange.maRangeY) - ); - } - - /// add point to the set, expanding as necessary - void expand(const B2DTuple& rTuple) - { - maRangeX.expand(rTuple.getX()); - maRangeY.expand(rTuple.getY()); - } - - /// add rRange to the set, expanding as necessary - void expand(const B2DRange& rRange) - { - maRangeX.expand(rRange.maRangeX); - maRangeY.expand(rRange.maRangeY); - } - - /// calc set intersection - void intersect(const B2DRange& rRange) - { - maRangeX.intersect(rRange.maRangeX); - maRangeY.intersect(rRange.maRangeY); - } - - /// grow set by fValue on all sides - void grow(double fValue) - { - maRangeX.grow(fValue); - maRangeY.grow(fValue); - } - - /// clamp value on range - B2DTuple clamp(const B2DTuple& rTuple) const - { - return B2DTuple( - maRangeX.clamp(rTuple.getX()), - maRangeY.clamp(rTuple.getY())); - } - /** Transform Range by given transformation matrix. */ BASEGFX_DLLPUBLIC void transform(const B2DHomMatrix& rMatrix); @@ -295,12 +126,6 @@ namespace basegfx /** Get a range filled with (0.0, 0.0, 1.0, 1.0) */ static const B2DRange& getUnitB2DRange(); - - private: - typedef ::basegfx::BasicRange< ValueType, TraitsType > MyBasicRange; - - MyBasicRange maRangeX; - MyBasicRange maRangeY; }; /** Transform B2DRange by given transformation matrix (see operator*=()) @@ -332,13 +157,15 @@ namespace basegfx @return the input vector */ - BASEGFX_DLLPUBLIC ::std::vector< B2DRange >& computeSetDifference( ::std::vector< B2DRange >& o_rResult, - const B2DRange& rFirst, - const B2DRange& rSecond ); - - template< typename charT, typename traits > - inline std::basic_ostream<charT, traits> & operator <<( - std::basic_ostream<charT, traits> & stream, const B2DRange& range ) + BASEGFX_DLLPUBLIC std::vector<B2DRange>& computeSetDifference( + std::vector<B2DRange>& o_rResult, + const B2DRange& rFirst, + const B2DRange& rSecond); + + /** Write to char stream */ + template<typename charT, typename traits> + inline std::basic_ostream<charT, traits>& operator<<( + std::basic_ostream<charT, traits>& stream, const B2DRange& range) { return stream << range.getWidth() << "x" << range.getHeight() << "@" << range.getMinimum(); } diff --git a/include/basegfx/range/b2irange.hxx b/include/basegfx/range/b2irange.hxx index f24526880963..f1a0b0aaefc2 100644 --- a/include/basegfx/range/b2irange.hxx +++ b/include/basegfx/range/b2irange.hxx @@ -22,11 +22,12 @@ #include <ostream> #include <vector> +#include <basegfx/basegfxdllapi.h> #include <basegfx/point/b2ipoint.hxx> #include <basegfx/tuple/b2ituple.hxx> #include <basegfx/tuple/b2i64tuple.hxx> #include <basegfx/range/basicrange.hxx> -#include <basegfx/basegfxdllapi.h> +#include <basegfx/range/Range2D.hxx> namespace basegfx { @@ -48,106 +49,29 @@ namespace basegfx @see B2IBox */ - class B2IRange + class B2IRange : public Range2D<sal_Int32, Int32Traits> { public: - typedef sal_Int32 ValueType; - typedef Int32Traits TraitsType; - - B2IRange() {} + B2IRange() + : Range2D() + {} /// Create degenerate interval consisting of a single point - explicit B2IRange(const B2ITuple& rTuple) - : maRangeX(rTuple.getX()), - maRangeY(rTuple.getY()) - { - } - - /// Create proper interval between the two given integer pairs - B2IRange(sal_Int32 x1, - sal_Int32 y1, - sal_Int32 x2, - sal_Int32 y2) - : maRangeX(x1), - maRangeY(y1) + explicit B2IRange(const Tuple2D<ValueType>& rTuple) + : Range2D(rTuple) { - maRangeX.expand(x2); - maRangeY.expand(y2); } /// Create proper interval between the two given points - B2IRange(const B2ITuple& rTuple1, - const B2ITuple& rTuple2) - : maRangeX(rTuple1.getX()), - maRangeY(rTuple1.getY()) - { - expand( rTuple2 ); - } - - /** Check if the interval set is empty - - @return false, if no value is in this set - having a - single point included will already return true. - */ - bool isEmpty() const - { - return maRangeX.isEmpty() || maRangeY.isEmpty(); - } - - /// reset the object to empty state again, clearing all values - void reset() - { - maRangeX.reset(); - maRangeY.reset(); - } - - bool operator==( const B2IRange& rRange ) const - { - return (maRangeX == rRange.maRangeX - && maRangeY == rRange.maRangeY); - } - - bool operator!=( const B2IRange& rRange ) const + B2IRange(const Tuple2D<ValueType>& rTuple1, + const Tuple2D<ValueType>& rTuple2) + : Range2D(rTuple1, rTuple2) { - return (maRangeX != rRange.maRangeX - || maRangeY != rRange.maRangeY); } - /// get lower bound of the set. returns arbitrary values for empty sets. - sal_Int32 getMinX() const - { - return maRangeX.getMinimum(); - } - - /// get lower bound of the set. returns arbitrary values for empty sets. - sal_Int32 getMinY() const - { - return maRangeY.getMinimum(); - } - - /// get upper bound of the set. returns arbitrary values for empty sets. - sal_Int32 getMaxX() const - { - return maRangeX.getMaximum(); - } - - /// get upper bound of the set. returns arbitrary values for empty sets. - sal_Int32 getMaxY() const - { - return maRangeY.getMaximum(); - } - - /// return difference between upper and lower X value. returns 0 for empty sets. - sal_Int64 getWidth() const - { - return maRangeX.getRange(); - } - - /// return difference between upper and lower Y value. returns 0 for empty sets. - sal_Int64 getHeight() const - { - return maRangeY.getRange(); - } + B2IRange(ValueType x1, ValueType y1, ValueType x2, ValueType y2) + : Range2D(x1, y1, x2, y2) + {} /// get lower bound of the set. returns arbitrary values for empty sets. B2IPoint getMinimum() const @@ -175,49 +99,6 @@ namespace basegfx maRangeY.getRange() ); } - - /// yields true if given point is contained in set - bool isInside(const B2ITuple& rTuple) const - { - return ( - maRangeX.isInside(rTuple.getX()) - && maRangeY.isInside(rTuple.getY()) - ); - } - - /// add point to the set, expanding as necessary - void expand(const B2ITuple& rTuple) - { - maRangeX.expand(rTuple.getX()); - maRangeY.expand(rTuple.getY()); - } - - /// add rRange to the set, expanding as necessary - void expand(const B2IRange& rRange) - { - maRangeX.expand(rRange.maRangeX); - maRangeY.expand(rRange.maRangeY); - } - - /// calc set intersection - void intersect(const B2IRange& rRange) - { - maRangeX.intersect(rRange.maRangeX); - maRangeY.intersect(rRange.maRangeY); - } - - B2ITuple clamp(const B2ITuple& rTuple) const - { - return B2ITuple( - maRangeX.clamp(rTuple.getX()), - maRangeY.clamp(rTuple.getY())); - } - - private: - typedef ::basegfx::BasicRange< ValueType, TraitsType > MyBasicRange; - - MyBasicRange maRangeX; - MyBasicRange maRangeY; }; /** Compute the set difference of the two given ranges @@ -239,19 +120,20 @@ namespace basegfx @return the input vector */ - BASEGFX_DLLPUBLIC ::std::vector< B2IRange >& computeSetDifference( ::std::vector< B2IRange >& o_rResult, - const B2IRange& rFirst, - const B2IRange& rSecond ); - - template< typename charT, typename traits > - inline std::basic_ostream<charT, traits> & operator <<( - std::basic_ostream<charT, traits> & stream, const B2IRange& range ) + BASEGFX_DLLPUBLIC std::vector<B2IRange>& computeSetDifference( + std::vector<B2IRange>& o_rResult, + const B2IRange& rFirst, + const B2IRange& rSecond); + + /** Write to char stream */ + template<typename charT, typename traits> + inline std::basic_ostream<charT, traits>& operator<<( + std::basic_ostream<charT, traits>& stream, const B2IRange& range) { if (range.isEmpty()) return stream << "EMPTY"; else - return stream << range.getWidth() << 'x' << range.getHeight() - << "@(" << range.getMinX() << "," << range.getMinY() << ")"; + return stream << range.getWidth() << 'x' << range.getHeight() << "@" << range.getMinimum(); } } // end of namespace basegfx diff --git a/include/basegfx/range/basicrange.hxx b/include/basegfx/range/basicrange.hxx index 319891832d17..66a59d779e69 100644 --- a/include/basegfx/range/basicrange.hxx +++ b/include/basegfx/range/basicrange.hxx @@ -29,8 +29,8 @@ namespace basegfx template< typename T, typename Traits > class BasicRange { protected: - T mnMinimum; - T mnMaximum; + T mnMinimum; + T mnMaximum; public: typedef T ValueType; @@ -285,18 +285,18 @@ namespace basegfx // some pre-fabricated traits struct DoubleTraits { - static double minVal() { return DBL_MIN; }; - static double maxVal() { return DBL_MAX; }; - static double neutral() { return 0.0; }; + static constexpr double minVal() { return DBL_MIN; }; + static constexpr double maxVal() { return DBL_MAX; }; + static constexpr double neutral() { return 0.0; }; typedef double DifferenceType; }; struct Int32Traits { - static sal_Int32 minVal() { return SAL_MIN_INT32; }; - static sal_Int32 maxVal() { return SAL_MAX_INT32; }; - static sal_Int32 neutral() { return 0; }; + static constexpr sal_Int32 minVal() { return SAL_MIN_INT32; }; + static constexpr sal_Int32 maxVal() { return SAL_MAX_INT32; }; + static constexpr sal_Int32 neutral() { return 0; }; typedef sal_Int64 DifferenceType; };