summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlbrecht Schlosser <albrechts.fltk@online.de>2011-05-01 12:45:29 +0000
committerAlbrecht Schlosser <albrechts.fltk@online.de>2011-05-01 12:45:29 +0000
commit428008c27612583dfa5951cbb28de716a48976fe (patch)
tree4382c928027b1db72d32b0a7622ace85d717950d
parent6c9d1f7840fae6cbf88e71fed6186a934f7ba8ef (diff)
Fixed drawing artifacts when scrolling round boxes (FL_ROUND_UP_BOX and
FL_ROUND_DOWN_BOX) on Linux (STR #2615). This was done by (a) setting the line width in the box drawing function (was undefined, maybe 0) (b) taking care of zero and negative line width in X11 clipping functions. Both solutions would have solved the particular problem individually. Additionally made local helper function fl_arc_i() in src/fl_round_box.cxx static to avoid name clashes. git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@8630 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
-rw-r--r--src/fl_rect.cxx14
-rw-r--r--src/fl_round_box.cxx4
2 files changed, 13 insertions, 5 deletions
diff --git a/src/fl_rect.cxx b/src/fl_rect.cxx
index da2ef4154..f893d8b22 100644
--- a/src/fl_rect.cxx
+++ b/src/fl_rect.cxx
@@ -82,6 +82,10 @@ extern float fl_quartz_line_width_;
In this example case, no clipping would be done, because X can
handle it and clip unneeded pixels.
+
+ Note that we must also take care of the case where fl_line_width_
+ is zero (maybe unitialized). If this is the case, we assume a line
+ width of 1.
Todo: Arbitrary line drawings (e.g. polygons) and clip regions
are not yet done.
@@ -120,8 +124,9 @@ extern float fl_quartz_line_width_;
static int clip_to_short(int &x, int &y, int &w, int &h) {
- int kmin = -fl_line_width_;
- int kmax = SHRT_MAX - fl_line_width_;
+ int lw = (fl_line_width_ > 0) ? fl_line_width_ : 1;
+ int kmin = -lw;
+ int kmax = SHRT_MAX - lw;
if (w <= 0 || h <= 0) return 1; // (a)
if (x+w < kmin || y+h < kmin) return 1; // (b)
@@ -145,8 +150,9 @@ static int clip_to_short(int &x, int &y, int &w, int &h) {
*/
static int clip_x (int x) {
- int kmin = -fl_line_width_;
- int kmax = SHRT_MAX - fl_line_width_;
+ int lw = (fl_line_width_ > 0) ? fl_line_width_ : 1;
+ int kmin = -lw;
+ int kmax = SHRT_MAX - lw;
if (x < kmin)
x = kmin;
diff --git a/src/fl_round_box.cxx b/src/fl_round_box.cxx
index b98e47b7d..bb734dbcd 100644
--- a/src/fl_round_box.cxx
+++ b/src/fl_round_box.cxx
@@ -35,7 +35,7 @@
// A compiler from a certain very large software company will not compile
// the function pointer assignment due to the name conflict with fl_arc.
// This function is to fix that:
-void fl_arc_i(int x,int y,int w,int h,double a1,double a2) {
+static void fl_arc_i(int x,int y,int w,int h,double a1,double a2) {
fl_arc(x,y,w,h,a1,a2);
}
@@ -52,6 +52,7 @@ static void draw(int which, int x,int y,int w,int h, int inset, Fl_Color color)
int d = w <= h ? w : h;
if (d <= 1) return;
fl_color(color);
+ fl_line_style(0,1);
void (*f)(int,int,int,int,double,double);
f = (which==FILL) ? fl_pie : fl_arc_i;
if (which >= CLOSED) {
@@ -78,6 +79,7 @@ static void draw(int which, int x,int y,int w,int h, int inset, Fl_Color color)
if (which != LOWER_RIGHT) fl_xyline(x+d/2-1, y, x+w-d/2+1);
}
}
+ fl_line_style(0);
}
extern uchar* fl_gray_ramp();