X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=render%2Fgradient.c;h=6439b301b9bd1d32b4494cdeb1bb7a86698be51d;hb=eddcfdfdcd8e0238f9570358cd47eca773bff8d3;hp=e4bfc5404b9a764195458719faff74243c2c4e27;hpb=8ad51aef1e08623fb97437994d75366a3018e493;p=chaz%2Fopenbox diff --git a/render/gradient.c b/render/gradient.c index e4bfc540..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,6 +22,7 @@ #include "gradient.h" #include "color.h" #include +#include static void highlight(RrSurface *s, RrPixel32 *x, RrPixel32 *y, gboolean raised); @@ -74,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; @@ -157,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; @@ -247,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; @@ -279,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), @@ -310,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), @@ -338,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 */ } } @@ -466,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) @@ -483,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) @@ -606,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); @@ -653,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); @@ -717,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);