]> Dogcows Code - chaz/openbox/commitdiff
gl is starting. it's gonna get really ugly really fast, folks
authorDerek Foreman <manmower@gmail.com>
Sun, 25 May 2003 00:42:02 +0000 (00:42 +0000)
committerDerek Foreman <manmower@gmail.com>
Sun, 25 May 2003 00:42:02 +0000 (00:42 +0000)
render/gradient.c
render/gradient.h
render/render.c
render/render.h
render/test.c

index 8b4cd9f8c7d6dbec120cdce5324109a0a8ee65d2..3a963406c33b0385165cac42fbdd3cdea7173c8b 100644 (file)
@@ -1,3 +1,4 @@
+#include <GL/gl.h>
 #include <glib.h>
 #include "render.h"
 #include "gradient.h"
@@ -523,4 +524,79 @@ void gradient_pipecross(Surface *sf, int inw, int inh)
         end-=inw;
     }
 }
-
+#ifdef USE_GL
+void render_gl_gradient(Surface *sf, int x, int y, int w, int h)
+{
+    float pr,pg,pb;
+    float sr, sg, sb;
+
+    pr = (float)sf->data.planar.primary->r/255.0;
+    pg = (float)sf->data.planar.primary->g/255.0;
+    pb = (float)sf->data.planar.primary->b/255.0;
+    if (sf->data.planar.secondary) {
+        sr = (float)sf->data.planar.secondary->r/255.0;
+        sg = (float)sf->data.planar.secondary->g/255.0;
+        sb = (float)sf->data.planar.secondary->b/255.0;
+    }
+    switch (sf->data.planar.grad) {
+    case Background_Solid: /* already handled */
+        glBegin(GL_TRIANGLES);
+        glColor3f(pr, pg, pb);
+        glVertex3i(x, y, 0);
+        glVertex3i(x+w, y, 0);
+        glVertex3i(x+w, y+h, 0);
+
+        glVertex3i(x+w, y+h, 0);
+        glVertex3i(x, y+h, 0);
+        glVertex3i(x, y, 0);
+        glEnd();
+        return;
+    case Background_Vertical:
+        glBegin(GL_TRIANGLES);
+        glColor3f(pr, pg, pb);
+        glVertex3i(x, y, 0);
+        glColor3f(sr, sg, sb);
+        glVertex3i(x+w, y, 0);
+        glVertex3i(x+w, y+h, 0);
+
+        glVertex3i(x+w, y+h, 0);
+        glColor3f(pr, pg, pb);
+        glVertex3i(x, y+h, 0);
+        glVertex3i(x, y, 0);
+        glEnd();
+        break;
+    case Background_Horizontal:
+        glBegin(GL_TRIANGLES);
+        glColor3f(pr, pg, pb);
+        glVertex3i(x, y, 0);
+        glVertex3i(x+w, y, 0);
+        glColor3f(sr, sg, sb);
+        glVertex3i(x+w, y+h, 0);
+
+        glVertex3i(x+w, y+h, 0);
+        glVertex3i(x, y+h, 0);
+        glColor3f(pr, pg, pb);
+        glVertex3i(x, y, 0);
+        glEnd();
+        break;
+    case Background_Diagonal:
+printf("diagonal\n");
+        break;
+    case Background_CrossDiagonal:
+printf("crossdiagonal\n");
+        break;
+    case Background_Pyramid:
+printf("pyramid\n");
+        break;
+    case Background_PipeCross:
+printf("pipecross\n");
+        break;
+    case Background_Rectangle:
+printf("rect\n");
+        break;
+    default:
+        g_message("unhandled gradient");
+        return;
+    }
+}
+#endif /* USE_GL */
index ae7501f70d363b97a56ddf1e582330c8f7da90dd..bbadcd0d7869f2b6d24eced473cfeddc240d1acd 100644 (file)
@@ -14,4 +14,6 @@ void gradient_rectangle(Surface *sf, int w, int h);
 void gradient_solid(Appearance *l, int x, int y, int w, int h);
 void highlight(pixel32 *x, pixel32 *y, gboolean raised);
 
+void render_gl_gradient(Surface *sf, int x, int y, int w, int h);
+
 #endif /* __gradient_h */
index 78c15019266c288432a47730089c7f7ecd100102..712ed7fbaf243714888ef319e238962eded4f26a 100644 (file)
@@ -1,5 +1,10 @@
 #include <X11/Xlib.h>
 #include <X11/Xutil.h>
+
+#ifdef USE_GL
+# include <GL/glx.h>
+#endif
+
 #include <glib.h>
 #include "render.h"
 #include "gradient.h"
@@ -19,18 +24,113 @@ XVisualInfo render_visual_info;
 
 Visual *render_visual;
 Colormap render_colormap;
+
 int render_red_offset = 0, render_green_offset = 0, render_blue_offset = 0;
 int render_red_shift, render_green_shift, render_blue_shift;
 int render_red_mask, render_green_mask, render_blue_mask;
 
+
+#ifdef USE_GL
+
+GLXContext render_glx_context;
+
+int render_glx_rating(XVisualInfo *v)
+{
+    int er;
+    int rating = 0;
+    int val;
+    printf("evaluating visual %d\n", v->visualid);
+    glXGetConfig(ob_display, v, GLX_BUFFER_SIZE, &val);
+    printf("buffer size %d\n", val);
+
+    switch (val) {
+    case 32:
+        rating += 300;
+    break;
+    case 24:
+        rating += 200;
+    break;
+    case 16:
+        rating += 100;
+    break;
+    }
+
+    glXGetConfig(ob_display, v, GLX_LEVEL, &val);
+    printf("level %d\n", val);
+    if (val != 0)
+        rating = -10000;
+
+    glXGetConfig(ob_display, v, GLX_DEPTH_SIZE, &val);
+    printf("depth size %d\n", val);
+    switch (val) {
+    case 32:
+        rating += 30;
+    break;
+    case 24:
+        rating += 20;
+    break;
+    case 16:
+        rating += 10;
+    break;
+    case 0:
+        rating -= 10000;
+    }
+
+    glXGetConfig(ob_display, v, GLX_DOUBLEBUFFER, &val);
+    printf("double buffer %d\n", val);
+    if (val)
+        rating++;
+    return rating;
+}
+#endif /* USE_GL */
+
 void render_startup(void)
 {
+    int count, i = 0, val, best = 0, rate = 0, temp;
+    XVisualInfo vimatch, *vilist;
     paint = x_paint;
 
     render_depth = DefaultDepth(ob_display, ob_screen);
     render_visual = DefaultVisual(ob_display, ob_screen);
     render_colormap = DefaultColormap(ob_display, ob_screen);
 
+#ifdef USE_GL
+    vimatch.screen = ob_screen;
+    vimatch.class = TrueColor;
+    vilist = XGetVisualInfo(ob_display, VisualScreenMask | VisualClassMask,
+                            &vimatch, &count);
+
+    if (vilist) {
+        printf("looking for a GL visualin %d visuals\n", count);
+        for (i = 0; i < count; i++) {
+            glXGetConfig(ob_display, &vilist[i], GLX_USE_GL, &val);
+            if (val) {
+                temp = render_glx_rating(&vilist[i]);
+                if (temp > rate) {
+                    best = i;
+                    rate = temp;
+                }
+            }
+        }
+    }
+    if (rate > 0) {
+        printf("picked visual %d with rating %d\n", best, rate);
+        render_depth = vilist[best].depth;
+        render_visual = vilist[best].visual;
+        render_colormap = XCreateColormap(ob_display, ob_root, 
+                                          render_visual, AllocNone);
+        render_visual_info = vilist[best];
+        render_glx_context = glXCreateContext(ob_display, &render_visual_info,
+                                              NULL, True);
+        if (render_glx_context == NULL)
+            printf("sadness\n");
+        else {
+            paint = gl_paint;
+        }
+    }
+#endif /*USE_GL*/
+
+
   switch (render_visual->class) {
   case TrueColor:
     truecolor_startup();
@@ -270,13 +370,6 @@ void x_paint(Window win, Appearance *l)
     if (oldp != None) XFreePixmap(ob_display, oldp);
 }
 
-/*
-void gl_paint(Window win, Appearance *l)
-{
-    glXMakeCurrent(ob_display, win, gl_context);
-}
-*/
-
 void render_shutdown(void)
 {
 }
@@ -501,3 +594,54 @@ gboolean render_pixmap_to_rgba(Pixmap pmap, Pixmap mask,
 
     return TRUE;
 }
+
+#ifdef USE_GL
+void gl_paint(Window win, Appearance *l)
+{
+    int err;
+    Window root, child;
+    int i, transferred = 0, sw, b, d;
+    pixel32 *source, *dest;
+    Pixmap oldp;
+    int tempx, tempy, absx, absy, absw, absh;
+    int x = l->area.x;
+    int y = l->area.y;
+    int w = l->area.width;
+    int h = l->area.height;
+    Rect tarea; /* area in which to draw textures */
+    if (w <= 0 || h <= 0 || x+w <= 0 || y+h <= 0) return;
+
+    g_assert(l->surface.type == Surface_Planar);
+
+printf("making %p, %p, %p current\n", ob_display, win, render_glx_context);
+    err = glXMakeCurrent(ob_display, win, render_glx_context);
+g_assert(err != 0);
+
+            glMatrixMode(GL_MODELVIEW);
+            glLoadIdentity();
+            glMatrixMode(GL_PROJECTION);
+            glLoadIdentity();
+            glOrtho(0, 1376, 1032, 0, 0, 10);
+    if (XGetGeometry(ob_display, win, &root, &tempx, &tempy,
+                     &absw, &absh,  &b, &d) &&
+        XTranslateCoordinates(ob_display, win, root, tempx, tempy, 
+        &absx, &absy, &child))
+        printf("window at %d, %d (%d,%d)\n", absx, absy, absw, absh);
+    else
+        return;
+
+    glViewport(0, 0, 1376, 1032);
+    glMatrixMode(GL_MODELVIEW);
+    glTranslatef(-absx, 1032-absh-absy, 0);
+    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+
+    if (l->surface.data.planar.grad == Background_ParentRelative) {
+        printf("crap\n");
+    } else
+        render_gl_gradient(&l->surface, absx+x, absy+y, absw, absh);
+
+    glXSwapBuffers(ob_display, win);
+}
+
+#endif /* USE_GL */
index 100c4a9db04cc460ad48430afdd86410ca24873e..16f5c31c6be11a0364c149a7cb1e26e663c58dd5 100644 (file)
@@ -151,6 +151,7 @@ void (*paint)(Window win, Appearance *l);
 void render_startup(void);
 void init_appearance(Appearance *l);
 void x_paint(Window win, Appearance *l);
+void gl_paint(Window win, Appearance *l);
 void render_shutdown(void);
 Appearance *appearance_new(SurfaceType type, int numtex);
 Appearance *appearance_copy(Appearance *a);
index 56456869a8d29e5dc3962ef21f9e0d54aa7d0e42..dcd646cfbe010a2cbf4c8ca254e8646cbf6e9ce7 100644 (file)
@@ -1,7 +1,6 @@
 #include <stdio.h>
 #include <X11/Xlib.h>
 #include <X11/extensions/shape.h>
-/*#include <GL/glx.h>*/
 #include <string.h>
 #include <stdlib.h>
 #include "render.h"
@@ -52,7 +51,7 @@ int main()
        render_startup();
 
        look = appearance_new(Surface_Planar, 0);
-       look->surface.data.planar.grad = Background_PipeCross;
+       look->surface.data.planar.grad = Background_Horizontal;
        look->surface.data.planar.secondary = color_new(0xFF, 0xFF, 0xFF);
        look->surface.data.planar.primary = color_parse("Black");
         look->surface.data.planar.interlaced = FALSE;
This page took 0.032569 seconds and 4 git commands to generate.