#include "stdafx.h" #include "BlobStorage.h" #include #ifdef _DEBUG #define new DEBUG_NEW #endif #include "SISAssem.h" #include "AssemParam.h" int CSISAssem::ConvPixelVertS_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 , __int64 ThresholdSlide, __int64 ThresholdSuppress, __int64 bUseUnpair, short* pConBuff , int* endLine, __int64 ExTh ) { const __int64 SprShift = 4; const __int64 SprMulti = 16; __m128i xxTemp; __m128i xxZTh; __m128i xxSrc1; __m128i xxSrc2; __m128i xxCmp1; __m128i xxCmp2; __m128i xxCmp3; __m128i xxPeakS; __m128i xxPeakAbs; __m128i xxfSpr; __m128i xxsSpr; __m128i xxDStart; __m128i xxDSlide; __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)ThresholdSuppress); xxDStart = _mm_set1_epi16((short)Threshold); xxDSlide = _mm_set1_epi16((short)ThresholdSlide); // ---- Èæ¹é°áÇÔ Â÷µî ¹®Åΰª Àû¿ë ---- // short sSrc, sRef, sThres, sDiff; __m128i xxZThB, xxZThW, xx0xff = _mm_set1_epi16(-1); __m128i xxDStartB(xxDStart); __m128i xxDSlideB(xxDSlide); if(m_Param.s_nBWB_Main > 0) { xxDStartB = _mm_set1_epi16((short)m_Param.s_nBWB_Main); xxDSlideB = _mm_set1_epi16((short)m_Param.s_nBWB_Slide); } else { m_Param.s_nBWB_Main = (int)Threshold; m_Param.s_nBWB_Slide = (int)ThresholdSlide; } // ----------------------------------- // rcx = iPitch16; rcx &= 0x0f; xxsSpr = _mm_set1_epi16((short)rcx); rax = SprMulti; rax -= rcx; xxfSpr = _mm_set1_epi16((short)rax); __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 ix = left; __int64 iy = top; right = (right - left) / 16 * 16 + left; __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; 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; //LOOP_2: goto LOOP_2_CHECK; LOOP_2_TAIL: iy++; rrImgAddr += 0x20; LOOP_2_CHECK: if(iy >= ConBottom) goto LOOP_1_TAIL; //LOOP_2_BODY: goto XMM_MAKE; _return_XMM_MAKE: goto XMM_COMPARE; _return_XMM_COMPARE: goto LOOP_2_TAIL; 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; 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)); xxCmp3 = _mm_loadu_si128((__m128i*) (rax + 0x20)); xxTemp = _mm_loadu_si128((__m128i*) (rax + 0x30)); xxCmp1 = _mm_srli_epi16(_mm_add_epi16(_mm_mullo_epi16(xxCmp1, xxfSpr), _mm_mullo_epi16(xxCmp3, xxsSpr)), SprShift); xxCmp2 = _mm_srli_epi16(_mm_add_epi16(_mm_mullo_epi16(xxCmp2, xxfSpr), _mm_mullo_epi16(xxTemp, xxsSpr)), SprShift); goto _return_XMM_MAKE; 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); _XMM_COMPARE_8PIXEL: // ---- Èæ¹é°áÇÔ Â÷µî ¹®Åΰª Àû¿ë ---- // //¿ø·¡ÄÚµå: xxZTh = _mm_add_epi16(_mm_srli_epi16(_mm_mullo_epi16(_mm_max_epu16(xxSrc1, xxCmp1), xxDSlide), 8), xxDStart); xxZThW = _mm_add_epi16(_mm_srli_epi16(_mm_mullo_epi16(_mm_max_epu16(xxSrc1, xxCmp1), xxDSlide), 8), xxDStart); xxZThB = _mm_add_epi16(_mm_srli_epi16(_mm_mullo_epi16(_mm_max_epu16(xxSrc1, xxCmp1), xxDSlideB), 8), xxDStartB); xxZTh = _mm_min_epu16(xxZThW, xxZThB); // ----------------------------------- // //Â÷À̰ªÀ» ±¸Çϰí 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; XMM_COMPARE_END: ix -= 0x10; goto _return_XMM_COMPARE; DEFECT_00: 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(xxZero, 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(xxZero, 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(xxZero, 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(xxZero, 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(xxZero, 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(xxZero, 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(xxZero, 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(xxZero, 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)(sSrc * ThresholdSlide / 256 + Threshold); else sThres = (short)(sRef * m_Param.s_nBWB_Slide / 256 + m_Param.s_nBWB_Main); *(pZoneTh + rbx) = sThres; sDiff = abs(sSrc - sRef); if(sDiff <= sThres) 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)(sRef); PairAddr->s_nZone = (int)(*(pZoneID + rbx)); PairAddr->s_nThresold = (int)(sThres); 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)(sSrc * ThresholdSlide / 256 + Threshold); else sThres = (short)(sRef * m_Param.s_nBWB_Slide / 256 + m_Param.s_nBWB_Main); *(pZoneTh + iy) = sThres; sDiff = abs(sSrc - sRef); if(sDiff <= sThres) 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)(sSrc); PairAddr->s_nGrayRef = (int)(sRef); PairAddr->s_nZone = (int)(*(pZoneID + iy)); PairAddr->s_nThresold = (int)(sThres); 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)(sSrc * ThresholdSlide / 256 + Threshold); else sThres = (short)(sRef * m_Param.s_nBWB_Slide / 256 + m_Param.s_nBWB_Main); *(pZoneTh + rbx) = sThres; sDiff = abs(sSrc - sRef); if(sDiff <= sThres) 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)(sRef); PairAddr->s_nZone = (int)(*(pZoneID + rbx)); PairAddr->s_nThresold = (int)(sThres); 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)(sSrc * ThresholdSlide / 256 + Threshold); else sThres = (short)(sRef * m_Param.s_nBWB_Slide / 256 + m_Param.s_nBWB_Main); *(pZoneTh + iy) = sThres; sDiff = abs(sSrc - sRef); if(sDiff <= sThres) 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)sRef; PairAddr->s_nZone = (int)(*(pZoneID + iy)); PairAddr->s_nThresold = (int)sThres; 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::ConvPixelVTDS_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, int* piPitch16, __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 , __int64 ThresholdSlide, __int64 ThresholdSuppress, __int64 bUseUnpair, short* pConBuff , int* endLine, __int64 ExTh ) { const __int64 SprShift = 4; const __int64 SprMulti = 16; __m128i xxTemp; __m128i xxZTh; __m128i xxSrc1; __m128i xxSrc2; __m128i xxCmp1; __m128i xxCmp2; __m128i xxCmp3; __m128i xxPeakS; __m128i xxPeakAbs; __m128i xxfSpr; __m128i xxsSpr; __m128i xxDStart; __m128i xxDSlide; __int64 rax, rbx, rcx, rdx; __int64 ImgAddrOri = (__int64)pImgBuff; __int64 ConAddr = (__int64)pConBuff; __int64 c8Pixel, rrNoD = 0, rrImgAddr, nPair = StartPair, _piPitch16, cDpc; __m128i xxSupp = _mm_set1_epi16((short)ThresholdSuppress); xxDStart = _mm_set1_epi16((short)Threshold); xxDSlide = _mm_set1_epi16((short)ThresholdSlide); // ---- Èæ¹é°áÇÔ Â÷µî ¹®Åΰª Àû¿ë ---- // short sSrc, sRef, sThres, sDiff; __m128i xxZThB, xxZThW, xx0xff = _mm_set1_epi16(-1); __m128i xxDStartB(xxDStart); __m128i xxDSlideB(xxDSlide); if(m_Param.s_nBWB_Main > 0) { xxDStartB = _mm_set1_epi16((short)m_Param.s_nBWB_Main); xxDSlideB = _mm_set1_epi16((short)m_Param.s_nBWB_Slide); } else { m_Param.s_nBWB_Main = (int)Threshold; m_Param.s_nBWB_Slide = (int)ThresholdSlide; } // ----------------------------------- // rcx = iPitch16; rcx &= 0x0f; xxsSpr = _mm_set1_epi16((short)rcx); rax = SprMulti; rax -= rcx; xxfSpr = _mm_set1_epi16((short)rax); __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 ix = left; __int64 iy = top; right = (right - left) / 16 * 16 + left; __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; 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: goto MAKE_CONBUFF_HEAD; _return_MAKE_CONBUFF: iy = top; rrImgAddr = ConAddr; //LOOP_2: cDpc = 0x10; goto LOOP_2_CHECK; LOOP_2_TAIL: iy++; rrImgAddr += 0x20; LOOP_2_CHECK: if(iy >= ConBottom) goto LOOP_1_TAIL; //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; 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; 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 *= 32; //sal rax, 5 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: 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)); xxCmp3 = _mm_loadu_si128((__m128i*) (rax + 0x20)); xxTemp = _mm_loadu_si128((__m128i*) (rax + 0x30)); xxCmp1 = _mm_srli_epi16(_mm_add_epi16(_mm_mullo_epi16(xxCmp1, xxfSpr), _mm_mullo_epi16(xxCmp3, xxsSpr)), SprShift); xxCmp2 = _mm_srli_epi16(_mm_add_epi16(_mm_mullo_epi16(xxCmp2, xxfSpr), _mm_mullo_epi16(xxTemp, xxsSpr)), SprShift); goto _return_XMM_MAKE; 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); _XMM_COMPARE_8PIXEL: // ---- Èæ¹é°áÇÔ Â÷µî ¹®Åΰª Àû¿ë ---- // //¿ø·¡ÄÚµå: xxZTh = _mm_add_epi16(_mm_srli_epi16(_mm_mullo_epi16(_mm_max_epu16(xxSrc1, xxCmp1), xxDSlide), 8), xxDStart); xxZThW = _mm_add_epi16(_mm_srli_epi16(_mm_mullo_epi16(_mm_max_epu16(xxSrc1, xxCmp1), xxDSlide), 8), xxDStart); xxZThB = _mm_add_epi16(_mm_srli_epi16(_mm_mullo_epi16(_mm_max_epu16(xxSrc1, xxCmp1), xxDSlideB), 8), xxDStartB); xxZTh = _mm_min_epu16(xxZThW, xxZThB); // ----------------------------------- // //Â÷À̰ªÀ» ±¸Çϰí 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; XMM_COMPARE_END: ix -= 0x10; goto _return_XMM_COMPARE; DEFECT_00: 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(xxZero, 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(xxZero, 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(xxZero, 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(xxZero, 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(xxZero, 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(xxZero, 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(xxZero, 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(xxZero, 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)(sSrc * ThresholdSlide / 256 + Threshold); else sThres = (short)(sRef * m_Param.s_nBWB_Slide / 256 + m_Param.s_nBWB_Main); *(pZoneTh + rbx) = sThres; sDiff = abs(sSrc - sRef); if(sDiff <= sThres) 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)(sRef); PairAddr->s_nZone = (int)(*(pZoneID + rbx)); PairAddr->s_nThresold = (int)(sThres); 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)(sSrc * ThresholdSlide / 256 + Threshold); else sThres = (short)(sRef * m_Param.s_nBWB_Slide / 256 + m_Param.s_nBWB_Main); *(pZoneTh + iy) = sThres; sDiff = abs(sSrc - sRef); if(sDiff <= sThres) 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)(sSrc); PairAddr->s_nGrayRef = (int)(sRef); PairAddr->s_nZone = (int)(*(pZoneID + iy)); PairAddr->s_nThresold = (int)(sThres); 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)(sSrc * ThresholdSlide / 256 + Threshold); else sThres = (short)(sRef * m_Param.s_nBWB_Slide / 256 + m_Param.s_nBWB_Main); *(pZoneTh + rbx) = sThres; sDiff = abs(sSrc - sRef); if(sDiff <= sThres) 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)(sRef); PairAddr->s_nZone = (int)(*(pZoneID + rbx)); PairAddr->s_nThresold = (int)(sThres); 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)(sSrc * ThresholdSlide / 256 + Threshold); else sThres = (short)(sRef * m_Param.s_nBWB_Slide / 256 + m_Param.s_nBWB_Main); *(pZoneTh + iy) = sThres; sDiff = abs(sSrc - sRef); if(sDiff <= sThres) 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)sRef; PairAddr->s_nZone = (int)(*(pZoneID + iy)); PairAddr->s_nThresold = (int)sThres; 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::ConvPixel_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 iPitch, __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 , __int64 ThresholdSlide, __int64 ThresholdSuppress, __int64 bUseUnpair, int* endLine ) { const __int64 SprShift = 4; const __int64 SprMulti = 16; __m128i xxTemp; __m128i xxZTh; __m128i xxZId; __m128i xxSrc1; __m128i xxSrc2; __m128i xxCmp1; __m128i xxCmp2; __m128i xxCmp3; __m128i xxPeakS; __m128i xxPeakAbs; __m128i xxfSpr; __m128i xxsSpr; __m128i xxDStart; __m128i xxDSlide; __int64 rax, rbx, rcx, rdx; __int64 ImgAddrOri = (__int64)pImgBuff; __int64 c8Pixel, rrNoD = 0, rrImgAddr, nPair = StartPair; __m128i xxSupp = _mm_set1_epi16((short)ThresholdSuppress); xxDStart = _mm_set1_epi16((short)Threshold); xxDSlide = _mm_set1_epi16((short)ThresholdSlide); xxZId = _mm_setzero_si128(); rcx = iPitch; rcx &= 0x0f; xxsSpr = _mm_set1_epi16((short)rcx); rax = SprMulti; rax -= rcx; xxfSpr = _mm_set1_epi16((short)rax); iPitch = iPitch / SprMulti; __int64 iPitchHUp = iPitch; if(rcx >= SprMulti / 2) iPitchHUp++; right = (right - left - iPitch) / 16 * 16 + left; __int64 pairRight = right - iPitch; __int64 pairLeft = left + iPitch; __int64 ix = left; __int64 iy = top; __m128i xxZero = _mm_setzero_si128(); CDefectPair* PairAddr = pDefectdPair + nPair; //LOOP_1: goto LOOP_1_CHECK; LOOP_1_TAIL: goto PAIRING; _return_PAIRING: iy++; LOOP_1_CHECK: if(iy >= bottom) goto END_FUNC; //LOOP_1_BODY: ix = left; rrImgAddr = ImgAddrOri + frameWidth * iy + ix; //LOOP_2: goto LOOP_2_CHECK; LOOP_2_TAIL: rrImgAddr += 0x10; LOOP_2_CHECK: if(ix >= right) goto LOOP_1_TAIL; //LOOP_2_BODY: goto XMM_MAKE; _return_XMM_MAKE: goto XMM_COMPARE; _return_XMM_COMPARE: goto LOOP_2_TAIL; XMM_MAKE: xxSrc2 = _mm_loadu_si128((__m128i*) rrImgAddr); xxSrc1 = _mm_unpacklo_epi8(xxSrc2, xxZero); xxSrc2 = _mm_unpackhi_epi8(xxSrc2, xxZero); rax = rrImgAddr + iPitch; xxCmp2 = _mm_loadu_si128((__m128i*) rax); xxCmp1 = _mm_unpacklo_epi8(xxCmp2, xxZero); xxCmp2 = _mm_unpackhi_epi8(xxCmp2, xxZero); xxCmp1 = _mm_mullo_epi16(xxCmp1, xxfSpr); xxCmp2 = _mm_mullo_epi16(xxCmp2, xxfSpr); xxCmp3 = _mm_loadu_si128((__m128i*) (rax + 1)); xxTemp = xxCmp3; xxTemp = _mm_unpacklo_epi8(xxTemp, xxZero); xxTemp = _mm_mullo_epi16(xxTemp, xxsSpr); xxCmp1 = _mm_add_epi16(xxCmp1, xxTemp); xxTemp = xxCmp3; xxTemp = _mm_unpackhi_epi8(xxTemp, xxZero); xxTemp = _mm_mullo_epi16(xxTemp, xxsSpr); xxCmp2 = _mm_add_epi16(xxCmp2, xxTemp); xxCmp1 = _mm_srli_epi16(xxCmp1, SprShift); xxCmp2 = _mm_srli_epi16(xxCmp2, SprShift); goto _return_XMM_MAKE; XMM_COMPARE: c8Pixel = 0; goto _XMM_COMPARE_8PIXEL; _return_XMM_COMPARE_8PIXEL: if(rrNoD >= maxDefect) goto PAIRING; ix++; c8Pixel++; if(c8Pixel == 2) goto _return_XMM_COMPARE; xxSrc1 = xxSrc2; xxCmp1 = xxCmp2; _XMM_COMPARE_8PIXEL: xxSrc1 = _mm_min_epu16(xxSrc1, xxSupp); xxCmp1 = _mm_min_epu16(xxCmp1, xxSupp); xxZTh = _mm_add_epi16(_mm_srli_epi16(_mm_mullo_epi16(_mm_max_epu16(xxSrc1, xxCmp1), xxDSlide), 8), xxDStart); 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 += 7; goto _return_XMM_COMPARE_8PIXEL; DEFECT_00: 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 _return_XMM_COMPARE_8PIXEL; *(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++; goto _return_XMM_COMPARE_8PIXEL; PAIRING: ix = -1; LOOP_PAIR_NUM: ix++; if(ix >= rrNoD) goto LOOP_PAIR_NUM_END; rax = nPair; if(rax >= MaxPair) goto END_FUNC; if(*(DefectT + ix) >= 3) goto LOOP_PAIR_NUM; rbx = ix; rdx = *(DefectX + ix); rcx = rdx; rcx = rcx + iPitchHUp; if(rdx < pairLeft) goto PAIR_LEFT; if(rdx <= pairRight) goto PAIR_CENTER; //PAIR_RIGHT: if(bUseUnpair == 0) goto LOOP_PAIR_NUM; //rcx = (__int64)*(DefectValue + iy); //if(rcx <= ExTh) // goto LOOP_PAIR_NUM; PairAddr->s_DefectPos = (DefectPos)3; PairAddr->s_DefectPair = (DefectPair)5; PairAddr->s_nDefectX = (int)rcx; PairAddr->s_nDefectY = (int)(*(DefectY + ix)); rcx = (*(DefectT + ix) + 1) & 1; PairAddr->s_DefectType = (DefectType)rcx; //PairAddr->s_fDefectPeak = (int)*(DefectValue + iy); PairAddr->s_nGraySrc = (int)(*(pGrayCmp + ix)); PairAddr->s_nGrayRef = (int)(*(pGraySrc + ix)); PairAddr->s_nZone = (int)(*(pZoneID + ix)); PairAddr->s_nThresold = (int)(*(pZoneTh + ix)); PairAddr++; nPair++; goto LOOP_PAIR_NUM; PAIR_LEFT: rbx++; if(rbx >= rrNoD) goto PAIR_LEFT_UNPAIR; rax = *(DefectX + rbx); if(rax < rcx) goto PAIR_LEFT; else if(rax > rcx) goto PAIR_LEFT_UNPAIR; rdx = *(DefectT + rbx); if(rdx >= 3) goto PAIR_LEFT; rax = (__int64)*(DefectT + ix); if(rax == rdx) goto PAIR_LEFT; *(DefectT + rbx) = 4; PairAddr->s_DefectPos = (DefectPos)1; PairAddr->s_DefectPair = (DefectPair)1; PairAddr->s_nDefectX = (int)rcx; PairAddr->s_nDefectY = (int)(*(DefectY + rbx)); PairAddr->s_DefectType = (DefectType)rdx; //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_LEFT_UNPAIR: if(bUseUnpair == 0) goto LOOP_PAIR_NUM; //rcx = (__int64)*(DefectValue + iy); //if(rcx <= ExTh) // goto LOOP_PAIR_NUM; PairAddr->s_DefectPos = (DefectPos)1; PairAddr->s_DefectPair = (DefectPair)5; PairAddr->s_nDefectX = (int)(*(DefectX + ix)); PairAddr->s_nDefectY = (int)(*(DefectY + ix)); PairAddr->s_DefectType = (DefectType)*(DefectT + ix); //PairAddr->s_fDefectPeak = (int)*(DefectValue + iy); PairAddr->s_nGraySrc = (int)(*(pGraySrc + ix)); PairAddr->s_nGrayRef = (int)(*(pGrayCmp + ix)); PairAddr->s_nZone = (int)(*(pZoneID + ix)); PairAddr->s_nThresold = (int)(*(pZoneTh + ix)); PairAddr++; nPair++; goto LOOP_PAIR_NUM; PAIR_CENTER: rbx++; if(rbx >= rrNoD) goto LOOP_PAIR_NUM; rax = *(DefectX + rbx); if(rax < rcx) goto PAIR_CENTER; else if(rax > rcx) goto PAIR_CENTER_UNPAIR; rdx = *(DefectT + rbx); if(rdx >= 3) goto PAIR_CENTER; rax = (__int64)*(DefectT + ix); if(rax == rdx) goto PAIR_CENTER; *(DefectT + rbx) = 4; PairAddr->s_DefectPos = (DefectPos)2; PairAddr->s_DefectPair = (DefectPair)1; PairAddr->s_nDefectX = (int)rcx; PairAddr->s_nDefectY = (int)(*(DefectY + rbx)); PairAddr->s_DefectType = (DefectType)rdx; //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_CENTER_UNPAIR: goto LOOP_PAIR_NUM; LOOP_PAIR_NUM_END: rrNoD = 0; goto _return_PAIRING; END_FUNC: iy ++; *endLine = (int)iy; return (int)nPair; } int CSISAssem::ConvPixel_Intrin_Twice(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 iPitch, __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 , __int64 ThresholdSlide, __int64 ThresholdSuppress, __int64 bUseUnpair, int* endLine , __int64 iPitch2, __int64 Threshold2, __int64 ThresholdSlide2) { //°Å´ë °áÇÔÀ» °ËÃâÇϱâ À§ÇØ ÀåÁÖ±â·Î Çѹø´õ ºñ±³ÇÑ´Ù. __int64 nPair1 = ConvPixel_Intrin(pImgBuff, Threshold, maxDefect, nDefect , left, right, top, bottom , DefectX, DefectY, DefectT, DefectValue , pGraySrc, pGrayCmp, pZoneID, pZoneTh , frameWidth, iPitch, fSPR, sSPR , ZoneThTable, ZoneIdTable, ZoneTableWidth, pMatchTable , pDefectdPair, StartPair, MaxPair, PairSize , dxPattern, dyPattern, yZoneByte, bReverseFilter , ThresholdSlide, ThresholdSuppress, bUseUnpair, endLine ); __int64 nPair2 = ConvPixel_Intrin(pImgBuff, Threshold2, maxDefect, nDefect , left, right, top, bottom , DefectX, DefectY, DefectT, DefectValue , pGraySrc, pGrayCmp, pZoneID, pZoneTh , frameWidth, iPitch2, fSPR, sSPR , ZoneThTable, ZoneIdTable, ZoneTableWidth, pMatchTable , pDefectdPair, nPair1, MaxPair, PairSize , dxPattern, dyPattern, yZoneByte, bReverseFilter , ThresholdSlide2, ThresholdSuppress, bUseUnpair, endLine ); //Æä¾î¸µµÈ °áÇÔÁß °°Àº ÁÂÇ¥ÀÇ Pair ´Â Áö¿î´Ù. __int64 iPair1, iPair2; CDefectPair *pPair1, *pPair2; for(iPair1= StartPair; iPair1 < nPair1; iPair1++) { pPair1= pDefectdPair+ iPair1; if(pPair1->s_DefectType == DEFTYPE_DELETE) continue; for(iPair2= nPair1; iPair2 < nPair2; iPair2++) { pPair2= pDefectdPair+ iPair2; if(pPair2->s_DefectType == DEFTYPE_DELETE) continue; if(pPair1->s_nDefectY < pPair2->s_nDefectY - 1) break; if(pPair1->s_nDefectX < pPair2->s_nDefectX - 1) continue; if(abs(pPair1->s_nDefectX - pPair2->s_nDefectX) < 2 && abs(pPair1->s_nDefectY - pPair2->s_nDefectY) < 2) pPair2->s_DefectType = DEFTYPE_DELETE; } } int oldBlob = m_nBlob; m_nPair = (int)nPair1; CBlobStorage::BlobDefect(); CBlobStorage::MergeDivision(oldBlob, m_Param.m_nDefectMergePixel); CBlobStorage::ShadowFilter(oldBlob, m_Param.GetRealConvPitch()); int nThres = m_Param.s_nThreshold; int nDThSlide = m_Param.s_nDThSlide; double dPitchConvReal = m_Param.s_dPitchConvReal; double dPitchScanReal = m_Param.s_dPitchScanReal; m_Param.s_nThreshold = m_Param.s_n2ndThres; m_Param.s_nDThSlide = m_Param.s_n2ndThresSlide; m_Param.s_dPitchConvReal = m_Param.s_d2ndPitch; m_Param.s_dPitchScanReal = m_Param.s_d2ndPitch; oldBlob = m_nBlob; m_nPair = (int)nPair2; CBlobStorage::BlobDefect(); CBlobStorage::MergeDivision(oldBlob, m_Param.m_nDefectMergePixel); CBlobStorage::ShadowFilter(oldBlob, m_Param.GetRealConvPitch()); m_Param.s_nThreshold = nThres; m_Param.s_nDThSlide = nDThSlide; m_Param.s_dPitchConvReal = dPitchConvReal; m_Param.s_dPitchScanReal = dPitchScanReal; return (int)nPair2; } int CSISAssem::ConvPixelVertS_Intrin_Twice(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 , __int64 ThresholdSlide, __int64 ThresholdSuppress, __int64 bUseUnpair, short* pConBuff , int* endLine, __int64 ExTh, __int64 iPitch2, __int64 Threshold2 , __int64 ThresholdSlide2 ) { //°Å´ë °áÇÔÀ» °ËÃâÇϱâ À§ÇØ ÀåÁÖ±â·Î Çѹø´õ ºñ±³ÇÑ´Ù. __int64 nPair1 = ConvPixelVertS_Intrin(pImgBuff, Threshold, maxDefect, nDefect , left, right, top, bottom , DefectX, DefectY, DefectT, DefectValue , pGraySrc, pGrayCmp, pZoneID, pZoneTh , frameWidth, iPitch16, fSPR, sSPR , ZoneThTable, ZoneIdTable, ZoneTableWidth, pMatchTable , pDefectdPair, StartPair, MaxPair, PairSize , dxPattern, dyPattern, yZoneByte, bReverseFilter , ThresholdSlide, ThresholdSuppress, bUseUnpair, pConBuff , endLine, ExTh); __int64 nPair2 = ConvPixelVertS_Intrin(pImgBuff, Threshold2, maxDefect, nDefect , left, right, top, bottom , DefectX, DefectY, DefectT, DefectValue , pGraySrc, pGrayCmp, pZoneID, pZoneTh , frameWidth, iPitch2, fSPR, sSPR , ZoneThTable, ZoneIdTable, ZoneTableWidth, pMatchTable , pDefectdPair, nPair1, MaxPair, PairSize , dxPattern, dyPattern, yZoneByte, bReverseFilter , ThresholdSlide2, ThresholdSuppress, bUseUnpair, pConBuff , endLine, ExTh); //Æä¾î¸µµÈ °áÇÔÁß °°Àº ÁÂÇ¥ÀÇ Pair ´Â Áö¿î´Ù. __int64 iPair1, iPair2; CDefectPair *pPair1, *pPair2; for(iPair1= StartPair; iPair1 < nPair1; iPair1++) { pPair1= pDefectdPair+ iPair1; if(pPair1->s_DefectType == DEFTYPE_DELETE) continue; for(iPair2= nPair1; iPair2 < nPair2; iPair2++) { pPair2= pDefectdPair+ iPair2; if(pPair2->s_DefectType == DEFTYPE_DELETE) continue; if(pPair1->s_nDefectX < pPair2->s_nDefectX - 1) break; if(pPair1->s_nDefectY < pPair2->s_nDefectY - 1) continue; if(abs(pPair1->s_nDefectX - pPair2->s_nDefectX) < 2 && abs(pPair1->s_nDefectY - pPair2->s_nDefectY) < 2) pPair2->s_DefectType = DEFTYPE_DELETE; } } int oldBlob = m_nBlob; m_nPair = (int)nPair1; CBlobStorage::BlobDefectVert(); CBlobStorage::MergeDivision(oldBlob, m_Param.m_nDefectMergePixel); CBlobStorage::ShadowFilterVert(oldBlob, m_Param.GetRealScanPitch()); int nThres = m_Param.s_nThreshold; int nDThSlide = m_Param.s_nDThSlide; double dPitchConvReal = m_Param.s_dPitchConvReal; double dPitchScanReal = m_Param.s_dPitchScanReal; m_Param.s_nThreshold = m_Param.s_n2ndThres; m_Param.s_nDThSlide = m_Param.s_n2ndThresSlide; m_Param.s_dPitchConvReal = m_Param.s_d2ndPitch; m_Param.s_dPitchScanReal = m_Param.s_d2ndPitch; oldBlob = m_nBlob; m_nPair = (int)nPair2; CBlobStorage::BlobDefectVert(); CBlobStorage::MergeDivision(oldBlob, m_Param.m_nDefectMergePixel); CBlobStorage::ShadowFilterVert(oldBlob, m_Param.GetRealScanPitch()); m_Param.s_nThreshold = nThres; m_Param.s_nDThSlide = nDThSlide; m_Param.s_dPitchConvReal = dPitchConvReal; m_Param.s_dPitchScanReal = dPitchScanReal; return (int)nPair2; }