[Libreoffice-commits] core.git: Branch 'libreoffice-4-4-0' - include/vcl sd/qa vcl/inc vcl/source
Caolán McNamara
caolanm at redhat.com
Thu Jan 22 12:01:59 PST 2015
include/vcl/outdev.hxx | 9 +++++
sd/qa/unit/data/odp/pass/test-embedded-dejavu.odp |binary
vcl/inc/outdev.h | 2 +
vcl/source/gdi/embeddedfontshelper.cxx | 5 +-
vcl/source/outdev/font.cxx | 39 ++++++++++++++++++----
5 files changed, 47 insertions(+), 8 deletions(-)
New commits:
commit 93e07c7d16a052a735e9e85aba5a3a885df662e1
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
Change-Id: I665cde5d4c89443238efb283c86277dedf621197
(cherry picked from commit 20142afafc809890d5e8dcfd4103c46319a488df)
Reviewed-on: https://gerrit.libreoffice.org/14046
Reviewed-by: Michael Meeks <michael.meeks at collabora.com>
Reviewed-by: Christian Lohmaier <lohmaier+LibreOffice at googlemail.com>
Tested-by: Christian Lohmaier <lohmaier+LibreOffice at googlemail.com>
diff --git a/include/vcl/outdev.hxx b/include/vcl/outdev.hxx
index 806e501..9abd9e9 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
new file mode 100644
index 0000000..d539e8c
Binary files /dev/null and b/sd/qa/unit/data/odp/pass/test-embedded-dejavu.odp differ
diff --git a/vcl/inc/outdev.h b/vcl/inc/outdev.h
index c878d8b2..5581fe1 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 5706022..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 );
- 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 b7d044c..b04a318 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
More information about the Libreoffice-commits
mailing list