diff --git a/src/common/cpp_essentials/concentric_finder.rs b/src/common/cpp_essentials/concentric_finder.rs index fa6e48e..d33fae5 100644 --- a/src/common/cpp_essentials/concentric_finder.rs +++ b/src/common/cpp_essentials/concentric_finder.rs @@ -5,9 +5,11 @@ use crate::{ }, BitMatrix, Quadrilateral, }, - point, Point, + point, Point, Exceptions, }; +use crate::common::Result; + use super::{ BitMatrixCursorTrait, EdgeTracer, FastEdgeToEdgeCounter, Pattern, RegressionLine, RegressionLineTrait, UpdateMinMax, UpdateMinMaxFloat, @@ -223,7 +225,7 @@ pub fn CenterOfRing( neighbourMask |= 1 << (4.0 + Point::dot( - Point::round(Point::bresenhamDirection(cur.p() - center)), + Point::floor(Point::bresenhamDirection(cur.p() - center)), point(1.0, 3.0), )) as u32; @@ -400,12 +402,27 @@ pub fn FitQadrilateralToPoints(center: Point, points: &mut [Point]) -> Option Option<&[Point]> { + if a > b { + None + }else{ + Some(&points[a + 1..b]) + } + }; + +let lines = [ + RegressionLine::with_point_slice(try_get_range(corner_positions[0],corner_positions[1])?), + RegressionLine::with_point_slice(try_get_range(corner_positions[1],corner_positions[2])?), + RegressionLine::with_point_slice(try_get_range(corner_positions[2],corner_positions[3])?), + RegressionLine::with_point_slice(try_get_range(corner_positions[3],points.len())?), ]; + + // let lines = [ + // RegressionLine::with_point_slice(&points[corner_positions[0] + 1..corner_positions[1]]), + // RegressionLine::with_point_slice(&points[corner_positions[1] + 1..corner_positions[2]]), + // RegressionLine::with_point_slice(&points[corner_positions[2] + 1..corner_positions[3]]), + // RegressionLine::with_point_slice(&points[corner_positions[3] + 1..points.len()]), + // ]; // std::array lines{RegressionLine{corners[0] + 1, corners[1]}, RegressionLine{corners[1] + 1, corners[2]}, // RegressionLine{corners[2] + 1, corners[3]}, RegressionLine{corners[3] + 1, &points.back() + 1}}; if lines.iter().any(|line| !line.isValid()) { diff --git a/src/common/cpp_essentials/dm_regression_line.rs b/src/common/cpp_essentials/dm_regression_line.rs index 2c4dfd8..74f4a8b 100644 --- a/src/common/cpp_essentials/dm_regression_line.rs +++ b/src/common/cpp_essentials/dm_regression_line.rs @@ -225,7 +225,7 @@ impl RegressionLineTrait for DMRegressionLine { impl DMRegressionLine { pub fn new(point_1: Point, point_2: Point) -> Self { let mut new = Self::default(); - RegressionLineTrait::evaluate(&mut new, &[point_1, point_1]); + RegressionLineTrait::evaluate(&mut new, &[point_1, point_2]); new } diff --git a/src/common/eci_string_builder.rs b/src/common/eci_string_builder.rs index c5166bb..ea29d17 100644 --- a/src/common/eci_string_builder.rs +++ b/src/common/eci_string_builder.rs @@ -128,7 +128,7 @@ impl ECIStringBuilder { let ecis = self.list_ecis(); - if ecis.len() <= 1 && (ecis.contains(&Eci::Unknown)) { + if ecis.len() == 1 && (ecis.contains(&Eci::Unknown)) { self.has_eci = false; } } diff --git a/src/multi_use_multi_format_reader.rs b/src/multi_use_multi_format_reader.rs index 16ecb18..17245f0 100644 --- a/src/multi_use_multi_format_reader.rs +++ b/src/multi_use_multi_format_reader.rs @@ -17,6 +17,7 @@ use std::collections::{HashMap, HashSet}; use crate::common::Result; +use crate::qrcode::cpp_port::QrReader; use crate::{ aztec::AztecReader, datamatrix::DataMatrixReader, maxicode::MaxiCodeReader, oned::MultiFormatOneDReader, pdf417::PDF417Reader, qrcode::QRCodeReader, BarcodeFormat, @@ -43,6 +44,7 @@ pub struct MultiUseMultiFormatReader { aztec_reader: AztecReader, pdf417_reader: PDF417Reader, maxicode_reader: MaxiCodeReader, + cpp_qrcode_reader: QrReader, } impl Reader for MultiUseMultiFormatReader { @@ -84,6 +86,7 @@ impl Reader for MultiUseMultiFormatReader { self.aztec_reader.reset(); self.pdf417_reader.reset(); self.maxicode_reader.reset(); + self.cpp_qrcode_reader.reset(); } } @@ -174,7 +177,15 @@ impl MultiUseMultiFormatReader { for possible_format in self.possible_formats.iter() { let res = match possible_format { BarcodeFormat::QR_CODE => { - self.qr_code_reader.decode_with_hints(image, &self.hints) + let a = self.qr_code_reader.decode_with_hints(image, &self.hints); + if a.is_ok() { + a + }else { + self.cpp_qrcode_reader.decode_with_hints(image, &self.hints) + } + } + BarcodeFormat::MICRO_QR_CODE => { + self.cpp_qrcode_reader.decode_with_hints(image, &self.hints) } BarcodeFormat::DATA_MATRIX => self .data_matrix_reader diff --git a/tests/cpp_qr_code_blackbox_tests.rs b/tests/cpp_qr_code_blackbox_tests.rs index d4517f8..493cf4d 100644 --- a/tests/cpp_qr_code_blackbox_tests.rs +++ b/tests/cpp_qr_code_blackbox_tests.rs @@ -14,7 +14,7 @@ * limitations under the License. */ -use rxing::{qrcode::cpp_port::QrReader, BarcodeFormat}; +use rxing::{qrcode::cpp_port::QrReader, BarcodeFormat, MultiUseMultiFormatReader}; mod common; @@ -187,7 +187,7 @@ fn cpp_qrcode_black_box2_test_case() { let mut tester = common::AbstractBlackBoxTestCase::new( "test_resources/blackbox/cpp/qrcode-2", // MultiFormatReader::default(), - QrReader {}, + QrReader::default(), BarcodeFormat::QR_CODE, ); tester.add_test(45, 47, 0.0);