maikor_platform/models/
layer_header.rs

1use crate::graphics::layer_header::byte3;
2use crate::models::{Byteable, LayerHeader};
3
4impl LayerHeader {
5    pub fn new(x: isize, y: isize, enabled: bool, atlas: usize, order: usize) -> Self {
6        Self {
7            x,
8            y,
9            enabled,
10            atlas,
11            order,
12        }
13    }
14}
15
16impl Byteable for LayerHeader {
17    const SIZE: usize = 3;
18
19    fn from_bytes(bytes: &[u8]) -> LayerHeader {
20        LayerHeader {
21            x: bytes[0] as i8 as isize,
22            y: bytes[1] as i8 as isize,
23            enabled: bytes[2] & byte3::MASK_ENABLED == byte3::MASK_ENABLED,
24            order: ((bytes[2] & byte3::MASK_ORDER) >> byte3::OFFSET_ORDER) as usize,
25            atlas: ((bytes[2] & byte3::MASK_ATLAS) >> byte3::OFFSET_ATLAS) as usize,
26        }
27    }
28
29    fn to_bytes(&self) -> Vec<u8> {
30        let mut byte3 = 0;
31        if self.enabled {
32            byte3 |= byte3::MASK_ENABLED;
33        }
34        byte3 |= (self.order as u8) << byte3::OFFSET_ORDER;
35        byte3 |= (self.atlas as u8) << byte3::OFFSET_ATLAS;
36        vec![self.x as i8 as u8, self.y as i8 as u8, byte3]
37    }
38}
39
40#[cfg(test)]
41mod test {
42    use crate::graphics::layer_header::byte3;
43    use crate::models::{Byteable, LayerHeader};
44
45    #[test]
46    fn write_test() {
47        let header = LayerHeader::new(0, 0, false, 0, 0);
48        assert_eq!(header.to_bytes(), [0, 0, 0]);
49        let header = LayerHeader::new(125, 12, true, 1, 2);
50        let bytes = header.to_bytes();
51        assert_eq!(bytes, [125, 12, 19]);
52        assert_eq!(bytes[2] & byte3::MASK_ENABLED, byte3::MASK_ENABLED);
53        assert_eq!((bytes[2] & byte3::MASK_ATLAS) >> byte3::OFFSET_ATLAS, 1);
54        assert_eq!((bytes[2] & byte3::MASK_ORDER) >> byte3::OFFSET_ORDER, 2);
55        let header = LayerHeader::new(-125, -77, false, 2, 3);
56        let bytes = header.to_bytes();
57        assert_eq!(bytes, [131, 179, 28]);
58        assert_eq!(bytes[2] & byte3::MASK_ENABLED, 0);
59        assert_eq!((bytes[2] & byte3::MASK_ATLAS) >> byte3::OFFSET_ATLAS, 2);
60        assert_eq!((bytes[2] & byte3::MASK_ORDER) >> byte3::OFFSET_ORDER, 3);
61    }
62
63    #[test]
64    fn read_test() {
65        let tile = LayerHeader::from_bytes(&[0, 0, 0]);
66        assert_eq!(tile, LayerHeader::default());
67        let tile = LayerHeader::from_bytes(&[127, 127, 255]);
68        assert_eq!(tile, LayerHeader::new(127, 127, true, 3, 3));
69        let tile = LayerHeader::from_bytes(&[255, 255, 0]);
70        assert_eq!(tile, LayerHeader::new(-1, -1, false, 0, 0));
71        let tile = LayerHeader::from_bytes(&[12, 204, byte3::MASK_ENABLED]);
72        assert_eq!(tile, LayerHeader::new(12, -52, true, 0, 0));
73    }
74}