mirror of
https://github.com/zxing/zxing.git
synced 2025-03-05 20:48:51 -08:00
Issue 396
git-svn-id: https://zxing.googlecode.com/svn/trunk@1333 59b500cc-1b3d-0410-9834-0bbf25fbcc57
This commit is contained in:
parent
515f743dc0
commit
4c91a1279a
|
@ -49,6 +49,10 @@ namespace zxing {
|
||||||
throw ReaderException("No code detected");
|
throw ReaderException("No code detected");
|
||||||
}
|
}
|
||||||
MultiFormatReader::~MultiFormatReader(){
|
MultiFormatReader::~MultiFormatReader(){
|
||||||
|
int size = readers->size();
|
||||||
|
for (int i = 0; i < size; i++) {
|
||||||
|
delete (*readers)[i];
|
||||||
|
}
|
||||||
delete readers;
|
delete readers;
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -86,12 +86,15 @@ Ref<CornerPoint> MonochromeRectangleDetector::findCornerFromCenter(int centerX,
|
||||||
if (lastRange[1] > centerX) {
|
if (lastRange[1] > centerX) {
|
||||||
// straddle, choose one or the other based on direction
|
// straddle, choose one or the other based on direction
|
||||||
Ref<CornerPoint> result(new CornerPoint(deltaY > 0 ? lastRange[0] : lastRange[1], lastY));
|
Ref<CornerPoint> result(new CornerPoint(deltaY > 0 ? lastRange[0] : lastRange[1], lastY));
|
||||||
|
delete [] lastRange;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
Ref<CornerPoint> result(new CornerPoint(lastRange[0], lastY));
|
Ref<CornerPoint> result(new CornerPoint(lastRange[0], lastY));
|
||||||
|
delete [] lastRange;
|
||||||
return result;
|
return result;
|
||||||
} else {
|
} else {
|
||||||
Ref<CornerPoint> result(new CornerPoint(lastRange[1], lastY));
|
Ref<CornerPoint> result(new CornerPoint(lastRange[1], lastY));
|
||||||
|
delete [] lastRange;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -99,19 +102,24 @@ Ref<CornerPoint> MonochromeRectangleDetector::findCornerFromCenter(int centerX,
|
||||||
if (lastRange[0] < centerY) {
|
if (lastRange[0] < centerY) {
|
||||||
if (lastRange[1] > centerY) {
|
if (lastRange[1] > centerY) {
|
||||||
Ref<CornerPoint> result(new CornerPoint(lastX, deltaX < 0 ? lastRange[0] : lastRange[1]));
|
Ref<CornerPoint> result(new CornerPoint(lastX, deltaX < 0 ? lastRange[0] : lastRange[1]));
|
||||||
|
delete [] lastRange;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
Ref<CornerPoint> result(new CornerPoint(lastX, lastRange[0]));
|
Ref<CornerPoint> result(new CornerPoint(lastX, lastRange[0]));
|
||||||
|
delete [] lastRange;
|
||||||
return result;
|
return result;
|
||||||
} else {
|
} else {
|
||||||
Ref<CornerPoint> result(new CornerPoint(lastX, lastRange[1]));
|
Ref<CornerPoint> result(new CornerPoint(lastX, lastRange[1]));
|
||||||
|
delete [] lastRange;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
delete [] lastRange;
|
||||||
lastRange = range;
|
lastRange = range;
|
||||||
}
|
}
|
||||||
|
delete [] lastRange;
|
||||||
throw ReaderException("Couldn't find corners");
|
throw ReaderException("Couldn't find corners");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -28,9 +28,9 @@
|
||||||
namespace zxing {
|
namespace zxing {
|
||||||
namespace oned {
|
namespace oned {
|
||||||
|
|
||||||
const int CODE_PATTERNS_LENGHT = 107;
|
const int CODE_PATTERNS_LENGTH = 107;
|
||||||
const int countersLenght = 6;
|
const int countersLength = 6;
|
||||||
static const int CODE_PATTERNS[CODE_PATTERNS_LENGHT][countersLenght] = {
|
static const int CODE_PATTERNS[CODE_PATTERNS_LENGTH][countersLength] = {
|
||||||
{2, 1, 2, 2, 2, 2}, /* 0 */
|
{2, 1, 2, 2, 2, 2}, /* 0 */
|
||||||
{2, 2, 2, 1, 2, 2},
|
{2, 2, 2, 1, 2, 2},
|
||||||
{2, 2, 2, 2, 2, 1},
|
{2, 2, 2, 2, 2, 1},
|
||||||
|
@ -155,7 +155,7 @@ namespace zxing {
|
||||||
}
|
}
|
||||||
|
|
||||||
int counterPosition = 0;
|
int counterPosition = 0;
|
||||||
int counters[countersLenght] = {0,0,0,0,0,0};
|
int counters[countersLength] = {0,0,0,0,0,0};
|
||||||
int patternStart = rowOffset;
|
int patternStart = rowOffset;
|
||||||
bool isWhite = false;
|
bool isWhite = false;
|
||||||
int patternLength = sizeof(counters) / sizeof(int);
|
int patternLength = sizeof(counters) / sizeof(int);
|
||||||
|
@ -206,13 +206,13 @@ namespace zxing {
|
||||||
recordPattern(row, rowOffset, counters, countersCount);
|
recordPattern(row, rowOffset, counters, countersCount);
|
||||||
int bestVariance = MAX_AVG_VARIANCE; // worst variance we'll accept
|
int bestVariance = MAX_AVG_VARIANCE; // worst variance we'll accept
|
||||||
int bestMatch = -1;
|
int bestMatch = -1;
|
||||||
for (int d = 0; d < CODE_PATTERNS_LENGHT; d++) {
|
for (int d = 0; d < CODE_PATTERNS_LENGTH; d++) {
|
||||||
int pattern[countersLenght];
|
int pattern[countersLength];
|
||||||
|
|
||||||
for(int ind = 0; ind< countersLenght; ind++){
|
for(int ind = 0; ind< countersLength; ind++){
|
||||||
pattern[ind] = CODE_PATTERNS[d][ind];
|
pattern[ind] = CODE_PATTERNS[d][ind];
|
||||||
}
|
}
|
||||||
// memcpy(pattern, CODE_PATTERNS[d], countersLenght);
|
// memcpy(pattern, CODE_PATTERNS[d], countersLength);
|
||||||
int variance = patternMatchVariance(counters, countersCount, pattern, MAX_INDIVIDUAL_VARIANCE);
|
int variance = patternMatchVariance(counters, countersCount, pattern, MAX_INDIVIDUAL_VARIANCE);
|
||||||
if (variance < bestVariance) {
|
if (variance < bestVariance) {
|
||||||
bestVariance = variance;
|
bestVariance = variance;
|
||||||
|
@ -243,6 +243,7 @@ namespace zxing {
|
||||||
codeSet = CODE_CODE_C;
|
codeSet = CODE_CODE_C;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
delete [] startPatternInfo;
|
||||||
throw ReaderException("");
|
throw ReaderException("");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -254,7 +255,7 @@ namespace zxing {
|
||||||
|
|
||||||
int lastStart = startPatternInfo[0];
|
int lastStart = startPatternInfo[0];
|
||||||
int nextStart = startPatternInfo[1];
|
int nextStart = startPatternInfo[1];
|
||||||
int counters[countersLenght] = {0,0,0,0,0,0};
|
int counters[countersLength] = {0,0,0,0,0,0};
|
||||||
|
|
||||||
int lastCode = 0;
|
int lastCode = 0;
|
||||||
int code = 0;
|
int code = 0;
|
||||||
|
@ -271,7 +272,12 @@ namespace zxing {
|
||||||
lastCode = code;
|
lastCode = code;
|
||||||
|
|
||||||
// Decode another code from image
|
// Decode another code from image
|
||||||
|
try {
|
||||||
code = decodeCode(row, counters, sizeof(counters)/sizeof(int), nextStart);
|
code = decodeCode(row, counters, sizeof(counters)/sizeof(int), nextStart);
|
||||||
|
} catch (ReaderException re) {
|
||||||
|
delete [] startPatternInfo;
|
||||||
|
throw re;
|
||||||
|
}
|
||||||
|
|
||||||
// Remember whether the last code was printable or not (excluding CODE_STOP)
|
// Remember whether the last code was printable or not (excluding CODE_STOP)
|
||||||
if (code != CODE_STOP) {
|
if (code != CODE_STOP) {
|
||||||
|
@ -286,8 +292,8 @@ namespace zxing {
|
||||||
|
|
||||||
// Advance to where the next code will to start
|
// Advance to where the next code will to start
|
||||||
lastStart = nextStart;
|
lastStart = nextStart;
|
||||||
int _countersLenght = sizeof(counters) / sizeof(int);
|
int _countersLength = sizeof(counters) / sizeof(int);
|
||||||
for (int i = 0; i < _countersLenght; i++) {
|
for (int i = 0; i < _countersLength; i++) {
|
||||||
nextStart += counters[i];
|
nextStart += counters[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -296,6 +302,7 @@ namespace zxing {
|
||||||
case CODE_START_A:
|
case CODE_START_A:
|
||||||
case CODE_START_B:
|
case CODE_START_B:
|
||||||
case CODE_START_C:
|
case CODE_START_C:
|
||||||
|
delete [] startPatternInfo;
|
||||||
throw ReaderException("");
|
throw ReaderException("");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -418,6 +425,7 @@ namespace zxing {
|
||||||
nextStart++;
|
nextStart++;
|
||||||
}
|
}
|
||||||
if (!row->isRange(nextStart, fminl(width, nextStart + (nextStart - lastStart) / 2), false)) {
|
if (!row->isRange(nextStart, fminl(width, nextStart + (nextStart - lastStart) / 2), false)) {
|
||||||
|
delete [] startPatternInfo;
|
||||||
throw ReaderException("");
|
throw ReaderException("");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -425,6 +433,7 @@ namespace zxing {
|
||||||
checksumTotal -= multiplier * lastCode;
|
checksumTotal -= multiplier * lastCode;
|
||||||
// lastCode is the checksum then:
|
// lastCode is the checksum then:
|
||||||
if (checksumTotal % 103 != lastCode) {
|
if (checksumTotal % 103 != lastCode) {
|
||||||
|
delete [] startPatternInfo;
|
||||||
throw ReaderException("");
|
throw ReaderException("");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -444,6 +453,7 @@ namespace zxing {
|
||||||
// String resultString(tmpResultString);
|
// String resultString(tmpResultString);
|
||||||
|
|
||||||
if (tmpResultString.length() == 0) {
|
if (tmpResultString.length() == 0) {
|
||||||
|
delete [] startPatternInfo;
|
||||||
// Almost surely a false positive
|
// Almost surely a false positive
|
||||||
throw ReaderException("");
|
throw ReaderException("");
|
||||||
}
|
}
|
||||||
|
|
|
@ -94,9 +94,15 @@ namespace zxing {
|
||||||
char decodedChar;
|
char decodedChar;
|
||||||
int lastStart;
|
int lastStart;
|
||||||
do {
|
do {
|
||||||
|
try {
|
||||||
recordPattern(row, nextStart, counters, countersLen);
|
recordPattern(row, nextStart, counters, countersLen);
|
||||||
|
} catch (ReaderException re) {
|
||||||
|
delete [] start;
|
||||||
|
throw re;
|
||||||
|
}
|
||||||
int pattern = toNarrowWidePattern(counters, countersLen);
|
int pattern = toNarrowWidePattern(counters, countersLen);
|
||||||
if (pattern < 0) {
|
if (pattern < 0) {
|
||||||
|
delete [] start;
|
||||||
throw ReaderException("pattern < 0");
|
throw ReaderException("pattern < 0");
|
||||||
}
|
}
|
||||||
decodedChar = patternToChar(pattern);
|
decodedChar = patternToChar(pattern);
|
||||||
|
@ -117,10 +123,14 @@ namespace zxing {
|
||||||
for (int i = 0; i < countersLen; i++) {
|
for (int i = 0; i < countersLen; i++) {
|
||||||
lastPatternSize += counters[i];
|
lastPatternSize += counters[i];
|
||||||
}
|
}
|
||||||
|
// IS begin
|
||||||
|
delete [] counters;
|
||||||
|
// IS end
|
||||||
int whiteSpaceAfterEnd = nextStart - lastStart - lastPatternSize;
|
int whiteSpaceAfterEnd = nextStart - lastStart - lastPatternSize;
|
||||||
// If 50% of last pattern size, following last pattern, is not whitespace, fail
|
// If 50% of last pattern size, following last pattern, is not whitespace, fail
|
||||||
// (but if it's whitespace to the very end of the image, that's OK)
|
// (but if it's whitespace to the very end of the image, that's OK)
|
||||||
if (nextStart != end && whiteSpaceAfterEnd / 2 < lastPatternSize) {
|
if (nextStart != end && whiteSpaceAfterEnd / 2 < lastPatternSize) {
|
||||||
|
delete [] start;
|
||||||
throw ReaderException("too short end white space");
|
throw ReaderException("too short end white space");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -146,6 +156,7 @@ namespace zxing {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tmpResultString.length() == 0) {
|
if (tmpResultString.length() == 0) {
|
||||||
|
delete [] start;
|
||||||
// Almost surely a false positive
|
// Almost surely a false positive
|
||||||
throw ReaderException("");
|
throw ReaderException("");
|
||||||
}
|
}
|
||||||
|
@ -216,6 +227,9 @@ namespace zxing {
|
||||||
isWhite = !isWhite;
|
isWhite = !isWhite;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// IS begin
|
||||||
|
delete [] counters;
|
||||||
|
// IS end
|
||||||
throw ReaderException("");
|
throw ReaderException("");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -70,10 +70,22 @@ namespace zxing {
|
||||||
Ref<Result> ITFReader::decodeRow(int rowNumber, Ref<BitArray> row){
|
Ref<Result> ITFReader::decodeRow(int rowNumber, Ref<BitArray> row){
|
||||||
// Find out where the Middle section (payload) starts & ends
|
// Find out where the Middle section (payload) starts & ends
|
||||||
int* startRange = decodeStart(row);
|
int* startRange = decodeStart(row);
|
||||||
int* endRange = decodeEnd(row);
|
int* endRange;
|
||||||
|
try {
|
||||||
|
endRange = decodeEnd(row);
|
||||||
|
} catch (Exception e) {
|
||||||
|
delete [] startRange;
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
|
||||||
std::string tmpResult;
|
std::string tmpResult;
|
||||||
|
try {
|
||||||
decodeMiddle(row, startRange[1], endRange[0], tmpResult);
|
decodeMiddle(row, startRange[1], endRange[0], tmpResult);
|
||||||
|
} catch (zxing::ReaderException re) {
|
||||||
|
delete [] startRange;
|
||||||
|
delete [] endRange;
|
||||||
|
throw re;
|
||||||
|
}
|
||||||
|
|
||||||
// To avoid false positives with 2D barcodes (and other patterns), make
|
// To avoid false positives with 2D barcodes (and other patterns), make
|
||||||
// an assumption that the decoded string must be 6, 10 or 14 digits.
|
// an assumption that the decoded string must be 6, 10 or 14 digits.
|
||||||
|
@ -83,7 +95,9 @@ namespace zxing {
|
||||||
lengthOK = true;
|
lengthOK = true;
|
||||||
}
|
}
|
||||||
if (!lengthOK) {
|
if (!lengthOK) {
|
||||||
throw ReaderException("not enought characters count");
|
delete [] startRange;
|
||||||
|
delete [] endRange;
|
||||||
|
throw ReaderException("not enough characters count");
|
||||||
}
|
}
|
||||||
|
|
||||||
Ref<String> resultString(new String(tmpResult));
|
Ref<String> resultString(new String(tmpResult));
|
||||||
|
@ -116,13 +130,13 @@ namespace zxing {
|
||||||
// Therefore, need to scan 10 lines and then
|
// Therefore, need to scan 10 lines and then
|
||||||
// split these into two arrays
|
// split these into two arrays
|
||||||
int counterDigitPairLen = 10;
|
int counterDigitPairLen = 10;
|
||||||
int* counterDigitPair = new int[counterDigitPairLen];
|
int counterDigitPair[counterDigitPairLen];
|
||||||
for (int i=0; i<counterDigitPairLen; i++) {
|
for (int i=0; i<counterDigitPairLen; i++) {
|
||||||
counterDigitPair[i] = 0;
|
counterDigitPair[i] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int* counterBlack = new int[5];
|
int counterBlack[5];
|
||||||
int* counterWhite = new int[5];
|
int counterWhite[5];
|
||||||
for (int i=0; i<5; i++) {
|
for (int i=0; i<5; i++) {
|
||||||
counterBlack[i] = 0;
|
counterBlack[i] = 0;
|
||||||
counterWhite[i] = 0;
|
counterWhite[i] = 0;
|
||||||
|
@ -147,9 +161,6 @@ namespace zxing {
|
||||||
payloadStart += counterDigitPair[i];
|
payloadStart += counterDigitPair[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
delete [] counterDigitPair;
|
|
||||||
delete [] counterBlack;
|
|
||||||
delete [] counterWhite;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -278,7 +289,7 @@ namespace zxing {
|
||||||
// TODO: This is very similar to implementation in UPCEANReader. Consider if they can be
|
// TODO: This is very similar to implementation in UPCEANReader. Consider if they can be
|
||||||
// merged to a single method.
|
// merged to a single method.
|
||||||
int patternLength = patternLen;
|
int patternLength = patternLen;
|
||||||
int* counters = new int[patternLength];
|
int counters[patternLength];
|
||||||
for (int i=0; i<patternLength; i++) {
|
for (int i=0; i<patternLength; i++) {
|
||||||
counters[i] = 0;
|
counters[i] = 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,6 +49,10 @@ namespace zxing {
|
||||||
throw ReaderException("No code detected");
|
throw ReaderException("No code detected");
|
||||||
}
|
}
|
||||||
MultiFormatOneDReader::~MultiFormatOneDReader(){
|
MultiFormatOneDReader::~MultiFormatOneDReader(){
|
||||||
|
int size = readers->size();
|
||||||
|
for (int i = 0; i < size; i++) {
|
||||||
|
delete (*readers)[i];
|
||||||
|
}
|
||||||
delete readers;
|
delete readers;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -73,6 +73,10 @@ namespace zxing {
|
||||||
}
|
}
|
||||||
|
|
||||||
MultiFormatUPCEANReader::~MultiFormatUPCEANReader(){
|
MultiFormatUPCEANReader::~MultiFormatUPCEANReader(){
|
||||||
|
int size = readers->size();
|
||||||
|
for (int i = 0; i < size; i++) {
|
||||||
|
delete (*readers)[i];
|
||||||
|
}
|
||||||
delete readers;
|
delete readers;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -100,7 +100,16 @@ namespace zxing {
|
||||||
|
|
||||||
std::string tmpResultString;
|
std::string tmpResultString;
|
||||||
std::string& tmpResultStringRef = tmpResultString;
|
std::string& tmpResultStringRef = tmpResultString;
|
||||||
int endStart = decodeMiddle(row, startGuardRange, 2 /*reference findGuardPattern*/ , tmpResultStringRef);
|
int endStart;
|
||||||
|
try {
|
||||||
|
endStart = decodeMiddle(row, startGuardRange, 2 /*reference findGuardPattern*/ , tmpResultStringRef);
|
||||||
|
} catch (ReaderException re) {
|
||||||
|
if (startGuardRange!=NULL) {
|
||||||
|
delete [] startGuardRange;
|
||||||
|
startGuardRange = NULL;
|
||||||
|
}
|
||||||
|
throw re;
|
||||||
|
}
|
||||||
|
|
||||||
int* endRange = decodeEnd(row, endStart);
|
int* endRange = decodeEnd(row, endStart);
|
||||||
|
|
||||||
|
@ -114,6 +123,14 @@ namespace zxing {
|
||||||
// }
|
// }
|
||||||
|
|
||||||
if (!checkChecksum(tmpResultString)) {
|
if (!checkChecksum(tmpResultString)) {
|
||||||
|
if (startGuardRange!=NULL) {
|
||||||
|
delete [] startGuardRange;
|
||||||
|
startGuardRange = NULL;
|
||||||
|
}
|
||||||
|
if (endRange!=NULL) {
|
||||||
|
delete [] endRange;
|
||||||
|
endRange = NULL;
|
||||||
|
}
|
||||||
throw ReaderException("Checksum fail.");
|
throw ReaderException("Checksum fail.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -159,6 +176,9 @@ namespace zxing {
|
||||||
if (quietStart >= 0) {
|
if (quietStart >= 0) {
|
||||||
foundStart = row->isRange(quietStart, start, false);
|
foundStart = row->isRange(quietStart, start, false);
|
||||||
}
|
}
|
||||||
|
if (!foundStart) {
|
||||||
|
delete [] startRange;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return startRange;
|
return startRange;
|
||||||
}
|
}
|
||||||
|
@ -217,13 +237,13 @@ namespace zxing {
|
||||||
}
|
}
|
||||||
|
|
||||||
// int UPCEANReader::decodeDigit(Ref<BitArray> row, int counters[], int countersLen, int rowOffset, int** patterns/*[][]*/, int paterns1Len, int paterns2Len)
|
// int UPCEANReader::decodeDigit(Ref<BitArray> row, int counters[], int countersLen, int rowOffset, int** patterns/*[][]*/, int paterns1Len, int paterns2Len)
|
||||||
int UPCEANReader::decodeDigit(Ref<BitArray> row, int counters[], int countersLen, int rowOffset, UPC_EAN_PATTERNS paternType){
|
int UPCEANReader::decodeDigit(Ref<BitArray> row, int counters[], int countersLen, int rowOffset, UPC_EAN_PATTERNS patternType){
|
||||||
recordPattern(row, rowOffset, counters, countersLen);
|
recordPattern(row, rowOffset, counters, countersLen);
|
||||||
int bestVariance = MAX_AVG_VARIANCE; // worst variance we'll accept
|
int bestVariance = MAX_AVG_VARIANCE; // worst variance we'll accept
|
||||||
int bestMatch = -1;
|
int bestMatch = -1;
|
||||||
|
|
||||||
int max = 0;
|
int max = 0;
|
||||||
switch (paternType) {
|
switch (patternType) {
|
||||||
case UPC_EAN_PATTERNS_L_PATTERNS:
|
case UPC_EAN_PATTERNS_L_PATTERNS:
|
||||||
max = L_PATTERNS_LEN;
|
max = L_PATTERNS_LEN;
|
||||||
for (int i = 0; i < max; i++) {
|
for (int i = 0; i < max; i++) {
|
||||||
|
|
|
@ -54,7 +54,7 @@ namespace zxing {
|
||||||
Ref<Result> decodeRow(int rowNumber, Ref<BitArray> row);
|
Ref<Result> decodeRow(int rowNumber, Ref<BitArray> row);
|
||||||
Ref<Result> decodeRow(int rowNumber, Ref<BitArray> row, int startGuardRange[]);
|
Ref<Result> decodeRow(int rowNumber, Ref<BitArray> row, int startGuardRange[]);
|
||||||
|
|
||||||
static int decodeDigit(Ref<BitArray> row, int counters[], int countersLen, int rowOffset, UPC_EAN_PATTERNS paternType); //throws ReaderException
|
static int decodeDigit(Ref<BitArray> row, int counters[], int countersLen, int rowOffset, UPC_EAN_PATTERNS patternType); //throws ReaderException
|
||||||
|
|
||||||
bool checkChecksum(std::string s); //throws ReaderException
|
bool checkChecksum(std::string s); //throws ReaderException
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue