1use 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}