code wiki / (root) / nx_font_bitmap_5x7.nx

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 &amp;) 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 &lt;) 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 &gt;) 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}