Allow overloaded `*` to work between transforms and line segments and

transforms and rects
This commit is contained in:
Patrick Walton 2019-07-12 11:59:04 -07:00
parent 437eda96da
commit e9c3fe6f31
3 changed files with 34 additions and 25 deletions

View File

@ -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,
}

View File

@ -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<Vector2F> for Transform2F {
}
}
impl Mul<LineSegment2F> 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<RectF> 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) {

View File

@ -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<Transform4F> for Perspective {
@ -402,6 +393,18 @@ impl Mul<Vector2F> for Perspective {
}
}
impl Mul<RectF> 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;