diff --git a/dom/base/DOMMatrix.cpp b/dom/base/DOMMatrix.cpp index f0358125f8..56cf6f1b17 100644 --- a/dom/base/DOMMatrix.cpp +++ b/dom/base/DOMMatrix.cpp @@ -117,6 +117,17 @@ ValidateAndFixupMatrixInit(DOMMatrixInit& aMatrixInit, ErrorResult& aRv) #undef Check3DField } +void +DOMMatrixReadOnly::SetDataFromMatrix2DInit(const DOMMatrix2DInit& aMatrixInit) { + MOZ_ASSERT(Is2D()); + mMatrix2D->_11 = aMatrixInit.mM11.Value(); + mMatrix2D->_12 = aMatrixInit.mM12.Value(); + mMatrix2D->_21 = aMatrixInit.mM21.Value(); + mMatrix2D->_22 = aMatrixInit.mM22.Value(); + mMatrix2D->_31 = aMatrixInit.mM41.Value(); + mMatrix2D->_32 = aMatrixInit.mM42.Value(); +} + void DOMMatrixReadOnly::SetDataFromMatrixInit(DOMMatrixInit& aMatrixInit) { @@ -149,6 +160,34 @@ DOMMatrixReadOnly::SetDataFromMatrixInit(DOMMatrixInit& aMatrixInit) } } +already_AddRefed DOMMatrixReadOnly::FromMatrix( + nsISupports* aParent, const DOMMatrix2DInit& aMatrixInit, + ErrorResult& aRv) { + DOMMatrix2DInit matrixInit(aMatrixInit); + if (!ValidateAndFixupMatrix2DInit(matrixInit, aRv)) { + return nullptr; + }; + + RefPtr matrix = + new DOMMatrixReadOnly(aParent, /* is2D */ true); + matrix->SetDataFromMatrix2DInit(matrixInit); + return matrix.forget(); +} + +already_AddRefed DOMMatrixReadOnly::FromMatrix( + nsISupports* aParent, const DOMMatrixInit& aMatrixInit, ErrorResult& aRv) { + DOMMatrixInit matrixInit(aMatrixInit); + if (!ValidateAndFixupMatrixInit(matrixInit, aRv)) { + return nullptr; + }; + + RefPtr rval = + new DOMMatrixReadOnly(aParent, matrixInit.mIs2D.Value()); + rval->SetDataFromMatrixInit(matrixInit); + return rval.forget(); + +} + already_AddRefed DOMMatrixReadOnly::FromMatrix(const GlobalObject& aGlobal, const DOMMatrixInit& aMatrixInit, ErrorResult& aRv) { diff --git a/dom/base/DOMMatrix.h b/dom/base/DOMMatrix.h index 99e7714add..423580e2c4 100644 --- a/dom/base/DOMMatrix.h +++ b/dom/base/DOMMatrix.h @@ -26,6 +26,7 @@ class DOMPoint; class StringOrUnrestrictedDoubleSequence; struct DOMPointInit; struct DOMMatrixInit; +struct DOMMatrix2DInit; class DOMMatrixReadOnly : public nsWrapperCache { @@ -57,6 +58,12 @@ public: nsISupports* GetParentObject() const { return mParent; } virtual JSObject* WrapObject(JSContext* cx, JS::Handle aGivenProto) override; + static already_AddRefed + FromMatrix(nsISupports* aParent, const DOMMatrix2DInit& aMatrixInit, ErrorResult& aRv); + + static already_AddRefed + FromMatrix(nsISupports* aParent, const DOMMatrixInit& aMatrixInit, ErrorResult& aRv); + static already_AddRefed FromMatrix(const GlobalObject& aGlobal, const DOMMatrixInit& aMatrixInit, ErrorResult& aRv); @@ -207,6 +214,12 @@ public: ErrorResult& aRv) const; void Stringify(nsAString& aResult); bool WriteStructuredClone(JSStructuredCloneWriter* aWriter) const; + const gfx::Matrix* GetInternal2D() const { + if (Is2D()) { + return mMatrix2D; + } + return nullptr; + } protected: nsCOMPtr mParent; @@ -220,6 +233,7 @@ protected: * where all of its members are properly defined. * The init dictionary's dimension must match the matrix one. */ + void SetDataFromMatrix2DInit(const DOMMatrix2DInit& aMatrixInit); void SetDataFromMatrixInit(DOMMatrixInit& aMatrixInit); DOMMatrixReadOnly* SetMatrixValue(const nsAString& aTransformList, ErrorResult& aRv);