| 1 | use core::marker::PhantomData; |
| 2 | |
| 3 | use embedded_graphics::{ |
| 4 | pixelcolor::{ |
| 5 | raw::{RawU16, RawU24}, |
| 6 | Rgb555, Rgb565, Rgb888, |
| 7 | }, |
| 8 | prelude::*, |
| 9 | }; |
| 10 | |
| 11 | use crate::{raw_bmp::ColorType, raw_iter::RawPixels, Bmp, ColorTable, RawPixel}; |
| 12 | |
| 13 | /// Iterator over the pixels in a BMP image. |
| 14 | /// |
| 15 | /// See the [`pixels`](Bmp::pixels) method documentation for more information. |
| 16 | #[allow (missing_debug_implementations)] |
| 17 | pub struct Pixels<'a, C> |
| 18 | where |
| 19 | C: PixelColor + From<Rgb555> + From<Rgb565> + From<Rgb888>, |
| 20 | { |
| 21 | raw_pixels: RawPixels<'a>, |
| 22 | color_table: Option<&'a ColorTable<'a>>, |
| 23 | image_color_type: ColorType, |
| 24 | target_color_type: PhantomData<C>, |
| 25 | } |
| 26 | |
| 27 | impl<'a, C> Pixels<'a, C> |
| 28 | where |
| 29 | C: PixelColor + From<Rgb555> + From<Rgb565> + From<Rgb888>, |
| 30 | { |
| 31 | pub(crate) fn new(bmp: &'a Bmp<'a, C>) -> Self { |
| 32 | let raw_pixels: RawPixels<'_> = RawPixels::new(&bmp.raw_bmp); |
| 33 | |
| 34 | Self { |
| 35 | raw_pixels, |
| 36 | color_table: bmp.raw_bmp.color_table(), |
| 37 | image_color_type: bmp.raw_bmp.color_type, |
| 38 | target_color_type: PhantomData, |
| 39 | } |
| 40 | } |
| 41 | } |
| 42 | |
| 43 | impl<C> Iterator for Pixels<'_, C> |
| 44 | where |
| 45 | C: PixelColor + From<Rgb555> + From<Rgb565> + From<Rgb888>, |
| 46 | { |
| 47 | type Item = Pixel<C>; |
| 48 | |
| 49 | fn next(&mut self) -> Option<Self::Item> { |
| 50 | let RawPixel { position: Point, color: u32 } = self.raw_pixels.next()?; |
| 51 | |
| 52 | let color: C = match self.image_color_type { |
| 53 | ColorType::Index1 | ColorType::Index4 | ColorType::Index8 => { |
| 54 | self.color_table?.get(index:color).unwrap_or_default().into() |
| 55 | } |
| 56 | ColorType::Rgb555 => Rgb555::from(RawU16::from_u32(color)).into(), |
| 57 | ColorType::Rgb565 => Rgb565::from(RawU16::from_u32(color)).into(), |
| 58 | ColorType::Rgb888 | ColorType::Xrgb8888 => Rgb888::from(RawU24::from_u32(color)).into(), |
| 59 | }; |
| 60 | |
| 61 | Some(Pixel(position, color)) |
| 62 | } |
| 63 | } |
| 64 | |