--------------------------------------------
// source alpha = false, dest alpha = true, alpha < 255
static VOID Mixer2(PImageCpyData cpyData, INT alpha)
{
PARGBQuad pd = cpyData->dstScan0;
PARGBQuad ps = cpyData->srcScan0;
for (INT y = 0; y < cpyData->height; y ++, pd += cpyData->dstOffset, ps += cpyData->srcOffset)
{
for (INT x = 0; x < cpyData->width; x ++, pd ++, ps ++)
{
pd->Blue = (pd->Blue * pd->Alpha + 127) / 255;
pd->Green = (pd->Green * pd->Alpha + 127) / 255;
pd->Red = (pd->Red * pd->Alpha + 127) / 255;
pd->Blue += (((ps->Blue - pd->Blue) * alpha + 127) / 255);
pd->Green += (((ps->Green - pd->Green) * alpha + 127) / 255);
pd->Red += (((ps->Red - pd->Red) * alpha + 127) / 255);
pd->Alpha += (alpha - (pd->Alpha * alpha + 127) / 255);
pd->Blue = pd->Blue * 255 / pd->Alpha;
pd->Green = pd->Green * 255 / pd->Alpha;
pd->Red = pd->Red * 255 / pd->Alpha;
}
}
}
//---------------------------------------------------------------------------
// source alpha = true, dest alpha = false, alpha < 255
static VOID Mixer4(PImageCpyData cpyData, INT alpha)
{
PARGBQuad pd = cpyData->dstScan0;
PARGBQuad ps = cpyData->srcScan0;
for (INT y = 0; y < cpyData->height; y ++, pd += cpyData->dstOffset, ps += cpyData->srcOffset)
{
for (INT x = 0; x < cpyData->width; x ++, pd ++, ps ++)
{
INT alpha0 = (alpha * ps->Alpha + 127) / 255;
pd->Blue += (((ps->Blue - pd->Blue) * alpha0 + 127) / 255);
pd->Green += (((ps->Green - pd->Green) * alpha0 + 127) / 255);
pd->Red += (((ps->Red - pd->Red) * alpha0 + 127) / 255);
}
}
}
//---------------------------------------------------------------------------
// source alpha = true, dest alpha = false, alpha = 255
static VOID Mixer5(PImageCpyData cpyData, INT alpha)
{
PARGBQuad pd = cpyData->dstScan0;
PARGBQuad ps = cpyData->srcScan0;
for (INT y = 0; y < cpyData->height; y ++, pd += cpyData->dstOffset, ps += cpyData->srcOffset)
{
for (INT x = 0; x < cpyData->width; x ++, pd ++, ps ++)
{
pd->Blue += (((ps->Blue - pd->Blue) * ps->Alpha + 127) / 255);
pd->Green += (((ps->Green - pd->Green) * ps->Alpha + 127) / 255);
pd->Red += (((ps->Red - pd->Red) * ps->Alpha + 127) / 255);
}
}
}
//---------------------------------------------------------------------------
// source alpha = true, dest alpha = true, alpha < 255
static VOID Mixer6(PImageCpyData cpyData, INT alpha)
{
PARGBQuad pd = cpyData->dstScan0;
PARGBQuad ps = cpyData->srcScan0;
for (INT y = 0; y < cpyData->height; y ++, pd += cpyData->dstOffset, ps += cpyData->srcOffset)
{
for (INT x = 0; x < cpyData->width; x ++, pd ++, ps ++)
{
INT alpha0 = (alpha * ps->Alpha + 127) / 255;
if (alpha0)
{
pd->Blue = (pd->Blue * pd->Alpha + 127) / 255;
pd->Green = (pd->Green * pd->Alpha + 127) / 255;
pd->Red = (pd->Red * pd->Alpha + 127) / 255;
pd->Blue += (((ps->Blue - pd->Blue) * alpha0 + 127) / 255);
pd->Green += (((ps->Green - pd->Green) * alpha0 + 127) / 255);
pd->Red += (((ps->Red - pd->Red) * alpha0 + 127) / 255);
pd->Alpha += (alpha0 - (pd->Alpha * alpha0 + 127) / 255);
|