summaryrefslogtreecommitdiff
path: root/dw/fltkviewbase.cc
diff options
context:
space:
mode:
authorJohannes Hofmann <Johannes.Hofmann@gmx.de>2009-07-28 20:28:32 +0200
committerJohannes Hofmann <Johannes.Hofmann@gmx.de>2009-07-28 20:28:32 +0200
commita9997394eb77e5742021f0b03708196b2e5364bd (patch)
tree239bf38610a1a7ea6c2f44068fea3ac14bdbf47b /dw/fltkviewbase.cc
parente47158fd9023eec4dd5e852f33f327901a5a6632 (diff)
properly clip draw requests
We always need to set a clipping rectangle when drawing to avoid that text "leaks" out as in the following test case (by corvid): <input type="image" name="name1" src="whatever" WIDTH="80" HEIGHT="14" alt="name1name1name1name1"> <input type="image" name="name2" src="whatever" width="9" height="14" alt="name2name2name2name2">
Diffstat (limited to 'dw/fltkviewbase.cc')
-rw-r--r--dw/fltkviewbase.cc20
1 files changed, 11 insertions, 9 deletions
diff --git a/dw/fltkviewbase.cc b/dw/fltkviewbase.cc
index 06ad6087..d12050ce 100644
--- a/dw/fltkviewbase.cc
+++ b/dw/fltkviewbase.cc
@@ -75,7 +75,7 @@ void FltkViewBase::draw ()
container::typed::Iterator <core::Rectangle> it;
for (it = drawRegion.rectangles (); it.hasNext (); ) {
- draw (it.getNext (), true);
+ draw (it.getNext (), DRAW_BUFFERED);
}
drawRegion.clear ();
@@ -94,16 +94,18 @@ void FltkViewBase::draw ()
w (),
h ());
- draw (&rect, false);
-
- if (! (d & DAMAGE_SCROLL)) {
+ if (d == DAMAGE_SCROLL) {
+ // a clipping rectangle has already been set by fltk::scrollrect ()
+ draw (&rect, DRAW_PLAIN);
+ } else {
+ draw (&rect, DRAW_CLIPPED);
drawRegion.clear ();
}
}
}
void FltkViewBase::draw (const core::Rectangle *rect,
- bool doubleBuffer)
+ DrawType type)
{
int offsetX = 0, offsetY = 0;
@@ -127,7 +129,7 @@ void FltkViewBase::draw (const core::Rectangle *rect,
viewRect.w (),
viewRect.h ());
- if (doubleBuffer && backBuffer && !backBufferInUse) {
+ if (type == DRAW_BUFFERED && backBuffer && !backBufferInUse) {
backBufferInUse = true;
{
GSave gsave;
@@ -145,15 +147,15 @@ void FltkViewBase::draw (const core::Rectangle *rect,
viewRect);
backBufferInUse = false;
- } else if (doubleBuffer) {
+ } else if (type == DRAW_BUFFERED || type == DRAW_CLIPPED) {
+ // if type == DRAW_BUFFERED but we do not have backBuffer available
+ // we fall back to clipped drawing
push_clip (viewRect);
setcolor (bgColor);
fillrect (viewRect);
theLayout->expose (this, &r);
pop_clip ();
} else {
- // if doubleBuffer is false we assume that a clipping
- // rectangle has been set already
setcolor (bgColor);
fillrect (viewRect);
theLayout->expose (this, &r);