[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