maikor_platform/models/
layer_tile.rs

1use crate::graphics::layer_tile::byte2;
2use crate::models::{Byteable, LayerTile};
3
4impl LayerTile {
5    pub fn new(
6        id: usize,
7        flip_v: bool,
8        flip_h: bool,
9        palette: usize,
10        half_alpha: bool,
11        rotated: bool,
12    ) -> Self {
13        Self {
14            id,
15            flip_v,
16            flip_h,
17            palette,
18            half_alpha,
19            rotated,
20        }
21    }
22}
23
24impl Byteable for LayerTile {
25    const SIZE: usize = 2;
26
27    fn from_bytes(bytes: &[u8]) -> LayerTile {
28        LayerTile {
29            id: bytes[0] as usize,
30            flip_v: bytes[1] & byte2::MASK_FLIP_V == byte2::MASK_FLIP_V,
31            flip_h: bytes[1] & byte2::MASK_FLIP_H == byte2::MASK_FLIP_H,
32            palette: ((bytes[1] & byte2::MASK_PALETTE) >> byte2::OFFSET_PALETTE) as usize,
33            half_alpha: bytes[1] & byte2::MASK_HALF_ALPHA == byte2::MASK_HALF_ALPHA,
34            rotated: bytes[1] & byte2::MASK_ROTATED == byte2::MASK_ROTATED,
35        }
36    }
37
38    fn to_bytes(&self) -> Vec<u8> {
39        let mut byte2 = 0;
40        if self.flip_h {
41            byte2 |= byte2::MASK_FLIP_H;
42        }
43        if self.flip_v {
44            byte2 |= byte2::MASK_FLIP_V;
45        }
46        if self.half_alpha {
47            byte2 |= byte2::MASK_HALF_ALPHA;
48        }
49        if self.rotated {
50            byte2 |= byte2::MASK_ROTATED;
51        }
52        byte2 |= (self.palette as u8) << byte2::OFFSET_PALETTE;
53        vec![self.id as u8, byte2]
54    }
55}
56
57#[cfg(test)]
58mod test {
59    use crate::graphics::layer_tile::byte2;
60    use crate::models::{Byteable, LayerTile};
61
62    #[test]
63    fn write_test() {
64        let tile = LayerTile::new(0, false, false, 0, false, false);
65        assert_eq!(tile.to_bytes(), vec![0, 0]);
66
67        let tile = LayerTile::new(255, true, true, 3, true, true);
68        let bytes = tile.to_bytes();
69        assert_eq!(bytes, vec![255, 252]);
70        assert_eq!(bytes[1] & byte2::MASK_FLIP_V, byte2::MASK_FLIP_V);
71        assert_eq!(bytes[1] & byte2::MASK_FLIP_H, byte2::MASK_FLIP_H);
72        assert_eq!(bytes[1] & byte2::MASK_HALF_ALPHA, byte2::MASK_HALF_ALPHA);
73        assert_eq!(bytes[1] & byte2::MASK_ROTATED, byte2::MASK_ROTATED);
74        assert_eq!((bytes[1] & byte2::MASK_PALETTE) >> byte2::OFFSET_PALETTE, 3);
75
76        let tile = LayerTile::new(58, true, false, 1, true, false);
77        let bytes = tile.to_bytes();
78        assert_eq!(bytes, vec![58, 152]);
79        assert_eq!(bytes[1] & byte2::MASK_FLIP_V, byte2::MASK_FLIP_V);
80        assert_eq!(bytes[1] & byte2::MASK_FLIP_H, 0);
81        assert_eq!(bytes[1] & byte2::MASK_HALF_ALPHA, byte2::MASK_HALF_ALPHA);
82        assert_eq!(bytes[1] & byte2::MASK_ROTATED, 0);
83        assert_eq!((bytes[1] & byte2::MASK_PALETTE) >> byte2::OFFSET_PALETTE, 1);
84    }
85
86    #[test]
87    fn read_test() {
88        let tile = LayerTile::from_bytes(&[0, 0]);
89        assert_eq!(tile, LayerTile::default());
90        let tile = LayerTile::from_bytes(&[255, 252]);
91        assert_eq!(tile, LayerTile::new(255, true, true, 3, true, true));
92        let tile = LayerTile::from_bytes(&[91, byte2::MASK_FLIP_V | byte2::MASK_HALF_ALPHA]);
93        assert_eq!(tile, LayerTile::new(91, true, false, 0, true, false));
94    }
95}