sw/qa/extras/ooxmlexport/data/tdf159158_zOrder_1and0equalA.docx |binary
 sw/qa/extras/ooxmlexport/data/tdf159158_zOrder_1and0equalB.docx |binary
 sw/qa/extras/ooxmlexport/data/tdf159158_zOrder_1and0max.docx    |binary
 sw/qa/extras/ooxmlexport/data/tdf159158_zOrder_max.docx         |binary
 sw/qa/extras/ooxmlexport/ooxmlexport18.cxx                      |   75 
++++++++++
 sw/qa/extras/ooxmlexport/ooxmlexport8.cxx                       |    9 -
 writerfilter/source/dmapper/GraphicImport.cxx                   |    8 -
 7 files changed, 85 insertions(+), 7 deletions(-)

New commits:
commit db819557a351a5626a9ac50cd339dceb81749f58
Author:     Justin Luth <justin.l...@collabora.com>
AuthorDate: Fri Jan 12 17:42:17 2024 -0500
Commit:     Miklos Vajna <vmik...@collabora.com>
CommitDate: Tue Jan 16 09:17:47 2024 +0100

    tdf#159158 writerfilter: relativeHeights of 0/1 are highest zOrder
    
    Apparently 0 and 1 are the highest zOrders, 2 is the lowest, then 3...
    At least, this seems to be true for relativeHeight.
    Of course the documentation doesn't say anything about this,
    but documents conclusively prove a maximum zOrder of 251,658,240.
    
    [When MS Word 2019 round-trips a file with a relativeHeight of 0/1,
     it replaces them with the highest relativeHeight in the document,
     but values of 2+ are preserved.]
    
    Notice that there are two things that feed into zOrder,
    the other being z-index where negatives have special meaning
    in this context, but no special meaning for 0 or 1.
    
    Interestingly, relativeHeight is unsigned, but z-index is signed.
    This ends up not being a problem with a maximum of 0F00 0000.
    
    GOOD! LO normally exports starting from 2, but writes 0 if no zOrder.
    // It seems 0 and 1 have special meaning:
    // just start counting from 2 to avoid issues with that.
    
    Proof case that 0 is higher than both 300 and 225,763,766
    make CppunitTest_sw_ooxmlexport8 CPPUNIT_TEST_NAME=testN747461
    
    make CppunitTest_sw_ooxmlexport18 \
        CPPUNIT_TEST_NAME=testTdf159158_zOrder_1and0equalA
    make CppunitTest_sw_ooxmlexport18 \
        CPPUNIT_TEST_NAME=testTdf159158_zOrder_1and0equalB
    make CppunitTest_sw_ooxmlexport18 \
        CPPUNIT_TEST_NAME=testTdf159158_zOrder_1and0max
    
    Change-Id: I3540252ca5b0be3b2d847f1a3885adb850f39c39
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/162038
    Tested-by: Jenkins
    Reviewed-by: Miklos Vajna <vmik...@collabora.com>

diff --git a/sw/qa/extras/ooxmlexport/data/tdf159158_zOrder_1and0equalA.docx 
b/sw/qa/extras/ooxmlexport/data/tdf159158_zOrder_1and0equalA.docx
new file mode 100644
index 000000000000..6c4e28769209
Binary files /dev/null and 
b/sw/qa/extras/ooxmlexport/data/tdf159158_zOrder_1and0equalA.docx differ
diff --git a/sw/qa/extras/ooxmlexport/data/tdf159158_zOrder_1and0equalB.docx 
b/sw/qa/extras/ooxmlexport/data/tdf159158_zOrder_1and0equalB.docx
new file mode 100644
index 000000000000..ae79fda6a78a
Binary files /dev/null and 
b/sw/qa/extras/ooxmlexport/data/tdf159158_zOrder_1and0equalB.docx differ
diff --git a/sw/qa/extras/ooxmlexport/data/tdf159158_zOrder_1and0max.docx 
b/sw/qa/extras/ooxmlexport/data/tdf159158_zOrder_1and0max.docx
new file mode 100644
index 000000000000..edb1304b9922
Binary files /dev/null and 
b/sw/qa/extras/ooxmlexport/data/tdf159158_zOrder_1and0max.docx differ
diff --git a/sw/qa/extras/ooxmlexport/data/tdf159158_zOrder_max.docx 
b/sw/qa/extras/ooxmlexport/data/tdf159158_zOrder_max.docx
new file mode 100644
index 000000000000..46119741d092
Binary files /dev/null and 
b/sw/qa/extras/ooxmlexport/data/tdf159158_zOrder_max.docx differ
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport18.cxx 
b/sw/qa/extras/ooxmlexport/ooxmlexport18.cxx
index e92994f8cd54..76b0d0423831 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport18.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport18.cxx
@@ -886,6 +886,81 @@ DECLARE_OOXMLEXPORT_TEST(testTdf159158_zOrder_duplicate, 
"tdf159158_zOrder_dupli
     CPPUNIT_ASSERT_EQUAL(OUString("5-Point Star Blue"), descr2); // last one 
defined wins
 }
 
+DECLARE_OOXMLEXPORT_TEST(testTdf159158_zOrder_1and0equalA, 
"tdf159158_zOrder_1and0equalA.docx")
+{
+    // given a yellow star with relativeHeight 1, followed by an overlapping 
blue star with 0
+    uno::Reference<drawing::XShape> image1 = getShape(1), image2 = getShape(2);
+    sal_Int32 zOrder1, zOrder2;
+    OUString descr1, descr2;
+    uno::Reference<beans::XPropertySet> imageProperties1(image1, 
uno::UNO_QUERY);
+    imageProperties1->getPropertyValue("ZOrder") >>= zOrder1;
+    imageProperties1->getPropertyValue("Name") >>= descr1;
+    uno::Reference<beans::XPropertySet> imageProperties2(image2, 
uno::UNO_QUERY);
+    imageProperties2->getPropertyValue("ZOrder") >>= zOrder2;
+    imageProperties2->getPropertyValue("Name") >>= descr2;
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(0), zOrder1); // lower
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(1), zOrder2); // higher
+    CPPUNIT_ASSERT_EQUAL(OUString("5-Point Star Yellow"), descr1);
+    CPPUNIT_ASSERT_EQUAL(OUString("5-Point Star Blue"), descr2); // 0 >= 1 
(last one wins)
+}
+
+DECLARE_OOXMLEXPORT_TEST(testTdf159158_zOrder_1and0equalB, 
"tdf159158_zOrder_1and0equalB.docx")
+{
+    // given a yellow star with relativeHeight 0, followed by an overlapping 
blue star with 1
+    // since they have the same zOrder value, last one wins, so same result as 
version A
+    uno::Reference<drawing::XShape> image1 = getShape(1), image2 = getShape(2);
+    sal_Int32 zOrder1, zOrder2;
+    OUString descr1, descr2;
+    uno::Reference<beans::XPropertySet> imageProperties1(image1, 
uno::UNO_QUERY);
+    imageProperties1->getPropertyValue("ZOrder") >>= zOrder1;
+    imageProperties1->getPropertyValue("Name") >>= descr1;
+    uno::Reference<beans::XPropertySet> imageProperties2(image2, 
uno::UNO_QUERY);
+    imageProperties2->getPropertyValue("ZOrder") >>= zOrder2;
+    imageProperties2->getPropertyValue("Name") >>= descr2;
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(0), zOrder1); // lower
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(1), zOrder2); // higher
+    CPPUNIT_ASSERT_EQUAL(OUString("5-Point Star Yellow"), descr1);
+    CPPUNIT_ASSERT_EQUAL(OUString("5-Point Star Blue"), descr2); // 1 >= 0 
(last one wins)
+}
+
+DECLARE_OOXMLEXPORT_TEST(testTdf159158_zOrder_1and0max, 
"tdf159158_zOrder_1and0max.docx")
+{
+    // given a yellow star with relativeHeight 251658240 (0F00 0000)
+    // followed by an overlapping blue star with 0.
+    uno::Reference<drawing::XShape> image1 = getShape(1), image2 = getShape(2);
+    sal_Int32 zOrder1, zOrder2;
+    OUString descr1, descr2;
+    uno::Reference<beans::XPropertySet> imageProperties1(image1, 
uno::UNO_QUERY);
+    imageProperties1->getPropertyValue("ZOrder") >>= zOrder1;
+    imageProperties1->getPropertyValue("Name") >>= descr1;
+    uno::Reference<beans::XPropertySet> imageProperties2(image2, 
uno::UNO_QUERY);
+    imageProperties2->getPropertyValue("ZOrder") >>= zOrder2;
+    imageProperties2->getPropertyValue("Name") >>= descr2;
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(0), zOrder1); // lower
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(1), zOrder2); // higher
+    CPPUNIT_ASSERT_EQUAL(OUString("5-Point Star Yellow"), descr1);
+    CPPUNIT_ASSERT_EQUAL(OUString("5-Point Star Blue"), descr2); // 0 >= 0F00 
0000 (last one wins)
+}
+
+DECLARE_OOXMLEXPORT_TEST(testTdf159158_zOrder_max, "tdf159158_zOrder_max.docx")
+{
+    // given a yellow star with relativeHeight 251658241 (0F00 0001)
+    // followed by an overlapping blue star with relativeHeight 251658240 
(0F00 0000)
+    uno::Reference<drawing::XShape> image1 = getShape(1), image2 = getShape(2);
+    sal_Int32 zOrder1, zOrder2;
+    OUString descr1, descr2;
+    uno::Reference<beans::XPropertySet> imageProperties1(image1, 
uno::UNO_QUERY);
+    imageProperties1->getPropertyValue("ZOrder") >>= zOrder1;
+    imageProperties1->getPropertyValue("Name") >>= descr1;
+    uno::Reference<beans::XPropertySet> imageProperties2(image2, 
uno::UNO_QUERY);
+    imageProperties2->getPropertyValue("ZOrder") >>= zOrder2;
+    imageProperties2->getPropertyValue("Name") >>= descr2;
+//     CPPUNIT_ASSERT_EQUAL(sal_Int32(0), zOrder1); // lower
+//     CPPUNIT_ASSERT_EQUAL(sal_Int32(1), zOrder2); // higher
+//     CPPUNIT_ASSERT_EQUAL(OUString("5-Point Star Yellow"), descr1);
+//     CPPUNIT_ASSERT_EQUAL(OUString("5-Point Star Blue"), descr2); // 0F00 
0000 == 0F00 0001
+}
+
 DECLARE_OOXMLEXPORT_TEST(testTdf155903, "tdf155903.odt")
 {
     // Without the accompanying fix in place, this test would have crashed,
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport8.cxx 
b/sw/qa/extras/ooxmlexport/ooxmlexport8.cxx
index 0ea69e698807..686371bec25c 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport8.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport8.cxx
@@ -170,15 +170,14 @@ after they are loaded.
     CPPUNIT_ASSERT_EQUAL( sal_Int32( 0 ), zOrder1 );
     CPPUNIT_ASSERT_EQUAL( sal_Int32( 1 ), zOrder2 );
     CPPUNIT_ASSERT_EQUAL( sal_Int32( 2 ), zOrder3 );
-    CPPUNIT_ASSERT_EQUAL( OUString( "Black" ), descr1 );
-    CPPUNIT_ASSERT_EQUAL( OUString( "Red" ), descr2 );
-    CPPUNIT_ASSERT_EQUAL( OUString( "Green" ), descr3 );
+    CPPUNIT_ASSERT_EQUAL(OUString("Red"), descr1);
+    CPPUNIT_ASSERT_EQUAL(OUString("Green"), descr2);
+    CPPUNIT_ASSERT_EQUAL(OUString("Black"), descr3); // tdf#159158: black 
should be on top
 
     // tdf#139915/tdf#159157 This was 826, but it should be -826
-    CPPUNIT_ASSERT_EQUAL(sal_Int32(-826), getProperty<sal_Int32>(image1, 
"VertOrientPosition"));
+    CPPUNIT_ASSERT_EQUAL(sal_Int32(-826), getProperty<sal_Int32>(image3, 
"VertOrientPosition"));
     sal_Int16 nExpected = text::RelOrientation::TEXT_LINE;
     CPPUNIT_ASSERT_EQUAL(nExpected, getProperty<sal_Int16>(image1, 
"VertOrientRelation"));
-
 }
 
 DECLARE_OOXMLEXPORT_TEST(testN750255, "n750255.docx")
diff --git a/writerfilter/source/dmapper/GraphicImport.cxx 
b/writerfilter/source/dmapper/GraphicImport.cxx
index 45d046288e81..c8a1e166d472 100644
--- a/writerfilter/source/dmapper/GraphicImport.cxx
+++ b/writerfilter/source/dmapper/GraphicImport.cxx
@@ -737,9 +737,13 @@ void GraphicImport::lcl_attribute(Id nName, Value& rValue)
         case NS_ooxml::LN_CT_Anchor_simplePos_attr:
             m_pImpl->m_bUseSimplePos = nIntValue > 0;
         break;
-        case NS_ooxml::LN_CT_Anchor_relativeHeight:
+        case NS_ooxml::LN_CT_Anchor_relativeHeight: // unsigned content
         {
-            m_pImpl->m_zOrder = nIntValue;
+            // undocumented - based on testing: both 0 and 1 are equivalent to 
the maximum 251658240
+            if (nIntValue < 2/* || nIntValue > 0x0F000000*/)
+                m_pImpl->m_zOrder = 0x0F000000;
+            else
+                m_pImpl->m_zOrder = nIntValue;
         }
         break;
         case NS_ooxml::LN_CT_Anchor_behindDoc:

Reply via email to