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

Reply via email to