systemless 0.1.125

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 24 — our own humanist display sans at 24px (systemless
//! compatibility face for Geneva 24). Metrics (advance, origin_x,
//! x-height 13 / cap height 18, side-bearings) are conformed to the
//! original Geneva 24 strike so text lays out identically; the pixels are
//! our own hand-drawn letterforms — a heavy 2px-stroke display weight
//! (matching Geneva 24's boldness) in the Kurrajong house style (slashed
//! 0, footed 1, 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_24_METRICS: FontMetrics =
    FontMetrics { ascent: 22, descent: 6, wid_max: 30, leading: 1 };

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

const LEN: usize = data_len(GENEVA_24_SRC);
pub const GENEVA_24_GLYPHS: [Glyph; 95] = decode_glyphs(GENEVA_24_SRC);
pub const GENEVA_24_DATA: [u8; LEN] = decode_data(GENEVA_24_SRC);

#[allow(dead_code)]
pub const FACE: DecodedFace = DecodedFace {
    metrics: GENEVA_24_METRICS,
    glyphs: &GENEVA_24_GLYPHS,
    data: &GENEVA_24_DATA,
};