summaryrefslogtreecommitdiff
path: root/src/library/transform.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/library/transform.rs')
-rw-r--r--src/library/transform.rs79
1 files changed, 0 insertions, 79 deletions
diff --git a/src/library/transform.rs b/src/library/transform.rs
deleted file mode 100644
index 897f3144..00000000
--- a/src/library/transform.rs
+++ /dev/null
@@ -1,79 +0,0 @@
-//! Affine transformations on nodes.
-
-use super::prelude::*;
-use crate::geom::Transform;
-
-/// Transform a node without affecting layout.
-#[derive(Debug, Hash)]
-pub struct TransformNode<const T: TransformKind> {
- /// Transformation to apply to the contents.
- pub transform: Transform,
- /// The node whose contents should be transformed.
- pub child: LayoutNode,
-}
-
-#[class]
-impl<const T: TransformKind> TransformNode<T> {
- /// The origin of the transformation.
- pub const ORIGIN: Spec<Option<Align>> = Spec::default();
-
- fn construct(_: &mut Context, args: &mut Args) -> TypResult<Template> {
- let transform = match T {
- MOVE => {
- let tx = args.named("x")?.unwrap_or_default();
- let ty = args.named("y")?.unwrap_or_default();
- Transform::translation(tx, ty)
- }
- ROTATE => {
- let angle = args.named_or_find("angle")?.unwrap_or_default();
- Transform::rotation(angle)
- }
- SCALE | _ => {
- let all = args.find()?;
- let sx = args.named("x")?.or(all).unwrap_or(Relative::one());
- let sy = args.named("y")?.or(all).unwrap_or(Relative::one());
- Transform::scale(sx, sy)
- }
- };
-
- Ok(Template::inline(Self {
- transform,
- child: args.expect("body")?,
- }))
- }
-}
-
-impl<const T: TransformKind> Layout for TransformNode<T> {
- fn layout(
- &self,
- ctx: &mut Context,
- regions: &Regions,
- styles: StyleChain,
- ) -> TypResult<Vec<Arc<Frame>>> {
- let origin = styles.get(Self::ORIGIN).unwrap_or(Align::CENTER_HORIZON);
- let mut frames = self.child.layout(ctx, regions, styles)?;
-
- for frame in &mut frames {
- let Spec { x, y } = origin.zip(frame.size).map(|(o, s)| o.resolve(s));
- let transform = Transform::translation(x, y)
- .pre_concat(self.transform)
- .pre_concat(Transform::translation(-x, -y));
-
- Arc::make_mut(frame).transform(transform);
- }
-
- Ok(frames)
- }
-}
-
-/// Kinds of transformations.
-pub type TransformKind = usize;
-
-/// A translation on the X and Y axes.
-pub const MOVE: TransformKind = 0;
-
-/// A rotational transformation.
-pub const ROTATE: TransformKind = 1;
-
-/// A scale transformation.
-pub const SCALE: TransformKind = 2;