Kaydet (Commit) 6b127d40 authored tarafından David Tardon's avatar David Tardon

rhbz#1057977 avoid use of invalidated pointers

Change-Id: Ib81f79da696b5e8002f5a2ddcf160903231dc3f1
üst 561c4817
......@@ -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();
......
......@@ -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;
}
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment