systemless 0.1.128

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".
//! Ironbark 14 — our own serif body face at 14px (systemless compatibility
//! face for New York 14 / Times 14). Metrics (advance, origin_x, x-height 8
//! / cap height 11, side-bearings) are conformed to the original New York 14
//! strike so text lays out identically; the pixels are our own hand-drawn
//! serif letterforms — 1px stems with slab serif ears and feet. 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 NEWYORK_14_METRICS: FontMetrics =
    FontMetrics { ascent: 14, descent: 3, wid_max: 16, leading: 2 };

pub const NEWYORK_14_SRC: &[GlyphSrc] = &[
    g!(4, (4, -1), ), // ' '
    g!(5, (2, -11), // '!'
        "#" "#" "#" "#" "#" "#" "#" "." "." "#"
    ),
    g!(5, (1, -11), // '"'
        "#.#" "#.#" "#.#"
    ),
    g!(9, (1, -10), // '#'
        ".#.#." ".#.#." "#####" ".#.#." "#####" ".#.#." ".#.#."
    ),
    g!(7, (1, -11), // '$'
        "..#.." ".####" "#.#.." ".###." "..#.#" "..#.#" "####." "..#.."
    ),
    g!(11, (1, -11), // '%'
        "##...#" "##..#." "...#.." "..#..." ".#...#" "#...##" "....##"
    ),
    g!(11, (1, -11), // '&'
        ".####..." "#....#.." "#....#.." ".#..#..." "..##...#" ".#..#.#." "#....##." "#....#.." ".#####.#"
    ),
    g!(4, (1, -11), // '\''
        "#" "#" "#"
    ),
    g!(6, (1, -11), // '('
        "..#" ".#." "#.." "#.." "#.." "#.." "#.." "#.." ".#." "..#"
    ),
    g!(6, (2, -11), // ')'
        "#.." ".#." "..#" "..#" "..#" "..#" "..#" "..#" ".#." "#.."
    ),
    g!(7, (1, -11), // '*'
        "#.#.#" ".###." "#.#.#"
    ),
    g!(8, (0, -8), // '+'
        "...#..." "...#..." "#######" "...#..." "...#..."
    ),
    g!(4, (1, -2), // ','
        ".#" ".#" "#."
    ),
    g!(8, (1, -5), // '-'
        "######"
    ),
    g!(3, (1, -1), // '.'
        "#"
    ),
    g!(8, (2, -11), // '/'
        "....#" "...#." "..#.." "..#.." ".#..." ".#..." "#...." "#...."
    ),
    g!(10, (1, -11), // '0'
        "..###.." ".#...#." "#.....#" "#.....#" "#.....#" "#.....#" "#.....#" "#.....#" "#.....#" ".#...#." "..###.."
    ),
    g!(10, (3, -11), // '1'
        ".#." "##." ".#." ".#." ".#." ".#." ".#." ".#." ".#." ".#." "###"
    ),
    g!(10, (1, -11), // '2'
        "..###.." ".#...#." "#....#." ".....#." "....#.." "...#..." "..#...." ".#....." "#......" "#......" "#######"
    ),
    g!(10, (1, -11), // '3'
        "..###.." ".#...#." "#....#." ".....#." "...##.." ".....#." "......#" "......#" "#....#." ".#...#." "..###.."
    ),
    g!(10, (1, -11), // '4'
        "....##." "...#.#." "..#..#." ".#...#." "#....#." "#######" ".....#." ".....#." ".....#." ".....#." ".....#."
    ),
    g!(10, (2, -11), // '5'
        "######" "#....." "#....." "#####." ".....#" ".....#" ".....#" ".....#" "#....#" ".#..#." "..##.."
    ),
    g!(10, (1, -11), // '6'
        "...##.." "..#...." ".#....." "#......" "#.####." "##....#" "#.....#" "#.....#" "#.....#" ".#...#." "..###.."
    ),
    g!(10, (1, -11), // '7'
        "#######" "......#" ".....#." ".....#." "....#.." "....#.." "...#..." "...#..." "..#...." "..#...." "..#...."
    ),
    g!(10, (1, -11), // '8'
        "..###.." ".#...#." "#.....#" ".#...#." "..###.." ".#...#." "#.....#" "#.....#" "#.....#" ".#...#." "..###.."
    ),
    g!(10, (1, -11), // '9'
        "..###.." ".#...#." "#.....#" "#.....#" "#.....#" ".#...##" "..###.#" "......#" ".....#." "...##.." ".##...."
    ),
    g!(4, (2, -8), // ':'
        "#" "." "." "." "." "#"
    ),
    g!(4, (1, -8), // ';'
        ".#" ".." ".." ".." ".#" ".#" "#."
    ),
    g!(6, (1, -9), // '<'
        "...#" "..#." ".#.." "#..." ".#.." "..#." "...#"
    ),
    g!(8, (1, -8), // '='
        "######" "......" "######"
    ),
    g!(6, (1, -9), // '>'
        "#..." ".#.." "..#." "...#" "..#." ".#.." "#..."
    ),
    g!(9, (1, -11), // '?'
        "..###.." ".#...#." "#....#." ".....#." "....#.." "...#..." "...#..." "......." "...#..." "...#..."
    ),
    g!(11, (1, -10), // '@'
        ".######." "#......#" "#.####.#" "#.#..#.#" "#.####.." "#......." ".######."
    ),
    g!(12, (0, -11), // 'A'
        "...##...." "...##...." "..#..#..." "..#..#..." ".#....#.." ".######.." ".#....#.." "#......#." "#......#." "#......#." "##....###"
    ),
    g!(10, (0, -11), // 'B'
        "#####.." "##...#." "##...#." "##...#." "#####.." "##...#." "##...#." "##...#." "##...#." "##...#." "#####.."
    ),
    g!(9, (0, -11), // 'C'
        "..####." ".#....#" "#....#." "#......" "#......" "#......" "#......" "#......" "#....#." ".#....#" "..####."
    ),
    g!(9, (0, -11), // 'D'
        "#####.." "##...#." "##....#" "##....#" "##....#" "##....#" "##....#" "##....#" "##....#" "##...#." "#####.."
    ),
    g!(8, (0, -11), // 'E'
        "######" "##...#" "##...." "##...." "#####." "##...." "##...." "##...." "##...." "##...#" "######"
    ),
    g!(8, (0, -11), // 'F'
        "######" "##...#" "##...." "##...." "#####." "##...." "##...." "##...." "##...." "##...." "##...."
    ),
    g!(10, (0, -11), // 'G'
        "..####." ".#....#" "#....#." "#......" "#......" "#..####" "#....##" "#.....#" "#....#." ".#....#" "..####."
    ),
    g!(10, (0, -11), // 'H'
        "##...##" ".#...#." ".#...#." ".#...#." ".#...#." ".#####." ".#...#." ".#...#." ".#...#." ".#...#." "##...##"
    ),
    g!(6, (1, -11), // 'I'
        "###" ".#." ".#." ".#." ".#." ".#." ".#." ".#." ".#." ".#." "###"
    ),
    g!(5, (0, -11), // 'J'
        "..###" "...#." "...#." "...#." "...#." "...#." "...#." "#..#." "#..#." "#..#." ".##.."
    ),
    g!(10, (0, -11), // 'K'
        "##..##" ".#.##." ".###.." ".##..." ".###.." ".#.##." ".#..#." ".#..#." ".#...#" "##...#" "##...#"
    ),
    g!(8, (0, -11), // 'L'
        "##...." "##...." "##...." "##...." "##...." "##...." "##...." "##...." "##...." "##...#" "######"
    ),
    g!(12, (0, -11), // 'M'
        "##.....##" "##.....##" "###...###" "#.#...#.#" "#.#...#.#" "#..#.#..#" "#..#.#..#" "#...#...#" "#...#...#" "#.......#" "##.....##"
    ),
    g!(10, (0, -11), // 'N'
        "##...##" ".##..#." ".##..#." ".#.#.#." ".#.#.#." ".#..##." ".#..##." ".#...#." ".#...#." ".#...#." "##...##"
    ),
    g!(9, (0, -11), // 'O'
        "..####.." ".#....#." "#......#" "#......#" "#......#" "#......#" "#......#" "#......#" "#......#" ".#....#." "..####.."
    ),
    g!(9, (0, -11), // 'P'
        "#####." "##...#" "##...#" "##...#" "#####." "##...." "##...." "##...." "##...." "##...." "##...."
    ),
    g!(9, (0, -11), // 'Q'
        "..####.." ".#....#." "#......#" "#......#" "#......#" "#......#" "#......#" "#..#..#." ".#..#.#." "..####.." "....###."
    ),
    g!(10, (0, -11), // 'R'
        "#####." "##...#" "##...#" "##...#" "#####." "###..." "##.#.." "##..#." "##..#." "##...#" "##...#"
    ),
    g!(9, (0, -11), // 'S'
        "..####." ".#....#" "#....#." "#......" ".#####." "......#" "......#" ".#....#" "#....#." ".#....#" "..####."
    ),
    g!(8, (0, -11), // 'T'
        "#######" "#..#..#" "...#..." "...#..." "...#..." "...#..." "...#..." "...#..." "...#..." "...#..." "..###.."
    ),
    g!(11, (0, -11), // 'U'
        "##...##" ".#...#." ".#...#." ".#...#." ".#...#." ".#...#." ".#...#." ".#...#." ".#...#." "..#.#.." "..###.."
    ),
    g!(12, (0, -11), // 'V'
        "##....##" ".#....#." ".#....#." "..#..#.." "..#..#.." "..#..#.." "...##..." "...##..." "...##..." "....#..." "....#..."
    ),
    g!(14, (0, -11), // 'W'
        "##..#..##" ".#..#..#." ".#.###.#." ".#.#.#.#." ".#.#.#.#." "..##.##.." "..##.##.." "..#...#.." "..#...#.." "..#...#.." "..#...#.."
    ),
    g!(10, (0, -11), // 'X'
        "##...##" ".#...#." "..#.#.." "...#..." "...#..." "...#..." "..#.#.." ".#...#." ".#...#." "#.....#" "##...##"
    ),
    g!(10, (0, -11), // 'Y'
        "##...##" ".#...#." "..#.#.." "...#..." "...#..." "...#..." "...#..." "...#..." "...#..." "...#..." "..###.."
    ),
    g!(8, (0, -11), // 'Z'
        "######" ".....#" "....#." "...#.." "..#..." ".#...." "#....." "#....." "#....." "#....." "######"
    ),
    g!(4, (1, -12), // '['
        "###" "#.." "#.." "#.." "#.." "#.." "#.." "#.." "#.." "#.." "#.." "#.." "###"
    ),
    g!(7, (1, -11), // '\\'
        "#...." "#...." ".#..." ".#..." "..#.." "..#.." "...#." "...#." "....#"
    ),
    g!(4, (1, -12), // ']'
        "###" "..#" "..#" "..#" "..#" "..#" "..#" "..#" "..#" "..#" "..#" "..#" "###"
    ),
    g!(7, (1, -11), // '^'
        "..#.." ".#.#." "#...#"
    ),
    g!(7, (0, 2), // '_'
        "#######"
    ),
    g!(5, (1, -12), // '`'
        "#." ".#"
    ),
    g!(8, (0, -8), // 'a'

        ".####." "#....#" "..####" ".#...#" ".#...#" "#....#" "#...##" ".##.##"
    ),
    g!(9, (0, -11), // 'b'
        "##...." ".#...." ".#...." ".#.##." ".##..#" ".#...#" ".#...#" ".#...#" ".#...#" ".##..#" "###.#."
    ),
    g!(7, (0, -8), // 'c'

        ".####" "#...#" "#...." "#...." "#...." "#...." "#...#" ".####"
    ),
    g!(9, (0, -11), // 'd'
        "....##" "....#." "....#." ".##.#." "#..##." "#...#." "#...#." "#...#." "#...#." "#..##." ".#.###"
    ),
    g!(8, (0, -8), // 'e'

        ".####." "#....#" "######" "#....." "#....." "#....." "#....#" ".####."
    ),
    g!(5, (0, -11), // 'f'
        "..##" ".#.." ".#.." "###." ".#.." ".#.." ".#.." ".#.." ".#.." ".#.." "###."
    ),
    g!(8, (0, -9), // 'g'
        ".#####" "#....#" "#....#" ".#####" "#....." ".####." "#...#." "#....#" ".####." "....#." "....#." "..###."
    ),
    g!(10, (0, -11), // 'h'
        "##....." ".#....." ".#....." ".#.##.." ".##..#." ".#...#." ".#...#." ".#...#." ".#...#." ".#...#." "###.###"
    ),
    g!(4, (0, -10), // 'i'
        ".#." ".#." "##." ".#." ".#." ".#." ".#." ".#." ".#." "###"
    ),
    g!(5, (0, -10), // 'j'
        "..#" "..#" ".##" "..#" "..#" "..#" "..#" "..#" "..#" "..#" "..#" "#.#" ".#."
    ),
    g!(8, (0, -11), // 'k'

        "##...." ".#...." ".#...." ".#..##" ".#.##." ".###.." ".###.." ".##.#." ".#..#." ".#..#." "###..#"
    ),
    g!(4, (0, -11), // 'l'
        "##." ".#." ".#." ".#." ".#." ".#." ".#." ".#." ".#." ".#." "###"
    ),
    g!(14, (0, -8), // 'm'
        ".#.##..##." "###..##..#" ".#...#...#" ".#...#...#" ".#...#...#" ".#...#...#" ".#...#...#" "###.###.##"
    ),
    g!(10, (0, -8), // 'n'
        ".#.##.." "###..#." ".#...#." ".#...#." ".#...#." ".#...#." ".#...#." "###.###"
    ),
    g!(8, (0, -8), // 'o'

        "..##.." ".#..#." "#....#" "#....#" "#....#" "#....#" ".#..#." "..##.."
    ),
    g!(9, (0, -8), // 'p'
        "#.##.." ".##..#" ".#...#" ".#...#" ".#...#" ".##..#" ".#.##." ".#...." ".#...." ".#...." "###..."
    ),
    g!(9, (0, -8), // 'q'
        ".##.##" "#..##." "#...#." "#...#." "#...#." "#..##." ".##.#." "....#." "....#." "....#." "...###"
    ),
    g!(8, (0, -8), // 'r'

        "#.###" "###.#" ".#..." ".#..." ".#..." ".#..." ".#..." "###.."
    ),
    g!(7, (0, -8), // 's'

        ".####" "#...." ".###." "....#" "....#" "#...#" ".###." ".###."
    ),
    g!(6, (0, -11), // 't'

        ".#.." ".#.." "####" ".#.." ".#.." ".#.." ".#.." ".#.." ".#.." ".#.#" "..##"
    ),
    g!(10, (0, -8), // 'u'

        "#...#." "#...#." "#...#." "#...#." "#...#." "#...#." "#..##." ".##.##"
    ),
    g!(10, (0, -8), // 'v'

        "##...##" ".#...#." ".#...#." "..#.#.." "..#.#.." "..#.#.." "...#..." "...#..."
    ),
    g!(12, (0, -8), // 'w'

        "##..#..##" ".#..#..#." ".#.#.#.#." ".#.#.#.#." ".#.#.#.#." "..#.#.#.." "..#...#.." "..#...#.."
    ),
    g!(8, (0, -8), // 'x'

        "##..##" ".#..#." "..##.." "..##.." "..##.." ".#..#." "#....#" "##..##"
    ),
    g!(10, (0, -8), // 'y'
        "##...##" ".#...#." ".#...#." "..#.#.." "..#.#.." "...#..." "...#..." "..#...." ".##...." "##....." "#......"
    ),
    g!(7, (0, -8), // 'z'

        "#####" "...##" "..#.." ".#..." ".#..." "#...." "#####" "#####"
    ),
    g!(5, (1, -12), // '{'
        "..##" ".#.." ".#.." ".#.." "##.." ".#.." ".#.." ".#.." ".#.." "..##"
    ),
    g!(3, (1, -12), // '|'
        "#" "#" "#" "#" "#" "#" "#" "#" "#" "#" "#" "#"
    ),
    g!(5, (1, -12), // '}'
        "##.." "..#." "..#." "..#." "..##" "..#." "..#." "..#." "..#." "##.."
    ),
    g!(8, (1, -6), // '~'
        ".##...#" "#..###."
    ),
];

const LEN: usize = data_len(NEWYORK_14_SRC);
pub const NEWYORK_14_GLYPHS: [Glyph; 95] = decode_glyphs(NEWYORK_14_SRC);
pub const NEWYORK_14_DATA: [u8; LEN] = decode_data(NEWYORK_14_SRC);

#[allow(dead_code)]
pub const FACE: DecodedFace = DecodedFace {
    metrics: NEWYORK_14_METRICS,
    glyphs: &NEWYORK_14_GLYPHS,
    data: &NEWYORK_14_DATA,
};