X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=render%2Fgradient.c;h=63b8e94993111ac4cf7d4d14ecb8528f049d2c62;hb=2c05d1fb529f80d7e040dd0b9f3af13bd90580f2;hp=ccfd6071d5c3f5c2e08887331ce939013e99c993;hpb=89b7311d8d8cd39d3e8a942d783f75bab2599b60;p=chaz%2Fopenbox diff --git a/render/gradient.c b/render/gradient.c index ccfd6071..63b8e949 100644 --- a/render/gradient.c +++ b/render/gradient.c @@ -23,7 +23,8 @@ #include "color.h" #include -static void highlight(RrSurface *s, RrPixel32 *x, RrPixel32 *y, gboolean raised); +static void highlight(RrSurface *s, RrPixel32 *x, RrPixel32 *y, + gboolean raised); static void gradient_parentrelative(RrAppearance *a, gint w, gint h); static void gradient_solid(RrAppearance *l, gint w, gint h); static void gradient_splitvertical(RrAppearance *a, gint w, gint h); @@ -73,7 +74,7 @@ void RrRender(RrAppearance *a, gint w, gint h) g_assert_not_reached(); /* unhandled gradient */ return; } - + if (a->surface.interlaced) { gint i; RrPixel32 *p; @@ -156,7 +157,7 @@ static void highlight(RrSurface *s, RrPixel32 *x, RrPixel32 *y, gboolean raised) if (b > 0xFF) b = 0xFF; *up = (r << RrDefaultRedOffset) + (g << RrDefaultGreenOffset) + (b << RrDefaultBlueOffset); - + r = (*down >> RrDefaultRedOffset) & 0xFF; r -= (r * s->bevel_dark_adjust) >> 8; g = (*down >> RrDefaultGreenOffset) & 0xFF; @@ -246,7 +247,7 @@ static void gradient_parentrelative(RrAppearance *a, gint w, gint h) } } -static void gradient_solid(RrAppearance *l, gint w, gint h) +static void gradient_solid(RrAppearance *l, gint w, gint h) { gint i; RrPixel32 pix; @@ -278,7 +279,7 @@ static void gradient_solid(RrAppearance *l, gint w, gint h) left, bottom, right, bottom); XDrawLine(RrDisplay(l->inst), l->pixmap, RrColorGC(sp->bevel_dark), right, bottom, right, top); - + XDrawLine(RrDisplay(l->inst), l->pixmap,RrColorGC(sp->bevel_light), left, top, right, top); XDrawLine(RrDisplay(l->inst), l->pixmap,RrColorGC(sp->bevel_light), @@ -309,7 +310,7 @@ static void gradient_solid(RrAppearance *l, gint w, gint h) left, bottom, right, bottom); XDrawLine(RrDisplay(l->inst), l->pixmap,RrColorGC(sp->bevel_light), right, bottom, right, top); - + XDrawLine(RrDisplay(l->inst), l->pixmap, RrColorGC(sp->bevel_dark), left, top, right, top); XDrawLine(RrDisplay(l->inst), l->pixmap, RrColorGC(sp->bevel_dark), @@ -337,7 +338,7 @@ static void gradient_solid(RrAppearance *l, gint w, gint h) left, top, right, bottom); } break; - default: + default: g_assert_not_reached(); /* unhandled ReliefType */ } } @@ -421,50 +422,37 @@ static void gradient_solid(RrAppearance *l, gint w, gint h) static void gradient_splitvertical(RrAppearance *a, gint w, gint h) { - gint x, y1, y2, y3, r, g, b; + gint x, y1, y2, y3; 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; - r += r >> 2; - g = sf->primary->g; - g += g >> 2; - b = sf->primary->b; - b += b >> 2; - if (r > 0xFF) r = 0xFF; - if (g > 0xFF) g = 0xFF; - if (b > 0xFF) b = 0xFF; - primary_light = RrColorNew(a->inst, r, g, b); - - r = sf->secondary->r; - r += r >> 4; - g = sf->secondary->g; - g += g >> 4; - b = sf->secondary->b; - b += b >> 4; - if (r > 0xFF) r = 0xFF; - if (g > 0xFF) g = 0xFF; - if (b > 0xFF) b = 0xFF; - secondary_light = RrColorNew(a->inst, r, g, b); - - 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); + /* if h <= 5, then a 0 or 1px middle gradient. + if h > 5, then always a 1px middle gradient. + */ + if (h <= 5) { + y1sz = MAX(h/2, 0); + y2sz = (h < 3 ? 0 : h % 2); + y3sz = MAX(h/2, 1); + } + else { + y1sz = h/2 - (1 - (h % 2)); + y2sz = 1; + y3sz = h/2; + } - SETUP(y1, primary_light, sf->primary, y1sz); + SETUP(y1, sf->split_primary, sf->primary, y1sz); if (y2sz) { - SETUP(y2, sf->primary, sf->secondary, y2sz); + /* setup to get the colors _in between_ these other 2 */ + SETUP(y2, sf->primary, sf->secondary, y2sz + 2); NEXT(y2); /* skip the first one, its the same as the last of y1 */ } - SETUP(y3, sf->secondary, secondary_light, y3sz); + SETUP(y3, sf->secondary, sf->split_secondary, y3sz); for (y1 = y1sz; y1 > 0; --y1) { current = COLOR(y1); @@ -478,10 +466,10 @@ static void gradient_splitvertical(RrAppearance *a, gint w, gint h) current = COLOR(y2); for (x = w - 1; x >= 0; --x) *(data++) = current; - + NEXT(y2); } - + for (y3 = y3sz; y3 > 0; --y3) { current = COLOR(y3); for (x = w - 1; x >= 0; --x) @@ -489,9 +477,6 @@ static void gradient_splitvertical(RrAppearance *a, gint w, gint h) NEXT(y3); } - - RrColorFree(primary_light); - RrColorFree(secondary_light); } static void gradient_horizontal(RrSurface *sf, gint w, gint h) @@ -621,7 +606,7 @@ static void gradient_diagonal(RrSurface *sf, gint w, gint h) for (x = w - 1; x > 0; --x) { /* 0 -> w-1 */ *(data++) = COLOR(x); - + NEXT(x); } *data = COLOR(x); @@ -668,7 +653,7 @@ static void gradient_crossdiagonal(RrSurface *sf, gint w, gint h) for (x = w - 1; x > 0; --x) { /* 0 -> w-1 */ *(data++) = COLOR(x); - + NEXT(x); } *data = COLOR(x); @@ -732,7 +717,7 @@ static void gradient_pyramid(RrSurface *sf, gint inw, gint inh) *(data+inw-x) = current; *(end-x) = current; *(end-(inw-x)) = current; - + NEXT(x); } current = COLOR(x);