Fl_Gl_Device_Plugin: more device-independant API

git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@7458 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
This commit is contained in:
Manolo Gouy 2010-04-06 17:38:27 +00:00
parent f44190d356
commit 24b8386bf1
3 changed files with 12 additions and 16 deletions

View File

@ -206,11 +206,11 @@ public:
/** \brief Returns the plugin name */ /** \brief Returns the plugin name */
virtual const char *name() = 0; virtual const char *name() = 0;
/** \brief Prints a widget /** \brief Prints a widget
\param p the printer
\param w the widget \param w the widget
\param x,y offsets where to print relatively to coordinates origin \param x,y offsets where to print relatively to coordinates origin
\param height height of the current drawing area
*/ */
virtual int print(Fl_Abstract_Printer* p, Fl_Widget* w, int x, int y) { return 0; } virtual int print(Fl_Widget* w, int x, int y, int height) { return 0; }
}; };
#endif // Fl_Printer_H #endif // Fl_Printer_H

View File

@ -66,7 +66,11 @@ void Fl_Abstract_Printer::print_widget(Fl_Widget* widget, int delta_x, int delta
if (widget->as_gl_window()) { if (widget->as_gl_window()) {
Fl_Plugin_Manager pm("fltk:device"); Fl_Plugin_Manager pm("fltk:device");
Fl_Device_Plugin *pi = (Fl_Device_Plugin*)pm.plugin("opengl.device.fltk.org"); Fl_Device_Plugin *pi = (Fl_Device_Plugin*)pm.plugin("opengl.device.fltk.org");
if (pi) drawn_by_plugin = pi->print(this, widget, 0, 0); if (pi) {
int width, height;
this->printable_rect(&width, &height);
drawn_by_plugin = pi->print(widget, 0, 0, height);
}
} }
if (!drawn_by_plugin) { if (!drawn_by_plugin) {
widget->draw(); widget->draw();

View File

@ -40,7 +40,7 @@ static void imgProviderReleaseData (void *info, const void *data, size_t size)
} }
#endif #endif
static void print_gl_window(Fl_Abstract_Printer *printer, Fl_Gl_Window *glw, int x, int y) static void print_gl_window(Fl_Gl_Window *glw, int x, int y, int height)
{ {
#ifdef WIN32 #ifdef WIN32
HDC save_gc = fl_gc; HDC save_gc = fl_gc;
@ -105,11 +105,9 @@ static void print_gl_window(Fl_Abstract_Printer *printer, Fl_Gl_Window *glw, int
, provider, NULL, false, kCGRenderingIntentDefault); , provider, NULL, false, kCGRenderingIntentDefault);
if(image == NULL) return; if(image == NULL) return;
CGContextSaveGState(fl_gc); CGContextSaveGState(fl_gc);
int w, h; CGContextTranslateCTM(fl_gc, 0, height);
printer->printable_rect(&w, &h);
CGContextTranslateCTM(fl_gc, 0, h);
CGContextScaleCTM(fl_gc, 1.0f, -1.0f); CGContextScaleCTM(fl_gc, 1.0f, -1.0f);
CGRect rect = { { x, h - y - glw->h() }, { glw->w(), glw->h() } }; CGRect rect = { { x, height - y - glw->h() }, { glw->w(), glw->h() } };
Fl_X::q_begin_image(rect, 0, 0, glw->w(), glw->h()); Fl_X::q_begin_image(rect, 0, 0, glw->w(), glw->h());
CGContextDrawImage(fl_gc, rect, image); CGContextDrawImage(fl_gc, rect, image);
Fl_X::q_end_image(); Fl_X::q_end_image();
@ -130,17 +128,11 @@ static void print_gl_window(Fl_Abstract_Printer *printer, Fl_Gl_Window *glw, int
class Fl_Gl_Device_Plugin : public Fl_Device_Plugin { class Fl_Gl_Device_Plugin : public Fl_Device_Plugin {
public: public:
Fl_Gl_Device_Plugin() : Fl_Device_Plugin(name()) { } Fl_Gl_Device_Plugin() : Fl_Device_Plugin(name()) { }
/** \brief Returns the plugin name */
virtual const char *name() { return "opengl.device.fltk.org"; } virtual const char *name() { return "opengl.device.fltk.org"; }
/** \brief Prints a widget virtual int print(Fl_Widget *w, int x, int y, int height) {
\param p the printer
\param w the widget
\param x,y offsets where to print relatively to coordinates origin
*/
virtual int print(Fl_Abstract_Printer *p, Fl_Widget *w, int x, int y) {
Fl_Gl_Window *glw = w->as_gl_window(); Fl_Gl_Window *glw = w->as_gl_window();
if (!glw) return 0; if (!glw) return 0;
print_gl_window(p, glw, x, y); print_gl_window(glw, x, y, height);
return 1; return 1;
} }
}; };