sw/qa/extras/ooxmlexport/data/frame.fodt     |   75 +++++++++++++++++++++++++++
 sw/qa/extras/ooxmlexport/ooxmlexport6.cxx    |   23 ++++++++
 sw/source/filter/ww8/attributeoutputbase.hxx |    2 
 sw/source/filter/ww8/docxattributeoutput.cxx |   24 ++++++++
 sw/source/filter/ww8/docxattributeoutput.hxx |    1 
 sw/source/filter/ww8/ww8atr.cxx              |    9 +++
 6 files changed, 134 insertions(+)

New commits:
commit 990245577df21b5ffd6fbaa548500731f31b1d36
Author:     Michael Stahl <michael.st...@cib.de>
AuthorDate: Wed Aug 26 17:08:00 2020 +0200
Commit:     Caolán McNamara <caol...@redhat.com>
CommitDate: Thu Aug 27 15:41:16 2020 +0200

    sw: DOCX export: don't export text frames as transparent
    
    Writer paints text frames without fill still as opaque but nothing is
    written in the DOCX file and Word by default treats DrawingML text frame
    as transparent (the VML fallback is opaque though).
    
    Change-Id: I0ce539ac8084c5047b4732abc5c199589ee369ee
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/101411
    Tested-by: Jenkins
    Reviewed-by: Michael Stahl <michael.st...@cib.de>
    (cherry picked from commit d84e590486e2c26212931de80a84181d7aca7bbe)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/101426
    Reviewed-by: Caolán McNamara <caol...@redhat.com>

diff --git a/sw/qa/extras/ooxmlexport/data/frame.fodt 
b/sw/qa/extras/ooxmlexport/data/frame.fodt
new file mode 100644
index 000000000000..c474b8de5e9e
--- /dev/null
+++ b/sw/qa/extras/ooxmlexport/data/frame.fodt
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<office:document xmlns:css3t="http://www.w3.org/TR/css3-text/"; 
xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" 
xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" 
xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" 
xmlns:oooc="http://openoffice.org/2004/calc"; 
xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" 
xmlns:ooow="http://openoffice.org/2004/writer"; 
xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" 
xmlns:dc="http://purl.org/dc/elements/1.1/"; 
xmlns:rpt="http://openoffice.org/2005/report"; 
xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" 
xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" 
xmlns:xlink="http://www.w3.org/1999/xlink"; 
xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" 
xmlns:ooo="http://openoffice.org/2004/office"; 
xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" 
xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0"
 xmlns:d
 r3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" 
xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" 
xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" 
xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" 
xmlns:math="http://www.w3.org/1998/Math/MathML"; 
xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" 
xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" 
xmlns:dom="http://www.w3.org/2001/xml-events"; 
xmlns:xforms="http://www.w3.org/2002/xforms"; 
xmlns:xsd="http://www.w3.org/2001/XMLSchema"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xmlns:xhtml="http://www.w3.org/1999/xhtml"; 
xmlns:grddl="http://www.w3.org/2003/g/data-view#"; office:version="1.3" 
office:mimetype="application/vnd.oasis.opendocument.text">
+ <office:font-face-decls>
+  <style:font-face style:name="Liberation Serif" 
svg:font-family="&apos;Liberation Serif&apos;" 
style:font-family-generic="roman" style:font-pitch="variable"/>
+  <style:font-face style:name="Lohit Devanagari" svg:font-family="&apos;Lohit 
Devanagari&apos;" style:font-family-generic="system" 
style:font-pitch="variable"/>
+  <style:font-face style:name="Source Han Serif CN" 
svg:font-family="&apos;Source Han Serif CN&apos;" 
style:font-family-generic="system" style:font-pitch="variable"/>
+ </office:font-face-decls>
+ <office:styles>
+  <style:default-style style:family="graphic">
+   <style:graphic-properties svg:stroke-color="#3465a4" 
draw:fill-color="#729fcf" fo:wrap-option="no-wrap" draw:shadow-offset-x="0.3cm" 
draw:shadow-offset-y="0.3cm" draw:start-line-spacing-horizontal="0.283cm" 
draw:start-line-spacing-vertical="0.283cm" 
draw:end-line-spacing-horizontal="0.283cm" 
draw:end-line-spacing-vertical="0.283cm" style:flow-with-text="false"/>
+   <style:paragraph-properties style:text-autospace="ideograph-alpha" 
style:line-break="strict" style:writing-mode="lr-tb" 
style:font-independent-line-spacing="false">
+    <style:tab-stops/>
+   </style:paragraph-properties>
+   <style:text-properties style:use-window-font-color="true" 
style:font-name="Liberation Serif" fo:font-size="12pt" fo:language="de" 
fo:country="DE" style:letter-kerning="true" style:font-name-asian="Source Han 
Serif CN" style:font-size-asian="10.5pt" style:language-asian="zh" 
style:country-asian="CN" style:font-name-complex="Lohit Devanagari" 
style:font-size-complex="12pt" style:language-complex="hi" 
style:country-complex="IN"/>
+  </style:default-style>
+  <style:default-style style:family="paragraph">
+   <style:paragraph-properties fo:orphans="2" fo:widows="2" 
fo:hyphenation-ladder-count="no-limit" style:text-autospace="ideograph-alpha" 
style:punctuation-wrap="hanging" style:line-break="strict" 
style:tab-stop-distance="1.251cm" style:writing-mode="page"/>
+   <style:text-properties style:use-window-font-color="true" 
style:font-name="Liberation Serif" fo:font-size="12pt" fo:language="de" 
fo:country="DE" style:letter-kerning="true" style:font-name-asian="Source Han 
Serif CN" style:font-size-asian="10.5pt" style:language-asian="zh" 
style:country-asian="CN" style:font-name-complex="Lohit Devanagari" 
style:font-size-complex="12pt" style:language-complex="hi" 
style:country-complex="IN" fo:hyphenate="false" 
fo:hyphenation-remain-char-count="2" fo:hyphenation-push-char-count="2"/>
+  </style:default-style>
+  <style:default-style style:family="table">
+   <style:table-properties table:border-model="collapsing"/>
+  </style:default-style>
+  <style:default-style style:family="table-row">
+   <style:table-row-properties fo:keep-together="auto"/>
+  </style:default-style>
+  <style:style style:name="Standard" style:family="paragraph" 
style:class="text"/>
+  <style:style style:name="Frame_20_contents" style:display-name="Frame 
contents" style:family="paragraph" style:parent-style-name="Standard" 
style:class="extra"/>
+  <style:style style:name="Frame" style:family="graphic">
+   <style:graphic-properties text:anchor-type="paragraph" svg:x="0cm" 
svg:y="0cm" fo:margin-left="0.201cm" fo:margin-right="0.201cm" 
fo:margin-top="0.201cm" fo:margin-bottom="0.201cm" style:wrap="parallel" 
style:number-wrapped-paragraphs="no-limit" style:wrap-contour="false" 
style:vertical-pos="top" style:vertical-rel="paragraph-content" 
style:horizontal-pos="center" style:horizontal-rel="paragraph-content" 
fo:padding="0.15cm" fo:border="0.06pt solid #000000"/>
+  </style:style>
+
+  <text:notes-configuration text:note-class="footnote" style:num-format="1" 
text:start-value="0" text:footnotes-position="page" 
text:start-numbering-at="document"/>
+  <text:notes-configuration text:note-class="endnote" style:num-format="i" 
text:start-value="0"/>
+  <text:linenumbering-configuration text:number-lines="false" 
text:offset="0.499cm" style:num-format="1" text:number-position="left" 
text:increment="5"/>
+ </office:styles>
+ <office:automatic-styles>
+  <style:style style:name="fr1" style:family="graphic" 
style:parent-style-name="Frame">
+   <style:graphic-properties style:wrap="run-through" 
style:number-wrapped-paragraphs="no-limit" style:vertical-pos="from-top" 
style:vertical-rel="paragraph" style:horizontal-pos="from-left" 
style:horizontal-rel="paragraph" draw:opacity="0%" 
draw:wrap-influence-on-position="once-concurrent"/>
+  </style:style>
+  <style:style style:name="fr2" style:family="graphic" 
style:parent-style-name="Frame">
+   <style:graphic-properties style:wrap="run-through" 
style:number-wrapped-paragraphs="no-limit" style:vertical-pos="from-top" 
style:vertical-rel="paragraph" style:horizontal-pos="from-left" 
style:horizontal-rel="paragraph" fo:background-color="#e8f2a1" 
draw:fill="solid" draw:fill-color="#e8f2a1" 
draw:wrap-influence-on-position="once-concurrent"/>
+  </style:style>
+  <style:style style:name="fr3" style:family="graphic" 
style:parent-style-name="Frame">
+   <style:graphic-properties style:run-through="foreground" 
style:wrap="run-through" style:number-wrapped-paragraphs="no-limit" 
style:vertical-pos="from-top" style:vertical-rel="paragraph" 
style:horizontal-pos="from-left" style:horizontal-rel="paragraph"/>
+  </style:style>
+  <style:page-layout style:name="pm1">
+   <style:page-layout-properties fo:page-width="21.001cm" 
fo:page-height="29.7cm" style:num-format="1" style:print-orientation="portrait" 
fo:margin-top="2cm" fo:margin-bottom="2cm" fo:margin-left="2cm" 
fo:margin-right="2cm" style:writing-mode="lr-tb" 
style:layout-grid-color="#c0c0c0" style:layout-grid-lines="20" 
style:layout-grid-base-height="0.706cm" style:layout-grid-ruby-height="0.353cm" 
style:layout-grid-mode="none" style:layout-grid-ruby-below="false" 
style:layout-grid-print="false" style:layout-grid-display="false" 
style:footnote-max-height="0cm">
+    <style:footnote-sep style:width="0.018cm" 
style:distance-before-sep="0.101cm" style:distance-after-sep="0.101cm" 
style:line-style="solid" style:adjustment="left" style:rel-width="25%" 
style:color="#000000"/>
+   </style:page-layout-properties>
+   <style:header-style/>
+   <style:footer-style/>
+  </style:page-layout>
+ </office:automatic-styles>
+ <office:master-styles>
+  <style:master-page style:name="Standard" style:page-layout-name="pm1"/>
+ </office:master-styles>
+ <office:body>
+  <office:text>
+   <text:p text:style-name="Standard"><draw:frame draw:style-name="fr3" 
draw:name="Frame1" text:anchor-type="paragraph" svg:x="0.87cm" svg:y="0cm" 
svg:width="2cm" draw:z-index="0">
+     <draw:text-box fo:min-height="0.499cm">
+      <text:p text:style-name="Frame_20_contents">opaque</text:p>
+     </draw:text-box>
+    </draw:frame><draw:frame draw:style-name="fr2" draw:name="Frame2" 
text:anchor-type="paragraph" svg:x="3.069cm" svg:y="0cm" svg:width="2cm" 
draw:z-index="1">
+     <draw:text-box fo:min-height="0.499cm">
+      <text:p text:style-name="Frame_20_contents">solid</text:p>
+     </draw:text-box>
+    </draw:frame><draw:frame draw:style-name="fr1" draw:name="Frame3" 
text:anchor-type="paragraph" svg:x="5.33cm" svg:y="0cm" svg:width="2.281cm" 
draw:z-index="2">
+     <draw:text-box fo:min-height="0.499cm">
+      <text:p text:style-name="Frame_20_contents">transparent</text:p>
+     </draw:text-box>
+    </draw:frame></text:p>
+  </office:text>
+ </office:body>
+</office:document>
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport6.cxx 
b/sw/qa/extras/ooxmlexport/ooxmlexport6.cxx
index 123a339c6232..7702b935f3fe 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport6.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport6.cxx
@@ -149,6 +149,29 @@ DECLARE_OOXMLEXPORT_TEST(testDMLSolidfillAlpha, 
"dml-solidfill-alpha.docx")
     CPPUNIT_ASSERT_EQUAL(sal_Int16(20), getProperty<sal_Int16>(xShape, 
"FillTransparence"));
 }
 
+DECLARE_OOXMLEXPORT_TEST(testDMLTextFrameNoFill, "frame.fodt")
+{
+    // Problem is that default text frame background is white in Writer and 
transparent in Word
+    uno::Reference<beans::XPropertySet> xShape1(getShape(1), uno::UNO_QUERY);
+// it is re-imported as solid
+//    CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_NONE, 
getProperty<drawing::FillStyle>(xShape1, "FillStyle"));
+    CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, 
getProperty<drawing::FillStyle>(xShape1, "FillStyle"));
+    CPPUNIT_ASSERT_EQUAL(sal_Int16(0), getProperty<sal_Int16>(xShape1, 
"FillTransparence"));
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(0xffffff), getProperty<sal_Int32>(xShape1, 
"FillColor"));
+
+    uno::Reference<beans::XPropertySet> xShape2(getShape(2), uno::UNO_QUERY);
+    CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, 
getProperty<drawing::FillStyle>(xShape2, "FillStyle"));
+    CPPUNIT_ASSERT_EQUAL(sal_Int16(0), getProperty<sal_Int16>(xShape2, 
"FillTransparence"));
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(0xE8F2A1), getProperty<sal_Int32>(xShape2, 
"FillColor"));
+
+    uno::Reference<beans::XPropertySet> xShape3(getShape(3), uno::UNO_QUERY);
+// it is re-imported as solid
+//    CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_NONE, 
getProperty<drawing::FillStyle>(xShape3, "FillStyle"));
+    CPPUNIT_ASSERT_EQUAL(drawing::FillStyle_SOLID, 
getProperty<drawing::FillStyle>(xShape3, "FillStyle"));
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(0xffffff), getProperty<sal_Int32>(xShape3, 
"FillColor"));
+    CPPUNIT_ASSERT_EQUAL(sal_Int16(100), getProperty<sal_Int16>(xShape3, 
"FillTransparence"));
+}
+
 DECLARE_OOXMLEXPORT_TEST(testDMLCustomGeometry, 
"dml-customgeometry-cubicbezier.docx")
 {
 
diff --git a/sw/source/filter/ww8/attributeoutputbase.hxx 
b/sw/source/filter/ww8/attributeoutputbase.hxx
index d8b851da17d7..89865c7de7f5 100644
--- a/sw/source/filter/ww8/attributeoutputbase.hxx
+++ b/sw/source/filter/ww8/attributeoutputbase.hxx
@@ -668,6 +668,8 @@ public:
     ( ww8::WW8TableNodeInfoInner const * pTableTextNodeInfoInner,
       long& rPageSize, bool& rRelBoxSize );
 
+    virtual void MaybeOutputBrushItem(SfxItemSet const&) { }
+
     /// Exports the definition (image, size) of a single numbering picture 
bullet.
     virtual void BulletDefinition(int /*nId*/, const Graphic& /*rGraphic*/, 
Size /*aSize*/) {}
 
diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx 
b/sw/source/filter/ww8/docxattributeoutput.cxx
index 8a3791a9d898..82727d587bc1 100644
--- a/sw/source/filter/ww8/docxattributeoutput.cxx
+++ b/sw/source/filter/ww8/docxattributeoutput.cxx
@@ -89,8 +89,10 @@
 #include <editeng/editobj.hxx>
 #include <editeng/keepitem.hxx>
 #include <svx/xfillit0.hxx>
+#include <svx/xflclit.hxx>
 #include <svx/xflgrit.hxx>
 #include <svx/svdouno.hxx>
+#include <svx/unobrushitemhelper.hxx>
 #include <svl/grabbagitem.hxx>
 #include <sfx2/sfxbasemodel.hxx>
 #include <tools/datetimeutils.hxx>
@@ -5969,6 +5971,27 @@ oox::drawingml::DrawingML& 
DocxAttributeOutput::GetDrawingML()
     return m_rDrawingML;
 }
 
+void DocxAttributeOutput::MaybeOutputBrushItem(SfxItemSet const& rSet)
+{
+    const XFillStyleItem* 
pXFillStyleItem(rSet.GetItem<XFillStyleItem>(XATTR_FILLSTYLE));
+
+    if ((pXFillStyleItem && pXFillStyleItem->GetValue() != 
drawing::FillStyle_NONE)
+        || !m_rExport.SdrExporter().getDMLTextFrameSyntax())
+    {
+        return;
+    }
+
+    // sw text frames are opaque by default, even with fill none!
+    std::unique_ptr<SfxItemSet> const pClone(rSet.Clone());
+    XFillColorItem const aColor(OUString(), COL_WHITE);
+    pClone->Put(aColor);
+    // call getSvxBrushItemForSolid - this also takes XFillTransparenceItem 
into account
+    XFillStyleItem const aSolid(drawing::FillStyle_SOLID);
+    pClone->Put(aSolid);
+    std::unique_ptr<SvxBrushItem> const 
pBrush(getSvxBrushItemFromSourceSet(*pClone, RES_BACKGROUND));
+    FormatBackground(*pBrush);
+}
+
 namespace {
 
 /// Functor to do case-insensitive ordering of OUString instances.
@@ -8813,6 +8836,7 @@ void DocxAttributeOutput::FormatBox( const SvxBoxItem& 
rBox )
 {
     if (m_rExport.SdrExporter().getDMLTextFrameSyntax())
     {
+        // ugh, exporting fill here is quite some hack... this OutputItemSet 
abstraction is quite leaky
         // <a:gradFill> should be before <a:ln>.
         const SfxPoolItem* pItem = GetExport().HasItem(XATTR_FILLSTYLE);
         if (pItem)
diff --git a/sw/source/filter/ww8/docxattributeoutput.hxx 
b/sw/source/filter/ww8/docxattributeoutput.hxx
index 83e3110734ba..471992eed57f 100644
--- a/sw/source/filter/ww8/docxattributeoutput.hxx
+++ b/sw/source/filter/ww8/docxattributeoutput.hxx
@@ -1018,6 +1018,7 @@ public:
     virtual OUString FindRelId(BitmapChecksum nChecksum) override;
     virtual void CacheRelId(BitmapChecksum nChecksum, const OUString& rRelId) 
override;
     virtual oox::drawingml::DrawingML& GetDrawingML() override;
+    virtual void MaybeOutputBrushItem(SfxItemSet const&) override;
 
     void BulletDefinition(int nId, const Graphic& rGraphic, Size aSize) 
override;
 
diff --git a/sw/source/filter/ww8/ww8atr.cxx b/sw/source/filter/ww8/ww8atr.cxx
index 7b908abb67e6..4272bce9eebc 100644
--- a/sw/source/filter/ww8/ww8atr.cxx
+++ b/sw/source/filter/ww8/ww8atr.cxx
@@ -330,6 +330,8 @@ void MSWordExportBase::OutputItemSet( const SfxItemSet& 
rSet, bool bPapFormat, b
             ExportPoolItemsToCHP(aItems, nScript, nullptr);
         if ( bPapFormat )
         {
+            AttrOutput().MaybeOutputBrushItem(rSet);
+
             for ( const auto& rItem : aItems )
             {
                 pItem = rItem.second;
@@ -348,6 +350,13 @@ void MSWordExportBase::OutputItemSet( const SfxItemSet& 
rSet, bool bPapFormat, b
                 std::unique_ptr<SvxBrushItem> 
aBrush(getSvxBrushItemFromSourceSet(rSet, RES_BACKGROUND));
                 AttrOutput().OutputItem(*aBrush);
             }
+#if 0
+            else
+            {
+                // note: *does not work* due to undocumented Word behavior: 
must be before a:ln element at least
+                AttrOutput().MaybeOutputBrushItem(rSet);
+            }
+#endif
         }
         m_pISet = nullptr;                      // for double attributes
     }
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to