OLD | NEW |
| (Empty) |
1 /* | |
2 ********************************************************************** | |
3 * Copyright (C) 2003-2013, International Business Machines | |
4 * Corporation and others. All Rights Reserved. | |
5 ********************************************************************** | |
6 */ | |
7 | |
8 #include "layout/LETypes.h" | |
9 | |
10 //#include "letest.h" | |
11 #include "FontTableCache.h" | |
12 | |
13 #define TABLE_CACHE_INIT 5 | |
14 #define TABLE_CACHE_GROW 5 | |
15 | |
16 struct FontTableCacheEntry | |
17 { | |
18 LETag tag; | |
19 const void *table; | |
20 size_t length; | |
21 }; | |
22 | |
23 FontTableCache::FontTableCache() | |
24 : fTableCacheCurr(0), fTableCacheSize(TABLE_CACHE_INIT) | |
25 { | |
26 fTableCache = LE_NEW_ARRAY(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 fTableCache[i].length = 0; | |
37 } | |
38 } | |
39 | |
40 FontTableCache::~FontTableCache() | |
41 { | |
42 for (int i = fTableCacheCurr - 1; i >= 0; i -= 1) { | |
43 LE_DELETE_ARRAY(fTableCache[i].table); | |
44 | |
45 fTableCache[i].tag = 0; | |
46 fTableCache[i].table = NULL; | |
47 fTableCache[i].length = 0; | |
48 } | |
49 | |
50 fTableCacheCurr = 0; | |
51 | |
52 LE_DELETE_ARRAY(fTableCache); | |
53 } | |
54 | |
55 void FontTableCache::freeFontTable(const void *table) const | |
56 { | |
57 LE_DELETE_ARRAY(table); | |
58 } | |
59 | |
60 const void *FontTableCache::find(LETag tableTag, size_t &length) const | |
61 { | |
62 for (int i = 0; i < fTableCacheCurr; i += 1) { | |
63 if (fTableCache[i].tag == tableTag) { | |
64 length = fTableCache[i].length; | |
65 return fTableCache[i].table; | |
66 } | |
67 } | |
68 | |
69 const void *table = readFontTable(tableTag, length); | |
70 | |
71 ((FontTableCache *) this)->add(tableTag, table, length); | |
72 | |
73 return table; | |
74 } | |
75 | |
76 void FontTableCache::add(LETag tableTag, const void *table, size_t length) | |
77 { | |
78 if (fTableCacheCurr >= fTableCacheSize) { | |
79 le_int32 newSize = fTableCacheSize + TABLE_CACHE_GROW; | |
80 | |
81 fTableCache = (FontTableCacheEntry *) LE_GROW_ARRAY(fTableCache, newSize
); | |
82 | |
83 for (le_int32 i = fTableCacheSize; i < newSize; i += 1) { | |
84 fTableCache[i].tag = 0; | |
85 fTableCache[i].table = NULL; | |
86 fTableCache[i].length = 0; | |
87 } | |
88 | |
89 fTableCacheSize = newSize; | |
90 } | |
91 | |
92 fTableCache[fTableCacheCurr].tag = tableTag; | |
93 fTableCache[fTableCacheCurr].table = table; | |
94 fTableCache[fTableCacheCurr].length = length; | |
95 | |
96 fTableCacheCurr += 1; | |
97 } | |
OLD | NEW |