pub const CHAR_W: usize = 8;
pub const CHAR_H: usize = 8;
const FIRST_CHAR: u8 = 0x20;
const LAST_CHAR: u8 = 0x7E;
#[rustfmt::skip]
const GLYPHS: [[u8; CHAR_H]; (LAST_CHAR - FIRST_CHAR + 1) as usize] = [
[0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00],
[0x18,0x18,0x18,0x18,0x18,0x00,0x18,0x00],
[0x66,0x66,0x66,0x00,0x00,0x00,0x00,0x00],
[0x6C,0x6C,0xFE,0x6C,0xFE,0x6C,0x6C,0x00],
[0x18,0x3E,0x60,0x3C,0x06,0x7C,0x18,0x00],
[0x00,0xC6,0xCC,0x18,0x30,0x66,0xC6,0x00],
[0x38,0x6C,0x38,0x76,0xDC,0xCC,0x76,0x00],
[0x18,0x18,0x30,0x00,0x00,0x00,0x00,0x00],
[0x0C,0x18,0x30,0x30,0x30,0x18,0x0C,0x00],
[0x30,0x18,0x0C,0x0C,0x0C,0x18,0x30,0x00],
[0x00,0x66,0x3C,0xFF,0x3C,0x66,0x00,0x00],
[0x00,0x18,0x18,0x7E,0x18,0x18,0x00,0x00],
[0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x30],
[0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x00],
[0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00],
[0x06,0x0C,0x18,0x30,0x60,0xC0,0x80,0x00],
[0x7C,0xC6,0xCE,0xDE,0xF6,0xE6,0x7C,0x00],
[0x18,0x38,0x18,0x18,0x18,0x18,0x7E,0x00],
[0x7C,0xC6,0x06,0x1C,0x30,0x66,0xFE,0x00],
[0x7C,0xC6,0x06,0x3C,0x06,0xC6,0x7C,0x00],
[0x1C,0x3C,0x6C,0xCC,0xFE,0x0C,0x1E,0x00],
[0xFE,0xC0,0xC0,0xFC,0x06,0xC6,0x7C,0x00],
[0x38,0x60,0xC0,0xFC,0xC6,0xC6,0x7C,0x00],
[0xFE,0xC6,0x0C,0x18,0x30,0x30,0x30,0x00],
[0x7C,0xC6,0xC6,0x7C,0xC6,0xC6,0x7C,0x00],
[0x7C,0xC6,0xC6,0x7E,0x06,0x0C,0x78,0x00],
[0x00,0x18,0x18,0x00,0x00,0x18,0x18,0x00],
[0x00,0x18,0x18,0x00,0x00,0x18,0x18,0x30],
[0x06,0x0C,0x18,0x30,0x18,0x0C,0x06,0x00],
[0x00,0x00,0x7E,0x00,0x7E,0x00,0x00,0x00],
[0x60,0x30,0x18,0x0C,0x18,0x30,0x60,0x00],
[0x7C,0xC6,0x0C,0x18,0x18,0x00,0x18,0x00],
[0x7C,0xC6,0xDE,0xDE,0xDE,0xC0,0x78,0x00],
[0x38,0x6C,0xC6,0xC6,0xFE,0xC6,0xC6,0x00],
[0xFC,0x66,0x66,0x7C,0x66,0x66,0xFC,0x00],
[0x3C,0x66,0xC0,0xC0,0xC0,0x66,0x3C,0x00],
[0xF8,0x6C,0x66,0x66,0x66,0x6C,0xF8,0x00],
[0xFE,0x62,0x68,0x78,0x68,0x62,0xFE,0x00],
[0xFE,0x62,0x68,0x78,0x68,0x60,0xF0,0x00],
[0x3C,0x66,0xC0,0xC0,0xCE,0x66,0x3E,0x00],
[0xC6,0xC6,0xC6,0xFE,0xC6,0xC6,0xC6,0x00],
[0x3C,0x18,0x18,0x18,0x18,0x18,0x3C,0x00],
[0x1E,0x0C,0x0C,0x0C,0xCC,0xCC,0x78,0x00],
[0xE6,0x66,0x6C,0x78,0x6C,0x66,0xE6,0x00],
[0xF0,0x60,0x60,0x60,0x62,0x66,0xFE,0x00],
[0xC6,0xEE,0xFE,0xFE,0xD6,0xC6,0xC6,0x00],
[0xC6,0xE6,0xF6,0xDE,0xCE,0xC6,0xC6,0x00],
[0x7C,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x00],
[0xFC,0x66,0x66,0x7C,0x60,0x60,0xF0,0x00],
[0x7C,0xC6,0xC6,0xC6,0xD6,0x7C,0x0E,0x00],
[0xFC,0x66,0x66,0x7C,0x6C,0x66,0xE6,0x00],
[0x7C,0xC6,0xE0,0x78,0x0E,0xC6,0x7C,0x00],
[0x7E,0x7E,0x5A,0x18,0x18,0x18,0x3C,0x00],
[0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x00],
[0xC6,0xC6,0xC6,0xC6,0xC6,0x6C,0x38,0x00],
[0xC6,0xC6,0xC6,0xD6,0xFE,0xEE,0xC6,0x00],
[0xC6,0xC6,0x6C,0x38,0x6C,0xC6,0xC6,0x00],
[0x66,0x66,0x66,0x3C,0x18,0x18,0x3C,0x00],
[0xFE,0xC6,0x8C,0x18,0x32,0x66,0xFE,0x00],
[0x3C,0x30,0x30,0x30,0x30,0x30,0x3C,0x00],
[0xC0,0x60,0x30,0x18,0x0C,0x06,0x02,0x00],
[0x3C,0x0C,0x0C,0x0C,0x0C,0x0C,0x3C,0x00],
[0x10,0x38,0x6C,0xC6,0x00,0x00,0x00,0x00],
[0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF],
[0x30,0x18,0x0C,0x00,0x00,0x00,0x00,0x00],
[0x00,0x00,0x78,0x0C,0x7C,0xCC,0x76,0x00],
[0xE0,0x60,0x7C,0x66,0x66,0x66,0xDC,0x00],
[0x00,0x00,0x7C,0xC6,0xC0,0xC6,0x7C,0x00],
[0x1C,0x0C,0x7C,0xCC,0xCC,0xCC,0x76,0x00],
[0x00,0x00,0x7C,0xC6,0xFE,0xC0,0x7C,0x00],
[0x3C,0x66,0x60,0xF8,0x60,0x60,0xF0,0x00],
[0x00,0x00,0x76,0xCC,0xCC,0x7C,0x0C,0xF8],
[0xE0,0x60,0x6C,0x76,0x66,0x66,0xE6,0x00],
[0x18,0x00,0x38,0x18,0x18,0x18,0x3C,0x00],
[0x06,0x00,0x06,0x06,0x06,0x66,0x66,0x3C],
[0xE0,0x60,0x66,0x6C,0x78,0x6C,0xE6,0x00],
[0x38,0x18,0x18,0x18,0x18,0x18,0x3C,0x00],
[0x00,0x00,0xEC,0xFE,0xD6,0xD6,0xD6,0x00],
[0x00,0x00,0xDC,0x66,0x66,0x66,0x66,0x00],
[0x00,0x00,0x7C,0xC6,0xC6,0xC6,0x7C,0x00],
[0x00,0x00,0xDC,0x66,0x66,0x7C,0x60,0xF0],
[0x00,0x00,0x76,0xCC,0xCC,0x7C,0x0C,0x1E],
[0x00,0x00,0xDC,0x76,0x60,0x60,0xF0,0x00],
[0x00,0x00,0x7E,0xC0,0x7C,0x06,0xFC,0x00],
[0x30,0x30,0xFC,0x30,0x30,0x36,0x1C,0x00],
[0x00,0x00,0xCC,0xCC,0xCC,0xCC,0x76,0x00],
[0x00,0x00,0xC6,0xC6,0xC6,0x6C,0x38,0x00],
[0x00,0x00,0xC6,0xD6,0xD6,0xFE,0x6C,0x00],
[0x00,0x00,0xC6,0x6C,0x38,0x6C,0xC6,0x00],
[0x00,0x00,0xC6,0xC6,0xC6,0x7E,0x06,0xFC],
[0x00,0x00,0xFE,0x4C,0x18,0x32,0xFE,0x00],
[0x0E,0x18,0x18,0x70,0x18,0x18,0x0E,0x00],
[0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00],
[0x70,0x18,0x18,0x0E,0x18,0x18,0x70,0x00],
[0x76,0xDC,0x00,0x00,0x00,0x00,0x00,0x00],
];
pub fn glyph(c: char) -> [u8; CHAR_H] {
let n = c as u32;
if (FIRST_CHAR as u32..=LAST_CHAR as u32).contains(&n) {
GLYPHS[(n - FIRST_CHAR as u32) as usize]
} else {
GLYPHS[0]
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn space_glyph_is_blank() {
assert_eq!(glyph(' '), [0u8; 8]);
}
#[test]
fn unknown_char_falls_back_to_blank() {
assert_eq!(glyph('\x00'), [0u8; 8]);
assert_eq!(glyph('日'), [0u8; 8]);
}
#[test]
fn digit_glyphs_have_pixels() {
for c in '0'..='9' {
assert!(
glyph(c).iter().any(|&b| b != 0),
"digit {c} should have non-blank glyph"
);
}
}
#[test]
fn uppercase_glyphs_have_pixels() {
for c in 'A'..='Z' {
assert!(glyph(c).iter().any(|&b| b != 0), "{c} should be non-blank");
}
}
#[test]
fn glyph_table_covers_full_printable_range() {
assert_eq!(GLYPHS.len(), 95);
}
}