Chromium Code Reviews| Index: cc/math_util.cc |
| diff --git a/cc/math_util.cc b/cc/math_util.cc |
| index 606f67bf482b34e7ffbb9cdf35ffb2d039ccb401..091a5e99df420ac5cddb23de2a7fdc5b87880860 100644 |
| --- a/cc/math_util.cc |
| +++ b/cc/math_util.cc |
| @@ -395,4 +395,165 @@ gfx::Vector2dF MathUtil::projectVector(gfx::Vector2dF source, gfx::Vector2dF des |
| return gfx::Vector2dF(projectedLength * destination.x(), projectedLength * destination.y()); |
| } |
| +bool MathUtil::isInvertible(const gfx::Transform& transform) |
| +{ |
| + // TODO (shawnsingh): improve this function. We don't need to perform a |
| + // full matrix inversion when the matrix was actually invertible. |
|
Ian Vollick
2012/11/16 13:44:46
Now that SkMatrix44::determinant is public, would
|
| + gfx::Transform inverse; |
| + bool invertible = transform.GetInverse(&inverse); |
| + return invertible; |
| +} |
| + |
| +bool MathUtil::isBackFaceVisible(const gfx::Transform&) |
| +{ |
| + DCHECK(false); // NOT YET IMPLEMENTED!! |
| + return false; |
| +} |
| + |
| +bool MathUtil::isIdentity(const gfx::Transform& transform) |
| +{ |
| + return transform.matrix().isIdentity(); |
| +} |
| + |
| +bool MathUtil::isIdentityOrTranslation(const gfx::Transform& transform) |
| +{ |
| + const SkMatrix44& matrix = transform.matrix(); |
| + |
|
Ian Vollick
2012/11/16 13:44:46
SkMatrix44 now has getDouble for accessing matrix
|
| + bool hasNoPerspective = !matrix.get(3, 0) && !matrix.get(3, 1) && !matrix.get(3, 2) && (matrix.get(3, 3) == 1); |
| + bool hasNoRotationOrSkew = !matrix.get(0, 1) && !matrix.get(0, 2) && !matrix.get(1, 0) && |
| + !matrix.get(1, 2) && !matrix.get(2, 0) && !matrix.get(2, 1); |
| + bool hasNoScale = matrix.get(0, 0) == 1 |
| + && matrix.get(1, 1) == 1 |
| + && matrix.get(2, 2) == 1; |
| + |
| + return hasNoPerspective && hasNoRotationOrSkew && hasNoScale; |
| +} |
| + |
| +bool MathUtil::hasPerspective(const gfx::Transform& transform) |
| +{ |
| + // Mathematically it is a bit too strict to expect the 4th element to be |
| + // equal to 1. However, the only non-perspective case where this element |
| + // becomes non-1 is when it was explicitly initialized. In that case it |
| + // still causes us to have a nontrivial divide-by-w, so we count it as |
| + // being perspective here. |
| + const SkMatrix44& matrix = transform.matrix(); |
| + return matrix.get(3, 0) || matrix.get(3, 1) || matrix.get(3, 2) || (matrix.get(3, 3) != 1); |
| +} |
| + |
| +void MathUtil::makeIdentity(gfx::Transform* transform) |
| +{ |
| + transform->matrix().setIdentity(); |
| +} |
| + |
| +void MathUtil::rotateEulerAngles(gfx::Transform* transform, float eulerX, float eulerY, float eulerZ) |
| +{ |
| + // TODO (shawnsingh): make this implementation faster and more accurate by |
| + // hard-coding each matrix instead of calling rotateAxisAngle(). |
|
Ian Vollick
2012/11/16 13:44:46
Actually, it would be nice if SkMatrix44 noticed w
shawnsingh
2012/11/17 00:38:31
I think I understand you're saying that we should
|
| + gfx::Transform rotationAboutX; |
| + gfx::Transform rotationAboutY; |
| + gfx::Transform rotationAboutZ; |
| + |
| + MathUtil::rotateAxisAngle(&rotationAboutX, 1, 0, 0, eulerX); |
| + MathUtil::rotateAxisAngle(&rotationAboutY, 0, 1, 0, eulerY); |
| + MathUtil::rotateAxisAngle(&rotationAboutZ, 0, 0, 1, eulerZ); |
| + |
| + gfx::Transform composite = rotationAboutZ * rotationAboutY * rotationAboutX; |
| + transform->PreconcatTransform(composite); |
| +} |
| + |
| +void MathUtil::rotateAxisAngle(gfx::Transform* transform, float i, float j, float k, float degrees) |
| +{ |
| + // TODO (shawnsingh): fix gfx::Transform API to receive vector instead of |
| + // point for the axis. |
|
Ian Vollick
2012/11/16 13:44:46
This is a good point, but this would ideally be a
shawnsingh
2012/11/17 00:38:31
Sounds like musings for follow-up patch, right? a
|
| + gfx::Point3F axis(i, j, k); |
| + transform->PreconcatRotateAbout(axis, degrees); |
| +} |
| + |
| +gfx::Transform MathUtil::inverse(const gfx::Transform& transform) |
| +{ |
| + gfx::Transform result; |
| + transform.GetInverse(&result); |
|
Ian Vollick
2012/11/16 13:44:46
GetInverse should be decorated with WARN_UNUSED_RE
|
| + return result; |
| +} |
| + |
| +gfx::Transform MathUtil::to2dTransform(const gfx::Transform& transform) |
| +{ |
| + gfx::Transform result = transform; |
| + SkMatrix44& matrix = result.matrix(); |
| + matrix.set(0, 2, 0); |
|
Ian Vollick
2012/11/16 13:44:46
setDouble
|
| + matrix.set(1, 2, 0); |
| + matrix.set(2, 2, 1); |
| + matrix.set(3, 2, 0); |
| + |
| + matrix.set(2, 0, 0); |
| + matrix.set(2, 1, 0); |
| + matrix.set(2, 3, 0); |
| + |
| + return result; |
| +} |
| + |
| +gfx::Transform MathUtil::toGfxTransform(const WebKit::WebTransformationMatrix&) |
| +{ |
| + DCHECK(false); // NOT YET IMPLEMENTED!! |
| + return gfx::Transform(); |
| +} |
| + |
| +gfx::Transform MathUtil::createGfxTransform(float m11, float m12, float m13, float m14, |
| + float m21, float m22, float m23, float m24, |
| + float m31, float m32, float m33, float m34, |
| + float m41, float m42, float m43, float m44) |
| +{ |
| + gfx::Transform result; |
| + SkMatrix44& matrix = result.matrix(); |
| + |
| + // Initialize column 1 |
| + matrix.set(0, 0, m11); |
|
Ian Vollick
2012/11/16 13:44:46
setDouble.
|
| + matrix.set(1, 0, m12); |
| + matrix.set(2, 0, m13); |
| + matrix.set(3, 0, m14); |
| + |
| + // Initialize column 2 |
| + matrix.set(0, 1, m21); |
| + matrix.set(1, 1, m22); |
| + matrix.set(2, 1, m23); |
| + matrix.set(3, 1, m24); |
| + |
| + // Initialize column 2 |
|
Ian Vollick
2012/11/16 13:44:46
Copy pasta -- column 3. Here and below.
|
| + matrix.set(0, 2, m31); |
| + matrix.set(1, 2, m32); |
| + matrix.set(2, 2, m33); |
| + matrix.set(3, 2, m34); |
| + |
| + // Initialize column 2 |
| + matrix.set(0, 3, m41); |
| + matrix.set(1, 3, m42); |
| + matrix.set(2, 3, m43); |
| + matrix.set(3, 3, m44); |
| + |
| + return result; |
| +} |
| + |
| +gfx::Transform MathUtil::createGfxTransform(float a, float b, float c, |
| + float d, float e, float f) |
| +{ |
| + gfx::Transform result; |
| + SkMatrix44& matrix = result.matrix(); |
| + matrix.set(0, 0, a); |
|
Ian Vollick
2012/11/16 13:44:46
setDouble
|
| + matrix.set(1, 0, b); |
| + matrix.set(0, 1, c); |
| + matrix.set(1, 1, d); |
| + matrix.set(0, 3, e); |
| + matrix.set(1, 3, f); |
| + |
| + return result; |
| +} |
| + |
| +gfx::Transform operator*(const gfx::Transform& A, const gfx::Transform& B) |
| +{ |
| + // Compute A * B. |
| + gfx::Transform result = A; |
| + result.PreconcatTransform(B); |
| + return result; |
| +} |
| + |
| } // namespace cc |