- xcol.red = (r << 8) | r;
- xcol.green = (g << 8) | g;
- xcol.blue = (b << 8) | b;
- if (XAllocColor(ob_display, render_colormap, &xcol)) {
- out = g_new(color_rgb, 1);
- out->r = xcol.red >> 8;
- out->g = xcol.green >> 8;
- out->b = xcol.blue >> 8;
- out->gc = None;
- out->pixel = xcol.pixel;
- return out;
+ 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);
+ }