sw/qa/extras/ooxmlexport/data/tdf123569_rotWriterImage_46deg.odt |binary sw/qa/extras/ooxmlexport/ooxmlexport16.cxx | 12 +++++ sw/source/filter/ww8/docxsdrexport.cxx | 23 +++++++++- 3 files changed, 34 insertions(+), 1 deletion(-)
New commits: commit a020f2c3993fd8b625cee07ed73949982e719fca Author: Regina Henschel <[email protected]> AuthorDate: Thu Jul 1 22:05:48 2021 +0200 Commit: Regina Henschel <[email protected]> CommitDate: Fri Jul 2 10:16:58 2021 +0200 tdf#123569 correct position of rotated Writer image Error was, that the position pFrameFormat->GetHoriOrient().GetPos() was treated as left/top of snap rectangle and the associated left/top of a logic rectangle was calculated from it based on rotation angle. But actually it is already left/top of logic rectangle. Nevertheless effectExtent has to be calculated for the rotation. The fix is based on commit 3262fc5ef3bde5b158909d11ccb008161ea95519. A direct backport to LO7.2 is not possible. Change-Id: I8761b673d1358bb476f1678fd2a104eaec6dcb2d Reviewed-on: https://gerrit.libreoffice.org/c/core/+/118243 Tested-by: Jenkins Reviewed-by: Regina Henschel <[email protected]> diff --git a/sw/qa/extras/ooxmlexport/data/tdf123569_rotWriterImage_46deg.odt b/sw/qa/extras/ooxmlexport/data/tdf123569_rotWriterImage_46deg.odt new file mode 100644 index 000000000000..b452852afee2 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf123569_rotWriterImage_46deg.odt differ diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport16.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport16.cxx index ecd0e4b62803..b670c72333ff 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport16.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport16.cxx @@ -70,6 +70,18 @@ protected: return OString(filename).endsWith(".docx"); } }; +DECLARE_OOXMLEXPORT_TEST(testTdf123569_rotWriterImage, "tdf123569_rotWriterImage_46deg.odt") +{ + uno::Reference<beans::XPropertySet> xFrame(getShape(1), uno::UNO_QUERY); + // Error was, that position of logical rectangle was treated as position of snap rectangle. + // Thus a wrong position was calculated. + // Without fix this would have failed with expected 4798, actual 4860 + CPPUNIT_ASSERT_DOUBLES_EQUAL(sal_Int32(4798), + getProperty<sal_Int32>(xFrame, "HoriOrientPosition"), 1); + // Without fix this would have failed with expected 1438, actual 4062 + CPPUNIT_ASSERT_DOUBLES_EQUAL(sal_Int32(1438), + getProperty<sal_Int32>(xFrame, "VertOrientPosition"), 1); +} DECLARE_OOXMLEXPORT_TEST(testTdf142486_LeftMarginShadowLeft, "tdf142486_LeftMarginShadowLeft.docx") { diff --git a/sw/source/filter/ww8/docxsdrexport.cxx b/sw/source/filter/ww8/docxsdrexport.cxx index c85e2581bd96..2b2fd89a635e 100644 --- a/sw/source/filter/ww8/docxsdrexport.cxx +++ b/sw/source/filter/ww8/docxsdrexport.cxx @@ -586,6 +586,26 @@ void DocxSdrExport::startDMLAnchorInline(const SwFrameFormat* pFrameFormat, cons // Adaption is missing here. Frames in LO have no stroke but border. The current conversion // from border to line treats borders like table borders. That might give wrong values // for drawing frames. + + if (pObj && pObj->GetRotateAngle() != 0_deg100) + { + Degree100 nRotation = pObj->GetRotateAngle(); + const SwRect aBoundRect(pFrameFormat->FindLayoutRect()); + tools::Long nMSOWidth = rSize.Width(); + tools::Long nMSOHeight = rSize.Height(); + if ((nRotation > 4500_deg100 && nRotation <= 13500_deg100) + || (nRotation > 22500_deg100 && nRotation <= 31500_deg100)) + std::swap(nMSOWidth, nMSOHeight); + nBottomExt += (aBoundRect.Height() - 1 - nMSOHeight) / 2; + nTopExt += (aBoundRect.Height() - 1 - nMSOHeight) / 2; + nLeftExt += (aBoundRect.Width() - nMSOWidth) / 2; + nRightExt += (aBoundRect.Width() - nMSOWidth) / 2; + } + lcl_makeDistAndExtentNonNegative(nDistT, nDistB, nDistL, nDistR, nLeftExt, nTopExt, + nRightExt, nBottomExt); + + // ToDo: Inline rotated image fails because it would need wrapTight, what is not possible. + // ToDo: Image plus shadow fails because of wrong shadow direction. } else // other objects than frames. pObj exists. { @@ -684,7 +704,8 @@ void DocxSdrExport::startDMLAnchorInline(const SwFrameFormat* pFrameFormat, cons aPos.X += nPosXDiff; // Make the postponed position move of frames. aPos.Y += nPosYDiff; - if (pObj && lcl_IsRotateAngleValid(*pObj)) + if (pObj && lcl_IsRotateAngleValid(*pObj) + && pObj->GetObjIdentifier() != SwFlyDrawObjIdentifier) lclMovePositionWithRotation(aPos, rSize, pObj->GetRotateAngle()); const char* relativeFromH; _______________________________________________ Libreoffice-commits mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
