[Libreoffice-commits] core.git: Branch 'libreoffice-4-4' - include/vcl sd/qa vcl/inc vcl/source

Caolán McNamara caolanm at redhat.com
Tue Jan 27 05:51:19 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 2e9e1b2785223f862d52ec75d303566f3a859215
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/14045
    Tested-by: Michael Stahl <mstahl at redhat.com>
    Reviewed-by: Michael Stahl <mstahl at redhat.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