initial commit
This commit is contained in:
32
src/codec/image/png.rs
Normal file
32
src/codec/image/png.rs
Normal file
@@ -0,0 +1,32 @@
|
||||
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))
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user