include/oox/export/drawingml.hxx                  |    2 +-
 oox/source/export/drawingml.cxx                   |   13 +++++++------
 sw/qa/extras/ooxmlexport/data/embedded_images.odt |binary
 sw/qa/extras/ooxmlexport/ooxmlexport16.cxx        |   20 ++++++++++++++++++++
 4 files changed, 28 insertions(+), 7 deletions(-)

New commits:
commit 55b1d635350cb76ee3e19e90c938eedd38ac3342
Author:     Tünde Tóth <toth.tu...@nisz.hu>
AuthorDate: Mon Nov 21 11:30:16 2022 +0100
Commit:     László Németh <nem...@numbertext.org>
CommitDate: Wed Nov 23 17:48:37 2022 +0100

    tdf#152153 DOCX export: fix lost images at embedded documents
    
    Handling of image counter was incorrect if the
    document contains embedded documents, overwriting
    images with the other ones.
    
    See also commit cf2dc247ff5f726238856e9b46a4926a30430e14
    "DOCX export: image deduplication and clean up" and
     commit 3f6df3835fec71ea61894f9a3bbfe5e4a06a5495
    "DOCX export: fix image counters for multiple documents".
    
    Change-Id: I3ce3e370f96fa8b9feca3bc73f06ddca933215d4
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/143036
    Tested-by: László Németh <nem...@numbertext.org>
    Reviewed-by: László Németh <nem...@numbertext.org>

diff --git a/include/oox/export/drawingml.hxx b/include/oox/export/drawingml.hxx
index 3f74f124d767..bf2ed44bca70 100644
--- a/include/oox/export/drawingml.hxx
+++ b/include/oox/export/drawingml.hxx
@@ -143,7 +143,7 @@ class OOX_DLLPUBLIC DrawingML
 {
 
 private:
-    static int mnImageCounter;
+    static std::stack<sal_Int32> mnImageCounter;
     static int mnWdpImageCounter;
     static std::map<OUString, OUString> maWdpCache;
     static sal_Int32 mnDrawingMLCount;
diff --git a/oox/source/export/drawingml.cxx b/oox/source/export/drawingml.cxx
index f7bf0ffdb6fe..16affd23295b 100644
--- a/oox/source/export/drawingml.cxx
+++ b/oox/source/export/drawingml.cxx
@@ -235,7 +235,7 @@ void WriteGradientPath(const awt::Gradient& rGradient, 
const FSHelperPtr& pFS, c
 }
 
 // not thread safe
-int DrawingML::mnImageCounter = 1;
+std::stack<sal_Int32> DrawingML::mnImageCounter;
 int DrawingML::mnWdpImageCounter = 1;
 std::map<OUString, OUString> DrawingML::maWdpCache;
 sal_Int32 DrawingML::mnDrawingMLCount = 0;
@@ -268,7 +268,6 @@ sal_Int16 DrawingML::GetScriptType(const OUString& rStr)
 
 void DrawingML::ResetCounters()
 {
-    mnImageCounter = 1;
     mnWdpImageCounter = 1;
     maWdpCache.clear();
 }
@@ -281,11 +280,13 @@ void DrawingML::ResetMlCounters()
 
 void DrawingML::PushExportGraphics()
 {
+    mnImageCounter.push(1);
     maExportGraphics.emplace();
 }
 
 void DrawingML::PopExportGraphics()
 {
+    mnImageCounter.pop();
     maExportGraphics.pop();
 }
 
@@ -1394,7 +1395,7 @@ OUString DrawingML::WriteImage( const Graphic& rGraphic , 
bool bRelPathToMedia )
         Reference<XOutputStream> xOutStream = mpFB->openFragmentStream(
             OUStringBuffer()
                 .appendAscii(GetComponentDir())
-                .append("/media/image" + OUString::number(mnImageCounter))
+                .append("/media/image" + 
OUString::number(mnImageCounter.top()))
                 .appendAscii(pExtension)
                 .makeStringAndClear(),
             sMediaType);
@@ -1410,7 +1411,7 @@ OUString DrawingML::WriteImage( const Graphic& rGraphic , 
bool bRelPathToMedia )
         sPath = OUStringBuffer()
                     .appendAscii(sRelationCompPrefix.getStr())
                     .appendAscii(sRelPathToMedia.getStr())
-                    .append(static_cast<sal_Int32>(mnImageCounter++))
+                    .append(static_cast<sal_Int32>(mnImageCounter.top()++))
                     .appendAscii(pExtension)
                     .makeStringAndClear();
 
@@ -1489,7 +1490,7 @@ void DrawingML::WriteMediaNonVisualProperties(const 
css::uno::Reference<css::dra
         Reference<XOutputStream> xOutStream = 
mpFB->openFragmentStream(OUStringBuffer()
                                                                        
.appendAscii(GetComponentDir())
                                                                        
.append("/media/media" +
-                                                                            
OUString::number(mnImageCounter) +
+                                                                            
OUString::number(mnImageCounter.top()) +
                                                                             
aExtension)
                                                                        
.makeStringAndClear(),
                                                                        
aMimeType);
@@ -1501,7 +1502,7 @@ void DrawingML::WriteMediaNonVisualProperties(const 
css::uno::Reference<css::dra
 
         // create the relation
         OUString aPath = OUStringBuffer().appendAscii(GetRelationCompPrefix())
-                                         .append("media/media" + 
OUString::number(mnImageCounter++) + aExtension)
+                                         .append("media/media" + 
OUString::number(mnImageCounter.top()++) + aExtension)
                                          .makeStringAndClear();
         aVideoFileRelId = mpFB->addRelation(mpFS->getOutputStream(), 
oox::getRelationship(eMediaType), aPath);
         aMediaRelId = mpFB->addRelation(mpFS->getOutputStream(), 
oox::getRelationship(Relationship::MEDIA), aPath);
diff --git a/sw/qa/extras/ooxmlexport/data/embedded_images.odt 
b/sw/qa/extras/ooxmlexport/data/embedded_images.odt
new file mode 100644
index 000000000000..26166fac349b
Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/embedded_images.odt 
differ
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport16.cxx 
b/sw/qa/extras/ooxmlexport/ooxmlexport16.cxx
index 57b8e68d58d2..22c411d28a5a 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport16.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport16.cxx
@@ -1010,6 +1010,26 @@ CPPUNIT_TEST_FIXTURE(Test, testTdf143726)
     assertXPath(pXmlStyles, 
"/w:styles/w:style[@w:styleId='ContentsHeading']/w:name", "val", "TOC Heading");
 }
 
+CPPUNIT_TEST_FIXTURE(Test, testTdf152153)
+{
+    loadAndReload("embedded_images.odt");
+
+    uno::Reference<packages::zip::XZipFileAccess2> xNameAccess
+        = 
packages::zip::ZipFileAccess::createWithURL(comphelper::getComponentContext(m_xSFactory),
+                                                      maTempFile.GetURL());
+    const uno::Sequence<OUString> aNames(xNameAccess->getElementNames());
+    int nImageFiles = 0;
+    for (const auto& rElementName : aNames)
+        if (rElementName.startsWith("word/media/image"))
+            nImageFiles++;
+
+    // Without the accompanying fix in place, this test would have failed with:
+    // - Expected: 4
+    // - Actual  : 3
+    // i.e. the once embedded picture wouldn't have been saved.
+    CPPUNIT_ASSERT_EQUAL(4, nImageFiles);
+}
+
 CPPUNIT_PLUGIN_IMPLEMENT();
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Reply via email to