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

Reply via email to