os/textandloc/fontservices/textshaperplugin/test/letest/FontTableCache.cpp
changeset 0 bde4ae8d615e
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/os/textandloc/fontservices/textshaperplugin/test/letest/FontTableCache.cpp	Fri Jun 15 03:10:57 2012 +0200
     1.3 @@ -0,0 +1,88 @@
     1.4 +/*
     1.5 + **********************************************************************
     1.6 + *   Copyright (C) 2003, International Business Machines
     1.7 + *   Corporation and others.  All Rights Reserved.
     1.8 + **********************************************************************
     1.9 + */
    1.10 +
    1.11 +#include "layout/LETypes.h"
    1.12 +
    1.13 +#include "FontTableCache.h"
    1.14 +
    1.15 +#define TABLE_CACHE_INIT 5
    1.16 +#define TABLE_CACHE_GROW 5
    1.17 +
    1.18 +struct FontTableCacheEntry
    1.19 +{
    1.20 +    LETag tag;
    1.21 +    const void *table;
    1.22 +};
    1.23 +
    1.24 +FontTableCache::FontTableCache()
    1.25 +    : fTableCacheCurr(0), fTableCacheSize(TABLE_CACHE_INIT)
    1.26 +{
    1.27 +//    fTableCache = LE_NEW_ARRAY(FontTableCacheEntry, fTableCacheSize);
    1.28 +RHeap* hhh = (RHeap*)Dll::Tls();
    1.29 +fTableCache = (FontTableCacheEntry *)hhh->Alloc(sizeof(FontTableCacheEntry)*(fTableCacheSize));
    1.30 +
    1.31 +    if (fTableCache == NULL) {
    1.32 +        fTableCacheSize = 0;
    1.33 +        return;
    1.34 +    }
    1.35 +
    1.36 +    for (int i = 0; i < fTableCacheSize; i += 1) {
    1.37 +        fTableCache[i].tag   = 0;
    1.38 +        fTableCache[i].table = NULL;
    1.39 +    }
    1.40 +}
    1.41 +
    1.42 +FontTableCache::~FontTableCache()
    1.43 +{
    1.44 +    for (int i = fTableCacheCurr - 1; i >= 0; i -= 1) {
    1.45 +        LE_DELETE_ARRAY(fTableCache[i].table);
    1.46 +
    1.47 +        fTableCache[i].tag   = 0;
    1.48 +        fTableCache[i].table = NULL;
    1.49 +    }
    1.50 +
    1.51 +    fTableCacheCurr = 0;
    1.52 +RHeap* hhh = (RHeap*)Dll::Tls();
    1.53 +hhh->Free(fTableCache);
    1.54 +//    delete fTableCache; //Jas 23/06/2005
    1.55 +}
    1.56 +
    1.57 +const void *FontTableCache::find(LETag tableTag) const
    1.58 +{
    1.59 +    for (int i = 0; i < fTableCacheCurr; i += 1) {
    1.60 +        if (fTableCache[i].tag == tableTag) {
    1.61 +            return fTableCache[i].table;
    1.62 +        }
    1.63 +    }
    1.64 +
    1.65 +    const void *table = readFontTable(tableTag);
    1.66 +
    1.67 +    ((FontTableCache *) this)->add(tableTag, table);
    1.68 +
    1.69 +    return table;
    1.70 +}
    1.71 +
    1.72 +void FontTableCache::add(LETag tableTag, const void *table)
    1.73 +{
    1.74 +    if (fTableCacheCurr >= fTableCacheSize) {
    1.75 +        le_int32 newSize = fTableCacheSize + TABLE_CACHE_GROW;
    1.76 +
    1.77 +        fTableCache = (FontTableCacheEntry *) LE_GROW_ARRAY(fTableCache, newSize);
    1.78 +
    1.79 +        for (le_int32 i = fTableCacheSize; i < newSize; i += 1) {
    1.80 +            fTableCache[i].tag   = 0;
    1.81 +            fTableCache[i].table = NULL;
    1.82 +        }
    1.83 +
    1.84 +        fTableCacheSize = newSize;
    1.85 +    }
    1.86 +
    1.87 +    fTableCache[fTableCacheCurr].tag   = tableTag;
    1.88 +    fTableCache[fTableCacheCurr].table = table;
    1.89 +
    1.90 +    fTableCacheCurr += 1;
    1.91 +}