#include "Util.hh"
+BGCCacheContext::~BGCCacheContext(void) {
+ if (gc)
+ XFreeGC(display->getXDisplay(), gc);
+}
+
+
void BGCCacheContext::set(const BColor &_color,
const XFontStruct * const _font,
- const int _function, const int _subwindow) {
+ const int _function, const int _subwindow,
+ int _linewidth) {
XGCValues gcv;
pixel = gcv.foreground = _color.pixel();
function = gcv.function = _function;
subwindow = gcv.subwindow_mode = _subwindow;
- unsigned long mask = GCForeground | GCFunction | GCSubwindowMode;
+ linewidth = gcv.line_width = _linewidth;
+ gcv.cap_style = CapProjecting;
+
+ unsigned long mask = GCForeground | GCFunction | GCSubwindowMode |
+ GCLineWidth | GCCapStyle;
if (_font) {
fontid = gcv.font = _font->fid;
}
-BGCCache::BGCCache(const BaseDisplay * const _display)
+BGCCache::BGCCache(const BaseDisplay * const _display,
+ unsigned int screen_count)
: display(_display), context_count(128u),
- cache_size(16u), cache_buckets(8u),
+ cache_size(16u), cache_buckets(8u * screen_count),
cache_total_size(cache_size * cache_buckets) {
contexts = new BGCCacheContext*[context_count];
c->used = false;
c->screen = scr;
}
- if (! c->used && c->screen == scr) {
- c->used = true;
+ if (! c->used && c->screen == scr)
return c;
- }
}
fprintf(stderr, "BGCCache: context fault!\n");
BGCCacheItem *BGCCache::find(const BColor &_color,
const XFontStruct * const _font,
- int _function, int _subwindow) {
+ int _function, int _subwindow, int _linewidth) {
const unsigned long pixel = _color.pixel();
const unsigned int screen = _color.screen();
const int key = _color.red() ^ _color.green() ^ _color.blue();
int k = (key % cache_size) * cache_buckets;
- int i = 0; // loop variable
+ unsigned int i = 0; // loop variable
BGCCacheItem *c = cache[ k ], *prev = 0;
- // this will either loop 8 times then return/abort or it will stop matching
+ /*
+ this will either loop cache_buckets times then return/abort or
+ it will stop matching
+ */
while (c->ctx &&
(c->ctx->pixel != pixel || c->ctx->function != _function ||
- c->ctx->subwindow != _subwindow || c->ctx->screen != screen)) {
- if (i < 7) {
+ c->ctx->subwindow != _subwindow || c->ctx->screen != screen ||
+ c->ctx->linewidth != _linewidth)) {
+ if (i < (cache_buckets - 1)) {
prev = c;
c = cache[ ++k ];
++i;
}
if (c->count == 0 && c->ctx->screen == screen) {
// use this cache item
- c->ctx->set(_color, _font, _function, _subwindow);
+ c->ctx->set(_color, _font, _function, _subwindow, _linewidth);
c->ctx->used = true;
c->count = 1;
c->hits = 1;
return c;
}
// cache fault!
- fprintf(stderr, "BGCCache: cache fault\n");
+ fprintf(stderr, "BGCCache: cache fault, count: %d, screen: %d, item screen: %d\n", c->count, screen, c->ctx->screen);
abort();
}
- const unsigned long fontid = _font ? _font->fid : 0;
if (c->ctx) {
// reuse existing context
- if (fontid && fontid != c->ctx->fontid)
+ if (_font && _font->fid && _font->fid != c->ctx->fontid)
c->ctx->set(_font);
c->count++;
c->hits++;
}
} else {
c->ctx = nextContext(screen);
- c->ctx->set(_color, _font, _function, _subwindow);
+ c->ctx->set(_color, _font, _function, _subwindow, _linewidth);
c->ctx->used = true;
c->count = 1;
c->hits = 1;