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 16struct FontTableCacheEntry 17{ 18 LETag tag; 19 const void *table; 20 size_t length; 21}; 22 23FontTableCache::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 40FontTableCache::~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 55void FontTableCache::freeFontTable(const void *table) const 56{ 57 LE_DELETE_ARRAY(table); 58} 59 60const 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 76void 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} 98