basegfx/source/polygon/b2dpolygon.cxx | 22 ++++++++++++++++++++++ basegfx/source/polygon/b2dsvgpolypolygon.cxx | 8 +------- basegfx/test/B2DPolygonTest.cxx | 21 +++++++++++++++++++-- include/basegfx/polygon/b2dpolygon.hxx | 9 ++++++++- 4 files changed, 50 insertions(+), 10 deletions(-)
New commits: commit 80eb3fd393dd6d67f931c03b261b2558c7198da2 Author: Tomaž Vajngerl <tomaz.vajng...@collabora.co.uk> AuthorDate: Tue Jun 25 10:45:48 2019 +0900 Commit: Tomaž Vajngerl <qui...@gmail.com> CommitDate: Fri Jun 28 03:15:08 2019 +0200 add appendQuadraticBezierSegment to B2DPolygon This adds a convenience method to B2DPolygon to add a quadratic bezier segment, which converts its one control point to two control points of a cubic bezier segment. The SVG path import is also modified to use this new method instead of converting inside the importer itself. Change-Id: I96e9b306066d9ccf2542b17a117db01fa235f405 Reviewed-on: https://gerrit.libreoffice.org/74809 Tested-by: Jenkins Reviewed-by: Tomaž Vajngerl <qui...@gmail.com> diff --git a/basegfx/source/polygon/b2dpolygon.cxx b/basegfx/source/polygon/b2dpolygon.cxx index 54d2844c3821..87343028ecfe 100644 --- a/basegfx/source/polygon/b2dpolygon.cxx +++ b/basegfx/source/polygon/b2dpolygon.cxx @@ -1330,6 +1330,28 @@ namespace basegfx } } + void B2DPolygon::appendQuadraticBezierSegment(const B2DPoint& rControlPoint, const B2DPoint& rPoint) + { + if (mpPolygon->count() == 0) + { + mpPolygon->append(rPoint); + const double nX((rControlPoint.getX() * 2.0 + rPoint.getX()) / 3.0); + const double nY((rControlPoint.getY() * 2.0 + rPoint.getY()) / 3.0); + setPrevControlPoint(0, B2DPoint(nX, nY)); + } + else + { + const B2DPoint aPreviousPoint(mpPolygon->getPoint(mpPolygon->count() - 1)); + + const double nX1((rControlPoint.getX() * 2.0 + aPreviousPoint.getX()) / 3.0); + const double nY1((rControlPoint.getY() * 2.0 + aPreviousPoint.getY()) / 3.0); + const double nX2((rControlPoint.getX() * 2.0 + rPoint.getX()) / 3.0); + const double nY2((rControlPoint.getY() * 2.0 + rPoint.getY()) / 3.0); + + appendBezierSegment(B2DPoint(nX1, nY1), B2DPoint(nX2, nY2), rPoint); + } + } + bool B2DPolygon::areControlPointsUsed() const { return mpPolygon->areControlPointsUsed(); diff --git a/basegfx/source/polygon/b2dsvgpolypolygon.cxx b/basegfx/source/polygon/b2dsvgpolypolygon.cxx index 43ad5ee95596..991e50bf60f0 100644 --- a/basegfx/source/polygon/b2dsvgpolypolygon.cxx +++ b/basegfx/source/polygon/b2dsvgpolypolygon.cxx @@ -375,12 +375,6 @@ namespace basegfx nY += nLastY; } - // calculate the cubic bezier coefficients from the quadratic ones - const double nX1Prime((nX1 * 2.0 + nLastX) / 3.0); - const double nY1Prime((nY1 * 2.0 + nLastY) / 3.0); - const double nX2Prime((nX1 * 2.0 + nX) / 3.0); - const double nY2Prime((nY1 * 2.0 + nY) / 3.0); - // ensure existence of start point if(!aCurrPoly.count()) { @@ -388,7 +382,7 @@ namespace basegfx } // append curved edge - aCurrPoly.appendBezierSegment(B2DPoint(nX1Prime, nY1Prime), B2DPoint(nX2Prime, nY2Prime), B2DPoint(nX, nY)); + aCurrPoly.appendQuadraticBezierSegment(B2DPoint(nX1, nY1), B2DPoint(nX, nY)); // set last position nLastX = nX; diff --git a/basegfx/test/B2DPolygonTest.cxx b/basegfx/test/B2DPolygonTest.cxx index 0bb3f15dfdbe..581108b960a5 100644 --- a/basegfx/test/B2DPolygonTest.cxx +++ b/basegfx/test/B2DPolygonTest.cxx @@ -29,7 +29,7 @@ namespace basegfx class b2dpolygon : public CppUnit::TestFixture { public: - void testBasics() + void testCubicBezier() { B2DPolygon aPoly; @@ -78,12 +78,29 @@ public: aPoly.getB2DPoint(1)); } + void testQuadraticBezier() + { + B2DPolygon aPoly; + + aPoly.appendQuadraticBezierSegment(B2DPoint(0, 0), B2DPoint(3, 3)); + + CPPUNIT_ASSERT_EQUAL_MESSAGE("polygon size is wrong", sal_uInt32(1), aPoly.count()); + CPPUNIT_ASSERT_EQUAL_MESSAGE("first polygon point wrong", B2DPoint(3, 3), + aPoly.getB2DPoint(0)); + CPPUNIT_ASSERT_EQUAL_MESSAGE("first control point wrong", B2DPoint(1, 1), + aPoly.getPrevControlPoint(0)); + CPPUNIT_ASSERT_EQUAL_MESSAGE("second control point wrong", B2DPoint(3, 3), + aPoly.getNextControlPoint(0)); + CPPUNIT_ASSERT_MESSAGE("next control point not used", !aPoly.isNextControlPointUsed(0)); + } + // 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(testCubicBezier); + CPPUNIT_TEST(testQuadraticBezier); CPPUNIT_TEST_SUITE_END(); }; // class b2dpolygon diff --git a/include/basegfx/polygon/b2dpolygon.hxx b/include/basegfx/polygon/b2dpolygon.hxx index b27a56ed27d2..cbef3159705b 100644 --- a/include/basegfx/polygon/b2dpolygon.hxx +++ b/include/basegfx/polygon/b2dpolygon.hxx @@ -99,7 +99,14 @@ namespace basegfx void resetControlPoints(); /// Bezier segment append with control points. The current last polygon point is implicitly taken as start point. - void appendBezierSegment(const basegfx::B2DPoint& rNextControlPoint, const basegfx::B2DPoint& rPrevControlPoint, const basegfx::B2DPoint& rPoint); + void appendBezierSegment(const basegfx::B2DPoint& rNextControlPoint, + const basegfx::B2DPoint& rPrevControlPoint, + const basegfx::B2DPoint& rPoint); + + /// This is a shortcut to append a quadratic bezier segment. The current last polygon point is implicitly taken as start point. + /// Note that the quadratic bezier control points will be converted to cubic bezier with 2 control points. + void appendQuadraticBezierSegment(const basegfx::B2DPoint& rQuadControlPoint, + const basegfx::B2DPoint& rPoint); /// ControlPoint checks bool areControlPointsUsed() const; _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits