• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  **********************************************************************
3  *   Copyright (C) 2003 - 2008, International Business Machines
4  *   Corporation and others.  All Rights Reserved.
5  **********************************************************************
6  */
7 
8 #include "layout/LETypes.h"
9 
10 #include "FontTableCache.h"
11 
12 #define TABLE_CACHE_INIT 5
13 #define TABLE_CACHE_GROW 5
14 
15 struct FontTableCacheEntry
16 {
17     LETag tag;
18     const void *table;
19 };
20 
FontTableCache()21 FontTableCache::FontTableCache()
22     : fTableCacheCurr(0), fTableCacheSize(TABLE_CACHE_INIT)
23 {
24     fTableCache = LE_NEW_ARRAY(FontTableCacheEntry, fTableCacheSize);
25 
26     if (fTableCache == NULL) {
27         fTableCacheSize = 0;
28         return;
29     }
30 
31     for (int i = 0; i < fTableCacheSize; i += 1) {
32         fTableCache[i].tag   = 0;
33         fTableCache[i].table = NULL;
34     }
35 }
36 
~FontTableCache()37 FontTableCache::~FontTableCache()
38 {
39     for (int i = fTableCacheCurr - 1; i >= 0; i -= 1) {
40         freeFontTable(fTableCache[i].table);
41 
42         fTableCache[i].tag   = 0;
43         fTableCache[i].table = NULL;
44     }
45 
46     fTableCacheCurr = 0;
47 
48     LE_DELETE_ARRAY(fTableCache);
49     fTableCache = NULL;
50 }
51 
freeFontTable(const void * table) const52 void FontTableCache::freeFontTable(const void *table) const
53 {
54     LE_DELETE_ARRAY(table);
55 }
56 
find(LETag tableTag) const57 const void *FontTableCache::find(LETag tableTag) const
58 {
59     for (int i = 0; i < fTableCacheCurr; i += 1) {
60         if (fTableCache[i].tag == tableTag) {
61             return fTableCache[i].table;
62         }
63     }
64 
65     const void *table = readFontTable(tableTag);
66 
67     ((FontTableCache *) this)->add(tableTag, table);
68 
69     return table;
70 }
71 
add(LETag tableTag,const void * table)72 void FontTableCache::add(LETag tableTag, const void *table)
73 {
74     if (fTableCacheCurr >= fTableCacheSize) {
75         le_int32 newSize = fTableCacheSize + TABLE_CACHE_GROW;
76 
77         fTableCache = (FontTableCacheEntry *) LE_GROW_ARRAY(fTableCache, newSize);
78 
79         for (le_int32 i = fTableCacheSize; i < newSize; i += 1) {
80             fTableCache[i].tag   = 0;
81             fTableCache[i].table = NULL;
82         }
83 
84         fTableCacheSize = newSize;
85     }
86 
87     fTableCache[fTableCacheCurr].tag   = tableTag;
88     fTableCache[fTableCacheCurr].table = table;
89 
90     fTableCacheCurr += 1;
91 }
92