# [cairo] Compositing strategies and pre-multiplied alpha

Bill Spitzak spitzak at d2.com
Thu Sep 22 14:45:31 PDT 2005

```
Mauricio Piacentini wrote:
> I need some help understanding the rationale behind using pre-multiplied
> alpha in a graphics API, and I understand this is used in Cairo image
> surfaces, according to the docs.

If you were not premultiplying, compositing color C over B with alpha a
would be done with "Ca+B(1-a)".

In premultiplied images, the C pixel is replaced with A = Ca and the
math is changed to "A+B(1-a)". Substituting Ca for A will show that this
is identical.

So mathematically there is no difference.

1. This is what almost all rendering and painting programs produce.
Correctly producing a non-premultiplied image would require tracking a
"coverage" for each pixel that is seperate from the "transparency".
Premultiplied allows you to combine these values very early.

2. Premultiplied images look correct when the rgb channels are viewed.
Non-premultiplied images will have noisy and bright pixels at any
antialiased edges.

3. Premultipled images are more convienent for other operations such as
adding to simulate a double exposure.

4. Premultiplied images allow "glow" where the color is greater than the
alpha.

5. Premultiplied over is available on Windows.

1. Supposedly this is what .png files are supposed to be, but everybody
appears to be ignoring that.

2. The compositied result is always in the range 0-1, with no clamping
needed.

3. An 8-bit image can antialias any 8-bit color accurately. A
premultiplied image with 1/4 alpha, if added 4 times to get an opaque
image, will only have 64 possible colors in 8 bits. This advantage is
negated, however, because most implementations do not preserve
intermediate results of more than 8 bits, thus the non-premultiplied
version produces the same result.

I believe Cairo can do non-premultiplied, by setting the source pattern
and the mask to the same image, then doing a copy operation. So you
actually have both anyway.
```