[Libreoffice-commits] core.git: Branch 'libreoffice-4-3-6' - include/vcl vcl/inc vcl/source
Caolán McNamara
caolanm at redhat.com
Tue Jan 27 09:50:47 PST 2015
include/vcl/outdev.hxx | 9 +++++++
vcl/inc/outdev.h | 2 +
vcl/source/gdi/embeddedfontshelper.cxx | 5 ++--
vcl/source/outdev/font.cxx | 39 +++++++++++++++++++++++++++------
4 files changed, 47 insertions(+), 8 deletions(-)
New commits:
commit f3be004eca2c8fb7776fb83b630cb33b2ee3ed25
Author: Caolán McNamara <caolanm at redhat.com>
Date: Tue Jan 20 11:24:26 2015 +0000
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 at redhat.com>
Reviewed-by: Miklos Vajna <vmiklos at collabora.co.uk>
Tested-by: Christian Lohmaier <lohmaier+LibreOffice at googlemail.com>
Reviewed-by: Christian Lohmaier <lohmaier+LibreOffice at googlemail.com>
diff --git a/include/vcl/outdev.hxx b/include/vcl/outdev.hxx
index 3e98666..21f5931 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 dcde57c..a2f3b09 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 1eca07e..4c8d907 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 7104caa..9df60e3 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
More information about the Libreoffice-commits
mailing list