// pathfinder/content/src/transform.rs // // Copyright © 2019 The Pathfinder Project Developers. // // Licensed under the Apache License, Version 2.0 or the MIT license // , at your // option. This file may not be copied, modified, or distributed // except according to those terms. //! Utilities for transforming paths. #![allow(deprecated)] use crate::segment::Segment; use pathfinder_geometry::transform2d::Transform2F; use pathfinder_geometry::transform3d::Perspective; /// Transforms a path with a SIMD 2D transform. pub struct Transform2FPathIter where I: Iterator, { iter: I, transform: Transform2F, } impl Iterator for Transform2FPathIter where I: Iterator, { type Item = Segment; #[inline] fn next(&mut self) -> Option { // TODO(pcwalton): Can we go faster by transforming an entire line segment with SIMD? let mut segment = self.iter.next()?; if !segment.is_none() { segment.baseline.set_from(self.transform * segment.baseline.from()); segment.baseline.set_to(self.transform * segment.baseline.to()); if !segment.is_line() { segment.ctrl.set_from(self.transform * segment.ctrl.from()); if !segment.is_quadratic() { segment.ctrl.set_to(self.transform * segment.ctrl.to()); } } } Some(segment) } } impl Transform2FPathIter where I: Iterator, { /// Creates a new `Transform2FPathIter` ready to transform the given path. #[inline] pub fn new(iter: I, transform: &Transform2F) -> Transform2FPathIter { Transform2FPathIter { iter, transform: *transform, } } } /// Transforms a path with a perspective projection. #[deprecated] pub struct PerspectivePathIter where I: Iterator, { iter: I, perspective: Perspective, } impl Iterator for PerspectivePathIter where I: Iterator, { type Item = Segment; #[inline] fn next(&mut self) -> Option { let mut segment = self.iter.next()?; if !segment.is_none() { segment.baseline.set_from(self.perspective * segment.baseline.from()); segment.baseline.set_to(self.perspective * segment.baseline.to()); if !segment.is_line() { segment.ctrl.set_from(self.perspective * segment.ctrl.from()); if !segment.is_quadratic() { segment.ctrl.set_to(self.perspective * segment.ctrl.to()); } } } Some(segment) } } impl PerspectivePathIter where I: Iterator, { /// Creates a new `PerspectivePathIter` ready to apply perspective to the given path. #[inline] #[deprecated] pub fn new(iter: I, perspective: &Perspective) -> PerspectivePathIter { PerspectivePathIter { iter, perspective: *perspective, } } }