Fix transforms

This commit is contained in:
Patrick Walton 2019-01-17 14:16:29 -08:00
parent b3681684a6
commit d98b244bda
4 changed files with 28 additions and 7 deletions

View File

@ -111,7 +111,7 @@ fn main() {
let built_scene = build_scene(&scene, &options);
unsafe {
gl::ClearColor(1.0, 1.0, 1.0, 1.0);
gl::ClearColor(0.7, 0.7, 0.7, 1.0);
gl::Clear(gl::COLOR_BUFFER_BIT);
renderer.render_scene(&built_scene);
}

View File

@ -403,6 +403,11 @@ mod x86 {
unsafe { F32x4(x86_64::_mm_shuffle_ps(self.0, self.0, 0b0100_0100)) }
}
#[inline]
pub fn xwxw(self) -> F32x4 {
unsafe { F32x4(x86_64::_mm_shuffle_ps(self.0, self.0, 0b1100_1100)) }
}
#[inline]
pub fn xyyx(self) -> F32x4 {
unsafe { F32x4(x86_64::_mm_shuffle_ps(self.0, self.0, 0b0001_0100)) }
@ -413,11 +418,26 @@ mod x86 {
unsafe { F32x4(x86_64::_mm_shuffle_ps(self.0, self.0, 0b1000_1000)) }
}
#[inline]
pub fn xzyw(self) -> F32x4 {
unsafe { F32x4(x86_64::_mm_shuffle_ps(self.0, self.0, 0b1101_1000)) }
}
#[inline]
pub fn yxwz(self) -> F32x4 {
unsafe { F32x4(x86_64::_mm_shuffle_ps(self.0, self.0, 0b1011_0001)) }
}
#[inline]
pub fn ywyw(self) -> F32x4 {
unsafe { F32x4(x86_64::_mm_shuffle_ps(self.0, self.0, 0b1101_1101)) }
}
#[inline]
pub fn zyzy(self) -> F32x4 {
unsafe { F32x4(x86_64::_mm_shuffle_ps(self.0, self.0, 0b0110_0110)) }
}
#[inline]
pub fn zzww(self) -> F32x4 {
unsafe { F32x4(x86_64::_mm_shuffle_ps(self.0, self.0, 0b1111_1010)) }

View File

@ -17,7 +17,7 @@ use euclid::{Point2D, Rect, Size2D, Transform2D};
use lyon_path::PathEvent;
/// An affine transform, optimized with SIMD.
#[derive(Clone, Copy)]
#[derive(Clone, Copy, Debug)]
pub struct Transform2DF32 {
// Row-major order.
matrix: F32x4,
@ -68,8 +68,8 @@ impl Transform2DF32 {
#[inline]
pub fn transform_point(&self, point: &Point2DF32) -> Point2DF32 {
let x11x12y21y22 = point.0.xxyy() * self.matrix;
Point2DF32(x11x12y21y22 + x11x12y21y22.zwzw() + self.vector.0)
let bxbzbybw = point.0.xxyy() * self.matrix.xzyw();
Point2DF32(bxbzbybw + bxbzbybw.zwzw() + self.vector.0)
}
// TODO(pcwalton): SIMD.
@ -89,10 +89,10 @@ impl Transform2DF32 {
#[inline]
pub fn post_mul(&self, other: &Transform2DF32) -> Transform2DF32 {
let lhs = self.matrix.xzxz() * other.matrix.xxyy();
let rhs = self.matrix.ywyw() * other.matrix.zzww();
let lhs = self.matrix.xwxw() * other.matrix;
let rhs = self.matrix.zyzy() * other.matrix.yxwz();
let matrix = lhs + rhs;
let vector = other.transform_point(&self.vector) + other.vector;
let vector = other.transform_point(&self.vector);
Transform2DF32 { matrix, vector }
}

View File

@ -42,6 +42,7 @@ impl SceneExt for Scene {
let root = &tree.root();
match *root.borrow() {
NodeKind::Svg(ref svg) => {
println!("view_box={:?}", svg.view_box);
scene.view_box = usvg_rect_to_euclid_rect(&svg.view_box.rect);
for kid in root.children() {
process_node(&mut scene, &kid, &global_transform);