X-Git-Url: http://git.rot13.org/?p=zxing.git;a=blobdiff_plain;f=cpp%2Fcore%2Fsrc%2Fzxing%2Foned%2FUPCEReader.cpp;h=cd36492790ab112edf2b4add2e604213f03e28f6;hp=7772ed9bbfeadd3656527df79e0127cee459409e;hb=ed5e46807ea0847057ff4d8c714b16938005a299;hpb=a26a7880879d983c8d0bbaf2f56391999d12edde diff --git a/cpp/core/src/zxing/oned/UPCEReader.cpp b/cpp/core/src/zxing/oned/UPCEReader.cpp index 7772ed9b..cd364927 100644 --- a/cpp/core/src/zxing/oned/UPCEReader.cpp +++ b/cpp/core/src/zxing/oned/UPCEReader.cpp @@ -21,122 +21,122 @@ #include namespace zxing { - namespace oned { - - /** - * The pattern that marks the middle, and end, of a UPC-E pattern. - * There is no "second half" to a UPC-E barcode. - */ - static const int MIDDLE_END_PATTERN[6] = {1, 1, 1, 1, 1, 1}; - - /** - * See {@link #L_AND_G_PATTERNS}; these values similarly represent patterns of - * even-odd parity encodings of digits that imply both the number system (0 or 1) - * used, and the check digit. - */ - static const int NUMSYS_AND_CHECK_DIGIT_PATTERNS[2][10] = { - {0x38, 0x34, 0x32, 0x31, 0x2C, 0x26, 0x23, 0x2A, 0x29, 0x25}, - {0x07, 0x0B, 0x0D, 0x0E, 0x13, 0x19, 0x1C, 0x15, 0x16, 0x1A} - }; - - UPCEReader::UPCEReader() { - } - - int UPCEReader::decodeMiddle(Ref row, int startRange[], int startRangeLen, - std::string& resultString) { - const int countersLen = 4; - int counters[countersLen] = { 0, 0, 0, 0 }; - - int end = row->getSize(); - int rowOffset = startRange[1]; - int lgPatternFound = 0; - - for (int x = 0; x < 6 && rowOffset < end; x++) { - int bestMatch = decodeDigit(row, counters, countersLen, rowOffset, - UPC_EAN_PATTERNS_L_AND_G_PATTERNS); - if (bestMatch < 0) { + namespace oned { + + /** + * The pattern that marks the middle, and end, of a UPC-E pattern. + * There is no "second half" to a UPC-E barcode. + */ + static const int MIDDLE_END_PATTERN[6] = {1, 1, 1, 1, 1, 1}; + + /** + * See {@link #L_AND_G_PATTERNS}; these values similarly represent patterns of + * even-odd parity encodings of digits that imply both the number system (0 or 1) + * used, and the check digit. + */ + static const int NUMSYS_AND_CHECK_DIGIT_PATTERNS[2][10] = { + {0x38, 0x34, 0x32, 0x31, 0x2C, 0x26, 0x23, 0x2A, 0x29, 0x25}, + {0x07, 0x0B, 0x0D, 0x0E, 0x13, 0x19, 0x1C, 0x15, 0x16, 0x1A} + }; + + UPCEReader::UPCEReader() { + } + + int UPCEReader::decodeMiddle(Ref row, int startRange[], int startRangeLen, + std::string& resultString) { + const int countersLen = 4; + int counters[countersLen] = { 0, 0, 0, 0 }; + + int end = row->getSize(); + int rowOffset = startRange[1]; + int lgPatternFound = 0; + + for (int x = 0; x < 6 && rowOffset < end; x++) { + int bestMatch = decodeDigit(row, counters, countersLen, rowOffset, + UPC_EAN_PATTERNS_L_AND_G_PATTERNS); + if (bestMatch < 0) { return -1; } - resultString.append(1, (char) ('0' + bestMatch % 10)); - for (int i = 0; i < countersLen; i++) { - rowOffset += counters[i]; - } - if (bestMatch >= 10) { - lgPatternFound |= 1 << (5 - x); - } - } - - if (!determineNumSysAndCheckDigit(resultString, lgPatternFound)) { + resultString.append(1, (char) ('0' + bestMatch % 10)); + for (int i = 0; i < countersLen; i++) { + rowOffset += counters[i]; + } + if (bestMatch >= 10) { + lgPatternFound |= 1 << (5 - x); + } + } + + if (!determineNumSysAndCheckDigit(resultString, lgPatternFound)) { return -1; } - return rowOffset; - } - - int* UPCEReader::decodeEnd(Ref row, int endStart) { - return findGuardPattern(row, endStart, true, MIDDLE_END_PATTERN, - sizeof(MIDDLE_END_PATTERN) / sizeof(int)); - } - - bool UPCEReader::checkChecksum(std::string s){ - return UPCEANReader::checkChecksum(convertUPCEtoUPCA(s)); - } - - - bool UPCEReader::determineNumSysAndCheckDigit(std::string& resultString, int lgPatternFound) { - for (int numSys = 0; numSys <= 1; numSys++) { - for (int d = 0; d < 10; d++) { - if (lgPatternFound == NUMSYS_AND_CHECK_DIGIT_PATTERNS[numSys][d]) { - resultString.insert(0, 1, (char) ('0' + numSys)); - resultString.append(1, (char) ('0' + d)); - return true; - } - } - } - return false; - } - - /** - * Expands a UPC-E value back into its full, equivalent UPC-A code value. - * - * @param upce UPC-E code as string of digits - * @return equivalent UPC-A code as string of digits - */ - std::string UPCEReader::convertUPCEtoUPCA(std::string upce) { - std::string result; - result.append(1, upce[0]); - char lastChar = upce[6]; - switch (lastChar) { - case '0': - case '1': - case '2': - result.append(upce.substr(1,2)); - result.append(1, lastChar); - result.append("0000"); - result.append(upce.substr(3,3)); - break; - case '3': - result.append(upce.substr(1,3)); - result.append("00000"); - result.append(upce.substr(4,2)); - break; - case '4': - result.append(upce.substr(1,4)); - result.append("00000"); - result.append(1, upce[5]); - break; - default: - result.append(upce.substr(1,5)); - result.append("0000"); - result.append(1, lastChar); - break; - } - result.append(1, upce[7]); - return result; - } - - - BarcodeFormat UPCEReader::getBarcodeFormat() { - return BarcodeFormat_UPC_E; - } - } + return rowOffset; + } + + int* UPCEReader::decodeEnd(Ref row, int endStart) { + return findGuardPattern(row, endStart, true, MIDDLE_END_PATTERN, + sizeof(MIDDLE_END_PATTERN) / sizeof(int)); + } + + bool UPCEReader::checkChecksum(std::string s){ + return UPCEANReader::checkChecksum(convertUPCEtoUPCA(s)); + } + + + bool UPCEReader::determineNumSysAndCheckDigit(std::string& resultString, int lgPatternFound) { + for (int numSys = 0; numSys <= 1; numSys++) { + for (int d = 0; d < 10; d++) { + if (lgPatternFound == NUMSYS_AND_CHECK_DIGIT_PATTERNS[numSys][d]) { + resultString.insert(0, 1, (char) ('0' + numSys)); + resultString.append(1, (char) ('0' + d)); + return true; + } + } + } + return false; + } + + /** + * Expands a UPC-E value back into its full, equivalent UPC-A code value. + * + * @param upce UPC-E code as string of digits + * @return equivalent UPC-A code as string of digits + */ + std::string UPCEReader::convertUPCEtoUPCA(std::string upce) { + std::string result; + result.append(1, upce[0]); + char lastChar = upce[6]; + switch (lastChar) { + case '0': + case '1': + case '2': + result.append(upce.substr(1,2)); + result.append(1, lastChar); + result.append("0000"); + result.append(upce.substr(3,3)); + break; + case '3': + result.append(upce.substr(1,3)); + result.append("00000"); + result.append(upce.substr(4,2)); + break; + case '4': + result.append(upce.substr(1,4)); + result.append("00000"); + result.append(1, upce[5]); + break; + default: + result.append(upce.substr(1,5)); + result.append("0000"); + result.append(1, lastChar); + break; + } + result.append(1, upce[7]); + return result; + } + + + BarcodeFormat UPCEReader::getBarcodeFormat() { + return BarcodeFormat_UPC_E; + } + } }