diff --git a/src/multi_format_reader.rs b/src/multi_format_reader.rs index 46989e0..01c8a21 100644 --- a/src/multi_format_reader.rs +++ b/src/multi_format_reader.rs @@ -37,6 +37,7 @@ pub struct MultiFormatReader { hints: DecodingHintDictionary, possible_formats: HashSet, try_harder: bool, + one_d_reader: MultiFormatOneDReader } impl Reader for MultiFormatReader { @@ -113,6 +114,7 @@ impl MultiFormatReader { } else { HashSet::new() }; + self.one_d_reader = MultiFormatOneDReader::new(&hints); } pub fn decode_internal( @@ -137,7 +139,7 @@ impl MultiFormatReader { Err(Exceptions::NOT_FOUND) } - fn decode_formats(&self, image: &mut BinaryBitmap) -> Result { + fn decode_formats(&mut self, image: &mut BinaryBitmap) -> Result { if !self.possible_formats.is_empty() { let one_d = self.possible_formats.contains(&BarcodeFormat::UPC_A) || self.possible_formats.contains(&BarcodeFormat::UPC_E) @@ -152,7 +154,7 @@ impl MultiFormatReader { || self.possible_formats.contains(&BarcodeFormat::RSS_EXPANDED); if one_d && !self.try_harder { if let Ok(res) = - MultiFormatOneDReader::new(&self.hints).decode_with_hints(image, &self.hints) + self.one_d_reader.decode_with_hints(image, &self.hints) { return Ok(res); } @@ -182,7 +184,7 @@ impl MultiFormatReader { } if one_d && self.try_harder { if let Ok(res) = - MultiFormatOneDReader::new(&self.hints).decode_with_hints(image, &self.hints) + self.one_d_reader.decode_with_hints(image, &self.hints) { return Ok(res); } @@ -190,7 +192,7 @@ impl MultiFormatReader { } else { if !self.try_harder { if let Ok(res) = - MultiFormatOneDReader::new(&self.hints).decode_with_hints(image, &self.hints) + self.one_d_reader.decode_with_hints(image, &self.hints) { return Ok(res); } @@ -214,7 +216,7 @@ impl MultiFormatReader { if self.try_harder { if let Ok(res) = - MultiFormatOneDReader::new(&self.hints).decode_with_hints(image, &self.hints) + self.one_d_reader.decode_with_hints(image, &self.hints) { return Ok(res); } diff --git a/src/oned/multi_format_one_d_reader.rs b/src/oned/multi_format_one_d_reader.rs index 0977ec5..407de5d 100644 --- a/src/oned/multi_format_one_d_reader.rs +++ b/src/oned/multi_format_one_d_reader.rs @@ -37,6 +37,8 @@ pub struct MultiFormatOneDReader { internal_hints: DecodingHintDictionary, possible_formats: HashSet, use_code_39_check_digit: bool, + rss_14_reader: RSS14Reader, + rss_expanded_reader: RSSExpandedReader } impl OneDReader for MultiFormatOneDReader { fn decode_row( @@ -45,11 +47,12 @@ impl OneDReader for MultiFormatOneDReader { row: &crate::common::BitArray, hints: &DecodingHintDictionary, ) -> Result { - // reader.decode_row(rowNumber, row, hints) let Self { possible_formats, use_code_39_check_digit, internal_hints, + rss_14_reader, + rss_expanded_reader, } = self; if !possible_formats.is_empty() { @@ -92,12 +95,12 @@ impl OneDReader for MultiFormatOneDReader { } } if possible_formats.contains(&BarcodeFormat::RSS_14) { - if let Ok(res) = RSS14Reader::default().decode_row(row_number, row, hints) { + if let Ok(res) = rss_14_reader.decode_row(row_number, row, hints) { return Ok(res); } } if possible_formats.contains(&BarcodeFormat::RSS_EXPANDED) { - if let Ok(res) = RSSExpandedReader::default().decode_row(row_number, row, hints) { + if let Ok(res) = rss_expanded_reader.decode_row(row_number, row, hints) { return Ok(res); } } @@ -124,10 +127,10 @@ impl OneDReader for MultiFormatOneDReader { if let Ok(res) = ITFReader::default().decode_row(row_number, row, hints) { return Ok(res); } - if let Ok(res) = RSS14Reader::default().decode_row(row_number, row, hints) { + if let Ok(res) = rss_14_reader.decode_row(row_number, row, hints) { return Ok(res); } - if let Ok(res) = RSSExpandedReader::default().decode_row(row_number, row, hints) { + if let Ok(res) = rss_expanded_reader.decode_row(row_number, row, hints) { return Ok(res); } } @@ -152,7 +155,9 @@ impl MultiFormatOneDReader { Self { possible_formats, use_code_39_check_digit, + rss_14_reader: RSS14Reader::default(), internal_hints: hints.clone(), + rss_expanded_reader: RSSExpandedReader::default(), } } }