{
if (msk.getType() !=
MONO || msk.getData() == NULL) {
return 1;
}
if (dst.getType() !=
RGBA || dst.getData() == NULL) {
return 2;
}
return 2;
}
PointerArea mskArea = PointerArea(msk.getData(), msk.getRect(), mskRect, msk.getBpp());
PointerArea dstArea = dst.getPointerArea();
if (err) {
return 100 + err;
}
TCHANNEL * d = (TCHANNEL *) dstArea.getAreaBgn();
TCHANNEL * m = (TCHANNEL *) mskArea.getAreaBgn();
TCHANNEL * dstAreaEnd = (TCHANNEL *) dstArea.getAreaEnd();
TCHANNEL * dstAreaRowEnd = (TCHANNEL *) dstArea.getAreaRowEnd();
unsigned dstWidth = dstArea.getOrigWidth() * 4;
unsigned dstOffset = (dstArea.getOrigWidth() - dstArea.getAreaWidth()) * 4;
unsigned mskOffset = mskArea.getOrigWidth() - mskArea.getAreaWidth();
while (d < dstAreaEnd) {
while (d < dstAreaRowEnd) {
TCHANNEL doa = *(d + 3);
double da = doa / 255.0;
double sa = aLut[doa] * *m * alpha/ 65025.0;
double sac = 1 - sa;
double ra = sa + da * sac;
m++;
*d = ((rLut[*d] * sa + *d * da * sac) / ra + 0.5);
d++;
*d = ((gLut[*d] * sa + *d * da * sac) / ra + 0.5);
d++;
*d = ((bLut[*d] * sa + *d * da * sac) / ra + 0.5);
d++;
*d = ra * 255 + 0.5;
d++;
}
d += dstOffset;
m += mskOffset;
dstAreaRowEnd += dstWidth;
}
return 0;
}