游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2868|回复: 0

ALPHA_BLIT32_888MMX

[复制链接]

1

主题

2

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2004-3-9 13:19:00 | 显示全部楼层 |阅读模式
//代码名称:    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)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-2-25 19:46

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表