|
[STR Closed w/Resolution]
Link: https://www.fltk.org/str.php?L3134
Version: 1.3-current
Fix Version: 1.4.0
Git Commit: 12c050980692c05fb3eb59acd7aba6a46bea4bf8
Thanks to ajapted for the report, and sorry for the late reply and fix.
As suggested, the given rectangle is now "pre-clipped" to the X11 16-bit
coordinate range and then used internally to calculate the clipping box.
Uploaded demo program clip_box.cxx shows the effect with some example
clipping values. See example code for details.
FTR, output on Linux/X11, clipped to 16-bit coordinates:
--- NO CLIPPING ---
fl_clip_box( 100, 100, 200, 200) => 0 ( 100, 100,
200, 200)
fl_clip_box(-100000, -100000, 200000, 200000) => 1 ( -32760, -32760,
65520, 65520)
fl_clip_box( -33000, -33000, 2000, 2000) => 1 ( -32760, -32760,
1760, 1760)
fl_clip_box( -100, -100, 180, 100) => 0 ( -100, -100,
180, 100)
fl_clip_box( -100, -100, 180, 200) => 0 ( -100, -100,
180, 200)
--- CLIP TO BOX (20, 20, 80, 25) ---
fl_clip_box( 100, 100, 200, 200) => 2 ( 100, 100,
0, 0)
fl_clip_box(-100000, -100000, 200000, 200000) => 1 ( 20, 20,
80, 25)
fl_clip_box( -33000, -33000, 2000, 2000) => 2 ( -32760, -32760,
0, 0)
fl_clip_box( -100, -100, 180, 100) => 2 ( -100, -100,
0, 0)
fl_clip_box( -100, -100, 180, 200) => 1 ( 20, 20,
60, 25)
For comparison, output on Windows, using full 32-bit coordinate space:
--- NO CLIPPING ---
fl_clip_box( 100, 100, 200, 200) => 0 ( 100, 100,
200, 200)
fl_clip_box(-100000, -100000, 200000, 200000) => 0 (-100000, -100000,
200000, 200000)
fl_clip_box( -33000, -33000, 2000, 2000) => 0 ( -33000, -33000,
2000, 2000)
fl_clip_box( -100, -100, 180, 100) => 0 ( -100, -100,
180, 100)
fl_clip_box( -100, -100, 180, 200) => 0 ( -100, -100,
180, 200)
--- CLIP TO BOX (20, 20, 80, 25) ---
fl_clip_box( 100, 100, 200, 200) => 2 ( 100, 100,
0, 0)
fl_clip_box(-100000, -100000, 200000, 200000) => 1 ( 20, 20,
80, 25)
fl_clip_box( -33000, -33000, 2000, 2000) => 2 ( -33000, -33000,
0, 0)
fl_clip_box( -100, -100, 180, 100) => 2 ( -100, -100,
0, 0)
fl_clip_box( -100, -100, 180, 200) => 1 ( 20, 20,
60, 25)
Link: https://www.fltk.org/str.php?L3134
Version: 1.3-current
Fix Version: 1.4.0
Git Commit: 12c050980692c05fb3eb59acd7aba6a46bea4bf8 /*
fl_clip_box() test program for the Fast Light Tool Kit (FLTK).
*/
#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Button.H>
#include <FL/Fl_Box.H>
#include <FL/fl_draw.H>
void exitcb(Fl_Widget *w, void *) {
w->window()->hide();
}
// helper function to test clipping, prints clip results
void test_clip_box(int x, int y, int w, int h) {
int X = -999, Y = -999, W = -999, H = -999;
int ret = fl_clip_box(x, y, w, h, X, Y, W, H);
printf("fl_clip_box(%7d, %7d, %6d, %6d) => %d (%7d, %7d, %6d, %6d)\n",
x, y, w, h, ret, X, Y, W, H);
return;
}
// test clipping with several special test cases
void test_clip() {
test_clip_box(100, 100, 200, 200);
test_clip_box(-100000, -100000, 200000, 200000);
test_clip_box(-33000, -33000, 2000, 2000);
test_clip_box(-100, -100, 180, 100);
test_clip_box(-100, -100, 180, 200);
}
class myBox : public Fl_Box {
public:
myBox(int x,int y, int w, int h, const char *L) : Fl_Box(x,y,w,h,L) {}
void draw() {
printf("\n--- NO CLIPPING ---\n");
fl_push_no_clip();
test_clip();
fl_pop_clip();
printf("\n--- CLIP TO BOX (%d, %d, %d, %d) ---\n", x(), y(), w(), h());
fl_push_clip(x(), y(), w(), h());
test_clip();
fl_pop_clip();
draw_box();
draw_label();
}
};
int main(int argc, char ** argv) {
Fl_Window *window = new Fl_Window(320, 65, "test fl_clip_box()");
myBox *b1 = new myBox(20, 20, 80, 25, "LABEL");
b1->box(FL_FRAME_BOX);
Fl_Button *b2 = new Fl_Button(220,20, 80, 25, "E&xit");
b2->callback(exitcb, 0);
window->end();
window->resizable(window);
window->size_range(window->w(), window->h());
window->show(argc,argv);
return Fl::run();
}
[ Direct Link to Message ] | |