Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
graphics/EAFont.cpp@0:839ecbf5cb2a, 2010-02-11 (annotated)
- Committer:
- richardparker
- Date:
- Thu Feb 11 12:21:18 2010 +0000
- Revision:
- 0:839ecbf5cb2a
- Child:
- 3:24fbf4dbd7e5
Who changed what in which revision?
| User | Revision | Line number | New 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 | } |