diff --git a/demo3/src/main.rs b/demo3/src/main.rs index ee32b7b2..22947578 100644 --- a/demo3/src/main.rs +++ b/demo3/src/main.rs @@ -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); } diff --git a/geometry/src/simd.rs b/geometry/src/simd.rs index c3d34084..d167028a 100644 --- a/geometry/src/simd.rs +++ b/geometry/src/simd.rs @@ -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)) } diff --git a/geometry/src/transform.rs b/geometry/src/transform.rs index c199b769..4b2d75fb 100644 --- a/geometry/src/transform.rs +++ b/geometry/src/transform.rs @@ -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 } } diff --git a/svg/src/lib.rs b/svg/src/lib.rs index af6736cf..cd74d148 100644 --- a/svg/src/lib.rs +++ b/svg/src/lib.rs @@ -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);