/* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
color.c for the Openbox window manager
- Copyright (c) 2003 Ben Jansens
+ Copyright (c) 2006 Mikael Magnusson
+ Copyright (c) 2003-2007 Dana Jansens
Copyright (c) 2003 Derek Foreman
This program is free software; you can redistribute it and/or modify
xcol.blue = 0;
xcol.pixel = 0;
if (!XParseColor(RrDisplay(inst), RrColormap(inst), colorname, &xcol)) {
- g_warning("unable to parse color '%s'", colorname);
+ g_message("Unable to parse color '%s'", colorname);
return NULL;
}
return RrColorNew(inst, xcol.red >> 8, xcol.green >> 8, xcol.blue >> 8);
XColor xcol;
gint key;
+ g_assert(r >= 0 && r < 256);
+ g_assert(g >= 0 && g < 256);
+ g_assert(b >= 0 && b < 256);
+
key = (r << 24) + (g << 16) + (b << 8);
#ifndef NO_COLOR_CACHE
if ((out = g_hash_table_lookup(RrColorHash(inst), &key))) {
gint x,y;
RrPixel32 *p32 = (RrPixel32 *) im->data;
RrPixel16 *p16 = (RrPixel16 *) im->data;
- guchar *p8 = (guchar *)im->data;
+ RrPixel8 *p8 = (RrPixel8 *) im->data;
switch (im->bits_per_pixel) {
case 32:
if ((RrRedOffset(inst) != RrDefaultRedOffset) ||
}
data += im->width;
p32 += im->width;
- }
+ }
} else im->data = (gchar*) data;
break;
+ case 24:
+ {
+ /* reverse the ordering, shifting left 16bit should be the first byte
+ out of three, etc */
+ const guint roff = (16 - RrRedOffset(inst)) / 8;
+ const guint goff = (16 - RrGreenOffset(inst)) / 8;
+ const guint boff = (16 - RrBlueOffset(inst)) / 8;
+ gint outx;
+ for (y = 0; y < im->height; y++) {
+ for (x = 0, outx = 0; x < im->width; x++, outx += 3) {
+ r = (data[x] >> RrDefaultRedOffset) & 0xFF;
+ g = (data[x] >> RrDefaultGreenOffset) & 0xFF;
+ b = (data[x] >> RrDefaultBlueOffset) & 0xFF;
+ p8[outx+roff] = r;
+ p8[outx+goff] = g;
+ p8[outx+boff] = b;
+ }
+ data += im->width;
+ p8 += im->bytes_per_line;
+ }
+ break;
+ }
case 16:
for (y = 0; y < im->height; y++) {
for (x = 0; x < im->width; x++) {
data += im->width;
p16 += im->bytes_per_line/2;
}
- break;
+ break;
case 8:
- g_assert(RrVisual(inst)->class != TrueColor);
- for (y = 0; y < im->height; y++) {
- for (x = 0; x < im->width; x++) {
- p8[x] = RrPickColor(inst,
- data[x] >> RrDefaultRedOffset,
- data[x] >> RrDefaultGreenOffset,
- data[x] >> RrDefaultBlueOffset)->pixel;
+ if (RrVisual(inst)->class == TrueColor) {
+ for (y = 0; y < im->height; y++) {
+ for (x = 0; x < im->width; x++) {
+ r = (data[x] >> RrDefaultRedOffset) & 0xFF;
+ r = r >> RrRedShift(inst);
+ g = (data[x] >> RrDefaultGreenOffset) & 0xFF;
+ g = g >> RrGreenShift(inst);
+ b = (data[x] >> RrDefaultBlueOffset) & 0xFF;
+ b = b >> RrBlueShift(inst);
+ p8[x] = (r << RrRedOffset(inst))
+ + (g << RrGreenOffset(inst))
+ + (b << RrBlueOffset(inst));
+ }
+ data += im->width;
+ p8 += im->bytes_per_line;
+ }
+ } else {
+ for (y = 0; y < im->height; y++) {
+ for (x = 0; x < im->width; x++) {
+ p8[x] = RrPickColor(inst,
+ data[x] >> RrDefaultRedOffset,
+ data[x] >> RrDefaultGreenOffset,
+ data[x] >> RrDefaultBlueOffset)->pixel;
+ }
+ data += im->width;
+ p8 += im->bytes_per_line;
+ }
}
- data += im->width;
- p8 += im->bytes_per_line;
- }
-
- break;
+ break;
default:
- g_warning("your bit depth is currently unhandled\n");
+ g_error("This image bit depth (%i) is currently unhandled", im->bits_per_pixel);
+
}
}
-XColor *RrPickColor(const RrInstance *inst, gint r, gint g, gint b)
+XColor *RrPickColor(const RrInstance *inst, gint r, gint g, gint b)
{
r = (r & 0xff) >> (8-RrPseudoBPC(inst));
g = (g & 0xff) >> (8-RrPseudoBPC(inst));
c[0] = c[1];
c[1] = t;
case 8:
+ case 1:
break;
default:
- g_warning("your bit depth is currently unhandled");
+ g_error("Your bit depth (%i) is currently unhandled",
+ im->bits_per_pixel);
}
}
di += im->bytes_per_line;
}
break;
case 8:
- g_warning("this image bit depth is currently unhandled");
+ g_error("This image bit depth (%i) is currently unhandled", 8);
break;
case 1:
for (y = 0; y < im->height; y++) {
}
break;
default:
- g_warning("this image bit depth is currently unhandled");
+ g_error("This image bit depth (%i) is currently unhandled",
+ im->bits_per_pixel);
}
}