summaryrefslogtreecommitdiffstats
path: root/src/k9glwidget.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/k9glwidget.cpp')
-rw-r--r--src/k9glwidget.cpp185
1 files changed, 185 insertions, 0 deletions
diff --git a/src/k9glwidget.cpp b/src/k9glwidget.cpp
new file mode 100644
index 0000000..444d823
--- /dev/null
+++ b/src/k9glwidget.cpp
@@ -0,0 +1,185 @@
+//
+// C++ Implementation: k9glwidget
+//
+// Description:
+//
+//
+// Author: Jean-Michel PETIT <k9copy@free.fr>, (C) 2006
+//
+// Copyright: See COPYING file that comes with this distribution
+//
+//
+
+#include "k9glwidget.h"
+
+#ifdef HAVE_OPENGL
+#include <qsize.h>
+#include <qapplication.h>
+#include <qdatetime.h>
+#include <cstdlib>
+#include "ac.h"
+#include <X11/Xlib.h>
+
+k9GLWidget::k9GLWidget(QWidget *parent, const char *name):QGLWidget(parent, name) {
+ XMapRaised(x11Display(),winId());
+
+ m_buffer=NULL;
+ m_height=0;
+ m_width=0;
+ library=new QLibrary("GL.so.1");
+
+ glClear = (glClear_t) library->resolve( "glClear" );
+ glRasterPos2i= (glRasterPos2i_t)library->resolve("glRasterPos2i");
+ glFlush = (glFlush_t)library->resolve("glFlush");
+ glClearColor =(glClearColor_t)library->resolve("glClearColor");
+ glShadeModel =(glShadeModel_t)library->resolve("glShadeModel");
+ glPixelStorei =(glPixelStorei_t)library->resolve("glPixelStorei");
+ glViewport =(glViewport_t)library->resolve("glViewport");
+ glMatrixMode =(glMatrixMode_t)library->resolve("glMatrixMode");
+ glLoadIdentity =(glLoadIdentity_t)library->resolve("glLoadIdentity");
+ glOrtho =(glOrtho_t)library->resolve("glOrtho");
+ glPixelZoom=(glPixelZoom_t)library->resolve("glPixelZoom");
+ glDrawPixels=(glDrawPixels_t)library->resolve("glDrawPixels");
+ glDisable=(glDisable_t)library->resolve("glDisable");
+ glPixelTransferi=(glPixelTransferi_t)library->resolve("glPixelTransferi");
+ glGetString=(glGetString_t)library->resolve("glGetString");
+}
+
+k9GLWidget* k9GLWidget::createWidget(QWidget *parent , const char *name ) {
+ //XInitThreads();
+ return new k9GLWidget(parent,name);
+}
+
+k9GLWidget::~k9GLWidget() {
+ if (m_buffer !=NULL)
+ free(m_buffer);
+ delete library;
+}
+
+void k9GLWidget::paintGL() {
+ draw();
+}
+
+void k9GLWidget::setImage(uchar *_buffer,int _width,int _height,int _len) {
+ if (qApp==NULL)
+ return;
+ if (qApp->tryLock() ) {
+ uchar *buffer=_buffer;
+ m_width=_width;
+ m_height=_height;
+ m_mutex.lock();
+ if (m_buffer !=NULL)
+ free(m_buffer);
+ m_buffer=buffer;
+ //m_stack.push(buffer);
+ m_mutex.unlock();
+ update();
+ if (qApp !=NULL)
+ qApp->unlock();
+ } else {
+ free(_buffer);
+ }
+}
+
+void k9GLWidget::draw() {
+ XLockDisplay(x11Display());
+ // uchar *buffer=NULL;
+ if (m_mutex.tryLock()) {
+ /* if (!m_stack.isEmpty())
+ buffer=m_stack.pop();
+ if (buffer !=NULL) {
+ if (m_buffer !=NULL)
+ free(m_buffer);
+ m_buffer=buffer;
+ }
+*/
+ if (m_buffer!=NULL) {
+ int h=height()-2;
+ int w=width()-2;
+ GLfloat wratio=(GLfloat)w/(GLfloat)m_width;
+ GLfloat hratio=(GLfloat)h/(GLfloat)m_height;
+ GLfloat ratio= wratio < hratio ? wratio:hratio;
+
+
+ glClear(GL_COLOR_BUFFER_BIT);
+ int top = h-(int) (h -m_height*ratio) /2;
+ int left = (int) (w -m_width*ratio) /2;
+
+ glRasterPos2i (left,top);
+ glPixelZoom (ratio, -ratio);
+
+ glDrawPixels( m_width, m_height, GL_RGBA, GL_UNSIGNED_BYTE, m_buffer );
+ swapBuffers();
+ } else {
+ makeCurrent();
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ }
+ swapBuffers();
+ m_mutex.unlock();
+ }
+ XUnlockDisplay(x11Display());
+}
+
+
+void k9GLWidget::initializeGL() {
+ setAutoBufferSwap(FALSE);
+ glClearColor (0.0, 0.0, 0.0, 0.0);
+ glShadeModel(GL_FLAT);
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+
+ glDisable(GL_ALPHA_TEST);
+ glDisable(GL_BLEND);
+ glDisable(GL_DEPTH_TEST);
+ glDisable(GL_DITHER);
+ glDisable(GL_FOG);
+ glDisable(GL_LIGHTING);
+ glDisable(GL_LOGIC_OP);
+ glDisable(GL_STENCIL_TEST);
+ glDisable(GL_TEXTURE_1D);
+ glDisable(GL_TEXTURE_2D);
+
+ glPixelTransferi(GL_MAP_COLOR, GL_FALSE);
+ glPixelTransferi(GL_RED_SCALE, 1);
+ glPixelTransferi(GL_RED_BIAS, 0);
+ glPixelTransferi(GL_GREEN_SCALE, 1);
+ glPixelTransferi(GL_GREEN_BIAS, 0);
+ glPixelTransferi(GL_BLUE_SCALE, 1);
+ glPixelTransferi(GL_BLUE_BIAS, 0);
+ glPixelTransferi(GL_ALPHA_SCALE, 1);
+ glPixelTransferi(GL_ALPHA_BIAS, 0);
+
+ /*
+ * Disable extensions that could slow down glDrawPixels.
+ */
+ const GLubyte* extString = glGetString(GL_EXTENSIONS);
+
+ if (extString != NULL) {
+ if (strstr((char*) extString, "GL_EXT_convolution") != NULL) {
+ glDisable(GL_CONVOLUTION_1D_EXT);
+ glDisable(GL_CONVOLUTION_2D_EXT);
+ glDisable(GL_SEPARABLE_2D_EXT);
+ }
+ if (strstr((char*) extString, "GL_EXT_histogram") != NULL) {
+ glDisable(GL_HISTOGRAM_EXT);
+ glDisable(GL_MINMAX_EXT);
+ }
+ if (strstr((char*) extString, "GL_EXT_texture3D") != NULL) {
+ glDisable(GL_TEXTURE_3D_EXT);
+ }
+ }
+
+}
+
+void k9GLWidget::resizeGL(int w, int h) {
+ glViewport (0, 0, w, h);
+ glMatrixMode (GL_PROJECTION);
+ glLoadIdentity();
+ glOrtho(0, w,0,h,-1,1);
+ // glMatrixMode (GL_MODELVIEW);
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+}
+
+
+#include "k9glwidget.moc"
+
+#endif