1use crate::prelude::{Chunk, ChunkMut};
3use std::convert::TryInto;
4pub struct Chrm<'a>(&'a [u8]);
6pub struct ChrmMut<'a>(&'a mut [u8]);
7impl<'a> Chunk for Chrm<'a> {
9 fn inner(&self) -> &[u8] {
10 self.0
11 }
12}
13impl<'a> ChunkMut for ChrmMut<'a> {
14 fn inner(&mut self) -> &mut [u8] {
15 self.0
16 }
17}
18impl<'a> Chrm<'a> {
19 pub fn from(buf: &'a [u8]) -> Self {
20 Self(buf)
21 }
22}
23impl<'a> ChrmMut<'a> {
24 pub fn from(buf: &'a mut [u8]) -> Self {
25 Self(buf)
26 }
27}
28impl<'a> std::fmt::Debug for Chrm<'a> {
29 fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
30 let length = u32::from_be_bytes(self.0[0..4].try_into().unwrap()) as usize;
31 let mut s = format!("cHRM\n");
32 s.push_str(&format!(" length: {}\n", length));
33 s.push_str(&format!(
34 " white point x: {}\n",
35 u32::from_be_bytes(self.0[8..12].try_into().unwrap())
36 ));
37 s.push_str(&format!(
38 " white point y: {}\n",
39 u32::from_be_bytes(self.0[12..16].try_into().unwrap())
40 ));
41 s.push_str(&format!(
42 " red x: {}\n",
43 u32::from_be_bytes(self.0[16..20].try_into().unwrap())
44 ));
45 s.push_str(&format!(
46 " red y: {}\n",
47 u32::from_be_bytes(self.0[20..24].try_into().unwrap())
48 ));
49 s.push_str(&format!(
50 " green x: {}\n",
51 u32::from_be_bytes(self.0[24..28].try_into().unwrap())
52 ));
53 s.push_str(&format!(
54 " green y: {}\n",
55 u32::from_be_bytes(self.0[28..32].try_into().unwrap())
56 ));
57 s.push_str(&format!(
58 " blue x: {}\n",
59 u32::from_be_bytes(self.0[32..36].try_into().unwrap())
60 ));
61 s.push_str(&format!(
62 " blue y: {}\n",
63 u32::from_be_bytes(self.0[36..40].try_into().unwrap())
64 ));
65 s.push_str(&format!(
66 " crc: 0x{:08X}\n",
67 u32::from_be_bytes(self.0[8 + length..].try_into().unwrap())
68 ));
69 write!(f, "{}", s)
70 }
71}
72impl<'a> std::fmt::Display for Chrm<'a> {
73 fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
74 let mut s = format!("cHRM\n");
75 s.push_str(&format!(
76 " white point x: {}\n",
77 u32::from_be_bytes(self.0[8..12].try_into().unwrap())
78 ));
79 s.push_str(&format!(
80 " white point y: {}\n",
81 u32::from_be_bytes(self.0[12..16].try_into().unwrap())
82 ));
83 s.push_str(&format!(
84 " red x: {}\n",
85 u32::from_be_bytes(self.0[16..20].try_into().unwrap())
86 ));
87 s.push_str(&format!(
88 " red y: {}\n",
89 u32::from_be_bytes(self.0[20..24].try_into().unwrap())
90 ));
91 s.push_str(&format!(
92 " green x: {}\n",
93 u32::from_be_bytes(self.0[24..28].try_into().unwrap())
94 ));
95 s.push_str(&format!(
96 " green y: {}\n",
97 u32::from_be_bytes(self.0[28..32].try_into().unwrap())
98 ));
99 s.push_str(&format!(
100 " blue x: {}\n",
101 u32::from_be_bytes(self.0[32..36].try_into().unwrap())
102 ));
103 s.push_str(&format!(
104 " blue y: {}\n",
105 u32::from_be_bytes(self.0[36..40].try_into().unwrap())
106 ));
107 write!(f, "{}", s)
108 }
109}