On 05-11-12 20:19, pennec victor wrote:
... Could anybody help ?
Essentially you want to compute the following (right?):
new colour: A+B-2AB new alpha: A+B-AB (The latter is from the SVG compositing spec, and I assume in your case it's a bit flexible, as long as alpha=1 stays 1.)
You have a couple of options.
1. First form source*dest. Then multiply the alpha channel by 0.5, call the result C. Then compute 0.5*(A+B), then 2*0.5*(A+B)-2*C.
2. Compute (1-A) and (1-B), but with alpha intact (use either feComponentTransfer or feColorMatrix). Then compute both (1-A)*B and (1-B)*A (as you kept alpha intact, this will work). Now sum the two results. Here you might get into a little bit of trouble, depending on how implementations handle premultiplication and clipping of the alpha channel. If you do run into trouble, just multiply the alpha channels of (1-A) and (1-B) by 0.5, I think that should fix it.
Option 2 is probably better in terms of numerical precision (especially if you do not have to multiply the alpha channel by 0.5).
How do you deal with alpha when using feComposite ?
You find some formula that keeps it intact. (It might not be a bad idea if this got fixed in SVG 2.) In extreme cases you can also unravel the image into its R, G, B and A components using four different alpha-only images. Then you're essentially free to do what you want.