systemless 0.1.126

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".
//! Jarrah 9 — our own heavy Mac system/UI font at 9px (systemless
//! compatibility face for Chicago 9). Metrics (advance, origin_x,
//! x-height 6 / cap height 7, side-bearings) are conformed to the
//! original Chicago 9 strike so menus/buttons lay out identically; the
//! pixels are our own hand-drawn letterforms — a heavier UI weight than
//! Geneva, with 2px stems where the tight advances allow. 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 CHICAGO_9_METRICS: FontMetrics =
    FontMetrics { ascent: 9, descent: 3, wid_max: 11, leading: 0 };

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

const LEN: usize = data_len(CHICAGO_9_SRC);
pub const CHICAGO_9_GLYPHS: [Glyph; 95] = decode_glyphs(CHICAGO_9_SRC);
pub const CHICAGO_9_DATA: [u8; LEN] = decode_data(CHICAGO_9_SRC);

#[allow(dead_code)]
pub const FACE: DecodedFace = DecodedFace {
    metrics: CHICAGO_9_METRICS,
    glyphs: &CHICAGO_9_GLYPHS,
    data: &CHICAGO_9_DATA,
};