X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=render%2Fgradient.c;h=6439b301b9bd1d32b4494cdeb1bb7a86698be51d;hb=9a93350aa7bb124e39378eb0d67b7e0ca1a8a1df;hp=41514ac43296bac8ce059e1034cadf0aa35e4fb5;hpb=89ade7a8c1a5f825f61657cb185246cefbd4e96e;p=chaz%2Fopenbox diff --git a/render/gradient.c b/render/gradient.c index 41514ac4..6439b301 100644 --- a/render/gradient.c +++ b/render/gradient.c @@ -2,7 +2,7 @@ gradient.c for the Openbox window manager Copyright (c) 2006 Mikael Magnusson - Copyright (c) 2003-2007 Dana Jansens + Copyright (c) 2003-2008 Dana Jansens Copyright (c) 2003 Derek Foreman This program is free software; you can redistribute it and/or modify @@ -22,8 +22,10 @@ #include "gradient.h" #include "color.h" #include +#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 +75,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 +158,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 +248,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 +280,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 +311,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 +339,7 @@ static void gradient_solid(RrAppearance *l, gint w, gint h) left, top, right, bottom); } break; - default: + default: g_assert_not_reached(); /* unhandled ReliefType */ } } @@ -431,15 +433,24 @@ static void gradient_splitvertical(RrAppearance *a, gint w, gint h) VARS(y2); VARS(y3); - - 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, 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, sf->split_secondary, y3sz); @@ -456,10 +467,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) @@ -473,64 +484,60 @@ static void gradient_horizontal(RrSurface *sf, gint w, gint h) { gint x, y; RrPixel32 *data = sf->pixel_data, *datav; - RrPixel32 current; VARS(x); SETUP(x, sf->primary, sf->secondary, w); - for (x = w - 1; x > 0; --x) { /* 0 -> w-1 */ - current = COLOR(x); - datav = data; - for (y = h - 1; y >= 0; --y) { /* 0 -> h */ - *datav = current; - datav += w; - } - ++data; - + datav = data; + for (x = w - 1; x > 0; --x) { /* 0 -> w - 1 */ + *datav = COLOR(x); + ++datav; NEXT(x); } - current = COLOR(x); - for (y = h - 1; y >= 0; --y) /* 0 -> h */ - *(data + y * w) = current; + *datav = COLOR(x); + ++datav; + + for (y = h - 1; y > 0; --y) { /* 1 -> h */ + memcpy(datav, data, w * sizeof(RrPixel32)); + datav += w; + } } static void gradient_mirrorhorizontal(RrSurface *sf, gint w, gint h) { - gint x, y; + gint x, y, half1, half2; RrPixel32 *data = sf->pixel_data, *datav; - RrPixel32 current; VARS(x); - SETUP(x, sf->primary, sf->secondary, w/2); - if (w > 1) { - for (x = w - 1; x > w/2-1; --x) { /* 0 -> w-1 */ - current = COLOR(x); - datav = data; - for (y = h - 1; y >= 0; --y) { /* 0 -> h */ - *datav = current; - datav += w; - } - ++data; + half1 = (w + 1) / 2; + half2 = w / 2; + SETUP(x, sf->primary, sf->secondary, half1); + datav = data; + for (x = half1 - 1; x > 0; --x) { /* 0 -> half1 - 1 */ + *datav = COLOR(x); + ++datav; + NEXT(x); + } + *datav = COLOR(x); + ++datav; + + if (half2 > 0) { + SETUP(x, sf->secondary, sf->primary, half2); + for (x = half2 - 1; x > 0; --x) { /* 0 -> half2 - 1 */ + *datav = COLOR(x); + ++datav; NEXT(x); } - SETUP(x, sf->secondary, sf->primary, w/2); - for (x = w/2 - 1; x > 0; --x) { /* 0 -> w-1 */ - current = COLOR(x); - datav = data; - for (y = h - 1; y >= 0; --y) { /* 0 -> h */ - *datav = current; - datav += w; - } - ++data; + *datav = COLOR(x); + ++datav; + } - NEXT(x); - } + for (y = h - 1; y > 0; --y) { /* 1 -> h */ + memcpy(datav, data, w * sizeof(RrPixel32)); + datav += w; } - current = COLOR(x); - for (y = h - 1; y >= 0; --y) /* 0 -> h */ - *(data + y * w) = current; } static void gradient_vertical(RrSurface *sf, gint w, gint h) @@ -596,7 +603,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); @@ -643,7 +650,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); @@ -707,7 +714,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);