From 05e8181ef56de6fcdca27ed6c4caa1fd806b0752 Mon Sep 17 00:00:00 2001 From: srowen Date: Sun, 30 May 2010 14:37:08 +0000 Subject: [PATCH] Add Code 93 support. Update tests to reflect new (better) number of successes. git-svn-id: https://zxing.googlecode.com/svn/trunk@1398 59b500cc-1b3d-0410-9834-0bbf25fbcc57 --- .../integration/android/IntentIntegrator.java | 2 +- core/src/com/google/zxing/BarcodeFormat.java | 3 + .../com/google/zxing/MultiFormatReader.java | 1 + .../com/google/zxing/oned/Code39Reader.java | 19 +- .../com/google/zxing/oned/Code93Reader.java | 273 ++++++++++++++++++ .../zxing/oned/MultiFormatOneDReader.java | 4 + .../src/com/google/zxing/oned/OneDReader.java | 2 +- core/test/data/blackbox/code93-1/1.gif | Bin 0 -> 4266 bytes core/test/data/blackbox/code93-1/1.txt | 1 + core/test/data/blackbox/code93-1/2.gif | Bin 0 -> 5785 bytes core/test/data/blackbox/code93-1/2.txt | 1 + core/test/data/blackbox/code93-1/3.jpg | Bin 0 -> 11122 bytes core/test/data/blackbox/code93-1/3.txt | 1 + .../zxing/oned/Code128BlackBox2TestCase.java | 4 +- .../zxing/oned/Code93BlackBox1TestCase.java | 34 +++ .../zxing/oned/EAN13BlackBox1TestCase.java | 4 +- .../zxing/oned/EAN13BlackBox2TestCase.java | 2 +- .../zxing/oned/EAN13BlackBox3TestCase.java | 4 +- .../zxing/oned/ITFBlackBox1TestCase.java | 2 +- .../zxing/oned/ITFBlackBox2TestCase.java | 2 +- .../zxing/oned/UPCABlackBox1TestCase.java | 4 +- .../zxing/oned/UPCABlackBox2TestCase.java | 4 +- .../oned/UPCABlackBox3ReflectiveTestCase.java | 4 +- .../zxing/oned/UPCABlackBox4TestCase.java | 4 +- .../zxing/oned/UPCEBlackBox2TestCase.java | 2 +- .../oned/UPCEBlackBox3ReflectiveTestCase.java | 4 +- .../zxing/client/j2se/CommandLineRunner.java | 1 + .../com/google/zxing/web/DecodeServlet.java | 1 + 28 files changed, 353 insertions(+), 30 deletions(-) create mode 100644 core/src/com/google/zxing/oned/Code93Reader.java create mode 100644 core/test/data/blackbox/code93-1/1.gif create mode 100644 core/test/data/blackbox/code93-1/1.txt create mode 100644 core/test/data/blackbox/code93-1/2.gif create mode 100644 core/test/data/blackbox/code93-1/2.txt create mode 100644 core/test/data/blackbox/code93-1/3.jpg create mode 100644 core/test/data/blackbox/code93-1/3.txt create mode 100644 core/test/src/com/google/zxing/oned/Code93BlackBox1TestCase.java diff --git a/android-integration/src/com/google/zxing/integration/android/IntentIntegrator.java b/android-integration/src/com/google/zxing/integration/android/IntentIntegrator.java index b92f86c74..c6c8214bb 100644 --- a/android-integration/src/com/google/zxing/integration/android/IntentIntegrator.java +++ b/android-integration/src/com/google/zxing/integration/android/IntentIntegrator.java @@ -87,7 +87,7 @@ public final class IntentIntegrator { // supported barcode formats public static final String PRODUCT_CODE_TYPES = "UPC_A,UPC_E,EAN_8,EAN_13"; - public static final String ONE_D_CODE_TYPES = PRODUCT_CODE_TYPES + ",CODE_39,CODE_128"; + public static final String ONE_D_CODE_TYPES = PRODUCT_CODE_TYPES + ",CODE_39,CODE_93,CODE_128"; public static final String QR_CODE_TYPES = "QR_CODE"; public static final String ALL_CODE_TYPES = null; diff --git a/core/src/com/google/zxing/BarcodeFormat.java b/core/src/com/google/zxing/BarcodeFormat.java index d4e1e70a1..aa4096a3d 100644 --- a/core/src/com/google/zxing/BarcodeFormat.java +++ b/core/src/com/google/zxing/BarcodeFormat.java @@ -53,6 +53,9 @@ public final class BarcodeFormat { /** Code 39 1D format. */ public static final BarcodeFormat CODE_39 = new BarcodeFormat("CODE_39"); + /** Code 93 1D format. */ + public static final BarcodeFormat CODE_93 = new BarcodeFormat("CODE_93"); + /** ITF (Interleaved Two of Five) 1D format. */ public static final BarcodeFormat ITF = new BarcodeFormat("ITF"); diff --git a/core/src/com/google/zxing/MultiFormatReader.java b/core/src/com/google/zxing/MultiFormatReader.java index c198021ec..0e70341fd 100644 --- a/core/src/com/google/zxing/MultiFormatReader.java +++ b/core/src/com/google/zxing/MultiFormatReader.java @@ -100,6 +100,7 @@ public final class MultiFormatReader implements Reader { formats.contains(BarcodeFormat.EAN_13) || formats.contains(BarcodeFormat.EAN_8) || formats.contains(BarcodeFormat.CODE_39) || + formats.contains(BarcodeFormat.CODE_93) || formats.contains(BarcodeFormat.CODE_128) || formats.contains(BarcodeFormat.ITF) || formats.contains(BarcodeFormat.RSS14) || diff --git a/core/src/com/google/zxing/oned/Code39Reader.java b/core/src/com/google/zxing/oned/Code39Reader.java index 50c0ede58..0bc66bf51 100644 --- a/core/src/com/google/zxing/oned/Code39Reader.java +++ b/core/src/com/google/zxing/oned/Code39Reader.java @@ -30,6 +30,7 @@ import java.util.Hashtable; *

Decodes Code 39 barcodes. This does not support "Full ASCII Code 39" yet.

* * @author Sean Owen + * @see Code93Reader */ public final class Code39Reader extends OneDReader { @@ -143,22 +144,24 @@ public final class Code39Reader extends OneDReader { for (int i = 0; i < max; i++) { total += ALPHABET_STRING.indexOf(result.charAt(i)); } - if (total % 43 != ALPHABET_STRING.indexOf(result.charAt(max))) { + if (result.charAt(max) != ALPHABET[total % 43]) { throw ChecksumException.getChecksumInstance(); } result.deleteCharAt(max); } - String resultString = result.toString(); - if (extendedMode) { - resultString = decodeExtended(resultString); - } - - if (resultString.length() == 0) { + if (result.length() == 0) { // Almost surely a false positive throw NotFoundException.getNotFoundInstance(); } + String resultString; + if (extendedMode) { + resultString = decodeExtended(result); + } else { + resultString = result.toString(); + } + float left = (float) (start[1] + start[0]) / 2.0f; float right = (float) (nextStart + lastStart) / 2.0f; return new Result( @@ -271,7 +274,7 @@ public final class Code39Reader extends OneDReader { throw NotFoundException.getNotFoundInstance(); } - private static String decodeExtended(String encoded) throws FormatException { + private static String decodeExtended(StringBuffer encoded) throws FormatException { int length = encoded.length(); StringBuffer decoded = new StringBuffer(length); for (int i = 0; i < length; i++) { diff --git a/core/src/com/google/zxing/oned/Code93Reader.java b/core/src/com/google/zxing/oned/Code93Reader.java new file mode 100644 index 000000000..3435169ba --- /dev/null +++ b/core/src/com/google/zxing/oned/Code93Reader.java @@ -0,0 +1,273 @@ +/* + * Copyright 2010 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.oned; + +import java.util.Hashtable; + +import com.google.zxing.BarcodeFormat; +import com.google.zxing.ChecksumException; +import com.google.zxing.FormatException; +import com.google.zxing.NotFoundException; +import com.google.zxing.Result; +import com.google.zxing.ResultPoint; +import com.google.zxing.common.BitArray; + +/** + *

Decodes Code 93 barcodes.

+ * + * @author Sean Owen + * @see Code39Reader + */ +public final class Code93Reader extends OneDReader { + + // Note that 'abcd' are dummy characters in place of control characters. + private static final String ALPHABET_STRING = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%abcd*"; + private static final char[] ALPHABET = ALPHABET_STRING.toCharArray(); + + /** + * These represent the encodings of characters, as patterns of wide and narrow bars. + * The 9 least-significant bits of each int correspond to the pattern of wide and narrow. + */ + private static final int[] CHARACTER_ENCODINGS = { + 0x114, 0x148, 0x144, 0x142, 0x128, 0x124, 0x122, 0x150, 0x112, 0x10A, // 0-9 + 0x1A8, 0x1A4, 0x1A2, 0x194, 0x192, 0x18A, 0x168, 0x164, 0x162, 0x134, // A-J + 0x11A, 0x158, 0x14C, 0x146, 0x12C, 0x116, 0x1B4, 0x1B2, 0x1AC, 0x1A6, // K-T + 0x196, 0x19A, 0x16C, 0x166, 0x136, 0x13A, // U-Z + 0x12E, 0x1D4, 0x1D2, 0x1CA, 0x16E, 0x176, 0x1AE, // - - % + 0x126, 0x1DA, 0x1D6, 0x132, 0x15E, // Control chars? $-* + }; + private static final int ASTERISK_ENCODING = CHARACTER_ENCODINGS[47]; + + public Result decodeRow(int rowNumber, BitArray row, Hashtable hints) + throws NotFoundException, ChecksumException, FormatException { + + int[] start = findAsteriskPattern(row); + int nextStart = start[1]; + int end = row.getSize(); + + // Read off white space + while (nextStart < end && !row.get(nextStart)) { + nextStart++; + } + + StringBuffer result = new StringBuffer(20); + int[] counters = new int[6]; + char decodedChar; + int lastStart; + do { + recordPattern(row, nextStart, counters); + int pattern = toPattern(counters); + if (pattern < 0) { + throw NotFoundException.getNotFoundInstance(); + } + decodedChar = patternToChar(pattern); + result.append(decodedChar); + lastStart = nextStart; + for (int i = 0; i < counters.length; i++) { + nextStart += counters[i]; + } + // Read off white space + while (nextStart < end && !row.get(nextStart)) { + nextStart++; + } + } while (decodedChar != '*'); + result.deleteCharAt(result.length() - 1); // remove asterisk + + // Should be at least one more black module + if (nextStart == end || !row.get(nextStart)) { + throw NotFoundException.getNotFoundInstance(); + } + + if (result.length() < 2) { + // Almost surely a false positive + throw NotFoundException.getNotFoundInstance(); + } + + checkChecksums(result); + // Remove checksum digits + result.setLength(result.length() - 2); + + String resultString = decodeExtended(result); + + float left = (float) (start[1] + start[0]) / 2.0f; + float right = (float) (nextStart + lastStart) / 2.0f; + return new Result( + resultString, + null, + new ResultPoint[]{ + new ResultPoint(left, (float) rowNumber), + new ResultPoint(right, (float) rowNumber)}, + BarcodeFormat.CODE_93); + + } + + private static int[] findAsteriskPattern(BitArray row) throws NotFoundException { + int width = row.getSize(); + int rowOffset = 0; + while (rowOffset < width) { + if (row.get(rowOffset)) { + break; + } + rowOffset++; + } + + int counterPosition = 0; + int[] counters = new int[6]; + int patternStart = rowOffset; + boolean isWhite = false; + int patternLength = counters.length; + + for (int i = rowOffset; i < width; i++) { + boolean pixel = row.get(i); + if (pixel ^ isWhite) { + counters[counterPosition]++; + } else { + if (counterPosition == patternLength - 1) { + if (toPattern(counters) == ASTERISK_ENCODING) { + return new int[]{patternStart, i}; + } + 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++; + } + counters[counterPosition] = 1; + isWhite = !isWhite; + } + } + throw NotFoundException.getNotFoundInstance(); + } + + private static int toPattern(int[] counters) { + int max = counters.length; + int sum = 0; + for (int i = 0; i < max; i++) { + sum += counters[i]; + } + int pattern = 0; + for (int i = 0; i < max; i++) { + int scaledShifted = (counters[i] << INTEGER_MATH_SHIFT) * 9 / sum; + int scaledUnshifted = scaledShifted >> INTEGER_MATH_SHIFT; + if ((scaledShifted & 0xFF) > 0x7F) { + scaledUnshifted++; + } + if (scaledUnshifted < 1 || scaledUnshifted > 4) { + return -1; + } + if ((i & 0x01) == 0) { + for (int j = 0; j < scaledUnshifted; j++) { + pattern = (pattern << 1) | 0x01; + } + } else { + pattern <<= scaledUnshifted; + } + } + return pattern; + } + + private static char patternToChar(int pattern) throws NotFoundException { + for (int i = 0; i < CHARACTER_ENCODINGS.length; i++) { + if (CHARACTER_ENCODINGS[i] == pattern) { + return ALPHABET[i]; + } + } + throw NotFoundException.getNotFoundInstance(); + } + + private static String decodeExtended(StringBuffer encoded) throws FormatException { + int length = encoded.length(); + StringBuffer decoded = new StringBuffer(length); + for (int i = 0; i < length; i++) { + char c = encoded.charAt(i); + if (c >= 'a' && c <= 'd') { + char next = encoded.charAt(i + 1); + char decodedChar = '\0'; + switch (c) { + case 'd': + // +A to +Z map to a to z + if (next >= 'A' && next <= 'Z') { + decodedChar = (char) (next + 32); + } else { + throw FormatException.getFormatInstance(); + } + break; + case 'a': + // $A to $Z map to control codes SH to SB + if (next >= 'A' && next <= 'Z') { + decodedChar = (char) (next - 64); + } else { + throw FormatException.getFormatInstance(); + } + break; + case 'b': + // %A to %E map to control codes ESC to US + if (next >= 'A' && next <= 'E') { + decodedChar = (char) (next - 38); + } else if (next >= 'F' && next <= 'W') { + decodedChar = (char) (next - 11); + } else { + throw FormatException.getFormatInstance(); + } + break; + case 'c': + // /A to /O map to ! to , and /Z maps to : + if (next >= 'A' && next <= 'O') { + decodedChar = (char) (next - 32); + } else if (next == 'Z') { + decodedChar = ':'; + } else { + throw FormatException.getFormatInstance(); + } + break; + } + decoded.append(decodedChar); + // bump up i again since we read two characters + i++; + } else { + decoded.append(c); + } + } + return decoded.toString(); + } + + private static void checkChecksums(StringBuffer result) throws ChecksumException { + int length = result.length(); + checkOneChecksum(result, length - 2, 20); + checkOneChecksum(result, length - 1, 15); + } + + private static void checkOneChecksum(StringBuffer result, int checkPosition, int weightMax) + throws ChecksumException { + int weight = 1; + int total = 0; + for (int i = checkPosition - 1; i >= 0; i--) { + total += weight * ALPHABET_STRING.indexOf(result.charAt(i)); + if (++weight > weightMax) { + weight = 1; + } + } + if (result.charAt(checkPosition) != ALPHABET[total % 47]) { + throw ChecksumException.getChecksumInstance(); + } + } + +} diff --git a/core/src/com/google/zxing/oned/MultiFormatOneDReader.java b/core/src/com/google/zxing/oned/MultiFormatOneDReader.java index ccf63dd07..2e3126f53 100644 --- a/core/src/com/google/zxing/oned/MultiFormatOneDReader.java +++ b/core/src/com/google/zxing/oned/MultiFormatOneDReader.java @@ -53,6 +53,9 @@ public final class MultiFormatOneDReader extends OneDReader { if (possibleFormats.contains(BarcodeFormat.CODE_39)) { readers.addElement(new Code39Reader(useCode39CheckDigit)); } + if (possibleFormats.contains(BarcodeFormat.CODE_93)) { + readers.addElement(new Code93Reader()); + } if (possibleFormats.contains(BarcodeFormat.CODE_128)) { readers.addElement(new Code128Reader()); } @@ -69,6 +72,7 @@ public final class MultiFormatOneDReader extends OneDReader { if (readers.isEmpty()) { readers.addElement(new MultiFormatUPCEANReader(hints)); readers.addElement(new Code39Reader()); + readers.addElement(new Code93Reader()); readers.addElement(new Code128Reader()); readers.addElement(new ITFReader()); readers.addElement(new RSS14Reader()); diff --git a/core/src/com/google/zxing/oned/OneDReader.java b/core/src/com/google/zxing/oned/OneDReader.java index bad1f6a08..102483c6e 100644 --- a/core/src/com/google/zxing/oned/OneDReader.java +++ b/core/src/com/google/zxing/oned/OneDReader.java @@ -40,7 +40,7 @@ import java.util.Hashtable; */ public abstract class OneDReader implements Reader { - private static final int INTEGER_MATH_SHIFT = 8; + protected static final int INTEGER_MATH_SHIFT = 8; protected static final int PATTERN_MATCH_RESULT_SCALE_FACTOR = 1 << INTEGER_MATH_SHIFT; public Result decode(BinaryBitmap image) throws NotFoundException, FormatException { diff --git a/core/test/data/blackbox/code93-1/1.gif b/core/test/data/blackbox/code93-1/1.gif new file mode 100644 index 0000000000000000000000000000000000000000..bc629ed8960e0bccd387049375a09bf6f1abb048 GIT binary patch literal 4266 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 literal 0 HcmV?d00001 diff --git a/core/test/data/blackbox/code93-1/1.txt b/core/test/data/blackbox/code93-1/1.txt new file mode 100644 index 000000000..6a537b5b3 --- /dev/null +++ b/core/test/data/blackbox/code93-1/1.txt @@ -0,0 +1 @@ +1234567890 \ No newline at end of file diff --git a/core/test/data/blackbox/code93-1/2.gif b/core/test/data/blackbox/code93-1/2.gif new file mode 100644 index 0000000000000000000000000000000000000000..3647cee48566566a4d0c64db8009df65e2ac434d GIT binary patch literal 5785 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 N_r>r3xm%Fl{{lOe5WxTd literal 0 HcmV?d00001 diff --git a/core/test/data/blackbox/code93-1/3.txt b/core/test/data/blackbox/code93-1/3.txt new file mode 100644 index 000000000..418d6c385 --- /dev/null +++ b/core/test/data/blackbox/code93-1/3.txt @@ -0,0 +1 @@ +DATA \ No newline at end of file diff --git a/core/test/src/com/google/zxing/oned/Code128BlackBox2TestCase.java b/core/test/src/com/google/zxing/oned/Code128BlackBox2TestCase.java index b2fb164f1..1e134fdd9 100644 --- a/core/test/src/com/google/zxing/oned/Code128BlackBox2TestCase.java +++ b/core/test/src/com/google/zxing/oned/Code128BlackBox2TestCase.java @@ -27,8 +27,8 @@ public final class Code128BlackBox2TestCase extends AbstractBlackBoxTestCase { public Code128BlackBox2TestCase() { super("test/data/blackbox/code128-2", new MultiFormatReader(), BarcodeFormat.CODE_128); - addTest(33, 39, 0.0f); - addTest(34, 39, 180.0f); + addTest(35, 39, 0.0f); + addTest(36, 39, 180.0f); } } \ No newline at end of file diff --git a/core/test/src/com/google/zxing/oned/Code93BlackBox1TestCase.java b/core/test/src/com/google/zxing/oned/Code93BlackBox1TestCase.java new file mode 100644 index 000000000..f8f1d87f7 --- /dev/null +++ b/core/test/src/com/google/zxing/oned/Code93BlackBox1TestCase.java @@ -0,0 +1,34 @@ +/* + * Copyright 2008 ZXing authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.zxing.oned; + +import com.google.zxing.BarcodeFormat; +import com.google.zxing.MultiFormatReader; +import com.google.zxing.common.AbstractBlackBoxTestCase; + +/** + * @author Sean Owen + */ +public final class Code93BlackBox1TestCase extends AbstractBlackBoxTestCase { + + public Code93BlackBox1TestCase() { + super("test/data/blackbox/code93-1", new MultiFormatReader(), BarcodeFormat.CODE_93); + addTest(3, 3, 0.0f); + addTest(3, 3, 180.0f); + } + +} \ No newline at end of file diff --git a/core/test/src/com/google/zxing/oned/EAN13BlackBox1TestCase.java b/core/test/src/com/google/zxing/oned/EAN13BlackBox1TestCase.java index 07ee09317..61fc1350a 100644 --- a/core/test/src/com/google/zxing/oned/EAN13BlackBox1TestCase.java +++ b/core/test/src/com/google/zxing/oned/EAN13BlackBox1TestCase.java @@ -27,8 +27,8 @@ public final class EAN13BlackBox1TestCase extends AbstractBlackBoxTestCase { public EAN13BlackBox1TestCase() { super("test/data/blackbox/ean13-1", new MultiFormatReader(), BarcodeFormat.EAN_13); - addTest(28, 31, 0.0f); - addTest(26, 31, 180.0f); + addTest(29, 31, 0.0f); + addTest(27, 31, 180.0f); } } \ No newline at end of file diff --git a/core/test/src/com/google/zxing/oned/EAN13BlackBox2TestCase.java b/core/test/src/com/google/zxing/oned/EAN13BlackBox2TestCase.java index 6f7a98dec..155dd01b8 100644 --- a/core/test/src/com/google/zxing/oned/EAN13BlackBox2TestCase.java +++ b/core/test/src/com/google/zxing/oned/EAN13BlackBox2TestCase.java @@ -29,7 +29,7 @@ public final class EAN13BlackBox2TestCase extends AbstractBlackBoxTestCase { public EAN13BlackBox2TestCase() { super("test/data/blackbox/ean13-2", new MultiFormatReader(), BarcodeFormat.EAN_13); - addTest(10, 16, 0.0f); + addTest(11, 16, 0.0f); addTest(10, 16, 180.0f); } diff --git a/core/test/src/com/google/zxing/oned/EAN13BlackBox3TestCase.java b/core/test/src/com/google/zxing/oned/EAN13BlackBox3TestCase.java index 007003116..a114993b8 100644 --- a/core/test/src/com/google/zxing/oned/EAN13BlackBox3TestCase.java +++ b/core/test/src/com/google/zxing/oned/EAN13BlackBox3TestCase.java @@ -27,8 +27,8 @@ public final class EAN13BlackBox3TestCase extends AbstractBlackBoxTestCase { public EAN13BlackBox3TestCase() { super("test/data/blackbox/ean13-3", new MultiFormatReader(), BarcodeFormat.EAN_13); - addTest(49, 55, 0.0f); - addTest(52, 55, 180.0f); + addTest(53, 55, 0.0f); + addTest(55, 55, 180.0f); } } diff --git a/core/test/src/com/google/zxing/oned/ITFBlackBox1TestCase.java b/core/test/src/com/google/zxing/oned/ITFBlackBox1TestCase.java index ad488dc6a..64050c901 100644 --- a/core/test/src/com/google/zxing/oned/ITFBlackBox1TestCase.java +++ b/core/test/src/com/google/zxing/oned/ITFBlackBox1TestCase.java @@ -28,7 +28,7 @@ public final class ITFBlackBox1TestCase extends AbstractBlackBoxTestCase { public ITFBlackBox1TestCase() { super("test/data/blackbox/itf-1", new MultiFormatReader(), BarcodeFormat.ITF); addTest(9, 12, 0.0f); - addTest(8, 12, 180.0f); + addTest(12, 12, 180.0f); } } diff --git a/core/test/src/com/google/zxing/oned/ITFBlackBox2TestCase.java b/core/test/src/com/google/zxing/oned/ITFBlackBox2TestCase.java index 72f321c62..58ff0a6b5 100644 --- a/core/test/src/com/google/zxing/oned/ITFBlackBox2TestCase.java +++ b/core/test/src/com/google/zxing/oned/ITFBlackBox2TestCase.java @@ -28,7 +28,7 @@ public final class ITFBlackBox2TestCase extends AbstractBlackBoxTestCase { public ITFBlackBox2TestCase() { super("test/data/blackbox/itf-2", new MultiFormatReader(), BarcodeFormat.ITF); addTest(8, 9, 0.0f); - addTest(8, 9, 180.0f); + addTest(7, 9, 180.0f); } } diff --git a/core/test/src/com/google/zxing/oned/UPCABlackBox1TestCase.java b/core/test/src/com/google/zxing/oned/UPCABlackBox1TestCase.java index 84784c73e..50bbb848b 100644 --- a/core/test/src/com/google/zxing/oned/UPCABlackBox1TestCase.java +++ b/core/test/src/com/google/zxing/oned/UPCABlackBox1TestCase.java @@ -27,8 +27,8 @@ public final class UPCABlackBox1TestCase extends AbstractBlackBoxTestCase { public UPCABlackBox1TestCase() { super("test/data/blackbox/upca-1", new MultiFormatReader(), BarcodeFormat.UPC_A); - addTest(15, 18, 0.0f); - addTest(15, 18, 180.0f); + addTest(16, 18, 0.0f); + addTest(17, 18, 180.0f); } } \ No newline at end of file diff --git a/core/test/src/com/google/zxing/oned/UPCABlackBox2TestCase.java b/core/test/src/com/google/zxing/oned/UPCABlackBox2TestCase.java index 8adccd738..297680d51 100644 --- a/core/test/src/com/google/zxing/oned/UPCABlackBox2TestCase.java +++ b/core/test/src/com/google/zxing/oned/UPCABlackBox2TestCase.java @@ -27,8 +27,8 @@ public final class UPCABlackBox2TestCase extends AbstractBlackBoxTestCase { public UPCABlackBox2TestCase() { super("test/data/blackbox/upca-2", new MultiFormatReader(), BarcodeFormat.UPC_A); - addTest(25, 35, 0.0f); - addTest(25, 35, 180.0f); + addTest(29, 35, 0.0f); + addTest(31, 35, 180.0f); } } diff --git a/core/test/src/com/google/zxing/oned/UPCABlackBox3ReflectiveTestCase.java b/core/test/src/com/google/zxing/oned/UPCABlackBox3ReflectiveTestCase.java index b1c4dbc43..2bd34555a 100644 --- a/core/test/src/com/google/zxing/oned/UPCABlackBox3ReflectiveTestCase.java +++ b/core/test/src/com/google/zxing/oned/UPCABlackBox3ReflectiveTestCase.java @@ -27,8 +27,8 @@ public final class UPCABlackBox3ReflectiveTestCase extends AbstractBlackBoxTestC public UPCABlackBox3ReflectiveTestCase() { super("test/data/blackbox/upca-3", new MultiFormatReader(), BarcodeFormat.UPC_A); - addTest(8, 8, 0.0f); - addTest(6, 9, 180.0f); + addTest(7, 8, 0.0f); + addTest(7, 9, 180.0f); } } diff --git a/core/test/src/com/google/zxing/oned/UPCABlackBox4TestCase.java b/core/test/src/com/google/zxing/oned/UPCABlackBox4TestCase.java index 7c20af6d3..a1888736a 100644 --- a/core/test/src/com/google/zxing/oned/UPCABlackBox4TestCase.java +++ b/core/test/src/com/google/zxing/oned/UPCABlackBox4TestCase.java @@ -27,8 +27,8 @@ public final class UPCABlackBox4TestCase extends AbstractBlackBoxTestCase { public UPCABlackBox4TestCase() { super("test/data/blackbox/upca-4", new MultiFormatReader(), BarcodeFormat.UPC_A); - addTest(7, 11, 0.0f); - addTest(8, 11, 180.0f); + addTest(8, 11, 0.0f); + addTest(9, 11, 180.0f); } } diff --git a/core/test/src/com/google/zxing/oned/UPCEBlackBox2TestCase.java b/core/test/src/com/google/zxing/oned/UPCEBlackBox2TestCase.java index 885402af1..6c322a746 100644 --- a/core/test/src/com/google/zxing/oned/UPCEBlackBox2TestCase.java +++ b/core/test/src/com/google/zxing/oned/UPCEBlackBox2TestCase.java @@ -28,7 +28,7 @@ public final class UPCEBlackBox2TestCase extends AbstractBlackBoxTestCase { public UPCEBlackBox2TestCase() { super("test/data/blackbox/upce-2", new MultiFormatReader(), BarcodeFormat.UPC_E); addTest(30, 35, 0.0f); - addTest(29, 35, 180.0f); + addTest(31, 35, 180.0f); } } diff --git a/core/test/src/com/google/zxing/oned/UPCEBlackBox3ReflectiveTestCase.java b/core/test/src/com/google/zxing/oned/UPCEBlackBox3ReflectiveTestCase.java index 0cc9b4a50..766356c62 100644 --- a/core/test/src/com/google/zxing/oned/UPCEBlackBox3ReflectiveTestCase.java +++ b/core/test/src/com/google/zxing/oned/UPCEBlackBox3ReflectiveTestCase.java @@ -27,8 +27,8 @@ public final class UPCEBlackBox3ReflectiveTestCase extends AbstractBlackBoxTestC public UPCEBlackBox3ReflectiveTestCase() { super("test/data/blackbox/upce-3", new MultiFormatReader(), BarcodeFormat.UPC_E); - addTest(4, 8, 0.0f); - addTest(4, 8, 180.0f); + addTest(6, 8, 0.0f); + addTest(6, 8, 180.0f); } } diff --git a/javase/src/com/google/zxing/client/j2se/CommandLineRunner.java b/javase/src/com/google/zxing/client/j2se/CommandLineRunner.java index 8ac1de4d9..877733729 100644 --- a/javase/src/com/google/zxing/client/j2se/CommandLineRunner.java +++ b/javase/src/com/google/zxing/client/j2se/CommandLineRunner.java @@ -116,6 +116,7 @@ public final class CommandLineRunner { vector.addElement(BarcodeFormat.RSS14); if (!productsOnly) { vector.addElement(BarcodeFormat.CODE_39); + vector.addElement(BarcodeFormat.CODE_93); vector.addElement(BarcodeFormat.CODE_128); vector.addElement(BarcodeFormat.ITF); vector.addElement(BarcodeFormat.QR_CODE); diff --git a/zxingorg/src/com/google/zxing/web/DecodeServlet.java b/zxingorg/src/com/google/zxing/web/DecodeServlet.java index 70a35556c..0a26eca72 100644 --- a/zxingorg/src/com/google/zxing/web/DecodeServlet.java +++ b/zxingorg/src/com/google/zxing/web/DecodeServlet.java @@ -107,6 +107,7 @@ public final class DecodeServlet extends HttpServlet { possibleFormats.add(BarcodeFormat.EAN_8); possibleFormats.add(BarcodeFormat.EAN_13); possibleFormats.add(BarcodeFormat.CODE_39); + possibleFormats.add(BarcodeFormat.CODE_93); possibleFormats.add(BarcodeFormat.CODE_128); possibleFormats.add(BarcodeFormat.ITF); possibleFormats.add(BarcodeFormat.RSS14);