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

Miklos Vajna vmiklos at collabora.co.uk
Thu Jun 22 16:58:11 UTC 2017


 sw/qa/extras/ooxmlexport/data/tdf108682.docx |binary
 sw/qa/extras/ooxmlexport/ooxmlexport9.cxx    |   11 +++++++++++
 writerfilter/source/dmapper/DomainMapper.cxx |   16 +++++++++++++---
 3 files changed, 24 insertions(+), 3 deletions(-)

New commits:
commit f575f70b8303ba187f6989920281ff02e7a431c9
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Thu Jun 22 13:41:30 2017 +0200

    tdf#108682 DOCX import: fix <w:spacing w:line=...> for negative values
    
    I didn't find UI in Word to create
    
    <w:spacing w:line="-260" w:lineRule="auto"/>
    
    the equivalent markup when you set line spacing to exactly 13pt for new
    documents is:
    
    <w:spacing w:line="260" w:lineRule="exact"/>
    
    The OOXML spec and Microsoft's implementer notes ([MS-OI29500]) is also
    pretty silent about what a negative value means. However, if this markup
    is converted to WW8 by Word, then the WW8 LPSD structure is like this
    (as presented by doc-dumper):
    
    <lspd type="LSPD" offset="5086">
      <dyaLine value="0xfefc"/>
      <fMultLinespace value="0x1"/>
    </lspd>
    
    For the 0xfefc value the [MS-DOC] spec clearly states that means the
    type of the spacing is "exactly", with the value of 0x10000-0xfefc, i.e.
    the same 260 twips.
    
    Change-Id: I84b485d02dea49c610b6df2e06ccce03e1d29d21
    Reviewed-on: https://gerrit.libreoffice.org/39091
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Miklos Vajna <vmiklos at collabora.co.uk>

diff --git a/sw/qa/extras/ooxmlexport/data/tdf108682.docx b/sw/qa/extras/ooxmlexport/data/tdf108682.docx
new file mode 100644
index 000000000000..1364025b826c
Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf108682.docx differ
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport9.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport9.cxx
index 39af9d435af7..93f3f320f27d 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport9.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport9.cxx
@@ -25,6 +25,8 @@
 #include <com/sun/star/text/HoriOrientation.hpp>
 #include <com/sun/star/text/RelOrientation.hpp>
 #include <com/sun/star/view/XViewSettingsSupplier.hpp>
+#include <com/sun/star/style/LineSpacing.hpp>
+#include <com/sun/star/style/LineSpacingMode.hpp>
 
 #include <sfx2/docfile.hxx>
 #include <sfx2/docfilt.hxx>
@@ -694,6 +696,15 @@ DECLARE_OOXMLEXPORT_TEST(testTdf107618, "tdf107618.doc")
     CPPUNIT_ASSERT_EQUAL(true, getProperty<bool>(xPageStyle, "HeaderIsOn"));
 }
 
+DECLARE_OOXMLEXPORT_TEST(testTdf108682, "tdf108682.docx")
+{
+    auto aLineSpacing = getProperty<style::LineSpacing>(getParagraph(1), "ParaLineSpacing");
+    // This was style::LineSpacingMode::PROP.
+    CPPUNIT_ASSERT_EQUAL(style::LineSpacingMode::FIX, aLineSpacing.Mode);
+    // 260 twips in mm100, this was a negative value.
+    CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int16>(459), aLineSpacing.Height);
+}
+
 CPPUNIT_PLUGIN_IMPLEMENT();
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/DomainMapper.cxx b/writerfilter/source/dmapper/DomainMapper.cxx
index 67bd4648e42f..7253ae190581 100644
--- a/writerfilter/source/dmapper/DomainMapper.cxx
+++ b/writerfilter/source/dmapper/DomainMapper.cxx
@@ -453,9 +453,19 @@ void DomainMapper::lcl_attribute(Id nName, Value & val)
                     if( sal::static_int_cast<Id>(nIntValue) == NS_ooxml::LN_Value_doc_ST_LineSpacingRule_auto)
                     {
                         m_pImpl->appendGrabBag(m_pImpl->m_aSubInteropGrabBag, "lineRule", "auto");
-                        aSpacing.Mode = style::LineSpacingMode::PROP;
-                        //reinterpret the already set value
-                        aSpacing.Height = sal_Int16( aSpacing.Height * 100 /  ConversionHelper::convertTwipToMM100( nSingleLineSpacing ));
+                        if (aSpacing.Height >= 0)
+                        {
+                            aSpacing.Mode = style::LineSpacingMode::PROP;
+                            //reinterpret the already set value
+                            aSpacing.Height = sal_Int16( aSpacing.Height * 100 /  ConversionHelper::convertTwipToMM100( nSingleLineSpacing ));
+                        }
+                        else
+                        {
+                            // Negative value still means a positive height,
+                            // just the mode is "exact".
+                            aSpacing.Mode = style::LineSpacingMode::FIX;
+                            aSpacing.Height *= -1;
+                        }
                     }
                     else if( sal::static_int_cast<Id>(nIntValue) == NS_ooxml::LN_Value_doc_ST_LineSpacingRule_atLeast)
                     {


More information about the Libreoffice-commits mailing list