Cleanup of many components of the code.

Many unwraps, expects, and panics removed or handled.

More rustification of the codebase.

Squashed commit of the following:

commit 80c6483cf8c819496a7b781f9e3a149d1f18d5fe
Author: Henry <henry@azule.info>
Date:   Fri Feb 10 20:36:57 2023 -0600

    add other parsed result option

commit 412d92ae585e7bf194697f5282dbc045e448bace
Author: Henry <henry@azule.info>
Date:   Fri Feb 10 19:06:34 2023 -0600

    fix some panics

commit 9108d3e931aadec00fc0bf346ebc52d24e5d8146
Author: Henry <henry@azule.info>
Date:   Fri Feb 10 18:56:30 2023 -0600

    clippy --fix

commit 8cd89d314323f54f342f15fc73297b62d418ac79
Author: Henry <henry@azule.info>
Date:   Fri Feb 10 18:55:45 2023 -0600

    some more cleanup in aztec

commit fb7f9242e273b85a4bb212f22a185a0dcbfafc36
Author: Henry <henry@azule.info>
Date:   Fri Feb 10 18:19:54 2023 -0600

    cleanup root

commit 4fb7c0639830869149332b29be789e891eade3e7
Author: Henry Schimke <henry@azule.info>
Date:   Fri Feb 10 16:50:15 2023 -0600

    format

commit 3ac271af657b25fbe5ee39cbdf8859e5aa38ea41
Author: Henry Schimke <henry@azule.info>
Date:   Fri Feb 10 16:43:14 2023 -0600

    clippy --fix

commit 0c5b4c1477159db93a9da9645039f51cd1a7c574
Author: Henry Schimke <henry@azule.info>
Date:   Fri Feb 10 16:04:31 2023 -0600

    qrcode cleanup complete

commit 70c1d107cc672e45d46567c650c46fece7e7da9c
Author: Henry Schimke <henry@azule.info>
Date:   Fri Feb 10 13:28:25 2023 -0600

    clippy --fix

commit e13263d0f1f2a13dbb59b6e60d8b871a32babc92
Author: Henry Schimke <henry@azule.info>
Date:   Fri Feb 10 13:27:44 2023 -0600

    qrcode detector cleanup

commit f7f2855099e469fe1091868c6099196705d0ae83
Author: Henry Schimke <henry@azule.info>
Date:   Fri Feb 10 11:48:13 2023 -0600

    qrcode decoder

commit bdbaaba597b3479639c2ed3726465a69e3004471
Author: Henry Schimke <henry@azule.info>
Date:   Fri Feb 10 11:13:18 2023 -0600

    clippy --fix

commit fd6dbcaeb1f45dc91ae98f0e7c58aad48d67df78
Author: Henry Schimke <henry@azule.info>
Date:   Fri Feb 10 11:12:28 2023 -0600

    pdf417 cleanup complete

commit 7bbd47604c2639a5eb61bdb5533e71be3bce95a1
Author: Henry Schimke <henry@azule.info>
Date:   Fri Feb 10 10:39:28 2023 -0600

    clippy --fix

commit 8f4962b7bb5f133524fe4d3d4948e5672a88c545
Author: Henry Schimke <henry@azule.info>
Date:   Fri Feb 10 10:39:00 2023 -0600

    cleanup on pdf417 hie

commit 254c8243953776d3c8704dd81529aadd05d5a94e
Author: Henry <henry@azule.info>
Date:   Fri Feb 10 02:51:21 2023 +0000

    partway through pdf417 hle

commit d4a5b00fde8c0282b0c6e4175a21c1e111b11533
Author: Henry <henry@azule.info>
Date:   Wed Feb 8 21:35:25 2023 +0000

    clippy --fix

commit 2bd4a8e218aa963a88997b50bc5a198f9a88205e
Author: Henry <henry@azule.info>
Date:   Wed Feb 8 21:31:55 2023 +0000

    pdf417 decode and detect cleanup

commit 05130ac54a72c2303045d64507bf6185aa74e531
Author: Henry Schimke <henry@azule.info>
Date:   Tue Feb 7 08:06:25 2023 -0600

    at decodeTextCompaction in decoded_bit_straem_parser

commit 924c023a7d2339dfffa6ef0c4a805fb192576796
Author: Henry Schimke <henry@azule.info>
Date:   Mon Feb 6 18:22:02 2023 -0600

    clippy --fix

commit 5cfb81a885c22b4b5ec937a79be31d0815def211
Author: Henry Schimke <henry@azule.info>
Date:   Mon Feb 6 18:20:22 2023 -0600

    oned cleanup

commit 0649b64854baf56a8e3314728d4f6cf4063db8b2
Author: Henry Schimke <henry@azule.info>
Date:   Mon Feb 6 11:47:28 2023 -0600

    rss cleanup

commit 2d3127898fc11f7e65d590e983cda799b798b646
Author: Henry Schimke <henry@azule.info>
Date:   Mon Feb 6 10:19:56 2023 -0600

    multi cleanup

commit 7e8b43a159083a2096123e6204d4d1d359c59981
Author: Henry <henry@azule.info>
Date:   Sun Feb 5 21:41:59 2023 -0600

    cargo fmt

commit df8285e8da07b4bffd48ca6e596de3f010eb8d9e
Author: Henry <henry@azule.info>
Date:   Sun Feb 5 21:41:29 2023 -0600

    maxicode cleanup

commit a51f923a14016eb416ca202b2194258808dde3e7
Author: Henry <henry@azule.info>
Date:   Sun Feb 5 21:27:57 2023 -0600

    cargo fmt

commit 332d7eef4a25318611025a3fcb0b70c604d917be
Author: Henry <henry@azule.info>
Date:   Sun Feb 5 21:27:48 2023 -0600

    cleanup datamatrix

commit eb2311c476a9c9993f271ab6cf9fd359aedca26f
Author: Henry <henry@azule.info>
Date:   Sun Feb 5 21:27:26 2023 -0600

    cargo clippy --fix

commit 2abaa4c51d287f619d4c7a438f85ba2a30f159cf
Author: Henry <henry@azule.info>
Date:   Sun Feb 5 19:13:02 2023 -0600

    finish cleanup in parsers

commit 716aa2fbf728716cff36657a5fd80e7bca5276b7
Author: Henry Schimke <henry@azule.info>
Date:   Sun Feb 5 17:44:56 2023 -0600

    cleanup continues

commit 7d843788a49fa9cc82c4616d226c0f882e73612b
Author: Henry Schimke <henry@azule.info>
Date:   Sun Feb 5 15:15:09 2023 -0600

    common cleanup

commit fd251866c68f22d450dd428c93d7a3620bf1be27
Author: Henry Schimke <henry@azule.info>
Date:   Sun Feb 5 10:24:54 2023 -0600

    cleanup reedsolomon

commit 132e27ed1468f5c1ce998516ff5a00687217c3e6
Author: Henry Schimke <henry@azule.info>
Date:   Sun Feb 5 09:52:04 2023 -0600

    make MathUtils more generic

commit d8352b7fff4cb4f9ecc8e8a969710d26ef410e8b
Author: Henry Schimke <henry@azule.info>
Date:   Sun Feb 5 09:29:33 2023 -0600

    cleanup some string handling in ResultParser

    There may still be some edge cases where multi-byte characters break the parser
This commit is contained in:
Henry
2023-02-10 20:41:25 -06:00
parent 5222bb25b7
commit 28723be2eb
180 changed files with 3248 additions and 4117 deletions

View File

@@ -58,13 +58,15 @@ impl BitMatrixParser {
*/
pub fn readFormatInformation(&mut self) -> Result<&FormatInformation, Exceptions> {
if self.parsedFormatInfo.is_some() {
return Ok(self.parsedFormatInfo.as_ref().unwrap());
return self
.parsedFormatInfo
.as_ref()
.ok_or(Exceptions::ParseException(None));
}
// Read top-left format info bits
let mut formatInfoBits1 = 0;
for i in 0..6 {
// for (int i = 0; i < 6; i++) {
formatInfoBits1 = self.copyBit(i, 8, formatInfoBits1);
}
// .. and skip a bit in the timing pattern ...
@@ -73,7 +75,6 @@ impl BitMatrixParser {
formatInfoBits1 = self.copyBit(8, 7, formatInfoBits1);
// .. and skip a bit in the timing pattern ...
for j in (0..=5).rev() {
// for (int j = 5; j >= 0; j--) {
formatInfoBits1 = self.copyBit(8, j, formatInfoBits1);
}
@@ -82,20 +83,18 @@ impl BitMatrixParser {
let mut formatInfoBits2 = 0;
let jMin = dimension - 7;
for j in (jMin..=dimension - 1).rev() {
// for (int j = dimension - 1; j >= jMin; j--) {
formatInfoBits2 = self.copyBit(8, j, formatInfoBits2);
}
for i in (dimension - 8)..dimension {
// for (int i = dimension - 8; i < dimension; i++) {
formatInfoBits2 = self.copyBit(i, 8, formatInfoBits2);
}
self.parsedFormatInfo =
FormatInformation::decodeFormatInformation(formatInfoBits1, formatInfoBits2);
if let Some(pfi) = &self.parsedFormatInfo {
return Ok(pfi);
}
Err(Exceptions::FormatException(None))
self.parsedFormatInfo
.as_ref()
.ok_or(Exceptions::FormatException(None))
}
/**
@@ -121,9 +120,7 @@ impl BitMatrixParser {
let mut versionBits = 0;
let ijMin = dimension - 11;
for j in (0..=5).rev() {
// for (int j = 5; j >= 0; j--) {
for i in (ijMin..(dimension - 8)).rev() {
// for (int i = dimension - 9; i >= ijMin; i--) {
versionBits = self.copyBit(i, j, versionBits);
}
}
@@ -138,9 +135,7 @@ impl BitMatrixParser {
// Hmm, failed. Try bottom left: 6 wide by 3 tall
versionBits = 0;
for i in (0..=5).rev() {
// for (int i = 5; i >= 0; i--) {
for j in (ijMin..(dimension - 5)).rev() {
// for (int j = dimension - 9; j >= ijMin; j--) {
versionBits = self.copyBit(i, j, versionBits);
}
}
@@ -160,6 +155,7 @@ impl BitMatrixParser {
} else {
self.bitMatrix.get(i, j)
};
if bit {
(versionBits << 1) | 0x1
} else {
@@ -176,12 +172,11 @@ impl BitMatrixParser {
* @throws FormatException if the exact number of bytes expected is not read
*/
pub fn readCodewords(&mut self) -> Result<Vec<u8>, Exceptions> {
// let formatInfo = self.readFormatInformation()?;
let version = self.readVersion()?;
// Get the data mask for the format used in this QR Code. This will exclude
// some bits from reading as we wind through the bit matrix.
let dataMask: DataMask = self.readFormatInformation()?.getDataMask().try_into()?; //DataMask.values()[formatInfo.getDataMask()];
let dataMask: DataMask = self.readFormatInformation()?.getDataMask().try_into()?;
let dimension = self.bitMatrix.getHeight();
dataMask.unmaskBitMatrix(&mut self.bitMatrix, dimension);
@@ -195,7 +190,6 @@ impl BitMatrixParser {
// Read columns in pairs, from right to left
let mut j = dimension as i32 - 1;
while j > 0 {
// for (int j = dimension - 1; j > 0; j -= 2) {
if j == 6 {
// Skip whole column with vertical alignment pattern;
// saves time and makes the other code proceed more cleanly
@@ -203,14 +197,12 @@ impl BitMatrixParser {
}
// Read alternatingly from bottom to top then top to bottom
for count in 0..dimension {
// for (int count = 0; count < dimension; count++) {
let i = if readingUp {
dimension - 1 - count
} else {
count
};
for col in 0..2 {
// for (int col = 0; col < 2; col++) {
// Ignore bits covered by the function pattern
if !functionPattern.get(j as u32 - col, i) {
// Read a bit
@@ -243,20 +235,15 @@ impl BitMatrixParser {
/**
* Revert the mask removal done while reading the code words. The bit matrix should revert to its original state.
*/
pub fn remask(&mut self) {
pub fn remask(&mut self) -> Result<(), Exceptions> {
if let Some(pfi) = &self.parsedFormatInfo {
let dataMask: DataMask = pfi.getDataMask().try_into().unwrap(); // DataMask.values()[self.parsedFormatInfo.getDataMask()];
let dataMask: DataMask = pfi.getDataMask().try_into()?;
let dimension = self.bitMatrix.getHeight();
dataMask.unmaskBitMatrix(&mut self.bitMatrix, dimension);
} else {
// We have no format information, and have no data mask
}
// if self.parsedFormatInfo.is_none() {
// return; // We have no format information, and have no data mask
// }
// let dataMask = self.parsedFormatInfo.getDataMask()// DataMask.values()[self.parsedFormatInfo.getDataMask()];
// let dimension = self.bitMatrix.getHeight();
// dataMask.unmaskBitMatrix(self.bitMatrix, dimension);
Ok(())
}
/**
@@ -276,9 +263,7 @@ impl BitMatrixParser {
/** Mirror the bit matrix in order to attempt a second reading. */
pub fn mirror(&mut self) {
for x in 0..self.bitMatrix.getWidth() {
// for (int x = 0; x < bitMatrix.getWidth(); x++) {
for y in (x + 1)..self.bitMatrix.getHeight() {
// for (int y = x + 1; y < bitMatrix.getHeight(); y++) {
if self.bitMatrix.get(x, y) != self.bitMatrix.get(y, x) {
self.bitMatrix.flip_coords(y, x);
self.bitMatrix.flip_coords(x, y);

View File

@@ -66,7 +66,6 @@ impl DataBlock {
let mut _totalBlocks = 0;
let ecBlockArray = ecBlocks.getECBlocks();
for ecBlock in ecBlockArray {
// for (Version.ECB ecBlock : ecBlockArray) {
_totalBlocks += ecBlock.getCount();
}
@@ -74,12 +73,9 @@ impl DataBlock {
let mut result = Vec::new();
let mut numRXingResultBlocks = 0;
for ecBlock in ecBlockArray {
// for (Version.ECB ecBlock : ecBlockArray) {
for _i in 0..ecBlock.getCount() {
// for (int i = 0; i < ecBlock.getCount(); i++) {
let numDataCodewords = ecBlock.getDataCodewords();
let numBlockCodewords = ecBlocks.getECCodewordsPerBlock() + numDataCodewords;
// result[numRXingResultBlocks] = DataBlock::new(numDataCodewords, vec![0u8;numBlockCodewords as usize]);
result.push(DataBlock::new(
numDataCodewords,
vec![0u8; numBlockCodewords as usize],
@@ -93,8 +89,8 @@ impl DataBlock {
let shorterBlocksTotalCodewords = result[0].codewords.len();
let mut longerBlocksStartAt = result.len() - 1;
loop {
//while longerBlocksStartAt >= 0 {
let numCodewords = result[longerBlocksStartAt].codewords.len();
if numCodewords == shorterBlocksTotalCodewords {
break;
}
@@ -108,10 +104,7 @@ impl DataBlock {
// first fill out as many elements as all of them have
let mut rawCodewordsOffset = 0;
for i in 0..shorterBlocksNumDataCodewords {
// for (int i = 0; i < shorterBlocksNumDataCodewords; i++) {
for result_j in result.iter_mut().take(numRXingResultBlocks) {
// for j in 0..numRXingResultBlocks {
// for (int j = 0; j < numRXingResultBlocks; j++) {
result_j.codewords[i] = rawCodewords[rawCodewordsOffset];
rawCodewordsOffset += 1;
}
@@ -122,17 +115,13 @@ impl DataBlock {
.take(numRXingResultBlocks)
.skip(longerBlocksStartAt)
{
// for j in longerBlocksStartAt..numRXingResultBlocks {
// for (int j = longerBlocksStartAt; j < numRXingResultBlocks; j++) {
res.codewords[shorterBlocksNumDataCodewords] = rawCodewords[rawCodewordsOffset];
rawCodewordsOffset += 1;
}
// Now add in error correction blocks
let max = result[0].codewords.len();
for i in shorterBlocksNumDataCodewords..max {
// for (int i = shorterBlocksNumDataCodewords; i < max; i++) {
for (j, res) in result.iter_mut().enumerate().take(numRXingResultBlocks) {
// for (int j = 0; j < numRXingResultBlocks; j++) {
let iOffset = if j < longerBlocksStartAt { i } else { i + 1 };
res.codewords[iOffset] = rawCodewords[rawCodewordsOffset];
rawCodewordsOffset += 1;

View File

@@ -85,9 +85,7 @@ impl DataMask {
*/
pub fn unmaskBitMatrix(&self, bits: &mut BitMatrix, dimension: u32) {
for i in 0..dimension {
// for (int i = 0; i < dimension; i++) {
for j in 0..dimension {
// for (int j = 0; j < dimension; j++) {
if self.isMasked(i, j) {
bits.flip_coords(j, i);
}

View File

@@ -92,7 +92,7 @@ fn testMaskAcrossDimensions(mask: DataMask, condition: MaskCondition) {
}
fn testMask(mask: DataMask, dimension: u32, condition: MaskCondition) {
let mut bits = BitMatrix::with_single_dimension(dimension);
let mut bits = BitMatrix::with_single_dimension(dimension).expect("new");
mask.unmaskBitMatrix(&mut bits, dimension);
for i in 0..dimension {
// for (int i = 0; i < dimension; i++) {

View File

@@ -50,9 +50,7 @@ pub fn decode(
let mut byteSegments = vec![vec![0u8; 0]; 0];
let mut symbolSequence = -1i32;
let mut parityData = -1i32;
let symbologyModifier;
// try {
let mut currentCharacterSetECI = None;
let mut fc1InEffect = false;
let mut hasFNC1first = false;
@@ -93,7 +91,7 @@ pub fn decode(
Mode::ECI => {
// Count doesn't apply to ECI
let value = parseECIValue(&mut bits)?;
currentCharacterSetECI = Some(CharacterSetECI::getCharacterSetECIByValue(value)?);
currentCharacterSetECI = CharacterSetECI::getCharacterSetECIByValue(value).ok();
if currentCharacterSetECI.is_none() {
return Err(Exceptions::FormatException(Some(format!(
"Value of {value} not valid"
@@ -144,26 +142,21 @@ pub fn decode(
}
}
if currentCharacterSetECI.is_some() {
let symbologyModifier = if currentCharacterSetECI.is_some() {
if hasFNC1first {
symbologyModifier = 4;
4
} else if hasFNC1second {
symbologyModifier = 6;
6
} else {
symbologyModifier = 2;
2
}
} else if hasFNC1first {
symbologyModifier = 3;
3
} else if hasFNC1second {
symbologyModifier = 5;
5
} else {
symbologyModifier = 1;
}
// } catch (IllegalArgumentException iae) {
// // from readBits() calls
// throw FormatException.getFormatInstance();
// }
1
};
Ok(DecoderRXingResult::with_all(
bytes.to_owned(),
@@ -207,18 +200,20 @@ fn decodeHanziSegment(
// In the 0xB0A1 to 0xFAFE range
assembledTwoBytes += 0x0A6A1;
}
// buffer[offset] = ((assembledTwoBytes >> 8) & 0xFF);
// buffer[offset + 1] = (assembledTwoBytes & 0xFF);
buffer[offset] = (assembledTwoBytes >> 8) as u8;
buffer[offset + 1] = assembledTwoBytes as u8;
offset += 2;
count -= 1;
}
let gb_encoder = encoding::label::encoding_from_whatwg_label("GBK").unwrap();
let gb_encoder = encoding::label::encoding_from_whatwg_label("GBK")
.ok_or(Exceptions::IllegalStateException(None))?;
let encode_string = gb_encoder
.decode(&buffer, encoding::DecoderTrap::Strict)
.unwrap();
.map_err(|e| {
Exceptions::ParseException(Some(format!("unable to decode buffer {buffer:?}: {e}")))
})?;
result.push_str(&encode_string);
Ok(())
}
@@ -261,27 +256,29 @@ fn decodeKanjiSegment(
let encoder = {
let _ = currentCharacterSetECI;
let _ = hints;
encoding::label::encoding_from_whatwg_label("SJIS").unwrap()
encoding::label::encoding_from_whatwg_label("SJIS")
.ok_or(Exceptions::FormatException(None))?
};
#[cfg(feature = "allow_forced_iso_ied_18004_compliance")]
let encoder = if let Some(DecodeHintValue::QrAssumeSpecConformInput(true)) =
hints.get(&DecodeHintType::QR_ASSUME_SPEC_CONFORM_INPUT)
{
// if (hints != null && hints.containsKey(DecodeHintType.QR_ASSUME_SPEC_CONFORM_INPUT)) {
if let Some(ccse) = &currentCharacterSetECI {
// if (currentCharacterSetECI == null) {
CharacterSetECI::getCharset(ccse)
} else {
encoding::all::ISO_8859_1
}
} else {
encoding::label::encoding_from_whatwg_label("SJIS").unwrap()
encoding::label::encoding_from_whatwg_label("SJIS")
.ok_or(Exceptions::FormatException(None))?
};
let encode_string = encoder
.decode(&buffer, encoding::DecoderTrap::Strict)
.unwrap();
.map_err(|e| {
Exceptions::ParseException(Some(format!("unable to decode buffer {buffer:?}: {e}")))
})?;
result.push_str(&encode_string);
@@ -304,8 +301,6 @@ fn decodeByteSegment(
let mut readBytes = vec![0u8; count];
for byte in readBytes.iter_mut().take(count) {
// for i in 0..count {
// for (int i = 0; i < count; i++) {
*byte = bits.readBits(8)? as u8;
}
let encoding = if currentCharacterSetECI.is_none() {
@@ -317,6 +312,7 @@ fn decodeByteSegment(
{
#[cfg(not(feature = "allow_forced_iso_ied_18004_compliance"))]
StringUtils::guessCharset(&readBytes, hints)
.ok_or(Exceptions::IllegalStateException(None))?
}
#[cfg(feature = "allow_forced_iso_ied_18004_compliance")]
@@ -328,11 +324,18 @@ fn decodeByteSegment(
StringUtils::guessCharset(&readBytes, hints)
}
} else {
CharacterSetECI::getCharset(currentCharacterSetECI.as_ref().unwrap())
CharacterSetECI::getCharset(
currentCharacterSetECI
.as_ref()
.ok_or(Exceptions::IllegalStateException(None))?,
)
};
let encode_string = if currentCharacterSetECI.is_some()
&& currentCharacterSetECI.as_ref().unwrap() == &CharacterSetECI::Cp437
&& currentCharacterSetECI
.as_ref()
.ok_or(Exceptions::IllegalStateException(None))?
== &CharacterSetECI::Cp437
{
{
use codepage_437::BorrowFromCp437;
@@ -343,12 +346,13 @@ fn decodeByteSegment(
} else {
encoding
.decode(&readBytes, encoding::DecoderTrap::Strict)
.unwrap()
.map_err(|e| {
Exceptions::ParseException(Some(format!(
"unable to decode buffer {readBytes:?}: {e}"
)))
})?
};
// let encode_string = encoding
// .decode(&readBytes, encoding::DecoderTrap::Strict)
// .unwrap();
result.push_str(&encode_string);
byteSegments.push(readBytes);
@@ -359,7 +363,11 @@ fn toAlphaNumericChar(value: u32) -> Result<char, Exceptions> {
if value as usize >= ALPHANUMERIC_CHARS.len() {
return Err(Exceptions::FormatException(None));
}
Ok(ALPHANUMERIC_CHARS.chars().nth(value as usize).unwrap())
ALPHANUMERIC_CHARS
.chars()
.nth(value as usize)
.ok_or(Exceptions::FormatException(None))
}
fn decodeAlphanumericSegment(
@@ -391,16 +399,24 @@ fn decodeAlphanumericSegment(
if fc1InEffect {
// We need to massage the result a bit if in an FNC1 mode:
for i in start..result.len() {
// for (int i = start; i < result.length(); i++) {
if result.chars().nth(i).unwrap() == '%' {
if i < result.len() - 1 && result.chars().nth(i + 1).unwrap() == '%' {
if result
.chars()
.nth(i)
.ok_or(Exceptions::IndexOutOfBoundsException(None))?
== '%'
{
if i < result.len() - 1
&& result
.chars()
.nth(i + 1)
.ok_or(Exceptions::IndexOutOfBoundsException(None))?
== '%'
{
// %% is rendered as %
result.remove(i + 1);
// result.deleteCharAt(i + 1);
} else {
// In alpha mode, % should be converted to FNC1 separator 0x1D
result.replace_range(i..i + 1, "\u{1D}");
// result.setCharAt(i, 0x1D);
}
}
}

View File

@@ -114,7 +114,3 @@ impl FromStr for ErrorCorrectionLevel {
))));
}
}
//private static final ErrorCorrectionLevel[] FOR_BITS = {M, L, H, Q};
//private final int bits;

View File

@@ -14,6 +14,8 @@
* limitations under the License.
*/
use crate::Exceptions;
use super::ErrorCorrectionLevel;
const FORMAT_INFO_MASK_QR: u32 = 0x5412;
@@ -71,16 +73,15 @@ pub struct FormatInformation {
}
impl FormatInformation {
fn new(format_info: u8) -> Self {
fn new(format_info: u8) -> Result<Self, Exceptions> {
// Bits 3,4
let errorCorrectionLevel =
ErrorCorrectionLevel::forBits((format_info >> 3) & 0x03).expect("pass in valid bits");
let errorCorrectionLevel = ErrorCorrectionLevel::forBits((format_info >> 3) & 0x03)?;
// Bottom 3 bits
let dataMask = format_info & 0x07;
Self {
Ok(Self {
error_correction_level: errorCorrectionLevel,
data_mask: dataMask,
}
})
}
pub fn numBitsDiffering(a: u32, b: u32) -> u32 {
@@ -120,11 +121,10 @@ impl FormatInformation {
let mut best_difference = u32::MAX;
let mut best_format_info = 0;
for decodeInfo in FORMAT_INFO_DECODE_LOOKUP {
// for (int[] decodeInfo : FORMAT_INFO_DECODE_LOOKUP) {
let targetInfo = decodeInfo[0];
if targetInfo == masked_format_info1 || targetInfo == masked_format_info2 {
// Found an exact match
return Some(FormatInformation::new(decodeInfo[1] as u8));
return FormatInformation::new(decodeInfo[1] as u8).ok();
}
let mut bits_difference = Self::numBitsDiffering(masked_format_info1, targetInfo);
if bits_difference < best_difference {
@@ -143,7 +143,7 @@ impl FormatInformation {
// Hamming distance of the 32 masked codes is 7, by construction, so <= 3 bits
// differing means we found a match
if best_difference <= 3 {
return Some(FormatInformation::new(best_format_info));
return FormatInformation::new(best_format_info).ok();
}
None
}

View File

@@ -94,7 +94,7 @@ pub fn decode_bitmatrix_with_hints(
let mut trying = || -> Result<DecoderRXingResult, Exceptions> {
// Revert the bit matrix
parser.remask();
parser.remask()?;
// Will be attempting a mirrored reading of the version and format info.
parser.setMirror(true);
@@ -129,20 +129,12 @@ pub fn decode_bitmatrix_with_hints(
if let Some(fe) = fe {
Err(fe)
} else {
Err(ce.unwrap())
Err(ce.unwrap_or(Exceptions::ChecksumException(None)))
}
}
_ => Err(er),
},
}
// catch (FormatException | ChecksumException e) {
// // Throw the exception from the original reading
// if (fe != null) {
// throw fe;
// }
// throw ce; // If fe is null, this can't be
// }
}
fn decode_bitmatrix_parser_with_hints(
@@ -167,14 +159,11 @@ fn decode_bitmatrix_parser_with_hints(
// Error-correct and copy data blocks together into a stream of bytes
for dataBlock in &dataBlocks {
// for (DataBlock dataBlock : dataBlocks) {
let mut codewordBytes = dataBlock.getCodewords().to_vec();
let numDataCodewords = dataBlock.getNumDataCodewords() as usize;
correctErrors(&mut codewordBytes, numDataCodewords)?;
for codeword_byte in codewordBytes.iter().take(numDataCodewords) {
// for i in 0..numDataCodewords {
// for (int i = 0; i < numDataCodewords; i++) {
resultBytes[resultOffset] = *codeword_byte; //codewordBytes[i];
resultBytes[resultOffset] = *codeword_byte;
resultOffset += 1;
}
}
@@ -195,10 +184,6 @@ fn correctErrors(codewordBytes: &mut [u8], numDataCodewords: usize) -> Result<()
let numCodewords = codewordBytes.len();
// First read into an array of ints
let mut codewordsInts = vec![0u8; numCodewords];
// for i in 0..numCodewords {
// // for (int i = 0; i < numCodewords; i++) {
// codewordsInts[i] = codewordBytes[i]; // & 0xFF;
// }
codewordsInts[..numCodewords].copy_from_slice(&codewordBytes[..numCodewords]);
let mut sending_code_words: Vec<i32> = codewordsInts.iter().map(|x| *x as i32).collect();
@@ -207,9 +192,7 @@ fn correctErrors(codewordBytes: &mut [u8], numDataCodewords: usize) -> Result<()
&mut sending_code_words,
(codewordBytes.len() - numDataCodewords) as i32,
) {
// if let Exceptions::ReedSolomonException(error_str) = e {
return Err(Exceptions::ChecksumException(error_str));
// }
}
// Copy back into array of bytes -- only need to worry about the bytes that were data

View File

@@ -58,8 +58,6 @@ impl Version {
let ecbArray = ecBlocks[0].getECBlocks();
let mut i = 0;
while i < ecbArray.len() {
// for ecBlock in ecbArray {
// for (ECB ecBlock : ecbArray) {
total += ecbArray[i].getCount() * (ecbArray[i].getDataCodewords() + ecCodewords);
i += 1;
}
@@ -108,11 +106,6 @@ impl Version {
)));
}
Self::getVersionForNumber((dimension - 17) / 4)
// try {
// return getVersionForNumber((dimension - 17) / 4);
// } catch (IllegalArgumentException ignored) {
// throw FormatException.getFormatInstance();
// }
}
pub fn getVersionForNumber(versionNumber: u32) -> Result<&'static Version, Exceptions> {
@@ -128,7 +121,6 @@ impl Version {
let mut bestDifference = u32::MAX;
let mut bestVersion = 0;
for i in 0..VERSION_DECODE_INFO.len() as u32 {
// for (int i = 0; i < VERSION_DECODE_INFO.length; i++) {
let targetVersion = VERSION_DECODE_INFO[i as usize];
// Do the version info bits match exactly? done.
if targetVersion == versionBits {
@@ -156,7 +148,7 @@ impl Version {
*/
pub fn buildFunctionPattern(&self) -> Result<BitMatrix, Exceptions> {
let dimension = self.getDimensionForVersion();
let mut bitMatrix = BitMatrix::with_single_dimension(dimension);
let mut bitMatrix = BitMatrix::with_single_dimension(dimension)?;
// Top left finder pattern + separator + format
bitMatrix.setRegion(0, 0, 9, 9)?;
@@ -168,10 +160,8 @@ impl Version {
// Alignment patterns
let max = self.alignmentPatternCenters.len();
for x in 0..max {
// for (int x = 0; x < max; x++) {
let i = self.alignmentPatternCenters[x] - 2;
for y in 0..max {
// for (int y = 0; y < max; y++) {
if (x != 0 || (y != 0 && y != max - 1)) && (x != max - 1 || y != 0) {
bitMatrix.setRegion(self.alignmentPatternCenters[y] - 2, i, 5, 5)?;
}
@@ -950,7 +940,6 @@ impl ECBlocks {
pub fn getNumBlocks(&self) -> u32 {
let mut total = 0;
for ecBlock in &self.ecBlocks {
// for (ECB ecBlock : ecBlocks) {
total += ecBlock.getCount();
}
total