diff options
Diffstat (limited to 'src/Gui/RenderArea.cpp')
-rw-r--r-- | src/Gui/RenderArea.cpp | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/src/Gui/RenderArea.cpp b/src/Gui/RenderArea.cpp new file mode 100644 index 0000000..c19c0a5 --- /dev/null +++ b/src/Gui/RenderArea.cpp @@ -0,0 +1,53 @@ +#include "RenderArea.h" +#include <iostream> +#include <cstdlib> +#include <GL/gl.h> + +namespace ZoomEdit { +namespace Gui { + +GdkGLConfig *RenderArea::glconfig = NULL; + +RenderArea::RenderArea(BaseObjectType *cobject, const Glib::RefPtr<Gnome::Glade::Xml> &xml) +: Gtk::DrawingArea(cobject) { + if(!glconfig) { + glconfig = gdk_gl_config_new_by_mode((GdkGLConfigMode)(GDK_GL_MODE_RGB | GDK_GL_MODE_DOUBLE)); + if(!glconfig) glconfig = gdk_gl_config_new_by_mode(GDK_GL_MODE_RGB); // Hmm, can't find double buffered config + if(!glconfig) { + std::cerr << "*** No appropriate OpenGL-capable visual found." << std::endl; + std::exit(1); + } + } + + signal_realize().connect(sigc::mem_fun(this, &RenderArea::onRealize)); + + gtk_widget_set_gl_capability(GTK_WIDGET(cobject), glconfig, NULL, TRUE, GDK_GL_RGBA_TYPE); +} + +RenderArea::~RenderArea() { +} + +void RenderArea::onRealize() { + GtkWidget *widget = GTK_WIDGET(gobj()); + GdkGLContext *context = gtk_widget_get_gl_context(widget); + GdkGLDrawable *drawable = gtk_widget_get_gl_drawable(widget); + + if(!gdk_gl_drawable_gl_begin(drawable, context)) + return; + + glClearColor(0, 0, 0, 0); + + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_BLEND); + + glEnable(GL_LINE_SMOOTH); + glEnable(GL_POINT_SMOOTH); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + gdk_gl_drawable_gl_end(drawable); +} + +} +} |