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

Gary Houston ghouston at arglist.com
Wed Jan 21 05:22:45 PST 2015


 oox/source/drawingml/shape.cxx                     |    5 +++-
 oox/source/drawingml/textbodypropertiescontext.cxx |   11 +++++----
 oox/source/drawingml/transform2dcontext.cxx        |    2 -
 sw/qa/extras/ooxmlimport/data/fdo87488.docx        |binary
 sw/qa/extras/ooxmlimport/ooxmlimport.cxx           |   25 +++++++++++++++++++--
 5 files changed, 35 insertions(+), 8 deletions(-)

New commits:
commit 921cea89da8adbe714ea8f71169dd6afc42354c4
Author: Gary Houston <ghouston at arglist.com>
Date:   Sat Dec 20 15:41:15 2014 +1100

    fdo#87488 Wrong text rotation inside a preset shape from docx
    
    Preset shape text rotation values are read in a few places and stored in
    moRotation. With these changes, moRotation is always read unchanged, but
    multiplied by -1 when it's used.
    
    Change-Id: I633d665c21daa69e15fa828a43300f10d2bf2054
    Reviewed-on: https://gerrit.libreoffice.org/13561
    Reviewed-by: Miklos Vajna <vmiklos at collabora.co.uk>
    Tested-by: Miklos Vajna <vmiklos at collabora.co.uk>

diff --git a/oox/source/drawingml/shape.cxx b/oox/source/drawingml/shape.cxx
index 7fdfefd..59350e2 100644
--- a/oox/source/drawingml/shape.cxx
+++ b/oox/source/drawingml/shape.cxx
@@ -1014,7 +1014,10 @@ Reference< XShape > Shape::createAndInsert(
             if( getTextBody() )
             {
                 sal_Int32 nTextRotateAngle = static_cast< sal_Int32 >( getTextBody()->getTextProperties().moRotation.get( 0 ) );
-                mpCustomShapePropertiesPtr->setTextRotateAngle( nTextRotateAngle / 60000 );
+                /* OOX measures text rotation clockwise in 1/60000th degrees,
+                   relative to the containing shape. setTextRotateAngle wants
+                   degrees anticlockwise. */
+                mpCustomShapePropertiesPtr->setTextRotateAngle( -1 * nTextRotateAngle / 60000 );
             }
 
             SAL_INFO("oox.cscode", "==cscode== shape name: '" << msName << "'");
diff --git a/oox/source/drawingml/textbodypropertiescontext.cxx b/oox/source/drawingml/textbodypropertiescontext.cxx
index 89167b6..cc27437 100644
--- a/oox/source/drawingml/textbodypropertiescontext.cxx
+++ b/oox/source/drawingml/textbodypropertiescontext.cxx
@@ -84,13 +84,16 @@ TextBodyPropertiesContext::TextBodyPropertiesContext( ContextHandler2Helper& rPa
     // ST_TextVerticalType
     if( rAttribs.hasAttribute( XML_vert ) ) {
         mrTextBodyProp.moVert = rAttribs.getToken( XML_vert );
-        bool bRtl = rAttribs.getBool( XML_rtl, false );
         sal_Int32 tVert = mrTextBodyProp.moVert.get( XML_horz );
-        if( tVert == XML_vert || tVert == XML_eaVert || tVert == XML_vert270 || tVert == XML_mongolianVert )
-            mrTextBodyProp.moRotation = -5400000*(tVert==XML_vert270?3:1);
-        else
+        if (tVert == XML_vert || tVert == XML_eaVert || tVert == XML_mongolianVert)
+            mrTextBodyProp.moRotation = 5400000;
+        else if (tVert == XML_vert270)
+            mrTextBodyProp.moRotation = 5400000 * 3;
+        else {
+            bool bRtl = rAttribs.getBool( XML_rtl, false );
             mrTextBodyProp.maPropertyMap.setProperty( PROP_TextWritingMode,
                 ( bRtl ? WritingMode_RL_TB : WritingMode_LR_TB ));
+        }
     }
 
     // ST_TextAnchoringType
diff --git a/oox/source/drawingml/transform2dcontext.cxx b/oox/source/drawingml/transform2dcontext.cxx
index a6a39eb..10bd727 100644
--- a/oox/source/drawingml/transform2dcontext.cxx
+++ b/oox/source/drawingml/transform2dcontext.cxx
@@ -48,7 +48,7 @@ Transform2DContext::Transform2DContext( ContextHandler2Helper& rParent, const At
     else
     {
         if( rAttribs.hasAttribute( XML_rot ) )
-            mrShape.getTextBody()->getTextProperties().moRotation = -rAttribs.getInteger( XML_rot ).get();
+            mrShape.getTextBody()->getTextProperties().moRotation = rAttribs.getInteger( XML_rot ).get();
     }
 }
 
diff --git a/sw/qa/extras/ooxmlimport/data/fdo87488.docx b/sw/qa/extras/ooxmlimport/data/fdo87488.docx
new file mode 100644
index 0000000..2bd51b6
Binary files /dev/null and b/sw/qa/extras/ooxmlimport/data/fdo87488.docx differ
diff --git a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
index 7e8c62d..c1b0d95 100644
--- a/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
+++ b/sw/qa/extras/ooxmlimport/ooxmlimport.cxx
@@ -78,13 +78,13 @@ public:
 
     virtual void preTest(const char* filename) SAL_OVERRIDE
     {
-        if (OString(filename) == "smartart.docx" || OString(filename) == "strict-smartart.docx")
+        if (OString(filename) == "smartart.docx" || OString(filename) == "strict-smartart.docx" || OString(filename) == "fdo87488.docx")
             SvtFilterOptions::Get().SetSmartArt2Shape(true);
     }
 
     virtual void postTest(const char* filename) SAL_OVERRIDE
     {
-        if (OString(filename) == "smartart.docx" || OString(filename) == "strict-smartart.docx")
+        if (OString(filename) == "smartart.docx" || OString(filename) == "strict-smartart.docx" || OString(filename) == "fdo87488.docx")
             SvtFilterOptions::Get().SetSmartArt2Shape(false);
     }
 };
@@ -2573,6 +2573,27 @@ DECLARE_OOXMLIMPORT_TEST(testChtOutlineNumberingOoxml, "chtoutline.docx")
     CPPUNIT_ASSERT_EQUAL(OUString(aExpectedSuffix,SAL_N_ELEMENTS(aExpectedSuffix)), aSuffix);
 }
 
+DECLARE_OOXMLIMPORT_TEST(testFdo87488, "fdo87488.docx")
+{
+    // The shape on the right (index 0, CustomShape within a
+    // GroupShape) is rotated 90 degrees clockwise and contains text
+    // rotated 90 degrees anticlockwise.  Must be read with SmartArt
+    // enabled in preTest above, otherwise it gets converted to a
+    // StarView MetaFile.
+    uno::Reference<container::XIndexAccess> group(getShape(1), uno::UNO_QUERY);
+    {
+        uno::Reference<text::XTextRange> text(group->getByIndex(0), uno::UNO_QUERY);
+        CPPUNIT_ASSERT_EQUAL(OUString("text2"), text->getString());
+    }
+    {
+        uno::Reference<beans::XPropertySet> props(group->getByIndex(0), uno::UNO_QUERY);
+        CPPUNIT_ASSERT_EQUAL(props->getPropertyValue("RotateAngle"),
+                             uno::makeAny(270 * 100));
+        comphelper::SequenceAsHashMap geom(props->getPropertyValue("CustomShapeGeometry"));
+        CPPUNIT_ASSERT_EQUAL(sal_Int32(90), geom["TextPreRotateAngle"].get<sal_Int32>());
+    }
+}
+
 #endif
 
 CPPUNIT_PLUGIN_IMPLEMENT();


More information about the Libreoffice-commits mailing list