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 <dtar...@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.michael...@canonical.com> Tested-by: Björn Michaelsen <bjoern.michael...@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; } }
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits