summaryrefslogtreecommitdiff
path: root/vcl/source
diff options
context:
space:
mode:
authorMike Kaganski <mike.kaganski@collabora.com>2019-01-11 00:06:49 +0300
committerMike Kaganski <mike.kaganski@collabora.com>2019-01-11 05:38:52 +0100
commit98d71c4e0847797a4ba9229a8e6d832a8a3d5e0f (patch)
tree97012c315567a679abc827873746afa5fa90bdd0 /vcl/source
parent284a7f60fff72c4d8c011ff60ea2e40163cd25c3 (diff)
tdf#69060: lock refreshing font data when loading a document
This accumulates all calls to OutputDevice::ImplRefreshAllFontData while loading document's model, to avoid multiple updates for each imported font. After loading, OutputDevice::ImplRefreshAllFontData is executed once. Change-Id: I5b23a2b8a3765dee9061b6479665d04c2ba11cbf Reviewed-on: https://gerrit.libreoffice.org/47112 Tested-by: Jenkins Reviewed-by: Mike Kaganski <mike.kaganski@collabora.com>
Diffstat (limited to 'vcl/source')
-rw-r--r--vcl/source/app/svapp.cxx5
-rw-r--r--vcl/source/outdev/font.cxx40
2 files changed, 44 insertions, 1 deletions
diff --git a/vcl/source/app/svapp.cxx b/vcl/source/app/svapp.cxx
index c73769ebcc8a..c3f3b07827f0 100644
--- a/vcl/source/app/svapp.cxx
+++ b/vcl/source/app/svapp.cxx
@@ -987,6 +987,11 @@ void Application::RemoveUserEvent( ImplSVEvent * nUserEvent )
}
}
+void Application::LockFontUpdates(bool bLock)
+{
+ OutputDevice::LockFontUpdates(bLock);
+}
+
WorkWindow* Application::GetAppWindow()
{
return ImplGetSVData()->maWinData.mpAppWin;
diff --git a/vcl/source/outdev/font.cxx b/vcl/source/outdev/font.cxx
index 1e0cb553c04b..4d982e9d1f3a 100644
--- a/vcl/source/outdev/font.cxx
+++ b/vcl/source/outdev/font.cxx
@@ -595,9 +595,26 @@ void OutputDevice::ImplClearAllFontData(bool bNewFontLists)
}
}
+namespace {
+osl::Mutex& GetFontUpdatesLockMutex()
+{
+ static osl::Mutex aFontUpdatesMutex;
+ return aFontUpdatesMutex;
+}
+}
+
void OutputDevice::ImplRefreshAllFontData(bool bNewFontLists)
{
- ImplUpdateFontDataForAllFrames( &OutputDevice::ImplRefreshFontData, bNewFontLists );
+ auto svdata = ImplGetSVData();
+ osl::MutexGuard aGuard(GetFontUpdatesLockMutex());
+ if (!svdata->mnFontUpdatesLockCount)
+ ImplUpdateFontDataForAllFrames(&OutputDevice::ImplRefreshFontData, bNewFontLists);
+ else
+ {
+ svdata->mbFontUpdatesPending = true;
+ if (bNewFontLists)
+ svdata->mbFontUpdatesNewLists = true;
+ }
}
void OutputDevice::ImplUpdateAllFontData(bool bNewFontLists)
@@ -643,6 +660,27 @@ void OutputDevice::ImplUpdateFontDataForAllFrames( const FontUpdateHandler_t pHd
}
}
+void OutputDevice::LockFontUpdates(bool bLock)
+{
+ auto svdata = ImplGetSVData();
+ osl::MutexGuard aGuard(GetFontUpdatesLockMutex());
+ if (bLock)
+ {
+ ++svdata->mnFontUpdatesLockCount;
+ }
+ else if (svdata->mnFontUpdatesLockCount > 0)
+ {
+ --svdata->mnFontUpdatesLockCount;
+ if (!svdata->mnFontUpdatesLockCount && svdata->mbFontUpdatesPending)
+ {
+ ImplRefreshAllFontData(svdata->mbFontUpdatesNewLists);
+
+ svdata->mbFontUpdatesPending = false;
+ svdata->mbFontUpdatesNewLists = false;
+ }
+ }
+}
+
void OutputDevice::BeginFontSubstitution()
{
ImplSVData* pSVData = ImplGetSVData();