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
#include "gradient.h"
#include "color.h"
#include <glib.h>
+#include <string.h>
-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);
g_assert_not_reached(); /* unhandled gradient */
return;
}
-
+
if (a->surface.interlaced) {
gint i;
RrPixel32 *p;
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;
}
}
-static void gradient_solid(RrAppearance *l, gint w, gint h)
+static void gradient_solid(RrAppearance *l, gint w, gint h)
{
gint i;
RrPixel32 pix;
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),
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),
left, top, right, bottom);
}
break;
- default:
+ default:
g_assert_not_reached(); /* unhandled ReliefType */
}
}
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);
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)
{
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)
for (x = w - 1; x > 0; --x) { /* 0 -> w-1 */
*(data++) = COLOR(x);
-
+
NEXT(x);
}
*data = COLOR(x);
for (x = w - 1; x > 0; --x) { /* 0 -> w-1 */
*(data++) = COLOR(x);
-
+
NEXT(x);
}
*data = COLOR(x);
*(data+inw-x) = current;
*(end-x) = current;
*(end-(inw-x)) = current;
-
+
NEXT(x);
}
current = COLOR(x);