; »ç´Ù¸®²Ã ¿µ¿ªÀ» ¹Þ¾Æ Horizontal ¹æÇâÀ¸·Î °Ë»ç¸¦ ÁøÇàÇÑ´Ù. ; Fluidic Pitch Pointer°¡ ÀÖÀ» ½Ã CPC °Ë»ç. - PitchBuff equ qword ptr[rbp+ 0d8h] ; CPC¿ë Pitch ´Â 16¹ø¿¡ Çѹø¾¿ ·ÎµùÇØ¼­ º¯°æ ; Fluidic Pitch Pointer°¡ ¾øÀ» ½Ã ±âÁØ Pitch °Ë»ç. - iPitch equ qword ptr[rbp+ 98h] ; ¶óÀÎ ´ÜÀ§ Æä¾î¸µÀ» ½Ç½ÃÇÑ´Ù. - PairAddr equ qword ptr[rbp+ 0b0h] ; Æä¾î¸µ Á¶°Ç º¯°æ -> +-1 ¿¡¼­ just pixel to pixel·Î º¯°æ .data 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 ConvShift equ 2 ConvSize equ 4 SprShift equ 4 SprMulti equ 16 ConvNSprShift equ 6 ; register À̸§Áþ±â 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 rrImgAddr equ r14 ; Image Address rrConAdr equ r15 ; xmm À̸§ Áþ±â xxTemp equ xmm1 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 y1 equ qword ptr[rbp+ 30h] y2 equ qword ptr[rbp+ 38h] xlt equ qword ptr[rbp+ 40h] ; left position top xlb equ qword ptr[rbp+ 48h] ; left position bottom xrt equ qword ptr[rbp+ 50h] ; right position top xrb equ qword ptr[rbp+ 58h] ; rigfht position bottom Threshold equ qword ptr[rbp+ 60h] Suppress equ qword ptr[rbp+ 68h] DefectX equ qword ptr[rbp+ 70h] DefectY equ qword ptr[rbp+ 78h] DefectType equ qword ptr[rbp+ 80h] DefectVal equ qword ptr[rbp+ 88h] SprShiftF equ qword ptr[rbp+ 90h] iPitch equ qword ptr[rbp+ 98h] fSPR equ qword ptr[rbp+ 0a0h] sSPR equ qword ptr[rbp+ 0a8h] PairAddr equ qword ptr[rbp+ 0b0h] nPair equ qword ptr[rbp+ 0b8h] MaxPair equ qword ptr[rbp+ 0c0h] PairSize equ qword ptr[rbp+ 0c8h] BuffWidth equ qword ptr[rbp+ 0d0h] PitchBuff equ qword ptr[rbp+ 0d8h] bUseUnpair equ qword ptr[rbp+ 0e0h] ConvTrapezium PROC C local BlackNWhite : qword local dxTrapLeft : qword local dxTrapRight : qword local dyTrap : qword local xStart : qword local xEnd : qword local xWidth : qword local ImgAdrEnd : qword local iPitch2 : qword local ImgAdr : qword local ConAdr : qword local maxPixelD : qword local minInsp : qword local pairLeft : qword local pairRight : qword local iPitchHUp : qword local cPitch : 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, 068h+ 30h mov ImgAdr, rcx mov ConAdr, rdx mov maxPixelD, r8 sub maxPixelD, 16 mov rrXoD, DefectX mov rrYoD, DefectY mov rrToD, DefectType mov rrPoD, DefectVal mov rrBW, BuffWidth mov rax, nPair mov rcx, PairSize imul rax, rcx add rax, PairAddr mov PairAddr, rax mov rcx, iPitch and rcx, 0fh movd xxsSpr, ecx ; sSPR movdqa xxTemp, xxsSpr punpcklwd xxTemp, xxsSpr pshufd xxsSpr, xxTemp, 0 mov rax, SprMulti ; fSpr sub rax, rcx movd xxfSpr, eax movdqa xxTemp, xxfSpr punpcklwd xxTemp, xxfSpr pshufd xxfSpr, xxTemp, 0 mov rax, iPitch ; iPitch sar rax, SprShift mov iPitch, rax mov rax, iPitch ;;; Áö¿ª º¯¼ö ÇÒ´ç. add rax, rax mov iPitch2, rax ; conv buff´Â 2byte ´ÜÀ§À̹ǷÎ.. add rax, iPitch mov minInsp, rax ; 3 pitch ÀÌ»ó µÇ¾î¾ß °Ë»ç. cmp rax, 10h jge MIN_INSP_SIZE mov minInsp, 48 MIN_INSP_SIZE: mov rax, y2 ; »ç´Ù¸®²Ã °Å¸® °øÂ÷ ±¸Çϱâ sub rax, y1 mov dyTrap, rax mov rax, xlb sub rax, xlt mov dxTrapLeft, rax mov rax, xrb sub rax, xrt mov dxTrapRight, rax mov rax, Suppress ; supress sal rax, ConvNSprShift movd xxSupp, rax movdqa xmm0, xxSupp punpcklwd xmm0, xxSupp pshufd xxSupp, xmm0, 0 mov rax, Threshold movd xxThres, rax ; Threshold movdqa xmm0, xxThres punpcklwd xmm0, xxThres pshufd xxThres, xmm0, 0 mov rax, iPitch mov iPitchHUp, rax cmp sSpr, 8 jl PITCH_HALF_UP_PASS inc iPitchHUp PITCH_HALF_UP_PASS: mov iy, y1 ;;; °Ë»ç ÃʱâÈ­. pxor xmm0, xmm0 mov cPitch, 0 NEXT_LINE: inc cPitch ; 16¶óÀο¡ Çѹø¾¿ ÇÇÄ¡¸¦ ÀбâÀ§ÇÑ Ä«¿îÅÍ and cPitch, 0fh cmp cPitch, 1 ; 16¹ø¿¡ Çѹø¾¿ °Ç³Ê¶Ù±â. ¸Ç óÀ½Àº ¹«Á¶°Ç ÇØ¾ßÁö. ±×·¡¼­ 1°ú ºñ±³ jne FLAG_FLUIDIC_PITCH_PASS cmp PitchBuff, 0 ; ÇÇÄ¡ Á¤º¸ ¾øÀ¸¸é °Ç³Ê¶Ù±â. je FLAG_FLUIDIC_PITCH_PASS mov rax, iy sar rax, 4 ; ÇÇÄ¡ Á¤º¸´Â 16 lineÀ» ÇÑ ´ÜÀ§·Î ÀúÀåµÈ´Ù. shl rax, 2 add rax, PitchBuff movsxd rax, dword ptr [rax] mov rcx, rax and rcx, 0fh shr rax, SprShift mov iPitch, rax add rax, rax mov iPitch2, rax ; iPitch2 mov rdx, 16 sub rdx, rcx mov rax, iPitch mov iPitchHUp, rax cmp rcx, 8 jl PITCH_HALF_DOWN2 inc iPitchHUp PITCH_HALF_DOWN2: mov rax, iPitch ;;; Áö¿ª º¯¼ö ÇÒ´ç. add rax, iPitch2 mov minInsp, rax ; 3 pitch ÀÌ»ó µÇ¾î¾ß °Ë»ç. cmp rax, 10h jge MIN_INSP_SIZE2 mov minInsp, 48 MIN_INSP_SIZE2: movd xxsSpr, rcx ; sSpr movdqa xmm1, xxsSpr punpcklwd xmm1, xxsSpr pshufd xxsSpr, xmm1, 0 movd xxfSpr, rdx ; fSpr movdqa xmm1, xxfSpr punpcklwd xmm1, xxfSpr pshufd xxfSpr, xmm1, 0 FLAG_FLUIDIC_PITCH_PASS: ; °Ë»ç xStart, xEnd ±¸Çϱâ. x= x1 + (x2- x1)*(iy - y1)/(y2- y1), (x1, y1)¿¡¼­ (x2, y2)·Î À̵¿ÇÒ¶§ ÀÓÀÇÀÇ iy¿¡¼­ÀÇ ixÀÇ °ª »êÃâ ; xStart, xEnd mov rax, iy sub rax, y1 imul rax, dxTrapLeft mov rcx, dyTrap cdq idiv ecx movsxd rax, eax add rax, xlt mov xStart, rax mov ix, rax mov rax, iy sub rax, y1 imul rax, dxTrapRight mov rcx, dyTrap cdq idiv ecx movsxd rax, eax add rax, xrt mov xEnd, rax sub rax, xStart ; 16 byte align sar rax, 4 sal rax, 4 add rax, xStart mov xEnd, rax sub rax, xStart mov xWidth, rax mov rax, xEnd sub rax, xStart sub rax, iPitch sub rax, 1 sar rax, 3 sal rax, 3 add rax, xStart mov xEnd, rax mov rax, rrBW ; Image Address Setting imul rax, iy add rax, ImgAdr add rax, ix mov rrImgAddr, rax add rax, xWidth mov ImgAdrEnd, rax mov rrConAdr, ConAdr ; Con Address Setting mov rax, xStart add rax, iPitch mov pairLeft, rax mov rax, xEnd sub rax, iPitch mov pairRight, rax mov rax, xEnd ; 3pitch ¿µ¿ª È®º¸. 3pitch ¾ÈµÉ°æ¿ì line Inspection pass sub rax, xStart cmp rax, minInsp jge LOOP_MAKE_CON_BUFF inc iy; cmp iy, y2 jge END_FUNC jmp NEXT_LINE LOOP_MAKE_CON_BUFF: ; ÇÑ ¶óÀÎ Àüü ¼¼·Î ÇÕ¹öÆÛ ¸¸µé±â movdqu xmm2, [rrImgAddr] movdqa xmm3, xmm2 punpcklbw xmm2, xmm0 punpckhbw xmm3, xmm0 movdqu xmm4, [rrImgAddr+ rrBW] movdqa xmm5, xmm4 punpcklbw xmm4, xmm0 punpckhbw xmm5, xmm0 paddw xmm2, xmm4 paddw xmm3, xmm5 movdqu [rrConAdr], xmm2 movdqu [rrConAdr+ 10h], xmm3 add rrImgAddr, 10h add rrConAdr, 20h cmp rrImgAddr, ImgAdrEnd jl LOOP_MAKE_CON_BUFF ;//////////////// mov rrConAdr, ConAdr ; inc iy ; Loop Y Conv_8: ; °Ë»ç ·çƾ (16°³ ´ÜÀ§°¡ ¾Æ´Ï¶ó 8°Ô ´ÜÀ§·Î ¿¬»ê °¡´É) mov rax, iPitch2 movdqu xxCmp, [rrConAdr+ rax] ; ºñ±³ ¹öÆÛ °¡·ÎÇÕ ¸¸µé±â pmullw xxCmp, xxfSPR movdqu xmm1, [rrConAdr+ rax+ 2] psllw xmm1, SprShift paddw xxCmp, xmm1 movdqu xmm1, [rrConAdr+ rax+ 4] pmullw xmm1, xxsSPR paddw xxCmp, xmm1 ; movdqa xmm1, xxCmp ; suppress (2*2*SPR ÇØÁØ suppress) ; psubusw xmm1, xxSupp ; psubusw xxCmp, xmm1 pminuw xxCmp, xxSupp movdqu xxSrc, [rrConAdr] ; ¼Ò½º¹öÆÛ °¡·ÎÇÕ ¸¸µé±â movdqu xmm1, [rrConAdr+ 2] paddw xxSrc, xmm1 psllw xxSrc, SprShift ; SPR ; movdqa xmm1, xxSrc ; suppress (2*2*SPR ÇØÁØ suppress) ; psubusw xmm1, xxSupp ; psubusw xxSrc, xmm1 pminuw xxSrc, xxSupp 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_CALL 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_CALL End_8_Pixel: cmp rrNoD, maxPixelD jge PAIRING add ix, 8 ; Loop X add rrConAdr, 16 ; 14= 16- 2 cmp ix, xEnd jl Conv_8 jmp PAIRING PAIRING_RETURN: inc iy ; Loop Y cmp iy, y2 jge END_FUNC jmp NEXT_LINE DEFECT_CALL: call DefectProc jmp DEFECT_END Defect_End: sub ix, 7 cmp BlackNWhite, 0 je Inspect_White jmp End_8_Pixel PAIRING: mov ix, -1 LOOP_PAIR_NUM: inc ix cmp ix, rrNoD jge LOOP_PAIR_NUM_END mov rax, nPair cmp rax, MaxPair jge END_FUNC cmp word ptr [rrToD+ 2*ix], 3 ; chek type DEFTYPE_NODEFECT= 3, DEFTYPE_DELETE= 4 jge LOOP_PAIR_NUM 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: cmp bUseUnpair, 1 jne LOOP_PAIR_NUM 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] inc edx and edx, 1 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 nPair jmp LOOP_PAIR_NUM PAIR_LEFT: inc rbx cmp rbx, rrNoD jge PAIR_LEFT_UNPAIR mov ecx, [rrXoD+ 4*rbx] ; Filter_1_Pair_Position mov eax, xPlusPitch sub eax, ecx cmp eax, 1 jge PAIR_LEFT cmp eax, -1 jle PAIR_LEFT_UNPAIR movzx edx, word ptr[rrToD+ 2*rbx] ; Filter_2_TYPE_DELETE cmp dx, 3 jge PAIR_LEFT mov ax, word ptr[rrToD+ 2*ix] ; Filter_3_TYPE_PAIR cmp ax, dx je PAIR_LEFT 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 nPair jmp LOOP_PAIR_NUM PAIR_LEFT_UNPAIR: cmp bUseUnpair, 1 jne LOOP_PAIR_NUM 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 movzx edx, word ptr[rrToD+ 2*ix] 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 nPair jmp LOOP_PAIR_NUM PAIR_CENTER: inc rbx cmp rbx, rrNoD jge LOOP_PAIR_NUM mov ecx, [rrXoD+ 4*rbx] ; Filter_1_Pair_Position cmp ecx, xPlusPitch jl PAIR_CENTER jg LOOP_PAIR_NUM movzx edx, word ptr[rrToD+ 2*rbx] ; Filter_2_DELETE cmp dx, 3 jge PAIR_CENTER mov ax, word ptr[rrToD+ 2*ix] ; Filter_3_PAIR cmp ax, dx je PAIR_CENTER 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 movzx edx, word ptr[rrPoD+ 2*rbx] mov (astPair ptr [rax]).peak, edx add rax, PairSize mov PairAddr, rax inc nPair jmp LOOP_PAIR_NUM LOOP_PAIR_X_END: LOOP_PAIR_NUM_END: mov rrNoD, 0 jmp PAIRING_RETURN END_FUNC: mov rax, nPair ; mov rax, rrNoD pop rbx pop rsi pop rdi pop r15 pop r14 pop r13 pop r12 pop r11 pop r10 pop rbp RET ConvTrapezium ENDP ;==============================================DefectProc============= DefectProc Proc 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 DefectProc_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 DefectProc_End: RET DefectProc Endp end