#include "stdafx.h" #include "BlobStorage.h" #include #ifdef _DEBUG #define new DEBUG_NEW #endif #include "SISAssem.h" #include "AssemParam.h" //Assem->Intrinsic Convert(2by2 Vertical DTh) int CSISAssem::ConvFloatVert_BOE_Intrin(BYTE* pImgBuff, short* pConBuff, __int64 maxDefect, __int64 nDefect , __int64 left, __int64 right, __int64 top, __int64 bottom , int* DefectX, int* DefectY, short* DefectT, short* DefectValue , CDefectPair *pDefectdPair, __int64 nPair, __int64 MaxPair, __int64 PairSize , __int64 frameWidth, __int64 iPitch16, __int64 Threshold, __int64 Suppress , int* pGraySrc, int* pGrayCmp, int* pZoneID, int* pZoneTh , __int64 i2Pitch16, __int64 bReverseFilter, __int64 ThresholdSlide, int* endLine ) { const __int64 ConvNSprShift = 6; const __int64 SprShift = 4; const __int64 ConvShift = 2; const __int64 SprMulti = 16; const __int64 ConvMulti = 4; __int64 ix = left; __int64 iy = top; __int64 rrBW = frameWidth; __int64 rrNoD = nDefect; CDefectPair* PairAddr = pDefectdPair + nPair; __int64 F_Y2Insp; __int64 ImgAddr = (__int64)pImgBuff; __int64 ConAddr = __int64(pConBuff + 0x10); __int64 maxPixelD = maxDefect; __m128i xxSrc; __m128i xxCmp; __m128i xxPeak; __m128i xxPeakEx; __m128i xxSrc1; __m128i xxSrc2; __m128i xxCmp1; __int64 rax, rbx, rcx, rdx; __m128i xxZero = _mm_setzero_si128(); __m128i xxThres = _mm_set1_epi16((short)Threshold * SprMulti); __m128i xxDStart = _mm_set1_epi16((short)Threshold / ConvMulti); __m128i xxDSlide = _mm_set1_epi16((short)ThresholdSlide); __m128i xxSupp = _mm_set1_epi16((short)Suppress * SprMulti * ConvMulti); // ---- Èæ¹é°áÇÔ Â÷µî ¹®Åΰª Àû¿ë ---- // 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; } // ----------------------------------- // __int64 iPitch = iPitch16 / SprMulti; __int64 iPitchHUp = iPitch; __int64 iSpr = iPitch16 & 0xF; if(iSpr >= SprMulti / 2) iPitchHUp++; __m128i xxsSPR = _mm_set1_epi16((short)iSpr); __m128i xxfSPR = _mm_set1_epi16((short)SprMulti - (short)iSpr); __int64 i2Pitch = i2Pitch16 / SprMulti; __int64 i2Spr = i2Pitch16 & 0xF; bottom--; __int64 ConBottom = bottom; right = (right - left) / 16 * 16 + left; __int64 ImgAddrLeft = ImgAddr + top * rrBW + left; __int64 ConPitch = iPitch * 0x20; __int64 ConPitch2 = i2Pitch * 0x20; __int64 pairTop = top + iPitch; 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 rrImgAddr = ImgAddrLeft; __int64 rrConAddr = ConAddr; goto LOOP_X_CHECK; LOOP_X_TAIL: goto PAIRING_VERT; PAIRING_VERT_RETURN: ImgAddrLeft += 0x10; rrImgAddr = ImgAddrLeft; rrConAddr = ConAddr; iy = top; LOOP_X_CHECK: if(ix >= right) goto END_FUNC; //LOOP_X_BODY: goto MAKE_CONBUFF_BODY_TAIL_CHECK; MAKE_CONBUFF_RETURN: iy = top; rrConAddr = ConAddr; F_Y2Insp = 0; goto LOOP_Y_CHECK; LOOP_Y_TAIL: iy++; rrImgAddr += rrBW; rrConAddr += 0x20; LOOP_Y_CHECK: if(rrNoD >= maxPixelD) goto PAIRING_VERT; if(iy < bottom) goto LOOP_Y_BODY; ix += 8; if(F_Y2Insp >= 1) goto LOOP_X_TAIL; F_Y2Insp = 1; iy = top; rrConAddr = ConAddr + 0x10; goto LOOP_Y_BODY; MAKE_CONBUFF_BODY_TAIL_CHECK: xxSrc1 = _mm_loadu_si128((__m128i*) rrImgAddr); xxCmp1 = _mm_loadu_si128((__m128i*)(rrImgAddr + 1)); _mm_storeu_si128((__m128i*)(rrConAddr), _mm_add_epi16(_mm_unpacklo_epi8(xxSrc1, xxZero), _mm_unpacklo_epi8(xxCmp1, xxZero))); _mm_storeu_si128((__m128i*)(rrConAddr + 0x10), _mm_add_epi16(_mm_unpackhi_epi8(xxSrc1, xxZero), _mm_unpackhi_epi8(xxCmp1, xxZero))); rrImgAddr += rrBW; rrConAddr += 0x20; iy++; if(iy <= ConBottom) goto MAKE_CONBUFF_BODY_TAIL_CHECK; goto MAKE_CONBUFF_RETURN; LOOP_Y_BODY: xxSrc1 = _mm_loadu_si128((__m128i*) rrConAddr); xxSrc2 = _mm_loadu_si128((__m128i*) (rrConAddr + 0x20)); xxSrc = _mm_slli_epi16(_mm_add_epi16(xxSrc1, xxSrc2), SprShift); xxSrc = _mm_subs_epu16(xxSrc, _mm_subs_epu16(xxSrc, xxSupp)); rax = rrConAddr + ConPitch; xxCmp = _mm_add_epi16(_mm_add_epi16(_mm_mullo_epi16(_mm_loadu_si128((__m128i*)(rax)), xxfSPR), _mm_slli_epi16(_mm_loadu_si128((__m128i*)(rax + 0x20)), SprShift)) , _mm_mullo_epi16(_mm_loadu_si128((__m128i*)(rax + 0x40)), xxsSPR)); xxCmp = _mm_subs_epu16(xxCmp, _mm_subs_epu16(xxCmp, xxSupp)); // ---- Èæ¹é°áÇÔ Â÷µî ¹®Åΰª Àû¿ë ---- // //¿ø·¡ÄÚµå: xxThres = _mm_slli_epi16(_mm_add_epi16(_mm_srli_epi16(_mm_mullo_epi16(_mm_srli_epi16( // _mm_max_epi16(xxSrc, xxCmp), ConvNSprShift), xxDSlide), 8), xxDStart), ConvNSprShift); xxZThW = _mm_slli_epi16(_mm_add_epi16(_mm_srli_epi16(_mm_mullo_epi16(_mm_srli_epi16( _mm_max_epi16(xxSrc, xxCmp), ConvNSprShift), xxDSlide), 8), xxDStart), ConvNSprShift); xxZThB = _mm_slli_epi16(_mm_add_epi16(_mm_srli_epi16(_mm_mullo_epi16(_mm_srli_epi16( _mm_max_epi16(xxSrc, xxCmp), ConvNSprShift), xxDSlideB), 8), xxDStartB), ConvNSprShift); xxThres = _mm_min_epu16(xxZThW, xxZThB); // ----------------------------------- // //INSPECT_BLACK: xxPeakEx = _mm_subs_epu16(xxCmp, xxSrc); xxPeak = _mm_cmpgt_epi16(xxPeakEx, xxThres); if(_mm_movemask_epi8(xxPeak) == 0) goto INSPECT_WHITE; rbx = 0; goto DEFECT_00; INSPECT_WHITE: xxPeakEx = _mm_subs_epu16(xxSrc, xxCmp); xxPeak = xxPeakEx; xxPeak = _mm_cmpgt_epi16(xxPeak, xxThres); if(_mm_movemask_epi8(xxPeak) == 0) goto LOOP_Y_TAIL; rbx = 1; goto DEFECT_00; DEFECT_00: if(_mm_extract_epi16(xxPeak, 0x00) == 0) goto DEFECT_01; rax = _mm_extract_epi16(xxPeakEx, 0x00); rax = rax >> ConvNSprShift; *(DefectX + rrNoD) = (int)ix; *(DefectY + rrNoD) = (int)iy; *(DefectT + rrNoD) = (int)rbx; *(DefectValue + rrNoD) = (int)rax; rax = _mm_extract_epi16(xxSrc, 0x00); *(pGraySrc + rrNoD) = (int)rax; rax = _mm_extract_epi16(xxCmp, 0x00); *(pGrayCmp + rrNoD) = (int)rax; rax = _mm_extract_epi16(xxThres, 0x00); *(pZoneTh + rrNoD) = (int)rax; rrNoD++; DEFECT_01: ix++; if(_mm_extract_epi16(xxPeak, 0x01) == 0) goto DEFECT_02; rax = _mm_extract_epi16(xxPeakEx, 0x01); rax = rax >> ConvNSprShift; *(DefectX + rrNoD) = (int)ix; *(DefectY + rrNoD) = (int)iy; *(DefectT + rrNoD) = (int)rbx; *(DefectValue + rrNoD) = (int)rax; rax = _mm_extract_epi16(xxSrc, 0x01); *(pGraySrc + rrNoD) = (int)rax; rax = _mm_extract_epi16(xxCmp, 0x01); *(pGrayCmp + rrNoD) = (int)rax; rax = _mm_extract_epi16(xxThres, 0x01); *(pZoneTh + rrNoD) = (int)rax; rrNoD++; DEFECT_02: ix++; if(_mm_extract_epi16(xxPeak, 0x02) == 0) goto DEFECT_03; rax = _mm_extract_epi16(xxPeakEx, 0x02); rax = rax >> ConvNSprShift; *(DefectX + rrNoD) = (int)ix; *(DefectY + rrNoD) = (int)iy; *(DefectT + rrNoD) = (int)rbx; *(DefectValue + rrNoD) = (int)rax; rax = _mm_extract_epi16(xxSrc, 0x02); *(pGraySrc + rrNoD) = (int)rax; rax = _mm_extract_epi16(xxCmp, 0x02); *(pGrayCmp + rrNoD) = (int)rax; rax = _mm_extract_epi16(xxThres, 0x02); *(pZoneTh + rrNoD) = (int)rax; rrNoD++; DEFECT_03: ix++; if(_mm_extract_epi16(xxPeak, 0x03) == 0) goto DEFECT_04; rax = _mm_extract_epi16(xxPeakEx, 0x03); rax = rax >> ConvNSprShift; *(DefectX + rrNoD) = (int)ix; *(DefectY + rrNoD) = (int)iy; *(DefectT + rrNoD) = (int)rbx; *(DefectValue + rrNoD) = (int)rax; rax = _mm_extract_epi16(xxSrc, 0x03); *(pGraySrc + rrNoD) = (int)rax; rax = _mm_extract_epi16(xxCmp, 0x03); *(pGrayCmp + rrNoD) = (int)rax; rax = _mm_extract_epi16(xxThres, 0x03); *(pZoneTh + rrNoD) = (int)rax; rrNoD++; DEFECT_04: ix++; if(_mm_extract_epi16(xxPeak, 0x04) == 0) goto DEFECT_05; rax = _mm_extract_epi16(xxPeakEx, 0x04); rax = rax >> ConvNSprShift; *(DefectX + rrNoD) = (int)ix; *(DefectY + rrNoD) = (int)iy; *(DefectT + rrNoD) = (int)rbx; *(DefectValue + rrNoD) = (int)rax; rax = _mm_extract_epi16(xxSrc, 0x04); *(pGraySrc + rrNoD) = (int)rax; rax = _mm_extract_epi16(xxCmp, 0x04); *(pGrayCmp + rrNoD) = (int)rax; rax = _mm_extract_epi16(xxThres, 0x04); *(pZoneTh + rrNoD) = (int)rax; rrNoD++; DEFECT_05: ix++; if(_mm_extract_epi16(xxPeak, 0x05) == 0) goto DEFECT_06; rax = _mm_extract_epi16(xxPeakEx, 0x05); rax = rax >> ConvNSprShift; *(DefectX + rrNoD) = (int)ix; *(DefectY + rrNoD) = (int)iy; *(DefectT + rrNoD) = (int)rbx; *(DefectValue + rrNoD) = (int)rax; rax = _mm_extract_epi16(xxSrc, 0x05); *(pGraySrc + rrNoD) = (int)rax; rax = _mm_extract_epi16(xxCmp, 0x05); *(pGrayCmp + rrNoD) = (int)rax; rax = _mm_extract_epi16(xxThres, 0x05); *(pZoneTh + rrNoD) = (int)rax; rrNoD++; DEFECT_06: ix++; if(_mm_extract_epi16(xxPeak, 0x06) == 0) goto DEFECT_07; rax = _mm_extract_epi16(xxPeakEx, 0x06); rax = rax >> ConvNSprShift; *(DefectX + rrNoD) = (int)ix; *(DefectY + rrNoD) = (int)iy; *(DefectT + rrNoD) = (int)rbx; *(DefectValue + rrNoD) = (int)rax; rax = _mm_extract_epi16(xxSrc, 0x06); *(pGraySrc + rrNoD) = (int)rax; rax = _mm_extract_epi16(xxCmp, 0x06); *(pGrayCmp + rrNoD) = (int)rax; rax = _mm_extract_epi16(xxThres, 0x06); *(pZoneTh + rrNoD) = (int)rax; rrNoD++; DEFECT_07: ix++; if(_mm_extract_epi16(xxPeak, 0x07) == 0) goto DEFECT_END; rax = _mm_extract_epi16(xxPeakEx, 0x07); rax = rax >> ConvNSprShift; *(DefectX + rrNoD) = (int)ix; *(DefectY + rrNoD) = (int)iy; *(DefectT + rrNoD) = (int)rbx; *(DefectValue + rrNoD) = (int)rax; rax = _mm_extract_epi16(xxSrc, 0x07); *(pGraySrc + rrNoD) = (int)rax; rax = _mm_extract_epi16(xxCmp, 0x07); *(pGrayCmp + rrNoD) = (int)rax; rax = _mm_extract_epi16(xxThres, 0x07); *(pZoneTh + rrNoD) = (int)rax; rrNoD++; DEFECT_END: ix -= 7; if(rbx == 0) goto INSPECT_WHITE; goto LOOP_Y_TAIL; PAIRING_VERT: iy = -1; LOOP_PAIR_NUM: iy++; if(iy >= rrNoD) goto LOOP_PAIR_NUM_END; rax = nPair; if(nPair >= MaxPair) goto END_FUNC; if(*(DefectT + iy) >= 3) goto LOOP_PAIR_NUM; rbx = iy; rcx = *(DefectY + iy); rax = rcx + iPitchHUp; rrBW = *(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(rrBW != rcx) goto PAIR_TOP; rrConAddr = *(DefectT + rbx); if(rrConAddr >= 3) goto LOOP_PAIR_NUM; rax = (__int64)*(DefectT + iy); if(rax == rrConAddr) 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 / 4) * 64; else sThres = (short)(sRef * m_Param.s_nBWB_Slide / 256 + m_Param.s_nBWB_Main) * 64; *(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)rrConAddr; PairAddr->s_fDefectPeak = (int)*(DefectValue + rbx); PairAddr->s_nGraySrc = (int)(sSrc / 64); PairAddr->s_nGrayRef = (int)(sRef / 64); PairAddr->s_nThresold = (int)(sThres / 64); PairAddr++; nPair++; goto LOOP_PAIR_NUM; PAIR_TOP_UNPAIR: if(m_Param.m_bUseUnpair == FALSE) goto LOOP_PAIR_NUM; // -------------- à» Filtering -------------- // ptDefect.x = (LONG)(rrBW); 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 / 4) * 64; else sThres = (short)(sRef * m_Param.s_nBWB_Slide / 256 + m_Param.s_nBWB_Main) * 64; *(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 / 64); PairAddr->s_nGrayRef = (int)(sRef / 64); PairAddr->s_nThresold = (int)(sThres / 64); 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(rrBW != rcx) goto PAIR_CENTER; rrConAddr = *(DefectT + rbx); if(rrConAddr >= 3) goto LOOP_PAIR_NUM; rax = (__int64)*(DefectT + iy); if(rax == rrConAddr) 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 / 4) * 64; else sThres = (short)(sRef * m_Param.s_nBWB_Slide / 256 + m_Param.s_nBWB_Main) * 64; *(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)rrConAddr; PairAddr->s_fDefectPeak = (int)*(DefectValue + rbx); PairAddr->s_nGraySrc = (int)(sSrc / 64); PairAddr->s_nGrayRef = (int)(sRef / 64); PairAddr->s_nThresold = (int)(sThres / 64); PairAddr++; nPair++; goto LOOP_PAIR_NUM; PAIR_BOTTOM: if(m_Param.m_bUseUnpair == FALSE) goto LOOP_PAIR_NUM; // -------------- à» Filtering -------------- // ptDefect.x = (LONG)rrBW; 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 / 4) * 64; else sThres = (short)(sRef * m_Param.s_nBWB_Slide / 256 + m_Param.s_nBWB_Main) * 64; *(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)rrBW; 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 / 64); PairAddr->s_nGrayRef = (int)(sRef / 64); PairAddr->s_nThresold = (int)(sThres / 64); PairAddr++; nPair++; goto LOOP_PAIR_NUM; LOOP_PAIR_NUM_END: rrNoD = 0; rrBW = frameWidth; goto PAIRING_VERT_RETURN; END_FUNC: ix += 0x10; *endLine = (int)ix; return (int)nPair; } //Assem->Intrinsic Convert(2by2 Vertical DTh DPC) int CSISAssem::ConvFloatVTD_BOE_Intrin(BYTE* pImgBuff, short* pConBuff, __int64 maxDefect, __int64 nDefect , __int64 left, __int64 right, __int64 top, __int64 bottom , int* DefectX, int* DefectY, short* DefectT, short* DefectValue , CDefectPair *pDefectdPair, __int64 nPair, __int64 MaxPair, __int64 PairSize , __int64 frameWidth, __int64 iPitch16, __int64 Threshold, __int64 Suppress , short* i2Pitch16, __int64 tilt16, int* PitchBuff, __int64 ThresholdSlide , int* pGraySrc, int* pGrayCmp, int* pZoneID, int* pZoneTh , int* endLine ) { const __int64 ConvNSprShift = 6; const __int64 SprShift = 4; const __int64 ConvShift = 2; const __int64 SprMulti = 16; const __int64 ConvMulti = 4; __int64 ix = left; __int64 iy = top; __int64 rrNoD = nDefect; CDefectPair* PairAddr = pDefectdPair + nPair; __int64 F_Y2Insp; __int64 ImgAddr = (__int64)pImgBuff; __int64 ConAddr = __int64(pConBuff + 0x10); __int64 ConAddr2 = __int64(i2Pitch16 + 0x10); __int64 maxPixelD = maxDefect; __int64 iPitchLast = 0; __m128i xxTemp; __m128i xxSrc; __m128i xxCmp; __m128i xxPeak; __m128i xxPeakAbs; __m128i xxSrc1; __m128i xxCmp1; __m128i xxfSprT; __m128i xxsSprT; __int64 rax, rbx, rcx, rdx; __m128i xxZero = _mm_setzero_si128(); __m128i xxThres = _mm_set1_epi16((short)Threshold * SprMulti); __m128i xxDStart = _mm_set1_epi16((short)Threshold / ConvMulti); __m128i xxDSlide = _mm_set1_epi16((short)ThresholdSlide); __m128i xxSupp = _mm_set1_epi16((short)Suppress * SprMulti * ConvMulti); // ---- Èæ¹é°áÇÔ Â÷µî ¹®Åΰª Àû¿ë ---- // 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 = tilt16; rcx &= 0x0f; xxsSprT = _mm_set1_epi16((short)rcx); rax = SprMulti; rax -= rcx; xxfSprT = _mm_set1_epi16((short)rax); tilt16 /= 16; __int64 iPitch = iPitch16 / SprMulti; __int64 iPitchHUp = iPitch; __int64 iSpr = iPitch16 & 0xF; if(iSpr >= SprMulti / 2) iPitchHUp++; __m128i xxsSPR = _mm_set1_epi16((short)iSpr); __m128i xxfSPR = _mm_set1_epi16((short)SprMulti - (short)iSpr); bottom--; __int64 ConBottom = bottom; right = (right - left) / 16 * 16 + left; __int64 ImgAddrLeft = ImgAddr + top * frameWidth + left; __int64 ConPitch = iPitch * 0x20; // -------------- à» 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; bottom = bottom - iPitch - 1; __int64 pairBottom = bottom - iPitch; __int64 rrImgAddr = ImgAddrLeft; __int64 rrConAddr = ConAddr; __int64 rrConAddr2 = ConAddr2; goto LOOP_X_CHECK; LOOP_X_TAIL: goto PAIRING_VERT; PAIRING_VERT_RETURN: ImgAddrLeft += 0x10; rrImgAddr = ImgAddrLeft; rrConAddr = ConAddr; rrConAddr2 = ConAddr2; iy = top; LOOP_X_CHECK: if(ix >= right) goto END_FUNC; //LOOP_X_BODY: iy = top; rrImgAddr = ImgAddrLeft; rrConAddr = ConAddr; rrConAddr2 = ConAddr2; goto MAKE_CONBUFF_BODY_TAIL_CHECK; MAKE_CONBUFF_RETURN: iy = top; rrImgAddr = ImgAddrLeft; rrConAddr = ConAddr; rrConAddr2 = ConAddr2; goto MAKE_CONBUFF2_HEAD; MAKE_CONBUFF2_RETURN: iy = top; rrImgAddr = ImgAddrLeft; rrConAddr = ConAddr; rrConAddr2 = ConAddr2; F_Y2Insp = 0; goto LOOP_Y_CHECK; DPC_READ: if(PitchBuff == NULL) goto DPC_READ_RETURN; rax = *(PitchBuff + iy / 16); if(rax == iPitchLast) goto DPC_READ_RETURN; iPitchLast = rax; rbx = rax; rbx &= 0x0f; rax /= 16; rax *= 32; ConPitch = rax; xxsSPR = _mm_set1_epi16((short)rbx); rdx = SprMulti; rdx -= rbx; xxfSPR = _mm_set1_epi16((short)rdx); goto DPC_READ_RETURN; LOOP_Y_TAIL: iy++; rrImgAddr += frameWidth; rrConAddr += 0x20; rrConAddr2 += 0x20; LOOP_Y_CHECK: if(rrNoD >= maxPixelD) goto PAIRING_VERT; if(iy < bottom) goto LOOP_Y_BODY; ix += 8; if(F_Y2Insp >= 1) goto LOOP_X_TAIL; F_Y2Insp = 1; iy = top; rrConAddr = ConAddr; rrConAddr += 0x10; rrConAddr2 = ConAddr2; rrConAddr2 += 0x10; goto LOOP_Y_BODY; MAKE_CONBUFF_BODY_TAIL_CHECK: xxSrc = _mm_loadu_si128((__m128i*) rrImgAddr); xxSrc1 = xxSrc; xxSrc = _mm_unpacklo_epi8(xxSrc, xxZero); xxSrc1 = _mm_unpackhi_epi8(xxSrc1, xxZero); xxCmp = _mm_loadu_si128((__m128i*)(rrImgAddr + 1)); xxCmp1 = xxCmp; xxCmp = _mm_unpacklo_epi8(xxCmp, xxZero); xxCmp1 = _mm_unpackhi_epi8(xxCmp1, xxZero); xxSrc = _mm_add_epi16(xxSrc, xxCmp); xxSrc1 = _mm_add_epi16(xxSrc1, xxCmp1); _mm_storeu_si128((__m128i*)(rrConAddr), xxSrc); _mm_storeu_si128((__m128i*)(rrConAddr + 0x10), xxSrc1); rrImgAddr += frameWidth; rrConAddr += 0x20; iy++; if(iy <= ConBottom) goto MAKE_CONBUFF_BODY_TAIL_CHECK; goto MAKE_CONBUFF_RETURN; MAKE_CONBUFF2_HEAD: rax = rrImgAddr; rax += tilt16; rrConAddr2 = ConAddr2; MAKE_CONBUFF2_BODY: xxSrc = _mm_loadu_si128((__m128i*) rax); xxSrc1 = xxSrc; xxSrc = _mm_unpacklo_epi8(xxSrc, xxZero); xxSrc1 = _mm_unpackhi_epi8(xxSrc1, xxZero); xxSrc = _mm_mullo_epi16(xxSrc, xxfSprT); xxSrc1 = _mm_mullo_epi16(xxSrc1, xxfSprT); xxCmp = _mm_loadu_si128((__m128i*)(rax + 2)); xxCmp1 = xxCmp; xxCmp = _mm_unpacklo_epi8(xxCmp, xxZero); xxCmp1 = _mm_unpackhi_epi8(xxCmp1, xxZero); xxCmp = _mm_mullo_epi16(xxCmp, xxsSprT); xxCmp1 = _mm_mullo_epi16(xxCmp1, xxsSprT); xxSrc = _mm_add_epi16(xxSrc, xxCmp); xxSrc1 = _mm_add_epi16(xxSrc1, xxCmp1); xxSrc = _mm_srli_epi16(xxSrc, SprShift); xxSrc1 = _mm_srli_epi16(xxSrc1, SprShift); xxCmp = _mm_loadu_si128((__m128i*)(rax + 1)); xxCmp1 = xxCmp; xxCmp = _mm_unpacklo_epi8(xxCmp, xxZero); xxCmp1 = _mm_unpackhi_epi8(xxCmp1, xxZero); xxSrc = _mm_add_epi16(xxSrc, xxCmp); xxSrc1 = _mm_add_epi16(xxSrc1, xxCmp1); _mm_storeu_si128((__m128i*)(rrConAddr2), xxSrc); _mm_storeu_si128((__m128i*)(rrConAddr2 + 0x10), xxSrc1); rax += frameWidth; rrConAddr2 += 0x20; iy++; if(iy <= ConBottom) goto MAKE_CONBUFF2_BODY; goto MAKE_CONBUFF2_RETURN; LOOP_Y_BODY: goto DPC_READ; DPC_READ_RETURN: xxSrc1 = _mm_loadu_si128((__m128i*) rrConAddr); xxTemp = _mm_loadu_si128((__m128i*) (rrConAddr + 0x20)); xxSrc = xxSrc1; xxSrc = _mm_add_epi16(xxSrc, xxTemp); xxSrc = _mm_slli_epi16(xxSrc, SprShift); xxTemp = xxSrc; xxTemp = _mm_subs_epu16(xxTemp, xxSupp); xxSrc = _mm_subs_epu16(xxSrc, xxTemp); rax = rrConAddr2 + ConPitch; xxCmp1 = _mm_loadu_si128((__m128i*)(rax)); xxCmp = xxCmp1; xxCmp = _mm_mullo_epi16(xxCmp, xxfSPR); xxCmp1 = _mm_loadu_si128((__m128i*)(rax + 0x20)); xxTemp = xxCmp1; xxTemp = _mm_slli_epi16(xxTemp, SprShift); xxCmp = _mm_add_epi16(xxCmp, xxTemp); xxTemp = _mm_loadu_si128((__m128i*)(rax + 0x40)); xxTemp = _mm_mullo_epi16(xxTemp, xxsSPR); xxCmp = _mm_add_epi16(xxCmp, xxTemp); xxTemp = xxCmp; xxTemp = _mm_subs_epu16(xxTemp, xxSupp); xxCmp = _mm_subs_epu16(xxCmp, xxTemp); xxThres = xxSrc; xxThres = _mm_max_epi16(xxThres, xxCmp); xxThres = _mm_srli_epi16(xxThres, ConvNSprShift); xxThres = _mm_mullo_epi16(xxThres, xxDSlide); xxThres = _mm_srli_epi16(xxThres, 8); xxThres = _mm_add_epi16(xxThres, xxDStart); xxThres = _mm_slli_epi16(xxThres, ConvNSprShift); // ---- Èæ¹é°áÇÔ Â÷µî ¹®Åΰª Àû¿ë ---- // /*¿ø·¡ÄÚµå: xxThres = xxSrc; xxThres = _mm_max_epi16(xxThres, xxCmp); xxThres = _mm_srli_epi16(xxThres, ConvNSprShift); xxThres = _mm_mullo_epi16(xxThres, xxDSlide); xxThres = _mm_srli_epi16(xxThres, 8); xxThres = _mm_add_epi16(xxThres, xxDStart); xxThres = _mm_slli_epi16(xxThres, ConvNSprShift); */ xxZThW = _mm_slli_epi16(_mm_add_epi16(_mm_srli_epi16(_mm_mullo_epi16(_mm_srli_epi16( _mm_max_epi16(xxSrc, xxCmp), ConvNSprShift), xxDSlide), 8), xxDStart), ConvNSprShift); xxZThB = _mm_slli_epi16(_mm_add_epi16(_mm_srli_epi16(_mm_mullo_epi16(_mm_srli_epi16( _mm_max_epi16(xxSrc, xxCmp), ConvNSprShift), xxDSlideB), 8), xxDStartB), ConvNSprShift); xxThres = _mm_min_epu16(xxZThW, xxZThB); // ----------------------------------- // //INSPECT_BLACK: xxPeakAbs = xxCmp; xxPeakAbs = _mm_subs_epu16(xxPeakAbs, xxSrc); xxPeak = xxPeakAbs; xxPeak = _mm_cmpgt_epi16(xxPeak, xxThres); rax = _mm_movemask_epi8(xxPeak); if(rax == 0) goto INSPECT_WHITE; rbx = 0; goto DEFECT_00; INSPECT_WHITE: xxPeakAbs = xxSrc; xxPeakAbs = _mm_subs_epu16(xxPeakAbs, xxCmp); xxPeak = xxPeakAbs; xxPeak = _mm_cmpgt_epi16(xxPeak, xxThres); rax = _mm_movemask_epi8(xxPeak); if(rax == 0) goto LOOP_Y_TAIL; rbx = 1; goto DEFECT_00; DEFECT_00: rax = _mm_extract_epi16(xxPeak, 0x00); if(rax == 0) goto DEFECT_01; rax = _mm_extract_epi16(xxPeakAbs, 0x00); rax = rax >> ConvNSprShift; *(DefectX + rrNoD) = (int)ix; *(DefectY + rrNoD) = (int)iy; *(DefectT + rrNoD) = (int)rbx; *(DefectValue + rrNoD) = (int)rax; rax = _mm_extract_epi16(xxSrc, 0x00); *(pGraySrc + rrNoD) = (int)rax; rax = _mm_extract_epi16(xxCmp, 0x00); *(pGrayCmp + rrNoD) = (int)rax; rax = _mm_extract_epi16(xxThres, 0x00); *(pZoneTh + rrNoD) = (int)rax; rrNoD++; DEFECT_01: ix++; rax = _mm_extract_epi16(xxPeak, 0x01); if(rax == 0) goto DEFECT_02; rax = _mm_extract_epi16(xxPeakAbs, 0x01); rax = rax >> ConvNSprShift; *(DefectX + rrNoD) = (int)ix; *(DefectY + rrNoD) = (int)iy; *(DefectT + rrNoD) = (int)rbx; *(DefectValue + rrNoD) = (int)rax; rax = _mm_extract_epi16(xxSrc, 0x01); *(pGraySrc + rrNoD) = (int)rax; rax = _mm_extract_epi16(xxCmp, 0x01); *(pGrayCmp + rrNoD) = (int)rax; rax = _mm_extract_epi16(xxThres, 0x01); *(pZoneTh + rrNoD) = (int)rax; rrNoD++; DEFECT_02: ix++; rax = _mm_extract_epi16(xxPeak, 0x02); if(rax == 0) goto DEFECT_03; rax = _mm_extract_epi16(xxPeakAbs, 0x02); rax = rax >> ConvNSprShift; *(DefectX + rrNoD) = (int)ix; *(DefectY + rrNoD) = (int)iy; *(DefectT + rrNoD) = (int)rbx; *(DefectValue + rrNoD) = (int)rax; rax = _mm_extract_epi16(xxSrc, 0x02); *(pGraySrc + rrNoD) = (int)rax; rax = _mm_extract_epi16(xxCmp, 0x02); *(pGrayCmp + rrNoD) = (int)rax; rax = _mm_extract_epi16(xxThres, 0x02); *(pZoneTh + rrNoD) = (int)rax; rrNoD++; DEFECT_03: ix++; rax = _mm_extract_epi16(xxPeak, 0x03); if(rax == 0) goto DEFECT_04; rax = _mm_extract_epi16(xxPeakAbs, 0x03); rax = rax >> ConvNSprShift; *(DefectX + rrNoD) = (int)ix; *(DefectY + rrNoD) = (int)iy; *(DefectT + rrNoD) = (int)rbx; *(DefectValue + rrNoD) = (int)rax; rax = _mm_extract_epi16(xxSrc, 0x03); *(pGraySrc + rrNoD) = (int)rax; rax = _mm_extract_epi16(xxCmp, 0x03); *(pGrayCmp + rrNoD) = (int)rax; rax = _mm_extract_epi16(xxThres, 0x03); *(pZoneTh + rrNoD) = (int)rax; rrNoD++; DEFECT_04: ix++; rax = _mm_extract_epi16(xxPeak, 0x04); if(rax == 0) goto DEFECT_05; rax = _mm_extract_epi16(xxPeakAbs, 0x04); rax = rax >> ConvNSprShift; *(DefectX + rrNoD) = (int)ix; *(DefectY + rrNoD) = (int)iy; *(DefectT + rrNoD) = (int)rbx; *(DefectValue + rrNoD) = (int)rax; rax = _mm_extract_epi16(xxSrc, 0x04); *(pGraySrc + rrNoD) = (int)rax; rax = _mm_extract_epi16(xxCmp, 0x04); *(pGrayCmp + rrNoD) = (int)rax; rax = _mm_extract_epi16(xxThres, 0x04); *(pZoneTh + rrNoD) = (int)rax; rrNoD++; DEFECT_05: ix++; rax = _mm_extract_epi16(xxPeak, 0x05); if(rax == 0) goto DEFECT_06; rax = _mm_extract_epi16(xxPeakAbs, 0x05); rax = rax >> ConvNSprShift; *(DefectX + rrNoD) = (int)ix; *(DefectY + rrNoD) = (int)iy; *(DefectT + rrNoD) = (int)rbx; *(DefectValue + rrNoD) = (int)rax; rax = _mm_extract_epi16(xxSrc, 0x05); *(pGraySrc + rrNoD) = (int)rax; rax = _mm_extract_epi16(xxCmp, 0x05); *(pGrayCmp + rrNoD) = (int)rax; rax = _mm_extract_epi16(xxThres, 0x05); *(pZoneTh + rrNoD) = (int)rax; rrNoD++; DEFECT_06: ix++; rax = _mm_extract_epi16(xxPeak, 0x06); if(rax == 0) goto DEFECT_07; rax = _mm_extract_epi16(xxPeakAbs, 0x06); rax = rax >> ConvNSprShift; *(DefectX + rrNoD) = (int)ix; *(DefectY + rrNoD) = (int)iy; *(DefectT + rrNoD) = (int)rbx; *(DefectValue + rrNoD) = (int)rax; rax = _mm_extract_epi16(xxSrc, 0x06); *(pGraySrc + rrNoD) = (int)rax; rax = _mm_extract_epi16(xxCmp, 0x06); *(pGrayCmp + rrNoD) = (int)rax; rax = _mm_extract_epi16(xxThres, 0x06); *(pZoneTh + rrNoD) = (int)rax; rrNoD++; DEFECT_07: ix++; rax = _mm_extract_epi16(xxPeak, 0x07); if(rax == 0) goto DEFECT_END; rax = _mm_extract_epi16(xxPeakAbs, 0x07); rax = rax >> ConvNSprShift; *(DefectX + rrNoD) = (int)ix; *(DefectY + rrNoD) = (int)iy; *(DefectT + rrNoD) = (int)rbx; *(DefectValue + rrNoD) = (int)rax; rax = _mm_extract_epi16(xxSrc, 0x07); *(pGraySrc + rrNoD) = (int)rax; rax = _mm_extract_epi16(xxCmp, 0x07); *(pGrayCmp + rrNoD) = (int)rax; rax = _mm_extract_epi16(xxThres, 0x07); *(pZoneTh + rrNoD) = (int)rax; rrNoD++; DEFECT_END: ix -= 7; if(rbx == 0) goto INSPECT_WHITE; goto LOOP_Y_TAIL; 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; rrConAddr2 = *(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(rrConAddr2 != rcx) goto PAIR_TOP; rrConAddr = *(DefectT + rbx); if(rrConAddr >= 3) goto LOOP_PAIR_NUM; rax = (__int64)*(DefectT + iy); if(rax == rrConAddr) 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 / 4) * 64; else sThres = (short)(sRef * m_Param.s_nBWB_Slide / 256 + m_Param.s_nBWB_Main) * 64; *(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)rrConAddr; PairAddr->s_fDefectPeak = (int)*(DefectValue + rbx); PairAddr->s_nGraySrc = (int)(sSrc / 64); PairAddr->s_nGrayRef = (int)(sRef / 64); PairAddr->s_nThresold = (int)(sThres / 64); PairAddr++; nPair++; goto LOOP_PAIR_NUM; PAIR_TOP_UNPAIR: if(m_Param.m_bUseUnpair == FALSE) goto LOOP_PAIR_NUM; // -------------- à» Filtering -------------- // ptDefect.x = (LONG)(rrConAddr2); 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 / 4) * 64; else sThres = (short)(sRef * m_Param.s_nBWB_Slide / 256 + m_Param.s_nBWB_Main) * 64; *(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 / 64); PairAddr->s_nGrayRef = (int)(sRef / 64); PairAddr->s_nThresold = (int)(sThres / 64); 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(rrConAddr2 != rcx) goto PAIR_CENTER; rrConAddr = *(DefectT + rbx); if(rrConAddr >= 3) goto LOOP_PAIR_NUM; rax = (__int64)*(DefectT + iy); if(rax == rrConAddr) 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 / 4) * 64; else sThres = (short)(sRef * m_Param.s_nBWB_Slide / 256 + m_Param.s_nBWB_Main) * 64; *(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)rrConAddr; PairAddr->s_fDefectPeak = (int)*(DefectValue + rbx); PairAddr->s_nGraySrc = (int)(sSrc / 64); PairAddr->s_nGrayRef = (int)(sRef / 64); PairAddr->s_nThresold = (int)(sThres / 64); PairAddr++; nPair++; goto LOOP_PAIR_NUM; PAIR_BOTTOM: if(m_Param.m_bUseUnpair == FALSE) goto LOOP_PAIR_NUM; // -------------- à» Filtering -------------- // ptDefect.x = (LONG)rrConAddr2; 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 / 4) * 64; else sThres = (short)(sRef * m_Param.s_nBWB_Slide / 256 + m_Param.s_nBWB_Main) * 64; *(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)rrConAddr2; 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 / 64); PairAddr->s_nGrayRef = (int)(sRef / 64); PairAddr->s_nThresold = (int)(sThres / 64); PairAddr++; nPair++; goto LOOP_PAIR_NUM; LOOP_PAIR_NUM_END: rrNoD = 0; goto PAIRING_VERT_RETURN; END_FUNC: ix += 0x10; *endLine = (int)ix; return (int)nPair; }