1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
/*
* cache.c --
* Tile theme engine, resource cache.
*
* Copyright (c) 2004, Joe English
*
* $Id: cache.c,v 1.4 2004/02/18 22:16:24 jenglish Exp $
*
* The problem:
*
* Tk maintains reference counts for fonts, colors, and images,
* and deallocates them when the reference count goes to zero.
* With the theme engine, resources are allocated right before
* drawing an element and released immediately after.
|
|
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
/*
* cache.c --
* Tile theme engine, resource cache.
*
* Copyright (c) 2004, Joe English
*
* $Id: cache.c,v 1.5 2004/02/23 01:30:22 jenglish Exp $
*
* The problem:
*
* Tk maintains reference counts for fonts, colors, and images,
* and deallocates them when the reference count goes to zero.
* With the theme engine, resources are allocated right before
* drawing an element and released immediately after.
|
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
*/
#include <stdio.h> /* for sprintf */
#include <tk.h>
#include "tkTheme.h"
struct TTK_ResourceCache_ {
Tk_Window tkwin; /* Cache window. */
Tcl_HashTable fontTable; /* Entries: Tcl_Obj* holding FontObjs */
Tcl_HashTable colorTable; /* Entries: Tcl_Obj* holding ColorObjs */
Tcl_HashTable borderTable; /* Entries: Tcl_Obj* holding BorderObjs */
Tcl_HashTable imageTable; /* Entries: Tk_Images */
Tcl_HashTable namedColors; /* Entries: RGB values as Tcl_StringObjs */
};
/*
* TTK_CreateResourceCache --
* Initialize a new resource cache.
*/
TTK_ResourceCache TTK_CreateResourceCache(void)
{
TTK_ResourceCache cache = (TTK_ResourceCache)ckalloc(sizeof(*cache));
cache->tkwin = NULL; /* initialized later */
Tcl_InitHashTable(&cache->fontTable, TCL_STRING_KEYS);
Tcl_InitHashTable(&cache->colorTable, TCL_STRING_KEYS);
Tcl_InitHashTable(&cache->borderTable, TCL_STRING_KEYS);
Tcl_InitHashTable(&cache->imageTable, TCL_STRING_KEYS);
Tcl_InitHashTable(&cache->namedColors, TCL_STRING_KEYS);
return cache;
|
>
|
>
|
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
*/
#include <stdio.h> /* for sprintf */
#include <tk.h>
#include "tkTheme.h"
struct TTK_ResourceCache_ {
Tcl_Interp *interp; /* Interpreter for TTK_UseImage err reports */
Tk_Window tkwin; /* Cache window. */
Tcl_HashTable fontTable; /* Entries: Tcl_Obj* holding FontObjs */
Tcl_HashTable colorTable; /* Entries: Tcl_Obj* holding ColorObjs */
Tcl_HashTable borderTable; /* Entries: Tcl_Obj* holding BorderObjs */
Tcl_HashTable imageTable; /* Entries: Tk_Images */
Tcl_HashTable namedColors; /* Entries: RGB values as Tcl_StringObjs */
};
/*
* TTK_CreateResourceCache --
* Initialize a new resource cache.
*/
TTK_ResourceCache TTK_CreateResourceCache(Tcl_Interp *interp)
{
TTK_ResourceCache cache = (TTK_ResourceCache)ckalloc(sizeof(*cache));
cache->tkwin = NULL; /* initialized later */
cache->interp = interp;
Tcl_InitHashTable(&cache->fontTable, TCL_STRING_KEYS);
Tcl_InitHashTable(&cache->colorTable, TCL_STRING_KEYS);
Tcl_InitHashTable(&cache->borderTable, TCL_STRING_KEYS);
Tcl_InitHashTable(&cache->imageTable, TCL_STRING_KEYS);
Tcl_InitHashTable(&cache->namedColors, TCL_STRING_KEYS);
return cache;
|
325
326
327
328
329
330
331
332
333
334
335
336
337
338
|
InitCacheWindow(cache, tkwin);
if (!newEntry) {
return (Tk_Image)Tcl_GetHashValue(entryPtr);
}
image = Tk_GetImage(NULL, tkwin, imageName, 0,0);
Tcl_SetHashValue(entryPtr, image);
return image;
}
/*EOF*/
|
|
>
>
>
>
|
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
|
InitCacheWindow(cache, tkwin);
if (!newEntry) {
return (Tk_Image)Tcl_GetHashValue(entryPtr);
}
image = Tk_GetImage(cache->interp, tkwin, imageName, 0,0);
Tcl_SetHashValue(entryPtr, image);
if (!image) {
Tcl_BackgroundError(cache->interp);
}
return image;
}
/*EOF*/
|