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 12 — our own heavy Mac system/UI font at 12px (systemless
//! compatibility face for Chicago 12). Metrics (advance, origin_x,
//! x-height 7 / cap height 9, side-bearings) are conformed to the
//! original Chicago 12 strike so menus, buttons and titles lay out
//! identically; the pixels are our own hand-drawn letterforms — a heavy
//! humanist UI weight with 2px stems, distinct from Geneva's light body
//! face. 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_12_METRICS: FontMetrics =
    FontMetrics { ascent: 12, descent: 3, wid_max: 14, leading: 1 };

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

const LEN: usize = data_len(CHICAGO_12_SRC);
pub const CHICAGO_12_GLYPHS: [Glyph; 95] = decode_glyphs(CHICAGO_12_SRC);
pub const CHICAGO_12_DATA: [u8; LEN] = decode_data(CHICAGO_12_SRC);

#[allow(dead_code)]
pub const FACE: DecodedFace = DecodedFace {
    metrics: CHICAGO_12_METRICS,
    glyphs: &CHICAGO_12_GLYPHS,
    data: &CHICAGO_12_DATA,
};