зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1551991 - Remove legacy transform interpolation code and related dead code. r=boris
Differential Revision: https://phabricator.services.mozilla.com/D31314 --HG-- extra : moz-landing-system : lando
This commit is contained in:
Родитель
835de4b08d
Коммит
3cf1978b6b
|
@ -9,11 +9,9 @@
|
|||
*/
|
||||
|
||||
#include "nsStyleTransformMatrix.h"
|
||||
#include "nsCSSValue.h"
|
||||
#include "nsLayoutUtils.h"
|
||||
#include "nsPresContext.h"
|
||||
#include "nsSVGUtils.h"
|
||||
#include "nsCSSKeywords.h"
|
||||
#include "mozilla/ServoBindings.h"
|
||||
#include "mozilla/StyleAnimationValue.h"
|
||||
#include "gfxMatrix.h"
|
||||
|
@ -278,98 +276,6 @@ class Interpolate {
|
|||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Calculate 2 matrices by decomposing them with Operator.
|
||||
*
|
||||
* @param aMatrix1 First matrix, using CSS pixel units.
|
||||
* @param aMatrix2 Second matrix, using CSS pixel units.
|
||||
* @param aProgress Coefficient for the Operator.
|
||||
*/
|
||||
template <typename Operator>
|
||||
static Matrix4x4 OperateTransformMatrix(const Matrix4x4& aMatrix1,
|
||||
const Matrix4x4& aMatrix2,
|
||||
double aProgress) {
|
||||
// Decompose both matrices
|
||||
|
||||
Point3D scale1(1, 1, 1), translate1;
|
||||
Point4D perspective1(0, 0, 0, 1);
|
||||
gfxQuaternion rotate1;
|
||||
nsStyleTransformMatrix::ShearArray shear1{0.0f, 0.0f, 0.0f};
|
||||
|
||||
Point3D scale2(1, 1, 1), translate2;
|
||||
Point4D perspective2(0, 0, 0, 1);
|
||||
gfxQuaternion rotate2;
|
||||
nsStyleTransformMatrix::ShearArray shear2{0.0f, 0.0f, 0.0f};
|
||||
|
||||
// Check if both matrices are decomposable.
|
||||
bool wasDecomposed;
|
||||
Matrix matrix2d1, matrix2d2;
|
||||
if (aMatrix1.Is2D(&matrix2d1) && aMatrix2.Is2D(&matrix2d2)) {
|
||||
wasDecomposed =
|
||||
Decompose2DMatrix(matrix2d1, scale1, shear1, rotate1, translate1) &&
|
||||
Decompose2DMatrix(matrix2d2, scale2, shear2, rotate2, translate2);
|
||||
} else {
|
||||
wasDecomposed = Decompose3DMatrix(aMatrix1, scale1, shear1, rotate1,
|
||||
translate1, perspective1) &&
|
||||
Decompose3DMatrix(aMatrix2, scale2, shear2, rotate2,
|
||||
translate2, perspective2);
|
||||
}
|
||||
|
||||
// Fallback to discrete operation if one of the matrices is not decomposable.
|
||||
if (!wasDecomposed) {
|
||||
return Operator::operateForFallback(aMatrix1, aMatrix2, aProgress);
|
||||
}
|
||||
|
||||
Matrix4x4 result;
|
||||
|
||||
// Operate each of the pieces in response to |Operator|.
|
||||
Point4D perspective =
|
||||
Operator::operateForPerspective(perspective1, perspective2, aProgress);
|
||||
result.SetTransposedVector(3, perspective);
|
||||
|
||||
Point3D translate = Operator::operate(translate1, translate2, aProgress);
|
||||
result.PreTranslate(translate.x, translate.y, translate.z);
|
||||
|
||||
Matrix4x4 rotate = Operator::operateForRotate(rotate1, rotate2, aProgress);
|
||||
if (!rotate.IsIdentity()) {
|
||||
result = rotate * result;
|
||||
}
|
||||
|
||||
// TODO: Would it be better to operate these as angles?
|
||||
// How do we convert back to angles?
|
||||
float yzshear = Operator::operate(shear1[ShearType::YZ],
|
||||
shear2[ShearType::YZ], aProgress);
|
||||
if (yzshear != 0.0) {
|
||||
result.SkewYZ(yzshear);
|
||||
}
|
||||
|
||||
float xzshear = Operator::operate(shear1[ShearType::XZ],
|
||||
shear2[ShearType::XZ], aProgress);
|
||||
if (xzshear != 0.0) {
|
||||
result.SkewXZ(xzshear);
|
||||
}
|
||||
|
||||
float xyshear = Operator::operate(shear1[ShearType::XY],
|
||||
shear2[ShearType::XY], aProgress);
|
||||
if (xyshear != 0.0) {
|
||||
result.SkewXY(xyshear);
|
||||
}
|
||||
|
||||
Point3D scale = Operator::operateForScale(scale1, scale2, aProgress);
|
||||
if (scale != Point3D(1.0, 1.0, 1.0)) {
|
||||
result.PreScale(scale.x, scale.y, scale.z);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
template <typename Operator>
|
||||
static Matrix4x4 OperateTransformMatrixByServo(const Matrix4x4& aMatrix1,
|
||||
const Matrix4x4& aMatrix2,
|
||||
double aProgress) {
|
||||
return Operator::operateByServo(aMatrix1, aMatrix2, aProgress);
|
||||
}
|
||||
|
||||
template <typename Operator>
|
||||
static void ProcessMatrixOperator(Matrix4x4& aMatrix,
|
||||
const StyleTransform& aFrom,
|
||||
|
@ -378,19 +284,7 @@ static void ProcessMatrixOperator(Matrix4x4& aMatrix,
|
|||
float appUnitPerCSSPixel = AppUnitsPerCSSPixel();
|
||||
Matrix4x4 matrix1 = ReadTransforms(aFrom, aRefBox, appUnitPerCSSPixel);
|
||||
Matrix4x4 matrix2 = ReadTransforms(aTo, aRefBox, appUnitPerCSSPixel);
|
||||
|
||||
// TODO(emilio): I think the legacy decomposition code couldn't be reached
|
||||
// before, probably just remove it?
|
||||
const bool kUseLegacyDecomposition = false;
|
||||
if (kUseLegacyDecomposition) {
|
||||
aMatrix =
|
||||
OperateTransformMatrix<Operator>(matrix1, matrix2, aProgress) * aMatrix;
|
||||
return;
|
||||
}
|
||||
|
||||
aMatrix =
|
||||
OperateTransformMatrixByServo<Operator>(matrix1, matrix2, aProgress) *
|
||||
aMatrix;
|
||||
aMatrix = Operator::operateByServo(matrix1, matrix2, aProgress) * aMatrix;
|
||||
}
|
||||
|
||||
/* Helper function to process two matrices that we need to interpolate between
|
||||
|
@ -574,38 +468,6 @@ static void MatrixForTransformFunction(Matrix4x4& aMatrix,
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the transform function, as an nsCSSKeyword, for the given
|
||||
* nsCSSValue::Array from a transform list.
|
||||
*/
|
||||
nsCSSKeyword TransformFunctionOf(const nsCSSValue::Array* aData) {
|
||||
MOZ_ASSERT(aData->Item(0).GetUnit() == eCSSUnit_Enumerated);
|
||||
return aData->Item(0).GetKeywordValue();
|
||||
}
|
||||
|
||||
void SetIdentityMatrix(nsCSSValue::Array* aMatrix) {
|
||||
MOZ_ASSERT(aMatrix, "aMatrix should be non-null");
|
||||
|
||||
nsCSSKeyword tfunc = TransformFunctionOf(aMatrix);
|
||||
MOZ_ASSERT(tfunc == eCSSKeyword_matrix || tfunc == eCSSKeyword_matrix3d,
|
||||
"Only accept matrix and matrix3d");
|
||||
|
||||
if (tfunc == eCSSKeyword_matrix) {
|
||||
MOZ_ASSERT(aMatrix->Count() == 7, "Invalid matrix");
|
||||
Matrix m;
|
||||
for (size_t i = 0; i < 6; ++i) {
|
||||
aMatrix->Item(i + 1).SetFloatValue(m.components[i], eCSSUnit_Number);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
MOZ_ASSERT(aMatrix->Count() == 17, "Invalid matrix3d");
|
||||
Matrix4x4 m;
|
||||
for (size_t i = 0; i < 16; ++i) {
|
||||
aMatrix->Item(i + 1).SetFloatValue(m.components[i], eCSSUnit_Number);
|
||||
}
|
||||
}
|
||||
|
||||
Matrix4x4 ReadTransforms(const StyleTransform& aTransform,
|
||||
TransformReferenceBox& aRefBox,
|
||||
float aAppUnitsPerMatrixUnit) {
|
||||
|
|
|
@ -14,7 +14,6 @@
|
|||
#include "gfxPoint.h"
|
||||
#include "mozilla/gfx/Matrix.h"
|
||||
#include "mozilla/EnumeratedArray.h"
|
||||
#include "nsCSSValue.h"
|
||||
#include "nsSize.h"
|
||||
|
||||
#include <limits>
|
||||
|
@ -144,14 +143,6 @@ class MOZ_STACK_CLASS TransformReferenceBox final {
|
|||
bool mIsCached;
|
||||
};
|
||||
|
||||
/**
|
||||
* Return the transform function, as an nsCSSKeyword, for the given
|
||||
* nsCSSValue::Array from a transform list.
|
||||
*/
|
||||
nsCSSKeyword TransformFunctionOf(const nsCSSValue::Array* aData);
|
||||
|
||||
void SetIdentityMatrix(nsCSSValue::Array* aMatrix);
|
||||
|
||||
float ProcessTranslatePart(
|
||||
const mozilla::LengthPercentage& aValue, TransformReferenceBox* aRefBox,
|
||||
TransformReferenceBox::DimensionGetter aDimensionGetter = nullptr);
|
||||
|
|
Загрузка…
Ссылка в новой задаче