summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--desktop/source/lib/init.cxx3
-rw-r--r--include/vcl/graphicfilter.hxx2
-rw-r--r--vcl/source/filter/graphicfilter.cxx26
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,