mirui 0.5.0

A lightweight, no_std ECS-driven UI framework for embedded, desktop, and WebAssembly
Documentation
/// 8x8 bitmap font for ASCII 32-126. Each char = 8 bytes (rows), MSB = leftmost pixel.
pub const FONT_8X8: &[u8; 760] = &[
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ' ' (32)
    0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0x18, 0x00, // '!' (33)
    0x6C, 0x6C, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, // '"' (34)
    0x6C, 0xFE, 0x6C, 0x6C, 0xFE, 0x6C, 0x00, 0x00, // '#' (35)
    0x18, 0x7E, 0x58, 0x7E, 0x1A, 0x7E, 0x18, 0x00, // '$' (36)
    0x62, 0x64, 0x08, 0x10, 0x26, 0x46, 0x00, 0x00, // '%' (37)
    0x38, 0x6C, 0x38, 0x76, 0xDC, 0xCC, 0x76, 0x00, // '&' (38)
    0x18, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, // ''' (39)
    0x0C, 0x18, 0x30, 0x30, 0x30, 0x18, 0x0C, 0x00, // '(' (40)
    0x30, 0x18, 0x0C, 0x0C, 0x0C, 0x18, 0x30, 0x00, // ')' (41)
    0x00, 0x66, 0x3C, 0xFF, 0x3C, 0x66, 0x00, 0x00, // '*' (42)
    0x00, 0x18, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x00, // '+' (43)
    0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x30, // ',' (44)
    0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, // '-' (45)
    0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, // '.' (46)
    0x02, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x40, 0x00, // '/' (47)
    0x3C, 0x66, 0x6E, 0x76, 0x66, 0x66, 0x3C, 0x00, // '0' (48)
    0x18, 0x38, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00, // '1' (49)
    0x3C, 0x66, 0x06, 0x0C, 0x18, 0x30, 0x7E, 0x00, // '2' (50)
    0x3C, 0x66, 0x06, 0x1C, 0x06, 0x66, 0x3C, 0x00, // '3' (51)
    0x0C, 0x1C, 0x3C, 0x6C, 0x7E, 0x0C, 0x0C, 0x00, // '4' (52)
    0x7E, 0x60, 0x7C, 0x06, 0x06, 0x66, 0x3C, 0x00, // '5' (53)
    0x1C, 0x30, 0x60, 0x7C, 0x66, 0x66, 0x3C, 0x00, // '6' (54)
    0x7E, 0x06, 0x0C, 0x18, 0x30, 0x30, 0x30, 0x00, // '7' (55)
    0x3C, 0x66, 0x66, 0x3C, 0x66, 0x66, 0x3C, 0x00, // '8' (56)
    0x3C, 0x66, 0x66, 0x3E, 0x06, 0x0C, 0x38, 0x00, // '9' (57)
    0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x00, 0x00, // ':' (58)
    0x00, 0x18, 0x18, 0x00, 0x18, 0x18, 0x30, 0x00, // ';' (59)
    0x0C, 0x18, 0x30, 0x60, 0x30, 0x18, 0x0C, 0x00, // '<' (60)
    0x00, 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x00, 0x00, // '=' (61)
    0x30, 0x18, 0x0C, 0x06, 0x0C, 0x18, 0x30, 0x00, // '>' (62)
    0x3C, 0x66, 0x06, 0x0C, 0x18, 0x00, 0x18, 0x00, // '?' (63)
    0x3C, 0x66, 0x6E, 0x6A, 0x6E, 0x60, 0x3E, 0x00, // '@' (64)
    0x18, 0x3C, 0x66, 0x66, 0x7E, 0x66, 0x66, 0x00, // 'A' (65)
    0x7C, 0x66, 0x66, 0x7C, 0x66, 0x66, 0x7C, 0x00, // 'B' (66)
    0x3C, 0x66, 0x60, 0x60, 0x60, 0x66, 0x3C, 0x00, // 'C' (67)
    0x78, 0x6C, 0x66, 0x66, 0x66, 0x6C, 0x78, 0x00, // 'D' (68)
    0x7E, 0x60, 0x60, 0x7C, 0x60, 0x60, 0x7E, 0x00, // 'E' (69)
    0x7E, 0x60, 0x60, 0x7C, 0x60, 0x60, 0x60, 0x00, // 'F' (70)
    0x3C, 0x66, 0x60, 0x6E, 0x66, 0x66, 0x3E, 0x00, // 'G' (71)
    0x66, 0x66, 0x66, 0x7E, 0x66, 0x66, 0x66, 0x00, // 'H' (72)
    0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x00, // 'I' (73)
    0x3E, 0x06, 0x06, 0x06, 0x06, 0x66, 0x3C, 0x00, // 'J' (74)
    0x66, 0x6C, 0x78, 0x70, 0x78, 0x6C, 0x66, 0x00, // 'K' (75)
    0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x7E, 0x00, // 'L' (76)
    0xC6, 0xEE, 0xFE, 0xD6, 0xC6, 0xC6, 0xC6, 0x00, // 'M' (77)
    0x66, 0x76, 0x7E, 0x7E, 0x6E, 0x66, 0x66, 0x00, // 'N' (78)
    0x3C, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x00, // 'O' (79)
    0x7C, 0x66, 0x66, 0x7C, 0x60, 0x60, 0x60, 0x00, // 'P' (80)
    0x3C, 0x66, 0x66, 0x66, 0x6A, 0x6C, 0x36, 0x00, // 'Q' (81)
    0x7C, 0x66, 0x66, 0x7C, 0x6C, 0x66, 0x66, 0x00, // 'R' (82)
    0x3C, 0x66, 0x60, 0x3C, 0x06, 0x66, 0x3C, 0x00, // 'S' (83)
    0x7E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, // 'T' (84)
    0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x00, // 'U' (85)
    0x66, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x00, // 'V' (86)
    0xC6, 0xC6, 0xC6, 0xD6, 0xFE, 0xEE, 0xC6, 0x00, // 'W' (87)
    0x66, 0x66, 0x3C, 0x18, 0x3C, 0x66, 0x66, 0x00, // 'X' (88)
    0x66, 0x66, 0x66, 0x3C, 0x18, 0x18, 0x18, 0x00, // 'Y' (89)
    0x7E, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x7E, 0x00, // 'Z' (90)
    0x3C, 0x30, 0x30, 0x30, 0x30, 0x30, 0x3C, 0x00, // '[' (91)
    0x40, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x02, 0x00, // '\\' (92)
    0x3C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x3C, 0x00, // ']' (93)
    0x18, 0x3C, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, // '^' (94)
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, // '_' (95)
    0x30, 0x18, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, // '`' (96)
    0x00, 0x00, 0x3C, 0x06, 0x3E, 0x66, 0x3E, 0x00, // 'a' (97)
    0x60, 0x60, 0x7C, 0x66, 0x66, 0x66, 0x7C, 0x00, // 'b' (98)
    0x00, 0x00, 0x3C, 0x66, 0x60, 0x66, 0x3C, 0x00, // 'c' (99)
    0x06, 0x06, 0x3E, 0x66, 0x66, 0x66, 0x3E, 0x00, // 'd' (100)
    0x00, 0x00, 0x3C, 0x66, 0x7E, 0x60, 0x3C, 0x00, // 'e' (101)
    0x1C, 0x30, 0x30, 0x7C, 0x30, 0x30, 0x30, 0x00, // 'f' (102)
    0x00, 0x00, 0x3E, 0x66, 0x66, 0x3E, 0x06, 0x3C, // 'g' (103)
    0x60, 0x60, 0x7C, 0x66, 0x66, 0x66, 0x66, 0x00, // 'h' (104)
    0x18, 0x00, 0x38, 0x18, 0x18, 0x18, 0x3C, 0x00, // 'i' (105)
    0x0C, 0x00, 0x1C, 0x0C, 0x0C, 0x0C, 0x6C, 0x38, // 'j' (106)
    0x60, 0x60, 0x66, 0x6C, 0x78, 0x6C, 0x66, 0x00, // 'k' (107)
    0x38, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3C, 0x00, // 'l' (108)
    0x00, 0x00, 0xEC, 0xFE, 0xD6, 0xC6, 0xC6, 0x00, // 'm' (109)
    0x00, 0x00, 0x7C, 0x66, 0x66, 0x66, 0x66, 0x00, // 'n' (110)
    0x00, 0x00, 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x00, // 'o' (111)
    0x00, 0x00, 0x7C, 0x66, 0x66, 0x7C, 0x60, 0x60, // 'p' (112)
    0x00, 0x00, 0x3E, 0x66, 0x66, 0x3E, 0x06, 0x06, // 'q' (113)
    0x00, 0x00, 0x7C, 0x66, 0x60, 0x60, 0x60, 0x00, // 'r' (114)
    0x00, 0x00, 0x3E, 0x60, 0x3C, 0x06, 0x7C, 0x00, // 's' (115)
    0x30, 0x30, 0x7C, 0x30, 0x30, 0x30, 0x1C, 0x00, // 't' (116)
    0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x3E, 0x00, // 'u' (117)
    0x00, 0x00, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x00, // 'v' (118)
    0x00, 0x00, 0xC6, 0xC6, 0xD6, 0xFE, 0x6C, 0x00, // 'w' (119)
    0x00, 0x00, 0x66, 0x3C, 0x18, 0x3C, 0x66, 0x00, // 'x' (120)
    0x00, 0x00, 0x66, 0x66, 0x66, 0x3E, 0x06, 0x3C, // 'y' (121)
    0x00, 0x00, 0x7E, 0x0C, 0x18, 0x30, 0x7E, 0x00, // 'z' (122)
    0x0E, 0x18, 0x18, 0x70, 0x18, 0x18, 0x0E, 0x00, // '{' (123)
    0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, // '|' (124)
    0x70, 0x18, 0x18, 0x0E, 0x18, 0x18, 0x70, 0x00, // '}' (125)
    0x76, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // '~' (126)
];

pub const CHAR_W: u32 = 8;
pub const CHAR_H: u32 = 8;

/// Get the 8-byte bitmap for a character. Returns box for unsupported chars.
#[inline]
pub fn glyph(c: u8) -> &'static [u8; 8] {
    if (32..127).contains(&c) {
        let offset = (c - 32) as usize * 8;
        unsafe { &*(FONT_8X8.as_ptr().add(offset) as *const [u8; 8]) }
    } else {
        glyph(b'?')
    }
}