[whatwg] Offscreen canvas (or canvas for web workers).

On Mon, Feb 22, 2010 at 7:57 PM, Drew Wilson <atwilson at google.com> wrote:

>
>
> 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.
>

It does indeed seem pretty short sighted.

Why can't implementations that aren't able to render text (or whatever) on a
worker thread simply schedule such work on their main thread?  I know it
defeats the parallelism, but it's better than _some_ implementations are
single threaded when doing things like rendering text rather than _all_
implementations (not to mention that it's easier from the web developer's
perspective).
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.whatwg.org/pipermail/whatwg-whatwg.org/attachments/20100222/165a32b9/attachment-0001.htm>

Received on Monday, 22 February 2010 14:35:33 UTC