summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--FL/Fl.H2
-rw-r--r--FL/Fl_Gl_Window.H24
-rw-r--r--src/Fl_Gl_Window.cxx22
-rw-r--r--src/Fl_Image_Surface.cxx1
4 files changed, 44 insertions, 5 deletions
diff --git a/FL/Fl.H b/FL/Fl.H
index 65dd2d706..a768a8220 100644
--- a/FL/Fl.H
+++ b/FL/Fl.H
@@ -146,7 +146,7 @@ public: // run time information about compile time configuration
static bool cfg_gfx_gdi; ///< GDI redering available, usually on MSWindows systems
static bool cfg_gfx_opengl; ///< OpenGL redering available, available on many platforms
static bool cfg_gfx_cairo; ///< Cairo redering available, available on many platforms
- static bool cfg_gfx_directx;///< DirectX redering available, available on many platforms
+ static bool cfg_gfx_directx;///< DirectX redering available, usually on MSWindows systems
/** @} */
/** \defgroup cfg_prn runtime printer driver configuration */
/** @{ */
diff --git a/FL/Fl_Gl_Window.H b/FL/Fl_Gl_Window.H
index 18725d08b..18188589a 100644
--- a/FL/Fl_Gl_Window.H
+++ b/FL/Fl_Gl_Window.H
@@ -24,6 +24,30 @@
#include "Fl_Window.H"
+
+// ------ this should be in a separate file! -----------------------------------
+#ifdef FL_CFG_GFX_OPENGL
+
+#include <FL/Fl_Device.h>
+
+class Fl_OpenGL_Graphics_Driver;
+/**
+ OpenGL Surface.
+ This surface is needed as an interface between GL windows and the GL graphics driver.
+ */
+class FL_EXPORT Fl_OpenGL_Display_Device : public Fl_Surface_Device {
+public:
+ static const char *class_id;
+ const char *class_name() {return class_id;};
+ Fl_OpenGL_Display_Device(Fl_OpenGL_Graphics_Driver *graphics_driver);
+ static Fl_OpenGL_Display_Device *display_device();
+};
+
+#endif
+// ------ end of separate file! ------------------------------------------------
+
+
+
#ifndef GLContext
/**
Opaque pointer type to hide system specific implementation.
diff --git a/src/Fl_Gl_Window.cxx b/src/Fl_Gl_Window.cxx
index 4fe8ca13e..da93fd399 100644
--- a/src/Fl_Gl_Window.cxx
+++ b/src/Fl_Gl_Window.cxx
@@ -151,7 +151,21 @@ public:
const char *Fl_OpenGL_Graphics_Driver::class_id = "Fl_OpenGL_Graphics_Driver";
-Fl_OpenGL_Graphics_Driver fl_opengl_graphics_driver;
+Fl_OpenGL_Display_Device *Fl_OpenGL_Display_Device::display_device() {
+ static Fl_OpenGL_Display_Device *display = new Fl_OpenGL_Display_Device(new Fl_OpenGL_Graphics_Driver());
+ return display;
+};
+
+
+Fl_OpenGL_Display_Device::Fl_OpenGL_Display_Device(Fl_OpenGL_Graphics_Driver *graphics_driver)
+: Fl_Surface_Device(graphics_driver)
+{
+}
+
+
+const char *Fl_OpenGL_Display_Device::class_id = "Fl_OpenGL_Display_Device";
+
+
#endif
// ------ end of separate file! ------------------------------------------------
@@ -659,8 +673,8 @@ void Fl_Gl_Window::draw_overlay() {}
*/
void Fl_Gl_Window::draw() {
#ifdef FL_CFG_GFX_OPENGL
- Fl_Graphics_Driver *prev_driver = fl_graphics_driver;
- fl_graphics_driver = &fl_opengl_graphics_driver;
+ Fl_Surface_Device *prev_device = Fl_Surface_Device::surface();
+ Fl_OpenGL_Display_Device::display_device()->set_current();
glPushAttrib(GL_ENABLE_BIT);
glDisable(GL_DEPTH_TEST);
glPushMatrix();
@@ -673,7 +687,7 @@ void Fl_Gl_Window::draw() {
glPopMatrix();
glPushAttrib(GL_ENABLE_BIT);
- fl_graphics_driver = prev_driver;
+ prev_device->set_current();
#else
Fl::fatal("Fl_Gl_Window::draw() *must* be overriden. Please refer to the documentation.");
#endif
diff --git a/src/Fl_Image_Surface.cxx b/src/Fl_Image_Surface.cxx
index 79f5c28d3..7f6198967 100644
--- a/src/Fl_Image_Surface.cxx
+++ b/src/Fl_Image_Surface.cxx
@@ -82,6 +82,7 @@ Fl_Image_Surface::~Fl_Image_Surface() {
/** Returns an image made of all drawings sent to the Fl_Image_Surface object.
The returned object contains its own copy of the RGB data.
+ The caller is responsible for deleting the image.
*/
Fl_RGB_Image* Fl_Image_Surface::image()
{