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]
|
#[inline]
|
||||||
pub fn transform(self, transform: &Transform2F) -> Segment {
|
pub fn transform(self, transform: &Transform2F) -> Segment {
|
||||||
Segment {
|
Segment {
|
||||||
baseline: transform.transform_line_segment(self.baseline),
|
baseline: *transform * self.baseline,
|
||||||
ctrl: transform.transform_line_segment(self.ctrl),
|
ctrl: *transform * self.ctrl,
|
||||||
kind: self.kind,
|
kind: self.kind,
|
||||||
flags: self.flags,
|
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.
|
// TODO(pcwalton): Optimize better with SIMD.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn to_3d(&self) -> Transform4F {
|
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 {
|
impl MulAssign for Transform2F {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn mul_assign(&mut self, other: Transform2F) {
|
fn mul_assign(&mut self, other: Transform2F) {
|
||||||
|
|
|
@ -370,15 +370,6 @@ impl Perspective {
|
||||||
window_size,
|
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 {
|
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)]
|
#[cfg(test)]
|
||||||
mod test {
|
mod test {
|
||||||
use crate::vector::Vector4F;
|
use crate::vector::Vector4F;
|
||||||
|
|
Loading…
Reference in New Issue