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