canvas
elementwidth
height
interface HTMLCanvasElement : HTMLElement {
attribute unsigned long width;
attribute unsigned long height;
DOMString toDataURL(in optional DOMString type, in any... args);
void toBlob(in FileCallback, in optional DOMString type, in any... args);
object getContext(in DOMString contextId, in any... args);
};
The canvas
element provides scripts with a
resolution-dependent bitmap canvas, which can be used for rendering
graphs, game graphics, or other visual images on the fly.
Authors should not use the canvas
element in a
document when a more suitable element is available. For example, it
is inappropriate to use a canvas
element to render a
page heading: if the desired presentation of the heading is
graphically intense, it should be marked up using appropriate
elements (typically h1
) and then styled using CSS and
supporting technologies such as XBL.
When authors use the canvas
element, they must also
provide content that, when presented to the user, conveys
essentially the same function or purpose as the bitmap canvas. This
content may be placed as content of the canvas
element. The contents of the canvas
element, if any,
are the element's fallback content.
In interactive visual media, if scripting is enabled for the
canvas
element, and if support for canvas
elements has been enabled, the canvas
element
represents embedded content consisting of
a dynamically created image.
In non-interactive, static, visual media, if the
canvas
element has been previously painted on (e.g. if
the page was viewed in an interactive visual medium and is now being
printed, or if some script that ran during the page layout process
painted on the element), then the canvas
element
represents embedded content with the
current image and size. Otherwise, the element represents its
fallback content instead.
In non-visual media, and in visual media if scripting is disabled for the
canvas
element or if support for canvas
elements has been disabled, the canvas
element
represents its fallback content
instead.
When a canvas
element represents
embedded content, the user can still focus descendants
of the canvas
element (in the fallback
content). When an element is focused, it is the target of
keyboard interaction events (even though the element itself is not
visible). This allows authors to make an interactive canvas
keyboard-accessible: authors should have a one-to-one mapping of
interactive regions to focusable elements in the fallback
content. (Focus has no effect on mouse interaction
events.) [DOMEVENTS]
The canvas
element has two attributes to control the
size of the coordinate space: width
and height
. These
attributes, when specified, must have values that are valid non-negative
integers. The rules for parsing
non-negative integers must be used to obtain their numeric
values. If an attribute is missing, or if parsing its value returns
an error, then the default value must be used instead. The
width
attribute defaults to
300, and the height
attribute defaults to 150.
The intrinsic dimensions of the canvas
element equal
the size of the coordinate space, with the numbers interpreted in
CSS pixels. However, the element can be sized arbitrarily by a
style sheet. During rendering, the image is scaled to fit this layout
size.
The size of the coordinate space does not necessarily represent the size of the actual bitmap that the user agent will use internally or during rendering. On high-definition displays, for instance, the user agent may internally use a bitmap with two device pixels per unit in the coordinate space, so that the rendering remains at high quality throughout.
When the canvas
element is created, and subsequently
whenever the width
and height
attributes are set (whether
to a new value or to the previous value), the bitmap and any
associated contexts must be cleared back to their initial state and
reinitialized with the newly specified coordinate space
dimensions.
When the canvas is initialized, its bitmap must be cleared to transparent black.
The width
and
height
IDL
attributes must reflect the respective content
attributes of the same name, with the same defaults.
Only one square appears to be drawn in the following example:
// canvas is a reference to a <canvas> element var context = canvas.getContext('2d'); context.fillRect(0,0,50,50); canvas.setAttribute('width', '300'); // clears the canvas context.fillRect(0,100,50,50); canvas.width = canvas.width; // clears the canvas context.fillRect(100,0,50,50); // only this square remains
getContext
(contextId [, ... ])Returns an object that exposes an API for drawing on the canvas. The first argument specifies the desired API. Subsequent arguments are handled by that API.
The list of defined contexts is given on the WHATWG Wiki CanvasContexts page. [WHATWGWIKI]
Returns null if the given context ID is not supported or if the
canvas has already been initialised with some other (incompatible)
context type (e.g. trying to get a "2d
" context after getting a
"webgl
" context).
A canvas
element can have a primary
context, which is the first context to have been obtained for
that element. When created, a canvas
element must not
have a primary context.
The most commonly used primary context is the HTML Canvas 2D Context.
The getContext(contextId, args...)
method of the canvas
element, when invoked, must run
the following steps:
Let contextId be the first argument to the method.
If contextId is not the name of a context supported by the user agent, return null and abort these steps.
An example of this would be a user agent that
theoretically supports the "webgl
" 3D context, in the case
where the platform does not have hardware support for OpenGL and
the user agent does not have a software OpenGL implementation.
Despite the user agent recognising the "webgl
" name, it would return
null at this step because that context is not, in practice,
supported at the time of the call.
If the element has a primary context and that context's entry in the WHATWG Wiki CanvasContexts page does not list contextId as a context with which it is compatible, return null and abort these steps. [WHATWGWIKI]
If the element does not have a primary context, let the element's primary context be contextId.
If the getContext()
method has
already been invoked on this element for the same contextId, return the same object as was returned
that time, and abort these steps. The additional arguments are
ignored.
Return a new object for contextId, as defined by the specification given for contextId's entry in the WHATWG Wiki CanvasContexts page. [WHATWGWIKI]
New context types may be registered in the WHATWG Wiki CanvasContexts page. [WHATWGWIKI]
Anyone is free to edit the WHATWG Wiki CanvasContexts page at any time to add a new context type. These new context types must be specified with the following information:
The value of contextID that will return the object for the new API.
A link to a formal specification of the context type's API. It could be another page on the Wiki, or a link to an external page. If the type does not have a formal specification, an informal description can be substituted until such time as a formal specification is available.
The list of context types that are compatible with this one (i.e. that operate on the same underlying bitmap). This list must be transitive and symmetric; if one context type is defined as compatible with another, then all types it is compatible with must be compatible with all types the other is compatible with.
Vendors may also define experimental contexts using the syntax
vendorname-context
, for example,
moz-3d
. Such contexts should be registered in the
WHATWG Wiki CanvasContexts page.
toDataURL
( [ type, ... ])Returns a data:
URL for the image in the canvas.
The first argument, if provided, controls the type of the image
to be returned (e.g. PNG or JPEG). The default is image/png
; that type is also used if the given
type isn't supported. The other arguments are specific to the
type, and control the way that the image is generated, as given in
the table below.
When trying to use types other than "image/png
",
authors can check if the image was really returned in the
requested format by checking to see if the returned string starts
with one of the exact strings "data:image/png,
" or "data:image/png;
". If it does, the image is PNG,
and thus the requested type was not supported. (The one exception
to this is if the canvas has either no height or no width, in
which case the result might simply be "data:,
".)
toBlob
(callback [, type, ... ])Creates a Blob
object representing a file
containing the image in the canvas, and invokes a callback with a
handle to that object.
The second argument, if provided, controls the type of the
image to be returned (e.g. PNG or JPEG). The default is image/png
; that type is also used if the given
type isn't supported. The other arguments are specific to the
type, and control the way that the image is generated, as given in
the table below.
The toDataURL()
method
must run the following steps:
If the canvas has no pixels (i.e. either its horizontal
dimension or its vertical dimension is zero) then return the string
"data:,
" and abort these steps. (This is the
shortest data:
URL; it represents the empty string in a text/plain
resource.)
Let file be a serialization of the image as a file, using the method's arguments (if any) as the arguments.
The toBlob()
method
must run the following steps:
Let callback be the first argument.
Let arguments be the second and subsequent arguments to the method, if any.
Let file be a serialization of the image as a file, using arguments.
Return, but continue running these steps asynchronously.
If callback is null, abort these steps.
Queue a task to invoke the
FileCallback
callback with a
Blob
object representing file as
its argument. The task source for this task is the
canvas blob serialization task source. [FILESYSTEMAPI] [FILEAPI]
When a user agent is to create a serialization of the image as a file, optionally with some given arguments, it must create an image file in the format given by the first value of arguments, or, if there are no arguments, in the PNG format. [PNG]
If arguments is not empty, the first value must be interpreted as a MIME type giving the format to use. If the type has any parameters, it must be treated as not supported.
For example, the value "image/png
" would
mean to generate a PNG image, the value "image/jpeg
"
would mean to generate a JPEG image, and the value
"image/svg+xml
" would mean to generate an SVG image
(which would probably require that the implementation actually keep
enough information to reliably render an SVG image from the canvas).
User agents must support PNG ("image/png
"). User
agents may support other types. If the user agent does not support
the requested type, it must create the file using the PNG format. [PNG]
User agents must convert the provided type to ASCII lowercase before establishing if they support that type.
For image types that do not support an alpha channel, the serialized image must be the canvas image composited onto a solid black background using the source-over operator.
If the first argument in arguments gives a type corresponding to one of the types given in the first column of the following table, and the user agent supports that type, then the subsequent arguments, if any, must be treated as described in the second cell of that row.
Type | Other arguments | Reference |
---|---|---|
image/jpeg
| The second argument, if it is a number in the range 0.0 to 1.0 inclusive, must be treated as the desired quality level. If it is not a number or is outside that range, the user agent must use its default value, as if the argument had been omitted. | [JPEG] |
For the purposes of these rules, an argument is considered to be
a number if it is converted to an IDL double value by the rules for
handling arguments of type any
in the Web IDL
specification. [WEBIDL]
Other arguments must be ignored and must not cause the user agent to raise an exception. A future version of this specification will probably define other parameters to be passed to these methods to allow authors to more carefully control compression settings, image metadata, etc.
The canvas
APIs must perform color correction at
only two points: when rendering images with their own gamma
correction and color space information onto the canvas, to convert
the image to the color space used by the canvas (e.g. using the 2D
Context's drawImage()
method with an HTMLImageElement
object), and when
rendering the actual canvas bitmap to the output device.
Thus, in the 2D context, colors used to draw shapes
onto the canvas will exactly match colors obtained through the getImageData()
method.
The toDataURL()
method
must not include color space information in the resource
returned. Where the output format allows it, the color of pixels in
resources created by toDataURL()
must match those
returned by the getImageData()
method.
In user agents that support CSS, the color space used by a
canvas
element must match the color space used for
processing any colors for that element in CSS.
The gamma correction and color space information of images must
be handled in such a way that an image rendered directly using an
img
element would use the same colors as one painted on
a canvas
element that is then itself
rendered. Furthermore, the rendering of images that have no color
correction information (such as those returned by the toDataURL()
method) must be
rendered with no color correction.
Thus, in the 2D context, calling the drawImage()
method to render
the output of the toDataURL()
method to the
canvas, given the appropriate dimensions, has no visible effect.
canvas
elementsInformation leakage can occur if scripts from one origin can access information (e.g. read pixels) from images from another origin (one that isn't the same).
To mitigate this, canvas
elements are defined to
have a flag indicating whether they are origin-clean. All
canvas
elements must start with their
origin-clean set to true. The flag must be set to false if
any of the following actions occur:
The element's 2D context's drawImage()
method is
called with an HTMLImageElement
or an
HTMLVideoElement
whose origin is not the
same as that of the
Document
object that owns the canvas
element.
The element's 2D context's drawImage()
method is
called with an HTMLCanvasElement
whose
origin-clean flag is false.
The element's 2D context's fillStyle
attribute is set
to a CanvasPattern
object that was created from an
HTMLImageElement
or an HTMLVideoElement
whose origin was not the same as that of the Document
object
that owns the canvas
element when the pattern was
created.
The element's 2D context's fillStyle
attribute is set
to a CanvasPattern
object that was created from an
HTMLCanvasElement
whose origin-clean flag was
false when the pattern was created.
The element's 2D context's strokeStyle
attribute is
set to a CanvasPattern
object that was created from an
HTMLImageElement
or an HTMLVideoElement
whose origin was not the same as that of the Document
object
that owns the canvas
element when the pattern was
created.
The element's 2D context's strokeStyle
attribute is
set to a CanvasPattern
object that was created from an
HTMLCanvasElement
whose origin-clean flag was
false when the pattern was created.
The element's 2D context's fillText()
or strokeText()
methods are
invoked and consider using a font that has an origin
that is not the same as that of
the Document
object that owns the canvas
element. (The font doesn't even have to be used; all that matters
is whether the font was considered for any of the glyphs
drawn.)
Whenever the toDataURL()
method of a
canvas
element whose origin-clean flag is set to
false is called, the method must raise a SECURITY_ERR
exception.
Whenever the getImageData()
method of
the 2D context of a canvas
element whose
origin-clean flag is set to false is called with otherwise
correct arguments, the method must raise a SECURITY_ERR
exception.
Whenever the measureText()
method of
the 2D context of a canvas
element ends up using a font
that has an origin that is not the same as that of the Document
object that
owns the canvas
element, the method must raise a
SECURITY_ERR
exception.
Even resetting the canvas state by changing its
width
or height
attributes doesn't reset
the origin-clean flag.