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

David Tardon dtardon at redhat.com
Sun Jul 20 09:57:08 PDT 2014


 include/vcl/outdev.hxx     |    6 ++++
 vcl/source/gdi/outdev3.cxx |   59 ++++++++++++++++++++++++++++++++++++++++-----
 2 files changed, 59 insertions(+), 6 deletions(-)

New commits:
commit dbf5d7e52d0162ba10bb971d5a3187303c386589
Author: David Tardon <dtardon at redhat.com>
Date:   Wed Feb 5 10:55:25 2014 +0100

    fdo#78598 avoid use of invalidated pointers
    
    Change-Id: Ib81f79da696b5e8002f5a2ddcf160903231dc3f1
    (cherry picked from commit 6b127d40c7d57745bc602d9ff7914392f9d3b92b)
    Reviewed-on: https://gerrit.libreoffice.org/10421
    Reviewed-by: Björn Michaelsen <bjoern.michaelsen at canonical.com>
    Tested-by: Björn Michaelsen <bjoern.michaelsen at canonical.com>

diff --git a/include/vcl/outdev.hxx b/include/vcl/outdev.hxx
index 48ebd50..a9234d9 100644
--- a/include/vcl/outdev.hxx
+++ b/include/vcl/outdev.hxx
@@ -551,9 +551,15 @@ protected:
                         OutputDevice();
 
 private:
+    typedef void ( OutputDevice::* FontUpdateHandler_t )( bool );
+
     SAL_DLLPRIVATE                OutputDevice( const OutputDevice& rOutDev );
     SAL_DLLPRIVATE OutputDevice&  operator =( const OutputDevice& rOutDev );
 
+    SAL_DLLPRIVATE void         ImplClearFontData( bool bNewFontLists );
+    SAL_DLLPRIVATE void         ImplRefreshFontData( bool bNewFontLists );
+    SAL_DLLPRIVATE static void  ImplUpdateFontDataForAllFrames( FontUpdateHandler_t pHdl, bool bNewFontLists );
+
 public:
     virtual             ~OutputDevice();
 
diff --git a/vcl/source/gdi/outdev3.cxx b/vcl/source/gdi/outdev3.cxx
index a36fc85..a8cb7fc 100644
--- a/vcl/source/gdi/outdev3.cxx
+++ b/vcl/source/gdi/outdev3.cxx
@@ -156,7 +156,7 @@ static void ImplRotatePos( long nOriginX, long nOriginY, long& rX, long& rY,
     }
 }
 
-void OutputDevice::ImplUpdateFontData( bool bNewFontLists )
+void OutputDevice::ImplClearFontData( const bool bNewFontLists )
 {
     // the currently selected logical font is no longer needed
     if ( mpFontEntry )
@@ -207,6 +207,38 @@ void OutputDevice::ImplUpdateFontData( bool bNewFontLists )
                         delete mpFontList;
                     if( mpFontCache && mpFontCache != pSVData->maGDIData.mpScreenFontCache )
                         delete mpFontCache;
+                    mpFontList = 0;
+                    mpFontCache = 0;
+                }
+            }
+        }
+    }
+
+    // also update child windows if needed
+    if ( GetOutDevType() == OUTDEV_WINDOW )
+    {
+        Window* pChild = ((Window*)this)->mpWindowImpl->mpFirstChild;
+        while ( pChild )
+        {
+            pChild->ImplClearFontData( true );
+            pChild = pChild->mpWindowImpl->mpNext;
+        }
+    }
+}
+
+void OutputDevice::ImplRefreshFontData( const bool bNewFontLists )
+{
+//    if ( GetOutDevType() == OUTDEV_PRINTER || mpPDFWriter )
+    {
+        ImplSVData* pSVData = ImplGetSVData();
+
+        if ( bNewFontLists )
+        {
+            // we need a graphics
+            if ( ImplGetGraphics() )
+            {
+                if( mpPDFWriter )
+                {
                     mpFontList = pSVData->maGDIData.mpScreenFontList->Clone( true, true );
                     mpFontCache = new ImplFontCache( sal_False );
                 }
@@ -227,16 +259,24 @@ void OutputDevice::ImplUpdateFontData( bool bNewFontLists )
         Window* pChild = ((Window*)this)->mpWindowImpl->mpFirstChild;
         while ( pChild )
         {
-            pChild->ImplUpdateFontData( true );
+            pChild->ImplRefreshFontData( true );
             pChild = pChild->mpWindowImpl->mpNext;
         }
     }
 }
 
+void OutputDevice::ImplUpdateFontData( bool bNewFontLists )
+{
+    ImplClearFontData( bNewFontLists );
+    ImplRefreshFontData( bNewFontLists );
+}
+
 void OutputDevice::ImplUpdateAllFontData( bool bNewFontLists )
 {
     ImplSVData* pSVData = ImplGetSVData();
 
+    ImplUpdateFontDataForAllFrames( &OutputDevice::ImplClearFontData, bNewFontLists );
+
     // clear global font lists to have them updated
     pSVData->maGDIData.mpScreenFontCache->Invalidate();
     if ( bNewFontLists )
@@ -255,16 +295,23 @@ void OutputDevice::ImplUpdateAllFontData( bool bNewFontLists )
         }
     }
 
+    ImplUpdateFontDataForAllFrames( &OutputDevice::ImplRefreshFontData, bNewFontLists );
+}
+
+void OutputDevice::ImplUpdateFontDataForAllFrames( const FontUpdateHandler_t pHdl, const bool bNewFontLists )
+{
+    ImplSVData* const pSVData = ImplGetSVData();
+
     // update all windows
     Window* pFrame = pSVData->maWinData.mpFirstFrame;
     while ( pFrame )
     {
-        pFrame->ImplUpdateFontData( bNewFontLists );
+        ( pFrame->*pHdl )( bNewFontLists );
 
         Window* pSysWin = pFrame->mpWindowImpl->mpFrameData->mpFirstOverlap;
         while ( pSysWin )
         {
-            pSysWin->ImplUpdateFontData( bNewFontLists );
+            ( pSysWin->*pHdl )( bNewFontLists );
             pSysWin = pSysWin->mpWindowImpl->mpNextOverlap;
         }
 
@@ -275,7 +322,7 @@ void OutputDevice::ImplUpdateAllFontData( bool bNewFontLists )
     VirtualDevice* pVirDev = pSVData->maGDIData.mpFirstVirDev;
     while ( pVirDev )
     {
-        pVirDev->ImplUpdateFontData( bNewFontLists );
+        ( pVirDev->*pHdl )( bNewFontLists );
         pVirDev = pVirDev->mpNext;
     }
 
@@ -283,7 +330,7 @@ void OutputDevice::ImplUpdateAllFontData( bool bNewFontLists )
     Printer* pPrinter = pSVData->maGDIData.mpFirstPrinter;
     while ( pPrinter )
     {
-        pPrinter->ImplUpdateFontData( bNewFontLists );
+        ( pPrinter->*pHdl )( bNewFontLists );
         pPrinter = pPrinter->mpNext;
     }
 }


More information about the Libreoffice-commits mailing list