sw/qa/extras/ooxmlexport/data/tdf120760_ZOrderInHeader.docx |binary sw/qa/extras/ooxmlexport/ooxmlexport5.cxx | 16 +++++++++++ writerfilter/source/dmapper/GraphicImport.cxx | 17 +++++++++--- 3 files changed, 29 insertions(+), 4 deletions(-)
New commits: commit 7739740ab36a933a134996427132c64dfddac49c Author: Szabolcs Toth <szabolcs...@gmail.com> AuthorDate: Thu Jun 18 15:58:32 2020 +0200 Commit: Xisco Fauli <xiscofa...@libreoffice.org> CommitDate: Tue Sep 8 12:36:38 2020 +0200 tdf#120760 DOCX shape import: fix Z-order with behindDoc DrawingML attribute relativeHeight contains z-indices for shape Z-order, but this depends on behindDoc, too. We can use z-index = relativeHeight - MAX_INT32 on shapes with behindDoc=true, as a simple workaround to get correct Z-order, because unsigned relativeHeight values stored in sal_Int32, and MIN_INT32 <= -MAX_INT32, and the temporary negative z-indices will converted by GraphicZOrderHelper. Note: this commit doesn't fix the old writerfilter implementation problem, that DOCX relativeHeight is an unsignedInt value according to W3C XML Schema, i.e. its maximal value is 4294967295 (MAX_UINT32), not 2147483647 (MAX_INT32). Co-authored-by: Balázs Regényi Change-Id: I54a72a95bc69b307b2835636fff376b0aa9bc45c Reviewed-on: https://gerrit.libreoffice.org/c/core/+/96614 Tested-by: László Németh <nem...@numbertext.org> Reviewed-by: László Németh <nem...@numbertext.org> (cherry picked from commit 6479096dc2bd40215ff80273b4d27cadb2688cb1) Reviewed-on: https://gerrit.libreoffice.org/c/core/+/100947 Tested-by: Jenkins Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org> diff --git a/sw/qa/extras/ooxmlexport/data/tdf120760_ZOrderInHeader.docx b/sw/qa/extras/ooxmlexport/data/tdf120760_ZOrderInHeader.docx new file mode 100644 index 000000000000..77a6d48dd866 Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/tdf120760_ZOrderInHeader.docx differ diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport5.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport5.cxx index c2aaec5c64a9..08d4831d1b12 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport5.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport5.cxx @@ -1318,6 +1318,22 @@ DECLARE_OOXMLEXPORT_EXPORTONLY_TEST(testTdf112287, "tdf112287.docx") assertXPath(pXmlDocument, "/w:document/w:body/w:p[2]/w:pPr/w:framePr","vAnchor","margin"); } +DECLARE_OOXMLEXPORT_EXPORTONLY_TEST(testZOrderInHeader, "tdf120760_ZOrderInHeader.docx") +{ + // tdf#120760 Check that the Z-Order of the background is smaller than the front shape's. + xmlDocUniquePtr pXml = parseExport("word/header1.xml"); + if (!pXml) + return; + + // Get the Z-Order of the background image and of the shape in front of it. + sal_Int32 nBackground = getXPath(pXml, "/w:hdr/w:p[1]/w:r[1]/w:drawing/wp:anchor", "relativeHeight").toInt32(); + sal_Int32 nFrontShape = getXPath(pXml, "/w:hdr/w:p[1]/w:r[1]/mc:AlternateContent[2]" + "/mc:Choice/w:drawing/wp:anchor", "relativeHeight").toInt32(); + + // Assert that background is in the back. + CPPUNIT_ASSERT(nBackground < nFrontShape); +} + CPPUNIT_PLUGIN_IMPLEMENT(); /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/writerfilter/source/dmapper/GraphicImport.cxx b/writerfilter/source/dmapper/GraphicImport.cxx index 27acbe045b25..372e9f40870a 100644 --- a/writerfilter/source/dmapper/GraphicImport.cxx +++ b/writerfilter/source/dmapper/GraphicImport.cxx @@ -208,6 +208,7 @@ public: bool bLayoutInCell; bool bAllowOverlap = true; bool bOpaque; + bool bBehindDoc; bool bContour; bool bContourOutside; WrapPolygon::Pointer_t mpWrapPolygon; @@ -273,6 +274,7 @@ public: ,nWrap(text::WrapTextMode_NONE) ,bLayoutInCell(true) ,bOpaque( !rDMapper.IsInHeaderFooter() ) + ,bBehindDoc(false) ,bContour(false) ,bContourOutside(true) ,nLeftMargin(319) @@ -371,10 +373,15 @@ public: { if (zOrder >= 0) { + // tdf#120760 Send objects with behinddoc=true to the back. + sal_Int32 nZOrder = zOrder; + if (bBehindDoc && rDomainMapper.IsInHeaderFooter()) + nZOrder -= SAL_MAX_INT32; GraphicZOrderHelper* pZOrderHelper = rDomainMapper.graphicZOrderHelper(); bool bOldStyle = eGraphicImportType == GraphicImportType::IMPORT_AS_DETECTED_INLINE; - xGraphicObjectProperties->setPropertyValue(getPropertyName(PROP_Z_ORDER), uno::makeAny(pZOrderHelper->findZOrder(zOrder, bOldStyle))); - pZOrderHelper->addItem(xGraphicObjectProperties, zOrder); + xGraphicObjectProperties->setPropertyValue(getPropertyName(PROP_Z_ORDER), + uno::makeAny(pZOrderHelper->findZOrder(nZOrder, bOldStyle))); + pZOrderHelper->addItem(xGraphicObjectProperties, nZOrder); } } @@ -609,8 +616,11 @@ void GraphicImport::lcl_attribute(Id nName, Value& rValue) m_pImpl->zOrder = nIntValue; break; case NS_ooxml::LN_CT_Anchor_behindDoc: // 90989; - in background - if( nIntValue > 0 ) + if (nIntValue > 0) + { m_pImpl->bOpaque = false; + m_pImpl->bBehindDoc = true; + } break; case NS_ooxml::LN_CT_Anchor_locked: // 90990; - ignored break; @@ -1407,7 +1417,6 @@ uno::Reference<text::XTextContent> GraphicImport::createGraphicObject(uno::Refer xGraphicObjectProperties->setPropertyValue(getPropertyName( PROP_BACK_COLOR ), uno::makeAny( GraphicImport_Impl::nFillColor )); - m_pImpl->applyZOrder(xGraphicObjectProperties); //there seems to be no way to detect the original size via _real_ API _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits