Files
uefi-video/src/codec/image/png.rs
2025-05-15 16:33:37 +09:00

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))
}
}