PBYTE TYPEDEF PTR BYTE PWORD TYPEDEF PTR WORD PDWORD TYPEDEF PTR DWORD ; ConvFloat °è¿­ ÇÔ¼ö(DPC, CPC, Echo, LinePair) µéÀ» ÇϳªÀÇ ÆãÅ©¼Ç¿¡ ³ÖÀ¸·Á°í ÇÏ´Â ÇÔ¼ö. ; 2011.02.08 = Index Filtering ¼öÁ¤Áß .data ShiftCnt QWORD 4 astPair STRUCT pos dword ? pair dword ? dtype dword ? peak dword ? x dword ? y dword ? src dword ? ref dword ? zone dword ? Thre dword ? astPair ENDS .code ix equ rsi iy equ rdi ix32 equ esi iy32 equ edi rrBW equ r8 ; Buffer Width rrNoD equ r9 ; Number of Defect rrXoD equ r10 ; Defect X rrYoD equ r11 ; Defect Y rrToD equ r12 ; Defect Type rrPoD equ r13 ; Defect Peak rrImgAdr equ r14 ; Image Address rrConAdr equ r15 xxSrc equ xmm4 xxCmp equ xmm5 xxMinus equ xmm6 xxPlus equ xmm7 xxThres equ xmm8 xxSupp equ xmm9 xxfSPR equ xmm10 xxsSPR equ xmm11 xxPeak equ xmm12 xxPeak2 equ xmm13 ConvSize equ 4 ConvSizeBit equ 2 TotalSpr equ 16 TotalSprBit equ 4 ConvNSpr equ 64 DEFTYPE_NODEFECT equ 3 DEFTYPE_DELETE equ 4 InspLeft equ qword ptr[rbp+ 30h] InspRight equ qword ptr[rbp+ 38h] InspTop equ qword ptr[rbp+ 40h] InspBottom equ qword ptr[rbp+ 48h] DefectX equ qword ptr[rbp+ 50h] DefectY equ qword ptr[rbp+ 58h] DefectType equ qword ptr[rbp+ 60h] DefectVal equ qword ptr[rbp+ 68h] PairAddr equ qword ptr[rbp+ 70h] StartPair equ qword ptr[rbp+ 78h] MaxPair equ qword ptr[rbp+ 80h] PairSize equ qword ptr[rbp+ 88h] Pitch16 equ qword ptr[rbp+ 90h] BuffWidth equ qword ptr[rbp+ 98h] Threshold equ qword ptr[rbp+ 0a0h] Suppress equ qword ptr[rbp+ 0a8h] pIndexBuff equ qword ptr[rbp+ 0b0h] IndexWidth equ qword ptr[rbp+ 0b8h] IndexHeight equ qword ptr[rbp+ 0c0h] iIndex equ qword ptr[rbp+ 0c8h] IndexLeft equ qword ptr[rbp+ 0d0h] IndexTop equ qword ptr[rbp+ 0d8h] piPitch equ qword ptr[rbp+ 0e0h] pfSpr equ qword ptr[rbp+ 0e8h] psSpr equ qword ptr[rbp+ 0f0h] ConvFloat2 PROC C local ImgAddr : qword ; ÆÄ¶ó¹ÌÅÍ·Î ³Ñ¾î¿Â °ª local ConAddr : qword local ImgConStart : qword ; Conv Buffer ¸¸µé¶§ ½ÃÀÛ ÁÖ¼Ò local ImgConEnd : qword local BlackNWhite : qword local maxDefect : qword local iPitch : qword local iPitch2 : qword local sSpr : qword local iPitchHUp : qword local InspPixel16A : qword local InspEnd : qword local PairLeft : qword local PairRight : qword local xPlusPitch : dword push rbp mov rbp, rsp push r10 push r11 push r12 push r13 push r14 push r15 push rdi push rsi push rbx ADD rbp, 080h ; ÆÄ¶ó¹ÌÅÍ·Î ³Ñ¾î¿Â register°ª ¿Å±â±â mov ImgAddr , rcx mov ConAddr , rdx mov maxDefect , r8 sub maxDefect, 16 ; register ÇÒ´ç. mov ix, InspLeft mov iy, InspTop mov rrXoD, DefectX mov rrYoD, DefectY mov rrToD, DefectType mov rrPoD, DefectVal mov rrBW, BuffWidth ; Pitch ¸¸µé±â. mov rax, Pitch16 mov rcx, rax sar rax, 4 mov iPitch, rax and rcx, 0fh mov sSpr, rcx mov rax, iPitch mov iPitchHUp, rax add rax, rax mov iPitch2, rax ; conv buff´Â 2byte ´ÜÀ§À̹ǷÎ.. cmp sSpr, 8 jl PITCH_HALF_UP_NO inc iPitchHUp PITCH_HALF_UP_NO: ; xmm ¸¸µé±â mov rax, Threshold movd xxThres, rax ; Threshold movdqa xmm0, xxThres punpcklwd xmm0, xxThres pshufd xxThres, xmm0, 0 mov rax, 16 sub rax, sSpr movd xxfSpr, rax ; fSpr movdqa xmm0, xxfSpr punpcklwd xmm0, xxfSpr pshufd xxfSpr, xmm0, 0 movd xxsSpr, sSpr ; sSpr movdqa xmm0, xxsSpr punpcklwd xmm0, xxsSpr pshufd xxsSpr, xmm0, 0 mov rax, ConvNSpr mul Suppress movd xxSupp, rax ; supress movdqa xmm0, xxSupp punpcklwd xmm0, xxSupp pshufd xxSupp, xmm0, 0 ; °Ë»ç ¿µ¿ª ¼³Á¤(width¸¦ pitch¸¸Å­ Àß¶ó¾ß ºñ±³ÇÑ´Ù) ; ÁÖ¼Ò°ª ¼³Á¤ mov rax, InspRight sub rax, InspLeft sar rax, 4 sal rax, 4 mov InspPixel16A, rax sub rax, iPitch sub rax, 1 sar rax, 3 sal rax, 3 add rax, InspLeft mov InspEnd, rax mov rax, InspLeft add rax, iPitch mov PairLeft, rax mov rax, InspEnd sub rax, iPitch mov PairRight, rax ; À̹ÌÁö ½ÃÀÛ ÁÖ¼Ò ¸¸µé±â. mov rax, rrBW ; rrImgAdr= rrImgAdr+ BuffWidth*InspTop + InspLeft; mul InspTop add rax, InspLeft add rax, ImgAddr mov ImgConStart, rax add rax, InspPixel16A mov ImgConEnd, rax ; ÃʱâÈ­ mov rrConAdr, ConAddr mov rrImgAdr, ImgConStart pxor xmm0, xmm0 mov iy, InspTop jmp LOOP_MAKE_CON_BUFF NEXT_LINE: ; ¸Å ¶óÀθ¶´Ù ÁÖ¼Ò ÀçÁöÁ¤ mov rax , ImgConStart add rax , rrBW mov ImgConStart , rax mov rrImgAdr, rax add rax, InspPixel16A mov ImgConEnd, rax mov rrConAdr, ConAddr LOOP_MAKE_CON_BUFF: ; ÇÑ ¶óÀÎ Àüü ¼¼·Î ÇÕ¹öÆÛ ¸¸µé±â movdqu xmm2, [rrImgAdr] movdqa xmm3, xmm2 punpcklbw xmm2, xmm0 punpckhbw xmm3, xmm0 movdqu xmm4, [rrImgAdr+ rrBW] movdqa xmm5, xmm4 punpcklbw xmm4, xmm0 punpckhbw xmm5, xmm0 paddw xmm2, xmm4 paddw xmm3, xmm5 movdqu [rrConAdr], xmm2 movdqu [rrConAdr+ 10h], xmm3 add rrImgAdr, 10h add rrConAdr, 20h cmp rrImgAdr, ImgConEnd jl LOOP_MAKE_CON_BUFF mov rrConAdr, ConAddr mov ix, InspLeft inc iy Conv_8: ; °Ë»ç ·çƾ (16°³ ´ÜÀ§°¡ ¾Æ´Ï¶ó 8°³ ´ÜÀ§·Î ¿¬»ê °¡´É) cmp piPitch, 0 je FLAG_DPC_NO mov rax, ix ; Pitch Buffer Index ±¸Çϱâ. sar rax, 4 sal rax, 4 add rax, rax mov rcx, rax mov rax, pfSPR ; Load SPR add rax, rcx movdqu xxfSPR, [rax] mov rax, psSPR add rax, rcx movdqu xxsSPR, [rax] mov rax, piPitch add rax, rcx movsx rax, word ptr[rax] ; Compare Buffer (piPitch*pfSPR + piPitchNext*psSPR) - Suppress - Unpack - *SPR add rax, rax jmp FLAG_DPC_END FLAG_DPC_NO: mov rax, iPitch2 FLAG_DPC_END: add rax, rrConAdr movdqu xxCmp, [rax] ; ºñ±³ ¹öÆÛ °¡·ÎÇÕ ¸¸µé±â pmullw xxCmp, xxfSPR movdqu xmm1, [rax+ 2] psllw xmm1, ShiftCnt paddw xxCmp, xmm1 movdqu xmm1, [rax+ 4] pmullw xmm1, xxsSPR paddw xxCmp, xmm1 movdqa xmm1, xxCmp ; suppress (2*2*SPR ÇØÁØ suppress) psubusw xmm1, xxSupp psubusw xxCmp, xmm1 movdqu xxSrc, [rrConAdr] ; ¼Ò½º¹öÆÛ °¡·ÎÇÕ ¸¸µé±â movdqu xmm1, [rrConAdr+ 2] paddw xxSrc, xmm1 psllw xxSrc, ShiftCnt ; SPR movdqa xmm1, xxSrc ; suppress (2*2*SPR ÇØÁØ suppress) psubusw xmm1, xxSupp psubusw xxSrc, xmm1 movdqa xxMinus , xxCmp psubw xxMinus , xxSrc movdqa xxPlus , xxSrc psubw xxPlus , xxCmp Inspect_Black: mov BlackNWhite, 0 mov bx, 0 movdqa xxPeak, xxMinus movdqa xxPeak2, xxMinus pcmpgtw xxPeak, xxThres pmovmskb rax, xxPeak cmp rax, 0 jne DEFECT_00 Inspect_White: mov BlackNWhite, 1 mov bx, 1 movdqa xxPeak, xxPlus movdqa xxPeak2, xxPlus pcmpgtw xxPeak, xxThres pmovmskb rax, xxPeak cmp rax, 0 jne DEFECT_00 End_8_Pixel: cmp rrNoD, maxDefect jge END_FUNC add ix, 8 ; Loop X add rrConAdr, 16 ; 14= 16- 2 cmp ix, InspEnd jl Conv_8 jmp PAIRING PAIRING_END: cmp iy, InspBottom jge END_FUNC jmp NEXT_LINE DEFECT_00: pextrw rax, xxPeak, 0h cmp rax, 0h je Defect_01 pextrw rax, xxPeak2, 0h sar rax, 6 mov [rrXoD+ 4*rrNoD], ix32 mov [rrYoD+ 4*rrNoD], iy32 mov [rrToD+ 2*rrNoD], bx mov [rrPoD+ 2*rrNoD], ax inc rrNoD DEFECT_01: inc ix pextrw rax, xxPeak, 1h cmp rax, 0h je Defect_02 pextrw rax, xxPeak2, 1h sar rax, 6 mov [rrXoD+ 4*rrNoD], ix32 mov [rrYoD+ 4*rrNoD], iy32 mov [rrToD+ 2*rrNoD], bx mov [rrPoD+ 2*rrNoD], ax inc rrNoD DEFECT_02: inc ix pextrw rax, xxPeak, 2h cmp rax, 0h je Defect_03 pextrw rax, xxPeak2, 2h sar rax, 6 mov [rrXoD+ 4*rrNoD], ix32 mov [rrYoD+ 4*rrNoD], iy32 mov [rrToD+ 2*rrNoD], bx mov [rrPoD+ 2*rrNoD], ax inc rrNoD DEFECT_03: inc ix pextrw rax, xxPeak, 3h cmp rax, 0h je Defect_04 pextrw rax, xxPeak2, 3h sar rax, 6 mov [rrXoD+ 4*rrNoD], ix32 mov [rrYoD+ 4*rrNoD], iy32 mov [rrToD+ 2*rrNoD], bx mov [rrPoD+ 2*rrNoD], ax inc rrNoD DEFECT_04: inc ix pextrw rax, xxPeak, 4h cmp rax, 0h je Defect_05 pextrw rax, xxPeak2, 4h sar rax, 6 mov [rrXoD+ 4*rrNoD], ix32 mov [rrYoD+ 4*rrNoD], iy32 mov [rrToD+ 2*rrNoD], bx mov [rrPoD+ 2*rrNoD], ax inc rrNoD DEFECT_05: inc ix pextrw rax, xxPeak, 5h cmp rax, 0h je Defect_06 pextrw rax, xxPeak2, 5h sar rax, 6 mov [rrXoD+ 4*rrNoD], ix32 mov [rrYoD+ 4*rrNoD], iy32 mov [rrToD+ 2*rrNoD], bx mov [rrPoD+ 2*rrNoD], ax inc rrNoD DEFECT_06: inc ix pextrw rax, xxPeak, 6h cmp rax, 0h je Defect_07 pextrw rax, xxPeak2, 6h sar rax, 6 mov [rrXoD+ 4*rrNoD], ix32 mov [rrYoD+ 4*rrNoD], iy32 mov [rrToD+ 2*rrNoD], bx mov [rrPoD+ 2*rrNoD], ax inc rrNoD DEFECT_07: inc ix pextrw rax, xxPeak, 7h cmp rax, 0h je Defect_End pextrw rax, xxPeak2, 7h sar rax, 6 mov [rrXoD+ 4*rrNoD], ix32 mov [rrYoD+ 4*rrNoD], iy32 mov [rrToD+ 2*rrNoD], bx mov [rrPoD+ 2*rrNoD], ax inc rrNoD Defect_End: sub ix, 7 cmp BlackNWhite, 0 je Inspect_White jmp End_8_Pixel cmp pIndexBuff, 0 je INDEX_FILTERING_NO INDEX_FILTERING: mov ix, -1 mov rax, pIndexBuff mov rbx, iIndex LOOP_INDEX_FILTERING: cmp ix, rrNoD jge LOOP_INDEX_FILTERING_END movsxd rcx, dword ptr [rrXoD+ 4*ix] cmp bl, byte ptr [rax+ rcx] jne FILTERING_NO mov word ptr [rrToD+ 2*ix], 4 FILTERING_NO: inc ix jmp LOOP_INDEX_FILTERING LOOP_INDEX_FILTERING_END: mov rax, IndexWidth add pIndexBuff, rax INDEX_FILTERING_NO: PAIRING: mov ix, -1 LOOP_PAIR_NUN: inc ix cmp ix, rrNoD jge LOOP_PAIR_NUM_END mov rax, StartPair cmp rax, MaxPair jge END_FUNC cmp word ptr [rrToD+ 2*ix], DEFTYPE_DELETE ; chek type DEFTYPE_NODEFECT= 3, DEFTYPE_DELETE= 4 jge LOOP_PAIR_NUN mov rbx, ix movsxd rax, dword ptr [rrXoD+ 4*ix] mov rcx, rax add rax, iPitchHUp mov xPlusPitch, eax cmp rcx, PairLeft jl PAIR_LEFT cmp rcx, PairRight jl PAIR_CENTER PAIR_RIGHT: inc rbx cmp rbx, rrNoD jge PAIR_RIGHT_UNPAIR movsx edx, word ptr[rrToD+ 2*rbx] cmp edx, 3 jge PAIR_RIGHT mov ecx, [rrXoD+ 4*rbx] movsx eax, word ptr[rrToD+ 2*ix] cmp eax, edx je PAIR_RIGHT mov eax, xPlusPitch sub eax, ecx cmp eax, 1 jg PAIR_RIGHT cmp eax, -1 jl PAIR_RIGHT_UNPAIR mov word ptr [rrToD+ 2*rbx], 4 mov rax, PairAddr mov (astPair ptr [rax]).pos, 3 mov (astPair ptr [rax]).pair, 1 mov (astPair ptr [rax]).x, ecx mov (astPair ptr [rax]).y, iy32 mov (astPair ptr [rax]).dtype, edx movzx edx, word ptr[rrPoD+ 2*rbx] mov (astPair ptr [rax]).peak, edx add rax, PairSize mov PairAddr, rax inc StartPair jmp LOOP_PAIR_NUN PAIR_RIGHT_UNPAIR: mov rax, PairAddr mov (astPair ptr [rax]).pos, 3 mov (astPair ptr [rax]).pair, 5 mov edx, xPlusPitch mov (astPair ptr [rax]).x, edx mov (astPair ptr [rax]).y, iy32 movzx edx, word ptr[rrToD+ 2*ix] cmp edx, 0 je CHANGE_TYPE_0 mov edx, 0 jmp CHANGE_TYPE_end CHANGE_TYPE_0: mov edx, 1 CHANGE_TYPE_end: mov (astPair ptr [rax]).dtype, edx movzx edx, word ptr[rrPoD+ 2*ix] mov (astPair ptr [rax]).peak, edx add rax, PairSize mov PairAddr, rax inc StartPair jmp LOOP_PAIR_NUN PAIR_LEFT: inc rbx cmp rbx, rrNoD jge PAIR_LEFT_UNPAIR movsx edx, word ptr[rrToD+ 2*rbx] cmp edx, 3 jge PAIR_LEFT mov ecx, [rrXoD+ 4*rbx] movsx eax, word ptr[rrToD+ 2*ix] cmp eax, edx je PAIR_LEFT mov eax, xPlusPitch sub eax, ecx cmp eax, 1 jg PAIR_LEFT cmp eax, -1 jl PAIR_LEFT_UNPAIR mov word ptr [rrToD+ 2*rbx], 4 mov rax, PairAddr mov (astPair ptr [rax]).pos, 1 mov (astPair ptr [rax]).pair, 1 mov (astPair ptr [rax]).x, ecx mov (astPair ptr [rax]).y, iy32 mov (astPair ptr [rax]).dtype, edx movzx edx, word ptr[rrPoD+ 2*rbx] mov (astPair ptr [rax]).peak, edx add rax, PairSize mov PairAddr, rax inc StartPair jmp LOOP_PAIR_NUN PAIR_LEFT_UNPAIR: mov rax, PairAddr mov (astPair ptr [rax]).pos, 1 mov (astPair ptr [rax]).pair, 5 movsxd rdx, xPlusPitch sub rdx, iPitchHUp mov (astPair ptr [rax]).x, edx mov (astPair ptr [rax]).y, iy32 movsx edx, word ptr[rrToD+ 2*ix] mov (astPair ptr [rax]).dtype, edx movsx edx, word ptr[rrPoD+ 2*ix] mov (astPair ptr [rax]).peak, edx add rax, PairSize mov PairAddr, rax inc StartPair jmp LOOP_PAIR_NUN PAIR_CENTER: inc rbx cmp rbx, rrNoD jge LOOP_PAIR_NUN movsx edx, word ptr[rrToD+ 2*rbx] cmp edx, 3 jge PAIR_CENTER mov ecx, [rrXoD+ 4*rbx] movsx eax, word ptr[rrToD+ 2*ix] cmp eax, edx je PAIR_CENTER mov eax, xPlusPitch sub eax, ecx cmp eax, 1 jg PAIR_CENTER cmp eax, -1 jl LOOP_PAIR_NUN mov word ptr [rrToD+ 2*rbx], 4 mov rax, PairAddr mov (astPair ptr [rax]).pos, 2 mov (astPair ptr [rax]).pair, 1 mov (astPair ptr [rax]).x, ecx mov (astPair ptr [rax]).y, iy32 mov (astPair ptr [rax]).dtype, edx movsx edx, word ptr[rrPoD+ 2*rbx] mov (astPair ptr [rax]).peak, edx add rax, PairSize mov PairAddr, rax inc StartPair jmp LOOP_PAIR_NUN LOOP_PAIR_X_END: LOOP_PAIR_NUM_END: mov rrNoD, 0 jmp PAIRING_END END_FUNC: ; mov rax, rrNoD mov rax, StartPair pop rbx pop rsi pop rdi pop r15 pop r14 pop r13 pop r12 pop r11 pop r10 pop rbp RET ConvFloat2 ENDP end