]> Dogcows Code - chaz/openbox/blobdiff - render/gradient.c
Added a menu to read from a pipe.
[chaz/openbox] / render / gradient.c
index bd55b9f1b555b760c8ae160413767d28121df7aa..00230323108f262ea8cf414137612547841694bd 100644 (file)
@@ -26,6 +26,9 @@ 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;
@@ -238,16 +241,12 @@ void gradient_solid(Appearance *l, int x, int y, int w, int h)
   PlanarSurface *sp = &l->surface.data.planar;
   int left = x, top = y, right = w - 1, bottom = h - 1;
 
-assert(x+w < l->area.width);
-assert(y+h < l->area.height);
-
   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);
-printf("x = %d : y = %d : w = %d : h = %d (%d:%d\n", x,y,w,h, 
-l->area.width, l->area.height);
+
   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;
@@ -331,3 +330,42 @@ l->area.width, l->area.height);
   }
 */
 }
+
+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.026763 seconds and 4 git commands to generate.