tk_opc/
pixel.rs

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}