这里的MMX AlphaBlend的方法与网上流传甚广的MMX混合代码完全不同。
基于同一个公式但是核心代码更少 且作了优化 。
感谢ksni2000修正一处bug。
更新日志
2010-8-6:修正优化后的一个Bug
2010-7-24:根据Intel的手册进行了下MMX代码优化 减少核心时间
2010-6-22:修正Bug
32bit AlphaBlend [2010-7-24 Updated]
{$asmmode intel}usessysutils;varsrc,dst:dword;s1,s2,s3,s4:qword;procedures;beginwriteln(IntToHex(s1,16),' ',IntToHex(s2,16),' ',IntToHex(s3,16),' ',IntToHex(s4,16));end;beginsrc:=$80AAAAAA;dst:=$10203040;asm//Initializemov eax,$FF000000//Alpha maskmov ebx,$FFFFFFFF//255-Alpha maskpxor mm7,mm7movd mm5,eaxmovd mm6,ebxpunpcklbw mm5,mm7//mm5=alpha maskpunpcklbw mm6,mm7//mm6=(255-alpha) mask//Alpha Blend:movd mm0,src//mm0=packed srcpunpcklbw mm0,mm7//mm0=unpacked srcmovq mm2,mm0//mm2=unpacked srcpunpckhwd mm0,mm0movd mm3,dst//mm3=packed dstpunpckhdq mm0,mm0//mm0=unpacked src alpha bitmovq mm1,mm6punpcklbw mm3,mm7//mm3=dstpsubb mm1,mm0//mm1=255-src alpha bitpaddusb mm0,mm5//mm0=current unpacked src alpha bitpmullw mm2,mm0//mm2=src*srcAlphapmullw mm3,mm1//mm3=dst*(255-srcAlpha)paddusw mm3,mm2//mm3=src*srcAlpha+dst*(255-srcAlpha)psrlw mm3,8//mm3=src*srcAlpha/256+dst*(255-srcAlpha)/256packuswb mm3,mm7//mm3=packed dstmovd dst,mm3//finallyemmsend;writeln(IntToHex(dst,8));end.
本文介绍了一种不同于网络上广泛传播的MMX混合代码的AlphaBlend方法。该方法基于相同的公式,但通过减少核心代码数量并进行优化,提高了执行效率。文章提供了具体的汇编代码示例,并记录了多次更新修复的过程。
1461

被折叠的 条评论
为什么被折叠?



