From eae0636311d3a1b3a1af58a3e4df686b55afa3fa Mon Sep 17 00:00:00 2001 From: "Daniel Arato (NISZ)" Date: Mon, 30 Aug 2021 14:13:52 +0200 Subject: tdf#142881 XLSX import: fix shapes rotated exactly 45°, MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 135°, 225° and 315° by correcting their cell anchor points, like MSO does. Previously the XLSX export with the bad anchor points messed up the rotation of the shapes, resulting also broken text content in LO and MSO. Thanks to Regina Henschel for analyzing the problem. Co-authored-by: Szabolcs Tóth Change-Id: Ica625545a22a74ed027ac0fa2bbf38804611c172 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/121307 Tested-by: László Németh Reviewed-by: László Németh --- sc/qa/unit/data/xlsx/tdf142881.xlsx | Bin 0 -> 10143 bytes sc/qa/unit/subsequent_export-test2.cxx | 37 +++++++++++++++++++++++++++++++++ sc/source/filter/xcl97/xcl97rec.cxx | 2 +- 3 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 sc/qa/unit/data/xlsx/tdf142881.xlsx diff --git a/sc/qa/unit/data/xlsx/tdf142881.xlsx b/sc/qa/unit/data/xlsx/tdf142881.xlsx new file mode 100644 index 000000000000..a25dfec68551 Binary files /dev/null and b/sc/qa/unit/data/xlsx/tdf142881.xlsx differ diff --git a/sc/qa/unit/subsequent_export-test2.cxx b/sc/qa/unit/subsequent_export-test2.cxx index 36409864817b..a25babe59134 100644 --- a/sc/qa/unit/subsequent_export-test2.cxx +++ b/sc/qa/unit/subsequent_export-test2.cxx @@ -155,6 +155,7 @@ public: void testTdf115159(); void testTdf112567(); void testTdf122191(); + void testTdf142881(); void testTdf112567b(); void testTdf123645XLSX(); void testTdf125173XLSX(); @@ -261,6 +262,7 @@ public: CPPUNIT_TEST(testTdf115159); CPPUNIT_TEST(testTdf112567); CPPUNIT_TEST(testTdf122191); + CPPUNIT_TEST(testTdf142881); CPPUNIT_TEST(testTdf112567b); CPPUNIT_TEST(testTdf123645XLSX); CPPUNIT_TEST(testTdf125173XLSX); @@ -1407,6 +1409,41 @@ void ScExportTest2::testTdf122191() xDocSh->DoClose(); } +void ScExportTest2::testTdf142881() +{ + ScDocShellRef xDocSh = loadDoc(u"tdf142881.", FORMAT_XLSX); + CPPUNIT_ASSERT_MESSAGE("Failed to load tdf142881.xlsx", xDocSh.is()); + + std::shared_ptr pXPathFile + = ScBootstrapFixture::exportTo(&(*xDocSh), FORMAT_XLSX); + xmlDocUniquePtr pDrawing1 + = XPathHelper::parseExport(pXPathFile, m_xSFactory, "xl/drawings/drawing1.xml"); + CPPUNIT_ASSERT(pDrawing1); + + // Verify that the shapes are rotated and positioned in the expected way + assertXPathContent(pDrawing1, "/xdr:wsDr/xdr:twoCellAnchor[1]/xdr:from/xdr:col", "11"); + assertXPathContent(pDrawing1, "/xdr:wsDr/xdr:twoCellAnchor[1]/xdr:from/xdr:row", "0"); + assertXPathContent(pDrawing1, "/xdr:wsDr/xdr:twoCellAnchor[1]/xdr:to/xdr:col", "12"); + assertXPathContent(pDrawing1, "/xdr:wsDr/xdr:twoCellAnchor[1]/xdr:to/xdr:row", "19"); + + assertXPathContent(pDrawing1, "/xdr:wsDr/xdr:twoCellAnchor[2]/xdr:from/xdr:col", "2"); + assertXPathContent(pDrawing1, "/xdr:wsDr/xdr:twoCellAnchor[2]/xdr:from/xdr:row", "8"); + assertXPathContent(pDrawing1, "/xdr:wsDr/xdr:twoCellAnchor[2]/xdr:to/xdr:col", "7"); + assertXPathContent(pDrawing1, "/xdr:wsDr/xdr:twoCellAnchor[2]/xdr:to/xdr:row", "10"); + + assertXPathContent(pDrawing1, "/xdr:wsDr/xdr:twoCellAnchor[3]/xdr:from/xdr:col", "10"); + assertXPathContent(pDrawing1, "/xdr:wsDr/xdr:twoCellAnchor[3]/xdr:from/xdr:row", "9"); + assertXPathContent(pDrawing1, "/xdr:wsDr/xdr:twoCellAnchor[3]/xdr:to/xdr:col", "11"); + assertXPathContent(pDrawing1, "/xdr:wsDr/xdr:twoCellAnchor[3]/xdr:to/xdr:row", "26"); + + assertXPathContent(pDrawing1, "/xdr:wsDr/xdr:twoCellAnchor[4]/xdr:from/xdr:col", "2"); + assertXPathContent(pDrawing1, "/xdr:wsDr/xdr:twoCellAnchor[4]/xdr:from/xdr:row", "17"); + assertXPathContent(pDrawing1, "/xdr:wsDr/xdr:twoCellAnchor[4]/xdr:to/xdr:col", "8"); + assertXPathContent(pDrawing1, "/xdr:wsDr/xdr:twoCellAnchor[4]/xdr:to/xdr:row", "19"); + + xDocSh->DoClose(); +} + void ScExportTest2::testTdf112567b() { // Set the system locale to Hungarian (a language with different range separator) diff --git a/sc/source/filter/xcl97/xcl97rec.cxx b/sc/source/filter/xcl97/xcl97rec.cxx index 3a05578f14e2..bdc3648d7584 100644 --- a/sc/source/filter/xcl97/xcl97rec.cxx +++ b/sc/source/filter/xcl97/xcl97rec.cxx @@ -1120,7 +1120,7 @@ void XclObjAny::WriteFromTo( XclExpXmlStream& rStrm, const Reference< XShape >& // MSO changes the anchor positions at these angles and that does an extra 90 degrees // rotation on our shapes, so we output it in such position that MSO // can draw this shape correctly. - if ((nRotation >= 4500_deg100 && nRotation < 13500_deg100) || (nRotation >= 22500_deg100 && nRotation < 31500_deg100)) + if ((nRotation > 4500_deg100 && nRotation <= 13500_deg100) || (nRotation > 22500_deg100 && nRotation <= 31500_deg100)) { aTopLeft.X = aTopLeft.X - nHalfHeight + nHalfWidth; aTopLeft.Y = aTopLeft.Y - nHalfWidth + nHalfHeight; -- cgit