summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2016-03-09 15:51:41 +0000
committerCaolán McNamara <caolanm@redhat.com>2016-03-09 16:01:01 +0000
commit4eb5f363ed9a3181a817f12d5ec49eede13b9c9c (patch)
treec30975fa7b7251ab836c7483be82e6bd4ae1af12
parent62b40429946c0e5021912072dc79a60fc11fce06 (diff)
Resolves: tdf#82781 avoid dereferencing invalid iterators
when using print preview with cursor on 2nd page which consists solely of hidden text with show hiddle text enabled. inner mrParentViewShell.Paint can invalidate iterators, as later detected with the mbNewLayoutDuringPaint flag but we dereference for the purposes of drawing the shadow before we get there. easiest thing seems to be to just grab the bits of info we want before the inner paint occurs. Change-Id: I09c9b06449db440b7beba7de9e71c239ee64f6ca
-rw-r--r--sw/source/core/view/pagepreviewlayout.cxx13
1 files changed, 9 insertions, 4 deletions
diff --git a/sw/source/core/view/pagepreviewlayout.cxx b/sw/source/core/view/pagepreviewlayout.cxx
index 10df5f5c3873..1fcc3a269124 100644
--- a/sw/source/core/view/pagepreviewlayout.cxx
+++ b/sw/source/core/view/pagepreviewlayout.cxx
@@ -1092,7 +1092,9 @@ bool SwPagePreviewLayout::Paint(vcl::RenderContext& rRenderContext, const Rectan
Rectangle aPxPaintRect = pOutputDev->LogicToPixel( aPageRect );
if ( aPxOutRect.IsOver( aPxPaintRect) )
{
- if ( (*aPageIter)->pPage->IsEmptyPage() )
+ const SwPageFrame* pPage = (*aPageIter)->pPage;
+
+ if (pPage->IsEmptyPage())
{
const Color aRetouche( mrParentViewShell.Imp()->GetRetoucheColor() );
if( pOutputDev->GetFillColor() != aRetouche )
@@ -1120,16 +1122,20 @@ bool SwPagePreviewLayout::Paint(vcl::RenderContext& rRenderContext, const Rectan
}
else
{
+ const bool bIsLeftShadowed = pPage->IsLeftShadowNeeded();
+ const bool bIsRightShadowed = pPage->IsRightShadowNeeded();
+
mrParentViewShell.maVisArea = aPageRect;
aPxPaintRect.Intersection( aPxOutRect );
Rectangle aPaintRect = pOutputDev->PixelToLogic( aPxPaintRect );
mrParentViewShell.Paint(rRenderContext, aPaintRect);
+
// --> OD 2007-08-15 #i80691#
// paint page border and shadow
{
SwRect aPageBorderRect;
SwPageFrame::GetBorderAndShadowBoundRect( SwRect( aPageRect ), &mrParentViewShell, &rRenderContext, aPageBorderRect,
- (*aPageIter)->pPage->IsLeftShadowNeeded(), (*aPageIter)->pPage->IsRightShadowNeeded(), true );
+ bIsLeftShadowed, bIsRightShadowed, true );
const vcl::Region aDLRegion(aPageBorderRect.SVRect());
mrParentViewShell.DLPrePaint2(aDLRegion);
SwPageFrame::PaintBorderAndShadow( aPageRect, &mrParentViewShell, true, false, true );
@@ -1144,11 +1150,10 @@ bool SwPagePreviewLayout::Paint(vcl::RenderContext& rRenderContext, const Rectan
break;
}
- if ( (*aPageIter)->pPage->GetPhyPageNum() == mnSelectedPageNum )
+ if (pPage->GetPhyPageNum() == mnSelectedPageNum)
{
_PaintSelectMarkAtPage(rRenderContext, *aPageIter);
}
-
}
}