summaryrefslogtreecommitdiffstats
path: root/core/src/rotation.rs
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector@hecrj.dev>2024-05-02 13:15:17 +0200
committerLibravatar Héctor Ramón Jiménez <hector@hecrj.dev>2024-05-02 17:27:45 +0200
commit09a6bcfffc24f5abdc8709403bab7ae1e01563f1 (patch)
tree8a09792cd01cb56a3a5d11184a60009f8a22a85f /core/src/rotation.rs
parentaae8e4f5cfabfc3725ac938023fa29a6737a380c (diff)
downloadiced-09a6bcfffc24f5abdc8709403bab7ae1e01563f1.tar.gz
iced-09a6bcfffc24f5abdc8709403bab7ae1e01563f1.tar.bz2
iced-09a6bcfffc24f5abdc8709403bab7ae1e01563f1.zip
Add `Image` rotation support
Co-authored-by: DKolter <68352124+DKolter@users.noreply.github.com>
Diffstat (limited to 'core/src/rotation.rs')
-rw-r--r--core/src/rotation.rs37
1 files changed, 37 insertions, 0 deletions
diff --git a/core/src/rotation.rs b/core/src/rotation.rs
new file mode 100644
index 00000000..821aa494
--- /dev/null
+++ b/core/src/rotation.rs
@@ -0,0 +1,37 @@
+//! Control the rotation of some content (like an image) with the `RotationLayout` within a
+//! space.
+use crate::Size;
+
+/// The strategy used to rotate the content.
+///
+/// This is used to control the behavior of the layout when the content is rotated
+/// by a certain angle.
+#[derive(Debug, Hash, Clone, Copy, PartialEq, Eq)]
+pub enum RotationLayout {
+ /// The layout is kept exactly as it was before the rotation.
+ ///
+ /// This is especially useful when used for animations, as it will avoid the
+ /// layout being shifted or resized when smoothly i.e. an icon.
+ Keep,
+ /// The layout is adjusted to fit the rotated content.
+ ///
+ /// This allows you to rotate an image and have the layout adjust to fit the new
+ /// size of the image.
+ Change,
+}
+
+impl RotationLayout {
+ /// Applies the rotation to the layout while respecting the [`RotationLayout`] strategy.
+ /// The rotation is given in radians.
+ pub fn apply_to_size(&self, size: Size, rotation: f32) -> Size {
+ match self {
+ Self::Keep => size,
+ Self::Change => Size {
+ width: (size.width * rotation.cos()).abs()
+ + (size.height * rotation.sin()).abs(),
+ height: (size.width * rotation.sin()).abs()
+ + (size.height * rotation.cos()).abs(),
+ },
+ }
+ }
+}