extern crate minivec;
#[derive(Default)]
pub struct Image<T>
where
T: crate::Numeric,
{
pub(super) r: minivec::MiniVec<T>,
pub(super) g: minivec::MiniVec<T>,
pub(super) b: minivec::MiniVec<T>,
pub(super) a: minivec::MiniVec<T>,
pub(super) h: usize,
pub(super) w: usize,
}
impl<T> Image<T>
where
T: crate::Numeric,
{
#[must_use]
pub fn r(&self) -> &[T] {
self.r.as_slice()
}
#[must_use]
pub fn g(&self) -> &[T] {
self.g.as_slice()
}
#[must_use]
pub fn b(&self) -> &[T] {
self.b.as_slice()
}
#[must_use]
pub fn a(&self) -> &[T] {
self.a.as_slice()
}
#[must_use]
pub fn width(&self) -> usize {
self.w
}
#[must_use]
pub fn height(&self) -> usize {
self.h
}
#[must_use]
pub fn rgba_iter(&self) -> Iter<'_, T> {
Iter::new(&self.r, &self.g, &self.b, &self.a)
}
#[must_use]
pub fn rgb_iter(&self) -> crate::rgb::Iter<'_, T> {
crate::rgb::Iter::new(&self.r, &self.g, &self.b)
}
}
pub struct Iter<'a, N>
where
N: crate::Numeric,
{
r: std::slice::Iter<'a, N>,
g: std::slice::Iter<'a, N>,
b: std::slice::Iter<'a, N>,
a: std::slice::Iter<'a, N>,
}
impl<'a, N> Iter<'a, N>
where
N: crate::Numeric,
{
pub fn new<R>(r: &'a R, g: &'a R, b: &'a R, a: &'a R) -> Self
where
R: std::convert::AsRef<[N]>,
{
Self {
r: r.as_ref().iter(),
g: g.as_ref().iter(),
b: b.as_ref().iter(),
a: a.as_ref().iter(),
}
}
}
impl<'a, N> std::iter::Iterator for Iter<'a, N>
where
N: crate::Numeric,
{
type Item = [N; 4];
fn next(&mut self) -> Option<Self::Item> {
match (self.r.next(), self.g.next(), self.b.next(), self.a.next()) {
(Some(r), Some(g), Some(b), Some(a)) => Some([*r, *g, *b, *a]),
_ => None,
}
}
}