systemless 0.1.130

High-Level Emulation for classic Macintosh applications
Documentation
// SPDX-License-Identifier: OFL-1.1
// Copyright (c) 2026 Ben Letchford. Bitmap glyph artwork under the SIL
// Open Font License 1.1 (see OFL.txt at the crate root). Reserved Font
// Name "Systemless".
//! Kurrajong 14 — our own humanist body sans at 14px (systemless
//! compatibility face for Geneva 14). Metrics (advance, origin_x,
//! x-height 8 / cap height 11, side-bearings) are conformed to the
//! original Geneva 14 strike so text lays out identically; the pixels are
//! our own hand-drawn letterforms in the Kurrajong house style (flat-arch
//! m/n, slashed 0, footed 1, closed 4, barred 7, open-tail g). Every
//! pixel was authored by us, not lifted from a font binary.

use super::{data_len, decode_data, decode_glyphs, DecodedFace, GlyphSrc};
use crate::g;
use crate::quickdraw::fonts::{FontMetrics, Glyph};

pub const GENEVA_14_METRICS: FontMetrics =
    FontMetrics { ascent: 14, descent: 4, wid_max: 15, leading: 1 };

pub const GENEVA_14_SRC: &[GlyphSrc] = &[
    g!(4, (4, -1), ), // ' '
    g!(4, (2, -11), // '!'
        "#" "#" "#" "#" "#" "#" "#" "." "." "#"
    ),
    g!(6, (1, -11), // '"'
        "#.#" "#.#" "#.#"
    ),
    g!(9, (1, -10), // '#'
        ".#.#." ".#.#." "#####" ".#.#." "#####" ".#.#." ".#.#."
    ),
    g!(7, (1, -11), // '$'
        "..#.." ".####" "#.#.." "#.#.." ".###." "..#.#" "..#.#" "####." "..#.."
    ),
    g!(11, (1, -10), // '%'
        "##...#" "##..#." "...#.." "..#..." ".#...#" "#...##" "...#.#"
    ),
    g!(11, (1, -11), // '&'
        ".###..." "#...#.." "#...#.." ".#.#..." "..#...." ".#.#..#" "#...#.#" "#...##." ".####.#"
    ),
    g!(3, (1, -11), // '\''
        "#" "#" "#"
    ),
    g!(6, (1, -11), // '('
        "..#" ".#." "#.." "#.." "#.." "#.." "#.." "#.." ".#." "..#"
    ),
    g!(6, (2, -11), // ')'
        "#.." ".#." "..#" "..#" "..#" "..#" "..#" "..#" ".#." "#.."
    ),
    g!(9, (1, -11), // '*'
        "#.#.#" ".###." "#.#.#"
    ),
    g!(9, (1, -8), // '+'
        "..#.." "..#.." "#####" "..#.." "..#.."
    ),
    g!(4, (1, -2), // ','
        ".#" ".#" "#."
    ),
    g!(8, (1, -5), // '-'
        "######"
    ),
    g!(3, (1, -2), // '.'
        "#" "#"
    ),
    g!(7, (1, -11), // '/'
        "....#" "...#." "...#." "..#.." "..#.." ".#..." ".#..." "#...." "#...."
    ),
    g!(9, (1, -10), // '0'
        ".####." "#....#" "#....#" "#...##" "#..#.#" "#.#..#" "##...#" "#....#" "#....#" ".####."
    ),
    g!(9, (3, -10), // '1'
        ".#." "##." ".#." ".#." ".#." ".#." ".#." ".#." ".#." "###"
    ),
    g!(9, (1, -10), // '2'
        ".####." "#....#" "#....#" ".....#" "....#." "...#.." "..#..." ".#...." "#....." "######"
    ),
    g!(9, (1, -10), // '3'
        ".####." "#....#" ".....#" "....#." "..###." "....#." ".....#" "#....#" "#....#" ".####."
    ),
    g!(9, (1, -10), // '4'
        "...##." "..#.#." ".#..#." "#...#." "#...#." "######" "....#." "....#." "....#." "....#."
    ),
    g!(9, (1, -10), // '5'
        "######" "#....." "#....." "#####." ".....#" ".....#" ".....#" "#....#" "#....#" ".####."
    ),
    g!(9, (1, -10), // '6'
        "..###." ".#...." "#....." "#####." "#....#" "#....#" "#....#" "#....#" "#....#" ".####."
    ),
    g!(9, (1, -10), // '7'
        "######" ".....#" "....#." "...#.." "..####" "...#.." "...#.." "..#..." "..#..." "..#..."
    ),
    g!(9, (1, -10), // '8'
        ".####." "#....#" "#....#" "#....#" ".####." "#....#" "#....#" "#....#" "#....#" ".####."
    ),
    g!(9, (1, -10), // '9'
        ".####." "#....#" "#....#" "#....#" "#....#" ".#####" ".....#" ".....#" "....#." ".###.."
    ),
    g!(3, (1, -8), // ':'
        "#" "#" "." "." "." "#" "#"
    ),
    g!(4, (1, -8), // ';'
        ".#" ".#" ".." ".." ".#" ".#" "#."
    ),
    g!(7, (1, -9), // '<'
        "...#" "..#." ".#.." "#..." ".#.." "..#." "...#"
    ),
    g!(11, (2, -8), // '='
        "######" "......" "######"
    ),
    g!(7, (1, -9), // '>'
        "#..." ".#.." "..#." "...#" "..#." ".#.." "#..."
    ),
    g!(8, (1, -11), // '?'
        ".####." "#....#" "....#." "...#.." "...#.." "......" "...#.." "...#.."
    ),
    g!(12, (1, -10), // '@'
        ".#####." "#.....#" "#.###.#" "#.#.#.#" "#.####." "#......" ".#####."
    ),
    g!(11, (1, -10), // 'A'
        "...#..." "..#.#.." "..#.#.." ".#...#." ".#...#." "#.....#" "#######" "#.....#" "#.....#" "#.....#"
    ),
    g!(9, (1, -10), // 'B'
        "######." "#.....#" "#.....#" "#.....#" "######." "#.....#" "#.....#" "#.....#" "#.....#" "######."
    ),
    g!(9, (1, -10), // 'C'
        ".#####." "#.....#" "#......" "#......" "#......" "#......" "#......" "#......" "#.....#" ".#####."
    ),
    g!(9, (1, -10), // 'D'
        "######." "#.....#" "#.....#" "#.....#" "#.....#" "#.....#" "#.....#" "#.....#" "#.....#" "######."
    ),
    g!(8, (1, -10), // 'E'
        "######" "#....." "#....." "#....." "#####." "#....." "#....." "#....." "#....." "######"
    ),
    g!(8, (1, -10), // 'F'
        "######" "#....." "#....." "#....." "#####." "#....." "#....." "#....." "#....." "#....."
    ),
    g!(10, (1, -10), // 'G'
        ".#####." "#.....#" "#......" "#......" "#......" "#..####" "#.....#" "#.....#" "#.....#" ".#####."
    ),
    g!(9, (1, -10), // 'H'
        "#.....#" "#.....#" "#.....#" "#.....#" "#######" "#.....#" "#.....#" "#.....#" "#.....#" "#.....#"
    ),
    g!(5, (2, -10), // 'I'
        "#" "#" "#" "#" "#" "#" "#" "#" "#" "#"
    ),
    g!(8, (0, -10), // 'J'
        "....#" "....#" "....#" "....#" "....#" "....#" "....#" "#...#" "#...#" ".###."
    ),
    g!(9, (1, -10), // 'K'
        "#....#" "#...#." "#..#.." "#.#..." "##...." "##...." "#.#..." "#..#.." "#...#." "#....#"
    ),
    g!(8, (1, -10), // 'L'
        "#....." "#....." "#....." "#....." "#....." "#....." "#....." "#....." "#....." "######"
    ),
    g!(11, (1, -10), // 'M'
        "#.......#" "##.....##" "#.#...#.#" "#.#...#.#" "#..#.#..#" "#..#.#..#" "#...#...#" "#.......#" "#.......#" "#.......#"
    ),
    g!(10, (1, -10), // 'N'
        "#.....#" "##....#" "#.#...#" "#.#...#" "#..#..#" "#..#..#" "#...#.#" "#...#.#" "#....##" "#.....#"
    ),
    g!(10, (1, -10), // 'O'
        ".#####." "#.....#" "#.....#" "#.....#" "#.....#" "#.....#" "#.....#" "#.....#" "#.....#" ".#####."
    ),
    g!(9, (1, -10), // 'P'
        "######." "#.....#" "#.....#" "#.....#" "######." "#......" "#......" "#......" "#......" "#......"
    ),
    g!(10, (1, -10), // 'Q'
        ".#####." "#.....#" "#.....#" "#.....#" "#.....#" "#.....#" "#.....#" "#..#..#" "#...#.#" ".######"
    ),
    g!(10, (1, -10), // 'R'
        "######." "#.....#" "#.....#" "#.....#" "######." "#.#...." "#..#..." "#...#.." "#....#." "#.....#"
    ),
    g!(9, (1, -10), // 'S'
        ".####." "#....#" "#....." "#....." ".####." ".....#" ".....#" ".....#" "#....#" ".####."
    ),
    g!(9, (1, -10), // 'T'
        "#######" "...#..." "...#..." "...#..." "...#..." "...#..." "...#..." "...#..." "...#..." "...#..."
    ),
    g!(10, (1, -10), // 'U'
        "#.....#" "#.....#" "#.....#" "#.....#" "#.....#" "#.....#" "#.....#" "#.....#" "#.....#" ".#####."
    ),
    g!(11, (1, -10), // 'V'
        "#.....#" "#.....#" "#.....#" ".#...#." ".#...#." ".#...#." "..#.#.." "..#.#.." "...#..." "...#..."
    ),
    g!(13, (1, -10), // 'W'
        "#...#...#" "#...#...#" "#...#...#" "#...#...#" "#...#...#" ".#.#.#.#." ".#.#.#.#." ".#.#.#.#." "..#...#.." "..#...#.."
    ),
    g!(9, (1, -10), // 'X'
        "#.....#" ".#...#." ".#...#." "..#.#.." "...#..." "...#..." "..#.#.." ".#...#." ".#...#." "#.....#"
    ),
    g!(9, (1, -10), // 'Y'
        "#.....#" ".#...#." ".#...#." "..#.#.." "...#..." "...#..." "...#..." "...#..." "...#..." "...#..."
    ),
    g!(9, (1, -10), // 'Z'
        "######" ".....#" "....#." "...#.." "..#..." "..#..." ".#...." "#....." "#....." "######"
    ),
    g!(5, (1, -12), // '['
        "###" "#.." "#.." "#.." "#.." "#.." "#.." "#.." "#.." "#.." "#.." "#.." "###"
    ),
    g!(7, (1, -11), // '\\'
        "#...." "#...." ".#..." ".#..." "..#.." "..#.." "...#." "...#." "....#"
    ),
    g!(5, (1, -12), // ']'
        "###" "..#" "..#" "..#" "..#" "..#" "..#" "..#" "..#" "..#" "..#" "..#" "###"
    ),
    g!(7, (1, -11), // '^'
        "..#.." ".#.#." "#...#"
    ),
    g!(9, (0, 2), // '_'
        "#######"
    ),
    g!(5, (1, -12), // '`'
        "#." ".#"
    ),
    g!(8, (1, -8), // 'a'
        ".####." "#....#" ".....#" ".#####" "#....#" "#....#" "#...##" ".###.#"
    ),
    g!(9, (1, -10), // 'b'
        "#....." "#....." "#....." "#####." "#....#" "#....#" "#....#" "#....#" "#....#" "#####."
    ),
    g!(8, (1, -8), // 'c'
        ".####." "#....#" "#....." "#....." "#....." "#....." "#....#" ".####."
    ),
    g!(9, (1, -10), // 'd'
        ".....#" ".....#" ".....#" ".#####" "#....#" "#....#" "#....#" "#....#" "#....#" ".#####"
    ),
    g!(9, (1, -8), // 'e'
        ".####." "#....#" "#....#" "######" "#....." "#....." "#....#" ".####."
    ),
    g!(6, (1, -10), // 'f'
        "..##" ".#.." ".#.." "####" ".#.." ".#.." ".#.." ".#.." ".#.." ".#.." ".#.."
    ),
    g!(9, (1, -8), // 'g'
        ".#####" "#....#" "#....#" "#....#" "#....#" ".#####" ".....#" "#....#" "#....#" ".####."
    ),
    g!(8, (1, -10), // 'h'
        "#....." "#....." "#....." "#####." "#....#" "#....#" "#....#" "#....#" "#....#" "#....#"
    ),
    g!(5, (1, -10), // 'i'
        "#" "." "." "#" "#" "#" "#" "#" "#" "#"
    ),
    g!(5, (0, -11), // 'j'
        "..#" "..." "..." "..#" "..#" "..#" "..#" "..#" "..#" "..#" "..#" "#.#" ".#."
    ),
    g!(9, (1, -10), // 'k'
        "#....." "#....." "#....." "#....#" "#...#." "#..#.." "###..." "#..#.." "#...#." "#....#"
    ),
    g!(5, (1, -10), // 'l'
        "#" "#" "#" "#" "#" "#" "#" "#" "#" "#"
    ),
    g!(13, (1, -8), // 'm'
        "###########" "#...#....#." "#...#....#." "#...#....#." "#...#....#." "#...#....#." "#...#....#." "#...#....#."
    ),
    g!(8, (1, -8), // 'n'
        "#####." "#....#" "#....#" "#....#" "#....#" "#....#" "#....#" "#....#"
    ),
    g!(9, (1, -8), // 'o'
        ".####." "#....#" "#....#" "#....#" "#....#" "#....#" "#....#" ".####."
    ),
    g!(9, (1, -8), // 'p'
        "#####." "#....#" "#....#" "#....#" "#....#" "#....#" "#####." "#....." "#....." "#....."
    ),
    g!(9, (1, -8), // 'q'
        ".#####" "#....#" "#....#" "#....#" "#....#" "#....#" ".#####" ".....#" ".....#" ".....#"
    ),
    g!(7, (1, -8), // 'r'
        "#.###" "##..." "#...." "#...." "#...." "#...." "#...." "#...."
    ),
    g!(8, (1, -8), // 's'
        ".####." "#....#" "#....." ".####." ".....#" ".....#" "#....#" ".####."
    ),
    g!(7, (1, -10), // 't'
        ".#..." ".#..." "#####" ".#..." ".#..." ".#..." ".#..." ".#..." ".#..#" "..##."
    ),
    g!(8, (1, -8), // 'u'
        "#....#" "#....#" "#....#" "#....#" "#....#" "#....#" "#...##" ".###.#"
    ),
    g!(9, (1, -8), // 'v'
        "#.....#" "#.....#" ".#...#." ".#...#." ".#...#." "..#.#.." "..#.#.." "...#..."
    ),
    g!(11, (1, -8), // 'w'
        "#...#...#" "#...#...#" "#...#...#" ".#.#.#.#." ".#.#.#.#." ".#.#.#.#." "..#...#.." "..#...#.."
    ),
    g!(9, (1, -8), // 'x'
        "#.....#" ".#...#." "..#.#.." "...#..." "...#..." "..#.#.." ".#...#." "#.....#"
    ),
    g!(9, (1, -8), // 'y'
        "#.....#" "#.....#" ".#...#." ".#...#." "..#.#.." "..#.#.." "...#..." "...#..." "..#...." ".##...."
    ),
    g!(8, (1, -8), // 'z'
        "######" ".....#" "....#." "...#.." "..#..." ".#...." "#....." "######"
    ),
    g!(5, (1, -12), // '{'
        "..##" ".#.." ".#.." ".#.." ".#.." "##.." ".#.." ".#.." ".#.." ".#.." ".#.." "..##"
    ),
    g!(3, (1, -12), // '|'
        "#" "#" "#" "#" "#" "#" "#" "#" "#" "#" "#" "#" "#"
    ),
    g!(5, (1, -12), // '}'
        "##.." "..#." "..#." "..#." "..#." "..##" "..#." "..#." "..#." "..#." "..#." "##.."
    ),
    g!(9, (1, -7), // '~'
        ".##...#" "#..###."
    ),
];

const LEN: usize = data_len(GENEVA_14_SRC);
pub const GENEVA_14_GLYPHS: [Glyph; 95] = decode_glyphs(GENEVA_14_SRC);
pub const GENEVA_14_DATA: [u8; LEN] = decode_data(GENEVA_14_SRC);

#[allow(dead_code)]
pub const FACE: DecodedFace = DecodedFace {
    metrics: GENEVA_14_METRICS,
    glyphs: &GENEVA_14_GLYPHS,
    data: &GENEVA_14_DATA,
};