nx_font_bitmap_5x7.nx source
↩ module page · 1019 lines · 31197 B
1// nx_font_bitmap_5x7.nx -- 5x7 bitmap font for the Nishi browser.
2// Phase 4 fifth primitive of NISHI_BROWSER_ROADMAP. Provides per-row
3// glyph bit patterns; nx_paint_text (next primitive, queued)
4// consumes these and rasterizes characters into a Framebuffer.
5//
6// Glyph layout: each glyph is 5 columns wide x 7 rows tall. One row
7// is encoded as a single byte where the LOW 5 bits are the pixel
8// pattern, LEFTMOST pixel = bit 4 (0x10), RIGHTMOST = bit 0 (0x01).
9// Each glyph occupies 7 consecutive bytes in the font table.
10//
11// Initial subset (12 glyphs, 84 bytes of font data):
12// ' ' (ASCII 32) -- space, all zero rows
13// '0'..'9' (ASCII 48..57) -- digits
14// '.' (ASCII 46) -- period
15//
16// Lookup contract:
17// nx_font_5x7_glyph_row(ascii_char, row_idx) -> i64
18// ascii_char: byte value 0..255
19// row_idx: 0..6 (top to bottom)
20// returns: low 5 bits = pixel pattern, -1 for unsupported char
21// or row_idx out of range.
22//
23// Now covers: space, digits 0-9, A-Z, a-z, and common punctuation
24// . , - : ; / ( ) ' " ! ? % + = (added for prose readability).
25//
26// What it does NOT handle yet (Phase 4b queued, explicit in header):
27// - Remaining punctuation/symbols: # $ * @ [ ] { } < > \ | ~ ^ _ `
28// - Variable-width glyphs (current is fixed 5x7 cell)
29// - Kerning pairs
30// - Anti-aliasing (current is 1-bit-per-pixel)
31// - Multi-byte encodings (UTF-8, Latin-1)
32// - Synthetic bold / italic emphasis
33//
34// Per cardinal feedback-honest-perf-verdict-no-aspirational-claims:
35// gap list is EXACT in this header.
36//
37// Glyph designs follow the classic IBM CGA 5x7 pattern (public-
38// domain bitmap fonts derived from the original IBM PC ROM, e.g.
39// the U+VT100, DOS-CGA, and Code Page 437 8x8 fonts).
40//
41// genealogy_id: ibm_cga_5x7_classic + substrate_browser_phase_4_font
42// lineage_id: nishi_browser_font_bitmap_5x7_v1
43//
44// nx_safety_envelope:
45// intended_use: "5x7 bitmap font lookup -- browser text render"
46// sil_target: SIL1
47// evidence: [classical_bitmap_font_canonical_basis,
48// pure_function_table_lookup,
49// bounded_glyph_table,
50// no_allocation]
51// verdict: NOT_YET_EVALUATED
52
53import "nx_syscalls.nx"
54
55const NX_FONT_5X7_WIDTH: i64 = 5
56const NX_FONT_5X7_HEIGHT: i64 = 7
57
58// ---- public API ----
59
60// Return the row pattern for the given (ASCII char, row index) or -1
61// if either is out of range / unsupported. Row 0 is the TOP row.
62// Bit layout: leftmost pixel is bit 4 (0x10), rightmost is bit 0.
63func nx_font_5x7_glyph_row(ascii_char: i64, row_idx: i64) -> i64 {
64 if row_idx < 0 { return -1 }
65 if row_idx > 6 { return -1 }
66
67 // Space (32): all rows blank.
68 if ascii_char == 32 { return 0 }
69
70 // Period (46):
71 // ..... row 0
72 // ..... row 1
73 // ..... row 2
74 // ..... row 3
75 // ..... row 4
76 // ..#.. row 5
77 // ..#.. row 6
78 if ascii_char == 46 {
79 if row_idx == 0 { return 0 }
80 if row_idx == 1 { return 0 }
81 if row_idx == 2 { return 0 }
82 if row_idx == 3 { return 0 }
83 if row_idx == 4 { return 0 }
84 if row_idx == 5 { return 4 } // ..#..
85 if row_idx == 6 { return 4 } // ..#..
86 }
87
88 // '0' (48):
89 // .###.
90 // #..##
91 // #.#.#
92 // ##..#
93 // #...#
94 // #...#
95 // .###.
96 if ascii_char == 48 {
97 if row_idx == 0 { return 14 } // .###. = 01110
98 if row_idx == 1 { return 19 } // #..## = 10011
99 if row_idx == 2 { return 21 } // #.#.# = 10101
100 if row_idx == 3 { return 25 } // ##..# = 11001
101 if row_idx == 4 { return 17 } // #...# = 10001
102 if row_idx == 5 { return 17 } // #...# = 10001
103 if row_idx == 6 { return 14 } // .###. = 01110
104 }
105
106 // '1' (49):
107 // ..#..
108 // .##..
109 // ..#..
110 // ..#..
111 // ..#..
112 // ..#..
113 // .###.
114 if ascii_char == 49 {
115 if row_idx == 0 { return 4 } // ..#.. = 00100
116 if row_idx == 1 { return 12 } // .##.. = 01100
117 if row_idx == 2 { return 4 }
118 if row_idx == 3 { return 4 }
119 if row_idx == 4 { return 4 }
120 if row_idx == 5 { return 4 }
121 if row_idx == 6 { return 14 } // .###. = 01110
122 }
123
124 // '2' (50):
125 // .###.
126 // #...#
127 // ....#
128 // ...#.
129 // ..#..
130 // .#...
131 // #####
132 if ascii_char == 50 {
133 if row_idx == 0 { return 14 }
134 if row_idx == 1 { return 17 }
135 if row_idx == 2 { return 1 } // ....#
136 if row_idx == 3 { return 2 } // ...#.
137 if row_idx == 4 { return 4 }
138 if row_idx == 5 { return 8 } // .#...
139 if row_idx == 6 { return 31 } // #####
140 }
141
142 // '3' (51):
143 // .###.
144 // #...#
145 // ....#
146 // ..##.
147 // ....#
148 // #...#
149 // .###.
150 if ascii_char == 51 {
151 if row_idx == 0 { return 14 }
152 if row_idx == 1 { return 17 }
153 if row_idx == 2 { return 1 }
154 if row_idx == 3 { return 6 } // ..##.
155 if row_idx == 4 { return 1 }
156 if row_idx == 5 { return 17 }
157 if row_idx == 6 { return 14 }
158 }
159
160 // '4' (52):
161 // ...#.
162 // ..##.
163 // .#.#.
164 // #..#.
165 // #####
166 // ...#.
167 // ...#.
168 if ascii_char == 52 {
169 if row_idx == 0 { return 2 }
170 if row_idx == 1 { return 6 }
171 if row_idx == 2 { return 10 } // .#.#.
172 if row_idx == 3 { return 18 } // #..#.
173 if row_idx == 4 { return 31 }
174 if row_idx == 5 { return 2 }
175 if row_idx == 6 { return 2 }
176 }
177
178 // '5' (53):
179 // #####
180 // #....
181 // ####.
182 // ....#
183 // ....#
184 // #...#
185 // .###.
186 if ascii_char == 53 {
187 if row_idx == 0 { return 31 }
188 if row_idx == 1 { return 16 } // #....
189 if row_idx == 2 { return 30 } // ####.
190 if row_idx == 3 { return 1 }
191 if row_idx == 4 { return 1 }
192 if row_idx == 5 { return 17 }
193 if row_idx == 6 { return 14 }
194 }
195
196 // '6' (54):
197 // .###.
198 // #...#
199 // #....
200 // ####.
201 // #...#
202 // #...#
203 // .###.
204 if ascii_char == 54 {
205 if row_idx == 0 { return 14 }
206 if row_idx == 1 { return 17 }
207 if row_idx == 2 { return 16 }
208 if row_idx == 3 { return 30 }
209 if row_idx == 4 { return 17 }
210 if row_idx == 5 { return 17 }
211 if row_idx == 6 { return 14 }
212 }
213
214 // '7' (55):
215 // #####
216 // ....#
217 // ...#.
218 // ..#..
219 // .#...
220 // .#...
221 // .#...
222 if ascii_char == 55 {
223 if row_idx == 0 { return 31 }
224 if row_idx == 1 { return 1 }
225 if row_idx == 2 { return 2 }
226 if row_idx == 3 { return 4 }
227 if row_idx == 4 { return 8 }
228 if row_idx == 5 { return 8 }
229 if row_idx == 6 { return 8 }
230 }
231
232 // '8' (56):
233 // .###.
234 // #...#
235 // #...#
236 // .###.
237 // #...#
238 // #...#
239 // .###.
240 if ascii_char == 56 {
241 if row_idx == 0 { return 14 }
242 if row_idx == 1 { return 17 }
243 if row_idx == 2 { return 17 }
244 if row_idx == 3 { return 14 }
245 if row_idx == 4 { return 17 }
246 if row_idx == 5 { return 17 }
247 if row_idx == 6 { return 14 }
248 }
249
250 // '9' (57):
251 // .###.
252 // #...#
253 // #...#
254 // .####
255 // ....#
256 // #...#
257 // .###.
258 if ascii_char == 57 {
259 if row_idx == 0 { return 14 }
260 if row_idx == 1 { return 17 }
261 if row_idx == 2 { return 17 }
262 if row_idx == 3 { return 15 } // .####
263 if row_idx == 4 { return 1 }
264 if row_idx == 5 { return 17 }
265 if row_idx == 6 { return 14 }
266 }
267
268 // 'D' (68):
269 // ####.
270 // #...#
271 // #...#
272 // #...#
273 // #...#
274 // #...#
275 // ####.
276 if ascii_char == 68 {
277 if row_idx == 0 { return 30 }
278 if row_idx == 1 { return 17 }
279 if row_idx == 2 { return 17 }
280 if row_idx == 3 { return 17 }
281 if row_idx == 4 { return 17 }
282 if row_idx == 5 { return 17 }
283 if row_idx == 6 { return 30 }
284 }
285
286 // 'E' (69):
287 // #####
288 // #....
289 // #....
290 // ####.
291 // #....
292 // #....
293 // #####
294 if ascii_char == 69 {
295 if row_idx == 0 { return 31 }
296 if row_idx == 1 { return 16 }
297 if row_idx == 2 { return 16 }
298 if row_idx == 3 { return 30 }
299 if row_idx == 4 { return 16 }
300 if row_idx == 5 { return 16 }
301 if row_idx == 6 { return 31 }
302 }
303
304 // 'H' (72):
305 // #...#
306 // #...#
307 // #...#
308 // #####
309 // #...#
310 // #...#
311 // #...#
312 if ascii_char == 72 {
313 if row_idx == 0 { return 17 }
314 if row_idx == 1 { return 17 }
315 if row_idx == 2 { return 17 }
316 if row_idx == 3 { return 31 }
317 if row_idx == 4 { return 17 }
318 if row_idx == 5 { return 17 }
319 if row_idx == 6 { return 17 }
320 }
321
322 // 'I' (73):
323 // #####
324 // ..#..
325 // ..#..
326 // ..#..
327 // ..#..
328 // ..#..
329 // #####
330 if ascii_char == 73 {
331 if row_idx == 0 { return 31 }
332 if row_idx == 1 { return 4 }
333 if row_idx == 2 { return 4 }
334 if row_idx == 3 { return 4 }
335 if row_idx == 4 { return 4 }
336 if row_idx == 5 { return 4 }
337 if row_idx == 6 { return 31 }
338 }
339
340 // 'L' (76):
341 // #....
342 // #....
343 // #....
344 // #....
345 // #....
346 // #....
347 // #####
348 if ascii_char == 76 {
349 if row_idx == 0 { return 16 }
350 if row_idx == 1 { return 16 }
351 if row_idx == 2 { return 16 }
352 if row_idx == 3 { return 16 }
353 if row_idx == 4 { return 16 }
354 if row_idx == 5 { return 16 }
355 if row_idx == 6 { return 31 }
356 }
357
358 // 'N' (78):
359 // #...#
360 // ##..#
361 // #.#.#
362 // #.#.#
363 // #..##
364 // #...#
365 // #...#
366 if ascii_char == 78 {
367 if row_idx == 0 { return 17 }
368 if row_idx == 1 { return 25 }
369 if row_idx == 2 { return 21 }
370 if row_idx == 3 { return 21 }
371 if row_idx == 4 { return 19 }
372 if row_idx == 5 { return 17 }
373 if row_idx == 6 { return 17 }
374 }
375
376 // 'O' (79):
377 // .###.
378 // #...#
379 // #...#
380 // #...#
381 // #...#
382 // #...#
383 // .###.
384 if ascii_char == 79 {
385 if row_idx == 0 { return 14 }
386 if row_idx == 1 { return 17 }
387 if row_idx == 2 { return 17 }
388 if row_idx == 3 { return 17 }
389 if row_idx == 4 { return 17 }
390 if row_idx == 5 { return 17 }
391 if row_idx == 6 { return 14 }
392 }
393
394 // 'R' (82):
395 // ####.
396 // #...#
397 // #...#
398 // ####.
399 // #.#..
400 // #..#.
401 // #...#
402 if ascii_char == 82 {
403 if row_idx == 0 { return 30 }
404 if row_idx == 1 { return 17 }
405 if row_idx == 2 { return 17 }
406 if row_idx == 3 { return 30 }
407 if row_idx == 4 { return 20 }
408 if row_idx == 5 { return 18 }
409 if row_idx == 6 { return 17 }
410 }
411
412 // 'S' (83):
413 // .####
414 // #....
415 // #....
416 // .###.
417 // ....#
418 // ....#
419 // ####.
420 if ascii_char == 83 {
421 if row_idx == 0 { return 15 } // .####
422 if row_idx == 1 { return 16 }
423 if row_idx == 2 { return 16 }
424 if row_idx == 3 { return 14 }
425 if row_idx == 4 { return 1 }
426 if row_idx == 5 { return 1 }
427 if row_idx == 6 { return 30 }
428 }
429
430 // 'W' (87):
431 // #...#
432 // #...#
433 // #...#
434 // #...#
435 // #.#.#
436 // #.#.#
437 // .#.#.
438 if ascii_char == 87 {
439 if row_idx == 0 { return 17 }
440 if row_idx == 1 { return 17 }
441 if row_idx == 2 { return 17 }
442 if row_idx == 3 { return 17 }
443 if row_idx == 4 { return 21 }
444 if row_idx == 5 { return 21 }
445 if row_idx == 6 { return 10 }
446 }
447
448 // 'A' (65)
449 if ascii_char == 65 {
450 if row_idx == 0 { return 4 }
451 if row_idx == 1 { return 10 }
452 if row_idx == 2 { return 17 }
453 if row_idx == 3 { return 31 }
454 if row_idx == 4 { return 17 }
455 if row_idx == 5 { return 17 }
456 if row_idx == 6 { return 17 }
457 }
458
459 // 'B' (66)
460 if ascii_char == 66 {
461 if row_idx == 0 { return 30 }
462 if row_idx == 1 { return 17 }
463 if row_idx == 2 { return 17 }
464 if row_idx == 3 { return 30 }
465 if row_idx == 4 { return 17 }
466 if row_idx == 5 { return 17 }
467 if row_idx == 6 { return 30 }
468 }
469
470 // 'C' (67)
471 if ascii_char == 67 {
472 if row_idx == 0 { return 15 }
473 if row_idx == 1 { return 16 }
474 if row_idx == 2 { return 16 }
475 if row_idx == 3 { return 16 }
476 if row_idx == 4 { return 16 }
477 if row_idx == 5 { return 16 }
478 if row_idx == 6 { return 15 }
479 }
480
481 // 'F' (70)
482 if ascii_char == 70 {
483 if row_idx == 0 { return 31 }
484 if row_idx == 1 { return 16 }
485 if row_idx == 2 { return 16 }
486 if row_idx == 3 { return 30 }
487 if row_idx == 4 { return 16 }
488 if row_idx == 5 { return 16 }
489 if row_idx == 6 { return 16 }
490 }
491
492 // 'G' (71)
493 if ascii_char == 71 {
494 if row_idx == 0 { return 15 }
495 if row_idx == 1 { return 16 }
496 if row_idx == 2 { return 16 }
497 if row_idx == 3 { return 19 }
498 if row_idx == 4 { return 17 }
499 if row_idx == 5 { return 17 }
500 if row_idx == 6 { return 14 }
501 }
502
503 // 'J' (74)
504 if ascii_char == 74 {
505 if row_idx == 0 { return 31 }
506 if row_idx == 1 { return 1 }
507 if row_idx == 2 { return 1 }
508 if row_idx == 3 { return 1 }
509 if row_idx == 4 { return 1 }
510 if row_idx == 5 { return 17 }
511 if row_idx == 6 { return 14 }
512 }
513
514 // 'K' (75)
515 if ascii_char == 75 {
516 if row_idx == 0 { return 17 }
517 if row_idx == 1 { return 18 }
518 if row_idx == 2 { return 20 }
519 if row_idx == 3 { return 24 }
520 if row_idx == 4 { return 20 }
521 if row_idx == 5 { return 18 }
522 if row_idx == 6 { return 17 }
523 }
524
525 // 'M' (77)
526 if ascii_char == 77 {
527 if row_idx == 0 { return 17 }
528 if row_idx == 1 { return 27 }
529 if row_idx == 2 { return 21 }
530 if row_idx == 3 { return 17 }
531 if row_idx == 4 { return 17 }
532 if row_idx == 5 { return 17 }
533 if row_idx == 6 { return 17 }
534 }
535
536 // 'P' (80)
537 if ascii_char == 80 {
538 if row_idx == 0 { return 30 }
539 if row_idx == 1 { return 17 }
540 if row_idx == 2 { return 17 }
541 if row_idx == 3 { return 30 }
542 if row_idx == 4 { return 16 }
543 if row_idx == 5 { return 16 }
544 if row_idx == 6 { return 16 }
545 }
546
547 // 'Q' (81)
548 if ascii_char == 81 {
549 if row_idx == 0 { return 14 }
550 if row_idx == 1 { return 17 }
551 if row_idx == 2 { return 17 }
552 if row_idx == 3 { return 17 }
553 if row_idx == 4 { return 21 }
554 if row_idx == 5 { return 19 }
555 if row_idx == 6 { return 15 }
556 }
557
558 // 'T' (84)
559 if ascii_char == 84 {
560 if row_idx == 0 { return 31 }
561 if row_idx == 1 { return 4 }
562 if row_idx == 2 { return 4 }
563 if row_idx == 3 { return 4 }
564 if row_idx == 4 { return 4 }
565 if row_idx == 5 { return 4 }
566 if row_idx == 6 { return 4 }
567 }
568
569 // 'U' (85)
570 if ascii_char == 85 {
571 if row_idx == 0 { return 17 }
572 if row_idx == 1 { return 17 }
573 if row_idx == 2 { return 17 }
574 if row_idx == 3 { return 17 }
575 if row_idx == 4 { return 17 }
576 if row_idx == 5 { return 17 }
577 if row_idx == 6 { return 14 }
578 }
579
580 // 'V' (86)
581 if ascii_char == 86 {
582 if row_idx == 0 { return 17 }
583 if row_idx == 1 { return 17 }
584 if row_idx == 2 { return 17 }
585 if row_idx == 3 { return 17 }
586 if row_idx == 4 { return 17 }
587 if row_idx == 5 { return 10 }
588 if row_idx == 6 { return 4 }
589 }
590
591 // 'X' (88)
592 if ascii_char == 88 {
593 if row_idx == 0 { return 17 }
594 if row_idx == 1 { return 17 }
595 if row_idx == 2 { return 10 }
596 if row_idx == 3 { return 4 }
597 if row_idx == 4 { return 10 }
598 if row_idx == 5 { return 17 }
599 if row_idx == 6 { return 17 }
600 }
601
602 // 'Y' (89)
603 if ascii_char == 89 {
604 if row_idx == 0 { return 17 }
605 if row_idx == 1 { return 17 }
606 if row_idx == 2 { return 17 }
607 if row_idx == 3 { return 10 }
608 if row_idx == 4 { return 4 }
609 if row_idx == 5 { return 4 }
610 if row_idx == 6 { return 4 }
611 }
612
613 // 'Z' (90)
614 if ascii_char == 90 {
615 if row_idx == 0 { return 31 }
616 if row_idx == 1 { return 1 }
617 if row_idx == 2 { return 2 }
618 if row_idx == 3 { return 4 }
619 if row_idx == 4 { return 8 }
620 if row_idx == 5 { return 16 }
621 if row_idx == 6 { return 31 }
622 }
623
624 // ---- Lowercase a..z (97..122) — 26 glyphs ----
625
626 if ascii_char == 97 { // 'a'
627 if row_idx == 0 { return 0 }
628 if row_idx == 1 { return 0 }
629 if row_idx == 2 { return 14 }
630 if row_idx == 3 { return 1 }
631 if row_idx == 4 { return 15 }
632 if row_idx == 5 { return 17 }
633 if row_idx == 6 { return 14 }
634 }
635 if ascii_char == 98 { // 'b'
636 if row_idx == 0 { return 16 }
637 if row_idx == 1 { return 16 }
638 if row_idx == 2 { return 30 }
639 if row_idx == 3 { return 17 }
640 if row_idx == 4 { return 17 }
641 if row_idx == 5 { return 17 }
642 if row_idx == 6 { return 30 }
643 }
644 if ascii_char == 99 { // 'c'
645 if row_idx == 0 { return 0 }
646 if row_idx == 1 { return 0 }
647 if row_idx == 2 { return 15 }
648 if row_idx == 3 { return 16 }
649 if row_idx == 4 { return 16 }
650 if row_idx == 5 { return 16 }
651 if row_idx == 6 { return 15 }
652 }
653 if ascii_char == 100 { // 'd'
654 if row_idx == 0 { return 1 }
655 if row_idx == 1 { return 1 }
656 if row_idx == 2 { return 15 }
657 if row_idx == 3 { return 17 }
658 if row_idx == 4 { return 17 }
659 if row_idx == 5 { return 17 }
660 if row_idx == 6 { return 15 }
661 }
662 if ascii_char == 101 { // 'e'
663 if row_idx == 0 { return 0 }
664 if row_idx == 1 { return 0 }
665 if row_idx == 2 { return 14 }
666 if row_idx == 3 { return 17 }
667 if row_idx == 4 { return 31 }
668 if row_idx == 5 { return 16 }
669 if row_idx == 6 { return 15 }
670 }
671 if ascii_char == 102 { // 'f'
672 if row_idx == 0 { return 6 }
673 if row_idx == 1 { return 9 }
674 if row_idx == 2 { return 8 }
675 if row_idx == 3 { return 30 }
676 if row_idx == 4 { return 8 }
677 if row_idx == 5 { return 8 }
678 if row_idx == 6 { return 8 }
679 }
680 if ascii_char == 103 { // 'g'
681 if row_idx == 0 { return 0 }
682 if row_idx == 1 { return 0 }
683 if row_idx == 2 { return 15 }
684 if row_idx == 3 { return 17 }
685 if row_idx == 4 { return 15 }
686 if row_idx == 5 { return 1 }
687 if row_idx == 6 { return 14 }
688 }
689 if ascii_char == 104 { // 'h'
690 if row_idx == 0 { return 16 }
691 if row_idx == 1 { return 16 }
692 if row_idx == 2 { return 30 }
693 if row_idx == 3 { return 17 }
694 if row_idx == 4 { return 17 }
695 if row_idx == 5 { return 17 }
696 if row_idx == 6 { return 17 }
697 }
698 if ascii_char == 105 { // 'i'
699 if row_idx == 0 { return 4 }
700 if row_idx == 1 { return 0 }
701 if row_idx == 2 { return 4 }
702 if row_idx == 3 { return 4 }
703 if row_idx == 4 { return 4 }
704 if row_idx == 5 { return 4 }
705 if row_idx == 6 { return 4 }
706 }
707 if ascii_char == 106 { // 'j'
708 if row_idx == 0 { return 1 }
709 if row_idx == 1 { return 0 }
710 if row_idx == 2 { return 1 }
711 if row_idx == 3 { return 1 }
712 if row_idx == 4 { return 1 }
713 if row_idx == 5 { return 17 }
714 if row_idx == 6 { return 14 }
715 }
716 if ascii_char == 107 { // 'k'
717 if row_idx == 0 { return 16 }
718 if row_idx == 1 { return 16 }
719 if row_idx == 2 { return 17 }
720 if row_idx == 3 { return 18 }
721 if row_idx == 4 { return 28 }
722 if row_idx == 5 { return 18 }
723 if row_idx == 6 { return 17 }
724 }
725 if ascii_char == 108 { // 'l'
726 if row_idx == 0 { return 12 }
727 if row_idx == 1 { return 4 }
728 if row_idx == 2 { return 4 }
729 if row_idx == 3 { return 4 }
730 if row_idx == 4 { return 4 }
731 if row_idx == 5 { return 4 }
732 if row_idx == 6 { return 14 }
733 }
734 if ascii_char == 109 { // 'm'
735 if row_idx == 0 { return 0 }
736 if row_idx == 1 { return 0 }
737 if row_idx == 2 { return 26 }
738 if row_idx == 3 { return 21 }
739 if row_idx == 4 { return 21 }
740 if row_idx == 5 { return 21 }
741 if row_idx == 6 { return 21 }
742 }
743 if ascii_char == 110 { // 'n'
744 if row_idx == 0 { return 0 }
745 if row_idx == 1 { return 0 }
746 if row_idx == 2 { return 30 }
747 if row_idx == 3 { return 17 }
748 if row_idx == 4 { return 17 }
749 if row_idx == 5 { return 17 }
750 if row_idx == 6 { return 17 }
751 }
752 if ascii_char == 111 { // 'o'
753 if row_idx == 0 { return 0 }
754 if row_idx == 1 { return 0 }
755 if row_idx == 2 { return 14 }
756 if row_idx == 3 { return 17 }
757 if row_idx == 4 { return 17 }
758 if row_idx == 5 { return 17 }
759 if row_idx == 6 { return 14 }
760 }
761 if ascii_char == 112 { // 'p'
762 if row_idx == 0 { return 0 }
763 if row_idx == 1 { return 0 }
764 if row_idx == 2 { return 30 }
765 if row_idx == 3 { return 17 }
766 if row_idx == 4 { return 30 }
767 if row_idx == 5 { return 16 }
768 if row_idx == 6 { return 16 }
769 }
770 if ascii_char == 113 { // 'q'
771 if row_idx == 0 { return 0 }
772 if row_idx == 1 { return 0 }
773 if row_idx == 2 { return 15 }
774 if row_idx == 3 { return 17 }
775 if row_idx == 4 { return 15 }
776 if row_idx == 5 { return 1 }
777 if row_idx == 6 { return 1 }
778 }
779 if ascii_char == 114 { // 'r'
780 if row_idx == 0 { return 0 }
781 if row_idx == 1 { return 0 }
782 if row_idx == 2 { return 22 }
783 if row_idx == 3 { return 25 }
784 if row_idx == 4 { return 16 }
785 if row_idx == 5 { return 16 }
786 if row_idx == 6 { return 16 }
787 }
788 if ascii_char == 115 { // 's'
789 if row_idx == 0 { return 0 }
790 if row_idx == 1 { return 0 }
791 if row_idx == 2 { return 15 }
792 if row_idx == 3 { return 16 }
793 if row_idx == 4 { return 14 }
794 if row_idx == 5 { return 1 }
795 if row_idx == 6 { return 30 }
796 }
797 if ascii_char == 116 { // 't'
798 if row_idx == 0 { return 8 }
799 if row_idx == 1 { return 8 }
800 if row_idx == 2 { return 28 }
801 if row_idx == 3 { return 8 }
802 if row_idx == 4 { return 8 }
803 if row_idx == 5 { return 9 }
804 if row_idx == 6 { return 6 }
805 }
806 if ascii_char == 117 { // 'u'
807 if row_idx == 0 { return 0 }
808 if row_idx == 1 { return 0 }
809 if row_idx == 2 { return 17 }
810 if row_idx == 3 { return 17 }
811 if row_idx == 4 { return 17 }
812 if row_idx == 5 { return 17 }
813 if row_idx == 6 { return 15 }
814 }
815 if ascii_char == 118 { // 'v'
816 if row_idx == 0 { return 0 }
817 if row_idx == 1 { return 0 }
818 if row_idx == 2 { return 17 }
819 if row_idx == 3 { return 17 }
820 if row_idx == 4 { return 17 }
821 if row_idx == 5 { return 10 }
822 if row_idx == 6 { return 4 }
823 }
824 if ascii_char == 119 { // 'w'
825 if row_idx == 0 { return 0 }
826 if row_idx == 1 { return 0 }
827 if row_idx == 2 { return 17 }
828 if row_idx == 3 { return 17 }
829 if row_idx == 4 { return 21 }
830 if row_idx == 5 { return 21 }
831 if row_idx == 6 { return 10 }
832 }
833 if ascii_char == 120 { // 'x'
834 if row_idx == 0 { return 0 }
835 if row_idx == 1 { return 0 }
836 if row_idx == 2 { return 17 }
837 if row_idx == 3 { return 10 }
838 if row_idx == 4 { return 4 }
839 if row_idx == 5 { return 10 }
840 if row_idx == 6 { return 17 }
841 }
842 if ascii_char == 121 { // 'y'
843 if row_idx == 0 { return 0 }
844 if row_idx == 1 { return 0 }
845 if row_idx == 2 { return 17 }
846 if row_idx == 3 { return 17 }
847 if row_idx == 4 { return 15 }
848 if row_idx == 5 { return 1 }
849 if row_idx == 6 { return 30 }
850 }
851 if ascii_char == 122 { // 'z'
852 if row_idx == 0 { return 0 }
853 if row_idx == 1 { return 0 }
854 if row_idx == 2 { return 31 }
855 if row_idx == 3 { return 2 }
856 if row_idx == 4 { return 4 }
857 if row_idx == 5 { return 8 }
858 if row_idx == 6 { return 31 }
859 }
860
861 // ---- Common punctuation (prose readability: comma/hyphen/colon/etc. were missing,
862 // causing "designing, developing"->"designing developing" and "Front-end"->"Frontend") ----
863
864 if ascii_char == 33 { // '!'
865 if row_idx == 0 { return 4 }
866 if row_idx == 1 { return 4 }
867 if row_idx == 2 { return 4 }
868 if row_idx == 3 { return 4 }
869 if row_idx == 4 { return 4 }
870 if row_idx == 5 { return 0 }
871 if row_idx == 6 { return 4 }
872 }
873 if ascii_char == 34 { // '"'
874 if row_idx == 0 { return 10 }
875 if row_idx == 1 { return 10 }
876 if row_idx == 2 { return 0 }
877 if row_idx == 3 { return 0 }
878 if row_idx == 4 { return 0 }
879 if row_idx == 5 { return 0 }
880 if row_idx == 6 { return 0 }
881 }
882 if ascii_char == 37 { // '%'
883 if row_idx == 0 { return 24 }
884 if row_idx == 1 { return 25 }
885 if row_idx == 2 { return 2 }
886 if row_idx == 3 { return 4 }
887 if row_idx == 4 { return 8 }
888 if row_idx == 5 { return 19 }
889 if row_idx == 6 { return 3 }
890 }
891 if ascii_char == 39 { // '\'' apostrophe
892 if row_idx == 0 { return 4 }
893 if row_idx == 1 { return 8 }
894 if row_idx == 2 { return 0 }
895 if row_idx == 3 { return 0 }
896 if row_idx == 4 { return 0 }
897 if row_idx == 5 { return 0 }
898 if row_idx == 6 { return 0 }
899 }
900 if ascii_char == 40 { // '('
901 if row_idx == 0 { return 2 }
902 if row_idx == 1 { return 4 }
903 if row_idx == 2 { return 8 }
904 if row_idx == 3 { return 8 }
905 if row_idx == 4 { return 8 }
906 if row_idx == 5 { return 4 }
907 if row_idx == 6 { return 2 }
908 }
909 if ascii_char == 41 { // ')'
910 if row_idx == 0 { return 8 }
911 if row_idx == 1 { return 4 }
912 if row_idx == 2 { return 2 }
913 if row_idx == 3 { return 2 }
914 if row_idx == 4 { return 2 }
915 if row_idx == 5 { return 4 }
916 if row_idx == 6 { return 8 }
917 }
918 if ascii_char == 43 { // '+'
919 if row_idx == 0 { return 0 }
920 if row_idx == 1 { return 4 }
921 if row_idx == 2 { return 4 }
922 if row_idx == 3 { return 31 }
923 if row_idx == 4 { return 4 }
924 if row_idx == 5 { return 4 }
925 if row_idx == 6 { return 0 }
926 }
927 if ascii_char == 44 { // ',' comma
928 if row_idx == 0 { return 0 }
929 if row_idx == 1 { return 0 }
930 if row_idx == 2 { return 0 }
931 if row_idx == 3 { return 0 }
932 if row_idx == 4 { return 0 }
933 if row_idx == 5 { return 4 }
934 if row_idx == 6 { return 8 }
935 }
936 if ascii_char == 45 { // '-' hyphen
937 if row_idx == 0 { return 0 }
938 if row_idx == 1 { return 0 }
939 if row_idx == 2 { return 0 }
940 if row_idx == 3 { return 14 }
941 if row_idx == 4 { return 0 }
942 if row_idx == 5 { return 0 }
943 if row_idx == 6 { return 0 }
944 }
945 if ascii_char == 47 { // '/' slash
946 if row_idx == 0 { return 1 }
947 if row_idx == 1 { return 2 }
948 if row_idx == 2 { return 2 }
949 if row_idx == 3 { return 4 }
950 if row_idx == 4 { return 8 }
951 if row_idx == 5 { return 8 }
952 if row_idx == 6 { return 16 }
953 }
954 if ascii_char == 58 { // ':' colon
955 if row_idx == 0 { return 0 }
956 if row_idx == 1 { return 0 }
957 if row_idx == 2 { return 4 }
958 if row_idx == 3 { return 0 }
959 if row_idx == 4 { return 4 }
960 if row_idx == 5 { return 0 }
961 if row_idx == 6 { return 0 }
962 }
963 if ascii_char == 59 { // ';' semicolon
964 if row_idx == 0 { return 0 }
965 if row_idx == 1 { return 0 }
966 if row_idx == 2 { return 4 }
967 if row_idx == 3 { return 0 }
968 if row_idx == 4 { return 4 }
969 if row_idx == 5 { return 4 }
970 if row_idx == 6 { return 8 }
971 }
972 if ascii_char == 61 { // '='
973 if row_idx == 0 { return 0 }
974 if row_idx == 1 { return 0 }
975 if row_idx == 2 { return 31 }
976 if row_idx == 3 { return 0 }
977 if row_idx == 4 { return 31 }
978 if row_idx == 5 { return 0 }
979 if row_idx == 6 { return 0 }
980 }
981 if ascii_char == 63 { // '?'
982 if row_idx == 0 { return 14 }
983 if row_idx == 1 { return 17 }
984 if row_idx == 2 { return 1 }
985 if row_idx == 3 { return 6 }
986 if row_idx == 4 { return 4 }
987 if row_idx == 5 { return 0 }
988 if row_idx == 6 { return 4 }
989 }
990 if ascii_char == 38 { // '&' (decoded from &)
991 if row_idx == 0 { return 12 }
992 if row_idx == 1 { return 18 }
993 if row_idx == 2 { return 18 }
994 if row_idx == 3 { return 12 }
995 if row_idx == 4 { return 21 }
996 if row_idx == 5 { return 18 }
997 if row_idx == 6 { return 13 }
998 }
999 if ascii_char == 60 { // '<' (decoded from <)
1000 if row_idx == 0 { return 2 }
1001 if row_idx == 1 { return 4 }
1002 if row_idx == 2 { return 8 }
1003 if row_idx == 3 { return 16 }
1004 if row_idx == 4 { return 8 }
1005 if row_idx == 5 { return 4 }
1006 if row_idx == 6 { return 2 }
1007 }
1008 if ascii_char == 62 { // '>' (decoded from >)
1009 if row_idx == 0 { return 8 }
1010 if row_idx == 1 { return 4 }
1011 if row_idx == 2 { return 2 }
1012 if row_idx == 3 { return 1 }
1013 if row_idx == 4 { return 2 }
1014 if row_idx == 5 { return 4 }
1015 if row_idx == 6 { return 8 }
1016 }
1017
1018 return -1
1019}