diff options
author | Caolán McNamara <caolanm@redhat.com> | 2015-01-20 11:24:26 +0000 |
---|---|---|
committer | Christian Lohmaier <lohmaier+LibreOffice@googlemail.com> | 2015-01-22 20:01:19 +0000 |
commit | 93e07c7d16a052a735e9e85aba5a3a885df662e1 (patch) | |
tree | 35e68bc5306244138dcf0650541bec0c1119c133 | |
parent | 629e451f7e1a6c65e61ee8ab305e464688ca5fbf (diff) |
font cache gets broken on adding an embedded font
Change-Id: I665cde5d4c89443238efb283c86277dedf621197
(cherry picked from commit 20142afafc809890d5e8dcfd4103c46319a488df)
Reviewed-on: https://gerrit.libreoffice.org/14046
Reviewed-by: Michael Meeks <michael.meeks@collabora.com>
Reviewed-by: Christian Lohmaier <lohmaier+LibreOffice@googlemail.com>
Tested-by: Christian Lohmaier <lohmaier+LibreOffice@googlemail.com>
-rw-r--r-- | include/vcl/outdev.hxx | 9 | ||||
-rw-r--r-- | sd/qa/unit/data/odp/pass/test-embedded-dejavu.odp | bin | 0 -> 2225735 bytes | |||
-rw-r--r-- | vcl/inc/outdev.h | 2 | ||||
-rw-r--r-- | vcl/source/gdi/embeddedfontshelper.cxx | 5 | ||||
-rw-r--r-- | vcl/source/outdev/font.cxx | 39 |
5 files changed, 47 insertions, 8 deletions
diff --git a/include/vcl/outdev.hxx b/include/vcl/outdev.hxx index 806e50174647..9abd9e9d21fc 100644 --- a/include/vcl/outdev.hxx +++ b/include/vcl/outdev.hxx @@ -1181,6 +1181,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/sd/qa/unit/data/odp/pass/test-embedded-dejavu.odp b/sd/qa/unit/data/odp/pass/test-embedded-dejavu.odp Binary files differnew file mode 100644 index 000000000000..d539e8cfa616 --- /dev/null +++ b/sd/qa/unit/data/odp/pass/test-embedded-dejavu.odp diff --git a/vcl/inc/outdev.h b/vcl/inc/outdev.h index c878d8b2590d..5581fe1abd64 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 5706022a6bf2..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 ); - OutputDevice::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 b7d044cd448c..b04a318c3c40 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; } @@ -571,7 +572,7 @@ void OutputDevice::ImplUpdateFontData( bool bNewFontLists ) ImplRefreshFontData( bNewFontLists ); } -void OutputDevice::ImplUpdateAllFontData( bool bNewFontLists ) +void OutputDevice::ImplClearAllFontData(bool bNewFontLists) { ImplSVData* pSVData = ImplGetSVData(); @@ -594,10 +595,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(); @@ -1362,11 +1372,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 @@ -1381,17 +1391,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 ) @@ -1408,7 +1435,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 |