1 /* 2 ********************************************************************** 3 * Copyright (C) 2003 - 2008, 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 26 if (fTableCache == NULL) { 27 fTableCacheSize = 0; 28 return; 29 } 30 31 for (int i = 0; i < fTableCacheSize; i += 1) { 32 fTableCache[i].tag = 0; 33 fTableCache[i].table = NULL; 34 } 35 } 36 37 FontTableCache::~FontTableCache() 38 { 39 for (int i = fTableCacheCurr - 1; i >= 0; i -= 1) { 40 freeFontTable(fTableCache[i].table); 41 42 fTableCache[i].tag = 0; 43 fTableCache[i].table = NULL; 44 } 45 46 fTableCacheCurr = 0; 47 48 LE_DELETE_ARRAY(fTableCache); 49 fTableCache = NULL; 50 } 51 52 void FontTableCache::freeFontTable(const void *table) const 53 { 54 LE_DELETE_ARRAY(table); 55 } 56 57 const void *FontTableCache::find(LETag tableTag) const 58 { 59 for (int i = 0; i < fTableCacheCurr; i += 1) { 60 if (fTableCache[i].tag == tableTag) { 61 return fTableCache[i].table; 62 } 63 } 64 65 const void *table = readFontTable(tableTag); 66 67 ((FontTableCache *) this)->add(tableTag, table); 68 69 return table; 70 } 71 72 void FontTableCache::add(LETag tableTag, const void *table) 73 { 74 if (fTableCacheCurr >= fTableCacheSize) { 75 le_int32 newSize = fTableCacheSize + TABLE_CACHE_GROW; 76 77 fTableCache = (FontTableCacheEntry *) LE_GROW_ARRAY(fTableCache, newSize); 78 79 for (le_int32 i = fTableCacheSize; i < newSize; i += 1) { 80 fTableCache[i].tag = 0; 81 fTableCache[i].table = NULL; 82 } 83 84 fTableCacheSize = newSize; 85 } 86 87 fTableCache[fTableCacheCurr].tag = tableTag; 88 fTableCache[fTableCacheCurr].table = table; 89 90 fTableCacheCurr += 1; 91 } 92