[Libreoffice-commits] .: sw/inc sw/source
Lubos Lunak
llunak at kemper.freedesktop.org
Tue May 10 07:46:40 PDT 2011
sw/inc/viewsh.hxx | 5 +++--
sw/source/core/view/viewsh.cxx | 28 +++++++++++++++++++++-------
sw/source/core/view/vnew.cxx | 2 --
3 files changed, 24 insertions(+), 11 deletions(-)
New commits:
commit b5cd59fe1ced99e30b58236a77c507f37a16812d
Author: LuboÅ¡ LuÅák <l.lunak at suse.cz>
Date: Tue May 10 16:33:13 2011 +0200
update SdrPaintView's region when it changes in writer (bnc#683550)
ViewShell::DLPrePaint2() gets a region as an argument, but uses it
only during the first call, following calls only increment the lock
counter, so if the region changes, the change doesn't take effect,
causing redraw problems. So the fix is the replace the lock counter
with a stack of used regions and update the region as appropriate.
diff --git a/sw/inc/viewsh.hxx b/sw/inc/viewsh.hxx
index 5f1629f..e5ea534 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 669c5e8..e9c476b 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 a0109ff..d7835a2 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()
{
More information about the Libreoffice-commits
mailing list