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