1.15.2009

alpha blend for rgb565

ref 這一篇
把 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.

沒有留言: