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.4f;
+ private static final float MAX_VARIANCE = 0.3f;
private static final int CODE_SHIFT = 98;
counters[counterPosition]++;
} else {
if (counterPosition == patternLength - 1) {
+ float bestVariance = MAX_VARIANCE;
+ int bestMatch = -1;
for (int startCode = CODE_START_A; startCode <= CODE_START_C; startCode++) {
- if (patternMatchVariance(counters, CODE_PATTERNS[startCode]) < MAX_VARIANCE) {
- return new int[]{patternStart, i, startCode};
+ float variance = patternMatchVariance(counters, CODE_PATTERNS[startCode]);
+ if (variance < bestVariance) {
+ bestVariance = variance;
+ bestMatch = startCode;
}
}
+ if (bestMatch >= 0) {
+ return new int[]{patternStart, i, bestMatch};
+ }
patternStart += counters[0] + counters[1];
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 = 0.4f; // worst variance we'll accept
+ float bestVariance = MAX_VARIANCE; // worst variance we'll accept
int bestMatch = -1;
for (int d = 0; d < CODE_PATTERNS.length; d++) {
int[] pattern = CODE_PATTERNS[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)});
+ return new Result(
+ resultString,
+ null,
+ new ResultPoint[]{
+ new GenericResultPoint((float) (startPatternInfo[1] - startPatternInfo[0]) / 2.0f, (float) rowNumber),
+ new GenericResultPoint((float) (nextStart - lastStart) / 2.0f, (float) rowNumber)},
+ BarcodeFormat.CODE_128);
}