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".
//! Mallee 10 — our own fixed-width terminal face at 10px (systemless
//! compatibility face for Monaco 10). Metrics (fixed advance 6, origin_x,
//! x-height 6 / cap height 8) are conformed to the original Monaco 10
//! strike so monospaced text lines up identically; the pixels are our own
//! hand-drawn monospace letterforms. 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 MONACO_10_METRICS: FontMetrics =
    FontMetrics { ascent: 10, descent: 3, wid_max: 6, leading: 1 };

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

const LEN: usize = data_len(MONACO_10_SRC);
pub const MONACO_10_GLYPHS: [Glyph; 95] = decode_glyphs(MONACO_10_SRC);
pub const MONACO_10_DATA: [u8; LEN] = decode_data(MONACO_10_SRC);

#[allow(dead_code)]
pub const FACE: DecodedFace = DecodedFace {
    metrics: MONACO_10_METRICS,
    glyphs: &MONACO_10_GLYPHS,
    data: &MONACO_10_DATA,
};