|
1 /* |
|
2 ********************************************************************** |
|
3 * Copyright (C) 2003, International Business Machines |
|
4 * Corporation and others. All Rights Reserved. |
|
5 ********************************************************************** |
|
6 */ |
|
7 |
|
8 #include "layout/LETypes.h" |
|
9 |
|
10 #include "FontTableCache.h" |
|
11 |
|
12 #define TABLE_CACHE_INIT 5 |
|
13 #define TABLE_CACHE_GROW 5 |
|
14 |
|
15 struct FontTableCacheEntry |
|
16 { |
|
17 LETag tag; |
|
18 const void *table; |
|
19 }; |
|
20 |
|
21 FontTableCache::FontTableCache() |
|
22 : fTableCacheCurr(0), fTableCacheSize(TABLE_CACHE_INIT) |
|
23 { |
|
24 // fTableCache = LE_NEW_ARRAY(FontTableCacheEntry, fTableCacheSize); |
|
25 RHeap* hhh = (RHeap*)Dll::Tls(); |
|
26 fTableCache = (FontTableCacheEntry *)hhh->Alloc(sizeof(FontTableCacheEntry)*(fTableCacheSize)); |
|
27 |
|
28 if (fTableCache == NULL) { |
|
29 fTableCacheSize = 0; |
|
30 return; |
|
31 } |
|
32 |
|
33 for (int i = 0; i < fTableCacheSize; i += 1) { |
|
34 fTableCache[i].tag = 0; |
|
35 fTableCache[i].table = NULL; |
|
36 } |
|
37 } |
|
38 |
|
39 FontTableCache::~FontTableCache() |
|
40 { |
|
41 for (int i = fTableCacheCurr - 1; i >= 0; i -= 1) { |
|
42 LE_DELETE_ARRAY(fTableCache[i].table); |
|
43 |
|
44 fTableCache[i].tag = 0; |
|
45 fTableCache[i].table = NULL; |
|
46 } |
|
47 |
|
48 fTableCacheCurr = 0; |
|
49 RHeap* hhh = (RHeap*)Dll::Tls(); |
|
50 hhh->Free(fTableCache); |
|
51 // delete fTableCache; //Jas 23/06/2005 |
|
52 } |
|
53 |
|
54 const void *FontTableCache::find(LETag tableTag) const |
|
55 { |
|
56 for (int i = 0; i < fTableCacheCurr; i += 1) { |
|
57 if (fTableCache[i].tag == tableTag) { |
|
58 return fTableCache[i].table; |
|
59 } |
|
60 } |
|
61 |
|
62 const void *table = readFontTable(tableTag); |
|
63 |
|
64 ((FontTableCache *) this)->add(tableTag, table); |
|
65 |
|
66 return table; |
|
67 } |
|
68 |
|
69 void FontTableCache::add(LETag tableTag, const void *table) |
|
70 { |
|
71 if (fTableCacheCurr >= fTableCacheSize) { |
|
72 le_int32 newSize = fTableCacheSize + TABLE_CACHE_GROW; |
|
73 |
|
74 fTableCache = (FontTableCacheEntry *) LE_GROW_ARRAY(fTableCache, newSize); |
|
75 |
|
76 for (le_int32 i = fTableCacheSize; i < newSize; i += 1) { |
|
77 fTableCache[i].tag = 0; |
|
78 fTableCache[i].table = NULL; |
|
79 } |
|
80 |
|
81 fTableCacheSize = newSize; |
|
82 } |
|
83 |
|
84 fTableCache[fTableCacheCurr].tag = tableTag; |
|
85 fTableCache[fTableCacheCurr].table = table; |
|
86 |
|
87 fTableCacheCurr += 1; |
|
88 } |