diff options
-rw-r--r-- | desktop/source/lib/init.cxx | 3 | ||||
-rw-r--r-- | include/vcl/graphicfilter.hxx | 2 | ||||
-rw-r--r-- | vcl/source/filter/graphicfilter.cxx | 26 |
3 files changed, 31 insertions, 0 deletions
diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx index 8cfa28881d90..6abda3e775a5 100644 --- a/desktop/source/lib/init.cxx +++ b/desktop/source/lib/init.cxx @@ -5171,6 +5171,9 @@ static int lo_initialize(LibreOfficeKit* pThis, const char* pAppPath, const char InitVCL(); } + // pre-load all graphic libraries. + GraphicFilter::GetGraphicFilter().preload(); + // pre-load all component libraries. if (!xContext.is()) throw css::uno::DeploymentException("preInit: XComponentContext is not created"); diff --git a/include/vcl/graphicfilter.hxx b/include/vcl/graphicfilter.hxx index d84ae3f0a9fa..bb4584e4bf8a 100644 --- a/include/vcl/graphicfilter.hxx +++ b/include/vcl/graphicfilter.hxx @@ -304,6 +304,8 @@ public: ErrCode compressAsPNG(const Graphic& rGraphic, SvStream& rOutputStream); + void preload(); + private: OUString aFilterPath; FilterConfigCache* pConfig; diff --git a/vcl/source/filter/graphicfilter.cxx b/vcl/source/filter/graphicfilter.cxx index bef80fb94b24..7448826a8a33 100644 --- a/vcl/source/filter/graphicfilter.cxx +++ b/vcl/source/filter/graphicfilter.cxx @@ -66,6 +66,8 @@ #include <rtl/bootstrap.hxx> #include <rtl/instance.hxx> #include <vcl/metaact.hxx> +#include <tools/svlibrary.h> +#include <comphelper/string.hxx> #include <vector> #include <memory> @@ -1441,6 +1443,30 @@ void GraphicFilter::ImportGraphics(std::vector< std::shared_ptr<Graphic> >& rGra } } +void GraphicFilter::preload() +{ + sal_Int32 nTokenCount = comphelper::string::getTokenCount(aFilterPath, ';'); + ImpFilterLibCache& rCache = Cache::get(); + static const std::initializer_list<OUStringLiteral> aFilterNames = { + "icd", "idx", "ime", "ipb", "ipd", "ips", "ipt", "ipx", "ira", "itg", "iti", + }; + + // Load library for each filter. + for (const auto& rFilterName : aFilterNames) + { + ImpFilterLibCacheEntry* pFilter = nullptr; + // Look at the library in each element inside the filter path. + for (sal_Int32 i = 0; i < nTokenCount; ++i) + { + pFilter = rCache.GetFilter(aFilterPath.getToken(i, ';'), SVLIBRARY("gie"), rFilterName); + if (pFilter) + { + break; + } + } + } +} + ErrCode GraphicFilter::ImportGraphic( Graphic& rGraphic, const OUString& rPath, SvStream& rIStream, sal_uInt16 nFormat, sal_uInt16* pDeterminedFormat, GraphicFilterImportFlags nImportFlags, css::uno::Sequence< css::beans::PropertyValue >* pFilterData, |