bool UPCEReader::decodeEnd(Ref<BitArray> row, int endStart, int* endGuardBegin, int* endGuardEnd) { return findGuardPattern(row, endStart, true, MIDDLE_END_PATTERN, sizeof(MIDDLE_END_PATTERN) / sizeof(int), endGuardBegin, endGuardEnd); }
int* UPCEANReader::decodeEnd(Ref<BitArray> row, int endStart){ return findGuardPattern(row, endStart, false, START_END_PATTERN, sizeof(START_END_PATTERN)/sizeof(int)); }
CFX_PtrArray* CBC_Detector::findRowsWithPattern(CBC_CommonBitMatrix* matrix, int32_t height, int32_t width, int32_t startRow, int32_t startColumn, int32_t* pattern, int32_t patternLength) { CFX_PtrArray* result = new CFX_PtrArray; result->SetSize(4); FX_BOOL found = FALSE; CFX_Int32Array counters; counters.SetSize(patternLength); for (; startRow < height; startRow += ROW_STEP) { CFX_Int32Array* loc = findGuardPattern(matrix, startColumn, startRow, width, FALSE, pattern, patternLength, counters); if (loc != NULL) { while (startRow > 0) { CFX_Int32Array* previousRowLoc = findGuardPattern(matrix, startColumn, --startRow, width, FALSE, pattern, patternLength, counters); if (previousRowLoc != NULL) { delete loc; loc = previousRowLoc; } else { startRow++; break; } } result->SetAt( 0, new CBC_ResultPoint((FX_FLOAT)loc->GetAt(0), (FX_FLOAT)startRow)); result->SetAt( 1, new CBC_ResultPoint((FX_FLOAT)loc->GetAt(1), (FX_FLOAT)startRow)); found = TRUE; delete loc; break; } } int32_t stopRow = startRow + 1; if (found) { int32_t skippedRowCount = 0; CFX_Int32Array previousRowLoc; previousRowLoc.Add((int32_t)((CBC_ResultPoint*)result->GetAt(0))->GetX()); previousRowLoc.Add((int32_t)((CBC_ResultPoint*)result->GetAt(1))->GetX()); for (; stopRow < height; stopRow++) { CFX_Int32Array* loc = findGuardPattern(matrix, previousRowLoc[0], stopRow, width, FALSE, pattern, patternLength, counters); if (loc != NULL && abs(previousRowLoc[0] - loc->GetAt(0)) < MAX_PATTERN_DRIFT && abs(previousRowLoc[1] - loc->GetAt(1)) < MAX_PATTERN_DRIFT) { previousRowLoc.Copy(*loc); skippedRowCount = 0; } else { if (skippedRowCount > SKIPPED_ROW_COUNT_MAX) { delete loc; break; } else { skippedRowCount++; } } delete loc; } stopRow -= skippedRowCount + 1; result->SetAt(2, new CBC_ResultPoint((FX_FLOAT)previousRowLoc.GetAt(0), (FX_FLOAT)stopRow)); result->SetAt(3, new CBC_ResultPoint((FX_FLOAT)previousRowLoc.GetAt(1), (FX_FLOAT)stopRow)); } if (stopRow - startRow < BARCODE_MIN_HEIGHT) { for (int32_t i = 0; i < result->GetSize(); i++) { result->SetAt(i, NULL); } } return result; }