16fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org/* 26fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org ********************************************************************** 36fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org * Copyright (C) 2003-2013, International Business Machines 46fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org * Corporation and others. All Rights Reserved. 56fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org ********************************************************************** 66fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org */ 76fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 86fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org#include "layout/LETypes.h" 96fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 10d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org//#include "letest.h" 116fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org#include "FontTableCache.h" 126fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 136fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org#define TABLE_CACHE_INIT 5 1476e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org#define TABLE_CACHE_GROW 5 1593a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org 1676e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.orgstruct FontTableCacheEntry 1776e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org{ 1876e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org LETag tag; 1976e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org const void *table; 2076e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org size_t length; 21dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org}; 22dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org 2376e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.orgFontTableCache::FontTableCache() 2476e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org : fTableCacheCurr(0), fTableCacheSize(TABLE_CACHE_INIT) 25d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org{ 26d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org fTableCache = LE_NEW_ARRAY(FontTableCacheEntry, fTableCacheSize); 27d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org 286fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org if (fTableCache == NULL) { 296fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org fTableCacheSize = 0; 306fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org return; 316fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org } 326fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 336fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org for (int i = 0; i < fTableCacheSize; i += 1) { 346fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org fTableCache[i].tag = 0; 35ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org fTableCache[i].table = NULL; 36ecee051929d6ced19cf324688774acccc9ad4a0ajohannkoenig@chromium.org fTableCache[i].length = 0; 3776e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org } 38d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org} 39d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org 40d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.orgFontTableCache::~FontTableCache() 41d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org{ 42d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org for (int i = fTableCacheCurr - 1; i >= 0; i -= 1) { 43d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org LE_DELETE_ARRAY(fTableCache[i].table); 44d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org 45dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org fTableCache[i].tag = 0; 46dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org fTableCache[i].table = NULL; 47dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org fTableCache[i].length = 0; 48dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org } 49dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org 50dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org fTableCacheCurr = 0; 5176e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org 52dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org LE_DELETE_ARRAY(fTableCache); 53dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org} 54dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org 55dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.orgvoid FontTableCache::freeFontTable(const void *table) const 56dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org{ 57dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org LE_DELETE_ARRAY(table); 58dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org} 5976e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org 60dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.orgconst void *FontTableCache::find(LETag tableTag, size_t &length) const 61dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org{ 62dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org for (int i = 0; i < fTableCacheCurr; i += 1) { 63dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org if (fTableCache[i].tag == tableTag) { 64dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org length = fTableCache[i].length; 65dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org return fTableCache[i].table; 66dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org } 67dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org } 68dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org 69dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org const void *table = readFontTable(tableTag, length); 70dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org 71dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org ((FontTableCache *) this)->add(tableTag, table, length); 72dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org 73dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org return table; 74dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org} 75dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org 76dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.orgvoid FontTableCache::add(LETag tableTag, const void *table, size_t length) 77dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org{ 78dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org if (fTableCacheCurr >= fTableCacheSize) { 79dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org le_int32 newSize = fTableCacheSize + TABLE_CACHE_GROW; 80dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org 81dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org fTableCache = (FontTableCacheEntry *) LE_GROW_ARRAY(fTableCache, newSize); 82dddee1ec7cedf276305b107429f684539b105276johannkoenig@chromium.org 83d348b8d765c019ee7250075d663a83db00c65c08tomfinegan@chromium.org for (le_int32 i = fTableCacheSize; i < newSize; i += 1) { 84 fTableCache[i].tag = 0; 85 fTableCache[i].table = NULL; 86 fTableCache[i].length = 0; 87 } 88 89 fTableCacheSize = newSize; 90 } 91 92 fTableCache[fTableCacheCurr].tag = tableTag; 93 fTableCache[fTableCacheCurr].table = table; 94 fTableCache[fTableCacheCurr].length = length; 95 96 fTableCacheCurr += 1; 97} 98