sw/qa/extras/ooxmlexport/data/croppedAndRotated.odt |binary sw/qa/extras/ooxmlexport/ooxmlexport13.cxx | 4 - sw/qa/extras/ooxmlexport/ooxmlexport16.cxx | 14 ++++++ sw/source/filter/ww8/docxattributeoutput.cxx | 42 ++++++++++++-------- sw/source/filter/ww8/docxattributeoutput.hxx | 3 - 5 files changed, 45 insertions(+), 18 deletions(-)
New commits: commit a9ec5c6e7b542e3c7788cdfe0aff4512e36491c6 Author: Mike Kaganski <mike.kagan...@collabora.com> AuthorDate: Fri Dec 18 13:12:50 2020 +0300 Commit: Caolán McNamara <caol...@redhat.com> CommitDate: Mon Dec 21 14:20:46 2020 +0100 tdf#138953: use original (cropped, but unrotated) object size in spPr This not only fixes the regression from b226383a83e41bbced9fc2a02dc09a449401ec97, but also makes the written size more correct than before, when it was slightly larger compared to original object size. Corrected unit test for tdf#116371 reflect that: the object in ODT is 241.78 mm x 240.61 mm. It previously was exported as 241.88 x 240.70; now the exported size is closer: 241.79 x 240.63. Change-Id: Ibfe85c7cd98c089e58af8d7f3848990af8e1100f Reviewed-on: https://gerrit.libreoffice.org/c/core/+/107957 Tested-by: Jenkins Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com> (cherry picked from commit 3dc2e629b247873bfbd3190c11152d8d2bab1a03) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/107997 Reviewed-by: Caolán McNamara <caol...@redhat.com> diff --git a/sw/qa/extras/ooxmlexport/data/croppedAndRotated.odt b/sw/qa/extras/ooxmlexport/data/croppedAndRotated.odt new file mode 100644 index 000000000000..825db09da8bf Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/croppedAndRotated.odt differ diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport13.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport13.cxx index 1b9621b473b0..75d89da3f9a9 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport13.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport13.cxx @@ -594,8 +594,8 @@ DECLARE_OOXMLEXPORT_TEST(testTdf116371, "tdf116371.odt") auto xShape(getShape(1)); CPPUNIT_ASSERT_DOUBLES_EQUAL(4700.0, getProperty<double>(xShape, "RotateAngle"), 10); auto frameRect = getProperty<awt::Rectangle>(xShape, "FrameRect"); - CPPUNIT_ASSERT_EQUAL(sal_Int32(24070), frameRect.Height); - CPPUNIT_ASSERT_EQUAL(sal_Int32(24188), frameRect.Width); + CPPUNIT_ASSERT_EQUAL(sal_Int32(24063), frameRect.Height); + CPPUNIT_ASSERT_EQUAL(sal_Int32(24179), frameRect.Width); } DECLARE_OOXMLEXPORT_EXPORTONLY_TEST(testFrameSizeExport, "floating-tables-anchor.docx") diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport16.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport16.cxx index 174f2f0f7330..e12804e58289 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport16.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport16.cxx @@ -38,6 +38,20 @@ DECLARE_OOXMLEXPORT_TEST(testTdf138892_noNumbering, "tdf138892_noNumbering.docx" CPPUNIT_ASSERT_MESSAGE("Para3: <blank line>", getProperty<OUString>(getParagraph(3), "NumberingStyleName").isEmpty()); } +DECLARE_OOXMLEXPORT_TEST(testTdf138953, "croppedAndRotated.odt") +{ + CPPUNIT_ASSERT_EQUAL(1, getShapes()); + CPPUNIT_ASSERT_EQUAL(1, getPages()); + // Make sure the rotation is exported correctly, and size not distorted + auto xShape(getShape(1)); + CPPUNIT_ASSERT_EQUAL(27000.0, getProperty<double>(xShape, "RotateAngle")); + auto frameRect = getProperty<css::awt::Rectangle>(xShape, "FrameRect"); + // Before the fix, original object size (i.e., before cropping) was written to spPr in OOXML, + // and the resulting object size was much larger than should be. + CPPUNIT_ASSERT_EQUAL(sal_Int32(12961), frameRect.Height); + CPPUNIT_ASSERT_EQUAL(sal_Int32(8664), frameRect.Width); +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx index c7191ab8161a..cc63cb5160ea 100644 --- a/sw/source/filter/ww8/docxattributeoutput.cxx +++ b/sw/source/filter/ww8/docxattributeoutput.cxx @@ -4813,13 +4813,12 @@ void DocxAttributeOutput::DefaultStyle() /* Writes <a:srcRect> tag back to document.xml if a file contains a cropped image. * NOTE : Tested on images of type JPEG,EMF/WMF,BMP, PNG and GIF. */ -void DocxAttributeOutput::WriteSrcRect(const SdrObject* pSdrObj, const SwFrameFormat* pFrameFormat ) +void DocxAttributeOutput::WriteSrcRect( + const css::uno::Reference<css::beans::XPropertySet>& xShapePropSet, + const SwFrameFormat* pFrameFormat) { - uno::Reference< drawing::XShape > xShape( const_cast<SdrObject*>(pSdrObj)->getUnoShape(), uno::UNO_QUERY ); - uno::Reference< beans::XPropertySet > xPropSet( xShape, uno::UNO_QUERY ); - uno::Reference<graphic::XGraphic> xGraphic; - xPropSet->getPropertyValue("Graphic") >>= xGraphic; + xShapePropSet->getPropertyValue("Graphic") >>= xGraphic; const Graphic aGraphic(xGraphic); Size aOriginalSize(aGraphic.GetPrefSize()); @@ -4832,7 +4831,7 @@ void DocxAttributeOutput::WriteSrcRect(const SdrObject* pSdrObj, const SwFrameFo } css::text::GraphicCrop aGraphicCropStruct; - xPropSet->getPropertyValue( "GraphicCrop" ) >>= aGraphicCropStruct; + xShapePropSet->getPropertyValue("GraphicCrop") >>= aGraphicCropStruct; sal_Int32 nCropL = aGraphicCropStruct.Left; sal_Int32 nCropR = aGraphicCropStruct.Right; sal_Int32 nCropT = aGraphicCropStruct.Top; @@ -4971,7 +4970,6 @@ void DocxAttributeOutput::FlyFrameGraphic( const SwGrfNode* pGrfNode, const Size rtl::Reference<sax_fastparser::FastAttributeList> xFrameAttributes( FastSerializerHelper::createAttrList()); - Size aSize = rSize; if (pGrfNode) { const SwAttrSet& rSet = pGrfNode->GetSwAttrSet(); @@ -4985,10 +4983,27 @@ void DocxAttributeOutput::FlyFrameGraphic( const SwGrfNode* pGrfNode, const Size // RES_GRFATR_ROTATION is in 10ths of degree; convert to 100ths for macro sal_uInt32 mOOXMLRot = oox::drawingml::ExportRotateClockwisify(nRot*10); xFrameAttributes->add(XML_rot, OString::number(mOOXMLRot)); - aSize = pGrfNode->GetTwipSize(); } } + css::uno::Reference<css::beans::XPropertySet> xShapePropSet; + if (pSdrObj) + { + css::uno::Reference<css::drawing::XShape> xShape( + const_cast<SdrObject*>(pSdrObj)->getUnoShape(), css::uno::UNO_QUERY); + xShapePropSet.set(xShape, css::uno::UNO_QUERY); + assert(xShapePropSet); + } + + Size aSize = rSize; + // We need the original (cropped, but unrotated) size of object. So prefer the object data, + // and only use passed frame size as fallback. + if (xShapePropSet) + { + if (css::awt::Size val; xShapePropSet->getPropertyValue("Size") >>= val) + aSize = Size(convertMm100ToTwip(val.Width), convertMm100ToTwip(val.Height)); + } + m_rExport.SdrExporter().startDMLAnchorInline(pFrameFormat, aSize); // picture description (used for pic:cNvPr later too) @@ -5002,11 +5017,9 @@ void DocxAttributeOutput::FlyFrameGraphic( const SwGrfNode* pGrfNode, const Size m_pSerializer->startElementNS( XML_wp, XML_docPr, docPrAttrListRef ); OUString sURL, sRelId; - if(pSdrObj) + if (xShapePropSet) { - uno::Reference< drawing::XShape > xShape( const_cast<SdrObject*>(pSdrObj)->getUnoShape(), uno::UNO_QUERY ); - uno::Reference< beans::XPropertySet > xPropSet( xShape, uno::UNO_QUERY ); - xPropSet->getPropertyValue("HyperLinkURL") >>= sURL; + xShapePropSet->getPropertyValue("HyperLinkURL") >>= sURL; if(!sURL.isEmpty()) { if (sURL.startsWith("#") && sURL.indexOf(' ') != -1 && !sURL.endsWith("|outline") && !sURL.endsWith("|table") && @@ -5087,9 +5100,8 @@ void DocxAttributeOutput::FlyFrameGraphic( const SwGrfNode* pGrfNode, const Size } m_pSerializer->endElementNS( XML_a, XML_blip ); - if (pSdrObj){ - WriteSrcRect(pSdrObj, pFrameFormat); - } + if (xShapePropSet) + WriteSrcRect(xShapePropSet, pFrameFormat); m_pSerializer->startElementNS(XML_a, XML_stretch); m_pSerializer->singleElementNS(XML_a, XML_fillRect); diff --git a/sw/source/filter/ww8/docxattributeoutput.hxx b/sw/source/filter/ww8/docxattributeoutput.hxx index de0e31b910f4..795cc1b901cf 100644 --- a/sw/source/filter/ww8/docxattributeoutput.hxx +++ b/sw/source/filter/ww8/docxattributeoutput.hxx @@ -402,7 +402,8 @@ private: /// /// @see WriteOLE2Obj() void FlyFrameGraphic( const SwGrfNode* pGrfNode, const Size& rSize, const SwFlyFrameFormat* pOLEFrameFormat, SwOLENode* pOLENode, const SdrObject* pSdrObj = nullptr); - void WriteSrcRect( const SdrObject* pSdrObj, const SwFrameFormat* pFrameFormat ); + void WriteSrcRect(const css::uno::Reference<css::beans::XPropertySet>& xShapePropSet, + const SwFrameFormat* pFrameFormat); void WriteOLE2Obj( const SdrObject* pSdrObj, SwOLENode& rNode, const Size& rSize, const SwFlyFrameFormat* pFlyFrameFormat, const sal_Int8 nFormulaAlignment); bool WriteOLEChart( const SdrObject* pSdrObj, const Size& rSize, const SwFlyFrameFormat* pFlyFrameFormat); bool WriteOLEMath( const SwOLENode& rNode, const sal_Int8 nAlign ); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits