Refactorings to allow raw bytes to be passed back with reader result, where applicable
[zxing.git] / core / src / com / google / zxing / oned / Code128Reader.java
index 91d6612..46d1bd7 100644 (file)
 
 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>
  *
@@ -139,7 +142,7 @@ public final class Code128Reader extends AbstractOneDReader {
       {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;
 
@@ -180,15 +183,24 @@ public final class Code128Reader extends AbstractOneDReader {
         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++;
@@ -202,7 +214,7 @@ public final class Code128Reader extends AbstractOneDReader {
 
   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];
@@ -220,7 +232,7 @@ public final class Code128Reader extends AbstractOneDReader {
     }
   }
 
-  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];
@@ -393,11 +405,13 @@ public final class Code128Reader extends AbstractOneDReader {
     }
 
     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);
 
   }