W3C home > Mailing lists > Public > www-svg@w3.org > January 2010

Re: Fwd: Question on gradient userSpaceOnUse

From: Erik Dahlstrom <ed@opera.com>
Date: Tue, 05 Jan 2010 11:11:59 +0100
To: "Alex Danilo" <alex@abbra.com>, "Jeff Schiller" <codedread@gmail.com>
Cc: www-svg <www-svg@w3.org>
Message-ID: <op.u51099umgeuyw5@localhost>
On Tue, 05 Jan 2010 09:18:17 +0100, Alex Danilo <alex@abbra.com> wrote:

> --Original Message--:
>> Hi www-svg,
>>
>> This is an email I forwarded to Erik Dahlstrom to question about Opera
>> behavior, but thought it appropriate for general SVG WG discussion.
...
>> The spec says userSpaceOnUse "shall represent values in the coordinate
>> system that results from taking the current user coordinate system in
>> place at the time when the gradient element is referenced".
>>
>> Can someone please clarify what is the correct behavior here?

Just to test for consistency I also verified that moving the transform  
attribute from the rect in the example Jeff posted up to a surrounding g  
element does the same thing. Basically confirming that the current user  
space includes the transform on the element itself too. All viewers I  
tested displayed the gradients it the same way as in Jeff's original  
example.

I also added a couple of lines to illustrate what the spec says the  
gradient vector should be.

Modified example:

<?xml version="1.0"?>
<svg xmlns="http://www.w3.org/2000/svg"
      xmlns:xlink="http://www.w3.org/1999/xlink">
   <defs>
     <linearGradient id="g1" x1="0" y1="0" x2="400" y2="50"  
gradientUnits="userSpaceOnUse">
       <stop offset="0" stop-color="red"/>
       <stop offset="0.5" stop-color="green"/>
       <stop offset="1.0" stop-color="blue"/>
     </linearGradient>
     <linearGradient id="g2" x1="0" y1="100" x2="100" y2="150"  
gradientUnits="userSpaceOnUse">
       <stop offset="0" stop-color="red"/>
       <stop offset="0.5" stop-color="green"/>
       <stop offset="1.0" stop-color="blue"/>
     </linearGradient>
   </defs>

   <g transform="translate(100,100)">
     <g transform="scale(0.25,1)">
       <rect width="400" height="50" fill="url(#g1)" />

       <!-- show the gradient vector in current user space -->
       <line x1="0" y1="0" x2="400" y2="50" stroke="black"/>
     </g>
     <rect y="100" width="100" height="50" fill="url(#g2)" />

     <!-- show the gradient vector in current user space -->
     <line x1="0" y1="100" x2="100" y2="150" stroke="black"/>
   </g>
</svg>

...

> There is clarification for the weird perpendicular behaviour of
> the gradients for 'objectBoundingBox' where they 'squish' for
> non-square areas, but no mention of what is expected for
> 'userSpaceOnUse'.
>
> Personally, I would interpret a gradient vector as being
> the vector along which the gradient stops are placed and
> also being a vector, that the gradient itself be perpendicular
> to that vector.

I agree that it makes sense to make the gradient perpendicular to the  
gradient vector for both 'objectBoundingBox' and 'userSpaceOnUse'.

Cheers
/Erik

-- 
Erik Dahlstrom, Core Technology Developer, Opera Software
Co-Chair, W3C SVG Working Group
Personal blog: http://my.opera.com/macdev_ed
Received on Tuesday, 5 January 2010 10:09:23 GMT

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