Copyright © 2014 W3C® (MIT, ERCIM, Keio, Beihang), All Rights Reserved. W3C liability, trademark and document use rules apply.
This specification provides basic geometric interfaces. CSS is a language for describing the rendering of structured documents (such as HTML and XML) on screen, on paper, in speech, etc.
This section describes the status of this document at the time of its publication. Other documents may supersede this document. A list of current W3C publications and the latest revision of this technical report can be found in the W3C technical reports index at http://www.w3.org/TR/.
The (archived) public mailing list [email protected] (see instructions) is preferred for discussion of this specification. When sending e-mail, please put the text “compositing-1” in the subject, preferably like this: “[geometry-1] …summary of comment…”
This document was produced by the CSS Working Group (part of the Style Activity) and the SVG Working Group (part of the Graphics Activity).
This document was produced by groups operating under the 5 February 2004 W3C Patent Policy. W3C maintains a public list of any patent disclosures (CSS) and a public list of any patent disclosures (SVG) made in connection with the deliverables of each group; these pages also include instructions for disclosing a patent. An individual who has actual knowledge of a patent which the individual believes contains Essential Claim(s) must disclose the information in accordance with section 6 of the W3C Patent Policy.
Publication as a First Public Working Draft does not imply endorsement by the W3C Membership. This is a draft document and may be updated, replaced or obsoleted by other documents at any time. It is inappropriate to cite this document as other than work in progress.
This specification describes several geometry interfaces [WEBIDL] for the representation of points, quads, rectangles and transformation matrices with the dimension of 3x2 and 4x4.
The SVG interfaces SVGPoint, SVGRect and SVGMatrix [SVG11] are aliasing the here defined interfaces in favor for common interfaces used by SVG, Canvas 2D Context [2DCONTEXT] and CSS Transforms [CSS3-TRANSFORMS].
A 2D point or a 3D point can be represented by the following WebIDL interfaces:
interface DOMPointReadOnly { readonly attribute unrestricted double x; readonly attribute unrestricted double y; readonly attribute unrestricted double z; readonly attribute unrestricted double w; }; [Constructor(optional DOMPointInit point), Constructor(unrestricted double x, unrestricted double y, optional unrestricted double z = 0, optional unrestricted double w = 1)] interface DOMPoint : DOMPointReadOnly { inherit attribute unrestricted double x; inherit attribute unrestricted double y; inherit attribute unrestricted double z; inherit attribute unrestricted double w; }; dictionary DOMPointInit { unrestricted double x = 0; unrestricted double y = 0; unrestricted double z = 0; unrestricted double w = 1; };
The DOMPoint()
constructor, when invoked, must run the following steps:
If invoked with one argument, follow these substeps:
Let point be the argument.
Let x be the x
dictionary member of point.
Let y be the y
dictionary member of point.
Let z be the z
dictionary member of point.
Let w be the w
dictionary member of point.
Otherwise, let x, y, z and w be the given arguments, respectively.
Return a new DOMPoint
object with the x
, y
,
z
and w
attributes set to x, y, z and w,
respectively.
The y attribute gives the y coordinate of the point. On getting, it must return the current value. On setting, it must set the current value to the new value.
The z attribute gives the z coordinate of the point. On getting, it must return the current value. On setting, it must set the current value to the new value.
The w attribute gives the perspective of the point. On getting, it must return the current value. On setting, it must set the current value to the new value.
SVGPoint has a method: SVGPoint matrixTransform(in SVGMatrix matrix);
Should it be adapted and added here as well?
Objects implementing the DOMRectReadOnly interface represent a rectangle. The type of box is specified by the method or attribute that returns a DOMRect or DOMRectReadOnly object.
Rectangles have the following properties:
[Constructor, Constructor(unrestricted double x, unrestricted double y, unrestricted double width, unrestricted double height)] interface DOMRect : DOMRectReadOnly { inherit attribute unrestricted double x; inherit attribute unrestricted double y; inherit attribute unrestricted double width; inherit attribute unrestricted double height; }; interface DOMRectReadOnly { readonly attribute unrestricted double x; readonly attribute unrestricted double y; readonly attribute unrestricted double width; readonly attribute unrestricted double height; readonly attribute unrestricted double top; readonly attribute unrestricted double right; readonly attribute unrestricted double bottom; readonly attribute unrestricted double left; };
The DOMRect(x, y, width, height)
constructor, when
invoked, must run the following steps:
If invoked with no arguments, let x, y, width and height be zero.
Return a new DOMRect
object with x coordinate set to x,
y coordinate set to y, width set to
width and height set to height.
The y attribute, on getting, it must return the y coordinate. The y attribute, on setting, must set the y coordinate to the new value.
The width attribute, on getting, must return the width. The width attribute, on setting, must set the width to the new value.
The height attribute, on getting, must return the height. The height attribute, on setting, must set the height to the new value.
The top attribute, on getting, must return min(y coordinate, y coordinate + height).
The right attribute, on getting, must return max(x coordinate, x coordinate + width).
The bottom attribute, on getting, must return max(y coordinate, y coordinate + height).
The left attribute, on getting, must return min(x coordinate, x coordinate + width).
[ArrayClass] interface DOMRectList { readonly attribute unsigned long length; getter DOMRect item(unsigned long index); };
The length attribute must return the total number of DOMRect objects associated with the object.
The item(index) method, when invoked, must throw an IndexSizeError exception when index is greater than the number of DOMRect objects associated with the object. Otherwise, the DOMRect object at index must be returned.
Objects implementing the DOMQuad interface represents a quadrilateral. DOMQuad objects have an associated bounding rectangle set to a DOMRectReadOnly object when created.
[Constructor(DOMPointInit p1, DOMPointInit p2, DOMPointInit p3, DOMPointInit p4), Constructor(DOMRectReadOnly rect)] interface DOMQuad { [SameObject] readonly attribute DOMPoint p1; [SameObject] readonly attribute DOMPoint p2; [SameObject] readonly attribute DOMPoint p3; [SameObject] readonly attribute DOMPoint p4; [SameObject] readonly attribute DOMRectReadOnly bounds; };
The DOMQuad()
constructor, when invoked, must run the following steps:
If invoked with one argument, follow these substeps:
Let rect be the argument.
Let x, y, width and height be rect`s the value of x
,
y
, width
and height
attributes,
respectively.
Let point 1 be a new DOMPoint
object with x
set to x,
y
set to y, z
set to zero and w
set to
one.
Let point 2 be a new DOMPoint
object with x
set to x + width,
y
set to y, z
set to zero and w
set to
one.
Let point 3 be a new DOMPoint
object with x
set to x + width,
y
set to y + height, z
set to zero and
w
set to one.
Let point 4 be a new DOMPoint
object with x
set to x,
y
set to y + height, z
set to zero and
w
set to one.
Let bounds be a new DOMRectReadOnly
object with its attributes set to the values of the namesake attributes in
rect.
Otherwise, follow these substeps:
Let p1, p2, p3 and p4 be the given arguments, in the same order.
Let point 1 be a new DOMPoint
object with its attributes set to the values of the namesake dictionary members in
p1.
Let point 2 be a new DOMPoint
object with its attributes set to the values of the namesake dictionary members in
p2.
Let point 3 be a new DOMPoint
object with its attributes set to the values of the namesake dictionary members in
p3.
Let point 4 be a new DOMPoint
object with its attributes set to the values of the namesake dictionary members in
p4.
Let bounds be a new DOMRectReadOnly
object describing the smallest bounding box of point 1, point 2,
point 3 and point 4.
Return a new DOMQuad
with p1
set to point 1, p2
set to
point 2, p3
set to point 3 and p4
set to point 4, and
let the associated bounding rectangle be bounds.
The p2 attribute must return the DOMPoint it was set to.
The p3 attribute must return the DOMPoint it was set to.
The p4 attribute must return the DOMPoint it was set to.
The bounds attribute must return the associated bounding rectangle.
The associated bounding rectangle is live; whenever the objects in p1, p2, p3 or p4 are changed, the associated bounding rectangle must update its attributes as appropriate to describe the new smallest bounding box of the four points.
The DOMMatrix and DOMMatrixReadOnly interfaces represent a mathematical matrix with the purpose of describing transformations in a graphical context. The following sections describe the details of the interface.
The DOMMatrix and DOMMatrixReadOnly interfaces replace the SVGMatrix interface from SVG [SVG11].
For legacy reasons, if the user agent supports SVG, Window objects must have a writable, configurable, non-enumerable property named SVGMatrix whose value is the DOMMatrix interface object. [SVG11]
A 4x4 matrix representing a DOMMatrix with items m11 to m44.
In the following sections, terms have the following meaning:
interface DOMMatrixReadOnly { // These attributes are simple aliases for certain elements of the 4x4 matrix readonly attribute unrestricted double a; readonly attribute unrestricted double b; readonly attribute unrestricted double c; readonly attribute unrestricted double d; readonly attribute unrestricted double e; readonly attribute unrestricted double f; readonly attribute unrestricted double m11; readonly attribute unrestricted double m12; readonly attribute unrestricted double m13; readonly attribute unrestricted double m14; readonly attribute unrestricted double m21; readonly attribute unrestricted double m22; readonly attribute unrestricted double m23; readonly attribute unrestricted double m24; readonly attribute unrestricted double m31; readonly attribute unrestricted double m32; readonly attribute unrestricted double m33; readonly attribute unrestricted double m34; readonly attribute unrestricted double m41; readonly attribute unrestricted double m42; readonly attribute unrestricted double m43; readonly attribute unrestricted double m44; // Immutable transform methods DOMMatrix translate(unrestricted double tx, unrestricted double ty, optional unrestricted double tz = 0); DOMMatrix scale(unrestricted double scale, optional unrestricted double originX = 0, optional unrestricted double originY = 0); DOMMatrix scale3d(unrestricted double scale, optional unrestricted double originX = 0, optional unrestricted double originY = 0, optional unrestricted double originZ = 0); DOMMatrix scaleNonUniform(unrestricted double scaleX, optional unrestricted double scaleY = 1, optional unrestricted double scaleZ = 1, optional unrestricted double originX = 0, optional unrestricted double originY = 0, optional unrestricted double originZ = 0); DOMMatrix rotate(unrestricted double angle, optional unrestricted double originX = 0, optional unrestricted double originY = 0); DOMMatrix rotateFromVector(unrestricted double x, unrestricted double y); DOMMatrix rotateAxisAngle(unrestricted double x, unrestricted double y, unrestricted double z, unrestricted double angle); DOMMatrix skewX(unrestricted double sx); DOMMatrix skewY(unrestricted double sy); DOMMatrix multiply(DOMMatrix other); DOMMatrix flipX(); DOMMatrix flipY(); DOMMatrix inverse(); // Helper methods boolean is2D(); boolean isIdentity(); unrestricted double determinant(); DOMPoint transformPoint(DOMPointInit point); Float32Array toFloat32Array(); Float64Array toFloat64Array(); stringifier; }; [Constructor, Constructor(DOMString transformList), Constructor(DOMMatrixReadOnly other), Constructor(Float32Array array32), Constructor(Float64Array array64), Constructor(sequence<unrestricted double> numberSequence)] interface DOMMatrix : DOMMatrixReadOnly { // These attributes are simple aliases for certain elements of the 4x4 matrix inherit attribute unrestricted double a; inherit attribute unrestricted double b; inherit attribute unrestricted double c; inherit attribute unrestricted double d; inherit attribute unrestricted double e; inherit attribute unrestricted double f; inherit attribute unrestricted double m11; inherit attribute unrestricted double m12; inherit attribute unrestricted double m13; inherit attribute unrestricted double m14; inherit attribute unrestricted double m21; inherit attribute unrestricted double m22; inherit attribute unrestricted double m23; inherit attribute unrestricted double m24; inherit attribute unrestricted double m31; inherit attribute unrestricted double m32; inherit attribute unrestricted double m33; inherit attribute unrestricted double m34; inherit attribute unrestricted double m41; inherit attribute unrestricted double m42; inherit attribute unrestricted double m43; inherit attribute unrestricted double m44; // Mutable transform methods void multiplyBy(DOMMatrix other); void preMultiplyBy(DOMMatrix other); void translateBy(unrestricted double tx, unrestricted double ty, optional unrestricted double tz = 0); void scaleBy(unrestricted double scale, optional unrestricted double originX = 0, optional unrestricted double originY = 0); void scale3dBy(unrestricted double scale, optional unrestricted double originX = 0, optional unrestricted double originY = 0, optional unrestricted double originZ = 0); void scaleNonUniformBy(unrestricted double scaleX, optional unrestricted double scaleY = 1, optional unrestricted double scaleZ = 1, optional unrestricted double originX = 0, optional unrestricted double originY = 0, optional unrestricted double originZ = 0); void rotateBy(unrestricted double angle, optional unrestricted double originX = 0, optional unrestricted double originY = 0); void rotateFromVectorBy(unrestricted double x, unrestricted double y); void rotateAxisAngleBy(unrestricted double x, unrestricted double y, unrestricted double z, unrestricted double angle); void skewXBy(unrestricted double sx); void skewYBy(unrestricted double sy); void invert(); };
The DOMMatrix()
constructor, when invoked, must run the following steps:
Should unit-less values (like for SVG transform presentation attribute) be allowed as string input for the constructor too? translate(20,20)
Do authors need to pass Element to provide a context for resolving relative and percentage values?
The following attributes m11 to m44 correspond to the 16 items of the matrix interfaces.
The following attributes a to b correspond to the 2D components of the matrix interfaces.
The following methods do not modify the current matrix and return a new DOMMatrix object.
Post-multiplies a translation transformation on the current matrix and returns the resulting matrix. The current matrix is not modified.
The 3D translation matrix is described in CSS Transforms [CSS3-TRANSFORMS].
Post-multiplies a uniform 2D scale transformation (m11 = m22 = scale) on the current matrix with the given origin and returns the resulting matrix. The current matrix is not modified.
The 2D scale matrix is described in CSS Transforms with sx = sy = scale. This does not include the origin translation. [CSS3-TRANSFORMS].
Post-multiplies a uniform scale transformation (m11 = m22 = m33 = scale) on the current matrix with the given origin and returns the resulting matrix. The current matrix is not modified.
The 3D scale matrix is described in CSS Transforms with sx = sy = sz = scale. This does not include the origin translation. [CSS3-TRANSFORMS].
Post-multiplies a non-uniform scale transformation on the current matrix with the given origin and returns the resulting matrix. The current matrix is not modified.
The 3D scale matrix is described in CSS Transforms with sx = scaleX, sy = scaleY and sz = scaleZ. This does not include the origin translation. [CSS3-TRANSFORMS].
Post-multiplies a rotation transformation on the current matrix with the given origin and returns the resulting matrix. The current matrix is not modified.
The 2D rotation matrix is described in CSS Transforms with alpha = angle. This does not include the origin translation. [CSS3-TRANSFORMS].
Post-multiplies a rotation transformation on the current matrix and returns the resulting matrix. The rotation angle is determined by the angle between the vector (1,0)T and (x,y)T in the clockwise direction. If x and y should both be zero, the angle is specified as zero. The current matrix is not modified.
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].
Post-multiplies a rotation transformation on the current matrix and returns the resulting matrix. The rotation of the transform is applied around the given vector. The current matrix is not modified.
What if all components of rotateAxisAngle() are 0 or undefined?
The 3D rotation matrix is described in CSS Transforms with alpha = angle
[CSS3-TRANSFORMS].
Post-multiplies a skewX transformation on the current matrix and returns the resulting matrix. The current matrix is not modified.
The 2D skewX matrix is described in CSS Transforms with alpha = sx [CSS3-TRANSFORMS].
Post-multiplies a skewX transformation on the current matrix and returns the resulting matrix.
The 2D skewY matrix is described in CSS Transforms with beta = sy [CSS3-TRANSFORMS].
DOMMatrix(-1, 0, 0, 1, 0, 0)
and returns the resulting matrix. The current matrix is not modified.
DOMMatrix(1, 0, 0, -1, 0, 0)
and returns the resulting matrix. The current matrix is not modified.
The following methods do modify the current matrix.
Post-multiplies a translation transformation on the current matrix.
The 3D translation matrix is described in CSS Transforms [CSS3-TRANSFORMS].
Post-multiplies a uniform 2D scale transformation (m11 = m22 = scale) on the current matrix with the given origin.
The 2D scale matrix is described in CSS Transforms with sx = sy = scale. This does not include the origin translation. [CSS3-TRANSFORMS].
Post-multiplies a uniform 2D scale transformation (m11 = m22 = m33 = scale) on the current matrix with the given origin.
The 3D scale matrix is described in CSS Transforms with sx = sy = sz = scale. This does not include the origin translation. [CSS3-TRANSFORMS].
Post-multiplies a non-uniform scale transformation on the current matrix with the given origin.
The 3D scale matrix is described in CSS Transforms with sx = scaleX, sy = scaleY and sz = scaleZ. This does not include the origin translation. [CSS3-TRANSFORMS].
Post-multiplies a rotation transformation on the current matrix with the given origin.
The 2D rotation matrix is described in CSS Transforms with alpha = angle. This does not include the origin translation. [CSS3-TRANSFORMS].
Post-multiplies a rotation transformation on the current matrix. The rotation angle is determined by the angle between the vector (1,0)T and (x,y)T in the clockwise direction. If x and y should both be zero, the angle is specified as zero.
The 2D rotation matrix is described in CSS Transforms where alpha
is the angle between the vector (1,0)T and (x,y)T in degrees [CSS3-TRANSFORMS].
Post-multiplies a rotation transformation on the current matrix. The rotation of the transform is applied around the given vector.
The 3D rotation matrix is described in CSS Transforms with alpha = angle [CSS3-TRANSFORMS].
Post-multiplies a skewX transformation on the current matrix.
The 2D skewX matrix is described in CSS Transforms with alpha = sx [CSS3-TRANSFORMS].
Post-multiplies a skewX transformation on the current matrix.
The 2D skewY matrix is described in CSS Transforms with beta = sy [CSS3-TRANSFORMS].
The following methods can be used to get general information about transformation matrices.
The editors would like to thank Robert O’Callahan for contributing to this specification.
Conformance requirements are expressed with a combination of descriptive assertions and RFC 2119 terminology. The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in the normative parts of this document are to be interpreted as described in RFC 2119. However, for readability, these words do not appear in all uppercase letters in this specification.
All of the text of this specification is normative except sections explicitly marked as non-normative, examples, and notes. [RFC2119]
Examples in this specification are introduced with the words "for example"
or are set apart from the normative text with class="example"
,
like this:
This is an example of an informative example.
Informative notes begin with the word "Note" and are set apart from the
normative text with class="note"
, like this:
Note, this is an informative note.
Conformance to this specification is defined for three conformance classes:
A style sheet is conformant to this specification if all of its statements that use syntax defined in this module are valid according to the generic CSS grammar and the individual grammars of each feature defined in this module.
A renderer is conformant to this specification if, in addition to interpreting the style sheet as defined by the appropriate specifications, it supports all the features defined by this specification by parsing them correctly and rendering the document accordingly. However, the inability of a UA to correctly render a document due to limitations of the device does not make the UA non-conformant. (For example, a UA is not required to render color on a monochrome monitor.)
An authoring tool is conformant to this specification if it writes style sheets that are syntactically correct according to the generic CSS grammar and the individual grammars of each feature in this module, and meet all other conformance requirements of style sheets as described in this module.
So that authors can exploit the forward-compatible parsing rules to assign fallback values, CSS renderers must treat as invalid (and ignore as appropriate) any at-rules, properties, property values, keywords, and other syntactic constructs for which they have no usable level of support. In particular, user agents must not selectively ignore unsupported component values and honor supported values in a single multi-value property declaration: if any value is considered invalid (as unsupported values must be), CSS requires that the entire declaration be ignored.
To avoid clashes with future CSS features, the CSS2.1 specification reserves a prefixed syntax for proprietary and experimental extensions to CSS.
Prior to a specification reaching the Candidate Recommendation stage in the W3C process, all implementations of a CSS feature are considered experimental. The CSS Working Group recommends that implementations use a vendor-prefixed syntax for such features, including those in W3C Working Drafts. This avoids incompatibilities with future changes in the draft.
Once a specification reaches the Candidate Recommendation stage, non-experimental implementations are possible, and implementors should release an unprefixed implementation of any CR-level feature they can demonstrate to be correctly implemented according to spec.
To establish and maintain the interoperability of CSS across implementations, the CSS Working Group requests that non-experimental CSS renderers submit an implementation report (and, if necessary, the testcases used for that implementation report) to the W3C before releasing an unprefixed implementation of any CSS features. Testcases submitted to W3C are subject to review and correction by the CSS Working Group.
Further information on submitting testcases and implementation reports can be found from on the CSS Working Group’s website at http://www.w3.org/Style/CSS/Test/. Questions should be directed to the [email protected] mailing list.
No properties defined.