commit a0415bada0b0610e77314a658003722c44068d1c
parent e83782b16027c42a37324f0c9d8d760834eb8498
Author: kernelkind <kernelkind@gmail.com>
Date: Sat, 22 Nov 2025 20:49:13 -0700
feat(img-parsing): new parse_img_response
Signed-off-by: kernelkind <kernelkind@gmail.com>
Diffstat:
1 file changed, 29 insertions(+), 0 deletions(-)
diff --git a/crates/notedeck/src/media/images.rs b/crates/notedeck/src/media/images.rs
@@ -1,4 +1,5 @@
use crate::media::load_texture_checked;
+use crate::media::network::HyperHttpResponse;
use crate::{AnimationOld, ImageFrame, MediaCache, MediaCacheType, TextureFrame, TexturedImage};
use egui::{pos2, Color32, ColorImage, Context, Rect, Sense, SizeHint};
use image::codecs::gif::GifDecoder;
@@ -211,6 +212,34 @@ fn parse_img_response_old(
}
}
+#[profiling::function]
+pub fn parse_img_response(
+ response: HyperHttpResponse,
+ imgtyp: ImageType,
+) -> Result<ColorImage, crate::Error> {
+ let content_type = response.content_type.unwrap_or_default();
+ let size_hint = match imgtyp {
+ ImageType::Profile(size) => SizeHint::Size(size, size),
+ ImageType::Content(Some((w, h))) => SizeHint::Size(w, h),
+ ImageType::Content(None) => SizeHint::default(),
+ };
+
+ if content_type.starts_with("image/svg") {
+ profiling::scope!("load_svg");
+
+ let mut color_image =
+ egui_extras::image::load_svg_bytes_with_size(&response.bytes, Some(size_hint))?;
+ round_image(&mut color_image);
+ Ok(color_image)
+ } else if content_type.starts_with("image/") {
+ profiling::scope!("load_from_memory");
+ let dyn_image = image::load_from_memory(&response.bytes)?;
+ Ok(process_image(imgtyp, dyn_image))
+ } else {
+ Err(format!("Expected image, found content-type {content_type:?}").into())
+ }
+}
+
fn fetch_img_from_disk(
ctx: &egui::Context,
url: &str,