[Libreoffice-commits] core.git: 3 commits - oox/source sw/qa sw/source

Jacobo Aragunde Pérez jaragunde at igalia.com
Tue Apr 15 02:36:41 PDT 2014


 oox/source/drawingml/customshapeproperties.cxx |    6 ++--
 oox/source/drawingml/shape.cxx                 |   19 +++++++++++--
 sw/qa/extras/ooxmlexport/ooxmlsdrexport.cxx    |   35 +++++++++++++++++++------
 sw/qa/extras/ooxmlimport/ooxmlimport.cxx       |   29 ++++++++++++++++++++
 sw/source/filter/ww8/docxsdrexport.cxx         |    8 ++---
 5 files changed, 79 insertions(+), 18 deletions(-)

New commits:
commit 1393ba60b1eb43b55820f74c393da04308221d97
Author: Jacobo Aragunde Pérez <jaragunde at igalia.com>
Date:   Mon Apr 14 18:53:34 2014 +0200

    fdo#70838: fix rotation transformation in DML exporter
    
    This patch fixes an error in commit
    c6ff03f37a6898f50a5ca07152168fb4fe911e05.
    
    And now that fdo#75722 is fixed, I completed the existing unit test
    for this bug with absolute position checks.
    
    Change-Id: I76b4fa046db9b946fd23194e91686ffa4fcb5362

diff --git a/sw/qa/extras/ooxmlexport/ooxmlsdrexport.cxx b/sw/qa/extras/ooxmlexport/ooxmlsdrexport.cxx
index 5f5ecf9..674b496 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlsdrexport.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlsdrexport.cxx
@@ -503,16 +503,16 @@ DECLARE_OOXMLEXPORT_TEST(testFdo70838, "fdo70838.docx")
     aYPos[2] = getXPathContent(pXmlDocument, "/w:document/w:body/w:p/w:r/mc:AlternateContent[3]/mc:Choice/w:drawing/wp:anchor/wp:positionV/wp:posOffset").toInt32();
     aYPos[3] = getXPathContent(pXmlDocument, "/w:document/w:body/w:p/w:r/mc:AlternateContent[4]/mc:Choice/w:drawing/wp:anchor/wp:positionV/wp:posOffset").toInt32();
 
-    // TODO: compare values with a reference value extracted from the original document
-    //       depends on fdo#75722
     // certain degree of error is tolerated due to rounding in unit conversions
-    CPPUNIT_ASSERT(abs(aXPos[0] - aXPos[1]) < 1000);
-    CPPUNIT_ASSERT(abs(aXPos[1] - aXPos[2]) < 1000);
-    CPPUNIT_ASSERT(abs(aXPos[2] - aXPos[3]) < 1000);
+    CPPUNIT_ASSERT(abs(1239520 - aXPos[0]) < 1000);
+    CPPUNIT_ASSERT(abs(1239520 - aXPos[1]) < 1000);
+    CPPUNIT_ASSERT(abs(1238250 - aXPos[2]) < 1000);
+    CPPUNIT_ASSERT(abs(1238885 - aXPos[3]) < 1000);
 
-    CPPUNIT_ASSERT(abs(aYPos[0] - aYPos[1]) < 1000);
-    CPPUNIT_ASSERT(abs(aYPos[1] - aYPos[2]) < 1000);
-    CPPUNIT_ASSERT(abs(aYPos[2] - aYPos[3]) < 1000);
+    CPPUNIT_ASSERT(abs(2095500 - aYPos[0]) < 1000);
+    CPPUNIT_ASSERT(abs(2094865 - aYPos[1]) < 1000);
+    CPPUNIT_ASSERT(abs(2094230 - aYPos[2]) < 1000);
+    CPPUNIT_ASSERT(abs(2094865 - aYPos[3]) < 1000);
 
     sal_Int32 aHSize[4], aVSize[4];
     aHSize[0] = getXPath(pXmlDocument, "/w:document/w:body/w:p/w:r/mc:AlternateContent[1]/mc:Choice/w:drawing/wp:anchor/wp:extent", "cx").toInt32();
@@ -586,6 +586,25 @@ DECLARE_OOXMLEXPORT_TEST(testFdo70838, "fdo70838.docx")
 
         } while( nextTokenPos != -1 );
     }
+
+    // Check shape objects
+
+    awt::Point aPos[4];
+    aPos[0] = getShape(1)->getPosition();
+    aPos[1] = getShape(2)->getPosition();
+    aPos[2] = getShape(3)->getPosition();
+    aPos[3] = getShape(4)->getPosition();
+
+    // certain degree of error is tolerated due to rounding in unit conversions
+    CPPUNIT_ASSERT(abs(4734 - aPos[0].X) < 10);
+    CPPUNIT_ASSERT(abs(4734 - aPos[1].X) < 10);
+    CPPUNIT_ASSERT(abs(4731 - aPos[2].X) < 10);
+    CPPUNIT_ASSERT(abs(4733 - aPos[3].X) < 10);
+
+    CPPUNIT_ASSERT(abs(2845 - aPos[0].Y) < 10);
+    CPPUNIT_ASSERT(abs(2843 - aPos[1].Y) < 10);
+    CPPUNIT_ASSERT(abs(2842 - aPos[2].Y) < 10);
+    CPPUNIT_ASSERT(abs(2843 - aPos[3].Y) < 10);
 }
 
 DECLARE_OOXMLEXPORT_TEST(testFdo73215, "fdo73215.docx")
diff --git a/sw/source/filter/ww8/docxsdrexport.cxx b/sw/source/filter/ww8/docxsdrexport.cxx
index c80cce0..a2cb109 100644
--- a/sw/source/filter/ww8/docxsdrexport.cxx
+++ b/sw/source/filter/ww8/docxsdrexport.cxx
@@ -85,7 +85,7 @@ OUString lclGetAnchorIdFromGrabBag(const SdrObject* pObj)
     return aResult;
 }
 
-void lclMovePositionWithRotation(awt::Point& aPos, sal_Int64 nRotation)
+void lclMovePositionWithRotation(awt::Point& aPos, const Size& rSize, sal_Int64 nRotation)
 {
     // code from ImplEESdrWriter::ImplFlipBoundingBox (filter/source/msfilter/eschesdo.cxx)
     // TODO: refactor
@@ -104,8 +104,8 @@ void lclMovePositionWithRotation(awt::Point& aPos, sal_Int64 nRotation)
     double  fCos = cos(fVal);
     double  fSin = sin(fVal);
 
-    double  nWidthHalf = (double) aPos.X / 2;
-    double  nHeightHalf = (double) aPos.Y / 2;
+    double  nWidthHalf = (double) rSize.Width() / 2;
+    double  nHeightHalf = (double) rSize.Height() / 2;
 
     double nXDiff = fSin * nHeightHalf + fCos * nWidthHalf  - nWidthHalf;
     double nYDiff = fSin * nWidthHalf  + fCos * nHeightHalf - nHeightHalf;
@@ -303,7 +303,7 @@ void DocxSdrExport::startDMLAnchorInline(const SwFrmFmt* pFrmFmt, const Size& rS
             // SdrObjects know their layer, consider that instead of the frame format.
             bOpaque = pObj->GetLayer() != pFrmFmt->GetDoc()->GetHellId() && pObj->GetLayer() != pFrmFmt->GetDoc()->GetInvisibleHellId();
 
-            lclMovePositionWithRotation(aPos, pObj->GetRotateAngle());
+            lclMovePositionWithRotation(aPos, rSize, pObj->GetRotateAngle());
         }
         attrList->add(XML_behindDoc, bOpaque ? "0" : "1");
         attrList->add(XML_distT, OString::number(TwipsToEMU(pULSpaceItem.GetUpper())).getStr());
commit b65de36ecb839ec4d7a8f40f9ffe67956e9bc79d
Author: Jacobo Aragunde Pérez <jaragunde at igalia.com>
Date:   Mon Apr 14 17:27:35 2014 +0200

    fdo#75722: fix incorrect import of rotated DML shapes
    
    The DML importer used a tranformation matrix to rotate the shape, but
    I replaced it with the same code that's being used in the VML importer
    in which the position is correctly set.
    
    I've noticed that I cannot use that code in all cases thanks to the
    existing unit tests; that's why I added the bUseRotationTransform. In
    case it is set to true the existing transformation matrix rotation is
    used.
    
    Finally I added a unit test for this case.
    
    Change-Id: I260c14b42d169def786e15484e4ecb1d8e8584e4

diff --git a/oox/source/drawingml/shape.cxx b/oox/source/drawingml/shape.cxx
index 36cbc0c..c1d00f6 100644
--- a/oox/source/drawingml/shape.cxx
+++ b/oox/source/drawingml/shape.cxx
@@ -63,6 +63,7 @@
 #include <com/sun/star/document/XActionLockable.hpp>
 #include <com/sun/star/chart2/data/XDataReceiver.hpp>
 #include <svl/outstrm.hxx>
+#include <svx/svdtrans.hxx>
 #include <unotools/streamwrap.hxx>
 #include <unotools/fltrcfg.hxx>
 #include <vcl/graph.hxx>
@@ -410,6 +411,9 @@ Reference< XShape > Shape::createAndInsert(
     }
     bool bIsCustomShape = ( aServiceName == "com.sun.star.drawing.CustomShape" ||
                             aServiceName == "com.sun.star.drawing.ConnectorShape" );
+    bool bUseRotationTransform = ( !mbWps ||
+            aServiceName == "com.sun.star.drawing.LineShape" ||
+            aServiceName == "com.sun.star.drawing.GroupShape" );
 
     basegfx::B2DHomMatrix aTransformation;
 
@@ -436,7 +440,7 @@ Reference< XShape > Shape::createAndInsert(
             aTransformation.scale( mbFlipH ? -1.0 : 1.0, mbFlipV ? -1.0 : 1.0 );
         }
 
-        if( mnRotation != 0 )
+        if( bUseRotationTransform && mnRotation != 0 )
         {
             // rotate around object's center
             aTransformation.rotate( F_PI180 * ( (double)mnRotation / 60000.0 ) );
@@ -896,6 +900,15 @@ Reference< XShape > Shape::createAndInsert(
         else if( getTextBody() )
             getTextBody()->getTextProperties().pushVertSimulation();
 
+        if ( !bUseRotationTransform && mnRotation != 0 )
+        {
+            // use the same logic for rotation from VML exporter (SimpleShape::implConvertAndInsert at vmlshape.cxx)
+            PropertySet aPropertySet( mxShape );
+            aPropertySet.setAnyProperty( PROP_RotateAngle, makeAny( sal_Int32( NormAngle360( mnRotation / -600 ) ) ) );
+            aPropertySet.setAnyProperty( PROP_HoriOrientPosition, makeAny( maPosition.X ) );
+            aPropertySet.setAnyProperty( PROP_VertOrientPosition, makeAny( maPosition.Y ) );
+        }
+
         // in some cases, we don't have any text body.
         if( getTextBody() && ( !bDoNotInsertEmptyTextBody || !mpTextBody->isEmpty() ) )
         {
diff --git a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
index 103a3db..8961eed 100644
--- a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
+++ b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
@@ -2019,6 +2019,35 @@ DECLARE_OOXMLIMPORT_TEST(testFdo74401, "fdo74401.docx")
     CPPUNIT_ASSERT_EQUAL(OUString("com.sun.star.drawing.CustomShape"), xShape->getShapeType());
 }
 
+DECLARE_OOXMLIMPORT_TEST(testFdo75722vml, "fdo75722-vml.docx")
+{
+    uno::Reference<drawing::XShape> xShape = getShape(1);
+    awt::Point aPos = xShape->getPosition();
+    awt::Size aSize = xShape->getSize();
+    sal_Int64 nRot = getProperty<sal_Int64>(xShape, "RotateAngle");
+
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(3720), aPos.X);
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(-392), aPos.Y);
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(5457), aSize.Width);
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(3447), aSize.Height);
+    CPPUNIT_ASSERT_EQUAL(sal_Int64(3100), nRot);
+}
+
+DECLARE_OOXMLIMPORT_TEST(testFdo75722dml, "fdo75722-dml.docx")
+{
+    uno::Reference<drawing::XShape> xShape = getShape(1);
+    awt::Point aPos = xShape->getPosition();
+    awt::Size aSize = xShape->getSize();
+    sal_Int64 nRot = getProperty<sal_Int64>(xShape, "RotateAngle");
+
+    // a slight difference regarding vml file is tolerated due to rounding errors
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(3720), aPos.X);
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(-397), aPos.Y);
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(5457), aSize.Width);
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(3447), aSize.Height);
+    CPPUNIT_ASSERT_EQUAL(sal_Int64(3128), nRot);
+}
+
 #endif
 
 CPPUNIT_PLUGIN_IMPLEMENT();
commit 944a195600868c49dbf6f7725b8be3886c9a84e1
Author: Jacobo Aragunde Pérez <jaragunde at igalia.com>
Date:   Thu Apr 10 19:05:09 2014 +0200

    sal_Bool -> bool
    
    Change-Id: I92fe7e3d3be4bf64b57dacb2ae8386775b02c80a

diff --git a/oox/source/drawingml/customshapeproperties.cxx b/oox/source/drawingml/customshapeproperties.cxx
index ea02fef..4886912 100644
--- a/oox/source/drawingml/customshapeproperties.cxx
+++ b/oox/source/drawingml/customshapeproperties.cxx
@@ -146,10 +146,10 @@ void CustomShapeProperties::pushToPropSet( const ::oox::core::FilterBase& /* rFi
 #endif
         }
 
-        aPropertyMap.setProperty( PROP_MirroredX, (sal_Bool) mbMirroredX );
-        aPropertyMap.setProperty( PROP_MirroredY, (sal_Bool) mbMirroredY );
+        aPropertyMap.setProperty( PROP_MirroredX, mbMirroredX );
+        aPropertyMap.setProperty( PROP_MirroredY, mbMirroredY );
         aPropertyMap.setProperty( PROP_TextPreRotateAngle, mnTextRotateAngle );
-        aPropertyMap.setProperty( PROP_IsPostRotateAngle, (sal_Bool)true); // For OpenXML Imports
+        aPropertyMap.setProperty( PROP_IsPostRotateAngle, true); // For OpenXML Imports
         Sequence< PropertyValue > aSeq = aPropertyMap.makePropertyValueSequence();
         aPropSet.setProperty( PROP_CustomShapeGeometry, aSeq );
 
diff --git a/oox/source/drawingml/shape.cxx b/oox/source/drawingml/shape.cxx
index 2b9220a..36cbc0c 100644
--- a/oox/source/drawingml/shape.cxx
+++ b/oox/source/drawingml/shape.cxx
@@ -408,8 +408,8 @@ Reference< XShape > Shape::createAndInsert(
     {
         aServiceName = finalizeServiceName( rFilterBase, rServiceName, aShapeRectHmm );
     }
-    sal_Bool bIsCustomShape = ( aServiceName == "com.sun.star.drawing.CustomShape" ||
-                                aServiceName == "com.sun.star.drawing.ConnectorShape" );
+    bool bIsCustomShape = ( aServiceName == "com.sun.star.drawing.CustomShape" ||
+                            aServiceName == "com.sun.star.drawing.ConnectorShape" );
 
     basegfx::B2DHomMatrix aTransformation;
 


More information about the Libreoffice-commits mailing list