diff --git a/AUTHORS b/AUTHORS index b95a330c9..b2340cc03 100644 --- a/AUTHORS +++ b/AUTHORS @@ -89,6 +89,7 @@ Ralf Kistner Randy Shen (Acer) Rasmus Schrøder Sørensen Richard Hřivňák +robert@prog.olsztyn Romain Pechayre Roman Nurik (Google) Rustam Abdullaev diff --git a/core/src/main/java/com/google/zxing/oned/Code128Reader.java b/core/src/main/java/com/google/zxing/oned/Code128Reader.java index 74ce5839c..82540c729 100644 --- a/core/src/main/java/com/google/zxing/oned/Code128Reader.java +++ b/core/src/main/java/com/google/zxing/oned/Code128Reader.java @@ -273,6 +273,8 @@ public final class Code128Reader extends OneDReader { int checksumTotal = startCode; int multiplier = 0; boolean lastCharacterWasPrintable = true; + boolean upperMode = false; + boolean shiftUpperMode = false; while (!done) { @@ -316,9 +318,19 @@ public final class Code128Reader extends OneDReader { case CODE_CODE_A: if (code < 64) { - result.append((char) (' ' + code)); + if (shiftUpperMode == upperMode) { + result.append((char) (' ' + code)); + } else { + result.append((char) (' ' + code + 128)); + } + shiftUpperMode = false; } else if (code < 96) { - result.append((char) (code - 64)); + if (shiftUpperMode == upperMode) { + result.append((char) (code - 64)); + } else { + result.append((char) (code + 64)); + } + shiftUpperMode = false; } else { // Don't let CODE_STOP, which always appears, affect whether whether we think the last // code was printable or not. @@ -340,9 +352,19 @@ public final class Code128Reader extends OneDReader { break; case CODE_FNC_2: case CODE_FNC_3: - case CODE_FNC_4_A: // do nothing? break; + case CODE_FNC_4_A: + if (!upperMode && shiftUpperMode) { + upperMode = true; + shiftUpperMode = false; + } else if (upperMode && shiftUpperMode) { + upperMode = false; + shiftUpperMode = false; + } else { + shiftUpperMode = true; + } + break; case CODE_SHIFT: isNextShifted = true; codeSet = CODE_CODE_B; @@ -361,7 +383,12 @@ public final class Code128Reader extends OneDReader { break; case CODE_CODE_B: if (code < 96) { - result.append((char) (' ' + code)); + if (shiftUpperMode == upperMode) { + result.append((char) (' ' + code)); + } else { + result.append((char) (' ' + code + 128)); + } + shiftUpperMode = false; } else { if (code != CODE_STOP) { lastCharacterWasPrintable = false; @@ -381,9 +408,19 @@ public final class Code128Reader extends OneDReader { break; case CODE_FNC_2: case CODE_FNC_3: - case CODE_FNC_4_B: // do nothing? break; + case CODE_FNC_4_B: + if (!upperMode && shiftUpperMode) { + upperMode = true; + shiftUpperMode = false; + } else if (upperMode && shiftUpperMode) { + upperMode = false; + shiftUpperMode = false; + } else { + shiftUpperMode = true; + } + break; case CODE_SHIFT: isNextShifted = true; codeSet = CODE_CODE_A; diff --git a/core/src/test/java/com/google/zxing/oned/Code128BlackBox1TestCase.java b/core/src/test/java/com/google/zxing/oned/Code128BlackBox1TestCase.java index 62fc70330..1a49f0ea2 100644 --- a/core/src/test/java/com/google/zxing/oned/Code128BlackBox1TestCase.java +++ b/core/src/test/java/com/google/zxing/oned/Code128BlackBox1TestCase.java @@ -27,8 +27,8 @@ public final class Code128BlackBox1TestCase extends AbstractBlackBoxTestCase { public Code128BlackBox1TestCase() { super("src/test/resources/blackbox/code128-1", new MultiFormatReader(), BarcodeFormat.CODE_128); - addTest(5, 5, 0.0f); - addTest(5, 5, 180.0f); + addTest(6, 6, 0.0f); + addTest(6, 6, 180.0f); } } \ No newline at end of file diff --git a/core/src/test/resources/blackbox/code128-1/6.png b/core/src/test/resources/blackbox/code128-1/6.png new file mode 100644 index 000000000..eeff596e4 Binary files /dev/null and b/core/src/test/resources/blackbox/code128-1/6.png differ diff --git a/core/src/test/resources/blackbox/code128-1/6.txt b/core/src/test/resources/blackbox/code128-1/6.txt new file mode 100644 index 000000000..ba0935420 --- /dev/null +++ b/core/src/test/resources/blackbox/code128-1/6.txt @@ -0,0 +1 @@ +óóóó1234óóabózz \ No newline at end of file