From 458923c3cd7afd60d214f1f130b1f97320fe74dc Mon Sep 17 00:00:00 2001 From: Sean Owen Date: Wed, 31 May 2017 10:49:41 +0100 Subject: [PATCH] Closes issue #806: bad encodation switch in non-ASCII DataMatrix encodation (credit micjahn) --- .../google/zxing/datamatrix/encoder/Base256Encoder.java | 3 ++- .../com/google/zxing/datamatrix/encoder/C40Encoder.java | 3 ++- .../google/zxing/datamatrix/encoder/EdifactEncoder.java | 1 + .../com/google/zxing/datamatrix/encoder/X12Encoder.java | 3 ++- .../zxing/datamatrix/encoder/HighLevelEncodeTestCase.java | 7 +++++++ 5 files changed, 14 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/com/google/zxing/datamatrix/encoder/Base256Encoder.java b/core/src/main/java/com/google/zxing/datamatrix/encoder/Base256Encoder.java index 96f66ed0b..a0f91de2c 100644 --- a/core/src/main/java/com/google/zxing/datamatrix/encoder/Base256Encoder.java +++ b/core/src/main/java/com/google/zxing/datamatrix/encoder/Base256Encoder.java @@ -35,7 +35,8 @@ final class Base256Encoder implements Encoder { int newMode = HighLevelEncoder.lookAheadTest(context.getMessage(), context.pos, getEncodingMode()); if (newMode != getEncodingMode()) { - context.signalEncoderChange(newMode); + // Return to ASCII encodation, which will actually handle latch to new mode + context.signalEncoderChange(HighLevelEncoder.ASCII_ENCODATION); break; } } diff --git a/core/src/main/java/com/google/zxing/datamatrix/encoder/C40Encoder.java b/core/src/main/java/com/google/zxing/datamatrix/encoder/C40Encoder.java index acd02f6c8..10644d006 100644 --- a/core/src/main/java/com/google/zxing/datamatrix/encoder/C40Encoder.java +++ b/core/src/main/java/com/google/zxing/datamatrix/encoder/C40Encoder.java @@ -59,7 +59,8 @@ class C40Encoder implements Encoder { if ((count % 3) == 0) { int newMode = HighLevelEncoder.lookAheadTest(context.getMessage(), context.pos, getEncodingMode()); if (newMode != getEncodingMode()) { - context.signalEncoderChange(newMode); + // Return to ASCII encodation, which will actually handle latch to new mode + context.signalEncoderChange(HighLevelEncoder.ASCII_ENCODATION); break; } } diff --git a/core/src/main/java/com/google/zxing/datamatrix/encoder/EdifactEncoder.java b/core/src/main/java/com/google/zxing/datamatrix/encoder/EdifactEncoder.java index dbb3f130e..3e739b4a5 100644 --- a/core/src/main/java/com/google/zxing/datamatrix/encoder/EdifactEncoder.java +++ b/core/src/main/java/com/google/zxing/datamatrix/encoder/EdifactEncoder.java @@ -39,6 +39,7 @@ final class EdifactEncoder implements Encoder { int newMode = HighLevelEncoder.lookAheadTest(context.getMessage(), context.pos, getEncodingMode()); if (newMode != getEncodingMode()) { + // Return to ASCII encodation, which will actually handle latch to new mode context.signalEncoderChange(HighLevelEncoder.ASCII_ENCODATION); break; } diff --git a/core/src/main/java/com/google/zxing/datamatrix/encoder/X12Encoder.java b/core/src/main/java/com/google/zxing/datamatrix/encoder/X12Encoder.java index d2a555f93..79daf49fd 100644 --- a/core/src/main/java/com/google/zxing/datamatrix/encoder/X12Encoder.java +++ b/core/src/main/java/com/google/zxing/datamatrix/encoder/X12Encoder.java @@ -39,7 +39,8 @@ final class X12Encoder extends C40Encoder { int newMode = HighLevelEncoder.lookAheadTest(context.getMessage(), context.pos, getEncodingMode()); if (newMode != getEncodingMode()) { - context.signalEncoderChange(newMode); + // Return to ASCII encodation, which will actually handle latch to new mode + context.signalEncoderChange(HighLevelEncoder.ASCII_ENCODATION); break; } } diff --git a/core/src/test/java/com/google/zxing/datamatrix/encoder/HighLevelEncodeTestCase.java b/core/src/test/java/com/google/zxing/datamatrix/encoder/HighLevelEncodeTestCase.java index 15235ff1b..df17af674 100644 --- a/core/src/test/java/com/google/zxing/datamatrix/encoder/HighLevelEncodeTestCase.java +++ b/core/src/test/java/com/google/zxing/datamatrix/encoder/HighLevelEncodeTestCase.java @@ -349,6 +349,13 @@ public final class HighLevelEncodeTestCase extends Assert { assertEquals("236 185 185 29 196 196 129 56", visualized); } + @Test + public void testEncodingWithStartAsX12AndLatchToEDIFACTInTheMiddle() { + + String visualized = encodeHighLevel("*MEMANT-1F-MESTECH"); + assertEquals("238 10 99 164 204 254 240 82 220 70 180 209 83 80 80 200", visualized); + } + @Ignore @Test public void testDataURL() {