On 3 Feb 2009, at 18:23, Fabio Bracci wrote:
>
> I'm trying to set up a small example program to play with the
> offscreen.
OK - below is my reworked offscreen demo.
Sorry to all that it ended up being so long, but I got a bit carried
away.
Anyway, what I am attempting to show is how to create and draw to an
fl_offscreen context. The demo also shows how to do incremental
drawing (which fltk in general does not allow) by use of the
offscreen context to draw into.
Also, I was going to add some scrollbars to move around the view, but
then decided to make the view draggable instead - scrollbars wold
work in basically the same way (updating the view offset) but I
thought this was cooler.
The actual drawing I am doing is rather simplistic - but I quite like
the abstract effect it produces!
Anyway, hope this is of some help to you,
--
Ian
/
************************************************************************
*****/
// fltk-config --compile offscreen-test.cxx
/* Standard headers */
#include <stdlib.h>
/* Fltk headers */
#include <Fl/Fl.h>
#include <FL/Fl_Double_Window.H>
#include <FL/x.H>
#include <Fl/Fl_Box.H>
#include <Fl/fl_draw.h>
static Fl_Double_Window *main_window = 0;
static Fl_Offscreen oscr = 0;
static int os_w = 0, os_h = 0;
/
************************************************************************
*****/
class oscr_box : public Fl_Box {
void draw();
int handle(int event);
protected:
int x1, y1;
int xoff, yoff;
int drag_state;
int page_x, page_y;
public:
oscr_box(int x, int y, int w, int h);
};
/
************************************************************************
*****/
oscr_box::oscr_box(int x, int y, int w, int h) : Fl_Box(x,y,w,h){
/* Constructor */
x1 = y1 = 0;
xoff = yoff = 0;
drag_state = 0;
page_x = page_y = 750;
} // Constructor
/
************************************************************************
*****/
void oscr_box::draw() {
int wd = w();
int ht = h();
int xo = x();
int yo = y();
fl_color(fl_gray_ramp(19));
fl_rectf(xo, yo, wd, ht);
if(oscr) { // offscreen exists
fl_copy_offscreen(xo, yo, wd, ht, oscr, page_x, page_y);
}
else { // create offscreen
main_window->make_current(); // seem to need a context to base
the
offscreen on...
os_w = 2000; os_h = 2000;
oscr = fl_create_offscreen(os_w, os_h);
}
} // draw method
/
************************************************************************
*****/
int oscr_box::handle(int ev) {
int ret = Fl_Box::handle(ev);
// handle dragging of visible page area - if a valid context exists
// all sorts of editor stuff needs to be added here... later...
if(oscr) {
int x_max = os_w;
int y_max = os_h;
switch(ev) {
case FL_ENTER:
main_window->cursor(FL_CURSOR_HAND);
ret = 1;
break;
case FL_LEAVE:
main_window->cursor(FL_CURSOR_DEFAULT);
ret = 1;
break;
case FL_PUSH:
x1 = Fl::event_x_root();
y1 = Fl::event_y_root();
drag_state = 1; // drag
ret = 1;
break;
case FL_DRAG:
if(drag_state == 1) { // dragging page
int x2 = Fl::event_x_root();
int y2 = Fl::event_y_root();
xoff = x1 - x2;
yoff = y1 - y2;
x1 = x2; y1 = y2;
page_x += xoff;
page_y += yoff;
// check the page bounds
if(page_x < -w()) page_x = -w();
else if(page_x > x_max) page_x = x_max;
if(page_y < -h()) page_y = -h();
else if(page_y > y_max) page_y = y_max;
redraw();
}
ret = 1;
break;
case FL_RELEASE:
drag_state = 0;
ret = 1;
break;
default:
break;
}
}
return ret;
} // handle
/
************************************************************************
*****/
static oscr_box *os_box = 0; // a widget to view the offscreen with
/
************************************************************************
*****/
static void oscr_drawing (void) {
Fl_Color col;
static int icol = 56;
static int ox = 1000, oy = 1000;
static int iters = 3456;
if(!oscr) return;
fl_begin_offscreen(oscr); /* Open the offscreen context for drawing */
if(iters > 1024) {
fl_color(FL_WHITE);
fl_rectf(0, 0, os_w, os_h);
iters = 0;
}
iters++;
icol++; if(icol > 255) icol = 56;
col = (Fl_Color)icol;
fl_color(col); // set the colour
int rnd = rand();
double drx = (double)os_w * (double)rnd / (double)RAND_MAX;
rnd = rand();
double dry = (double)os_h * (double)rnd / (double)RAND_MAX;
rnd = rand();
double drt = 4.0 * (double)rnd / (double)RAND_MAX;
int ex = (int)drx;
int ey = (int)dry;
fl_line_style(FL_SOLID, (int)drt);
fl_line(ox, oy, ex, ey);
ox = ex; oy = ey;
fl_end_offscreen(); // close the offscreen context
} // oscr_drawing
/
************************************************************************
*****/
static void oscr_anim(void *) {
if(oscr) { // offscreen exists, draw something
oscr_drawing();
}
os_box->redraw();
Fl::repeat_timeout(0.1, oscr_anim);
} // oscr_anim
/
************************************************************************
*****/
int main (int argc, char **argv) {
main_window = new Fl_Double_Window(400, 300, "Offscreen demo");
main_window->begin();
os_box = new oscr_box(5, 5, 390, 290);
main_window->end();
main_window->resizable(os_box);
main_window->show(argc, argv);
Fl::add_timeout(0.1, oscr_anim);
srand(time(NULL));
return Fl::run();
} // main
/
************************************************************************
*****/
/* end of file */
_______________________________________________
fltk mailing list
[email protected]
http://lists.easysw.com/mailman/listinfo/fltk