oox/source/drawingml/shape.cxx                                 |    1 +
 oox/source/export/drawingml.cxx                                |    8 +++++++-
 sw/qa/extras/ooxmlexport/data/tdf126363_LineWidthRounding.docx |binary
 sw/qa/extras/ooxmlexport/ooxmlexport14.cxx                     |   10 
++++++++++
 4 files changed, 18 insertions(+), 1 deletion(-)

New commits:
commit c28d6b99599eaeb923804547c3ac849b6feec044
Author:     Regényi Balázs <regenyi.balazs+ger...@gmail.com>
AuthorDate: Mon May 11 16:16:59 2020 +0200
Commit:     László Németh <nem...@numbertext.org>
CommitDate: Wed May 20 17:01:05 2020 +0200

    tdf#126363 DOCX shape round-trip: keep original line width
    
    to avoid of rounding error of EMU -> 1/100 mm -> EMU
    conversions, which messed up recognition of preset
    line widths in MSO.
    
    Co-authored-by: Szabolcs Tóth
    
    Change-Id: Ide0e393e667848683f00f9ba7a73ff8a45a908b0
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/94043
    Tested-by: László Németh <nem...@numbertext.org>
    Reviewed-by: László Németh <nem...@numbertext.org>

diff --git a/oox/source/drawingml/shape.cxx b/oox/source/drawingml/shape.cxx
index 202e2927e80c..cd7c289e9efa 100644
--- a/oox/source/drawingml/shape.cxx
+++ b/oox/source/drawingml/shape.cxx
@@ -1251,6 +1251,7 @@ Reference< XShape > const & Shape::createAndInsert(
 
             // Store original fill and line colors of the shape and the theme 
color name to InteropGrabBag
             std::vector<beans::PropertyValue> aProperties;
+            
aProperties.push_back(comphelper::makePropertyValue("EmuLineWidth", 
aLineProperties.moLineWidth.get(0)));
             
aProperties.push_back(comphelper::makePropertyValue("OriginalSolidFillClr", 
aShapeProps.getProperty(PROP_FillColor)));
             
aProperties.push_back(comphelper::makePropertyValue("OriginalLnSolidFillClr", 
aShapeProps.getProperty(PROP_LineColor)));
             OUString sColorFillScheme = 
aFillProperties.maFillColor.getSchemeName();
diff --git a/oox/source/export/drawingml.cxx b/oox/source/export/drawingml.cxx
index c925819dd9f8..2d44aec64465 100644
--- a/oox/source/export/drawingml.cxx
+++ b/oox/source/export/drawingml.cxx
@@ -748,6 +748,7 @@ void DrawingML::WriteOutline( const 
Reference<XPropertySet>& rXPropSet, Referenc
         mAny >>= aLineStyle;
 
     sal_uInt32 nLineWidth = 0;
+    sal_uInt32 nEmuLineWidth = 0;
     ::Color nColor;
     sal_Int32 nColorAlpha = MAX_PERCENT;
     bool bColorSet = false;
@@ -784,6 +785,8 @@ void DrawingML::WriteOutline( const 
Reference<XPropertySet>& rXPropSet, Referenc
                 rProp.Value >>= aStyleProperties;
             else if( rProp.Name == "SpPrLnSolidFillSchemeClrTransformations" )
                 rProp.Value >>= aTransformations;
+            else if( rProp.Name == "EmuLineWidth" )
+                rProp.Value >>= nEmuLineWidth;
         }
         for (const auto& rStyleProp : std::as_const(aStyleProperties))
         {
@@ -864,10 +867,13 @@ void DrawingML::WriteOutline( const 
Reference<XPropertySet>& rXPropSet, Referenc
             break;
     }
 
+    // if the line-width was not modified after importing then the original 
EMU value will be exported to avoid unexpected conversion (rounding) error
+    if (nEmuLineWidth == 0 || 
static_cast<sal_uInt32>(oox::drawingml::convertEmuToHmm(nEmuLineWidth)) != 
nLineWidth)
+        nEmuLineWidth = oox::drawingml::convertHmmToEmu(nLineWidth);
     mpFS->startElementNS( XML_a, XML_ln,
                           XML_cap, cap,
                           XML_w, nLineWidth == 0 || (nLineWidth > 1 && 
nStyleLineWidth != nLineWidth) ?
-                              
OString::number(oox::drawingml::convertHmmToEmu(nLineWidth)).getStr() : nullptr 
);
+                              OString::number(nEmuLineWidth).getStr() : 
nullptr );
 
     if( bColorSet )
     {
diff --git a/sw/qa/extras/ooxmlexport/data/tdf126363_LineWidthRounding.docx 
b/sw/qa/extras/ooxmlexport/data/tdf126363_LineWidthRounding.docx
new file mode 100644
index 000000000000..180383ec6842
Binary files /dev/null and 
b/sw/qa/extras/ooxmlexport/data/tdf126363_LineWidthRounding.docx differ
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport14.cxx 
b/sw/qa/extras/ooxmlexport/ooxmlexport14.cxx
index a591a3caa8fe..dd6544eb3173 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport14.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport14.cxx
@@ -971,6 +971,16 @@ DECLARE_OOXMLEXPORT_EXPORTONLY_TEST(testTdf131539, 
"tdf131539.odt")
     CPPUNIT_ASSERT(aXmlVal.indexOf("margin-left:139.95")>-1);
 }
 
+DECLARE_OOXMLEXPORT_TEST(testLineWidthRounding, 
"tdf126363_LineWidthRounding.docx")
+{
+    // tdf#126363: check if line with stays the same after export
+    xmlDocUniquePtr pXml = parseExport("word/document.xml");
+    if (!pXml)
+        return;
+    // this was 57240 (it differs from the original 57150, losing the preset 
line width)
+    assertXPath(pXml, 
"/w:document/w:body/w:p/w:r/mc:AlternateContent/mc:Choice/w:drawing/wp:anchor/a:graphic/a:graphicData/wps:wsp/wps:spPr/a:ln",
 "w", "57150");
+}
+
 CPPUNIT_PLUGIN_IMPLEMENT();
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to