[whatwg] Canvas-related feedback
Ian Hickson
ian at hixie.ch
Mon Jul 22 12:38:47 PDT 2013
On Thu, 20 Dec 2012, Rik Cabanier wrote:
> On Thu, 20 Sep 2012, Dirk Schulze wrote:
> > > On Sep 21, 2012, at 3:12 AM, Ian Hickson <ian at hixie.ch> wrote:
> > > >>
> > > >> The only situation that might be reasonable would be a transform
> > > >> on the Canvas that an author want to cover in the Path. But for
> > > >> the rare case where this matters, you can create a new Path
> > > >> object, add your path with the transform and call isPointInPath.
> > > >
> > > > Yeah, you could do that too.
> > > >
> > > >> Furthermore, a transform() function that applies to a Path object
> > > >> seems to be useable as well.
> > > >
> > > > You can create a new Path, then add another Path to it while
> > > > applying a transform, using the addPath() method.
> > >
> > > Yes, it is possible. But there are two reasons why I think that it
> > > still makes sense to use a transform function. First it seems
> > > natural to have a transform on Path object, like the
> > > CanvasRenderingContext2D already has. Both share a lot of functions,
> > > why disallow it for transforms?
> >
> > The main reason I didn't add it to Path is because it led to a bit of
> > confusion in terms of what the transform applied to. Does it apply
> > when you add points _to_ the path? Does it apply when you draw the
> > path on another path or the canvas? Also, one of the more confusing
> > aspects of the canvas API is that you can change the coordinate space
> > while adding lines to the path, and we had a whole era wherein
> > implemenations and the spec were confused as to what exactly happened
> > when (did the points get transformed? Did the transform apply only
> > when you stroke? etc).
> >
> > So in the new API I side-stepped the whole problem.
>
> I don't understand. How did you sidestep the problem?
By not having a transform on Path.
> It is still confusing. for instance, reading the current spec,
> transforms happen before stroking in addPathByStrokingPath, but after
> stroking in addPathByStrokingText. Why is that?
That was just an oversight. Fixed. Thanks.
> Wouldn't it be easier to have API's that
> - create a path with svg path data
> - create a path with text (and a style)
> - stroke a path with a style
> - add a path with a optional transform
How does this differ from what we have? Do you just mean move the
Text-based methods from being add*() methods to being Path constructors? I
guess we could do that, I don't really see a compelling argument one way
or the other. The current model is to use add*() for as much as possible;
the only non-trivial constructors we have are a copy constructor, for
convenience, and the SVG-based constructor, which is not an add*() method
because I didn't want to try to explain how SVG path processing interacted
with existing subpaths.
> We also should discuss what 'adding' a path means. Currently, the shapes
> are simply aggregated which will only work for simple cases.
Proposals welcome. :-)
> > On Fri, 21 Sep 2012, Rik Cabanier wrote:
> > > On Fri, Sep 21, 2012 at 2:12 AM, Ian Hickson <ian at hixie.ch> wrote:
> > > > On Thu, 20 Sep 2012, Dirk Schulze wrote:
> > > > >
> > > > > The interface of CanvasRenderingContext2D currently has a
> > > > > function called isPointInPath() with a Path object as input [1].
> > > > > I wonder why this needs to be on the context interface. Wouldn't
> > > > > it make more sense on the interface of Path object itself? If an
> > > > > implementation really needs a context to get a point on a path
> > > > > it, it can create it on it's own.
> > > >
> > > > I don't think it would make _more_ sense, but I agree that it
> > > > would make equal amounts of sense.
> > > >
> > > > In practice you're pretty much always going to have a context
> > > > around when you want to check this, because the reason you'd use
> > > > it is to see where I mouse click landed on a canvas. And you're
> > > > going to want the Path object transformed as per the transform on
> > > > the canvas, generally speaking.
> > >
> > > Not necessarily. The path object makes sense outside of canvas as
> > > well. You don't need a context to create it so we are thinking of
> > > integrating it with SVG. It would increase interop and simplfy the
> > > API's if you could ask SVG elements for their path, or create them
> > > with one.
> >
> > Sure, but with SVG you don't need to know if a point is in a path,
> > because the events get dispatched to the right path by the UA.
>
> That assumes that you always have an event handler attached to the path.
No, not at all. Even if the event handler is a global listener, it still
gets the target information in the event object.
> This might not always be the case. For instance in a game, you might
> want to know what region of the character you hit.
I don't see how having a "isPointInPath" method on a Path object would
help with that. You'd still need to have the path transformed; if this was
canvas, you'd want to check each of the actual paths against the actual
canvas (or more likely, use a hit region), if it was SVG, you'd check what
the target of the event was.
> > > Maybe if there was a 'currentpath' property on the 2d context, you
> > > can move 'isPointInPath' to the path object. This would let you get
> > > rid of the extra 'isPointInPath' that takes a path too.
> > >
> > > so:
> > > myContext.currentpath.isPointInPath(...)
> >
> > I don't really see what problem this solves.
>
> It simplifies the API and gives you access to the current path.
I don't see how this is simpler. It's exactly as complex, as far as I can
tell. I don't understand what being able to access the current path gives
you. Not being able to access it doesn't seem, a priori, to be a problem.
> > > I agree with Ian that there shouldn't be a method that changes the
> > > current points in a path. However, if there was a 'transform'
> > > function that took a matrix and returned a transformed path, it
> > > would do what Dirk wants. In addition, the path API's could be
> > > simplified since you can take out all the 'transform' arguments.
> >
> > Can you elaborate on the use case for this?
>
> Simplify the API's so they're easier to understand and implement.
I don't see how it simplifies the API for authors.
Could you elaborate on why it's simpler for implementors?
> > > > https://dvcs.w3.org/hg/FXTF/rawfile/tip/compositing/index.html
> > > >
> > > > Would it make sense to have the canvas section defer to this spec
> > > > for all blending, filtering, and compositing?
> > >
> > > I think it does since then everyting will be in 1 location. I would
> > > need to update the blending spec for canvas because it behaves
> > > differently than HTML and SVG.
> >
> > Ok, let me know when I should do this.
>
> There's a first draft posted here:
> https://dvcs.w3.org/hg/FXTF/rawfile/tip/compositing/index.html#canvascompositingandblending
Ok, I've deferred to that. Implementors, if you don't want to implement
this, please let me know. Rik, if the integration is not correct, let mek
know.
> > On Sun, 16 Dec 2012, Rik Cabanier wrote:
> > >
> > > It seems a bit too expensive to add a variable to the graphics
> > > context that is checked for just this call.
> >
> > Why would it be expensive?
>
> A UA would have to initialize and store the value in each drawing state.
> Maybe not super expensive, but if we keep adding things to the state, it
> will eventually make a difference.
This is one bit. I don't think it'll break the bank. It's cheaper than
adding a new blend type.
On Wed, 9 Jan 2013, Dirk Schulze wrote:
>
> After all the discussions about winding rules and the new introduced
> enumeration for "nonzero" and "even odd", I wonder if the the
> compositing and blending modes should be two enumerations as well.
>
> enum CanvasCompositingMode {
> "source-over",
> "source-in",
> …
> }
>
> and
>
> enum CanvasBlendingMode {
> "normal",
> "multiply",
> ...
> }
>
> This wouldn't actually change the behavior or definition a lot, but
> might help to cleanup a bit. I am happy about other names if they are
> not good enough.
I'm fine with doing this; since right now the spec just defers to Rik's
spec, it'd be up to Rik to define the enum for me to hook into.
On Wed, 9 Jan 2013, Rik Cabanier wrote:
>
> the 'globalCompositeOperation' property takes the same syntax as the css
> 'mix' so I don't think an enum will work.
As specced today, it takes a single keyword, so an enum would work. To
move it beyond that, we'd need to make sure we had implementor buy-in, and
then we'd have to update the composition and HTML specs.
--
Ian Hickson U+1047E )\._.,--....,'``. fL
http://ln.hixie.ch/ U+263A /, _.. \ _\ ;`._ ,.
Things that are impossible just take longer. `._.-(,_..'--(,_..'`-.;.'
More information about the whatwg
mailing list