# [whatwg] [Canvas] Behavior on non-invertable CTM

Rik Cabanier cabanier at gmail.com
Thu Feb 6 15:24:00 PST 2014

```On Thu, Feb 6, 2014 at 2:14 PM, Justin Novosad <junov at google.com> wrote:

> On Tue, Jul 23, 2013 at 2:11 PM, Ian Hickson <ian at hixie.ch> wrote:
>
> >
> > > >> The second does setTransform(0,0,0,0,0,0), which should reset the
> CTM
> > > >> to a zero matrix (again, not invertible). IE, Opera and FF draw a
> > > >> line to 0,0 and close the path afterwards (which kind of makes
> sense,
> > > >> since the universe is convoluted to one point). WebKit refuses the
> > > >> lineTo command and closes the path as expected.
> > > >
> > > > WebKit seems to just be wrong here, and the others right.
> > >
> > > Since this is not written in the spec
> >
> > As far as I can tell, it _is_ written in the spec. scale(0,0) would
> reduce
> > all coordinates and lines and so forth to 0,0. That's what the spec
> > requires. I don't see the problem here.
> >
> >
> I am looking into correcting Chrome's behavior to make it spec-compliant in
> this case.

Wow. That would be really impressive!
Given the algorithm for 'tracing a path' [1], what would the following
fiddle look like? http://jsfiddle.net/bn3LF/4/

> There is one specific primitive that is proving problematic:
> arcTo
> The problem is that the algorithm needs to bring the last point in the
> subpath into the arc's local coordinate space, which requires inverting the
> CTM.
>
> I would like to suggest a small amendment to the spec:
>
> Current text:
> If the point (x0, y0) is equal to the point (x1, y1), or if the point (x1,
> y1) is equal to the point (x2, y2), or if both radiusX and radiusY are
> zero, then the method must add the point (x1, y1) to the subpath, and
> connect that point to the previous point (x0, y0) by a straight line.
>
> If the current transformation matrix is not invertible, then the method
> must add the point (x1, y1) to the subpath, and connect that point to the
> previous point in the subpath by a straight line.
>
> Note: I used "previous point in the subpath" rather than "(x0, y0)",
> because the point is only defined in global space, and not in local space
> due to the CTM being singular.
>
> I have not yet investigated what other browsers are doing in this case.
> Feedback from other implementers would be appreciated.
>
> As far as I can tell, quadraticCurveTo and bezierCurveTo do not have this
> problem because the curves can be computed by first transforming all points
> to global coordinate space, to compute the curves in global space.
>

1:
http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#trace-a-path

```