Richard Parker / EALCD
Committer:
richardparker
Date:
Wed Mar 31 22:22:21 2010 +0000
Revision:
3:24fbf4dbd7e5
Parent:
0:839ecbf5cb2a
Child:
6:4fe6f365cbeb

        

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