diff options
-rw-r--r-- | sw/qa/extras/ooxmlexport/data/tdf111895_foregroundShape.docx | bin | 0 -> 62173 bytes | |||
-rw-r--r-- | sw/qa/extras/ooxmlexport/data/tdf111895_foregroundShape2.docx | bin | 0 -> 60809 bytes | |||
-rw-r--r-- | sw/qa/extras/ooxmlexport/ooxmlexport9.cxx | 16 | ||||
-rw-r--r-- | writerfilter/source/dmapper/DomainMapper.cxx | 5 | ||||
-rw-r--r-- | writerfilter/source/dmapper/DomainMapper.hxx | 1 | ||||
-rw-r--r-- | writerfilter/source/dmapper/GraphicImport.cxx | 16 |
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 Binary files differnew file mode 100644 index 000000000000..b282059b1097 --- /dev/null +++ b/sw/qa/extras/ooxmlexport/data/tdf111895_foregroundShape.docx diff --git a/sw/qa/extras/ooxmlexport/data/tdf111895_foregroundShape2.docx b/sw/qa/extras/ooxmlexport/data/tdf111895_foregroundShape2.docx Binary files differnew file mode 100644 index 000000000000..ae2e3c7573db --- /dev/null +++ b/sw/qa/extras/ooxmlexport/data/tdf111895_foregroundShape2.docx 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; |