#include "stdafx.h" #include "BlobStorage.h" #include #ifdef _DEBUG #define new DEBUG_NEW #endif #include "SISAssem.h" #include "AssemParam.h" //20160816 yjm Assem->Intrinsic Convert(1by1 Vertical ZoneTh) int CSISAssem::ConvZoneVert2S_BOE_Intrin(BYTE *pImgBuff, __int64 Threshold, __int64 maxDefect, __int64 nDefect , __int64 left, __int64 right, __int64 top, __int64 bottom , int* DefectX, int* DefectY, short* DefectT, short* DefectValue , int* pGraySrc, int* pGrayCmp, int* pZoneID, int* pZoneTh , __int64 frameWidth, __int64 iPitch16, __int64 fSPR, __int64 sSPR , short* ZoneThTable, short* ZoneIdTable, __int64 ZoneTableWidth, void* pMatchTable , CDefectPair *pDefectdPair, __int64 StartPair, __int64 MaxPair, __int64 PairSize , __int64 dxPattern, __int64 dyPattern, __int64 yZoneByte, __int64 bReverseFilter , short* ZoneAddTable, short* pConBuff, __int64 bUseUnpair, int* endLine , __int64 ExTh, __int64 Suppress ) { const __int64 SprShift = 4; const __int64 SprMulti = 16; const __int64 szxMatch = 8; __m128i xxTemp; __m128i xxDSlide; __m128i xxZTh; __m128i xxZId; __m128i xxSrc1; __m128i xxSrc2; __m128i xxCmp1; __m128i xxCmp2; __m128i xxPeakS; __m128i xxPeakAbs; __m128i xxfSpr; __m128i xxsSpr; __int64 rax, rbx, rcx, rdx; __int64 ImgAddrOri = (__int64)pImgBuff; __int64 ConAddr = (__int64)pConBuff; __int64 c8Pixel, rrNoD = 0, rrImgAddr, nPair = StartPair; __m128i xxSupp = _mm_set1_epi16((short)Suppress); rcx = iPitch16; rcx &= 0x0f; xxsSpr = _mm_set1_epi16((short)rcx); rax = SprMulti; rax -= rcx; xxfSpr = _mm_set1_epi16((short)rax); __int64 xMatch2 = 0; __int64 iPitch = iPitch16 / SprMulti; __int64 iPitchHUp = iPitch; if(rcx >= SprMulti / 2) iPitchHUp++; bottom--; __int64 ConBottom = bottom - iPitch - 1; __int64 pairBottom = ConBottom - iPitch; // -------------- à» Filtering -------------- // CRect rtDeadZone[MAX_DEAD_ZONE_COUNT]; CPoint ptDefect; memcpy(rtDeadZone, m_Param.s_RectDeadZone, sizeof(CRect) * MAX_DEAD_ZONE_COUNT); int nDeadZoneCount = 0; for(int i = 0; i < MAX_DEAD_ZONE_COUNT; i++) { if(rtDeadZone[i].IsRectEmpty() == TRUE) { nDeadZoneCount = i; break; } } // ------------------------------------------ // __int64 pairTop = top + iPitch; __int64 ConvPitch = iPitch * 0x20; __int64 ZoneTableW2 = ZoneTableWidth + ZoneTableWidth; __int64 ix = left; __int64 iy = top; right = (right - left) / 16 * 16 + left; __int64 pMatch1 = (__int64)pMatchTable; pMatchTable = (void*)(pMatch1 + yZoneByte); rcx = (__int64)pMatchTable; rbx = (__int64)(*((int*)(rcx + 4))); int yMatch = (int)rbx; rdx = dyPattern + rbx; __int64 eyPtrn = rdx; __int64 eyPtrn1 = rdx; rax = (iy - rbx) * ZoneTableWidth; rbx = (__int64)(*((int*)rcx)); int xMatch = (int)rbx; __int64 exPtrn = dxPattern + rbx; rax += ix - rbx; rax += rax; rdx = (__int64)ZoneThTable + rax; __int64 ZoneThAddr = rdx; __int64 ZoneThAddr1 = rdx; rdx = (__int64)ZoneIdTable + rax; __int64 ZoneIdAddr = rdx; __int64 ZoneIdAddr1 = rdx; rdx = (__int64)ZoneAddTable + rax; __int64 ZoneAddAddr = rdx; __int64 ZoneAddAddr1 = rdx; __m128i xxZero = _mm_setzero_si128(); CDefectPair* PairAddr = pDefectdPair + nPair; //LOOP_1: goto LOOP_1_CHECK; LOOP_1_TAIL: goto PAIRING_VERT; _return_PAIRING_VERT: ix += 0x10; eyPtrn = eyPtrn1; pMatchTable = (void*)pMatch1; ZoneThAddr1 += 0x20; ZoneThAddr = ZoneThAddr1; ZoneIdAddr1 += 0x20; ZoneIdAddr = ZoneIdAddr1; ZoneAddAddr1 += 0x20; ZoneAddAddr = ZoneAddAddr1; LOOP_1_CHECK: if(ix >= right) goto END_FUNC; //LOOP_1_BODY: iy = top; rrImgAddr = ImgAddrOri + frameWidth * iy + ix; goto MAKE_CONBUFF_HEAD; _return_MAKE_CONBUFF: iy = top; rrImgAddr = ConAddr; if(ix >= exPtrn) goto CHECK_1_BOUND; _return_CHECK_1_BOUND: //LOOP_2: goto LOOP_2_CHECK; LOOP_2_TAIL: iy++; rrImgAddr += 0x20; ZoneThAddr += ZoneTableW2; ZoneIdAddr += ZoneTableW2; ZoneAddAddr += ZoneTableW2; LOOP_2_CHECK: if(iy >= ConBottom) goto LOOP_1_TAIL; if(iy >= eyPtrn) goto CHECK_2_BOUND; _return_CHECK_2_BOUND: //LOOP_2_BODY: goto XMM_MAKE; MAKE_CONBUFF_HEAD: rax = ConAddr; MAKE_CONBUFF: xxSrc1 = _mm_loadu_si128((__m128i*) rrImgAddr); _mm_storeu_si128((__m128i*)rax, _mm_unpacklo_epi8(xxSrc1, xxZero)); _mm_storeu_si128((__m128i*)(rax + 0x10), _mm_unpackhi_epi8(xxSrc1, xxZero)); rrImgAddr += frameWidth; rax += 0x20; iy++; if(iy <= bottom) goto MAKE_CONBUFF; goto _return_MAKE_CONBUFF; CHECK_1_BOUND: pMatch1 += szxMatch; rcx = pMatch1 + yZoneByte; pMatchTable = (void*)rcx; yMatch = *((int*)(rcx + 4)); rdx = dyPattern + yMatch; eyPtrn = eyPtrn1 = rdx; rax = (iy - yMatch) * ZoneTableWidth; xMatch = *(int*)(rcx); rdx = dxPattern + xMatch; rcx = xMatch + dxPattern; if(rcx < right) goto EXCESS_1_BOUND_PASS; rdx = rcx; EXCESS_1_BOUND_PASS: exPtrn = rdx; rax += (ix - xMatch); rax += rax; ZoneThAddr1 = ZoneThAddr = (__int64)ZoneThTable + rax; ZoneIdAddr1 = ZoneIdAddr = (__int64)ZoneIdTable + rax; ZoneAddAddr1 = ZoneAddAddr = (__int64)ZoneAddTable + rax; xMatch2++; goto _return_CHECK_1_BOUND; CHECK_2_BOUND: pMatchTable = (void*)((__int64)pMatchTable + yZoneByte); rbx = (__int64)(*((int*)((__int64)pMatchTable + 4))); yMatch = (int)rbx; eyPtrn = dyPattern + rbx; rax = eyPtrn + dyPattern; if(rax < bottom) goto EXCESS_2_BOUND_PASS; eyPtrn = rax; EXCESS_2_BOUND_PASS: rax = (iy - rbx) * ZoneTableWidth; xMatch =*((int*)pMatchTable); rax += ix - xMatch; rax += rax; ZoneThAddr = (__int64)ZoneThTable + rax; ZoneIdAddr = (__int64)ZoneIdTable + rax; ZoneAddAddr = (__int64)ZoneAddTable + rax; goto _return_CHECK_2_BOUND; XMM_MAKE: xxSrc1 = _mm_loadu_si128((__m128i*) rrImgAddr); xxSrc2 = _mm_loadu_si128((__m128i*) (rrImgAddr + 0x10)); rax = rrImgAddr + ConvPitch; xxCmp1 = _mm_loadu_si128((__m128i*) rax); xxCmp2 = _mm_loadu_si128((__m128i*) (rax + 0x10)); xxTemp = _mm_loadu_si128((__m128i*) (rax + 0x20)); xxDSlide = _mm_loadu_si128((__m128i*) (rax + 0x30)); xxCmp1 = _mm_srli_epi16(_mm_add_epi16(_mm_mullo_epi16(xxCmp1, xxfSpr), _mm_mullo_epi16(xxTemp, xxsSpr)), SprShift); xxCmp2 = _mm_srli_epi16(_mm_add_epi16(_mm_mullo_epi16(xxCmp2, xxfSpr), _mm_mullo_epi16(xxDSlide, xxsSpr)), SprShift); goto XMM_COMPARE; XMM_COMPARE_END: ix -= 0x10; ZoneThAddr -= 0x10; ZoneIdAddr -= 0x10; ZoneAddAddr -= 0x10; goto LOOP_2_TAIL; XMM_COMPARE: c8Pixel = 0; xxSrc1 = _mm_min_epu16(xxSrc1, xxSupp); xxCmp1 = _mm_min_epu16(xxCmp1, xxSupp); goto _XMM_COMPARE_8PIXEL; _return_XMM_COMPARE_8PIXEL: if(rrNoD >= maxDefect) goto PAIRING_VERT; c8Pixel++; if(c8Pixel == 2) goto XMM_COMPARE_END; xxSrc1 = _mm_min_epu16(xxSrc2, xxSupp); xxCmp1 = _mm_min_epu16(xxCmp2, xxSupp); ZoneThAddr += 0x10; ZoneIdAddr += 0x10; ZoneAddAddr += 0x10; _XMM_COMPARE_8PIXEL: xxTemp = _mm_loadu_si128((__m128i*) ZoneThAddr); xxDSlide = _mm_loadu_si128((__m128i*) ZoneAddAddr); xxZTh = _mm_add_epi16(_mm_srli_epi16(_mm_mullo_epi16(_mm_max_epu16(xxSrc1, xxCmp1), xxDSlide), 8), xxTemp); xxPeakS = _mm_sub_epi16(xxSrc1, xxCmp1); xxPeakAbs = _mm_abs_epi16(xxPeakS); xxTemp = _mm_cmpgt_epi16(xxPeakAbs, xxZTh); if(_mm_movemask_epi8(xxTemp) != 0) goto DEFECT_00; ix += 8; goto _return_XMM_COMPARE_8PIXEL; DEFECT_00: xxZId = _mm_loadu_si128((__m128i*) ZoneIdAddr); if(_mm_extract_epi16(xxTemp, 0x00) == 0) goto DEFECT_01; *(DefectX + rrNoD) = (int)ix; *(DefectY + rrNoD) = (int)iy; *(pGraySrc + rrNoD) = _mm_extract_epi16(xxSrc1, 0x00); *(pGrayCmp + rrNoD) = _mm_extract_epi16(xxCmp1, 0x00); *(pZoneID + rrNoD) = _mm_extract_epi16(xxZId, 0x00); *(pZoneTh + rrNoD) = _mm_extract_epi16(xxZTh, 0x00); if((short)_mm_extract_epi16(xxPeakS, 0x00) > 0) *(DefectT + rrNoD) = 1; else *(DefectT + rrNoD) = 0; rrNoD++; DEFECT_01: ix++; if(_mm_extract_epi16(xxTemp, 0x01) == 0) goto DEFECT_02; *(DefectX + rrNoD) = (int)ix; *(DefectY + rrNoD) = (int)iy; *(pGraySrc + rrNoD) = _mm_extract_epi16(xxSrc1, 0x01); *(pGrayCmp + rrNoD) = _mm_extract_epi16(xxCmp1, 0x01); *(pZoneID + rrNoD) = _mm_extract_epi16(xxZId, 0x01); *(pZoneTh + rrNoD) = _mm_extract_epi16(xxZTh, 0x01); if((short)_mm_extract_epi16(xxPeakS, 0x01) > 0) *(DefectT + rrNoD) = 1; else *(DefectT + rrNoD) = 0; rrNoD++; DEFECT_02: ix++; if(_mm_extract_epi16(xxTemp, 0x02) == 0) goto DEFECT_03; *(DefectX + rrNoD) = (int)ix; *(DefectY + rrNoD) = (int)iy; *(pGraySrc + rrNoD) = _mm_extract_epi16(xxSrc1, 0x02); *(pGrayCmp + rrNoD) = _mm_extract_epi16(xxCmp1, 0x02); *(pZoneID + rrNoD) = _mm_extract_epi16(xxZId, 0x02); *(pZoneTh + rrNoD) = _mm_extract_epi16(xxZTh, 0x02); if((short)_mm_extract_epi16(xxPeakS, 0x02) > 0) *(DefectT + rrNoD) = 1; else *(DefectT + rrNoD) = 0; rrNoD++; DEFECT_03: ix++; if(_mm_extract_epi16(xxTemp, 0x03) == 0) goto DEFECT_04; *(DefectX + rrNoD) = (int)ix; *(DefectY + rrNoD) = (int)iy; *(pGraySrc + rrNoD) = _mm_extract_epi16(xxSrc1, 0x03); *(pGrayCmp + rrNoD) = _mm_extract_epi16(xxCmp1, 0x03); *(pZoneID + rrNoD) = _mm_extract_epi16(xxZId, 0x03); *(pZoneTh + rrNoD) = _mm_extract_epi16(xxZTh, 0x03); if((short)_mm_extract_epi16(xxPeakS, 0x03) > 0) *(DefectT + rrNoD) = 1; else *(DefectT + rrNoD) = 0; rrNoD++; DEFECT_04: ix++; if(_mm_extract_epi16(xxTemp, 0x04) == 0) goto DEFECT_05; *(DefectX + rrNoD) = (int)ix; *(DefectY + rrNoD) = (int)iy; *(pGraySrc + rrNoD) = _mm_extract_epi16(xxSrc1, 0x04); *(pGrayCmp + rrNoD) = _mm_extract_epi16(xxCmp1, 0x04); *(pZoneID + rrNoD) = _mm_extract_epi16(xxZId, 0x04); *(pZoneTh + rrNoD) = _mm_extract_epi16(xxZTh, 0x04); if((short)_mm_extract_epi16(xxPeakS, 0x04) > 0) *(DefectT + rrNoD) = 1; else *(DefectT + rrNoD) = 0; rrNoD++; DEFECT_05: ix++; if(_mm_extract_epi16(xxTemp, 0x05) == 0) goto DEFECT_06; *(DefectX + rrNoD) = (int)ix; *(DefectY + rrNoD) = (int)iy; *(pGraySrc + rrNoD) = _mm_extract_epi16(xxSrc1, 0x05); *(pGrayCmp + rrNoD) = _mm_extract_epi16(xxCmp1, 0x05); *(pZoneID + rrNoD) = _mm_extract_epi16(xxZId, 0x05); *(pZoneTh + rrNoD) = _mm_extract_epi16(xxZTh, 0x05); if((short)_mm_extract_epi16(xxPeakS, 0x05) > 0) *(DefectT + rrNoD) = 1; else *(DefectT + rrNoD) = 0; rrNoD++; DEFECT_06: ix++; if(_mm_extract_epi16(xxTemp, 0x06) == 0) goto DEFECT_07; *(DefectX + rrNoD) = (int)ix; *(DefectY + rrNoD) = (int)iy; *(pGraySrc + rrNoD) = _mm_extract_epi16(xxSrc1, 0x06); *(pGrayCmp + rrNoD) = _mm_extract_epi16(xxCmp1, 0x06); *(pZoneID + rrNoD) = _mm_extract_epi16(xxZId, 0x06); *(pZoneTh + rrNoD) = _mm_extract_epi16(xxZTh, 0x06); if((short)_mm_extract_epi16(xxPeakS, 0x06) > 0) *(DefectT + rrNoD) = 1; else *(DefectT + rrNoD) = 0; rrNoD++; DEFECT_07: ix++; if(_mm_extract_epi16(xxTemp, 0x07) == 0) goto DEFECT_08; *(DefectX + rrNoD) = (int)ix; *(DefectY + rrNoD) = (int)iy; *(pGraySrc + rrNoD) = _mm_extract_epi16(xxSrc1, 0x07); *(pGrayCmp + rrNoD) = _mm_extract_epi16(xxCmp1, 0x07); *(pZoneID + rrNoD) = _mm_extract_epi16(xxZId, 0x07); *(pZoneTh + rrNoD) = _mm_extract_epi16(xxZTh, 0x07); if((short)_mm_extract_epi16(xxPeakS, 0x07) > 0) *(DefectT + rrNoD) = 1; else *(DefectT + rrNoD) = 0; rrNoD++; DEFECT_08: ix++; goto _return_XMM_COMPARE_8PIXEL; PAIRING_VERT: iy = -1; LOOP_PAIR_NUM: iy++; if(iy >= rrNoD) goto LOOP_PAIR_NUM_END; rax = nPair; if(rax >= MaxPair) goto END_FUNC; if(*(DefectT + iy) >= 3) goto LOOP_PAIR_NUM; rbx = iy; rcx = *(DefectY + iy); rax = rcx + iPitchHUp; rrImgAddr = *(DefectX + iy); if(rcx > pairBottom) goto PAIR_BOTTOM; if(rcx >= pairTop) goto PAIR_CENTER; PAIR_TOP: rbx++; if(rbx >= rrNoD) goto PAIR_TOP_UNPAIR; rdx = *(DefectY + rbx); if(rdx < rax) goto PAIR_TOP; else if(rdx > rax) goto PAIR_TOP_UNPAIR; rcx = *(DefectX + rbx); if(rrImgAddr != rcx) goto PAIR_TOP; rrImgAddr = *(DefectT + rbx); if(rrImgAddr >= 3) goto LOOP_PAIR_NUM; rax = (__int64)*(DefectT + iy); if(rax == rrImgAddr) goto LOOP_PAIR_NUM; // -------------- à» Filtering -------------- // ptDefect.x = (LONG)rcx; ptDefect.y = (LONG)rdx; for(int i = 0; i < nDeadZoneCount; i++) { if(rtDeadZone[i].PtInRect(ptDefect) ) goto LOOP_PAIR_NUM; } // ------------------------------------------ // *(DefectT + rbx) = 4; PairAddr->s_DefectPos = (DefectPos)1; PairAddr->s_DefectPair = (DefectPair)1; PairAddr->s_nDefectX = (int)rcx; PairAddr->s_nDefectY = (int)rdx; PairAddr->s_DefectType = (DefectType)rrImgAddr; //PairAddr->s_fDefectPeak = (int)*(DefectValue + rbx); PairAddr->s_nGraySrc = (int)(*(pGraySrc + rbx)); PairAddr->s_nGrayRef = (int)(*(pGrayCmp + rbx)); PairAddr->s_nZone = (int)(*(pZoneID + rbx)); PairAddr->s_nThresold = (int)(*(pZoneTh + rbx)); PairAddr++; nPair++; goto LOOP_PAIR_NUM; PAIR_TOP_UNPAIR: if(bUseUnpair != 1) goto LOOP_PAIR_NUM; //rcx = (__int64)*(DefectValue + iy); //if(rcx <= ExTh) // goto LOOP_PAIR_NUM; // -------------- à» Filtering -------------- // ptDefect.x = (LONG)(rrImgAddr); ptDefect.y = (LONG)(rax - iPitchHUp); for(int i = 0; i < nDeadZoneCount; i++) { if(rtDeadZone[i].PtInRect(ptDefect) ) goto LOOP_PAIR_NUM; } // ------------------------------------------ // PairAddr->s_DefectPos = (DefectPos)1; PairAddr->s_DefectPair = (DefectPair)5; PairAddr->s_nDefectX = (int)ptDefect.x; PairAddr->s_nDefectY = (int)ptDefect.y; PairAddr->s_DefectType = (DefectType)*(DefectT + iy); //PairAddr->s_fDefectPeak = (int)*(DefectValue + iy); PairAddr->s_nGraySrc = (int)(*(pGraySrc + iy)); PairAddr->s_nGrayRef = (int)(*(pGrayCmp + iy)); PairAddr->s_nZone = (int)(*(pZoneID + iy)); PairAddr->s_nThresold = (int)(*(pZoneTh + iy)); PairAddr++; nPair++; goto LOOP_PAIR_NUM; PAIR_CENTER: rbx++; if(rbx >= rrNoD) goto LOOP_PAIR_NUM; rdx = *(DefectY + rbx); if(rdx < rax) goto PAIR_CENTER; else if(rdx > rax) goto LOOP_PAIR_NUM; rcx = *(DefectX + rbx); if(rrImgAddr != rcx) goto PAIR_CENTER; rrImgAddr = *(DefectT + rbx); if(rrImgAddr >= 3) goto LOOP_PAIR_NUM; rax = (__int64)*(DefectT + iy); if(rax == rrImgAddr) goto LOOP_PAIR_NUM; // -------------- à» Filtering -------------- // ptDefect.x = (LONG)rcx; ptDefect.y = (LONG)rdx; for(int i = 0; i < nDeadZoneCount; i++) { if(rtDeadZone[i].PtInRect(ptDefect) ) goto LOOP_PAIR_NUM; } // ------------------------------------------ // *(DefectT + rbx) = 4; PairAddr->s_DefectPos = (DefectPos)2; PairAddr->s_DefectPair = (DefectPair)1; PairAddr->s_nDefectX = (int)rcx; PairAddr->s_nDefectY = (int)rdx; PairAddr->s_DefectType = (DefectType)rrImgAddr; //PairAddr->s_fDefectPeak = (int)*(DefectValue + rbx); PairAddr->s_nGraySrc = (int)(*(pGraySrc + rbx)); PairAddr->s_nGrayRef = (int)(*(pGrayCmp + rbx)); PairAddr->s_nZone = (int)(*(pZoneID + rbx)); PairAddr->s_nThresold = (int)(*(pZoneTh + rbx)); PairAddr++; nPair++; goto LOOP_PAIR_NUM; PAIR_BOTTOM: if(bUseUnpair != 1) goto LOOP_PAIR_NUM; //rcx = (__int64)*(DefectValue + iy); //if(rcx <= ExTh) // goto LOOP_PAIR_NUM; // -------------- à» Filtering -------------- // ptDefect.x = (LONG)rrImgAddr; ptDefect.y = (LONG)rax; for(int i = 0; i < nDeadZoneCount; i++) { if(rtDeadZone[i].PtInRect(ptDefect) ) goto LOOP_PAIR_NUM; } // ------------------------------------------ // PairAddr->s_DefectPos = (DefectPos)3; PairAddr->s_DefectPair = (DefectPair)5; PairAddr->s_nDefectX = (int)rrImgAddr; PairAddr->s_nDefectY = (int)rax; rdx = (*(DefectT + iy) + 1) & 1; PairAddr->s_DefectType = (DefectType)rdx; //PairAddr->s_fDefectPeak = (int)*(DefectValue + iy); PairAddr->s_nGraySrc = (int)(*(pGrayCmp + iy)); PairAddr->s_nGrayRef = (int)(*(pGraySrc + iy)); PairAddr->s_nZone = (int)(*(pZoneID + iy)); PairAddr->s_nThresold = (int)(*(pZoneTh + iy)); PairAddr++; nPair++; goto LOOP_PAIR_NUM; LOOP_PAIR_NUM_END: rrNoD = 0; goto _return_PAIRING_VERT; END_FUNC: ix += 0x10; *endLine = (int)ix; return (int)nPair; } //Á¸º°Th Áß °¡Àå ³·Àº ¹®ÅΰªÀ¸·Î ¸ÕÀú °Ë»çÇÑ µÚ¿¡, °ËÃâµÈ °áÇÔÀ» Á¸º°Th·Î Àç°Ë»çÇÑ´Ù. //ÀåÁ¡: Th Table À» ÂüÁ¶ ¾ÈÇØ¼­ Speed up!(ÀåÁÖ±â Th Table Àº ij½Ã ÀûÁßÀÌ ¾ÈµÇ¾î ´À¸®´Ù.) //´ÜÁ¡: Àç°Ë»ç½Ã ÇÑÂÊ ¹æÇâ ºñ±³¸¸ÇÏ¿© °¡°áÇÔ ¹ß»ý¿©ºÎ, °¡Àå ³·Àº ¹®ÅΰªÀ¸·Î °Ë»çÇÒ ¶§ °áÇÔÀÌ ´Ù¹ßÇÏ¸é ¾î¶»°Ô µÉÁö ¸ð¸£°Ú³×? int CSISAssem::ConvZoneVert2S_TSP_Intrin(BYTE *pImgBuff, __int64 Threshold, __int64 maxDefect, __int64 nDefect , __int64 left, __int64 right, __int64 top, __int64 bottom , int* DefectX, int* DefectY, short* DefectT, short* DefectValue , int* pGraySrc, int* pGrayCmp, int* pZoneID, int* pZoneTh , __int64 frameWidth, __int64 iPitch16, __int64 fSPR, __int64 sSPR , short* ZoneThTable, short* ZoneIdTable, __int64 ZoneTableWidth, void* pMatchTable , CDefectPair *pDefectdPair, __int64 StartPair, __int64 MaxPair, __int64 PairSize , __int64 dxPattern, __int64 dyPattern, __int64 yZoneByte, __int64 bReverseFilter , short* ZoneAddTable, short* pConBuff, __int64 bUseUnpair, int* endLine , __int64 ExTh, __int64 Suppress ) { const __int64 SprShift = 4; const __int64 SprMulti = 16; const __int64 szxMatch = 8; __m128i xxTemp; __m128i xxDSlide; __m128i xxZTh; __m128i xxZId; __m128i xxSrc1; __m128i xxSrc2; __m128i xxCmp1; __m128i xxCmp2; __m128i xxPeakS; __m128i xxPeakAbs; __m128i xxfSpr; __m128i xxsSpr; __int64 rax, rbx, rcx, rdx; __int64 ImgAddrOri = (__int64)pImgBuff; __int64 ConAddr = (__int64)pConBuff; __int64 c8Pixel, rrNoD = 0, rrImgAddr, nPair = StartPair; __m128i xxSupp = _mm_set1_epi16((short)Suppress); rcx = iPitch16; rcx &= 0x0f; xxsSpr = _mm_set1_epi16((short)rcx); rax = SprMulti; rax -= rcx; xxfSpr = _mm_set1_epi16((short)rax); Threshold = 256; for(int i = 0; i < 16; i++) { if(m_Param.m_pSpeedZoneTh[i] != 0 && m_Param.m_pSpeedZoneTh[i] < Threshold) Threshold = m_Param.m_pSpeedZoneTh[i]; } xxZTh = _mm_set1_epi16((short)Threshold); short sSrc, sDest, sDiff, sZone, sZoneTh; __int64 xMatch2 = 0; __int64 iPitch = iPitch16 / SprMulti; __int64 iPitchHUp = iPitch; if(rcx >= SprMulti / 2) iPitchHUp++; bottom--; __int64 ConBottom = bottom - iPitch - 1; __int64 pairBottom = ConBottom - iPitch; __int64 pairTop = top + iPitch; __int64 ConvPitch = iPitch * 0x20; __int64 ZoneTableW2 = ZoneTableWidth + ZoneTableWidth; __int64 ix = left; __int64 iy = top; right = (right - left) / 16 * 16 + left; __int64 pMatch1 = (__int64)pMatchTable; pMatchTable = (void*)(pMatch1 + yZoneByte); rcx = (__int64)pMatchTable; rbx = (__int64)(*((int*)(rcx + 4))); int yMatch = (int)rbx; rdx = dyPattern + rbx; __int64 eyPtrn = rdx; __int64 eyPtrn1 = rdx; rax = (iy - rbx) * ZoneTableWidth; rbx = (__int64)(*((int*)rcx)); int xMatch = (int)rbx; __int64 exPtrn = dxPattern + rbx; rax += ix - rbx; rax += rax; rdx = (__int64)ZoneThTable + rax; __int64 ZoneThAddr = rdx; __int64 ZoneThAddr1 = rdx; rdx = (__int64)ZoneIdTable + rax; __int64 ZoneIdAddr = rdx; __int64 ZoneIdAddr1 = rdx; rdx = (__int64)ZoneAddTable + rax; __int64 ZoneAddAddr = rdx; __int64 ZoneAddAddr1 = rdx; __m128i xxZero = _mm_setzero_si128(); CDefectPair* PairAddr = pDefectdPair + nPair; //LOOP_1: goto LOOP_1_CHECK; LOOP_1_TAIL: goto PAIRING_VERT; _return_PAIRING_VERT: ix += 0x10; eyPtrn = eyPtrn1; pMatchTable = (void*)pMatch1; ZoneThAddr1 += 0x20; ZoneThAddr = ZoneThAddr1; ZoneIdAddr1 += 0x20; ZoneIdAddr = ZoneIdAddr1; ZoneAddAddr1 += 0x20; ZoneAddAddr = ZoneAddAddr1; LOOP_1_CHECK: if(ix >= right) goto END_FUNC; //LOOP_1_BODY: iy = top; rrImgAddr = ImgAddrOri + frameWidth * iy + ix; goto MAKE_CONBUFF_HEAD; _return_MAKE_CONBUFF: iy = top; rrImgAddr = ConAddr; if(ix >= exPtrn) goto CHECK_1_BOUND; _return_CHECK_1_BOUND: //LOOP_2: goto LOOP_2_CHECK; LOOP_2_TAIL: iy++; rrImgAddr += 0x20; ZoneThAddr += ZoneTableW2; ZoneIdAddr += ZoneTableW2; ZoneAddAddr += ZoneTableW2; LOOP_2_CHECK: if(iy >= ConBottom) goto LOOP_1_TAIL; if(iy >= eyPtrn) goto CHECK_2_BOUND; _return_CHECK_2_BOUND: //LOOP_2_BODY: goto XMM_MAKE; MAKE_CONBUFF_HEAD: rax = ConAddr; MAKE_CONBUFF: xxSrc1 = _mm_loadu_si128((__m128i*) rrImgAddr); _mm_storeu_si128((__m128i*)rax, _mm_unpacklo_epi8(xxSrc1, xxZero)); _mm_storeu_si128((__m128i*)(rax + 0x10), _mm_unpackhi_epi8(xxSrc1, xxZero)); rrImgAddr += frameWidth; rax += 0x20; iy++; if(iy <= bottom) goto MAKE_CONBUFF; goto _return_MAKE_CONBUFF; CHECK_1_BOUND: pMatch1 += szxMatch; rcx = pMatch1 + yZoneByte; pMatchTable = (void*)rcx; yMatch = *((int*)(rcx + 4)); rdx = dyPattern + yMatch; eyPtrn = eyPtrn1 = rdx; rax = (iy - yMatch) * ZoneTableWidth; xMatch = *(int*)(rcx); rdx = dxPattern + xMatch; rcx = xMatch + dxPattern; if(rcx < right) goto EXCESS_1_BOUND_PASS; rdx = rcx; EXCESS_1_BOUND_PASS: exPtrn = rdx; rax += (ix - xMatch); rax += rax; ZoneThAddr1 = ZoneThAddr = (__int64)ZoneThTable + rax; ZoneIdAddr1 = ZoneIdAddr = (__int64)ZoneIdTable + rax; ZoneAddAddr1 = ZoneAddAddr = (__int64)ZoneAddTable + rax; xMatch2++; goto _return_CHECK_1_BOUND; CHECK_2_BOUND: pMatchTable = (void*)((__int64)pMatchTable + yZoneByte); rbx = (__int64)(*((int*)((__int64)pMatchTable + 4))); yMatch = (int)rbx; eyPtrn = dyPattern + rbx; rax = eyPtrn + dyPattern; if(rax < bottom) goto EXCESS_2_BOUND_PASS; eyPtrn = rax; EXCESS_2_BOUND_PASS: rax = (iy - rbx) * ZoneTableWidth; xMatch =*((int*)pMatchTable); rax += ix - xMatch; rax += rax; ZoneThAddr = (__int64)ZoneThTable + rax; ZoneIdAddr = (__int64)ZoneIdTable + rax; ZoneAddAddr = (__int64)ZoneAddTable + rax; goto _return_CHECK_2_BOUND; XMM_MAKE: xxSrc1 = _mm_loadu_si128((__m128i*) rrImgAddr); xxSrc2 = _mm_loadu_si128((__m128i*) (rrImgAddr + 0x10)); rax = rrImgAddr + ConvPitch; xxCmp1 = _mm_loadu_si128((__m128i*) rax); xxCmp2 = _mm_loadu_si128((__m128i*) (rax + 0x10)); xxTemp = _mm_loadu_si128((__m128i*) (rax + 0x20)); xxDSlide = _mm_loadu_si128((__m128i*) (rax + 0x30)); xxCmp1 = _mm_srli_epi16(_mm_add_epi16(_mm_mullo_epi16(xxCmp1, xxfSpr), _mm_mullo_epi16(xxTemp, xxsSpr)), SprShift); xxCmp2 = _mm_srli_epi16(_mm_add_epi16(_mm_mullo_epi16(xxCmp2, xxfSpr), _mm_mullo_epi16(xxDSlide, xxsSpr)), SprShift); goto XMM_COMPARE; XMM_COMPARE_END: ix -= 0x10; ZoneThAddr -= 0x10; ZoneIdAddr -= 0x10; ZoneAddAddr -= 0x10; goto LOOP_2_TAIL; XMM_COMPARE: c8Pixel = 0; xxSrc1 = _mm_min_epu16(xxSrc1, xxSupp); xxCmp1 = _mm_min_epu16(xxCmp1, xxSupp); goto _XMM_COMPARE_8PIXEL; _return_XMM_COMPARE_8PIXEL: if(rrNoD >= maxDefect) goto PAIRING_VERT; c8Pixel++; if(c8Pixel == 2) goto XMM_COMPARE_END; xxSrc1 = _mm_min_epu16(xxSrc2, xxSupp); xxCmp1 = _mm_min_epu16(xxCmp2, xxSupp); ZoneThAddr += 0x10; ZoneIdAddr += 0x10; ZoneAddAddr += 0x10; _XMM_COMPARE_8PIXEL: //xxTemp = _mm_loadu_si128((__m128i*) ZoneThAddr); //xxDSlide = _mm_loadu_si128((__m128i*) ZoneAddAddr); //xxZTh = _mm_add_epi16(_mm_srli_epi16(_mm_mullo_epi16(_mm_max_epu16(xxSrc1, xxCmp1), xxDSlide), 8), xxTemp); xxPeakS = _mm_sub_epi16(xxSrc1, xxCmp1); xxPeakAbs = _mm_abs_epi16(xxPeakS); xxTemp = _mm_cmpgt_epi16(xxPeakAbs, xxZTh); if(_mm_movemask_epi8(xxTemp) != 0) goto DEFECT_00; ix += 8; goto _return_XMM_COMPARE_8PIXEL; DEFECT_00: xxZId = _mm_loadu_si128((__m128i*) ZoneIdAddr); if(_mm_extract_epi16(xxTemp, 0x00) == 0) goto DEFECT_01; *(DefectX + rrNoD) = (int)ix; *(DefectY + rrNoD) = (int)iy; *(pGraySrc + rrNoD) = _mm_extract_epi16(xxSrc1, 0x00); *(pGrayCmp + rrNoD) = _mm_extract_epi16(xxCmp1, 0x00); *(pZoneID + rrNoD) = _mm_extract_epi16(xxZId, 0x00); *(pZoneTh + rrNoD) = _mm_extract_epi16(xxZTh, 0x00); if((short)_mm_extract_epi16(xxPeakS, 0x00) > 0) *(DefectT + rrNoD) = 1; else *(DefectT + rrNoD) = 0; rrNoD++; DEFECT_01: ix++; if(_mm_extract_epi16(xxTemp, 0x01) == 0) goto DEFECT_02; *(DefectX + rrNoD) = (int)ix; *(DefectY + rrNoD) = (int)iy; *(pGraySrc + rrNoD) = _mm_extract_epi16(xxSrc1, 0x01); *(pGrayCmp + rrNoD) = _mm_extract_epi16(xxCmp1, 0x01); *(pZoneID + rrNoD) = _mm_extract_epi16(xxZId, 0x01); *(pZoneTh + rrNoD) = _mm_extract_epi16(xxZTh, 0x01); if((short)_mm_extract_epi16(xxPeakS, 0x01) > 0) *(DefectT + rrNoD) = 1; else *(DefectT + rrNoD) = 0; rrNoD++; DEFECT_02: ix++; if(_mm_extract_epi16(xxTemp, 0x02) == 0) goto DEFECT_03; *(DefectX + rrNoD) = (int)ix; *(DefectY + rrNoD) = (int)iy; *(pGraySrc + rrNoD) = _mm_extract_epi16(xxSrc1, 0x02); *(pGrayCmp + rrNoD) = _mm_extract_epi16(xxCmp1, 0x02); *(pZoneID + rrNoD) = _mm_extract_epi16(xxZId, 0x02); *(pZoneTh + rrNoD) = _mm_extract_epi16(xxZTh, 0x02); if((short)_mm_extract_epi16(xxPeakS, 0x02) > 0) *(DefectT + rrNoD) = 1; else *(DefectT + rrNoD) = 0; rrNoD++; DEFECT_03: ix++; if(_mm_extract_epi16(xxTemp, 0x03) == 0) goto DEFECT_04; *(DefectX + rrNoD) = (int)ix; *(DefectY + rrNoD) = (int)iy; *(pGraySrc + rrNoD) = _mm_extract_epi16(xxSrc1, 0x03); *(pGrayCmp + rrNoD) = _mm_extract_epi16(xxCmp1, 0x03); *(pZoneID + rrNoD) = _mm_extract_epi16(xxZId, 0x03); *(pZoneTh + rrNoD) = _mm_extract_epi16(xxZTh, 0x03); if((short)_mm_extract_epi16(xxPeakS, 0x03) > 0) *(DefectT + rrNoD) = 1; else *(DefectT + rrNoD) = 0; rrNoD++; DEFECT_04: ix++; if(_mm_extract_epi16(xxTemp, 0x04) == 0) goto DEFECT_05; *(DefectX + rrNoD) = (int)ix; *(DefectY + rrNoD) = (int)iy; *(pGraySrc + rrNoD) = _mm_extract_epi16(xxSrc1, 0x04); *(pGrayCmp + rrNoD) = _mm_extract_epi16(xxCmp1, 0x04); *(pZoneID + rrNoD) = _mm_extract_epi16(xxZId, 0x04); *(pZoneTh + rrNoD) = _mm_extract_epi16(xxZTh, 0x04); if((short)_mm_extract_epi16(xxPeakS, 0x04) > 0) *(DefectT + rrNoD) = 1; else *(DefectT + rrNoD) = 0; rrNoD++; DEFECT_05: ix++; if(_mm_extract_epi16(xxTemp, 0x05) == 0) goto DEFECT_06; *(DefectX + rrNoD) = (int)ix; *(DefectY + rrNoD) = (int)iy; *(pGraySrc + rrNoD) = _mm_extract_epi16(xxSrc1, 0x05); *(pGrayCmp + rrNoD) = _mm_extract_epi16(xxCmp1, 0x05); *(pZoneID + rrNoD) = _mm_extract_epi16(xxZId, 0x05); *(pZoneTh + rrNoD) = _mm_extract_epi16(xxZTh, 0x05); if((short)_mm_extract_epi16(xxPeakS, 0x05) > 0) *(DefectT + rrNoD) = 1; else *(DefectT + rrNoD) = 0; rrNoD++; DEFECT_06: ix++; if(_mm_extract_epi16(xxTemp, 0x06) == 0) goto DEFECT_07; *(DefectX + rrNoD) = (int)ix; *(DefectY + rrNoD) = (int)iy; *(pGraySrc + rrNoD) = _mm_extract_epi16(xxSrc1, 0x06); *(pGrayCmp + rrNoD) = _mm_extract_epi16(xxCmp1, 0x06); *(pZoneID + rrNoD) = _mm_extract_epi16(xxZId, 0x06); *(pZoneTh + rrNoD) = _mm_extract_epi16(xxZTh, 0x06); if((short)_mm_extract_epi16(xxPeakS, 0x06) > 0) *(DefectT + rrNoD) = 1; else *(DefectT + rrNoD) = 0; rrNoD++; DEFECT_07: ix++; if(_mm_extract_epi16(xxTemp, 0x07) == 0) goto DEFECT_08; *(DefectX + rrNoD) = (int)ix; *(DefectY + rrNoD) = (int)iy; *(pGraySrc + rrNoD) = _mm_extract_epi16(xxSrc1, 0x07); *(pGrayCmp + rrNoD) = _mm_extract_epi16(xxCmp1, 0x07); *(pZoneID + rrNoD) = _mm_extract_epi16(xxZId, 0x07); *(pZoneTh + rrNoD) = _mm_extract_epi16(xxZTh, 0x07); if((short)_mm_extract_epi16(xxPeakS, 0x07) > 0) *(DefectT + rrNoD) = 1; else *(DefectT + rrNoD) = 0; rrNoD++; DEFECT_08: ix++; goto _return_XMM_COMPARE_8PIXEL; PAIRING_VERT: iy = -1; LOOP_PAIR_NUM: iy++; if(iy >= rrNoD) goto LOOP_PAIR_NUM_END; rax = nPair; if(rax >= MaxPair) goto END_FUNC; if(*(DefectT + iy) >= 3) goto LOOP_PAIR_NUM; rbx = iy; rcx = *(DefectY + iy); rax = rcx + iPitchHUp; rrImgAddr = *(DefectX + iy); if(rcx > pairBottom) goto PAIR_BOTTOM; if(rcx >= pairTop) goto PAIR_CENTER; PAIR_TOP: rbx++; if(rbx >= rrNoD) goto PAIR_TOP_UNPAIR; rdx = *(DefectY + rbx); if(rdx < rax) goto PAIR_TOP; else if(rdx > rax) goto PAIR_TOP_UNPAIR; rcx = *(DefectX + rbx); if(rrImgAddr != rcx) goto PAIR_TOP; rrImgAddr = *(DefectT + rbx); if(rrImgAddr >= 3) goto LOOP_PAIR_NUM; rax = (__int64)*(DefectT + iy); if(rax == rrImgAddr) goto LOOP_PAIR_NUM; sSrc = (*(pGraySrc + rbx)); sDest = (*(pGrayCmp + rbx)); sZone = (*(pZoneID + rbx)); sDiff = abs(sSrc - sDest); sZoneTh = max(sSrc, sDest) * m_Param.m_pSpeedZoneThSlide[sZone] / 256 + m_Param.m_pSpeedZoneTh[sZone]; if(sDiff < sZoneTh) goto LOOP_PAIR_NUM; *(DefectT + rbx) = 4; PairAddr->s_DefectPos = (DefectPos)1; PairAddr->s_DefectPair = (DefectPair)1; PairAddr->s_nDefectX = (int)rcx; PairAddr->s_nDefectY = (int)rdx; PairAddr->s_DefectType = (DefectType)rrImgAddr; //PairAddr->s_fDefectPeak = (int)*(DefectValue + rbx); PairAddr->s_nGraySrc = (int)sSrc; PairAddr->s_nGrayRef = (int)sDest; PairAddr->s_nZone = (int)sZone; PairAddr->s_nThresold = (int)sZoneTh; PairAddr++; nPair++; goto LOOP_PAIR_NUM; PAIR_TOP_UNPAIR: if(bUseUnpair != 1) goto LOOP_PAIR_NUM; //rcx = (__int64)*(DefectValue + iy); //if(rcx <= ExTh) // goto LOOP_PAIR_NUM; sSrc = (*(pGraySrc + iy)); sDest = (*(pGrayCmp + iy)); sZone = (*(pZoneID + iy)); sDiff = abs(sSrc - sDest); sZoneTh = max(sSrc, sDest) * m_Param.m_pSpeedZoneThSlide[sZone] / 256 + m_Param.m_pSpeedZoneTh[sZone]; if(sDiff < sZoneTh) goto LOOP_PAIR_NUM; PairAddr->s_DefectPos = (DefectPos)1; PairAddr->s_DefectPair = (DefectPair)5; PairAddr->s_nDefectX = (int)rrImgAddr; rax -= iPitchHUp; PairAddr->s_nDefectY = (int)rax; PairAddr->s_DefectType = (DefectType)*(DefectT + iy); //PairAddr->s_fDefectPeak = (int)*(DefectValue + iy); PairAddr->s_nGraySrc = (int)sSrc; PairAddr->s_nGrayRef = (int)sDest; PairAddr->s_nZone = (int)sZone; PairAddr->s_nThresold = (int)sZoneTh; PairAddr++; nPair++; goto LOOP_PAIR_NUM; PAIR_CENTER: rbx++; if(rbx >= rrNoD) goto LOOP_PAIR_NUM; rdx = *(DefectY + rbx); if(rdx < rax) goto PAIR_CENTER; else if(rdx > rax) goto LOOP_PAIR_NUM; rcx = *(DefectX + rbx); if(rrImgAddr != rcx) goto PAIR_CENTER; rrImgAddr = *(DefectT + rbx); if(rrImgAddr >= 3) goto LOOP_PAIR_NUM; rax = (__int64)*(DefectT + iy); if(rax == rrImgAddr) goto LOOP_PAIR_NUM; sSrc = (*(pGraySrc + rbx)); sDest = (*(pGrayCmp + rbx)); sZone = (*(pZoneID + rbx)); sDiff = abs(sSrc - sDest); sZoneTh = max(sSrc, sDest) * m_Param.m_pSpeedZoneThSlide[sZone] / 256 + m_Param.m_pSpeedZoneTh[sZone]; if(sDiff < sZoneTh) goto LOOP_PAIR_NUM; *(DefectT + rbx) = 4; PairAddr->s_DefectPos = (DefectPos)2; PairAddr->s_DefectPair = (DefectPair)1; PairAddr->s_nDefectX = (int)rcx; PairAddr->s_nDefectY = (int)rdx; PairAddr->s_DefectType = (DefectType)rrImgAddr; //PairAddr->s_fDefectPeak = (int)*(DefectValue + rbx); PairAddr->s_nGraySrc = (int)sSrc; PairAddr->s_nGrayRef = (int)sDest; PairAddr->s_nZone = (int)sZone; PairAddr->s_nThresold = (int)sZoneTh; PairAddr++; nPair++; goto LOOP_PAIR_NUM; PAIR_BOTTOM: if(bUseUnpair != 1) goto LOOP_PAIR_NUM; //rcx = (__int64)*(DefectValue + iy); //if(rcx <= ExTh) // goto LOOP_PAIR_NUM; sSrc = (*(pGrayCmp + iy)); sDest = (*(pGraySrc + iy)); sZone = (*(pZoneID + iy)); sDiff = abs(sSrc - sDest); sZoneTh = max(sSrc, sDest) * m_Param.m_pSpeedZoneThSlide[sZone] / 256 + m_Param.m_pSpeedZoneTh[sZone]; if(sDiff < sZoneTh) goto LOOP_PAIR_NUM; PairAddr->s_DefectPos = (DefectPos)3; PairAddr->s_DefectPair = (DefectPair)5; PairAddr->s_nDefectX = (int)rrImgAddr; PairAddr->s_nDefectY = (int)rax; rdx = (*(DefectT + iy) + 1) & 1; PairAddr->s_DefectType = (DefectType)rdx; //PairAddr->s_fDefectPeak = (int)*(DefectValue + iy); PairAddr->s_nGraySrc = (int)sSrc; PairAddr->s_nGrayRef = (int)sDest; PairAddr->s_nZone = (int)sZone; PairAddr->s_nThresold = (int)sZoneTh; PairAddr++; nPair++; goto LOOP_PAIR_NUM; LOOP_PAIR_NUM_END: rrNoD = 0; goto _return_PAIRING_VERT; END_FUNC: ix += 0x10; *endLine = (int)ix; return (int)nPair; } int CSISAssem::ConvZoneVTD_BOE_Intrin(BYTE *pImgBuff, __int64 Threshold, __int64 maxDefect, __int64 nDefect , __int64 left, __int64 right, __int64 top, __int64 bottom , int* DefectX, int* DefectY, short* DefectT, short* DefectValue , int* pGraySrc, int* pGrayCmp, int* pZoneID, int* pZoneTh , __int64 frameWidth, int* piPitch16, __int64 iPitch16, __int64 sSPR , short* ZoneThTable, short* ZoneIdTable, __int64 ZoneTableWidth, void* pMatchTable , CDefectPair *pDefectdPair, __int64 StartPair, __int64 MaxPair, __int64 PairSize , __int64 dxPattern, __int64 dyPattern, __int64 yZoneByte, __int64 bReverseFilter , short* ZoneAddTable, __int64 Tilt16, __int64 bUseUnpair, int* endLine , __int64 ExTh, __int64 Suppress ) { const __int64 SprShift = 4; const __int64 SprMulti = 16; const __int64 szxMatch = 8; __m128i xxTemp; __m128i xxDSlide; __m128i xxZTh; __m128i xxZId; __m128i xxSrc1; __m128i xxSrc2; __m128i xxCmp1; __m128i xxCmp2; __m128i xxPeakS; __m128i xxPeakAbs; __m128i xxfSpr; __m128i xxsSpr; __m128i xxfSprT; __m128i xxsSprT; __int64 rax, rbx, rcx, rdx; __int64 ImgAddrOri = (__int64)pImgBuff; __int64 c8Pixel, rrNoD = 0, rrImgAddr, nPair = StartPair, _piPitch16, cDpc; __m128i xxSupp = _mm_set1_epi16((short)Suppress); rax = Tilt16; rax &= 0x0f; xxsSprT = _mm_set1_epi16((short)rax); rcx = SprMulti; rcx -= rax; xxfSprT = _mm_set1_epi16((short)rcx); Tilt16 /= SprMulti; rcx = iPitch16; rcx &= 0x0f; xxsSpr = _mm_set1_epi16((short)rcx); rax = SprMulti; rax -= rcx; xxfSpr = _mm_set1_epi16((short)rax); __int64 xMatch2 = 0; __int64 iPitch = iPitch16 / SprMulti; __int64 iPitchHUp = iPitch; if(rcx >= SprMulti / 2) iPitchHUp++; iPitch16 = -1; bottom--; bottom = bottom - iPitch - 1; __int64 pairBottom = bottom - iPitch; // -------------- à» Filtering -------------- // CRect rtDeadZone[MAX_DEAD_ZONE_COUNT]; CPoint ptDefect; memcpy(rtDeadZone, m_Param.s_RectDeadZone, sizeof(CRect) * MAX_DEAD_ZONE_COUNT); int nDeadZoneCount = 0; for(int i = 0; i < MAX_DEAD_ZONE_COUNT; i++) { if(rtDeadZone[i].IsRectEmpty() == TRUE) { nDeadZoneCount = i; break; } } // ------------------------------------------ // __int64 pairTop = top + iPitch; __int64 ConvPitch = iPitch * frameWidth; __int64 ZoneTableW2 = ZoneTableWidth + ZoneTableWidth; __int64 ix = left; __int64 iy = top; right = (right - left) / 16 * 16 + left; __int64 pMatch1 = (__int64)pMatchTable; pMatchTable = (void*)(pMatch1 + yZoneByte); rcx = (__int64)pMatchTable; rbx = (__int64)(*((int*)(rcx + 4))); int yMatch = (int)rbx; rdx = dyPattern + rbx; __int64 eyPtrn = rdx; __int64 eyPtrn1 = rdx; rax = (iy - rbx) * ZoneTableWidth; rbx = (__int64)(*((int*)rcx)); int xMatch = (int)rbx; __int64 exPtrn = dxPattern + rbx; rax += ix - rbx; rax += rax; rdx = (__int64)ZoneThTable + rax; __int64 ZoneThAddr = rdx; __int64 ZoneThAddr1 = rdx; rdx = (__int64)ZoneIdTable + rax; __int64 ZoneIdAddr = rdx; __int64 ZoneIdAddr1 = rdx; rdx = (__int64)ZoneAddTable + rax; __int64 ZoneAddAddr = rdx; __int64 ZoneAddAddr1 = rdx; __m128i xxZero = _mm_setzero_si128(); CDefectPair* PairAddr = pDefectdPair + nPair; //LOOP_1: goto LOOP_1_CHECK; LOOP_1_TAIL: goto PAIRING_VERT; _return_PAIRING_VERT: ix += 0x10; eyPtrn = eyPtrn1; pMatchTable = (void*)pMatch1; ZoneThAddr1 += 0x20; ZoneThAddr = ZoneThAddr1; ZoneIdAddr1 += 0x20; ZoneIdAddr = ZoneIdAddr1; ZoneAddAddr1 += 0x20; ZoneAddAddr = ZoneAddAddr1; LOOP_1_CHECK: if(ix >= right) goto END_FUNC; //LOOP_1_BODY: iy = top; rrImgAddr = ImgAddrOri + frameWidth * iy + ix; _piPitch16 = 0; if(piPitch16 == NULL) goto DPC_PASS; rax = iy; rax /= 16; rax *= 4; rax += __int64(piPitch16); _piPitch16 = rax; DPC_PASS: if(ix >= exPtrn) goto CHECK_1_BOUND; _return_CHECK_1_BOUND: //LOOP_2: cDpc = 0x10; goto LOOP_2_CHECK; LOOP_2_TAIL: iy++; rrImgAddr += frameWidth; ZoneThAddr += ZoneTableW2; ZoneIdAddr += ZoneTableW2; ZoneAddAddr += ZoneTableW2; LOOP_2_CHECK: if(iy >= bottom) goto LOOP_1_TAIL; if(iy >= eyPtrn) goto CHECK_2_BOUND; _return_CHECK_2_BOUND: //LOOP_2_BODY: if(_piPitch16 == 0) goto XMM_MAKE; goto DPC_MAKE; _return_DPC_MAKE: cDpc++; goto XMM_MAKE; _return_XMM_MAKE: goto XMM_COMPARE; //_return_XMM_COMPARE: goto LOOP_2_TAIL; CHECK_1_BOUND: pMatch1 += szxMatch; rcx = pMatch1 + yZoneByte; pMatchTable = (void*)rcx; yMatch = *((int*)(rcx + 4)); rdx = dyPattern + yMatch; eyPtrn = eyPtrn1 = rdx; rax = (iy - yMatch) * ZoneTableWidth; xMatch = *(int*)(rcx); rdx = dxPattern + xMatch; rcx = xMatch + dxPattern; if(rcx < right) goto EXCESS_1_BOUND_PASS; rdx = rcx; EXCESS_1_BOUND_PASS: exPtrn = rdx; rax += (ix - xMatch); rax += rax; ZoneThAddr1 = ZoneThAddr = (__int64)ZoneThTable + rax; ZoneIdAddr1 = ZoneIdAddr = (__int64)ZoneIdTable + rax; ZoneAddAddr1 = ZoneAddAddr = (__int64)ZoneAddTable + rax; xMatch2++; goto _return_CHECK_1_BOUND; CHECK_2_BOUND: pMatchTable = (void*)((__int64)pMatchTable + yZoneByte); rbx = (__int64)(*((int*)((__int64)pMatchTable + 4))); yMatch = (int)rbx; eyPtrn = dyPattern + rbx; rax = eyPtrn + dyPattern; if(rax < bottom) goto EXCESS_2_BOUND_PASS; eyPtrn = rax; EXCESS_2_BOUND_PASS: rax = (iy - rbx) * ZoneTableWidth; xMatch =*((int*)pMatchTable); rax += ix - xMatch; rax += rax; ZoneThAddr = (__int64)ZoneThTable + rax; ZoneIdAddr = (__int64)ZoneIdTable + rax; ZoneAddAddr = (__int64)ZoneAddTable + rax; goto _return_CHECK_2_BOUND; DPC_MAKE: // verticla Àº 16¹ø¿¡ Çѹø¾¿¸¸ ·ÎµùÇÑ´Ù. cDpc Ä«¿îÆ®, µ¿ÀÏ Pitch ÆÇ´ÜÈÄ Pass ±â´É if(cDpc != 0x10) //cmp cDpc, 010h goto _return_DPC_MAKE; //jne _return_DPC_MAKE cDpc = 0; //mov cDpc, 0 rax = _piPitch16; //mov rax, piPitch16 rax = *(int*)(rax); //movsxd rax, dword ptr[rax] _piPitch16 +=4; //add piPitch16, 4 if(iPitch16 == rax) //cmp iPitch16, rax goto _return_DPC_MAKE; //je _return_DPC_MAKE iPitch16 = rax; //mov iPitch16, rax rcx = rax; //mov rcx, rax rcx &= 0x0f; //and rcx, 0fh rax /= 16; //shr rax, SprShift iPitch = rax; //mov iPitch, rax rax *= frameWidth; //mul BuffWidth ConvPitch = rax; //mov ConPitch, rax rdx = 0x10; //mov rdx, 010h rdx -= rcx; //sub rdx, rcx xxsSpr = _mm_set1_epi16((short)rcx); xxfSpr = _mm_set1_epi16((short)rdx); goto _return_DPC_MAKE; XMM_MAKE: rax = rrImgAddr; rax += ConvPitch; xxCmp1 = _mm_loadu_si128((__m128i*) rax); xxCmp2 = xxCmp1; xxCmp1 = _mm_unpacklo_epi8(xxCmp1, xxZero); xxCmp2 = _mm_unpackhi_epi8(xxCmp2, xxZero); xxCmp1 = _mm_mullo_epi16(xxCmp1, xxfSprT); xxCmp2 = _mm_mullo_epi16(xxCmp2, xxfSprT); xxSrc2 = _mm_loadu_si128((__m128i*) (rax + 1)); xxSrc1 = xxSrc2; xxSrc1 = _mm_unpacklo_epi8(xxSrc1, xxZero); xxSrc2 = _mm_unpackhi_epi8(xxSrc2, xxZero); xxSrc1 = _mm_mullo_epi16(xxSrc1, xxsSprT); xxSrc2 = _mm_mullo_epi16(xxSrc2, xxsSprT); xxCmp1 = _mm_add_epi16(xxCmp1, xxSrc1); xxCmp2 = _mm_add_epi16(xxCmp2, xxSrc2); xxCmp1 = _mm_srli_epi16(xxCmp1, SprShift); xxCmp2 = _mm_srli_epi16(xxCmp2, SprShift); xxCmp1 = _mm_mullo_epi16(xxCmp1, xxfSpr); xxCmp2 = _mm_mullo_epi16(xxCmp2, xxfSpr); rax += frameWidth; xxSrc2 = _mm_loadu_si128((__m128i*) (rax)); xxSrc1 = xxSrc2; xxSrc1 = _mm_unpacklo_epi8(xxSrc1, xxZero); xxSrc2 = _mm_unpackhi_epi8(xxSrc2, xxZero); xxSrc1 = _mm_mullo_epi16(xxSrc1, xxfSprT); xxSrc2 = _mm_mullo_epi16(xxSrc2, xxfSprT); xxTemp = _mm_loadu_si128((__m128i*) (rax + 1)); xxZId = xxTemp; xxTemp = _mm_unpacklo_epi8(xxTemp, xxZero); xxZId = _mm_unpackhi_epi8(xxZId, xxZero); xxTemp = _mm_mullo_epi16(xxTemp, xxsSprT); xxZId = _mm_mullo_epi16(xxZId, xxsSprT); xxSrc1 = _mm_add_epi16(xxSrc1, xxTemp); xxSrc2 = _mm_add_epi16(xxSrc2, xxZId); xxSrc1 = _mm_srli_epi16(xxSrc1, SprShift); xxSrc2 = _mm_srli_epi16(xxSrc2, SprShift); xxSrc1 = _mm_mullo_epi16(xxSrc1, xxsSpr); xxSrc2 = _mm_mullo_epi16(xxSrc2, xxsSpr); xxCmp1 = _mm_add_epi16(xxCmp1, xxSrc1); xxCmp2 = _mm_add_epi16(xxCmp2, xxSrc2); xxCmp1 = _mm_srli_epi16(xxCmp1, SprShift); xxCmp2 = _mm_srli_epi16(xxCmp2, SprShift); xxSrc1 = _mm_loadu_si128((__m128i*) rrImgAddr); xxSrc2 = xxSrc1; xxSrc1 = _mm_unpacklo_epi8(xxSrc1, xxZero); xxSrc2 = _mm_unpackhi_epi8(xxSrc2, xxZero); goto _return_XMM_MAKE; XMM_COMPARE_END: ix -= 0x10; ZoneThAddr -= 0x10; ZoneIdAddr -= 0x10; ZoneAddAddr -= 0x10; goto LOOP_2_TAIL; XMM_COMPARE: c8Pixel = 0; xxSrc1 = _mm_min_epu16(xxSrc1, xxSupp); xxCmp1 = _mm_min_epu16(xxCmp1, xxSupp); goto _XMM_COMPARE_8PIXEL; _return_XMM_COMPARE_8PIXEL: if(rrNoD >= maxDefect) goto PAIRING_VERT; c8Pixel++; if(c8Pixel == 2) goto XMM_COMPARE_END; xxSrc1 = _mm_min_epu16(xxSrc2, xxSupp); xxCmp1 = _mm_min_epu16(xxCmp2, xxSupp); ZoneThAddr += 0x10; ZoneIdAddr += 0x10; ZoneAddAddr += 0x10; _XMM_COMPARE_8PIXEL: xxTemp = _mm_loadu_si128((__m128i*) ZoneThAddr); xxDSlide = _mm_loadu_si128((__m128i*) ZoneAddAddr); xxZTh = _mm_add_epi16(_mm_srli_epi16(_mm_mullo_epi16(_mm_max_epu16(xxSrc1, xxCmp1), xxDSlide), 8), xxTemp); xxPeakS = _mm_sub_epi16(xxSrc1, xxCmp1); xxPeakAbs = _mm_abs_epi16(xxPeakS); xxTemp = _mm_cmpgt_epi16(xxPeakAbs, xxZTh); if(_mm_movemask_epi8(xxTemp) != 0) goto DEFECT_00; ix += 8; goto _return_XMM_COMPARE_8PIXEL; DEFECT_00: xxZId = _mm_loadu_si128((__m128i*) ZoneIdAddr); if(_mm_extract_epi16(xxTemp, 0x00) == 0) goto DEFECT_01; *(DefectX + rrNoD) = (int)ix; *(DefectY + rrNoD) = (int)iy; *(pGraySrc + rrNoD) = _mm_extract_epi16(xxSrc1, 0x00); *(pGrayCmp + rrNoD) = _mm_extract_epi16(xxCmp1, 0x00); *(pZoneID + rrNoD) = _mm_extract_epi16(xxZId, 0x00); *(pZoneTh + rrNoD) = _mm_extract_epi16(xxZTh, 0x00); if((short)_mm_extract_epi16(xxPeakS, 0x00) > 0) *(DefectT + rrNoD) = 1; else *(DefectT + rrNoD) = 0; rrNoD++; DEFECT_01: ix++; if(_mm_extract_epi16(xxTemp, 0x01) == 0) goto DEFECT_02; *(DefectX + rrNoD) = (int)ix; *(DefectY + rrNoD) = (int)iy; *(pGraySrc + rrNoD) = _mm_extract_epi16(xxSrc1, 0x01); *(pGrayCmp + rrNoD) = _mm_extract_epi16(xxCmp1, 0x01); *(pZoneID + rrNoD) = _mm_extract_epi16(xxZId, 0x01); *(pZoneTh + rrNoD) = _mm_extract_epi16(xxZTh, 0x01); if((short)_mm_extract_epi16(xxPeakS, 0x01) > 0) *(DefectT + rrNoD) = 1; else *(DefectT + rrNoD) = 0; rrNoD++; DEFECT_02: ix++; if(_mm_extract_epi16(xxTemp, 0x02) == 0) goto DEFECT_03; *(DefectX + rrNoD) = (int)ix; *(DefectY + rrNoD) = (int)iy; *(pGraySrc + rrNoD) = _mm_extract_epi16(xxSrc1, 0x02); *(pGrayCmp + rrNoD) = _mm_extract_epi16(xxCmp1, 0x02); *(pZoneID + rrNoD) = _mm_extract_epi16(xxZId, 0x02); *(pZoneTh + rrNoD) = _mm_extract_epi16(xxZTh, 0x02); if((short)_mm_extract_epi16(xxPeakS, 0x02) > 0) *(DefectT + rrNoD) = 1; else *(DefectT + rrNoD) = 0; rrNoD++; DEFECT_03: ix++; if(_mm_extract_epi16(xxTemp, 0x03) == 0) goto DEFECT_04; *(DefectX + rrNoD) = (int)ix; *(DefectY + rrNoD) = (int)iy; *(pGraySrc + rrNoD) = _mm_extract_epi16(xxSrc1, 0x03); *(pGrayCmp + rrNoD) = _mm_extract_epi16(xxCmp1, 0x03); *(pZoneID + rrNoD) = _mm_extract_epi16(xxZId, 0x03); *(pZoneTh + rrNoD) = _mm_extract_epi16(xxZTh, 0x03); if((short)_mm_extract_epi16(xxPeakS, 0x03) > 0) *(DefectT + rrNoD) = 1; else *(DefectT + rrNoD) = 0; rrNoD++; DEFECT_04: ix++; if(_mm_extract_epi16(xxTemp, 0x04) == 0) goto DEFECT_05; *(DefectX + rrNoD) = (int)ix; *(DefectY + rrNoD) = (int)iy; *(pGraySrc + rrNoD) = _mm_extract_epi16(xxSrc1, 0x04); *(pGrayCmp + rrNoD) = _mm_extract_epi16(xxCmp1, 0x04); *(pZoneID + rrNoD) = _mm_extract_epi16(xxZId, 0x04); *(pZoneTh + rrNoD) = _mm_extract_epi16(xxZTh, 0x04); if((short)_mm_extract_epi16(xxPeakS, 0x04) > 0) *(DefectT + rrNoD) = 1; else *(DefectT + rrNoD) = 0; rrNoD++; DEFECT_05: ix++; if(_mm_extract_epi16(xxTemp, 0x05) == 0) goto DEFECT_06; *(DefectX + rrNoD) = (int)ix; *(DefectY + rrNoD) = (int)iy; *(pGraySrc + rrNoD) = _mm_extract_epi16(xxSrc1, 0x05); *(pGrayCmp + rrNoD) = _mm_extract_epi16(xxCmp1, 0x05); *(pZoneID + rrNoD) = _mm_extract_epi16(xxZId, 0x05); *(pZoneTh + rrNoD) = _mm_extract_epi16(xxZTh, 0x05); if((short)_mm_extract_epi16(xxPeakS, 0x05) > 0) *(DefectT + rrNoD) = 1; else *(DefectT + rrNoD) = 0; rrNoD++; DEFECT_06: ix++; if(_mm_extract_epi16(xxTemp, 0x06) == 0) goto DEFECT_07; *(DefectX + rrNoD) = (int)ix; *(DefectY + rrNoD) = (int)iy; *(pGraySrc + rrNoD) = _mm_extract_epi16(xxSrc1, 0x06); *(pGrayCmp + rrNoD) = _mm_extract_epi16(xxCmp1, 0x06); *(pZoneID + rrNoD) = _mm_extract_epi16(xxZId, 0x06); *(pZoneTh + rrNoD) = _mm_extract_epi16(xxZTh, 0x06); if((short)_mm_extract_epi16(xxPeakS, 0x06) > 0) *(DefectT + rrNoD) = 1; else *(DefectT + rrNoD) = 0; rrNoD++; DEFECT_07: ix++; if(_mm_extract_epi16(xxTemp, 0x07) == 0) goto DEFECT_08; *(DefectX + rrNoD) = (int)ix; *(DefectY + rrNoD) = (int)iy; *(pGraySrc + rrNoD) = _mm_extract_epi16(xxSrc1, 0x07); *(pGrayCmp + rrNoD) = _mm_extract_epi16(xxCmp1, 0x07); *(pZoneID + rrNoD) = _mm_extract_epi16(xxZId, 0x07); *(pZoneTh + rrNoD) = _mm_extract_epi16(xxZTh, 0x07); if((short)_mm_extract_epi16(xxPeakS, 0x07) > 0) *(DefectT + rrNoD) = 1; else *(DefectT + rrNoD) = 0; rrNoD++; DEFECT_08: ix++; goto _return_XMM_COMPARE_8PIXEL; PAIRING_VERT: iy = -1; LOOP_PAIR_NUM: iy++; if(iy >= rrNoD) goto LOOP_PAIR_NUM_END; rax = nPair; if(rax >= MaxPair) goto END_FUNC; if(*(DefectT + iy) >= 3) goto LOOP_PAIR_NUM; rbx = iy; rcx = *(DefectY + iy); rax = rcx + iPitchHUp; rrImgAddr = *(DefectX + iy); if(rcx > pairBottom) goto PAIR_BOTTOM; if(rcx >= pairTop) goto PAIR_CENTER; PAIR_TOP: rbx++; if(rbx >= rrNoD) goto PAIR_TOP_UNPAIR; rdx = *(DefectY + rbx); if(rdx < rax) goto PAIR_TOP; else if(rdx > rax) goto PAIR_TOP_UNPAIR; rcx = *(DefectX + rbx); if(rrImgAddr != rcx) goto PAIR_TOP; rrImgAddr = *(DefectT + rbx); if(rrImgAddr >= 3) goto LOOP_PAIR_NUM; rax = (__int64)*(DefectT + iy); if(rax == rrImgAddr) goto LOOP_PAIR_NUM; // -------------- à» Filtering -------------- // ptDefect.x = (LONG)rcx; ptDefect.y = (LONG)rdx; for(int i = 0; i < nDeadZoneCount; i++) { if(rtDeadZone[i].PtInRect(ptDefect) ) goto LOOP_PAIR_NUM; } // ------------------------------------------ // *(DefectT + rbx) = 4; PairAddr->s_DefectPos = (DefectPos)1; PairAddr->s_DefectPair = (DefectPair)1; PairAddr->s_nDefectX = (int)rcx; PairAddr->s_nDefectY = (int)rdx; PairAddr->s_DefectType = (DefectType)rrImgAddr; //PairAddr->s_fDefectPeak = (int)*(DefectValue + rbx); PairAddr->s_nGraySrc = (int)(*(pGraySrc + rbx)); PairAddr->s_nGrayRef = (int)(*(pGrayCmp + rbx)); PairAddr->s_nZone = (int)(*(pZoneID + rbx)); PairAddr->s_nThresold = (int)(*(pZoneTh + rbx)); PairAddr++; nPair++; goto LOOP_PAIR_NUM; PAIR_TOP_UNPAIR: if(bUseUnpair != 1) goto LOOP_PAIR_NUM; //rcx = (__int64)*(DefectValue + iy); //if(rcx <= ExTh) // goto LOOP_PAIR_NUM; // -------------- à» Filtering -------------- // ptDefect.x = (LONG)(rrImgAddr); ptDefect.y = (LONG)(rax - iPitchHUp); for(int i = 0; i < nDeadZoneCount; i++) { if(rtDeadZone[i].PtInRect(ptDefect) ) goto LOOP_PAIR_NUM; } // ------------------------------------------ // PairAddr->s_DefectPos = (DefectPos)1; PairAddr->s_DefectPair = (DefectPair)5; PairAddr->s_nDefectX = (int)ptDefect.x; PairAddr->s_nDefectY = (int)ptDefect.y; PairAddr->s_DefectType = (DefectType)*(DefectT + iy); //PairAddr->s_fDefectPeak = (int)*(DefectValue + iy); PairAddr->s_nGraySrc = (int)(*(pGraySrc + iy)); PairAddr->s_nGrayRef = (int)(*(pGrayCmp + iy)); PairAddr->s_nZone = (int)(*(pZoneID + iy)); PairAddr->s_nThresold = (int)(*(pZoneTh + iy)); PairAddr++; nPair++; goto LOOP_PAIR_NUM; PAIR_CENTER: rbx++; if(rbx >= rrNoD) goto LOOP_PAIR_NUM; rdx = *(DefectY + rbx); if(rdx < rax) goto PAIR_CENTER; else if(rdx > rax) goto LOOP_PAIR_NUM; rcx = *(DefectX + rbx); if(rrImgAddr != rcx) goto PAIR_CENTER; rrImgAddr = *(DefectT + rbx); if(rrImgAddr >= 3) goto LOOP_PAIR_NUM; rax = (__int64)*(DefectT + iy); if(rax == rrImgAddr) goto LOOP_PAIR_NUM; // -------------- à» Filtering -------------- // ptDefect.x = (LONG)rcx; ptDefect.y = (LONG)rdx; for(int i = 0; i < nDeadZoneCount; i++) { if(rtDeadZone[i].PtInRect(ptDefect) ) goto LOOP_PAIR_NUM; } // ------------------------------------------ // *(DefectT + rbx) = 4; PairAddr->s_DefectPos = (DefectPos)2; PairAddr->s_DefectPair = (DefectPair)1; PairAddr->s_nDefectX = (int)rcx; PairAddr->s_nDefectY = (int)rdx; PairAddr->s_DefectType = (DefectType)rrImgAddr; //PairAddr->s_fDefectPeak = (int)*(DefectValue + rbx); PairAddr->s_nGraySrc = (int)(*(pGraySrc + rbx)); PairAddr->s_nGrayRef = (int)(*(pGrayCmp + rbx)); PairAddr->s_nZone = (int)(*(pZoneID + rbx)); PairAddr->s_nThresold = (int)(*(pZoneTh + rbx)); PairAddr++; nPair++; goto LOOP_PAIR_NUM; PAIR_BOTTOM: if(bUseUnpair != 1) goto LOOP_PAIR_NUM; //rcx = (__int64)*(DefectValue + iy); //if(rcx <= ExTh) // goto LOOP_PAIR_NUM; // -------------- à» Filtering -------------- // ptDefect.x = (LONG)rrImgAddr; ptDefect.y = (LONG)rax; for(int i = 0; i < nDeadZoneCount; i++) { if(rtDeadZone[i].PtInRect(ptDefect) ) goto LOOP_PAIR_NUM; } // ------------------------------------------ // PairAddr->s_DefectPos = (DefectPos)3; PairAddr->s_DefectPair = (DefectPair)5; PairAddr->s_nDefectX = (int)rrImgAddr; PairAddr->s_nDefectY = (int)rax; rdx = (*(DefectT + iy) + 1) & 1; PairAddr->s_DefectType = (DefectType)rdx; //PairAddr->s_fDefectPeak = (int)*(DefectValue + iy); PairAddr->s_nGraySrc = (int)(*(pGrayCmp + iy)); PairAddr->s_nGrayRef = (int)(*(pGraySrc + iy)); PairAddr->s_nZone = (int)(*(pZoneID + iy)); PairAddr->s_nThresold = (int)(*(pZoneTh + iy)); PairAddr++; nPair++; goto LOOP_PAIR_NUM; LOOP_PAIR_NUM_END: rrNoD = 0; goto _return_PAIRING_VERT; END_FUNC: ix += 0x10; *endLine = (int)ix; return (int)nPair; } int CSISAssem::ConvZoneVert2S_BlackFilter(BYTE *pImgBuff, __int64 Threshold, __int64 maxDefect, __int64 nDefect , __int64 left, __int64 right, __int64 top, __int64 bottom , int* DefectX, int* DefectY, short* DefectT, short* DefectValue , int* pGraySrc, int* pGrayCmp, int* pZoneID, int* pZoneTh , __int64 frameWidth, __int64 iPitch16, __int64 fSPR, __int64 sSPR , short* ZoneThTable, short* ZoneIdTable, __int64 ZoneTableWidth, void* pMatchTable , CDefectPair *pDefectdPair, __int64 StartPair, __int64 MaxPair, __int64 PairSize , __int64 dxPattern, __int64 dyPattern, __int64 yZoneByte, __int64 bReverseFilter , short* ZoneAddTable, short* pConBuff, __int64 bUseUnpair, int* endLine , __int64 ExTh, __int64 Suppress ) { const __int64 SprShift = 4; const __int64 SprMulti = 16; const __int64 szxMatch = 8; __m128i xxTemp; __m128i xxDSlide; __m128i xxZTh; __m128i xxZId; __m128i xxSrc1; __m128i xxSrc2; __m128i xxCmp1; __m128i xxCmp2; __m128i xxPeakS; __m128i xxPeakAbs; __m128i xxfSpr; __m128i xxsSpr; __int64 rax, rbx, rcx, rdx; __int64 ImgAddrOri = (__int64)pImgBuff; __int64 ConAddr = (__int64)pConBuff; __int64 c8Pixel, rrNoD = 0, rrImgAddr, nPair = StartPair; __m128i xxSupp = _mm_set1_epi16((short)Suppress); // ----------- Èæ°áÇÔ ÇÊÅÍ ----------- // short sSrc, sRef, sThres; // ----------------------------------- // rcx = iPitch16; rcx &= 0x0f; xxsSpr = _mm_set1_epi16((short)rcx); rax = SprMulti; rax -= rcx; xxfSpr = _mm_set1_epi16((short)rax); __int64 xMatch2 = 0; __int64 iPitch = iPitch16 / SprMulti; __int64 iPitchHUp = iPitch; if(rcx >= SprMulti / 2) iPitchHUp++; bottom--; __int64 ConBottom = bottom - iPitch - 1; __int64 pairBottom = ConBottom - iPitch; // -------------- à» Filtering -------------- // CRect rtDeadZone[MAX_DEAD_ZONE_COUNT]; CPoint ptDefect; memcpy(rtDeadZone, m_Param.s_RectDeadZone, sizeof(CRect) * MAX_DEAD_ZONE_COUNT); int nDeadZoneCount = 0; for(int i = 0; i < MAX_DEAD_ZONE_COUNT; i++) { if(rtDeadZone[i].IsRectEmpty() == TRUE) { nDeadZoneCount = i; break; } } // ------------------------------------------ // __int64 pairTop = top + iPitch; __int64 ConvPitch = iPitch * 0x20; __int64 ZoneTableW2 = ZoneTableWidth + ZoneTableWidth; __int64 ix = left; __int64 iy = top; right = (right - left) / 16 * 16 + left; __int64 pMatch1 = (__int64)pMatchTable; pMatchTable = (void*)(pMatch1 + yZoneByte); rcx = (__int64)pMatchTable; rbx = (__int64)(*((int*)(rcx + 4))); int yMatch = (int)rbx; rdx = dyPattern + rbx; __int64 eyPtrn = rdx; __int64 eyPtrn1 = rdx; rax = (iy - rbx) * ZoneTableWidth; rbx = (__int64)(*((int*)rcx)); int xMatch = (int)rbx; __int64 exPtrn = dxPattern + rbx; rax += ix - rbx; rax += rax; rdx = (__int64)ZoneThTable + rax; __int64 ZoneThAddr = rdx; __int64 ZoneThAddr1 = rdx; rdx = (__int64)ZoneIdTable + rax; __int64 ZoneIdAddr = rdx; __int64 ZoneIdAddr1 = rdx; rdx = (__int64)ZoneAddTable + rax; __int64 ZoneAddAddr = rdx; __int64 ZoneAddAddr1 = rdx; __m128i xxZero = _mm_setzero_si128(); CDefectPair* PairAddr = pDefectdPair + nPair; //LOOP_1: goto LOOP_1_CHECK; LOOP_1_TAIL: goto PAIRING_VERT; _return_PAIRING_VERT: ix += 0x10; eyPtrn = eyPtrn1; pMatchTable = (void*)pMatch1; ZoneThAddr1 += 0x20; ZoneThAddr = ZoneThAddr1; ZoneIdAddr1 += 0x20; ZoneIdAddr = ZoneIdAddr1; ZoneAddAddr1 += 0x20; ZoneAddAddr = ZoneAddAddr1; LOOP_1_CHECK: if(ix >= right) goto END_FUNC; //LOOP_1_BODY: iy = top; rrImgAddr = ImgAddrOri + frameWidth * iy + ix; goto MAKE_CONBUFF_HEAD; _return_MAKE_CONBUFF: iy = top; rrImgAddr = ConAddr; if(ix >= exPtrn) goto CHECK_1_BOUND; _return_CHECK_1_BOUND: //LOOP_2: goto LOOP_2_CHECK; LOOP_2_TAIL: iy++; rrImgAddr += 0x20; ZoneThAddr += ZoneTableW2; ZoneIdAddr += ZoneTableW2; ZoneAddAddr += ZoneTableW2; LOOP_2_CHECK: if(iy >= ConBottom) goto LOOP_1_TAIL; if(iy >= eyPtrn) goto CHECK_2_BOUND; _return_CHECK_2_BOUND: //LOOP_2_BODY: goto XMM_MAKE; MAKE_CONBUFF_HEAD: rax = ConAddr; MAKE_CONBUFF: xxSrc1 = _mm_loadu_si128((__m128i*) rrImgAddr); _mm_storeu_si128((__m128i*)rax, _mm_unpacklo_epi8(xxSrc1, xxZero)); _mm_storeu_si128((__m128i*)(rax + 0x10), _mm_unpackhi_epi8(xxSrc1, xxZero)); rrImgAddr += frameWidth; rax += 0x20; iy++; if(iy <= bottom) goto MAKE_CONBUFF; goto _return_MAKE_CONBUFF; CHECK_1_BOUND: pMatch1 += szxMatch; rcx = pMatch1 + yZoneByte; pMatchTable = (void*)rcx; yMatch = *((int*)(rcx + 4)); rdx = dyPattern + yMatch; eyPtrn = eyPtrn1 = rdx; rax = (iy - yMatch) * ZoneTableWidth; xMatch = *(int*)(rcx); rdx = dxPattern + xMatch; rcx = xMatch + dxPattern; if(rcx < right) goto EXCESS_1_BOUND_PASS; rdx = rcx; EXCESS_1_BOUND_PASS: exPtrn = rdx; rax += (ix - xMatch); rax += rax; ZoneThAddr1 = ZoneThAddr = (__int64)ZoneThTable + rax; ZoneIdAddr1 = ZoneIdAddr = (__int64)ZoneIdTable + rax; ZoneAddAddr1 = ZoneAddAddr = (__int64)ZoneAddTable + rax; xMatch2++; goto _return_CHECK_1_BOUND; CHECK_2_BOUND: pMatchTable = (void*)((__int64)pMatchTable + yZoneByte); rbx = (__int64)(*((int*)((__int64)pMatchTable + 4))); yMatch = (int)rbx; eyPtrn = dyPattern + rbx; rax = eyPtrn + dyPattern; if(rax < bottom) goto EXCESS_2_BOUND_PASS; eyPtrn = rax; EXCESS_2_BOUND_PASS: rax = (iy - rbx) * ZoneTableWidth; xMatch =*((int*)pMatchTable); rax += ix - xMatch; rax += rax; ZoneThAddr = (__int64)ZoneThTable + rax; ZoneIdAddr = (__int64)ZoneIdTable + rax; ZoneAddAddr = (__int64)ZoneAddTable + rax; goto _return_CHECK_2_BOUND; XMM_MAKE: xxSrc1 = _mm_loadu_si128((__m128i*) rrImgAddr); xxSrc2 = _mm_loadu_si128((__m128i*) (rrImgAddr + 0x10)); rax = rrImgAddr + ConvPitch; xxCmp1 = _mm_loadu_si128((__m128i*) rax); xxCmp2 = _mm_loadu_si128((__m128i*) (rax + 0x10)); xxTemp = _mm_loadu_si128((__m128i*) (rax + 0x20)); xxDSlide = _mm_loadu_si128((__m128i*) (rax + 0x30)); xxCmp1 = _mm_srli_epi16(_mm_add_epi16(_mm_mullo_epi16(xxCmp1, xxfSpr), _mm_mullo_epi16(xxTemp, xxsSpr)), SprShift); xxCmp2 = _mm_srli_epi16(_mm_add_epi16(_mm_mullo_epi16(xxCmp2, xxfSpr), _mm_mullo_epi16(xxDSlide, xxsSpr)), SprShift); goto XMM_COMPARE; XMM_COMPARE_END: ix -= 0x10; ZoneThAddr -= 0x10; ZoneIdAddr -= 0x10; ZoneAddAddr -= 0x10; goto LOOP_2_TAIL; XMM_COMPARE: c8Pixel = 0; xxSrc1 = _mm_min_epu16(xxSrc1, xxSupp); xxCmp1 = _mm_min_epu16(xxCmp1, xxSupp); goto _XMM_COMPARE_8PIXEL; _return_XMM_COMPARE_8PIXEL: if(rrNoD >= maxDefect) goto PAIRING_VERT; c8Pixel++; if(c8Pixel == 2) goto XMM_COMPARE_END; xxSrc1 = _mm_min_epu16(xxSrc2, xxSupp); xxCmp1 = _mm_min_epu16(xxCmp2, xxSupp); ZoneThAddr += 0x10; ZoneIdAddr += 0x10; ZoneAddAddr += 0x10; _XMM_COMPARE_8PIXEL: xxTemp = _mm_loadu_si128((__m128i*) ZoneThAddr); xxDSlide = _mm_loadu_si128((__m128i*) ZoneAddAddr); xxZTh = _mm_add_epi16(_mm_srli_epi16(_mm_mullo_epi16(_mm_max_epu16(xxSrc1, xxCmp1), xxDSlide), 8), xxTemp); xxPeakS = _mm_sub_epi16(xxSrc1, xxCmp1); xxPeakAbs = _mm_abs_epi16(xxPeakS); xxTemp = _mm_cmpgt_epi16(xxPeakAbs, xxZTh); if(_mm_movemask_epi8(xxTemp) != 0) goto DEFECT_00; ix += 8; goto _return_XMM_COMPARE_8PIXEL; DEFECT_00: xxZId = _mm_loadu_si128((__m128i*) ZoneIdAddr); if(_mm_extract_epi16(xxTemp, 0x00) == 0) goto DEFECT_01; *(DefectX + rrNoD) = (int)ix; *(DefectY + rrNoD) = (int)iy; *(pGraySrc + rrNoD) = _mm_extract_epi16(xxSrc1, 0x00); *(pGrayCmp + rrNoD) = _mm_extract_epi16(xxCmp1, 0x00); *(pZoneID + rrNoD) = _mm_extract_epi16(xxZId, 0x00); *(pZoneTh + rrNoD) = _mm_extract_epi16(xxZTh, 0x00); if((short)_mm_extract_epi16(xxPeakS, 0x00) > 0) *(DefectT + rrNoD) = 1; else *(DefectT + rrNoD) = 0; rrNoD++; DEFECT_01: ix++; if(_mm_extract_epi16(xxTemp, 0x01) == 0) goto DEFECT_02; *(DefectX + rrNoD) = (int)ix; *(DefectY + rrNoD) = (int)iy; *(pGraySrc + rrNoD) = _mm_extract_epi16(xxSrc1, 0x01); *(pGrayCmp + rrNoD) = _mm_extract_epi16(xxCmp1, 0x01); *(pZoneID + rrNoD) = _mm_extract_epi16(xxZId, 0x01); *(pZoneTh + rrNoD) = _mm_extract_epi16(xxZTh, 0x01); if((short)_mm_extract_epi16(xxPeakS, 0x01) > 0) *(DefectT + rrNoD) = 1; else *(DefectT + rrNoD) = 0; rrNoD++; DEFECT_02: ix++; if(_mm_extract_epi16(xxTemp, 0x02) == 0) goto DEFECT_03; *(DefectX + rrNoD) = (int)ix; *(DefectY + rrNoD) = (int)iy; *(pGraySrc + rrNoD) = _mm_extract_epi16(xxSrc1, 0x02); *(pGrayCmp + rrNoD) = _mm_extract_epi16(xxCmp1, 0x02); *(pZoneID + rrNoD) = _mm_extract_epi16(xxZId, 0x02); *(pZoneTh + rrNoD) = _mm_extract_epi16(xxZTh, 0x02); if((short)_mm_extract_epi16(xxPeakS, 0x02) > 0) *(DefectT + rrNoD) = 1; else *(DefectT + rrNoD) = 0; rrNoD++; DEFECT_03: ix++; if(_mm_extract_epi16(xxTemp, 0x03) == 0) goto DEFECT_04; *(DefectX + rrNoD) = (int)ix; *(DefectY + rrNoD) = (int)iy; *(pGraySrc + rrNoD) = _mm_extract_epi16(xxSrc1, 0x03); *(pGrayCmp + rrNoD) = _mm_extract_epi16(xxCmp1, 0x03); *(pZoneID + rrNoD) = _mm_extract_epi16(xxZId, 0x03); *(pZoneTh + rrNoD) = _mm_extract_epi16(xxZTh, 0x03); if((short)_mm_extract_epi16(xxPeakS, 0x03) > 0) *(DefectT + rrNoD) = 1; else *(DefectT + rrNoD) = 0; rrNoD++; DEFECT_04: ix++; if(_mm_extract_epi16(xxTemp, 0x04) == 0) goto DEFECT_05; *(DefectX + rrNoD) = (int)ix; *(DefectY + rrNoD) = (int)iy; *(pGraySrc + rrNoD) = _mm_extract_epi16(xxSrc1, 0x04); *(pGrayCmp + rrNoD) = _mm_extract_epi16(xxCmp1, 0x04); *(pZoneID + rrNoD) = _mm_extract_epi16(xxZId, 0x04); *(pZoneTh + rrNoD) = _mm_extract_epi16(xxZTh, 0x04); if((short)_mm_extract_epi16(xxPeakS, 0x04) > 0) *(DefectT + rrNoD) = 1; else *(DefectT + rrNoD) = 0; rrNoD++; DEFECT_05: ix++; if(_mm_extract_epi16(xxTemp, 0x05) == 0) goto DEFECT_06; *(DefectX + rrNoD) = (int)ix; *(DefectY + rrNoD) = (int)iy; *(pGraySrc + rrNoD) = _mm_extract_epi16(xxSrc1, 0x05); *(pGrayCmp + rrNoD) = _mm_extract_epi16(xxCmp1, 0x05); *(pZoneID + rrNoD) = _mm_extract_epi16(xxZId, 0x05); *(pZoneTh + rrNoD) = _mm_extract_epi16(xxZTh, 0x05); if((short)_mm_extract_epi16(xxPeakS, 0x05) > 0) *(DefectT + rrNoD) = 1; else *(DefectT + rrNoD) = 0; rrNoD++; DEFECT_06: ix++; if(_mm_extract_epi16(xxTemp, 0x06) == 0) goto DEFECT_07; *(DefectX + rrNoD) = (int)ix; *(DefectY + rrNoD) = (int)iy; *(pGraySrc + rrNoD) = _mm_extract_epi16(xxSrc1, 0x06); *(pGrayCmp + rrNoD) = _mm_extract_epi16(xxCmp1, 0x06); *(pZoneID + rrNoD) = _mm_extract_epi16(xxZId, 0x06); *(pZoneTh + rrNoD) = _mm_extract_epi16(xxZTh, 0x06); if((short)_mm_extract_epi16(xxPeakS, 0x06) > 0) *(DefectT + rrNoD) = 1; else *(DefectT + rrNoD) = 0; rrNoD++; DEFECT_07: ix++; if(_mm_extract_epi16(xxTemp, 0x07) == 0) goto DEFECT_08; *(DefectX + rrNoD) = (int)ix; *(DefectY + rrNoD) = (int)iy; *(pGraySrc + rrNoD) = _mm_extract_epi16(xxSrc1, 0x07); *(pGrayCmp + rrNoD) = _mm_extract_epi16(xxCmp1, 0x07); *(pZoneID + rrNoD) = _mm_extract_epi16(xxZId, 0x07); *(pZoneTh + rrNoD) = _mm_extract_epi16(xxZTh, 0x07); if((short)_mm_extract_epi16(xxPeakS, 0x07) > 0) *(DefectT + rrNoD) = 1; else *(DefectT + rrNoD) = 0; rrNoD++; DEFECT_08: ix++; goto _return_XMM_COMPARE_8PIXEL; PAIRING_VERT: iy = -1; LOOP_PAIR_NUM: iy++; if(iy >= rrNoD) goto LOOP_PAIR_NUM_END; rax = nPair; if(rax >= MaxPair) goto END_FUNC; if(*(DefectT + iy) >= 3) goto LOOP_PAIR_NUM; rbx = iy; rcx = *(DefectY + iy); rax = rcx + iPitchHUp; rrImgAddr = *(DefectX + iy); if(rcx > pairBottom) goto PAIR_BOTTOM; if(rcx >= pairTop) goto PAIR_CENTER; PAIR_TOP: rbx++; if(rbx >= rrNoD) goto PAIR_TOP_UNPAIR; rdx = *(DefectY + rbx); if(rdx < rax) goto PAIR_TOP; else if(rdx > rax) goto PAIR_TOP_UNPAIR; rcx = *(DefectX + rbx); if(rrImgAddr != rcx) goto PAIR_TOP; rrImgAddr = *(DefectT + rbx); if(rrImgAddr >= 3) goto LOOP_PAIR_NUM; rax = (__int64)*(DefectT + iy); if(rax == rrImgAddr) goto LOOP_PAIR_NUM; // -------------- à» Filtering -------------- // ptDefect.x = (LONG)rcx; ptDefect.y = (LONG)rdx; for(int i = 0; i < nDeadZoneCount; i++) { if(rtDeadZone[i].PtInRect(ptDefect) ) goto LOOP_PAIR_NUM; } // ------------------------------------------ // // ----------- Èæ°áÇÔ ÇÊÅÍ ----------- // sSrc = (int)(*(pGraySrc + rbx)); sRef = (int)(*(pGrayCmp + rbx)); if(sSrc < sRef) { sThres = (short)(sRef * m_Param.s_nBWB_Slide / 256 + m_Param.s_nBWB_Main); if(abs(sSrc - sRef) <= sThres) goto LOOP_PAIR_NUM; *(pZoneTh + rbx) = sThres; } // ----------------------------------- // *(DefectT + rbx) = 4; PairAddr->s_DefectPos = (DefectPos)1; PairAddr->s_DefectPair = (DefectPair)1; PairAddr->s_nDefectX = (int)rcx; PairAddr->s_nDefectY = (int)rdx; PairAddr->s_DefectType = (DefectType)rrImgAddr; //PairAddr->s_fDefectPeak = (int)*(DefectValue + rbx); PairAddr->s_nGraySrc = (int)(sSrc); PairAddr->s_nGrayRef = (int)(sRef); PairAddr->s_nZone = (int)(*(pZoneID + rbx)); PairAddr->s_nThresold = (int)(*(pZoneTh + rbx)); PairAddr++; nPair++; goto LOOP_PAIR_NUM; PAIR_TOP_UNPAIR: if(bUseUnpair != 1) goto LOOP_PAIR_NUM; //rcx = (__int64)*(DefectValue + iy); //if(rcx <= ExTh) // goto LOOP_PAIR_NUM; // -------------- à» Filtering -------------- // ptDefect.x = (LONG)(rrImgAddr); ptDefect.y = (LONG)(rax - iPitchHUp); for(int i = 0; i < nDeadZoneCount; i++) { if(rtDeadZone[i].PtInRect(ptDefect) ) goto LOOP_PAIR_NUM; } // ------------------------------------------ // // ----------- Èæ°áÇÔ ÇÊÅÍ ----------- // sSrc = (int)(*(pGraySrc + iy)); sRef = (int)(*(pGrayCmp + iy)); if(sSrc < sRef) { sThres = (short)(sRef * m_Param.s_nBWB_Slide / 256 + m_Param.s_nBWB_Main); if(abs(sSrc - sRef) <= sThres) goto LOOP_PAIR_NUM; *(pZoneTh + iy) = sThres; } // ----------------------------------- // PairAddr->s_DefectPos = (DefectPos)1; PairAddr->s_DefectPair = (DefectPair)5; PairAddr->s_nDefectX = (int)ptDefect.x; PairAddr->s_nDefectY = (int)ptDefect.y; PairAddr->s_DefectType = (DefectType)*(DefectT + iy); //PairAddr->s_fDefectPeak = (int)*(DefectValue + iy); PairAddr->s_nGraySrc = (int)(sSrc); PairAddr->s_nGrayRef = (int)(sRef); PairAddr->s_nZone = (int)(*(pZoneID + iy)); PairAddr->s_nThresold = (int)(*(pZoneTh + iy)); PairAddr++; nPair++; goto LOOP_PAIR_NUM; PAIR_CENTER: rbx++; if(rbx >= rrNoD) goto LOOP_PAIR_NUM; rdx = *(DefectY + rbx); if(rdx < rax) goto PAIR_CENTER; else if(rdx > rax) goto LOOP_PAIR_NUM; rcx = *(DefectX + rbx); if(rrImgAddr != rcx) goto PAIR_CENTER; rrImgAddr = *(DefectT + rbx); if(rrImgAddr >= 3) goto LOOP_PAIR_NUM; rax = (__int64)*(DefectT + iy); if(rax == rrImgAddr) goto LOOP_PAIR_NUM; // -------------- à» Filtering -------------- // ptDefect.x = (LONG)rcx; ptDefect.y = (LONG)rdx; for(int i = 0; i < nDeadZoneCount; i++) { if(rtDeadZone[i].PtInRect(ptDefect) ) goto LOOP_PAIR_NUM; } // ------------------------------------------ // // ----------- Èæ°áÇÔ ÇÊÅÍ ----------- // sSrc = (int)(*(pGraySrc + rbx)); sRef = (int)(*(pGrayCmp + rbx)); if(sSrc < sRef) { sThres = (short)(sRef * m_Param.s_nBWB_Slide / 256 + m_Param.s_nBWB_Main); if(abs(sSrc - sRef) <= sThres) goto LOOP_PAIR_NUM; *(pZoneTh + rbx) = sThres; } // ----------------------------------- // *(DefectT + rbx) = 4; PairAddr->s_DefectPos = (DefectPos)2; PairAddr->s_DefectPair = (DefectPair)1; PairAddr->s_nDefectX = (int)rcx; PairAddr->s_nDefectY = (int)rdx; PairAddr->s_DefectType = (DefectType)rrImgAddr; //PairAddr->s_fDefectPeak = (int)*(DefectValue + rbx); PairAddr->s_nGraySrc = (int)(sSrc); PairAddr->s_nGrayRef = (int)(sRef); PairAddr->s_nZone = (int)(*(pZoneID + rbx)); PairAddr->s_nThresold = (int)(*(pZoneTh + rbx)); PairAddr++; nPair++; goto LOOP_PAIR_NUM; PAIR_BOTTOM: if(bUseUnpair != 1) goto LOOP_PAIR_NUM; //rcx = (__int64)*(DefectValue + iy); //if(rcx <= ExTh) // goto LOOP_PAIR_NUM; // -------------- à» Filtering -------------- // ptDefect.x = (LONG)rrImgAddr; ptDefect.y = (LONG)rax; for(int i = 0; i < nDeadZoneCount; i++) { if(rtDeadZone[i].PtInRect(ptDefect) ) goto LOOP_PAIR_NUM; } // ------------------------------------------ // // ----------- Èæ°áÇÔ ÇÊÅÍ ----------- // sSrc = (int)(*(pGrayCmp + iy)); sRef = (int)(*(pGraySrc + iy)); if(sSrc < sRef) { sThres = (short)(sRef * m_Param.s_nBWB_Slide / 256 + m_Param.s_nBWB_Main); if(abs(sSrc - sRef) <= sThres) goto LOOP_PAIR_NUM; *(pZoneTh + iy) = sThres; } // ----------------------------------- // PairAddr->s_DefectPos = (DefectPos)3; PairAddr->s_DefectPair = (DefectPair)5; PairAddr->s_nDefectX = (int)rrImgAddr; PairAddr->s_nDefectY = (int)rax; rdx = (*(DefectT + iy) + 1) & 1; PairAddr->s_DefectType = (DefectType)rdx; //PairAddr->s_fDefectPeak = (int)*(DefectValue + iy); PairAddr->s_nGraySrc = (int)sSrc; PairAddr->s_nGrayRef = (int)sRef; PairAddr->s_nZone = (int)(*(pZoneID + iy)); PairAddr->s_nThresold = (int)(*(pZoneTh + iy)); PairAddr++; nPair++; goto LOOP_PAIR_NUM; LOOP_PAIR_NUM_END: rrNoD = 0; goto _return_PAIRING_VERT; END_FUNC: ix += 0x10; *endLine = (int)ix; return (int)nPair; }