about summary refs log tree commit diff
path: root/src/block/extension/graphiccontrol.rs
blob: 46f44fa53a84527ce1286052ffb2d31039f1b249 (plain)
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
pub struct GraphicControl {
	pub(crate) packed: u8,
	pub(crate) delay_time: u16,
	pub(crate) transparency_index: u8
}

impl GraphicControl {
	pub fn new(disposal_method: DisposalMethod, user_input_flag: bool, transparency_flag: bool, delay_time: u16, transparency_index: u8) -> Self {
		let mut ret = Self {
			packed: 0,
			delay_time,
			transparency_index
		};

		ret.disposal_method(disposal_method);
		ret.user_input(user_input_flag);
		ret.transparency(transparency_flag);

		ret
	}

	pub fn disposal_method(&mut self, method: DisposalMethod) {
		match method {
			DisposalMethod::Clear => self.packed &= 0b111_000_1_1,
			DisposalMethod::DoNotDispose => self.packed |= 0b000_100_0_0,
			DisposalMethod::RestoreBackground => self.packed |= 0b000_010_0_0,
			DisposalMethod::RestorePrevious => self.packed |= 0b000_110_0_0
		};
	}

	pub fn user_input(&mut self, flag: bool) {
		if flag {
			self.packed |= 0b000_000_1_0;
		} else {
			self.packed &= 0b111_111_0_1;
		}
	}

	pub fn transparency(&mut self, flag: bool) {
		if flag {
			self.packed |= 0b000_000_0_1;
		} else {
			self.packed &= 0b111_111_1_0;
		}
	}

	pub fn delay_time(&mut self, hundreths: u16) {
		self.delay_time = hundreths;
	}

	//TODO: Transparency index setter
}

pub enum DisposalMethod {
	Clear,
	DoNotDispose,
	RestoreBackground,
	RestorePrevious
}