summaryrefslogtreecommitdiff
path: root/render
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2003-09-02 08:38:03 +0000
committerDana Jansens <danakj@orodu.net>2003-09-02 08:38:03 +0000
commitac9d8c58cb2286a98f699fe1b98b56e11c262868 (patch)
tree8a134e0e828e7f8c1aa63db0b8d4fea2b1c4e022 /render
parent92feea765a59a7b3ab3b3c0babda4bfd0cf91d7f (diff)
use the new color hash to cache RrColors
Diffstat (limited to 'render')
-rw-r--r--render/color.c44
-rw-r--r--render/color.h3
2 files changed, 32 insertions, 15 deletions
diff --git a/render/color.c b/render/color.c
index f791b9c4..5fdce391 100644
--- a/render/color.c
+++ b/render/color.c
@@ -1,5 +1,6 @@
#include "render.h"
#include "color.h"
+#include "instance.h"
#include <X11/Xlib.h>
#include <X11/Xutil.h>
@@ -39,17 +40,27 @@ 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;
}
@@ -59,10 +70,13 @@ RrColor *RrColorNew(const RrInstance *inst, gint r, gint g, gint b)
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);
+ }
}
}
diff --git a/render/color.h b/render/color.h
index 246af198..64529292 100644
--- a/render/color.h
+++ b/render/color.h
@@ -15,6 +15,9 @@ struct _RrColor {
int b;
unsigned long pixel;
GC gc;
+
+ gint key;
+ gint refcount;
};
void RrColorAllocateGC(RrColor *in);