From 35f78e48582caa691a855101a0d661985ba067bb Mon Sep 17 00:00:00 2001 From: David Tardon Date: Wed, 5 Feb 2014 10:55:25 +0100 Subject: [PATCH] rhbz#1057977 avoid use of invalidated pointers Change-Id: Ib81f79da696b5e8002f5a2ddcf160903231dc3f1 --- include/vcl/outdev.hxx | 6 +++++ 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 047a79d..4f157b7 100644 --- a/include/vcl/outdev.hxx +++ b/include/vcl/outdev.hxx @@ -547,9 +547,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 afe06f7..d789eb9 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; } } -- 1.8.5.3