upca integration

This commit is contained in:
Henry Schimke
2022-12-10 09:47:08 -06:00
parent 42e5312e4c
commit 9752608edd
11 changed files with 259 additions and 295 deletions

View File

@@ -1,90 +0,0 @@
/*
* Copyright 2008 ZXing authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.zxing.oned;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.ChecksumException;
import com.google.zxing.DecodeHintType;
import com.google.zxing.FormatException;
import com.google.zxing.NotFoundException;
import com.google.zxing.RXingResult;
import com.google.zxing.common.BitArray;
import java.util.Map;
/**
* <p>Implements decoding of the UPC-A format.</p>
*
* @author dswitkin@google.com (Daniel Switkin)
* @author Sean Owen
*/
public final class UPCAReader extends UPCEANReader {
private final UPCEANReader ean13Reader = new EAN13Reader();
@Override
public RXingResult decodeRow(int rowNumber,
BitArray row,
int[] startGuardRange,
Map<DecodeHintType,?> hints)
throws NotFoundException, FormatException, ChecksumException {
return maybeReturnRXingResult(ean13Reader.decodeRow(rowNumber, row, startGuardRange, hints));
}
@Override
public RXingResult decodeRow(int rowNumber, BitArray row, Map<DecodeHintType,?> hints)
throws NotFoundException, FormatException, ChecksumException {
return maybeReturnRXingResult(ean13Reader.decodeRow(rowNumber, row, hints));
}
@Override
public RXingResult decode(BinaryBitmap image) throws NotFoundException, FormatException {
return maybeReturnRXingResult(ean13Reader.decode(image));
}
@Override
public RXingResult decode(BinaryBitmap image, Map<DecodeHintType,?> hints)
throws NotFoundException, FormatException {
return maybeReturnRXingResult(ean13Reader.decode(image, hints));
}
@Override
BarcodeFormat getBarcodeFormat() {
return BarcodeFormat.UPC_A;
}
@Override
protected int decodeMiddle(BitArray row, int[] startRange, StringBuilder resultString)
throws NotFoundException {
return ean13Reader.decodeMiddle(row, startRange, resultString);
}
private static RXingResult maybeReturnRXingResult(RXingResult result) throws FormatException {
String text = result.getText();
if (text.charAt(0) == '0') {
RXingResult upcaRXingResult = new RXingResult(text.substring(1), null, result.getRXingResultPoints(), BarcodeFormat.UPC_A);
if (result.getRXingResultMetadata() != null) {
upcaRXingResult.putAllMetadata(result.getRXingResultMetadata());
}
return upcaRXingResult;
} else {
throw FormatException.getFormatInstance();
}
}
}

View File

@@ -157,3 +157,9 @@ impl EAN13Reader {
return Err(Exceptions::NotFoundException("".to_owned()));
}
}
impl Default for EAN13Reader {
fn default() -> Self {
Self {}
}
}

View File

@@ -40,3 +40,6 @@ pub use ean_8_reader::*;
mod ean_13_reader;
pub use ean_13_reader::*;
mod upc_a_reader;
pub use upc_a_reader::*;

113
src/oned/upc_a_reader.rs Normal file
View File

@@ -0,0 +1,113 @@
/*
* Copyright 2008 ZXing authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
use crate::{BarcodeFormat, Exceptions, RXingResult, Reader};
use super::{EAN13Reader, OneDReader, UPCEANReader};
/**
* <p>Implements decoding of the UPC-A format.</p>
*
* @author dswitkin@google.com (Daniel Switkin)
* @author Sean Owen
*/
pub struct UPCAReader(EAN13Reader);
impl Reader for UPCAReader {
fn decode(&mut self, image: &crate::BinaryBitmap) -> Result<crate::RXingResult, Exceptions> {
Self::maybeReturnRXingResult(self.0.decode(image)?)
}
fn decode_with_hints(
&mut self,
image: &crate::BinaryBitmap,
hints: &crate::DecodingHintDictionary,
) -> Result<crate::RXingResult, Exceptions> {
Self::maybeReturnRXingResult(self.0.decode_with_hints(image, hints)?)
}
}
impl OneDReader for UPCAReader {
fn decodeRow(
&mut self,
rowNumber: u32,
row: &crate::common::BitArray,
hints: &crate::DecodingHintDictionary,
) -> Result<crate::RXingResult, Exceptions> {
Self::maybeReturnRXingResult(self.0.decodeRow(rowNumber, row, hints)?)
}
}
impl UPCEANReader for UPCAReader {
fn getBarcodeFormat(&self) -> crate::BarcodeFormat {
BarcodeFormat::UPC_A
}
fn decodeMiddle(
&self,
row: &crate::common::BitArray,
startRange: &[usize; 2],
resultString: &mut String,
) -> Result<usize, Exceptions> {
self.0.decodeMiddle(row, startRange, resultString)
}
fn decodeRowWithGuardRange(
&self,
rowNumber: u32,
row: &crate::common::BitArray,
startGuardRange: &[usize; 2],
hints: &crate::DecodingHintDictionary,
) -> Result<crate::RXingResult, Exceptions>
where
Self: Sized,
{
Self::maybeReturnRXingResult(self.0.decodeRowWithGuardRange(
rowNumber,
row,
startGuardRange,
hints,
)?)
}
}
impl Default for UPCAReader {
fn default() -> Self {
Self(Default::default())
}
}
impl UPCAReader {
// private final UPCEANReader ean13Reader = new EAN13Reader();
fn maybeReturnRXingResult(result: RXingResult) -> Result<RXingResult, Exceptions> {
let text = result.getText();
if text.chars().nth(0).unwrap() == '0' {
let mut upcaRXingResult = RXingResult::new(
&text[1..],
Vec::new(),
result.getRXingResultPoints().to_vec(),
BarcodeFormat::UPC_A,
);
// if result.getRXingResultMetadata() != null {
upcaRXingResult.putAllMetadata(result.getRXingResultMetadata().clone());
// }
Ok(upcaRXingResult)
} else {
Err(Exceptions::NotFoundException("".to_owned()))
}
}
}

View File

@@ -1,34 +0,0 @@
/*
* Copyright 2008 ZXing authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.zxing.oned;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.common.AbstractBlackBoxTestCase;
/**
* @author Sean Owen
*/
public final class UPCABlackBox1TestCase extends AbstractBlackBoxTestCase {
public UPCABlackBox1TestCase() {
super("src/test/resources/blackbox/upca-1", new MultiFormatReader(), BarcodeFormat.UPC_A);
addTest(14, 18, 0, 1, 0.0f);
addTest(16, 18, 0, 1, 180.0f);
}
}

View File

@@ -1,34 +0,0 @@
/*
* Copyright 2008 ZXing authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.zxing.oned;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.common.AbstractBlackBoxTestCase;
/**
* @author dswitkin@google.com (Daniel Switkin)
*/
public final class UPCABlackBox2TestCase extends AbstractBlackBoxTestCase {
public UPCABlackBox2TestCase() {
super("src/test/resources/blackbox/upca-2", new MultiFormatReader(), BarcodeFormat.UPC_A);
addTest(28, 36, 0, 2, 0.0f);
addTest(29, 36, 0, 2, 180.0f);
}
}

View File

@@ -1,34 +0,0 @@
/*
* Copyright 2008 ZXing authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.zxing.oned;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.common.AbstractBlackBoxTestCase;
/**
* @author dswitkin@google.com (Daniel Switkin)
*/
public final class UPCABlackBox3ReflectiveTestCase extends AbstractBlackBoxTestCase {
public UPCABlackBox3ReflectiveTestCase() {
super("src/test/resources/blackbox/upca-3", new MultiFormatReader(), BarcodeFormat.UPC_A);
addTest(7, 9, 0, 2, 0.0f);
addTest(8, 9, 0, 2, 180.0f);
}
}

View File

@@ -1,34 +0,0 @@
/*
* Copyright 2008 ZXing authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.zxing.oned;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.common.AbstractBlackBoxTestCase;
/**
* @author dswitkin@google.com (Daniel Switkin)
*/
public final class UPCABlackBox4TestCase extends AbstractBlackBoxTestCase {
public UPCABlackBox4TestCase() {
super("src/test/resources/blackbox/upca-4", new MultiFormatReader(), BarcodeFormat.UPC_A);
addTest(9, 11, 0, 1, 0.0f);
addTest(9, 11, 0, 1, 180.0f);
}
}

View File

@@ -1,34 +0,0 @@
/*
* Copyright 2008 ZXing authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.zxing.oned;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.common.AbstractBlackBoxTestCase;
/**
* @author dswitkin@google.com (Daniel Switkin)
*/
public final class UPCABlackBox5TestCase extends AbstractBlackBoxTestCase {
public UPCABlackBox5TestCase() {
super("src/test/resources/blackbox/upca-5", new MultiFormatReader(), BarcodeFormat.UPC_A);
addTest(20, 23, 0, 0, 0.0f);
addTest(22, 23, 0, 0, 180.0f);
}
}

View File

@@ -1,35 +0,0 @@
/*
* Copyright 2008 ZXing authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.google.zxing.oned;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.common.AbstractBlackBoxTestCase;
/**
* A set of blurry images taken with a fixed-focus device.
* @author dswitkin@google.com (Daniel Switkin)
*/
public final class UPCABlackBox6BlurryTestCase extends AbstractBlackBoxTestCase {
public UPCABlackBox6BlurryTestCase() {
super("src/test/resources/blackbox/upca-6", new MultiFormatReader(), BarcodeFormat.UPC_A);
addTest(0, 0, 0.0f);
addTest(0, 0, 180.0f);
}
}

View File

@@ -0,0 +1,137 @@
/*
* Copyright 2008 ZXing authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
use rxing::{
oned::{EAN13Reader, UPCAReader},
BarcodeFormat, MultiFormatReader,
};
mod common;
/**
* @author Sean Owen
*/
#[test]
fn upcablack_box1_test_case() {
let mut tester = common::AbstractBlackBoxTestCase::new(
"test_resources/blackbox/upca-1",
// MultiFormatReader::default(),
UPCAReader::default(),
BarcodeFormat::UPC_A,
);
// super("src/test/resources/blackbox/upca-1", new MultiFormatReader(), BarcodeFormat.UPC_A);
tester.add_test_complex(14, 18, 0, 1, 0.0);
tester.add_test_complex(16, 18, 0, 1, 180.0);
tester.test_black_box()
}
/**
* @author dswitkin@google.com (Daniel Switkin)
*/
#[test]
fn upcablack_box2_test_case() {
let mut tester = common::AbstractBlackBoxTestCase::new(
"test_resources/blackbox/upca-2",
// MultiFormatReader::default(),
UPCAReader::default(),
BarcodeFormat::UPC_A,
);
// super("src/test/resources/blackbox/upca-2", new MultiFormatReader(), BarcodeFormat.UPC_A);
tester.add_test_complex(28, 36, 0, 2, 0.0);
tester.add_test_complex(29, 36, 0, 2, 180.0);
tester.test_black_box()
}
/**
* @author dswitkin@google.com (Daniel Switkin)
*/
#[test]
fn upcablack_box3_reflective_test_case() {
let mut tester = common::AbstractBlackBoxTestCase::new(
"test_resources/blackbox/upca-3",
// MultiFormatReader::default(),
UPCAReader::default(),
BarcodeFormat::UPC_A,
);
// super("src/test/resources/blackbox/upca-3", new MultiFormatReader(), BarcodeFormat.UPC_A);
tester.add_test_complex(7, 9, 0, 2, 0.0);
tester.add_test_complex(8, 9, 0, 2, 180.0);
tester.test_black_box()
}
/**
* @author dswitkin@google.com (Daniel Switkin)
*/
#[test]
fn upcablack_box4_test_case() {
let mut tester = common::AbstractBlackBoxTestCase::new(
"test_resources/blackbox/upca-4",
// MultiFormatReader::default(),
UPCAReader::default(),
BarcodeFormat::UPC_A,
);
// super("src/test/resources/blackbox/upca-4", new MultiFormatReader(), BarcodeFormat.UPC_A);
tester.add_test_complex(9, 11, 0, 1, 0.0);
tester.add_test_complex(9, 11, 0, 1, 180.0);
tester.test_black_box()
}
/**
* @author dswitkin@google.com (Daniel Switkin)
*/
#[test]
fn upcablack_box5_test_case() {
let mut tester = common::AbstractBlackBoxTestCase::new(
"test_resources/blackbox/upca-5",
// MultiFormatReader::default(),
UPCAReader::default(),
BarcodeFormat::UPC_A,
);
// super("src/test/resources/blackbox/upca-5", new MultiFormatReader(), BarcodeFormat.UPC_A);
tester.add_test_complex(20, 23, 0, 0, 0.0);
tester.add_test_complex(22, 23, 0, 0, 180.0);
tester.test_black_box()
}
/**
* A set of blurry images taken with a fixed-focus device.
* @author dswitkin@google.com (Daniel Switkin)
*/
#[test]
fn upcablack_box6_blurry_test_case() {
let mut tester = common::AbstractBlackBoxTestCase::new(
"test_resources/blackbox/upca-6",
// MultiFormatReader::default(),
UPCAReader::default(),
BarcodeFormat::UPC_A,
);
// super("src/test/resources/blackbox/upca-6", new MultiFormatReader(), BarcodeFormat.UPC_A);
tester.add_test(0, 0, 0.0);
tester.add_test(0, 0, 180.0);
tester.test_black_box()
}