diff options
Diffstat (limited to 'native')
-rw-r--r-- | native/src/widget/image.rs | 39 |
1 files changed, 23 insertions, 16 deletions
diff --git a/native/src/widget/image.rs b/native/src/widget/image.rs index c82525e4..aaa3eca5 100644 --- a/native/src/widget/image.rs +++ b/native/src/widget/image.rs @@ -5,7 +5,7 @@ use crate::{layout, Element, Hasher, Layout, Length, Point, Size, Widget}; use std::{ hash::{Hash, Hasher as _}, path::PathBuf, - rc::Rc, + sync::Arc, }; /// A frame that displays an image while keeping aspect ratio. @@ -76,20 +76,18 @@ where let aspect_ratio = width as f32 / height as f32; - // TODO: Deal with additional cases - let (width, height) = match (self.width, self.height) { - (Length::Units(width), _) => ( - self.width, - Length::Units((width as f32 / aspect_ratio).round() as u16), - ), - (_, _) => { - (Length::Units(width as u16), Length::Units(height as u16)) - } - }; + let mut size = limits + .width(self.width) + .height(self.height) + .resolve(Size::new(width as f32, height as f32)); - let mut size = limits.width(width).height(height).resolve(Size::ZERO); + let viewport_aspect_ratio = size.width / size.height; - size.height = size.width / aspect_ratio; + if viewport_aspect_ratio > aspect_ratio { + size.width = width as f32 * size.height / height as f32; + } else { + size.height = height as f32 * size.width / width as f32; + } layout::Node::new(size) } @@ -115,7 +113,7 @@ where #[derive(Debug, Clone)] pub struct Handle { id: u64, - data: Rc<Data>, + data: Arc<Data>, } impl Handle { @@ -139,7 +137,7 @@ impl Handle { Handle { id: hasher.finish(), - data: Rc::new(data), + data: Arc::new(data), } } @@ -173,7 +171,7 @@ impl From<&str> for Handle { /// The data of an [`Image`]. /// /// [`Image`]: struct.Image.html -#[derive(Debug, Clone, Hash)] +#[derive(Clone, Hash)] pub enum Data { /// File data Path(PathBuf), @@ -182,6 +180,15 @@ pub enum Data { Bytes(Vec<u8>), } +impl std::fmt::Debug for Data { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Data::Path(path) => write!(f, "Path({:?})", path), + Data::Bytes(_) => write!(f, "Bytes(...)"), + } + } +} + /// The renderer of an [`Image`]. /// /// Your [renderer] will need to implement this trait before being able to use |