Bug 1381196 - stylo: fix Y scale computation while decomposing a 3D matrix. draft
authorJeremy Chen <jeremychen@mozilla.com>
Wed, 19 Jul 2017 17:02:46 +0800
changeset 611251 9d5f2d261f2b9e99c21f889c5740ac91d9faa001
parent 610973 1b065ffd8a535a0ad4c39a912af18e948e6a42c1
child 638094 8ffd162f983da6cdd6118fe6d433293ceea68c8d
push id69148
push userbmo:jeremychen@mozilla.com
push dateWed, 19 Jul 2017 09:32:55 +0000
bugs1381196
milestone56.0a1
Bug 1381196 - stylo: fix Y scale computation while decomposing a 3D matrix. While decomposing a 3D matrix, we should normalize the 2nd row right after the Y scale computation. However, we accidentally use the length of the 1st row to do the normalization. This causes the wrong Scale3D function while decomposing, and then leads to the wrong decomposed 3D matrix. Here, we correct it by using the right value (the length of the 2nd row). MozReview-Commit-ID: 8zGw2YFv1AE
servo/components/style/properties/helpers/animated_properties.mako.rs
--- a/servo/components/style/properties/helpers/animated_properties.mako.rs
+++ b/servo/components/style/properties/helpers/animated_properties.mako.rs
@@ -2105,17 +2105,17 @@ fn decompose_3d_matrix(mut matrix: Compu
     let mut scale = Scale3D(row0len, 0.0, 0.0);
     row[0] = [row[0][0] / row0len, row[0][1] / row0len, row[0][2] / row0len];
 
     // Compute XY shear factor and make 2nd row orthogonal to 1st.
     let mut skew = Skew(dot(row[0], row[1]), 0.0, 0.0);
     row[1] = combine(row[1], row[0], 1.0, -skew.0);
 
     // Now, compute Y scale and normalize 2nd row.
-    let row1len = (row[0][0] * row[0][0] + row[0][1] * row[0][1] + row[0][2] * row[0][2]).sqrt();
+    let row1len = (row[1][0] * row[1][0] + row[1][1] * row[1][1] + row[1][2] * row[1][2]).sqrt();
     scale.1 = row1len;
     row[1] = [row[1][0] / row1len, row[1][1] / row1len, row[1][2] / row1len];
     skew.0 /= scale.1;
 
     // Compute XZ and YZ shears, orthogonalize 3rd row
     skew.1 = dot(row[0], row[2]);
     row[2] = combine(row[2], row[0], 1.0, -skew.1);
     skew.2 = dot(row[1], row[2]);