Richard Parker / EALCD
Committer:
richardparker
Date:
Mon Nov 01 13:07:40 2010 +0000
Revision:
7:6cf21b018420
Embedded Artists LCD panel:- Version 0.7

Who changed what in which revision?

UserRevisionLine numberNew contents of line
richardparker 7:6cf21b018420 1 // Copyright 2010 Richard Parker
richardparker 7:6cf21b018420 2
richardparker 7:6cf21b018420 3 #include "mbed.h"
richardparker 7:6cf21b018420 4 #include "EAFontCache.h"
richardparker 7:6cf21b018420 5
richardparker 7:6cf21b018420 6 EAFontCache::EAFontCache()
richardparker 7:6cf21b018420 7 {
richardparker 7:6cf21b018420 8 }
richardparker 7:6cf21b018420 9
richardparker 7:6cf21b018420 10 EAFontCache::~EAFontCache()
richardparker 7:6cf21b018420 11 {
richardparker 7:6cf21b018420 12 // Free any memory associated with the list.
richardparker 7:6cf21b018420 13 _clearCacheEntries();
richardparker 7:6cf21b018420 14 }
richardparker 7:6cf21b018420 15
richardparker 7:6cf21b018420 16 EAFontCache& EAFontCache::instance()
richardparker 7:6cf21b018420 17 {
richardparker 7:6cf21b018420 18 // Only instantiated when getInstance() is called.
richardparker 7:6cf21b018420 19 static EAFontCache instance;
richardparker 7:6cf21b018420 20 return instance;
richardparker 7:6cf21b018420 21 }
richardparker 7:6cf21b018420 22
richardparker 7:6cf21b018420 23 void EAFontCache::_clearCacheEntries()
richardparker 7:6cf21b018420 24 {
richardparker 7:6cf21b018420 25 std::vector<EAFontCacheEntry*>::iterator it;
richardparker 7:6cf21b018420 26 it = _entries.begin();
richardparker 7:6cf21b018420 27
richardparker 7:6cf21b018420 28 while (it != _entries.end())
richardparker 7:6cf21b018420 29 {
richardparker 7:6cf21b018420 30 delete *it;
richardparker 7:6cf21b018420 31
richardparker 7:6cf21b018420 32 _entries.erase(it);
richardparker 7:6cf21b018420 33
richardparker 7:6cf21b018420 34 it = _entries.begin();
richardparker 7:6cf21b018420 35 }
richardparker 7:6cf21b018420 36 }
richardparker 7:6cf21b018420 37
richardparker 7:6cf21b018420 38 void EAFontCache::_deleteCacheEntry(EAFontCacheEntry* entry)
richardparker 7:6cf21b018420 39 {
richardparker 7:6cf21b018420 40 if (entry == NULL)
richardparker 7:6cf21b018420 41 {
richardparker 7:6cf21b018420 42 return;
richardparker 7:6cf21b018420 43 }
richardparker 7:6cf21b018420 44
richardparker 7:6cf21b018420 45 std::vector<EAFontCacheEntry*>::iterator it;
richardparker 7:6cf21b018420 46 it = _entries.begin();
richardparker 7:6cf21b018420 47
richardparker 7:6cf21b018420 48 while (it != _entries.end())
richardparker 7:6cf21b018420 49 {
richardparker 7:6cf21b018420 50 if (*it == entry)
richardparker 7:6cf21b018420 51 {
richardparker 7:6cf21b018420 52 delete *it;
richardparker 7:6cf21b018420 53
richardparker 7:6cf21b018420 54 _entries.erase(it);
richardparker 7:6cf21b018420 55
richardparker 7:6cf21b018420 56 // Can only have one.
richardparker 7:6cf21b018420 57 break;
richardparker 7:6cf21b018420 58 }
richardparker 7:6cf21b018420 59
richardparker 7:6cf21b018420 60 ++it;
richardparker 7:6cf21b018420 61 }
richardparker 7:6cf21b018420 62 }
richardparker 7:6cf21b018420 63
richardparker 7:6cf21b018420 64 EAFontCacheEntry* EAFontCache::_createCacheEntry()
richardparker 7:6cf21b018420 65 {
richardparker 7:6cf21b018420 66 EAFontCacheEntry* newEntry = new EAFontCacheEntry();
richardparker 7:6cf21b018420 67
richardparker 7:6cf21b018420 68 _entries.push_back(newEntry);
richardparker 7:6cf21b018420 69
richardparker 7:6cf21b018420 70 return newEntry;
richardparker 7:6cf21b018420 71 }
richardparker 7:6cf21b018420 72
richardparker 7:6cf21b018420 73 EAFontCacheEntry* EAFontCache::getCharacters(const std::string& path)
richardparker 7:6cf21b018420 74 {
richardparker 7:6cf21b018420 75 if (path.empty() == true)
richardparker 7:6cf21b018420 76 {
richardparker 7:6cf21b018420 77 return NULL;
richardparker 7:6cf21b018420 78 }
richardparker 7:6cf21b018420 79
richardparker 7:6cf21b018420 80 std::vector<EAFontCacheEntry*>::iterator it;
richardparker 7:6cf21b018420 81 it = _entries.begin();
richardparker 7:6cf21b018420 82
richardparker 7:6cf21b018420 83 // Try to find if we do then increment the references.
richardparker 7:6cf21b018420 84 while (it != _entries.end())
richardparker 7:6cf21b018420 85 {
richardparker 7:6cf21b018420 86 if ((*it)->path() == path)
richardparker 7:6cf21b018420 87 {
richardparker 7:6cf21b018420 88 // Match so return the value.
richardparker 7:6cf21b018420 89 (*it)->incReferences();
richardparker 7:6cf21b018420 90 break;
richardparker 7:6cf21b018420 91 }
richardparker 7:6cf21b018420 92
richardparker 7:6cf21b018420 93 ++it;
richardparker 7:6cf21b018420 94 }
richardparker 7:6cf21b018420 95
richardparker 7:6cf21b018420 96 if (it == _entries.end())
richardparker 7:6cf21b018420 97 {
richardparker 7:6cf21b018420 98 // Not found so want to make new entry.
richardparker 7:6cf21b018420 99 EAFontCacheEntry* current = _createCacheEntry();
richardparker 7:6cf21b018420 100
richardparker 7:6cf21b018420 101 if (current != NULL)
richardparker 7:6cf21b018420 102 {
richardparker 7:6cf21b018420 103 if (current->load(path) == false)
richardparker 7:6cf21b018420 104 {
richardparker 7:6cf21b018420 105 _deleteCacheEntry(current);
richardparker 7:6cf21b018420 106 return NULL;
richardparker 7:6cf21b018420 107 } else {
richardparker 7:6cf21b018420 108 // Increment the reference count.
richardparker 7:6cf21b018420 109 current->incReferences();
richardparker 7:6cf21b018420 110 return current;
richardparker 7:6cf21b018420 111 }
richardparker 7:6cf21b018420 112 } else {
richardparker 7:6cf21b018420 113 return NULL;
richardparker 7:6cf21b018420 114 }
richardparker 7:6cf21b018420 115 } else {
richardparker 7:6cf21b018420 116 return *it;
richardparker 7:6cf21b018420 117 }
richardparker 7:6cf21b018420 118 }
richardparker 7:6cf21b018420 119
richardparker 7:6cf21b018420 120 void EAFontCache::returnCharacters(EAFontCacheEntry* entry)
richardparker 7:6cf21b018420 121 {
richardparker 7:6cf21b018420 122 if (entry == NULL)
richardparker 7:6cf21b018420 123 {
richardparker 7:6cf21b018420 124 return;
richardparker 7:6cf21b018420 125 }
richardparker 7:6cf21b018420 126
richardparker 7:6cf21b018420 127 std::vector<EAFontCacheEntry*>::iterator it;
richardparker 7:6cf21b018420 128 it = _entries.begin();
richardparker 7:6cf21b018420 129
richardparker 7:6cf21b018420 130 // Try to find if we do then increment the references.
richardparker 7:6cf21b018420 131 while (it != _entries.end())
richardparker 7:6cf21b018420 132 {
richardparker 7:6cf21b018420 133 if ((*it) == entry)
richardparker 7:6cf21b018420 134 {
richardparker 7:6cf21b018420 135 // Match so decrement the references.
richardparker 7:6cf21b018420 136 entry->decReferences();
richardparker 7:6cf21b018420 137
richardparker 7:6cf21b018420 138 if (entry->references() <= 0)
richardparker 7:6cf21b018420 139 {
richardparker 7:6cf21b018420 140 _deleteCacheEntry(entry);
richardparker 7:6cf21b018420 141 }
richardparker 7:6cf21b018420 142
richardparker 7:6cf21b018420 143 break;
richardparker 7:6cf21b018420 144 }
richardparker 7:6cf21b018420 145
richardparker 7:6cf21b018420 146 ++it;
richardparker 7:6cf21b018420 147 }
richardparker 7:6cf21b018420 148 }