[Libreoffice-commits] core.git: include/oox offapi/com offapi/UnoApi_offapi.mk oox/source svtools/source
Miklos Vajna
vmiklos at collabora.co.uk
Tue May 23 13:24:40 UTC 2017
include/oox/helper/graphichelper.hxx | 3 -
offapi/UnoApi_offapi.mk | 1
offapi/com/sun/star/graphic/XGraphicProvider2.idl | 47 ++++++++++++++++++++++
oox/source/helper/graphichelper.cxx | 29 ++++++-------
svtools/source/graphic/provider.cxx | 20 ++++++++-
5 files changed, 81 insertions(+), 19 deletions(-)
New commits:
commit 252e524094893063e4bcc822571a14c4558e1d00
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date: Tue May 23 12:10:44 2017 +0200
svtools: add GraphicProvider::queryGraphics()
This allows moving the for() loop from oox to svtools when importing
multiple images.
That means in case later we parallelize that loop, then the performance
benefit won't be restricted to oox, but also will be available for all
clients of the graphic provider.
Change-Id: Icd7bd447e7ae623b0a8548e020d8f6ab38da47bb
Reviewed-on: https://gerrit.libreoffice.org/37945
Tested-by: Jenkins <ci at libreoffice.org>
Reviewed-by: Miklos Vajna <vmiklos at collabora.co.uk>
diff --git a/include/oox/helper/graphichelper.hxx b/include/oox/helper/graphichelper.hxx
index 17f896683ab4..651e9407b4ec 100644
--- a/include/oox/helper/graphichelper.hxx
+++ b/include/oox/helper/graphichelper.hxx
@@ -31,6 +31,7 @@
#include <oox/helper/storagebase.hxx>
#include <rtl/ustring.hxx>
#include <sal/types.h>
+#include <com/sun/star/graphic/XGraphicProvider2.hpp>
struct WMF_EXTERNALHEADER;
@@ -161,7 +162,7 @@ private:
typedef ::std::map< OUString, css::uno::Reference< css::graphic::XGraphic > > EmbeddedGraphicMap;
css::uno::Reference< css::uno::XComponentContext > mxContext;
- css::uno::Reference< css::graphic::XGraphicProvider > mxGraphicProvider;
+ css::uno::Reference< css::graphic::XGraphicProvider2 > mxGraphicProvider;
css::uno::Reference< css::awt::XUnitConversion > mxUnitConversion;
css::awt::DeviceInfo maDeviceInfo; ///< Current output device info.
SystemPalette maSystemPalette; ///< Maps system colors (XML tokens) to RGB color values.
diff --git a/offapi/UnoApi_offapi.mk b/offapi/UnoApi_offapi.mk
index 0e0a6cad8962..7a9c17af6601 100644
--- a/offapi/UnoApi_offapi.mk
+++ b/offapi/UnoApi_offapi.mk
@@ -2695,6 +2695,7 @@ $(eval $(call gb_UnoApi_add_idlfiles,offapi,com/sun/star/graphic,\
XGraphic \
XGraphicObject \
XGraphicProvider \
+ XGraphicProvider2 \
XGraphicRasterizer \
XGraphicRenderer \
XGraphicTransformer \
diff --git a/offapi/com/sun/star/graphic/XGraphicProvider2.idl b/offapi/com/sun/star/graphic/XGraphicProvider2.idl
new file mode 100644
index 000000000000..04b5f02589d5
--- /dev/null
+++ b/offapi/com/sun/star/graphic/XGraphicProvider2.idl
@@ -0,0 +1,47 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef com_sun_star_graphic_XGraphicProvider2_idl
+#define com_sun_star_graphic_XGraphicProvider2_idl
+
+#include <com/sun/star/graphic/XGraphicProvider.idl>
+
+module com { module sun { module star { module graphic
+{
+
+/** This interface allows operations on multiple graphics with one method
+ call.
+ */
+interface XGraphicProvider2 : XGraphicProvider
+{
+ /** Calling this method returns XGraphic interfaces
+ that hold loaded graphics.
+
+ @param MediaPropertiesSeq
+ A sequence of sequence of property values to describe the location
+ of the graphics.
+
+ @returns
+ The XGraphic interfaces
+
+ @see XGraphicProvider::queryGraphic
+
+ @since LibreOffice 5.5
+ */
+ sequence< XGraphic > queryGraphics([in] sequence< com::sun::star::beans::PropertyValues> MediaPropertiesSeq)
+ raises( com::sun::star::io::IOException,
+ com::sun::star::lang::IllegalArgumentException,
+ com::sun::star::lang::WrappedTargetException );
+};
+
+}; }; }; };
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/oox/source/helper/graphichelper.cxx b/oox/source/helper/graphichelper.cxx
index 7927daedd39e..692937baeb48 100644
--- a/oox/source/helper/graphichelper.cxx
+++ b/oox/source/helper/graphichelper.cxx
@@ -37,6 +37,7 @@
#include <vcl/svapp.hxx>
#include <tools/gen.hxx>
#include <comphelper/propertysequence.hxx>
+#include <comphelper/sequence.hxx>
#include "oox/helper/containerhelper.hxx"
#include "oox/helper/propertyset.hxx"
#include "oox/token/properties.hxx"
@@ -68,7 +69,7 @@ GraphicHelper::GraphicHelper( const Reference< XComponentContext >& rxContext, c
{
OSL_ENSURE( mxContext.is(), "GraphicHelper::GraphicHelper - missing component context" );
if( mxContext.is() )
- mxGraphicProvider.set( graphic::GraphicProvider::create( mxContext ) );
+ mxGraphicProvider.set( graphic::GraphicProvider::create( mxContext ), uno::UNO_QUERY );
//! TODO: get colors from system
maSystemPalette[ XML_3dDkShadow ] = 0x716F64;
@@ -266,29 +267,25 @@ Reference< XGraphic > GraphicHelper::importGraphic( const Reference< XInputStrea
std::vector< uno::Reference<graphic::XGraphic> > GraphicHelper::importGraphics(const std::vector< uno::Reference<io::XInputStream> >& rStreams) const
{
- std::vector< uno::Reference<graphic::XGraphic> > aRet;
+ std::vector< uno::Sequence<beans::PropertyValue> > aArgsVec;
for (const auto& rStream : rStreams)
{
- uno::Reference<graphic::XGraphic> xGraphic;
- if (rStream.is() && mxGraphicProvider.is())
+ if (rStream.is())
{
- try
- {
- uno::Sequence<beans::PropertyValue > aArgs = comphelper::InitPropertySequence(
- {
- {"InputStream", uno::makeAny(rStream)}
- });
- xGraphic = mxGraphicProvider->queryGraphic(aArgs);
- }
- catch( const uno::Exception& rException)
+ uno::Sequence<beans::PropertyValue > aArgs = comphelper::InitPropertySequence(
{
- SAL_WARN("oox", "GraphicHelper::importGraphic: queryGraphics() failed: " << rException.Message);
- }
+ {"InputStream", uno::makeAny(rStream)}
+ });
+ aArgsVec.push_back(aArgs);
}
- aRet.push_back(xGraphic);
}
+ std::vector< uno::Reference<graphic::XGraphic> > aRet;
+
+ if (mxGraphicProvider.is())
+ aRet = comphelper::sequenceToContainer< std::vector< uno::Reference<graphic::XGraphic> > >(mxGraphicProvider->queryGraphics(comphelper::containerToSequence(aArgsVec)));
+
return aRet;
}
diff --git a/svtools/source/graphic/provider.cxx b/svtools/source/graphic/provider.cxx
index 6106bef363a8..faec3fcd4d9b 100644
--- a/svtools/source/graphic/provider.cxx
+++ b/svtools/source/graphic/provider.cxx
@@ -34,7 +34,7 @@
#include <vcl/virdev.hxx>
#include <vcl/settings.hxx>
#include <com/sun/star/awt/XBitmap.hpp>
-#include <com/sun/star/graphic/XGraphicProvider.hpp>
+#include <com/sun/star/graphic/XGraphicProvider2.hpp>
#include <com/sun/star/io/XStream.hpp>
#include <com/sun/star/lang/XServiceInfo.hpp>
#include <com/sun/star/text/GraphicCrop.hpp>
@@ -48,6 +48,7 @@
#include <rtl/ref.hxx>
#include <svtools/grfmgr.hxx>
#include <vcl/dibtools.hxx>
+#include <comphelper/sequence.hxx>
#include <memory>
using namespace com::sun::star;
@@ -56,7 +57,7 @@ namespace {
#define UNO_NAME_GRAPHOBJ_URLPREFIX "vnd.sun.star.GraphicObject:"
-class GraphicProvider : public ::cppu::WeakImplHelper< css::graphic::XGraphicProvider,
+class GraphicProvider : public ::cppu::WeakImplHelper< css::graphic::XGraphicProvider2,
css::lang::XServiceInfo >
{
public:
@@ -79,6 +80,9 @@ protected:
virtual css::uno::Reference< css::graphic::XGraphic > SAL_CALL queryGraphic( const css::uno::Sequence< css::beans::PropertyValue >& MediaProperties ) override;
virtual void SAL_CALL storeGraphic( const css::uno::Reference< css::graphic::XGraphic >& Graphic, const css::uno::Sequence< css::beans::PropertyValue >& MediaProperties ) override;
+ // XGraphicProvider2
+ uno::Sequence< uno::Reference<graphic::XGraphic> > SAL_CALL queryGraphics(const uno::Sequence< uno::Sequence<beans::PropertyValue> >& MediaPropertiesSeq ) override;
+
private:
static css::uno::Reference< css::graphic::XGraphic > implLoadMemory( const OUString& rResourceURL );
@@ -432,6 +436,18 @@ uno::Reference< ::graphic::XGraphic > SAL_CALL GraphicProvider::queryGraphic( co
return xRet;
}
+uno::Sequence< uno::Reference<graphic::XGraphic> > SAL_CALL GraphicProvider::queryGraphics(const uno::Sequence< uno::Sequence<beans::PropertyValue> >& rMediaPropertiesSeq)
+{
+ std::vector< uno::Reference<graphic::XGraphic> > aRet;
+
+ for (const auto& rMediaProperties : rMediaPropertiesSeq)
+ {
+ aRet.push_back(queryGraphic(rMediaProperties));
+ }
+
+ return comphelper::containerToSequence(aRet);
+}
+
void ImplCalculateCropRect( ::Graphic& rGraphic, const text::GraphicCrop& rGraphicCropLogic, tools::Rectangle& rGraphicCropPixel )
{
if ( rGraphicCropLogic.Left || rGraphicCropLogic.Top || rGraphicCropLogic.Right || rGraphicCropLogic.Bottom )
More information about the Libreoffice-commits
mailing list