2002-12-21 19:54:15 +00:00
|
|
|
// -*- mode: C; indent-tabs-mode: nil; c-basic-offset: 2; -*-
|
2002-12-21 02:09:54 +00:00
|
|
|
#ifndef __gccache_h
|
|
|
|
#define __gccache_h
|
|
|
|
|
|
|
|
#include <X11/Xlib.h>
|
|
|
|
|
|
|
|
#include "display.h"
|
|
|
|
#include "color.h"
|
|
|
|
|
|
|
|
struct OtkGCCacheItem;
|
|
|
|
|
|
|
|
typedef struct OtkGCCacheContext {
|
|
|
|
GC gc;
|
|
|
|
unsigned long pixel;
|
|
|
|
unsigned long fontid;
|
|
|
|
int function;
|
|
|
|
int subwindow;
|
|
|
|
Bool used;
|
2002-12-21 12:04:15 +00:00
|
|
|
int screen;
|
2002-12-21 02:09:54 +00:00
|
|
|
int linewidth;
|
|
|
|
} OtkGCCacheContext;
|
|
|
|
|
|
|
|
OtkGCCacheContext *OtkGCCacheContext_New();
|
|
|
|
void OtkGCCacheContext_Destroy(OtkGCCacheContext *self);
|
|
|
|
|
|
|
|
void OtkGCCacheContext_Set(OtkGCCacheContext *self,
|
|
|
|
OtkColor *color, XFontStruct *font,
|
|
|
|
int function, int subwindow, int linewidth);
|
|
|
|
void OtkGCCacheContext_SetFont(OtkGCCacheContext *self,
|
|
|
|
XFontStruct *font);
|
|
|
|
|
|
|
|
|
|
|
|
typedef struct OtkGCCacheItem {
|
|
|
|
OtkGCCacheContext *ctx;
|
|
|
|
unsigned int count;
|
|
|
|
unsigned int hits;
|
|
|
|
Bool fault;
|
|
|
|
} OtkGCCacheItem;
|
|
|
|
|
|
|
|
OtkGCCacheItem *OtkGCCacheItem_New();
|
|
|
|
|
|
|
|
|
|
|
|
typedef struct OtkGCCache {
|
|
|
|
// this is closely modelled after the Qt GC cache, but with some of the
|
|
|
|
// complexity stripped out
|
|
|
|
unsigned int context_count;
|
|
|
|
unsigned int cache_size;
|
|
|
|
unsigned int cache_buckets;
|
|
|
|
unsigned int cache_total_size;
|
|
|
|
OtkGCCacheContext **contexts;
|
|
|
|
OtkGCCacheItem **cache;
|
|
|
|
} OtkGCCache;
|
|
|
|
|
2002-12-21 12:27:05 +00:00
|
|
|
void OtkGCCache_Initialize();
|
|
|
|
//void OtkGCCache_Destroy();
|
2002-12-21 02:09:54 +00:00
|
|
|
|
|
|
|
// cleans up the cache
|
|
|
|
void OtkGCCache_Purge();
|
|
|
|
|
|
|
|
OtkGCCacheItem *OtkGCCache_Find(OtkColor *color,
|
|
|
|
XFontStruct *font, int function,
|
|
|
|
int subwindow, int linewidth);
|
|
|
|
void OtkGCCache_Release(OtkGCCacheItem *item);
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
|
|
|
|
|
|
|
class BPen {
|
|
|
|
public:
|
|
|
|
inline BPen(const BColor &_color, const XFontStruct * const _font = 0,
|
|
|
|
int _linewidth = 0, int _function = GXcopy,
|
|
|
|
int _subwindow = ClipByChildren)
|
|
|
|
: color(_color), font(_font), linewidth(_linewidth), function(_function),
|
|
|
|
subwindow(_subwindow), cache(OBDisplay::gcCache()), item(0) { }
|
|
|
|
|
|
|
|
inline ~BPen(void) { if (item) cache->release(item); }
|
|
|
|
|
|
|
|
inline const GC &gc(void) const {
|
|
|
|
if (! item) item = cache->find(color, font, function, subwindow,
|
|
|
|
linewidth);
|
|
|
|
return item->gc();
|
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
|
|
|
const BColor &color;
|
|
|
|
const XFontStruct *font;
|
|
|
|
int linewidth;
|
|
|
|
int function;
|
|
|
|
int subwindow;
|
|
|
|
|
|
|
|
mutable BGCCache *cache;
|
|
|
|
mutable BGCCacheItem *item;
|
|
|
|
};
|
|
|
|
|
|
|
|
}*/
|
|
|
|
|
|
|
|
#endif // __gccache_h
|