int EAN13Reader::decodeMiddle(Ref<BitArray> 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 (!determineFirstDigit(resultString, lgPatternFound)) { return -1; } int* middleRange = findGuardPattern(row, rowOffset, true, (int*)getMIDDLE_PATTERN(), getMIDDLE_PATTERN_LEN()); if (middleRange != NULL) { rowOffset = middleRange[1]; for (int x = 0; x < 6 && rowOffset < end; x++) { int bestMatch = decodeDigit(row, counters, countersLen, rowOffset, UPC_EAN_PATTERNS_L_PATTERNS); if (bestMatch < 0) { delete [] middleRange; return -1; } resultString.append(1, (char) ('0' + bestMatch)); for (int i = 0; i < countersLen; i++) { rowOffset += counters[i]; } } delete [] middleRange; return rowOffset; } return -1; }
int EAN8Reader::decodeMiddle(Ref<BitArray> row, int startGuardBegin, int startGuardEnd, std::string& resultString){ (void)startGuardBegin; const int countersLen = 4; int counters[countersLen] = { 0, 0, 0, 0 }; int end = row->getSize(); int rowOffset = startGuardEnd; for (int x = 0; x < 4 && rowOffset < end; x++) { int bestMatch = decodeDigit(row, counters, countersLen, rowOffset, UPC_EAN_PATTERNS_L_PATTERNS); if (bestMatch < 0) { return -1; } resultString.append(1, (char) ('0' + bestMatch)); for (int i = 0; i < countersLen; i++) { rowOffset += counters[i]; } } int middleRangeStart; int middleRangeEnd; if (findGuardPattern(row, rowOffset, true, (int*)getMIDDLE_PATTERN(), getMIDDLE_PATTERN_LEN(), &middleRangeStart, &middleRangeEnd)) { rowOffset = middleRangeEnd; for (int x = 0; x < 4 && rowOffset < end; x++) { int bestMatch = decodeDigit(row, counters, countersLen, rowOffset, UPC_EAN_PATTERNS_L_PATTERNS); if (bestMatch < 0) { return -1; } resultString.append(1, (char) ('0' + bestMatch)); for (int i = 0; i < countersLen; i++) { rowOffset += counters[i]; } } return rowOffset; } return -1; }