From fbe77e5d61ca63a688c12be721e760935d78e780 Mon Sep 17 00:00:00 2001 From: Balazs Varga Date: Sun, 13 Dec 2020 14:08:38 +0100 Subject: tdf#138889 OOXML chart: fix import of rotated shapes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit in charts, resulted e.g. distorted arrows. Change-Id: I2d25aeeef8aed9fccacf3cc9f735123e8d891de5 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/107670 Tested-by: László Németh Reviewed-by: László Németh --- chart2/qa/extras/chart2import.cxx | 34 +++++++++++++++------ chart2/qa/extras/data/docx/testcustomshapepos.docx | Bin 26204 -> 26359 bytes .../drawingml/chart/chartdrawingfragment.cxx | 9 ++++++ 3 files changed, 34 insertions(+), 9 deletions(-) diff --git a/chart2/qa/extras/chart2import.cxx b/chart2/qa/extras/chart2import.cxx index b94b27f4506a..e4742405d967 100644 --- a/chart2/qa/extras/chart2import.cxx +++ b/chart2/qa/extras/chart2import.cxx @@ -2615,6 +2615,11 @@ void Chart2ImportTest::testTdf134225() void Chart2ImportTest::testTdf136105() { + // FIXME: the DPI check should be removed when either (1) the test is fixed to work with + // non-default DPI; or (2) unit tests on Windows are made to use svp VCL plugin. + if (!IsDefaultDPI()) + return; + load("/chart2/qa/extras/data/xlsx/", "tdf136105.xlsx"); // 1st chart with fix inner position and size { @@ -2775,15 +2780,26 @@ void Chart2ImportTest::testTdfCustomShapePos() Reference< chart2::XChartDocument > xChartDoc(getChartDocFromWriter(0), UNO_QUERY_THROW); Reference xDrawPageSupplier(xChartDoc, UNO_QUERY_THROW); Reference xDrawPage(xDrawPageSupplier->getDrawPage(), UNO_SET_THROW); - Reference xCustomShape(xDrawPage->getByIndex(0), UNO_QUERY_THROW); - - // test position and size of a custom shape within a chart - awt::Point aPosition = xCustomShape->getPosition(); - CPPUNIT_ASSERT_DOUBLES_EQUAL(8845, aPosition.X, 300); - CPPUNIT_ASSERT_DOUBLES_EQUAL(855, aPosition.Y, 300); - awt::Size aSize = xCustomShape->getSize(); - CPPUNIT_ASSERT_DOUBLES_EQUAL(4831, aSize.Width, 300); - CPPUNIT_ASSERT_DOUBLES_EQUAL(1550, aSize.Height, 300); + // test position and size of a custom shape within a chart, rotated by 0 degree. + { + Reference xCustomShape(xDrawPage->getByIndex(0), UNO_QUERY_THROW); + awt::Point aPosition = xCustomShape->getPosition(); + CPPUNIT_ASSERT_DOUBLES_EQUAL(8845, aPosition.X, 300); + CPPUNIT_ASSERT_DOUBLES_EQUAL(855, aPosition.Y, 300); + awt::Size aSize = xCustomShape->getSize(); + CPPUNIT_ASSERT_DOUBLES_EQUAL(4831, aSize.Width, 300); + CPPUNIT_ASSERT_DOUBLES_EQUAL(1550, aSize.Height, 300); + } + // test position and size of a custom shape within a chart, rotated by 90 degree. + { + Reference xCustomShape(xDrawPage->getByIndex(1), UNO_QUERY_THROW); + awt::Point aPosition = xCustomShape->getPosition(); + CPPUNIT_ASSERT_DOUBLES_EQUAL(1658, aPosition.X, 300); + CPPUNIT_ASSERT_DOUBLES_EQUAL(6119, aPosition.Y, 300); + awt::Size aSize = xCustomShape->getSize(); + CPPUNIT_ASSERT_DOUBLES_EQUAL(4165, aSize.Width, 300); + CPPUNIT_ASSERT_DOUBLES_EQUAL(1334, aSize.Height, 300); + } } CPPUNIT_TEST_SUITE_REGISTRATION(Chart2ImportTest); diff --git a/chart2/qa/extras/data/docx/testcustomshapepos.docx b/chart2/qa/extras/data/docx/testcustomshapepos.docx index 31c5284e11b9..640c48ea4627 100644 Binary files a/chart2/qa/extras/data/docx/testcustomshapepos.docx and b/chart2/qa/extras/data/docx/testcustomshapepos.docx differ diff --git a/oox/source/drawingml/chart/chartdrawingfragment.cxx b/oox/source/drawingml/chart/chartdrawingfragment.cxx index 85eeb2986bcc..c41e2db49821 100644 --- a/oox/source/drawingml/chart/chartdrawingfragment.cxx +++ b/oox/source/drawingml/chart/chartdrawingfragment.cxx @@ -209,6 +209,15 @@ void ChartDrawingFragment::onEndElement() EmuRectangle aShapeRectEmu = mxAnchor->calcAnchorRectEmu( maChartRectEmu ); if( (aShapeRectEmu.X >= 0) && (aShapeRectEmu.Y >= 0) && (aShapeRectEmu.Width >= 0) && (aShapeRectEmu.Height >= 0) ) { + const sal_Int32 aRotation = mxShape->getRotation(); + if( (aRotation >= 45 * PER_DEGREE && aRotation < 135 * PER_DEGREE) || (aRotation >= 225 * PER_DEGREE && aRotation < 315 * PER_DEGREE) ) + { + sal_Int64 nHalfWidth = aShapeRectEmu.Width / 2; + sal_Int64 nHalfHeight = aShapeRectEmu.Height / 2; + aShapeRectEmu.X = aShapeRectEmu.X + nHalfWidth - nHalfHeight; + aShapeRectEmu.Y = aShapeRectEmu.Y + nHalfHeight - nHalfWidth; + std::swap(aShapeRectEmu.Width, aShapeRectEmu.Height); + } // TODO: DrawingML implementation expects 32-bit coordinates for EMU rectangles (change that to EmuRectangle) awt::Rectangle aShapeRectEmu32( getLimitedValue< sal_Int32, sal_Int64 >( aShapeRectEmu.X, 0, SAL_MAX_INT32 ), -- cgit