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:
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,