Issue #1810 - Implement {get|set}Transform with DOMMatrix arguments.

We already had part of the plumbing for other canvas manipulations, so
this is somewhat simplified.

This excludes the interface as that is breaking the build at this stage.
Some more research is required.
This commit is contained in:
Moonchild 2024-08-16 11:02:07 +02:00 • committed by roytam1
commit 71bd54891a
4 changed files with 46 additions and 8 deletions

View file

@ -129,17 +129,12 @@ DOMMatrixReadOnly::SetDataFromMatrix2DInit(const DOMMatrix2DInit& aMatrixInit) {
} }
void void
DOMMatrixReadOnly::SetDataFromMatrixInit(DOMMatrixInit& aMatrixInit) DOMMatrixReadOnly::SetDataFromMatrixInit(const DOMMatrixInit& aMatrixInit)
{ {
const bool is2D = aMatrixInit.mIs2D.Value(); const bool is2D = aMatrixInit.mIs2D.Value();
MOZ_ASSERT(is2D == Is2D()); MOZ_ASSERT(is2D == Is2D());
if (is2D) { if (is2D) {
mMatrix2D->_11 = aMatrixInit.mM11.Value(); SetDataFromMatrix2DInit(aMatrixInit);
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();
} else { } else {
mMatrix3D->_11 = aMatrixInit.mM11.Value(); mMatrix3D->_11 = aMatrixInit.mM11.Value();
mMatrix3D->_12 = aMatrixInit.mM12.Value(); mMatrix3D->_12 = aMatrixInit.mM12.Value();

View file

@ -52,6 +52,11 @@ public:
mMatrix3D = new gfx::Matrix4x4(aMatrix); mMatrix3D = new gfx::Matrix4x4(aMatrix);
} }
DOMMatrixReadOnly(nsISupports* aParent, const gfx::Matrix& aMatrix)
: mParent(aParent) {
mMatrix2D = new gfx::Matrix(aMatrix);
}
NS_INLINE_DECL_CYCLE_COLLECTING_NATIVE_REFCOUNTING(DOMMatrixReadOnly) NS_INLINE_DECL_CYCLE_COLLECTING_NATIVE_REFCOUNTING(DOMMatrixReadOnly)
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_NATIVE_CLASS(DOMMatrixReadOnly) NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_NATIVE_CLASS(DOMMatrixReadOnly)
@ -234,7 +239,7 @@ protected:
* The init dictionary's dimension must match the matrix one. * The init dictionary's dimension must match the matrix one.
*/ */
void SetDataFromMatrix2DInit(const DOMMatrix2DInit& aMatrixInit); void SetDataFromMatrix2DInit(const DOMMatrix2DInit& aMatrixInit);
void SetDataFromMatrixInit(DOMMatrixInit& aMatrixInit); void SetDataFromMatrixInit(const DOMMatrixInit& aMatrixInit);
DOMMatrixReadOnly* SetMatrixValue(const nsAString& aTransformList, ErrorResult& aRv); DOMMatrixReadOnly* SetMatrixValue(const nsAString& aTransformList, ErrorResult& aRv);
void Ensure3DMatrix(); void Ensure3DMatrix();
@ -268,6 +273,10 @@ public:
: DOMMatrixReadOnly(aParent, aMatrix) : DOMMatrixReadOnly(aParent, aMatrix)
{} {}
DOMMatrix(nsISupports* aParent, const gfx::Matrix& aMatrix)
: DOMMatrixReadOnly(aParent, aMatrix)
{}
static already_AddRefed<DOMMatrix> static already_AddRefed<DOMMatrix>
FromMatrix(nsISupports* aParent, const DOMMatrixInit& aMatrixInit, ErrorResult& aRv); FromMatrix(nsISupports* aParent, const DOMMatrixInit& aMatrixInit, ErrorResult& aRv);
static already_AddRefed<DOMMatrix> static already_AddRefed<DOMMatrix>

View file

@ -2229,6 +2229,18 @@ CanvasRenderingContext2D::Transform(double aM11, double aM12, double aM21,
SetTransformInternal(newMatrix); SetTransformInternal(newMatrix);
} }
already_AddRefed<DOMMatrix>
CanvasRenderingContext2D::GetTransform(ErrorResult& aError) {
EnsureTarget();
if (!IsTargetValid()) {
aError.Throw(NS_ERROR_FAILURE);
return nullptr;
}
RefPtr<DOMMatrix> matrix =
new DOMMatrix(GetParentObject(), mTarget->GetTransform());
return matrix.forget();
}
void void
CanvasRenderingContext2D::SetTransform(double aM11, double aM12, CanvasRenderingContext2D::SetTransform(double aM11, double aM12,
double aM21, double aM22, double aM21, double aM22,
@ -2244,6 +2256,22 @@ CanvasRenderingContext2D::SetTransform(double aM11, double aM12,
SetTransformInternal(Matrix(aM11, aM12, aM21, aM22, aDx, aDy)); SetTransformInternal(Matrix(aM11, aM12, aM21, aM22, aDx, aDy));
} }
void
CanvasRenderingContext2D::SetTransform(const DOMMatrix2DInit& aInit,
ErrorResult& aError) {
TransformWillUpdate();
if (!IsTargetValid()) {
aError.Throw(NS_ERROR_FAILURE);
return;
}
RefPtr<DOMMatrixReadOnly> matrix =
DOMMatrixReadOnly::FromMatrix(GetParentObject(), aInit, aError);
if (!aError.Failed()) {
SetTransformInternal(Matrix(*(matrix->GetInternal2D())));
}
}
void void
CanvasRenderingContext2D::SetTransformInternal(const Matrix& aTransform) CanvasRenderingContext2D::SetTransformInternal(const Matrix& aTransform)
{ {

View file

@ -57,6 +57,10 @@ class CanvasRenderingContext2DUserData;
class CanvasDrawObserver; class CanvasDrawObserver;
class CanvasShutdownObserver; class CanvasShutdownObserver;
class DOMMatrix;
class DOMMatrixReadOnly;
struct DOMMatrix2DInit;
/** /**
** CanvasRenderingContext2D ** CanvasRenderingContext2D
**/ **/
@ -88,8 +92,10 @@ public:
void Translate(double aX, double aY, mozilla::ErrorResult& aError); void Translate(double aX, double aY, mozilla::ErrorResult& aError);
void Transform(double aM11, double aM12, double aM21, double aM22, double aDx, void Transform(double aM11, double aM12, double aM21, double aM22, double aDx,
double aDy, mozilla::ErrorResult& aError); double aDy, mozilla::ErrorResult& aError);
already_AddRefed<DOMMatrix> GetTransform(mozilla::ErrorResult& aError);
void SetTransform(double aM11, double aM12, double aM21, double aM22, double aDx, void SetTransform(double aM11, double aM12, double aM21, double aM22, double aDx,
double aDy, mozilla::ErrorResult& aError); double aDy, mozilla::ErrorResult& aError);
void SetTransform(const DOMMatrix2DInit& aInit, mozilla::ErrorResult& aError);
void ResetTransform(mozilla::ErrorResult& aError); void ResetTransform(mozilla::ErrorResult& aError);
double GlobalAlpha() double GlobalAlpha()