notedeck

One damus client to rule them all
git clone git://jb55.com/notedeck
Log | Files | Refs | README | LICENSE

commit 9c2cf3af751af6901f357256d30440c14b78f16a
parent 015d502b981d93330d93f39c3f709b2a451ebcf8
Author: kernelkind <kernelkind@gmail.com>
Date:   Sat, 31 Jan 2026 20:17:56 -0500

refactor(media): make `ImageType` more obvious it uses pixels

Signed-off-by: kernelkind <kernelkind@gmail.com>

Diffstat:
Mcrates/notedeck/src/media/blur.rs | 10+++++++---
Mcrates/notedeck/src/media/images.rs | 7++++---
Mcrates/notedeck_columns/src/ui/note/post.rs | 24+++++++++++-------------
Mcrates/notedeck_ui/src/note/media.rs | 8+++++---
4 files changed, 27 insertions(+), 22 deletions(-)

diff --git a/crates/notedeck/src/media/blur.rs b/crates/notedeck/src/media/blur.rs @@ -1,6 +1,6 @@ use std::collections::HashMap; -use egui::TextureHandle; +use egui::{TextureHandle, Vec2}; use nostrdb::Note; use crate::{ @@ -18,7 +18,7 @@ pub struct ImageMetadata { pub dimensions: Option<PixelDimensions>, // width and height in pixels } -#[derive(Clone, Debug)] +#[derive(Clone, Debug, Copy)] pub struct PixelDimensions { pub x: u32, pub y: u32, @@ -53,6 +53,10 @@ pub struct PointDimensions { } impl PointDimensions { + pub fn from_vec(vec: Vec2) -> Self { + Self { x: vec.x, y: vec.y } + } + pub fn to_pixels(self, ui: &egui::Ui) -> PixelDimensions { PixelDimensions { x: (self.x * ui.pixels_per_point()).round() as u32, @@ -83,7 +87,7 @@ impl ImageMetadata { } if defined_dimensions.y <= max_pixels.y { - return defined_dimensions.clone(); + return *defined_dimensions; } let scale_factor = (max_pixels.y as f32) / (defined_dimensions.y as f32); diff --git a/crates/notedeck/src/media/images.rs b/crates/notedeck/src/media/images.rs @@ -1,4 +1,5 @@ use crate::media::network::HyperHttpResponse; +use crate::PixelDimensions; use egui::{pos2, Color32, ColorImage, Rect, Sense, SizeHint}; use image::imageops::FilterType; use image::FlatSamples; @@ -134,7 +135,7 @@ pub fn process_image(imgtyp: ImageType, mut image: image::DynamicImage) -> Color ImageType::Content(size_hint) => { let image = match size_hint { None => resize_image_if_too_big(image, MAX_IMG_LENGTH, FILTER_TYPE), - Some((w, h)) => image.resize(w, h, FILTER_TYPE), + Some(pixels) => image.resize(pixels.x, pixels.y, FILTER_TYPE), }; let image_buffer = image.into_rgba8(); @@ -180,7 +181,7 @@ pub fn parse_img_response( 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(Some(pixels)) => SizeHint::Size(pixels.x, pixels.y), ImageType::Content(None) => SizeHint::default(), }; @@ -220,5 +221,5 @@ pub enum ImageType { /// Profile Image (size) Profile(u32), /// Content Image with optional size hint - Content(Option<(u32, u32)>), + Content(Option<PixelDimensions>), } diff --git a/crates/notedeck_columns/src/ui/note/post.rs b/crates/notedeck_columns/src/ui/note/post.rs @@ -525,10 +525,13 @@ impl<'a, 'd> PostView<'a, 'd> { fn show_media(&mut self, ui: &mut egui::Ui) { let mut to_remove = Vec::new(); for (i, media) in self.draft.uploaded_media.iter().enumerate() { - let (width, height) = if let Some(dims) = media.dimensions { - (dims.0, dims.1) + let pixel_dims = if let Some(dims) = media.dimensions { + PixelDimensions { + x: dims.0, + y: dims.1, + } } else { - (300, 300) + PixelDimensions { x: 300, y: 300 } }; let Some(cache_type) = @@ -552,7 +555,7 @@ impl<'a, 'd> PostView<'a, 'd> { ui.ctx(), url, cache_type, - notedeck::ImageType::Content(Some((width, height))), + notedeck::ImageType::Content(Some(pixel_dims)), self.animation_mode, ); @@ -561,8 +564,7 @@ impl<'a, 'd> PostView<'a, 'd> { &mut self.draft.upload_errors, &mut to_remove, i, - width, - height, + pixel_dims, cur_state, ) } @@ -647,8 +649,7 @@ fn render_post_view_media( upload_errors: &mut Vec<String>, to_remove: &mut Vec<usize>, cur_index: usize, - width: u32, - height: u32, + pixel_dims: PixelDimensions, render_state: LatestImageTex, ) { match render_state { @@ -661,13 +662,10 @@ fn render_post_view_media( } LatestImageTex::Loaded(tex) => { let max_size = 300; - let size = if width > max_size || height > max_size { + let size = if pixel_dims.x > max_size || pixel_dims.y > max_size { PixelDimensions { x: 300, y: 300 } } else { - PixelDimensions { - x: width, - y: height, - } + pixel_dims } .to_points(ui.pixels_per_point()) .to_vec(); diff --git a/crates/notedeck_ui/src/note/media.rs b/crates/notedeck_ui/src/note/media.rs @@ -4,11 +4,11 @@ use egui::{ TextureHandle, Vec2, }; use notedeck::media::latest::ObfuscatedTexture; -use notedeck::MediaJobSender; use notedeck::{ fonts::get_font_size, show_one_error_message, tr, Images, Localization, MediaAction, MediaCacheType, NotedeckTextStyle, RenderableMedia, }; +use notedeck::{MediaJobSender, PointDimensions}; use crate::NoteOptions; use notedeck::media::images::ImageType; @@ -96,7 +96,9 @@ pub fn image_carousel( media_infos, i, img_cache, - ImageType::Content(Some((size.x as u32, size.y as u32))), + ImageType::Content(Some( + PointDimensions::from_vec(size).to_pixels(ui), + )), ); } }) @@ -142,7 +144,7 @@ pub fn render_media( ui, url, *media_type, - ImageType::Content(None), + ImageType::Content(Some(PointDimensions::from_vec(size).to_pixels(ui))), animation_mode, blur_type, size,