summaryrefslogtreecommitdiffstats
path: root/src/Gui/RenderArea.cpp
blob: c19c0a5d8dc5856269aba5edd72314862f8c3751 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
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);
}

}
}