summaryrefslogtreecommitdiffstats
path: root/src/Gui/RenderArea.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Gui/RenderArea.cpp')
-rw-r--r--src/Gui/RenderArea.cpp53
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);
+}
+
+}
+}