From 45455be45000c0d41d18eced1b62eab049c5e9c0 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Sun, 13 Feb 2022 16:51:31 +0700 Subject: Implement `Image` in `iced_pure` --- native/src/widget/image.rs | 73 +++++++++++++++++++++++++++++++--------------- 1 file changed, 49 insertions(+), 24 deletions(-) (limited to 'native/src/widget/image.rs') 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 Image { } } +/// Computes the layout of an [`Image`]. +pub fn layout( + renderer: &Renderer, + limits: &layout::Limits, + handle: &Handle, + width: Length, + height: Length, +) -> layout::Node +where + Renderer: image::Renderer, +{ + 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( + state: &mut Hasher, + handle: &Handle, + width: Length, + height: Length, +) { + struct Marker; + std::any::TypeId::of::().hash(state); + + handle.hash(state); + width.hash(state); + height.hash(state); +} + impl Widget for Image where Renderer: image::Renderer, @@ -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::().hash(state); - - self.handle.hash(state); - self.width.hash(state); - self.height.hash(state); + hash_layout(state, &self.handle, self.width, self.height) } } -- cgit