SSE 灰度图 Rountine

		.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.csdn.net/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.csdn.net/housisong/article/details/3884368
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值