Geometry Interfaces Module Level 1

W3C Candidate Recommendation, 25 November 2014

This version:
http://www.w3.org/TR/2014/CR-geometry-1-20141125/
Latest version:
http://www.w3.org/TR/geometry-1/
Editor's Draft:
http://dev.w3.org/fxtf/geometry/
Previous Versions:
http://www.w3.org/TR/2014/WD-geometry-1-20140918/
Feedback:
public-fx@w3.org with subject line “[geometry] … message topic …” (archives)
Test Suite:
http://test.csswg.org/suites/geometry-1_dev/nightly-unstable/
Editors:
(Opera Software ASA)
(Adobe Systems Inc.)
(Adobe Systems Inc.)
Issues list:
Bugzilla (file a bug)

Abstract

This specification provides basic geometric interfaces to represent points, rectangles, quadrilaterals and transformation matrices that can be used by other modules or specifications.

Status of this document

This section describes the status of this document at the time of its publication. Other documents may supersede this document. A list of current W3C publications and the latest revision of this technical report can be found in the W3C technical reports index at http://www.w3.org/TR/.

This document was produced by the CSS Working Group (part of the Style Activity) and the SVG Working Group (part of the Graphics Activity) as a Candidate Recommendation.

A Candidate Recommendation is a document that has been widely reviewed and is ready for implementation. W3C encourages everybody to implement this specification and return comments to the (archived) public mailing list public-fx@w3.org (see instructions). When sending e-mail, please put the text “geometry” in the subject, preferably like this: “[geometry] …summary of comment…

Publication as a Candidate Recommendation does not imply endorsement by the W3C Membership. This is a draft document and may be updated, replaced or obsoleted by other documents at any time. It is inappropriate to cite this document as other than work in progress.

This document was produced by groups operating under the 5 February 2004 W3C Patent Policy. W3C maintains a public list of any patent disclosures (CSS) and a public list of any patent disclosures (SVG) made in connection with the deliverables of each group; these pages also includes instructions for disclosing a patent. An individual who has actual knowledge of a patent which the individual believes contains Essential Claim(s) must disclose the information in accordance with section 6 of the W3C Patent Policy.

This document is governed by the 1 August 2014 W3C Process Document.

A test suite and implementation report for Geometry Interfaces Module Level 1 will be developed during the Candidate Recommendation phase, which will last a minimum of six months, and at least until 6 May 2015. A preliminary implementation report is available, although there are few tests as yet. See the section “CR exit criteria” for more details.

The following features are at-risk, and may be dropped during the CR period:

Table of Contents

1. Introduction

This specification describes several geometry interfaces [WEBIDL] for the representation of points, rectangles, quadrilaterals and transformation matrices with the dimension of 3x2 and 4x4.

The SVG interfaces SVGPoint, SVGRect and SVGMatrix [SVG11] are aliasing the here defined interfaces in favor for common interfaces used by SVG, Canvas 2D Context [2DCONTEXT] and CSS Transforms [CSS3-TRANSFORMS].

2. The DOMPoint interfaces

A 2D or a 3D point can be represented by the following WebIDL interfaces:

[Constructor(unrestricted double x, unrestricted double y,
             unrestricted double z, unrestricted double w),
 Exposed=(Window,Worker)]
interface DOMPointReadOnly {
    readonly attribute unrestricted double x;
    readonly attribute unrestricted double y;
    readonly attribute unrestricted double z;
    readonly attribute unrestricted double w;

    DOMPoint matrixTransform(DOMMatrixReadOnly matrix);
};

[Constructor(optional DOMPointInit point),
 Constructor(optional unrestricted double x = 0, optional unrestricted double y = 0,
             optional unrestricted double z = 0, optional unrestricted double w = 1),
 Exposed=(Window,Worker)]
interface DOMPoint : DOMPointReadOnly {
    inherit attribute unrestricted double x;
    inherit attribute unrestricted double y;
    inherit attribute unrestricted double z;
    inherit attribute unrestricted double w;
};

dictionary DOMPointInit {
    unrestricted double x = 0;
    unrestricted double y = 0;
    unrestricted double z = 0;
    unrestricted double w = 1;
};

The following algorithms assume that DOMPointReadOnly objects have the internal member variables x coordinate, y coordinate, z coordinate and w perspective. DOMPointReadOnly as well as the inheriting interface DOMPoint must be able to access and set the value of these variables.

An interface returning an DOMPointReadOnly object by an attribute or function may be able to modify internal member variable values. Such an interface must specify this ability explicitly in prose.

Internal member variables must not be exposed in any way.

The DOMPointReadOnly(x, y, z, w) constructor, when invoked, must run the following steps:

  1. Set the the current object’s variables x coordinate to x, y coordinate to y, z coordinate to z and w perspective to w.
  2. Return the new DOMPointReadOnly object.

The DOMPoint() constructor, when invoked, must run the following steps:

If invoked with a DOMPointInit argument
  1. Let point be the argument.
  2. Call the constructor of DOMPointReadOnly with the arguments x, y, z, w, where:
    1. x is the x dictionary member of point.
    2. y is the y dictionary member of point.
    3. z is the z dictionary member of point.
    4. w is the w dictionary member of point.
  3. Return the new DOMPoint object.
Otherwise
  1. Call the constructor of DOMPointReadOnly with the arguments x, y, z and w, respectively.
  2. Return the new DOMPoint object.
The x attribute, on getting, must return the x coordinate value of the object it was invoked on. For the DOMPoint interface, setting the x attribute must set the x coordinate value of the object it was invoked on to the new value.

The y attribute, on getting, must return the y coordinate value of the object it was invoked on. For the DOMPoint interface, setting the y attribute must set the y coordinate value of the object it was invoked on to the new value.

The z attribute, on getting, must return the z coordinate value of the object it was invoked on. For the DOMPoint interface, setting the z attribute must set the z coordinate value of the object it was invoked on to the new value.

The w attribute, on getting, must return the w perspective value of the object it was invoked on. For the DOMPoint interface, setting the w attribute must set the w perspective value of the object it was invoked on to the new value.

matrixTransform(matrix), when invoked, must run the following steps

  1. Create a new DOMPoint point initialized to x, y, z and w of the current point.
  2. Post-multiply point with matrix.
  3. Return point.

matrixTransform() does not modify the current DOMPointReadOnly object and returns a new DOMPoint object.

In this example the method matrixTransform() on point is called with a DOMMatrix argument matrix.

var point = new DOMPoint(5, 4);
var matrix = new DOMMatrix(2, 0, 0, 2, 10, 10);
var transformedPoint = point.matrixTransform(matrix);
  

point creates a new DOMPoint object initialized to the same attribute values as point. This new DOMPoint is now scaled and the translated by matrix. This resulting transformPoint has the attribute values x: 20 and y: 18.

For historical reasons, Window objects must also have a writable, configurable, non-enumerable property named SVGPoint whose value is the DOMPoint interface object.

3. The DOMRect interfaces

Objects implementing the DOMRectReadOnly interface represent a rectangle. The type of box is specified by the method or attribute that returns a DOMRect or DOMRectReadOnly object.

Rectangles have the following properties:

origin
When the rectangle has a non-negative width, the rectangle’s horizontal origin is the left edge; otherwise, it is the right edge. Similarly, when the rectangle has a non-negative height, the rectangle’s vertical origin is the top edge; otherwise, it is the bottom edge.
x coordinate
The horizontal distance between the viewport’s left edge and the rectangle’s origin.
y coordinate
The vertical distance between the viewport’s top edge and the rectangle’s origin.
width dimension
The width of the rectangle. Can be negative.
height dimension
The height of the rectangle. Can be negative.
[Constructor(unrestricted double x = 0, unrestricted double y = 0,
             unrestricted double width = 0, unrestricted double height = 0),
 Exposed=(Window,Worker)]
interface DOMRect : DOMRectReadOnly {
    inherit attribute unrestricted double x;
    inherit attribute unrestricted double y;
    inherit attribute unrestricted double width;
    inherit attribute unrestricted double height;
};

[Constructor(unrestricted double x, unrestricted double y,
             unrestricted double width, unrestricted double height),
 Exposed=(Window,Worker)]
interface DOMRectReadOnly {
    readonly attribute unrestricted double x;
    readonly attribute unrestricted double y;
    readonly attribute unrestricted double width;
    readonly attribute unrestricted double height;
    readonly attribute unrestricted double top;
    readonly attribute unrestricted double right;
    readonly attribute unrestricted double bottom;
    readonly attribute unrestricted double left;
};

dictionary DOMRectInit {
    unrestricted double x = 0;
    unrestricted double y = 0;
    unrestricted double width = 0;
    unrestricted double height = 0;
};

The following algorithms assume that DOMRectReadOnly objects have the internal member variables x coordinate, y coordinate, width dimension and height dimension. DOMRectReadOnly as well as the inheriting interface DOMRect must be able to access and set the value of these variables.

An interface returning an DOMRectReadOnly object by an attribute or function may be able to modify internal member variable values. Such an interface must specify this ability explicitly in prose.

Internal member variables must not be exposed in any way.

The DOMRectReadOnly(x, y, width, height) constructor, when invoked, must run the following steps:

  1. Set the the current object’s variables x coordinate to x, y coordinate to y, width dimension to width and height dimension to height.
  2. Return the new DOMRectReadOnly object.

The DOMRect(x, y, width, height) constructor, when invoked, must run the following steps:

  1. Call the constructor of DOMRectReadOnly with x, y, width and height.
  2. Return the new DOMRect object.
The x attribute, on getting, must return the x coordinate value of the object it was invoked on. For the DOMRect interface, setting the x attribute must set the x coordinate value of the object it was invoked on to the new value.

The y attribute, on getting, it must return the y coordinate value of the object it was invoked on. For the DOMRect interface, setting the y attribute must set the y coordinate value of the object it was invoked on to the new value.

The width attribute, on getting, must return the width value of the object it was invoked on. For the DOMRect interface, setting the width attribute must set the width dimension value of the object it was invoked on to the new value.

The height attribute, on getting, must return the height value. For the DOMRect interface, setting the height attribute must set the height dimension value to the new value.

The top attribute, on getting, must return min(y coordinate, y coordinate + height dimension) of the object it was invoked on.

The right attribute, on getting, must return max(x coordinate, x coordinate + width dimension) of the object it was invoked on.

The bottom attribute, on getting, must return max(y coordinate, y coordinate + height dimension) of the object it was invoked on.

The left attribute, on getting, must return min(x coordinate, x coordinate + width dimension) of the object it was invoked on.

For historical reasons, Window objects must also have a writable, configurable, non-enumerable property named SVGRect whose value is the DOMRect interface object.

4. The DOMRectList Interface

[NoInterfaceObject,
 ArrayClass]
interface DOMRectList {
    readonly attribute unsigned long length;
    getter DOMRect? item(unsigned long index);
};

The length attribute must return the total number of DOMRect objects associated with the object.

The item(index) method, when invoked, must return a null value when index is greater than or equal to the number of DOMRect objects associated with the DOMRectList. Otherwise, the DOMRect object at index must be returned. Indices are zero-based.

DOMRectList must be supported for legacy reasons. New interfaces must not use DOMRectList and may use Sequences [WEBIDL] instead.

5. The DOMQuad interface

Objects implementing the DOMQuad interface represents a quadrilateral.

[Constructor(optional DOMPointInit p1, optional DOMPointInit p2,
             optional DOMPointInit p3, optional DOMPointInit p4),
 Constructor(optional DOMRectInit rect),
 Exposed=(Window,Worker)]
interface DOMQuad {
    [SameObject] readonly attribute DOMPoint p1;
    [SameObject] readonly attribute DOMPoint p2;
    [SameObject] readonly attribute DOMPoint p3;
    [SameObject] readonly attribute DOMPoint p4;
    [SameObject] readonly attribute DOMRectReadOnly bounds;
};

The DOMQuad() constructor, when invoked, must run the following steps:

If invoked with one argument
  1. Let rect be the argument.
  2. Let x, y, width and height be the value of rect’s x, y, width and height attributes, respectively.
  3. Let point 1 be a new DOMPoint object with x set to x, y set to y, z set to zero and w set to one.
  4. Let point 2 be a new DOMPoint object with x set to x + width, y set to y, z set to zero and w set to one.
  5. Let point 3 be a new DOMPoint object with x set to x + width, y set to y + height, z set to zero and w set to one.
  6. Let point 4 be a new DOMPoint object with x set to x, y set to y + height, z set to zero and w set to one.
  7. Return a new DOMQuad with p1 set to point 1, p2 set to point 2, p3 set to point 3 and p4 set to point 4, and let the associated bounding rectangle be bounds.

Otherwise
  1. Let p1, p2, p3 and p4 be the given arguments, in the same order.
  2. Let point 1 be a new DOMPoint object with its attributes set to the values of the namesake dictionary members in p1.
  3. Let point 2 be a new DOMPoint object with its attributes set to the values of the namesake dictionary members in p2.
  4. Let point 3 be a new DOMPoint object with its attributes set to the values of the namesake dictionary members in p3.
  5. Let point 4 be a new DOMPoint object with its attributes set to the values of the namesake dictionary members in p4.
  6. Return a new DOMQuad with p1 set to point 1, p2 set to point 2, p3 set to point 3 and p4 set to point 4, and let the associated bounding rectangle be bounds.

Note: It is possible to pass DOMPoint/DOMPointReadOnly arguments as well. The passed arguments will be transformed to the correct object type internally following the WebIDL rules [WEBIDL].

The p1 attribute must return a DOMPoint that represents p1 of the quadrilateral it was invoked on. The author can modify the returned DOMPoint object, which directly affects the quadrilateral.

The p2 attribute must return a DOMPoint that represents p2 of the quadrilateral it was invoked on. The author can modify the returned DOMPoint object, which directly affects the quadrilateral.

The p3 attribute must return a DOMPoint that represents p3 of the quadrilateral it was invoked on. The author can modify the returned DOMPoint object, which directly affects the quadrilateral.

The p4 attribute must return a DOMPoint that represents p4 of the quadrilateral it was invoked on. The author can modify the returned DOMPoint object, which directly affects the quadrilateral.

The bounds attribute must return the associated bounding rectangle of the quadrilateral it was invoked on.

DOMQuad objects have an associated bounding rectangle set to a DOMRectReadOnly object when created. DOMQuad objects must have read and write access to the internal member variables of the associated bounding rectangle. The associated bounding rectangle is live; whenever the objects for p1, p2, p3 or p4 change, the associated bounding rectangle must update its internal member variable values as appropriate to describe the new smallest bounding box of the four points.

The associated bounding rectangle is computed as follows:

  1. Let bounds be a DOMRectReadOnly object.
  2. Let left be the minimum of p1.x, p2.x, p3.x and p4.x.
  3. Let top be the minimum of p1.y, p2.y, p3.y and p4.y.
  4. Let right be the maximum of p1.x, p2.x, p3.x and p4.x.
  5. Let bottom be the maximum of p1.y, p2.y, p3.y and p4.y.
  6. Let x coordinate of bounds be left, y coordinate of bounds be top, width dimension of bounds be right - left and height dimension of bounds be bottom - top.

In this example the DOMQuad constructor is called with arguments of type DOMPoint and DOMPointInit. Both arguments are accepted and can be used.

var point = new DOMPoint(2, 0);
var quad1 = new DOMQuad(point, {x: 12, y: 0}, {x: 2, y: 10}, {x: 12, y: 10});

The attribute values of the resulting DOMQuad quad1 above are also equal to the attribute values of the following DOMQuad quad2:

var rect = new DOMRect(2, 0, 10, 10);
var quad2 = new DOMQuad(rect);

This is an example of an irregular quadrilateral:

new DOMQuad({x: 40, y: 25}, {x: 180, y: 8}, {x: 210, y: 150}, {x: 10, y: 180});
An irregular quadrilateral with none of the sides being vertical or horizontal. Its four corners are marked with red circles. Around this quadrilateral is a dashed rectangle. All sides of this rectangle are vertical or horizontal and tangent the quadrilateral.

An irregular quadrilateral represented by a DOMQuad. The four red colored circles represent the DOMPoint attributes p1 to p4. The dashed rectangle represents the associated bounding rectangle bounds of the DOMQuad.

6. The DOMMatrix interfaces

The DOMMatrix and DOMMatrixReadOnly interfaces each represent a mathematical matrix with the purpose of describing transformations in a graphical context. The following sections describe the details of the interface.

m11m21m31m41m12m22m32m42m13m23m33m43m14m24m34m44

A 4x4 matrix representing a DOMMatrix with items m11 to m44.

In the following sections, terms have the following meaning:

post-multiply
Term A post-multiplied by term B is equal to A · B.
pre-multiply
Term A pre-multiplied by term B is equal to B · A.
multiply
Multiply term A by term B is equal to A · B.
[Constructor(sequence<unrestricted double> numberSequence),
 Exposed=(Window,Worker)]
interface DOMMatrixReadOnly {
    // These attributes are simple aliases for certain elements of the 4x4 matrix
    readonly attribute unrestricted double a;
    readonly attribute unrestricted double b;
    readonly attribute unrestricted double c;
    readonly attribute unrestricted double d;
    readonly attribute unrestricted double e;
    readonly attribute unrestricted double f;

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

    readonly attribute boolean is2D;
    readonly attribute boolean isIdentity;

    // Immutable transform methods
    DOMMatrix translate(unrestricted double tx,
                        unrestricted double ty,
                        optional unrestricted double tz = 0);
    DOMMatrix scale(unrestricted double scale,
                    optional unrestricted double originX = 0,
                    optional unrestricted double originY = 0);
    DOMMatrix scale3d(unrestricted double scale,
                      optional unrestricted double originX = 0,
                      optional unrestricted double originY = 0,
                      optional unrestricted double originZ = 0);
    DOMMatrix scaleNonUniform(unrestricted double scaleX,
                              optional unrestricted double scaleY = 1,
                              optional unrestricted double scaleZ = 1,
                              optional unrestricted double originX = 0,
                              optional unrestricted double originY = 0,
                              optional unrestricted double originZ = 0);
    DOMMatrix rotate(unrestricted double angle,
                     optional unrestricted double originX = 0,
                     optional unrestricted double originY = 0);
    DOMMatrix rotateFromVector(unrestricted double x,
                               unrestricted double y);
    DOMMatrix rotateAxisAngle(unrestricted double x,
                              unrestricted double y,
                              unrestricted double z,
                              unrestricted double angle);
    DOMMatrix skewX(unrestricted double sx);
    DOMMatrix skewY(unrestricted double sy);
    DOMMatrix multiply(DOMMatrix other);
    DOMMatrix flipX();
    DOMMatrix flipY();
    DOMMatrix inverse();

    DOMPoint            transformPoint(optional DOMPointInit point);
    Float32Array        toFloat32Array();
    Float64Array        toFloat64Array();
                        stringifier;
};

[Constructor,
 Constructor(DOMString transformList),
 Constructor(DOMMatrixReadOnly other),
 Constructor(Float32Array array32),
 Constructor(Float64Array array64),
 Constructor(sequence<unrestricted double> numberSequence),
 Exposed=(Window,Worker)]
interface DOMMatrix : DOMMatrixReadOnly {
    // These attributes are simple aliases for certain elements of the 4x4 matrix
    inherit attribute unrestricted double a;
    inherit attribute unrestricted double b;
    inherit attribute unrestricted double c;
    inherit attribute unrestricted double d;
    inherit attribute unrestricted double e;
    inherit attribute unrestricted double f;

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

    // Mutable transform methods
    DOMMatrix multiplySelf(DOMMatrix other);
    DOMMatrix preMultiplySelf(DOMMatrix other);
    DOMMatrix translateSelf(unrestricted double tx,
                     unrestricted double ty,
                     optional unrestricted double tz = 0);
    DOMMatrix scaleSelf(unrestricted double scale,
                 optional unrestricted double originX = 0,
                 optional unrestricted double originY = 0);
    DOMMatrix scale3dSelf(unrestricted double scale,
                   optional unrestricted double originX = 0,
                   optional unrestricted double originY = 0,
                   optional unrestricted double originZ = 0);
    DOMMatrix scaleNonUniformSelf(unrestricted double scaleX,
                           optional unrestricted double scaleY = 1,
                           optional unrestricted double scaleZ = 1,
                           optional unrestricted double originX = 0,
                           optional unrestricted double originY = 0,
                           optional unrestricted double originZ = 0);
    DOMMatrix rotateSelf(unrestricted double angle,
                  optional unrestricted double originX = 0,
                  optional unrestricted double originY = 0);
    DOMMatrix rotateFromVectorSelf(unrestricted double x,
                            unrestricted double y);
    DOMMatrix rotateAxisAngleSelf(unrestricted double x,
                           unrestricted double y,
                           unrestricted double z,
                           unrestricted double angle);
    DOMMatrix skewXSelf(unrestricted double sx);
    DOMMatrix skewYSelf(unrestricted double sy);
    DOMMatrix invertSelf();

    DOMMatrix setMatrixValue(DOMString transformList);
};

The following algorithms assume that DOMMatrixReadOnly objects have the internal member variables m11 element, m12 element, m13 element, m14 element, m21 element, m22 element, m23 element, m24 element, m31 element, m32 element, m33 element, m34 element, m41 element, m42 element, m43 element, m44 element and is2D. DOMMatrixReadOnly as well as the inheriting interface DOMMatrix must be able to access and set the value of these variables.

An interface returning an DOMMatrixReadOnly object by an attribute or function may be able to modify internal member variable values. Such an interface must specify this ability explicitly in prose.

Internal member variables must not be exposed in any way.

The DOMMatrix and DOMMatrixReadOnly interfaces replace the SVGMatrix interface from SVG [SVG11].

For historical reasons, Window objects must also have a writable, configurable, non-enumerable property named SVGMatrix whose value is the DOMMatrix interface object.

6.1. DOMMatrixReadOnly constructor

The DOMMatrixReadOnly(sequence<unrestricted double> numberSequence) constructor, when invoked, must run the following steps:

If numberSequence has 6 elements
  1. Set m11 element, m12 element, m21 element, m22 element, m41 element, m42 element to the values of numberSequence in order starting with the first value. Furthermore, set m31 element, m32 element, m13 element, m23 element, m43 element, m14 element, m24 element, m34 element to 0 and m33 element, m44 element to 1.
  2. Set is2D to true.
  3. Return the new DOMMatrixReadOnly object.
If numberSequence has 16 elements
  1. Set m11 element to m44 element to the values of numberSequence in column-major order.
  2. Set is2D to false.
  3. Return the new DOMMatrixReadOnly object.
Otherwise
Throw a TypeError exception.

6.2. DOMMatrix constructors

The DOMMatrix() constructor, when invoked, must run the following steps:

If invoked with no arguments
  1. Call the constructor of DOMMatrixReadOnly with a sequence of numbers: 1, 0, 0, 1, 0, 0.
  2. Return the new DOMMatrix object.
If invoked with a DOMString argument transformList
  1. Parse transformList by following the syntax description in “Syntax of the SVG ‘transform’ attribute[CSS3-TRANSFORMS] to a <transform-list>. If parsing is not successful or any <transform-function> has <length> values without absolute length units, throw a SyntaxError exception.
  2. Let 2dTransform track the 2D/3D dimension status of the <transform-list>.
    If the <transform-list> consists of any 3D Transform functions
    Set 2dTransform to false.
    Otherwise
    Set 2dTransform to true.
  3. Transform all <transform-function>s to 4x4 matrices by following the “Mathematical Description of Transform Functions[CSS3-TRANSFORMS].
  4. Let matrix be a 4x4 matrix as shown in the initial figure of this section. Post-multiply all matrices from left to right and set matrix to this product.
  5. Call the constructor of DOMMatrixReadOnly as follows
    If 2dTransform is set to true
    Call the constructor of DOMMatrixReadOnly with a sequence of numbers, the values being the 16 elements of matrix.
    If 2dTransform is set to false
    Call the constructor of DOMMatrixReadOnly with a sequence of numbers, the values being the elements m11, m12, 21, m22, m41 and m42 of matrix of matrix.
  6. Return the new DOMMatrix object.
If invoked with a DOMMatrixReadOnly argument other
If the is2D attribute of other returns true
Call the constructor of DOMMatrixReadOnly with a sequence of numbers, the values being the 16 elements m11 element, m12 element, m13 element, ..., m44 element of other in the given order.
Otherwise
Call the constructor of DOMMatrixReadOnly with a sequence of numbers, the values being the 6 elements m11 element, m12 element, m21 element, m22 element, m41 element and m42 element of other in the given order.
If invoked with a Float32Array argument array32
If array32 has 6 elements
If array32 has 16 elements
  1. Call the constructor of DOMMatrixReadOnly with a sequence of numbers taking the values from array32 in the provided order.
  2. Return the new DOMMatrix object.
Otherwise
Throw a TypeError exception.
If invoked with a Float64Array argument array64
If array64 has 6 elements
If array64 has 16 elements
  1. Call the constructor of DOMMatrixReadOnly with sequence of numbers taking the values from array64 in the provided order.
  2. Return the new DOMMatrix object.
Otherwise
Throw a TypeError exception.
If invoked with a sequence<unrestricted double> argument numberSequence
If array64 has 6 elements
If array64 has 16 elements
  1. Call the constructor of DOMMatrixReadOnly with numberSequence as argument.
  2. Return the new DOMMatrix object.
Otherwise
Throw a TypeError exception.

6.3. DOMMatrix attributes

The following attributes m11 to m44 correspond to the 16 items of the matrix interfaces. For the DOMMatrix interface, if the attributes m31, m32, m13, m23, m43, m14, m24, m34 are set to something else than 0 or m33, m44 are set to something else than 1 set is2D to false.

The m11 attribute, on getting, must return the m11 element value of the object it was invoked on. For the DOMMatrix interface, setting the m11 attribute must set the m11 element value of the object it was invoked on to the new value.

The m12 attribute, on getting, must return the m12 element value of the object it was invoked on. For the DOMMatrix interface, setting the m12 attribute must set the m12 element value of the object it was invoked on to the new value.

The m13 attribute, on getting, must return the m13 element value of the object it was invoked on. For the DOMMatrix interface, setting the m13 attribute must set the m13 element value of the object it was invoked on to the new value.

The m14 attribute, on getting, must return the m14 element value of the object it was invoked on. For the DOMMatrix interface, setting the m14 attribute must set the m14 element value of the object it was invoked on to the new value.

The m21 attribute, on getting, must return the m21 element value of the object it was invoked on. For the DOMMatrix interface, setting the m21 attribute must set the m21 element value of the object it was invoked on to the new value.

The m22 attribute, on getting, must return the m22 element value of the object it was invoked on. For the DOMMatrix interface, setting the m22 attribute must set the m22 element value of the object it was invoked on to the new value.

The m23 attribute, on getting, must return the m23 element value of the object it was invoked on. For the DOMMatrix interface, setting the m23 attribute must set the m23 element value of the object it was invoked on to the new value.

The m24 attribute, on getting, must return the m24 element value of the object it was invoked on. For the DOMMatrix interface, setting the m24 attribute must set the m24 element value of the object it was invoked on to the new value.

The m31 attribute, on getting, must return the m31 element value of the object it was invoked on. For the DOMMatrix interface, setting the m31 attribute must set the m31 element value of the object it was invoked on to the new value.

The m32 attribute, on getting, must return the m32 element value of the object it was invoked on. For the DOMMatrix interface, setting the m32 attribute must set the m32 element value of the object it was invoked on to the new value.

The m33 attribute, on getting, must return the m33 element value of the object it was invoked on. For the DOMMatrix interface, setting the m33 attribute must set the m33 element value of the object it was invoked on to the new value.

The m34 attribute, on getting, must return the m34 element value of the object it was invoked on. For the DOMMatrix interface, setting the m34 attribute must set the m34 element value of the object it was invoked on to the new value.

The m41 attribute, on getting, must return the m41 element value of the object it was invoked on. For the DOMMatrix interface, setting the m41 attribute must set the m41 element value of the object it was invoked on to the new value.

The m42 attribute, on getting, must return the m42 element value of the object it was invoked on. For the DOMMatrix interface, setting the m42 attribute must set the m42 element value of the object it was invoked on to the new value.

The m43 attribute, on getting, must return the m43 element value of the object it was invoked on. For the DOMMatrix interface, setting the m43 attribute must set the m43 element value of the object it was invoked on to the new value.

The m44 attribute, on getting, must return the m44 element value of the object it was invoked on. For the DOMMatrix interface, setting the m44 attribute must set the m44 element value of the object it was invoked on to the new value.

The following attributes a to f correspond to the 2D components of the matrix interfaces.

The a attribute is an alias to the m11 attribute.

The b attribute is an alias to the m12 attribute.

The c attribute is an alias to the m21 attribute.

The d attribute is an alias to the m22 attribute.

The e attribute is an alias to the m41 attribute.

The f attribute is an alias to the m42 attribute.

The following attributes provide status information about DOMMatrixReadOnly.

is2D

Every DOMMatrixReadOnly object must be flagged with a boolean is2D. This flag indicates that

  1. The current matrix was initialized as a 2D matrix. See individual constructors for more details.
  2. Only 2D transformation operations were applied. Each mutable or immutable transformation method defines if is2D must be set to false.

is2D can never be set to true when it was set to false before on a DOMMatrix object with the exception of calling the setMatrixValue() method.

Returns the value of is2D.

isIdentity
Returns true if m12, m13, m14, m21, m23, m24, m31, m32, m34, m41, m42, m43 are 0 and m11, m22, m33, m44 are 1. Otherwise returns false.

6.4. Immutable transformation methods

The following methods do not modify the current matrix and return a new DOMMatrix object.

translate(tx, ty, tz)
  1. Let result be the resulting matrix initialized to the values of the current matrix.
  2. Perform a translateSelf() transformation on result with the arguments tx, ty, tz.
  3. Return result.

The current matrix is not modified.

scale(scale, originX, originY)
  1. Let other be the resulting matrix initialized to the values of the current matrix.
  2. Perform a scaleSelf() transformation on result with the arguments scale, originX, originY.
  3. Return result.

The current matrix is not modified.

scale3d(scale, originX, originY, originZ)
  1. Let result be the resulting matrix initialized to the values of the current matrix.
  2. Perform a scale3dSelf() transformation on result with the arguments scale, originX, originY, originZ.
  3. Return result.

The current matrix is not modified.

scaleNonUniform(scaleX, scaleY, scaleZ, originX, originY, originZ)
  1. Let result be the resulting matrix initialized to the values of the current matrix.
  2. Perform a scaleNonUniformSelf() transformation on result with the arguments scaleX, scaleY, scaleZ, originX, originY, originZ.
  3. Return result.

The current matrix is not modified.

rotate(angle, originX, originY)
  1. Let result be the resulting matrix initialized to the values of the current matrix.
  2. Perform a rotateSelf() transformation on result with the arguments angle, originX, originY.
  3. Return result.

The current matrix is not modified.

rotateFromVector(x, y)
  1. Let result be the resulting matrix initialized to the values of the current matrix.
  2. Perform a rotateFromVectorSelf() transformation on result with the arguments x, y.
  3. Return result.

The current matrix is not modified.

rotateAxisAngle(x, y, z, angle)
  1. Let result be the resulting matrix initialized to the values of the current matrix.
  2. Perform a rotateAxisAngleSelf() transformation on result with the arguments x, y, z, angle.
  3. Return result.

The current matrix is not modified.

skewX(sx)
  1. Let result be the resulting matrix initialized to the values of the current matrix.
  2. Perform a skewXSelf() transformation on result with the argument sx.
  3. Return result.

The current matrix is not modified.

skewY(sy)
  1. Let result be the resulting matrix initialized to the values of the current matrix.
  2. Perform a skewYSelf() transformation on result with the argument sy.
  3. Return result.

The current matrix is not modified.

multiply(other)
  1. Let result be the resulting matrix initialized to the values of the current matrix.
  2. Perform a multiply() transformation on result with the argument other.
  3. Return result.

The current matrix is not modified.

flipX()
  1. Let result be the resulting matrix initialized to the values of the current matrix.
  2. Post-multiply result with DOMMatrix(-1, 0, 0, 1, 0, 0).
  3. Return result.

The current matrix is not modified.

flipY()
  1. Let result be the resulting matrix initialized to the values of the current matrix.
  2. Post-multiply result with DOMMatrix(1, 0, 0, -1, 0, 0).
  3. Return result.

The current matrix is not modified.

inverse()
  1. Let result be the resulting matrix initialized to the values of the current matrix.
  2. Perform a invertSelf() transformation on result.
  3. Return result.

The current matrix is not modified.

The following methods do not modify the current matrix.

transformPoint(point)
The point argument is post-multiplied to the current matrix and returns the resulting point. The passed argument does not get modified.

Note: Even if is2D of the current matrix may return true, a 4x4 matrix multiplication must be performed if the z attribute of point is not 0 or the w attribute of point is not 1.

toFloat32Array()
Returns the serialized 16 elements m11 to m44 of the current matrix in column-major order as Float32Array [typedarray].
toFloat64Array()
Returns the serialized 16 elements m11 to m44 of the current matrix in column-major order as Float64Array [typedarray].
stringifier()
If is2D is true
Return a DOMString in the form of a CSS Transforms <matrix()> function where a is a attribute, b is b attribute, c is c attribute, d is d attribute, e is e attribute, f is f attribute, [CSS3-TRANSFORMS].
Otherwise
Return a DOMString in the form of a CSS Transforms <matrix3d()> function where m11 to m44 are set to m11 to m44 attributes [CSS3-TRANSFORMS].

In this example, a matrix is created and several 2D transformation methods are called:

var matrix = new DOMMatrix();
matrix.scaleSelf(2);
matrix.translateSelf(20,20);

Calling matrix.toString() returns the DOMString:

"matrix(2, 0, 0, 2, 20, 20)"

In the following example, a matrix is created and several 3D transformation methods are called:

var matrix = new DOMMatrix();
matrix.scale3dSelf(2);

For 3D operations, the stringifier returns a DOMString representing a 3D matrix.

Calling matrix.toString() after the snippet above returns the DOMString:

"matrix3d(2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 1)"

6.5. Mutable transformation methods

The following methods modify the current matrix, so that each method returns the matrix where it was invoked on. The primary benefit of this is allowing content creators to chain method calls.

The following code example:

var matrix = new DOMMatrix();
matrix.translateSelf(20, 20);
matrix.scaleSelf(2);
matrix.translateSelf(-20, -20);

is equivalent to:

var matrix = new DOMMatrix();
matrix.translateSelf(20, 20).scaleSelf(2).translateSelf(-20, -20);

Note: Authors who use chained method calls are recommended to use mutable transformation methods to avoid unnecessary memory allocations due to creation of intermediate DOMMatrix objects in User Agents.

multiplySelf(other)
  1. The other matrix gets post-multiplied to the current matrix.
  2. If is2D of other is false, set is2D of the current matrix to false.
  3. Return the current matrix.
preMultiplySelf(other)
  1. The other matrix gets pre-multiplied to the current matrix.
  2. If is2D of other is false, set is2D of the current matrix to false.
  3. Return the current matrix.
translateSelf(tx, ty, tz)
  1. Post-multiply a translation transformation on the current matrix. The 3D translation matrix is described in CSS Transforms [CSS3-TRANSFORMS].

  2. If tz is specified and not 0, set is2D of the current matrix to false.

  3. Return the current matrix.
scaleSelf(scale, originX, originY)
  1. Apply a translateSelf(originX, originY) transformation to the current matrix.
  2. Post-multiply a uniform 2D scale transformation (m11 = m22 = scale) on the current matrix. The 2D scale matrix is described in CSS Transforms with sx = sy = scale. [CSS3-TRANSFORMS].
  3. Apply a translateSelf(-originX, -originY) transformation to the current matrix.
  4. Return the current matrix.
scale3dSelf(scale, originX, originY, originZ)
  1. Apply a translateSelf(originX, originY, originZ) transformation to the current matrix.
  2. Post-multiply a uniform 3D scale transformation (m11 = m22 = m33 = scale) on the current matrix. The 3D scale matrix is described in CSS Transforms with sx = sy = sz = scale. [CSS3-TRANSFORMS].
  3. Apply a translateSelf(-originX, -originY, -originZ) transformation to the current matrix.
  4. If scale is not 1, set is2D of the current matrix to false.
  5. Return the current matrix.
scaleNonUniformSelf(scaleX, scaleY, scaleZ, originX, originY, originZ)
  1. Apply a translateSelf(originX, originY, originZ) transformation to the current matrix.
  2. Post-multiply a non-uniform scale transformation on the current matrix. The 3D scale matrix is described in CSS Transforms with sx = scaleX, sy = scaleY and sz = scaleZ. [CSS3-TRANSFORMS].
  3. Apply a translateSelf(-originX, -originY, -originZ) transformation to the current matrix.
  4. If scaleZ is specified and not 1 or originZ is specified and not 0, set is2D of the current matrix to false.
  5. Return the current matrix.
rotateSelf(angle, originX, originY)
  1. Apply a translateSelf(originX, originY) transformation to the current matrix.
  2. Post-multiply a rotation transformation on the current matrix with the specified rotation angle in degrees. The 2D rotation matrix is described in CSS Transforms with alpha = angle in degrees. [CSS3-TRANSFORMS].
  3. Apply a translateSelf(-originX, -originY) transformation to the current matrix.
  4. Return the current matrix.
rotateFromVectorSelf(x, y)
  1. Post-multiply a rotation transformation on the current matrix. The rotation angle is determined by the angle between the vector (1,0)T and (x,y)T in the clockwise direction. If x and y should both be zero, the angle is specified as zero. The 2D rotation matrix is described in CSS Transforms where alpha is the angle between the vector (1,0)T and (x,y)T in degrees [CSS3-TRANSFORMS].
  2. Return the current matrix.
rotateAxisAngleSelf(x, y, z, angle)
  1. Post-multiply a rotation transformation on the current matrix around the specified vector x, y, z by the specified rotation angle in degrees. The 3D rotation matrix is described in CSS Transforms with alpha = angle in degrees [CSS3-TRANSFORMS].
  2. If x or y are not 0, set is2D of the current matrix to false.
  3. Return the current matrix.
skewXSelf(sx)
  1. Post-multiply a skewX transformation on the current matrix by the specified angle sx in degrees. The 2D skewX matrix is described in CSS Transforms with alpha = sx in degrees [CSS3-TRANSFORMS].
  2. Return the current matrix.
skewYSelf(sy)
  1. Post-multiply a skewX transformation on the current matrix by the specified angle sy in degrees. The 2D skewY matrix is described in CSS Transforms with beta = sy in degrees [CSS3-TRANSFORMS].
  2. Return the current matrix.
invertSelf()
  1. Invert the current matrix.
  2. If the current matrix is not invertible set all attributes to NaN and set is2D to false.
  3. Return the current matrix.
setMatrixValue(transformList)
  1. Parse transformList by following the syntax description in “Syntax of the SVG ‘transform’ attribute[CSS3-TRANSFORMS] to a <transform-list>. If parsing is not successful or any <transform-function> has <length> values without absolute length units, throw a SyntaxError exception.
  2. Set is2D to false if the <transform-list> consists of any 3D Transform functions. Otherwise set is2D to true.
  3. Transform all <transform-function>s to 4x4 matrices by following the “Mathematical Description of Transform Functions[CSS3-TRANSFORMS].
  4. Post-multiply all matrices from left to right to a combined 4x4 matrix.
  5. Set the m11 to m44 attributes to the element values of the 4x4 matrix in column-major order.
  6. Return the current matrix.

7. Cloning

When a user agent is asked to clone an DOMPointReadOnly, DOMPoint, DOMRectReadOnly, DOMRect, DOMQuad, DOMMatrixReadOnly or DOMMatrix object old, it must run the following steps, which return a new object of same type. These steps must be run atomically.

  1. Create a new object new of the same type as old. Copy all member variable values from old to new.
  2. Return new. It is the clone.

The above algorithm follows the “safe passing of structured data” [HTML5] definitions.

Changes since last publication

The following changes were made since the 18 September 2014 Working Draft.

The following changes were made since the 26 June 2014 Last Call Public Working Draft.

The following changes were made since the 22 May 2014 First Public Working Draft.

Acknowledgments

The editors would like to thank Robert O’Callahan for contributing to this specification. Many thanks to Dean Jackson for his initial proposal of DOMMatrix. Thanks to Brian Birtles, Benoit Jacob, Cameron McCormack, Kari Pihkala, Adenilson Cavalcanti, Boris Zbarsky and Max Vujovic for their careful reviews, comments, and corrections.

Conformance

Document conventions

Conformance requirements are expressed with a combination of descriptive assertions and RFC 2119 terminology. The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in the normative parts of this document are to be interpreted as described in RFC 2119. However, for readability, these words do not appear in all uppercase letters in this specification.

All of the text of this specification is normative except sections explicitly marked as non-normative, examples, and notes. [RFC2119]

Examples in this specification are introduced with the words "for example" or are set apart from the normative text with class="example", like this:

This is an example of an informative example.

Informative notes begin with the word "Note" and are set apart from the normative text with class="note", like this:

Note, this is an informative note.

Advisements are normative sections styled to evoke special attention and are set apart from other normative text with <strong class="advisement">, like this: UAs MUST provide an accessible alternative.

Conformance classes

Conformance to this specification is defined for three conformance classes:

style sheet
A CSS style sheet.
renderer
A UA that interprets the semantics of a style sheet and renders documents that use them.
authoring tool
A UA that writes a style sheet.

A style sheet is conformant to this specification if all of its statements that use syntax defined in this module are valid according to the generic CSS grammar and the individual grammars of each feature defined in this module.

A renderer is conformant to this specification if, in addition to interpreting the style sheet as defined by the appropriate specifications, it supports all the features defined by this specification by parsing them correctly and rendering the document accordingly. However, the inability of a UA to correctly render a document due to limitations of the device does not make the UA non-conformant. (For example, a UA is not required to render color on a monochrome monitor.)

An authoring tool is conformant to this specification if it writes style sheets that are syntactically correct according to the generic CSS grammar and the individual grammars of each feature in this module, and meet all other conformance requirements of style sheets as described in this module.

Partial implementations

So that authors can exploit the forward-compatible parsing rules to assign fallback values, CSS renderers must treat as invalid (and ignore as appropriate) any at-rules, properties, property values, keywords, and other syntactic constructs for which they have no usable level of support. In particular, user agents must not selectively ignore unsupported component values and honor supported values in a single multi-value property declaration: if any value is considered invalid (as unsupported values must be), CSS requires that the entire declaration be ignored.

Experimental implementations

To avoid clashes with future CSS features, the CSS2.1 specification reserves a prefixed syntax for proprietary and experimental extensions to CSS.

Prior to a specification reaching the Candidate Recommendation stage in the W3C process, all implementations of a CSS feature are considered experimental. The CSS Working Group recommends that implementations use a vendor-prefixed syntax for such features, including those in W3C Working Drafts. This avoids incompatibilities with future changes in the draft.

Non-experimental implementations

Once a specification reaches the Candidate Recommendation stage, non-experimental implementations are possible, and implementors should release an unprefixed implementation of any CR-level feature they can demonstrate to be correctly implemented according to spec.

To establish and maintain the interoperability of CSS across implementations, the CSS Working Group requests that non-experimental CSS renderers submit an implementation report (and, if necessary, the testcases used for that implementation report) to the W3C before releasing an unprefixed implementation of any CSS features. Testcases submitted to W3C are subject to review and correction by the CSS Working Group.

Further information on submitting testcases and implementation reports can be found from on the CSS Working Group’s website at http://www.w3.org/Style/CSS/Test/. Questions should be directed to the public-css-testsuite@w3.org mailing list.

CR exit criteria

For this specification to be advanced to Proposed Recommendation, there must be at least two independent, interoperable implementations of each feature. Each feature may be implemented by a different set of products, there is no requirement that all features be implemented by a single product. For the purposes of this criterion, we define the following terms:

independent
each implementation must be developed by a different party and cannot share, reuse, or derive from code used by another qualifying implementation. Sections of code that have no bearing on the implementation of this specification are exempt from this requirement.
interoperable
passing the respective test case(s) in the official CSS test suite, or, if the implementation is not a Web browser, an equivalent test. Every relevant test in the test suite should have an equivalent test created if such a user agent (UA) is to be used to claim interoperability. In addition if such a UA is to be used to claim interoperability, then there must one or more additional UAs which can also pass those equivalent tests in the same way for the purpose of interoperability. The equivalent tests must be made publicly available for the purposes of peer review.
implementation
a user agent which:
  1. implements the specification.
  2. is available to the general public. The implementation may be a shipping product or other publicly available version (i.e., beta version, preview release, or "nightly build"). Non-shipping product releases must have implemented the feature(s) for a period of at least one month in order to demonstrate stability.
  3. is not experimental (i.e., a version specifically designed to pass the test suite and is not intended for normal usage going forward).

The specification will remain Candidate Recommendation for at least six months.

References

Normative References

[CSS3-TRANSFORMS]
Simon Fraser; et al. CSS Transforms. 11 September 2012. W3C Working Draft. (Work in progress.) URL: http://www.w3.org/TR/2012/WD-css3-transforms-20120911/
[WebIDL]
Cameron McCormack. Web IDL. 19 April 2012. CR. URL: http://www.w3.org/TR/WebIDL/
[html5]
Robin Berjon; et al. HTML5. 28 October 2014. W3C Recommendation. URL: http://www.w3.org/TR/html5/
[rfc2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. March 1997. Best Current Practice. URL: http://www.ietf.org/rfc/rfc2119.txt

Informative References

[2dcontext]
Rik Cabanier; et al. HTML Canvas 2D Context. 21 August 2014. CR. URL: http://www.w3.org/TR/2dcontext/
[SVG11]
Erik Dahlström; et al. Scalable Vector Graphics (SVG) 1.1 (Second Edition). 16 August 2011. REC. URL: http://www.w3.org/TR/SVG11/
[typedarray]
David Herman; Kenneth Russell. Typed Array Specification. Khronos Working Draft. URL: https://www.khronos.org/registry/typedarray/specs/latest/

Index

IDL Index

[Constructor(unrestricted double x, unrestricted double y,
             unrestricted double z, unrestricted double w),
 Exposed=(Window,Worker)]
interface DOMPointReadOnly {
    readonly attribute unrestricted double x;
    readonly attribute unrestricted double y;
    readonly attribute unrestricted double z;
    readonly attribute unrestricted double w;

    DOMPoint matrixTransform(DOMMatrixReadOnly matrix);
};

[Constructor(optional DOMPointInit point),
 Constructor(optional unrestricted double x = 0, optional unrestricted double y = 0,
             optional unrestricted double z = 0, optional unrestricted double w = 1),
 Exposed=(Window,Worker)]
interface DOMPoint : DOMPointReadOnly {
    inherit attribute unrestricted double x;
    inherit attribute unrestricted double y;
    inherit attribute unrestricted double z;
    inherit attribute unrestricted double w;
};

dictionary DOMPointInit {
    unrestricted double x = 0;
    unrestricted double y = 0;
    unrestricted double z = 0;
    unrestricted double w = 1;
};

[Constructor(unrestricted double x = 0, unrestricted double y = 0,
             unrestricted double width = 0, unrestricted double height = 0),
 Exposed=(Window,Worker)]
interface DOMRect : DOMRectReadOnly {
    inherit attribute unrestricted double x;
    inherit attribute unrestricted double y;
    inherit attribute unrestricted double width;
    inherit attribute unrestricted double height;
};

[Constructor(unrestricted double x, unrestricted double y,
             unrestricted double width, unrestricted double height),
 Exposed=(Window,Worker)]
interface DOMRectReadOnly {
    readonly attribute unrestricted double x;
    readonly attribute unrestricted double y;
    readonly attribute unrestricted double width;
    readonly attribute unrestricted double height;
    readonly attribute unrestricted double top;
    readonly attribute unrestricted double right;
    readonly attribute unrestricted double bottom;
    readonly attribute unrestricted double left;
};

dictionary DOMRectInit {
    unrestricted double x = 0;
    unrestricted double y = 0;
    unrestricted double width = 0;
    unrestricted double height = 0;
};

[NoInterfaceObject,
 ArrayClass]
interface DOMRectList {
    readonly attribute unsigned long length;
    getter DOMRect? item(unsigned long index);
};

[Constructor(optional DOMPointInit p1, optional DOMPointInit p2,
             optional DOMPointInit p3, optional DOMPointInit p4),
 Constructor(optional DOMRectInit rect),
 Exposed=(Window,Worker)]
interface DOMQuad {
    [SameObject] readonly attribute DOMPoint p1;
    [SameObject] readonly attribute DOMPoint p2;
    [SameObject] readonly attribute DOMPoint p3;
    [SameObject] readonly attribute DOMPoint p4;
    [SameObject] readonly attribute DOMRectReadOnly bounds;
};

[Constructor(sequence<unrestricted double> numberSequence),
 Exposed=(Window,Worker)]
interface DOMMatrixReadOnly {
    // These attributes are simple aliases for certain elements of the 4x4 matrix
    readonly attribute unrestricted double a;
    readonly attribute unrestricted double b;
    readonly attribute unrestricted double c;
    readonly attribute unrestricted double d;
    readonly attribute unrestricted double e;
    readonly attribute unrestricted double f;

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

    readonly attribute boolean is2D;
    readonly attribute boolean isIdentity;

    // Immutable transform methods
    DOMMatrix translate(unrestricted double tx,
                        unrestricted double ty,
                        optional unrestricted double tz = 0);
    DOMMatrix scale(unrestricted double scale,
                    optional unrestricted double originX = 0,
                    optional unrestricted double originY = 0);
    DOMMatrix scale3d(unrestricted double scale,
                      optional unrestricted double originX = 0,
                      optional unrestricted double originY = 0,
                      optional unrestricted double originZ = 0);
    DOMMatrix scaleNonUniform(unrestricted double scaleX,
                              optional unrestricted double scaleY = 1,
                              optional unrestricted double scaleZ = 1,
                              optional unrestricted double originX = 0,
                              optional unrestricted double originY = 0,
                              optional unrestricted double originZ = 0);
    DOMMatrix rotate(unrestricted double angle,
                     optional unrestricted double originX = 0,
                     optional unrestricted double originY = 0);
    DOMMatrix rotateFromVector(unrestricted double x,
                               unrestricted double y);
    DOMMatrix rotateAxisAngle(unrestricted double x,
                              unrestricted double y,
                              unrestricted double z,
                              unrestricted double angle);
    DOMMatrix skewX(unrestricted double sx);
    DOMMatrix skewY(unrestricted double sy);
    DOMMatrix multiply(DOMMatrix other);
    DOMMatrix flipX();
    DOMMatrix flipY();
    DOMMatrix inverse();

    DOMPoint            transformPoint(optional DOMPointInit point);
    Float32Array        toFloat32Array();
    Float64Array        toFloat64Array();
                        stringifier;
};

[Constructor,
 Constructor(DOMString transformList),
 Constructor(DOMMatrixReadOnly other),
 Constructor(Float32Array array32),
 Constructor(Float64Array array64),
 Constructor(sequence<unrestricted double> numberSequence),
 Exposed=(Window,Worker)]
interface DOMMatrix : DOMMatrixReadOnly {
    // These attributes are simple aliases for certain elements of the 4x4 matrix
    inherit attribute unrestricted double a;
    inherit attribute unrestricted double b;
    inherit attribute unrestricted double c;
    inherit attribute unrestricted double d;
    inherit attribute unrestricted double e;
    inherit attribute unrestricted double f;

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

    // Mutable transform methods
    DOMMatrix multiplySelf(DOMMatrix other);
    DOMMatrix preMultiplySelf(DOMMatrix other);
    DOMMatrix translateSelf(unrestricted double tx,
                     unrestricted double ty,
                     optional unrestricted double tz = 0);
    DOMMatrix scaleSelf(unrestricted double scale,
                 optional unrestricted double originX = 0,
                 optional unrestricted double originY = 0);
    DOMMatrix scale3dSelf(unrestricted double scale,
                   optional unrestricted double originX = 0,
                   optional unrestricted double originY = 0,
                   optional unrestricted double originZ = 0);
    DOMMatrix scaleNonUniformSelf(unrestricted double scaleX,
                           optional unrestricted double scaleY = 1,
                           optional unrestricted double scaleZ = 1,
                           optional unrestricted double originX = 0,
                           optional unrestricted double originY = 0,
                           optional unrestricted double originZ = 0);
    DOMMatrix rotateSelf(unrestricted double angle,
                  optional unrestricted double originX = 0,
                  optional unrestricted double originY = 0);
    DOMMatrix rotateFromVectorSelf(unrestricted double x,
                            unrestricted double y);
    DOMMatrix rotateAxisAngleSelf(unrestricted double x,
                           unrestricted double y,
                           unrestricted double z,
                           unrestricted double angle);
    DOMMatrix skewXSelf(unrestricted double sx);
    DOMMatrix skewYSelf(unrestricted double sy);
    DOMMatrix invertSelf();

    DOMMatrix setMatrixValue(DOMString transformList);
};