; »ç´Ù¸®²Ã ¿µ¿ªÀ» ¹Þ¾Æ 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 xmm2 xxCmp equ xmm3 xxSrc2 equ xmm4 xxCmp2 equ xmm5 xxThres equ xmm6 xxSupp equ xmm7 xxfSPR equ xmm8 xxsSPR equ xmm9 xxZeroBack equ xmm10 xxOne equ xmm11 xxPeak equ xmm12 xxPeak2 equ xmm13 xxNoise equ xmm15 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] ConvTrapFD 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 Inspect_Black: mov BlackNWhite, 0 mov bx, 0 movdqa xxPeak, xxCmp psubw xxPeak, xxSrc movdqa xxPeak2, xxPeak pcmpgtw xxPeak, xxThres pmovmskb rax, xxPeak cmp rax, 0 jne DEFECT_CALL Inspect_White: mov BlackNWhite, 1 mov bx, 1 movdqa xxPeak, xxSrc psubw xxPeak, xxCmp movdqa xxPeak2, xxPeak 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 DefectProcFD 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: 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: 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 ConvTrapFD ENDP ;==============================================GetNoiseHori============= DefectProcFD 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 DefectProcFD Endp ;==============================================GetNoiseHori============= GetNoiseHori PROC ; rcx= iPitch16 local PitchSum[2] : qword mov rax, rcx and rax, 0fh movd xxsSpr, eax punpcklwd xxsSpr, xxsSpr pshufd xxsSpr, xxsSpr, 0 mov rbx, SprMulti sub rbx, rax movd xxfSpr, rbx punpcklwd xxfSpr, xxfSpr pshufd xxfSpr, xxfSpr, 0 sar rcx, SprShift push rrImgAddr pxor xxNoise, xxNoise ; Noise mov rax, 0 ; count to 16 LOOP_PITCH: movdqu xxSrc, [rrImgAddr] ; Src movdqu xxCmp, [rrImgAddr+ 1] movdqa xxSrc2, xxSrc movdqa xxCmp2, xxCmp punpcklbw xxSrc, xmm0 punpcklbw xxCmp, xmm0 punpckhbw xxSrc2, xmm0 punpckhbw xxCmp2, xmm0 paddw xxSrc, xxCmp paddw xxSrc2, xxCmp2 psllw xxSrc, SprShift psllw xxSrc2, Sprshift mov rbx, rrImgAddr ; Ref add rbx, rcx movdqu xxCmp, [rbx] movdqa xxCmp2, xxCmp punpcklbw xxCmp, xmm0 punpckhbw xxCmp2, xmm0 pmullw xxCmp, xxfSpr pmullw xxCmp2, xxfSpr psubw xxSrc, xxCmp psubw xxSrc2, xxCmp2 movdqu xxCmp, [rbx+ 1] movdqa xxCmp2, xxCmp punpcklbw xxCmp, xmm0 punpckhbw xxCmp2, xmm0 pmullw xxCmp, xxfSpr pmullw xxCmp2, xxfSpr psubw xxSrc, xxCmp psubw xxSrc2, xxCmp2 movdqu xxCmp, [rbx+ 2] movdqa xxCmp2, xxCmp punpcklbw xxCmp, xmm0 punpckhbw xxCmp2, xmm0 pmullw xxCmp, xxfSpr pmullw xxCmp2, xxfSpr psubw xxSrc, xxCmp psubw xxSrc2, xxCmp2 pabsw xxSrc, xxSrc ; Rslt pabsw xxSrc2, xxSrc2 psubusw xxSrc, xxZeroBack psubusw xxSrc2, xxZeroBack pmaddwd xxSrc, xxOne ; Word -> DWord (16->32) pmaddwd xxSrc2, xxOne movdqa xxCmp, xxSrc punpckldq xxSrc, xmm0 ; DWord -> QWord (32 -> 64) punpckldq xxCmp, xmm0 paddq xxNoise, xxSrc paddq xxNoise, xxcmp add rrImgAddr, rrBW inc rax cmp rax, 16 jl LOOP_PITCH lea rcx, PitchSum movdqu [rcx], xxNoise mov rax, [rcx] add rax, [rcx+ 8] pop rrImgAddr RET GetNoiseHori ENDP end