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: RHeap* hhh = (RHeap*)Dll::Tls();
sl@0: fTableCache = (FontTableCacheEntry *)hhh->Alloc(sizeof(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: RHeap* hhh = (RHeap*)Dll::Tls();
sl@0: hhh->Free(fTableCache);
sl@0: //    delete fTableCache; //Jas 23/06/2005
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:     ((FontTableCache *) this)->add(tableTag, table);
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:         fTableCache = (FontTableCacheEntry *) LE_GROW_ARRAY(fTableCache, newSize);
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: }