From 8486cba277926240023e7b3f633c8e2461c9e4cd Mon Sep 17 00:00:00 2001 From: Henry Schimke Date: Tue, 21 Mar 2023 11:22:31 -0500 Subject: [PATCH] port bitmatrix_curosor readpattern --- .../cpp_essentials/bitmatrix_cursor_trait.rs | 31 ++++++++++++------- src/qrcode/cpp_port/detector.rs | 14 +++++---- 2 files changed, 27 insertions(+), 18 deletions(-) diff --git a/src/common/cpp_essentials/bitmatrix_cursor_trait.rs b/src/common/cpp_essentials/bitmatrix_cursor_trait.rs index cc72746..7ac1d17 100644 --- a/src/common/cpp_essentials/bitmatrix_cursor_trait.rs +++ b/src/common/cpp_essentials/bitmatrix_cursor_trait.rs @@ -165,19 +165,26 @@ pub trait BitMatrixCursorTrait { fn d(&self) -> Point; - fn readPattern(&self, range: Option) -> Option { - // let range = range.unwrap_or(0); - // let mut res :T; - // for i in res.into_iter() { - // i = self.stepToEdge(1, range); - // } - // // for (auto& i : res) - // // i = stepToEdge(1, range); - // return res; - todo!() + fn readPattern + Default + Copy + Clone>( + &mut self, + range: Option, + ) -> Option<[T; LEN]> { + let range = range.unwrap_or(0); + let mut res = [T::default(); LEN]; + for i in res.iter_mut() { + *i = self + .stepToEdge(Some(1), Some(range), None) + .try_into() + .ok()?; + } + Some(res) } - fn readPatternFromBlack(&mut self, maxWhitePrefix: i32, range: Option) -> Option { + fn readPatternFromBlack + Default + Copy + Clone>( + &mut self, + maxWhitePrefix: i32, + range: Option, + ) -> Option<[T; LEN]> { let range = range.unwrap_or(0); if (maxWhitePrefix != 0 && self.isWhite() @@ -186,6 +193,6 @@ pub trait BitMatrixCursorTrait { return None; } // return readPattern(range); - self.readPattern(Some(range)) + self.readPattern::(Some(range)) } } diff --git a/src/qrcode/cpp_port/detector.rs b/src/qrcode/cpp_port/detector.rs index 7f84ccb..d95fc64 100644 --- a/src/qrcode/cpp_port/detector.rs +++ b/src/qrcode/cpp_port/detector.rs @@ -751,7 +751,7 @@ pub fn SampleQR(image: &BitMatrix, fp: &FinderPatternSet) -> Result Result { - type Pattern = Vec; + type Pattern = [PatternType; 5]; // #ifdef PRINT_DEBUG // SaveAsPBM(image, "weg.pbm"); @@ -771,7 +771,7 @@ pub fn DetectPureQR(image: &BitMatrix) -> Result { let tl = point_i(left, top); let tr = point_i(right, top); let bl = point_i(left, bottom); - let mut diagonal: Pattern = Vec::default(); + let mut diagonal: Pattern = Default::default(); // allow corners be moved one pixel inside to accommodate for possible aliasing artifacts for [p, d] in [ [tl, point_i(1, 1)], @@ -780,10 +780,10 @@ pub fn DetectPureQR(image: &BitMatrix) -> Result { ] { // for (auto [p, d] : {std::pair(tl, PointI{1, 1}), {tr, {-1, 1}}, {bl, {1, -1}}}) { diagonal = EdgeTracer::new(image, p, d) - .readPatternFromBlack(1, Some(width / 3 + 1)) + .readPatternFromBlack(1, Some((width / 3 + 1) as i32)) .ok_or(Exceptions::NOT_FOUND)?; // diagonal = BitMatrixCursorI(image, p, d).readPatternFromBlack(1, width / 3 + 1); - let diag_hld = diagonal.clone().into(); + let diag_hld = diagonal.to_vec().into(); let view = PatternView::new(&diag_hld); if (!(IsPattern(&view, &PATTERN, None, 0.0, 0.0, None) != 0.0)) { return Err(Exceptions::NOT_FOUND); @@ -860,10 +860,12 @@ pub fn DetectPureMQR(image: &BitMatrix) -> Result { let bottom = top + height - 1; // allow corners be moved one pixel inside to accommodate for possible aliasing artifacts - let diagonal = EdgeTracer::new(&image, point_i(left, top), point_i(1, 1)) + let diagonal: Pattern = EdgeTracer::new(&image, point_i(left, top), point_i(1, 1)) .readPatternFromBlack(1, None) .ok_or(Exceptions::ILLEGAL_STATE)?; - if (!(IsPattern(diagonal, &PATTERN, None, 0.0, 0.0, None) != 0.0)) { + let diag_hld = diagonal.to_vec().into(); + let view = PatternView::new(&diag_hld); + if (!(IsPattern(&view, &PATTERN, None, 0.0, 0.0, None) != 0.0)) { return Err(Exceptions::NOT_FOUND); }