os/textandloc/fontservices/textshaperplugin/test/letest/FontTableCache.cpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
sl@0
     1
/*
sl@0
     2
 **********************************************************************
sl@0
     3
 *   Copyright (C) 2003, International Business Machines
sl@0
     4
 *   Corporation and others.  All Rights Reserved.
sl@0
     5
 **********************************************************************
sl@0
     6
 */
sl@0
     7
sl@0
     8
#include "layout/LETypes.h"
sl@0
     9
sl@0
    10
#include "FontTableCache.h"
sl@0
    11
sl@0
    12
#define TABLE_CACHE_INIT 5
sl@0
    13
#define TABLE_CACHE_GROW 5
sl@0
    14
sl@0
    15
struct FontTableCacheEntry
sl@0
    16
{
sl@0
    17
    LETag tag;
sl@0
    18
    const void *table;
sl@0
    19
};
sl@0
    20
sl@0
    21
FontTableCache::FontTableCache()
sl@0
    22
    : fTableCacheCurr(0), fTableCacheSize(TABLE_CACHE_INIT)
sl@0
    23
{
sl@0
    24
//    fTableCache = LE_NEW_ARRAY(FontTableCacheEntry, fTableCacheSize);
sl@0
    25
RHeap* hhh = (RHeap*)Dll::Tls();
sl@0
    26
fTableCache = (FontTableCacheEntry *)hhh->Alloc(sizeof(FontTableCacheEntry)*(fTableCacheSize));
sl@0
    27
sl@0
    28
    if (fTableCache == NULL) {
sl@0
    29
        fTableCacheSize = 0;
sl@0
    30
        return;
sl@0
    31
    }
sl@0
    32
sl@0
    33
    for (int i = 0; i < fTableCacheSize; i += 1) {
sl@0
    34
        fTableCache[i].tag   = 0;
sl@0
    35
        fTableCache[i].table = NULL;
sl@0
    36
    }
sl@0
    37
}
sl@0
    38
sl@0
    39
FontTableCache::~FontTableCache()
sl@0
    40
{
sl@0
    41
    for (int i = fTableCacheCurr - 1; i >= 0; i -= 1) {
sl@0
    42
        LE_DELETE_ARRAY(fTableCache[i].table);
sl@0
    43
sl@0
    44
        fTableCache[i].tag   = 0;
sl@0
    45
        fTableCache[i].table = NULL;
sl@0
    46
    }
sl@0
    47
sl@0
    48
    fTableCacheCurr = 0;
sl@0
    49
RHeap* hhh = (RHeap*)Dll::Tls();
sl@0
    50
hhh->Free(fTableCache);
sl@0
    51
//    delete fTableCache; //Jas 23/06/2005
sl@0
    52
}
sl@0
    53
sl@0
    54
const void *FontTableCache::find(LETag tableTag) const
sl@0
    55
{
sl@0
    56
    for (int i = 0; i < fTableCacheCurr; i += 1) {
sl@0
    57
        if (fTableCache[i].tag == tableTag) {
sl@0
    58
            return fTableCache[i].table;
sl@0
    59
        }
sl@0
    60
    }
sl@0
    61
sl@0
    62
    const void *table = readFontTable(tableTag);
sl@0
    63
sl@0
    64
    ((FontTableCache *) this)->add(tableTag, table);
sl@0
    65
sl@0
    66
    return table;
sl@0
    67
}
sl@0
    68
sl@0
    69
void FontTableCache::add(LETag tableTag, const void *table)
sl@0
    70
{
sl@0
    71
    if (fTableCacheCurr >= fTableCacheSize) {
sl@0
    72
        le_int32 newSize = fTableCacheSize + TABLE_CACHE_GROW;
sl@0
    73
sl@0
    74
        fTableCache = (FontTableCacheEntry *) LE_GROW_ARRAY(fTableCache, newSize);
sl@0
    75
sl@0
    76
        for (le_int32 i = fTableCacheSize; i < newSize; i += 1) {
sl@0
    77
            fTableCache[i].tag   = 0;
sl@0
    78
            fTableCache[i].table = NULL;
sl@0
    79
        }
sl@0
    80
sl@0
    81
        fTableCacheSize = newSize;
sl@0
    82
    }
sl@0
    83
sl@0
    84
    fTableCache[fTableCacheCurr].tag   = tableTag;
sl@0
    85
    fTableCache[fTableCacheCurr].table = table;
sl@0
    86
sl@0
    87
    fTableCacheCurr += 1;
sl@0
    88
}