X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=render%2Fgradient.c;h=ad126513ff07f63f0777b8a4c99f6c265be313ae;hb=d3c22b58cba15c9420a9c09225c4ba5c66edfa23;hp=99441cd37fb63a4096acbf93ce5c3b84db4a8d6f;hpb=3a89939c2decf295a5d85e5306ca259e64812d9d;p=chaz%2Fopenbox diff --git a/render/gradient.c b/render/gradient.c index 99441cd3..ad126513 100644 --- a/render/gradient.c +++ b/render/gradient.c @@ -37,9 +37,9 @@ static void gradient_pyramid(RrSurface *sf, gint inw, gint inh); void RrRender(RrAppearance *a, gint w, gint h) { RrPixel32 *data = a->surface.pixel_data; - RrPixel32 current, *source, *dest; + RrPixel32 current; guint r,g,b; - gint off, x, sw, sh, partial_w, partial_h, i; + gint off, x; switch (a->surface.grad) { case RR_SURFACE_PARENTREL: @@ -205,20 +205,43 @@ static void gradient_parentrelative(RrAppearance *a, gint w, gint h) sw = a->surface.parent->w; sh = a->surface.parent->h; - source = (a->surface.parent->surface.pixel_data + - a->surface.parentx + sw * a->surface.parenty); - dest = a->surface.pixel_data; + /* This is a little hack. When a texture is parentrelative, and the same + area as the parent, and has a bevel, it will draw its bevel on top + of the parent's, amplifying it. So instead, rerender the child with + the parent's settings, but the child's bevel and interlace */ + if (a->surface.relief != RR_RELIEF_FLAT && + (a->surface.parent->surface.relief != RR_RELIEF_FLAT || + a->surface.parent->surface.border) && + !a->surface.parentx && !a->surface.parenty && + sw == w && sh == h) + { + RrSurface old = a->surface; + a->surface = a->surface.parent->surface; + + /* turn these off for the parent */ + a->surface.relief = RR_RELIEF_FLAT; + a->surface.border = FALSE; + + a->surface.pixel_data = old.pixel_data; + + RrRender(a, w, h); + a->surface = old; + } else { + source = (a->surface.parent->surface.pixel_data + + a->surface.parentx + sw * a->surface.parenty); + dest = a->surface.pixel_data; - if (a->surface.parentx + w > sw) { - partial_w = sw - a->surface.parentx; - } else partial_w = w; + if (a->surface.parentx + w > sw) { + partial_w = sw - a->surface.parentx; + } else partial_w = w; - if (a->surface.parenty + h > sh) { - partial_h = sh - a->surface.parenty; - } else partial_h = h; + if (a->surface.parenty + h > sh) { + partial_h = sh - a->surface.parenty; + } else partial_h = h; - for (i = 0; i < partial_h; i++, source += sw, dest += w) { - memcpy(dest, source, partial_w * sizeof(RrPixel32)); + for (i = 0; i < partial_h; i++, source += sw, dest += w) { + memcpy(dest, source, partial_w * sizeof(RrPixel32)); + } } } @@ -397,13 +420,15 @@ static void gradient_solid(RrAppearance *l, gint w, gint h) static void gradient_splitvertical(RrAppearance *a, gint w, gint h) { - gint x, y1, y3, r, g, b; + gint x, y1, y2, y3, r, g, b; RrSurface *sf = &a->surface; RrPixel32 *data = sf->pixel_data; RrPixel32 current; RrColor *primary_light, *secondary_light; + gint y1sz, y2sz, y3sz; VARS(y1); + VARS(y2); VARS(y3); r = sf->primary->r; @@ -415,7 +440,7 @@ static void gradient_splitvertical(RrAppearance *a, gint w, gint h) if (r > 0xFF) r = 0xFF; if (g > 0xFF) g = 0xFF; if (b > 0xFF) b = 0xFF; - primary_light = RrColorNew(a->inst, r, g, b); + primary_light = RrColorNew(a->inst, r, g, b); r = sf->secondary->r; r += r >> 4; @@ -428,19 +453,35 @@ static void gradient_splitvertical(RrAppearance *a, gint w, gint h) if (b > 0xFF) b = 0xFF; secondary_light = RrColorNew(a->inst, r, g, b); - SETUP(y1, primary_light, sf->primary, (h / 2) -1); - SETUP(y3, sf->secondary, secondary_light, (h / 2) -1); + y1sz = MAX(h/2 - 1, 1); + /* setup to get the colors _in between_ these other 2 */ + y2sz = (h < 3 ? 0 : (h % 2 ? 3 : 2)); + y3sz = MAX(h/2 - 1, 0); - for (y1 = h - 1; y1 > (h / 2) -1; --y1) { /* 0 -> h-1 */ + SETUP(y1, primary_light, sf->primary, y1sz); + if (y2sz) { + SETUP(y2, sf->primary, sf->secondary, y2sz); + NEXT(y2); /* skip the first one, its the same as the last of y1 */ + } + SETUP(y3, sf->secondary, secondary_light, y3sz); + + for (y1 = y1sz; y1 > 0; --y1) { current = COLOR(y1); - for (x = w - 1; x >= 0; --x) /* 0 -> w */ + for (x = w - 1; x >= 0; --x) *(data++) = current; NEXT(y1); } + for (y2 = y2sz; y2 > 0; --y2) { + current = COLOR(y2); + for (x = w - 1; x >= 0; --x) + *(data++) = current; + + NEXT(y2); + } - for (y3 = (h / 2) - 1; y3 > 0; --y3) { + for (y3 = y3sz; y3 > 0; --y3) { current = COLOR(y3); for (x = w - 1; x >= 0; --x) *(data++) = current; @@ -448,10 +489,6 @@ static void gradient_splitvertical(RrAppearance *a, gint w, gint h) NEXT(y3); } - current = COLOR(y3); - for (x = w - 1; x >= 0; --x) /* 0 -> w */ - *(data++) = current; - RrColorFree(primary_light); RrColorFree(secondary_light); }