diff options
author | 2022-02-13 16:51:31 +0700 | |
---|---|---|
committer | 2022-02-13 16:51:31 +0700 | |
commit | 45455be45000c0d41d18eced1b62eab049c5e9c0 (patch) | |
tree | 65555632f399471b4fc6e6d0ac2c8ba3b1a89b84 /native/src | |
parent | 09c96a6d8123a62411e2c461a018c3900dec71cb (diff) | |
download | iced-45455be45000c0d41d18eced1b62eab049c5e9c0.tar.gz iced-45455be45000c0d41d18eced1b62eab049c5e9c0.tar.bz2 iced-45455be45000c0d41d18eced1b62eab049c5e9c0.zip |
Implement `Image` in `iced_pure`
Diffstat (limited to 'native/src')
-rw-r--r-- | native/src/widget/image.rs | 73 |
1 files changed, 49 insertions, 24 deletions
diff --git a/native/src/widget/image.rs b/native/src/widget/image.rs index b8fb662e..5e03bf99 100644 --- a/native/src/widget/image.rs +++ b/native/src/widget/image.rs @@ -51,6 +51,53 @@ impl<Handle> Image<Handle> { } } +/// Computes the layout of an [`Image`]. +pub fn layout<Renderer, Handle>( + renderer: &Renderer, + limits: &layout::Limits, + handle: &Handle, + width: Length, + height: Length, +) -> layout::Node +where + Renderer: image::Renderer<Handle = Handle>, +{ + let (original_width, original_height) = renderer.dimensions(handle); + + let mut size = limits + .width(width) + .height(height) + .resolve(Size::new(original_width as f32, original_height as f32)); + + let aspect_ratio = original_width as f32 / original_height as f32; + let viewport_aspect_ratio = size.width / size.height; + + if viewport_aspect_ratio > aspect_ratio { + size.width = + original_width as f32 * size.height / original_height as f32; + } else { + size.height = + original_height as f32 * size.width / original_width as f32; + } + + layout::Node::new(size) +} + +/// Hashes the layout attributes of an [`Image`]. +pub fn hash_layout<Handle: Hash>( + state: &mut Hasher, + handle: &Handle, + width: Length, + height: Length, +) { + struct Marker; + std::any::TypeId::of::<Marker>().hash(state); + + handle.hash(state); + width.hash(state); + height.hash(state); +} + impl<Message, Renderer, Handle> Widget<Message, Renderer> for Image<Handle> where Renderer: image::Renderer<Handle = Handle>, @@ -69,24 +116,7 @@ where renderer: &Renderer, limits: &layout::Limits, ) -> layout::Node { - let (width, height) = renderer.dimensions(&self.handle); - - let aspect_ratio = width as f32 / height as f32; - - let mut size = limits - .width(self.width) - .height(self.height) - .resolve(Size::new(width as f32, height as f32)); - - let viewport_aspect_ratio = size.width / size.height; - - 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) + layout(renderer, limits, &self.handle, self.width, self.height) } fn draw( @@ -101,12 +131,7 @@ where } fn hash_layout(&self, state: &mut Hasher) { - struct Marker; - std::any::TypeId::of::<Marker>().hash(state); - - self.handle.hash(state); - self.width.hash(state); - self.height.hash(state); + hash_layout(state, &self.handle, self.width, self.height) } } |