// Alpha = srcAlpha + dstAlpha - srcAlpha * dstAlpha / 0xFF;
// R = (srcR * srcAlpha + dstR * dstAlpha - dstR * dstAlpha * srcAlpha / 0xFF) / Alpha
// G = ...; see also R
// B = ...; see also R
static void alphaBlend(xColor* dst, const xColor* src)
{
// 2 => dst; 3 => src
int a2a3 = dst->a * src->a;
// div = dst->a*0xFF + src->a*0xFF - a2a3;
int div = (dst->a << 8) - dst->a + (src->a << 8) - src->a - a2a3;

int a2r2 = dst->a * dst->r;
int a3r3 = src->a * src->r;
dst->r = ((a2r2 << 8) - a2r2 + (a3r3 << 8) - a3r3 - dst->r * a2a3) / div;

int a2g2 = dst->a * dst->g;
int a3g3 = src->a * src->g;
dst->g = ((a2g2 << 8) - a2g2 + (a3g3 << 8) - a3g3 - dst->g * a2a3) / div;

int a2b2 = dst->a * dst->b;
int a3b3 = src->a * src->b;
dst->b = ((a2b2 << 8) - a2b2 + (a3b3 << 8) - a3b3 - dst->b * a2a3) / div;

dst->a = dst->a + src->a - a2a3 / 0xFF;
}

posted on 2015-11-25 16:02  叶城宇  阅读(208)  评论(0编辑  收藏  举报