Richard Parker / EALCD
Committer:
richardparker
Date:
Thu Feb 11 12:21:18 2010 +0000
Revision:
0:839ecbf5cb2a
Child:
3:24fbf4dbd7e5

        

Who changed what in which revision?

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