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 15struct FontTableCacheEntry 16{ 17 LETag tag; 18 const void *table; 19}; 20 21FontTableCache::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 37FontTableCache::~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 52void FontTableCache::freeFontTable(const void *table) const 53{ 54 LE_DELETE_ARRAY(table); 55} 56 57const 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 72void 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