summaryrefslogtreecommitdiffstats
path: root/oox
diff options
context:
space:
mode:
Diffstat (limited to 'oox')
-rw-r--r--oox/source/helper/graphichelper.cxx52
-rw-r--r--oox/source/shape/ShapeContextHandler.cxx6
-rw-r--r--oox/source/shape/ShapeContextHandler.hxx2
-rw-r--r--oox/source/shape/ShapeFilterBase.cxx5
4 files changed, 53 insertions, 12 deletions
diff --git a/oox/source/helper/graphichelper.cxx b/oox/source/helper/graphichelper.cxx
index 8e56f58ccabb..e43f7ee655fa 100644
--- a/oox/source/helper/graphichelper.cxx
+++ b/oox/source/helper/graphichelper.cxx
@@ -30,6 +30,7 @@
#include <com/sun/star/graphic/GraphicProvider.hpp>
#include <com/sun/star/graphic/XGraphicProvider.hpp>
#include <com/sun/star/util/MeasureUnit.hpp>
+#include <com/sun/star/graphic/GraphicMapper.hpp>
#include <osl/diagnose.h>
#include <sal/log.hxx>
#include <comphelper/seqstream.hxx>
@@ -320,16 +321,24 @@ void GraphicHelper::importEmbeddedGraphics(const std::vector<OUString>& rStreamN
std::vector<OUString> aMissingStreamNames;
std::vector< uno::Reference<io::XInputStream> > aMissingStreams;
+ initializeGraphicMapperIfNeeded();
+
+ SAL_WARN_IF(!mxGraphicMapper.is(), "oox", "GraphicHelper::importEmbeddedGraphic - graphic mapper not available");
+
for (const auto& rStreamName : rStreamNames)
{
- if(rStreamName.isEmpty())
+
+ if (rStreamName.isEmpty())
{
SAL_WARN("oox", "GraphicHelper::importEmbeddedGraphics - empty stream name");
continue;
}
- EmbeddedGraphicMap::const_iterator aIt = maEmbeddedGraphics.find(rStreamName);
- if (aIt == maEmbeddedGraphics.end())
+ Reference<XGraphic> xGraphic;
+
+ xGraphic = mxGraphicMapper->findGraphic(rStreamName);
+
+ if (!xGraphic.is())
{
aMissingStreamNames.push_back(rStreamName);
aMissingStreams.push_back(mxStorage->openInputStream(rStreamName));
@@ -338,11 +347,14 @@ void GraphicHelper::importEmbeddedGraphics(const std::vector<OUString>& rStreamN
std::vector< uno::Reference<graphic::XGraphic> > aGraphics = importGraphics(aMissingStreams);
+
assert(aGraphics.size() == aMissingStreamNames.size());
for (size_t i = 0; i < aGraphics.size(); ++i)
{
if (aGraphics[i].is())
- maEmbeddedGraphics[aMissingStreamNames[i]] = aGraphics[i];
+ {
+ mxGraphicMapper->putGraphic(aMissingStreamNames[i], aGraphics[i]);
+ }
}
}
@@ -350,22 +362,26 @@ Reference< XGraphic > GraphicHelper::importEmbeddedGraphic( const OUString& rStr
{
Reference< XGraphic > xGraphic;
OSL_ENSURE( !rStreamName.isEmpty(), "GraphicHelper::importEmbeddedGraphic - empty stream name" );
+
if( !rStreamName.isEmpty() )
{
- EmbeddedGraphicMap::const_iterator aIt = maEmbeddedGraphics.find( rStreamName );
- if( aIt == maEmbeddedGraphics.end() )
+ initializeGraphicMapperIfNeeded();
+
+ SAL_WARN_IF(!mxGraphicMapper.is(), "oox", "GraphicHelper::importEmbeddedGraphic - graphic mapper not available");
+
+ xGraphic = mxGraphicMapper->findGraphic(rStreamName);
+ if (!xGraphic.is())
{
// Lazy-loading doesn't work with TIFF or WMF at the moment.
WmfExternal aHeader;
if ( (rStreamName.endsWith(".tiff") || rStreamName.endsWith(".wmf") ) && !pExtHeader)
pExtHeader = &aHeader;
- xGraphic = importGraphic(mxStorage->openInputStream(rStreamName), pExtHeader);
- if( xGraphic.is() )
- maEmbeddedGraphics[ rStreamName ] = xGraphic;
+ auto xStream = mxStorage->openInputStream(rStreamName);
+ xGraphic = importGraphic(xStream, pExtHeader);
+ if (xGraphic.is())
+ mxGraphicMapper->putGraphic(rStreamName, xGraphic);
}
- else
- xGraphic = aIt->second;
}
return xGraphic;
}
@@ -383,6 +399,20 @@ awt::Size GraphicHelper::getOriginalSize( const Reference< XGraphic >& xGraphic
return aSizeHmm;
}
+void GraphicHelper::setGraphicMapper(css::uno::Reference<css::graphic::XGraphicMapper> const & rGraphicMapper)
+{
+ mxGraphicMapper = rGraphicMapper;
+}
+
+void GraphicHelper::initializeGraphicMapperIfNeeded() const
+{
+ if (!mxGraphicMapper.is())
+ {
+ auto* pNonConstThis = const_cast<GraphicHelper*>(this);
+ pNonConstThis->mxGraphicMapper = graphic::GraphicMapper::create(mxContext);
+ }
+}
+
} // namespace oox
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/oox/source/shape/ShapeContextHandler.cxx b/oox/source/shape/ShapeContextHandler.cxx
index 1a1aafa5cf38..82f30c84ff09 100644
--- a/oox/source/shape/ShapeContextHandler.cxx
+++ b/oox/source/shape/ShapeContextHandler.cxx
@@ -595,6 +595,12 @@ void SAL_CALL ShapeContextHandler::setMediaDescriptor(const uno::Sequence<beans:
maMediaDescriptor = rMediaDescriptor;
}
+void SAL_CALL ShapeContextHandler::setGraphicMapper(css::uno::Reference<css::graphic::XGraphicMapper> const & rxGraphicMapper)
+{
+ auto pShapeFilterBase = static_cast<ShapeFilterBase*>(mxFilterBase.get());
+ pShapeFilterBase->setGraphicMapper(rxGraphicMapper);
+}
+
OUString ShapeContextHandler::getImplementationName()
{
return "com.sun.star.comp.oox.ShapeContextHandler";
diff --git a/oox/source/shape/ShapeContextHandler.hxx b/oox/source/shape/ShapeContextHandler.hxx
index 2de45f533637..b1204470346e 100644
--- a/oox/source/shape/ShapeContextHandler.hxx
+++ b/oox/source/shape/ShapeContextHandler.hxx
@@ -122,6 +122,8 @@ public:
virtual css::uno::Sequence<css::beans::PropertyValue> SAL_CALL getMediaDescriptor() override;
virtual void SAL_CALL setMediaDescriptor(const css::uno::Sequence<css::beans::PropertyValue>& rMediaDescriptor) override;
+ void SAL_CALL setGraphicMapper(css::uno::Reference<css::graphic::XGraphicMapper> const & rGraphicMapper) override;
+
private:
ShapeContextHandler(ShapeContextHandler const &) = delete;
void operator =(ShapeContextHandler const &) = delete;
diff --git a/oox/source/shape/ShapeFilterBase.cxx b/oox/source/shape/ShapeFilterBase.cxx
index 562504090f76..255dd65a7b94 100644
--- a/oox/source/shape/ShapeFilterBase.cxx
+++ b/oox/source/shape/ShapeFilterBase.cxx
@@ -100,7 +100,10 @@ ShapeGraphicHelper::ShapeGraphicHelper( const ShapeFilterBase& rFilter ) :
GraphicHelper* ShapeFilterBase::implCreateGraphicHelper() const
{
- return new ShapeGraphicHelper( *this );
+ GraphicHelper* pGraphicHelper = new ShapeGraphicHelper(*this);
+ if (mxGraphicMapper.is())
+ pGraphicHelper->setGraphicMapper(mxGraphicMapper);
+ return pGraphicHelper;
}
::Color ShapeFilterBase::getSchemeColor( sal_Int32 nToken ) const