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 <vmik...@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 <c...@libreoffice.org> Reviewed-by: Miklos Vajna <vmik...@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 ) _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits