[Libreoffice-commits] core.git: Branch 'libreoffice-5-4' - include/oox oox/inc oox/source sd/qa

Tamás Zolnai tamas.zolnai at collabora.com
Tue Sep 26 20:02:20 UTC 2017


 include/oox/export/drawingml.hxx            |    2 +-
 oox/inc/drawingml/textspacing.hxx           |   14 +++++++++-----
 oox/source/drawingml/textspacingcontext.cxx |    1 +
 oox/source/export/drawingml.cxx             |    4 ++--
 sd/qa/unit/data/odp/tdf112647.odp           |binary
 sd/qa/unit/export-tests-ooxml2.cxx          |   19 +++++++++++++++++++
 6 files changed, 32 insertions(+), 8 deletions(-)

New commits:
commit b5d35c7e57a6adb650493cc3a04a2f3c57e0f8a6
Author: Tamás Zolnai <tamas.zolnai at collabora.com>
Date:   Tue Sep 26 15:49:12 2017 +0200

    tdf#112647: Fixed line spacing is saved incorrectly to PPTX
    
    The values were not converted to the right unit. Also the
    spcPts attribute means an exact value not a minimum one.
    
    Reviewed-on: https://gerrit.libreoffice.org/42763
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Tamás Zolnai <tamas.zolnai at collabora.com>
    (cherry picked from commit ef2e9b19a52e04ae0ed45900bcf64bf375a910ef)
    
    Change-Id: Ia49683e66153611e96a830f821e3a2487adec505
    Reviewed-on: https://gerrit.libreoffice.org/42813
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Michael Stahl <mstahl at redhat.com>

diff --git a/include/oox/export/drawingml.hxx b/include/oox/export/drawingml.hxx
index 677edbff5292..c213ae27d83a 100644
--- a/include/oox/export/drawingml.hxx
+++ b/include/oox/export/drawingml.hxx
@@ -186,7 +186,7 @@ public:
     void WriteSrcRect( const css::uno::Reference< css::beans::XPropertySet >&, const OUString& );
     void WriteOutline( const css::uno::Reference< css::beans::XPropertySet >& rXPropSet );
     void WriteStretch( const css::uno::Reference< css::beans::XPropertySet >& rXPropSet, const OUString& rURL );
-    void WriteLinespacing( css::style::LineSpacing& rLineSpacing );
+    void WriteLinespacing( const css::style::LineSpacing& rLineSpacing );
 
     OUString WriteBlip( const css::uno::Reference< css::beans::XPropertySet >& rXPropSet,
             const OUString& rURL, bool bRelPathToMedia = false , const Graphic *pGraphic=nullptr );
diff --git a/oox/inc/drawingml/textspacing.hxx b/oox/inc/drawingml/textspacing.hxx
index d1ed9a988169..ed5f9b3be8d0 100644
--- a/oox/inc/drawingml/textspacing.hxx
+++ b/oox/inc/drawingml/textspacing.hxx
@@ -38,16 +38,19 @@ namespace oox { namespace drawingml {
             Percent
         };
         TextSpacing()
-            : nUnit( Unit::Points ), nValue( 0 ), bHasValue( false )
+            : nUnit( Unit::Points ), nValue( 0 ), bHasValue( false ), bExactValue( false )
             {
             }
-        TextSpacing( sal_Int32 nPoints ) : nUnit( Unit::Points ), nValue( nPoints ), bHasValue( true ){};
+        TextSpacing( sal_Int32 nPoints ) : nUnit( Unit::Points ), nValue( nPoints ), bHasValue( true ), bExactValue ( false ){};
         css::style::LineSpacing toLineSpacing() const
             {
                 css::style::LineSpacing aSpacing;
-                aSpacing.Mode = ( nUnit == Unit::Percent
-                                  ? css::style::LineSpacingMode::PROP
-                                  :   css::style::LineSpacingMode::MINIMUM );
+                if (nUnit == Unit::Percent)
+                    aSpacing.Mode = css::style::LineSpacingMode::PROP;
+                else if (bExactValue)
+                    aSpacing.Mode = css::style::LineSpacingMode::FIX;
+                else
+                    aSpacing.Mode = css::style::LineSpacingMode::MINIMUM;
                 aSpacing.Height = static_cast< sal_Int16 >( nUnit == Unit::Percent ? nValue / 1000 :  nValue );
                 return aSpacing;
             }
@@ -61,6 +64,7 @@ namespace oox { namespace drawingml {
         Unit      nUnit;
         sal_Int32 nValue;
         bool      bHasValue;
+        bool      bExactValue;
     };
 
 } }
diff --git a/oox/source/drawingml/textspacingcontext.cxx b/oox/source/drawingml/textspacingcontext.cxx
index f33b1c10a4e5..e472418027c5 100644
--- a/oox/source/drawingml/textspacingcontext.cxx
+++ b/oox/source/drawingml/textspacingcontext.cxx
@@ -49,6 +49,7 @@ namespace oox { namespace drawingml {
         case A_TOKEN( spcPts ):
             maSpacing.nUnit = TextSpacing::Unit::Points;
             maSpacing.nValue = GetTextSpacingPoint( rAttribs.getString( XML_val ).get() );
+            maSpacing.bExactValue = true;
             break;
         default:
             break;
diff --git a/oox/source/export/drawingml.cxx b/oox/source/export/drawingml.cxx
index 16ad2a4d1749..4b327f63d76f 100644
--- a/oox/source/export/drawingml.cxx
+++ b/oox/source/export/drawingml.cxx
@@ -1936,7 +1936,7 @@ const char* DrawingML::GetAlignment( style::ParagraphAdjust nAlignment )
     return sAlignment;
 }
 
-void DrawingML::WriteLinespacing( LineSpacing& rSpacing )
+void DrawingML::WriteLinespacing( const LineSpacing& rSpacing )
 {
     if( rSpacing.Mode == LineSpacingMode::PROP )
     {
@@ -1947,7 +1947,7 @@ void DrawingML::WriteLinespacing( LineSpacing& rSpacing )
     else
     {
         mpFS->singleElementNS( XML_a, XML_spcPts,
-                               XML_val, I32S( rSpacing.Height ),
+                               XML_val, I32S( std::lround(rSpacing.Height / 25.4 * 72) ),
                                FSEND );
     }
 }
diff --git a/sd/qa/unit/data/odp/tdf112647.odp b/sd/qa/unit/data/odp/tdf112647.odp
new file mode 100755
index 000000000000..72a6621b8e86
Binary files /dev/null and b/sd/qa/unit/data/odp/tdf112647.odp differ
diff --git a/sd/qa/unit/export-tests-ooxml2.cxx b/sd/qa/unit/export-tests-ooxml2.cxx
index c7311ef1b5ca..abce5cda2c36 100644
--- a/sd/qa/unit/export-tests-ooxml2.cxx
+++ b/sd/qa/unit/export-tests-ooxml2.cxx
@@ -66,6 +66,8 @@
 #include <com/sun/star/drawing/FillStyle.hpp>
 #include <com/sun/star/text/WritingMode2.hpp>
 #include <com/sun/star/style/XStyleFamiliesSupplier.hpp>
+#include <com/sun/star/style/LineSpacing.hpp>
+#include <com/sun/star/style/LineSpacingMode.hpp>
 #include <com/sun/star/table/BorderLine2.hpp>
 #include <com/sun/star/table/XTable.hpp>
 #include <com/sun/star/table/XMergeableCell.hpp>
@@ -103,6 +105,7 @@ public:
     void testTdf105739();
     void testTdf112552();
     void testTdf112557();
+    void testTdf112647();
 
     CPPUNIT_TEST_SUITE(SdOOXMLExportTest2);
 
@@ -129,6 +132,7 @@ public:
     CPPUNIT_TEST(testTdf105739);
     CPPUNIT_TEST(testTdf112552);
     CPPUNIT_TEST(testTdf112557);
+    CPPUNIT_TEST(testTdf112647);
 
     CPPUNIT_TEST_SUITE_END();
 
@@ -813,6 +817,21 @@ void SdOOXMLExportTest2::testTdf112557()
     xDocShRef->DoClose();
 }
 
+void SdOOXMLExportTest2::testTdf112647()
+{
+    ::sd::DrawDocShellRef xDocShRef = loadURL( m_directories.getURLFromSrc("/sd/qa/unit/data/odp/tdf112647.odp"), ODP);
+    xDocShRef = saveAndReload( xDocShRef.get(), PPTX );
+    uno::Reference< beans::XPropertySet > xShape( getShapeFromPage( 0, 0, xDocShRef ) );
+    uno::Reference<text::XTextRange> xParagraph( getParagraphFromShape( 0, xShape ) );
+    uno::Reference< beans::XPropertySet > xPropSet( xParagraph, uno::UNO_QUERY_THROW );
+
+    css::style::LineSpacing aLineSpacing;
+    xPropSet->getPropertyValue("ParaLineSpacing") >>= aLineSpacing;
+    CPPUNIT_ASSERT_EQUAL(sal_Int16(css::style::LineSpacingMode::FIX), aLineSpacing.Mode);
+    CPPUNIT_ASSERT_EQUAL(sal_Int16(2117), aLineSpacing.Height);
+    xDocShRef->DoClose();
+}
+
 CPPUNIT_TEST_SUITE_REGISTRATION(SdOOXMLExportTest2);
 
 CPPUNIT_PLUGIN_IMPLEMENT();


More information about the Libreoffice-commits mailing list