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