把 rgb565 轉到 32 bit (但是 order 不是 RGB),然後作 32 bit 的 X alpha 運算。
這樣,就只要作一次乘法。
rgb565 轉到 32 bit 的方法也很聰明,就是把 中間的 G 移出來到 high 16 bit 中:
unsigned int x = rgb565;
x = (x | (x <<16)) & 0x07E0F81F;
算好後,轉回來的方法:
unsigned short rgb565;
rgb565 = (x | (x >> 16));
所以整個運算就是...
#define ALPHA 12 // 0~31
unsigned int bg32,color32;
unsigned short bg = getpixelvalue(x,y);
bg32 = ( bg | bg<<16 ) & 0x07E0F81F;
color32 = (color | color<<16) & 0x07E0F81F;
unsigned int result = (((color32-bg32) * ALPHA)/32 + bg32) & 0x07E0F81F;
setpixelvalue(x,y, (result | result>>16) );
結果 google 一下 0x7E0F81F,, 有一堆...
* 這一篇有更詳細的說明,assembly implement 和 benchmarking.
沒有留言:
張貼留言