use super::*;
use mkutil::img_processing::pixels_from_bytes;
pub fn retained_image_from_path<P: AsRef<Path>>(path: P) -> AnyResult<RetainedImage> {
let debug_name = path.as_ref().display().to_string();
let image = image::open(path)?;
let img_buffer = image.to_rgba8();
let size = img_buffer.dimensions();
let color_img = egui::ColorImage::from_rgba_unmultiplied(
[size.0 as usize, size.1 as usize],
img_buffer.as_flat_samples().as_slice(),
);
Ok(RetainedImage::from_color_image(debug_name, color_img))
}
pub fn retained_image_from_bytes(bytes: &[u8]) -> AnyResult<RetainedImage> {
let (size, pixels) = pixels_from_bytes(bytes).context("Failed to parse pixels from bytes")?;
let color_img =
egui::ColorImage::from_rgba_unmultiplied([size[0] as usize, size[1] as usize], &pixels);
Ok(RetainedImage::from_color_image(
"RetainedImage load from bytes",
color_img,
))
}
pub struct ImageSpec(pub RetainedImage);
impl ImageSpec {
pub fn inner(&self) -> &RetainedImage {
&self.0
}
pub fn new(inner: RetainedImage) -> Self {
ImageSpec(inner)
}
pub fn from_retained_image<P: AsRef<Path>>(path: P) -> Option<Self> {
match retained_image_from_path(path) {
Ok(img) => Some(Self::new(img)),
Err(_) => None,
}
}
}
impl fmt::Debug for ImageSpec {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_tuple("ImageSpec")
.field(&self.0.debug_name())
.finish()
}
}
impl std::clone::Clone for ImageSpec {
fn clone(&self) -> Self {
ImageSpec(retained_image_from_path(self.0.debug_name()).unwrap())
}
}