[whatwg] Offscreen canvas (or canvas for web workers).
Drew Wilson
atwilson at google.com
Mon Feb 22 11:57:51 PST 2010
On Mon, Feb 22, 2010 at 11:13 AM, David Levin <levin at google.com> wrote:
> I've talked with some other folks on WebKit (Maciej and Oliver) about
> having a canvas that is available to workers. They suggested some nice
> modifications to make it an offscreen canvas, which may be used in the
> Document or in a Worker.
>
> Proposal:
> Introduce an OffscreenCanvas which may be created from a Document or a
> Worker context.
>
> interface OffscreenCanvas {
> attribute unsigned long width;
> attribute unsigned long height;
> DOMString toDataURL (in optional DOMString type, in any... args);
> object getContext(in DOMString contextId);
> };
>
>
> When it is created in the Worker context, OffscreenCanvas.getContext("2d")
> returns a CanvasWorkerContext2D. In the Document context, it returns a
> CanvasRenderingContext2D.
>
> The base class for both CanvasWorkerContext2D and CanvasRenderingContext2D
> is CanvasContext2D. CanvasContext2D is just like a CanvasRenderingContext2D
> except for omitting the font methods and any method which uses HTML
> elements. It does have some replacement methods for createPattern/drawImage
> which take an OffscreenCanvas. The canvas object attribute is either a
> HTMLCanvasElement or an OffscreenCanvas depending on what the canvas context
> came from.
>
> interface CanvasContext2D {
> readonly attribute object canvas;
>
> void save();
> void restore();
>
> void scale(in float sx, in float sy);
> void rotate(in float angle);
> void translate(in float tx, in float ty);
> void transform(in float m11, in float m12, in float m21, in float
> m22, in float dx, in float dy);
> void setTransform(in float m11, in float m12, in float m21, in
> float m22, in float dx, in float dy);
>
> attribute float globalAlpha;
> attribute [ConvertNullToNullString] DOMString
> globalCompositeOperation;
>
> CanvasGradient createLinearGradient(in float x0, in float y0, in
> float x1, in float y1)
> raises (DOMException);
> CanvasGradient createRadialGradient(in float x0, in float y0, in
> float r0, in float x1, in float y1, in float r1)
> raises (DOMException);
> CanvasPattern createPattern(in OffscreenCanvas image, in DOMString
> repetition);
>
> attribute float lineWidth;
> attribute [ConvertNullToNullString] DOMString lineCap;
> attribute [ConvertNullToNullString] DOMString lineJoin;
> attribute float miterLimit;
>
> attribute float shadowOffsetX;
> attribute float shadowOffsetY;
> attribute float shadowBlur;
> attribute [ConvertNullToNullString] DOMString shadowColor;
>
> void clearRect(in float x, in float y, in float width, in float
> height);
> void fillRect(in float x, in float y, in float width, in float
> height);
> void strokeRect(in float x, in float y, in float w, in float h);
>
> void beginPath();
> void closePath();
> void moveTo(in float x, in float y);
> void lineTo(in float x, in float y);
> void quadraticCurveTo(in float cpx, in float cpy, in float x, in
> float y);
> void bezierCurveTo(in float cp1x, in float cp1y, in float cp2x, in
> float cp2y, in float x, in float y);
> void arcTo(in float x1, in float y1, in float x2, in float y2, in
> float radius);
> void rect(in float x, in float y, in float width, in float height);
> void arc(in float x, in float y, in float radius, in float
> startAngle, in float endAngle, in boolean anticlockwise);
> void fill();
> void stroke();
> void clip();
> boolean isPointInPath(in float x, in float y);
>
> void drawImage(in OffscreenCanvas image, in float dx, in float dy,
> in optional float dw, in optional float dh);
> void drawImage(in OffscreenCanvas image, in float sx, in float sy,
> in float sw, in float sh, in float dx, in float dy, in float dw, in float
> dh);
>
> // pixel manipulation
> ImageData createImageData(in float sw, in float sh)
> raises (DOMException);
> ImageData getImageData(in float sx, in float sy, in float sw, in
> float sh)
> raises(DOMException);
> void putImageData(in ImageData imagedata, in float dx, in float dy,
> in optional float dirtyX, in optional float dirtyY, in optional float
> dirtyWidth, in optional float dirtyHeight]);
> };
>
> interface CanvasWorkerContext2D : CanvasContext2D {
> };
>
> interface CanvasRenderingContext2D : CanvasContext2D {
> CanvasPattern createPattern(in HTMLImageElement image, in
> DOMString repetition);
> CanvasPattern createPattern(in HTMLCanvasElement image, in
> DOMString repetition);
> CanvasPattern createPattern(in HTMLVideoElement image, in
> DOMString repetition);
>
> // focus management
> boolean drawFocusRing(in Element element, in float xCaret, in
> float yCaret, in optional boolean canDrawCustom);
>
> // text
> attribute DOMString font;
> attribute DOMString textAlign;
> attribute DOMString textBaseline;
> void fillText(in DOMString text, in float x, in float y, in
> optional float maxWidth);
> void strokeText(in DOMString text, in float x, in float y, in
> optional float maxWidth);
> TextMetrics measureText(in DOMString text);
>
> // drawing images
> void drawImage(in HTMLImageElement image, in float dx, in float dy,
> in optional float dw, in float dh);
> void drawImage(in HTMLImageElement image, in float sx, in float sy,
> in float sw, in float sh, in float dx, in float dy, in float dw, in float
> dh);
> void drawImage(in HTMLVideoElement image, in float dx, in float dy,
> in optional float dw, in optional float dh);
> void drawImage(in HTMLVideoElement image, in float sx, in float sy,
> in float sw, in float sh, in float dx, in float dy, in float dw, in float
> dh);
>
> void drawImage(in HTMLCanvasElement image, in float dx, in float
> dy, in optional float dw, in float dh);
> void drawImage(in HTMLCanvasElement image, in float sx, in float
> sy, in float sw, in float sh, in float dx, in float dy, in float dw, in
> float dh);
>
> };
>
> Questions and comments are welcome.
>
> Note that something similar did come up in December and this proposal
> avoids doing any text related items in the offscreen canvas which was a
> concern brought up by Robert O'Callahan at the time (
> http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2009-December/024478.html
> ).
>
Do we feel that text APIs are, in general, difficult to implement in a
multi-thread safe manner? Or would we be limiting this API primarily because
of the specifics of a single current implementation? Because if it's the
latter, I would argue against omitting the text APIs, since they seem
fundamental to many use cases. It seems like there are a range of solutions
for retrofitting multi-thread support to non-multi-thread-safe operations,
ranging from the use of global mutexes to changing the code itself to be
safely re-entrant.
>
> Dave
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.whatwg.org/pipermail/whatwg-whatwg.org/attachments/20100222/b90b6cd6/attachment-0002.htm>
More information about the whatwg
mailing list