microbit_bsp/display/fonts/
mod.rs

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