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@6:4fe6f365cbeb, 2010-05-06 (annotated)
- 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?
| User | Revision | Line number | New 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 | } |