sw/qa/extras/ooxmlexport/data/tdf111895_foregroundShape.docx  |binary
 sw/qa/extras/ooxmlexport/data/tdf111895_foregroundShape2.docx |binary
 sw/qa/extras/ooxmlexport/ooxmlexport9.cxx                     |   16 ++++++++++
 writerfilter/source/dmapper/DomainMapper.cxx                  |    5 +++
 writerfilter/source/dmapper/DomainMapper.hxx                  |    1 
 writerfilter/source/dmapper/GraphicImport.cxx                 |   16 +++++++++-
 6 files changed, 37 insertions(+), 1 deletion(-)

New commits:
commit d21f67fa7fd0360688e083eeb2bbcd57f5414d71
Author: Justin Luth <justin_l...@sil.org>
Date:   Wed Aug 23 19:02:12 2017 -0400

    tdf#111895 writerfilter: avoid hiding shapes behind background
    
    In MSO, page background is "in hell" zOrder, however
    in LO, page background is at the same zOrder as the text,
    so avoid hiding shapes behind the page background unless
    doing so would hide text.
    
    When importing gradients/pattern/hatch backgrounds are supported,
    HasPageBackground will need to be expanded to include those as well.
    
    Change-Id: I4496fd3f4c644ac9ac1854090658017078ce3e88
    Reviewed-on: https://gerrit.libreoffice.org/41486
    Tested-by: Jenkins <c...@libreoffice.org>
    Reviewed-by: Justin Luth <justin_l...@sil.org>
    Reviewed-by: Miklos Vajna <vmik...@collabora.co.uk>

diff --git a/sw/qa/extras/ooxmlexport/data/tdf111895_foregroundShape.docx 
b/sw/qa/extras/ooxmlexport/data/tdf111895_foregroundShape.docx
new file mode 100644
index 000000000000..b282059b1097
Binary files /dev/null and 
b/sw/qa/extras/ooxmlexport/data/tdf111895_foregroundShape.docx differ
diff --git a/sw/qa/extras/ooxmlexport/data/tdf111895_foregroundShape2.docx 
b/sw/qa/extras/ooxmlexport/data/tdf111895_foregroundShape2.docx
new file mode 100644
index 000000000000..ae2e3c7573db
Binary files /dev/null and 
b/sw/qa/extras/ooxmlexport/data/tdf111895_foregroundShape2.docx differ
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport9.cxx 
b/sw/qa/extras/ooxmlexport/ooxmlexport9.cxx
index a8abe8489c57..3867f468649b 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport9.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport9.cxx
@@ -229,6 +229,22 @@ DECLARE_OOXMLEXPORT_TEST(testTdf98700_keepWithNext, 
"tdf98700_keepWithNext.odt")
     CPPUNIT_ASSERT_EQUAL_MESSAGE("Text Body style toggled off keep with next", 
false, getProperty<bool>(getParagraph(5), "ParaKeepTogether"));
 }
 
+DECLARE_OOXMLEXPORT_TEST(testTdf111895_foregroundShape, 
"tdf111895_foregroundShape.docx")
+{
+    uno::Reference<beans::XPropertySet> 
xPageStyle(getStyles("PageStyles")->getByName("Standard"), uno::UNO_QUERY);
+    CPPUNIT_ASSERT_EQUAL_MESSAGE("Light yellow background", 
sal_Int32(0xFFFF66), getProperty<sal_Int32>(xPageStyle, "BackColor"));
+    // despite a behindDoc==1, put shape in foreground since the page 
background would have hidden it otherwise.
+    CPPUNIT_ASSERT_EQUAL_MESSAGE("Shape is in front of page background", true, 
getProperty<bool>(getShape(1), "Opaque"));
+}
+
+DECLARE_OOXMLEXPORT_TEST(testTdf111895_foregroundShape2, 
"tdf111895_foregroundShape2.docx")
+{
+    uno::Reference<beans::XPropertySet> 
xPageStyle(getStyles("PageStyles")->getByName("Standard"), uno::UNO_QUERY);
+    CPPUNIT_ASSERT_EQUAL_MESSAGE("Light yellow background", 
sal_Int32(0xFFFF66), getProperty<sal_Int32>(xPageStyle, "BackColor"));
+    // despite a page background, don't show behindDoc==1 shape in front since 
it would have hidden wrap_THROUGH text.
+    CPPUNIT_ASSERT_EQUAL_MESSAGE("Shape is in front of page background", 
false, getProperty<bool>(getShape(1), "Opaque"));
+}
+
 // base class to supply a helper method for testHFLinkToPrev
 class testHFBase : public Test
 {
diff --git a/writerfilter/source/dmapper/DomainMapper.cxx 
b/writerfilter/source/dmapper/DomainMapper.cxx
index 05a3e0ed16bf..5b52d1c5348f 100644
--- a/writerfilter/source/dmapper/DomainMapper.cxx
+++ b/writerfilter/source/dmapper/DomainMapper.cxx
@@ -3775,6 +3775,11 @@ bool DomainMapper::IsStyleSheetImport() const
     return m_pImpl->IsStyleSheetImport();
 }
 
+bool DomainMapper::HasPageBackground() const
+{
+    return (bool)m_pImpl->m_oBackgroundColor;
+}
+
 void DomainMapper::enableInteropGrabBag(const OUString& aName)
 {
     m_pImpl->m_aInteropGrabBagName = aName;
diff --git a/writerfilter/source/dmapper/DomainMapper.hxx 
b/writerfilter/source/dmapper/DomainMapper.hxx
index b2b89f1776c1..35a18b445c13 100644
--- a/writerfilter/source/dmapper/DomainMapper.hxx
+++ b/writerfilter/source/dmapper/DomainMapper.hxx
@@ -110,6 +110,7 @@ public:
     bool IsInHeaderFooter() const;
     bool IsInTable() const;
     bool IsStyleSheetImport() const;
+    bool HasPageBackground() const;
     /**
      @see DomainMapper_Impl::processDeferredCharacterProperties()
     */
diff --git a/writerfilter/source/dmapper/GraphicImport.cxx 
b/writerfilter/source/dmapper/GraphicImport.cxx
index 65a20747c38f..68d7ac4a1738 100644
--- a/writerfilter/source/dmapper/GraphicImport.cxx
+++ b/writerfilter/source/dmapper/GraphicImport.cxx
@@ -197,6 +197,7 @@ public:
     text::WrapTextMode nWrap;
     bool      bLayoutInCell;
     bool      bOpaque;
+    bool      bBehindDoc;
     bool      bContour;
     bool      bContourOutside;
     WrapPolygon::Pointer_t mpWrapPolygon;
@@ -266,6 +267,7 @@ public:
         ,nWrap(text::WrapTextMode_NONE)
         ,bLayoutInCell(false)
         ,bOpaque( !rDMapper.IsInHeaderFooter() )
+        ,bBehindDoc( false )
         ,bContour(false)
         ,bContourOutside(true)
         ,nLeftMargin(319)
@@ -365,6 +367,10 @@ public:
             GraphicZOrderHelper* pZOrderHelper = 
rDomainMapper.graphicZOrderHelper();
             
xGraphicObjectProperties->setPropertyValue(getPropertyName(PROP_Z_ORDER), 
uno::makeAny(pZOrderHelper->findZOrder(zOrder)));
             pZOrderHelper->addItem(xGraphicObjectProperties, zOrder);
+
+            // use opaque setting unless it would hide text that should be in 
front of the shape.
+            const bool bPutInForeground = bOpaque && !(bBehindDoc && nWrap == 
text::WrapTextMode_THROUGH);
+            xGraphicObjectProperties->setPropertyValue(getPropertyName( 
PROP_OPAQUE ), uno::makeAny( bPutInForeground ) );
         }
     }
 
@@ -598,7 +604,15 @@ void GraphicImport::lcl_attribute(Id nName, Value& rValue)
         break;
         case NS_ooxml::LN_CT_Anchor_behindDoc: // 90989; - in background
             if( nIntValue > 0 )
-                m_pImpl->bOpaque = false;
+            {
+                m_pImpl->bBehindDoc = true;
+
+                // In MSO, page background is "in hell" zOrder, however
+                // in LO, page background is at the same zOrder as the text,
+                // so avoid hiding shapes behind the page background.
+                if( !m_pImpl->rDomainMapper.HasPageBackground() )
+                    m_pImpl->bOpaque = false;
+            }
         break;
         case NS_ooxml::LN_CT_Anchor_locked: // 90990; - ignored
         break;
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to