diff options
author | Michael Stahl <mstahl@redhat.com> | 2014-02-03 11:26:59 +0100 |
---|---|---|
committer | Michael Stahl <mstahl@redhat.com> | 2014-02-03 12:34:07 +0100 |
commit | 66f8b54931f193bdc844c6bca388d9bde98779cd (patch) | |
tree | 85e9779e5a6f75b412e196758835a86f3df6d623 /svx | |
parent | 6ef04640ab92ce69000dcff3071eaef4419a9af6 (diff) |
fdo#74435: SdrPageView::DrawLayer(): hack to avoid spuriously visible images
In the TestBook2.odt of fdo#73300 it happens that at some particular
points when scrolling down, the
ViewObjectContactOfPageHierarchy::getPrimitive2DSequenceHierarchy()
will determine that > 200 images are visible; most likely this is due to
an empty ObjectContactOfPageView::maViewInformation2D::getViewport().
Loading this many images may need more RAM than is available on 32bit
platforms.
That appears to happen only (but not always) if somehow (not sure
how exactly) the rectangle passed to SdrPageView::DrawLayer() and the
existing GetRedrawRegion() do not overlap at all.
(regression from commit 8af09bf33291df2fb2bfbbd6e42f9bf074fcc4fc)
Change-Id: Iafc595241df05204bccec1f2336014fc471b6602
Diffstat (limited to 'svx')
-rw-r--r-- | svx/source/svdraw/svdpagv.cxx | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/svx/source/svdraw/svdpagv.cxx b/svx/source/svdraw/svdpagv.cxx index 4a58027d1583..a24725875f77 100644 --- a/svx/source/svdraw/svdpagv.cxx +++ b/svx/source/svdraw/svdpagv.cxx @@ -350,7 +350,16 @@ void SdrPageView::DrawLayer(SdrLayerID nID, OutputDevice* pGivenTarget, sdr::con // Copy existing paint region to use the same as prepared in BeginDrawLayer SdrPaintWindow& rExistingPaintWindow = pPreparedTarget->GetPaintWindow(); const Region& rExistingRegion = rExistingPaintWindow.GetRedrawRegion(); - if ( rRect.IsEmpty() ) + bool bUseRect(false); + if (!rRect.IsEmpty()) + { + Region r(rExistingRegion); + r.Intersect(rRect); + // fdo#74435: FIXME: visibility check broken if empty + if (!r.IsEmpty()) + bUseRect = true; + } + if (!bUseRect) aTemporaryPaintWindow.SetRedrawRegion(rExistingRegion); else aTemporaryPaintWindow.SetRedrawRegion(Region(rRect)); |