原始的算法:
因为调用频繁,所以采用宏或内联函数方式实现。
#define RGB565_ALPHA_CONVERSION( d, s, alpha) \
{ \
unsigned int sr = (s) & 0xF800; \
unsigned int sg = (s) & 0x07E0; \
unsigned int sb = (s) & 0x001F; \
unsigned int dr = (d) & 0xF800; \
unsigned int dg = (d) & 0x07E0; \
unsigned int db = (d) & 0x001F; \
\
dr += ((sr - dr) * (alpha)) >> 8; \
dg += ((sg - dg) * (alpha)) >> 8; \
db += ((sb - db) * (alpha)) >> 8; \
dr &= 0xF800; \
dg &= 0x07E0; \
db &= 0x001F; \
d= dr | dg | db; \
}
根据实际应用测试,图片中点的alpha为0 或255居多,所以先处理,性能有显著提高:
#define RGB565_ALPHA_CONVERSION( d, s, alpha) \
{ \
if(alpha==0) \
{ \
\
}else if(alpha == 255) \
{ \
d = s; \
}else \
{ \
unsigned int sr = (s) & 0xF800; \
unsigned int sg = (s) & 0x07E0; \
unsigned int sb = (s) & 0x001F; \
unsigned int dr = (d) & 0xF800; \
unsigned int dg = (d) & 0x07E0; \
unsigned int db = (d) & 0x001F; \
\
dr += ((sr - dr) * (alpha)) >> 8; \
dg += ((sg - dg) * (alpha)) >> 8; \
db += ((sb - db) * (alpha)) >> 8; \
dr &= 0xF800; \
dg &= 0x07E0; \
db &= 0x001F; \
d= dr | dg | db; \
} \
}
再来:看以下代码:
TUint32 Fast_AlphaBlender(TUint32 x, TUint32 y, TUint32 Alpha)
{
x = ( x | ( x<<16 ) ) & 0x7E0F81F;
y = ( y | ( x<<16 ) ) & 0x7E0F81F;
TUint32 result = ( ((x - y) * Alpha) >> 5 + y ) & 0x7E0F81F;
return (TUint32)(result&0xFFFF) | (result>>16);
}
采用这个算法再加上用宏的形式并对0 255 单独处理,性能肯定会提高,不过我还没来得及测试,参考以下文档: