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#[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}