[Libreoffice-commits] core.git: include/oox oox/source

Miklos Vajna vmiklos at collabora.co.uk
Tue May 23 08:18:26 UTC 2017


 include/oox/helper/graphichelper.hxx |    3 +++
 oox/source/helper/graphichelper.cxx  |   28 ++++++++++++++++++++++++++++
 oox/source/ppt/pptimport.cxx         |   16 ++++++++--------
 3 files changed, 39 insertions(+), 8 deletions(-)

New commits:
commit 04e27df3c162f1df02f061b94434a38d1eaa3a46
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Tue May 23 09:25:37 2017 +0200

    oox: add GraphicHelper::importEmbeddedGraphics()
    
    Similar to GraphicHelper::importEmbeddedGraphic(), but it takes a list
    of image paths to import.
    
    Change-Id: I11b670a0b2c693540054c78be2cee3835477b7e6
    Reviewed-on: https://gerrit.libreoffice.org/37938
    Reviewed-by: Miklos Vajna <vmiklos at collabora.co.uk>
    Tested-by: Jenkins <ci at libreoffice.org>

diff --git a/include/oox/helper/graphichelper.hxx b/include/oox/helper/graphichelper.hxx
index 41a1ed76aac1..3102585ed881 100644
--- a/include/oox/helper/graphichelper.hxx
+++ b/include/oox/helper/graphichelper.hxx
@@ -124,6 +124,9 @@ public:
                             const OUString& rStreamName,
                             const WMF_EXTERNALHEADER* pExtHeader = nullptr ) const;
 
+    /** Imports graphics from the storage with the passed stream names. */
+    void importEmbeddedGraphics(const std::vector<OUString>& rStreamNames) const;
+
     /** Creates a persistent graphic object from the passed graphic.
         @return  The URL of the created and internally cached graphic object. */
     OUString     createGraphicObject(
diff --git a/oox/source/helper/graphichelper.cxx b/oox/source/helper/graphichelper.cxx
index f4ac89353b57..abe062cc82f4 100644
--- a/oox/source/helper/graphichelper.cxx
+++ b/oox/source/helper/graphichelper.cxx
@@ -274,6 +274,34 @@ Reference< XGraphic > GraphicHelper::importGraphic( const StreamDataSequence& rG
     return xGraphic;
 }
 
+void GraphicHelper::importEmbeddedGraphics(const std::vector<OUString>& rStreamNames) const
+{
+    // Don't actually return anything, just fill maEmbeddedGraphics.
+
+    // Input stream -> stream name map.
+    std::map< uno::Reference<io::XInputStream>, OUString > aStreamNames;
+
+    for (const auto& rStreamName : rStreamNames)
+    {
+        if(rStreamName.isEmpty())
+        {
+            SAL_WARN("oox", "GraphicHelper::importEmbeddedGraphics - empty stream name");
+            continue;
+        }
+
+        EmbeddedGraphicMap::const_iterator aIt = maEmbeddedGraphics.find(rStreamName);
+        if (aIt == maEmbeddedGraphics.end())
+            aStreamNames[mxStorage->openInputStream(rStreamName)] = rStreamName;
+    }
+
+    for (const auto& rStream : aStreamNames)
+    {
+        uno::Reference<graphic::XGraphic> xGraphic = importGraphic(rStream.first);
+        if (xGraphic.is())
+            maEmbeddedGraphics[rStream.second] = xGraphic;
+    }
+}
+
 Reference< XGraphic > GraphicHelper::importEmbeddedGraphic( const OUString& rStreamName, const WMF_EXTERNALHEADER* pExtHeader ) const
 {
     Reference< XGraphic > xGraphic;
diff --git a/oox/source/ppt/pptimport.cxx b/oox/source/ppt/pptimport.cxx
index 74285e7dbe97..474abb6278e2 100644
--- a/oox/source/ppt/pptimport.cxx
+++ b/oox/source/ppt/pptimport.cxx
@@ -100,7 +100,13 @@ static void visitRelations(PowerPointImport& rImport, core::RelationsRef pRelati
                 if (core::RelationsRef pImages = pFragmentRelations->getRelationsFromTypeFromOfficeDoc("image"))
                 {
                     for (const auto& rImage : *pImages)
-                        rImageFragments.push_back(pImages->getFragmentPathFromRelation(rImage.second));
+                    {
+                        OUString aPath = pImages->getFragmentPathFromRelation(rImage.second);
+                        // Safe subset: e.g. WMF may have an external header from the
+                        // referencing fragment.
+                        if (aPath.endsWith(".jpg") || aPath.endsWith(".jpeg"))
+                            rImageFragments.push_back(aPath);
+                    }
                 }
 
                 // See if the fragment has a slide layout, and recurse.
@@ -130,13 +136,7 @@ bool PowerPointImport::importDocument()
         visitRelations(*this, pFragmentRelations, "slide", aImageFragments);
         visitRelations(*this, pFragmentRelations, "slideMaster", aImageFragments);
 
-        for (const auto& rImage : aImageFragments)
-        {
-            // Safe subset: e.g. WMF may have an external header from the
-            // referencing fragment.
-            if (rImage.endsWith(".jpg") || rImage.endsWith(".jpeg"))
-                getGraphicHelper().importEmbeddedGraphic(rImage);
-        }
+        getGraphicHelper().importEmbeddedGraphics(aImageFragments);
     }
 
     bool bRet = importFragment(xPresentationFragmentHandler);


More information about the Libreoffice-commits mailing list