imacarthur wrote: > OK - below is my reworked offscreen demo. > Sorry to all that it ended up being so long, but I got a bit carried > away.
Thanks Ian.. I wanted to try your app too, but noticed your mail program (Apple Mail?) wordwrapped the code in such a way it won't compile. I fixed the lines so that it would compile, and am re-posting that result here with wordwrap off on your behalf. I nicked word wrapping in thunderbird by setting the word wrap margin to 999, as I paste a lot of code and terminal reports to people, and after 20 years of vi/unix email, seem to have automatic carriage returns built into my wrists. (Also, added #include <time.h>, cause my linux box needed it.) * * * /*****************************************************************************/ // fltk-config --compile offscreen-test.cxx /* Standard headers */ #include <stdlib.h> #include <time.h> // time() /* 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 fltk@easysw.com http://lists.easysw.com/mailman/listinfo/fltk