sl@0: /* sl@0: ********************************************************************** sl@0: * Copyright (C) 2003, International Business Machines sl@0: * Corporation and others. All Rights Reserved. sl@0: ********************************************************************** sl@0: */ sl@0: sl@0: #include "layout/LETypes.h" sl@0: sl@0: #include "FontTableCache.h" sl@0: sl@0: #define TABLE_CACHE_INIT 5 sl@0: #define TABLE_CACHE_GROW 5 sl@0: sl@0: struct FontTableCacheEntry sl@0: { sl@0: LETag tag; sl@0: const void *table; sl@0: }; sl@0: sl@0: FontTableCache::FontTableCache() sl@0: : fTableCacheCurr(0), fTableCacheSize(TABLE_CACHE_INIT) sl@0: { sl@0: fTableCache = LE_NEW_ARRAY(FontTableCacheEntry, fTableCacheSize); sl@0: sl@0: if (fTableCache == NULL) { sl@0: fTableCacheSize = 0; sl@0: return; sl@0: } sl@0: sl@0: for (int i = 0; i < fTableCacheSize; i += 1) { sl@0: fTableCache[i].tag = 0; sl@0: fTableCache[i].table = NULL; sl@0: } sl@0: } sl@0: sl@0: FontTableCache::~FontTableCache() sl@0: { sl@0: for (int i = fTableCacheCurr - 1; i >= 0; i -= 1) { sl@0: LE_DELETE_ARRAY(fTableCache[i].table); sl@0: sl@0: fTableCache[i].tag = 0; sl@0: fTableCache[i].table = NULL; sl@0: } sl@0: sl@0: fTableCacheCurr = 0; sl@0: /* Nokia defect fix for memory leak - Jas: 23/06/2005 */ sl@0: LE_DELETE_ARRAY(fTableCache); sl@0: } sl@0: sl@0: const void *FontTableCache::find(LETag tableTag) const sl@0: { sl@0: for (int i = 0; i < fTableCacheCurr; i += 1) { sl@0: if (fTableCache[i].tag == tableTag) { sl@0: return fTableCache[i].table; sl@0: } sl@0: } sl@0: sl@0: const void *table = readFontTable(tableTag); sl@0: sl@0: if (table) { sl@0: ((FontTableCache *) this)->add(tableTag, table); sl@0: } sl@0: sl@0: return table; sl@0: } sl@0: sl@0: void FontTableCache::add(LETag tableTag, const void *table) sl@0: { sl@0: if (fTableCacheCurr >= fTableCacheSize) { sl@0: le_int32 newSize = fTableCacheSize + TABLE_CACHE_GROW; sl@0: sl@0: FontTableCacheEntry *newTableCache = sl@0: (FontTableCacheEntry *) LE_GROW_ARRAY(fTableCache, newSize); sl@0: if (!newTableCache) { sl@0: // could not grow the cache, so we won't cache the table. sl@0: return; sl@0: } sl@0: fTableCache = newTableCache; sl@0: sl@0: for (le_int32 i = fTableCacheSize; i < newSize; i += 1) { sl@0: fTableCache[i].tag = 0; sl@0: fTableCache[i].table = NULL; sl@0: } sl@0: sl@0: fTableCacheSize = newSize; sl@0: } sl@0: sl@0: fTableCache[fTableCacheCurr].tag = tableTag; sl@0: fTableCache[fTableCacheCurr].table = table; sl@0: sl@0: fTableCacheCurr += 1; sl@0: }