diff options
author | David Tardon <dtardon@redhat.com> | 2014-02-05 10:55:25 +0100 |
---|---|---|
committer | Björn Michaelsen <bjoern.michaelsen@canonical.com> | 2014-07-20 16:56:40 +0000 |
commit | dbf5d7e52d0162ba10bb971d5a3187303c386589 (patch) | |
tree | c32ccf256d7efde60e44aab194461d34b845f5c3 | |
parent | 008f5ba99fd89cd6a6e4db90e8db16e02fe0b027 (diff) |
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@canonical.com>
Tested-by: Björn Michaelsen <bjoern.michaelsen@canonical.com>
-rw-r--r-- | include/vcl/outdev.hxx | 6 | ||||
-rw-r--r-- | vcl/source/gdi/outdev3.cxx | 59 |
2 files changed, 59 insertions, 6 deletions
diff --git a/include/vcl/outdev.hxx b/include/vcl/outdev.hxx index 48ebd50cd0f6..a9234d97d86d 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 a36fc855f31d..a8cb7fc5e674 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; } } |