Re: [css3-images] Premultiplication switch

On 30/07/2011 12:43 PM, Brian Manthos wrote:
> Alan Gresley: (a)
>> background: white -o-linear-gradient(left, red, transparent,
>> blue);
> (b)
>> background: white -o-linear-gradient(left, red, rgba(255,0,0,0)
>> 50%, rgba(0,0,255,0) 50%, blue);
>>
>> Then how is it possible that Opera renders both these gradients
>> the same? One has one midpoint color stop and the other has two
>> midpoint color stops.
>
> It's fairly straightforward, IMO, given that Opera seems to be
> applying pre-multiplied color interpolation.
>
> non-premultiplied a0 red, transparent, blue a1 red 0%, transparent
> 50%, blue 100% a2 red 0%, rgba(0,0,0,0) 50%, blue 100% premultiplied
> a3 red 0%, prgba(0,0,0,0) 50%, blue 100%
>
> non-premultiplied b0 red, rgba(255,0,0,0) 50%, rgba(0,0,255,0) 50%,
> blue b1 red 0%, rgba(255,0,0,0) 50%, rgba(0,0,255,0) 50%, blue 100%
> premultiplied b1 red 0%, prgba(0,0,0,0) 50%, prgba(0,0,0,0) 50%, blue
> 100%
>
>
> All 7 render the same, but behave differently when transitions and
> animations are involved (3 stops for a0/a1/a2/a3 vs. 4 stops for
> b0/b1/b2).


I can understand this since the former (3 stops) has only that can be 
transitioned where the later (4 stops) has only two midway points that 
can be transitioned.


> In case it's useful, try changing transparent to rgba(0,0,0,0) in (a)
> and you'll notice the rendering is unchanged in browsers that use
> pre-multiplied color interpolation.
>
> Another approach that might prove useful to evaluate is to use
> opacities of 0.5 instead of 0.


I can evaluate what is happening regardless of the opacity. This is how 
I conceptually see it from one side of a sRGB color cube with alpha 
going off into an alpha dimension.

  ('R' for Red, 'B' for Blue, 'b' for black and F for Fuchsia)


1. _red, rgba(0,0,0,0), blue_


    F------B
    |       |\
    |       |
    |       |\
    R------b
      \     \ \
        \    \
          \   \\
            \  \
                t


2. _red, rgba(255,0,255,0) 50%, rgba(255,0,255,0) 50%, blue_


    F-------B
    |\      |
    | \    /|
    |  \    |
    R---\-/-b
       \ \
          t


3. _red, rgba(255,0,0,0) 50%, rgba(0,0,255,0) 50%, blue_


    F-------B
    |       |\
    |       | \
    |       |  \
    R-------b   \
     \           t
      \
       \
        \
         t


The last (3) has transparent points that are separated.


Take these two gradients.


   linear-gradient(left, red, rgba(255,0,0,0) 50%, blue)

   linear-gradient(left, red, rgba(0,0,255,0) 50%, blue)


In premultiplied space, they are identical. In non-premultiplied space, 
we have two different gradients.


A question. What display devices, OS or UAs use prgba? I could not find 
any good definition of what it does when I did a search.



-- 
Alan Gresley
http://css-3d.org/
http://css-class.com/

Received on Saturday, 30 July 2011 23:25:18 UTC