Richard Parker / EALCD
Committer:
richardparker
Date:
Thu May 06 23:32:14 2010 +0000
Revision:
6:4fe6f365cbeb
Parent:
3:24fbf4dbd7e5
Added caching for the fonts which seems to give ~20x improvement in rendering at the sacrifice of RAM.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
richardparker 3:24fbf4dbd7e5 1 // Copyright 2010 Richard Parker
richardparker 3:24fbf4dbd7e5 2
richardparker 3:24fbf4dbd7e5 3 #include "mbed.h"
richardparker 3:24fbf4dbd7e5 4 #include "EAFont.h"
richardparker 3:24fbf4dbd7e5 5
richardparker 3:24fbf4dbd7e5 6 #include "../screen/EALCD.h"
richardparker 3:24fbf4dbd7e5 7
richardparker 3:24fbf4dbd7e5 8 EAFont::EAFont()
richardparker 3:24fbf4dbd7e5 9 : _path(NULL),
richardparker 3:24fbf4dbd7e5 10 _chars(NULL),
richardparker 3:24fbf4dbd7e5 11 _noChars(0)
richardparker 3:24fbf4dbd7e5 12 {
richardparker 6:4fe6f365cbeb 13 _img.setCached(true);
richardparker 6:4fe6f365cbeb 14 _img.setMask(true);
richardparker 3:24fbf4dbd7e5 15 }
richardparker 3:24fbf4dbd7e5 16
richardparker 3:24fbf4dbd7e5 17 EAFont::~EAFont()
richardparker 3:24fbf4dbd7e5 18 {
richardparker 3:24fbf4dbd7e5 19 // Remember to free up allocated memory.
richardparker 3:24fbf4dbd7e5 20 if (_chars != NULL)
richardparker 3:24fbf4dbd7e5 21 {
richardparker 3:24fbf4dbd7e5 22 delete[] _chars;
richardparker 3:24fbf4dbd7e5 23 _chars = NULL;
richardparker 3:24fbf4dbd7e5 24 }
richardparker 3:24fbf4dbd7e5 25
richardparker 3:24fbf4dbd7e5 26 if (_path != NULL)
richardparker 3:24fbf4dbd7e5 27 {
richardparker 3:24fbf4dbd7e5 28 delete[] _path;
richardparker 3:24fbf4dbd7e5 29 _path = NULL;
richardparker 3:24fbf4dbd7e5 30 }
richardparker 3:24fbf4dbd7e5 31 }
richardparker 3:24fbf4dbd7e5 32
richardparker 3:24fbf4dbd7e5 33 bool EAFont::load(const char* path)
richardparker 3:24fbf4dbd7e5 34 {
richardparker 3:24fbf4dbd7e5 35 if (path == NULL)
richardparker 3:24fbf4dbd7e5 36 {
richardparker 3:24fbf4dbd7e5 37 // Invalid path passed in.
richardparker 3:24fbf4dbd7e5 38 return false;
richardparker 3:24fbf4dbd7e5 39 }
richardparker 3:24fbf4dbd7e5 40
richardparker 3:24fbf4dbd7e5 41 // Load font descriptor into look up table.
richardparker 3:24fbf4dbd7e5 42
richardparker 3:24fbf4dbd7e5 43 // Try and open the file, check type and load width and height.
richardparker 3:24fbf4dbd7e5 44 FILE* fp = fopen(path, "r");
richardparker 3:24fbf4dbd7e5 45 if (fp == NULL)
richardparker 3:24fbf4dbd7e5 46 {
richardparker 3:24fbf4dbd7e5 47 return false;
richardparker 3:24fbf4dbd7e5 48 }
richardparker 3:24fbf4dbd7e5 49
richardparker 3:24fbf4dbd7e5 50 int noChars = 0;
richardparker 3:24fbf4dbd7e5 51
richardparker 3:24fbf4dbd7e5 52 // The first line contains the number of characters,
richardparker 3:24fbf4dbd7e5 53 if (fscanf(fp, "%d", &noChars) != 1)
richardparker 3:24fbf4dbd7e5 54 {
richardparker 3:24fbf4dbd7e5 55 fclose(fp);
richardparker 3:24fbf4dbd7e5 56 return false;
richardparker 3:24fbf4dbd7e5 57 }
richardparker 3:24fbf4dbd7e5 58
richardparker 3:24fbf4dbd7e5 59 // Store the path for later
richardparker 3:24fbf4dbd7e5 60 int pathLen = strlen(path);
richardparker 3:24fbf4dbd7e5 61
richardparker 3:24fbf4dbd7e5 62 // If already loaded an image then clear to load the new one.
richardparker 3:24fbf4dbd7e5 63 if (_path != NULL)
richardparker 3:24fbf4dbd7e5 64 {
richardparker 3:24fbf4dbd7e5 65 delete[] _path;
richardparker 3:24fbf4dbd7e5 66 _path = NULL;
richardparker 3:24fbf4dbd7e5 67 }
richardparker 3:24fbf4dbd7e5 68
richardparker 3:24fbf4dbd7e5 69 // Now allocate enough space to hold path. Note +1 for null character.
richardparker 3:24fbf4dbd7e5 70 _path = new char[pathLen+1];
richardparker 3:24fbf4dbd7e5 71
richardparker 3:24fbf4dbd7e5 72 // Now copy over passed in path to path variable.
richardparker 3:24fbf4dbd7e5 73 strcpy(_path, path);
richardparker 3:24fbf4dbd7e5 74
richardparker 3:24fbf4dbd7e5 75 // Now change extension to fnb.
richardparker 3:24fbf4dbd7e5 76 _path[pathLen-1] = 'b';
richardparker 3:24fbf4dbd7e5 77
richardparker 3:24fbf4dbd7e5 78 _noChars = noChars;
richardparker 3:24fbf4dbd7e5 79
richardparker 3:24fbf4dbd7e5 80 // Now that have the correct number of characters want to reserve enough space to hold. First
richardparker 3:24fbf4dbd7e5 81 // check that there is not already memory allocated.
richardparker 3:24fbf4dbd7e5 82 if (_chars != NULL)
richardparker 3:24fbf4dbd7e5 83 {
richardparker 3:24fbf4dbd7e5 84 delete[] _chars;
richardparker 3:24fbf4dbd7e5 85 }
richardparker 3:24fbf4dbd7e5 86
richardparker 3:24fbf4dbd7e5 87 // Now create large enough array.
richardparker 3:24fbf4dbd7e5 88 _chars = new EACharacter[noChars];
richardparker 3:24fbf4dbd7e5 89
richardparker 3:24fbf4dbd7e5 90 // Now loop through loading in the values.
richardparker 3:24fbf4dbd7e5 91 for (int i = 0; i < noChars; i++)
richardparker 3:24fbf4dbd7e5 92 {
richardparker 3:24fbf4dbd7e5 93 int v = 0;
richardparker 3:24fbf4dbd7e5 94
richardparker 3:24fbf4dbd7e5 95 // id.
richardparker 3:24fbf4dbd7e5 96 fscanf(fp, "%d", &v);
richardparker 3:24fbf4dbd7e5 97 _chars[i].id = v;
richardparker 3:24fbf4dbd7e5 98
richardparker 3:24fbf4dbd7e5 99 // x.
richardparker 3:24fbf4dbd7e5 100 fscanf(fp, "%d", &v);
richardparker 3:24fbf4dbd7e5 101 _chars[i].x = v;
richardparker 3:24fbf4dbd7e5 102
richardparker 3:24fbf4dbd7e5 103 // y.
richardparker 3:24fbf4dbd7e5 104 fscanf(fp, "%d", &v);
richardparker 3:24fbf4dbd7e5 105 _chars[i].y = v;
richardparker 3:24fbf4dbd7e5 106
richardparker 3:24fbf4dbd7e5 107 // width.
richardparker 3:24fbf4dbd7e5 108 fscanf(fp, "%d", &v);
richardparker 3:24fbf4dbd7e5 109 _chars[i].width = v;
richardparker 3:24fbf4dbd7e5 110
richardparker 3:24fbf4dbd7e5 111 // height.
richardparker 3:24fbf4dbd7e5 112 fscanf(fp, "%d", &v);
richardparker 3:24fbf4dbd7e5 113 _chars[i].height = v;
richardparker 3:24fbf4dbd7e5 114
richardparker 3:24fbf4dbd7e5 115 // xoffset.
richardparker 3:24fbf4dbd7e5 116 fscanf(fp, "%d", &v);
richardparker 3:24fbf4dbd7e5 117 _chars[i].xOffset = v;
richardparker 3:24fbf4dbd7e5 118
richardparker 3:24fbf4dbd7e5 119 // yoffset.
richardparker 3:24fbf4dbd7e5 120 fscanf(fp, "%d", &v);
richardparker 3:24fbf4dbd7e5 121 _chars[i].yOffset = v;
richardparker 3:24fbf4dbd7e5 122
richardparker 3:24fbf4dbd7e5 123 // xAdvance.
richardparker 3:24fbf4dbd7e5 124 fscanf(fp, "%d", &v);
richardparker 3:24fbf4dbd7e5 125 _chars[i].xAdvance = v;
richardparker 3:24fbf4dbd7e5 126 }
richardparker 3:24fbf4dbd7e5 127
richardparker 6:4fe6f365cbeb 128 fclose(fp);
richardparker 6:4fe6f365cbeb 129
richardparker 6:4fe6f365cbeb 130 // Now load the cached image.
richardparker 6:4fe6f365cbeb 131 _img.load(_path);
richardparker 3:24fbf4dbd7e5 132
richardparker 3:24fbf4dbd7e5 133 return true;
richardparker 3:24fbf4dbd7e5 134 }
richardparker 3:24fbf4dbd7e5 135
richardparker 6:4fe6f365cbeb 136 bool EAFont::_getCharacter(char c, EACharacter& detail)
richardparker 3:24fbf4dbd7e5 137 {
richardparker 3:24fbf4dbd7e5 138 for (int i = 0; i < _noChars; i++)
richardparker 3:24fbf4dbd7e5 139 {
richardparker 3:24fbf4dbd7e5 140 if (_chars[i].id == c)
richardparker 3:24fbf4dbd7e5 141 {
richardparker 3:24fbf4dbd7e5 142 detail = _chars[i];
richardparker 3:24fbf4dbd7e5 143 return true;
richardparker 3:24fbf4dbd7e5 144 }
richardparker 3:24fbf4dbd7e5 145 }
richardparker 3:24fbf4dbd7e5 146
richardparker 3:24fbf4dbd7e5 147 return false;
richardparker 3:24fbf4dbd7e5 148 }