Allow overloaded `*` to work between transforms and line segments and
transforms and rects
This commit is contained in:
parent
437eda96da
commit
e9c3fe6f31
|
@ -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,
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue