diff options
| author | Albrecht Schlosser <albrechts.fltk@online.de> | 2021-05-26 15:25:36 +0200 |
|---|---|---|
| committer | Albrecht Schlosser <albrechts.fltk@online.de> | 2021-05-26 15:25:36 +0200 |
| commit | 12c050980692c05fb3eb59acd7aba6a46bea4bf8 (patch) | |
| tree | 63b5084842455943b35f930e1fbcc1a92694f119 /src/drivers/Xlib/Fl_Xlib_Graphics_Driver_rect.cxx | |
| parent | 0f3619ba0e725a6a9d57b9da328f3b1e2a0cd150 (diff) | |
X11: fix fl_clip_box() coordinates > 16-bit (STR 3134)
Pre-clip coordinates to 16-bit range before using X11 clipping
functions because X11 supports only 16-bit int's.
Diffstat (limited to 'src/drivers/Xlib/Fl_Xlib_Graphics_Driver_rect.cxx')
| -rw-r--r-- | src/drivers/Xlib/Fl_Xlib_Graphics_Driver_rect.cxx | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/src/drivers/Xlib/Fl_Xlib_Graphics_Driver_rect.cxx b/src/drivers/Xlib/Fl_Xlib_Graphics_Driver_rect.cxx index 7bf905fd5..df29a5dad 100644 --- a/src/drivers/Xlib/Fl_Xlib_Graphics_Driver_rect.cxx +++ b/src/drivers/Xlib/Fl_Xlib_Graphics_Driver_rect.cxx @@ -326,9 +326,18 @@ void Fl_Xlib_Graphics_Driver::push_clip(int x, int y, int w, int h) { int Fl_Xlib_Graphics_Driver::clip_box(int x, int y, int w, int h, int& X, int& Y, int& W, int& H) { X = x; Y = y; W = w; H = h; + // pre-clip rectangle to 16-bit coordinates (STR #3134) + if (clip_rect(X, Y, W, H)) { // entirely clipped (outside) + W = H = 0; + return 2; + } Fl_Region r = rstack[rstackptr]; - if (!r) return 0; - switch (XRectInRegion(r, x, y, w, h)) { + if (!r) { // no clipping region + if (X != x || Y != y || W != w || H != h) // pre-clipped + return 1; // partially outside, region differs + return 0; + } + switch (XRectInRegion(r, X, Y, W, H)) { case 0: // completely outside W = H = 0; return 2; @@ -337,7 +346,7 @@ int Fl_Xlib_Graphics_Driver::clip_box(int x, int y, int w, int h, int& X, int& Y default: // partial: break; } - Fl_Region rr = XRectangleRegion(x,y,w,h); + Fl_Region rr = XRectangleRegion(X, Y, W, H); Fl_Region temp = XCreateRegion(); XIntersectRegion(r, rr, temp); XRectangle rect; |
