2
* The Python Imaging Library
5
* Alpha composite imSrc over imDst.
6
* http://en.wikipedia.org/wiki/Alpha_compositing
8
* See the README file for details on usage and redistribution.
16
ImagingAlphaComposite(Imaging imDst, Imaging imSrc)
20
float dstR, dstG, dstB, dstA;
21
float srcR, srcG, srcB, srcA;
22
float outR, outG, outB, outA;
25
if (!imDst || !imSrc ||
26
strcmp(imDst->mode, "RGBA") ||
27
imDst->type != IMAGING_TYPE_UINT8 ||
29
return ImagingError_ModeError();
30
if (strcmp(imDst->mode, imSrc->mode) ||
31
imDst->type != imSrc->type ||
32
imDst->bands != imSrc->bands ||
33
imDst->xsize != imSrc->xsize ||
34
imDst->ysize != imSrc->ysize)
35
return ImagingError_Mismatch();
37
imOut = ImagingNew(imDst->mode, imDst->xsize, imDst->ysize);
41
ImagingCopyInfo(imOut, imDst);
43
for (y = 0; y < imDst->ysize; y++) {
45
UINT8* dst = (UINT8*) imDst->image[y];
46
UINT8* src = (UINT8*) imSrc->image[y];
47
UINT8* out = (UINT8*) imOut->image[y];
49
for (x = 0; x < imDst->linesize; x += 4) {
51
dstR = dst[x + 0] / 255.0;
52
dstG = dst[x + 1] / 255.0;
53
dstB = dst[x + 2] / 255.0;
54
dstA = dst[x + 3] / 255.0;
56
srcR = src[x + 0] / 255.0;
57
srcG = src[x + 1] / 255.0;
58
srcB = src[x + 2] / 255.0;
59
srcA = src[x + 3] / 255.0;
62
outR = srcR * srcA + dstR * (1.0 - srcA);
63
outG = srcG * srcA + dstG * (1.0 - srcA);
64
outB = srcB * srcA + dstB * (1.0 - srcA);
66
} else if (srcA == 0.0) {
72
outA = srcA + dstA * (1.0 - srcA);
78
outR = (srcR * srcA + dstR * dstA * (1.0 - srcA)) / outA;
79
outG = (srcG * srcA + dstG * dstA * (1.0 - srcA)) / outA;
80
outB = (srcB * srcA + dstB * dstA * (1.0 - srcA)) / outA;
84
out[x + 0] = (UINT8) (255.0 * outR + 0.5);
85
out[x + 1] = (UINT8) (255.0 * outG + 0.5);
86
out[x + 2] = (UINT8) (255.0 * outB + 0.5);
87
out[x + 3] = (UINT8) (255.0 * outA + 0.5);