1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* 2ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ********************************************************************** 359d709d503bab6e2b61931737e662dd293b40578ccornelius * Copyright (C) 2003-2013, International Business Machines 4ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Corporation and others. All Rights Reserved. 5ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ********************************************************************** 6ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 7ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 8ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "layout/LETypes.h" 9ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 1059d709d503bab6e2b61931737e662dd293b40578ccornelius//#include "letest.h" 11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "FontTableCache.h" 12ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define TABLE_CACHE_INIT 5 14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#define TABLE_CACHE_GROW 5 15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustruct FontTableCacheEntry 17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 1859d709d503bab6e2b61931737e662dd293b40578ccornelius LETag tag; 1959d709d503bab6e2b61931737e662dd293b40578ccornelius const void *table; 2059d709d503bab6e2b61931737e662dd293b40578ccornelius size_t length; 21ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}; 22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruFontTableCache::FontTableCache() 24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru : fTableCacheCurr(0), fTableCacheSize(TABLE_CACHE_INIT) 25ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 2659d709d503bab6e2b61931737e662dd293b40578ccornelius fTableCache = LE_NEW_ARRAY(FontTableCacheEntry, fTableCacheSize); 27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (fTableCache == NULL) { 29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru fTableCacheSize = 0; 30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return; 31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru for (int i = 0; i < fTableCacheSize; i += 1) { 34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru fTableCache[i].tag = 0; 35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru fTableCache[i].table = NULL; 3659d709d503bab6e2b61931737e662dd293b40578ccornelius fTableCache[i].length = 0; 37ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 38ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 39ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruFontTableCache::~FontTableCache() 41ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru for (int i = fTableCacheCurr - 1; i >= 0; i -= 1) { 4359d709d503bab6e2b61931737e662dd293b40578ccornelius LE_DELETE_ARRAY(fTableCache[i].table); 44ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru fTableCache[i].tag = 0; 46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru fTableCache[i].table = NULL; 4759d709d503bab6e2b61931737e662dd293b40578ccornelius fTableCache[i].length = 0; 48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru fTableCacheCurr = 0; 51ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 5259d709d503bab6e2b61931737e662dd293b40578ccornelius LE_DELETE_ARRAY(fTableCache); 53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 54ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 5585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hovoid FontTableCache::freeFontTable(const void *table) const 5685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho{ 5759d709d503bab6e2b61931737e662dd293b40578ccornelius LE_DELETE_ARRAY(table); 5885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho} 5985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 6059d709d503bab6e2b61931737e662dd293b40578ccorneliusconst void *FontTableCache::find(LETag tableTag, size_t &length) const 61ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 62ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru for (int i = 0; i < fTableCacheCurr; i += 1) { 63ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (fTableCache[i].tag == tableTag) { 6459d709d503bab6e2b61931737e662dd293b40578ccornelius length = fTableCache[i].length; 6559d709d503bab6e2b61931737e662dd293b40578ccornelius return fTableCache[i].table; 66ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 67ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 68ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 6959d709d503bab6e2b61931737e662dd293b40578ccornelius const void *table = readFontTable(tableTag, length); 70ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 7159d709d503bab6e2b61931737e662dd293b40578ccornelius ((FontTableCache *) this)->add(tableTag, table, length); 72ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 73ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return table; 74ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 75ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 7659d709d503bab6e2b61931737e662dd293b40578ccorneliusvoid FontTableCache::add(LETag tableTag, const void *table, size_t length) 77ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 78ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (fTableCacheCurr >= fTableCacheSize) { 79ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru le_int32 newSize = fTableCacheSize + TABLE_CACHE_GROW; 80ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 8159d709d503bab6e2b61931737e662dd293b40578ccornelius fTableCache = (FontTableCacheEntry *) LE_GROW_ARRAY(fTableCache, newSize); 82ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 83ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru for (le_int32 i = fTableCacheSize; i < newSize; i += 1) { 84ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru fTableCache[i].tag = 0; 85ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru fTableCache[i].table = NULL; 8659d709d503bab6e2b61931737e662dd293b40578ccornelius fTableCache[i].length = 0; 87ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 88ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 89ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru fTableCacheSize = newSize; 90ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 91ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 92ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru fTableCache[fTableCacheCurr].tag = tableTag; 93ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru fTableCache[fTableCacheCurr].table = table; 9459d709d503bab6e2b61931737e662dd293b40578ccornelius fTableCache[fTableCacheCurr].length = length; 95ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 96ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru fTableCacheCurr += 1; 97ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 98