diff options
author | Mike Kaganski <mike.kaganski@collabora.com> | 2020-12-18 13:12:50 +0300 |
---|---|---|
committer | Mike Kaganski <mike.kaganski@collabora.com> | 2020-12-23 07:41:00 +0100 |
commit | d0b5d0a7e6405742c0de746e7b740fd2547654cd (patch) | |
tree | a9478d1586eee12b389b8e847e553ab4937f933a /sw | |
parent | 88ac99d6afb1903c4f4a6a33b92fef461979703c (diff) |
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.
This backport introduces getShapes from 36e62098c8c541c4a3fb63eced591cf29ac56e4a
to make backporting easier.
Change-Id: Ibfe85c7cd98c089e58af8d7f3848990af8e1100f
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/107957
Tested-by: Jenkins
Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/108227
Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com>
Diffstat (limited to 'sw')
-rw-r--r-- | sw/qa/extras/ooxmlexport/data/croppedAndRotated.odt | bin | 0 -> 11188 bytes | |||
-rw-r--r-- | sw/qa/extras/ooxmlexport/ooxmlexport13.cxx | 4 | ||||
-rw-r--r-- | sw/qa/extras/ooxmlexport/ooxmlexport15.cxx | 14 | ||||
-rw-r--r-- | sw/qa/inc/swmodeltestbase.hxx | 8 | ||||
-rw-r--r-- | sw/source/filter/ww8/docxattributeoutput.cxx | 42 | ||||
-rw-r--r-- | sw/source/filter/ww8/docxattributeoutput.hxx | 3 |
6 files changed, 53 insertions, 18 deletions
diff --git a/sw/qa/extras/ooxmlexport/data/croppedAndRotated.odt b/sw/qa/extras/ooxmlexport/data/croppedAndRotated.odt Binary files differnew file mode 100644 index 000000000000..825db09da8bf --- /dev/null +++ b/sw/qa/extras/ooxmlexport/data/croppedAndRotated.odt diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport13.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport13.cxx index 5fbe91f16070..f26859d48e4e 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport13.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport13.cxx @@ -554,8 +554,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_TEST(testFrameSizeExport, "floating-tables-anchor.docx") diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport15.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport15.cxx index a663e914db1e..843ef1f3704c 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport15.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport15.cxx @@ -143,6 +143,20 @@ DECLARE_OOXMLEXPORT_TEST(testTdf135973, "tdf135973.odt") } } +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/qa/inc/swmodeltestbase.hxx b/sw/qa/inc/swmodeltestbase.hxx index 38f8e95a4a40..6119365c6392 100644 --- a/sw/qa/inc/swmodeltestbase.hxx +++ b/sw/qa/inc/swmodeltestbase.hxx @@ -895,6 +895,14 @@ protected: return xCursor->getPage(); } + /// Get shape count. + int getShapes() const + { + uno::Reference<drawing::XDrawPageSupplier> xDrawPageSupplier(mxComponent, uno::UNO_QUERY); + uno::Reference<container::XIndexAccess> xDraws = xDrawPageSupplier->getDrawPage(); + return xDraws->getCount(); + } + /** * Given that some problem doesn't affect the result in the importer, we * test the resulting file directly, by opening the zip file, parsing an diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx index 0e849c8142d7..7d614a206c7b 100644 --- a/sw/source/filter/ww8/docxattributeoutput.cxx +++ b/sw/source/filter/ww8/docxattributeoutput.cxx @@ -4764,13 +4764,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()); @@ -4783,7 +4782,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; @@ -4944,7 +4943,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(); @@ -4958,10 +4956,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) @@ -4975,11 +4990,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") && @@ -5060,9 +5073,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 a6d5d1e88d62..6655b180bb2b 100644 --- a/sw/source/filter/ww8/docxattributeoutput.hxx +++ b/sw/source/filter/ww8/docxattributeoutput.hxx @@ -401,7 +401,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); bool WriteOLEChart( const SdrObject* pSdrObj, const Size& rSize, const SwFlyFrameFormat* pFlyFrameFormat); bool WriteOLEMath( const SwOLENode& rNode ); |