放着防止丢,已经丢过一次了,将近一年的代码全没了。。。
// wince alpha 计算
__inline void MakeAlpha(WORD* wpSrc, WORD* wpDes, WORD wAlpha)
{
// (c1-c2)*alpha/32+c2 由(c1*alpha+c2*(32-alpha))/32变形
// 而来,减少了一次乘法运算
// 下面的式子故意写成这样,编译器会把它处理的很好
// 要比这样快一些
// c1 = (((wa << 16) | wa) & 0x7e0f81f);
// 16位变形32位 0x7e...f为二进制的00000111111000001111100000011111
// c2 = (((wb << 16) | wb) & 0x7e0f81f);
// d1 = ((c1-c2)*alpha)>>5+c2;
// 除以32等于右移5位,但是位移操作要比乘除法快的多,
// 例如:a*320可以写成a*256+a*64=>(a<<8)+(a<<6)
register DWORD d1; // 计算用的中间变量,声明为寄存器变量快些
register WORD wa = *wpSrc; // 源颜色
register WORD wb = *wpDes; // 目的颜色
register DWORD alpha = wAlpha; // alpha值,16位色的色深为32级,故alpha取值0-32
d1 = (((((((wa << 16) | wa) & 0x7e0f81f) - (((wb << 16) | wb) & 0x7e0f81f)) * alpha) >> 5) + (((wb << 16) | wb) & 0x7e0f81f)) & 0x7e0f81f;
wa = d1 >> 16; // g...r...b => ..g..
wb = d1 & 0xffff; // g...r...b => r...b
*wpDes = wa | wb; // rgb
}