os/textandloc/fontservices/textshaperplugin/source/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
sl@0
    26
    if (fTableCache == NULL) {
sl@0
    27
        fTableCacheSize = 0;
sl@0
    28
        return;
sl@0
    29
    }
sl@0
    30
sl@0
    31
    for (int i = 0; i < fTableCacheSize; i += 1) {
sl@0
    32
        fTableCache[i].tag   = 0;
sl@0
    33
        fTableCache[i].table = NULL;
sl@0
    34
    }
sl@0
    35
}
sl@0
    36
sl@0
    37
FontTableCache::~FontTableCache()
sl@0
    38
{
sl@0
    39
    for (int i = fTableCacheCurr - 1; i >= 0; i -= 1) {
sl@0
    40
        LE_DELETE_ARRAY(fTableCache[i].table);
sl@0
    41
sl@0
    42
        fTableCache[i].tag   = 0;
sl@0
    43
        fTableCache[i].table = NULL;
sl@0
    44
    }
sl@0
    45
sl@0
    46
    fTableCacheCurr = 0;
sl@0
    47
    /* Nokia defect fix for memory leak - Jas: 23/06/2005 */
sl@0
    48
	LE_DELETE_ARRAY(fTableCache);
sl@0
    49
}
sl@0
    50
sl@0
    51
const void *FontTableCache::find(LETag tableTag) const
sl@0
    52
{
sl@0
    53
    for (int i = 0; i < fTableCacheCurr; i += 1) {
sl@0
    54
        if (fTableCache[i].tag == tableTag) {
sl@0
    55
            return fTableCache[i].table;
sl@0
    56
        }
sl@0
    57
    }
sl@0
    58
sl@0
    59
    const void *table = readFontTable(tableTag);
sl@0
    60
sl@0
    61
    if (table) {
sl@0
    62
        ((FontTableCache *) this)->add(tableTag, table);
sl@0
    63
    }
sl@0
    64
sl@0
    65
    return table;
sl@0
    66
}
sl@0
    67
sl@0
    68
void FontTableCache::add(LETag tableTag, const void *table)
sl@0
    69
{
sl@0
    70
    if (fTableCacheCurr >= fTableCacheSize) {
sl@0
    71
        le_int32 newSize = fTableCacheSize + TABLE_CACHE_GROW;
sl@0
    72
sl@0
    73
        FontTableCacheEntry *newTableCache =
sl@0
    74
            (FontTableCacheEntry *) LE_GROW_ARRAY(fTableCache, newSize);
sl@0
    75
        if (!newTableCache) {
sl@0
    76
            // could not grow the cache, so we won't cache the table.
sl@0
    77
            return;
sl@0
    78
        }
sl@0
    79
        fTableCache = newTableCache;
sl@0
    80
sl@0
    81
        for (le_int32 i = fTableCacheSize; i < newSize; i += 1) {
sl@0
    82
            fTableCache[i].tag   = 0;
sl@0
    83
            fTableCache[i].table = NULL;
sl@0
    84
        }
sl@0
    85
sl@0
    86
        fTableCacheSize = newSize;
sl@0
    87
    }
sl@0
    88
sl@0
    89
    fTableCache[fTableCacheCurr].tag   = tableTag;
sl@0
    90
    fTableCache[fTableCacheCurr].table = table;
sl@0
    91
sl@0
    92
    fTableCacheCurr += 1;
sl@0
    93
}