package com.google.zxing.oned;
+import com.google.zxing.BarcodeFormat;
import com.google.zxing.ReaderException;
import com.google.zxing.Result;
import com.google.zxing.ResultPoint;
import com.google.zxing.common.BitArray;
import com.google.zxing.common.GenericResultPoint;
+import java.util.Hashtable;
+
/**
* <p>Decodes Code 128 barcodes.</p>
*
{2, 3, 3, 1, 1, 1, 2}
};
- private static final float MAX_VARIANCE = 0.3f;
+ private static final int MAX_AVG_VARIANCE = (int) (PATTERN_MATCH_RESULT_SCALE_FACTOR * 0.1875f);
+ private static final int MAX_INDIVIDUAL_VARIANCE = (int) (PATTERN_MATCH_RESULT_SCALE_FACTOR * 0.25f);
private static final int CODE_SHIFT = 98;
counters[counterPosition]++;
} else {
if (counterPosition == patternLength - 1) {
- float bestVariance = MAX_VARIANCE;
+ int bestVariance = MAX_AVG_VARIANCE;
int bestMatch = -1;
for (int startCode = CODE_START_A; startCode <= CODE_START_C; startCode++) {
- float variance = patternMatchVariance(counters, CODE_PATTERNS[startCode]);
+ int variance = patternMatchVariance(counters, CODE_PATTERNS[startCode], MAX_INDIVIDUAL_VARIANCE);
if (variance < bestVariance) {
bestVariance = variance;
bestMatch = startCode;
for (int y = 2; y < patternLength; y++) {
counters[y - 2] = counters[y];
}
+ counters[patternLength - 2] = 0;
+ counters[patternLength - 1] = 0;
counterPosition--;
} else {
counterPosition++;
private static int decodeCode(BitArray row, int[] counters, int rowOffset) throws ReaderException {
recordPattern(row, rowOffset, counters);
- float bestVariance = MAX_VARIANCE; // worst variance we'll accept
+ int bestVariance = MAX_AVG_VARIANCE; // worst variance we'll accept
int bestMatch = -1;
for (int d = 0; d < CODE_PATTERNS.length; d++) {
int[] pattern = CODE_PATTERNS[d];
- float variance = patternMatchVariance(counters, pattern);
+ int variance = patternMatchVariance(counters, pattern, MAX_INDIVIDUAL_VARIANCE);
if (variance < bestVariance) {
bestVariance = variance;
bestMatch = d;
}
}
- public Result decodeRow(final int rowNumber, final BitArray row) throws ReaderException {
+ public Result decodeRow(int rowNumber, BitArray row, Hashtable hints) throws ReaderException {
int[] startPatternInfo = findStartPattern(row);
int startCode = startPatternInfo[2];
}
String resultString = result.toString();
- return new Result(resultString,
- new ResultPoint[]{new GenericResultPoint((float) (startPatternInfo[1] - startPatternInfo[0]) / 2.0f,
- (float) rowNumber),
- new GenericResultPoint((float) (nextStart - lastStart) / 2.0f,
- (float) rowNumber)});
+
+ if (resultString.length() == 0) {
+ // Almost surely a false positive
+ throw new ReaderException("Empty barcode found; assuming a false positive");
+ }
+
+ float left = (float) (startPatternInfo[1] + startPatternInfo[0]) / 2.0f;
+ float right = (float) (nextStart + lastStart) / 2.0f;
+ return new Result(
+ resultString,
+ null,
+ new ResultPoint[]{
+ new GenericResultPoint(left, (float) rowNumber),
+ new GenericResultPoint(right, (float) rowNumber)},
+ BarcodeFormat.CODE_128);
}