W3C home > Mailing lists > Public > www-svg@w3.org > December 2008

Re: Event handling in clipping conditions

From: <thomas.deweese@kodak.com>
Date: Sun, 21 Dec 2008 14:11:03 -0500
To: schepers@w3.org
Cc: SVG WG <www-svg@w3.org>, www-svg-request@w3.org
Message-ID: <OF054538E3.8339D1EC-ON85257525.0081D509-85257526.006960FD@knotes.kodak.com>
Hi Doug,

   I'm a little confused on clipping with regards to element's that 
establish view-ports.
I get the impression that the WG seems to be adopting my suggestion on 
that point
(the implicit clip for a viewport element always clips events) in addition 
to the
clip-path clipping events for the visible pointer-event values.  Is my 
impression
correct?

schepers@w3.org wrote on 12/17/2008 01:25:18 PM:

> thomas.deweese@kodak.com wrote (on 12/10/08 7:09 AM):
> >> >> In what way is the behavior not consistent with mask?
> > 
> >> > from 14.3.1 Introduction:
> >> >
> >> >      A clipping path can be thought of as a mask wherein those 
pixels
> >> > outside the clipping path are black with an alpha value of zero and
> >> > those pixels inside the clipping path are white with an alpha value
> >> > of one (with the possible exception of anti-aliasing along the edge
> >> > of the silhouette).
> >>
> >> This strikes me more as an explanatory metaphor, rather than an
> >> implementation (or authoring) direction.  The basic concepts are
> >> similar, but they diverge from there.
> > 
> >    Well in Batik we actually do turn clip into a mask when
> > shape-rendering="geometricPrecision" on the clipPath element,
> > giving fully anti-aliased edges on the clip path[1].  For performance
> > we also support the more common 'hard edged' clip as well.
> 
> Cameron did not seem to think it would be hard to adapt the Batik code
> to match the more detailed description of clipping and pointer-events,
> so presumably this is not a blocker?

    Did I say the problem was in the code?  I was pointing out that 
currently clip is a strict subset of mask functionality.  You indicated 
that it wasn't and that implementations didn't treat it as such.  I was
making it clear that at least one implementation does exactly that. Adding 

this behavior to clip (without something similar in Mask) would break the 
current simple relationship (clip is just an optimized Mask).

> >    This change ties clip path to event propagation directly, perhaps
> > worse it ties the visibility values for pointer-events to clipping. 
> > I'm not sure how you would fix that later unless you simply broke
> > backwards compatibility, or end up with a default special 'backwards
> > compatibility' value (as mentioned in my other message).
> 
> The SVG WG doesn't see a conflict there.  Indeed, as you suggest, the
> initial value for such a property would be the same as the current
> behavior.  This is a pragmatic way of adding new properties.
> 
> So, this new potential value would be applicable to the <clipPath>
> element (as opposed to the current behavior, which is tied to the values
> on the "target" of the clip).  The initial value of the 'event-clip'
> property would be 'default' (or something), which would simply cede
> control of pointer-event behavior to the clipped elements.  There would
> be 3 additional values (please ignore the names for now), 'clip-area'
> (pointer events only on the areas not clipped), 'all' (pointer events on
> the clipped and non-clipped area), and 'none' (no pointer events).
> These values would probably override any "local" values, though I can
> also see a case for them being supplementary... that is, given the
> following:

   Except you can't easily break the relationship between visibility
and clip this way.  So you can no longer choose to cleanly extend 
pointer-events along the lines Robin suggested where it becomes a 
mini-syntax like:
        "(clipped|visible|fill|stroke|painted)*|none"

   Where each of those values sets a 'bit' that effects the element's
response to pointer-events.  The 'clipped' value would no longer make
sense since it was already tied to the "visible" bit being off.

> The members of the SVG WG thinks that though they are indeed orthogonal,
> yoking them in this way gives an intuitive and simple way to author
> content that behaves in a consistent way (an elegant hack).  The fact
> that the specification already yokes pointer-events with visibility
> makes this a natural extension.

   Since the WG agrees that clipping/visibility/events are all orthogonal
please pick a 'fix' for the current problem that allows you to treat
them as orthogonal in the future without usurping the current role
of the non-visible pointer-event values.

   I like the idea of adding a event-clip property down the road
but I think that the 'clip-visibility' option is a bad choice fore 
the default.  First without any way for  the 'clipper' to make 
absolutely sure events are clipped wrapping unknown content becomes 
difficult/impossible.  It also makes it 'really bad' for people to 
use  the 'hidden' pointer-event types unless they want their events 
to be completely unclipped.  So essentially all of my uses of it are 
suddenly 'bad' because I was simply trying to make unseen event
targets - which apparently the best practice for is now group opacity!

   Looking forward while I can see SVG Tiny adopting clip and 
interactivity/pointer-events in the near future it's less certain 
that it would adopt group-opacity (as that may require significant 
memory) so this workaround may be problematic for SVG Tiny in the 
future (unless you only allow zero and one).

> >    I don't really see a use case where some of the children of an
> > element should have event's clipped and others shouldn't.
> 
> How about a map where you can grab and drag clipped parts of the map
> into or out of the clip viewport, but location icons only pop up
> infobubbles when they are visible (inside the unclipped area)?

   This seems like a weak example as this is exactly what people
complain about with Batik not clipping content.  I'll allow that
within a page one might be able to make use of this but I don't
think it's a general use case.  In most cases the functionality 
will be harmless but I suspect far more people will 'trip' over 
it as the default than invoke it intentionally.  Once again I
don't have a problem with it as an option for event handling but
I think it will be a very problematic default value for future
specifications to inherit.

> But the more important part of this is not that different child elements
> could have different values... it's that authors have control over what
> the behavior is at all.

   The interesting thing is that I view this as removing author control.
I understand that this allows an author constructing a single complex 
document to have additional options that could prove useful.  But the 
single author case is a case where the author has lots of options for 
achieving various effects.  The case where an author doesn't control
it's "container" and needs to try and needs to "play nice" or the case 
where the author wants to contain arbitrary SVG content are tricker as 
it is difficult or impossible to impose rules on the other party.  For
these use cases (which I see as far more important) really the author
needs to be able to clip all events unconditionally.

> >       The problem is that this reuse of existing pointer-events values
> > means that a document that used 'visibility="hidden"' in conjunction
> > with 'pointer-events="fill"' to place event targets would suddenly 
have
> > those event targets have their events be unclipped.  Since I believe 
the
> > above set of properties is the 'best practice' for event targets I 
think
> > this is problematic as it would make such a document unable to be 
enclosed
> > in say a scroll-window (the case that triggered this whole issue).
> 
> I suspect that the use of that particular combination of elements and
> property values is not a common use case (though I'm happy to look at
> evidence to the contrary). 

    Please see my solitaire example in Batik:
 http://svn.apache.org/viewvc/xmlgraphics/batik/trunk/samples/sydney.svg

      I have a event catcher that uses pointer-events="fill".

 http://svn.apache.org/viewvc/xmlgraphics/batik/trunk/samples/solitaire
 
    In particular solitaire/script/card.js and solitaire/script/pile.js

    where I use this technique to cover cards that are drawn from an
external file.  I've used this in a number of other cases (actually
more commonly for a glass pane) but they aren't publicly available.

    Also you can see that I've provided this suggestion for quite a
long time on the Batik mail-lists:

http://www.nabble.com/how-can-I-create-a-svg-with-transparent-background-in-batik--to16761410.html#a16829850
http://www.nabble.com/SVGOMGElement-and-coordinates--to5795044.html#a5795218
http://www.nabble.com/Changing-cursor-to24522.html#a24815
http://www.nabble.com/Event-listener-not-called-to14987344.html#a15304049
http://www.nabble.com/how-to-access-a-GraphicsNode-to18806392.html#a18827973
http://www.nabble.com/Weird-problem-using-translations.-to1228541.html#a1243408

    Also these examples use the 'non-visible' values which would also have
problems:

        http://support.adobe.com/devsup/devsup.nsf/docs/52492.htm
        Describes how to make text unselectable with a hidden rect.
 
 
http://heml.mta.ca/viewsvn/?do=diff&project=Heml&path=/trunk/web/xslt/heml/output/svg/map/animated_map.xsl&rev=670&oldrev=492&raw=1
        Interesting because it is using a non-visible pointer-events
to make the interior of a polygon that is only stroked sensitive since
it represents a button.

   I hope this starts to open your eyes to how often the non-visible
pointer-event values are used.  All of these uses would become worst
practice since it means the content couldn't be embedded safely in
a mashup.

> A more common and better practice would be
> to establish a viewport via a nested SVG element, which is not affected
> by these clarifications (a point I have clarified in the errata).  Also,
> instead of using 'visibility', the author could use 'opacity' to create
> hidden event hotspots.  So, for the great majority of those cases, there
> is an easy workaround.

   The fact that I must move from visibility="hidden", which is explicitly 

called out for exactly the needed behavior by the current text of 
pointer-events to 'opacity="0.0004"' (or perhaps "0" if implementations 
have finally gotten that right) based on the text of an errata or else 
face 
the possibility of causing problems for people that want to embed my 
content 
seems just wrong.

> Ultimately, we simply have to make a choice about the behavior in order
> to get interoperability, and we are choosing what we think best serves
> the needs of the authors.  However, we value your viewpoint, and will be
> following up with other implementers to make sure that what we are
> proposing is suitable for them, as well.  If it turns out that they too
> disagree with our judgment here, then we will revisit this at that 
point.

   I strongly encourage the WG if it feels it _must_ add event clipping to
SVG 1.1 to choose to make the default your "clip-area" value (that would 
have the added advantage that at least two implementations would then be 
conformant).  People who did not want event clipping could use 'mask' 
instead for SVG 1.1. Down the road you could add the 'clip-visibilty' 
(or I would call it 'clip-optional' and allow  pointer-events to be 
sensitive 
to  events outside the "optional" event clip region). 

   Thanks for taking the time to review my feedback.
Received on Sunday, 21 December 2008 19:11:44 GMT

This archive was generated by hypermail 2.3.1 : Friday, 8 March 2013 15:54:41 GMT