# EXA component alpha

Thomas Hellström unichrome at shipmail.org
Sat Jan 7 02:31:52 PST 2006

Eric Anholt wrote:

>>Keep in mind, the texture combining to get the source-color value isn't
>>the hard part.  It's the actual blending using the source-alpha value
>>that is.
>>
>>Equations may help, since I've never found a prose description that
>>really works.  Let's use Over, since everyone loves it.  The equation
>>for non-component-alpha Over is:
>>
>>        srcv.A = src.A * mask.A
>>        srcv.R = src.R * mask.A
>>        srcv.G = src.G * mask.A
>>        srcv.B = src.B * mask.A
>>
>>        dst.A = srcv.A + (1 - srcv.A) * dst.A
>>        dst.R = srcv.R + (1 - srcv.A) * dst.R
>>        dst.G = srcv.G + (1 - srcv.A) * dst.G
>>        dst.B = srcv.B + (1 - srcv.A) * dst.B
>>
>>Expanded, that's:
>>        dst.A = src.A * mask.A + (1 - (src.A * mask.A)) * dst.A
>>        dst.R = src.R * mask.A + (1 - (src.A * mask.A)) * dst.R
>>        dst.G = src.G * mask.A + (1 - (src.A * mask.A)) * dst.G
>>        dst.B = src.B * mask.A + (1 - (src.A * mask.A)) * dst.B
>>
>>But for component-alpha Over, it's:
>>        srcv.A = src.A * mask.A
>>        srcv.R = src.R * mask.A
>>        srcv.G = src.G * mask.A
>>        srcv.B = src.B * mask.A
>>
>>        srca.A = src.A * mask.A
>>        srca.R = src.A * mask.R
>>        srca.G = src.A * mask.G
>>        srca.B = src.A * mask.B
>>
>>        dst.A = srcv.A + (1 - srca.A) * dst.A
>>        dst.R = srcv.R + (1 - srca.R) * dst.R
>>        dst.G = srcv.G + (1 - srca.G) * dst.G
>>        dst.B = srcv.B + (1 - srca.B) * dst.B
>>
>>Expanded, that's:
>>        dst.A = src.A * mask.A + (1 - (src.A * mask.A)) * dst.A
>>        dst.R = src.R * mask.A + (1 - (src.A * mask.R)) * dst.R
>>        dst.G = src.G * mask.A + (1 - (src.A * mask.G)) * dst.G
>>        dst.B = src.B * mask.A + (1 - (src.A * mask.B)) * dst.B
>>
>>Most people approaching component alpha acceleration (including myself,
>>originally) try to use the texture combiners to just multiply the
>>components of src per-component with mask, and then use the blenders
>>with that result just like non-CA.  But that results in:
>>        dst.A = src.A * mask.A + (1 - (src.A * mask.A)) * dst.A
>>        dst.R = src.R * mask.R + (1 - (src.A * mask.A)) * dst.R
>>        dst.G = src.G * mask.G + (1 - (src.A * mask.A)) * dst.G
>>        dst.B = src.B * mask.B + (1 - (src.A * mask.A)) * dst.B
>>
>>I suppose you could try to use blending of (ONE, ONE_MINUS_SRC_COLOR),
>>but that just gets you:
>>        dst.A = src.A * mask.A + (1 - (src.A * mask.A)) * dst.A
>>        dst.R = src.R * mask.R + (1 - (src.R * mask.R)) * dst.R
>>        dst.G = src.G * mask.G + (1 - (src.G * mask.G)) * dst.G
>>        dst.B = src.B * mask.B + (1 - (src.B * mask.B)) * dst.B
>>
>>
>>
Ah. Thanks for the clarification (it must have taken quite some time to
write down). I must admit I as well had simplified the problem to the
first set of equations, and the unichromes are not capable of doing the
correct operation in one pass.
xc/doc/specs/Render/protocol:

dest = (source IN mask) OP dest

which sort of hints towards that the (source IN mask) operation should
produce a single RGBA result, which can be composited on the dest.

Anyway the important thing is that a potential user of this operation is
understanding what the operation really does. Probably needs to go into
the docs somewhere.

Regards,
Thomas

>------------------------------------------------------------------------
>
>_______________________________________________
>xorg mailing list
>xorg at lists.freedesktop.org
>http://lists.freedesktop.org/mailman/listinfo/xorg
>