From e451c08ac5a103362adbece9b8a11a16ade739c1 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Thu, 13 Feb 2003 04:50:57 +0000 Subject: [PATCH] alloc colors only when needed, and free them properly on destruction --- otk/rendercolor.cc | 38 +++++++++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 11 deletions(-) diff --git a/otk/rendercolor.cc b/otk/rendercolor.cc index 7a0b5fcc..6143a451 100644 --- a/otk/rendercolor.cc +++ b/otk/rendercolor.cc @@ -28,9 +28,8 @@ RenderColor::RenderColor(int screen, unsigned char red, _red(red), _green(green), _blue(blue), - _gc(0) + _allocated(false) { - create(); } RenderColor::RenderColor(int screen, RGB rgb) @@ -38,12 +37,11 @@ RenderColor::RenderColor(int screen, RGB rgb) _red(rgb.r), _green(rgb.g), _blue(rgb.b), - _gc(0) + _allocated(false) { - create(); } -void RenderColor::create() +void RenderColor::create() const { unsigned long color = _blue | _green << 8 | _red << 16; @@ -84,6 +82,20 @@ void RenderColor::create() _cache[_screen][color] = item; ++item->count; } + + _allocated = true; +} + +unsigned long RenderColor::pixel() const +{ + if (!_allocated) create(); + return _pixel; +} + +GC RenderColor::gc() const +{ + if (!_allocated) create(); + return _gc; } RenderColor::~RenderColor() @@ -91,13 +103,17 @@ RenderColor::~RenderColor() unsigned long color = _blue | _green << 8 | _red << 16; CacheItem *item = _cache[_screen][color]; - assert(item); // it better be in the cache ... - if (--item->count <= 0) { - // remove from the cache - XFreeGC(**display, _gc); - _cache[_screen][color] = 0; - delete item; + if (item) { + if (--item->count <= 0) { + // remove from the cache + XFreeGC(**display, _gc); + _cache[_screen][color] = 0; + delete item; + + const ScreenInfo *info = display->screenInfo(_screen); + XFreeColors(**display, info->colormap(), &_pixel, 1, 0); + } } } -- 2.39.2