/
fonts.go
258 lines (230 loc) · 11.3 KB
/
fonts.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
package framebuffer
import (
"io/ioutil"
"os"
)
type PfFont struct {
data [151][8]byte
}
func NewPfFont() *PfFont {
return &PfFont{
data: defaultFont,
}
}
func (fnt *PfFont) Load(path string) error {
if _, err := os.Stat(path); os.IsNotExist(err) {
return err
}
file, err := os.Open(path)
if err != nil {
return err
}
defer file.Close()
data, err := ioutil.ReadAll(file)
if err != nil {
return err
}
font := defaultFont
ch := 32
start := 0
if len(data) != 768 {
start = 32 * 8
for i := 0; i < 32*8; i++ {
if data[i] == 0 {
ch = 0
start = 0
break
}
}
}
for pos := start; pos < len(data); pos += 8 {
n := 0
for i := byte(128); i != 0; i >>= 1 {
var b byte
if data[pos+0]&i != 0 {
b |= 1
}
if data[pos+1]&i != 0 {
b |= 2
}
if data[pos+2]&i != 0 {
b |= 4
}
if data[pos+3]&i != 0 {
b |= 8
}
if data[pos+4]&i != 0 {
b |= 16
}
if data[pos+5]&i != 0 {
b |= 32
}
if data[pos+6]&i != 0 {
b |= 64
}
if data[pos+7]&i != 0 {
b |= 128
}
font[ch][n] = b
n++
}
ch++
}
fnt.data = font
return nil
}
var defaultFont = [151][8]byte{
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // 0 [0x0]
{0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55}, // 1 [0x1]
{0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A}, // 2 [0x2]
{0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14}, // 3 [0x3]
{0x7f, 0x6b, 0x77, 0x41, 0x55, 0x6b, 0x7f, 0x00}, // 4 [0x4] bluetooth
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // 5 [0x5]
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // 6 [0x6]
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // 7 [0x7]
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // 8 [0x8]
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // 9 [0x9]
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // 10 [0xa]
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // 11 [0xb]
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // 12 [0xc]
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // 13 [0xd]
{0x00, 0xc0, 0xc0, 0xe0, 0x78, 0x1f, 0x00, 0xff}, // 14 [0xe] atari logo left
{0xff, 0x00, 0x1f, 0x78, 0xe0, 0xc0, 0xc0, 0x00}, // 15 [0xf] atari logo right
{0x08, 0x08, 0x1C, 0x1C, 0x3E, 0x3E, 0x7F, 0x7F}, // 16 [0x10] arrow left
{0x7F, 0x7F, 0x3E, 0x3E, 0x1C, 0x1C, 0x08, 0x08}, // 17 [0x11] arrow right
{0x00, 0x10, 0x18, 0x7c, 0x7c, 0x18, 0x10, 0x00}, // 18 [0x12] arrow up
{0x00, 0x10, 0x30, 0x7c, 0x7c, 0x30, 0x10, 0x00}, // 19 [0x13] arrow down
{0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x00, 0x00}, // 20 [0x14]
{0x00, 0x00, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C, 0x1C}, // 21 [0x15]
{0x00, 0x7C, 0x7C, 0x38, 0x38, 0x10, 0x10, 0x00}, // 22 [0x16] mini arrow right
{0x70, 0x7c, 0x72, 0x72, 0x72, 0x7c, 0x70, 0x00}, // 23 [0x17] write protect
{0x70, 0x70, 0x70, 0x70, 0x7c, 0x72, 0x02, 0x0c}, // 24 [0x18] write enable
{0x3e, 0x3e, 0x22, 0x22, 0x22, 0x3e, 0x3e, 0x00}, // 25 [0x19] unchecked checkbox
{0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x3e, 0x00}, // 26 [0x1a] checked checkbox
{0x00, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x00, 0x00}, // 27 [0x1b] middle dot
{0x68, 0x78, 0x6b, 0x0f, 0x6b, 0x78, 0x68, 0x00}, // 28 [0x1c] ethernet
{0x02, 0x09, 0x25, 0x55, 0x25, 0x09, 0x02, 0x00}, // 29 [0x1d] wifi
{0x00, 0x90, 0xD8, 0x7C, 0x3E, 0x1B, 0x09, 0x00}, // 30 [0x1e] charge
{0x7E, 0x72, 0x73, 0x73, 0x73, 0x72, 0x7E, 0x00}, // 31 [0x1f] battery
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // 32 [0x20] standard ascii from here
{0x00, 0x00, 0x6F, 0x6F, 0x00, 0x00, 0x00, 0x00}, // 33 [0x21]
{0x05, 0x03, 0x00, 0x00, 0x05, 0x03, 0x00, 0x00}, // 34 [0x22]
{0x14, 0x7F, 0x7F, 0x14, 0x7F, 0x14, 0x00, 0x00}, // 35 [0x23]
{0x48, 0xDC, 0x74, 0x5C, 0x76, 0x24, 0x00, 0x00}, // 36 [0x24]
{0x4C, 0x2A, 0x16, 0x68, 0x54, 0x32, 0x00, 0x00}, // 37 [0x25]
{0x20, 0x74, 0x4A, 0x5E, 0x34, 0x60, 0x50, 0x00}, // 38 [0x26]
{0x00, 0x00, 0x05, 0x03, 0x00, 0x00, 0x00, 0x00}, // 39 [0x27]
{0x00, 0x00, 0x1C, 0x3E, 0x63, 0x41, 0x00, 0x00}, // 40 [0x28]
{0x41, 0x63, 0x3E, 0x1C, 0x00, 0x00, 0x00, 0x00}, // 41 [0x29]
{0x08, 0x2A, 0x1C, 0x1C, 0x2A, 0x08, 0x00, 0x00}, // 42 [0x2a]
{0x08, 0x08, 0x3E, 0x3E, 0x08, 0x08, 0x00, 0x00}, // 43 [0x2b]
{0x00, 0x00, 0xA0, 0x60, 0x00, 0x00, 0x00, 0x00}, // 44 [0x2c]
{0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00, 0x00}, // 45 [0x2d]
{0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x00, 0x00}, // 46 [0x2e]
{0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x00, 0x00}, // 47 [0x2f]
{0x3E, 0x7F, 0x41, 0x5D, 0x7F, 0x3E, 0x00, 0x00}, // 48 [0x30]
{0x00, 0x01, 0x7F, 0x7F, 0x00, 0x00, 0x00, 0x00}, // 49 [0x31]
{0x71, 0x79, 0x49, 0x49, 0x4F, 0x46, 0x00, 0x00}, // 50 [0x32]
{0x41, 0x49, 0x49, 0x49, 0x7F, 0x36, 0x00, 0x00}, // 51 [0x33]
{0x1C, 0x1E, 0x13, 0x7F, 0x7F, 0x10, 0x00, 0x00}, // 52 [0x34]
{0x4F, 0x4F, 0x49, 0x49, 0x79, 0x31, 0x00, 0x00}, // 53 [0x35]
{0x3E, 0x7F, 0x49, 0x49, 0x79, 0x31, 0x00, 0x00}, // 54 [0x36]
{0x01, 0x01, 0x79, 0x7D, 0x07, 0x03, 0x00, 0x00}, // 55 [0x37]
{0x36, 0x7F, 0x49, 0x49, 0x7F, 0x36, 0x00, 0x00}, // 56 [0x38]
{0x46, 0x4F, 0x49, 0x49, 0x7F, 0x3E, 0x00, 0x00}, // 57 [0x39]
{0x00, 0x00, 0x6C, 0x6C, 0x00, 0x00, 0x00, 0x00}, // 58 [0x3a]
{0x00, 0x00, 0xAC, 0x6C, 0x00, 0x00, 0x00, 0x00}, // 59 [0x3b]
{0x08, 0x1C, 0x36, 0x63, 0x41, 0x00, 0x00, 0x00}, // 60 [0x3c]
{0x00, 0x14, 0x14, 0x14, 0x14, 0x00, 0x00, 0x00}, // 61 [0x3d]
{0x00, 0x41, 0x63, 0x36, 0x1C, 0x08, 0x00, 0x00}, // 62 [0x3e]
{0x06, 0x07, 0x51, 0x59, 0x0F, 0x06, 0x00, 0x00}, // 63 [0x3f]
{0x3E, 0x7F, 0x41, 0x5D, 0x5F, 0x4E, 0x00, 0x00}, // 64 [0x40]
{0x7E, 0x7F, 0x09, 0x09, 0x7F, 0x7E, 0x00, 0x00}, // 65 [0x41]
{0x7F, 0x7F, 0x49, 0x49, 0x7F, 0x36, 0x00, 0x00}, // 66 [0x42]
{0x3E, 0x7F, 0x41, 0x41, 0x41, 0x41, 0x00, 0x00}, // 67 [0x43]
{0x7F, 0x7F, 0x41, 0x41, 0x7F, 0x3E, 0x00, 0x00}, // 68 [0x44]
{0x3E, 0x7F, 0x49, 0x49, 0x41, 0x41, 0x00, 0x00}, // 69 [0x45]
{0x7E, 0x7F, 0x09, 0x09, 0x01, 0x01, 0x00, 0x00}, // 70 [0x46]
{0x3E, 0x7F, 0x41, 0x49, 0x7B, 0x7B, 0x00, 0x00}, // 71 [0x47]
{0x7F, 0x7F, 0x08, 0x08, 0x7F, 0x7F, 0x00, 0x00}, // 72 [0x48]
{0x00, 0x00, 0x7F, 0x7F, 0x00, 0x00, 0x00, 0x00}, // 73 [0x49]
{0x60, 0x60, 0x40, 0x40, 0x7F, 0x3F, 0x00, 0x00}, // 74 [0x4a]
{0x7F, 0x7F, 0x08, 0x1C, 0x77, 0x63, 0x00, 0x00}, // 75 [0x4b]
{0x3F, 0x7F, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00}, // 76 [0x4c]
{0x7F, 0x7F, 0x06, 0x0C, 0x06, 0x7F, 0x7F, 0x00}, // 77 [0x4d]
{0x7F, 0x7F, 0x0C, 0x18, 0x7F, 0x7F, 0x00, 0x00}, // 78 [0x4e]
{0x7E, 0x7F, 0x41, 0x41, 0x7F, 0x3F, 0x00, 0x00}, // 79 [0x4f]
{0x7F, 0x7F, 0x09, 0x09, 0x0F, 0x06, 0x00, 0x00}, // 80 [0x50]
{0x7E, 0x7F, 0x41, 0xF1, 0xFF, 0x3F, 0x00, 0x00}, // 81 [0x51]
{0x7F, 0x7F, 0x09, 0x09, 0x7F, 0x76, 0x00, 0x00}, // 82 [0x52]
{0x46, 0x4F, 0x49, 0x49, 0x79, 0x31, 0x00, 0x00}, // 83 [0x53]
{0x01, 0x01, 0x7F, 0x7F, 0x01, 0x01, 0x00, 0x00}, // 84 [0x54]
{0x3F, 0x7F, 0x40, 0x40, 0x7F, 0x7F, 0x00, 0x00}, // 85 [0x55]
{0x1F, 0x3F, 0x60, 0x60, 0x3F, 0x1F, 0x00, 0x00}, // 86 [0x56]
{0x7F, 0x7F, 0x30, 0x18, 0x30, 0x7F, 0x7F, 0x00}, // 87 [0x57]
{0x63, 0x77, 0x1C, 0x1C, 0x77, 0x63, 0x00, 0x00}, // 88 [0x58]
{0x07, 0x0F, 0x78, 0x78, 0x0F, 0x07, 0x00, 0x00}, // 89 [0x59]
{0x61, 0x71, 0x59, 0x4D, 0x47, 0x43, 0x00, 0x00}, // 90 [0x5a]
{0x00, 0x00, 0x7F, 0x7F, 0x41, 0x41, 0x00, 0x00}, // 91 [0x5b]
{0x03, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x00, 0x00}, // 92 [0x5c]
{0x41, 0x41, 0x7F, 0x7F, 0x00, 0x00, 0x00, 0x00}, // 93 [0x5d]
{0x08, 0x0C, 0x06, 0x03, 0x06, 0x0C, 0x08, 0x00}, // 94 [0x5e]
{0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00}, // 95 [0x5f]
{0x00, 0x00, 0x03, 0x05, 0x00, 0x00, 0x00, 0x00}, // 96 [0x60]
{0x38, 0x7C, 0x44, 0x44, 0x7C, 0x7C, 0x00, 0x00}, // 97 [0x61]
{0x3F, 0x7F, 0x44, 0x44, 0x7C, 0x38, 0x00, 0x00}, // 98 [0x62]
{0x38, 0x7C, 0x44, 0x44, 0x44, 0x44, 0x00, 0x00}, // 99 [0x63]
{0x38, 0x7C, 0x44, 0x44, 0x7F, 0x3F, 0x00, 0x00}, // 100 [0x64]
{0x38, 0x7C, 0x54, 0x54, 0x5C, 0x58, 0x00, 0x00}, // 101 [0x65]
{0x00, 0x08, 0x7E, 0x7F, 0x09, 0x01, 0x00, 0x00}, // 102 [0x66]
{0x98, 0xBC, 0xA4, 0xA4, 0xFC, 0x78, 0x00, 0x00}, // 103 [0x67]
{0x7F, 0x7F, 0x04, 0x04, 0x7C, 0x78, 0x00, 0x00}, // 104 [0x68]
{0x00, 0x00, 0x7D, 0x7D, 0x00, 0x00, 0x00, 0x00}, // 105 [0x69]
{0x80, 0x80, 0xFD, 0x7D, 0x00, 0x00, 0x00, 0x00}, // 106 [0x6a]
{0x7F, 0x7F, 0x10, 0x10, 0x7C, 0x6C, 0x00, 0x00}, // 107 [0x6b]
{0x00, 0x00, 0x7F, 0x7F, 0x40, 0x00, 0x00, 0x00}, // 108 [0x6c]
{0x7C, 0x7C, 0x0C, 0x18, 0x0C, 0x7C, 0x78, 0x00}, // 109 [0x6d]
{0x7C, 0x7C, 0x04, 0x04, 0x7C, 0x78, 0x00, 0x00}, // 110 [0x6e]
{0x38, 0x7C, 0x44, 0x44, 0x7C, 0x38, 0x00, 0x00}, // 111 [0x6f]
{0xF8, 0xFC, 0x44, 0x44, 0x7C, 0x38, 0x00, 0x00}, // 112 [0x70]
{0x38, 0x7C, 0x44, 0x44, 0xFC, 0xF8, 0x00, 0x00}, // 113 [0x71]
{0x7C, 0x7C, 0x08, 0x04, 0x04, 0x04, 0x00, 0x00}, // 114 [0x72]
{0x48, 0x5C, 0x54, 0x54, 0x74, 0x24, 0x00, 0x00}, // 115 [0x73]
{0x00, 0x04, 0x3F, 0x7F, 0x44, 0x40, 0x00, 0x00}, // 116 [0x74]
{0x3C, 0x7C, 0x40, 0x40, 0x7C, 0x7C, 0x00, 0x00}, // 117 [0x75]
{0x1C, 0x3C, 0x60, 0x60, 0x3C, 0x1C, 0x00, 0x00}, // 118 [0x76]
{0x3C, 0x7C, 0x60, 0x30, 0x60, 0x7C, 0x3C, 0x00}, // 119 [0x77]
{0x6C, 0x6C, 0x10, 0x10, 0x6C, 0x6C, 0x00, 0x00}, // 120 [0x78]
{0x9C, 0xBC, 0xA0, 0xA0, 0xFC, 0x7C, 0x00, 0x00}, // 121 [0x79]
{0x64, 0x64, 0x54, 0x54, 0x4C, 0x4C, 0x00, 0x00}, // 122 [0x7a]
{0x08, 0x08, 0x3E, 0x77, 0x41, 0x41, 0x00, 0x00}, // 123 [0x7b]
{0x00, 0x00, 0x77, 0x77, 0x00, 0x00, 0x00, 0x00}, // 124 [0x7c]
{0x41, 0x41, 0x77, 0x3E, 0x08, 0x08, 0x00, 0x00}, // 125 [0x7d]
{0x02, 0x01, 0x01, 0x03, 0x02, 0x02, 0x01, 0x00}, // 126 [0x7e] to here
{0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x00}, // 127 [0x7f] solid square
// dotted frame
{0x00, 0x00, 0x00, 0xA8, 0x00, 0x08, 0x00, 0x08}, // 128 [0x80] TL
{0x00, 0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x08}, // 129 [0x81] T/B
{0x00, 0x08, 0x00, 0xA8, 0x00, 0x00, 0x00, 0x00}, // 130 [0x82] TR
{0x00, 0x00, 0x00, 0xAA, 0x00, 0x00, 0x00, 0x00}, // 131 [0x83] L/R
{0x00, 0x08, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00}, // 132 [0x84] BR
{0x00, 0x00, 0x00, 0x0A, 0x00, 0x08, 0x00, 0x08}, // 133 [0x85] BL
// solid frame
{0x00, 0x00, 0x00, 0xF8, 0x08, 0x08, 0x08, 0x08}, // 134 [0x86] TL
{0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08}, // 135 [0x87] T/B
{0x08, 0x08, 0x08, 0xF8, 0x00, 0x00, 0x00, 0x00}, // 136 [0x88] TR
{0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00}, // 137 [0x89] L/R
{0x08, 0x08, 0x08, 0x0F, 0x00, 0x00, 0x00, 0x00}, // 138 [0x8A] BR
{0x00, 0x00, 0x00, 0x0F, 0x08, 0x08, 0x08, 0x08}, // 139 [0x8B] BL
{0x7F, 0x41, 0x41, 0x41, 0x41, 0x41, 0x7F, 0x00}, // 140 [0x8C] empty square
{0x1C, 0x1C, 0x3E, 0x7F, 0x00, 0x2A, 0x49, 0x00}, // 141 [0x8D] speaker
{0x7F, 0x61, 0x61, 0x61, 0x61, 0x61, 0x7F, 0x00}, // 142 [0x8E] fill 1
{0x7F, 0x71, 0x71, 0x71, 0x71, 0x71, 0x7F, 0x00}, // 143 [0x8F] fill 2
{0x7F, 0x79, 0x79, 0x79, 0x79, 0x79, 0x7F, 0x00}, // 144 [0x90] fill 3
{0x7F, 0x7D, 0x7D, 0x7D, 0x7D, 0x7D, 0x7F, 0x00}, // 145 [0x91] fill 4
{0x2A, 0x7F, 0x41, 0x41, 0x41, 0x7F, 0x2A, 0x00}, // 146 [0x92] mem-none
{0x2A, 0x7F, 0x41, 0x71, 0x79, 0x7F, 0x2A, 0x00}, // 147 [0x93] mem32
{0x2A, 0x7F, 0x79, 0x79, 0x79, 0x7F, 0x2A, 0x00}, // 148 [0x94] mem64
{0x2A, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x2A, 0x00}, // 149 [0x95] mem128
{0x10, 0x30, 0x60, 0x70, 0x3C, 0x0F, 0x03, 0x00}, // 150 [0x96] Mark sign
}