1use std;
2
3const NUM_RGB_BYTES: usize = 3;
4
5#[derive(Debug)]
6pub struct OpcPixel<'a, T: AsRef<[u8]> + 'a> {
7 x: T,
8 pub phantom: std::marker::PhantomData<&'a [u8]>,
9}
10
11impl<'a, T: AsRef<[u8]> + 'a> OpcPixel<'a, T> {
12 pub fn new(x: T) -> Self {
13 OpcPixel {
14 x: x,
15 phantom: std::marker::PhantomData,
16 }
17 }
18 pub fn r(&self) -> u8 {
19 self.x.as_ref()[0]
20 }
21 pub fn g(&self) -> u8 {
22 self.x.as_ref()[1]
23 }
24 pub fn b(&self) -> u8 {
25 self.x.as_ref()[2]
26 }
27}
28
29impl<'a, T: AsRef<[u8]> + AsMut<[u8]> + 'a> OpcPixel<'a, T> {
30 pub fn set_r(&mut self, v: u8) {
31 self.x.as_mut()[0] = v;
32 }
33 pub fn set_g(&mut self, v: u8) {
34 self.x.as_mut()[1] = v;
35 }
36 pub fn set_b(&mut self, v: u8) {
37 self.x.as_mut()[2] = v;
38 }
39}
40
41impl<'a, T: AsRef<[u8]> + 'a> std::convert::From<&'a OpcPixel<'a, T>> for (u8, u8, u8) {
42 fn from(t: &'a OpcPixel<'a, T>) -> (u8, u8, u8) {
43 (t.r(), t.g(), t.b())
44 }
45}
46
47#[derive(Clone,Debug)]
48pub struct Pixels {
49 pixels: Vec<u8>,
50}
51
52impl std::convert::From<Vec<u8>> for Pixels {
53 fn from(t: Vec<u8>) -> Pixels {
54 let mut t = t;
55 let blen: usize = t.len() - (t.len() % NUM_RGB_BYTES);
56 t.truncate(blen);
57 Pixels { pixels: t }
58 }
59}
60
61impl std::convert::From<Pixels> for Vec<u8> {
62 fn from(t: Pixels) -> Vec<u8> {
63 t.pixels
64 }
65}
66
67impl Pixels {
68 pub fn new(n: usize) -> Pixels {
69 Pixels { pixels: vec![0;n*NUM_RGB_BYTES] }
70 }
71
72 pub fn len_bytes(&self) -> usize {
73 self.pixels.len()
74 }
75
76 pub fn iter(&self) -> PixelIterator {
77 PixelIterator::new(self)
78 }
79
80 pub fn iter_mut(&mut self) -> PixelIteratorMut {
81 PixelIteratorMut::new(self)
82 }
83}
84
85pub struct PixelIterator<'a> {
86 p: std::slice::Chunks<'a, u8>,
87}
88
89impl<'a> PixelIterator<'a> {
90 fn new(p: &'a Pixels) -> Self {
91 PixelIterator { p: p.pixels.chunks(NUM_RGB_BYTES) }
92 }
93}
94
95impl<'a> std::iter::Iterator for PixelIterator<'a> {
96 type Item = OpcPixel<'a, &'a [u8]>;
97
98 fn next(&mut self) -> Option<Self::Item> {
99 self.p.next().map(|x| OpcPixel::new(x))
100 }
101
102 fn nth(&mut self, n: usize) -> Option<Self::Item> {
103 self.p.nth(n).map(|x| OpcPixel::new(x))
104 }
105
106}
107
108impl<'a> ExactSizeIterator for PixelIterator<'a> {
109 fn len(&self) -> usize {
110 self.p.len()
111 }
112}
113
114pub struct PixelIteratorMut<'a> {
115 p: std::slice::ChunksMut<'a, u8>,
116}
117
118impl<'a> PixelIteratorMut<'a> {
119 fn new(p: &'a mut Pixels) -> Self {
120 PixelIteratorMut { p: p.pixels.chunks_mut(NUM_RGB_BYTES) }
121 }
122}
123
124impl<'a> std::iter::Iterator for PixelIteratorMut<'a> {
125 type Item = OpcPixel<'a, &'a mut [u8]>;
126
127 fn next(&mut self) -> Option<Self::Item> {
128 self.p.next().map(|x| OpcPixel::new(x))
129 }
130
131 fn nth(&mut self, n: usize) -> Option<Self::Item> {
132 self.p.nth(n).map(|x| OpcPixel::new(x))
133 }
134
135}
136
137impl<'a> ExactSizeIterator for PixelIteratorMut<'a> {
138 fn len(&self) -> usize {
139 self.p.len()
140 }
141}