From a312837a1a4d0b9628d5c587c8ab5ec68179a051 Mon Sep 17 00:00:00 2001 From: Regina Henschel Date: Mon, 24 May 2021 23:25:58 +0200 Subject: tdf#137314 apply conversion from vml angle unit 'fd' Fixes wrong rotation in tdf#109129 and tdf#142432 too, but they have further, unrelated errors. Change-Id: I7bd56876bb42b261fe425f80cf9beb639c3ac276 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/116078 Tested-by: Jenkins Reviewed-by: Regina Henschel --- .../unit/data/tdf137314_vml_rotation_unit_fd.docx | Bin 0 -> 18070 bytes oox/qa/unit/vml.cxx | 23 +++++++++++++++++++++ oox/source/vml/vmlshape.cxx | 7 +++---- 3 files changed, 26 insertions(+), 4 deletions(-) create mode 100644 oox/qa/unit/data/tdf137314_vml_rotation_unit_fd.docx diff --git a/oox/qa/unit/data/tdf137314_vml_rotation_unit_fd.docx b/oox/qa/unit/data/tdf137314_vml_rotation_unit_fd.docx new file mode 100644 index 000000000000..17c8cabc0ce9 Binary files /dev/null and b/oox/qa/unit/data/tdf137314_vml_rotation_unit_fd.docx differ diff --git a/oox/qa/unit/vml.cxx b/oox/qa/unit/vml.cxx index 0306333adcb0..4045b0336c7f 100644 --- a/oox/qa/unit/vml.cxx +++ b/oox/qa/unit/vml.cxx @@ -16,6 +16,7 @@ #include #include +#include #include #include #include @@ -58,6 +59,28 @@ void OoxVmlTest::load(std::u16string_view rFileName) mxComponent = loadFromDesktop(aURL); } +CPPUNIT_TEST_FIXTURE(OoxVmlTest, tdf137314_vml_rotation_unit_fd) +{ + // Load a document with a 30deg rotated arc on a drawing canvas. Rotation is given + // as 1966080fd. Error was, that the vml angle unit "fd" was not converted to Degree100. + load(u"tdf137314_vml_rotation_unit_fd.docx"); + uno::Reference xDrawPagesSupplier(getComponent(), uno::UNO_QUERY); + uno::Reference xDrawPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0), + uno::UNO_QUERY); + uno::Reference xGroup(xDrawPage->getByIndex(0), uno::UNO_QUERY); + uno::Reference xShape(xGroup->getByIndex(1), uno::UNO_QUERY); + uno::Reference xShapeProps(xShape, uno::UNO_QUERY); + drawing::PolyPolygonBezierCoords aPolyPolygonBezierCoords; + xShapeProps->getPropertyValue("PolyPolygonBezier") >>= aPolyPolygonBezierCoords; + drawing::PointSequence aPolygon = aPolyPolygonBezierCoords.Coordinates[1]; + // Without fix in place, the vector was -1441|1490. + // [1] and [2] are Bezier-curve control points. + sal_Int32 nDiffX = aPolygon[3].X - aPolygon[0].X; + CPPUNIT_ASSERT_EQUAL(sal_Int32(1490), nDiffX); + sal_Int32 nDiffY = aPolygon[3].Y - aPolygon[0].Y; + CPPUNIT_ASSERT_EQUAL(sal_Int32(1441), nDiffY); +} + CPPUNIT_TEST_FIXTURE(OoxVmlTest, testSpt202ShapeType) { // Load a document with a groupshape, 2nd child is a , its type has o:spt set to 202 diff --git a/oox/source/vml/vmlshape.cxx b/oox/source/vml/vmlshape.cxx index d5ad6963ff85..98481299e412 100644 --- a/oox/source/vml/vmlshape.cxx +++ b/oox/source/vml/vmlshape.cxx @@ -1083,10 +1083,9 @@ namespace { if (SdrObject* pShape = GetSdrObjectFromXShape(rxShape)) { - // -1 is required because the direction of MSO rotation is the opposite of ours - // 100 is required because in this part of the code the angle is in a hundredth of - // degrees. - Degree100 nAngle( static_cast(-1 * 100.0 * rTypeModel.maRotation.toDouble()) ); + // The needed factor -1 for opposite direction and factor 100 for Degree100 is + // contained in method decodeRotation(). + Degree100 nAngle(ConversionHelper::decodeRotation(rTypeModel.maRotation)); pShape->NbcRotate(pShape->GetSnapRect().Center(), nAngle); } } -- cgit v1.2.3