+/* -*- 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) 2003 Derek Foreman
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ See the COPYING file for a copy of the GNU General Public License.
+*/
+
+#include "render.h"
+#include "color.h"
+#include "instance.h"
+
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <string.h>
-#include "render.h"
-#include "color.h"
void RrColorAllocateGC(RrColor *in)
{
/* this should be replaced with something far cooler */
RrColor *out = NULL;
XColor xcol;
- xcol.red = (r << 8) | r;
- xcol.green = (g << 8) | g;
- xcol.blue = (b << 8) | b;
- if (XAllocColor(RrDisplay(inst), RrColormap(inst), &xcol)) {
- out = g_new(RrColor, 1);
- out->inst = inst;
- out->r = xcol.red >> 8;
- out->g = xcol.green >> 8;
- out->b = xcol.blue >> 8;
- out->gc = None;
- out->pixel = xcol.pixel;
+ gint key;
+
+ key = (r << 24) + (g << 16) + (b << 8);
+ if ((out = g_hash_table_lookup(RrColorHash(inst), &key))) {
+ out->refcount++;
+ } else {
+ xcol.red = (r << 8) | r;
+ xcol.green = (g << 8) | g;
+ xcol.blue = (b << 8) | b;
+ if (XAllocColor(RrDisplay(inst), RrColormap(inst), &xcol)) {
+ out = g_new(RrColor, 1);
+ out->inst = inst;
+ out->r = xcol.red >> 8;
+ out->g = xcol.green >> 8;
+ out->b = xcol.blue >> 8;
+ out->gc = None;
+ out->pixel = xcol.pixel;
+ out->key = key;
+ out->refcount = 1;
+ g_hash_table_replace(RrColorHash(inst), &out->key, out);
+ }
}
return out;
}
-/*XXX same color could be pointed to twice, this might have to be a refcount*/
-
void RrColorFree(RrColor *c)
{
if (c) {
- if (c->gc) XFreeGC(RrDisplay(c->inst), c->gc);
- g_free(c);
+ if (--c->refcount < 1) {
+ g_hash_table_remove(RrColorHash(c->inst), &c->key);
+ if (c->pixel) XFreeColors(RrDisplay(c->inst), RrColormap(c->inst),
+ &c->pixel, 1, 0);
+ if (c->gc) XFreeGC(RrDisplay(c->inst), c->gc);
+ g_free(c);
+ }
}
}
break;
default:
- g_message("your bit depth is currently unhandled\n");
+ g_warning("your bit depth is currently unhandled\n");
}
}
{
int x, y, di;
- g_message("SWAPPING BYTE ORDER");
-
di = 0;
for (y = 0; y < im->height; ++y) {
for (x = 0; x < im->height; ++x) {
case 8:
break;
default:
- g_message("your bit depth is currently unhandled\n");
+ g_warning("your bit depth is currently unhandled");
}
}
di += im->bytes_per_line;
RrPixel16 *p16 = (RrPixel16 *) im->data;
unsigned char *p8 = (unsigned char *)im->data;
- if (im->byte_order != RrEndian)
+ if (im->byte_order != LSBFirst)
swap_byte_order(im);
switch (im->bits_per_pixel) {
}
break;
case 8:
- g_message("this image bit depth is currently unhandled\n");
+ g_warning("this image bit depth is currently unhandled");
break;
case 1:
for (y = 0; y < im->height; y++) {
}
break;
default:
- g_message("this image bit depth is currently unhandled\n");
+ g_warning("this image bit depth is currently unhandled");
}
}
+
+int RrColorRed(const RrColor *c)
+{
+ return c->r;
+}
+
+int RrColorGreen(const RrColor *c)
+{
+ return c->g;
+}
+
+int RrColorBlue(const RrColor *c)
+{
+ return c->b;
+}
+
+gulong RrColorPixel(const RrColor *c)
+{
+ return c->pixel;
+}
+
+GC RrColorGC(RrColor *c)
+{
+ if (!c->gc)
+ RrColorAllocateGC(c);
+ return c->gc;
+}