about summary refs log tree commit diff
path: root/src/components/logicalscreendescriptor.rs
blob: b20c9d57bf4a662fc2d99bd26dbcdbf7a2fdc707 (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
pub struct LogicalScreenDescriptor {
	pub width: u16,
	pub height: u16,
	pub packed: u8,
	pub background_color_index: u8,
	pub pixel_aspect_ratio: u8
}

impl LogicalScreenDescriptor {
	pub fn color_table_present(&mut self, is_present: bool) {
		if is_present {
			self.packed |= 0b1000_0000;
		} else {
			self.packed &= 0b0111_1111;
		}
	}

	pub fn color_table_size(&mut self, size: u8) {
		// GCT size is calulated by raising two to this number plus one,
		// so we have to work backwards.
		let size = (size as f32).log2().ceil() - 1f32;
		self.packed |= size as u8;
	}

	//TODO: Setter for sort flag in packed field
	//TODO: Setter for color resolution in packed field
}

impl From<&LogicalScreenDescriptor> for Box<[u8]> {
	fn from(lsd: &LogicalScreenDescriptor) -> Self {
		let mut vec = vec![];
		vec.extend_from_slice(&lsd.width.to_le_bytes());
		vec.extend_from_slice(&lsd.height.to_le_bytes());
		vec.push(lsd.packed);
		vec.push(lsd.background_color_index);
		vec.push(lsd.pixel_aspect_ratio);

		vec.into_boxed_slice()
	}
}