33 lines
863 B
Rust
33 lines
863 B
Rust
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<super::ImageData, RenderError> {
|
|
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<DecodeError> for RenderError {
|
|
fn from(value: DecodeError) -> Self {
|
|
RenderError::new("PngDecoder", &format!("{:?}", value))
|
|
}
|
|
}
|