X-Git-Url: http://git.rot13.org/?p=zxing.git;a=blobdiff_plain;f=cpp%2Fcore%2Fsrc%2Fzxing%2Foned%2FUPCEANReader.cpp;h=6f08e750c2cc34c589297a43be4b666316ac6c64;hp=cec13e468ff284c3c2d21bd830017eee5017e4d8;hb=45e643cea495289f6e95112482a3fd3086ef4431;hpb=30f0e5e9eeab4a85a378809bfa7007b128694138 diff --git a/cpp/core/src/zxing/oned/UPCEANReader.cpp b/cpp/core/src/zxing/oned/UPCEANReader.cpp index cec13e46..6f08e750 100644 --- a/cpp/core/src/zxing/oned/UPCEANReader.cpp +++ b/cpp/core/src/zxing/oned/UPCEANReader.cpp @@ -95,86 +95,85 @@ namespace zxing { Ref UPCEANReader::decodeRow(int rowNumber, Ref row) { - int* start = NULL; - try { - start = findStartGuardPattern(row); - Ref result = decodeRow(rowNumber, row, start); - delete [] start; - return result; - } catch (ReaderException const& re) { - delete [] start; - return Ref(); + int* start = findStartGuardPattern(row); + if (start != NULL) { + try { + Ref result = decodeRow(rowNumber, row, start); + delete [] start; + return result; + } catch (ReaderException const& re) { + delete [] start; + } } + return Ref(); } Ref UPCEANReader::decodeRow(int rowNumber, Ref row, int startGuardRange[]) { - int* endRange = NULL; - try { - std::string tmpResultString; - std::string& tmpResultStringRef = tmpResultString; - int endStart = decodeMiddle(row, startGuardRange, 2 /*reference findGuardPattern*/ , - tmpResultStringRef); - endRange = decodeEnd(row, endStart); - - // Make sure there is a quiet zone at least as big as the end pattern after the barcode. - // The spec might want more whitespace, but in practice this is the maximum we can count on. - size_t end = endRange[1]; - size_t quietEnd = end + (end - endRange[0]); - if (quietEnd >= row->getSize() || !row->isRange(end, quietEnd, false)) { - throw ReaderException("Quiet zone asserrt fail."); - } + std::string tmpResultString; + std::string& tmpResultStringRef = tmpResultString; + int endStart = decodeMiddle(row, startGuardRange, 2 /*reference findGuardPattern*/ , + tmpResultStringRef); + if (endStart < 0) { + return Ref(); + } + int* endRange = decodeEnd(row, endStart); + if (endRange == NULL) { + return Ref(); + } - if (!checkChecksum(tmpResultString)) { - throw ReaderException("Checksum fail."); - } + // Make sure there is a quiet zone at least as big as the end pattern after the barcode. + // The spec might want more whitespace, but in practice this is the maximum we can count on. + size_t end = endRange[1]; + size_t quietEnd = end + (end - endRange[0]); + if (quietEnd >= row->getSize() || !row->isRange(end, quietEnd, false)) { + delete [] endRange; + return Ref(); + } - Ref resultString(new String(tmpResultString)); + if (!checkChecksum(tmpResultString)) { + delete [] endRange; + return Ref(); + } - float left = (float) (startGuardRange[1] + startGuardRange[0]) / 2.0f; - float right = (float) (endRange[1] + endRange[0]) / 2.0f; + Ref resultString(new String(tmpResultString)); - std::vector< Ref > resultPoints(2); - Ref resultPoint1(new OneDResultPoint(left, (float) rowNumber)); - Ref resultPoint2(new OneDResultPoint(right, (float) rowNumber)); - resultPoints[0] = resultPoint1; - resultPoints[1] = resultPoint2; + float left = (float) (startGuardRange[1] + startGuardRange[0]) / 2.0f; + float right = (float) (endRange[1] + endRange[0]) / 2.0f; - ArrayRef resultBytes(1); + std::vector< Ref > resultPoints(2); + Ref resultPoint1(new OneDResultPoint(left, (float) rowNumber)); + Ref resultPoint2(new OneDResultPoint(right, (float) rowNumber)); + resultPoints[0] = resultPoint1; + resultPoints[1] = resultPoint2; - Ref res(new Result(resultString, resultBytes, resultPoints, getBarcodeFormat())); - delete [] endRange; - return res; - } catch (ReaderException const& re) { - delete [] endRange; - throw re; - } + ArrayRef resultBytes(1); + Ref res(new Result(resultString, resultBytes, resultPoints, getBarcodeFormat())); + delete [] endRange; + return res; } int* UPCEANReader::findStartGuardPattern(Ref row) { bool foundStart = false; int* startRange = NULL; int nextStart = 0; - try { - while (!foundStart) { - delete [] startRange; - startRange = NULL; - startRange = findGuardPattern(row, nextStart, false, START_END_PATTERN, - sizeof(START_END_PATTERN) / sizeof(int)); - int start = startRange[0]; - nextStart = startRange[1]; - // Make sure there is a quiet zone at least as big as the start pattern before the barcode. - // If this check would run off the left edge of the image, do not accept this barcode, - // as it is very likely to be a false positive. - int quietStart = start - (nextStart - start); - if (quietStart >= 0) { - foundStart = row->isRange(quietStart, start, false); - } - } - return startRange; - } catch (ReaderException const& re) { + while (!foundStart) { delete [] startRange; - throw re; + startRange = findGuardPattern(row, nextStart, false, START_END_PATTERN, + sizeof(START_END_PATTERN) / sizeof(int)); + if (startRange == NULL) { + return NULL; + } + int start = startRange[0]; + nextStart = startRange[1]; + // Make sure there is a quiet zone at least as big as the start pattern before the barcode. + // If this check would run off the left edge of the image, do not accept this barcode, + // as it is very likely to be a false positive. + int quietStart = start - (nextStart - start); + if (quietStart >= 0) { + foundStart = row->isRange(quietStart, start, false); + } } + return startRange; } // TODO(flyashi): Return a pair for return value to avoid using the heap. @@ -225,7 +224,7 @@ namespace zxing { isWhite = !isWhite; } } - throw ReaderException("findGuardPattern"); + return NULL; } int* UPCEANReader::decodeEnd(Ref row, int endStart) { @@ -233,10 +232,11 @@ namespace zxing { sizeof(START_END_PATTERN) / sizeof(int)); } -// int UPCEANReader::decodeDigit(Ref row, int counters[], int countersLen, int rowOffset, int** patterns/*[][]*/, int paterns1Len, int paterns2Len) int UPCEANReader::decodeDigit(Ref row, int counters[], int countersLen, int rowOffset, UPC_EAN_PATTERNS patternType) { - recordPattern(row, rowOffset, counters, countersLen); + if (!recordPattern(row, rowOffset, counters, countersLen)) { + return -1; + } unsigned int bestVariance = MAX_AVG_VARIANCE; // worst variance we'll accept int bestMatch = -1; @@ -277,14 +277,9 @@ namespace zxing { default: break; } - if (bestMatch >= 0) { - return bestMatch; - } else { - throw ReaderException("UPCEANReader::decodeDigit: No best mach"); - } + return bestMatch; } - /** * @return {@link #checkStandardUPCEANChecksum(String)} */ @@ -298,7 +293,6 @@ namespace zxing { * * @param s string of digits to check * @return true iff string of digits passes the UPC/EAN checksum algorithm - * @throws ReaderException if the string does not contain only digits */ bool UPCEANReader::checkStandardUPCEANChecksum(std::string s) { int length = s.length(); @@ -310,7 +304,7 @@ namespace zxing { for (int i = length - 2; i >= 0; i -= 2) { int digit = (int) s[i] - (int) '0'; if (digit < 0 || digit > 9) { - throw ReaderException("checkStandardUPCEANChecksum"); + return false; } sum += digit; } @@ -318,7 +312,7 @@ namespace zxing { for (int i = length - 1; i >= 0; i -= 2) { int digit = (int) s[i] - (int) '0'; if (digit < 0 || digit > 9) { - throw ReaderException("checkStandardUPCEANChecksum"); + return false; } sum += digit; }