17d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod/*
27d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod **********************************************************************
37d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod *   Copyright (C) 2003-2008, International Business Machines
47d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod *   Corporation and others.  All Rights Reserved.
57d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod **********************************************************************
67d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod */
77d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
87d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod#include "layout/LETypes.h"
97d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
107d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod#include "letest.h"
117d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod#include "FontTableCache.h"
127d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
137d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod#define TABLE_CACHE_INIT 5
147d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod#define TABLE_CACHE_GROW 5
157d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
167d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbodstruct FontTableCacheEntry
177d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod{
187d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    LETag tag;
19ba7f6c3797e5b440557bacd9b666bf09713dca76Behdad Esfahbod    hb_blob_t *blob;
207d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod};
217d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
227d242364ea647f655a7092bda25f9a10774c57f5Behdad EsfahbodFontTableCache::FontTableCache()
237d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    : fTableCacheCurr(0), fTableCacheSize(TABLE_CACHE_INIT)
247d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod{
257d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    fTableCache = NEW_ARRAY(FontTableCacheEntry, fTableCacheSize);
267d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
277d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    if (fTableCache == NULL) {
287d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod        fTableCacheSize = 0;
297d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod        return;
307d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    }
317d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
327d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    for (int i = 0; i < fTableCacheSize; i += 1) {
33ba7f6c3797e5b440557bacd9b666bf09713dca76Behdad Esfahbod        fTableCache[i].tag  = 0;
34ba7f6c3797e5b440557bacd9b666bf09713dca76Behdad Esfahbod        fTableCache[i].blob = NULL;
357d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    }
367d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod}
377d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
387d242364ea647f655a7092bda25f9a10774c57f5Behdad EsfahbodFontTableCache::~FontTableCache()
397d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod{
407d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    for (int i = fTableCacheCurr - 1; i >= 0; i -= 1) {
41ba7f6c3797e5b440557bacd9b666bf09713dca76Behdad Esfahbod        hb_blob_destroy(fTableCache[i].blob);
427d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
43ba7f6c3797e5b440557bacd9b666bf09713dca76Behdad Esfahbod        fTableCache[i].tag  = 0;
44ba7f6c3797e5b440557bacd9b666bf09713dca76Behdad Esfahbod        fTableCache[i].blob = NULL;
457d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    }
467d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
477d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    fTableCacheCurr = 0;
487d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
497d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    DELETE_ARRAY(fTableCache);
507d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod}
517d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
52ba7f6c3797e5b440557bacd9b666bf09713dca76Behdad Esfahbodvoid FontTableCache::freeFontTable(hb_blob_t *blob) const
537d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod{
54ba7f6c3797e5b440557bacd9b666bf09713dca76Behdad Esfahbod    hb_blob_destroy(blob);
557d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod}
567d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
577d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbodconst void *FontTableCache::find(LETag tableTag) const
587d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod{
597d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    for (int i = 0; i < fTableCacheCurr; i += 1) {
607d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod        if (fTableCache[i].tag == tableTag) {
61ba7f6c3797e5b440557bacd9b666bf09713dca76Behdad Esfahbod            return hb_blob_get_data(fTableCache[i].blob, NULL);
627d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod        }
637d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    }
647d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
65ba7f6c3797e5b440557bacd9b666bf09713dca76Behdad Esfahbod    hb_blob_t *blob = readFontTable(tableTag);
667d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
67ba7f6c3797e5b440557bacd9b666bf09713dca76Behdad Esfahbod    ((FontTableCache *) this)->add(tableTag, blob);
687d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
69ba7f6c3797e5b440557bacd9b666bf09713dca76Behdad Esfahbod    return hb_blob_get_data (blob, NULL);
707d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod}
717d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
72ba7f6c3797e5b440557bacd9b666bf09713dca76Behdad Esfahbodvoid FontTableCache::add(LETag tableTag, hb_blob_t *blob)
737d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod{
747d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    if (fTableCacheCurr >= fTableCacheSize) {
757d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod        le_int32 newSize = fTableCacheSize + TABLE_CACHE_GROW;
767d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
777d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod        fTableCache = (FontTableCacheEntry *) GROW_ARRAY(fTableCache, newSize);
787d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
797d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod        for (le_int32 i = fTableCacheSize; i < newSize; i += 1) {
80ba7f6c3797e5b440557bacd9b666bf09713dca76Behdad Esfahbod            fTableCache[i].tag  = 0;
81ba7f6c3797e5b440557bacd9b666bf09713dca76Behdad Esfahbod            fTableCache[i].blob = NULL;
827d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod        }
837d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
847d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod        fTableCacheSize = newSize;
857d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    }
867d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
87ba7f6c3797e5b440557bacd9b666bf09713dca76Behdad Esfahbod    fTableCache[fTableCacheCurr].tag  = tableTag;
88ba7f6c3797e5b440557bacd9b666bf09713dca76Behdad Esfahbod    fTableCache[fTableCacheCurr].blob = blob;
897d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod
907d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod    fTableCacheCurr += 1;
917d242364ea647f655a7092bda25f9a10774c57f5Behdad Esfahbod}
92