From e9c3fe6f316e5a8a5b6503a97d9a65cb33f31ed4 Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Fri, 12 Jul 2019 11:59:04 -0700 Subject: [PATCH] Allow overloaded `*` to work between transforms and line segments and transforms and rects --- content/src/segment.rs | 4 ++-- geometry/src/transform2d.rs | 34 ++++++++++++++++++++-------------- geometry/src/transform3d.rs | 21 ++++++++++++--------- 3 files changed, 34 insertions(+), 25 deletions(-) diff --git a/content/src/segment.rs b/content/src/segment.rs index 1bba908d..8b0d101e 100644 --- a/content/src/segment.rs +++ b/content/src/segment.rs @@ -217,8 +217,8 @@ impl Segment { #[inline] pub fn transform(self, transform: &Transform2F) -> Segment { Segment { - baseline: transform.transform_line_segment(self.baseline), - ctrl: transform.transform_line_segment(self.ctrl), + baseline: *transform * self.baseline, + ctrl: *transform * self.ctrl, kind: self.kind, flags: self.flags, } diff --git a/geometry/src/transform2d.rs b/geometry/src/transform2d.rs index 55807bd0..5979ee21 100644 --- a/geometry/src/transform2d.rs +++ b/geometry/src/transform2d.rs @@ -182,20 +182,6 @@ impl Transform2F { } } - #[inline] - pub fn transform_line_segment(&self, line_segment: LineSegment2F) -> LineSegment2F { - LineSegment2F::new(*self * line_segment.from(), *self * line_segment.to()) - } - - #[inline] - pub fn transform_rect(&self, rect: &RectF) -> RectF { - let (upper_left, upper_right) = (*self * rect.origin(), *self * rect.upper_right()); - let (lower_left, lower_right) = (*self * rect.lower_left(), *self * rect.lower_right()); - let min_point = upper_left.min(upper_right).min(lower_left).min(lower_right); - let max_point = upper_left.max(upper_right).max(lower_left).max(lower_right); - RectF::from_points(min_point, max_point) - } - // TODO(pcwalton): Optimize better with SIMD. #[inline] pub fn to_3d(&self) -> Transform4F { @@ -305,6 +291,26 @@ impl Mul for Transform2F { } } +impl Mul for Transform2F { + type Output = LineSegment2F; + #[inline] + fn mul(self, line_segment: LineSegment2F) -> LineSegment2F { + LineSegment2F::new(self * line_segment.from(), self * line_segment.to()) + } +} + +impl Mul for Transform2F { + type Output = RectF; + #[inline] + fn mul(self, rect: RectF) -> RectF { + let (upper_left, upper_right) = (self * rect.origin(), self * rect.upper_right()); + let (lower_left, lower_right) = (self * rect.lower_left(), self * rect.lower_right()); + let min_point = upper_left.min(upper_right).min(lower_left).min(lower_right); + let max_point = upper_left.max(upper_right).max(lower_left).max(lower_right); + RectF::from_points(min_point, max_point) + } +} + impl MulAssign for Transform2F { #[inline] fn mul_assign(&mut self, other: Transform2F) { diff --git a/geometry/src/transform3d.rs b/geometry/src/transform3d.rs index 7630ea3b..c35e5473 100644 --- a/geometry/src/transform3d.rs +++ b/geometry/src/transform3d.rs @@ -370,15 +370,6 @@ impl Perspective { window_size, } } - - #[inline] - pub fn transform_rect(&self, rect: RectF) -> RectF { - let (upper_left, upper_right) = (*self * rect.origin(), *self * rect.upper_right()); - let (lower_left, lower_right) = (*self * rect.lower_left(), *self * rect.lower_right()); - let min_point = upper_left.min(upper_right).min(lower_left).min(lower_right); - let max_point = upper_left.max(upper_right).max(lower_left).max(lower_right); - RectF::from_points(min_point, max_point) - } } impl Mul for Perspective { @@ -402,6 +393,18 @@ impl Mul for Perspective { } } +impl Mul for Perspective { + type Output = RectF; + #[inline] + fn mul(self, rect: RectF) -> RectF { + let (upper_left, upper_right) = (self * rect.origin(), self * rect.upper_right()); + let (lower_left, lower_right) = (self * rect.lower_left(), self * rect.lower_right()); + let min_point = upper_left.min(upper_right).min(lower_left).min(lower_right); + let max_point = upper_left.max(upper_right).max(lower_left).max(lower_right); + RectF::from_points(min_point, max_point) + } +} + #[cfg(test)] mod test { use crate::vector::Vector4F;