X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=render%2Fgradient.c;h=00230323108f262ea8cf414137612547841694bd;hb=78a8680cd7379cc0d75af810dabe62c7a6c4a8b2;hp=4302cfa0c3bce2bdbf0ba4d7d17f37874a4f299a;hpb=99b226f39df2d7df0349c576012e97f5d662a9a6;p=chaz%2Fopenbox diff --git a/render/gradient.c b/render/gradient.c index 4302cfa0..00230323 100644 --- a/render/gradient.c +++ b/render/gradient.c @@ -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\n"); + g_message("unhandled gradient"); + return; } if (sf->data.planar.relief == Flat && sf->data.planar.border) { @@ -230,23 +234,32 @@ void highlight(pixel32 *x, pixel32 *y, gboolean raised) + (b << default_blue_shift); } -void gradient_solid(Appearance *l, int w, int h) +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 = 0, top = 0, right = w - 1, bottom = h - 1; + 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 - , 0, 0, w, h); + , x, y, w, h); if (l->surface.data.planar.interlaced) { if (sp->secondary->gc == None) color_allocate_gc(sp->secondary); - for (i = 0; i < h; i += 2) + for (i = y; i < h; i += 2) XDrawLine(ob_display, l->pixmap, sp->secondary->gc, - 0, i, w, i); + x, i, w, i); } /* switch (texture.relief()) { @@ -317,3 +330,42 @@ void gradient_solid(Appearance *l, 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; + } +} +