summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sw/inc/viewsh.hxx5
-rw-r--r--sw/source/core/view/viewsh.cxx28
-rw-r--r--sw/source/core/view/vnew.cxx2
3 files changed, 24 insertions, 11 deletions
diff --git a/sw/inc/viewsh.hxx b/sw/inc/viewsh.hxx
index c37577e66ef1..88280b45613b 100644
--- a/sw/inc/viewsh.hxx
+++ b/sw/inc/viewsh.hxx
@@ -37,6 +37,7 @@
#include <ring.hxx>
#include <swrect.hxx>
#include <boost/shared_ptr.hpp> // swmod 080115
+#include <stack>
#include <vcl/mapmod.hxx>
#include <vcl/print.hxx>
@@ -233,7 +234,7 @@ public:
//////////////////////////////////////////////////////////////////////////////
// #i72754# set of Pre/PostPaints with lock counter and initial target OutDev
protected:
- sal_uInt32 mnPrePostPaintCount;
+ std::stack<Region> mPrePostPaintRegions; // acts also as a lock counter (empty == not locked)
OutputDevice* mpPrePostOutDev;
MapMode maPrePostMapMode;
public:
@@ -245,7 +246,7 @@ public:
virtual void Paint(const Rectangle &rRect);
sal_Bool IsPaintInProgress() const { return bPaintInProgress; }
- bool IsDrawingLayerPaintInProgress() const { return 0 != mnPrePostPaintCount; }
+ bool IsDrawingLayerPaintInProgress() const { return !mPrePostPaintRegions.empty(); }
// Notification that visible area has been changed.
// VisArea is reset, after that scrolling takes place.
diff --git a/sw/source/core/view/viewsh.cxx b/sw/source/core/view/viewsh.cxx
index 1bdde256e352..172434b007e7 100644
--- a/sw/source/core/view/viewsh.cxx
+++ b/sw/source/core/view/viewsh.cxx
@@ -98,7 +98,7 @@ using namespace ::com::sun::star;
//////////////////////////////////////////////////////////////////////////////
// #i72754# 2nd set of Pre/PostPaints
-// This time it uses the lock counter mnPrePostPaintCount to allow only one activation
+// This time it uses the lock counter (mPrePostPaintRegions empty/non-empty) to allow only one activation
// and deactivation and mpPrePostOutDev to remember the OutDev from the BeginDrawLayers
// call. That way, all places where paint take place can be handled the same way, even
// when calling other paint methods. This is the case at the places where SW paints
@@ -116,8 +116,9 @@ void ViewShell::PrePaint()
void ViewShell::DLPrePaint2(const Region& rRegion)
{
- if(0L == mnPrePostPaintCount)
+ if(mPrePostPaintRegions.empty())
{
+ mPrePostPaintRegions.push( rRegion );
// #i75172# ensure DrawView to use DrawingLayer bufferings
if ( !HasDrawView() )
MakeDrawView();
@@ -139,16 +140,29 @@ void ViewShell::DLPrePaint2(const Region& rRegion)
// remember original paint MapMode for wrapped FlyFrame paints
maPrePostMapMode = pOut->GetMapMode();
}
-
- mnPrePostPaintCount++;
+ else
+ {
+ // region needs to be updated to the given one
+ if( mPrePostPaintRegions.top() != rRegion )
+ Imp()->GetDrawView()->UpdateDrawLayersRegion(mpPrePostOutDev, rRegion);
+ mPrePostPaintRegions.push( rRegion );
+ }
}
void ViewShell::DLPostPaint2(bool bPaintFormLayer)
{
- OSL_ENSURE(mnPrePostPaintCount > 0L, "ViewShell::DLPostPaint2: Pre/PostPaint encapsulation broken (!)");
- mnPrePostPaintCount--;
+ OSL_ENSURE(!mPrePostPaintRegions.empty(), "ViewShell::DLPostPaint2: Pre/PostPaint encapsulation broken (!)");
- if((0L == mnPrePostPaintCount) && (0 != mpTargetPaintWindow))
+ if( mPrePostPaintRegions.size() > 1 )
+ {
+ Region current = mPrePostPaintRegions.top();
+ mPrePostPaintRegions.pop();
+ if( current != mPrePostPaintRegions.top())
+ Imp()->GetDrawView()->UpdateDrawLayersRegion(mpPrePostOutDev, mPrePostPaintRegions.top());
+ return;
+ }
+ mPrePostPaintRegions.pop(); // clear
+ if(0 != mpTargetPaintWindow)
{
// #i74769# restore buffered OutDev
if(mpTargetPaintWindow->GetPreRenderDevice())
diff --git a/sw/source/core/view/vnew.cxx b/sw/source/core/view/vnew.cxx
index 0bb986137060..14ec08fa617f 100644
--- a/sw/source/core/view/vnew.cxx
+++ b/sw/source/core/view/vnew.cxx
@@ -158,7 +158,6 @@ ViewShell::ViewShell( SwDoc& rDocument, Window *pWindow,
pDoc( &rDocument ),
nStartAction( 0 ),
nLockPaint( 0 ),
- mnPrePostPaintCount(0L),
mpPrePostOutDev(0),
maPrePostMapMode()
{
@@ -225,7 +224,6 @@ ViewShell::ViewShell( ViewShell& rShell, Window *pWindow,
pDoc( rShell.GetDoc() ),
nStartAction( 0 ),
nLockPaint( 0 ),
- mnPrePostPaintCount(0L),
mpPrePostOutDev(0),
maPrePostMapMode()
{