diff --git a/src/common/eci_string_builder.rs b/src/common/eci_string_builder.rs index b826b6a..1ce1fb8 100644 --- a/src/common/eci_string_builder.rs +++ b/src/common/eci_string_builder.rs @@ -45,7 +45,7 @@ impl ECIStringBuilder { Self { current_bytes: Vec::new(), result: String::new(), - current_charset: encoding::all::UTF_8, + current_charset: encoding::all::ISO_8859_1, } } pub fn with_capacity(initial_capacity: usize) -> Self { diff --git a/src/datamatrix/decoder/decoded_bit_stream_parser.rs b/src/datamatrix/decoder/decoded_bit_stream_parser.rs index 7a0135d..c26d893 100644 --- a/src/datamatrix/decoder/decoded_bit_stream_parser.rs +++ b/src/datamatrix/decoder/decoded_bit_stream_parser.rs @@ -195,6 +195,9 @@ fn decodeAsciiSegment( fnc1positions: &mut Vec, ) -> Result { let mut upperShift = false; + let mut firstFNC1Position = 1; + let mut firstCodeword = true; + let mut sai = StructuredAppendInfo::default(); loop { let mut oneByte = bits.readBits(8)?; if oneByte == 0 { @@ -226,14 +229,24 @@ fn decodeAsciiSegment( 231=> // Latch to Base 256 encodation return Ok(Mode::BASE256_ENCODE), 232=> {// FNC1 - fnc1positions.push(result.len()); - result.append_char( 29 as char); // translate as ASCII 29 + if (bits.getByteOffset() == firstFNC1Position) + {/*result.symbology.modifier = '2';*/} // GS1 + else if (bits.getByteOffset() == firstFNC1Position + 1) + {/*result.symbology.modifier = '3';*/} // AIM, note no AIM Application Indicator format defined, ISO 16022:2006 11.2 + else + {fnc1positions.push(result.len()); + result.append_char( 29 as char); }// translate as ASCII 29 }, 233| // Structured Append 234=> // Reader Programming // Ignore these symbols for now //throw ReaderException.getInstance(); - {}, + { + if (!firstCodeword) // Must be first ISO 16022:2006 5.6.1 + {return Err(Exceptions::FormatException(Some("structured append tag must be first code word".to_owned())));} + parse_structured_append(bits, &mut sai)?; + firstFNC1Position = 5; + }, 235=> // Upper Shift (shift to Extended ASCII) upperShift = true, 236=> {// 05 Macro @@ -265,6 +278,7 @@ fn decodeAsciiSegment( if bits.available() == 0 { break; } + firstCodeword = false; } //while (bits.available() > 0); Ok(Mode::ASCII_ENCODE) } @@ -412,7 +426,7 @@ fn decodeTextSegment( } else if cValue < TEXT_BASIC_SET_CHARS.len() as u32 { let textChar = TEXT_BASIC_SET_CHARS[cValue as usize]; if upperShift { - result.append_char(char::from_u32(textChar as u32 + 128_u32).unwrap()); + result.append_char(char::from_u32(textChar as u32 + 128).unwrap()); upperShift = false; } else { result.append_char(textChar); @@ -667,15 +681,30 @@ fn decodeBase256Segment( * See ISO 16022:2007, 5.4.1 */ fn decodeECISegment(bits: &mut BitSource, result: &mut ECIStringBuilder) -> Result<(), Exceptions> { - if bits.available() < 8 { - return Err(Exceptions::FormatException(None)); - } - let c1 = bits.readBits(8)?; - if c1 <= 127 { - result.appendECI(c1 - 1)?; + let firstByte = bits.readBits(8)?; + if (firstByte <= 127) { + return result.appendECI(firstByte - 1); } - Ok(()) + let secondByte = bits.readBits(8)?; + if (firstByte <= 191) { + return result.appendECI(firstByte - 1); + } + + let thirdByte = bits.readBits(8)?; + + return result + .appendECI((firstByte - 192) * 64516 + 16383 + (secondByte - 1) * 254 + thirdByte - 1); + + // if bits.available() < 8 { + // return Err(Exceptions::FormatException(None)); + // } + // let c1 = bits.readBits(8)?; + // if c1 <= 127 { + // result.appendECI(c1 - 1)?; + // } + + // Ok(()) //currently we only support character set ECIs /*} else { if (bits.available() < 8) { @@ -692,6 +721,48 @@ fn decodeECISegment(bits: &mut BitSource, result: &mut ECIStringBuilder) -> Resu }*/ } +/** +* See ISO 16022:2006, 5.6 +*/ +fn parse_structured_append( + bits: &mut BitSource, + sai: &mut StructuredAppendInfo, +) -> Result<(), Exceptions> { + // 5.6.2 Table 8 + let symbolSequenceIndicator = bits.readBits(8)?; + sai.index = (symbolSequenceIndicator >> 4) as i32; + sai.count = (17 - (symbolSequenceIndicator & 0x0F)) as i32; // 2-16 permitted, 17 invalid + + if (sai.count == 17 || sai.count <= sai.index) + // If info doesn't make sense + { + sai.count = 0; // Choose to mark count as unknown + } + + let fileId1 = bits.readBits(8)?; // File identification 1 + let fileId2 = bits.readBits(8)?; // File identification 2 + + // There's no conversion method or meaning given to the 2 file id codewords in Section 5.6.3, apart from + // saying that each value should be 1-254. Choosing here to represent them as base 256. + sai.id = ((fileId1 << 8) | fileId2).to_string(); + Ok(()) +} +struct StructuredAppendInfo { + index: i32, //= -1; + count: i32, // = -1; + id: String, +} + +impl Default for StructuredAppendInfo { + fn default() -> Self { + Self { + index: -1, + count: -1, + id: Default::default(), + } + } +} + /** * See ISO 16022:2006, Annex B, B.2 */ diff --git a/test_resources/blackbox/datamatrix-1/#378.png b/test_resources/blackbox/datamatrix-1/#378.png new file mode 100644 index 0000000..6397b15 Binary files /dev/null and b/test_resources/blackbox/datamatrix-1/#378.png differ diff --git a/test_resources/blackbox/datamatrix-1/#378.txt b/test_resources/blackbox/datamatrix-1/#378.txt new file mode 100644 index 0000000..d410d15 --- /dev/null +++ b/test_resources/blackbox/datamatrix-1/#378.txt @@ -0,0 +1 @@ +Data Matrix Code \ No newline at end of file diff --git a/test_resources/blackbox/datamatrix-1/0123456789.result.txt b/test_resources/blackbox/datamatrix-1/0123456789.result.txt new file mode 100644 index 0000000..771cae7 --- /dev/null +++ b/test_resources/blackbox/datamatrix-1/0123456789.result.txt @@ -0,0 +1,2 @@ +symbologyIdentifier=]d1 +isMirrored=false diff --git a/test_resources/blackbox/datamatrix-1/144x144_wrong.png b/test_resources/blackbox/datamatrix-1/144x144_wrong.png new file mode 100644 index 0000000..d298c06 Binary files /dev/null and b/test_resources/blackbox/datamatrix-1/144x144_wrong.png differ diff --git a/test_resources/blackbox/datamatrix-1/144x144_wrong.txt b/test_resources/blackbox/datamatrix-1/144x144_wrong.txt new file mode 100644 index 0000000..102e452 --- /dev/null +++ b/test_resources/blackbox/datamatrix-1/144x144_wrong.txt @@ -0,0 +1,5 @@ +Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. + +Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. + +Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse - there is still some space, so I'm filling it with letters. And I don't speak latin.... - there is still some space, so I'm filling it with letters. And I don't speak latin.... - there is still some space, so I'm filling it with letters. And I don't speak latin.... - there is still some space, so I'm filling it with letters. And I don't speak latin.... \ No newline at end of file diff --git a/test_resources/blackbox/datamatrix-1/abcd-36x12-mirrored.png b/test_resources/blackbox/datamatrix-1/abcd-36x12-mirrored.png new file mode 100644 index 0000000..80909e8 Binary files /dev/null and b/test_resources/blackbox/datamatrix-1/abcd-36x12-mirrored.png differ diff --git a/test_resources/blackbox/datamatrix-1/abcd-36x12-mirrored.result.txt b/test_resources/blackbox/datamatrix-1/abcd-36x12-mirrored.result.txt new file mode 100644 index 0000000..f32b8d9 --- /dev/null +++ b/test_resources/blackbox/datamatrix-1/abcd-36x12-mirrored.result.txt @@ -0,0 +1 @@ +isMirrored=true diff --git a/test_resources/blackbox/datamatrix-1/abcd-36x12-mirrored.txt b/test_resources/blackbox/datamatrix-1/abcd-36x12-mirrored.txt new file mode 100644 index 0000000..3005ca6 --- /dev/null +++ b/test_resources/blackbox/datamatrix-1/abcd-36x12-mirrored.txt @@ -0,0 +1 @@ +abcdefghijklmnopq \ No newline at end of file diff --git a/test_resources/blackbox/datamatrix-1/eci-mixed.bin b/test_resources/blackbox/datamatrix-1/eci-mixed.bin new file mode 100644 index 0000000..7f4b77e --- /dev/null +++ b/test_resources/blackbox/datamatrix-1/eci-mixed.bin @@ -0,0 +1 @@ +ᡡͱ𐌶@@@@@@@@@@_ \ No newline at end of file diff --git a/test_resources/blackbox/datamatrix-1/eci-mixed.metadata.txt b/test_resources/blackbox/datamatrix-1/eci-mixed.metadata.txt new file mode 100644 index 0000000..352fff3 --- /dev/null +++ b/test_resources/blackbox/datamatrix-1/eci-mixed.metadata.txt @@ -0,0 +1,2 @@ +symbologyIdentifier=]d1 +contentType=UnknownECI diff --git a/test_resources/blackbox/datamatrix-1/eci-mixed.png b/test_resources/blackbox/datamatrix-1/eci-mixed.png new file mode 100644 index 0000000..dcbd6a8 Binary files /dev/null and b/test_resources/blackbox/datamatrix-1/eci-mixed.png differ diff --git a/test_resources/blackbox/datamatrix-1/eci.png b/test_resources/blackbox/datamatrix-1/eci.png new file mode 100644 index 0000000..4fcf222 Binary files /dev/null and b/test_resources/blackbox/datamatrix-1/eci.png differ diff --git a/test_resources/blackbox/datamatrix-1/eci.txt b/test_resources/blackbox/datamatrix-1/eci.txt new file mode 100644 index 0000000..63ad644 --- /dev/null +++ b/test_resources/blackbox/datamatrix-1/eci.txt @@ -0,0 +1 @@ +¶Ж \ No newline at end of file diff --git a/test_resources/blackbox/datamatrix-1/gs1-figure-4.15.1-2-32x32.metadata.txt b/test_resources/blackbox/datamatrix-1/gs1-figure-4.15.1-2-32x32.metadata.txt new file mode 100644 index 0000000..1edb45e --- /dev/null +++ b/test_resources/blackbox/datamatrix-1/gs1-figure-4.15.1-2-32x32.metadata.txt @@ -0,0 +1,2 @@ +symbologyIdentifier=]d2 +contentType=GS1 diff --git a/test_resources/blackbox/datamatrix-1/gs1-figure-4.15.1-2-32x32.png b/test_resources/blackbox/datamatrix-1/gs1-figure-4.15.1-2-32x32.png new file mode 100644 index 0000000..b799569 Binary files /dev/null and b/test_resources/blackbox/datamatrix-1/gs1-figure-4.15.1-2-32x32.png differ diff --git a/test_resources/blackbox/datamatrix-1/gs1-figure-4.15.1-2-32x32.txt b/test_resources/blackbox/datamatrix-1/gs1-figure-4.15.1-2-32x32.txt new file mode 100644 index 0000000..b2c7f13 --- /dev/null +++ b/test_resources/blackbox/datamatrix-1/gs1-figure-4.15.1-2-32x32.txt @@ -0,0 +1 @@ +01095040000591012112345678p901101234567p171411208200http://www.gs1.org/demo/ \ No newline at end of file diff --git a/test_resources/blackbox/datamatrix-1/mod-size-1.png b/test_resources/blackbox/datamatrix-1/mod-size-1.png new file mode 100644 index 0000000..91c5565 Binary files /dev/null and b/test_resources/blackbox/datamatrix-1/mod-size-1.png differ diff --git a/test_resources/blackbox/datamatrix-1/mod-size-1.txt b/test_resources/blackbox/datamatrix-1/mod-size-1.txt new file mode 100644 index 0000000..5cce967 --- /dev/null +++ b/test_resources/blackbox/datamatrix-1/mod-size-1.txt @@ -0,0 +1 @@ +c++ \ No newline at end of file diff --git a/test_resources/blackbox/datamatrix-1/readerinit.png b/test_resources/blackbox/datamatrix-1/readerinit.png new file mode 100644 index 0000000..eeb3823 Binary files /dev/null and b/test_resources/blackbox/datamatrix-1/readerinit.png differ diff --git a/test_resources/blackbox/datamatrix-1/readerinit.result.txt b/test_resources/blackbox/datamatrix-1/readerinit.result.txt new file mode 100644 index 0000000..b3503a6 --- /dev/null +++ b/test_resources/blackbox/datamatrix-1/readerinit.result.txt @@ -0,0 +1,2 @@ +symbologyIdentifier=]d1 +readerInit=true diff --git a/test_resources/blackbox/datamatrix-1/readerinit.txt b/test_resources/blackbox/datamatrix-1/readerinit.txt new file mode 100644 index 0000000..32dd1e2 --- /dev/null +++ b/test_resources/blackbox/datamatrix-1/readerinit.txt @@ -0,0 +1 @@ +$I \ No newline at end of file diff --git a/tests/common/abstract_black_box_test_case.rs b/tests/common/abstract_black_box_test_case.rs index 8f9cda0..5faa5c3 100644 --- a/tests/common/abstract_black_box_test_case.rs +++ b/tests/common/abstract_black_box_test_case.rs @@ -466,7 +466,9 @@ impl AbstractBlackBoxTestCase { let result_text = result.getText(); if expected_text != result_text { log::info(format!( - "Content mismatch: expected '{expected_text}' but got '{result_text}'{suffix}" + "Content mismatch: expected '{}' but got '{}'{suffix}", + expected_text.escape_default(), + result_text.escape_default() )); return Ok(false); }