| // Copyright 2014 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef DOMMatrixReadOnly_h |
| #define DOMMatrixReadOnly_h |
| |
| #include "bindings/core/v8/ExceptionState.h" |
| #include "bindings/core/v8/ScriptWrappable.h" |
| #include "core/dom/DOMTypedArray.h" |
| #include "platform/heap/Handle.h" |
| #include "platform/transforms/TransformationMatrix.h" |
| #include <memory> |
| |
| namespace blink { |
| |
| class DOMMatrix; |
| |
| class DOMMatrixReadOnly : public GarbageCollectedFinalized<DOMMatrixReadOnly>, public ScriptWrappable { |
| DEFINE_WRAPPERTYPEINFO(); |
| public: |
| static DOMMatrixReadOnly* create(Vector<double>, ExceptionState&); |
| static DOMMatrixReadOnly* fromFloat32Array(DOMFloat32Array*, ExceptionState&); |
| static DOMMatrixReadOnly* fromFloat64Array(DOMFloat64Array*, ExceptionState&); |
| |
| virtual ~DOMMatrixReadOnly(); |
| |
| double a() const { return m_matrix->m11(); } |
| double b() const { return m_matrix->m12(); } |
| double c() const { return m_matrix->m21(); } |
| double d() const { return m_matrix->m22(); } |
| double e() const { return m_matrix->m41(); } |
| double f() const { return m_matrix->m42(); } |
| |
| double m11() const { return m_matrix->m11(); } |
| double m12() const { return m_matrix->m12(); } |
| double m13() const { return m_matrix->m13(); } |
| double m14() const { return m_matrix->m14(); } |
| double m21() const { return m_matrix->m21(); } |
| double m22() const { return m_matrix->m22(); } |
| double m23() const { return m_matrix->m23(); } |
| double m24() const { return m_matrix->m24(); } |
| double m31() const { return m_matrix->m31(); } |
| double m32() const { return m_matrix->m32(); } |
| double m33() const { return m_matrix->m33(); } |
| double m34() const { return m_matrix->m34(); } |
| double m41() const { return m_matrix->m41(); } |
| double m42() const { return m_matrix->m42(); } |
| double m43() const { return m_matrix->m43(); } |
| double m44() const { return m_matrix->m44(); } |
| |
| bool is2D() const; |
| bool isIdentity() const; |
| |
| DOMMatrix* multiply(DOMMatrix*); |
| DOMMatrix* translate(double tx, double ty, double tz = 0); |
| DOMMatrix* scale(double scale, double ox = 0, double oy = 0); |
| DOMMatrix* scale3d(double scale, double ox = 0, double oy = 0, double oz = 0); |
| DOMMatrix* scaleNonUniform(double sx, double sy = 1, double sz = 1, |
| double ox = 0, double oy = 0, double oz = 0); |
| DOMMatrix* skewX(double sx); |
| DOMMatrix* skewY(double sy); |
| DOMMatrix* flipX(); |
| DOMMatrix* flipY(); |
| DOMMatrix* inverse(); |
| |
| DOMFloat32Array* toFloat32Array() const; |
| DOMFloat64Array* toFloat64Array() const; |
| |
| const String toString() const; |
| |
| const TransformationMatrix& matrix() const { return *m_matrix; } |
| |
| DEFINE_INLINE_TRACE() { } |
| |
| protected: |
| DOMMatrixReadOnly() {} |
| |
| template <typename T> |
| DOMMatrixReadOnly(T sequence, int size) |
| { |
| if (size == 6) { |
| m_matrix = TransformationMatrix::create( |
| sequence[0], sequence[1], sequence[2], sequence[3], |
| sequence[4], sequence[5]); |
| m_is2D = true; |
| } else if (size == 16) { |
| m_matrix = TransformationMatrix::create( |
| sequence[0], sequence[1], sequence[2], sequence[3], |
| sequence[4], sequence[5], sequence[6], sequence[7], |
| sequence[8], sequence[9], sequence[10], sequence[11], |
| sequence[12], sequence[13], sequence[14], sequence[15]); |
| m_is2D = false; |
| } else { |
| NOTREACHED(); |
| } |
| } |
| |
| // TransformationMatrix needs to be 16-byte aligned. PartitionAlloc |
| // supports 16-byte alignment but Oilpan doesn't. So we use an std::unique_ptr |
| // to allocate TransformationMatrix on PartitionAlloc. |
| // TODO(oilpan): Oilpan should support 16-byte aligned allocations. |
| std::unique_ptr<TransformationMatrix> m_matrix; |
| bool m_is2D; |
| }; |
| |
| } // namespace blink |
| |
| #endif |