.686 ; create 32 bit code
.mmx
.xmm
.model flat, stdcall ; 32 bit memory model
option casemap :none ; case sensitive
byt equ byte ptr
wot equ word ptr
dwot equ dword ptr
qdwot equ mmword ptr
qqdwot equ xmmword ptr
.code
; For 32 Bit DirectX Surface ... (No Alpha)
; source ref from http://blog.youkuaiyun.com/housisong/article/details/3884368
DoGrayScanLine proc C ; lpSource, SourcePitch, lpTarget, TargetPitch, Width, Height
; width must align 4
option prologue:none, epilogue:none
push esi
push edi
push ebx
push ebp ; save old frame base stack +16
mov esi, [esp+4+16] ; lpSource
mov edx, [esp+8+16] ; SourcePitch
mov edi, [esp+12+16] ; lpTarget
mov ebx, [esp+16+16] ; Target Pitch
mov ecx, [esp+20+16] ; width
mov eax, [esp+24+16] ; height
shr ecx, 2
mov ebp, ecx ;
movd xmm4, esp
xor esp, esp ; toggle vram inc index
pcmpeqb xmm6,xmm6 ; ALL FF
pxor xmm7,xmm7 ; ALL 00
psrlw xmm6,15 ; 0001 ... loop for pmaddwd
movdqa xmm5, qqdwot[GrayLut]; load gray look up table
align 16
main_loop:
movdqa xmm0, qqdwot[esi+esp] ; A3R3G3B3-A2R2G2B2-A1R1G1B1-A0R0G0B0
movdqa xmm1, xmm0
punpcklbw xmm0, xmm7 ; 00A100R1-00G100B1-00A000R0-00G000B0
punpckhbw xmm1, xmm7 ; 00A300R3-00G300B3-00A200R2-00G200B2
pmaddwd xmm0, xmm5 ; R1*ratioR - G1*ratioG+B1*ratioB - R0*ratioR - G0*ratioG+B0*ratioB
pmaddwd xmm1, xmm5 ; R3*ratioR - G3*ratioG+B3*ratioB - R2*ratioR - G2*ratioG+B2*ratioB
packssdw xmm0, xmm1 ; MixR3 MixG3+MixB3 - MixR2 MixG2+MixB2 - MixR1 MixG1+MixB1 - MixR0 MixG0+MixB0
pmaddwd xmm0, xmm6 ; MixRGB3 MixRGB2 MixRGB1 MixRGB0
psrld xmm0,7 ; 00 00 00 GrayN
movdqa xmm1,xmm0
movdqa xmm2,xmm0
pslld xmm1,8 ; 00 00 GrayN 00
pslld xmm2,16 ; 00 GrayN 00 00
por xmm0,xmm1
por xmm0,xmm2
;movntdtqa qqdwot[edi+esp], xmm0
movdqa qqdwot[edi+esp], xmm0
add esp, 16
dec ecx
jne main_loop
add esi, edx
add edi, ebx
xor esp, esp
mov ecx, ebp
dec eax
jne main_loop
movd esp, xmm4
pop ebp
pop ebx
pop edi
pop esi
ret
align 16
GrayLut dd 004B000Fh
dd 00000026h
dd 004B000Fh
dd 00000026h
DoGrayScanLine endp
end
参考自 http://blog.youkuaiyun.com/housisong/article/details/3884368
SSE 灰度图 Rountine
最新推荐文章于 2022-12-13 23:38:48 发布