summaryrefslogtreecommitdiffstats
path: root/graphics/src
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón <hector@hecrj.dev>2024-02-02 14:54:56 +0100
committerLibravatar GitHub <noreply@github.com>2024-02-02 14:54:56 +0100
commitaea172543cb49f1f1e3625f60b49336f59e26c00 (patch)
treee99e7a55873678ac37fd695a0f46c1350b30dd2f /graphics/src
parent759f0e922598504705b543185bc7140a652b726a (diff)
parentb3adf3184594c9bf60e0548a0362d30c512f3966 (diff)
downloadiced-aea172543cb49f1f1e3625f60b49336f59e26c00.tar.gz
iced-aea172543cb49f1f1e3625f60b49336f59e26c00.tar.bz2
iced-aea172543cb49f1f1e3625f60b49336f59e26c00.zip
Merge pull request #2120 from iced-rs/transform-primitive
`Transform` primitive
Diffstat (limited to 'graphics/src')
-rw-r--r--graphics/src/damage.rs18
-rw-r--r--graphics/src/lib.rs2
-rw-r--r--graphics/src/primitive.rs34
-rw-r--r--graphics/src/renderer.rs18
-rw-r--r--graphics/src/transformation.rs59
-rw-r--r--graphics/src/viewport.rs4
6 files changed, 42 insertions, 93 deletions
diff --git a/graphics/src/damage.rs b/graphics/src/damage.rs
index ba9192ef..8edf69d7 100644
--- a/graphics/src/damage.rs
+++ b/graphics/src/damage.rs
@@ -102,10 +102,10 @@ impl<T: Damage> Damage for Primitive<T> {
.fold(Rectangle::with_size(Size::ZERO), |a, b| {
Rectangle::union(&a, &b)
}),
- Self::Translate {
- translation,
+ Self::Transform {
+ transformation,
content,
- } => content.bounds() + *translation,
+ } => content.bounds() * *transformation,
Self::Cache { content } => content.bounds(),
Self::Custom(custom) => custom.bounds(),
}
@@ -144,19 +144,19 @@ fn regions<T: Damage>(a: &Primitive<T>, b: &Primitive<T>) -> Vec<Rectangle> {
}
}
(
- Primitive::Translate {
- translation: translation_a,
+ Primitive::Transform {
+ transformation: transformation_a,
content: content_a,
},
- Primitive::Translate {
- translation: translation_b,
+ Primitive::Transform {
+ transformation: transformation_b,
content: content_b,
},
) => {
- if translation_a == translation_b {
+ if transformation_a == transformation_b {
return regions(content_a, content_b)
.into_iter()
- .map(|r| r + *translation_a)
+ .map(|r| r * *transformation_a)
.collect();
}
}
diff --git a/graphics/src/lib.rs b/graphics/src/lib.rs
index 76de56bf..aa9d00e8 100644
--- a/graphics/src/lib.rs
+++ b/graphics/src/lib.rs
@@ -19,7 +19,6 @@
mod antialiasing;
mod error;
mod primitive;
-mod transformation;
mod viewport;
pub mod backend;
@@ -46,7 +45,6 @@ pub use gradient::Gradient;
pub use mesh::Mesh;
pub use primitive::Primitive;
pub use renderer::Renderer;
-pub use transformation::Transformation;
pub use viewport::Viewport;
pub use iced_core as core;
diff --git a/graphics/src/primitive.rs b/graphics/src/primitive.rs
index aed59e1a..6929b0a1 100644
--- a/graphics/src/primitive.rs
+++ b/graphics/src/primitive.rs
@@ -4,7 +4,8 @@ use crate::core::image;
use crate::core::svg;
use crate::core::text;
use crate::core::{
- Background, Border, Color, Font, Pixels, Point, Rectangle, Shadow, Vector,
+ Background, Border, Color, Font, Pixels, Point, Rectangle, Shadow,
+ Transformation, Vector,
};
use crate::text::editor;
use crate::text::paragraph;
@@ -104,12 +105,12 @@ pub enum Primitive<T> {
/// The content of the clip
content: Box<Primitive<T>>,
},
- /// A primitive that applies a translation
- Translate {
- /// The translation vector
- translation: Vector,
+ /// A primitive that applies a [`Transformation`]
+ Transform {
+ /// The [`Transformation`]
+ transformation: Transformation,
- /// The primitive to translate
+ /// The primitive to transform
content: Box<Primitive<T>>,
},
/// A cached primitive.
@@ -125,12 +126,12 @@ pub enum Primitive<T> {
}
impl<T> Primitive<T> {
- /// Creates a [`Primitive::Group`].
+ /// Groups the current [`Primitive`].
pub fn group(primitives: Vec<Self>) -> Self {
Self::Group { primitives }
}
- /// Creates a [`Primitive::Clip`].
+ /// Clips the current [`Primitive`].
pub fn clip(self, bounds: Rectangle) -> Self {
Self::Clip {
bounds,
@@ -138,10 +139,21 @@ impl<T> Primitive<T> {
}
}
- /// Creates a [`Primitive::Translate`].
+ /// Translates the current [`Primitive`].
pub fn translate(self, translation: Vector) -> Self {
- Self::Translate {
- translation,
+ Self::Transform {
+ transformation: Transformation::translate(
+ translation.x,
+ translation.y,
+ ),
+ content: Box::new(self),
+ }
+ }
+
+ /// Transforms the current [`Primitive`].
+ pub fn transform(self, transformation: Transformation) -> Self {
+ Self::Transform {
+ transformation,
content: Box::new(self),
}
}
diff --git a/graphics/src/renderer.rs b/graphics/src/renderer.rs
index cb07c23b..143f348b 100644
--- a/graphics/src/renderer.rs
+++ b/graphics/src/renderer.rs
@@ -6,7 +6,7 @@ use crate::core::renderer;
use crate::core::svg;
use crate::core::text::Text;
use crate::core::{
- Background, Color, Font, Pixels, Point, Rectangle, Size, Vector,
+ Background, Color, Font, Pixels, Point, Rectangle, Size, Transformation,
};
use crate::text;
use crate::Primitive;
@@ -73,20 +73,20 @@ impl<B: Backend> Renderer<B> {
}
/// Starts recording a translation.
- pub fn start_translation(&mut self) -> Vec<Primitive<B::Primitive>> {
+ pub fn start_transformation(&mut self) -> Vec<Primitive<B::Primitive>> {
std::mem::take(&mut self.primitives)
}
/// Ends the recording of a translation.
- pub fn end_translation(
+ pub fn end_transformation(
&mut self,
primitives: Vec<Primitive<B::Primitive>>,
- translation: Vector,
+ transformation: Transformation,
) {
let layer = std::mem::replace(&mut self.primitives, primitives);
self.primitives
- .push(Primitive::group(layer).translate(translation));
+ .push(Primitive::group(layer).transform(transformation));
}
}
@@ -99,16 +99,16 @@ impl<B: Backend> iced_core::Renderer for Renderer<B> {
self.end_layer(current, bounds);
}
- fn with_translation(
+ fn with_transformation(
&mut self,
- translation: Vector,
+ transformation: Transformation,
f: impl FnOnce(&mut Self),
) {
- let current = self.start_translation();
+ let current = self.start_transformation();
f(self);
- self.end_translation(current, translation);
+ self.end_transformation(current, transformation);
}
fn fill_quad(
diff --git a/graphics/src/transformation.rs b/graphics/src/transformation.rs
deleted file mode 100644
index cf0457a4..00000000
--- a/graphics/src/transformation.rs
+++ /dev/null
@@ -1,59 +0,0 @@
-use glam::{Mat4, Vec3};
-use std::ops::Mul;
-
-/// A 2D transformation matrix.
-#[derive(Debug, Clone, Copy, PartialEq)]
-pub struct Transformation(Mat4);
-
-impl Transformation {
- /// Get the identity transformation.
- pub fn identity() -> Transformation {
- Transformation(Mat4::IDENTITY)
- }
-
- /// Creates an orthographic projection.
- #[rustfmt::skip]
- pub fn orthographic(width: u32, height: u32) -> Transformation {
- Transformation(Mat4::orthographic_rh_gl(
- 0.0, width as f32,
- height as f32, 0.0,
- -1.0, 1.0
- ))
- }
-
- /// Creates a translate transformation.
- pub fn translate(x: f32, y: f32) -> Transformation {
- Transformation(Mat4::from_translation(Vec3::new(x, y, 0.0)))
- }
-
- /// Creates a scale transformation.
- pub fn scale(x: f32, y: f32) -> Transformation {
- Transformation(Mat4::from_scale(Vec3::new(x, y, 1.0)))
- }
-}
-
-impl Mul for Transformation {
- type Output = Self;
-
- fn mul(self, rhs: Self) -> Self {
- Transformation(self.0 * rhs.0)
- }
-}
-
-impl AsRef<[f32; 16]> for Transformation {
- fn as_ref(&self) -> &[f32; 16] {
- self.0.as_ref()
- }
-}
-
-impl From<Transformation> for [f32; 16] {
- fn from(t: Transformation) -> [f32; 16] {
- *t.as_ref()
- }
-}
-
-impl From<Transformation> for Mat4 {
- fn from(transformation: Transformation) -> Self {
- transformation.0
- }
-}
diff --git a/graphics/src/viewport.rs b/graphics/src/viewport.rs
index 5792555d..dc8e21d3 100644
--- a/graphics/src/viewport.rs
+++ b/graphics/src/viewport.rs
@@ -1,6 +1,4 @@
-use crate::Transformation;
-
-use iced_core::Size;
+use crate::core::{Size, Transformation};
/// A viewing region for displaying computer graphics.
#[derive(Debug, Clone)]