W3C home > Mailing lists > Public > www-svg@w3.org > February 2012

Re: Mask and Clip behavior

From: Jeremie Patonnier <jeremie.patonnier@gmail.com>
Date: Sat, 11 Feb 2012 21:28:18 +0100
Message-ID: <CAEi838keUPAn1ZEjn1vk4yhAncWpJ-ca_oQdY+2x+srOG127-g@mail.gmail.com>
To: "Tab Atkins Jr." <jackalmage@gmail.com>
Cc: www-svg <www-svg@w3.org>

Tab, thanks for this enlightenment :)

2012/2/11 Tab Atkins Jr. <jackalmage@gmail.com>

> The *Units attributes don't change the meaning of percentages, they
> just change the size of userspace units so that one unit is the size
> of the object bounding box.

Ok, I see... after reading the spec again and again, and again... It's some
kind of treasure hunt to find why it behaves that way. And as an author, I
have to say that when I read this I thought : "WTF!!!!! (o_O)".

It's pretty hard to understand this because, conceptually, there is no
difference between ".xx" in a [0,1] range and "xx%"

I think the SVG 1.1 spec is somewhat misleading (and could be clarified).
Let's go back to the treasure hunt and let me tell you the poor story of
the author trying to "have fun" with SVG (remember, it's the way an AUTHOR
will read the spec... yes, yes, yes, I know, spec are not made for author,
anyway, I guess it's also painful for implementor to read it) :

   1. Let's start by reading the maskUnits definition [1] : « If
   maskUnits="objectBoundingBox", ‘x’, ‘y’, ‘width’ and ‘height’ represent
   fractions or *percentages* of the bounding box of the element to which
   the mask is applied. (See Object bounding box units.) »

   Reading this, ok, percentage are cool, no need to read further ->
   Warning! Many authors will stop reading here and will assume that it's also
   true for maskContentUnits, clipPathUnits and so on... which is obviously
   wrong and their demos will fail.

   2. Well, let's read maskContentUnits [2] : « If
   maskContentUnits="objectBoundingBox", the user coordinate system for the
   contents of the ‘mask’ is established using the bounding box of the element
   to which the mask is applied. (See Object bounding box units.) »

   Many lazy authors will stop reading here and will assume that if
   everything is bound to the Object Bounding Box, the percentage will be as
   well -> Wrong, the demo would fail miserably, again.

   3. Ok, let's read that damned "Object bounding box" thing [3] : « The
   following elements offer the option of expressing coordinate values and
   lengths as fractions (and, *in some cases*, percentages) »

   Wait... WHAT? But why? Which are those cases? (remember, here is the
   author trying to understand that mess)

   « When percentages are used with attributes that define the gradient
   vector, the pattern tile, the filter region or the masking region, a
   percentage represents the same value as the corresponding decimal value
   (e.g., 50% means the same as 0.5). »

   Ok, that sounds quite logical and it is what I'm expecting... should I
   keep reading... ok, I'll give it a try, I was scammed before.

   « If percentages are used within the content of a ‘pattern’, ‘clipPath’,
   ‘mask’ or ‘filter’ element, these values are treated according to the
   processing rules for percentages as defined in Units. »

   ???... ok I suspect there is a trick here.

   4. Let's read the Units part [4]: « For percentage values that are
   defined to be relative to the size of viewport: [...] »

   Oooookey... and what about percentage value that are related to object
   bounding box? Nothing. So what?

Here end my story and, again, thanks to Tab to have clarified the expected
behavior : percentage value in that case are considered relative to the
size of the viewport. Anyway even with the spec it doesn't sound obvious
and in an author point of view it seams really unnatural (but I'd be glad
if someone could explain the rationale behind that).

So to make things clearer for every one, I suggest two actions :

   1. Update the current SVG spec to add a note to all the relevant
   attributes definition that do not support percentage value relative to the
   object bounding box (gradientUnits, patternUnits, patternContentUnits,
   clipPathUnits, maskUnits, maskContentUnits, filterUnits or primitiveUnits):

   « Note that percentage values are not affected by the
   'objectBoundingBox' value and, according to the units processing rules, are
   defined to be relative to the size of the viewport applicable to the object
   the gradient|mask|pattern|clip|filter|primitive is applied to. »

   2. I propose some changes to the upcoming SVG 2.0 to have things more
   consistent and more author friendly:

   1. Mark all the gradientUnits, patternUnits, patternContentUnits,
      clipPathUnits, maskUnits, maskContentUnits, filterUnits or primitiveUnits
      attributes deprecated. It's to many different attributes that
basically do
      the same : switching between 'userSpaceOnUse' and 'objectBoundingBox'
      2. Add two new attributes « units » and « contentUnits ». « units »
      will be a unified attribute that will be used in replacement of
      gradientUnits, patternUnits, maskUnits, filterUnits and primitiveUnits. «
      contentUnits » will be a unified attribute that will be used in
      of patternContentUnits, clipPathUnits and maskContentUnits
      3. The old deprecated attributes will remain with their behavior
      unchanged but the new attributes will allow the use of percentage values
      always relative to the object bounding box if the value of the «
units » or
      « contentUnits » is set to "objectBoundingBox" (which is, IMO,
what authors
      expect : when something is bound to the bounding box, everything
should be
      and percentage are much more readable than fraction).
      4. if both the old deprecated attribute and the new friendly
      attribute are used at the same times, the new attribute will override the
      behavior of the old one.
      5. if only one attribute is declared, the default value of the
      undeclared attribute is ignored
      6. if there is no attribute, both old and new attributes should have
      the same default value which will insure backward compatibility
with legacy

Let me know if I'm missing something.

Web : http://jeremie.patonnier.net
Twitter : @JeremiePat <http://twitter.com/JeremiePat>

[1] http://www.w3.org/TR/SVG11/masking.html#MaskElementMaskUnitsAttribute
[3] http://www.w3.org/TR/SVG11/coords.html#ObjectBoundingBox
[4] http://www.w3.org/TR/SVG11/coords.html#Units
Received on Saturday, 11 February 2012 20:29:06 UTC

This archive was generated by hypermail 2.3.1 : Wednesday, 7 January 2015 15:29:50 UTC