1extern crate minivec;
5
6#[derive(Default)]
11pub struct Image<T>
12where
13 T: crate::Numeric,
14{
15 pub(super) r: minivec::MiniVec<T>,
16 pub(super) g: minivec::MiniVec<T>,
17 pub(super) b: minivec::MiniVec<T>,
18 pub(super) a: minivec::MiniVec<T>,
19 pub(super) h: usize,
20 pub(super) w: usize,
21}
22
23impl<T> Image<T>
24where
25 T: crate::Numeric,
26{
27 #[must_use]
30 pub fn r(&self) -> &[T] {
31 self.r.as_slice()
32 }
33
34 #[must_use]
37 pub fn g(&self) -> &[T] {
38 self.g.as_slice()
39 }
40
41 #[must_use]
44 pub fn b(&self) -> &[T] {
45 self.b.as_slice()
46 }
47
48 #[must_use]
51 pub fn a(&self) -> &[T] {
52 self.a.as_slice()
53 }
54
55 #[must_use]
58 pub fn width(&self) -> usize {
59 self.w
60 }
61
62 #[must_use]
65 pub fn height(&self) -> usize {
66 self.h
67 }
68
69 #[must_use]
72 pub fn rgba_iter(&self) -> Iter<'_, T> {
73 Iter::new(&self.r, &self.g, &self.b, &self.a)
74 }
75
76 #[must_use]
79 pub fn rgb_iter(&self) -> crate::rgb::Iter<'_, T> {
80 crate::rgb::Iter::new(&self.r, &self.g, &self.b)
81 }
82}
83
84pub struct Iter<'a, N>
89where
90 N: crate::Numeric,
91{
92 r: std::slice::Iter<'a, N>,
93 g: std::slice::Iter<'a, N>,
94 b: std::slice::Iter<'a, N>,
95 a: std::slice::Iter<'a, N>,
96}
97
98impl<'a, N> Iter<'a, N>
111where
112 N: crate::Numeric,
113{
114 pub fn new<R>(r: &'a R, g: &'a R, b: &'a R, a: &'a R) -> Self
117 where
118 R: std::convert::AsRef<[N]>,
119 {
120 Self {
121 r: r.as_ref().iter(),
122 g: g.as_ref().iter(),
123 b: b.as_ref().iter(),
124 a: a.as_ref().iter(),
125 }
126 }
127}
128
129impl<'a, N> std::iter::Iterator for Iter<'a, N>
130where
131 N: crate::Numeric,
132{
133 type Item = [N; 4];
134
135 fn next(&mut self) -> Option<Self::Item> {
136 match (self.r.next(), self.g.next(), self.b.next(), self.a.next()) {
137 (Some(r), Some(g), Some(b), Some(a)) => Some([*r, *g, *b, *a]),
138 _ => None,
139 }
140 }
141}