1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
//! Bitmaps and fonts for the micro:bit
use super::types::*;
mod pendolino;
mod bitmaps {
use super::*;
#[rustfmt::skip]
/// A check-mark bitmap
pub const CHECK_MARK: Frame<5, 5> = frame_5x5(&[
0b00000,
0b00001,
0b00010,
0b10100,
0b01000,
]);
#[rustfmt::skip]
/// A cross-mark bitmap
pub const CROSS_MARK: Frame<5, 5> = frame_5x5(&[
0b00000,
0b01010,
0b00100,
0b01010,
0b00000,
]);
#[rustfmt::skip]
/// A left arrow bitmap
pub const ARROW_LEFT: Frame<5, 5> = frame_5x5(&[
0b00100,
0b01000,
0b11111,
0b01000,
0b00100,
]);
#[rustfmt::skip]
/// A right arrow bitmap
pub const ARROW_RIGHT: Frame<5, 5> = frame_5x5(&[
0b00100,
0b00010,
0b11111,
0b00010,
0b00100,
]);
/// Construct a 5x5 frame from a byte slice
pub const fn frame_5x5<const XSIZE: usize, const YSIZE: usize>(input: &[u8; 5]) -> Frame<XSIZE, YSIZE> {
//assert!(XSIZE == 5);
//assert!(YSIZE == 5);
let mut data = [Bitmap::empty(5); YSIZE];
data[0] = Bitmap::new(input[0], 5);
data[1] = Bitmap::new(input[1], 5);
data[2] = Bitmap::new(input[2], 5);
data[3] = Bitmap::new(input[3], 5);
data[4] = Bitmap::new(input[4], 5);
Frame::new(data)
}
}
pub use bitmaps::*;
impl<const XSIZE: usize, const YSIZE: usize> Into<Frame<XSIZE, YSIZE>> for u8 {
fn into(self) -> Frame<XSIZE, YSIZE> {
(self as char).into()
}
}
impl<const XSIZE: usize, const YSIZE: usize> Into<Frame<XSIZE, YSIZE>> for char {
fn into(self) -> Frame<XSIZE, YSIZE> {
assert!(XSIZE == 5);
assert!(YSIZE == 5);
let n = self as usize;
if n > pendolino::PRINTABLE_START && n < pendolino::PRINTABLE_START + pendolino::PRINTABLE_COUNT {
frame_5x5(&pendolino::PENDOLINO3[n - pendolino::PRINTABLE_START])
} else {
frame_5x5(&[0, 0, 0, 0, 0])
}
}
}
/*
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_to_frame() {
let frame: Frame<5, 5> = 'D'.to_frame();
assert!(frame.is_set(0, 0));
assert!(frame.is_set(1, 0));
assert!(frame.is_set(2, 0));
assert!(!frame.is_set(3, 0));
assert!(!frame.is_set(4, 0));
assert!(frame.is_set(0, 1));
assert!(!frame.is_set(1, 1));
assert!(!frame.is_set(2, 1));
assert!(frame.is_set(3, 1));
assert!(!frame.is_set(4, 1));
assert!(frame.is_set(0, 2));
assert!(!frame.is_set(1, 2));
assert!(!frame.is_set(2, 2));
assert!(frame.is_set(3, 2));
assert!(!frame.is_set(4, 2));
assert!(frame.is_set(0, 3));
assert!(!frame.is_set(1, 3));
assert!(!frame.is_set(2, 3));
assert!(frame.is_set(3, 3));
assert!(!frame.is_set(4, 3));
assert!(frame.is_set(0, 4));
assert!(frame.is_set(1, 4));
assert!(frame.is_set(2, 4));
assert!(!frame.is_set(3, 4));
assert!(!frame.is_set(4, 4));
}
}
*/