X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=render%2Fcolor.c;h=358911e155941cbb637f27f975e3e45e62f5230a;hb=ada2eb8fe506d1e55cf49953e570f7270c4dd930;hp=f791b9c48582a16d2fe5581c9d9e9a5603824603;hpb=f90167d8b5d8bd082fb961590375c8607eaec8e0;p=chaz%2Fopenbox diff --git a/render/color.c b/render/color.c index f791b9c4..358911e1 100644 --- a/render/color.c +++ b/render/color.c @@ -1,5 +1,6 @@ #include "render.h" #include "color.h" +#include "instance.h" #include #include @@ -39,30 +40,41 @@ RrColor *RrColorNew(const RrInstance *inst, gint r, gint g, gint b) /* 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->pixel) XFreeColors(RrDisplay(c->inst), RrColormap(c->inst), - &c->pixel, 1, 0); - 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); + } } } @@ -260,8 +272,7 @@ gulong RrColorPixel(const RrColor *c) 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);