svx/qa/unit/customshapes.cxx | 20 +++++++++++++++ svx/qa/unit/data/tdf125782_QuadraticCurveTo.odg |binary svx/source/customshapes/EnhancedCustomShape2d.cxx | 28 ++++++++-------------- 3 files changed, 31 insertions(+), 17 deletions(-)
New commits: commit 39599fc689364b70cf83e834a5742cc2181b13b0 Author: Regina Henschel <rb.hensc...@t-online.de> AuthorDate: Sat Jun 8 21:49:50 2019 +0200 Commit: Regina Henschel <rb.hensc...@t-online.de> CommitDate: Mon Jun 10 20:00:58 2019 +0200 tdf#125782 use correct 'current point' for quadraticcurveto Use the same way to get the 'current point' as in command arcangleto. The error was visible in shape teardrop. Change-Id: Ie7af2b9111150bae7e3ea492eeb439a0cc2bfe7c Reviewed-on: https://gerrit.libreoffice.org/73723 Tested-by: Jenkins Reviewed-by: Regina Henschel <rb.hensc...@t-online.de> diff --git a/svx/qa/unit/customshapes.cxx b/svx/qa/unit/customshapes.cxx index 6426d72ab970..b70a8e536218 100644 --- a/svx/qa/unit/customshapes.cxx +++ b/svx/qa/unit/customshapes.cxx @@ -393,6 +393,26 @@ CPPUNIT_TEST_FIXTURE(CustomshapesTest, testTdf115813_OOXML_XY_handle) } CPPUNIT_ASSERT_EQUAL(OUString(), sErrors); } + +CPPUNIT_TEST_FIXTURE(CustomshapesTest, testQuadraticCurveTo) +{ + // tdf125782 command Q (quadraticcurveto) uses wrong 'current point'. + // When converting to cubic Bezier curve, this had resulted in a wrong first control point. + // The quadraticcurveto segment starts in shape center in the test file. The first control + // point should produce a horizontal tangent in the start point. + const OUString sFileName("tdf125782_QuadraticCurveTo.odg"); + const OUString sURL = m_directories.getURLFromSrc(sDataDirectory) + sFileName; + mxComponent = loadFromDesktop(sURL, "com.sun.star.comp.drawing.DrawingDocument"); + CPPUNIT_ASSERT_MESSAGE("Could not load document", mxComponent.is()); + uno::Reference<drawing::XShape> xShape(getShape(0)); + uno::Reference<beans::XPropertySet> xShapeProps(xShape, uno::UNO_QUERY); + CPPUNIT_ASSERT_MESSAGE("Could not get the shape properties", xShapeProps.is()); + awt::Rectangle aBoundRect; + xShapeProps->getPropertyValue(UNO_NAME_MISC_OBJ_BOUNDRECT) >>= aBoundRect; + const double fHeight = static_cast<double>(aBoundRect.Height); + //Add some tolerance + CPPUNIT_ASSERT_DOUBLES_EQUAL_MESSAGE("bad height of quadraticcurveto", 3004, fHeight, 10.0); +} } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/svx/qa/unit/data/tdf125782_QuadraticCurveTo.odg b/svx/qa/unit/data/tdf125782_QuadraticCurveTo.odg new file mode 100644 index 000000000000..ba7b495367ce Binary files /dev/null and b/svx/qa/unit/data/tdf125782_QuadraticCurveTo.odg differ diff --git a/svx/source/customshapes/EnhancedCustomShape2d.cxx b/svx/source/customshapes/EnhancedCustomShape2d.cxx index 256b96cd5362..482650fdf9d0 100644 --- a/svx/source/customshapes/EnhancedCustomShape2d.cxx +++ b/svx/source/customshapes/EnhancedCustomShape2d.cxx @@ -2292,27 +2292,21 @@ void EnhancedCustomShape2d::CreateSubPath( { for ( sal_Int32 i(0); ( i < nPntCount ) && ( rSrcPt + 1 < nCoordSize ); i++ ) { - if ( rSrcPt ) + DBG_ASSERT(aNewB2DPolygon.count(), "EnhancedCustomShape2d::CreateSubPath: Error no previous point for Q (!)"); + if (aNewB2DPolygon.count() > 0) { - const Point aPreviousEndPoint(GetPoint( seqCoordinates[ rSrcPt - 1 ], true, true)); - const Point aControlQ(GetPoint( seqCoordinates[ rSrcPt++ ], true, true )); - const Point aEnd(GetPoint( seqCoordinates[ rSrcPt++ ], true, true )); - const Point aControlA((aPreviousEndPoint + (aControlQ * 2)) / 3); - const Point aControlB(((aControlQ * 2) + aEnd) / 3); - - DBG_ASSERT(aNewB2DPolygon.count(), "EnhancedCustomShape2d::CreateSubPath: Error in adding Q control point (!)"); - aNewB2DPolygon.appendBezierSegment( - basegfx::B2DPoint(aControlA.X(), aControlA.Y()), - basegfx::B2DPoint(aControlB.X(), aControlB.Y()), - basegfx::B2DPoint(aEnd.X(), aEnd.Y())); + const basegfx::B2DPoint aPreviousEndPoint(aNewB2DPolygon.getB2DPoint(aNewB2DPolygon.count()-1)); + const basegfx::B2DPoint aControlQ(GetPointAsB2DPoint( seqCoordinates[ rSrcPt++ ], true, true )); + const basegfx::B2DPoint aEnd(GetPointAsB2DPoint( seqCoordinates[ rSrcPt++ ], true, true )); + const basegfx::B2DPoint aControlA((aPreviousEndPoint + (aControlQ * 2)) / 3); + const basegfx::B2DPoint aControlB(((aControlQ * 2) + aEnd) / 3); + aNewB2DPolygon.appendBezierSegment(aControlA, aControlB, aEnd); } - else // no previous point , do a moveto + else // no previous point; ill structured path, but try to draw as much as possible { rSrcPt++; // skip control point - const Point aEnd(GetPoint( seqCoordinates[ rSrcPt++ ], true, true )); - - DBG_ASSERT(aNewB2DPolygon.count(), "EnhancedCustomShape2d::CreateSubPath: Error in adding Q control point (!)"); - aNewB2DPolygon.append(basegfx::B2DPoint(aEnd.X(), aEnd.Y())); + const basegfx::B2DPoint aEnd(GetPointAsB2DPoint( seqCoordinates[ rSrcPt++ ], true, true )); + aNewB2DPolygon.append(aEnd); } } } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits