1use crate::reader::*;
2use crate::version::*;
3
4#[derive(PartialEq, Debug, Clone)]
5pub struct Theme {
6 pub background: RGB,
7 pub text_empty: RGB,
8 pub text_info: RGB,
9 pub text_default: RGB,
10 pub text_value: RGB,
11 pub text_title: RGB,
12 pub play_marker: RGB,
13 pub cursor: RGB,
14 pub selection: RGB,
15 pub scope_slider: RGB,
16 pub meter_low: RGB,
17 pub meter_mid: RGB,
18 pub meter_peak: RGB,
19}
20impl Theme {
21 const SIZE: usize = 39;
22
23 pub fn read(reader: &mut impl std::io::Read) -> M8Result<Self> {
24 let mut buf: Vec<u8> = vec![];
25 reader.read_to_end(&mut buf).unwrap();
26 let len = buf.len();
27 let mut reader = Reader::new(buf);
28
29 if len < Self::SIZE + Version::SIZE {
30 return Err(ParseError(
31 "File is not long enough to be a M8 Theme".to_string(),
32 ));
33 }
34 Version::from_reader(&mut reader)?;
35 Self::from_reader(&mut reader)
36 }
37
38 fn from_reader(reader: &mut Reader) -> M8Result<Self> {
39 Ok(Self {
40 background: RGB::from_reader(reader)?,
41 text_empty: RGB::from_reader(reader)?,
42 text_info: RGB::from_reader(reader)?,
43 text_default: RGB::from_reader(reader)?,
44 text_value: RGB::from_reader(reader)?,
45 text_title: RGB::from_reader(reader)?,
46 play_marker: RGB::from_reader(reader)?,
47 cursor: RGB::from_reader(reader)?,
48 selection: RGB::from_reader(reader)?,
49 scope_slider: RGB::from_reader(reader)?,
50 meter_low: RGB::from_reader(reader)?,
51 meter_mid: RGB::from_reader(reader)?,
52 meter_peak: RGB::from_reader(reader)?,
53 })
54 }
55}
56
57#[derive(PartialEq, Debug, Copy, Clone)]
58pub struct RGB {
59 pub r: u8,
60 pub g: u8,
61 pub b: u8,
62}
63
64impl RGB {
65 fn from_reader(reader: &mut Reader) -> M8Result<Self> {
66 Ok(Self {
67 r: reader.read(),
68 g: reader.read(),
69 b: reader.read(),
70 })
71 }
72}