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 "EAFont.h"
richardparker 7:6cf21b018420 5
richardparker 7:6cf21b018420 6 #include "EAFontCache.h"
richardparker 7:6cf21b018420 7 #include "EAFontCacheEntry.h"
richardparker 7:6cf21b018420 8 #include "../screen/EALCD.h"
richardparker 7:6cf21b018420 9 #include "../images/EAImage.h"
richardparker 7:6cf21b018420 10
richardparker 7:6cf21b018420 11 EAFont::EAFont()
richardparker 7:6cf21b018420 12 : _entry(NULL)
richardparker 7:6cf21b018420 13 {
richardparker 7:6cf21b018420 14 }
richardparker 7:6cf21b018420 15
richardparker 7:6cf21b018420 16 EAFont::~EAFont()
richardparker 7:6cf21b018420 17 {
richardparker 7:6cf21b018420 18 // Return reference to characters.
richardparker 7:6cf21b018420 19 if (_entry != NULL)
richardparker 7:6cf21b018420 20 {
richardparker 7:6cf21b018420 21 EAFontCache::instance().returnCharacters(_entry);
richardparker 7:6cf21b018420 22 _entry = NULL;
richardparker 7:6cf21b018420 23 }
richardparker 7:6cf21b018420 24 }
richardparker 7:6cf21b018420 25
richardparker 7:6cf21b018420 26 EAFont::EAFont(const EAFont& font)
richardparker 7:6cf21b018420 27 {
richardparker 7:6cf21b018420 28 // Do copy like this to ensure that the references in the cache are kept up-to-date.
richardparker 7:6cf21b018420 29 if (font._entry != NULL)
richardparker 7:6cf21b018420 30 {
richardparker 7:6cf21b018420 31 _entry = EAFontCache::instance().getCharacters(font._entry->path());
richardparker 7:6cf21b018420 32 } else {
richardparker 7:6cf21b018420 33 _entry = NULL;
richardparker 7:6cf21b018420 34 }
richardparker 7:6cf21b018420 35 }
richardparker 7:6cf21b018420 36
richardparker 7:6cf21b018420 37 EAFont& EAFont::operator=(const EAFont& font)
richardparker 7:6cf21b018420 38 {
richardparker 7:6cf21b018420 39 if (&font == this)
richardparker 7:6cf21b018420 40 {
richardparker 7:6cf21b018420 41 return *this;
richardparker 7:6cf21b018420 42 }
richardparker 7:6cf21b018420 43
richardparker 7:6cf21b018420 44 // Return the current entry.
richardparker 7:6cf21b018420 45 if (_entry != NULL)
richardparker 7:6cf21b018420 46 {
richardparker 7:6cf21b018420 47 EAFontCache::instance().returnCharacters(_entry);
richardparker 7:6cf21b018420 48 _entry = NULL;
richardparker 7:6cf21b018420 49 }
richardparker 7:6cf21b018420 50
richardparker 7:6cf21b018420 51 // Do copy like this to ensure that the references in the cache are kept up-to-date.
richardparker 7:6cf21b018420 52 if (font._entry != NULL)
richardparker 7:6cf21b018420 53 {
richardparker 7:6cf21b018420 54 _entry = EAFontCache::instance().getCharacters(font._entry->path());
richardparker 7:6cf21b018420 55 } else {
richardparker 7:6cf21b018420 56 _entry = NULL;
richardparker 7:6cf21b018420 57 }
richardparker 7:6cf21b018420 58
richardparker 7:6cf21b018420 59 return *this;
richardparker 7:6cf21b018420 60 }
richardparker 7:6cf21b018420 61
richardparker 7:6cf21b018420 62
richardparker 7:6cf21b018420 63 bool EAFont::load(const std::string& path)
richardparker 7:6cf21b018420 64 {
richardparker 7:6cf21b018420 65 if (path.empty() == true)
richardparker 7:6cf21b018420 66 {
richardparker 7:6cf21b018420 67 // Invalid path passed in.
richardparker 7:6cf21b018420 68 return false;
richardparker 7:6cf21b018420 69 }
richardparker 7:6cf21b018420 70
richardparker 7:6cf21b018420 71 // Return entry if needed.
richardparker 7:6cf21b018420 72 if (_entry != NULL)
richardparker 7:6cf21b018420 73 {
richardparker 7:6cf21b018420 74 EAFontCache::instance().returnCharacters(_entry);
richardparker 7:6cf21b018420 75 _entry = NULL;
richardparker 7:6cf21b018420 76 }
richardparker 7:6cf21b018420 77
richardparker 7:6cf21b018420 78 // Load font descriptor into look up table.
richardparker 7:6cf21b018420 79 _entry = EAFontCache::instance().getCharacters(path);
richardparker 7:6cf21b018420 80
richardparker 7:6cf21b018420 81 if (_entry == NULL)
richardparker 7:6cf21b018420 82 {
richardparker 7:6cf21b018420 83 return false;
richardparker 7:6cf21b018420 84 }
richardparker 7:6cf21b018420 85
richardparker 7:6cf21b018420 86 return true;
richardparker 7:6cf21b018420 87 }
richardparker 7:6cf21b018420 88
richardparker 7:6cf21b018420 89 bool EAFont::isValid() const
richardparker 7:6cf21b018420 90 {
richardparker 7:6cf21b018420 91 return (_entry != NULL);
richardparker 7:6cf21b018420 92 }
richardparker 7:6cf21b018420 93
richardparker 7:6cf21b018420 94 bool EAFont::_getCharacter(char c, EACharacter& detail)
richardparker 7:6cf21b018420 95 {
richardparker 7:6cf21b018420 96 if (_entry == NULL)
richardparker 7:6cf21b018420 97 {
richardparker 7:6cf21b018420 98 return false;
richardparker 7:6cf21b018420 99 }
richardparker 7:6cf21b018420 100
richardparker 7:6cf21b018420 101 for (int i = 0; i < _entry->noChars(); i++)
richardparker 7:6cf21b018420 102 {
richardparker 7:6cf21b018420 103 if (_entry->chars()[i].id == c)
richardparker 7:6cf21b018420 104 {
richardparker 7:6cf21b018420 105 detail = _entry->chars()[i];
richardparker 7:6cf21b018420 106 return true;
richardparker 7:6cf21b018420 107 }
richardparker 7:6cf21b018420 108 }
richardparker 7:6cf21b018420 109
richardparker 7:6cf21b018420 110 return false;
richardparker 7:6cf21b018420 111 }
richardparker 7:6cf21b018420 112
richardparker 7:6cf21b018420 113 bool EAFont::_data(EAImage& image)
richardparker 7:6cf21b018420 114 {
richardparker 7:6cf21b018420 115 if (_entry == NULL)
richardparker 7:6cf21b018420 116 {
richardparker 7:6cf21b018420 117 return false;
richardparker 7:6cf21b018420 118 }
richardparker 7:6cf21b018420 119
richardparker 7:6cf21b018420 120 image = _entry->data();
richardparker 7:6cf21b018420 121
richardparker 7:6cf21b018420 122 return true;
richardparker 7:6cf21b018420 123 }
richardparker 7:6cf21b018420 124