1. Introduction
This section is non-normative.
This specification describes several geometry interfaces for the representation of points, rectangles, quadrilaterals and transformation matrices with the dimension of 3x2 and 4x4.
The SVG interfaces SVGPoint
, SVGRect
and SVGMatrix
are aliasing the here defined
interfaces in favor for common interfaces used by SVG, Canvas 2D Context and CSS
Transforms. [SVG11] [HTML] [CSS3-TRANSFORMS]
2. The DOMPoint interfaces
A 2D or a 3D point can be represented by the following WebIDL interfaces:
[Constructor(optional unrestricted doublex
= 0, optional unrestricted doubley
= 0, optional unrestricted doublez
= 0, optional unrestricted doublew
= 1), Exposed=(Window,Worker), Serializable] interfaceDOMPointReadOnly
{ [NewObject] static DOMPointReadOnly fromPoint(optional DOMPointInitother
); readonly attribute unrestricted double x; readonly attribute unrestricted double y; readonly attribute unrestricted double z; readonly attribute unrestricted double w; DOMPoint matrixTransform(optional DOMMatrixInitmatrix
); [Default] objecttoJSON
(); }; [Constructor(optional unrestricted doublex
= 0, optional unrestricted doubley
= 0, optional unrestricted doublez
= 0, optional unrestricted doublew
= 1), Exposed=(Window,Worker), Serializable, LegacyWindowAlias=SVGPoint
] interfaceDOMPoint
: DOMPointReadOnly { [NewObject] static DOMPoint fromPoint(optional DOMPointInitother
); inherit attribute unrestricted double x; inherit attribute unrestricted double y; inherit attribute unrestricted double z; inherit attribute unrestricted double w; }; dictionaryDOMPointInit
{ unrestricted doublex
= 0; unrestricted doubley
= 0; unrestricted doublez
= 0; unrestricted doublew
= 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)
and DOMPoint(x, y, z, w)
constructors, when invoked, must run the following steps:
-
Let point be a new
DOMPointReadOnly
orDOMPoint
object as appropriate. -
Set point’s variables x coordinate to x, y coordinate to y, z coordinate to z and w perspective to w.
-
Return point.
The fromPoint(other)
static method on DOMPointReadOnly
must create a DOMPointReadOnly
from the dictionary other.
The fromPoint(other)
static method on DOMPoint
must create a DOMPoint
from the dictionary other.
To create a DOMPointReadOnly
from a dictionary other, or to create a DOMPoint
from a dictionary other, follow these
steps:
-
Let point be a new
DOMPointReadOnly
orDOMPoint
as appropriate. -
Set point’s variables x coordinate to other’s
x
dictionary member, y coordinate to other’sy
dictionary member, z coordinate to other’sz
dictionary member and w perspective to other’sw
dictionary member. -
Return point.
x
attribute, on getting, must return the x
coordinate value. For the DOMPoint
interface, setting the x
attribute must set the x coordinate to the new value.
The y
attribute, on getting, must return the y
coordinate value. For the DOMPoint
interface, setting the y
attribute must set the y coordinate to the new value.
The z
attribute, on getting, must return the z
coordinate value. For the DOMPoint
interface, setting the z
attribute must set the z coordinate to the new value.
The w
attribute, on getting, must return the w
perspective value. For the DOMPoint
interface, setting the w
attribute must set the w perspective to the new value.
The matrixTransform(matrix)
method, when invoked, must run the following steps:
-
Let matrixObject be the result of invoking create a
DOMMatrix
from the dictionary matrix. -
Return the result of invoking transform a point with a matrix, given the current point and matrixObject. The current point does not get modified.
matrixTransform()
on a DOMPoint
instance is
called with a DOMMatrix
instance as argument.
var point = new DOMPoint(5, 4);
var matrix = new DOMMatrix([2, 0, 0, 2, 10, 10]);
var transformedPoint = point.matrixTransform(matrix);
The point variable is set to a new DOMPoint
object with x
coordinate initialized to 5 and y coordinate initialized to 4. This new DOMPoint
is now scaled and the translated by matrix. This resulting transformedPoint has the x coordinate 20 and y
coordinate 18.
2.1. Transforming a point with a matrix
To transform a point with a matrix, given point and matrix:
-
Let x be point’s x coordinate.
-
Let y be point’s y coordinate.
-
Let z be point’s z coordinate.
-
Let w be point’s w perspective.
-
Let pointVector be a new column vector with the elements being x, y, z, and w, respectively.
-
Set pointVector to pointVector post-multiplied by matrix.
-
Let transformedPoint be a new
DOMPoint
object. -
Set transformedPoint’s x coordinate to pointVector’s first element.
-
Set transformedPoint’s y coordinate to pointVector’s second element.
-
Set transformedPoint’s z coordinate to pointVector’s third element.
-
Set transformedPoint’s w perspective to pointVector’s fourth element.
-
Return transformedPoint.
Note: If matrix’s is 2D is true, point’s z coordinate is 0 or -0, and point’s w perspective is 1, then this is a 2D transformation. Otherwise this is a 3D transformation.
3. The DOMRect interfaces
Objects implementing the DOMRectReadOnly
interface represent a rectangle.
Rectangles have the following properties:
- origin
-
When the rectangle has a non-negative width dimension, the rectangle’s horizontal origin is the left edge; otherwise, it is the right edge. Similarly, when the rectangle has a non-negative height dimension, 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(optional unrestricted doublex
= 0, optional unrestricted doubley
= 0, optional unrestricted doublewidth
= 0, optional unrestricted doubleheight
= 0), Exposed=(Window,Worker), Serializable] interfaceDOMRectReadOnly
{ [NewObject] static DOMRectReadOnly fromRect(optional DOMRectInitother
); readonly attribute unrestricted doublex
; readonly attribute unrestricted doubley
; readonly attribute unrestricted doublewidth
; readonly attribute unrestricted doubleheight
; readonly attribute unrestricted doubletop
; readonly attribute unrestricted doubleright
; readonly attribute unrestricted doublebottom
; readonly attribute unrestricted doubleleft
; [Default] objecttoJSON
(); }; [Constructor(optional unrestricted doublex
= 0, optional unrestricted doubley
= 0, optional unrestricted doublewidth
= 0, optional unrestricted doubleheight
= 0), Exposed=(Window,Worker), Serializable, LegacyWindowAlias=SVGRect
] interfaceDOMRect
: DOMRectReadOnly { [NewObject] static DOMRect fromRect(optional DOMRectInitother
); inherit attribute unrestricted doublex
; inherit attribute unrestricted doubley
; inherit attribute unrestricted doublewidth
; inherit attribute unrestricted doubleheight
; }; dictionaryDOMRectInit
{ unrestricted doublex
= 0; unrestricted doubley
= 0; unrestricted doublewidth
= 0; unrestricted doubleheight
= 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)
and DOMRect(x, y, width, height)
constructors, when invoked, must run the following steps:
-
Let rect be a new
DOMRectReadOnly
orDOMRect
object as appropriate. -
Set rect’s variables x coordinate to x, y coordinate to y, width dimension to width and height dimension to height.
-
Return rect.
The fromRect(other)
static method on DOMRectReadOnly
must create a DOMRectReadOnly
from the dictionary other.
The fromRect(other)
static method on DOMRect
must create a DOMRect
from the dictionary other.
To create a DOMRectReadOnly
from a dictionary other, or to create a DOMRect
from a dictionary other, follow these
steps:
-
Let rect be a new
DOMRectReadOnly
orDOMRect
as appropriate. -
Set rect’s variables x coordinate to other’s
x
dictionary member, y coordinate to other’sy
dictionary member, width dimension to other’swidth
dictionary member and height dimension to other’sheight
dictionary member. -
Return rect.
x
attribute, on getting, must return the x
coordinate value. For the DOMRect
interface, setting the x
attribute must set the x coordinate to the new value.
The y
attribute, on getting, it must return the y
coordinate value. For the DOMRect
interface, setting the y
attribute must set the y coordinate to the new value.
The width
attribute, on getting, must return the width
dimension value. For the DOMRect
interface, setting the width
attribute must set the width dimension to the new value.
The height
attribute, on getting, must return the height dimension 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).
The right
attribute, on getting, must return max(x
coordinate, x coordinate + width dimension).
The bottom
attribute, on getting, must return max(y
coordinate, y coordinate + height dimension).
The left
attribute, on getting, must return min(x
coordinate, x coordinate + width dimension).
4. The DOMRectList interface
interfaceDOMRectList
{ readonly attribute unsigned long length; getter DOMRect? item(unsigned longindex
); };
The length
attribute must return the total
number of DOMRect
objects associated with the object.
The item(index)
method, when invoked, must
return null 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
only exists for compatibility with legacy Web content. When specifying a
new API, DOMRectList
must not be used. Use sequence<DOMRect>
instead. [WEBIDL]
5. The DOMQuad interface
Objects implementing the DOMQuad
interface represents a quadrilateral.
[Constructor(optional DOMPointInitp1
, optional DOMPointInitp2
, optional DOMPointInitp3
, optional DOMPointInitp4
), Exposed=(Window,Worker), Serializable] interfaceDOMQuad
{ [NewObject] static DOMQuad fromRect(optional DOMRectInitother
); [NewObject] static DOMQuad fromQuad(optional DOMQuadInitother
); [SameObject] readonly attribute DOMPoint p1; [SameObject] readonly attribute DOMPoint p2; [SameObject] readonly attribute DOMPoint p3; [SameObject] readonly attribute DOMPoint p4; [NewObject] DOMRect getBounds(); [Default] objecttoJSON
(); }; dictionaryDOMQuadInit
{ DOMPointInitp1
; DOMPointInitp2
; DOMPointInitp3
; DOMPointInitp4
; };
The following algorithms assume that DOMQuad
objects have the internal member variables point 1, point 2, point
3, and point 4, which are DOMPoint
objects. DOMQuad
must be able to access and set the value of these variables. The
author can modify these DOMPoint
objects, which directly affects the quadrilateral.
An interface returning a DOMQuad
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 DOMQuad(p1, p2, p3, p4)
constructor, when invoked, must run the following steps:
-
Let point1 be a new
DOMPoint
object with its attributes set to the values of the namesake dictionary members in p1. -
Let point2 be a new
DOMPoint
object with its attributes set to the values of the namesake dictionary members in p2. -
Let point3 be a new
DOMPoint
object with its attributes set to the values of the namesake dictionary members in p3. -
Let point4 be a new
DOMPoint
object with its attributes set to the values of the namesake dictionary members in p4. -
Return a new
DOMQuad
with point 1 set to point1, point 2 set to point2, point 3 set to point3 and point 4 set to point4.
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 fromRect(other)
static method on DOMQuad
must create a DOMQuad
from the DOMRectInit
dictionary other.
To create a DOMQuad
from
a DOMRectInit
dictionary other, follow these steps:
-
Let x, y, width and height be the value of other’s
x
,y
,width
andheight
dictionary members, respectively. -
Let point1 be a new
DOMPoint
object with x coordinate set to x, y coordinate set to y, z coordinate set to 0 and w perspective set to 1. -
Let point2 be a new
DOMPoint
object with x coordinate set to x + width, y coordinate set to y, z coordinate set to 0 and w perspective set to 1. -
Let point3 be a new
DOMPoint
object with x coordinate set to x + width, y coordinate set to y + height, z coordinate set to 0 and w perspective set to 1. -
Let point4 be a new
DOMPoint
object with x coordinate set to x, y coordinate set to y + height, z coordinate set to 0 and w perspective set to 1. -
Return a new
DOMQuad
with point 1 set to point1, point 2 set to point2, point 3 set to point3 and point 4 set to point4.
The fromQuad(other)
static method on DOMQuad
must create a DOMQuad
from the DOMQuadInit
dictionary other.
To create a DOMQuad
from
a DOMQuadInit
dictionary other, follow these steps:
-
Let point1 be the result of invoking create a
DOMPoint
from the dictionaryp1
dictionary member of other, if it exists. -
Let point2 be the result of invoking create a
DOMPoint
from the dictionaryp2
dictionary member of other, if it exists. -
Let point3 be the result of invoking create a
DOMPoint
from the dictionaryp3
dictionary member of other, if it exists. -
Let point4 be the result of invoking create a
DOMPoint
from the dictionaryp4
dictionary member of other, if it exists. -
Return a new
DOMQuad
with point 1 set to point1, point 2 set to point2, point 3 set to point3 and point 4 set to point4.
p1
attribute must return point 1.
The p2
attribute must return point 2.
The p3
attribute must return point 3.
The p4
attribute must return point 4.
The getBounds()
method, when invoked, must run the following
algorithm:
-
Let bounds be a
DOMRect
object. -
Let left be the minimum of point 1’s x coordinate, point 2’s x coordinate, point 3’s x coordinate and point 4’s x coordinate.
-
Let top be the minimum of point 1’s y coordinate, point 2’s y coordinate, point 3’s y coordinate and point 4’s y coordinate.
-
Let right be the maximum of point 1’s x coordinate, point 2’s x coordinate, point 3’s x coordinate and point 4’s x coordinate.
-
Let bottom be the maximum of point 1’s y coordinate, point 2’s y coordinate, point 3’s y coordinate and point 4’s y coordinate.
-
Set x coordinate of bounds to left, y coordinate of bounds to top, width dimension of bounds to right - left and height dimension of bounds to bottom - top.
-
Return bounds.
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: 12, y: 10}, {x: 2, y: 10});
The attribute values of the resulting DOMQuad
quad1 above are also
equivalent to the attribute values of the following DOMQuad
quad2:
var rect = new DOMRect(2, 0, 10, 10);
var quad2 = DOMQuad.fromRect(rect);
new DOMQuad({x: 40, y: 25}, {x: 180, y: 8}, {x: 210, y: 150}, {x: 10, y: 180});
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.
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(optional (DOMString or sequence<unrestricted double>)init
), Exposed=(Window,Worker), Serializable] interfaceDOMMatrixReadOnly
{ [NewObject] static DOMMatrixReadOnly fromMatrix(optional DOMMatrixInitother
); [NewObject] static DOMMatrixReadOnly fromFloat32Array(Float32Arrayarray32
); [NewObject] static DOMMatrixReadOnly fromFloat64Array(Float64Arrayarray64
); // 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 [NewObject] DOMMatrix translate(optional unrestricted doubletx
= 0, optional unrestricted doublety
= 0, optional unrestricted doubletz
= 0); [NewObject] DOMMatrix scale(optional unrestricted doublescaleX
= 1, optional unrestricted doublescaleY
, optional unrestricted doublescaleZ
= 1, optional unrestricted doubleoriginX
= 0, optional unrestricted doubleoriginY
= 0, optional unrestricted doubleoriginZ
= 0); [NewObject] DOMMatrix scaleNonUniform(optional unrestricted doublescaleX
= 1, optional unrestricted doublescaleY
= 1); [NewObject] DOMMatrix scale3d(optional unrestricted doublescale
= 1, optional unrestricted doubleoriginX
= 0, optional unrestricted doubleoriginY
= 0, optional unrestricted doubleoriginZ
= 0); [NewObject] DOMMatrix rotate(optional unrestricted doublerotX
= 0, optional unrestricted doublerotY
, optional unrestricted doublerotZ
); [NewObject] DOMMatrix rotateFromVector(optional unrestricted doublex
= 0, optional unrestricted doubley
= 0); [NewObject] DOMMatrix rotateAxisAngle(optional unrestricted doublex
= 0, optional unrestricted doubley
= 0, optional unrestricted doublez
= 0, optional unrestricted doubleangle
= 0); [NewObject] DOMMatrix skewX(optional unrestricted doublesx
= 0); [NewObject] DOMMatrix skewY(optional unrestricted doublesy
= 0); [NewObject] DOMMatrix multiply(optional DOMMatrixInitother
); [NewObject] DOMMatrix flipX(); [NewObject] DOMMatrix flipY(); [NewObject] DOMMatrix inverse(); [NewObject] DOMPoint transformPoint(optional DOMPointInitpoint
); [NewObject] Float32Array toFloat32Array(); [NewObject] Float64Array toFloat64Array(); [Exposed=Window] stringifier; [Default] objecttoJSON
(); }; [Constructor(optional (DOMString or sequence<unrestricted double>)init
), Exposed=(Window,Worker), Serializable, LegacyWindowAlias=(SVGMatrix
,WebKitCSSMatrix
)] interfaceDOMMatrix
: DOMMatrixReadOnly { [NewObject] static DOMMatrix fromMatrix(optional DOMMatrixInitother
); [NewObject] static DOMMatrix fromFloat32Array(Float32Arrayarray32
); [NewObject] static DOMMatrix fromFloat64Array(Float64Arrayarray64
); // 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(optional DOMMatrixInitother
); DOMMatrix preMultiplySelf(optional DOMMatrixInitother
); DOMMatrix translateSelf(optional unrestricted doubletx
= 0, optional unrestricted doublety
= 0, optional unrestricted doubletz
= 0); DOMMatrix scaleSelf(optional unrestricted doublescaleX
= 1, optional unrestricted doublescaleY
, optional unrestricted doublescaleZ
= 1, optional unrestricted doubleoriginX
= 0, optional unrestricted doubleoriginY
= 0, optional unrestricted doubleoriginZ
= 0); DOMMatrix scale3dSelf(optional unrestricted doublescale
= 1, optional unrestricted doubleoriginX
= 0, optional unrestricted doubleoriginY
= 0, optional unrestricted doubleoriginZ
= 0); DOMMatrix rotateSelf(optional unrestricted doublerotX
= 0, optional unrestricted doublerotY
, optional unrestricted doublerotZ
); DOMMatrix rotateFromVectorSelf(optional unrestricted doublex
= 0, optional unrestricted doubley
= 0); DOMMatrix rotateAxisAngleSelf(optional unrestricted doublex
= 0, optional unrestricted doubley
= 0, optional unrestricted doublez
= 0, optional unrestricted doubleangle
= 0); DOMMatrix skewXSelf(optional unrestricted doublesx
= 0); DOMMatrix skewYSelf(optional unrestricted doublesy
= 0); DOMMatrix invertSelf(); [Exposed=Window] DOMMatrix setMatrixValue(DOMStringtransformList
); }; dictionaryDOMMatrix2DInit
{ unrestricted doublea
; unrestricted doubleb
; unrestricted doublec
; unrestricted doubled
; unrestricted doublee
; unrestricted doublef
; unrestricted doublem11
; unrestricted doublem12
; unrestricted doublem21
; unrestricted doublem22
; unrestricted doublem41
; unrestricted doublem42
; }; dictionaryDOMMatrixInit
: DOMMatrix2DInit { unrestricted doublem13
= 0; unrestricted doublem14
= 0; unrestricted doublem23
= 0; unrestricted doublem24
= 0; unrestricted doublem31
= 0; unrestricted doublem32
= 0; unrestricted doublem33
= 1; unrestricted doublem34
= 0; unrestricted doublem43
= 0; unrestricted doublem44
= 1; booleanis2D
; };
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 is 2D. 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]
6.1. DOMMatrix2DInit and DOMMatrixInit dictionaries
To validate and fixup (2D) a DOMMatrix2DInit
or DOMMatrixInit
dictionary dict, run the following steps:
-
If if at least one of the following conditions are true for dict, then throw a
TypeError
exception and abort these steps.-
a
andm11
are both present and SameValueZero(a
,m11
) isfalse
. -
b
andm12
are both present and SameValueZero(b
,m12
) isfalse
. -
c
andm21
are both present and SameValueZero(c
,m21
) isfalse
. -
d
andm22
are both present and SameValueZero(d
,m22
) isfalse
. -
e
andm41
are both present and SameValueZero(e
,m41
) isfalse
. -
f
andm42
are both present and SameValueZero(f
,m42
) isfalse
.
-
-
If
m11
is not present then set it to the value of membera
, or value 1 ifa
is also not present. -
If
m12
is not present then set it to the value of memberb
, or value 0 ifb
is also not present. -
If
m21
is not present then set it to the value of memberc
, or value 0 ifc
is also not present. -
If
m22
is not present then set it to the value of memberd
, or value 1 ifd
is also not present. -
If
m41
is not present then set it to the value of membere
, or value 0 ife
is also not present. -
If
m42
is not present then set it to the value of memberf
, or value 0 iff
is also not present.
Note: The SameValueZero comparison algorithm returns true
for two NaN values, and also for 0 and -0. [ECMA-262]
To validate and fixup a DOMMatrixInit
dictionary dict,
run the following steps:
-
Validate and fixup (2D) dict.
-
If
is2D
istrue
and: at least one ofm13
,m14
,m23
,m24
,m31
,m32
,m34
,m43
are present with a value other than 0 or -0, or at least one ofm33
,m44
are present with a value other than 1, then throw aTypeError
exception and abort these steps. -
If
is2D
is not present and at least one ofm13
,m14
,m23
,m24
,m31
,m32
,m34
,m43
are present with a value other than 0 or -0, or at least one ofm33
,m44
are present with a value other than 1, setis2D
tofalse
. -
If
is2D
is still not present, set it totrue
.
6.2. Parsing a string into an abstract matrix
To parse a string into an abstract matrix, given a string transformList, means to run the following steps. It will either return a 4x4 abstract matrix and a boolean 2dTransform, or failure.
-
If transformList is the empty string, set it to the string "
matrix(1, 0, 0, 1, 0, 0)
". -
Parse transformList into parsedValue given the grammar for the CSS transform property. The result will be a <transform-list>, the keyword none, or failure. If parsedValue is failure, or any <transform-function> has <length> values without absolute length units, or any keyword other than none is used, then return failure. [CSS3-SYNTAX] [CSS3-TRANSFORMS]
-
If parsedValue is none, set parsedValue to a <transform-list> containing a single identity matrix.
-
Let 2dTransform track the 2D/3D dimension status of parsedValue.
- If parsedValue consists of any three-dimensional transform functions
-
Set 2dTransform to
false
. - Otherwise
-
Set 2dTransform to
true
.
-
Transform all <transform-function>s to 4x4 abstract matrices by following the “Mathematical Description of Transform Functions”. [CSS3-TRANSFORMS]
-
Let matrix be a 4x4 abstract matrix as shown in the initial figure of this section. Post-multiply all matrices from left to right and set matrix to this product.
-
Return matrix and 2dTransform.
6.3. Creating DOMMatrixReadOnly and DOMMatrix objects
To create a 2d matrix of type type being either DOMMatrixReadOnly
or DOMMatrix
, with a sequence init of 6 elements, follow these steps:
-
Let matrix be a new instance of type.
-
Set m11 element, m12 element, m21 element, m22 element, m41 element and m42 element to the values of init in order starting with the first value.
-
Set m13 element, m14 element, m23 element, m24 element, m31 element, m32 element, m34 element, and m43 element to 0.
-
Set m33 element and m44 element to 1.
-
Set is 2D to
true
. -
Return matrix
To create a 3d matrix with type being either DOMMatrixReadOnly
or DOMMatrix
, with a sequence init of 16 elements, follow these steps:
-
Let matrix be a new instance of type.
-
Set m11 element to m44 element to the values of init in column-major order.
-
Set is 2D to
false
. -
Return matrix
The DOMMatrixReadOnly(init)
and the DOMMatrix(init)
constructors
must follow these steps:
- If init is omitted
-
Return the result of invoking create a 2d matrix of type
DOMMatrixReadOnly
orDOMMatrix
as appropriate, with the sequence [1, 0, 0, 1, 0, 0]. - If init is a
DOMString
-
-
If current global object is not a
Window
object, then throw aTypeError
exception. -
Parse init into an abstract matrix, and let matrix and 2dTransform be the result. If the result is failure, then throw a "
SyntaxError
"DOMException
. -
- If 2dTransform is
true
-
Return the result of invoking create a 2d matrix of type
DOMMatrixReadOnly
orDOMMatrix
as appropriate, with a sequence of numbers, the values being the elements m11, m12, m21, m22, m41 and m42 of matrix. - Otherwise
-
Return the result of invoking create a 3d matrix of type
DOMMatrixReadOnly
orDOMMatrix
as appropriate, with a sequence of numbers, the values being the 16 elements of matrix.
- If 2dTransform is
-
- If init is a sequence with 6 elements
-
Return the result of invoking create a 2d matrix of type
DOMMatrixReadOnly
orDOMMatrix
as appropriate, with the sequence init. - If init is a sequence with 16 elements
-
Return the result of invoking create a 3d matrix of type
DOMMatrixReadOnly
orDOMMatrix
as appropriate, with the sequence init. - Otherwise
-
Throw a
TypeError
exception.
The fromMatrix(other)
static method on DOMMatrixReadOnly
must create a DOMMatrixReadOnly
from the dictionary other.
The fromMatrix(other)
static method on DOMMatrix
must create a DOMMatrix
from the dictionary other.
To create a DOMMatrixReadOnly
from a 2D dictionary other or to create a DOMMatrix
from a 2D dictionary other, follow these steps:
-
Validate and fixup (2D) other.
-
Return the result of invoking create a 2d matrix of type
DOMMatrixReadOnly
orDOMMatrix
as appropriate, with a sequence of numbers, the values being the 6 elementsm11
,m12
,m21
,m22
,m41
andm42
of other in the given order.
To create a DOMMatrixReadOnly
from a dictionary other or to create a DOMMatrix
from a dictionary other, follow these steps:
-
Validate and fixup other.
-
- If the
is2D
dictionary member of other istrue
-
Return the result of invoking create a 2d matrix of type
DOMMatrixReadOnly
orDOMMatrix
as appropriate, with a sequence of numbers, the values being the 6 elementsm11
,m12
,m21
,m22
,m41
andm42
of other in the given order. - Otherwise
-
Return the result of invoking create a 3d matrix of type
DOMMatrixReadOnly
orDOMMatrix
as appropriate, with a sequence of numbers, the values being the 16 elementsm11
,m12
,m13
, ...,m44
of other in the given order.
- If the
The fromFloat32Array(array32)
static method on DOMMatrixReadOnly
and the fromFloat32Array(array32)
static
method on DOMMatrix
must follow these steps:
- If array32 has 6 elements
-
Return the result of invoking create a 2d matrix of type
DOMMatrixReadOnly
orDOMMatrix
as appropriate, with a sequence of numbers taking the values from array32 in the provided order. - If array32 has 16 elements
-
Return the result of invoking create a 3d matrix of type
DOMMatrixReadOnly
orDOMMatrix
as appropriate, with a sequence of numbers taking the values from array32 in the provided order. - Otherwise
-
Throw a
TypeError
exception.
The fromFloat64Array(array64)
static method on DOMMatrixReadOnly
and the fromFloat64Array(array64)
static
method on DOMMatrix
must follow these steps:
- If array64 has 6 elements
-
Return the result of invoking create a 2d matrix of type
DOMMatrixReadOnly
orDOMMatrix
as appropriate, with a sequence of numbers taking the values from array64 in the provided order. - If array32 has 16 elements
-
Return the result of invoking create a 3d matrix of type
DOMMatrixReadOnly
orDOMMatrix
as appropriate, with a sequence of numbers taking the values from array64 in the provided order. - Otherwise
-
Throw a
TypeError
exception.
6.4. DOMMatrix attributes
The following attributes m11
to m44
correspond to the
16 items of the matrix interfaces.
m11
and a
attributes, on getting, must
return the m11 element value. For the DOMMatrix
interface, setting the m11
or the a
attribute must set the m11 element to
the new value.
The m12
and b
attributes, on getting, must
return the m12 element value. For the DOMMatrix
interface, setting the m12
or the b
attribute must set the m12 element to
the new value.
The m13
attribute, on getting, must return the m13
element value. For the DOMMatrix
interface, setting the m13
attribute must
set the m13 element to the new value and, if the new value is not 0 or -0, set is 2D to false
.
The m14
attribute, on getting, must return the m14
element value. For the DOMMatrix
interface, setting the m14
attribute must
set the m14 element to the new value and, if the new value is not 0 or -0, set is 2D to false
.
The m21
and c
attributes, on getting, must
return the m21 element value. For the DOMMatrix
interface, setting the m21
or the c
attribute must set the m21 element to
the new value.
The m22
and d
attributes, on getting, must
return the m22 element value. For the DOMMatrix
interface, setting the m22
or the d
attribute must set the m22 element to
the new value.
The m23
attribute, on getting, must return the m23
element value. For the DOMMatrix
interface, setting the m23
attribute must
set the m23 element to the new value and, if the new value is not 0 or -0, set is 2D to false
.
The m24
attribute, on getting, must return the m24
element value. For the DOMMatrix
interface, setting the m24
attribute must
set the m24 element to the new value and, if the new value is not 0 or -0, set is 2D to false
.
The m31
attribute, on getting, must return the m31
element value. For the DOMMatrix
interface, setting the m31
attribute must
set the m31 element to the new value and, if the new value is not 0 or -0, set is 2D to false
.
The m32
attribute, on getting, must return the m32
element value. For the DOMMatrix
interface, setting the m32
attribute must
set the m32 element to the new value and, if the new value is not 0 or -0, set is 2D to false
.
The m33
attribute, on getting, must return the m33
element value. For the DOMMatrix
interface, setting the m33
attribute must
set the m33 element to the new value and, if the new value is not 1, set is 2D to false
.
The m34
attribute, on getting, must return the m34
element value. For the DOMMatrix
interface, setting the m34
attribute must
set the m34 element to the new value and, if the new value is not 0 or -0, set is 2D to false
.
The m41
and e
attributes, on getting, must
return the m41 element value. For the DOMMatrix
interface, setting the m41
or the e
attribute must set the m41 element to
the new value.
The m42
and f
attributes, on getting, must
return the m42 element value. For the DOMMatrix
interface, setting the m42
or the f
attribute must set the m42 element to
the new value.
The m43
attribute, on getting, must return the m43
element value. For the DOMMatrix
interface, setting the m43
attribute must
set the m43 element to the new value and, if the new value is not 0 or -0, set is 2D to false
.
The m44
attribute, on getting, must return the m44
element value. For the DOMMatrix
interface, setting the m44
attribute must
set the m44 element to the new value and, if the new value is not 1, set is 2D to false
.
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 following attributes provide status information about DOMMatrixReadOnly
.
is2D
attribute must return the value of is 2D.
The isIdentity
attribute must return true
if m12 element, m13 element, m14 element, m21 element, m23 element, m24 element, m31 element, m32 element, m34 element, m41 element, m42 element, m43 element are 0 or -0 and m11 element, m22 element, m33
element, m44 element are 1. Otherwise it must return false
.
Every DOMMatrixReadOnly
object must be flagged with a boolean is 2D. This flag indicates that:
-
The current matrix was initialized as a 2D matrix. See individual creators for more details.
-
Only 2D transformation operations were applied. Each mutable or immutable transformation method defines if is 2D must be set to
false
.
Note: Is 2D 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.
6.5. Immutable transformation methods
The following methods do not modify the current matrix and return a new DOMMatrix
object.
translate(tx, ty, tz)
-
-
Let result be the resulting matrix initialized to the values of the current matrix.
-
Perform a
translateSelf()
transformation on result with the arguments tx, ty, tz. -
Return result.
The current matrix is not modified.
-
scale(scaleX, scaleY, scaleZ, originX, originY, originZ)
-
-
If scaleY is missing, set scaleY to the value of scaleX.
-
Let result be the resulting matrix initialized to the values of the current matrix.
-
Perform a
scaleSelf()
transformation on result with the arguments scaleX, scaleY, scaleZ, originX, originY, originZ. -
Return result.
The current matrix is not modified.
-
scaleNonUniform(scaleX, scaleY)
-
Note: Supported for legacy reasons to be compatible with
SVGMatrix
as defined in SVG 1.1 [SVG11]. Authors are encouraged to usescale()
instead.-
Let result be the resulting matrix initialized to the values of the current matrix.
-
Perform a
scaleSelf()
transformation on result with the arguments scaleX, scaleY, 1, 0, 0, 0. -
Return result.
The current matrix is not modified.
-
scale3d(scale, originX, originY, originZ)
-
-
Let result be the resulting matrix initialized to the values of the current matrix.
-
Perform a
scale3dSelf()
transformation on result with the arguments scale, originX, originY, originZ. -
Return result.
The current matrix is not modified.
-
rotate(rotX, rotY, rotZ)
-
-
Let result be the resulting matrix initialized to the values of the current matrix.
-
Perform a
rotateSelf()
transformation on result with the arguments rotX, rotY, rotZ. -
Return result.
The current matrix is not modified.
-
rotateFromVector(x, y)
-
-
Let result be the resulting matrix initialized to the values of the current matrix.
-
Perform a
rotateFromVectorSelf()
transformation on result with the arguments x, y. -
Return result.
The current matrix is not modified.
-
rotateAxisAngle(x, y, z, angle)
-
-
Let result be the resulting matrix initialized to the values of the current matrix.
-
Perform a
rotateAxisAngleSelf()
transformation on result with the arguments x, y, z, angle. -
Return result.
The current matrix is not modified.
-
skewX(sx)
-
-
Let result be the resulting matrix initialized to the values of the current matrix.
-
Perform a
skewXSelf()
transformation on result with the argument sx. -
Return result.
The current matrix is not modified.
-
skewY(sy)
-
-
Let result be the resulting matrix initialized to the values of the current matrix.
-
Perform a
skewYSelf()
transformation on result with the argument sy. -
Return result.
The current matrix is not modified.
-
multiply(other)
-
-
Let result be the resulting matrix initialized to the values of the current matrix.
-
Perform a
multiplySelf()
transformation on result with the argument other. -
Return result.
The current matrix is not modified.
-
flipX()
-
-
Let result be the resulting matrix initialized to the values of the current matrix.
-
Post-multiply result with
new DOMMatrix([-1, 0, 0, 1, 0, 0])
. -
Return result.
The current matrix is not modified.
-
flipY()
-
-
Let result be the resulting matrix initialized to the values of the current matrix.
-
Post-multiply result with
new DOMMatrix([1, 0, 0, -1, 0, 0])
. -
Return result.
The current matrix is not modified.
-
inverse()
-
-
Let result be the resulting matrix initialized to the values of the current matrix.
-
Perform a
invertSelf()
transformation on result. -
Return result.
The current matrix is not modified.
-
The following methods do not modify the current matrix.
transformPoint(point)
-
Let pointObject be the result of invoking create a
DOMPoint
from the dictionary point. Return the result of invoking transform a point with a matrix, given pointObject and the current matrix. The passed argument does not get modified. toFloat32Array()
-
Returns the serialized 16 elements
m11
tom44
of the current matrix in column-major order asFloat32Array
. toFloat64Array()
-
Returns the serialized 16 elements
m11
tom44
of the current matrix in column-major order asFloat64Array
. - stringification behavior
-
-
If one or more of m11 element through m44 element are a non-finite value, then throw an "
InvalidStateError
"DOMException
.Note: The CSS syntax cannot represent NaN or Infinity values.
-
Let string be the empty string.
-
If is 2D is
true
, then:-
Append "
matrix(
" to string. -
Append ! ToString(m11 element) to string.
-
Append "
,
" to string. -
Append ! ToString(m12 element) to string.
-
Append "
,
" to string. -
Append ! ToString(m21 element) to string.
-
Append "
,
" to string. -
Append ! ToString(m22 element) to string.
-
Append "
,
" to string. -
Append ! ToString(m41 element) to string.
-
Append "
,
" to string. -
Append ! ToString(m42 element) to string.
-
Append "
)
" to string.
Note: The string will be in the form of a a CSS Transforms <matrix()> function. [CSS3-TRANSFORMS]
-
-
Otherwise:
-
Append "
matrix3d(
" to string. -
Append ! ToString(m11 element) to string.
-
Append "
,
" to string. -
Append ! ToString(m12 element) to string.
-
Append "
,
" to string. -
Append ! ToString(m13 element) to string.
-
Append "
,
" to string. -
Append ! ToString(m14 element) to string.
-
Append "
,
" to string. -
Append ! ToString(m21 element) to string.
-
Append "
,
" to string. -
Append ! ToString(m22 element) to string.
-
Append "
,
" to string. -
Append ! ToString(m23 element) to string.
-
Append "
,
" to string. -
Append ! ToString(m24 element) to string.
-
Append "
,
" to string. -
Append ! ToString(m41 element) to string.
-
Append "
,
" to string. -
Append ! ToString(m42 element) to string.
-
Append "
,
" to string. -
Append ! ToString(m43 element) to string.
-
Append "
,
" to string. -
Append ! ToString(m44 element) to string.
-
Append "
)
" to string.
Note: The string will be in the form of a a CSS Transforms <matrix3d()> function. [CSS3-TRANSFORMS]
-
-
Return string.
-
var matrix = new DOMMatrix();
matrix.scaleSelf(2);
matrix.translateSelf(20,20);
console.assert(matrix.toString() ===
"matrix(2, 0, 0, 2, 40, 40)");
var matrix = new DOMMatrix();
matrix.scale3dSelf(2);
console.assert(matrix.toString() ===
"matrix3d(2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 1)");
For 3D operations, the stringifier returns a string representing a 3D matrix.
var matrix = new DOMMatrix([NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN]);
var string = matrix + " Batman!";
6.6. 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.
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 advised to use mutable transformation methods
to avoid unnecessary memory allocations due to creation of intermediate DOMMatrix
objects in
user agents.
multiplySelf(other)
-
-
Let otherObject be the result of invoking create a
DOMMatrix
from the dictionary other. -
The otherObject matrix gets post-multiplied to the current matrix.
-
If is 2D of otherObject is
false
, set is 2D of the current matrix tofalse
. -
Return the current matrix.
-
preMultiplySelf(other)
-
-
Let otherObject be the result of invoking create a
DOMMatrix
from the dictionary other. -
The otherObject matrix gets pre-multiplied to the current matrix.
-
If is 2D of otherObject is
false
, set is 2D of the current matrix tofalse
. -
Return the current matrix.
-
translateSelf(tx, ty, tz)
-
-
Post-multiply a translation transformation on the current matrix. The 3D translation matrix is described in CSS Transforms. [CSS3-TRANSFORMS]
-
If tz is specified and not 0 or -0, set is 2D of the current matrix to
false
. -
Return the current matrix.
-
scaleSelf(scaleX, scaleY, scaleZ, originX, originY, originZ)
-
-
Perform a
translateSelf()
transformation on the current matrix with the arguments originX, originY, originZ. -
If scaleY is missing, set scaleY to the value of scaleX.
-
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]
-
Negate originX, originY and originZ.
-
Perform a
translateSelf()
transformation on the current matrix with the arguments originX, originY, originZ. -
If scaleZ is not 1 or originZ is not 0 or -0, set is 2D of the current matrix to
false
. -
Return the current matrix.
-
scale3dSelf(scale, originX, originY, originZ)
-
-
Apply a
translateSelf()
transformation to the current matrix with the arguments originX, originY, originZ. -
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] -
Apply a
translateSelf()
transformation to the current matrix with the arguments -originX, -originY, -originZ. -
If scale is not 1, set is 2D of the current matrix to
false
. -
Return the current matrix.
-
rotateSelf(rotX, rotY, rotZ)
-
-
If rotY and rotZ are both missing, set rotZ to the value of rotX and set rotX and rotY to 0.
-
If rotY is still missing, set rotY to 0.
-
If rotZ is still missing, set rotZ to 0.
-
If rotX or rotY are not 0 or -0, set is 2D of the current matrix to
false
. -
Post-multiply a rotation transformation on the current matrix around the vector 0, 0, 1 by the specified rotation rotZ in degrees. The 3D rotation matrix is described in CSS Transforms with alpha = rotZ in degrees. [CSS3-TRANSFORMS]
-
Post-multiply a rotation transformation on the current matrix around the vector 0, 1, 0 by the specified rotation rotY in degrees. The 3D rotation matrix is described in CSS Transforms with alpha = rotY in degrees. [CSS3-TRANSFORMS]
-
Post-multiply a rotation transformation on the current matrix around the vector 1, 0, 0 by the specified rotation rotX in degrees. The 3D rotation matrix is described in CSS Transforms with alpha = rotX in degrees. [CSS3-TRANSFORMS]
-
Return the current matrix.
-
rotateFromVectorSelf(x, y)
-
-
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 0 or -0, the angle is specified as 0. 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] -
Return the current matrix.
-
rotateAxisAngleSelf(x, y, z, angle)
-
-
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]
-
If x or y are not 0 or -0, set is 2D of the current matrix to
false
. -
Return the current matrix.
-
skewXSelf(sx)
-
-
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]
-
Return the current matrix.
-
skewYSelf(sy)
-
-
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]
-
Return the current matrix.
-
invertSelf()
-
-
Invert the current matrix.
-
If the current matrix is not invertible set all attributes to NaN and set is 2D to
false
. -
Return the current matrix.
-
setMatrixValue(transformList)
-
-
Parse transformList into an abstract matrix, and let matrix and 2dTransform be the result. If the result is failure, then throw a "
SyntaxError
"DOMException
. -
Set is 2D to the value of 2dTransform.
-
Set m11 element through m44 element to the element values of matrix in column-major order.
-
Return the current matrix.
-
7. Structured serialization
DOMPointReadOnly
, DOMPoint
, DOMRectReadOnly
, DOMRect
, DOMQuad
, DOMMatrixReadOnly
, and DOMMatrix
objects are serializable objects. [HTML]
The serialization steps for DOMPointReadOnly
and DOMPoint
, given value and serialized, are:
-
Set serialized.[[X]] to value’s x coordinate.
-
Set serialized.[[Y]] to value’s y coordinate.
-
Set serialized.[[Z]] to value’s z coordinate.
-
Set serialized.[[W]] to value’s w perspective.
Their deserialization steps, given serialized and value, are:
-
Set value’s x coordinate to serialized.[[X]].
-
Set value’s y coordinate to serialized.[[Y]].
-
Set value’s z coordinate to serialized.[[Z]].
-
Set value’s w perspective to serialized.[[W]].
The serialization steps for DOMRectReadOnly
and DOMRect
, given value and serialized, are:
-
Set serialized.[[X]] to value’s x coordinate.
-
Set serialized.[[Y]] to value’s y coordinate.
-
Set serialized.[[Width]] to value’s width dimension.
-
Set serialized.[[Height]] to value’s height dimension.
Their deserialization steps, given serialized and value, are:
-
Set value’s x coordinate to serialized.[[X]].
-
Set value’s y coordinate to serialized.[[Y]].
-
Set value’s width dimension to serialized.[[Width]].
-
Set value’s height dimension to serialized.[[Height]].
The serialization steps for DOMQuad
, given value and serialized, are:
-
Set serialized.[[P1]] to the sub-serialization of value’s point 1.
-
Set serialized.[[P2]] to the sub-serialization of value’s point 2.
-
Set serialized.[[P3]] to the sub-serialization of value’s point 3.
-
Set serialized.[[P4]] to the sub-serialization of value’s point 4.
Their deserialization steps, given serialized and value, are:
-
Set value’s point 1 to the sub-deserialization of serialized.[[P1]].
-
Set value’s point 2 to the sub-deserialization of serialized.[[P2]].
-
Set value’s point 3 to the sub-deserialization of serialized.[[P3]].
-
Set value’s point 4 to the sub-deserialization of serialized.[[P4]].
The serialization steps for DOMMatrixReadOnly
and DOMMatrix
, given value and serialized, are:
-
If value’s is 2D is
true
:-
Set serialized.[[M11]] to value’s m11 element.
-
Set serialized.[[M12]] to value’s m12 element.
-
Set serialized.[[M21]] to value’s m21 element.
-
Set serialized.[[M22]] to value’s m22 element.
-
Set serialized.[[M41]] to value’s m41 element.
-
Set serialized.[[M42]] to value’s m42 element.
-
Set serialized.[[Is2D]] to
true
.
Note: It is possible for a 2D
DOMMatrix
orDOMMatrixReadOnly
to have -0 for some of the other elements, e.g., the m13 element, which will not be roundtripped by this algorithm. -
-
Otherwise:
-
Set serialized.[[M11]] to value’s m11 element.
-
Set serialized.[[M12]] to value’s m12 element.
-
Set serialized.[[M13]] to value’s m13 element.
-
Set serialized.[[M14]] to value’s m14 element.
-
Set serialized.[[M21]] to value’s m21 element.
-
Set serialized.[[M22]] to value’s m22 element.
-
Set serialized.[[M23]] to value’s m23 element.
-
Set serialized.[[M24]] to value’s m24 element.
-
Set serialized.[[M31]] to value’s m31 element.
-
Set serialized.[[M32]] to value’s m32 element.
-
Set serialized.[[M33]] to value’s m33 element.
-
Set serialized.[[M34]] to value’s m34 element.
-
Set serialized.[[M41]] to value’s m41 element.
-
Set serialized.[[M42]] to value’s m42 element.
-
Set serialized.[[M43]] to value’s m43 element.
-
Set serialized.[[M44]] to value’s m44 element.
-
Set serialized.[[Is2D]] to
false
.
Their deserialization steps, given serialized and value, are:
-
If serialized.[[Is2D]] is
true
:-
Set value’s m11 element to serialized.[[M11]].
-
Set value’s m12 element to serialized.[[M12]].
-
Set value’s m13 element to 0.
-
Set value’s m14 element to 0.
-
Set value’s m21 element to serialized.[[M21]].
-
Set value’s m22 element to serialized.[[M22]].
-
Set value’s m23 element to 0.
-
Set value’s m24 element to 0.
-
Set value’s m31 element to 0.
-
Set value’s m32 element to 0.
-
Set value’s m33 element to 1.
-
Set value’s m34 element to 0.
-
Set value’s m41 element to serialized.[[M41]].
-
Set value’s m42 element to serialized.[[M42]].
-
Set value’s m43 element to 0.
-
Set value’s m44 element to 1.
-
Set value’s is 2D to
true
.
-
-
Otherwise:
-
Set value’s m11 element to serialized.[[M11]].
-
Set value’s m12 element to serialized.[[M12]].
-
Set value’s m13 element to serialized.[[M13]].
-
Set value’s m14 element to serialized.[[M14]].
-
Set value’s m21 element to serialized.[[M21]].
-
Set value’s m22 element to serialized.[[M22]].
-
Set value’s m23 element to serialized.[[M23]].
-
Set value’s m24 element to serialized.[[M24]].
-
Set value’s m31 element to serialized.[[M31]].
-
Set value’s m32 element to serialized.[[M32]].
-
Set value’s m33 element to serialized.[[M33]].
-
Set value’s m34 element to serialized.[[M34]].
-
Set value’s m41 element to serialized.[[M41]].
-
Set value’s m42 element to serialized.[[M42]].
-
Set value’s m43 element to serialized.[[M43]].
-
Set value’s m44 element to serialized.[[M44]].
-
Set value’s is 2D to
false
.
-
-
8. Privacy and Security Considerations
The DOMMatrix
and DOMMatrixReadOnly
interfaces have entry-points to parsing a string with
CSS syntax. Therefore the privacy and
security considerations of the CSS Syntax specification applies. [CSS3-SYNTAX]
There are no other known security or privacy impacts of the interfaces defined in this specification. However, other specifications that have APIs that use the interfaces defined in this specification could potentially introduce security or privacy issues.
getBoundingClientRect()
API defined in CSSOM View returns a DOMRect
that could be used to measure the size of an inline element containing some text of a
particular font, which exposes information about whether the user has that font installed. That
information, if used to test many common fonts, can then be personally-identifiable information. [CSSOM-VIEW] 9. Historical
This section is non-normative.
The interfaces in this specification are intended to replace earlier similar interfaces found in various specifications as well as proprietary interfaces found in some user agents. This section attempts to enumerate these interfaces.
9.1. CSSOM View
Earlier revisions of CSSOM View defined a ClientRect
interface, which is replaced by DOMRect
. Implementations conforming to this specification will not support ClientRect
. [CSSOM-VIEW]
9.2. SVG
Earlier revisions of SVG defined SVGPoint
, SVGRect
, SVGMatrix
, which are defined in
this specifications as aliases to DOMPoint
, DOMRect
, DOMMatrix
, respectively. [SVG11]
9.3. Non-standard
Some user agents supported a WebKitPoint
interface. Implementations conforming to
this specification will not support WebKitPoint
.
Several user agents supported a WebKitCSSMatrix
interface, which is also widely used on the
Web. It is defined in this specification as an alias to DOMMatrix
.
Some user agents supported a MSCSSMatrix
interface. Implementations conforming to
this specification will not support MSCSSMatrix
.
Changes since last publication
This section is non-normative.
The following changes were made since the 25 November 2014 Candidate Recommendation.
-
Changed the interfaces to generally use specific static operations for construction instead of using overloaded constructors, and made the interfaces more consistent. However,
DOMMatrix
still uses an overloaded constructor for compatibility withWebKitCSSMatrix
. -
Introduced the
DOMMatrixInit
dictionary. -
Added JSON serializers for the interfaces.
-
Changed
DOMMatrixReadOnly
andDOMMatrix
to be compatible withWebKitCSSMatrix
:-
Changed
rotate()
androtateSelf()
arguments from(angle, originX, originY)
to(rotX, rotY, rotZ)
. -
Changed the
scale()
andscaleSelf()
methods to be more like the previousscaleNonUniform()
/scaleNonUniformSelf()
methods, and dropped thescaleNonUniformSelf()
method. Keep support forscaleNonUniform()
for legacy reasons. -
Made all arguments optional for
DOMMatrix
/DOMMatrixReadOnly
methods, except forsetMatrixValue()
. -
Added no-argument constructor.
-
Defined
WebKitCSSMatrix
to be a legacy window alias forDOMMatrix
.
-
-
In workers,
DOMMatrix
andDOMMatrixReadOnly
do not support parsing or stringifying with CSS syntax. -
Defined structured serialization of the interfaces.
-
The live
bounds
attribute onDOMQuad
was replaced with a non-livegetBounds()
method. The "associated bounding rectangle" concept was also removed. -
Changed the string parser for
DOMMatrix
andDOMMatrixReadOnly
to use CSS rules instead of SVG rules. -
The stringifier for
DOMMatrix
andDOMMatrixReadOnly
now throws if there are non-finite values, and otherwise uses the ToString algorithm. [ECMA-262] -
Made comparisons treat 0 and -0 as equal throughout.
-
Added §8 Privacy and Security Considerations and §9 Historical sections.
The following changes were made since the 18 September 2014 Working Draft.
-
Exposed
DOMPointReadOnly
,DOMPoint
,DOMRectReadOnly
,DOMRect
,DOMQuad
,DOMMatrixReadOnly
andDOMMatrix
toWindow
andWorker
. Defined cloning of the interface.
The following changes were made since the 26 June 2014 Last Call Public Working Draft.
-
DOMPointReadOnly
got a constructor taking 4 arguments. -
DOMRectReadOnly
got a constructor taking 4 arguments. -
DOMMatrixReadOnly
got a constructor taking a sequence of numbers as argument. -
DOMRectList
turned to an ArrayClass. The interfaces can just be used for legacy interfaces. -
Put
DOMRectList
on at-Risk awaiting browser feedback. -
All interfaces are described in the sense of internal elements to describe the read-only/writable and inheriting behavior.
-
Replace
IndexSizeError
exception withTypeError
.
The following changes were made since the 22 May 2014 First Public Working Draft.
-
Renamed mutable transformation methods *By to *Self. (E.g.
translateBy()
got renamed totranslateSelf()
.) -
Renamed
invert()
toinvertSelf()
. -
Added
setMatrixValue()
which takes a transformation list asDOMString
. -
is2D
andisIdentity
are read-only attributes now. -
DOMMatrixReadOnly
gets flagged to track 3D transformation and attribute settings foris2D
. -
invertSelf()
andinverse()
do not throw exceptions anymore.
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 Adenilson Cavalcanti, Benoit Jacob, Boris Zbarsky, Brian Birtles, Cameron McCormack, Domenic Denicola, Kari Pihkala, Max Vujovic, Mike Taylor, Peter Hall, Philip Jägenstedt, Simon Fraser, and Timothy Loh for their careful reviews, comments, and corrections.