|
//代码名称: ALPHA_BLIT32_888MMX
//类别: 图形图象
//关健字: ALPHA BLIT MMX
//作者: www.libsdl.org
//编译器: c
//操作系统: Linux, *BSD, MacOS, Win32 and BeOS
#define ALPHA_BLIT32_888(to, from, length, bpp, alpha) \
do { \
int i; \
Uint32 *src = (Uint32 *)(from); \
Uint32 *dst = (Uint32 *)(to); \
for(i = 0; i < (int)(length); i++) { \
Uint32 s = *src++; \
Uint32 d = *dst; \
Uint32 s1 = s & 0xff00ff; \
Uint32 d1 = d & 0xff00ff; \
d1 = (d1 + ((s1 - d1) * alpha >> 8)) & 0xff00ff; \
s &= 0xff00; \
d &= 0xff00; \
d = (d + ((s - d) * alpha >> 8)) & 0xff00; \
*dst++ = d1 | d; \
} \
} while(0)
#define ALPHA_BLIT32_888MMX(to, from, length, bpp, alpha) \
do { \
Uint32 *srcp = (Uint32 *)(from); \
Uint32 *dstp = (Uint32 *)(to); \
int i = 0x00FF00FF; \
movd_m2r(*(&i), mm3); \
punpckldq_r2r(mm3, mm3); \
i = 0xFF000000; \
movd_m2r(*(&i), mm7); \
punpckldq_r2r(mm7, mm7); \
i = alpha | alpha << 16; \
movd_m2r(*(&i), mm4); \
punpckldq_r2r(mm4, mm4); \
pcmpeqd_r2r(mm5,mm5); /* set mm5 to "1" */ \
pxor_r2r(mm7, mm5); /* make clear alpha mask */ \
i = length; \
if(i & 1) { \
movd_m2r((*srcp), mm1); /* src -> mm1 */ \
punpcklbw_r2r(mm1, mm1); \
pand_r2r(mm3, mm1); \
movd_m2r((*dstp), mm2); /* dst -> mm2 */ \
punpcklbw_r2r(mm2, mm2); \
pand_r2r(mm3, mm2); \
psubw_r2r(mm2, mm1); \
pmullw_r2r(mm4, mm1); \
psrlw_i2r(8, mm1); \
paddw_r2r(mm1, mm2); \
pand_r2r(mm3, mm2); \
packuswb_r2r(mm2, mm2); \
pand_r2r(mm5, mm2); /* 00000RGB -> mm2 */ \
movd_r2m(mm2, *dstp); \
++srcp; \
++dstp; \
i--; \
} \
for(; i > 0; --i) { \
movq_m2r((*srcp), mm0); \
movq_r2r(mm0, mm1); \
punpcklbw_r2r(mm0, mm0); \
movq_m2r((*dstp), mm2); \
punpckhbw_r2r(mm1, mm1); \
movq_r2r(mm2, mm6); \
pand_r2r(mm3, mm0); \
punpcklbw_r2r(mm2, mm2); \
pand_r2r(mm3, mm1); \
punpckhbw_r2r(mm6, mm6); \
pand_r2r(mm3, mm2); \
psubw_r2r(mm2, mm0); \
pmullw_r2r(mm4, mm0); \
pand_r2r(mm3, mm6); \
psubw_r2r(mm6, mm1); \
pmullw_r2r(mm4, mm1); \
psrlw_i2r(8, mm0); \
paddw_r2r(mm0, mm2); \
psrlw_i2r(8, mm1); \
paddw_r2r(mm1, mm6); \
pand_r2r(mm3, mm2); \
pand_r2r(mm3, mm6); \
packuswb_r2r(mm2, mm2); \
packuswb_r2r(mm6, mm6); \
psrlq_i2r(32, mm2); \
psllq_i2r(32, mm6); \
por_r2r(mm6, mm2); \
pand_r2r(mm5, mm2); /* 00000RGB -> mm2 */ \
movq_r2m(mm2, *dstp); \
srcp += 2; \
dstp += 2; \
i--; \
} \
emms(); \
} while(0)
|
|