+/* -*- 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"
return RrColorNew(inst, xcol.red >> 8, xcol.green >> 8, xcol.blue >> 8);
}
+/*#define NO_COLOR_CACHE*/
+#ifdef DEBUG
+gint id;
+#endif
+
RrColor *RrColorNew(const RrInstance *inst, gint r, gint g, gint b)
{
/* this should be replaced with something far cooler */
gint key;
key = (r << 24) + (g << 16) + (b << 8);
+#ifndef NO_COLOR_CACHE
if ((out = g_hash_table_lookup(RrColorHash(inst), &key))) {
out->refcount++;
} else {
+#endif
xcol.red = (r << 8) | r;
xcol.green = (g << 8) | g;
xcol.blue = (b << 8) | b;
out->pixel = xcol.pixel;
out->key = key;
out->refcount = 1;
- g_hash_table_replace(RrColorHash(inst), &out->key, out);
+#ifdef DEBUG
+ out->id = id++;
+#endif
+#ifndef NO_COLOR_CACHE
+ g_hash_table_insert(RrColorHash(inst), &out->key, out);
}
+#endif
}
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->refcount < 1) {
+#ifndef NO_COLOR_CACHE
+ g_assert(g_hash_table_lookup(RrColorHash(c->inst), &c->key));
g_hash_table_remove(RrColorHash(c->inst), &c->key);
+#endif
if (c->pixel) XFreeColors(RrDisplay(c->inst), RrColormap(c->inst),
&c->pixel, 1, 0);
if (c->gc) XFreeGC(RrDisplay(c->inst), c->gc);
return c->pixel;
}
-GC RrColorGC(RrColor *c) /* XXX make this const RrColor* when the GCs are in
- a cache.. if possible? */
+GC RrColorGC(RrColor *c)
{
if (!c->gc)
RrColorAllocateGC(c);