According to the spec, if one of the matrices for transform interpolation is
non-invertible, the used animation function must fall-back to a discrete
animation. However, in the current implementation, we always use an identity
matrix as a fallback for the non-invertible matrix.
Decompose2DMatrix and Decompose3DMatrix both return a boolean, but we just
never use it. So, in this patch, we use the returned boolean from the matrix
decomposition as a condition, and do the fallback discrete procedure for the
non-invertible matrices case.
MozReview-Commit-ID: E7i1a1MJOXN
The unit of nsCSSValue is always number/pixel/percent or eCSSUnit_Calc,
so we don't need the style context for Servo backend.
Besides, ReadTransform is a public API used in many places, so we keep
its argument type as nsStyleContext.
MozReview-Commit-ID: KLdrJ5BJXg8
Use Servo backend to decompose/interpolate/recompose matrices on both
main thread and compositor thread.
Note: Due there may be differences in precision used to represent the
components, and the computation of matrix interpolation are not
exactly same (still following the formulas in spec). There are some
tiny differences between the interpolation results of 2d/3d
matrices on Gecko and Servo, especially if there is skew() or any 3d
transform function.
MozReview-Commit-ID: 6T8vlR4MJGr
We create interpolatematrix and accumulatematrix from Servo side
not on the main thread, so we cannot use nsCSSValueList_heap (which is not
thread safe so we cannot create it and destroy it on different threads).
Therefore, we use nsCSSValueSharedList to represent the cloned lists in
interpolatematrix and accumulatematrix.
MozReview-Commit-ID: L5WBKHwsrUz
This change is to use gecko_enum_prefix in helpers.mako.rs, so that we do not
need to manually write code for nsStyleDisplay::mTransformBox.
MozReview-Commit-ID: 7UAL0iUcSIO
Move the common part of GetScaleValue into nsStyleTransformMatrix, and add a
new method, GetScaleValue, on AnimationValue, which can get the scale value from
StyleAnimationValue or RawServoAnimationValue.
MozReview-Commit-ID: 4spi1LkZrWP
To avoid exposing the template ProcessInterpolateMatrix is left because it is
used in AddTransformFunctions in nsDisplayList.cpp.
MozReview-Commit-ID: D9KW7du5j04
Decompose the 2d/3d matrix and calculate the Euclidean distance of
translate, scale, skew, quaternion, and perspective vectors.
MozReview-Commit-ID: 5nX9EeqvZi9
Move Decompose2DMatrix and Decompose3DMatrix into nsStyleTransformMatrix
and remove some trailing spaces.
Both AddWeighted and ComputeDistance need Decompose2DMatrix and
Decompose3DMatrix on transform property, and both decomposition functions are
related to nsStyleTransformMatrix, so we move them into nsStyleTransformMatrix
to make StyleAnimationValue more concise.
MozReview-Commit-ID: 5aVK7971rDD
Reuse AddTransformLists to get the identity transform functions to
replace none, and then treat them with another transform list as two matched
ones.
MozReview-Commit-ID: HwdBPCiUivg
This patch also moves the static methods defined on nsStyleAnimation so that
they are part of StyleAnimationValue class.
Renaming nsStyleAnimation.h to StyleAnimationValue.h is performed in a separate
patch to simplify the diff (since some tools may not handle file renames
elegantly).