diff --git a/src/common/bit_array.rs b/src/common/bit_array.rs index 4155c37..1587a85 100644 --- a/src/common/bit_array.rs +++ b/src/common/bit_array.rs @@ -417,3 +417,15 @@ impl Into> for BitArray { // arr } } + +impl Into> for BitArray { + fn into(self) -> Vec { + let mut array = vec![false; self.size]; + + for pixel in 0..self.size { + array[pixel] = bool::from(self.get(pixel)); + } + + array + } +} diff --git a/src/common/cpp_essentials/pattern.rs b/src/common/cpp_essentials/pattern.rs index 53366df..6cb699e 100644 --- a/src/common/cpp_essentials/pattern.rs +++ b/src/common/cpp_essentials/pattern.rs @@ -88,7 +88,7 @@ impl<'a> PatternView<'_> { pub fn new(bars: &'a PatternRow) -> PatternView<'a> { PatternView { data: bars, - start: 0, + start: 1, count: bars.0.len(), current: 0, } @@ -116,11 +116,12 @@ impl<'a> PatternView<'_> { Some(*self.data.0.get(self.start)?) } pub fn end(&self) -> Option { - if self.start + self.count < self.data.0.len() { - Some(self.data.0[self.start + self.count]) - } else { - None - } + // if self.start + self.count < self.data.0.len() { + // Some(self.data.0[self.start + self.count]) + // } else { + // None + // } + Some(self.data.0.len() as PatternType) } // int sum(int n = 0) const { return std::accumulate(_data, _data + (n == 0 ? _size : n), 0); } @@ -130,7 +131,7 @@ impl<'a> PatternView<'_> { self.data .0 .iter() - .skip(self.start) + .skip(self.start + self.current) .take(n) .copied() .sum::() @@ -253,6 +254,21 @@ impl<'a> PatternView<'_> { pub fn extend(&mut self) { self.count = std::cmp::max(0, self.count - self.start) } + + fn try_get_index(&self, index: isize) -> Option { + if index.abs() > self.data.0.len() as isize { + return None; + } + if index >= 0 { + let fetch_spot = ((self.start + self.current) as isize + index) as usize; + return Some(self.data.0[fetch_spot]) + } + if index.abs() > (self.start + self.current) as isize { + return None; + } + let fetch_spot = ((self.start + self.current) as isize + index) as usize; + Some(self.data.0[fetch_spot]) + } } impl<'a> std::ops::Index for PatternView<'_> { @@ -263,12 +279,13 @@ impl<'a> std::ops::Index for PatternView<'_> { panic!("array index out of bounds") } if index >= 0 { - return &self[index as usize]; + let fetch_spot = ((self.start + self.current) as isize + index) as usize; + return &self.data.0[fetch_spot] } if index.abs() > self.start as isize { panic!("array index out of bounds") } - let fetch_spot = (self.start as isize + index) as usize; + let fetch_spot = ((self.start + self.current) as isize + index) as usize; &self.data.0[fetch_spot] } } @@ -410,6 +427,7 @@ pub fn IsPattern( relaxed_threshold: Option, ) -> f32 { let relaxed_threshold = relaxed_threshold.unwrap_or(false); + let mut module_size_ref = module_size_ref; let width = view.sum(Some(LEN)); if SUM > LEN && Into::::into(width) < SUM { @@ -424,6 +442,10 @@ pub fn IsPattern( return 0.0; } + if (module_size_ref == 0.0) { + module_size_ref = module_size; + } + let threshold = module_size_ref * (0.5 + (relaxed_threshold as u8) as f32 * 0.25) + 0.5; // the offset of 0.5 is to make the code less sensitive to quantization errors for small (near 1) module sizes. @@ -478,8 +500,13 @@ pub fn FindLeftGuardBy<'a, const LEN: usize, Pred: Fn(&PatternView, Option) return Ok(window); } let end = Into::::into(view.end().ok_or(Exceptions::INDEX_OUT_OF_BOUNDS)?) - minSize; - while window.start < end { - if isGuard(&window, Some(Into::::into(window[PREV_IDX]))) { + while (window.start + window.current) < end { + let prev = if let Some(v) = window.try_get_index(PREV_IDX) { + Some(v as f32) + } else { + None + }; + if isGuard(&window, prev) { return Ok(window); } @@ -496,7 +523,15 @@ pub fn FindLeftGuard<'a, const LEN: usize, const SUM: usize, const IS_SPARCE: bo minQuietZone: f32, ) -> Result> { FindLeftGuardBy::(view, std::cmp::max(minSize, LEN), |window, spaceInPixel| { - IsPattern(window, pattern, spaceInPixel, minQuietZone, 0.0, None) != 0.0 + // perform a fast plausability test for 1:1:3:1:1 pattern + // dbg!(window[2], 2 as PatternType * std::cmp::max(window[0], window[4])); + // dbg!(window[2] < std::cmp::max(window[1], window[3])); + if (window[2] < 2 as PatternType * std::cmp::max(window[0], window[4]) + || window[2] < std::cmp::max(window[1], window[3])) + { + return false; + } + return IsPattern(window, pattern, spaceInPixel, minQuietZone, 0.0, None) != 0.0; }) } @@ -568,11 +603,15 @@ impl> From for Color { } pub fn GetPatternRowTP(matrix: &BitMatrix, r: u32, pr: &mut PatternRow, transpose: bool) { - if (transpose) { - GetPatternRow(&Into::>::into(matrix.getCol(r)), pr) + let row = if transpose { + matrix.getCol(r) } else { - GetPatternRow(&Into::>::into(matrix.getRow(r)), pr) - } + matrix.getRow(r) + }; + + let pixel_states: Vec = row.into(); + + GetPatternRow(&pixel_states, pr) } pub fn GetPatternRow + Copy + Default + From>( @@ -602,6 +641,8 @@ pub fn GetPatternRow + Copy + Default + From>( count += 1; } + // dbg!(&p_row.0); + if count != 0 { p_row.0.push(count); } diff --git a/src/qrcode/cpp_port/qr_cpp_reader.rs b/src/qrcode/cpp_port/qr_cpp_reader.rs index 1993fb9..09eb44e 100644 --- a/src/qrcode/cpp_port/qr_cpp_reader.rs +++ b/src/qrcode/cpp_port/qr_cpp_reader.rs @@ -183,6 +183,15 @@ impl Reader for QrReader { } } + if detectorResult.is_err() { + for decode_function in [DetectPureQR, DetectPureMQR] { + detectorResult = decode_function(binImg); + if detectorResult.is_ok() { + break; + } + } + } + let detectorResult = detectorResult?; // let detectorResult: DetectorResult; diff --git a/src/qrcode/cpp_port/test/MQRDecoderTest.rs b/src/qrcode/cpp_port/test/MQRDecoderTest.rs index 5a1c1a8..b298150 100644 --- a/src/qrcode/cpp_port/test/MQRDecoderTest.rs +++ b/src/qrcode/cpp_port/test/MQRDecoderTest.rs @@ -4,13 +4,11 @@ */ // SPDX-License-Identifier: Apache-2.0 -use crate::{qrcode::cpp_port::decoder::Decode, common::BitMatrix, Exceptions}; +use crate::{common::BitMatrix, qrcode::cpp_port::decoder::Decode, Exceptions}; #[test] -fn MQRCodeM3L() -{ - const CODE_STR : &str = -r"XXXXXXX X X X X +fn MQRCodeM3L() { + const CODE_STR: &str = r"XXXXXXX X X X X X X X X X XXX X XXXXXXX X XXX X X X XX @@ -26,18 +24,15 @@ X XXXXX XXX X X X X X XXX XXX XX X X XXXX "; - let bitMatrix = BitMatrix::parse_strings(CODE_STR, - "X", " ").unwrap(); + let bitMatrix = BitMatrix::parse_strings(CODE_STR, "X", " ").unwrap(); - let result = Decode(&bitMatrix).unwrap(); - assert!(result.isValid()); + let result = Decode(&bitMatrix).unwrap(); + assert!(result.isValid()); } #[test] -fn MQRCodeM3M() -{ - const CODE_STR : &str = -r"XXXXXXX X X X X +fn MQRCodeM3M() { + const CODE_STR: &str = r"XXXXXXX X X X X X X XX X XXX X X XX XX X XXX X X X @@ -53,18 +48,15 @@ XX X X X X X X X X XXXX XXX "; - let bitMatrix = BitMatrix::parse_strings(CODE_STR, - "X", " ").unwrap(); + let bitMatrix = BitMatrix::parse_strings(CODE_STR, "X", " ").unwrap(); - let result = Decode(&bitMatrix).unwrap(); - assert!(result.isValid()); + let result = Decode(&bitMatrix).unwrap(); + assert!(result.isValid()); } #[test] -fn MQRCodeM1() -{ - const CODE_STR : &str = -r"XXXXXXX X X +fn MQRCodeM1() { + const CODE_STR: &str = r"XXXXXXX X X X X X XXX X XXX X XXX X XX @@ -76,18 +68,15 @@ XX X X XXXXX X X XXXXXX X "; - let bitMatrix = BitMatrix::parse_strings(CODE_STR, - "X", " ").unwrap(); - let result = Decode(&bitMatrix).unwrap(); - assert!(result.isValid()); - assert_eq!("123", result.text()); + let bitMatrix = BitMatrix::parse_strings(CODE_STR, "X", " ").unwrap(); + let result = Decode(&bitMatrix).unwrap(); + assert!(result.isValid()); + assert_eq!("123", result.text()); } #[test] -fn MQRCodeM1Error4Bits() -{ - const CODE_STR : &str = -r"XXXXXXX X X +fn MQRCodeM1Error4Bits() { + const CODE_STR: &str = r"XXXXXXX X X X X XX X XXX X X X XXX X XX @@ -99,20 +88,20 @@ XX X X XXXXXX X XXXXXXX "; - let bitMatrix = BitMatrix::parse_strings(CODE_STR, - "X", " ").unwrap(); - let result = Decode(&bitMatrix); - dbg!(&result); - assert!(matches!(result.err(), Some(Exceptions::ReedSolomonException(_)))); - // assert_eq!(Error::Checksum, result.error()); - // assert!(result.text().is_empty()); + let bitMatrix = BitMatrix::parse_strings(CODE_STR, "X", " ").unwrap(); + let result = Decode(&bitMatrix); + dbg!(&result); + assert!(matches!( + result.err(), + Some(Exceptions::ReedSolomonException(_)) + )); + // assert_eq!(Error::Checksum, result.error()); + // assert!(result.text().is_empty()); } #[test] -fn MQRCodeM4() -{ - const CODE_STR : &str = -r"XXXXXXX X X X X X +fn MQRCodeM4() { + const CODE_STR: &str = r"XXXXXXX X X X X X X X XX X XX X XXX X X X XX X XXX X XX XX XX @@ -130,8 +119,7 @@ X X XX XXXXX X X X X X X XXXXXXX X X X "; - let bitMatrix = BitMatrix::parse_strings(CODE_STR, - "X", " ").unwrap(); - let result = Decode(&bitMatrix).unwrap(); - assert!(result.isValid()); + let bitMatrix = BitMatrix::parse_strings(CODE_STR, "X", " ").unwrap(); + let result = Decode(&bitMatrix).unwrap(); + assert!(result.isValid()); } diff --git a/src/qrcode/cpp_port/test/QRBitMatrixParserTest.rs b/src/qrcode/cpp_port/test/QRBitMatrixParserTest.rs index 23563d4..f6610e3 100644 --- a/src/qrcode/cpp_port/test/QRBitMatrixParserTest.rs +++ b/src/qrcode/cpp_port/test/QRBitMatrixParserTest.rs @@ -4,14 +4,15 @@ */ // SPDX-License-Identifier: Apache-2.0 -use crate::{qrcode::cpp_port::{ bitmatrix_parser::{ReadFormatInformation, ReadCodewords, ReadVersion}}, common::BitMatrix}; +use crate::{ + common::BitMatrix, + qrcode::cpp_port::bitmatrix_parser::{ReadCodewords, ReadFormatInformation, ReadVersion}, +}; #[test] -fn MQRCodeM3L() -{ - let bitMatrix = - BitMatrix::parse_strings( -r"XXXXXXX X X X X +fn MQRCodeM3L() { + let bitMatrix = BitMatrix::parse_strings( + r"XXXXXXX X X X X X X X X X XXX X XXXXXXX X XXX X X X XX @@ -26,22 +27,26 @@ XXX XX XXXX XXX X XXXXX XXX X X X X X XXX XXX XX X X XXXX -", "X", " ").expect("parse must parse"); +", + "X", + " ", + ) + .expect("parse must parse"); - let version = ReadVersion(&bitMatrix).unwrap(); - assert_eq!(3, version.getVersionNumber()); - let format = ReadFormatInformation(&bitMatrix, true).expect("could not read format information"); - let codewords = ReadCodewords(&bitMatrix, version, &format).expect("could not read codewords"); - assert_eq!(17, codewords.len()); - assert_eq!(0x0, codewords[10]); - assert_eq!(0xd1, codewords[11]); + let version = ReadVersion(&bitMatrix).unwrap(); + assert_eq!(3, version.getVersionNumber()); + let format = + ReadFormatInformation(&bitMatrix, true).expect("could not read format information"); + let codewords = ReadCodewords(&bitMatrix, version, &format).expect("could not read codewords"); + assert_eq!(17, codewords.len()); + assert_eq!(0x0, codewords[10]); + assert_eq!(0xd1, codewords[11]); } #[test] -fn MQRCodeM3M() -{ - let bitMatrix = BitMatrix::parse_strings( -r"XXXXXXX X X X X +fn MQRCodeM3M() { + let bitMatrix = BitMatrix::parse_strings( + r"XXXXXXX X X X X X X XX X XXX X X XX XX X XXX X X X @@ -56,14 +61,18 @@ XX XX XXXXXXX XX X X X X X X X X XXXX XXX -" -,"X", " ").unwrap(); +", + "X", + " ", + ) + .unwrap(); - let version = ReadVersion(&bitMatrix).unwrap(); - assert_eq!(3, version.getVersionNumber()); - let format = ReadFormatInformation(&bitMatrix, true).expect("could not read format information"); - let codewords = ReadCodewords(&bitMatrix, version, &format).expect("could not read codewords"); - assert_eq!(17, codewords.len()); - assert_eq!(0x0, codewords[8]); - assert_eq!(0x89, codewords[9]); + let version = ReadVersion(&bitMatrix).unwrap(); + assert_eq!(3, version.getVersionNumber()); + let format = + ReadFormatInformation(&bitMatrix, true).expect("could not read format information"); + let codewords = ReadCodewords(&bitMatrix, version, &format).expect("could not read codewords"); + assert_eq!(17, codewords.len()); + assert_eq!(0x0, codewords[8]); + assert_eq!(0x89, codewords[9]); } diff --git a/src/qrcode/cpp_port/test/QRWriterTest.cpp b/src/qrcode/cpp_port/test/QRWriterTest.cpp deleted file mode 100644 index bb33cf4..0000000 --- a/src/qrcode/cpp_port/test/QRWriterTest.cpp +++ /dev/null @@ -1,160 +0,0 @@ -/* -* Copyright 2017 Huy Cuong Nguyen -* Copyright 2008 ZXing authors -*/ -// SPDX-License-Identifier: Apache-2.0 - -#include "BitMatrixIO.h" -#include "qrcode/QRWriter.h" -#include "qrcode/QRErrorCorrectionLevel.h" - -#include "gtest/gtest.h" -#include - -using namespace ZXing; -using namespace ZXing::QRCode; - -namespace { - - void DoTest(const std::wstring& contents, ErrorCorrectionLevel ecLevel, int resolution, const char* expected) { - Writer writer; - writer.setErrorCorrectionLevel(ecLevel); - auto matrix = writer.encode(contents, resolution, resolution); - auto actual = ToString(matrix, 'X', ' ', true); - EXPECT_EQ(matrix.width(), resolution); - EXPECT_EQ(matrix.height(), resolution); - EXPECT_EQ(actual, expected); - } - -} - -TEST(QRWriterTest, OverSize) -{ - // The QR should be multiplied up to fit, with extra padding if necessary - int bigEnough = 256; - Writer writer; - BitMatrix matrix = writer.encode(L"http://www.google.com/", bigEnough, bigEnough); - EXPECT_EQ(matrix.width(), bigEnough); - EXPECT_EQ(matrix.height(), bigEnough); - - // The QR will not fit in this size, so the matrix should come back bigger - int tooSmall = 20; - matrix = writer.encode(L"http://www.google.com/", tooSmall, tooSmall); - EXPECT_GT(matrix.width(), tooSmall); - EXPECT_GT(matrix.height(), tooSmall); - - // We should also be able to handle non-square requests by padding them - int strangeWidth = 500; - int strangeHeight = 100; - matrix = writer.encode(L"http://www.google.com/", strangeWidth, strangeHeight); - EXPECT_EQ(matrix.width(), strangeWidth); - EXPECT_EQ(matrix.height(), strangeHeight); - - int overflowSize = 0x1000000; - EXPECT_THROW(writer.encode(L"http://www.google.com/", overflowSize, overflowSize), std::invalid_argument); -} - -TEST(QRWriterTest, RegressionTest) -{ - DoTest(L"http://www.google.com/", ErrorCorrectionLevel::Medium, 99, - " \n" - " \n" - " \n" - " \n" - " \n" - " \n" - " \n" - " \n" - " \n" - " \n" - " \n" - " \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X \n" - " X X X X X X X X X X X X \n" - " X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X \n" - " \n" - " \n" - " \n" - " \n" - " \n" - " \n" - " \n" - " \n" - " \n" - " \n" - " \n" - " \n" - ); -} diff --git a/src/qrcode/cpp_port/test/mod.rs b/src/qrcode/cpp_port/test/mod.rs index e48bc92..4dd3017 100644 --- a/src/qrcode/cpp_port/test/mod.rs +++ b/src/qrcode/cpp_port/test/mod.rs @@ -11,4 +11,4 @@ mod QRDataMaskTest; mod QRBitMatrixParserTest; -mod MQRDecoderTest; \ No newline at end of file +mod MQRDecoderTest;