Skip to main content

argui_image/
lib.rs

1//! Optional PNG/JPEG decoding for Argui image assets.
2
3use argui_paint::{ImageAsset, ImageAssetError, ImageId};
4
5#[derive(Clone, Debug, Default)]
6pub struct ImageLibrary {
7    assets: Vec<ImageAsset>,
8}
9
10impl ImageLibrary {
11    #[must_use]
12    pub const fn new() -> Self {
13        Self { assets: Vec::new() }
14    }
15
16    pub fn insert(&mut self, encoded: &[u8]) -> Result<ImageId, DecodeError> {
17        let id = ImageId::fresh();
18        self.assets.push(decode(id, encoded)?);
19        Ok(id)
20    }
21
22    #[must_use]
23    pub fn assets(&self) -> &[ImageAsset] {
24        &self.assets
25    }
26}
27
28#[derive(Debug, thiserror::Error)]
29pub enum DecodeError {
30    #[error("image decoding failed: {0}")]
31    Decode(#[from] image::ImageError),
32    #[error(transparent)]
33    Asset(#[from] ImageAssetError),
34}
35
36pub fn decode(id: ImageId, encoded: &[u8]) -> Result<ImageAsset, DecodeError> {
37    let decoded = image::load_from_memory(encoded)?.into_rgba8();
38    ImageAsset::rgba8(id, decoded.width(), decoded.height(), decoded.into_raw()).map_err(Into::into)
39}