Chromium Code Reviews| Index: third_party/WebKit/Source/core/dom/DOMMatrixReadOnly.cpp |
| diff --git a/third_party/WebKit/Source/core/dom/DOMMatrixReadOnly.cpp b/third_party/WebKit/Source/core/dom/DOMMatrixReadOnly.cpp |
| index b91ed3d470c01dd6ab0b8b3bcf9c5da1174ff204..1f24620588e993efb7c0251c15cbd5b5ffd49637 100644 |
| --- a/third_party/WebKit/Source/core/dom/DOMMatrixReadOnly.cpp |
| +++ b/third_party/WebKit/Source/core/dom/DOMMatrixReadOnly.cpp |
| @@ -3,8 +3,82 @@ |
| // found in the LICENSE file. |
| #include "core/dom/DOMMatrix.h" |
| +#include "core/dom/DOMMatrixInit.h" |
| namespace blink { |
| +namespace { |
| + |
| +void setDictionaryMembers(DOMMatrixInit& other) |
| +{ |
| + if (!other.hasM11()) { |
| + if (other.hasA()) |
| + other.setM11(other.a()); |
| + else |
| + other.setM11(1); |
| + } |
| + if (!other.hasM12()) { |
| + if (other.hasB()) |
| + other.setM12(other.b()); |
| + else |
| + other.setM12(0); |
| + } |
| + if (!other.hasM21()) { |
| + if (other.hasC()) |
| + other.setM21(other.c()); |
| + else |
| + other.setM21(0); |
| + } |
| + if (!other.hasM22()) { |
| + if (other.hasD()) |
| + other.setM22(other.d()); |
| + else |
| + other.setM22(1); |
| + } |
| + if (!other.hasM41()) { |
| + if (other.hasE()) |
| + other.setM41(other.e()); |
| + else |
| + other.setM41(0); |
| + } |
| + if (!other.hasM42()) { |
| + if (other.hasF()) |
| + other.setM42(other.f()); |
| + else |
| + other.setM42(0); |
| + } |
| +} |
| + |
| +} // namespace |
| + |
| +void DOMMatrixReadOnly::validateAndFixup(DOMMatrixInit& other, ExceptionState& exceptionState) |
|
dominicc (has gone to gerrit)
2016/08/30 02:13:43
Please add tests for NaN. The note about NaN bit p
zino
2016/09/10 10:18:15
Done.
|
| +{ |
| + if ((other.hasA() && other.hasM11() && other.a() != other.m11()) |
| + || (other.hasB() && other.hasM12() && other.b() != other.m12()) |
| + || (other.hasC() && other.hasM21() && other.c() != other.m21()) |
| + || (other.hasD() && other.hasM22() && other.d() != other.m22()) |
| + || (other.hasE() && other.hasM41() && other.e() != other.m41()) |
| + || (other.hasF() && other.hasM42() && other.f() != other.m42())) { |
| + exceptionState.throwTypeError("[a, b, c, d, e, f] members should equals [m11, m12, m21, m22, m41, m42]."); |
|
dominicc (has gone to gerrit)
2016/08/30 02:13:43
Grammar: should equals -> should equal
It's a bit
zino
2016/09/10 10:18:15
Done.
|
| + return; |
| + } |
| + |
| + if (other.hasIs2D() && other.is2D() && (other.m31() || other.m32() |
| + || other.m13() || other.m23() || other.m43() || other.m14() |
| + || other.m24() || other.m34() || other.m33() != 1 || other.m44() != 1)) { |
| + exceptionState.throwTypeError("The is2D member is set to true but the input matrix is 3d matrix."); |
| + return; |
| + } |
| + |
| + setDictionaryMembers(other); |
| + if (!other.hasIs2D()) { |
| + if (other.m31() || other.m32() || other.m13() || other.m23() |
| + || other.m43() || other.m14() || other.m24() || other.m34() |
| + || other.m33() != 1 || other.m44() != 1) |
| + other.setIs2D(false); |
|
dominicc (has gone to gerrit)
2016/08/30 02:13:43
Why not save that expression in a variable with a
zino
2016/09/10 10:18:15
Done.
|
| + else |
| + other.setIs2D(true); |
| + } |
| +} |
| DOMMatrixReadOnly* DOMMatrixReadOnly::create(Vector<double> sequence, ExceptionState& exceptionState) |
| { |
| @@ -15,6 +89,24 @@ DOMMatrixReadOnly* DOMMatrixReadOnly::create(Vector<double> sequence, ExceptionS |
| return new DOMMatrixReadOnly(sequence); |
| } |
| +DOMMatrixReadOnly* DOMMatrixReadOnly::fromMatrix(DOMMatrixInit& other, ExceptionState& exceptionState) |
| +{ |
| + validateAndFixup(other, exceptionState); |
|
dominicc (has gone to gerrit)
2016/08/30 02:13:43
The common pattern seems to be
validateAndFixUp
c
zino
2016/09/10 10:18:15
Done.
|
| + if (exceptionState.hadException()) |
| + return nullptr; |
| + |
| + if (other.is2D()) { |
| + return new DOMMatrixReadOnly({ |
| + other.m11(), other.m12(), other.m21(), |
| + other.m22(), other.m41(), other.m42()}); |
| + } |
| + return new DOMMatrixReadOnly({ |
| + other.m11(), other.m12(), other.m13(), other.m14(), |
| + other.m21(), other.m22(), other.m23(), other.m24(), |
| + other.m31(), other.m32(), other.m33(), other.m34(), |
| + other.m41(), other.m42(), other.m43(), other.m44()}); |
| +} |
| + |
| DOMMatrixReadOnly::DOMMatrixReadOnly(Vector<double> sequence) |
| { |
| if (sequence.size() == 6) { |
| @@ -48,9 +140,9 @@ bool DOMMatrixReadOnly::isIdentity() const |
| return m_matrix->isIdentity(); |
| } |
| -DOMMatrix* DOMMatrixReadOnly::multiply(DOMMatrix* other) |
| +DOMMatrix* DOMMatrixReadOnly::multiply(DOMMatrixInit& other, ExceptionState& exceptionState) |
| { |
| - return DOMMatrix::create(this)->multiplySelf(other); |
| + return DOMMatrix::create(this)->multiplySelf(other, exceptionState); |
| } |
| DOMMatrix* DOMMatrixReadOnly::translate(double tx, double ty, double tz) |