From 50292dbd75763a192eee748cc6c0b3e15505e7fe Mon Sep 17 00:00:00 2001 From: Mikael Magnusson Date: Tue, 1 Aug 2006 20:34:35 +0000 Subject: [PATCH] a "osx" gradient, it is like horizontal but mirrors in the center --- render/gradient.c | 41 +++++++++++++++++++++++++++++++++++++++++ render/render.h | 3 ++- render/theme.c | 2 ++ 3 files changed, 45 insertions(+), 1 deletion(-) diff --git a/render/gradient.c b/render/gradient.c index 9f245743..7b26e54c 100644 --- a/render/gradient.c +++ b/render/gradient.c @@ -27,6 +27,7 @@ static void gradient_solid(RrAppearance *l, gint w, gint h); static void gradient_split(RrAppearance *a, gint w, gint h); static void gradient_vertical(RrSurface *sf, gint w, gint h); static void gradient_horizontal(RrSurface *sf, gint w, gint h); +static void gradient_osx(RrSurface *sf, gint w, gint h); static void gradient_diagonal(RrSurface *sf, gint w, gint h); static void gradient_crossdiagonal(RrSurface *sf, gint w, gint h); static void gradient_pyramid(RrSurface *sf, gint inw, gint inh); @@ -51,6 +52,9 @@ void RrRender(RrAppearance *a, gint w, gint h) case RR_SURFACE_HORIZONTAL: gradient_horizontal(&a->surface, w, h); break; + case RR_SURFACE_OSX: + gradient_osx(&a->surface, w, h); + break; case RR_SURFACE_DIAGONAL: gradient_diagonal(&a->surface, w, h); break; @@ -449,6 +453,43 @@ static void gradient_horizontal(RrSurface *sf, gint w, gint h) *(data + y * w) = current; } +static void gradient_osx(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/2); + + 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; + + 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; + + NEXT(x); + } + 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) { gint x, y; diff --git a/render/render.h b/render/render.h index 19563137..22a9bac7 100644 --- a/render/render.h +++ b/render/render.h @@ -66,7 +66,8 @@ typedef enum { RR_SURFACE_VERTICAL, RR_SURFACE_DIAGONAL, RR_SURFACE_CROSS_DIAGONAL, - RR_SURFACE_PYRAMID + RR_SURFACE_PYRAMID, + RR_SURFACE_OSX } RrSurfaceColorType; typedef enum { diff --git a/render/theme.c b/render/theme.c index e89e4dc9..0185469c 100644 --- a/render/theme.c +++ b/render/theme.c @@ -1196,6 +1196,8 @@ static void parse_appearance(gchar *tex, RrSurfaceColorType *grad, *grad = RR_SURFACE_CROSS_DIAGONAL; else if (strstr(tex, "pyramid") != NULL) *grad = RR_SURFACE_PYRAMID; + else if (strstr(tex, "osx") != NULL) + *grad = RR_SURFACE_OSX; else if (strstr(tex, "horizontal") != NULL) *grad = RR_SURFACE_HORIZONTAL; else if (strstr(tex, "vertical") != NULL) -- 2.39.2