]> Dogcows Code - chaz/openbox/blobdiff - render/gradient.c
add (optional) support for showing a busy cursor via startup notification
[chaz/openbox] / render / gradient.c
index f8a8cb14ce6b1778ab2a32da154c7491e2e0e218..00230323108f262ea8cf414137612547841694bd 100644 (file)
@@ -26,8 +26,12 @@ void gradient_render(Surface *sf, int w, int h)
   case Background_CrossDiagonal:
     gradient_crossdiagonal(sf, w, h);
     break;
+  case Background_Pyramid:
+    gradient_pyramid(sf, w, h);
+    break;
   default:
     g_message("unhandled gradient");
+    return;
   }
   
   if (sf->data.planar.relief == Flat && sf->data.planar.border) {
@@ -232,12 +236,21 @@ void highlight(pixel32 *x, pixel32 *y, gboolean raised)
 
 void gradient_solid(Appearance *l, int x, int y, int w, int h) 
 {
-  int i;
+  pixel32 pix;
+  int i, a, b;
   PlanarSurface *sp = &l->surface.data.planar;
   int left = x, top = y, right = w - 1, bottom = h - 1;
 
   if (sp->primary->gc == None)
     color_allocate_gc(sp->primary);
+  pix = (sp->primary->r << default_red_shift)
+      + (sp->primary->g << default_green_shift)
+      + (sp->primary->b << default_blue_shift);
+
+  for (a = 0; a < l->area.width; a++)
+    for (b = 0; b < l->area.height; b++)
+      sp->pixel_data[a + b*l->area.width] = pix;
+
   XFillRectangle(ob_display, l->pixmap, sp->primary->gc
                  , x, y, w, h);
 
@@ -317,3 +330,42 @@ 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 current;
+  float drx, dgx, dbx, dry, dgy, dby;
+  unsigned int r,g,b;
+  int x, y, h=(inh+1)/2, w=(inw+1)/2;
+memset(data, 0, inw*inh*sizeof(pixel32));
+  for (y = 0; y < h; ++y) {
+    drx = (float)(sf->data.planar.secondary->r - sf->data.planar.primary->r);
+    dry = drx/(float)h;
+    drx/= (float)w;
+
+    dgx = (float)(sf->data.planar.secondary->g - sf->data.planar.primary->g);
+    dgy = dgx/(float)h;
+    dgx/= (float)w;
+
+    dbx = (float)(sf->data.planar.secondary->b - sf->data.planar.primary->b);
+    dby = dbx/(float)h;
+    dbx/= (float)w;
+    for (x = 0; x < w; ++x, data) {
+      r = sf->data.planar.primary->r + ((int)(drx * x) + (int)(dry * y))/2;
+      g = sf->data.planar.primary->g + ((int)(dgx * x) + (int)(dgy * y))/2;
+      b = sf->data.planar.primary->b + ((int)(dbx * x) + (int)(dby * y))/2;
+      current = (r << default_red_shift)
+              + (g << default_green_shift)
+              + (b << default_blue_shift);
+      *(data+x) = current;
+      *(data+inw-x) = current;
+      *(end-x) = current;
+      *(end-(inw-x)) = current;
+    }
+    data+=inw;
+    end-=inw;
+  }
+}
+
This page took 0.021243 seconds and 4 git commands to generate.