summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2015-01-20 11:24:26 +0000
committerChristian Lohmaier <lohmaier+LibreOffice@googlemail.com>2015-01-27 17:50:10 +0000
commitf3be004eca2c8fb7776fb83b630cb33b2ee3ed25 (patch)
treecf752259a9831cfbc866355eed00c21e12a07a51
parentResolves: fdo#88378 flipping by reversing co-ord system no longer works (diff)
downloadcore-f3be004eca2c8fb7776fb83b630cb33b2ee3ed25.tar.gz
core-f3be004eca2c8fb7776fb83b630cb33b2ee3ed25.zip
font cache gets broken on adding an embedded font
(cherry picked from commit 20142afafc809890d5e8dcfd4103c46319a488df) Conflicts: vcl/source/gdi/embeddedfontshelper.cxx Change-Id: I665cde5d4c89443238efb283c86277dedf621197 Reviewed-on: https://gerrit.libreoffice.org/14057 Reviewed-by: Michael Stahl <mstahl@redhat.com> Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk> Tested-by: Christian Lohmaier <lohmaier+LibreOffice@googlemail.com> Reviewed-by: Christian Lohmaier <lohmaier+LibreOffice@googlemail.com>
-rw-r--r--include/vcl/outdev.hxx9
-rw-r--r--vcl/inc/outdev.h2
-rw-r--r--vcl/source/gdi/embeddedfontshelper.cxx5
-rw-r--r--vcl/source/outdev/font.cxx39
4 files changed, 47 insertions, 8 deletions
diff --git a/include/vcl/outdev.hxx b/include/vcl/outdev.hxx
index 3e98666df2b5..21f59315a720 100644
--- a/include/vcl/outdev.hxx
+++ b/include/vcl/outdev.hxx
@@ -1133,6 +1133,15 @@ public:
SAL_DLLPRIVATE void ImplInitFontList() const;
SAL_DLLPRIVATE void ImplUpdateFontData( bool bNewFontLists );
+
+ //drop font data for all outputdevices.
+ //If bNewFontLists is true then empty lists of system fonts
+ SAL_DLLPRIVATE static void ImplClearAllFontData( bool bNewFontLists );
+ //fetch font data for all outputdevices
+ //If bNewFontLists is true then fetch lists of system fonts
+ SAL_DLLPRIVATE static void ImplRefreshAllFontData( bool bNewFontLists );
+ //drop and fetch font data for all outputdevices
+ //If bNewFontLists is true then drop and refetch lists of system fonts
SAL_DLLPRIVATE static void ImplUpdateAllFontData( bool bNewFontLists );
protected:
diff --git a/vcl/inc/outdev.h b/vcl/inc/outdev.h
index dcde57c09ee9..a2f3b09cf9c9 100644
--- a/vcl/inc/outdev.h
+++ b/vcl/inc/outdev.h
@@ -143,6 +143,8 @@ private:
typedef ::boost::unordered_map<FontSelectPattern,ImplFontEntry*,IFSD_Hash,IFSD_Equal > FontInstanceList;
FontInstanceList maFontInstanceList;
+ int CountUnreferencedEntries() const;
+
public:
ImplFontCache();
~ImplFontCache();
diff --git a/vcl/source/gdi/embeddedfontshelper.cxx b/vcl/source/gdi/embeddedfontshelper.cxx
index 1eca07e2833e..4c8d90779b22 100644
--- a/vcl/source/gdi/embeddedfontshelper.cxx
+++ b/vcl/source/gdi/embeddedfontshelper.cxx
@@ -181,8 +181,9 @@ OUString EmbeddedFontsHelper::fileUrlForTemporaryFont( const OUString& fontName,
void EmbeddedFontsHelper::activateFont( const OUString& fontName, const OUString& fileUrl )
{
OutputDevice *pDevice = Application::GetDefaultDevice();
- pDevice->AddTempDevFont( fileUrl, fontName );
- pDevice->ImplUpdateAllFontData( true );
+ OutputDevice::ImplClearAllFontData(true);
+ pDevice->AddTempDevFont(fileUrl, fontName);
+ OutputDevice::ImplRefreshAllFontData(true);
}
// Check if it's (legally) allowed to embed the font file into a document
diff --git a/vcl/source/outdev/font.cxx b/vcl/source/outdev/font.cxx
index 7104caa95a13..9df60e3c922d 100644
--- a/vcl/source/outdev/font.cxx
+++ b/vcl/source/outdev/font.cxx
@@ -154,6 +154,7 @@ bool OutputDevice::AddTempDevFont( const OUString& rFileURL, const OUString& rFo
if( mpAlphaVDev )
mpAlphaVDev->AddTempDevFont( rFileURL, rFontName );
+ ImplClearFontData(true);
mpFontCache->Invalidate();
return true;
}
@@ -568,7 +569,7 @@ void OutputDevice::ImplUpdateFontData( bool bNewFontLists )
ImplRefreshFontData( bNewFontLists );
}
-void OutputDevice::ImplUpdateAllFontData( bool bNewFontLists )
+void OutputDevice::ImplClearAllFontData(bool bNewFontLists)
{
ImplSVData* pSVData = ImplGetSVData();
@@ -591,10 +592,19 @@ void OutputDevice::ImplUpdateAllFontData( bool bNewFontLists )
}
}
}
+}
+void OutputDevice::ImplRefreshAllFontData(bool bNewFontLists)
+{
ImplUpdateFontDataForAllFrames( &OutputDevice::ImplRefreshFontData, bNewFontLists );
}
+void OutputDevice::ImplUpdateAllFontData(bool bNewFontLists)
+{
+ OutputDevice::ImplClearAllFontData(bNewFontLists);
+ OutputDevice::ImplRefreshAllFontData(bNewFontLists);
+}
+
void OutputDevice::ImplUpdateFontDataForAllFrames( const FontUpdateHandler_t pHdl, const bool bNewFontLists )
{
ImplSVData* const pSVData = ImplGetSVData();
@@ -1364,11 +1374,11 @@ void ImplFontCache::Release( ImplFontEntry* pEntry )
{
static const int FONTCACHE_MAX = 50;
- DBG_ASSERT( (pEntry->mnRefCount > 0), "ImplFontCache::Release() - font refcount underflow" );
+ assert(pEntry->mnRefCount > 0 && "ImplFontCache::Release() - font refcount underflow");
if( --pEntry->mnRefCount > 0 )
return;
- if( ++mnRef0Count < FONTCACHE_MAX )
+ if (++mnRef0Count < FONTCACHE_MAX)
return;
// remove unused entries from font instance cache
@@ -1383,17 +1393,34 @@ void ImplFontCache::Release( ImplFontEntry* pEntry )
maFontInstanceList.erase( it );
delete pFontEntry;
--mnRef0Count;
- DBG_ASSERT( (mnRef0Count>=0), "ImplFontCache::Release() - refcount0 underflow" );
+ assert(mnRef0Count>=0 && "ImplFontCache::Release() - refcount0 underflow");
if( mpFirstEntry == pFontEntry )
mpFirstEntry = NULL;
}
- DBG_ASSERT( (mnRef0Count==0), "ImplFontCache::Release() - refcount0 mismatch" );
+ assert(mnRef0Count==0 && "ImplFontCache::Release() - refcount0 mismatch");
+}
+
+int ImplFontCache::CountUnreferencedEntries() const
+{
+ size_t nCount = 0;
+ // count unreferenced entries
+ for (FontInstanceList::const_iterator it = maFontInstanceList.begin();
+ it != maFontInstanceList.end(); ++it)
+ {
+ const ImplFontEntry* pFontEntry = it->second;
+ if (pFontEntry->mnRefCount > 0)
+ continue;
+ ++nCount;
+ }
+ return nCount;
}
void ImplFontCache::Invalidate()
{
+ assert(CountUnreferencedEntries() == mnRef0Count);
+
// delete unreferenced entries
FontInstanceList::iterator it = maFontInstanceList.begin();
for(; it != maFontInstanceList.end(); ++it )
@@ -1410,7 +1437,7 @@ void ImplFontCache::Invalidate()
mpFirstEntry = NULL;
maFontInstanceList.clear();
- DBG_ASSERT( (mnRef0Count==0), "ImplFontCache::Invalidate() - mnRef0Count non-zero" );
+ assert(mnRef0Count==0 && "ImplFontCache::Invalidate() - mnRef0Count non-zero");
}
void OutputDevice::ImplInitFontList() const