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