{
return 1;
}
return 2;
}
TPIXEL * const srcData = bitmap.getData();
if (srcData == NULL) {
return 3;
}
unsigned origWidth = bitmap.getWidth();
unsigned origHeight = bitmap.getHeight();
unsigned tmpWidth = origHeight;
unsigned tmpHeight = origWidth;
TPIXEL * const tmpData = (TPIXEL *) malloc(tmpWidth * tmpHeight * sizeof(TPIXEL));
if (tmpData == NULL) {
delete tmpData;
return 4;
}
PointerArea mskArea(mask.getData(), mask.getRect(), mskRect, mask.getBpp());
PointerArea dstArea = bitmap.getPointerArea();
if (err) {
return 100 + err;
}
Rect crop = dstArea.getArea();
Rect mskCrop = mskArea.getArea();
int wasOk = 0;
{
TPIXEL * src = srcData;
int srcWidth = origWidth;
int xSrcMin = crop.tl.x;
int xSrcMax = crop.br.x;
ySrcMin = (ySrcMin < 0) ? 0 : ySrcMin;
ySrcMax = (ySrcMax > origHeight) ? origHeight : ySrcMax;
TPIXEL * dst = tmpData;
int dstWidth = tmpWidth;
TCHANNEL * msk = NULL;
int mskWidth = 0;
int xMskMin = 0;
int yMskMin = 0;
int xDstMin = ySrcMin;
int yDstMin = xSrcMin;
double sumR;
double sumG;
double sumB;
double sumA;
TCHANNEL * chPtr;
double kv;
dPtr = dPtrColBgn++;,
sumR = 0; sumG = 0; sumB = 0; sumA = 0;,
kv = *kernelPtr;
chPtr = (TCHANNEL *) sTmpPtr;
A = *(chPtr + 3) * kv;
sumR += *(chPtr++) * A;
sumG += *(chPtr++) * A;
chPtr = (TCHANNEL *) dPtr;
*chPtr = sumR / (sumA) + 0.5; chPtr++;
*chPtr = sumG / (sumA) + 0.5; chPtr++;
*chPtr = sumB / (sumA) + 0.5; chPtr++;
*chPtr = sumA + 0.5;,
dPtr += dstWidth;
)
wasOk = initOk;
}
if (wasOk) {
TPIXEL * src = tmpData;
int srcWidth = tmpWidth;
int xSrcMin = crop.tl.y;
int xSrcMax = crop.br.y;
int ySrcMin = crop.tl.x;
int ySrcMax = crop.br.x;
TPIXEL * dst = srcData;
int dstWidth = origWidth;
int xDstMin = crop.tl.x;
int yDstMin = crop.tl.y;
TCHANNEL * msk = mask.getData();
int mskWidth = mask.getWidth();
int xMskMin = mskCrop.tl.x;
int yMskMin = mskCrop.tl.y;
double sumR;
double sumG;
double sumB;
double sumA;
TCHANNEL * chPtr;
double kv;
TCHANNEL doa;
double da;
double sa;
double sac;
double ra;
dPtr = dPtrColBgn++;
mPtr = mPtrColBgn++;,
sumR = 0; sumG = 0; sumB = 0; sumA = 0;,
kv = *kernelPtr;
chPtr = (TCHANNEL *) sTmpPtr;
A = *(chPtr + 3) * kv;
sumR += *(chPtr++) * A;
sumG += *(chPtr++) * A;
chPtr = (TCHANNEL *) dPtr;
doa = *(chPtr + 3);
da = doa / 255.0;
sa = sumA * *mPtr * alpha / 65025.0;
sac = 1 - sa;
ra = sa + da * sac;
*chPtr = ((sumR / (sumA)) * sa + *chPtr * da * sac) / ra + 0.5; chPtr++;
*chPtr = ((sumG / (sumA)) * sa + *chPtr * da * sac) / ra + 0.5; chPtr++;
*chPtr = ((sumB / (sumA)) * sa + *chPtr * da * sac) / ra + 0.5; chPtr++;
*chPtr = ra * 255 + 0.5;,
dPtr += dstWidth;
mPtr += mskWidth;
)
}
free(tmpData);
return 0;
}