Skip to main content

devpng/chunk/
chrm.rs

1// Imports.
2use crate::prelude::{Chunk, ChunkMut};
3use std::convert::TryInto;
4// Structures.
5pub struct Chrm<'a>(&'a [u8]);
6pub struct ChrmMut<'a>(&'a mut [u8]);
7// Implementations.
8impl<'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}