[Libreoffice-commits] core.git: basegfx/CppunitTest_basegfx.mk basegfx/test

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Mon Jan 28 22:14:47 UTC 2019


 basegfx/CppunitTest_basegfx.mk       |   13 
 basegfx/test/B1DRangeTest.cxx        |   97 +++
 basegfx/test/B2DHomMatrixTest.cxx    |  468 +++++++++++++++
 basegfx/test/B2DPointTest.cxx        |   50 +
 basegfx/test/B2DPolyPolygonTest.cxx  |   82 ++
 basegfx/test/B2DPolyRangeTest.cxx    |   66 ++
 basegfx/test/B2DPolygonTest.cxx      |   94 +++
 basegfx/test/B2DPolygonToolsTest.cxx |   85 ++
 basegfx/test/B2DRangeTest.cxx        |   54 +
 basegfx/test/B2DTupleTest.cxx        |   50 +
 basegfx/test/B2IBoxTest.cxx          |   63 ++
 basegfx/test/B2XRangeTest.cxx        |   70 ++
 basegfx/test/BColorTest.cxx          |  151 +++++
 basegfx/test/basegfx2d.cxx           | 1024 -----------------------------------
 14 files changed, 1342 insertions(+), 1025 deletions(-)

New commits:
commit dfc4d2b009b9f9c7307c79e7ef2c1663005a5646
Author:     Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
AuthorDate: Mon Jan 28 19:54:51 2019 +0100
Commit:     Tomaž Vajngerl <quikee at gmail.com>
CommitDate: Mon Jan 28 23:14:23 2019 +0100

    split basegfx 2d tests to separate files (one per tested class)
    
    Change-Id: Icb2f745851ba3de31f6a672d1bc20659de687d2e
    Reviewed-on: https://gerrit.libreoffice.org/67031
    Tested-by: Jenkins
    Reviewed-by: Tomaž Vajngerl <quikee at gmail.com>

diff --git a/basegfx/CppunitTest_basegfx.mk b/basegfx/CppunitTest_basegfx.mk
index 472c6ff11049..91cfc2226774 100644
--- a/basegfx/CppunitTest_basegfx.mk
+++ b/basegfx/CppunitTest_basegfx.mk
@@ -22,7 +22,18 @@ $(eval $(call gb_CppunitTest_use_libraries,basegfx,\
 ))
 
 $(eval $(call gb_CppunitTest_add_exception_objects,basegfx,\
-    basegfx/test/basegfx2d \
+    basegfx/test/B2DRangeTest \
+    basegfx/test/B2DPolyRangeTest \
+    basegfx/test/B2DHomMatrixTest \
+    basegfx/test/B2DPointTest \
+    basegfx/test/B2DPolygonTest \
+    basegfx/test/B2DPolygonToolsTest \
+    basegfx/test/B2DPolyPolygonTest \
+    basegfx/test/B1DRangeTest \
+    basegfx/test/B2XRangeTest \
+    basegfx/test/B2IBoxTest \
+    basegfx/test/B2DTupleTest \
+    basegfx/test/BColorTest \
     basegfx/test/SvgPathImportExport \
     basegfx/test/basegfx3d \
     basegfx/test/boxclipper \
diff --git a/basegfx/test/B1DRangeTest.cxx b/basegfx/test/B1DRangeTest.cxx
new file mode 100644
index 000000000000..3eefc9026484
--- /dev/null
+++ b/basegfx/test/B1DRangeTest.cxx
@@ -0,0 +1,97 @@
+/* -*- 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 .
+ */
+
+#include <cppunit/TestAssert.h>
+#include <cppunit/TestFixture.h>
+#include <cppunit/extensions/HelperMacros.h>
+#include <cppunit/plugin/TestPlugIn.h>
+
+#include <basegfx/range/b1drange.hxx>
+
+namespace basegfx
+{
+class b1Xrange : public CppUnit::TestFixture
+{
+public:
+    template <class Type> void implCheck()
+    {
+        // test interval axioms
+        // (http://en.wikipedia.org/wiki/Interval_%28mathematics%29)
+        Type aRange;
+        CPPUNIT_ASSERT_MESSAGE("default ctor - empty range", aRange.isEmpty());
+        CPPUNIT_ASSERT_MESSAGE("center - get cop-out value since range is empty",
+                               aRange.getCenter() == 0);
+
+        // degenerate interval
+        aRange.expand(1);
+        CPPUNIT_ASSERT_MESSAGE("degenerate range - still, not empty!", !aRange.isEmpty());
+        CPPUNIT_ASSERT_MESSAGE("degenerate range - size of 0", aRange.getRange() == 0);
+        CPPUNIT_ASSERT_MESSAGE("same value as degenerate range - is inside range",
+                               aRange.isInside(1));
+        CPPUNIT_ASSERT_MESSAGE("center - must be the single range value", aRange.getCenter() == 1);
+
+        // proper interval
+        aRange.expand(2);
+        CPPUNIT_ASSERT_MESSAGE("proper range - size of 1", aRange.getRange() == 1);
+        CPPUNIT_ASSERT_MESSAGE("smaller value of range - is inside *closed* range",
+                               aRange.isInside(1));
+        CPPUNIT_ASSERT_MESSAGE("larger value of range - is inside *closed* range",
+                               aRange.isInside(2));
+
+        // center for proper interval that works for ints, too
+        aRange.expand(3);
+        CPPUNIT_ASSERT_MESSAGE("center - must be half of the range", aRange.getCenter() == 2);
+
+        // check overlap
+        Type aRange2(0, 1);
+        CPPUNIT_ASSERT_MESSAGE("range overlapping *includes* upper bound",
+                               aRange.overlaps(aRange2));
+        CPPUNIT_ASSERT_MESSAGE("range overlapping *includes* upper bound, but only barely",
+                               !aRange.overlapsMore(aRange2));
+
+        Type aRange3(0, 2);
+        CPPUNIT_ASSERT_MESSAGE("range overlapping is fully overlapping now",
+                               aRange.overlapsMore(aRange3));
+
+        // check intersect
+        Type aRange4(3, 4);
+        aRange.intersect(aRange4);
+        CPPUNIT_ASSERT_MESSAGE("range intersection is yielding empty range!", !aRange.isEmpty());
+
+        Type aRange5(5, 6);
+        aRange.intersect(aRange5);
+        CPPUNIT_ASSERT_MESSAGE("range intersection is yielding nonempty range!", aRange.isEmpty());
+    }
+
+    void check() { implCheck<B1DRange>(); }
+
+    // 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(b1Xrange);
+    CPPUNIT_TEST(check);
+    CPPUNIT_TEST_SUITE_END();
+}; // class b1Xrange
+
+} // namespace basegfx
+
+CPPUNIT_TEST_SUITE_REGISTRATION(basegfx::b1Xrange);
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/basegfx/test/B2DHomMatrixTest.cxx b/basegfx/test/B2DHomMatrixTest.cxx
new file mode 100644
index 000000000000..0687a16f721f
--- /dev/null
+++ b/basegfx/test/B2DHomMatrixTest.cxx
@@ -0,0 +1,468 @@
+/* -*- 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 .
+ */
+
+#include <cppunit/TestAssert.h>
+#include <cppunit/TestFixture.h>
+#include <cppunit/extensions/HelperMacros.h>
+#include <cppunit/plugin/TestPlugIn.h>
+
+#include <basegfx/matrix/b2dhommatrix.hxx>
+#include <basegfx/matrix/b2dhommatrixtools.hxx>
+#include <basegfx/numeric/ftools.hxx>
+#include <basegfx/tuple/b2dtuple.hxx>
+
+namespace basegfx
+{
+class b2dhommatrix : public CppUnit::TestFixture
+{
+private:
+    B2DHomMatrix maIdentity;
+    B2DHomMatrix maScale;
+    B2DHomMatrix maTranslate;
+    B2DHomMatrix maShear;
+    B2DHomMatrix maAffine;
+    B2DHomMatrix maPerspective;
+
+public:
+    // initialise your test code values here.
+    void setUp() override
+    {
+        // setup some test matrices
+        maIdentity.identity(); // force compact layout
+        maIdentity.set(0, 0, 1.0);
+        maIdentity.set(0, 1, 0.0);
+        maIdentity.set(0, 2, 0.0);
+        maIdentity.set(1, 0, 0.0);
+        maIdentity.set(1, 1, 1.0);
+        maIdentity.set(1, 2, 0.0);
+
+        maScale.identity(); // force compact layout
+        maScale.set(0, 0, 2.0);
+        maScale.set(1, 1, 20.0);
+
+        maTranslate.identity(); // force compact layout
+        maTranslate.set(0, 2, 20.0);
+        maTranslate.set(1, 2, 2.0);
+
+        maShear.identity(); // force compact layout
+        maShear.set(0, 1, 3.0);
+        maShear.set(1, 0, 7.0);
+        maShear.set(1, 1, 22.0);
+
+        maAffine.identity(); // force compact layout
+        maAffine.set(0, 0, 1.0);
+        maAffine.set(0, 1, 2.0);
+        maAffine.set(0, 2, 3.0);
+        maAffine.set(1, 0, 4.0);
+        maAffine.set(1, 1, 5.0);
+        maAffine.set(1, 2, 6.0);
+
+        maPerspective.set(0, 0, 1.0);
+        maPerspective.set(0, 1, 2.0);
+        maPerspective.set(0, 2, 3.0);
+        maPerspective.set(1, 0, 4.0);
+        maPerspective.set(1, 1, 5.0);
+        maPerspective.set(1, 2, 6.0);
+        maPerspective.set(2, 0, 7.0);
+        maPerspective.set(2, 1, 8.0);
+        maPerspective.set(2, 2, 9.0);
+    }
+
+    void equal()
+    {
+        B2DHomMatrix aIdentity;
+        B2DHomMatrix aScale;
+        B2DHomMatrix aTranslate;
+        B2DHomMatrix aShear;
+        B2DHomMatrix aAffine;
+        B2DHomMatrix aPerspective;
+
+        // setup some test matrices
+        aIdentity.identity(); // force compact layout
+        aIdentity.set(0, 0, 1.0);
+        aIdentity.set(0, 1, 0.0);
+        aIdentity.set(0, 2, 0.0);
+        aIdentity.set(1, 0, 0.0);
+        aIdentity.set(1, 1, 1.0);
+        aIdentity.set(1, 2, 0.0);
+
+        aScale.identity(); // force compact layout
+        aScale.set(0, 0, 2.0);
+        aScale.set(1, 1, 20.0);
+
+        aTranslate.identity(); // force compact layout
+        aTranslate.set(0, 2, 20.0);
+        aTranslate.set(1, 2, 2.0);
+
+        aShear.identity(); // force compact layout
+        aShear.set(0, 1, 3.0);
+        aShear.set(1, 0, 7.0);
+        aShear.set(1, 1, 22.0);
+
+        aAffine.identity(); // force compact layout
+        aAffine.set(0, 0, 1.0);
+        aAffine.set(0, 1, 2.0);
+        aAffine.set(0, 2, 3.0);
+        aAffine.set(1, 0, 4.0);
+        aAffine.set(1, 1, 5.0);
+        aAffine.set(1, 2, 6.0);
+
+        aPerspective.set(0, 0, 1.0);
+        aPerspective.set(0, 1, 2.0);
+        aPerspective.set(0, 2, 3.0);
+        aPerspective.set(1, 0, 4.0);
+        aPerspective.set(1, 1, 5.0);
+        aPerspective.set(1, 2, 6.0);
+        aPerspective.set(2, 0, 7.0);
+        aPerspective.set(2, 1, 8.0);
+        aPerspective.set(2, 2, 9.0);
+
+        CPPUNIT_ASSERT_MESSAGE("operator==: identity matrix", aIdentity.operator==(maIdentity));
+        CPPUNIT_ASSERT_MESSAGE("operator==: scale matrix", aScale.operator==(maScale));
+        CPPUNIT_ASSERT_MESSAGE("operator==: translate matrix", aTranslate.operator==(maTranslate));
+        CPPUNIT_ASSERT_MESSAGE("operator==: shear matrix", aShear.operator==(maShear));
+        CPPUNIT_ASSERT_MESSAGE("operator==: affine matrix", aAffine.operator==(maAffine));
+        CPPUNIT_ASSERT_MESSAGE("operator==: perspective matrix",
+                               aPerspective.operator==(maPerspective));
+    }
+
+    void identity()
+    {
+        B2DHomMatrix ident;
+
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("identity", maIdentity, ident);
+    }
+
+    void scale()
+    {
+        B2DHomMatrix mat;
+        mat.scale(2.0, 20.0);
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("scale", maScale, mat);
+    }
+
+    void rotate()
+    {
+        B2DHomMatrix mat;
+        mat.rotate(F_PI2);
+        CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("rotate pi/2 yields exact matrix", 0.0, mat.get(0, 0),
+                                             1E-12);
+        CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("rotate pi/2 yields exact matrix", -1.0, mat.get(0, 1),
+                                             1E-12);
+        CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("rotate pi/2 yields exact matrix", 0.0, mat.get(0, 2),
+                                             1E-12);
+        CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("rotate pi/2 yields exact matrix", 1.0, mat.get(1, 0),
+                                             1E-12);
+        CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("rotate pi/2 yields exact matrix", 0.0, mat.get(1, 1),
+                                             1E-12);
+        CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("rotate pi/2 yields exact matrix", 0.0, mat.get(1, 2),
+                                             1E-12);
+        mat.rotate(F_PI2);
+        CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("rotate pi yields exact matrix", -1.0, mat.get(0, 0),
+                                             1E-12);
+        CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("rotate pi yields exact matrix", 0.0, mat.get(0, 1),
+                                             1E-12);
+        CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("rotate pi yields exact matrix", 0.0, mat.get(0, 2),
+                                             1E-12);
+        CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("rotate pi yields exact matrix", 0.0, mat.get(1, 0),
+                                             1E-12);
+        CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("rotate pi yields exact matrix", -1.0, mat.get(1, 1),
+                                             1E-12);
+        CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("rotate pi yields exact matrix", 0.0, mat.get(1, 2),
+                                             1E-12);
+        mat.rotate(F_PI2);
+        CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("rotate 3/2 pi yields exact matrix", 0.0,
+                                             mat.get(0, 0), 1E-12);
+        CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("rotate 3/2 pi yields exact matrix", 1.0,
+                                             mat.get(0, 1), 1E-12);
+        CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("rotate 3/2 pi yields exact matrix", 0.0,
+                                             mat.get(0, 2), 1E-12);
+        CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("rotate 3/2 pi yields exact matrix", -1.0,
+                                             mat.get(1, 0), 1E-12);
+        CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("rotate 3/2 pi yields exact matrix", 0.0,
+                                             mat.get(1, 1), 1E-12);
+        CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("rotate 3/2 pi yields exact matrix", 0.0,
+                                             mat.get(1, 2), 1E-12);
+        mat.rotate(F_PI2);
+        CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("rotate 2 pi yields exact matrix", 1.0, mat.get(0, 0),
+                                             1E-12);
+        CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("rotate 2 pi yields exact matrix", 0.0, mat.get(0, 1),
+                                             1E-12);
+        CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("rotate 2 pi yields exact matrix", 0.0, mat.get(0, 2),
+                                             1E-12);
+        CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("rotate 2 pi yields exact matrix", 0.0, mat.get(1, 0),
+                                             1E-12);
+        CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("rotate 2 pi yields exact matrix", 1.0, mat.get(1, 1),
+                                             1E-12);
+        CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("rotate 2 pi yields exact matrix", 0.0, mat.get(1, 2),
+                                             1E-12);
+    }
+
+    void translate()
+    {
+        B2DHomMatrix mat;
+        mat.translate(20.0, 2.0);
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("translate", maTranslate, mat);
+    }
+
+    void shear()
+    {
+        B2DHomMatrix mat;
+        mat.shearX(3.0);
+        mat.shearY(7.0);
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("translate", maShear, mat);
+    }
+
+    void multiply()
+    {
+        B2DHomMatrix affineAffineProd;
+
+        affineAffineProd.set(0, 0, 9);
+        affineAffineProd.set(0, 1, 12);
+        affineAffineProd.set(0, 2, 18);
+        affineAffineProd.set(1, 0, 24);
+        affineAffineProd.set(1, 1, 33);
+        affineAffineProd.set(1, 2, 48);
+
+        B2DHomMatrix affinePerspectiveProd;
+
+        affinePerspectiveProd.set(0, 0, 30);
+        affinePerspectiveProd.set(0, 1, 36);
+        affinePerspectiveProd.set(0, 2, 42);
+        affinePerspectiveProd.set(1, 0, 66);
+        affinePerspectiveProd.set(1, 1, 81);
+        affinePerspectiveProd.set(1, 2, 96);
+        affinePerspectiveProd.set(2, 0, 7);
+        affinePerspectiveProd.set(2, 1, 8);
+        affinePerspectiveProd.set(2, 2, 9);
+
+        B2DHomMatrix perspectiveAffineProd;
+
+        perspectiveAffineProd.set(0, 0, 9);
+        perspectiveAffineProd.set(0, 1, 12);
+        perspectiveAffineProd.set(0, 2, 18);
+        perspectiveAffineProd.set(1, 0, 24);
+        perspectiveAffineProd.set(1, 1, 33);
+        perspectiveAffineProd.set(1, 2, 48);
+        perspectiveAffineProd.set(2, 0, 39);
+        perspectiveAffineProd.set(2, 1, 54);
+        perspectiveAffineProd.set(2, 2, 78);
+
+        B2DHomMatrix perspectivePerspectiveProd;
+
+        perspectivePerspectiveProd.set(0, 0, 30);
+        perspectivePerspectiveProd.set(0, 1, 36);
+        perspectivePerspectiveProd.set(0, 2, 42);
+        perspectivePerspectiveProd.set(1, 0, 66);
+        perspectivePerspectiveProd.set(1, 1, 81);
+        perspectivePerspectiveProd.set(1, 2, 96);
+        perspectivePerspectiveProd.set(2, 0, 102);
+        perspectivePerspectiveProd.set(2, 1, 126);
+        perspectivePerspectiveProd.set(2, 2, 150);
+
+        B2DHomMatrix temp;
+
+        temp = maAffine;
+        temp *= maAffine;
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("multiply: both compact", affineAffineProd, temp);
+
+        temp = maPerspective;
+        temp *= maAffine;
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("multiply: first compact", affinePerspectiveProd, temp);
+
+        temp = maAffine;
+        temp *= maPerspective;
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("multiply: second compact", perspectiveAffineProd, temp);
+
+        temp = maPerspective;
+        temp *= maPerspective;
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("multiply: none compact", perspectivePerspectiveProd, temp);
+    }
+
+    void impFillMatrix(B2DHomMatrix& rSource, double fScaleX, double fScaleY, double fShearX,
+                       double fRotate) const
+    {
+        // fill rSource with a linear combination of scale, shear and rotate
+        rSource.identity();
+        rSource.scale(fScaleX, fScaleY);
+        rSource.shearX(fShearX);
+        rSource.rotate(fRotate);
+    }
+
+    bool impDecomposeComposeTest(double fScaleX, double fScaleY, double fShearX,
+                                 double fRotate) const
+    {
+        // linear combine matrix with given values
+        B2DHomMatrix aSource;
+        impFillMatrix(aSource, fScaleX, fScaleY, fShearX, fRotate);
+
+        // decompose that matrix
+        B2DTuple aDScale;
+        B2DTuple aDTrans;
+        double fDRot;
+        double fDShX;
+        bool bWorked = aSource.decompose(aDScale, aDTrans, fDRot, fDShX);
+
+        // linear combine another matrix with decomposition results
+        B2DHomMatrix aRecombined;
+        impFillMatrix(aRecombined, aDScale.getX(), aDScale.getY(), fDShX, fDRot);
+
+        // if decomposition worked, matrices need to be the same
+        return bWorked && aSource == aRecombined;
+    }
+
+    void decompose()
+    {
+        // test matrix decompositions. Each matrix decomposed and rebuilt
+        // using the decompose result should be the same as before. Test
+        // with all ranges of values. Translations are not tested since these
+        // are just the two rightmost values and uncritical
+        static double fSX(10.0);
+        static double fSY(12.0);
+        static double fR(F_PI4);
+        static double fS(deg2rad(15.0));
+
+        // check all possible scaling combinations
+        CPPUNIT_ASSERT_MESSAGE("decompose: error test A1",
+                               impDecomposeComposeTest(fSX, fSY, 0.0, 0.0));
+        CPPUNIT_ASSERT_MESSAGE("decompose: error test A2",
+                               impDecomposeComposeTest(-fSX, fSY, 0.0, 0.0));
+        CPPUNIT_ASSERT_MESSAGE("decompose: error test A3",
+                               impDecomposeComposeTest(fSX, -fSY, 0.0, 0.0));
+        CPPUNIT_ASSERT_MESSAGE("decompose: error test A4",
+                               impDecomposeComposeTest(-fSX, -fSY, 0.0, 0.0));
+
+        // check all possible scaling combinations with positive rotation
+        CPPUNIT_ASSERT_MESSAGE("decompose: error test B1",
+                               impDecomposeComposeTest(fSX, fSY, 0.0, fR));
+        CPPUNIT_ASSERT_MESSAGE("decompose: error test B2",
+                               impDecomposeComposeTest(-fSX, fSY, 0.0, fR));
+        CPPUNIT_ASSERT_MESSAGE("decompose: error test B3",
+                               impDecomposeComposeTest(fSX, -fSY, 0.0, fR));
+        CPPUNIT_ASSERT_MESSAGE("decompose: error test B4",
+                               impDecomposeComposeTest(-fSX, -fSY, 0.0, fR));
+
+        // check all possible scaling combinations with negative rotation
+        CPPUNIT_ASSERT_MESSAGE("decompose: error test C1",
+                               impDecomposeComposeTest(fSX, fSY, 0.0, -fR));
+        CPPUNIT_ASSERT_MESSAGE("decompose: error test C2",
+                               impDecomposeComposeTest(-fSX, fSY, 0.0, -fR));
+        CPPUNIT_ASSERT_MESSAGE("decompose: error test C3",
+                               impDecomposeComposeTest(fSX, -fSY, 0.0, -fR));
+        CPPUNIT_ASSERT_MESSAGE("decompose: error test C4",
+                               impDecomposeComposeTest(-fSX, -fSY, 0.0, -fR));
+
+        // check all possible scaling combinations with positive shear
+        CPPUNIT_ASSERT_MESSAGE("decompose: error test D1",
+                               impDecomposeComposeTest(fSX, fSY, tan(fS), 0.0));
+        CPPUNIT_ASSERT_MESSAGE("decompose: error test D2",
+                               impDecomposeComposeTest(-fSX, fSY, tan(fS), 0.0));
+        CPPUNIT_ASSERT_MESSAGE("decompose: error test D3",
+                               impDecomposeComposeTest(fSX, -fSY, tan(fS), 0.0));
+        CPPUNIT_ASSERT_MESSAGE("decompose: error test D4",
+                               impDecomposeComposeTest(-fSX, -fSY, tan(fS), 0.0));
+
+        // check all possible scaling combinations with negative shear
+        CPPUNIT_ASSERT_MESSAGE("decompose: error test E1",
+                               impDecomposeComposeTest(fSX, fSY, tan(-fS), 0.0));
+        CPPUNIT_ASSERT_MESSAGE("decompose: error test E2",
+                               impDecomposeComposeTest(-fSX, fSY, tan(-fS), 0.0));
+        CPPUNIT_ASSERT_MESSAGE("decompose: error test E3",
+                               impDecomposeComposeTest(fSX, -fSY, tan(-fS), 0.0));
+        CPPUNIT_ASSERT_MESSAGE("decompose: error test E4",
+                               impDecomposeComposeTest(-fSX, -fSY, tan(-fS), 0.0));
+
+        // check all possible scaling combinations with positive rotate and positive shear
+        CPPUNIT_ASSERT_MESSAGE("decompose: error test F1",
+                               impDecomposeComposeTest(fSX, fSY, tan(fS), fR));
+        CPPUNIT_ASSERT_MESSAGE("decompose: error test F2",
+                               impDecomposeComposeTest(-fSX, fSY, tan(fS), fR));
+        CPPUNIT_ASSERT_MESSAGE("decompose: error test F3",
+                               impDecomposeComposeTest(fSX, -fSY, tan(fS), fR));
+        CPPUNIT_ASSERT_MESSAGE("decompose: error test F4",
+                               impDecomposeComposeTest(-fSX, -fSY, tan(fS), fR));
+
+        // check all possible scaling combinations with negative rotate and positive shear
+        CPPUNIT_ASSERT_MESSAGE("decompose: error test G1",
+                               impDecomposeComposeTest(fSX, fSY, tan(fS), -fR));
+        CPPUNIT_ASSERT_MESSAGE("decompose: error test G2",
+                               impDecomposeComposeTest(-fSX, fSY, tan(fS), -fR));
+        CPPUNIT_ASSERT_MESSAGE("decompose: error test G3",
+                               impDecomposeComposeTest(fSX, -fSY, tan(fS), -fR));
+        CPPUNIT_ASSERT_MESSAGE("decompose: error test G4",
+                               impDecomposeComposeTest(-fSX, -fSY, tan(fS), -fR));
+
+        // check all possible scaling combinations with positive rotate and negative shear
+        CPPUNIT_ASSERT_MESSAGE("decompose: error test H1",
+                               impDecomposeComposeTest(fSX, fSY, tan(-fS), fR));
+        CPPUNIT_ASSERT_MESSAGE("decompose: error test H2",
+                               impDecomposeComposeTest(-fSX, fSY, tan(-fS), fR));
+        CPPUNIT_ASSERT_MESSAGE("decompose: error test H3",
+                               impDecomposeComposeTest(fSX, -fSY, tan(-fS), fR));
+        CPPUNIT_ASSERT_MESSAGE("decompose: error test H4",
+                               impDecomposeComposeTest(-fSX, -fSY, tan(-fS), fR));
+
+        // check all possible scaling combinations with negative rotate and negative shear
+        CPPUNIT_ASSERT_MESSAGE("decompose: error test I1",
+                               impDecomposeComposeTest(fSX, fSY, tan(-fS), -fR));
+        CPPUNIT_ASSERT_MESSAGE("decompose: error test I2",
+                               impDecomposeComposeTest(-fSX, fSY, tan(-fS), -fR));
+        CPPUNIT_ASSERT_MESSAGE("decompose: error test I3",
+                               impDecomposeComposeTest(fSX, -fSY, tan(-fS), -fR));
+        CPPUNIT_ASSERT_MESSAGE("decompose: error test I4",
+                               impDecomposeComposeTest(-fSX, -fSY, tan(-fS), -fR));
+
+        // cover special case of 180 degree rotation
+        B2DHomMatrix aTest
+            = utils::createScaleShearXRotateTranslateB2DHomMatrix(6425, 3938, 0, F_PI, 10482, 4921);
+        // decompose that matrix
+        B2DTuple aDScale;
+        B2DTuple aDTrans;
+        double fDRot;
+        double fDShX;
+        aTest.decompose(aDScale, aDTrans, fDRot, fDShX);
+        CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("decompose: error test J1", 6425.0, aDScale.getX(),
+                                             1E-12);
+        CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("decompose: error test J1", 3938.0, aDScale.getY(),
+                                             1E-12);
+        CPPUNIT_ASSERT_MESSAGE("decompose: error test J1",
+                               aDTrans.getX() == 10482 && aDTrans.getY() == 4921);
+        CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("decompose: error test J1", F_PI, fDRot, 1E-12);
+    }
+
+    // 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(b2dhommatrix);
+    CPPUNIT_TEST(equal);
+    CPPUNIT_TEST(identity);
+    CPPUNIT_TEST(scale);
+    CPPUNIT_TEST(translate);
+    CPPUNIT_TEST(rotate);
+    CPPUNIT_TEST(shear);
+    CPPUNIT_TEST(multiply);
+    CPPUNIT_TEST(decompose);
+    CPPUNIT_TEST_SUITE_END();
+
+}; // class b2dhommatrix
+}
+
+CPPUNIT_TEST_SUITE_REGISTRATION(basegfx::b2dhommatrix);
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/basegfx/test/B2DPointTest.cxx b/basegfx/test/B2DPointTest.cxx
new file mode 100644
index 000000000000..b50bdd815d65
--- /dev/null
+++ b/basegfx/test/B2DPointTest.cxx
@@ -0,0 +1,50 @@
+/* -*- 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 .
+ */
+
+#include <cppunit/TestAssert.h>
+#include <cppunit/TestFixture.h>
+#include <cppunit/extensions/HelperMacros.h>
+#include <cppunit/plugin/TestPlugIn.h>
+
+namespace basegfx
+{
+class b2dpoint : public CppUnit::TestFixture
+{
+public:
+    // insert your test code here.
+    // this is only demonstration code
+    void EmptyMethod()
+    {
+        // CPPUNIT_ASSERT_MESSAGE("a message", 1 == 1);
+    }
+
+    // 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(b2dpoint);
+    CPPUNIT_TEST(EmptyMethod);
+    CPPUNIT_TEST_SUITE_END();
+}; // class b2dpoint
+
+} // namespace basegfx
+
+CPPUNIT_TEST_SUITE_REGISTRATION(basegfx::b2dpoint);
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/basegfx/test/B2DPolyPolygonTest.cxx b/basegfx/test/B2DPolyPolygonTest.cxx
new file mode 100644
index 000000000000..fd40e510688f
--- /dev/null
+++ b/basegfx/test/B2DPolyPolygonTest.cxx
@@ -0,0 +1,82 @@
+/* -*- 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 .
+ */
+
+#include <cppunit/TestAssert.h>
+#include <cppunit/TestFixture.h>
+#include <cppunit/extensions/HelperMacros.h>
+#include <cppunit/plugin/TestPlugIn.h>
+
+#include <basegfx/polygon/b2dpolypolygon.hxx>
+#include <basegfx/polygon/b2dtrapezoid.hxx>
+
+#include "boxclipper.hxx"
+
+namespace basegfx
+{
+using ::basegfx2d::getRandomOrdinal;
+
+class b2dpolypolygon : public CppUnit::TestFixture
+{
+public:
+    // insert your test code here.
+    void testTrapezoidHelper()
+    {
+        B2DPolygon aPolygon;
+        // provoke the PointBlockAllocator to exercise the freeIfLast path
+        for (int i = 0; i < 16 * 10; i++)
+        {
+            B2DPoint aPoint(getRandomOrdinal(1000), getRandomOrdinal(1000));
+            aPolygon.append(aPoint);
+        }
+        // scatter some duplicate points in to stress things more.
+        for (int i = 0; i < 16 * 10; i++)
+        {
+            aPolygon.insert(getRandomOrdinal(aPolygon.count() - 1),
+                            aPolygon.getB2DPoint(getRandomOrdinal(aPolygon.count() - 1)));
+        }
+        B2DPolygon aPolygonOffset;
+        // duplicate the polygon and offset it slightly.
+        for (size_t i = 0; i < aPolygon.count(); i++)
+        {
+            B2DPoint aPoint(aPolygon.getB2DPoint(i));
+            aPoint += B2DPoint(0.5 - getRandomOrdinal(1), 0.5 - getRandomOrdinal(1));
+            aPolygonOffset.append(aPoint);
+        }
+        B2DPolyPolygon aPolyPolygon;
+        aPolyPolygon.append(aPolygon);
+        aPolyPolygon.append(aPolygonOffset);
+        B2DTrapezoidVector aVector;
+        basegfx::utils::trapezoidSubdivide(aVector, aPolyPolygon);
+        CPPUNIT_ASSERT_MESSAGE("more than zero sub-divided trapezoids", !aVector.empty());
+    }
+
+    // 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(b2dpolypolygon);
+    CPPUNIT_TEST(testTrapezoidHelper);
+    CPPUNIT_TEST_SUITE_END();
+}; // class b2dpolypolygon
+
+} // namespace basegfx
+
+CPPUNIT_TEST_SUITE_REGISTRATION(basegfx::b2dpolypolygon);
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/basegfx/test/B2DPolyRangeTest.cxx b/basegfx/test/B2DPolyRangeTest.cxx
new file mode 100644
index 000000000000..42e40d2b5c1c
--- /dev/null
+++ b/basegfx/test/B2DPolyRangeTest.cxx
@@ -0,0 +1,66 @@
+/* -*- 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 .
+ */
+
+#include <cppunit/TestAssert.h>
+#include <cppunit/TestFixture.h>
+#include <cppunit/extensions/HelperMacros.h>
+#include <cppunit/plugin/TestPlugIn.h>
+
+#include <basegfx/range/b2drange.hxx>
+#include <basegfx/range/b2dpolyrange.hxx>
+#include <basegfx/polygon/b2dpolygontools.hxx>
+
+namespace basegfx
+{
+class b2dpolyrange : public CppUnit::TestFixture
+{
+private:
+public:
+    void check()
+    {
+        B2DPolyRange aRange;
+        aRange.appendElement(B2DRange(0, 0, 1, 1), B2VectorOrientation::Positive);
+        aRange.appendElement(B2DRange(2, 2, 3, 3), B2VectorOrientation::Positive);
+
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("simple poly range - count", sal_uInt32(2), aRange.count());
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("simple poly range - first element", B2DRange(0, 0, 1, 1),
+                                     std::get<0>(aRange.getElement(0)));
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("simple poly range - second element", B2DRange(2, 2, 3, 3),
+                                     std::get<0>(aRange.getElement(1)));
+
+        // B2DPolyRange relies on correctly orientated rects
+        const B2DRange aRect(0, 0, 1, 1);
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("createPolygonFromRect - correct orientation",
+                                     B2VectorOrientation::Positive,
+                                     utils::getOrientation(utils::createPolygonFromRect(aRect)));
+    }
+
+    // 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(b2dpolyrange);
+    CPPUNIT_TEST(check);
+    CPPUNIT_TEST_SUITE_END();
+};
+}
+
+CPPUNIT_TEST_SUITE_REGISTRATION(basegfx::b2dpolyrange);
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/basegfx/test/B2DPolygonTest.cxx b/basegfx/test/B2DPolygonTest.cxx
new file mode 100644
index 000000000000..297f25d6f03c
--- /dev/null
+++ b/basegfx/test/B2DPolygonTest.cxx
@@ -0,0 +1,94 @@
+/* -*- 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 .
+ */
+
+#include <cppunit/TestAssert.h>
+#include <cppunit/TestFixture.h>
+#include <cppunit/extensions/HelperMacros.h>
+#include <cppunit/plugin/TestPlugIn.h>
+
+#include <basegfx/polygon/b2dpolygon.hxx>
+#include <basegfx/point/b2dpoint.hxx>
+
+namespace basegfx
+{
+class b2dpolygon : public CppUnit::TestFixture
+{
+public:
+    void testBasics()
+    {
+        B2DPolygon aPoly;
+
+        aPoly.appendBezierSegment(B2DPoint(1, 1), B2DPoint(2, 2), B2DPoint(3, 3));
+
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("#1 first polygon point wrong", B2DPoint(3, 3),
+                                     aPoly.getB2DPoint(0));
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("#1 first control point wrong", B2DPoint(2, 2),
+                                     aPoly.getPrevControlPoint(0));
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("#1 second control point wrong", B2DPoint(3, 3),
+                                     aPoly.getNextControlPoint(0));
+        CPPUNIT_ASSERT_MESSAGE("next control point not used", !aPoly.isNextControlPointUsed(0));
+
+        aPoly.setNextControlPoint(0, B2DPoint(4, 4));
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("#1.1 second control point wrong", B2DPoint(4, 4),
+                                     aPoly.getNextControlPoint(0));
+        CPPUNIT_ASSERT_MESSAGE("next control point used", aPoly.isNextControlPointUsed(0));
+        CPPUNIT_ASSERT_MESSAGE("areControlPointsUsed() wrong", aPoly.areControlPointsUsed());
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("getContinuityInPoint() wrong", B2VectorContinuity::C2,
+                                     aPoly.getContinuityInPoint(0));
+
+        aPoly.resetControlPoints();
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("resetControlPoints() did not clear", B2DPoint(3, 3),
+                                     aPoly.getB2DPoint(0));
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("resetControlPoints() did not clear", B2DPoint(3, 3),
+                                     aPoly.getPrevControlPoint(0));
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("resetControlPoints() did not clear", B2DPoint(3, 3),
+                                     aPoly.getNextControlPoint(0));
+        CPPUNIT_ASSERT_MESSAGE("areControlPointsUsed() wrong #2", !aPoly.areControlPointsUsed());
+
+        aPoly.clear();
+        aPoly.append(B2DPoint(0, 0));
+        aPoly.appendBezierSegment(B2DPoint(1, 1), B2DPoint(2, 2), B2DPoint(3, 3));
+
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("#2 first polygon point wrong", B2DPoint(0, 0),
+                                     aPoly.getB2DPoint(0));
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("#2 first control point wrong", B2DPoint(0, 0),
+                                     aPoly.getPrevControlPoint(0));
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("#2 second control point wrong", B2DPoint(1, 1),
+                                     aPoly.getNextControlPoint(0));
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("#2 third control point wrong", B2DPoint(2, 2),
+                                     aPoly.getPrevControlPoint(1));
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("#2 fourth control point wrong", B2DPoint(3, 3),
+                                     aPoly.getNextControlPoint(1));
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("#2 second polygon point wrong", B2DPoint(3, 3),
+                                     aPoly.getB2DPoint(1));
+    }
+    // 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(b2dpolygon);
+    CPPUNIT_TEST(testBasics);
+    CPPUNIT_TEST_SUITE_END();
+}; // class b2dpolygon
+
+} // namespace basegfx
+
+CPPUNIT_TEST_SUITE_REGISTRATION(basegfx::b2dpolygon);
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/basegfx/test/B2DPolygonToolsTest.cxx b/basegfx/test/B2DPolygonToolsTest.cxx
new file mode 100644
index 000000000000..c81e02a0e30c
--- /dev/null
+++ b/basegfx/test/B2DPolygonToolsTest.cxx
@@ -0,0 +1,85 @@
+/* -*- 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 .
+ */
+
+#include <cppunit/TestAssert.h>
+#include <cppunit/TestFixture.h>
+#include <cppunit/extensions/HelperMacros.h>
+#include <cppunit/plugin/TestPlugIn.h>
+
+#include <basegfx/polygon/b2dpolygontools.hxx>
+
+namespace basegfx
+{
+class b2dpolygontools : public CppUnit::TestFixture
+{
+public:
+    // insert your test code here.
+    // this is only demonstration code
+    void testIsRectangle()
+    {
+        B2DPolygon aRect1(utils::createPolygonFromRect(B2DRange(0, 0, 1, 1)));
+
+        B2DPolygon aRect2{ { 0, 0 }, { 1, 0 }, { 1, 0.5 }, { 1, 1 }, { 0, 1 } };
+        aRect2.setClosed(true);
+
+        B2DPolygon aNonRect1{ { 0, 0 }, { 1, 0 }, { 0.5, 1 }, { 0.5, 0 } };
+        aNonRect1.setClosed(true);
+
+        B2DPolygon aNonRect2{ { 0, 0 }, { 1, 1 }, { 1, 0 }, { 0, 1 } };
+        aNonRect2.setClosed(true);
+
+        B2DPolygon aNonRect3{ { 0, 0 }, { 1, 0 }, { 1, 1 } };
+        aNonRect3.setClosed(true);
+
+        B2DPolygon aNonRect4{ { 0, 0 }, { 1, 0 }, { 1, 1 }, { 0, 1 } };
+
+        B2DPolygon aNonRect5{ { 0, 0 }, { 1, 0 }, { 1, 1 }, { 0, 1 } };
+        aNonRect5.setControlPoints(1, B2DPoint(1, 0), B2DPoint(-11, 0));
+        aNonRect5.setClosed(true);
+
+        CPPUNIT_ASSERT_MESSAGE("checking rectangle-ness of rectangle 1",
+                               utils::isRectangle(aRect1));
+        CPPUNIT_ASSERT_MESSAGE("checking rectangle-ness of rectangle 2",
+                               utils::isRectangle(aRect2));
+        CPPUNIT_ASSERT_MESSAGE("checking non-rectangle-ness of polygon 1",
+                               !utils::isRectangle(aNonRect1));
+        CPPUNIT_ASSERT_MESSAGE("checking non-rectangle-ness of polygon 2",
+                               !utils::isRectangle(aNonRect2));
+        CPPUNIT_ASSERT_MESSAGE("checking non-rectangle-ness of polygon 3",
+                               !utils::isRectangle(aNonRect3));
+        CPPUNIT_ASSERT_MESSAGE("checking non-rectangle-ness of polygon 4",
+                               !utils::isRectangle(aNonRect4));
+        CPPUNIT_ASSERT_MESSAGE("checking non-rectangle-ness of polygon 5",
+                               !utils::isRectangle(aNonRect5));
+    }
+
+    // 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(b2dpolygontools);
+    CPPUNIT_TEST(testIsRectangle);
+    CPPUNIT_TEST_SUITE_END();
+}; // class b2dpolygontools
+
+} // namespace basegfx
+
+CPPUNIT_TEST_SUITE_REGISTRATION(basegfx::b2dpolygontools);
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/basegfx/test/B2DRangeTest.cxx b/basegfx/test/B2DRangeTest.cxx
new file mode 100644
index 000000000000..566c3a66e1e5
--- /dev/null
+++ b/basegfx/test/B2DRangeTest.cxx
@@ -0,0 +1,54 @@
+/* -*- 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 .
+ */
+
+#include <cppunit/TestAssert.h>
+#include <cppunit/TestFixture.h>
+#include <cppunit/extensions/HelperMacros.h>
+#include <cppunit/plugin/TestPlugIn.h>
+
+#include <basegfx/range/b2drange.hxx>
+#include <basegfx/range/b1drange.hxx>
+#include <basegfx/range/b2irange.hxx>
+
+namespace basegfx
+{
+class b2drange : public CppUnit::TestFixture
+{
+private:
+public:
+    void check()
+    {
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("simple range rounding from double to integer",
+                                     B2IRange(1, 2, 4, 5), fround(B2DRange(1.2, 2.3, 3.5, 4.8)));
+    }
+
+    // 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(b2drange);
+    CPPUNIT_TEST(check);
+    CPPUNIT_TEST_SUITE_END();
+};
+}
+
+CPPUNIT_TEST_SUITE_REGISTRATION(basegfx::b2drange);
+CPPUNIT_PLUGIN_IMPLEMENT();
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/basegfx/test/B2DTupleTest.cxx b/basegfx/test/B2DTupleTest.cxx
new file mode 100644
index 000000000000..a01c075d6d52
--- /dev/null
+++ b/basegfx/test/B2DTupleTest.cxx
@@ -0,0 +1,50 @@
+/* -*- 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 .
+ */
+
+#include <cppunit/TestAssert.h>
+#include <cppunit/TestFixture.h>
+#include <cppunit/extensions/HelperMacros.h>
+#include <cppunit/plugin/TestPlugIn.h>
+
+namespace basegfx
+{
+class b2dtuple : public CppUnit::TestFixture
+{
+public:
+    // insert your test code here.
+    // this is only demonstration code
+    void EmptyMethod()
+    {
+        // CPPUNIT_ASSERT_MESSAGE("a message", 1 == 1);
+    }
+
+    // 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(b2dtuple);
+    CPPUNIT_TEST(EmptyMethod);
+    CPPUNIT_TEST_SUITE_END();
+};
+
+} // namespace basegfx
+
+CPPUNIT_TEST_SUITE_REGISTRATION(basegfx::b2dtuple);
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/basegfx/test/B2IBoxTest.cxx b/basegfx/test/B2IBoxTest.cxx
new file mode 100644
index 000000000000..137c1b4ce123
--- /dev/null
+++ b/basegfx/test/B2IBoxTest.cxx
@@ -0,0 +1,63 @@
+/* -*- 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 .
+ */
+
+#include <cppunit/TestAssert.h>
+#include <cppunit/TestFixture.h>
+#include <cppunit/extensions/HelperMacros.h>
+#include <cppunit/plugin/TestPlugIn.h>
+
+#include <basegfx/range/b2ibox.hxx>
+#include <basegfx/point/b2ipoint.hxx>
+#include <basegfx/utils/rectcliptools.hxx>
+
+namespace basegfx
+{
+class b2ibox : public CppUnit::TestFixture
+{
+public:
+    void TestBox()
+    {
+        // cohen sutherland clipping
+        B2IBox aBox(0, 0, 10, 10);
+
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("(0,0) is outside range!", sal_uInt32(0),
+                                     utils::getCohenSutherlandClipFlags(B2IPoint(0, 0), aBox));
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("(-1,-1) is inside range!",
+                                     utils::RectClipFlags::LEFT | utils::RectClipFlags::TOP,
+                                     utils::getCohenSutherlandClipFlags(B2IPoint(-1, -1), aBox));
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("(9,9) is outside range!", sal_uInt32(0),
+                                     utils::getCohenSutherlandClipFlags(B2IPoint(9, 9), aBox));
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("(10,10) is inside range!",
+                                     utils::RectClipFlags::RIGHT | utils::RectClipFlags::BOTTOM,
+                                     utils::getCohenSutherlandClipFlags(B2IPoint(10, 10), aBox));
+    }
+
+    // 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(b2ibox);
+    CPPUNIT_TEST(TestBox);
+    CPPUNIT_TEST_SUITE_END();
+}; // class b2ibox
+
+} // namespace basegfx
+
+CPPUNIT_TEST_SUITE_REGISTRATION(basegfx::b2ibox);
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/basegfx/test/B2XRangeTest.cxx b/basegfx/test/B2XRangeTest.cxx
new file mode 100644
index 000000000000..009016ffea45
--- /dev/null
+++ b/basegfx/test/B2XRangeTest.cxx
@@ -0,0 +1,70 @@
+/* -*- 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 .
+ */
+
+#include <cppunit/TestAssert.h>
+#include <cppunit/TestFixture.h>
+#include <cppunit/extensions/HelperMacros.h>
+#include <cppunit/plugin/TestPlugIn.h>
+
+#include <basegfx/range/b2drange.hxx>
+#include <basegfx/range/b2irange.hxx>
+#include <basegfx/utils/rectcliptools.hxx>
+
+namespace basegfx
+{
+class b2Xrange : public CppUnit::TestFixture
+{
+public:
+    template <class Type> void implCheck()
+    {
+        // cohen sutherland clipping
+        Type aRange(0, 0, 10, 10);
+
+        CPPUNIT_ASSERT_MESSAGE("(0,0) is outside range!",
+                               utils::getCohenSutherlandClipFlags(B2IPoint(0, 0), aRange) == 0);
+        CPPUNIT_ASSERT_MESSAGE("(-1,-1) is inside range!",
+                               utils::getCohenSutherlandClipFlags(B2IPoint(-1, -1), aRange)
+                                   == (utils::RectClipFlags::LEFT | utils::RectClipFlags::TOP));
+        CPPUNIT_ASSERT_MESSAGE("(10,10) is outside range!",
+                               utils::getCohenSutherlandClipFlags(B2IPoint(10, 10), aRange) == 0);
+        CPPUNIT_ASSERT_MESSAGE("(11,11) is inside range!",
+                               utils::getCohenSutherlandClipFlags(B2IPoint(11, 11), aRange)
+                                   == (utils::RectClipFlags::RIGHT | utils::RectClipFlags::BOTTOM));
+    }
+
+    void check()
+    {
+        implCheck<B2DRange>();
+        implCheck<B2IRange>();
+    }
+
+    // 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(b2Xrange);
+    CPPUNIT_TEST(check);
+    CPPUNIT_TEST_SUITE_END();
+}; // class b2Xrange
+
+} // namespace basegfx
+
+CPPUNIT_TEST_SUITE_REGISTRATION(basegfx::b2Xrange);
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/basegfx/test/BColorTest.cxx b/basegfx/test/BColorTest.cxx
new file mode 100644
index 000000000000..cc29fdfb6624
--- /dev/null
+++ b/basegfx/test/BColorTest.cxx
@@ -0,0 +1,151 @@
+/* -*- 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 .
+ */
+
+#include <cppunit/TestAssert.h>
+#include <cppunit/TestFixture.h>
+#include <cppunit/extensions/HelperMacros.h>
+#include <cppunit/plugin/TestPlugIn.h>
+
+#include <basegfx/color/bcolor.hxx>
+#include <basegfx/color/bcolortools.hxx>
+
+namespace basegfx
+{
+class bcolor : public CppUnit::TestFixture
+{
+    BColor maWhite;
+    BColor maBlack;
+    BColor maRed;
+    BColor maGreen;
+    BColor maBlue;
+    BColor maYellow;
+    BColor maMagenta;
+    BColor maCyan;
+
+public:
+    bcolor()
+        : maWhite(1, 1, 1)
+        , maBlack(0, 0, 0)
+        , maRed(1, 0, 0)
+        , maGreen(0, 1, 0)
+        , maBlue(0, 0, 1)
+        , maYellow(1, 1, 0)
+        , maMagenta(1, 0, 1)
+        , maCyan(0, 1, 1)
+    {
+    }
+
+    // insert your test code here.
+    void hslTest()
+    {
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("white", BColor(0, 0, 1), utils::rgb2hsl(maWhite));
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("black", BColor(0, 0, 0), utils::rgb2hsl(maBlack));
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("red", BColor(0, 1, 0.5), utils::rgb2hsl(maRed));
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("green", BColor(120, 1, 0.5), utils::rgb2hsl(maGreen));
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("blue", BColor(240, 1, 0.5), utils::rgb2hsl(maBlue));
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("yellow", BColor(60, 1, 0.5), utils::rgb2hsl(maYellow));
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("magenta", BColor(300, 1, 0.5), utils::rgb2hsl(maMagenta));
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("cyan", BColor(180, 1, 0.5), utils::rgb2hsl(maCyan));
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("third hue case", BColor(210, 1, 0.5),
+                                     utils::rgb2hsl(BColor(0, 0.5, 1)));
+
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("roundtrip white", maWhite,
+                                     utils::hsl2rgb(utils::rgb2hsl(maWhite)));
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("roundtrip black", maBlack,
+                                     utils::hsl2rgb(utils::rgb2hsl(maBlack)));
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("roundtrip red", maRed, utils::hsl2rgb(utils::rgb2hsl(maRed)));
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("roundtrip green", maGreen,
+                                     utils::hsl2rgb(utils::rgb2hsl(maGreen)));
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("roundtrip blue", maBlue,
+                                     utils::hsl2rgb(utils::rgb2hsl(maBlue)));
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("roundtrip yellow", maYellow,
+                                     utils::hsl2rgb(utils::rgb2hsl(maYellow)));
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("roundtrip magenta", maMagenta,
+                                     utils::hsl2rgb(utils::rgb2hsl(maMagenta)));
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("roundtrip cyan", maCyan,
+                                     utils::hsl2rgb(utils::rgb2hsl(maCyan)));
+
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("grey10", BColor(0, 0, .1), utils::rgb2hsl(maWhite * .1));
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("grey90", BColor(0, 0, .9), utils::rgb2hsl(maWhite * .9));
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("red/2", BColor(0, 1, 0.25), utils::rgb2hsl(maRed * .5));
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("green/2", BColor(120, 1, 0.25), utils::rgb2hsl(maGreen * .5));
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("blue/2", BColor(240, 1, 0.25), utils::rgb2hsl(maBlue * .5));
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("yellow/2", BColor(60, 1, 0.25),
+                                     utils::rgb2hsl(maYellow * .5));
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("magenta/2", BColor(300, 1, 0.25),
+                                     utils::rgb2hsl(maMagenta * .5));
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("cyan/2", BColor(180, 1, 0.25), utils::rgb2hsl(maCyan * .5));
+
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("pastel", BColor(0, .5, .5),
+                                     utils::rgb2hsl(BColor(.75, .25, .25)));
+    }
+
+    // insert your test code here.
+    void hsvTest()
+    {
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("white", BColor(0, 0, 1), utils::rgb2hsv(maWhite));
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("black", BColor(0, 0, 0), utils::rgb2hsv(maBlack));
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("red", BColor(0, 1, 1), utils::rgb2hsv(maRed));
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("green", BColor(120, 1, 1), utils::rgb2hsv(maGreen));
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("blue", BColor(240, 1, 1), utils::rgb2hsv(maBlue));
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("yellow", BColor(60, 1, 1), utils::rgb2hsv(maYellow));
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("magenta", BColor(300, 1, 1), utils::rgb2hsv(maMagenta));
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("cyan", BColor(180, 1, 1), utils::rgb2hsv(maCyan));
+
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("roundtrip white", maWhite,
+                                     utils::hsv2rgb(utils::rgb2hsv(maWhite)));
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("roundtrip black", maBlack,
+                                     utils::hsv2rgb(utils::rgb2hsv(maBlack)));
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("roundtrip red", maRed, utils::hsv2rgb(utils::rgb2hsv(maRed)));
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("roundtrip green", maGreen,
+                                     utils::hsv2rgb(utils::rgb2hsv(maGreen)));
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("roundtrip blue", maBlue,
+                                     utils::hsv2rgb(utils::rgb2hsv(maBlue)));
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("roundtrip yellow", maYellow,
+                                     utils::hsv2rgb(utils::rgb2hsv(maYellow)));
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("roundtrip magenta", maMagenta,
+                                     utils::hsv2rgb(utils::rgb2hsv(maMagenta)));
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("roundtrip cyan", maCyan,
+                                     utils::hsv2rgb(utils::rgb2hsv(maCyan)));
+
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("grey10", BColor(0, 0, .1), utils::rgb2hsv(maWhite * .1));
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("grey90", BColor(0, 0, .9), utils::rgb2hsv(maWhite * .9));
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("red/2", BColor(0, 1, 0.5), utils::rgb2hsv(maRed * .5));
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("green/2", BColor(120, 1, 0.5), utils::rgb2hsv(maGreen * .5));
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("blue/2", BColor(240, 1, 0.5), utils::rgb2hsv(maBlue * .5));
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("yellow/2", BColor(60, 1, 0.5), utils::rgb2hsv(maYellow * .5));
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("magenta/2", BColor(300, 1, 0.5),
+                                     utils::rgb2hsv(maMagenta * .5));
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("cyan/2", BColor(180, 1, 0.5), utils::rgb2hsv(maCyan * .5));
+
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("pastel", BColor(0, .5, .5),
+                                     utils::rgb2hsv(BColor(.5, .25, .25)));
+    }
+
+    CPPUNIT_TEST_SUITE(bcolor);
+    CPPUNIT_TEST(hslTest);
+    CPPUNIT_TEST(hsvTest);
+    CPPUNIT_TEST_SUITE_END();
+};
+
+} // namespace basegfx
+
+CPPUNIT_TEST_SUITE_REGISTRATION(basegfx::bcolor);
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/basegfx/test/basegfx2d.cxx b/basegfx/test/basegfx2d.cxx
deleted file mode 100644
index 9af87302847a..000000000000
--- a/basegfx/test/basegfx2d.cxx
+++ /dev/null
@@ -1,1024 +0,0 @@
-/* -*- 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 .
- */
-
-#include <cppunit/TestAssert.h>
-#include <cppunit/TestFixture.h>
-#include <cppunit/extensions/HelperMacros.h>
-#include <cppunit/plugin/TestPlugIn.h>
-
-#include <basegfx/matrix/b2dhommatrix.hxx>
-#include <basegfx/matrix/b2dhommatrixtools.hxx>
-#include <basegfx/polygon/b2dpolygon.hxx>
-#include <basegfx/polygon/b2dpolygontools.hxx>
-#include <basegfx/curve/b2dcubicbezier.hxx>
-#include <basegfx/curve/b2dbeziertools.hxx>
-#include <basegfx/polygon/b2dpolypolygontools.hxx>
-#include <basegfx/polygon/b2dpolygonclipper.hxx>
-#include <basegfx/polygon/b2dpolypolygon.hxx>
-#include <basegfx/polygon/b2dtrapezoid.hxx>
-#include <basegfx/range/b2irange.hxx>
-#include <basegfx/range/b2ibox.hxx>
-#include <basegfx/range/b1drange.hxx>
-#include <basegfx/range/b2drange.hxx>
-#include <basegfx/range/b2dpolyrange.hxx>
-#include <basegfx/numeric/ftools.hxx>
-#include <basegfx/color/bcolor.hxx>
-#include <basegfx/color/bcolortools.hxx>
-
-#include <basegfx/utils/rectcliptools.hxx>
-
-#include <iostream>
-#include <fstream>
-
-#include "boxclipper.hxx"
-
-using namespace ::basegfx;
-using basegfx2d::getRandomOrdinal;
-
-namespace basegfx
-{
-
-class b2drange : public CppUnit::TestFixture
-{
-private:
-public:
-    void check()
-    {
-        CPPUNIT_ASSERT_EQUAL_MESSAGE("simple range rounding from double to integer",
-                               B2IRange(1, 2, 4, 5), fround(B2DRange(1.2, 2.3, 3.5, 4.8)));
-    }
-
-    // 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(b2drange);
-    CPPUNIT_TEST(check);
-    CPPUNIT_TEST_SUITE_END();
-};
-
-class b2dpolyrange : public CppUnit::TestFixture
-{
-private:
-public:
-    void check()
-    {
-        B2DPolyRange aRange;
-        aRange.appendElement(B2DRange(0,0,1,1),B2VectorOrientation::Positive);
-        aRange.appendElement(B2DRange(2,2,3,3),B2VectorOrientation::Positive);
-
-        CPPUNIT_ASSERT_EQUAL_MESSAGE("simple poly range - count",
-                               sal_uInt32(2), aRange.count());
-        CPPUNIT_ASSERT_EQUAL_MESSAGE("simple poly range - first element",
-                               B2DRange(0,0,1,1), std::get<0>(aRange.getElement(0)));
-        CPPUNIT_ASSERT_EQUAL_MESSAGE("simple poly range - second element",
-                               B2DRange(2,2,3,3), std::get<0>(aRange.getElement(1)));
-
-        // B2DPolyRange relies on correctly orientated rects
-        const B2DRange aRect(0,0,1,1);
-        CPPUNIT_ASSERT_EQUAL_MESSAGE("createPolygonFromRect - correct orientation",
-                               B2VectorOrientation::Positive, utils::getOrientation(utils::createPolygonFromRect(aRect)));
-    }
-
-    // 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(b2dpolyrange);
-    CPPUNIT_TEST(check);
-    CPPUNIT_TEST_SUITE_END();
-};
-
-class b2dhommatrix : public CppUnit::TestFixture
-{
-private:
-    B2DHomMatrix    maIdentity;
-    B2DHomMatrix    maScale;
-    B2DHomMatrix    maTranslate;
-    B2DHomMatrix    maShear;
-    B2DHomMatrix    maAffine;
-    B2DHomMatrix    maPerspective;
-
-public:
-    // initialise your test code values here.
-    void setUp() override
-    {
-        // setup some test matrices
-        maIdentity.identity(); // force compact layout
-        maIdentity.set(0,0, 1.0);
-        maIdentity.set(0,1, 0.0);
-        maIdentity.set(0,2, 0.0);
-        maIdentity.set(1,0, 0.0);
-        maIdentity.set(1,1, 1.0);
-        maIdentity.set(1,2, 0.0);
-
-        maScale.identity(); // force compact layout
-        maScale.set(0,0, 2.0);
-        maScale.set(1,1, 20.0);
-
-        maTranslate.identity(); // force compact layout
-        maTranslate.set(0,2, 20.0);
-        maTranslate.set(1,2, 2.0);
-
-        maShear.identity(); // force compact layout
-        maShear.set(0,1, 3.0);
-        maShear.set(1,0, 7.0);
-        maShear.set(1,1, 22.0);
-
-        maAffine.identity(); // force compact layout
-        maAffine.set(0,0, 1.0);
-        maAffine.set(0,1, 2.0);
-        maAffine.set(0,2, 3.0);
-        maAffine.set(1,0, 4.0);
-        maAffine.set(1,1, 5.0);
-        maAffine.set(1,2, 6.0);
-
-        maPerspective.set(0,0, 1.0);
-        maPerspective.set(0,1, 2.0);
-        maPerspective.set(0,2, 3.0);
-        maPerspective.set(1,0, 4.0);
-        maPerspective.set(1,1, 5.0);
-        maPerspective.set(1,2, 6.0);
-        maPerspective.set(2,0, 7.0);
-        maPerspective.set(2,1, 8.0);
-        maPerspective.set(2,2, 9.0);
-    }
-
-    void equal()
-    {
-        B2DHomMatrix    aIdentity;
-        B2DHomMatrix    aScale;
-        B2DHomMatrix    aTranslate;
-        B2DHomMatrix    aShear;
-        B2DHomMatrix    aAffine;
-        B2DHomMatrix    aPerspective;
-
-        // setup some test matrices
-        aIdentity.identity(); // force compact layout
-        aIdentity.set(0,0, 1.0);
-        aIdentity.set(0,1, 0.0);
-        aIdentity.set(0,2, 0.0);
-        aIdentity.set(1,0, 0.0);
-        aIdentity.set(1,1, 1.0);
-        aIdentity.set(1,2, 0.0);
-
-        aScale.identity(); // force compact layout
-        aScale.set(0,0, 2.0);
-        aScale.set(1,1, 20.0);
-
-        aTranslate.identity(); // force compact layout
-        aTranslate.set(0,2, 20.0);
-        aTranslate.set(1,2, 2.0);
-
-        aShear.identity(); // force compact layout
-        aShear.set(0,1, 3.0);
-        aShear.set(1,0, 7.0);
-        aShear.set(1,1, 22.0);
-
-        aAffine.identity(); // force compact layout
-        aAffine.set(0,0, 1.0);
-        aAffine.set(0,1, 2.0);
-        aAffine.set(0,2, 3.0);
-        aAffine.set(1,0, 4.0);
-        aAffine.set(1,1, 5.0);
-        aAffine.set(1,2, 6.0);
-
-        aPerspective.set(0,0, 1.0);
-        aPerspective.set(0,1, 2.0);
-        aPerspective.set(0,2, 3.0);
-        aPerspective.set(1,0, 4.0);
-        aPerspective.set(1,1, 5.0);
-        aPerspective.set(1,2, 6.0);
-        aPerspective.set(2,0, 7.0);
-        aPerspective.set(2,1, 8.0);
-        aPerspective.set(2,2, 9.0);
-
-        CPPUNIT_ASSERT_MESSAGE("operator==: identity matrix", aIdentity.operator ==(maIdentity));
-        CPPUNIT_ASSERT_MESSAGE("operator==: scale matrix", aScale.operator ==(maScale));
-        CPPUNIT_ASSERT_MESSAGE("operator==: translate matrix", aTranslate.operator ==(maTranslate));
-        CPPUNIT_ASSERT_MESSAGE("operator==: shear matrix", aShear.operator ==(maShear));
-        CPPUNIT_ASSERT_MESSAGE("operator==: affine matrix", aAffine.operator ==(maAffine));
-        CPPUNIT_ASSERT_MESSAGE("operator==: perspective matrix", aPerspective.operator ==(maPerspective));
-    }
-
-    void identity()
-    {
-        B2DHomMatrix ident;
-
-        CPPUNIT_ASSERT_EQUAL_MESSAGE("identity", maIdentity, ident);
-    }
-
-    void scale()
-    {
-        B2DHomMatrix mat;
-        mat.scale(2.0,20.0);
-        CPPUNIT_ASSERT_EQUAL_MESSAGE("scale", maScale, mat);
-    }
-
-    void rotate()
-    {
-        B2DHomMatrix mat;
-        mat.rotate(F_PI2);
-        CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE(
-            "rotate pi/2 yields exact matrix", 0.0, mat.get(0,0), 1E-12);
-        CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE(
-            "rotate pi/2 yields exact matrix", -1.0, mat.get(0,1), 1E-12);
-        CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE(
-            "rotate pi/2 yields exact matrix", 0.0, mat.get(0,2), 1E-12);
-        CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE(
-            "rotate pi/2 yields exact matrix", 1.0, mat.get(1,0), 1E-12);
-        CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE(
-            "rotate pi/2 yields exact matrix", 0.0, mat.get(1,1), 1E-12);
-        CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE(
-            "rotate pi/2 yields exact matrix", 0.0, mat.get(1,2), 1E-12);
-        mat.rotate(F_PI2);
-        CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE(
-            "rotate pi yields exact matrix", -1.0, mat.get(0,0), 1E-12);
-        CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE(
-            "rotate pi yields exact matrix", 0.0, mat.get(0,1), 1E-12);
-        CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE(
-            "rotate pi yields exact matrix", 0.0, mat.get(0,2), 1E-12);
-        CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE(
-            "rotate pi yields exact matrix", 0.0, mat.get(1,0), 1E-12);
-        CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE(
-            "rotate pi yields exact matrix", -1.0, mat.get(1,1), 1E-12);
-        CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE(
-            "rotate pi yields exact matrix", 0.0, mat.get(1,2), 1E-12);
-        mat.rotate(F_PI2);
-        CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE(
-            "rotate 3/2 pi yields exact matrix", 0.0, mat.get(0,0), 1E-12);
-        CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE(
-            "rotate 3/2 pi yields exact matrix", 1.0, mat.get(0,1), 1E-12);
-        CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE(
-            "rotate 3/2 pi yields exact matrix", 0.0, mat.get(0,2), 1E-12);
-        CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE(
-            "rotate 3/2 pi yields exact matrix", -1.0, mat.get(1,0), 1E-12);
-        CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE(
-            "rotate 3/2 pi yields exact matrix", 0.0, mat.get(1,1), 1E-12);
-        CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE(
-            "rotate 3/2 pi yields exact matrix", 0.0, mat.get(1,2), 1E-12);
-        mat.rotate(F_PI2);
-        CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE(
-            "rotate 2 pi yields exact matrix", 1.0, mat.get(0,0), 1E-12);
-        CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE(
-            "rotate 2 pi yields exact matrix", 0.0, mat.get(0,1), 1E-12);
-        CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE(
-            "rotate 2 pi yields exact matrix", 0.0, mat.get(0,2), 1E-12);
-        CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE(
-            "rotate 2 pi yields exact matrix", 0.0, mat.get(1,0), 1E-12);
-        CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE(
-            "rotate 2 pi yields exact matrix", 1.0, mat.get(1,1), 1E-12);
-        CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE(
-            "rotate 2 pi yields exact matrix", 0.0, mat.get(1,2), 1E-12);
-    }
-
-    void translate()
-    {
-        B2DHomMatrix mat;
-        mat.translate(20.0,2.0);
-        CPPUNIT_ASSERT_EQUAL_MESSAGE("translate", maTranslate, mat);
-    }
-
-    void shear()
-    {
-        B2DHomMatrix mat;
-        mat.shearX(3.0);
-        mat.shearY(7.0);
-        CPPUNIT_ASSERT_EQUAL_MESSAGE("translate", maShear, mat);
-    }
-
-    void multiply()
-    {
-        B2DHomMatrix affineAffineProd;
-
-        affineAffineProd.set(0,0, 9);
-        affineAffineProd.set(0,1, 12);
-        affineAffineProd.set(0,2, 18);
-        affineAffineProd.set(1,0, 24);
-        affineAffineProd.set(1,1, 33);
-        affineAffineProd.set(1,2, 48);
-
-        B2DHomMatrix affinePerspectiveProd;
-
-        affinePerspectiveProd.set(0,0, 30);
-        affinePerspectiveProd.set(0,1, 36);
-        affinePerspectiveProd.set(0,2, 42);
-        affinePerspectiveProd.set(1,0, 66);
-        affinePerspectiveProd.set(1,1, 81);
-        affinePerspectiveProd.set(1,2, 96);
-        affinePerspectiveProd.set(2,0, 7);
-        affinePerspectiveProd.set(2,1, 8);
-        affinePerspectiveProd.set(2,2, 9);
-
-        B2DHomMatrix perspectiveAffineProd;
-
-        perspectiveAffineProd.set(0,0, 9);
-        perspectiveAffineProd.set(0,1, 12);
-        perspectiveAffineProd.set(0,2, 18);
-        perspectiveAffineProd.set(1,0, 24);
-        perspectiveAffineProd.set(1,1, 33);
-        perspectiveAffineProd.set(1,2, 48);
-        perspectiveAffineProd.set(2,0, 39);
-        perspectiveAffineProd.set(2,1, 54);
-        perspectiveAffineProd.set(2,2, 78);
-
-        B2DHomMatrix perspectivePerspectiveProd;
-
-        perspectivePerspectiveProd.set(0,0, 30);
-        perspectivePerspectiveProd.set(0,1, 36);
-        perspectivePerspectiveProd.set(0,2, 42);
-        perspectivePerspectiveProd.set(1,0, 66);
-        perspectivePerspectiveProd.set(1,1, 81);
-        perspectivePerspectiveProd.set(1,2, 96);
-        perspectivePerspectiveProd.set(2,0, 102);
-        perspectivePerspectiveProd.set(2,1, 126);
-        perspectivePerspectiveProd.set(2,2, 150);
-
-        B2DHomMatrix temp;
-
-        temp = maAffine;
-        temp*=maAffine;
-        CPPUNIT_ASSERT_EQUAL_MESSAGE("multiply: both compact", affineAffineProd, temp);
-
-        temp = maPerspective;
-        temp*=maAffine;
-        CPPUNIT_ASSERT_EQUAL_MESSAGE("multiply: first compact", affinePerspectiveProd, temp);
-
-        temp = maAffine;
-        temp*=maPerspective;
-        CPPUNIT_ASSERT_EQUAL_MESSAGE("multiply: second compact", perspectiveAffineProd, temp);
-
-        temp = maPerspective;
-        temp*=maPerspective;
-        CPPUNIT_ASSERT_EQUAL_MESSAGE("multiply: none compact", perspectivePerspectiveProd, temp);
-    }
-
-    void impFillMatrix(B2DHomMatrix& rSource, double fScaleX, double fScaleY, double fShearX, double fRotate) const
-    {
-        // fill rSource with a linear combination of scale, shear and rotate
-        rSource.identity();
-        rSource.scale(fScaleX, fScaleY);
-        rSource.shearX(fShearX);
-        rSource.rotate(fRotate);
-    }
-
-    bool impDecomposeComposeTest(double fScaleX, double fScaleY, double fShearX, double fRotate) const
-    {
-        // linear combine matrix with given values
-        B2DHomMatrix aSource;
-        impFillMatrix(aSource, fScaleX, fScaleY, fShearX, fRotate);
-
-        // decompose that matrix
-        B2DTuple aDScale;
-        B2DTuple aDTrans;
-        double fDRot;
-        double fDShX;
-        bool bWorked = aSource.decompose(aDScale, aDTrans, fDRot, fDShX);
-
-        // linear combine another matrix with decomposition results
-        B2DHomMatrix aRecombined;
-        impFillMatrix(aRecombined, aDScale.getX(), aDScale.getY(), fDShX, fDRot);
-
-        // if decomposition worked, matrices need to be the same
-        return bWorked && aSource == aRecombined;
-    }
-
-    void decompose()
-    {
-        // test matrix decompositions. Each matrix decomposed and rebuilt
-        // using the decompose result should be the same as before. Test
-        // with all ranges of values. Translations are not tested since these
-        // are just the two rightmost values and uncritical
-        static double fSX(10.0);
-        static double fSY(12.0);
-        static double fR(F_PI4);
-        static double fS(deg2rad(15.0));
-
-        // check all possible scaling combinations
-        CPPUNIT_ASSERT_MESSAGE("decompose: error test A1", impDecomposeComposeTest(fSX, fSY, 0.0, 0.0));
-        CPPUNIT_ASSERT_MESSAGE("decompose: error test A2", impDecomposeComposeTest(-fSX, fSY, 0.0, 0.0));
-        CPPUNIT_ASSERT_MESSAGE("decompose: error test A3", impDecomposeComposeTest(fSX, -fSY, 0.0, 0.0));
-        CPPUNIT_ASSERT_MESSAGE("decompose: error test A4", impDecomposeComposeTest(-fSX, -fSY, 0.0, 0.0));
-
-        // check all possible scaling combinations with positive rotation
-        CPPUNIT_ASSERT_MESSAGE("decompose: error test B1", impDecomposeComposeTest(fSX, fSY, 0.0, fR));
-        CPPUNIT_ASSERT_MESSAGE("decompose: error test B2", impDecomposeComposeTest(-fSX, fSY, 0.0, fR));
-        CPPUNIT_ASSERT_MESSAGE("decompose: error test B3", impDecomposeComposeTest(fSX, -fSY, 0.0, fR));
-        CPPUNIT_ASSERT_MESSAGE("decompose: error test B4", impDecomposeComposeTest(-fSX, -fSY, 0.0, fR));
-
-        // check all possible scaling combinations with negative rotation
-        CPPUNIT_ASSERT_MESSAGE("decompose: error test C1", impDecomposeComposeTest(fSX, fSY, 0.0, -fR));
-        CPPUNIT_ASSERT_MESSAGE("decompose: error test C2", impDecomposeComposeTest(-fSX, fSY, 0.0, -fR));
-        CPPUNIT_ASSERT_MESSAGE("decompose: error test C3", impDecomposeComposeTest(fSX, -fSY, 0.0, -fR));
-        CPPUNIT_ASSERT_MESSAGE("decompose: error test C4", impDecomposeComposeTest(-fSX, -fSY, 0.0, -fR));
-
-        // check all possible scaling combinations with positive shear
-        CPPUNIT_ASSERT_MESSAGE("decompose: error test D1", impDecomposeComposeTest(fSX, fSY, tan(fS), 0.0));
-        CPPUNIT_ASSERT_MESSAGE("decompose: error test D2", impDecomposeComposeTest(-fSX, fSY, tan(fS), 0.0));
-        CPPUNIT_ASSERT_MESSAGE("decompose: error test D3", impDecomposeComposeTest(fSX, -fSY, tan(fS), 0.0));
-        CPPUNIT_ASSERT_MESSAGE("decompose: error test D4", impDecomposeComposeTest(-fSX, -fSY, tan(fS), 0.0));
-
-        // check all possible scaling combinations with negative shear
-        CPPUNIT_ASSERT_MESSAGE("decompose: error test E1", impDecomposeComposeTest(fSX, fSY, tan(-fS), 0.0));
-        CPPUNIT_ASSERT_MESSAGE("decompose: error test E2", impDecomposeComposeTest(-fSX, fSY, tan(-fS), 0.0));
-        CPPUNIT_ASSERT_MESSAGE("decompose: error test E3", impDecomposeComposeTest(fSX, -fSY, tan(-fS), 0.0));
-        CPPUNIT_ASSERT_MESSAGE("decompose: error test E4", impDecomposeComposeTest(-fSX, -fSY, tan(-fS), 0.0));
-
-        // check all possible scaling combinations with positive rotate and positive shear
-        CPPUNIT_ASSERT_MESSAGE("decompose: error test F1", impDecomposeComposeTest(fSX, fSY, tan(fS), fR));
-        CPPUNIT_ASSERT_MESSAGE("decompose: error test F2", impDecomposeComposeTest(-fSX, fSY, tan(fS), fR));
-        CPPUNIT_ASSERT_MESSAGE("decompose: error test F3", impDecomposeComposeTest(fSX, -fSY, tan(fS), fR));
-        CPPUNIT_ASSERT_MESSAGE("decompose: error test F4", impDecomposeComposeTest(-fSX, -fSY, tan(fS), fR));
-
-        // check all possible scaling combinations with negative rotate and positive shear
-        CPPUNIT_ASSERT_MESSAGE("decompose: error test G1", impDecomposeComposeTest(fSX, fSY, tan(fS), -fR));
-        CPPUNIT_ASSERT_MESSAGE("decompose: error test G2", impDecomposeComposeTest(-fSX, fSY, tan(fS), -fR));
-        CPPUNIT_ASSERT_MESSAGE("decompose: error test G3", impDecomposeComposeTest(fSX, -fSY, tan(fS), -fR));
-        CPPUNIT_ASSERT_MESSAGE("decompose: error test G4", impDecomposeComposeTest(-fSX, -fSY, tan(fS), -fR));
-
-        // check all possible scaling combinations with positive rotate and negative shear
-        CPPUNIT_ASSERT_MESSAGE("decompose: error test H1", impDecomposeComposeTest(fSX, fSY, tan(-fS), fR));
-        CPPUNIT_ASSERT_MESSAGE("decompose: error test H2", impDecomposeComposeTest(-fSX, fSY, tan(-fS), fR));
-        CPPUNIT_ASSERT_MESSAGE("decompose: error test H3", impDecomposeComposeTest(fSX, -fSY, tan(-fS), fR));
-        CPPUNIT_ASSERT_MESSAGE("decompose: error test H4", impDecomposeComposeTest(-fSX, -fSY, tan(-fS), fR));
-
-        // check all possible scaling combinations with negative rotate and negative shear
-        CPPUNIT_ASSERT_MESSAGE("decompose: error test I1", impDecomposeComposeTest(fSX, fSY, tan(-fS), -fR));
-        CPPUNIT_ASSERT_MESSAGE("decompose: error test I2", impDecomposeComposeTest(-fSX, fSY, tan(-fS), -fR));
-        CPPUNIT_ASSERT_MESSAGE("decompose: error test I3", impDecomposeComposeTest(fSX, -fSY, tan(-fS), -fR));
-        CPPUNIT_ASSERT_MESSAGE("decompose: error test I4", impDecomposeComposeTest(-fSX, -fSY, tan(-fS), -fR));
-
-        // cover special case of 180 degree rotation
-        B2DHomMatrix aTest=utils::createScaleShearXRotateTranslateB2DHomMatrix(
-            6425,3938,
-            0,
-            F_PI,
-            10482,4921);
-        // decompose that matrix
-        B2DTuple aDScale;
-        B2DTuple aDTrans;
-        double fDRot;
-        double fDShX;
-        aTest.decompose(aDScale, aDTrans, fDRot, fDShX);
-        CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("decompose: error test J1", 6425.0, aDScale.getX(), 1E-12);
-        CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("decompose: error test J1", 3938.0, aDScale.getY(), 1E-12);
-        CPPUNIT_ASSERT_MESSAGE("decompose: error test J1", aDTrans.getX() == 10482 && aDTrans.getY() == 4921);
-        CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("decompose: error test J1", F_PI, fDRot, 1E-12 );
-    }
-
-    // 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(b2dhommatrix);
-    CPPUNIT_TEST(equal);
-    CPPUNIT_TEST(identity);
-    CPPUNIT_TEST(scale);
-    CPPUNIT_TEST(translate);
-    CPPUNIT_TEST(rotate);
-    CPPUNIT_TEST(shear);
-    CPPUNIT_TEST(multiply);
-    CPPUNIT_TEST(decompose);
-    CPPUNIT_TEST_SUITE_END();
-
-}; // class b2dhommatrix
-
-class b2dpoint : public CppUnit::TestFixture
-{
-public:
-    // insert your test code here.
-    // this is only demonstration code
-    void EmptyMethod()
-    {
-          // CPPUNIT_ASSERT_MESSAGE("a message", 1 == 1);
-    }
-
-    // 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(b2dpoint);
-    CPPUNIT_TEST(EmptyMethod);
-    CPPUNIT_TEST_SUITE_END();
-}; // class b2dpoint
-
-class b2dpolygon : public CppUnit::TestFixture
-{
-public:
-    // insert your test code here.
-    void testBasics()
-    {
-        B2DPolygon aPoly;
-
-        aPoly.appendBezierSegment(B2DPoint(1,1),B2DPoint(2,2),B2DPoint(3,3));
-
-        CPPUNIT_ASSERT_EQUAL_MESSAGE("#1 first polygon point wrong",
-                               B2DPoint(3,3), aPoly.getB2DPoint(0));
-        CPPUNIT_ASSERT_EQUAL_MESSAGE("#1 first control point wrong",
-                               B2DPoint(2,2), aPoly.getPrevControlPoint(0));
-        CPPUNIT_ASSERT_EQUAL_MESSAGE("#1 second control point wrong",
-                               B2DPoint(3,3), aPoly.getNextControlPoint(0));
-        CPPUNIT_ASSERT_MESSAGE("next control point not used",
-                               !aPoly.isNextControlPointUsed(0));
-
-        aPoly.setNextControlPoint(0,B2DPoint(4,4));
-        CPPUNIT_ASSERT_EQUAL_MESSAGE("#1.1 second control point wrong",
-                               B2DPoint(4,4), aPoly.getNextControlPoint(0));
-        CPPUNIT_ASSERT_MESSAGE("next control point used",
-                               aPoly.isNextControlPointUsed(0));
-        CPPUNIT_ASSERT_MESSAGE("areControlPointsUsed() wrong",
-                               aPoly.areControlPointsUsed());
-        CPPUNIT_ASSERT_EQUAL_MESSAGE("getContinuityInPoint() wrong",
-                               B2VectorContinuity::C2, aPoly.getContinuityInPoint(0));
-
-        aPoly.resetControlPoints();
-        CPPUNIT_ASSERT_EQUAL_MESSAGE("resetControlPoints() did not clear",
-                               B2DPoint(3,3), aPoly.getB2DPoint(0));
-        CPPUNIT_ASSERT_EQUAL_MESSAGE("resetControlPoints() did not clear",
-                               B2DPoint(3,3), aPoly.getPrevControlPoint(0));
-        CPPUNIT_ASSERT_EQUAL_MESSAGE("resetControlPoints() did not clear",
-                               B2DPoint(3,3), aPoly.getNextControlPoint(0));
-        CPPUNIT_ASSERT_MESSAGE("areControlPointsUsed() wrong #2",
-                               !aPoly.areControlPointsUsed());
-
-        aPoly.clear();
-        aPoly.append(B2DPoint(0,0));
-        aPoly.appendBezierSegment(B2DPoint(1,1),B2DPoint(2,2),B2DPoint(3,3));
-
-        CPPUNIT_ASSERT_EQUAL_MESSAGE("#2 first polygon point wrong",
-                               B2DPoint(0,0), aPoly.getB2DPoint(0));
-        CPPUNIT_ASSERT_EQUAL_MESSAGE("#2 first control point wrong",
-                               B2DPoint(0,0), aPoly.getPrevControlPoint(0));
-        CPPUNIT_ASSERT_EQUAL_MESSAGE("#2 second control point wrong",
-                               B2DPoint(1,1), aPoly.getNextControlPoint(0));
-        CPPUNIT_ASSERT_EQUAL_MESSAGE("#2 third control point wrong",
-                               B2DPoint(2,2), aPoly.getPrevControlPoint(1));
-        CPPUNIT_ASSERT_EQUAL_MESSAGE("#2 fourth control point wrong",
-                               B2DPoint(3,3), aPoly.getNextControlPoint(1));
-        CPPUNIT_ASSERT_EQUAL_MESSAGE("#2 second polygon point wrong",
-                               B2DPoint(3,3), aPoly.getB2DPoint(1));
-    }
-    // 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(b2dpolygon);
-    CPPUNIT_TEST(testBasics);
-    CPPUNIT_TEST_SUITE_END();
-}; // class b2dpolygon
-
-class b2dpolygontools : public CppUnit::TestFixture
-{
-public:
-    // insert your test code here.
-    // this is only demonstration code
-    void testIsRectangle()
-    {
-        B2DPolygon aRect1(
-            utils::createPolygonFromRect(
-                B2DRange(0,0,1,1) ) );
-
-        B2DPolygon aRect2 {
-            {0, 0},
-            {1, 0},
-            {1, 0.5},
-            {1, 1},
-            {0, 1}
-        };
-        aRect2.setClosed(true);
-
-        B2DPolygon aNonRect1 {
-            {0, 0},
-            {1, 0},
-            {0.5, 1},
-            {0.5, 0}
-        };
-        aNonRect1.setClosed(true);
-
-        B2DPolygon aNonRect2 {
-            {0, 0},
-            {1, 1},
-            {1, 0},
-            {0, 1}
-        };
-        aNonRect2.setClosed(true);
-
-        B2DPolygon aNonRect3 {
-            {0, 0},
-            {1, 0},
-            {1, 1}
-        };
-        aNonRect3.setClosed(true);
-
-        B2DPolygon aNonRect4 {
-            {0, 0},
-            {1, 0},
-            {1, 1},
-            {0, 1}
-        };
-
-        B2DPolygon aNonRect5 {
-            {0, 0},
-            {1, 0},
-            {1, 1},
-            {0, 1}
-        };
-        aNonRect5.setControlPoints(1, B2DPoint(1,0), B2DPoint(-11,0));
-        aNonRect5.setClosed(true);
-
-        CPPUNIT_ASSERT_MESSAGE("checking rectangle-ness of rectangle 1",
-                               utils::isRectangle( aRect1 ));
-        CPPUNIT_ASSERT_MESSAGE("checking rectangle-ness of rectangle 2",
-                               utils::isRectangle( aRect2 ));
-        CPPUNIT_ASSERT_MESSAGE("checking non-rectangle-ness of polygon 1",
-                               !utils::isRectangle( aNonRect1 ));
-        CPPUNIT_ASSERT_MESSAGE("checking non-rectangle-ness of polygon 2",
-                               !utils::isRectangle( aNonRect2 ));
-        CPPUNIT_ASSERT_MESSAGE("checking non-rectangle-ness of polygon 3",
-                               !utils::isRectangle( aNonRect3 ));
-        CPPUNIT_ASSERT_MESSAGE("checking non-rectangle-ness of polygon 4",
-                               !utils::isRectangle( aNonRect4 ));
-        CPPUNIT_ASSERT_MESSAGE("checking non-rectangle-ness of polygon 5",
-                               !utils::isRectangle( aNonRect5 ));
-    }
-
-    // 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(b2dpolygontools);
-    CPPUNIT_TEST(testIsRectangle);
-    CPPUNIT_TEST_SUITE_END();
-}; // class b2dpolygontools
-
-class b2dpolypolygon : public CppUnit::TestFixture
-{
-public:
-    // insert your test code here.
-    void testTrapezoidHelper()
-    {
-        B2DPolygon aPolygon;
-        // provoke the PointBlockAllocator to exercise the freeIfLast path
-        for(int i = 0; i < 16 * 10; i++)
-        {
-            B2DPoint aPoint(getRandomOrdinal(1000), getRandomOrdinal(1000));
-            aPolygon.append(aPoint);
-        }
-        // scatter some duplicate points in to stress things more.
-        for(int i = 0; i < 16 * 10; i++)
-        {
-            aPolygon.insert(getRandomOrdinal(aPolygon.count() - 1),
-                            aPolygon.getB2DPoint(getRandomOrdinal(aPolygon.count() - 1)));
-        }
-        B2DPolygon aPolygonOffset;
-        // duplicate the polygon and offset it slightly.
-        for(size_t i = 0; i < aPolygon.count(); i++)
-        {
-            B2DPoint aPoint(aPolygon.getB2DPoint(i));
-            aPoint += B2DPoint(0.5-getRandomOrdinal(1),0.5-getRandomOrdinal(1));
-            aPolygonOffset.append(aPoint);
-        }
-        B2DPolyPolygon aPolyPolygon;
-        aPolyPolygon.append(aPolygon);
-        aPolyPolygon.append(aPolygonOffset);
-        B2DTrapezoidVector aVector;
-        basegfx::utils::trapezoidSubdivide(aVector, aPolyPolygon);
-        CPPUNIT_ASSERT_MESSAGE("more than zero sub-divided trapezoids",
-                               !aVector.empty());
-    }
-
-    // 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(b2dpolypolygon);
-    CPPUNIT_TEST(testTrapezoidHelper);
-    CPPUNIT_TEST_SUITE_END();
-}; // class b2dpolypolygon
-
-class b1Xrange : public CppUnit::TestFixture
-{
-public:
-    template<class Type> void implCheck()
-    {
-        // test interval axioms
-        // (http://en.wikipedia.org/wiki/Interval_%28mathematics%29)
-        Type aRange;
-        CPPUNIT_ASSERT_MESSAGE("default ctor - empty range", aRange.isEmpty());
-        CPPUNIT_ASSERT_MESSAGE("center - get cop-out value since range is empty", aRange.getCenter()==0);
-
-        // degenerate interval
-        aRange.expand(1);
-        CPPUNIT_ASSERT_MESSAGE("degenerate range - still, not empty!", !aRange.isEmpty());
-        CPPUNIT_ASSERT_MESSAGE("degenerate range - size of 0", aRange.getRange() == 0);
-        CPPUNIT_ASSERT_MESSAGE("same value as degenerate range - is inside range", aRange.isInside(1));
-        CPPUNIT_ASSERT_MESSAGE("center - must be the single range value", aRange.getCenter()==1);
-
-        // proper interval
-        aRange.expand(2);
-        CPPUNIT_ASSERT_MESSAGE("proper range - size of 1", aRange.getRange() == 1);
-        CPPUNIT_ASSERT_MESSAGE("smaller value of range - is inside *closed* range", aRange.isInside(1));
-        CPPUNIT_ASSERT_MESSAGE("larger value of range - is inside *closed* range", aRange.isInside(2));
-
-        // center for proper interval that works for ints, too
-        aRange.expand(3);
-        CPPUNIT_ASSERT_MESSAGE("center - must be half of the range", aRange.getCenter()==2);
-
-        // check overlap
-        Type aRange2(0,1);
-        CPPUNIT_ASSERT_MESSAGE("range overlapping *includes* upper bound", aRange.overlaps(aRange2));
-        CPPUNIT_ASSERT_MESSAGE("range overlapping *includes* upper bound, but only barely", !aRange.overlapsMore(aRange2));
-
-        Type aRange3(0,2);
-        CPPUNIT_ASSERT_MESSAGE("range overlapping is fully overlapping now", aRange.overlapsMore(aRange3));
-
-        // check intersect
-        Type aRange4(3,4);
-        aRange.intersect(aRange4);
-        CPPUNIT_ASSERT_MESSAGE("range intersection is yielding empty range!", !aRange.isEmpty());
-
-        Type aRange5(5,6);
-        aRange.intersect(aRange5);
-        CPPUNIT_ASSERT_MESSAGE("range intersection is yielding nonempty range!", aRange.isEmpty());
-    }
-
-    void check()
-    {
-        implCheck<B1DRange>();
-    }
-
-    // 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(b1Xrange);
-    CPPUNIT_TEST(check);
-    CPPUNIT_TEST_SUITE_END();
-}; // class b1Xrange
-
-class b2Xrange : public CppUnit::TestFixture
-{
-public:
-    template<class Type> void implCheck()
-    {
-        // cohen sutherland clipping
-        Type aRange(0,0,10,10);
-
-        CPPUNIT_ASSERT_MESSAGE("(0,0) is outside range!",
-                               utils::getCohenSutherlandClipFlags(B2IPoint(0,0),aRange) == 0);
-        CPPUNIT_ASSERT_MESSAGE("(-1,-1) is inside range!",
-                               utils::getCohenSutherlandClipFlags(B2IPoint(-1,-1),aRange) ==
-                               (utils::RectClipFlags::LEFT|utils::RectClipFlags::TOP));
-        CPPUNIT_ASSERT_MESSAGE("(10,10) is outside range!",
-                               utils::getCohenSutherlandClipFlags(B2IPoint(10,10),aRange) == 0);
-        CPPUNIT_ASSERT_MESSAGE("(11,11) is inside range!",
-                               utils::getCohenSutherlandClipFlags(B2IPoint(11,11),aRange) ==
-                               (utils::RectClipFlags::RIGHT|utils::RectClipFlags::BOTTOM));
-    }
-
-    void check()
-    {
-        implCheck<B2DRange>();
-        implCheck<B2IRange>();
-    }
-
-    // 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(b2Xrange);
-    CPPUNIT_TEST(check);
-    CPPUNIT_TEST_SUITE_END();
-}; // class b2Xrange
-
-class b2ibox : public CppUnit::TestFixture
-{
-public:
-    void TestBox()
-    {
-        // cohen sutherland clipping
-        B2IBox aBox(0,0,10,10);
-
-        CPPUNIT_ASSERT_EQUAL_MESSAGE("(0,0) is outside range!",
-                               sal_uInt32(0), utils::getCohenSutherlandClipFlags(B2IPoint(0,0),aBox));
-        CPPUNIT_ASSERT_EQUAL_MESSAGE("(-1,-1) is inside range!",
-                               utils::RectClipFlags::LEFT|utils::RectClipFlags::TOP,
-                               utils::getCohenSutherlandClipFlags(B2IPoint(-1,-1),aBox));
-        CPPUNIT_ASSERT_EQUAL_MESSAGE("(9,9) is outside range!",
-                               sal_uInt32(0), utils::getCohenSutherlandClipFlags(B2IPoint(9,9),aBox));
-        CPPUNIT_ASSERT_EQUAL_MESSAGE("(10,10) is inside range!",
-                               utils::RectClipFlags::RIGHT|utils::RectClipFlags::BOTTOM,
-                               utils::getCohenSutherlandClipFlags(B2IPoint(10,10),aBox));
-    }
-
-    // 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(b2ibox);
-    CPPUNIT_TEST(TestBox);
-    CPPUNIT_TEST_SUITE_END();
-}; // class b2ibox
-
-class b2dtuple : public CppUnit::TestFixture
-{
-public:
-    // insert your test code here.
-    // this is only demonstration code
-    void EmptyMethod()
-    {
-          // CPPUNIT_ASSERT_MESSAGE("a message", 1 == 1);
-    }
-
-    // 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(b2dtuple);
-    CPPUNIT_TEST(EmptyMethod);
-    CPPUNIT_TEST_SUITE_END();
-}; // class b2dtuple
-
-class bcolor : public CppUnit::TestFixture
-{
-    BColor maWhite;
-    BColor maBlack;
-    BColor maRed;
-    BColor maGreen;
-    BColor maBlue;
-    BColor maYellow;
-    BColor maMagenta;
-    BColor maCyan;
-
-public:
-    bcolor() :
-        maWhite(1,1,1),
-        maBlack(0,0,0),
-        maRed(1,0,0),
-        maGreen(0,1,0),
-        maBlue(0,0,1),
-        maYellow(1,1,0),
-        maMagenta(1,0,1),
-        maCyan(0,1,1)
-    {}
-
-    // insert your test code here.
-    void hslTest()
-    {
-        CPPUNIT_ASSERT_EQUAL_MESSAGE("white",
-                               BColor(0,0,1), utils::rgb2hsl(maWhite));
-        CPPUNIT_ASSERT_EQUAL_MESSAGE("black",
-                               BColor(0,0,0), utils::rgb2hsl(maBlack));
-        CPPUNIT_ASSERT_EQUAL_MESSAGE("red",
-                               BColor(0,1,0.5), utils::rgb2hsl(maRed));
-        CPPUNIT_ASSERT_EQUAL_MESSAGE("green",
-                               BColor(120,1,0.5), utils::rgb2hsl(maGreen));
-        CPPUNIT_ASSERT_EQUAL_MESSAGE("blue",
-                               BColor(240,1,0.5), utils::rgb2hsl(maBlue));
-        CPPUNIT_ASSERT_EQUAL_MESSAGE("yellow",
-                               BColor(60,1,0.5), utils::rgb2hsl(maYellow));
-        CPPUNIT_ASSERT_EQUAL_MESSAGE("magenta",
-                               BColor(300,1,0.5), utils::rgb2hsl(maMagenta));
-        CPPUNIT_ASSERT_EQUAL_MESSAGE("cyan",
-                               BColor(180,1,0.5), utils::rgb2hsl(maCyan));
-        CPPUNIT_ASSERT_EQUAL_MESSAGE("third hue case",
-                               BColor(210,1,0.5), utils::rgb2hsl(BColor(0,0.5,1)));
-
-        CPPUNIT_ASSERT_EQUAL_MESSAGE("roundtrip white",
-                               maWhite, utils::hsl2rgb(utils::rgb2hsl(maWhite)));
-        CPPUNIT_ASSERT_EQUAL_MESSAGE("roundtrip black",
-                               maBlack, utils::hsl2rgb(utils::rgb2hsl(maBlack)));
-        CPPUNIT_ASSERT_EQUAL_MESSAGE("roundtrip red",
-                               maRed, utils::hsl2rgb(utils::rgb2hsl(maRed)));
-        CPPUNIT_ASSERT_EQUAL_MESSAGE("roundtrip green",
-                               maGreen, utils::hsl2rgb(utils::rgb2hsl(maGreen)));
-        CPPUNIT_ASSERT_EQUAL_MESSAGE("roundtrip blue",
-                               maBlue, utils::hsl2rgb(utils::rgb2hsl(maBlue)));
-        CPPUNIT_ASSERT_EQUAL_MESSAGE("roundtrip yellow",

... etc. - the rest is truncated


More information about the Libreoffice-commits mailing list