16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* 26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ********************************************************************** 36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Copyright (C) 2003 - 2008, International Business Machines 46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Corporation and others. All Rights Reserved. 56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ********************************************************************** 66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "layout/LETypes.h" 96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "FontTableCache.h" 116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define TABLE_CACHE_INIT 5 136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define TABLE_CACHE_GROW 5 146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstruct FontTableCacheEntry 166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org LETag tag; 186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const void *table; 196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgFontTableCache::FontTableCache() 226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org : fTableCacheCurr(0), fTableCacheSize(TABLE_CACHE_INIT) 236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fTableCache = LE_NEW_ARRAY(FontTableCacheEntry, fTableCacheSize); 256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (fTableCache == NULL) { 276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fTableCacheSize = 0; 286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return; 296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (int i = 0; i < fTableCacheSize; i += 1) { 326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fTableCache[i].tag = 0; 336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fTableCache[i].table = NULL; 346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgFontTableCache::~FontTableCache() 386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (int i = fTableCacheCurr - 1; i >= 0; i -= 1) { 406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org freeFontTable(fTableCache[i].table); 416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fTableCache[i].tag = 0; 436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fTableCache[i].table = NULL; 446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fTableCacheCurr = 0; 476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org LE_DELETE_ARRAY(fTableCache); 496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fTableCache = NULL; 506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid FontTableCache::freeFontTable(const void *table) const 536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org LE_DELETE_ARRAY(table); 556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgconst void *FontTableCache::find(LETag tableTag) const 586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (int i = 0; i < fTableCacheCurr; i += 1) { 606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (fTableCache[i].tag == tableTag) { 616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return fTableCache[i].table; 626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const void *table = readFontTable(tableTag); 666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ((FontTableCache *) this)->add(tableTag, table); 686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return table; 706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid FontTableCache::add(LETag tableTag, const void *table) 736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ 746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org if (fTableCacheCurr >= fTableCacheSize) { 756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org le_int32 newSize = fTableCacheSize + TABLE_CACHE_GROW; 766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fTableCache = (FontTableCacheEntry *) LE_GROW_ARRAY(fTableCache, newSize); 786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org for (le_int32 i = fTableCacheSize; i < newSize; i += 1) { 806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fTableCache[i].tag = 0; 816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fTableCache[i].table = NULL; 826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fTableCacheSize = newSize; 856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fTableCache[fTableCacheCurr].tag = tableTag; 886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fTableCache[fTableCacheCurr].table = table; 896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org fTableCacheCurr += 1; 916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org} 92