oox/source/export/shapes.cxx                       |    6 ++-
 sc/qa/unit/data/xlsx/tdf169496_hidden_graphic.xlsx |binary
 sc/qa/unit/subsequent_export_test4.cxx             |   39 +++++++++++++++++++++
 sd/qa/unit/data/pptx/tdf169496_hidden_graphic.pptx |binary
 sd/qa/unit/export-tests-ooxml4.cxx                 |   37 +++++++++++++++++++
 5 files changed, 81 insertions(+), 1 deletion(-)

New commits:
commit a913faf181afb8b8718711eba0ad0cceec961f01
Author:     Aron Budea <[email protected]>
AuthorDate: Tue Nov 18 12:31:21 2025 +1030
Commit:     Aron Budea <[email protected]>
CommitDate: Thu Nov 20 09:44:05 2025 +0100

    tdf#169496 oox: hidden images in PPTX/XLSX shown after roundtrip
    
    Because 'hidden' attribute of 'cNvPr' wasn't exported.
    
    Change-Id: I5f8a79232e3b76f04269caae0631ba5b9710443a
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/194142
    Tested-by: Jenkins
    Reviewed-by: Mike Kaganski <[email protected]>
    Reviewed-by: Aron Budea <[email protected]>

diff --git a/oox/source/export/shapes.cxx b/oox/source/export/shapes.cxx
index 8382d9789d83..6f9c7ea2c7b4 100644
--- a/oox/source/export/shapes.cxx
+++ b/oox/source/export/shapes.cxx
@@ -1418,11 +1418,14 @@ void ShapeExport::WriteGraphicObjectShapePart( const 
Reference< XShape >& xShape
 
     presentation::ClickAction eClickAction = presentation::ClickAction_NONE;
     OUString sDescr, sURL, sBookmark, sPPAction;
+    bool bVisible = true;
 
     if ( GetProperty( xShapeProps, u"Description"_ustr ) )
         mAny >>= sDescr;
     if ( GetProperty( xShapeProps, u"URL"_ustr ) )
         mAny >>= sURL;
+    if ( GetProperty( xShapeProps, u"Visible"_ustr ) )
+        mAny >>= bVisible;
     if (GetProperty(xShapeProps, u"Bookmark"_ustr))
         mAny >>= sBookmark;
     if (GetProperty(xShapeProps, u"OnClick"_ustr))
@@ -1431,7 +1434,8 @@ void ShapeExport::WriteGraphicObjectShapePart( const 
Reference< XShape >& xShape
     pFS->startElementNS( mnXmlNamespace, XML_cNvPr,
                          XML_id,     OString::number(GetNewShapeID(xShape)),
                          XML_name,   GetShapeName(xShape),
-                         XML_descr,  sax_fastparser::UseIf(sDescr, 
!sDescr.isEmpty()));
+                         XML_descr,  sax_fastparser::UseIf(sDescr, 
!sDescr.isEmpty()),
+                         XML_hidden, sax_fastparser::UseIf("1", !bVisible));
 
     if (eClickAction != presentation::ClickAction_NONE)
     {
diff --git a/sc/qa/unit/data/xlsx/tdf169496_hidden_graphic.xlsx 
b/sc/qa/unit/data/xlsx/tdf169496_hidden_graphic.xlsx
new file mode 100644
index 000000000000..ce1a9a75c14a
Binary files /dev/null and b/sc/qa/unit/data/xlsx/tdf169496_hidden_graphic.xlsx 
differ
diff --git a/sc/qa/unit/subsequent_export_test4.cxx 
b/sc/qa/unit/subsequent_export_test4.cxx
index 745ed2c1f4b4..1bb4c3d3bba9 100644
--- a/sc/qa/unit/subsequent_export_test4.cxx
+++ b/sc/qa/unit/subsequent_export_test4.cxx
@@ -935,6 +935,45 @@ CPPUNIT_TEST_FIXTURE(ScExportTest4, 
testTdf139258_rotated_image)
     assertXPathContent(pDrawing, "/xdr:wsDr/xdr:twoCellAnchor/xdr:to/xdr:row", 
u"25");
 }
 
+CPPUNIT_TEST_FIXTURE(ScExportTest4, testtdf169496_hidden_graphic)
+{
+    createScDoc("xlsx/tdf169496_hidden_graphic.xlsx");
+
+    save(u"Calc Office Open XML"_ustr);
+
+    xmlDocUniquePtr pDrawing = parseExport(u"xl/drawings/drawing1.xml"_ustr);
+    CPPUNIT_ASSERT(pDrawing);
+
+    // Graphic 4 is hidden and Graphic 3 is visible, but their order might 
change in the XML
+    // Without the fix the hidden attribute wasn't exported
+    OUString sName1 = getXPath(
+        pDrawing, 
"/xdr:wsDr/xdr:twoCellAnchor[1]/xdr:pic/xdr:nvPicPr/xdr:cNvPr", "name");
+    OUString sName2 = getXPath(
+        pDrawing, 
"/xdr:wsDr/xdr:twoCellAnchor[2]/xdr:pic/xdr:nvPicPr/xdr:cNvPr", "name");
+    if (sName1 == "Graphic 4" && sName2 == "Graphic 3")
+    {
+        OUString aHidden = getXPath(
+            pDrawing, 
"/xdr:wsDr/xdr:twoCellAnchor[1]/xdr:pic/xdr:nvPicPr/xdr:cNvPr", "hidden");
+        bool bHidden = aHidden == u"true"_ustr || aHidden == u"1";
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("Graphic 3 is supposed to be hidden", 
true, bHidden);
+
+        assertXPathNoAttribute(
+            pDrawing, 
"/xdr:wsDr/xdr:twoCellAnchor[2]/xdr:pic/xdr:nvPicPr/xdr:cNvPr", "hidden");
+    }
+    else if (sName1 == "Graphic 3" && sName2 == "Graphic 4")
+    {
+        assertXPathNoAttribute(
+            pDrawing, 
"/xdr:wsDr/xdr:twoCellAnchor[1]/xdr:pic/xdr:nvPicPr/xdr:cNvPr", "hidden");
+
+        OUString aHidden = getXPath(
+            pDrawing, 
"/xdr:wsDr/xdr:twoCellAnchor[2]/xdr:pic/xdr:nvPicPr/xdr:cNvPr", "hidden");
+        bool bHidden = aHidden == u"true"_ustr || aHidden == u"1";
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("Graphic 4 is supposed to be hidden", 
true, bHidden);
+    }
+    else
+        CPPUNIT_FAIL("Names of graphics is incorrect");
+}
+
 CPPUNIT_TEST_FIXTURE(ScExportTest4, testTdf144642_RowHeightRounding)
 {
     // MS Excel round down row heights to 0.75pt
diff --git a/sd/qa/unit/data/pptx/tdf169496_hidden_graphic.pptx 
b/sd/qa/unit/data/pptx/tdf169496_hidden_graphic.pptx
new file mode 100644
index 000000000000..a87c644e9cc3
Binary files /dev/null and b/sd/qa/unit/data/pptx/tdf169496_hidden_graphic.pptx 
differ
diff --git a/sd/qa/unit/export-tests-ooxml4.cxx 
b/sd/qa/unit/export-tests-ooxml4.cxx
index e8aff6db9f9c..911e3fcd2d11 100644
--- a/sd/qa/unit/export-tests-ooxml4.cxx
+++ b/sd/qa/unit/export-tests-ooxml4.cxx
@@ -1606,6 +1606,43 @@ CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, 
testOLEObjectAnimationTarget)
                 "spid", sOleId);
 }
 
+CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest4, testtdf169496_hidden_graphic)
+{
+    createSdImpressDoc("pptx/tdf169496_hidden_graphic.pptx");
+    save(u"Impress Office Open XML"_ustr);
+
+    xmlDocUniquePtr pXmlDoc = parseExport(u"ppt/slides/slide1.xml"_ustr);
+
+    // Graphic 5 is hidden and Graphic 4 is visible, but their order might 
change in the XML
+    // Without the fix the hidden attribute wasn't exported
+    OUString sName1
+        = getXPath(pXmlDoc, 
"/p:sld/p:cSld/p:spTree/p:pic[1]/p:nvPicPr/p:cNvPr", "name");
+    OUString sName2
+        = getXPath(pXmlDoc, 
"/p:sld/p:cSld/p:spTree/p:pic[2]/p:nvPicPr/p:cNvPr", "name");
+    if (sName1 == "Graphic 5" && sName2 == "Graphic 4")
+    {
+        OUString aHidden
+            = getXPath(pXmlDoc, 
"/p:sld/p:cSld/p:spTree/p:pic[1]/p:nvPicPr/p:cNvPr", "hidden");
+        bool bHidden = aHidden == u"true"_ustr || aHidden == u"1";
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("Graphic 3 is supposed to be hidden", 
true, bHidden);
+
+        assertXPathNoAttribute(pXmlDoc, 
"/p:sld/p:cSld/p:spTree/p:pic[2]/p:nvPicPr/p:cNvPr",
+                               "hidden");
+    }
+    else if (sName1 == "Graphic 4" && sName2 == "Graphic 5")
+    {
+        assertXPathNoAttribute(pXmlDoc, 
"/p:sld/p:cSld/p:spTree/p:pic[1]/p:nvPicPr/p:cNvPr",
+                               "hidden");
+
+        OUString aHidden
+            = getXPath(pXmlDoc, 
"/p:sld/p:cSld/p:spTree/p:pic[2]/p:nvPicPr/p:cNvPr", "hidden");
+        bool bHidden = aHidden == u"true"_ustr || aHidden == u"1";
+        CPPUNIT_ASSERT_EQUAL_MESSAGE("Graphic 4 is supposed to be hidden", 
true, bHidden);
+    }
+    else
+        CPPUNIT_FAIL("Names of graphics is incorrect");
+}
+
 CPPUNIT_PLUGIN_IMPLEMENT();
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Reply via email to