4
* Copyright (C) 2011 Tim Marston <tim@ed.am> and Dan Marston.
6
* This file is part of propeller-clock (hereafter referred to as "this
7
* program"). See http://ed.am/dev/software/arduino/propeller-clock for more
10
* This program is free software: you can redistribute it and/or modify
11
* it under the terms of the GNU Lesser General Public License as published
12
* by the Free Software Foundation, either version 3 of the License, or
13
* (at your option) any later version.
15
* This program is distributed in the hope that it will be useful,
16
* but WITHOUT ANY WARRANTY; without even the implied warranty of
17
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18
* GNU Lesser General Public License for more details.
20
* You should have received a copy of the GNU Lesser General Public License
21
* along with this program. If not, see <http://www.gnu.org/licenses/>.
23
#include "text_renderer.h"
26
#include <avr/pgmspace.h>
31
static char _glyph_cache[ 8 ];
33
// the character the current cached glyph is for
34
static char _glyph_cache_char;
40
static unsigned char _output_buffer;
44
void cache_glyph( char c )
46
static char fonts[][ 66 * 8 ] PROGMEM = {
48
0x00, 0x7c, 0x7e, 0x12, 0x12, 0x12, 0x7e, 0x7c, // A
49
0x00, 0x7e, 0x7e, 0x4a, 0x4a, 0x4a, 0x7e, 0x34, // B
50
0x00, 0x3c, 0x7e, 0x42, 0x42, 0x42, 0x66, 0x24, // C
51
0x00, 0x7e, 0x7e, 0x42, 0x42, 0x66, 0x3c, 0x18, // D
52
0x00, 0x7e, 0x7e, 0x4a, 0x4a, 0x4a, 0x42, 0x00, // E
53
0x00, 0x7e, 0x7e, 0x0a, 0x0a, 0x0a, 0x02, 0x00, // F
54
0x00, 0x3c, 0x7e, 0x42, 0x52, 0x52, 0x76, 0x34, // G
55
0x00, 0x7e, 0x7e, 0x08, 0x08, 0x08, 0x7e, 0x7e, // H
56
0x00, 0x42, 0x42, 0x7e, 0x7e, 0x42, 0x42, 0x00, // I
57
0x00, 0x30, 0x70, 0x40, 0x40, 0x40, 0x7e, 0x3e, // J
58
0x00, 0x7e, 0x7e, 0x08, 0x1c, 0x36, 0x62, 0x40, // K
59
0x00, 0x7e, 0x7e, 0x40, 0x40, 0x40, 0x40, 0x00, // L
60
0x00, 0x7e, 0x7e, 0x0c, 0x18, 0x0c, 0x7e, 0x7e, // M
61
0x00, 0x7e, 0x7e, 0x0c, 0x18, 0x30, 0x7e, 0x7e, // N
62
0x00, 0x3c, 0x7e, 0x42, 0x42, 0x42, 0x7e, 0x3c, // O
63
0x00, 0x7e, 0x7e, 0x12, 0x12, 0x12, 0x1e, 0x0c, // P
64
0x00, 0x3c, 0x7e, 0x52, 0x52, 0x62, 0x7e, 0x3c, // Q
65
0x00, 0x7e, 0x7e, 0x12, 0x12, 0x32, 0x7e, 0x4c, // R
66
0x00, 0x24, 0x6e, 0x4a, 0x4a, 0x4a, 0x7a, 0x30, // S
67
0x00, 0x02, 0x02, 0x7e, 0x7e, 0x02, 0x02, 0x00, // T
68
0x00, 0x3e, 0x7e, 0x40, 0x40, 0x40, 0x7e, 0x3e, // U
69
0x00, 0x1e, 0x3e, 0x60, 0x40, 0x60, 0x3e, 0x1e, // V
70
0x00, 0x3e, 0x7e, 0x60, 0x30, 0x60, 0x7e, 0x3e, // W
71
0x00, 0x42, 0x66, 0x3c, 0x18, 0x3c, 0x66, 0x42, // X
72
0x02, 0x06, 0x0c, 0x78, 0x78, 0x0c, 0x06, 0x02, // Y
73
0x00, 0x42, 0x62, 0x72, 0x5a, 0x4e, 0x46, 0x42, // Z
74
0x00, 0x20, 0x74, 0x54, 0x54, 0x7c, 0x78, 0x00, // a
75
0x00, 0x00, 0x7e, 0x7e, 0x48, 0x48, 0x78, 0x30, // b
76
0x00, 0x00, 0x38, 0x7c, 0x44, 0x44, 0x00, 0x00, // c
77
0x00, 0x30, 0x78, 0x48, 0x48, 0x7e, 0x7e, 0x00, // d
78
0x00, 0x38, 0x7c, 0x54, 0x54, 0x5c, 0x08, 0x00, // e
79
0x00, 0x00, 0x7c, 0x7e, 0x0a, 0x02, 0x00, 0x00, // f
80
0x00, 0x18, 0xbc, 0xa4, 0xa4, 0xfc, 0x7c, 0x00, // g
81
0x00, 0x7e, 0x7e, 0x08, 0x08, 0x78, 0x70, 0x00, // h
82
0x00, 0x00, 0x48, 0x7a, 0x7a, 0x40, 0x00, 0x00, // i
83
0x00, 0x00, 0x40, 0xc0, 0x80, 0xfa, 0x7a, 0x00, // j
84
0x00, 0x00, 0x7e, 0x7e, 0x10, 0x3c, 0x64, 0x40, // k
85
0x00, 0x00, 0x00, 0x3e, 0x7e, 0x40, 0x40, 0x00, // l
86
0x7c, 0x7c, 0x04, 0x78, 0x7c, 0x04, 0x7c, 0x78, // m
87
0x00, 0x7c, 0x7c, 0x04, 0x04, 0x7c, 0x78, 0x00, // n
88
0x00, 0x38, 0x7c, 0x44, 0x44, 0x7c, 0x38, 0x00, // o
89
0x00, 0xfc, 0xfc, 0x24, 0x24, 0x3c, 0x18, 0x00, // p
90
0x00, 0x18, 0x3c, 0x24, 0x24, 0xfc, 0xfc, 0x80, // q
91
0x00, 0x00, 0x78, 0x7c, 0x04, 0x04, 0x00, 0x00, // r
92
0x00, 0x48, 0x5c, 0x54, 0x54, 0x74, 0x20, 0x00, // s
93
0x00, 0x04, 0x3e, 0x7e, 0x44, 0x44, 0x00, 0x00, // t
94
0x00, 0x3c, 0x7c, 0x40, 0x40, 0x7c, 0x3c, 0x00, // u
95
0x00, 0x0c, 0x3c, 0x70, 0x60, 0x3c, 0x0c, 0x00, // v
96
0x3c, 0x7c, 0x40, 0x30, 0x40, 0x7c, 0x3c, 0x00, // w
97
0x00, 0x44, 0x6c, 0x38, 0x38, 0x6c, 0x44, 0x00, // x
98
0x00, 0x1c, 0xbc, 0xa0, 0xa0, 0xfc, 0x7c, 0x00, // y
99
0x00, 0x44, 0x64, 0x74, 0x5c, 0x4c, 0x44, 0x00, // z
100
0x00, 0x3c, 0x7e, 0x52, 0x4a, 0x46, 0x7e, 0x3c, // 0
101
0x00, 0x00, 0x44, 0x44, 0x7e, 0x7e, 0x40, 0x40, // 1
102
0x00, 0x64, 0x76, 0x52, 0x52, 0x52, 0x5e, 0x4c, // 2
103
0x00, 0x24, 0x66, 0x42, 0x4a, 0x4a, 0x7e, 0x34, // 3
104
0x00, 0x30, 0x28, 0x24, 0x7e, 0x7e, 0x20, 0x20, // 4
105
0x00, 0x2e, 0x6e, 0x4a, 0x4a, 0x4a, 0x7a, 0x32, // 5
106
0x00, 0x3c, 0x7e, 0x4a, 0x4a, 0x4a, 0x7a, 0x30, // 6
107
0x00, 0x02, 0x02, 0x62, 0x72, 0x1a, 0x0e, 0x06, // 7
108
0x00, 0x34, 0x7e, 0x4a, 0x4a, 0x4a, 0x7e, 0x34, // 8
109
0x00, 0x0c, 0x5e, 0x52, 0x52, 0x52, 0x7e, 0x3c, // 9
110
0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, // -
111
0x00, 0x00, 0x00, 0x6c, 0x6c, 0x00, 0x00, 0x00, // :
112
0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, // .
113
0x00, 0x00, 0x00, 0x80, 0xe0, 0x60, 0x00, 0x00, // ,
115
0x00, 0x7f, 0x7f, 0x09, 0x09, 0x09, 0x7f, 0x7f, // A
116
0x00, 0x7f, 0x7f, 0x49, 0x49, 0x49, 0x7f, 0x77, // B
117
0x00, 0x7f, 0x7f, 0x41, 0x41, 0x41, 0x77, 0x77, // C
118
0x00, 0x7f, 0x7f, 0x41, 0x41, 0x41, 0x7f, 0x3e, // D
119
0x00, 0x7f, 0x7f, 0x49, 0x49, 0x49, 0x63, 0x63, // E
120
0x00, 0x7f, 0x7f, 0x09, 0x09, 0x09, 0x03, 0x03, // F
121
0x00, 0x7f, 0x7f, 0x41, 0x49, 0x49, 0x7b, 0x7b, // G
122
0x00, 0x7f, 0x7f, 0x08, 0x08, 0x08, 0x7f, 0x7f, // H
123
0x00, 0x41, 0x41, 0x7f, 0x7f, 0x41, 0x41, 0x00, // I
124
0x00, 0x60, 0x60, 0x40, 0x40, 0x40, 0x7f, 0x7f, // J
125
0x00, 0x7f, 0x7f, 0x08, 0x08, 0x08, 0x7f, 0x77, // K
126
0x00, 0x7f, 0x7f, 0x40, 0x40, 0x40, 0x60, 0x60, // L
127
0x00, 0x7f, 0x7f, 0x02, 0x04, 0x02, 0x7f, 0x7f, // M
128
0x00, 0x7f, 0x7f, 0x06, 0x0c, 0x18, 0x7f, 0x7f, // N
129
0x00, 0x7f, 0x7f, 0x41, 0x41, 0x41, 0x7f, 0x7f, // O
130
0x00, 0x7f, 0x7f, 0x09, 0x09, 0x09, 0x0f, 0x0f, // P
131
0x00, 0x7f, 0x7f, 0x41, 0x51, 0x21, 0x7f, 0x7f, // Q
132
0x00, 0x7f, 0x7f, 0x09, 0x09, 0x09, 0x7f, 0x77, // R
133
0x00, 0x6f, 0x6f, 0x49, 0x49, 0x49, 0x7b, 0x7b, // S
134
0x00, 0x01, 0x01, 0x7f, 0x7f, 0x01, 0x01, 0x00, // T
135
0x00, 0x7f, 0x7f, 0x40, 0x40, 0x40, 0x7f, 0x7f, // U
136
0x00, 0x1f, 0x3f, 0x60, 0x40, 0x60, 0x3f, 0x1f, // V
137
0x00, 0x7f, 0x7f, 0x20, 0x10, 0x20, 0x7f, 0x7f, // W
138
0x00, 0x77, 0x7f, 0x08, 0x08, 0x08, 0x7f, 0x77, // X
139
0x00, 0x6f, 0x6f, 0x48, 0x48, 0x48, 0x7f, 0x7f, // Y
140
0x00, 0x63, 0x73, 0x59, 0x4d, 0x47, 0x63, 0x61, // Z
141
0x00, 0x74, 0x74, 0x54, 0x54, 0x7c, 0x7c, 0x00, // a
142
0x00, 0x7f, 0x7f, 0x44, 0x44, 0x7c, 0x7c, 0x00, // b
143
0x00, 0x7c, 0x7c, 0x44, 0x44, 0x6c, 0x6c, 0x00, // c
144
0x00, 0x7c, 0x7c, 0x44, 0x44, 0x7f, 0x7f, 0x00, // d
145
0x00, 0x7c, 0x7c, 0x54, 0x54, 0x5c, 0x5c, 0x00, // e
146
0x00, 0x00, 0x04, 0x7f, 0x7f, 0x05, 0x05, 0x01, // f
147
0x00, 0xbc, 0xbc, 0xa4, 0xa4, 0xfc, 0xfc, 0x00, // g
148
0x00, 0x7f, 0x7f, 0x04, 0x04, 0x7c, 0x7c, 0x00, // h
149
0x00, 0x44, 0x44, 0x7d, 0x7d, 0x40, 0x40, 0x00, // i
150
0x00, 0x80, 0x80, 0xfd, 0xfd, 0x00, 0x00, 0x00, // j
151
0x00, 0x7f, 0x7f, 0x10, 0x10, 0x7c, 0x6c, 0x00, // k
152
0x00, 0x00, 0x00, 0x7f, 0x7f, 0x40, 0x40, 0x00, // l
153
0x00, 0x7c, 0x7c, 0x04, 0x7c, 0x04, 0x7c, 0x7c, // m
154
0x00, 0x7c, 0x7c, 0x04, 0x04, 0x7c, 0x7c, 0x00, // n
155
0x00, 0x7c, 0x7c, 0x44, 0x44, 0x7c, 0x7c, 0x00, // o
156
0x00, 0xfc, 0xfc, 0x24, 0x24, 0x3c, 0x3c, 0x00, // p
157
0x00, 0x3c, 0x3c, 0x24, 0x24, 0xfc, 0xfc, 0x00, // q
158
0x00, 0x7c, 0x7c, 0x04, 0x04, 0x0c, 0x0c, 0x00, // r
159
0x00, 0x5c, 0x5c, 0x54, 0x54, 0x74, 0x74, 0x00, // s
160
0x00, 0x00, 0x04, 0x7f, 0x7f, 0x44, 0x44, 0x00, // t
161
0x00, 0x7c, 0x7c, 0x40, 0x40, 0x7c, 0x7c, 0x00, // u
162
0x00, 0x1c, 0x3c, 0x60, 0x60, 0x3c, 0x1c, 0x00, // v
163
0x00, 0x7c, 0x7c, 0x40, 0x7c, 0x40, 0x7c, 0x7c, // w
164
0x00, 0x6c, 0x7c, 0x10, 0x10, 0x7c, 0x6c, 0x00, // x
165
0x00, 0xbc, 0xbc, 0xa0, 0xa0, 0xfc, 0xfc, 0x00, // y
166
0x00, 0x64, 0x74, 0x54, 0x54, 0x5c, 0x4c, 0x00, // z
167
0x00, 0x7f, 0x7f, 0x51, 0x49, 0x45, 0x7f, 0x7f, // 0
168
0x00, 0x41, 0x41, 0x7f, 0x7f, 0x40, 0x40, 0x00, // 1
169
0x00, 0x7b, 0x7b, 0x49, 0x49, 0x49, 0x4f, 0x4f, // 2
170
0x00, 0x63, 0x63, 0x49, 0x49, 0x49, 0x7f, 0x7f, // 3
171
0x00, 0x1f, 0x1f, 0x10, 0x10, 0x7f, 0x7f, 0x10, // 4
172
0x00, 0x6f, 0x6f, 0x49, 0x49, 0x49, 0x79, 0x79, // 5
173
0x00, 0x7f, 0x7f, 0x49, 0x49, 0x49, 0x7b, 0x7b, // 6
174
0x00, 0x03, 0x03, 0x71, 0x79, 0x0d, 0x07, 0x03, // 7
175
0x00, 0x7f, 0x7f, 0x49, 0x49, 0x49, 0x7f, 0x7f, // 8
176
0x00, 0x6f, 0x6f, 0x49, 0x49, 0x49, 0x7f, 0x7f, // 9
177
0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, // -
178
0x00, 0x00, 0x00, 0x66, 0x66, 0x00, 0x00, 0x00, // :
179
0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, // .
180
0x00, 0x00, 0x80, 0xe0, 0x60, 0x00, 0x00, 0x00, // ,
182
0x7c, 0x7e, 0x22, 0x7e, 0x7e, 0x7e, 0x7c, 0x00, // A
183
0x7c, 0x7e, 0x7e, 0x7e, 0x4a, 0x7e, 0x34, 0x00, // B
184
0x3c, 0x7e, 0x7e, 0x7e, 0x42, 0x76, 0x34, 0x00, // C
185
0x7c, 0x7e, 0x7e, 0x7e, 0x42, 0x7e, 0x3c, 0x00, // D
186
0x3c, 0x7e, 0x7e, 0x7e, 0x4a, 0x4a, 0x00, 0x00, // E
187
0x7c, 0x7e, 0x7e, 0x7e, 0x12, 0x12, 0x00, 0x00, // F
188
0x3c, 0x7e, 0x7e, 0x7e, 0x52, 0x76, 0x34, 0x00, // G
189
0x7e, 0x7e, 0x7e, 0x7e, 0x08, 0x7e, 0x7e, 0x00, // H
190
0x00, 0x42, 0x7e, 0x7e, 0x7e, 0x7e, 0x42, 0x00, // I
191
0x30, 0x70, 0x42, 0x7e, 0x7e, 0x7e, 0x3e, 0x00, // J
192
0x7e, 0x7e, 0x7e, 0x7e, 0x08, 0x76, 0x62, 0x00, // K
193
0x00, 0x3e, 0x7e, 0x7e, 0x7e, 0x40, 0x40, 0x00, // L
194
0x7e, 0x7e, 0x7e, 0x7c, 0x08, 0x7c, 0x7e, 0x00, // M
195
0x7e, 0x7e, 0x7e, 0x7c, 0x08, 0x7e, 0x7e, 0x00, // N
196
0x3c, 0x7e, 0x7e, 0x7e, 0x42, 0x7e, 0x3c, 0x00, // O
197
0x7c, 0x7e, 0x7e, 0x7e, 0x12, 0x1e, 0x0c, 0x00, // P
198
0x3c, 0x7e, 0x7e, 0x7e, 0x42, 0xfe, 0xbc, 0x00, // Q
199
0x7c, 0x7e, 0x7e, 0x7e, 0x12, 0x7e, 0x6c, 0x00, // R
200
0x24, 0x6e, 0x5e, 0x7e, 0x7a, 0x76, 0x24, 0x00, // S
201
0x00, 0x02, 0x7e, 0x7e, 0x7e, 0x7e, 0x02, 0x00, // T
202
0x3e, 0x7e, 0x7e, 0x7e, 0x40, 0x7e, 0x3e, 0x00, // U
203
0x1e, 0x3e, 0x7e, 0x7e, 0x40, 0x3e, 0x1e, 0x00, // V
204
0x3e, 0x7e, 0x7e, 0x7e, 0x20, 0x7e, 0x3e, 0x00, // W
205
0x42, 0x66, 0x3e, 0x7e, 0x7c, 0x66, 0x42, 0x00, // X
206
0x06, 0x0e, 0x7e, 0x7e, 0x70, 0x0e, 0x06, 0x00, // Y
207
0x62, 0x72, 0x7a, 0x7e, 0x5e, 0x4e, 0x46, 0x00, // Z
208
0x38, 0x7c, 0x44, 0x3c, 0x7c, 0x7c, 0x78, 0x00, // a
209
0x3f, 0x7f, 0x7f, 0x7f, 0x44, 0x7c, 0x38, 0x00, // b
210
0x38, 0x7c, 0x7c, 0x7c, 0x44, 0x6c, 0x28, 0x00, // c
211
0x38, 0x7c, 0x44, 0x3f, 0x7f, 0x7f, 0x7f, 0x00, // d
212
0x38, 0x7c, 0x7c, 0x7c, 0x54, 0x5c, 0x28, 0x00, // e
213
0x88, 0xfe, 0xff, 0xff, 0x7f, 0x09, 0x0a, 0x00, // f
214
0x58, 0xbc, 0xa4, 0xfc, 0xfc, 0xfc, 0x78, 0x00, // g
215
0x7f, 0x7f, 0x7f, 0x7f, 0x04, 0x7c, 0x78, 0x00, // h
216
0x00, 0x00, 0x7a, 0x7f, 0x7f, 0x7a, 0x00, 0x00, // i
217
0x00, 0x80, 0xfa, 0xff, 0xff, 0x7a, 0x00, 0x00, // j
218
0x7f, 0x7f, 0x7f, 0x7f, 0x24, 0x7c, 0x58, 0x00, // k
219
0x00, 0x00, 0x3f, 0x7f, 0x7f, 0x7f, 0x40, 0x00, // l
220
0x78, 0x7c, 0x7c, 0x04, 0x7c, 0x04, 0x7c, 0x78, // m
221
0x7c, 0x7c, 0x7c, 0x78, 0x04, 0x7c, 0x78, 0x00, // n
222
0x38, 0x7c, 0x7c, 0x7c, 0x44, 0x7c, 0x38, 0x00, // o
223
0xfc, 0xfc, 0xfc, 0xf8, 0x44, 0x7c, 0x38, 0x00, // p
224
0x38, 0x7c, 0x44, 0xfc, 0xfc, 0xfc, 0xf8, 0x00, // q
225
0x7c, 0x7c, 0x7c, 0x7c, 0x04, 0x0c, 0x08, 0x00, // r
226
0x28, 0x5c, 0x5c, 0x7c, 0x74, 0x74, 0x28, 0x00, // s
227
0x04, 0x3e, 0x7e, 0x7e, 0x7e, 0x44, 0x24, 0x00, // t
228
0x3c, 0x7c, 0x40, 0x3c, 0x7c, 0x7c, 0x7c, 0x00, // u
229
0x1c, 0x3c, 0x7c, 0x7c, 0x60, 0x3c, 0x1c, 0x00, // v
230
0x3c, 0x7c, 0x7c, 0x40, 0x7c, 0x40, 0x7c, 0x3c, // w
231
0x44, 0x6c, 0x3c, 0x7c, 0x78, 0x6c, 0x44, 0x00, // x
232
0x9c, 0xbc, 0xfc, 0xfc, 0x60, 0x3c, 0x1c, 0x00, // y
233
0x64, 0x74, 0x3c, 0x7c, 0x5c, 0x4c, 0x24, 0x00, // z
234
0x3c, 0x7e, 0x42, 0x7e, 0x7e, 0x7e, 0x3c, 0x00, // 0
235
0x00, 0x42, 0x7e, 0x7e, 0x7e, 0x7e, 0x40, 0x00, // 1
236
0x64, 0x72, 0x7a, 0x7e, 0x5e, 0x4e, 0x44, 0x00, // 2
237
0x24, 0x66, 0x4a, 0x7e, 0x7e, 0x7e, 0x34, 0x00, // 3
238
0x0e, 0x1e, 0x10, 0x7e, 0x7e, 0x7e, 0x7e, 0x00, // 4
239
0x2e, 0x6e, 0x4e, 0x7a, 0x7a, 0x7a, 0x32, 0x00, // 5
240
0x3c, 0x7e, 0x7e, 0x7e, 0x4a, 0x7a, 0x34, 0x00, // 6
241
0x02, 0x62, 0x7a, 0x7e, 0x7e, 0x1e, 0x06, 0x00, // 7
242
0x34, 0x7e, 0x4e, 0x7e, 0x7a, 0x7e, 0x34, 0x00, // 8
243
0x2c, 0x5e, 0x52, 0x7e, 0x7e, 0x7e, 0x3c, 0x00, // 9
244
0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, // -
245
0x00, 0x00, 0x28, 0x7c, 0x7c, 0x28, 0x00, 0x00, // :
246
0x00, 0x00, 0x30, 0x78, 0x78, 0x30, 0x00, 0x00, // .
247
0x00, 0x00, 0x10, 0xb8, 0xf8, 0x70, 0x00, 0x00, // ,
249
0x00, 0x78, 0x7f, 0x09, 0x09, 0x0f, 0x78, 0x00, // A
250
0x00, 0x7f, 0x79, 0x49, 0x49, 0x4f, 0x78, 0x00, // B
251
0x00, 0x7f, 0x79, 0x41, 0x41, 0x41, 0x63, 0x00, // C
252
0x00, 0x7f, 0x79, 0x41, 0x41, 0x41, 0x7f, 0x00, // D
253
0x00, 0x00, 0x7f, 0x79, 0x49, 0x49, 0x41, 0x00, // E
254
0x00, 0x00, 0x7f, 0x79, 0x09, 0x09, 0x01, 0x00, // F
255
0x00, 0x7f, 0x79, 0x41, 0x41, 0x49, 0x7b, 0x00, // G
256
0x00, 0x7f, 0x78, 0x08, 0x08, 0x08, 0x7f, 0x00, // H
257
0x00, 0x00, 0x00, 0x7f, 0x78, 0x00, 0x00, 0x00, // I
258
0x00, 0x60, 0x40, 0x40, 0x40, 0x7f, 0x78, 0x00, // J
259
0x00, 0x7f, 0x78, 0x08, 0x08, 0x0f, 0x78, 0x00, // K
260
0x00, 0x00, 0x7f, 0x78, 0x40, 0x40, 0x40, 0x00, // L
261
0x00, 0x7f, 0x79, 0x01, 0x7f, 0x01, 0x7f, 0x00, // M
262
0x00, 0x7f, 0x79, 0x01, 0x01, 0x01, 0x7f, 0x00, // N
263
0x00, 0x7f, 0x41, 0x41, 0x41, 0x43, 0x7f, 0x00, // O
264
0x00, 0x7f, 0x79, 0x09, 0x09, 0x09, 0x0f, 0x00, // P
265
0x00, 0x7f, 0x41, 0x41, 0x61, 0x61, 0x7f, 0x00, // Q
266
0x00, 0x7f, 0x79, 0x09, 0x09, 0x0f, 0x78, 0x00, // R
267
0x00, 0x6f, 0x49, 0x49, 0x49, 0x79, 0x7b, 0x00, // S
268
0x00, 0x01, 0x01, 0x7f, 0x79, 0x01, 0x01, 0x00, // T
269
0x00, 0x7f, 0x78, 0x40, 0x40, 0x40, 0x7f, 0x00, // U
270
0x00, 0x0f, 0x7f, 0x40, 0x40, 0x78, 0x0f, 0x00, // V
271
0x00, 0x7f, 0x78, 0x40, 0x7f, 0x40, 0x7f, 0x00, // W
272
0x00, 0x77, 0x78, 0x08, 0x08, 0x08, 0x77, 0x00, // X
273
0x00, 0x0f, 0x08, 0x78, 0x78, 0x08, 0x0f, 0x00, // Y
274
0x00, 0x7b, 0x79, 0x49, 0x49, 0x49, 0x6f, 0x00, // Z
275
0x00, 0x74, 0x74, 0x54, 0x54, 0x7c, 0x00, 0x00, // a
276
0x00, 0x7f, 0x74, 0x44, 0x44, 0x7c, 0x00, 0x00, // b
277
0x00, 0x7c, 0x74, 0x44, 0x44, 0x6c, 0x00, 0x00, // c
278
0x00, 0x7c, 0x74, 0x44, 0x44, 0x7f, 0x00, 0x00, // d
279
0x00, 0x7c, 0x74, 0x54, 0x54, 0x5c, 0x00, 0x00, // e
280
0x00, 0x00, 0x04, 0x7f, 0x75, 0x01, 0x00, 0x00, // f
281
0x00, 0xbc, 0xb4, 0xa4, 0xa4, 0xfc, 0x00, 0x00, // g
282
0x00, 0x7f, 0x74, 0x04, 0x04, 0x7c, 0x00, 0x00, // h
283
0x00, 0x00, 0x00, 0x7d, 0x71, 0x00, 0x00, 0x00, // i
284
0x00, 0x00, 0x80, 0xbd, 0xf1, 0x00, 0x00, 0x00, // j
285
0x00, 0x7f, 0x70, 0x10, 0x1c, 0x70, 0x00, 0x00, // k
286
0x00, 0x00, 0x00, 0x7f, 0x78, 0x00, 0x00, 0x00, // l
287
0x00, 0x7c, 0x74, 0x04, 0x7c, 0x04, 0x7c, 0x00, // m
288
0x00, 0x7c, 0x74, 0x04, 0x04, 0x7c, 0x00, 0x00, // n
289
0x00, 0x7c, 0x74, 0x44, 0x44, 0x7c, 0x00, 0x00, // o
290
0x00, 0xfc, 0x34, 0x24, 0x24, 0x3c, 0x00, 0x00, // p
291
0x00, 0x3c, 0x34, 0x24, 0x24, 0xfc, 0x00, 0x00, // q
292
0x00, 0x00, 0x7c, 0x74, 0x04, 0x04, 0x00, 0x00, // r
293
0x00, 0x5c, 0x54, 0x54, 0x74, 0x74, 0x00, 0x00, // s
294
0x00, 0x00, 0x04, 0x7f, 0x74, 0x00, 0x00, 0x00, // t
295
0x00, 0x7c, 0x70, 0x40, 0x40, 0x7c, 0x00, 0x00, // u
296
0x00, 0x1c, 0x7c, 0x40, 0x70, 0x1c, 0x00, 0x00, // v
297
0x00, 0x7c, 0x70, 0x40, 0x7c, 0x40, 0x7c, 0x00, // w
298
0x00, 0x6c, 0x70, 0x10, 0x10, 0x6c, 0x00, 0x00, // x
299
0x00, 0xbc, 0xb0, 0xa0, 0xa0, 0xfc, 0x00, 0x00, // y
300
0x00, 0x74, 0x74, 0x54, 0x54, 0x5c, 0x00, 0x00, // z
301
0x00, 0x7f, 0x41, 0x41, 0x41, 0x79, 0x7f, 0x00, // 0
302
0x00, 0x00, 0x00, 0x78, 0x7f, 0x00, 0x00, 0x00, // 1
303
0x00, 0x7b, 0x79, 0x49, 0x49, 0x49, 0x4f, 0x00, // 2
304
0x00, 0x63, 0x49, 0x49, 0x49, 0x7f, 0x78, 0x00, // 3
305
0x00, 0x1f, 0x11, 0x11, 0x71, 0x7f, 0x10, 0x00, // 4
306
0x00, 0x6f, 0x49, 0x49, 0x49, 0x79, 0x79, 0x00, // 5
307
0x00, 0x7f, 0x49, 0x49, 0x49, 0x79, 0x7b, 0x00, // 6
308
0x00, 0x01, 0x01, 0x01, 0x79, 0x7f, 0x00, 0x00, // 7
309
0x00, 0x78, 0x4f, 0x49, 0x49, 0x7f, 0x78, 0x00, // 8
310
0x00, 0x1f, 0x11, 0x11, 0x11, 0x71, 0x7f, 0x00, // 9
311
0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, // -
312
0x00, 0x00, 0x00, 0x6c, 0x6c, 0x00, 0x00, 0x00, // :
313
0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, // .
314
0x00, 0x00, 0x00, 0x60, 0xe0, 0x00, 0x00, 0x00, // ,
319
if( c == _glyph_cache_char )
321
_glyph_cache_char = c;
323
// find glyph data position
325
if( c >= 'A' && c <= 'Z' )
327
else if( c >= 'a' && c <= 'z' )
329
else if( c >= '0' && c <= '9' )
342
// space? or copy glyph from progmem?
344
memset( _glyph_cache, 0, 8 );
346
memcpy_P( _glyph_cache, &( fonts[ _font ][ pos * 8 ] ), 8 );
350
int TextRenderer::get_width( int message_len )
352
return message_len * 8 * TEXT_SCALE;
356
void TextRenderer::render( const char *message, int message_len, int x,
357
bool y_flip, int y_shift )
368
if( pos < message_len )
370
// ensure correct glyph is cached and pull out colun of data
371
cache_glyph( message[ pos ] );
372
glyph_col = _glyph_cache[ x % 8 ];
378
for( int a = 7; a >= 0; a-- ) {
380
_output_buffer |= 1 << ( a + y_shift );
384
for( int a = 0; a < 8; a++ ) {
386
_output_buffer |= 1 << ( a + y_shift );
392
void TextRenderer::reset_buffer()
398
void TextRenderer::output_buffer()
400
for( int a = 8; a >= 0; a-- ) {
401
Display::led( a, ( _output_buffer & 1 )? true : false );
402
_output_buffer >>= 1;
408
void TextRenderer::select_font( int font_num )