几何接口模块 1 级

W3C 候选推荐,

本版本:
https://www.w3.org/TR/2018/CR-geometry-1-20181204/
最新发布版本:
https://www.w3.org/TR/geometry-1/
编辑草案:
https://drafts.fxtf.org/geometry/
历史版本:
测试套件:
http://test.csswg.org/suites/geometry-1_dev/nightly-unstable/
编辑者:
Adobe 公司
Google 公司
前任编辑者:
Opera Software AS
Magic Leap
问题追踪:
GitHub 问题

摘要

本规范提供了基础的几何接口,用于表示点、矩形、四边形和变换矩阵,供其他模块或规范使用。

CSS 是一种用于描述结构化文档(如 HTML 和 XML)在屏幕、纸张、语音等介质上渲染方式的语言。

本文档状态

本节描述了本文档在发布时的状态。其他文档可能会取代本文件。当前 W3C 出版物列表及本技术报告的最新修订版可在 W3C 技术报告索引 https://www.w3.org/TR/ 中找到。

本文档由 CSS 工作组 作为候选推荐标准(Candidate Recommendation)发布。本文档计划成为 W3C 推荐标准。本文档将在 之后至少保留候选推荐状态,以确保有足够的时间进行广泛评审。

讨论本规范建议优先使用 GitHub Issues。 提交 issue 时,请在标题中包含“geometry”一词,建议格式如下:“[geometry] …意见摘要…”。 所有问题和评论都会被 归档,同时还有一个历史归档

已提供初步实现报告

作为候选推荐发布并不意味着 W3C 会员的认可。本文档为草案,可能随时被更新、替换或废弃。除作为进行中的工作外,不应将本文档作为其他用途引用。

本文档由遵循W3C 专利政策的工作组编写。 W3C 维护着一份相关专利公开的公开列表, 该页面也包含专利披露说明。 任何个人如果知晓某项专利包含必要声明,必须按照W3C 专利政策第 6 节进行披露。

本文档受 2018 年 2 月 1 日 W3C 流程文件 约束。

近期草案的变更,请参见变更章节。

1. 简介

本节为非规范性内容。

本规范描述了若干用于表示点、矩形、四边形以及维度为 3x2 和 4x4 的变换矩阵的几何接口。

SVG 接口 SVGPointSVGRectSVGMatrix 在此处定义的接口上创建了别名,以兼容 SVG、Canvas 2D Context 和 CSS 变换常用接口。 [SVG11] [HTML] [CSS3-TRANSFORMS]

2. DOMPoint 接口

一个二维或三维的 可以通过下列 WebIDL 接口表示:

[Constructor(optional unrestricted double x = 0, optional unrestricted double y = 0,
             optional unrestricted double z = 0, optional unrestricted double w = 1),
 Exposed=(Window,Worker),
 Serializable]
interface DOMPointReadOnly {
    [NewObject] static DOMPointReadOnly fromPoint(optional DOMPointInit other);

    readonly attribute unrestricted double x;
    readonly attribute unrestricted double y;
    readonly attribute unrestricted double z;
    readonly attribute unrestricted double w;

    DOMPoint matrixTransform(optional DOMMatrixInit matrix);

    [Default] object toJSON();
};

[Constructor(optional unrestricted double x = 0, optional unrestricted double y = 0,
             optional unrestricted double z = 0, optional unrestricted double w = 1),
 Exposed=(Window,Worker),
 Serializable,
 LegacyWindowAlias=SVGPoint]
interface DOMPoint : DOMPointReadOnly {
    [NewObject] static DOMPoint fromPoint(optional DOMPointInit other);

    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;
};

下列算法假定 DOMPointReadOnly 对象具有内部成员变量 x coordinatey coordinatez coordinatew perspectiveDOMPointReadOnly 以及继承该接口的 DOMPoint 必须能够访问并设置这些变量的值。

通过属性或函数返回 DOMPointReadOnly 对象的接口可能能够修改内部成员变量值。此类接口必须在正文中明确说明该能力。

内部成员变量不得以任何方式被暴露。

DOMPointReadOnly(x, y, z, w)DOMPoint(x, y, z, w) 构造函数在调用时,必须执行以下步骤:

  1. point 为一个新的 DOMPointReadOnly 或者相应的 DOMPoint 对象。

  2. point 的变量 x coordinate 设为 xy coordinate 设为 yz coordinate 设为 z,以及将 w perspective 设为 w

  3. 返回 point

fromPoint(other) 静态方法在 DOMPointReadOnly 上必须 从字典创建一个 DOMPointReadOnly,使用 other

fromPoint(other) 静态方法在 DOMPoint 上必须 从字典创建一个 DOMPoint,使用 other

从字典创建一个 DOMPointReadOnly other,或者要 从字典创建一个 DOMPoint other,请按以下步骤操作:

  1. point 为一个新的 DOMPointReadOnly 或相应的 DOMPoint 对象。

  2. point 的变量 x coordinate 设为 other 的字典成员 x,将 y coordinate 设为 other 的字典成员 y,将 z coordinate 设为 other 的字典成员 z,以及将 w perspective 设为 other 的字典成员 w

  3. 返回 point

属性 x 在获取时,必须返回 x coordinate 的值。对于 DOMPoint 接口,设置属性 x 必须将 x coordinate 设为新值。

属性 y 在获取时,必须返回 y coordinate 的值。对于 DOMPoint 接口,设置属性 y 必须将 y coordinate 设为新值。

属性 z 在获取时,必须返回 z coordinate 的值。对于 DOMPoint 接口,设置属性 z 必须将 z coordinate 设为新值。

属性 w 在获取时,必须返回 w perspective 的值。对于 DOMPoint 接口,设置属性 w 必须将 w perspective 设为新值。

方法 matrixTransform(matrix) 在调用时,必须执行以下步骤:

  1. matrixObject 为调用 从字典创建一个 DOMMatrix(使用 matrix) 的结果。

  2. 返回调用 用矩阵变换点(以当前点和 matrixObject 为参数)的结果。当前点不会被修改。

在此示例中,matrixTransform() 方法 在一个 DOMPoint 实例上被调用,并以一个 DOMMatrix 实例作为参数。
var point = new DOMPoint(5, 4);
var matrix = new DOMMatrix([2, 0, 0, 2, 10, 10]);
var transformedPoint = point.matrixTransform(matrix);

变量 point 被设置为一个新的 DOMPoint 对象,其 x coordinate 初始化为 5,y coordinate 初始化为 4。该新的 DOMPoint 现在被按 matrix 进行缩放并平移。结果的 transformedPointx coordinate 为 20,y coordinate 为 18。

2.1. 用矩阵变换点

矩阵 变换一个 ,给定 pointmatrix

  1. xpointx coordinate

  2. ypointy coordinate

  3. zpointz coordinate

  4. wpointw perspective

  5. pointVector 为一个新的列向量,其元素分别为 xyzw

    x y z w
  6. pointVector 设置为 pointVectormatrix 后乘 的结果。

  7. transformedPoint 为一个新的 DOMPoint 对象。

  8. transformedPointx coordinate 设为 pointVector 的第一个元素。

  9. transformedPointy coordinate 设为 pointVector 的第二个元素。

  10. transformedPointz coordinate 设为 pointVector 的第三个元素。

  11. transformedPointw perspective 设为 pointVector 的第四个元素。

  12. 返回 transformedPoint

注:如果 matrixis 2D 为真,pointz coordinate0-0,且 pointw perspective1,那么这是一个二维变换。否则这是一个三维变换。

3. DOMRect 接口

实现 DOMRectReadOnly 接口的对象表示一个 矩形

矩形 具有如下属性:

origin(原点)

当矩形的 width dimension(宽度) 为非负时,矩形的水平方向原点为左边缘;否则为右边缘。类似地,当矩形的 height dimension(高度) 为非负时,矩形的垂直方向原点为顶部;否则为底部。

x coordinate

视口左边缘与矩形的 origin(原点) 之间的水平距离。

y coordinate

视口顶部与矩形的 origin(原点) 之间的垂直距离。

width dimension

矩形的宽度。可以为负。

height dimension

矩形的高度。可以为负。

[Constructor(optional unrestricted double x = 0, optional unrestricted double y = 0,
             optional unrestricted double width = 0, optional unrestricted double height = 0),
 Exposed=(Window,Worker),
 Serializable]
interface DOMRectReadOnly {
    [NewObject] static DOMRectReadOnly fromRect(optional DOMRectInit other);

    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;

    [Default] object toJSON();
};

[Constructor(optional unrestricted double x = 0, optional unrestricted double y = 0,
             optional unrestricted double width = 0, optional unrestricted double height = 0),
 Exposed=(Window,Worker),
 Serializable,
 LegacyWindowAlias=SVGRect]
interface DOMRect : DOMRectReadOnly {
    [NewObject] static DOMRect fromRect(optional DOMRectInit other);

    inherit attribute unrestricted double x;
    inherit attribute unrestricted double y;
    inherit attribute unrestricted double width;
    inherit attribute unrestricted double height;
};

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

下列算法假定 DOMRectReadOnly 对象具有内部成员变量 x coordinatey coordinatewidth dimensionheight dimensionDOMRectReadOnly 以及继承该接口的 DOMRect 必须能够访问并设置这些变量的值。

通过属性或函数返回 DOMRectReadOnly 对象的接口可能能够修改内部成员变量值。此类接口必须在正文中明确说明该能力。

内部成员变量不得以任何方式被暴露。

DOMRectReadOnly(x, y, width, height)DOMRect(x, y, width, height) 构造函数在调用时,必须运行以下步骤:

  1. rect 为一个新的 DOMRectReadOnly 或相应的 DOMRect 对象。

  2. rect 的内部变量 x coordinate 设为 xy coordinate 设为 ywidth dimension 设为 width,以及 height dimension 设为 height

  3. 返回 rect

fromRect(other) 静态方法在 DOMRectReadOnly 上,必须 从字典创建一个 DOMRectReadOnly,使用 other

fromRect(other) 静态方法在 DOMRect 上,必须 从字典创建一个 DOMRect,使用 other

从字典创建一个 DOMRectReadOnly other,或要 从字典创建一个 DOMRect other,请遵循以下步骤:

  1. rect 为一个新的 DOMRectReadOnly 或相应的 DOMRect 对象。

  2. rect 的内部变量 x coordinate 设为 other 的字典成员 x,将 y coordinate 设为 other 的字典成员 y,将 width dimension 设为 other 的字典成员 width,以及将 height dimension 设为 other 的字典成员 height

  3. 返回 rect

x 属性在获取时必须返回 x coordinate 的值。对于 DOMRect 接口,设置 x 属性必须将 x coordinate 设为新值。

y 属性在获取时必须返回 y coordinate 的值。对于 DOMRect 接口,设置 y 属性必须将 y coordinate 设为新值。

width 属性在获取时必须返回 width dimension 的值。对于 DOMRect 接口,设置 width 属性必须将 width dimension 设为新值。

height 属性在获取时必须返回 height dimension 的值。对于 DOMRect 接口,设置 height 属性必须将 height dimension 设为新值。

top 属性在获取时必须返回 min(y coordinate, y coordinate + height dimension)。

right 属性在获取时必须返回 max(x coordinate, x coordinate + width dimension)。

bottom 属性在获取时必须返回 max(y coordinate, y coordinate + height dimension)。

left 属性在获取时必须返回 min(x coordinate, x coordinate + width dimension)。

4. DOMRectList 接口

interface DOMRectList {
    readonly attribute unsigned long length;
    getter DOMRect? item(unsigned long index);
};

length 属性必须返回与该对象关联的 DOMRect 对象的总数。

item(index) 方法在调用时,当 index 大于或等于与 DOMRect 对象数量时,必须返回 null。否则,必须返回位于 indexDOMRect 对象。索引从零开始。

DOMRectList 仅为与遗留 Web 内容兼容而存在。在指定新 API 时,不应使用 DOMRectList。应改用 sequence<DOMRect>[WEBIDL]

5. DOMQuad 接口

实现 DOMQuad 接口的对象表示一个 四边形

[Constructor(optional DOMPointInit p1, optional DOMPointInit p2,
             optional DOMPointInit p3, optional DOMPointInit p4),
 Exposed=(Window,Worker),
 Serializable]
interface DOMQuad {
    [NewObject] static DOMQuad fromRect(optional DOMRectInit other);
    [NewObject] static DOMQuad fromQuad(optional DOMQuadInit other);

    [SameObject] readonly attribute DOMPoint p1;
    [SameObject] readonly attribute DOMPoint p2;
    [SameObject] readonly attribute DOMPoint p3;
    [SameObject] readonly attribute DOMPoint p4;
    [NewObject] DOMRect getBounds();

    [Default] object toJSON();
};

dictionary DOMQuadInit {
  DOMPointInit p1;
  DOMPointInit p2;
  DOMPointInit p3;
  DOMPointInit p4;
};

下列算法假定 DOMQuad 对象具有内部成员变量 point 1point 2point 3point 4,它们是 DOMPoint 对象。DOMQuad 必须能够访问并设置这些变量的值。作者可以修改这些 DOMPoint 对象,从而直接影响四边形。

通过属性或函数返回 DOMQuad 对象的接口可能能够修改内部成员变量值。此类接口必须在正文中明确说明该能力。

内部成员变量不得以任何方式被暴露。

DOMQuad(p1, p2, p3, p4) 构造函数在调用时,必须运行以下步骤:

  1. point1 为一个新的 DOMPoint 对象,其属性设置为 p1 字典成员的同名值。

  2. point2 为一个新的 DOMPoint 对象,其属性设置为 p2 字典成员的同名值。

  3. point3 为一个新的 DOMPoint 对象,其属性设置为 p3 字典成员的同名值。

  4. point4 为一个新的 DOMPoint 对象,其属性设置为 p4 字典成员的同名值。

  5. 返回一个新的 DOMQuad,其中 point 1 设置为 point1point 2 设置为 point2point 3 设置为 point3,以及 point 4 设置为 point4

注: 也可以传递 DOMPoint / DOMPointReadOnly 类型的参数。传入的参数将根据 WebIDL 规则在内部转换为正确的对象类型。 [WEBIDL]

fromRect(other) 静态方法在 DOMQuad 上,必须 从 DOMRectInit 字典创建一个 DOMQuad,使用 other

从 DOMRectInit 字典创建一个 DOMQuad other,请遵循以下步骤:

  1. x, y, widthheight 分别为 other 的字典成员 x, y, widthheight 的值。

  2. point1 为一个新的 DOMPoint 对象,其 x coordinate 设为 xy coordinate 设为 yz coordinate 设为 0,以及 w perspective 设为 1

  3. point2 为一个新的 DOMPoint 对象,其 x coordinate 设为 x + widthy coordinate 设为 yz coordinate 设为 0,以及 w perspective 设为 1

  4. point3 为一个新的 DOMPoint 对象,其 x coordinate 设为 x + widthy coordinate 设为 y + heightz coordinate 设为 0,以及 w perspective 设为 1

  5. point4 为一个新的 DOMPoint 对象,其 x coordinate 设为 xy coordinate 设为 y + heightz coordinate 设为 0,以及 w perspective 设为 1

  6. 返回一个新的 DOMQuad,其 point 1 设为 point1point 2 设为 point2point 3 设为 point3,以及 point 4 设为 point4

fromQuad(other) 静态方法在 DOMQuad 上,必须 从 DOMQuadInit 字典创建一个 DOMQuad,使用 other

从 DOMQuadInit 字典创建一个 DOMQuad other,请遵循以下步骤:

  1. point1 为调用 从字典创建一个 DOMPoint(如果存在)对 p1 字典成员 的结果。

  2. point2 为调用 从字典创建一个 DOMPoint(如果存在)对 p2 字典成员 的结果。

  3. point3 为调用 从字典创建一个 DOMPoint(如果存在)对 p3 字典成员 的结果。

  4. point4 为调用 从字典创建一个 DOMPoint(如果存在)对 p4 字典成员 的结果。

  5. 返回一个新的 DOMQuad,其 point 1 设为 point1point 2 设为 point2point 3 设为 point3,以及 point 4 设为 point4

p1 属性必须返回 point 1

p2 属性必须返回 point 2

p3 属性必须返回 point 3

p4 属性必须返回 point 4

getBounds() 方法在调用时必须运行以下算法:

  1. bounds 为一个 DOMRect 对象。

  2. leftpoint 1x coordinatepoint 2x coordinatepoint 3x coordinatepoint 4x coordinate 的最小值。

  3. toppoint 1y coordinatepoint 2y coordinatepoint 3y coordinatepoint 4y coordinate 的最小值。

  4. rightpoint 1x coordinatepoint 2x coordinatepoint 3x coordinatepoint 4x coordinate 的最大值。

  5. bottompoint 1y coordinatepoint 2y coordinatepoint 3y coordinatepoint 4y coordinate 的最大值。

  6. x 坐标bounds 设为 left,将 y 坐标bounds 设为 top,将 宽度 尺度bounds 设为 right - left,将 高度 尺度bounds 设为 bottom - top

  7. 返回 bounds

在此示例中,DOMQuad 构造函数以类型为 DOMPointDOMPointInit 的参数被调用。两种参数都被接受并可使用。
var point = new DOMPoint(2, 0);
var quad1 = new DOMQuad(point, {x: 12, y: 0}, {x: 12, y: 10}, {x: 2, y: 10});

上面得到的 DOMQuad 变量 quad1 的属性值也等同于下面构造的 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});
一个由 DOMQuad 表示的不规则四边形。四个红色圆点表示属性 DOMPointp1p4。虚线矩形表示 getBounds() 方法返回的包围矩形。

6. DOMMatrix 接口

DOMMatrixDOMMatrixReadOnly 接口各自表示一个数学上的 矩阵,用于在图形上下文中描述变换。下列各节描述了该接口的详细信息。

m 11 m 21 m 31 m 41 m 12 m 22 m 32 m 42 m 13 m 23 m 33 m 43 m 14 m 24 m 34 m 44
一个带有元素 m11m444x4 抽象矩阵

在下列各节中,术语具有如下含义:

后乘(post-multiply)

A 被项 B 后乘等于 A · B

前乘(pre-multiply)

A 被项 B 前乘等于 B · A

相乘(multiply)

将项 A 与项 B 相乘等于 A · B

[Constructor(optional (DOMString or sequence<unrestricted double>) init),
 Exposed=(Window,Worker),
 Serializable]
interface DOMMatrixReadOnly {
    [NewObject] static DOMMatrixReadOnly fromMatrix(optional DOMMatrixInit other);
    [NewObject] static DOMMatrixReadOnly fromFloat32Array(Float32Array array32);
    [NewObject] static DOMMatrixReadOnly fromFloat64Array(Float64Array array64);

    // 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 double tx = 0,
                                    optional unrestricted double ty = 0,
                                    optional unrestricted double tz = 0);
    [NewObject] DOMMatrix scale(optional unrestricted double scaleX = 1,
                                optional unrestricted double scaleY,
                                optional unrestricted double scaleZ = 1,
                                optional unrestricted double originX = 0,
                                optional unrestricted double originY = 0,
                                optional unrestricted double originZ = 0);
    [NewObject] DOMMatrix scaleNonUniform(optional unrestricted double scaleX = 1,
                                          optional unrestricted double scaleY = 1);
    [NewObject] DOMMatrix scale3d(optional unrestricted double scale = 1,
                                  optional unrestricted double originX = 0,
                                  optional unrestricted double originY = 0,
                                  optional unrestricted double originZ = 0);
    [NewObject] DOMMatrix rotate(optional unrestricted double rotX = 0,
                                 optional unrestricted double rotY,
                                 optional unrestricted double rotZ);
    [NewObject] DOMMatrix rotateFromVector(optional unrestricted double x = 0,
                                           optional unrestricted double y = 0);
    [NewObject] DOMMatrix rotateAxisAngle(optional unrestricted double x = 0,
                                          optional unrestricted double y = 0,
                                          optional unrestricted double z = 0,
                                          optional unrestricted double angle = 0);
    [NewObject] DOMMatrix skewX(optional unrestricted double sx = 0);
    [NewObject] DOMMatrix skewY(optional unrestricted double sy = 0);
    [NewObject] DOMMatrix multiply(optional DOMMatrixInit other);
    [NewObject] DOMMatrix flipX();
    [NewObject] DOMMatrix flipY();
    [NewObject] DOMMatrix inverse();

    [NewObject] DOMPoint transformPoint(optional DOMPointInit point);
    [NewObject] Float32Array toFloat32Array();
    [NewObject] Float64Array toFloat64Array();

    [Exposed=Window] stringifier;
    [Default] object toJSON();
};

下列算法假定 DOMMatrixReadOnly 对象具有内部成员变量 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 以及继承该接口的 DOMMatrix 必须能够访问并设置这些变量的值。

通过属性或函数返回 DOMMatrixReadOnly 对象的接口可能能够修改内部成员变量值。此类接口必须在正文中明确说明该能力。

内部成员变量不得以任何方式被暴露。

DOMMatrixDOMMatrixReadOnly 接口取代了来自 SVG 的 SVGMatrix 接口。 [SVG11]

6.1. DOMMatrix2DInit 和 DOMMatrixInit 字典

要对一个 DOMMatrix2DInitDOMMatrixInit 字典 dict 进行 验证并修正(2D),请运行下列步骤:

  1. 如果 dict 满足下列至少一项条件,则抛出一个 TypeError 异常并中止这些步骤。

  2. 如果 m11 不存在,则将其设置为成员 a 的值, 若 a 也不存在,则设为值 1

  3. 如果 m12 不存在,则将其设置为成员 b 的值, 若 b 也不存在,则设为值 0

  4. 如果 m21 不存在,则将其设置为成员 c 的值, 若 c 也不存在,则设为值 0

  5. 如果 m22 不存在,则将其设置为成员 d 的值, 若 d 也不存在,则设为值 1

  6. 如果 m41 不存在,则将其设置为成员 e 的值, 若 e 也不存在,则设为值 0

  7. 如果 m42 不存在,则将其设置为成员 f 的值, 若 f 也不存在,则设为值 0

注: SameValueZero 比较算法对两个 NaN 值返回 true,并且对于 0-0 也返回 true[ECMA-262]

要对一个 DOMMatrixInit 字典 dict 进行 验证并修正,请运行下列步骤:

  1. dict 执行 验证并修正(2D)

  2. 如果 is2Dtrue,并且:下列任一成员 m13m14m23m24m31m32m34m43 的值存在且不为 0-0,或者下列任一成员 m33m44 的值存在且不为 1,则抛出一个 TypeError 异常并中止这些步骤。

  3. 如果 is2D 未出现并且下列任一成员 m13m14m23m24m31m32m34m43 的值存在且不为 0-0,或者下列任一成员 m33m44 的值存在且不为 1,则将 is2D 设为 false

  4. 如果 is2D 仍然未出现,则将其设置为 true

6.2. 将字符串解析为抽象矩阵

要将字符串 transformList 解析为抽象矩阵,意味着运行下列步骤。它将返回一个 4x4 抽象矩阵 和一个布尔值 2dTransform,或者返回失败。

  1. 如果 transformList 是空字符串,则将其设为字符串 "matrix(1, 0, 0, 1, 0, 0)"。

  2. transformList 按照 CSS transform 属性的语法解析为 parsedValue。结果将是一个 <transform-list>、关键字 none,或失败。如果 parsedValue 为失败,或者任一 <transform-function> 使用了没有 绝对长度 单位的 <length> 值,或使用了除 none 以外的关键字,则返回失败。 [CSS3-SYNTAX] [CSS3-TRANSFORMS]

  3. 如果 parsedValuenone,则将 parsedValue 设为包含单个单位矩阵的 <transform-list>

  4. 2dTransform 跟踪 parsedValue 的二维/三维维度状态。

    如果 parsedValue 包含任一 三维变换函数

    2dTransform 设为 false

    否则

    2dTransform 设为 true

  5. 将所有 <transform-function> 按照“变换函数的数学描述”转换为 4x4 抽象矩阵[CSS3-TRANSFORMS]

  6. matrix 为本节最初图示所示的 4x4 抽象矩阵。按从左到右的顺序对所有矩阵进行 后乘,并将乘积赋给 matrix

  7. 返回 matrix2dTransform

6.3. 创建 DOMMatrixReadOnly 和 DOMMatrix 对象

要创建类型为 type(取值为 DOMMatrixReadOnlyDOMMatrix)的二维矩阵(create a 2d matrix),使用长度为 6 的序列 init,按下列步骤执行:

  1. matrixtype 的一个新实例。

  2. m11 elementm12 elementm21 elementm22 elementm41 elementm42 element 依次设为 init 的值(从第一个值开始)。

  3. m13 elementm14 elementm23 elementm24 elementm31 elementm32 elementm34 elementm43 element 设为 0

  4. m33 elementm44 element 设为 1

  5. is 2D 设为 true

  6. 返回 matrix

要创建类型为 type(取值为 DOMMatrixReadOnlyDOMMatrix)的三维矩阵(create a 3d matrix),使用长度为 16 的序列 init,按下列步骤执行:

  1. matrixtype 的一个新实例。

  2. m11 elementm44 element 设为按列主序(column-major order)从 init 取得的值。

  3. is 2D 设为 false

  4. 返回 matrix

DOMMatrixReadOnly(init)DOMMatrix(init) 构造函数必须遵循下列步骤:

如果省略 init

返回按适当类型(DOMMatrixReadOnlyDOMMatrix)调用 create a 2d matrix 的结果,所用序列为 [1, 0, 0, 1, 0, 0]。

如果 initDOMString
  1. 如果 当前全局对象 不是 Window 对象,则抛出一个 TypeError 异常。

  2. init 解析为抽象矩阵,并令 matrix2dTransform 为结果。如果结果为失败,则抛出一个 "SyntaxError" DOMException

  3. 如果 2dTransformtrue

    按适当类型(DOMMatrixReadOnlyDOMMatrix)调用 create a 2d matrix 并返回其结果,所用序列为数值序列,其值为 matrix 的元素 m11, m12, m21, m22, m41m42

    否则

    按适当类型(DOMMatrixReadOnlyDOMMatrix)调用 create a 3d matrix 并返回其结果,所用序列为数值序列,其值为 matrix 的 16 个元素。

如果 init 是包含 6 个元素的序列

按适当类型(DOMMatrixReadOnlyDOMMatrix)调用 create a 2d matrix 并返回其结果,所用序列为 init

如果 init 是包含 16 个元素的序列

按适当类型(DOMMatrixReadOnlyDOMMatrix)调用 create a 3d matrix 并返回其结果,所用序列为 init

否则

抛出一个 TypeError 异常。

fromMatrix(other) 静态方法在 DOMMatrixReadOnly 上必须 从字典创建一个 DOMMatrixReadOnly 使用 other

fromMatrix(other) 静态方法在 DOMMatrix 上必须 从字典创建一个 DOMMatrix 使用 other

要从 2D 字典创建一个 DOMMatrixReadOnlycreate a DOMMatrixReadOnly from a 2D dictionaryother,或从 2D 字典创建一个 DOMMatrixcreate a DOMMatrix from a 2D dictionaryother,请执行下列步骤:

  1. other 执行 验证并修正(2D)

  2. 按适当类型(DOMMatrixReadOnlyDOMMatrix)调用 create a 2d matrix 并返回其结果,所用序列为数值序列,其值为 other 的 6 个元素 m11, m12, m21, m22, m41m42(按给定顺序)。

要从字典创建一个 DOMMatrixReadOnlycreate a DOMMatrixReadOnly from a dictionaryother, 或从字典创建一个 DOMMatrixcreate a DOMMatrix from a dictionaryother,请执行下列步骤:

  1. other 执行 验证并修正

  2. 如果 otheris2D 字典成员为 true

    按适当类型(DOMMatrixReadOnlyDOMMatrix)调用 create a 2d matrix 并返回其结果,所用序列为数值序列,其值为 other 的 6 个元素 m11, m12, m21, m22, m41m42(按给定顺序)。

    否则

    按适当类型(DOMMatrixReadOnlyDOMMatrix)调用 create a 3d matrix 并返回其结果,所用序列为数值序列,其值为 other 的 16 个元素 m11, m12, m13, ..., m44(按给定顺序)。

fromFloat32Array(array32) 静态方法在 DOMMatrixReadOnlyfromFloat32Array(array32) 静态方法在 DOMMatrix 上必须遵循下列步骤:

如果 array32 有 6 个元素

按适当类型(DOMMatrixReadOnlyDOMMatrix)调用 create a 2d matrix 并返回其结果,所用序列为数值序列,从 array32 中按提供顺序取值。

如果 array32 有 16 个元素

按适当类型(DOMMatrixReadOnlyDOMMatrix)调用 create a 3d matrix 并返回其结果,所用序列为数值序列,从 array32 中按提供顺序取值。

否则

抛出一个 TypeError 异常。

fromFloat64Array(array64) 静态方法在 DOMMatrixReadOnlyfromFloat64Array(array64) 静态方法在 DOMMatrix 上必须遵循下列步骤:

如果 array64 有 6 个元素

按适当类型(DOMMatrixReadOnlyDOMMatrix)调用 create a 2d matrix 并返回其结果,所用序列为数值序列,从 array64 中按提供顺序取值。

如果 array32 有 16 个元素

按适当类型(DOMMatrixReadOnlyDOMMatrix)调用 create a 3d matrix 并返回其结果,所用序列为数值序列,从 array64 中按提供顺序取值。

否则

抛出一个 TypeError 异常。

6.4. DOMMatrix 属性

下列属性 m11m44 对应于矩阵接口的 16 个元素。

m11a 属性在读取时必须返回 m11 element 的值。对于 DOMMatrix 接口,设置 m11a 属性时,必须将 m11 element 设为新值。

m12b 属性在读取时必须返回 m12 element 的值。对于 DOMMatrix 接口,设置 m12b 属性时,必须将 m12 element 设为新值。

m13 属性在读取时必须返回 m13 element 的值。对于 DOMMatrix 接口,设置 m13 属性时,必须将 m13 element 设为新值,并且如果新值不是 0-0,则将 is 2D 设为 false

m14 属性在读取时必须返回 m14 element 的值。对于 DOMMatrix 接口,设置 m14 属性时,必须将 m14 element 设为新值,并且如果新值不是 0-0,则将 is 2D 设为 false

m21c 属性在读取时必须返回 m21 element 的值。对于 DOMMatrix 接口,设置 m21c 属性时,必须将 m21 element 设为新值。

m22d 属性在读取时必须返回 m22 element 的值。对于 DOMMatrix 接口,设置 m22d 属性时,必须将 m22 element 设为新值。

m23 属性在读取时必须返回 m23 element 的值。对于 DOMMatrix 接口,设置 m23 属性时,必须将 m23 element 设为新值,并且如果新值不是 0-0,则将 is 2D 设为 false

m24 属性在读取时必须返回 m24 element 的值。对于 DOMMatrix 接口,设置 m24 属性时,必须将 m24 element 设为新值,并且如果新值不是 0-0,则将 is 2D 设为 false

m31 属性在读取时必须返回 m31 element 的值。对于 DOMMatrix 接口,设置 m31 属性时,必须将 m31 element 设为新值,并且如果新值不是 0-0,则将 is 2D 设为 false

m32 属性在读取时必须返回 m32 element 的值。对于 DOMMatrix 接口,设置 m32 属性时,必须将 m32 element 设为新值,并且如果新值不是 0-0,则将 is 2D 设为 false

m33 属性在读取时必须返回 m33 element 的值。对于 DOMMatrix 接口,设置 m33 属性时,必须将 m33 element 设为新值,并且如果新值不是 1,则将 is 2D 设为 false

m34 属性在读取时必须返回 m34 element 的值。对于 DOMMatrix 接口,设置 m34 属性时,必须将 m34 element 设为新值,并且如果新值不是 0-0,则将 is 2D 设为 false

m41e 属性在读取时必须返回 m41 element 的值。对于 DOMMatrix 接口,设置 m41e 属性时,必须将 m41 element 设为新值。

m42f 属性在读取时必须返回 m42 element 的值。对于 DOMMatrix 接口,设置 m42f 属性时,必须将 m42 element 设为新值。

m43 属性在读取时必须返回 m43 element 的值。对于 DOMMatrix 接口,设置 m43 属性时,必须将 m43 element 设为新值,并且如果新值不是 0-0,则将 is 2D 设为 false

m44 属性在读取时必须返回 m44 element 的值。对于 DOMMatrix 接口,设置 m44 属性时,必须将 m44 element 设为新值,并且如果新值不是 1,则将 is 2D 设为 false

下列属性 af 对应于矩阵接口的 2D 组件。

a 属性是 m11 属性的别名。

b 属性是 m12 属性的别名。

c 属性是 m21 属性的别名。

d 属性是 m22 属性的别名。

e 属性是 m41 属性的别名。

f 属性是 m42 属性的别名。

下列属性提供有关 DOMMatrixReadOnly 的状态信息。

is2D 属性必须返回 is 2D 的值。

isIdentity 属性必须在下列条件全部满足时返回 truem12 elementm13 elementm14 elementm21 elementm23 elementm24 elementm31 elementm32 elementm34 elementm41 elementm42 elementm43 element 的值均为 0-0,且 m11 elementm22 elementm33 elementm44 element 的值均为 1。否则应返回 false

每个 DOMMatrixReadOnly 对象必须带有一个布尔标志 is 2D。该标志指示:

  1. 当前矩阵是作为 2D 矩阵初始化的。详见各创建函数(creators)。

  2. 仅应用了 2D 变换操作。每个 可变不可变 的变换方法会定义是否必须将 is 2D 设为 false

注:is 2D 在一个 DOMMatrix 对象上曾被设为 false 后,除非调用 setMatrixValue() 方法,否则该标志永远不能再被设为 true

6.5. 不可变的变换方法

下列方法不会修改当前矩阵并返回一个新的 DOMMatrix 对象。

translate(tx, ty, tz)
  1. result 为结果矩阵,其初始值设置为当前矩阵的各项值。

  2. result 执行一个 translateSelf() 变换,参数为 tx, ty, tz

  3. 返回 result

当前矩阵不被修改。

scale(scaleX, scaleY, scaleZ, originX, originY, originZ)
  1. 如果缺少 scaleY,则将 scaleY 设为 scaleX 的值。

  2. result 为结果矩阵,其初始值设置为当前矩阵的各项值。

  3. result 执行一个 scaleSelf() 变换,参数为 scaleX, scaleY, scaleZ, originX, originY, originZ

  4. 返回 result

当前矩阵不被修改。

scaleNonUniform(scaleX, scaleY)

注: 为与 SVG 1.1 中定义的 SVGMatrix 兼容而保留的遗留支持。建议作者改用 scale()

  1. result 为结果矩阵,其初始值设置为当前矩阵的各项值。

  2. result 执行一个 scaleSelf() 变换,参数为 scaleX, scaleY, 1, 0, 0, 0

  3. 返回 result

当前矩阵不被修改。

scale3d(scale, originX, originY, originZ)
  1. result 为结果矩阵,其初始值设置为当前矩阵的各项值。

  2. result 执行一个 scale3dSelf() 变换,参数为 scale, originX, originY, originZ

  3. 返回 result

当前矩阵不被修改。

rotate(rotX, rotY, rotZ)
  1. result 为结果矩阵,其初始值设置为当前矩阵的各项值。

  2. result 执行一个 rotateSelf() 变换,参数为 rotX, rotY, rotZ

  3. 返回 result

当前矩阵不被修改。

rotateFromVector(x, y)
  1. result 为结果矩阵,其初始值设置为当前矩阵的各项值。

  2. result 执行一个 rotateFromVectorSelf() 变换,参数为 x, y

  3. 返回 result

当前矩阵不被修改。

rotateAxisAngle(x, y, z, angle)
  1. result 为结果矩阵,其初始值设置为当前矩阵的各项值。

  2. result 执行一个 rotateAxisAngleSelf() 变换,参数为 x, y, z, angle

  3. 返回 result

当前矩阵不被修改。

skewX(sx)
  1. result 为结果矩阵,其初始值设置为当前矩阵的各项值。

  2. result 执行一个 skewXSelf() 变换,参数为 sx

  3. 返回 result

当前矩阵不被修改。

skewY(sy)
  1. result 为结果矩阵,其初始值设置为当前矩阵的各项值。

  2. result 执行一个 skewYSelf() 变换,参数为 sy

  3. 返回 result

当前矩阵不被修改。

multiply(other)
  1. result 为结果矩阵,其初始值设置为当前矩阵的各项值。

  2. result 执行一个 multiplySelf() 变换,参数为 other

  3. 返回 result

当前矩阵不被修改。

flipX()
  1. result 为结果矩阵,其初始值设置为当前矩阵的各项值。

  2. result 进行后乘 ,与 new DOMMatrix([-1, 0, 0, 1, 0, 0]) 相乘。

  3. 返回 result

当前矩阵不被修改。

flipY()
  1. result 为结果矩阵,其初始值设置为当前矩阵的各项值。

  2. result 进行后乘 ,与 new DOMMatrix([1, 0, 0, -1, 0, 0]) 相乘。

  3. 返回 result

当前矩阵不被修改。

inverse()
  1. result 为结果矩阵,其初始值设置为当前矩阵的各项值。

  2. result 执行一个 invertSelf() 变换。

  3. 返回 result

当前矩阵不被修改。

下面的方法不会修改当前矩阵。

transformPoint(point)

pointObject 为调用 从字典创建一个 DOMPoint(参数为 point) 的结果。返回在给定 pointObject 与当前矩阵的情况下,调用 用矩阵变换一个点 的结果。传入的参数不会被修改。

toFloat32Array()

以列主序将当前矩阵的 16 个元素 m11m44 序列化为一个 Float32Array 并返回。

toFloat64Array()

以列主序将当前矩阵的 16 个元素 m11m44 序列化为一个 Float64Array 并返回。

字符串化行为
  1. 如果 m11 elementm44 element 中的一个或多个是非有限值,则抛出一个 "InvalidStateError" DOMException

    注:CSS 语法无法表示 NaNInfinity 值。

  2. string 为空字符串。

  3. 如果 is 2Dtrue,则:

    1. string 追加 "matrix("。

    2. string 追加 ! ToString(m11 element)。

    3. string 追加 ", "。

    4. string 追加 ! ToString(m12 element)。

    5. string 追加 ", "。

    6. string 追加 ! ToString(m21 element)。

    7. string 追加 ", "。

    8. string 追加 ! ToString(m22 element)。

    9. string 追加 ", "。

    10. string 追加 ! ToString(m41 element)。

    11. string 追加 ", "。

    12. string 追加 ! ToString(m42 element)。

    13. string 追加 ")"。

    注: 该字符串将以 CSS Transforms 的 <matrix()> 函数形式出现。 [CSS3-TRANSFORMS]

  4. 否则:

    1. string 追加 "matrix3d("。

    2. string 追加 ! ToString(m11 element)。

    3. string 追加 ", "。

    4. string 追加 ! ToString(m12 element)。

    5. string 追加 ", "。

    6. string 追加 ! ToString(m13 element)。

    7. string 追加 ", "。

    8. string 追加 ! ToString(m14 element)。

    9. string 追加 ", "。

    10. string 追加 ! ToString(m21 element)。

    11. string 追加 ", "。

    12. string 追加 ! ToString(m22 element)。

    13. string 追加 ", "。

    14. string 追加 ! ToString(m23 element)。

    15. string 追加 ", "。

    16. string 追加 ! ToString(m24 element)。

    17. string 追加 ", "。

    18. string 追加 ! ToString(m41 element)。

    19. string 追加 ", "。

    20. string 追加 ! ToString(m42 element)。

    21. string 追加 ", "。

    22. string 追加 ! ToString(m43 element)。

    23. string 追加 ", "。

    24. string 追加 ! ToString(m44 element)。

    25. string 追加 ")"。

    注: 该字符串将以 CSS Transforms 的 <matrix3d()> 函数形式出现。 [CSS3-TRANSFORMS]

  5. 返回 string

在此示例中,创建了一个矩阵并调用了若干 2D 变换方法:
var matrix = new DOMMatrix();
matrix.scaleSelf(2);
matrix.translateSelf(20,20);
console.assert(matrix.toString() ===
                "matrix(2, 0, 0, 2, 40, 40)");
在下例中,创建了一个矩阵并调用了若干 3D 变换方法:
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)");

对于 3D 操作,字符串化器会返回表示 3D 矩阵的字符串。

该示例将抛出异常,因为矩阵中存在非有限值。
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. 可变的变换方法

下列方法会修改当前矩阵,因此每个方法都返回调用它的那个矩阵。这样做的主要好处是允许内容创作者链式调用方法。

下列代码示例:
var matrix = new DOMMatrix();
matrix.translateSelf(20, 20);
matrix.scaleSelf(2);
matrix.translateSelf(-20, -20);

等同于:

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

注: 使用链式方法调用的作者建议使用可变变换方法,以避免在用户代理中创建中间 DOMMatrix 对象从而产生不必要的内存分配。

multiplySelf(other)
  1. otherObject 为调用 从字典创建一个 DOMMatrix(参数为 other) 的结果。

  2. 将矩阵 otherObject 后乘到当前矩阵。

  3. 如果 otherObjectis 2Dfalse,则将当前矩阵的 is 2D 设为 false

  4. 返回当前矩阵。

preMultiplySelf(other)
  1. otherObject 为调用 从字典创建一个 DOMMatrix(参数为 other) 的结果。

  2. 将矩阵 otherObject 前乘到当前矩阵。

  3. 如果 otherObjectis 2Dfalse,则将当前矩阵的 is 2D 设为 false

  4. 返回当前矩阵。

translateSelf(tx, ty, tz)
  1. 对当前矩阵执行一个平移变换(后乘)。3D 平移矩阵在 CSS Transforms 中有描述(参见链接)。 [CSS3-TRANSFORMS]

  2. 如果指定了 tz 且其不为 0-0,则将当前矩阵的 is 2D 设为 false

  3. 返回当前矩阵。

scaleSelf(scaleX, scaleY, scaleZ, originX, originY, originZ)
  1. 先对当前矩阵执行一个 translateSelf(),参数为 originX, originY, originZ(移动到原点)。

  2. 如果缺少 scaleY,将其设为 scaleX 的值。

  3. 将一个非均匀缩放(后乘)应用到当前矩阵。3D 缩放矩阵在 CSS Transforms 中有描述,使用 sx = scaleX, sy = scaleY, sz = scaleZ[CSS3-TRANSFORMS]

  4. originX, originY, originZ 取反(回到原位置)。

  5. 对当前矩阵执行另一次 translateSelf(),参数为 originX, originY, originZ

  6. 如果 scaleZ 不为 1originZ 不为 0-0,将当前矩阵的 is 2D 设为 false

  7. 返回当前矩阵。

scale3dSelf(scale, originX, originY, originZ)
  1. 对当前矩阵应用一个 translateSelf(),参数为 originX, originY, originZ(移动到原点)。

  2. 后乘一个均匀 3D 缩放变换(即将 m11m22m33 设为 scale)到当前矩阵。3D 缩放矩阵在 CSS Transforms 中有描述,sx=sy=sz=scale[CSS3-TRANSFORMS]

  3. 对当前矩阵应用一个 translateSelf(),参数为 -originX, -originY, -originZ(移回原位置)。

  4. 如果 scale 不为 1,将当前矩阵的 is 2D 设为 false

  5. 返回当前矩阵。

rotateSelf(rotX, rotY, rotZ)
  1. 如果 rotYrotZ 都未提供,则将 rotZ 设为 rotX 的值,并把 rotXrotY 设为 0

  2. 如果 rotY 仍未提供,则将 rotY 设为 0

  3. 如果 rotZ 仍未提供,则将 rotZ 设为 0

  4. 如果 rotXrotY 不为 0-0,将当前矩阵的 is 2D 设为 false

  5. 按顺序对当前矩阵后乘以下绕固定轴的旋转矩阵(均以度为单位):先绕向量 (0,0,1) 旋转 rotZ,再绕向量 (0,1,0) 旋转 rotY,再绕向量 (1,0,0) 旋转 rotX。详见 CSS Transforms 中的 3D 旋转描述。 [CSS3-TRANSFORMS]

  6. 返回当前矩阵。

rotateFromVectorSelf(x, y)
  1. 对当前矩阵后乘一个旋转变换。旋转角度为向量 (1,0)^T 与 (x,y)^T 之间的夹角,按顺时针方向计算。如果 xy 都为 0-0,角度取 0。2D 旋转矩阵在 CSS Transforms 中有描述,使用 alpha 为该角度(度)。 [CSS3-TRANSFORMS]

  2. 返回当前矩阵。

rotateAxisAngleSelf(x, y, z, angle)
  1. 对当前矩阵后乘一个绕向量 (x, y, z) 的旋转矩阵,旋转角为 angle(度)。3D 旋转矩阵在 CSS Transforms 中有描述,alpha = angle(度)。 [CSS3-TRANSFORMS]

  2. 如果 xy 不为 0-0,将当前矩阵的 is 2D 设为 false

  3. 返回当前矩阵。

skewXSelf(sx)
  1. 对当前矩阵后乘一个以度为单位的 skewX 变换(参数 sx)。2D skewX 矩阵在 CSS Transforms 中有描述。 [CSS3-TRANSFORMS]

  2. 返回当前矩阵。

skewYSelf(sy)
  1. 对当前矩阵后乘一个以度为单位的 skewY 变换(参数 sy)。2D skewY 矩阵在 CSS Transforms 中有描述。 [CSS3-TRANSFORMS]

  2. 返回当前矩阵。

invertSelf()
  1. 将当前矩阵取反(求逆)。

  2. 如果当前矩阵不可逆,则将所有属性设为 NaN,并将 is 2D 设为 false

  3. 返回当前矩阵。

setMatrixValue(transformList)
  1. transformList 解析为抽象矩阵,并令 matrix2dTransform 为结果。如果结果为失败,则抛出一个 "SyntaxError" DOMException

  2. is 2D 设为 2dTransform 的值。

  3. m11 elementm44 element 设为 matrix 的元素值,按列主序。

  4. 返回当前矩阵。

7. 结构化序列化

DOMPointReadOnly, DOMPoint, DOMRectReadOnly, DOMRect, DOMQuad, DOMMatrixReadOnly, 和 DOMMatrix 对象是 可序列化对象[HTML]

针对 DOMPointReadOnlyDOMPoint序列化步骤(给定 valueserialized)为:

  1. serialized.[[X]] 设为 valuex coordinate

  2. serialized.[[Y]] 设为 valuey coordinate

  3. serialized.[[Z]] 设为 valuez coordinate

  4. serialized.[[W]] 设为 valuew perspective

它们的 反序列化步骤(给定 serializedvalue)为:

  1. valuex coordinate 设为 serialized.[[X]]。

  2. valuey coordinate 设为 serialized.[[Y]]。

  3. valuez coordinate 设为 serialized.[[Z]]。

  4. valuew perspective 设为 serialized.[[W]]。

针对 DOMRectReadOnlyDOMRect序列化步骤(给定 valueserialized)为:

  1. serialized.[[X]] 设为 valuex coordinate

  2. serialized.[[Y]] 设为 valuey coordinate

  3. serialized.[[Width]] 设为 valuewidth dimension

  4. serialized.[[Height]] 设为 valueheight dimension

它们的 反序列化步骤(给定 serializedvalue)为:

  1. valuex coordinate 设为 serialized.[[X]]。

  2. valuey coordinate 设为 serialized.[[Y]]。

  3. valuewidth dimension 设为 serialized.[[Width]]。

  4. valueheight dimension 设为 serialized.[[Height]]。

针对 DOMQuad序列化步骤(给定 valueserialized)为:

  1. serialized.[[P1]] 设为 value子序列化 的点 1。

  2. serialized.[[P2]] 设为 value子序列化 的点 2。

  3. serialized.[[P3]] 设为 value子序列化 的点 3。

  4. serialized.[[P4]] 设为 value子序列化 的点 4。

它们的 反序列化步骤(给定 serializedvalue)为:

  1. value 的点 1 设为 serialized.[[P1]] 的 子反序列化

  2. value 的点 2 设为 serialized.[[P2]] 的 子反序列化

  3. value 的点 3 设为 serialized.[[P3]] 的 子反序列化

  4. value 的点 4 设为 serialized.[[P4]] 的 子反序列化

针对 DOMMatrixReadOnlyDOMMatrix序列化步骤(给定 valueserialized)为:

  1. 如果 valueis 2Dtrue

    1. serialized.[[M11]] 设为 valuem11 element

    2. serialized.[[M12]] 设为 valuem12 element

    3. serialized.[[M21]] 设为 valuem21 element

    4. serialized.[[M22]] 设为 valuem22 element

    5. serialized.[[M41]] 设为 valuem41 element

    6. serialized.[[M42]] 设为 valuem42 element

    7. serialized.[[Is2D]] 设为 true

    注: 对于 2D 的 DOMMatrixDOMMatrixReadOnly,某些元素(例如 m13 element)可能为 -0,这些值不会被此算法回传。

  2. 否则:

    1. serialized.[[M11]] 设为 valuem11 element

    2. serialized.[[M12]] 设为 valuem12 element

    3. serialized.[[M13]] 设为 valuem13 element

    4. serialized.[[M14]] 设为 valuem14 element

    5. serialized.[[M21]] 设为 valuem21 element

    6. serialized.[[M22]] 设为 valuem22 element

    7. serialized.[[M23]] 设为 valuem23 element

    8. serialized.[[M24]] 设为 valuem24 element

    9. serialized.[[M31]] 设为 valuem31 element

    10. serialized.[[M32]] 设为 valuem32 element

    11. serialized.[[M33]] 设为 valuem33 element

    12. serialized.[[M34]] 设为 valuem34 element

    13. serialized.[[M41]] 设为 valuem41 element

    14. serialized.[[M42]] 设为 valuem42 element

    15. serialized.[[M43]] 设为 valuem43 element

    16. serialized.[[M44]] 设为 valuem44 element

    17. serialized.[[Is2D]] 设为 false

    它们的 反序列化步骤(给定 serializedvalue)为:

    1. 如果 serialized.[[Is2D]] 为 true

      1. valuem11 element 设为 serialized.[[M11]]。

      2. valuem12 element 设为 serialized.[[M12]]。

      3. valuem13 element 设为 0

      4. valuem14 element 设为 0

      5. valuem21 element 设为 serialized.[[M21]]。

      6. valuem22 element 设为 serialized.[[M22]]。

      7. valuem23 element 设为 0

      8. valuem24 element 设为 0

      9. valuem31 element 设为 0

      10. valuem32 element 设为 0

      11. valuem33 element 设为 1

      12. valuem34 element 设为 0

      13. valuem41 element 设为 serialized.[[M41]]。

      14. valuem42 element 设为 serialized.[[M42]]。

      15. valuem43 element 设为 0

      16. valuem44 element 设为 1

      17. valueis 2D 设为 true

    2. 否则:

      1. valuem11 element 设为 serialized.[[M11]]。

      2. valuem12 element 设为 serialized.[[M12]]。

      3. valuem13 element 设为 serialized.[[M13]]。

      4. valuem14 element 设为 serialized.[[M14]]。

      5. valuem21 element 设为 serialized.[[M21]]。

      6. valuem22 element 设为 serialized.[[M22]]。

      7. valuem23 element 设为 serialized.[[M23]]。

      8. valuem24 element 设为 serialized.[[M24]]。

      9. valuem31 element 设为 serialized.[[M31]]。

      10. valuem32 element 设为 serialized.[[M32]]。

      11. valuem33 element 设为 serialized.[[M33]]。

      12. valuem34 element 设为 serialized.[[M34]]。

      13. valuem41 element 设为 serialized.[[M41]]。

      14. valuem42 element 设为 serialized.[[M42]]。

      15. valuem43 element 设为 serialized.[[M43]]。

      16. valuem44 element 设为 serialized.[[M44]]。

      17. valueis 2D 设为 false

8. 隐私与安全注意事项

接口 DOMMatrixDOMMatrixReadOnly 提供了使用 CSS 语法解析字符串的入口点。因此适用 CSS 语法规范中的 隐私与安全注意事项[CSS3-SYNTAX]

该行为可能被用于利用用户代理中 CSS 解析器的漏洞。

本规范中定义的接口目前未发现其他已知的安全或隐私影响。然而,使用本规范中定义接口的其他规范与 API 可能会引入安全或隐私问题。

例如,CSSOM View 中定义的 getBoundingClientRect() API 返回一个 DOMRect,可用于测量包含某字体文本的内联元素的大小,这会泄露用户是否安装了该字体的信息。如果用来检测大量常见字体,这些信息可能成为可识别个人身份的信息。 [CSSOM-VIEW]

9. 历史记录

本节为非规范性内容。

本规范中的接口旨在取代早期规范中以及某些用户代理中专有实现的类似接口。本节试图列举这些接口。

9.1. CSSOM View

早期的 CSSOM View 修订版定义了 ClientRect 接口,该接口已被 DOMRect 取代。符合本规范的实现将不会支持 ClientRect[CSSOM-VIEW]

9.2. SVG

早期的 SVG 修订版定义了 SVGPointSVGRectSVGMatrix, 这些在本规范中被定义为别名,分别对应 DOMPointDOMRectDOMMatrix[SVG11]

9.3. 非标准实现

一些用户代理曾支持 WebKitPoint 接口。符合本规范的实现将不会支持 WebKitPoint

若干用户代理曾支持 WebKitCSSMatrix 接口,该接口在 Web 上也被广泛使用。本规范将其定义为 DOMMatrix 的别名。

一些用户代理曾支持 MSCSSMatrix 接口。符合本规范的实现将不会支持 MSCSSMatrix

自上次发布以来的变更

本节为非规范性内容。

下列变更自 2014 年 11 月 25 日候选建议(Candidate Recommendation)以来已做出。

下列更改自 2014 年 9 月 18 日工作草案(Working Draft)以来已做出。

下列更改自 2014 年 6 月 26 日最后呼吁公开工作草案(Last Call Public Working Draft)以来已做出。

下列更改自 2014 年 5 月 22 日首次公开工作草案(First Public Working Draft)以来已做出。

致谢

编辑者感谢 Robert O’Callahan 对本规范的贡献。非常感谢 Dean Jackson 最初提出 DOMMatrix 的建议。感谢 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、 以及 Timothy Loh 对草案进行仔细审阅、评论和指正。

一致性要求

文档约定

一致性要求以描述性断言与 RFC 2119 术语的组合来表达。规范性部分中的关键词 “MUST”、 “MUST NOT”、 “REQUIRED”、 “SHALL”、 “SHALL NOT”、 “SHOULD”、 “SHOULD NOT”、 “RECOMMENDED”、 “MAY”、和 “OPTIONAL” 应按 RFC 2119 中的描述进行解释。 但为易读起见,这些词在本规范中并不全部使用大写形式。

除非明确标注为非规范性、示例和注释外,本规范的全部文本均为规范性内容。 [RFC2119]

本规范中的示例以“例如”(for example)开头,或用 class="example" 与规范性文本区分,如下所示:

这是一个说明性示例。

说明性注释以 “Note” 开头,并用 class="note" 与规范性文本区分,如下所示:

注:这是一个说明性注释。

规范性的劝告段落以 <strong class="advisement"> 样式突出显示,例如: 用户代理必须提供可访问的替代方案。

一致性类别

本规范定义了三类一致性(conformance)类别:

样式表
CSS 样式表
渲染器
指解释样式表语义并渲染使用这些样式表的文档的 用户代理
创作工具
指用于编写样式表的 用户代理

样式表若要符合本规范,需满足其中使用的本模块定义语法均对通用 CSS 文法和各特性独立文法而言是有效的。

渲染器若要符合本规范,除按相应规范解释样式表外,还应通过正确解析并呈现文档来支持本规范定义的所有特性。但由于设备限制导致渲染器无法完全正确呈现文档并不视为不符合规范。(例如,单色显示器上不要求渲染颜色。)

创作工具若要符合本规范,应能编写语法上符合通用 CSS 文法与本模块各特性文法的样式表,并满足本模块对样式表的一切其他一致性要求。

负责任实现 CSS 的要求

下列小节定义了若干实现 CSS 的一致性要求,以促进当前与未来的互操作性。

部分实现

为了让作者利用向前兼容的解析规则指定回退值,CSS 渲染器 必须 将其不具备可用支持级别的 at-rule、属性、属性值、关键字和其他语法结构视为无效 (并在适当时 忽略。 特别地,用户代理 不得 在单个多值属性声明中选择性地忽略不支持的属性值而保留支持的值:如果存在任何值被视为无效(不支持的值应视为无效),则整个声明必须被忽略。

不稳定与专有特性的实现

为避免与未来稳定的 CSS 特性冲突,CSS 工作组建议在实现 不稳定 特性与 专有扩展 时遵循 最佳实践

CR 级别特性的实现

当规范达到候选建议(Candidate Recommendation)阶段时,实现者应发布任何其能根据规范证明已正确实现的 CR 级别特性的非前缀(unprefixed)实现,并应避免公开该特性的带前缀变体。

为建立并维持跨实现的互操作性,CSS 工作组要求非实验性的 CSS 渲染器在发布任何能通过规范验证的非前缀实现之前,向 W3C 提交实现报告(如有必要,还应提交用于该实现报告的测试用例)。提交给 W3C 的测试用例将接受 CSS 工作组的审查与修正。

关于提交测试用例和实现报告的更多信息,请查阅 CSS 工作组网站:https://www.w3.org/Style/CSS/Test/。问题请发往 public-css-testsuite@w3.org 邮件列表。

CR 退出标准

若要将本规范提升为拟议推荐(Proposed Recommendation),每项特性必须至少有两个独立且可互操作的实现。每项特性的实现可以由不同产品实现,不要求所有特性由同一产品实现。为此标准我们定义如下术语:

独立
每个实现必须由不同的实体开发,且不得共享、重用或派生自另一合格实现所用的代码。与本规范实现无关的代码段可予以豁免。
可互操作
在官方 CSS 测试套件中通过相应测试用例,或若实施不是 Web 浏览器则通过等效测试。每个相关测试都应有等效测试以声明互操作性。如果使用某用户代理(UA)来声明互操作性,则必须有一个或多个其他用户代理以相同方式通过这些等效测试,且等效测试应公开以便同行审查。
实现
一个用户代理,其:
  1. 实现本规范。
  2. 向公众可用。实现可以是已发布产品或其他公开版本(例如 beta、预览版或“nightly build”)。非发布产品版本必须至少在一个月内实现该特性以证明稳定性。
  3. 非实验性(即不是专门为通过测试套件而设计且不打算用于正常使用的版本)。

本规范将至少以候选建议阶段(Candidate Recommendation)状态维持六个月。

索引

本规范定义的术语

通过引用定义的术语

参考文献

规范性参考文献

[CSS-VALUES-3]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 3. 2018-08-14. CR. URL: https://www.w3.org/TR/css-values-3/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 4. 2018-10-10. WD. URL: https://www.w3.org/TR/css-values-4/
[CSS3-SYNTAX]
Tab Atkins Jr.; Simon Sapin. CSS Syntax Module Level 3. 2014-02-20. CR. URL: https://www.w3.org/TR/css-syntax-3/
[CSS3-TRANSFORMS]
Simon Fraser; 等. CSS Transforms Module Level 1. 2017-11-30. WD. URL: https://www.w3.org/TR/css-transforms-1/
[ECMA-262]
ECMAScript 语言规范. URL: https://tc39.github.io/ecma262/
[HTML]
Anne van Kesteren; 等. HTML 标准. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[RFC2119]
S. Bradner. 在 RFC 中表示要求级别的关键词. 1997-03. Best Current Practice. URL: https://tools.ietf.org/html/rfc2119
[WEBIDL]
Cameron McCormack; Boris Zbarsky; Tobie Langel. Web IDL. 2016-12-15. ED. URL: https://heycam.github.io/webidl/

信息性引用

[CSS-TRANSFORMS-2]
CSS Transforms Module Level 2 URL: https://drafts.csswg.org/css-transforms-2/
[CSSOM-VIEW]
Simon Pieters. CSSOM View Module. 2016-03-17. WD. URL: https://www.w3.org/TR/cssom-view-1/
[SVG11]
Erik Dahlström; 等. Scalable Vector Graphics (SVG) 1.1 (Second Edition). 2011-08-16. REC. URL: https://www.w3.org/TR/SVG11/

IDL 索引

[Constructor(optional unrestricted double x = 0, optional unrestricted double y = 0,
             optional unrestricted double z = 0, optional unrestricted double w = 1),
 Exposed=(Window,Worker),
 Serializable]
interface DOMPointReadOnly {
    [NewObject] static DOMPointReadOnly fromPoint(optional DOMPointInit other);

    readonly attribute unrestricted double x;
    readonly attribute unrestricted double y;
    readonly attribute unrestricted double z;
    readonly attribute unrestricted double w;

    DOMPoint matrixTransform(optional DOMMatrixInit matrix);

    [Default] object toJSON();
};

[Constructor(optional unrestricted double x = 0, optional unrestricted double y = 0,
             optional unrestricted double z = 0, optional unrestricted double w = 1),
 Exposed=(Window,Worker),
 Serializable,
 LegacyWindowAlias=SVGPoint]
interface DOMPoint : DOMPointReadOnly {
    [NewObject] static DOMPoint fromPoint(optional DOMPointInit other);

    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(optional unrestricted double x = 0, optional unrestricted double y = 0,
             optional unrestricted double width = 0, optional unrestricted double height = 0),
 Exposed=(Window,Worker),
 Serializable]
interface DOMRectReadOnly {
    [NewObject] static DOMRectReadOnly fromRect(optional DOMRectInit other);

    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;

    [Default] object toJSON();
};

[Constructor(optional unrestricted double x = 0, optional unrestricted double y = 0,
             optional unrestricted double width = 0, optional unrestricted double height = 0),
 Exposed=(Window,Worker),
 Serializable,
 LegacyWindowAlias=SVGRect]
interface DOMRect : DOMRectReadOnly {
    [NewObject] static DOMRect fromRect(optional DOMRectInit other);

    inherit attribute unrestricted double x;
    inherit attribute unrestricted double y;
    inherit attribute unrestricted double width;
    inherit attribute unrestricted double height;
};

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

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),
 Exposed=(Window,Worker),
 Serializable]
interface DOMQuad {
    [NewObject] static DOMQuad fromRect(optional DOMRectInit other);
    [NewObject] static DOMQuad fromQuad(optional DOMQuadInit other);

    [SameObject] readonly attribute DOMPoint p1;
    [SameObject] readonly attribute DOMPoint p2;
    [SameObject] readonly attribute DOMPoint p3;
    [SameObject] readonly attribute DOMPoint p4;
    [NewObject] DOMRect getBounds();

    [Default] object toJSON();
};

dictionary DOMQuadInit {
  DOMPointInit p1;
  DOMPointInit p2;
  DOMPointInit p3;
  DOMPointInit p4;
};

[Constructor(optional (DOMString or sequence<unrestricted double>) init),
 Exposed=(Window,Worker),
 Serializable]
interface DOMMatrixReadOnly {
    [NewObject] static DOMMatrixReadOnly fromMatrix(optional DOMMatrixInit other);
    [NewObject] static DOMMatrixReadOnly fromFloat32Array(Float32Array array32);
    [NewObject] static DOMMatrixReadOnly fromFloat64Array(Float64Array array64);

    // 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 double tx = 0,
                                    optional unrestricted double ty = 0,
                                    optional unrestricted double tz = 0);
    [NewObject] DOMMatrix scale(optional unrestricted double scaleX = 1,
                                optional unrestricted double scaleY,
                                optional unrestricted double scaleZ = 1,
                                optional unrestricted double originX = 0,
                                optional unrestricted double originY = 0,
                                optional unrestricted double originZ = 0);
    [NewObject] DOMMatrix scaleNonUniform(optional unrestricted double scaleX = 1,
                                          optional unrestricted double scaleY = 1);
    [NewObject] DOMMatrix scale3d(optional unrestricted double scale = 1,
                                  optional unrestricted double originX = 0,
                                  optional unrestricted double originY = 0,
                                  optional unrestricted double originZ = 0);
    [NewObject] DOMMatrix rotate(optional unrestricted double rotX = 0,
                                 optional unrestricted double rotY,
                                 optional unrestricted double rotZ);
    [NewObject] DOMMatrix rotateFromVector(optional unrestricted double x = 0,
                                           optional unrestricted double y = 0);
    [NewObject] DOMMatrix rotateAxisAngle(optional unrestricted double x = 0,
                                          optional unrestricted double y = 0,
                                          optional unrestricted double z = 0,
                                          optional unrestricted double angle = 0);
    [NewObject] DOMMatrix skewX(optional unrestricted double sx = 0);
    [NewObject] DOMMatrix skewY(optional unrestricted double sy = 0);
    [NewObject] DOMMatrix multiply(optional DOMMatrixInit other);
    [NewObject] DOMMatrix flipX();
    [NewObject] DOMMatrix flipY();
    [NewObject] DOMMatrix inverse();

    [NewObject] DOMPoint transformPoint(optional DOMPointInit point);
    [NewObject] Float32Array toFloat32Array();
    [NewObject] Float64Array toFloat64Array();

    [Exposed=Window] stringifier;
    [Default] object toJSON();
};

[Constructor(optional (DOMString or sequence<unrestricted double>) init),
 Exposed=(Window,Worker),
 Serializable,
 LegacyWindowAlias=(SVGMatrix,WebKitCSSMatrix)]
interface DOMMatrix : DOMMatrixReadOnly {
    [NewObject] static DOMMatrix fromMatrix(optional DOMMatrixInit other);
    [NewObject] static DOMMatrix fromFloat32Array(Float32Array array32);
    [NewObject] static DOMMatrix fromFloat64Array(Float64Array array64);

    // 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 DOMMatrixInit other);
    DOMMatrix preMultiplySelf(optional DOMMatrixInit other);
    DOMMatrix translateSelf(optional unrestricted double tx = 0,
                            optional unrestricted double ty = 0,
                            optional unrestricted double tz = 0);
    DOMMatrix scaleSelf(optional unrestricted double scaleX = 1,
                        optional unrestricted double scaleY,
                        optional unrestricted double scaleZ = 1,
                        optional unrestricted double originX = 0,
                        optional unrestricted double originY = 0,
                        optional unrestricted double originZ = 0);
    DOMMatrix scale3dSelf(optional unrestricted double scale = 1,
                          optional unrestricted double originX = 0,
                          optional unrestricted double originY = 0,
                          optional unrestricted double originZ = 0);
    DOMMatrix rotateSelf(optional unrestricted double rotX = 0,
                         optional unrestricted double rotY,
                         optional unrestricted double rotZ);
    DOMMatrix rotateFromVectorSelf(optional unrestricted double x = 0,
                                   optional unrestricted double y = 0);
    DOMMatrix rotateAxisAngleSelf(optional unrestricted double x = 0,
                                  optional unrestricted double y = 0,
                                  optional unrestricted double z = 0,
                                  optional unrestricted double angle = 0);
    DOMMatrix skewXSelf(optional unrestricted double sx = 0);
    DOMMatrix skewYSelf(optional unrestricted double sy = 0);
    DOMMatrix invertSelf();

    [Exposed=Window] DOMMatrix setMatrixValue(DOMString transformList);
};

dictionary DOMMatrix2DInit {
    unrestricted double a;
    unrestricted double b;
    unrestricted double c;
    unrestricted double d;
    unrestricted double e;
    unrestricted double f;
    unrestricted double m11;
    unrestricted double m12;
    unrestricted double m21;
    unrestricted double m22;
    unrestricted double m41;
    unrestricted double m42;
};

dictionary DOMMatrixInit : DOMMatrix2DInit {
    unrestricted double m13 = 0;
    unrestricted double m14 = 0;
    unrestricted double m23 = 0;
    unrestricted double m24 = 0;
    unrestricted double m31 = 0;
    unrestricted double m32 = 0;
    unrestricted double m33 = 1;
    unrestricted double m34 = 0;
    unrestricted double m43 = 0;
    unrestricted double m44 = 1;
    boolean is2D;
};