W3C home > Mailing lists > Public > whatwg@whatwg.org > September 2013

Re: [whatwg] Path API feedback

From: Rik Cabanier <cabanier@gmail.com>
Date: Wed, 18 Sep 2013 17:03:47 -0700
Message-ID: <CAGN7qDCUNfxGvc7isRhYL8WLuxP_gk4PfvrrsOTV5VEMTL1COA@mail.gmail.com>
To: Ian Hickson <ian@hixie.ch>
Cc: whatwg <whatwg@lists.whatwg.org>
On Tue, Sep 17, 2013 at 10:20 AM, Ian Hickson <ian@hixie.ch> wrote:

> On Tue, 20 Aug 2013, Rik Cabanier wrote:
> > > On Sat, 23 Mar 2013, Rik Cabanier wrote:
> > > >
> > > > The current path APIs suffer from conflating path segments and
> > > > geometry. To fix this, I proposed to modify the API so path just
> > > > describe the path segments.
> > > >
> > > > http://blogs.adobe.com/webplatform/2013/01/31/revised-canvas-paths/
> > >
> > > I disagree with the premise of this post -- it's not the case that you
> > > never want to add segments. It is in fact quite common to add segments
> > > to a path -- that's what constructing a path is.
> >
> > I disagree. How many times does an author want to add segments to an
> > existing path?
>
> Pretty much every time they create a path with more than one segment.
>

Maybe I phrased that wrong. The existing path is a path that was created
earlier (and could have already been used to draw).
It's not often that you would want to append to such a path.

> Let's say an application stores a circle in a path and now want to draw
> > a rectangle too. You propose that the application just appends the
> > rectangle.
>
> No, not necessarily. It depends on what they want to do. If they want a
> single path that is constructed of a circle and a rectangle in the same
> way that it would be if they did:
>
>    x.beginPath();
>    x.arc(...);
>    x.rect(...);
>    x.fill();
>
> ...then yeah, they should just append the rectangle. But if they want the
> same effect as:
>
>    x.beginPath();
>    x.arc();
>    x.fill();
>    x.rect(...);
>    x.fill();
>
> ...then they should not just append them, since as you say, it won't work.
>

Yes, but for hit regions, you would have to calculate the area that these 2
fill operations covered.
This is why we need the extra 'union' API.


>
>
> > > Also, it's not at all clear to me that there's really a distinction
> > > between a "shape" and a "path". They're really the same thing -- sets
> > > of path segments.
> >
> > No. A shape is no longer a group of line segments. You *could* convert
> > it to such a thing but that requires a bunch of complex math (ie
> > http://www.youtube.com/watch?v=OmfliNQsk88) For now, I'm not proposing
> > to add that to the canvas API.
>
> Once the Path API is implemented, we can add any number of features, such
> as adding a path so as to form the union of both paths, adding a path so
> as to form the intersection of both paths, etc.
>

OK.
In order to make that possible, 'addPath', 'addPathByStrokingPath',
'addText' and 'addTextByStrokingText' should be cut from the interface.


>
>
> > The resulting 'path' will once again have no winding. This is very
> > confusing and extremely hard to implement
>
> I don't understand why it's hard to implement. It's just the non-Path API,
> but stored away for future use.
>
>
> > > Right now we have two options (ignoring the text parts of the path
> > > API): concatenating path segments, and concatenating path segments
> > > after having first outlined one of them.
> >
> > FYI the outlining algorithm is also not correct. It suffers from the
> > same issue that strokes are segments.
>
> Can you elaborate? (I think I may have asked already, in which case, my
> apologies for asking again.)
>

I started it in
http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2013-September/040810.html


>
>
> > > On the long run I think it would make sense to add other methods, e.g.
> > > one combining two or more paths together such that the resulting path
> > > would outline the union of the "insides" of the provided paths, or the
> > > intersections, or whatnot.
> >
> > I think that would be much more confusing and difficult to implement. I
> > didn't come up with this on my own :-). This is done by graphics
> > libraries that offers path manipulation support. For instance: skia:
> > http://skia-autogen.googlecode.com/svn/docs/html/classSkPathEffect.html
> > lib2geom: http://wiki.inkscape.org/wiki/index.php/WorkingWith2GeomFAQ
> > Direct2D:
> >
> http://msdn.microsoft.com/en-us/library/windows/desktop/dd756653(v=vs.85).aspx#path_geometries
>
> I'm confused. Are these examples of how to make confusing APIs, or
> examples of how the current API is confusing? Those look really, really
> complicated relative to what Canvas looks like today.
>

Those are examples how path composition is defined in graphic libraries.
I'm not proposing that we copy the APIs :-)
None of the libraries I listed, is working on the path operations
themselves (like you defined in canvas)


>
>
> On Thu, 5 Sep 2013, Rik Cabanier wrote:
> >
> > The problem happens when you call fill or stroke multiple times.
> > [...]
> > Now I want to create a region that covers what was drawn.
> > [...]
> > 'p' won't describe the same area as what was filled.
>
> Sure, for that you need a new API function, e.g. union, which as I've
> mentioned before, I think would be a logical addition to the API in due
> course. But I don't think we should add features too quickly, lest we get
> too far ahead of browsers.


That sounds reasonable.
So please remove the APIs such as AddPathByStrokingPath that rely on these
difficult algorithms.
Received on Thursday, 19 September 2013 00:04:11 UTC

This archive was generated by hypermail 2.4.0 : Wednesday, 22 January 2020 17:00:09 UTC