pub const GLYPH_W: i32 = 4;
pub const GLYPH_H: i32 = 7;
pub const UNKNOWN: [u8; 6] = [0b111, 0b111, 0b111, 0b111, 0b111, 0b000];
pub fn glyph(c: char) -> [u8; 6] {
let i = c as u32;
if (32..127).contains(&i) {
GLYPHS[(i - 32) as usize]
} else {
UNKNOWN
}
}
pub fn text_width(s: &str) -> i32 {
s.chars().count() as i32 * GLYPH_W
}
#[rustfmt::skip]
const GLYPHS: [[u8; 6]; 95] = [
[0b000, 0b000, 0b000, 0b000, 0b000, 0b000], [0b010, 0b010, 0b010, 0b000, 0b010, 0b000], [0b101, 0b101, 0b000, 0b000, 0b000, 0b000], [0b101, 0b111, 0b101, 0b111, 0b101, 0b000], [0b111, 0b110, 0b111, 0b011, 0b111, 0b000], [0b101, 0b001, 0b010, 0b100, 0b101, 0b000], [0b010, 0b101, 0b010, 0b101, 0b011, 0b000], [0b010, 0b100, 0b000, 0b000, 0b000, 0b000], [0b001, 0b010, 0b010, 0b010, 0b001, 0b000], [0b100, 0b010, 0b010, 0b010, 0b100, 0b000], [0b101, 0b010, 0b111, 0b010, 0b101, 0b000], [0b000, 0b010, 0b111, 0b010, 0b000, 0b000], [0b000, 0b000, 0b000, 0b010, 0b100, 0b000], [0b000, 0b000, 0b111, 0b000, 0b000, 0b000], [0b000, 0b000, 0b000, 0b000, 0b010, 0b000], [0b001, 0b001, 0b010, 0b100, 0b100, 0b000], [0b111, 0b101, 0b101, 0b101, 0b111, 0b000], [0b110, 0b010, 0b010, 0b010, 0b111, 0b000], [0b111, 0b001, 0b111, 0b100, 0b111, 0b000], [0b111, 0b001, 0b011, 0b001, 0b111, 0b000], [0b101, 0b101, 0b111, 0b001, 0b001, 0b000], [0b111, 0b100, 0b111, 0b001, 0b111, 0b000], [0b011, 0b100, 0b111, 0b101, 0b111, 0b000], [0b111, 0b001, 0b001, 0b001, 0b001, 0b000], [0b111, 0b101, 0b111, 0b101, 0b111, 0b000], [0b111, 0b101, 0b111, 0b001, 0b110, 0b000], [0b000, 0b010, 0b000, 0b010, 0b000, 0b000], [0b000, 0b010, 0b000, 0b010, 0b100, 0b000], [0b001, 0b010, 0b100, 0b010, 0b001, 0b000], [0b000, 0b111, 0b000, 0b111, 0b000, 0b000], [0b100, 0b010, 0b001, 0b010, 0b100, 0b000], [0b111, 0b001, 0b011, 0b000, 0b010, 0b000], [0b111, 0b101, 0b111, 0b100, 0b011, 0b000], [0b111, 0b101, 0b111, 0b101, 0b101, 0b000], [0b111, 0b101, 0b110, 0b101, 0b111, 0b000], [0b011, 0b100, 0b100, 0b100, 0b011, 0b000], [0b110, 0b101, 0b101, 0b101, 0b110, 0b000], [0b111, 0b100, 0b110, 0b100, 0b111, 0b000], [0b111, 0b100, 0b110, 0b100, 0b100, 0b000], [0b011, 0b100, 0b101, 0b101, 0b011, 0b000], [0b101, 0b101, 0b111, 0b101, 0b101, 0b000], [0b111, 0b010, 0b010, 0b010, 0b111, 0b000], [0b111, 0b010, 0b010, 0b010, 0b110, 0b000], [0b101, 0b101, 0b110, 0b101, 0b101, 0b000], [0b100, 0b100, 0b100, 0b100, 0b111, 0b000], [0b111, 0b111, 0b101, 0b101, 0b101, 0b000], [0b110, 0b101, 0b101, 0b101, 0b101, 0b000], [0b111, 0b101, 0b101, 0b101, 0b111, 0b000], [0b111, 0b101, 0b111, 0b100, 0b100, 0b000], [0b111, 0b101, 0b101, 0b111, 0b001, 0b000], [0b111, 0b101, 0b110, 0b101, 0b101, 0b000], [0b011, 0b100, 0b111, 0b001, 0b110, 0b000], [0b111, 0b010, 0b010, 0b010, 0b010, 0b000], [0b101, 0b101, 0b101, 0b101, 0b111, 0b000], [0b101, 0b101, 0b101, 0b101, 0b010, 0b000], [0b101, 0b101, 0b101, 0b111, 0b111, 0b000], [0b101, 0b101, 0b010, 0b101, 0b101, 0b000], [0b101, 0b101, 0b010, 0b010, 0b010, 0b000], [0b111, 0b001, 0b010, 0b100, 0b111, 0b000], [0b011, 0b010, 0b010, 0b010, 0b011, 0b000], [0b100, 0b100, 0b010, 0b001, 0b001, 0b000], [0b110, 0b010, 0b010, 0b010, 0b110, 0b000], [0b010, 0b101, 0b000, 0b000, 0b000, 0b000], [0b000, 0b000, 0b000, 0b000, 0b111, 0b000], [0b100, 0b010, 0b000, 0b000, 0b000, 0b000], [0b000, 0b011, 0b101, 0b111, 0b111, 0b000], [0b100, 0b100, 0b110, 0b101, 0b110, 0b000], [0b000, 0b011, 0b100, 0b100, 0b011, 0b000], [0b001, 0b001, 0b011, 0b101, 0b011, 0b000], [0b000, 0b011, 0b111, 0b100, 0b011, 0b000], [0b011, 0b010, 0b111, 0b010, 0b010, 0b000], [0b000, 0b011, 0b101, 0b011, 0b001, 0b110], [0b100, 0b100, 0b110, 0b101, 0b101, 0b000], [0b010, 0b000, 0b010, 0b010, 0b010, 0b000], [0b001, 0b000, 0b001, 0b001, 0b001, 0b110], [0b100, 0b100, 0b101, 0b110, 0b101, 0b000], [0b110, 0b010, 0b010, 0b010, 0b011, 0b000], [0b000, 0b111, 0b111, 0b101, 0b101, 0b000], [0b000, 0b110, 0b101, 0b101, 0b101, 0b000], [0b000, 0b010, 0b101, 0b101, 0b010, 0b000], [0b000, 0b110, 0b101, 0b110, 0b100, 0b100], [0b000, 0b011, 0b101, 0b011, 0b001, 0b001], [0b000, 0b110, 0b100, 0b100, 0b100, 0b000], [0b000, 0b011, 0b110, 0b011, 0b110, 0b000], [0b010, 0b111, 0b010, 0b010, 0b011, 0b000], [0b000, 0b101, 0b101, 0b101, 0b111, 0b000], [0b000, 0b101, 0b101, 0b101, 0b010, 0b000], [0b000, 0b101, 0b101, 0b111, 0b111, 0b000], [0b000, 0b101, 0b010, 0b010, 0b101, 0b000], [0b000, 0b101, 0b101, 0b011, 0b001, 0b110], [0b000, 0b111, 0b001, 0b100, 0b111, 0b000], [0b011, 0b010, 0b110, 0b010, 0b011, 0b000], [0b010, 0b010, 0b010, 0b010, 0b010, 0b000], [0b110, 0b010, 0b011, 0b010, 0b110, 0b000], [0b000, 0b001, 0b111, 0b100, 0b000, 0b000], ];
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn case_is_distinct() {
for (lo, up) in ('a'..='z').zip('A'..='Z') {
assert_ne!(glyph(lo), glyph(up), "{lo} and {up} render identically");
}
}
#[test]
fn lowercase_is_shorter_than_uppercase() {
for c in "acemnorsuvwxz".chars() {
assert_eq!(glyph(c)[0], 0, "{c} should not reach the cap line");
}
}
#[test]
fn descenders_use_the_bottom_row() {
for c in "gjpqy".chars() {
assert_ne!(glyph(c)[5], 0, "{c} should have a descender");
}
for c in "abcdefhiklmnorstuvwxz".chars() {
assert_eq!(glyph(c)[5], 0, "{c} should not have a descender");
}
}
#[test]
fn out_of_range_is_unknown() {
assert_eq!(glyph('\u{1F600}'), UNKNOWN);
assert_eq!(glyph('\u{7F}'), UNKNOWN);
}
}