include/oox/helper/graphichelper.hxx | 4 ++ oox/source/helper/graphichelper.cxx | 49 ++++++++++++++++++++++++++++++----- 2 files changed, 46 insertions(+), 7 deletions(-)
New commits: commit b1319842a49cdf6512bbd9e81081e2a9edbd6089 Author: Miklos Vajna <vmik...@collabora.co.uk> Date: Tue May 23 10:20:03 2017 +0200 oox: add GraphicHelper::importGraphics() Similar to GraphicHelper::importGraphic(), but can import multiple streams with one function call. Change-Id: I5fd398bb6649259e86967f8db5cc1e212f50bc8e Reviewed-on: https://gerrit.libreoffice.org/37942 Reviewed-by: Miklos Vajna <vmik...@collabora.co.uk> Tested-by: Jenkins <c...@libreoffice.org> diff --git a/include/oox/helper/graphichelper.hxx b/include/oox/helper/graphichelper.hxx index 3102585ed881..17f896683ab4 100644 --- a/include/oox/helper/graphichelper.hxx +++ b/include/oox/helper/graphichelper.hxx @@ -114,6 +114,10 @@ public: const css::uno::Reference< css::io::XInputStream >& rxInStrm, const WMF_EXTERNALHEADER* pExtHeader = nullptr ) const; + /** Imports graphics from the passed input streams. */ + std::vector< css::uno::Reference<css::graphic::XGraphic> > + importGraphics(const std::vector< css::uno::Reference<css::io::XInputStream> >& rStreams) const; + /** Imports a graphic from the passed binary memory block. */ css::uno::Reference< css::graphic::XGraphic > importGraphic( const StreamDataSequence& rGraphicData ) const; diff --git a/oox/source/helper/graphichelper.cxx b/oox/source/helper/graphichelper.cxx index abe062cc82f4..7927daedd39e 100644 --- a/oox/source/helper/graphichelper.cxx +++ b/oox/source/helper/graphichelper.cxx @@ -36,6 +36,7 @@ #include <vcl/wmf.hxx> #include <vcl/svapp.hxx> #include <tools/gen.hxx> +#include <comphelper/propertysequence.hxx> #include "oox/helper/containerhelper.hxx" #include "oox/helper/propertyset.hxx" #include "oox/token/properties.hxx" @@ -263,6 +264,34 @@ Reference< XGraphic > GraphicHelper::importGraphic( const Reference< XInputStrea return xGraphic; } +std::vector< uno::Reference<graphic::XGraphic> > GraphicHelper::importGraphics(const std::vector< uno::Reference<io::XInputStream> >& rStreams) const +{ + std::vector< uno::Reference<graphic::XGraphic> > aRet; + + for (const auto& rStream : rStreams) + { + uno::Reference<graphic::XGraphic> xGraphic; + if (rStream.is() && mxGraphicProvider.is()) + { + try + { + uno::Sequence<beans::PropertyValue > aArgs = comphelper::InitPropertySequence( + { + {"InputStream", uno::makeAny(rStream)} + }); + xGraphic = mxGraphicProvider->queryGraphic(aArgs); + } + catch( const uno::Exception& rException) + { + SAL_WARN("oox", "GraphicHelper::importGraphic: queryGraphics() failed: " << rException.Message); + } + } + aRet.push_back(xGraphic); + } + + return aRet; +} + Reference< XGraphic > GraphicHelper::importGraphic( const StreamDataSequence& rGraphicData ) const { Reference< XGraphic > xGraphic; @@ -278,8 +307,9 @@ void GraphicHelper::importEmbeddedGraphics(const std::vector<OUString>& rStreamN { // Don't actually return anything, just fill maEmbeddedGraphics. - // Input stream -> stream name map. - std::map< uno::Reference<io::XInputStream>, OUString > aStreamNames; + // Stream names and streams to be imported. + std::vector<OUString> aMissingStreamNames; + std::vector< uno::Reference<io::XInputStream> > aMissingStreams; for (const auto& rStreamName : rStreamNames) { @@ -291,14 +321,19 @@ void GraphicHelper::importEmbeddedGraphics(const std::vector<OUString>& rStreamN EmbeddedGraphicMap::const_iterator aIt = maEmbeddedGraphics.find(rStreamName); if (aIt == maEmbeddedGraphics.end()) - aStreamNames[mxStorage->openInputStream(rStreamName)] = rStreamName; + { + aMissingStreamNames.push_back(rStreamName); + aMissingStreams.push_back(mxStorage->openInputStream(rStreamName)); + } } - for (const auto& rStream : aStreamNames) + std::vector< uno::Reference<graphic::XGraphic> > aGraphics = importGraphics(aMissingStreams); + + assert(aGraphics.size() == aMissingStreamNames.size()); + for (size_t i = 0; i < aGraphics.size(); ++i) { - uno::Reference<graphic::XGraphic> xGraphic = importGraphic(rStream.first); - if (xGraphic.is()) - maEmbeddedGraphics[rStream.second] = xGraphic; + if (aGraphics[i].is()) + maEmbeddedGraphics[aMissingStreamNames[i]] = aGraphics[i]; } } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits