[Libreoffice-commits] core.git: Branch 'distro/collabora/cp-6.2' - sw/qa sw/source

Mike Kaganski (via logerrit) logerrit at kemper.freedesktop.org
Wed Dec 23 09:10:13 UTC 2020


 sw/qa/extras/ooxmlexport/data/croppedAndRotated.odt |binary
 sw/qa/extras/ooxmlexport/ooxmlexport13.cxx          |   16 +++++++-
 sw/source/filter/ww8/docxattributeoutput.cxx        |   36 +++++++++++++-------
 sw/source/filter/ww8/docxattributeoutput.hxx        |    3 +
 4 files changed, 41 insertions(+), 14 deletions(-)

New commits:
commit 752b57951c54f23e71898ae7af191b19cd182427
Author:     Mike Kaganski <mike.kaganski at collabora.com>
AuthorDate: Fri Dec 18 13:12:50 2020 +0300
Commit:     Mike Kaganski <mike.kaganski at collabora.com>
CommitDate: Wed Dec 23 10:09:38 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.kaganski at collabora.com>
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/108227
    Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice at gmail.com>
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/108229

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 d65e0038ca62..6388b255122e 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport13.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport13.cxx
@@ -225,8 +225,20 @@ 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(testTdf138953, "croppedAndRotated.odt")
+{
+    // 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);
 }
 
 DECLARE_OOXMLEXPORT_TEST(testImageCommentAtChar, "image-comment-at-char.docx")
diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx
index 074cb2507737..a655dc61bc90 100644
--- a/sw/source/filter/ww8/docxattributeoutput.cxx
+++ b/sw/source/filter/ww8/docxattributeoutput.cxx
@@ -4814,13 +4814,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());
@@ -4833,7 +4832,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;
@@ -4985,7 +4984,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();
@@ -4999,10 +4997,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_EXPORT_ROTATE_CLOCKWISIFY(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)
@@ -5094,9 +5109,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,
             FSEND );
diff --git a/sw/source/filter/ww8/docxattributeoutput.hxx b/sw/source/filter/ww8/docxattributeoutput.hxx
index 2d32c29bfd6d..6b512c37aef7 100644
--- a/sw/source/filter/ww8/docxattributeoutput.hxx
+++ b/sw/source/filter/ww8/docxattributeoutput.hxx
@@ -390,7 +390,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 );
     bool WriteOLEMath( const SwOLENode& rNode );


More information about the Libreoffice-commits mailing list