use alloc::format; use png_decoder::DecodeError; use crate::{color::Color, error::RenderError}; use super::{ImageData, ImageDecoder}; pub struct PngDecoder; impl ImageDecoder for PngDecoder { fn decode(&self, bytes: &[u8]) -> Result { let (header, rgba_pixels) = png_decoder::decode(bytes).map_err(|err| RenderError::from(err))?; let pixels = rgba_pixels .chunks(4) .map(|chunk| Color::new(chunk[0].into(), chunk[1].into(), chunk[2].into())) .collect(); Ok(ImageData { width: header.width as usize, height: header.height as usize, pixels, }) } } impl From for RenderError { fn from(value: DecodeError) -> Self { RenderError::new("PngDecoder", &format!("{:?}", value)) } }