diff options
| author | Laurenz <laurmaedje@gmail.com> | 2022-10-18 00:02:38 +0200 |
|---|---|---|
| committer | Laurenz <laurmaedje@gmail.com> | 2022-10-18 00:04:12 +0200 |
| commit | c0e972b91a7bf8d22cd24a38fc92a9c6214c8a0c (patch) | |
| tree | 19362eb993f15ef1b9bceeac821852bb6edfe955 /src/library/graphics/transform.rs | |
| parent | e21822665591dc19766275da1e185215a6b945ef (diff) | |
Reduce dependencies from compiler on library
Diffstat (limited to 'src/library/graphics/transform.rs')
| -rw-r--r-- | src/library/graphics/transform.rs | 118 |
1 files changed, 0 insertions, 118 deletions
diff --git a/src/library/graphics/transform.rs b/src/library/graphics/transform.rs deleted file mode 100644 index b110f343..00000000 --- a/src/library/graphics/transform.rs +++ /dev/null @@ -1,118 +0,0 @@ -use crate::geom::Transform; -use crate::library::prelude::*; - -/// Move a node without affecting layout. -#[derive(Debug, Hash)] -pub struct MoveNode { - /// The offset by which to move the node. - pub delta: Spec<Relative<RawLength>>, - /// The node whose contents should be moved. - pub child: LayoutNode, -} - -#[node] -impl MoveNode { - fn construct(_: &mut Vm, args: &mut Args) -> SourceResult<Content> { - let dx = args.named("dx")?.unwrap_or_default(); - let dy = args.named("dy")?.unwrap_or_default(); - Ok(Content::inline(Self { - delta: Spec::new(dx, dy), - child: args.expect("body")?, - })) - } -} - -impl Layout for MoveNode { - fn layout( - &self, - world: Tracked<dyn World>, - regions: &Regions, - styles: StyleChain, - ) -> SourceResult<Vec<Frame>> { - let mut frames = self.child.layout(world, regions, styles)?; - - let delta = self.delta.resolve(styles); - for frame in &mut frames { - let delta = delta.zip(frame.size()).map(|(d, s)| d.relative_to(s)); - frame.translate(delta.to_point()); - } - - Ok(frames) - } -} - -/// 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, -} - -/// Rotate a node without affecting layout. -pub type RotateNode = TransformNode<ROTATE>; - -/// Scale a node without affecting layout. -pub type ScaleNode = TransformNode<SCALE>; - -#[node] -impl<const T: TransformKind> TransformNode<T> { - /// The origin of the transformation. - #[property(resolve)] - pub const ORIGIN: Spec<Option<RawAlign>> = Spec::default(); - - fn construct(_: &mut Vm, args: &mut Args) -> SourceResult<Content> { - let transform = match T { - ROTATE => { - let angle = args.named_or_find("angle")?.unwrap_or_default(); - Transform::rotate(angle) - } - SCALE | _ => { - let all = args.find()?; - let sx = args.named("x")?.or(all).unwrap_or(Ratio::one()); - let sy = args.named("y")?.or(all).unwrap_or(Ratio::one()); - Transform::scale(sx, sy) - } - }; - - Ok(Content::inline(Self { - transform, - child: args.expect("body")?, - })) - } -} - -impl<const T: TransformKind> Layout for TransformNode<T> { - fn layout( - &self, - world: Tracked<dyn World>, - regions: &Regions, - styles: StyleChain, - ) -> SourceResult<Vec<Frame>> { - let origin = styles.get(Self::ORIGIN).unwrap_or(Align::CENTER_HORIZON); - let mut frames = self.child.layout(world, regions, styles)?; - - for frame in &mut frames { - let Spec { x, y } = origin.zip(frame.size()).map(|(o, s)| o.position(s)); - let transform = Transform::translate(x, y) - .pre_concat(self.transform) - .pre_concat(Transform::translate(-x, -y)); - - frame.transform(transform); - } - - Ok(frames) - } -} - -/// Kinds of transformations. -/// -/// The move transformation is handled separately. -pub type TransformKind = usize; - -/// A rotational transformation. -const ROTATE: TransformKind = 1; - -/// A scale transformation. -const SCALE: TransformKind = 2; |
