Proposal for a new Matrix API

Hello,

Currently CSSMatrix and SVGMatrix has an immutable API. None of the
method calls change the Matrix, instead, it creates a new Matrix with
the changed value. It can be a problem specially when CSSMatrix is
used together with WebGL. [1]

We from WebKit are proposing a new Matrix API(simple as possible), see
below or [2], where the standard methods change the matrix(in place
operations) and additional methods (multipliedBy, scaledBy and so on)
create a new Matrix as is done by CSSMatrix and SVGMatrix.

The idea is make this class accepted where CSSMatrix and SVGMatrix is
used and be the preferred class for all Matrix needs. [3]

Any comments or suggestions?

[1] http://www.khronos.org/webgl/public-mailing-list/archives/1006/msg00171.html
[2] https://gist.github.com/1301236
[3] https://bugs.webkit.org/show_bug.cgi?id=50633

-------------------------

IDL file for WebKitMatrix:

module css {

     // Introduced in DOM Level ?:
    interface [
        CanBeConstructed,
        JSCustomConstructor,
        ConstructorParameters=1,
        Constructor(in [Optional=CallWithNullValue] DOMString cssValue),
        ConstructorRaisesException,
    ] WebKitMatrix {

        // These attributes are simple aliases for certain elements of
the 4x4 matrix
        attribute double a; // alias for m11
        attribute double b; // alias for m12
        attribute double c; // alias for m21
        attribute double d; // alias for m22
        attribute double e; // alias for m41
        attribute double f; // alias for m42

        attribute double m11;
        attribute double m12;
        attribute double m13;
        attribute double m14;
        attribute double m21;
        attribute double m22;
        attribute double m23;
        attribute double m24;
        attribute double m31;
        attribute double m32;
        attribute double m33;
        attribute double m34;
        attribute double m41;
        attribute double m42;
        attribute double m43;
        attribute double m44;

        void setMatrixValue(in [Optional=CallWithDefaultValue]
DOMString string) raises (DOMException);

        // Copy the matrix elements for a single precision float point array
        void toArray(in Float32Array array);
        // Copy the matrix elements for a double precision float point array
        void toArray(in Float64Array array);

        // Multiply this matrix by secondMatrix, on the right (result
= this * secondMatrix)
        [Immutable] WebKitMatrix multipliedBy(in
[Optional=CallWithDefaultValue] WebKitMatrix secondMatrix);

        // Multiply itself by a secondMatrix, on the right (this =
this * secondMatrix)
        void multiply(in [Optional=CallWithDefaultValue] WebKitMatrix
secondMatrix);

	// Inverse this matrix. Throw an exception if the matrix is not invertible
	void inverse() raises (DOMException)

        // Return the inverse of this matrix. Throw an exception if
the matrix is not invertible
        [Immutable] WebKitMatrix inversedBy() raises (DOMException);

        // Return this matrix translated by the passed values.
        // Passing a NaN will use a value of 0. This allows the 3D
form to used for 2D operations
        [Immutable] WebKitMatrix translatedBy(in
[Optional=CallWithDefaultValue] double x,
                                              in
[Optional=CallWithDefaultValue] double y,
                                              in
[Optional=CallWithDefaultValue] double z);

        // Translate itself using the passed values.
        // Passing a NaN will use a value of 0. This allows the 3D
form to used for 2D operations
        void translate(in [Optional=CallWithDefaultValue] double x,
                       in [Optional=CallWithDefaultValue] double y,
                       in [Optional=CallWithDefaultValue] double z);

        // Returns this matrix scaled by the passed values.
        // Passing scaleX or scaleZ as NaN uses a value of 1, but
passing scaleY of NaN
        // makes it the same as scaleX. This allows the 3D form to
used for 2D operations
        [Immutable] WebKitMatrix scaledBy(in
[Optional=CallWithDefaultValue] double scaleX,
                                          in
[Optional=CallWithDefaultValue] double scaleY,
                                          in
[Optional=CallWithDefaultValue] double scaleZ);

        // Scale itself using the passed values.
        // Passing scaleX or scaleZ as NaN uses a value of 1, but
passing scaleY of NaN
        // makes it the same as scaleX. This allows the 3D form to
used for 2D operations
        void scale(in [Optional=CallWithDefaultValue] double scaleX,
                   in [Optional=CallWithDefaultValue] double scaleY,
                   in [Optional=CallWithDefaultValue] double scaleZ);

        // Returns this matrix rotated by the passed values.
        // If rotY and rotZ are NaN, rotate about Z (rotX=0,
rotateY=0, rotateZ=rotX).
        // Otherwise use a rotation value of 0 for any passed NaN.
        [Immutable] WebKitMatrix rotatedBy(in
[Optional=CallWithDefaultValue] double rotX,
                                           in
[Optional=CallWithDefaultValue] double rotY,
                                           in
[Optional=CallWithDefaultValue] double rotZ);

        // Rotate itself using the passed values.
        // If rotY and rotZ are NaN, rotate about Z (rotX=0,
rotateY=0, rotateZ=rotX).
        // Otherwise use a rotation value of 0 for any passed NaN.
        void rotate(in [Optional=CallWithDefaultValue] double rotX,
                    in [Optional=CallWithDefaultValue] double rotY,
                    in [Optional=CallWithDefaultValue] double rotZ);

        // Returns this matrix rotated about the passed axis by the
passed angle.
        // Passing a NaN will use a value of 0. If the axis is (0,0,0)
use a value
        // of (0,0,1).
        [Immutable] WebKitMatrix rotatedAxisAngleBy(in
[Optional=CallWithDefaultValue] double x,
                                                    in
[Optional=CallWithDefaultValue] double y,
                                                    in
[Optional=CallWithDefaultValue] double z,
                                                    in
[Optional=CallWithDefaultValue] double angle);

        // Rotate itself using the passed axis by the passed angle.
        void rotateAxisAngle(in [Optional=CallWithDefaultValue] double x,
                             in [Optional=CallWithDefaultValue] double y,
                             in [Optional=CallWithDefaultValue] double z,
                             in [Optional=CallWithDefaultValue] double angle);

        // Returns this matrix skewed along the X axis by the passed values.
        // Passing a NaN will use a value of 0.
        [Immutable] WebKitMatrix skewedXBy(in
[Optional=CallWithDefaultValue] double angle);

        // Skew itself along the X axis using the passed values.
        // Passing a NaN will use a value of 0.
        void skewX(in [Optional=CallWithDefaultValue] double angle);

        // Returns this matrix skewed along the Y axis by the passed values.
        // Passing a NaN will use a value of 0.
        [Immutable] WebKitMatrix skewedYBy(in
[Optional=CallWithDefaultValue] double angle);

        // Skew itself along the Y axis using the passed values.
        // Passing a NaN will use a value of 0.
        void skewY(in [Optional=CallWithDefaultValue] double angle);

        [DontEnum] DOMString toString();
    };
}

Received on Thursday, 20 October 2011 20:29:54 UTC