?? asl_asm.cpp
字號(hào):
static const __int64 mask = 0x7BEF7BEF7BEF7BEF;
__asm
{
mov edi, pDst
mov esi, pSrc
movq mm6, ck64
movq mm7, mask
mov ecx, nWidth
movd edx, mm6
cld
align 4
_nextqword:
sub ecx, 4
jl _residual
// 跳過4字全為透明色
cmp [esi], edx
jnz _notequal
cmp [esi+4], edx
jnz _notequal
jmp _finishone
_notequal:
movq mm0, [esi]
movq mm1, [edi]
movq mm5, mm0
movq mm2, mm1
pcmpeqw mm5, mm6 // mm5為透明掩碼
psrlq mm2, 1
psrlq mm0, 1
pand mm2, mm7
pand mm0, mm7
paddw mm2, mm0 // mm2為混合結(jié)果
pand mm1, mm5 // 目的數(shù)據(jù)非透明點(diǎn)置0
psubusw mm2, mm5 // 混合結(jié)果透明點(diǎn)置0
por mm1, mm2 // 相或得最終結(jié)果
movq [edi], mm1
_finishone:
add esi, 8
add edi, 8
jmp _nextqword
_residual:
add ecx, 4
je _done
_alpha16:
lodsw
cmp ax, dx
je _skip
mov bx, [edi]
shr bx, 1
shr ax, 1
and bx, 0x7BEF
and ax, 0x7BEF
add ax, bx
mov [edi], ax
_skip:
add edi, 2
loop _alpha16
_done:
emms
}
}
//-----------------------------------------------------------------------------
// 函數(shù)名: asmAlphaChannel()
// 功 能: alpha通道位圖繪制
// 參 數(shù): [*pSrc] - 源位圖數(shù)據(jù)
// [*pDst] - 目的位圖數(shù)據(jù)
// [*pAlpha] - alpha通道數(shù)據(jù)
// [nWidth] - 待處理寬度
// 返回值: [void] - 無
//-----------------------------------------------------------------------------
void asmAlphaChannel(BYTE *pSrc, BYTE *pDst, BYTE *pAlpha, int nWidth)
{
__asm
{
mov edi, pDst // edi = 目的指針
mov esi, pSrc // esi = 源指針
mov ecx, nWidth // ecx = 寬度
mov eax, pAlpha
align 4
_nextqword:
sub ecx, 4
jl _residual
movq mm3, [edi] movq mm0, [esi] movd mm7, [eax] pxor mm6, mm6 punpcklbw mm7, mm6 psrlw mm7, 3 } // 調(diào)用Alpha混合宏 ALPHABLEND() __asm { add esi, 8 movq [edi], mm0 add eax, 4 add edi, 8
jmp _nextqword
_residual:
add ecx, 4
jz _done // ecx=0, 已完成
test ecx, 2
jz _onein // ecx=1, 轉(zhuǎn)單象素處理
movd mm3, [edi] // ecx!=1, 先拷貝2象素
movd mm0, [esi]
test ecx, 1
jz _startres // ecx=2, 開始剩余處理
mov dx, [edi+4] // ecx=3, 再拷貝一個(gè)象素
movd mm6, edx
mov dx, [esi+4]
psllq mm6, 32
por mm3, mm6
movd mm6, edx
psllq mm6, 32
por mm0, mm6
jmp _startres
_onein: // 單象素處理
mov dx, [edi]
movd mm3, edx
mov dx, [esi]
movd mm0, edx
_startres:
movd mm7, [eax]
pxor mm6, mm6 punpcklbw mm7, mm6 psrlw mm7, 3
}
// 調(diào)用Alpha混合宏 ALPHABLEND()
__asm
{ test ecx, 2 jz _oneout movd [edi], mm0 sub ecx, 2 jz _done psrlq mm0, 32 add edi, 4_oneout: movd edx, mm0 mov [edi], dx
_done:
emms
}
}
//-----------------------------------------------------------------------------
// 函數(shù)名: asmAdditive()
// 功 能: 色飽和位圖繪制
// 參 數(shù): [*pSrc] - 源位圖數(shù)據(jù)
// [*pDst] - 目的位圖數(shù)據(jù)
// [nWidth] - 待處理寬度
// 返回值: [void] - 無
//-----------------------------------------------------------------------------
void asmAdditive(BYTE *pSrc, BYTE *pDst, int nWidth)
{
static const __int64 maskRB = 0xF81FF81FF81FF81F;
static const __int64 maskG = 0x07E007E007E007E0;
__asm
{
mov edi, pDst // 目的指針
mov esi, pSrc // 源指針
mov ecx, nWidth // 以字為單位的寬度
movq mm7, maskRB // 紅藍(lán)掩碼, 11111 000000 11111b
movq mm6, maskG // 綠掩碼, 00000 111111 00000b
align 4
_nextqword: // 64位色飽和開始
sub ecx, 4 // 寬度減4
jl _residual // 小于0則跳轉(zhuǎn)到非對(duì)齊位處理
movq mm0, [esi]
movq mm2, [edi]
}
// 調(diào)用色飽和處理宏
ADDITIVE()
__asm
{
movq [edi], mm0
add esi, 8
add edi, 8
jmp _nextqword
_residual:
add ecx, 4
jz _done // ecx=0, 已完成
test ecx, 2
jz _onein // ecx=1, 轉(zhuǎn)單象素處理
movd mm2, [edi] // ecx!=1, 先拷貝2象素
movd mm0, [esi]
test ecx, 1
jz _startres // ecx=2, 開始剩余處理
mov dx, [edi+4] // ecx=3, 再拷貝一個(gè)象素
movd mm5, edx
mov dx, [esi+4]
psllq mm5, 32
por mm2, mm5
movd mm5, edx
psllq mm5, 32
por mm0, mm5
jmp _startres
_onein: // 單象素處理
mov dx, [edi]
movd mm2, edx
mov dx, [esi]
movd mm0, edx
_startres:
}
// 調(diào)用色飽和處理宏
ADDITIVE() __asm { test ecx, 2 jz _oneout // ecx為1,則寫入1個(gè)象素?cái)?shù)據(jù) movd [edi], mm0 // ecx為2或3,先寫入2個(gè)象素 sub ecx, 2 jz _done // ecx為2,則結(jié)束 psrlq mm0, 32 // ecx為3,再寫入1個(gè)象素 add edi, 4_oneout: movd edx, mm0 mov [edi], dx // 寫入一個(gè)象素_done:
emms }
}
//-----------------------------------------------------------------------------
// 函數(shù)名: asmMix()
// 功 能: 位圖與指定顏色半透明混合
// 參 數(shù): [*pDst] - 目的位圖數(shù)據(jù)指針
// [nWidth] - 待繪制寬度
// [clr64] - 待混合顏色
// [alpha] - 透明度
// 返回值: [void] - 無
//-----------------------------------------------------------------------------
void asmMix(BYTE *pDst, int nWidth, __int64 clr64, __int64 alpha)
{
__asm
{
mov edi, pDst // edi = 目的指針
mov ecx, nWidth // ecx = 寬度
movq mm7, alpha // 透明度
align 4
_nextqword:
sub ecx, 4
jl _residual
movq mm3, [edi] movq mm0, clr64 } // 調(diào)用Alpha混合宏 ALPHABLEND() __asm { add esi, 8 movq [edi], mm0 add edi, 8
jmp _nextqword
_residual:
add ecx, 4
jz _done // ecx=0, 已完成
test ecx, 2
jz _onein // ecx=1, 轉(zhuǎn)單象素處理
movd mm3, [edi] // ecx!=1, 先拷貝2象素
test ecx, 1
jz _startres // ecx=2, 開始剩余處理
mov dx, [edi+4] // ecx=3, 再拷貝一個(gè)象素
movd mm6, edx
psllq mm6, 32
por mm3, mm6
jmp _startres
_onein: // 單象素處理
mov dx, [edi]
movd mm3, edx
_startres:
movq mm0, clr64
}
// 調(diào)用Alpha混合宏 ALPHABLEND() __asm { test ecx, 2 jz _oneout movd [edi], mm0 sub ecx, 2 jz _done psrlq mm0, 32 add edi, 4_oneout: movd edx, mm0 mov [edi], dx
_done:
emms
}
}
//-----------------------------------------------------------------------------
// 函數(shù)名: asmPlainFont()
// 功 能: 普通字體繪制
// 參 數(shù): [*pSrc] - 8位字符點(diǎn)陣數(shù)據(jù)(繪制點(diǎn)全1,不繪點(diǎn)全0)
// [*pDst] - 目的位圖
// [nWidth] - 待處理寬度
// [clr64] - 文字顏色
// 返回值: [void] - 無
//-----------------------------------------------------------------------------
void asmPlainFont(BYTE *pSrc, BYTE *pDst, int nWidth, __int64 clr64)
{
__asm
{
mov edi, pDst // edi = 目的指針
mov esi, pSrc // esi = 字符點(diǎn)陣數(shù)據(jù)指針
mov ecx, nWidth // ecx = 寬度
cld
align 4
_nextqword: // 4字處理開始
sub ecx, 4 // 寬度減4
jl _residual // 結(jié)果小于4,轉(zhuǎn)剩余處理
movq mm0, [edi] // 目的顏色
movd mm7, [esi] // mm7 = 8位字符點(diǎn)陣數(shù)據(jù)
movq mm1, clr64 // mm1 = 64位顏色值
punpcklbw mm7, mm7 // 8位點(diǎn)陣數(shù)據(jù)擴(kuò)展為16位
movd edx, mm1
pand mm1, mm7 // 不繪點(diǎn)的源顏色值清0
psubusw mm0, mm7 // 待繪點(diǎn)的目的顏色清0
por mm0, mm1 // 相或得結(jié)果顏色
add esi, 4
movq [edi], mm0 // 寫入4個(gè)象素
add edi, 8
jmp _nextqword
_residual: // 剩余處理
add ecx, 4
jz _done
_draw16:
lodsb // 取一個(gè)象素信息
cmp al, 0
je _newline // 為0則直接跳過
mov [edi], dx // 把顏色寫入目的象素
_newline:
add edi, 2
dec ecx
jnz _draw16
_done:
emms
}
}
//-----------------------------------------------------------------------------
// 函數(shù)名: asmSmoothFont()
// 功 能: 平滑字體繪制
// 參 數(shù): [*pAlpha] - 8位alpha通道(65級(jí)alpha值)
// [*pDst] - 目的位圖
// [nWidth] - 待處理寬度
// [clr64] - 文字顏色
// 返回值: [void] - 無
//-----------------------------------------------------------------------------
void asmSmoothFont(BYTE *pAlpha, BYTE *pDst, int nWidth, __int64 clr64)
{
__asm
{
mov edi, pDst // edi = 目的指針
mov esi, pAlpha // esi = alpha通道數(shù)據(jù)指針
mov ecx, nWidth // ecx = 寬度
align 4
_nextqword: // 4字處理開始
sub ecx, 4 // 寬度減4
jl _residual // 結(jié)果小于4,轉(zhuǎn)剩余處理
movd mm7, [esi] // 取8位alpha值
pxor mm6, mm6 // mm6清0
punpcklbw mm7, mm6 // 擴(kuò)展alpha值為16位
psrlw mm7, 1 // 將65級(jí)alpha值轉(zhuǎn)為33級(jí)
movq mm3, [edi] // 取目的顏色 movq mm0, clr64 // 取64位顏色值 } // 調(diào)用Alpha混合宏 ALPHABLEND() __asm { add esi, 4 movq [edi], mm0 // 寫入4個(gè)象素 add edi, 8
jmp _nextqword
_residual:
// 剩余處理
// [ecx]+4之后可能的值為0、1、2、3,分別處理
// 只需處理edi的取數(shù),alpha通道數(shù)據(jù)已留出空白,可以直接取4字節(jié)而不溢出
add ecx, 4
jz _done // ecx=0, 已完成
test ecx, 2
jz _onein // ecx=1, 轉(zhuǎn)單象素處理
movd mm3, [edi] // ecx!=1, 先拷貝2象素
test ecx, 1
jz _startres // ecx=2, 開始剩余處理
mov dx, [edi+4] // ecx=3, 再拷貝一個(gè)象素
movd mm6, edx
psllq mm6, 32
por mm3, mm6
jmp _startres
_onein: // 單象素處理
mov dx, [edi]
movd mm3, edx
_startres: // 處理過程開始
movd mm7, [esi] // 取8位alpha通道數(shù)據(jù)
pxor mm6, mm6 // mm6清0
punpcklbw mm7, mm6 // 擴(kuò)展alpha值為16位
psrlw mm7, 1 // 將65級(jí)alpha值變?yōu)?3級(jí)
movq mm0, clr64 // 取64位顏色值 } // 調(diào)用Alpha混合宏 ALPHABLEND() __asm { test ecx, 2 jz _oneout // ecx為1,則寫入1個(gè)象素?cái)?shù)據(jù) movd [edi], mm0 // ecx為2或3,先寫入2個(gè)象素 sub ecx, 2 jz _done // ecx為2,則結(jié)束 psrlq mm0, 32 // ecx為3,再寫入1個(gè)象素 add edi, 4_oneout: movd edx, mm0 mov [edi], dx // 寫入一個(gè)象素_done:
emms
}
}
} // namespace ASL
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -