关于16位色在arm cpu上的快速alpha算法
时间:2009-06-11 来源:ahphone
台式机上可以通过mmx指令来加速,但是在arm cpu上mmx指令并不普及,所以
采用了一个小技巧来做这个alpha的优化。
alpha混合其实很简单,要做的只是分解源颜色c1,目的颜色c2,然后将颜色分
量r1,g1,b1和r2,g2,b2分别按照公式(clr*alpha+clr*(32-alpha))/32来计算, 最后再组合成一个颜色值即可,可是如此计算,运算量很大速度很慢。 所以现在就要用到一个技巧,首先,就16位色来说一般的格式是565,表示rgb 分量的二进制位数,如图1。 500)this.width=500;"> 那么我们就可以利用一个32位的变量来把这个颜色的绿色分量提前,变为如图2的格式。 这样每个颜色分量中间就有了进位的空间,也就不用分解这个颜色值了。 然后,将变形完的两个颜色值按照上面公式进行计算,计算完毕再变回565的格式 就完成了一次alpha混合的计算。 c语言源代码如下:
__inline void MakeAlpha(WORD* wpSrc, WORD* wpDes, WORD wAlpha)
//故alpha取值0-32
// 而来,减少了一次乘法运算
// 16位变形32位 0x7e...f为二进制的00000111111000001111100000011111 // 除以32等于右移5位,但是位移操作要比乘除法快的多,
// 例如:a*320可以写成a*256+a*64=>(a<<8)+(a<<6) |
我们用C语言写出来的乘法,编译器只能做部分优化,生成的汇编是由一些移位相加的循环组成的;有时数组元素的寻址也类似这样,所以除了用汇编改写之外也都有这样的优化空间。这个方法可以取得和汇编接近的计算效率,且和CPU无关,便于移植。