diff options
author | David Tardon <dtardon@redhat.com> | 2014-02-05 10:55:25 +0100 |
---|---|---|
committer | David Tardon <dtardon@redhat.com> | 2014-02-05 11:02:53 +0100 |
commit | 6b127d40c7d57745bc602d9ff7914392f9d3b92b (patch) | |
tree | 0bfc1689f5d137e60cedafe64af80afdba326f35 | |
parent | 561c48178c5ea544f4c1e845f77970d2830ed544 (diff) |
rhbz#1057977 avoid use of invalidated pointers
Change-Id: Ib81f79da696b5e8002f5a2ddcf160903231dc3f1
-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 8a7c43938022..42231357cc6f 100644 --- a/include/vcl/outdev.hxx +++ b/include/vcl/outdev.hxx @@ -537,9 +537,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 5c5dcf26eaa8..c347f71f4093 100644 --- a/vcl/source/gdi/outdev3.cxx +++ b/vcl/source/gdi/outdev3.cxx @@ -154,7 +154,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 ) @@ -205,6 +205,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(); } @@ -222,16 +254,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 ) @@ -250,16 +290,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; } @@ -270,7 +317,7 @@ void OutputDevice::ImplUpdateAllFontData( bool bNewFontLists ) VirtualDevice* pVirDev = pSVData->maGDIData.mpFirstVirDev; while ( pVirDev ) { - pVirDev->ImplUpdateFontData( bNewFontLists ); + ( pVirDev->*pHdl )( bNewFontLists ); pVirDev = pVirDev->mpNext; } @@ -278,7 +325,7 @@ void OutputDevice::ImplUpdateAllFontData( bool bNewFontLists ) Printer* pPrinter = pSVData->maGDIData.mpFirstPrinter; while ( pPrinter ) { - pPrinter->ImplUpdateFontData( bNewFontLists ); + ( pPrinter->*pHdl )( bNewFontLists ); pPrinter = pPrinter->mpNext; } } |