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 18 — our own humanist body sans at 18px (systemless
//! compatibility face for Geneva 18). Metrics (advance, origin_x,
//! x-height 10 / cap height 14, side-bearings) are conformed to the
//! original Geneva 18 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_18_METRICS: FontMetrics =
    FontMetrics { ascent: 18, descent: 4, wid_max: 18, leading: 1 };

pub const GENEVA_18_SRC: &[GlyphSrc] = &[
    g!(6, (6, -1), ), // ' '
    g!(6, (3, -14), // '!'
        "#" "#" "#" "#" "#" "#" "#" "#" "#" "." "." "#"
    ),
    g!(8, (2, -14), // '"'
        "#..#" "#..#" "#..#" "#..#"
    ),
    g!(14, (2, -12), // '#'
        ".#..#." ".#..#." "######" ".#..#." ".#..#." "######" ".#..#." ".#..#."
    ),
    g!(12, (2, -14), // '$'
        "..#.." ".####" "#.#.." "#.#.." ".###." "..#.#" "..#.#" "####." "..#.."
    ),
    g!(14, (2, -13), // '%'
        "##...#" "##..#." "...#.." "..#..." ".#...#" "#...##" "....#." "...#.#"
    ),
    g!(16, (2, -14), // '&'
        ".####..." "#....#.." "#....#.." ".#..#..." "..##...." ".#..#..#" "#....##." "#....#.." ".#####.#"
    ),
    g!(3, (1, -14), // '\''
        "#" "#" "#" "#"
    ),
    g!(7, (1, -14), // '('
        "..#" ".#." "#.." "#.." "#.." "#.." "#.." "#.." "#.." "#.." ".#." "..#"
    ),
    g!(7, (2, -14), // ')'
        "#.." ".#." "..#" "..#" "..#" "..#" "..#" "..#" "..#" "..#" ".#." "#.."
    ),
    g!(14, (2, -14), // '*'
        "#..#..#" ".#.#.#." "..###.." "#######" "..###.." ".#.#.#." "#..#..#"
    ),
    g!(12, (1, -11), // '+'
        "...#..." "...#..." "...#..." "#######" "...#..." "...#..." "...#..."
    ),
    g!(6, (2, -3), // ','
        ".#" ".#" ".#" "#."
    ),
    g!(10, (1, -7), // '-'
        "########"
    ),
    g!(6, (3, -2), // '.'
        "#" "#"
    ),
    g!(10, (1, -14), // '/'
        ".....#" ".....#" "....#." "....#." "...#.." "...#.." "..#..." "..#..." ".#...." ".#...." "#....." "#....."
    ),
    g!(12, (1, -14), // '0'

        "..####.." ".#....#." ".#....#." "#......#" "#.....##" "#....#.#" "#....#.#" "#...#..#" "#...#..#" "#..#...#" "#......#" ".#....#." ".#....#." "..####.."
    ),
    g!(12, (4, -14), // '1'

        ".#." "##." "##." ".#." ".#." ".#." ".#." ".#." ".#." ".#." ".#." ".#." ".#." "###"
    ),
    g!(12, (1, -14), // '2'

        "..####.." ".#....#." ".#....#." "#......#" "......#." ".....#.." "....#..." "...#...." "..#....." ".#......" "#......." "#......." "#......." "########"
    ),
    g!(12, (1, -14), // '3'

        "..####.." ".#....#." ".#....#." "#......#" ".......#" ".....##." "....##.." ".....##." ".......#" "#......#" "#......#" ".#....#." ".#....#." "..####.."
    ),
    g!(12, (1, -14), // '4'

        ".....##." "....#.#." "....#.#." "...#..#." "..#...#." ".#....#." "#.....#." "########" "......#." "......#." "......#." "......#." "......#." "......#."
    ),
    g!(12, (1, -14), // '5'

        "#######." "#......." "#......." "#......." "#......." "######.." "......#." ".......#" ".......#" "#......#" "#......#" ".#....#." ".#....#." "..####.."
    ),
    g!(12, (1, -14), // '6'

        "...###.." "..#....." "..#....." ".#......" "#......." "#.####.." "##....#." "#......#" "#......#" "#......#" "#......#" ".#....#." ".#....#." "..####.."
    ),
    g!(12, (1, -14), // '7'

        "########" ".......#" ".......#" "......#." ".....#.." "....####" "....#..." "...#...." "...#...." "..#....." "..#....." ".#......" ".#......" ".#......"
    ),
    g!(12, (1, -14), // '8'

        "..####.." ".#....#." ".#....#." "#......#" "#......#" ".#....#." "..####.." ".#....#." "#......#" "#......#" "#......#" ".#....#." ".#....#." "..####.."
    ),
    g!(12, (1, -14), // '9'

        "..####.." ".#....#." ".#....#." "#......#" "#......#" "#......#" ".#....##" "..####.#" ".......#" "......#." ".....#.." "...##..." "...##..." ".###...."
    ),
    g!(6, (3, -10), // ':'
        "#" "#" "." "." "." "." "." "#" "#"
    ),
    g!(6, (2, -10), // ';'
        ".#" ".#" ".." ".." ".." ".." ".#" ".#" "#."
    ),
    g!(10, (2, -11), // '<'
        "....#" "...#." "..#.." ".#..." "#...." ".#..." "..#.." "...#." "....#"
    ),
    g!(10, (1, -10), // '='
        "########" "........" "........" "########"
    ),
    g!(10, (3, -11), // '>'
        "#...." ".#..." "..#.." "...#." "....#" "...#." "..#.." ".#..." "#...."
    ),
    g!(12, (2, -14), // '?'
        "..####.." ".#....#." "#......#" "......#." ".....#.." "....#..." "....#..." "........" "....#..." "....#..."
    ),
    g!(16, (2, -13), // '@'
        ".######." "#......#" "#.####.#" "#.#..#.#" "#.#.##.#" "#.####.." "#......." ".######."
    ),
    g!(14, (1, -14), // 'A'
        "....#...." "....#...." "...#.#..." "...#.#..." "..#...#.." "..#...#.." ".#.....#." ".#######." ".#.....#." "#.......#" "#.......#" "#.......#" "#.......#" "#.......#"
    ),
    g!(12, (1, -14), // 'B'

        "######.." "#.....#." "#.....#." "#.....#." "#.....#." "#.....#." "######.." "#.....#." "#.....#." "#.....#." "#.....#." "#.....#." "#.....#." "######.."
    ),
    g!(12, (1, -14), // 'C'

        "..#####." ".#.....#" ".#.....#" "#......." "#......." "#......." "#......." "#......." "#......." "#......." "#......." ".#.....#" ".#.....#" "..#####."
    ),
    g!(12, (1, -14), // 'D'

        "######.." "#.....#." "#.....#." "#......#" "#......#" "#......#" "#......#" "#......#" "#......#" "#......#" "#......#" "#.....#." "#.....#." "######.."
    ),
    g!(10, (1, -14), // 'E'

        "########" "#......." "#......." "#......." "#......." "#......." "#####..." "#......." "#......." "#......." "#......." "#......." "#......." "########"
    ),
    g!(10, (1, -14), // 'F'

        "########" "#......." "#......." "#......." "#......." "#......." "#####..." "#......." "#......." "#......." "#......." "#......." "#......." "#......."
    ),
    g!(12, (1, -14), // 'G'

        "..#####." ".#.....#" ".#.....#" "#......." "#......." "#......." "#......." "#...####" "#......#" "#......#" "#......#" ".#.....#" ".#.....#" "..#####."
    ),
    g!(12, (1, -14), // 'H'

        "#......#" "#......#" "#......#" "#......#" "#......#" "#......#" "########" "#......#" "#......#" "#......#" "#......#" "#......#" "#......#" "#......#"
    ),
    g!(6, (2, -14), // 'I'
        "#" "#" "#" "#" "#" "#" "#" "#" "#" "#" "#" "#" "#" "#"
    ),
    g!(10, (0, -14), // 'J'

        ".....#" ".....#" ".....#" ".....#" ".....#" ".....#" ".....#" ".....#" ".....#" ".....#" "#....#" "#....#" "#....#" ".####."
    ),
    g!(12, (1, -14), // 'K'

        "#.....#" "#....#." "#....#." "#...#.." "#..#..." "#.#...." "##....." "##....." "#.#...." "#..#..." "#...#.." "#....#." "#....#." "#.....#"
    ),
    g!(10, (1, -14), // 'L'

        "#......" "#......" "#......" "#......" "#......" "#......" "#......" "#......" "#......" "#......" "#......" "#......" "#......" "#######"
    ),
    g!(14, (1, -14), // 'M'
        "#.......#" "##.....##" "#.#...#.#" "#.#...#.#" "#..#.#..#" "#..#.#..#" "#...#...#" "#.......#" "#.......#" "#.......#" "#.......#" "#.......#" "#.......#" "#.......#"
    ),
    g!(12, (1, -14), // 'N'

        "#......#" "##.....#" "##.....#" "#.#....#" "#.#....#" "#..#...#" "#..#...#" "#...#..#" "#...#..#" "#....#.#" "#....#.#" "#.....##" "#.....##" "#......#"
    ),
    g!(12, (1, -14), // 'O'

        "..#####." ".#.....#" ".#.....#" "#......#" "#......#" "#......#" "#......#" "#......#" "#......#" "#......#" "#......#" ".#.....#" ".#.....#" "..#####."
    ),
    g!(12, (1, -14), // 'P'

        "######.." "#.....#." "#.....#." "#......#" "#......#" "#.....#." "######.." "#......." "#......." "#......." "#......." "#......." "#......." "#......."
    ),
    g!(12, (1, -14), // 'Q'

        "..#####." ".#.....#" ".#.....#" "#......#" "#......#" "#......#" "#......#" "#......#" "#......#" "#..#...#" "#...#..#" ".#.....#" ".#.....#" "..#####."
    ),
    g!(12, (1, -14), // 'R'

        "######.." "#.....#." "#.....#." "#......#" "#......#" "#.....#." "######.." "#..#...." "#...#..." "#....#.." "#....#.." "#.....#." "#.....#." "#......#"
    ),
    g!(12, (1, -14), // 'S'

        "..#####." ".#.....#" ".#.....#" "#......." "#......." ".#......" "..#####." ".......#" ".......#" "#......#" "#......#" ".#.....#" ".#.....#" "..#####."
    ),
    g!(12, (1, -14), // 'T'

        "#########" "....#...." "....#...." "....#...." "....#...." "....#...." "....#...." "....#...." "....#...." "....#...." "....#...." "....#...." "....#...." "....#...."
    ),
    g!(12, (1, -14), // 'U'

        "#......#" "#......#" "#......#" "#......#" "#......#" "#......#" "#......#" "#......#" "#......#" "#......#" "#......#" ".#....#." ".#....#." "..####.."
    ),
    g!(14, (1, -14), // 'V'

        "#.......#" "#.......#" "#.......#" ".#.....#." ".#.....#." ".#.....#." "..#...#.." "..#...#.." "..#...#.." "...#.#..." "...#.#..." "....#...." "....#...." "....#...."
    ),
    g!(16, (0, -14), // 'W'

        "#....#....#" "#....#....#" "#....#....#" "#....#....#" "#...#.#...#" "#...#.#...#" ".#..#.#..#." ".#.#...#.#." ".#.#...#.#." ".#.#...#.#." "..#.....#.." "..#.....#.." "..#.....#.." "..#.....#.."
    ),
    g!(12, (1, -14), // 'X'

        "#......#" ".#....#." ".#....#." "..#..#.." "...##..." "...##..." "...##..." "...##..." "..#..#.." ".#....#." "#......#" "#......#" "#......#" "#......#"
    ),
    g!(12, (1, -14), // 'Y'

        "#......#" ".#....#." ".#....#." "..#..#.." "...##..." "...##..." "....#..." "....#..." "....#..." "....#..." "....#..." "....#..." "....#..." "....#..."
    ),
    g!(10, (1, -14), // 'Z'

        "########" ".......#" ".......#" "......#." ".....#.." "....#..." "...#...." "..#....." ".#......" "#......." "#......." "#......." "#......." "########"
    ),
    g!(8, (2, -15), // '['
        "###" "#.." "#.." "#.." "#.." "#.." "#.." "#.." "#.." "#.." "#.." "#.." "#.." "#.." "#.." "###"
    ),
    g!(10, (1, -14), // '\\'
        "#....." "#....." ".#...." ".#...." "..#..." "..#..." "...#.." "...#.." "....#." "....#." ".....#" ".....#"
    ),
    g!(8, (3, -15), // ']'
        "###" "..#" "..#" "..#" "..#" "..#" "..#" "..#" "..#" "..#" "..#" "..#" "..#" "..#" "..#" "###"
    ),
    g!(8, (1, -14), // '^'
        "...#..." "..#.#.." ".#...#." "#.....#"
    ),
    g!(12, (0, 3), // '_'
        "#########"
    ),
    g!(6, (1, -16), // '`'
        "#." ".#"
    ),
    g!(10, (1, -10), // 'a'

        ".#####." "#.....#" ".....##" ".....##" ".######" "#....##" "#.....#" "#.....#" "#....##" ".#####."
    ),
    g!(10, (1, -14), // 'b'

        "#......" "#......" "#......" "#......" "#......" "#.####." "##....#" "#.....#" "#.....#" "#.....#" "#.....#" "##....#" "##....#" "#.####."
    ),
    g!(10, (1, -10), // 'c'

        ".#####." "#.....#" "#......" "#......" "#......" "#......" "#......" "#......" "#.....#" ".#####."
    ),
    g!(10, (1, -14), // 'd'

        "......#" "......#" "......#" "......#" "......#" ".####.#" "#....##" "#.....#" "#.....#" "#.....#" "#.....#" "#....##" "#....##" ".####.#"
    ),
    g!(10, (1, -10), // 'e'

        ".#####." "#.....#" "#.....#" "#.....#" "#######" "#......" "#......" "#......" "#.....#" ".#####."
    ),
    g!(8, (1, -14), // 'f'

        "..###" ".#..." ".#..." ".#..." ".#..." "#####" ".#..." ".#..." ".#..." ".#..." ".#..." ".#..." ".#..." ".#..."
    ),
    g!(10, (1, -10), // 'g'
        ".####.#" "#....##" "#.....#" "#.....#" "#.....#" "#....##" ".####.#" "......#" "#.....#" ".#....#" "..####."
    ),
    g!(10, (1, -14), // 'h'

        "#......" "#......" "#......" "#......" "#......" "#.####." "##....#" "#.....#" "#.....#" "#.....#" "#.....#" "#.....#" "#.....#" "#.....#"
    ),
    g!(6, (1, -14), // 'i'
        "#" "." "." "#" "#" "#" "#" "#" "#" "#" "#" "#" "#" "#"
    ),
    g!(8, (0, -14), // 'j'
        "..#" "..." "..." "..#" "..#" "..#" "..#" "..#" "..#" "..#" "..#" "..#" "..#" "#.#" ".#."
    ),
    g!(10, (1, -14), // 'k'

        "#......" "#......" "#......" "#......" "#......" "#....#." "#...#.." "#..#..." "#.#...." "###...." "#.#...." "#..#..." "#..#..." "#...#.."
    ),
    g!(6, (1, -14), // 'l'

        "#" "#" "#" "#" "#" "#" "#" "#" "#" "#" "#" "#" "#" "#"
    ),
    g!(16, (1, -10), // 'm'
        "#.####..####." "##....##....#" "#.....#.....#" "#.....#.....#" "#.....#.....#" "#.....#.....#" "#.....#.....#" "#.....#.....#" "#.....#.....#" "#.....#.....#"
    ),
    g!(10, (1, -10), // 'n'
        "#.####." "##....#" "#.....#" "#.....#" "#.....#" "#.....#" "#.....#" "#.....#" "#.....#" "#.....#"
    ),
    g!(10, (1, -10), // 'o'
        ".#####." "#.....#" "#.....#" "#.....#" "#.....#" "#.....#" "#.....#" "#.....#" "#.....#" ".#####."
    ),
    g!(10, (1, -10), // 'p'
        "#.####." "##....#" "#.....#" "#.....#" "#.....#" "#.....#" "##....#" "#.####." "#......" "#......" "#......" "#......" "#......"
    ),
    g!(10, (1, -10), // 'q'
        ".####.#" "#....##" "#.....#" "#.....#" "#.....#" "#.....#" "#....##" ".####.#" "......#" "......#" "......#" "......#" "......#"
    ),
    g!(10, (1, -10), // 'r'
        "#.####" "##...#" "#....." "#....." "#....." "#....." "#....." "#....." "#....." "#....."
    ),
    g!(10, (1, -10), // 's'

        ".#####." "#.....#" "#......" "#......" ".#####." "......#" "......#" "......#" "#.....#" ".#####."
    ),
    g!(8, (1, -14), // 't'

        ".#..." ".#..." ".#..." ".#..." "#####" ".#..." ".#..." ".#..." ".#..." ".#..." ".#..." ".#..#" ".#..#" "..##."
    ),
    g!(10, (1, -10), // 'u'
        "#.....#" "#.....#" "#.....#" "#.....#" "#.....#" "#.....#" "#.....#" "#.....#" "#....##" ".####.#"
    ),
    g!(10, (0, -10), // 'v'
        "#.......#" "#.......#" ".#.....#." ".#.....#." "..#...#.." "..#...#.." "...#.#..." "...#.#..." "....#...." "....#...."
    ),
    g!(16, (1, -10), // 'w'
        "#....#....#" "#....#....#" "#...#.#...#" "#...#.#...#" ".#..#.#..#." ".#.#...#.#." ".#.#...#.#." "..#.....#.." "..#.....#.." "..#.....#.."
    ),
    g!(10, (1, -10), // 'x'

        "#.....#" ".#...#." "..#.#.." "..#.#.." "...#..." "...#..." "..#.#.." "..#.#.." ".#...#." "#.....#"
    ),
    g!(12, (1, -10), // 'y'
        "#......#" "#......#" ".#....#." ".#....#." "..#..#.." "..#..#.." "...##..." "...##..." "....#..." "...#...." "...#...." ".###...."
    ),
    g!(10, (1, -10), // 'z'
        "########" ".......#" "......#." ".....#.." "....#..." "...#...." "..#....." ".#......" "#......." "########"
    ),
    g!(8, (2, -15), // '{'
        "..##" ".#.." ".#.." ".#.." ".#.." ".#.." "##.." ".#.." ".#.." ".#.." ".#.." ".#.." ".#.." "..##"
    ),
    g!(4, (2, -15), // '|'
        "#" "#" "#" "#" "#" "#" "#" "#" "#" "#" "#" "#" "#" "#" "#"
    ),
    g!(8, (3, -15), // '}'
        "##.." "..#." "..#." "..#." "..#." "..#." "..##" "..#." "..#." "..#." "..#." "..#." "..#." "##.."
    ),
    g!(12, (2, -8), // '~'
        ".##....#" "#..####."
    ),
];

const LEN: usize = data_len(GENEVA_18_SRC);
pub const GENEVA_18_GLYPHS: [Glyph; 95] = decode_glyphs(GENEVA_18_SRC);
pub const GENEVA_18_DATA: [u8; LEN] = decode_data(GENEVA_18_SRC);

#[allow(dead_code)]
pub const FACE: DecodedFace = DecodedFace {
    metrics: GENEVA_18_METRICS,
    glyphs: &GENEVA_18_GLYPHS,
    data: &GENEVA_18_DATA,
};