diff options
Diffstat (limited to 'components/script/dom/dommatrixreadonly.rs')
-rw-r--r-- | components/script/dom/dommatrixreadonly.rs | 212 |
1 files changed, 139 insertions, 73 deletions
diff --git a/components/script/dom/dommatrixreadonly.rs b/components/script/dom/dommatrixreadonly.rs index 4996cf428b2..a698ba81111 100644 --- a/components/script/dom/dommatrixreadonly.rs +++ b/components/script/dom/dommatrixreadonly.rs @@ -53,18 +53,12 @@ impl DOMMatrixReadOnly { // https://drafts.fxtf.org/geometry-1/#dom-dommatrixreadonly-dommatrixreadonly-numbersequence pub fn Constructor_(global: &GlobalScope, entries: Vec<f64>) -> Fallible<DomRoot<Self>> { - entries_to_matrix(&entries[..]) - .map(|(is2D, matrix)| { - Self::new(global, is2D, matrix) - }) + entries_to_matrix(&entries[..]).map(|(is2D, matrix)| Self::new(global, is2D, matrix)) } // https://drafts.fxtf.org/geometry-1/#dom-dommatrixreadonly-frommatrix pub fn FromMatrix(global: &GlobalScope, other: &DOMMatrixInit) -> Fallible<DomRoot<Self>> { - dommatrixinit_to_matrix(&other) - .map(|(is2D, matrix)| { - Self::new(global, is2D, matrix) - }) + dommatrixinit_to_matrix(&other).map(|(is2D, matrix)| Self::new(global, is2D, matrix)) } pub fn matrix(&self) -> Ref<Transform3D<f64>> { @@ -155,7 +149,6 @@ impl DOMMatrixReadOnly { self.matrix.borrow_mut().m44 = value; } - // https://drafts.fxtf.org/geometry-1/#dom-dommatrix-multiplyself pub fn multiply_self(&self, other: &DOMMatrixInit) -> Fallible<()> { // Step 1. @@ -200,8 +193,15 @@ impl DOMMatrixReadOnly { } // https://drafts.fxtf.org/geometry-1/#dom-dommatrix-scaleself - pub fn scale_self(&self, scaleX: f64, scaleY: Option<f64>, scaleZ: f64, - mut originX: f64, mut originY: f64, mut originZ: f64) { + pub fn scale_self( + &self, + scaleX: f64, + scaleY: Option<f64>, + scaleZ: f64, + mut originX: f64, + mut originY: f64, + mut originZ: f64, + ) { // Step 1. self.translate_self(originX, originY, originZ); // Step 2. @@ -262,19 +262,22 @@ impl DOMMatrixReadOnly { } if rotZ != 0.0 { // Step 5. - let rotation = Transform3D::create_rotation(0.0, 0.0, 1.0, Angle::radians(rotZ.to_radians())); + let rotation = + Transform3D::create_rotation(0.0, 0.0, 1.0, Angle::radians(rotZ.to_radians())); let mut matrix = self.matrix.borrow_mut(); *matrix = rotation.post_mul(&matrix); } if rotY != 0.0 { // Step 6. - let rotation = Transform3D::create_rotation(0.0, 1.0, 0.0, Angle::radians(rotY.to_radians())); + let rotation = + Transform3D::create_rotation(0.0, 1.0, 0.0, Angle::radians(rotY.to_radians())); let mut matrix = self.matrix.borrow_mut(); *matrix = rotation.post_mul(&matrix); } if rotX != 0.0 { // Step 7. - let rotation = Transform3D::create_rotation(1.0, 0.0, 0.0, Angle::radians(rotX.to_radians())); + let rotation = + Transform3D::create_rotation(1.0, 0.0, 0.0, Angle::radians(rotX.to_radians())); let mut matrix = self.matrix.borrow_mut(); *matrix = rotation.post_mul(&matrix); } @@ -298,7 +301,12 @@ impl DOMMatrixReadOnly { pub fn rotate_axis_angle_self(&self, x: f64, y: f64, z: f64, angle: f64) { // Step 1. let (norm_x, norm_y, norm_z) = normalize_point(x, y, z); - let rotation = Transform3D::create_rotation(norm_x, norm_y, norm_z, Angle::radians(angle.to_radians())); + let rotation = Transform3D::create_rotation( + norm_x, + norm_y, + norm_z, + Angle::radians(angle.to_radians()), + ); let mut matrix = self.matrix.borrow_mut(); *matrix = rotation.post_mul(&matrix); // Step 2. @@ -333,10 +341,24 @@ impl DOMMatrixReadOnly { *matrix = matrix.inverse().unwrap_or_else(|| { // Step 2. self.is2D.set(false); - Transform3D::row_major(f64::NAN, f64::NAN, f64::NAN, f64::NAN, - f64::NAN, f64::NAN, f64::NAN, f64::NAN, - f64::NAN, f64::NAN, f64::NAN, f64::NAN, - f64::NAN, f64::NAN, f64::NAN, f64::NAN) + Transform3D::row_major( + f64::NAN, + f64::NAN, + f64::NAN, + f64::NAN, + f64::NAN, + f64::NAN, + f64::NAN, + f64::NAN, + f64::NAN, + f64::NAN, + f64::NAN, + f64::NAN, + f64::NAN, + f64::NAN, + f64::NAN, + f64::NAN, + ) }) // Step 3 in DOMMatrix.InvertSelf } @@ -362,7 +384,6 @@ impl DOMMatrixReadOnly { } } - impl DOMMatrixReadOnlyMethods for DOMMatrixReadOnly { // https://drafts.fxtf.org/geometry-1/#dom-dommatrixreadonly-m11 fn M11(&self) -> f64 { @@ -482,10 +503,22 @@ impl DOMMatrixReadOnlyMethods for DOMMatrixReadOnly { // https://drafts.fxtf.org/geometry-1/#dom-dommatrixreadonly-isidentity fn IsIdentity(&self) -> bool { let matrix = self.matrix.borrow(); - matrix.m12 == 0.0 && matrix.m13 == 0.0 && matrix.m14 == 0.0 && matrix.m21 == 0.0 && - matrix.m23 == 0.0 && matrix.m24 == 0.0 && matrix.m31 == 0.0 && matrix.m32 == 0.0 && - matrix.m34 == 0.0 && matrix.m41 == 0.0 && matrix.m42 == 0.0 && matrix.m43 == 0.0 && - matrix.m11 == 1.0 && matrix.m22 == 1.0 && matrix.m33 == 1.0 && matrix.m44 == 1.0 + matrix.m12 == 0.0 && + matrix.m13 == 0.0 && + matrix.m14 == 0.0 && + matrix.m21 == 0.0 && + matrix.m23 == 0.0 && + matrix.m24 == 0.0 && + matrix.m31 == 0.0 && + matrix.m32 == 0.0 && + matrix.m34 == 0.0 && + matrix.m41 == 0.0 && + matrix.m42 == 0.0 && + matrix.m43 == 0.0 && + matrix.m11 == 1.0 && + matrix.m22 == 1.0 && + matrix.m33 == 1.0 && + matrix.m44 == 1.0 } // https://drafts.fxtf.org/geometry-1/#dom-dommatrixreadonly-translate @@ -494,16 +527,22 @@ impl DOMMatrixReadOnlyMethods for DOMMatrixReadOnly { } // https://drafts.fxtf.org/geometry-1/#dom-dommatrixreadonly-scale - fn Scale(&self, scaleX: f64, scaleY: Option<f64>, scaleZ: f64, - originX: f64, originY: f64, originZ: f64) -> DomRoot<DOMMatrix> { + fn Scale( + &self, + scaleX: f64, + scaleY: Option<f64>, + scaleZ: f64, + originX: f64, + originY: f64, + originZ: f64, + ) -> DomRoot<DOMMatrix> { DOMMatrix::from_readonly(&self.global(), self) .ScaleSelf(scaleX, scaleY, scaleZ, originX, originY, originZ) } // https://drafts.fxtf.org/geometry-1/#dom-dommatrixreadonly-scale3d fn Scale3d(&self, scale: f64, originX: f64, originY: f64, originZ: f64) -> DomRoot<DOMMatrix> { - DOMMatrix::from_readonly(&self.global(), self) - .Scale3dSelf(scale, originX, originY, originZ) + DOMMatrix::from_readonly(&self.global(), self).Scale3dSelf(scale, originX, originY, originZ) } // https://drafts.fxtf.org/geometry-1/#dom-dommatrixreadonly-rotate @@ -539,10 +578,9 @@ impl DOMMatrixReadOnlyMethods for DOMMatrixReadOnly { // https://drafts.fxtf.org/geometry-1/#dom-dommatrixreadonly-flipx fn FlipX(&self) -> DomRoot<DOMMatrix> { let is2D = self.is2D.get(); - let flip = Transform3D::row_major(-1.0, 0.0, 0.0, 0.0, - 0.0, 1.0, 0.0, 0.0, - 0.0, 0.0, 1.0, 0.0, - 0.0, 0.0, 0.0, 1.0); + let flip = Transform3D::row_major( + -1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, + ); let matrix = flip.post_mul(&self.matrix.borrow()); DOMMatrix::new(&self.global(), is2D, matrix) } @@ -550,10 +588,9 @@ impl DOMMatrixReadOnlyMethods for DOMMatrixReadOnly { // https://drafts.fxtf.org/geometry-1/#dom-dommatrixreadonly-flipy fn FlipY(&self) -> DomRoot<DOMMatrix> { let is2D = self.is2D.get(); - let flip = Transform3D::row_major(1.0, 0.0, 0.0, 0.0, - 0.0, -1.0, 0.0, 0.0, - 0.0, 0.0, 1.0, 0.0, - 0.0, 0.0, 0.0, 1.0); + let flip = Transform3D::row_major( + 1.0, 0.0, 0.0, 0.0, 0.0, -1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, + ); let matrix = flip.post_mul(&self.matrix.borrow()); DOMMatrix::new(&self.global(), is2D, matrix) } @@ -583,11 +620,15 @@ impl DOMMatrixReadOnlyMethods for DOMMatrixReadOnly { // https://drafts.fxtf.org/geometry-1/#dom-dommatrixreadonly-tofloat32array #[allow(unsafe_code)] unsafe fn ToFloat32Array(&self, cx: *mut JSContext) -> NonNull<JSObject> { - let vec: Vec<f32> = self.matrix - .borrow().to_row_major_array().iter().map(|&x| x as f32).collect(); + let vec: Vec<f32> = self + .matrix + .borrow() + .to_row_major_array() + .iter() + .map(|&x| x as f32) + .collect(); rooted!(in (cx) let mut array = ptr::null_mut::<JSObject>()); - let _ = Float32Array::create(cx, CreateWith::Slice(&vec), array.handle_mut()) - .unwrap(); + let _ = Float32Array::create(cx, CreateWith::Slice(&vec), array.handle_mut()).unwrap(); NonNull::new_unchecked(array.get()) } @@ -596,28 +637,39 @@ impl DOMMatrixReadOnlyMethods for DOMMatrixReadOnly { unsafe fn ToFloat64Array(&self, cx: *mut JSContext) -> NonNull<JSObject> { let arr = self.matrix.borrow().to_row_major_array(); rooted!(in (cx) let mut array = ptr::null_mut::<JSObject>()); - let _ = Float64Array::create(cx, CreateWith::Slice(&arr), array.handle_mut()) - .unwrap(); + let _ = Float64Array::create(cx, CreateWith::Slice(&arr), array.handle_mut()).unwrap(); NonNull::new_unchecked(array.get()) } } - // https://drafts.fxtf.org/geometry-1/#create-a-2d-matrix fn create_2d_matrix(entries: &[f64]) -> Transform3D<f64> { - Transform3D::row_major(entries[0], entries[1], 0.0, 0.0, - entries[2], entries[3], 0.0, 0.0, - 0.0, 0.0, 1.0, 0.0, - entries[4], entries[5], 0.0, 1.0) + Transform3D::row_major( + entries[0], entries[1], 0.0, 0.0, entries[2], entries[3], 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, + entries[4], entries[5], 0.0, 1.0, + ) } - // https://drafts.fxtf.org/geometry-1/#create-a-3d-matrix fn create_3d_matrix(entries: &[f64]) -> Transform3D<f64> { - Transform3D::row_major(entries[0], entries[1], entries[2], entries[3], - entries[4], entries[5], entries[6], entries[7], - entries[8], entries[9], entries[10], entries[11], - entries[12], entries[13], entries[14], entries[15]) + Transform3D::row_major( + entries[0], + entries[1], + entries[2], + entries[3], + entries[4], + entries[5], + entries[6], + entries[7], + entries[8], + entries[9], + entries[10], + entries[11], + entries[12], + entries[13], + entries[14], + entries[15], + ) } // https://drafts.fxtf.org/geometry-1/#dom-dommatrixreadonly-dommatrixreadonly-numbersequence @@ -632,21 +684,29 @@ pub fn entries_to_matrix(entries: &[f64]) -> Fallible<(bool, Transform3D<f64>)> } } - // https://drafts.fxtf.org/geometry-1/#validate-and-fixup pub fn dommatrixinit_to_matrix(dict: &DOMMatrixInit) -> Fallible<(bool, Transform3D<f64>)> { // Step 1. if dict.a.is_some() && dict.m11.is_some() && dict.a.unwrap() != dict.m11.unwrap() || - dict.b.is_some() && dict.m12.is_some() && dict.b.unwrap() != dict.m12.unwrap() || - dict.c.is_some() && dict.m21.is_some() && dict.c.unwrap() != dict.m21.unwrap() || - dict.d.is_some() && dict.m22.is_some() && dict.d.unwrap() != dict.m22.unwrap() || - dict.e.is_some() && dict.m41.is_some() && dict.e.unwrap() != dict.m41.unwrap() || - dict.f.is_some() && dict.m42.is_some() && dict.f.unwrap() != dict.m42.unwrap() || - dict.is2D.is_some() && dict.is2D.unwrap() && - (dict.m31 != 0.0 || dict.m32 != 0.0 || dict.m13 != 0.0 || dict.m23 != 0.0 || - dict.m43 != 0.0 || dict.m14 != 0.0 || dict.m24 != 0.0 || dict.m34 != 0.0 || - dict.m33 != 1.0 || dict.m44 != 1.0) { - Err(error::Error::Type("Invalid matrix initializer.".to_owned())) + dict.b.is_some() && dict.m12.is_some() && dict.b.unwrap() != dict.m12.unwrap() || + dict.c.is_some() && dict.m21.is_some() && dict.c.unwrap() != dict.m21.unwrap() || + dict.d.is_some() && dict.m22.is_some() && dict.d.unwrap() != dict.m22.unwrap() || + dict.e.is_some() && dict.m41.is_some() && dict.e.unwrap() != dict.m41.unwrap() || + dict.f.is_some() && dict.m42.is_some() && dict.f.unwrap() != dict.m42.unwrap() || + dict.is2D.is_some() && + dict.is2D.unwrap() && + (dict.m31 != 0.0 || + dict.m32 != 0.0 || + dict.m13 != 0.0 || + dict.m23 != 0.0 || + dict.m43 != 0.0 || + dict.m14 != 0.0 || + dict.m24 != 0.0 || + dict.m34 != 0.0 || + dict.m33 != 1.0 || + dict.m44 != 1.0) + { + Err(error::Error::Type("Invalid matrix initializer.".to_owned())) } else { let mut is2D = dict.is2D; // Step 2. @@ -663,25 +723,31 @@ pub fn dommatrixinit_to_matrix(dict: &DOMMatrixInit) -> Fallible<(bool, Transfor let m42 = dict.m42.unwrap_or(dict.f.unwrap_or(0.0)); // Step 8. if is2D.is_none() && - (dict.m31 != 0.0 || dict.m32 != 0.0 || dict.m13 != 0.0 || - dict.m23 != 0.0 || dict.m43 != 0.0 || dict.m14 != 0.0 || - dict.m24 != 0.0 || dict.m34 != 0.0 || - dict.m33 != 1.0 || dict.m44 != 1.0) { - is2D = Some(false); + (dict.m31 != 0.0 || + dict.m32 != 0.0 || + dict.m13 != 0.0 || + dict.m23 != 0.0 || + dict.m43 != 0.0 || + dict.m14 != 0.0 || + dict.m24 != 0.0 || + dict.m34 != 0.0 || + dict.m33 != 1.0 || + dict.m44 != 1.0) + { + is2D = Some(false); } // Step 9. if is2D.is_none() { is2D = Some(true); } - let matrix = Transform3D::row_major(m11, m12, dict.m13, dict.m14, - m21, m22, dict.m23, dict.m24, - dict.m31, dict.m32, dict.m33, dict.m34, - m41, m42, dict.m43, dict.m44); + let matrix = Transform3D::row_major( + m11, m12, dict.m13, dict.m14, m21, m22, dict.m23, dict.m24, dict.m31, dict.m32, + dict.m33, dict.m34, m41, m42, dict.m43, dict.m44, + ); Ok((is2D.unwrap(), matrix)) } } - #[inline] fn normalize_point(x: f64, y: f64, z: f64) -> (f64, f64, f64) { let len = (x * x + y * y + z * z).sqrt(); |