systemless 0.1.131

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 9 — our own humanist body sans at 9px (systemless
//! compatibility face for Geneva 9). Metrics (advance, origin_x,
//! x-height 5 / cap height 7, side-bearings) are conformed to the
//! original Geneva 9 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, open-tail g). At 5px x-height most
//! plain glyphs converge on the one good humanist solution, but 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_9_METRICS: FontMetrics =
    FontMetrics { ascent: 10, descent: 2, wid_max: 10, leading: 0 };

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

const LEN: usize = data_len(GENEVA_9_SRC);
pub const GENEVA_9_GLYPHS: [Glyph; 95] = decode_glyphs(GENEVA_9_SRC);
pub const GENEVA_9_DATA: [u8; LEN] = decode_data(GENEVA_9_SRC);

#[allow(dead_code)]
pub const FACE: DecodedFace = DecodedFace {
    metrics: GENEVA_9_METRICS,
    glyphs: &GENEVA_9_GLYPHS,
    data: &GENEVA_9_DATA,
};