]> Dogcows Code - chaz/openbox/blobdiff - render/gradient.c
gl.h shouldn't be required when not enabling gl
[chaz/openbox] / render / gradient.c
index 2cff3870cf115a131113aa98f0df698abf6964fc..31d4c73034eb65a230b72fae283ee3e676e9d670 100644 (file)
@@ -1,3 +1,6 @@
+#ifdef USE_GL
+#include <GL/gl.h>
+#endif /* USE_GL */
 #include <glib.h>
 #include "render.h"
 #include "gradient.h"
@@ -379,9 +382,12 @@ void gradient_solid(Appearance *l, int x, int y, int w, int h)
         }
         break;
     case Flat:
-        if (sp->border)
+        if (sp->border) {
+            if (sp->border_color->gc == None)
+                color_allocate_gc(sp->border_color);
             XDrawRectangle(ob_display, l->pixmap, sp->border_color->gc,
                            left, top, right, bottom);
+        }
         break;
     default:  
         g_assert_not_reached(); /* unhandled ReliefType */
@@ -391,7 +397,7 @@ void gradient_solid(Appearance *l, int x, int y, int w, int h)
 void gradient_pyramid(Surface *sf, int inw, int inh)
 {
     pixel32 *data = sf->data.planar.pixel_data;
-    pixel32 *end = data + inw*inh;
+    pixel32 *end = data + inw*inh - 1;
     pixel32 current;
     float drx, dgx, dbx, dry, dgy, dby;
     unsigned int r,g,b;
@@ -434,7 +440,7 @@ void gradient_pyramid(Surface *sf, int inw, int inh)
 void gradient_rectangle(Surface *sf, int inw, int inh)
 {
     pixel32 *data = sf->data.planar.pixel_data;
-    pixel32 *end = data + inw*inh;
+    pixel32 *end = data + inw*inh - 1;
     pixel32 current;
     float drx, dgx, dbx, dry, dgy, dby;
     unsigned int r,g,b;
@@ -479,7 +485,7 @@ void gradient_rectangle(Surface *sf, int inw, int inh)
 void gradient_pipecross(Surface *sf, int inw, int inh)
 {
     pixel32 *data = sf->data.planar.pixel_data;
-    pixel32 *end = data + inw*inh;
+    pixel32 *end = data + inw*inh - 1;
     pixel32 current;
     float drx, dgx, dbx, dry, dgy, dby;
     unsigned int r,g,b;
@@ -520,4 +526,233 @@ 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;
+    float ar, ag, ab;
+
+    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);
+        glVertex2i(x, y);
+        glVertex2i(x+w, y);
+        glVertex2i(x+w, y+h);
+
+        glVertex2i(x+w, y+h);
+        glVertex2i(x, y+h);
+        glVertex2i(x, y);
+        glEnd();
+        return;
+    case Background_Horizontal:
+        glBegin(GL_TRIANGLES);
+        glColor3f(pr, pg, pb);
+        glVertex2i(x, y);
+        glColor3f(sr, sg, sb);
+        glVertex2i(x+w, y);
+        glVertex2i(x+w, y+h);
+
+        glVertex2i(x+w, y+h);
+        glColor3f(pr, pg, pb);
+        glVertex2i(x, y+h);
+        glVertex2i(x, y);
+        glEnd();
+        break;
+    case Background_Vertical:
+        glBegin(GL_TRIANGLES);
+        glColor3f(pr, pg, pb);
+        glVertex2i(x, y);
+        glVertex2i(x+w, y);
+        glColor3f(sr, sg, sb);
+        glVertex2i(x+w, y+h);
+
+        glVertex2i(x+w, y+h);
+        glVertex2i(x, y+h);
+        glColor3f(pr, pg, pb);
+        glVertex2i(x, y);
+        glEnd();
+        break;
+    case Background_Diagonal:
+       ar = (pr + sr) / 2.0;
+       ag = (pg + sg) / 2.0;
+       ab = (pb + sb) / 2.0;
+        glBegin(GL_TRIANGLES);
+        glColor3f(ar, ag, ab);
+        glVertex2i(x, y);
+        glColor3f(pr, pg, pb);
+        glVertex2i(x+w, y);
+        glColor3f(ar, ag, ab);
+        glVertex2i(x+w, y+h);
+
+        glColor3f(ar, ag, ab);
+        glVertex2i(x+w, y+h);
+        glColor3f(sr, sg, sb);
+        glVertex2i(x, y+h);
+        glColor3f(ar, ag, ab);
+        glVertex2i(x, y);
+        glEnd();
+        break;
+    case Background_CrossDiagonal:
+       ar = (pr + sr) / 2.0;
+       ag = (pg + sg) / 2.0;
+       ab = (pb + sb) / 2.0;
+        glBegin(GL_TRIANGLES);
+        glColor3f(pr, pg, pb);
+        glVertex2i(x, y);
+        glColor3f(ar, ag, ab);
+        glVertex2i(x+w, y);
+        glColor3f(sr, sg, sb);
+        glVertex2i(x+w, y+h);
+
+        glColor3f(sr, sg, sb);
+        glVertex2i(x+w, y+h);
+        glColor3f(ar, ag, ab);
+        glVertex2i(x, y+h);
+        glColor3f(pr, pg, pb);
+        glVertex2i(x, y);
+        glEnd();
+        break;
+    case Background_Pyramid:
+       ar = (pr + sr) / 2.0;
+       ag = (pg + sg) / 2.0;
+       ab = (pb + sb) / 2.0;
+        glBegin(GL_TRIANGLES);
+        glColor3f(pr, pg, pb);
+        glVertex2i(x, y);
+        glColor3f(sr, sg, sb);
+        glVertex2i(x+w/2, y+h/2);
+        glColor3f(ar, ag, ab);
+        glVertex2i(x, y+h/2);
+
+        glVertex2i(x, y+h/2);
+        glColor3f(sr, sg, sb);
+        glVertex2i(x+w/2, y+h/2);
+        glColor3f(pr, pg, pb);
+        glVertex2i(x, y+h);
+
+        glVertex2i(x, y+h);
+        glColor3f(sr, sg, sb);
+        glVertex2i(x+w/2, y+h/2);
+        glColor3f(ar, ag, ab);
+        glVertex2i(x+w/2, y+h);
+
+        glVertex2i(x+w/2, y+h);
+        glColor3f(sr, sg, sb);
+        glVertex2i(x+w/2, y+h/2);
+        glColor3f(pr, pg, pb);
+        glVertex2i(x+w, y+h);
+
+        glVertex2i(x+w, y+h);
+        glColor3f(sr, sg, sb);
+        glVertex2i(x+w/2, y+h/2);
+        glColor3f(ar, ag, ab);
+        glVertex2i(x+w, y+h/2);
+
+        glVertex2i(x+w, y+h/2);
+        glColor3f(sr, sg, sb);
+        glVertex2i(x+w/2, y+h/2);
+        glColor3f(pr, pg, pb);
+        glVertex2i(x+w, y);
+
+        glVertex2i(x+w, y);
+        glColor3f(sr, sg, sb);
+        glVertex2i(x+w/2, y+h/2);
+        glColor3f(ar, ag, ab);
+        glVertex2i(x+w/2, y);
+
+        glVertex2i(x+w/2, y);
+        glColor3f(sr, sg, sb);
+        glVertex2i(x+w/2, y+h/2);
+        glColor3f(pr, pg, pb);
+        glVertex2i(x, y);
+        glEnd();
+        break;
+    case Background_PipeCross:
+        glBegin(GL_TRIANGLES);
+        glColor3f(pr, pg, pb);
+        glVertex2i(x, y);
+        glColor3f(sr, sg, sb);
+        glVertex2i(x+w/2, y+h/2);
+        glVertex2i(x, y+h/2);
+
+        glVertex2i(x, y+h/2);
+        glVertex2i(x+w/2, y+h/2);
+        glColor3f(pr, pg, pb);
+        glVertex2i(x, y+h);
+
+        glVertex2i(x, y+h);
+        glColor3f(sr, sg, sb);
+        glVertex2i(x+w/2, y+h/2);
+        glVertex2i(x+w/2, y+h);
+
+        glVertex2i(x+w/2, y+h);
+        glVertex2i(x+w/2, y+h/2);
+        glColor3f(pr, pg, pb);
+        glVertex2i(x+w, y+h);
+
+        glVertex2i(x+w, y+h);
+        glColor3f(sr, sg, sb);
+        glVertex2i(x+w/2, y+h/2);
+        glVertex2i(x+w, y+h/2);
+
+        glVertex2i(x+w, y+h/2);
+        glVertex2i(x+w/2, y+h/2);
+        glColor3f(pr, pg, pb);
+        glVertex2i(x+w, y);
+
+        glVertex2i(x+w, y);
+        glColor3f(sr, sg, sb);
+        glVertex2i(x+w/2, y+h/2);
+        glVertex2i(x+w/2, y);
+
+        glVertex2i(x+w/2, y);
+        glVertex2i(x+w/2, y+h/2);
+        glColor3f(pr, pg, pb);
+        glVertex2i(x, y);
+        glEnd();
+        break;
+    case Background_Rectangle:
+        glBegin(GL_TRIANGLES);
+        glColor3f(pr, pg, pb);
+        glVertex2i(x, y);
+        glColor3f(sr, sg, sb);
+        glVertex2i(x+w/2, y+h/2);
+        glColor3f(pr, pg, pb);
+        glVertex2i(x, y+h);
+
+        glVertex2i(x, y+h);
+        glColor3f(sr, sg, sb);
+        glVertex2i(x+w/2, y+h/2);
+        glColor3f(pr, pg, pb);
+        glVertex2i(x+w, y+h);
+
+        glVertex2i(x+w, y+h);
+        glColor3f(sr, sg, sb);
+        glVertex2i(x+w/2, y+h/2);
+        glColor3f(pr, pg, pb);
+        glVertex2i(x+w, y);
+
+        glVertex2i(x+w, y);
+        glColor3f(sr, sg, sb);
+        glVertex2i(x+w/2, y+h/2);
+        glColor3f(pr, pg, pb);
+        glVertex2i(x, y);
+
+        glEnd();
+        break;
+    default:
+        g_message("unhandled gradient");
+        return;
+    }
+}
+#endif /* USE_GL */
This page took 0.027349 seconds and 4 git commands to generate.