only free allocated colors

This commit is contained in:
Dana Jansens 2003-02-13 05:12:01 +00:00
parent 15f2208209
commit ea20fcc272

View file

@ -28,7 +28,8 @@ RenderColor::RenderColor(int screen, unsigned char red,
_red(red), _red(red),
_green(green), _green(green),
_blue(blue), _blue(blue),
_allocated(false) _allocated(false),
_created(false)
{ {
} }
@ -37,7 +38,8 @@ RenderColor::RenderColor(int screen, RGB rgb)
_red(rgb.r), _red(rgb.r),
_green(rgb.g), _green(rgb.g),
_blue(rgb.b), _blue(rgb.b),
_allocated(false) _allocated(false),
_created(false)
{ {
} }
@ -68,7 +70,8 @@ void RenderColor::create() const
fprintf(stderr, "RenderColor: color alloc error: rgb:%x/%x/%x\n", fprintf(stderr, "RenderColor: color alloc error: rgb:%x/%x/%x\n",
_red, _green, _blue); _red, _green, _blue);
xcol.pixel = 0; xcol.pixel = 0;
} } else
_allocated = true;
_pixel = xcol.pixel; _pixel = xcol.pixel;
gcv.foreground = _pixel; gcv.foreground = _pixel;
@ -83,18 +86,18 @@ void RenderColor::create() const
++item->count; ++item->count;
} }
_allocated = true; _created = true;
} }
unsigned long RenderColor::pixel() const unsigned long RenderColor::pixel() const
{ {
if (!_allocated) create(); if (!_created) create();
return _pixel; return _pixel;
} }
GC RenderColor::gc() const GC RenderColor::gc() const
{ {
if (!_allocated) create(); if (!_created) create();
return _gc; return _gc;
} }
@ -102,7 +105,7 @@ RenderColor::~RenderColor()
{ {
unsigned long color = _blue | _green << 8 | _red << 16; unsigned long color = _blue | _green << 8 | _red << 16;
if (_allocated) { if (_created) {
CacheItem *item = _cache[_screen][color]; CacheItem *item = _cache[_screen][color];
assert(item); // better be... assert(item); // better be...
@ -112,10 +115,12 @@ RenderColor::~RenderColor()
_cache[_screen][color] = 0; _cache[_screen][color] = 0;
delete item; delete item;
if (_allocated) {
const ScreenInfo *info = display->screenInfo(_screen); const ScreenInfo *info = display->screenInfo(_screen);
XFreeColors(**display, info->colormap(), &_pixel, 1, 0); XFreeColors(**display, info->colormap(), &_pixel, 1, 0);
} }
} }
}
} }
} }