summaryrefslogtreecommitdiffstats
path: root/native/src
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2022-02-13 16:51:31 +0700
committerLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2022-02-13 16:51:31 +0700
commit45455be45000c0d41d18eced1b62eab049c5e9c0 (patch)
tree65555632f399471b4fc6e6d0ac2c8ba3b1a89b84 /native/src
parent09c96a6d8123a62411e2c461a018c3900dec71cb (diff)
downloadiced-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.rs73
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)
}
}