summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sw/qa/extras/ooxmlexport/data/tdf111895_foregroundShape.docxbin0 -> 62173 bytes
-rw-r--r--sw/qa/extras/ooxmlexport/data/tdf111895_foregroundShape2.docxbin0 -> 60809 bytes
-rw-r--r--sw/qa/extras/ooxmlexport/ooxmlexport9.cxx16
-rw-r--r--writerfilter/source/dmapper/DomainMapper.cxx5
-rw-r--r--writerfilter/source/dmapper/DomainMapper.hxx1
-rw-r--r--writerfilter/source/dmapper/GraphicImport.cxx16
6 files changed, 37 insertions, 1 deletions
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
--- /dev/null
+++ b/sw/qa/extras/ooxmlexport/data/tdf111895_foregroundShape.docx
Binary files 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
--- /dev/null
+++ b/sw/qa/extras/ooxmlexport/data/tdf111895_foregroundShape2.docx
Binary files 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;