maikor_platform/models/
layer_tile.rs1use 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}