tinytga/
pixels.rs

1use embedded_graphics::{
2    pixelcolor::{
3        raw::{RawU16, RawU24, RawU8},
4        Gray8, Rgb555, Rgb888,
5    },
6    prelude::*,
7};
8
9use crate::{ColorType, RawPixel, RawPixels, Tga};
10
11/// Iterator over individual TGA pixels.
12///
13/// See the [`pixels`] method for additional information.
14///
15/// [`pixels`]: struct.Tga.html#method.pixels
16#[derive(Eq, PartialEq, Ord, PartialOrd, Hash, Debug)]
17pub struct Pixels<'a, C> {
18    tga: &'a Tga<'a, C>,
19    raw_pixels: RawPixels<'a>,
20}
21
22impl<'a, C> Pixels<'a, C>
23where
24    C: PixelColor + From<Gray8> + From<Rgb555> + From<Rgb888>,
25{
26    pub(crate) fn new(tga: &'a Tga<'a, C>) -> Self {
27        Self {
28            tga,
29            raw_pixels: RawPixels::new(&tga.raw),
30        }
31    }
32}
33
34impl<C> Iterator for Pixels<'_, C>
35where
36    C: PixelColor + From<Gray8> + From<Rgb555> + From<Rgb888>,
37{
38    type Item = Pixel<C>;
39
40    fn next(&mut self) -> Option<Self::Item> {
41        let RawPixel {
42            position,
43            mut color,
44        } = self.raw_pixels.next()?;
45
46        if let Some(color_map) = self.tga.raw.color_map() {
47            color = color_map.get_raw(color as usize).unwrap()
48        }
49
50        let color = match self.tga.image_color_type {
51            ColorType::Gray8 => Gray8::from(RawU8::from_u32(color)).into(),
52            ColorType::Rgb555 => Rgb555::from(RawU16::from_u32(color)).into(),
53            ColorType::Rgb888 => Rgb888::from(RawU24::from_u32(color)).into(),
54        };
55
56        Some(Pixel(position, color))
57    }
58}