mirror of
https://github.com/starovoid/rxing.git
synced 2026-07-27 12:52:34 +00:00
QrCode struct and associated types ported NOPASS
This commit is contained in:
@@ -11,6 +11,7 @@ exclude = [
|
|||||||
[dependencies]
|
[dependencies]
|
||||||
regex = "1.6"
|
regex = "1.6"
|
||||||
fancy-regex = "0.10"
|
fancy-regex = "0.10"
|
||||||
|
lazy_static = "1.4.0"
|
||||||
encoding = "0.2"
|
encoding = "0.2"
|
||||||
rand = "0.8.5"
|
rand = "0.8.5"
|
||||||
urlencoding = "2.1.2"
|
urlencoding = "2.1.2"
|
||||||
|
|||||||
@@ -1,52 +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.qrcode.decoder;
|
|
||||||
|
|
||||||
import org.junit.Assert;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Sean Owen
|
|
||||||
*/
|
|
||||||
public final class ModeTestCase extends Assert {
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testForBits() {
|
|
||||||
assertSame(Mode.TERMINATOR, Mode.forBits(0x00));
|
|
||||||
assertSame(Mode.NUMERIC, Mode.forBits(0x01));
|
|
||||||
assertSame(Mode.ALPHANUMERIC, Mode.forBits(0x02));
|
|
||||||
assertSame(Mode.BYTE, Mode.forBits(0x04));
|
|
||||||
assertSame(Mode.KANJI, Mode.forBits(0x08));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test(expected = IllegalArgumentException.class)
|
|
||||||
public void testBadMode() {
|
|
||||||
Mode.forBits(0x10);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testCharacterCount() {
|
|
||||||
// Spot check a few values
|
|
||||||
assertEquals(10, Mode.NUMERIC.getCharacterCountBits(Version.getVersionForNumber(5)));
|
|
||||||
assertEquals(12, Mode.NUMERIC.getCharacterCountBits(Version.getVersionForNumber(26)));
|
|
||||||
assertEquals(14, Mode.NUMERIC.getCharacterCountBits(Version.getVersionForNumber(40)));
|
|
||||||
assertEquals(9, Mode.ALPHANUMERIC.getCharacterCountBits(Version.getVersionForNumber(6)));
|
|
||||||
assertEquals(8, Mode.BYTE.getCharacterCountBits(Version.getVersionForNumber(7)));
|
|
||||||
assertEquals(8, Mode.KANJI.getCharacterCountBits(Version.getVersionForNumber(8)));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
51
src/qrcode/decoder/ModeTestCase.rs
Normal file
51
src/qrcode/decoder/ModeTestCase.rs
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
/*
|
||||||
|
* 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::qrcode::decoder::Version;
|
||||||
|
|
||||||
|
use super::Mode;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Sean Owen
|
||||||
|
*/
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn testForBits() {
|
||||||
|
assert_eq!(Mode::TERMINATOR, Mode::forBits(0x00).unwrap());
|
||||||
|
assert_eq!(Mode::NUMERIC, Mode::forBits(0x01).unwrap());
|
||||||
|
assert_eq!(Mode::ALPHANUMERIC, Mode::forBits(0x02).unwrap());
|
||||||
|
assert_eq!(Mode::BYTE, Mode::forBits(0x04).unwrap());
|
||||||
|
assert_eq!(Mode::KANJI, Mode::forBits(0x08).unwrap());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[should_panic]
|
||||||
|
fn testBadMode() {
|
||||||
|
assert!(Mode::forBits(0x10).is_ok());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn testCharacterCount() {
|
||||||
|
// Spot check a few values
|
||||||
|
assert_eq!(10, Mode::NUMERIC.getCharacterCountBits(Version::getVersionForNumber(5).unwrap()));
|
||||||
|
assert_eq!(12, Mode::NUMERIC.getCharacterCountBits(Version::getVersionForNumber(26).unwrap()));
|
||||||
|
assert_eq!(14, Mode::NUMERIC.getCharacterCountBits(Version::getVersionForNumber(40).unwrap()));
|
||||||
|
assert_eq!(9, Mode::ALPHANUMERIC.getCharacterCountBits(Version::getVersionForNumber(6).unwrap()));
|
||||||
|
assert_eq!(8, Mode::BYTE.getCharacterCountBits(Version::getVersionForNumber(7).unwrap()));
|
||||||
|
assert_eq!(8, Mode::KANJI.getCharacterCountBits(Version::getVersionForNumber(8).unwrap()));
|
||||||
|
}
|
||||||
|
|
||||||
@@ -1,78 +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.qrcode.decoder;
|
|
||||||
|
|
||||||
import org.junit.Assert;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Sean Owen
|
|
||||||
*/
|
|
||||||
public final class VersionTestCase extends Assert {
|
|
||||||
|
|
||||||
@Test(expected = IllegalArgumentException.class)
|
|
||||||
public void testBadVersion() {
|
|
||||||
Version.getVersionForNumber(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testVersionForNumber() {
|
|
||||||
for (int i = 1; i <= 40; i++) {
|
|
||||||
checkVersion(Version.getVersionForNumber(i), i, 4 * i + 17);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void checkVersion(Version version, int number, int dimension) {
|
|
||||||
assertNotNull(version);
|
|
||||||
assertEquals(number, version.getVersionNumber());
|
|
||||||
assertNotNull(version.getAlignmentPatternCenters());
|
|
||||||
if (number > 1) {
|
|
||||||
assertTrue(version.getAlignmentPatternCenters().length > 0);
|
|
||||||
}
|
|
||||||
assertEquals(dimension, version.getDimensionForVersion());
|
|
||||||
assertNotNull(version.getECBlocksForLevel(ErrorCorrectionLevel.H));
|
|
||||||
assertNotNull(version.getECBlocksForLevel(ErrorCorrectionLevel.L));
|
|
||||||
assertNotNull(version.getECBlocksForLevel(ErrorCorrectionLevel.M));
|
|
||||||
assertNotNull(version.getECBlocksForLevel(ErrorCorrectionLevel.Q));
|
|
||||||
assertNotNull(version.buildFunctionPattern());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testGetProvisionalVersionForDimension() throws Exception {
|
|
||||||
for (int i = 1; i <= 40; i++) {
|
|
||||||
assertEquals(i, Version.getProvisionalVersionForDimension(4 * i + 17).getVersionNumber());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testDecodeVersionInformation() {
|
|
||||||
// Spot check
|
|
||||||
doTestVersion(7, 0x07C94);
|
|
||||||
doTestVersion(12, 0x0C762);
|
|
||||||
doTestVersion(17, 0x1145D);
|
|
||||||
doTestVersion(22, 0x168C9);
|
|
||||||
doTestVersion(27, 0x1B08E);
|
|
||||||
doTestVersion(32, 0x209D5);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void doTestVersion(int expectedVersion, int mask) {
|
|
||||||
Version version = Version.decodeVersionInformation(mask);
|
|
||||||
assertNotNull(version);
|
|
||||||
assertEquals(expectedVersion, version.getVersionNumber());
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
85
src/qrcode/decoder/VersionTestCase.rs
Normal file
85
src/qrcode/decoder/VersionTestCase.rs
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
/*
|
||||||
|
* 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::{qrcode::decoder::{Version, ErrorCorrectionLevel}, Exceptions};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Sean Owen
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[should_panic]
|
||||||
|
fn testBadVersion() {
|
||||||
|
assert!(Version::getVersionForNumber(0).is_ok());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn testVersionForNumber() {
|
||||||
|
for i in 1..=40 {
|
||||||
|
// for (int i = 1; i <= 40; i++) {
|
||||||
|
checkVersion(Version::getVersionForNumber(i), i, 4 * i + 17);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn checkVersion( version:Result<&Version,Exceptions>, number:u32, dimension:u32) {
|
||||||
|
assert!(version.is_ok());
|
||||||
|
let version = version.unwrap();
|
||||||
|
assert_eq!(number, version.getVersionNumber());
|
||||||
|
// assertNotNull(version.getAlignmentPatternCenters());
|
||||||
|
if (number > 1) {
|
||||||
|
assert!(version.getAlignmentPatternCenters().len() > 0);
|
||||||
|
}
|
||||||
|
assert_eq!(dimension, version.getDimensionForVersion());
|
||||||
|
let _tmp = version.getECBlocksForLevel(ErrorCorrectionLevel::H);
|
||||||
|
let _tmp = version.getECBlocksForLevel(ErrorCorrectionLevel::L);
|
||||||
|
let _tmp = version.getECBlocksForLevel(ErrorCorrectionLevel::M);
|
||||||
|
let _tmp = version.getECBlocksForLevel(ErrorCorrectionLevel::Q);
|
||||||
|
let _tmp = version.buildFunctionPattern();
|
||||||
|
|
||||||
|
// assertNotNull(version.getECBlocksForLevel(ErrorCorrectionLevel::H));
|
||||||
|
// assertNotNull(version.getECBlocksForLevel(ErrorCorrectionLevel::L));
|
||||||
|
// assertNotNull(version.getECBlocksForLevel(ErrorCorrectionLevel::M));
|
||||||
|
// assertNotNull(version.getECBlocksForLevel(ErrorCorrectionLevel::Q));
|
||||||
|
// assertNotNull(version.buildFunctionPattern());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn testGetProvisionalVersionForDimension() {
|
||||||
|
for i in 1..=40 {
|
||||||
|
// for (int i = 1; i <= 40; i++) {
|
||||||
|
assert_eq!(i, Version::getProvisionalVersionForDimension(4 * i + 17).expect("must exist for supplied values").getVersionNumber());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn testDecodeVersionInformation() {
|
||||||
|
// Spot check
|
||||||
|
doTestVersion(7, 0x07C94);
|
||||||
|
doTestVersion(12, 0x0C762);
|
||||||
|
doTestVersion(17, 0x1145D);
|
||||||
|
doTestVersion(22, 0x168C9);
|
||||||
|
doTestVersion(27, 0x1B08E);
|
||||||
|
doTestVersion(32, 0x209D5);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn doTestVersion( expectedVersion:u32, mask:u32) {
|
||||||
|
let version = Version::decodeVersionInformation(mask);
|
||||||
|
assert!(version.is_ok());
|
||||||
|
assert_eq!(expectedVersion, version.unwrap().getVersionNumber());
|
||||||
|
}
|
||||||
|
|
||||||
@@ -118,8 +118,8 @@ impl FormatInformation {
|
|||||||
masked_format_info2: u32,
|
masked_format_info2: u32,
|
||||||
) -> Option<FormatInformation> {
|
) -> Option<FormatInformation> {
|
||||||
// Find the int in FORMAT_INFO_DECODE_LOOKUP with fewest bits differing
|
// Find the int in FORMAT_INFO_DECODE_LOOKUP with fewest bits differing
|
||||||
let best_difference = u32::MAX;
|
let mut best_difference = u32::MAX;
|
||||||
let best_format_info = 0;
|
let mut best_format_info = 0;
|
||||||
for decodeInfo in FORMAT_INFO_DECODE_LOOKUP {
|
for decodeInfo in FORMAT_INFO_DECODE_LOOKUP {
|
||||||
// for (int[] decodeInfo : FORMAT_INFO_DECODE_LOOKUP) {
|
// for (int[] decodeInfo : FORMAT_INFO_DECODE_LOOKUP) {
|
||||||
let targetInfo = decodeInfo[0];
|
let targetInfo = decodeInfo[0];
|
||||||
@@ -127,7 +127,7 @@ impl FormatInformation {
|
|||||||
// Found an exact match
|
// Found an exact match
|
||||||
return Some(FormatInformation::new(decodeInfo[1] as u8));
|
return Some(FormatInformation::new(decodeInfo[1] as u8));
|
||||||
}
|
}
|
||||||
let bits_difference = Self::numBitsDiffering(masked_format_info1, targetInfo);
|
let mut bits_difference = Self::numBitsDiffering(masked_format_info1, targetInfo);
|
||||||
if bits_difference < best_difference {
|
if bits_difference < best_difference {
|
||||||
best_format_info = decodeInfo[1] as u8;
|
best_format_info = decodeInfo[1] as u8;
|
||||||
best_difference = bits_difference;
|
best_difference = bits_difference;
|
||||||
|
|||||||
@@ -5,6 +5,10 @@ mod format_information;
|
|||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod ErrorCorrectionLevelTestCase;
|
mod ErrorCorrectionLevelTestCase;
|
||||||
|
#[cfg(test)]
|
||||||
|
mod ModeTestCase;
|
||||||
|
#[cfg(test)]
|
||||||
|
mod VersionTestCase;
|
||||||
|
|
||||||
pub use version::*;
|
pub use version::*;
|
||||||
pub use mode::*;
|
pub use mode::*;
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ use super::Version;
|
|||||||
*
|
*
|
||||||
* @author Sean Owen
|
* @author Sean Owen
|
||||||
*/
|
*/
|
||||||
|
#[derive(Debug, PartialEq, Eq)]
|
||||||
pub enum Mode {
|
pub enum Mode {
|
||||||
TERMINATOR, //(new int[]{0, 0, 0}, 0x00), // Not really a mode...
|
TERMINATOR, //(new int[]{0, 0, 0}, 0x00), // Not really a mode...
|
||||||
NUMERIC, //(new int[]{10, 12, 14}, 0x01),
|
NUMERIC, //(new int[]{10, 12, 14}, 0x01),
|
||||||
|
|||||||
@@ -20,6 +20,12 @@ use crate::{common::BitMatrix, Exceptions};
|
|||||||
|
|
||||||
use super::{ErrorCorrectionLevel, FormatInformation};
|
use super::{ErrorCorrectionLevel, FormatInformation};
|
||||||
|
|
||||||
|
use lazy_static::lazy_static;
|
||||||
|
|
||||||
|
lazy_static! {
|
||||||
|
static ref VERSIONS: Vec<Version> = Version::buildVersions();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* See ISO 18004:2006 Annex D.
|
* See ISO 18004:2006 Annex D.
|
||||||
* Element i represents the raw version bits that specify version i + 7
|
* Element i represents the raw version bits that specify version i + 7
|
||||||
@@ -31,7 +37,7 @@ const VERSION_DECODE_INFO: [u32; 34] = [
|
|||||||
0x2542E, 0x26A64, 0x27541, 0x28C69,
|
0x2542E, 0x26A64, 0x27541, 0x28C69,
|
||||||
];
|
];
|
||||||
|
|
||||||
const VERSIONS: Vec<Version> = Version::buildVersions();
|
// const VERSIONS: &'static[Version] = &Version::buildVersions();
|
||||||
/**
|
/**
|
||||||
* See ISO 18004:2006 Annex D
|
* See ISO 18004:2006 Annex D
|
||||||
*
|
*
|
||||||
@@ -45,12 +51,8 @@ pub struct Version {
|
|||||||
totalCodewords: u32,
|
totalCodewords: u32,
|
||||||
}
|
}
|
||||||
impl Version {
|
impl Version {
|
||||||
const fn new(
|
fn new(versionNumber: u32, alignmentPatternCenters: Vec<u32>, ecBlocks: Vec<ECBlocks>) -> Self {
|
||||||
versionNumber: u32,
|
let mut total = 0;
|
||||||
alignmentPatternCenters: Vec<u32>,
|
|
||||||
ecBlocks: Vec<ECBlocks>,
|
|
||||||
) -> Self {
|
|
||||||
let total = 0;
|
|
||||||
let ecCodewords = ecBlocks[0].getECCodewordsPerBlock();
|
let ecCodewords = ecBlocks[0].getECCodewordsPerBlock();
|
||||||
let ecbArray = ecBlocks[0].getECBlocks();
|
let ecbArray = ecBlocks[0].getECBlocks();
|
||||||
let mut i = 0;
|
let mut i = 0;
|
||||||
@@ -96,7 +98,9 @@ impl Version {
|
|||||||
* @return Version for a QR Code of that dimension
|
* @return Version for a QR Code of that dimension
|
||||||
* @throws FormatException if dimension is not 1 mod 4
|
* @throws FormatException if dimension is not 1 mod 4
|
||||||
*/
|
*/
|
||||||
pub fn getProvisionalVersionForDimension(dimension: u32) -> Result<Version, Exceptions> {
|
pub fn getProvisionalVersionForDimension(
|
||||||
|
dimension: u32,
|
||||||
|
) -> Result<&'static Version, Exceptions> {
|
||||||
if dimension % 4 != 1 {
|
if dimension % 4 != 1 {
|
||||||
return Err(Exceptions::FormatException(
|
return Err(Exceptions::FormatException(
|
||||||
"dimension incorrect".to_owned(),
|
"dimension incorrect".to_owned(),
|
||||||
@@ -110,18 +114,18 @@ impl Version {
|
|||||||
// }
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn getVersionForNumber(versionNumber: u32) -> Result<Version, Exceptions> {
|
pub fn getVersionForNumber(versionNumber: u32) -> Result<&'static Version, Exceptions> {
|
||||||
if versionNumber < 1 || versionNumber > 40 {
|
if versionNumber < 1 || versionNumber > 40 {
|
||||||
return Err(Exceptions::IllegalArgumentException(
|
return Err(Exceptions::IllegalArgumentException(
|
||||||
"version out of spec".to_owned(),
|
"version out of spec".to_owned(),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
Ok(VERSIONS[versionNumber as usize - 1])
|
Ok(&VERSIONS[versionNumber as usize - 1])
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn decodeVersionInformation(versionBits: u32) -> Result<Version, Exceptions> {
|
pub fn decodeVersionInformation(versionBits: u32) -> Result<&'static Version, Exceptions> {
|
||||||
let bestDifference = u32::MAX;
|
let mut bestDifference = u32::MAX;
|
||||||
let bestVersion = 0;
|
let mut bestVersion = 0;
|
||||||
for i in 0..VERSION_DECODE_INFO.len() as u32 {
|
for i in 0..VERSION_DECODE_INFO.len() as u32 {
|
||||||
// for (int i = 0; i < VERSION_DECODE_INFO.length; i++) {
|
// for (int i = 0; i < VERSION_DECODE_INFO.length; i++) {
|
||||||
let targetVersion = VERSION_DECODE_INFO[i as usize];
|
let targetVersion = VERSION_DECODE_INFO[i as usize];
|
||||||
@@ -151,7 +155,7 @@ impl Version {
|
|||||||
*/
|
*/
|
||||||
pub fn buildFunctionPattern(&self) -> BitMatrix {
|
pub fn buildFunctionPattern(&self) -> BitMatrix {
|
||||||
let dimension = self.getDimensionForVersion();
|
let dimension = self.getDimensionForVersion();
|
||||||
let bitMatrix = BitMatrix::with_single_dimension(dimension);
|
let mut bitMatrix = BitMatrix::with_single_dimension(dimension);
|
||||||
|
|
||||||
// Top left finder pattern + separator + format
|
// Top left finder pattern + separator + format
|
||||||
bitMatrix.setRegion(0, 0, 9, 9);
|
bitMatrix.setRegion(0, 0, 9, 9);
|
||||||
@@ -192,7 +196,7 @@ impl Version {
|
|||||||
/**
|
/**
|
||||||
* See ISO 18004:2006 6.5.1 Table 9
|
* See ISO 18004:2006 6.5.1 Table 9
|
||||||
*/
|
*/
|
||||||
pub const fn buildVersions() -> Vec<Version> {
|
pub fn buildVersions() -> Vec<Version> {
|
||||||
Vec::from([
|
Vec::from([
|
||||||
Version::new(
|
Version::new(
|
||||||
1,
|
1,
|
||||||
@@ -942,8 +946,8 @@ impl ECBlocks {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn getNumBlocks(&self) -> u32 {
|
pub fn getNumBlocks(&self) -> u32 {
|
||||||
let total = 0;
|
let mut total = 0;
|
||||||
for ecBlock in self.ecBlocks {
|
for ecBlock in &self.ecBlocks {
|
||||||
// for (ECB ecBlock : ecBlocks) {
|
// for (ECB ecBlock : ecBlocks) {
|
||||||
total += ecBlock.getCount();
|
total += ecBlock.getCount();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,99 +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.qrcode.encoder;
|
|
||||||
|
|
||||||
import java.util.Arrays;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* JAVAPORT: The original code was a 2D array of ints, but since it only ever gets assigned
|
|
||||||
* -1, 0, and 1, I'm going to use less memory and go with bytes.
|
|
||||||
*
|
|
||||||
* @author dswitkin@google.com (Daniel Switkin)
|
|
||||||
*/
|
|
||||||
public final class ByteMatrix {
|
|
||||||
|
|
||||||
private final byte[][] bytes;
|
|
||||||
private final int width;
|
|
||||||
private final int height;
|
|
||||||
|
|
||||||
public ByteMatrix(int width, int height) {
|
|
||||||
bytes = new byte[height][width];
|
|
||||||
this.width = width;
|
|
||||||
this.height = height;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getHeight() {
|
|
||||||
return height;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getWidth() {
|
|
||||||
return width;
|
|
||||||
}
|
|
||||||
|
|
||||||
public byte get(int x, int y) {
|
|
||||||
return bytes[y][x];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return an internal representation as bytes, in row-major order. array[y][x] represents point (x,y)
|
|
||||||
*/
|
|
||||||
public byte[][] getArray() {
|
|
||||||
return bytes;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void set(int x, int y, byte value) {
|
|
||||||
bytes[y][x] = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void set(int x, int y, int value) {
|
|
||||||
bytes[y][x] = (byte) value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void set(int x, int y, boolean value) {
|
|
||||||
bytes[y][x] = (byte) (value ? 1 : 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void clear(byte value) {
|
|
||||||
for (byte[] aByte : bytes) {
|
|
||||||
Arrays.fill(aByte, value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
StringBuilder result = new StringBuilder(2 * width * height + 2);
|
|
||||||
for (int y = 0; y < height; ++y) {
|
|
||||||
byte[] bytesY = bytes[y];
|
|
||||||
for (int x = 0; x < width; ++x) {
|
|
||||||
switch (bytesY[x]) {
|
|
||||||
case 0:
|
|
||||||
result.append(" 0");
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
result.append(" 1");
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
result.append(" ");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
result.append('\n');
|
|
||||||
}
|
|
||||||
return result.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,128 +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.qrcode.encoder;
|
|
||||||
|
|
||||||
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
|
|
||||||
import com.google.zxing.qrcode.decoder.Mode;
|
|
||||||
import com.google.zxing.qrcode.decoder.Version;
|
|
||||||
import org.junit.Assert;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author satorux@google.com (Satoru Takabayashi) - creator
|
|
||||||
* @author mysen@google.com (Chris Mysen) - ported from C++
|
|
||||||
*/
|
|
||||||
public final class QRCodeTestCase extends Assert {
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void test() {
|
|
||||||
QRCode qrCode = new QRCode();
|
|
||||||
|
|
||||||
// First, test simple setters and getters.
|
|
||||||
// We use numbers of version 7-H.
|
|
||||||
qrCode.setMode(Mode.BYTE);
|
|
||||||
qrCode.setECLevel(ErrorCorrectionLevel.H);
|
|
||||||
qrCode.setVersion(Version.getVersionForNumber(7));
|
|
||||||
qrCode.setMaskPattern(3);
|
|
||||||
|
|
||||||
assertSame(Mode.BYTE, qrCode.getMode());
|
|
||||||
assertSame(ErrorCorrectionLevel.H, qrCode.getECLevel());
|
|
||||||
assertEquals(7, qrCode.getVersion().getVersionNumber());
|
|
||||||
assertEquals(3, qrCode.getMaskPattern());
|
|
||||||
|
|
||||||
// Prepare the matrix.
|
|
||||||
ByteMatrix matrix = new ByteMatrix(45, 45);
|
|
||||||
// Just set bogus zero/one values.
|
|
||||||
for (int y = 0; y < 45; ++y) {
|
|
||||||
for (int x = 0; x < 45; ++x) {
|
|
||||||
matrix.set(x, y, (y + x) % 2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set the matrix.
|
|
||||||
qrCode.setMatrix(matrix);
|
|
||||||
assertSame(matrix, qrCode.getMatrix());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testToString1() {
|
|
||||||
QRCode qrCode = new QRCode();
|
|
||||||
String expected =
|
|
||||||
"<<\n" +
|
|
||||||
" mode: null\n" +
|
|
||||||
" ecLevel: null\n" +
|
|
||||||
" version: null\n" +
|
|
||||||
" maskPattern: -1\n" +
|
|
||||||
" matrix: null\n" +
|
|
||||||
">>\n";
|
|
||||||
assertEquals(expected, qrCode.toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testToString2() {
|
|
||||||
QRCode qrCode = new QRCode();
|
|
||||||
qrCode.setMode(Mode.BYTE);
|
|
||||||
qrCode.setECLevel(ErrorCorrectionLevel.H);
|
|
||||||
qrCode.setVersion(Version.getVersionForNumber(1));
|
|
||||||
qrCode.setMaskPattern(3);
|
|
||||||
ByteMatrix matrix = new ByteMatrix(21, 21);
|
|
||||||
for (int y = 0; y < 21; ++y) {
|
|
||||||
for (int x = 0; x < 21; ++x) {
|
|
||||||
matrix.set(x, y, (y + x) % 2);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
qrCode.setMatrix(matrix);
|
|
||||||
String expected = "<<\n" +
|
|
||||||
" mode: BYTE\n" +
|
|
||||||
" ecLevel: H\n" +
|
|
||||||
" version: 1\n" +
|
|
||||||
" maskPattern: 3\n" +
|
|
||||||
" matrix:\n" +
|
|
||||||
" 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0\n" +
|
|
||||||
" 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1\n" +
|
|
||||||
" 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0\n" +
|
|
||||||
" 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1\n" +
|
|
||||||
" 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0\n" +
|
|
||||||
" 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1\n" +
|
|
||||||
" 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0\n" +
|
|
||||||
" 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1\n" +
|
|
||||||
" 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0\n" +
|
|
||||||
" 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1\n" +
|
|
||||||
" 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0\n" +
|
|
||||||
" 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1\n" +
|
|
||||||
" 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0\n" +
|
|
||||||
" 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1\n" +
|
|
||||||
" 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0\n" +
|
|
||||||
" 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1\n" +
|
|
||||||
" 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0\n" +
|
|
||||||
" 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1\n" +
|
|
||||||
" 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0\n" +
|
|
||||||
" 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1\n" +
|
|
||||||
" 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0\n" +
|
|
||||||
">>\n";
|
|
||||||
assertEquals(expected, qrCode.toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testIsValidMaskPattern() {
|
|
||||||
assertFalse(QRCode.isValidMaskPattern(-1));
|
|
||||||
assertTrue(QRCode.isValidMaskPattern(0));
|
|
||||||
assertTrue(QRCode.isValidMaskPattern(7));
|
|
||||||
assertFalse(QRCode.isValidMaskPattern(8));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
128
src/qrcode/encoder/QRCodeTestCase.rs
Normal file
128
src/qrcode/encoder/QRCodeTestCase.rs
Normal file
@@ -0,0 +1,128 @@
|
|||||||
|
/*
|
||||||
|
* 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::qrcode::{decoder::{Mode, ErrorCorrectionLevel, Version}, encoder::ByteMatrix};
|
||||||
|
|
||||||
|
use super::QRCode;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author satorux@google.com (Satoru Takabayashi) - creator
|
||||||
|
* @author mysen@google.com (Chris Mysen) - ported from C++
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test() {
|
||||||
|
let mut qrCode = QRCode::new();
|
||||||
|
|
||||||
|
// First, test simple setters and getters.
|
||||||
|
// We use numbers of version 7-H.
|
||||||
|
qrCode.setMode(Mode::BYTE);
|
||||||
|
qrCode.setECLevel(ErrorCorrectionLevel::H);
|
||||||
|
qrCode.setVersion(Version::getVersionForNumber(7).expect("must exist"));
|
||||||
|
qrCode.setMaskPattern(3);
|
||||||
|
|
||||||
|
assert_eq!(&Mode::BYTE, qrCode.getMode().as_ref().unwrap());
|
||||||
|
assert_eq!(ErrorCorrectionLevel::H, qrCode.getECLevel().unwrap());
|
||||||
|
assert_eq!(7, qrCode.getVersion().as_ref().unwrap().getVersionNumber());
|
||||||
|
assert_eq!(3, qrCode.getMaskPattern());
|
||||||
|
|
||||||
|
// Prepare the matrix.
|
||||||
|
let mut matrix = ByteMatrix::new(45, 45);
|
||||||
|
// Just set bogus zero/one values.
|
||||||
|
for y in 0..45 {
|
||||||
|
// for (int y = 0; y < 45; ++y) {
|
||||||
|
for x in 0..45 {
|
||||||
|
// for (int x = 0; x < 45; ++x) {
|
||||||
|
matrix.set(x, y, ((y + x) % 2) as u8);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the matrix.
|
||||||
|
qrCode.setMatrix(matrix.clone());
|
||||||
|
assert_eq!(&matrix, qrCode.getMatrix().as_ref().unwrap());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn testToString1() {
|
||||||
|
let qrCode = QRCode::new();
|
||||||
|
let expected =
|
||||||
|
"<<\n\
|
||||||
|
mode: null\n\
|
||||||
|
ecLevel: null\n\
|
||||||
|
version: null\n\
|
||||||
|
maskPattern: -1\n\
|
||||||
|
matrix: null\n\
|
||||||
|
>>\n";
|
||||||
|
assert_eq!(expected, qrCode.to_string());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn testToString2() {
|
||||||
|
let mut qrCode = QRCode::new();
|
||||||
|
qrCode.setMode(Mode::BYTE);
|
||||||
|
qrCode.setECLevel(ErrorCorrectionLevel::H);
|
||||||
|
qrCode.setVersion(Version::getVersionForNumber(1).expect("predefined value must exist"));
|
||||||
|
qrCode.setMaskPattern(3);
|
||||||
|
let mut matrix = ByteMatrix::new(21, 21);
|
||||||
|
for y in 0..21 {
|
||||||
|
// for (int y = 0; y < 21; ++y) {
|
||||||
|
for x in 0..21 {
|
||||||
|
// for (int x = 0; x < 21; ++x) {
|
||||||
|
matrix.set(x, y, ((y + x) % 2) as u8);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
qrCode.setMatrix(matrix);
|
||||||
|
let expected = "<<\n\
|
||||||
|
mode: BYTE\n\
|
||||||
|
ecLevel: H\n\
|
||||||
|
version: 1\n\
|
||||||
|
maskPattern: 3\n\
|
||||||
|
matrix:\n\
|
||||||
|
0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0\n\
|
||||||
|
1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1\n\
|
||||||
|
0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0\n\
|
||||||
|
1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1\n\
|
||||||
|
0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0\n\
|
||||||
|
1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1\n\
|
||||||
|
0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0\n\
|
||||||
|
1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1\n\
|
||||||
|
0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0\n\
|
||||||
|
1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1\n\
|
||||||
|
0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0\n\
|
||||||
|
1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1\n\
|
||||||
|
0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0\n\
|
||||||
|
1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1\n\
|
||||||
|
0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0\n\
|
||||||
|
1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1\n\
|
||||||
|
0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0\n\
|
||||||
|
1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1\n\
|
||||||
|
0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0\n\
|
||||||
|
1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1\n\
|
||||||
|
0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0\n\
|
||||||
|
>>\n";
|
||||||
|
assert_eq!(expected, qrCode.to_string());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn testIsValidMaskPattern() {
|
||||||
|
assert!(!QRCode::isValidMaskPattern(-1));
|
||||||
|
assert!(QRCode::isValidMaskPattern(0));
|
||||||
|
assert!(QRCode::isValidMaskPattern(7));
|
||||||
|
assert!(!QRCode::isValidMaskPattern(8));
|
||||||
|
}
|
||||||
|
|
||||||
112
src/qrcode/encoder/byte_matrix.rs
Normal file
112
src/qrcode/encoder/byte_matrix.rs
Normal file
@@ -0,0 +1,112 @@
|
|||||||
|
/*
|
||||||
|
* 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 std::fmt;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* JAVAPORT: The original code was a 2D array of ints, but since it only ever gets assigned
|
||||||
|
* -1, 0, and 1, I'm going to use less memory and go with bytes.
|
||||||
|
*
|
||||||
|
* @author dswitkin@google.com (Daniel Switkin)
|
||||||
|
*/
|
||||||
|
#[derive(Debug, PartialEq, Eq, Clone)]
|
||||||
|
pub struct ByteMatrix {
|
||||||
|
bytes: Vec<Vec<u8>>,
|
||||||
|
width: u32,
|
||||||
|
height: u32,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ByteMatrix {
|
||||||
|
pub fn new(width: u32, height: u32) -> Self {
|
||||||
|
Self {
|
||||||
|
bytes: vec![vec![0u8; width as usize]; height as usize],
|
||||||
|
width,
|
||||||
|
height,
|
||||||
|
}
|
||||||
|
// bytes = new byte[height][width];
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn getHeight(&self) -> u32 {
|
||||||
|
self.height
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn getWidth(&self) -> u32 {
|
||||||
|
self.width
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get(&self, x: u32, y: u32) -> u8 {
|
||||||
|
self.bytes[y as usize][x as usize]
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return an internal representation as bytes, in row-major order. array[y][x] represents point (x,y)
|
||||||
|
*/
|
||||||
|
pub fn getArray(&self) -> &Vec<Vec<u8>> {
|
||||||
|
&self.bytes
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn set(&mut self, x: u32, y: u32, value: u8) {
|
||||||
|
self.bytes[y as usize][x as usize] = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
// pub fn set(int x, int y, int value) {
|
||||||
|
// bytes[y][x] = (byte) value;
|
||||||
|
// }
|
||||||
|
|
||||||
|
pub fn set_bool(&mut self, x: u32, y: u32, value: bool) {
|
||||||
|
self.bytes[y as usize][x as usize] = if value { 1 } else { 0 };
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn clear(&mut self, value: u8) {
|
||||||
|
for row in self.bytes.iter_mut() {
|
||||||
|
*row = vec![value; row.len()];
|
||||||
|
}
|
||||||
|
// for (byte[] aByte : bytes) {
|
||||||
|
// Arrays.fill(aByte, value);
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl fmt::Display for ByteMatrix {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
|
let mut result = String::with_capacity(2 * self.width as usize * self.height as usize + 2);
|
||||||
|
for y in 0..self.height as usize {
|
||||||
|
// for (int y = 0; y < height; ++y) {
|
||||||
|
let bytesY = &self.bytes[y];
|
||||||
|
for x in 0..self.width as usize {
|
||||||
|
// for (int x = 0; x < width; ++x) {
|
||||||
|
match bytesY[x] {
|
||||||
|
0 => result.push_str(" 0"),
|
||||||
|
1 => result.push_str(" 1"),
|
||||||
|
_ => result.push_str(" "),
|
||||||
|
};
|
||||||
|
// switch (bytesY[x]) {
|
||||||
|
// case 0:
|
||||||
|
// result.append(" 0");
|
||||||
|
// break;
|
||||||
|
// case 1:
|
||||||
|
// result.append(" 1");
|
||||||
|
// break;
|
||||||
|
// default:
|
||||||
|
// result.append(" ");
|
||||||
|
// break;
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
result.push('\n');
|
||||||
|
}
|
||||||
|
write!(f, "{}", result)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,3 +1,8 @@
|
|||||||
mod qr_code;
|
mod qr_code;
|
||||||
|
mod byte_matrix;
|
||||||
|
|
||||||
pub use qr_code::*;
|
pub use qr_code::*;
|
||||||
|
pub use byte_matrix::*;
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod QRCodeTestCase;
|
||||||
@@ -14,9 +14,13 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
use std::fmt;
|
||||||
|
|
||||||
use crate::qrcode::decoder::{Mode, ErrorCorrectionLevel, Version};
|
use crate::qrcode::decoder::{Mode, ErrorCorrectionLevel, Version};
|
||||||
|
|
||||||
const NUM_MASK_PATTERNS : u32 = 8;
|
use super::ByteMatrix;
|
||||||
|
|
||||||
|
const NUM_MASK_PATTERNS : i32 = 8;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author satorux@google.com (Satoru Takabayashi) - creator
|
* @author satorux@google.com (Satoru Takabayashi) - creator
|
||||||
@@ -26,87 +30,97 @@ pub struct QRCode {
|
|||||||
|
|
||||||
// public static final int NUM_MASK_PATTERNS = 8;
|
// public static final int NUM_MASK_PATTERNS = 8;
|
||||||
|
|
||||||
mode:Mode,
|
mode:Option<Mode>,
|
||||||
ecLevel:ErrorCorrectionLevel,
|
ecLevel:Option<ErrorCorrectionLevel>,
|
||||||
version:Version,
|
version:Option<&'static Version>,
|
||||||
maskPattern:i32,
|
maskPattern:i32,
|
||||||
matrix:ByteMatrix,
|
matrix:Option<ByteMatrix>,
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl QRCode {
|
impl QRCode {
|
||||||
pub fn new()->Self {
|
pub fn new()->Self {
|
||||||
maskPattern = -1;
|
Self {
|
||||||
|
mode: None,
|
||||||
|
ecLevel: None,
|
||||||
|
version: None,
|
||||||
|
maskPattern: -1,
|
||||||
|
matrix: None,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return the mode. Not relevant if {@link com.google.zxing.EncodeHintType#QR_COMPACT} is selected.
|
* @return the mode. Not relevant if {@link com.google.zxing.EncodeHintType#QR_COMPACT} is selected.
|
||||||
*/
|
*/
|
||||||
public Mode getMode() {
|
pub fn getMode(&self) -> &Option<Mode>{
|
||||||
return mode;
|
&self.mode
|
||||||
}
|
}
|
||||||
|
|
||||||
public ErrorCorrectionLevel getECLevel() {
|
pub fn getECLevel(&self) -> &Option<ErrorCorrectionLevel>{
|
||||||
return ecLevel;
|
&self.ecLevel
|
||||||
}
|
}
|
||||||
|
|
||||||
public Version getVersion() {
|
pub fn getVersion(&self) -> &Option<&'static Version>{
|
||||||
return version;
|
&self.version
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getMaskPattern() {
|
pub fn getMaskPattern(&self) -> i32{
|
||||||
return maskPattern;
|
self.maskPattern
|
||||||
}
|
}
|
||||||
|
|
||||||
public ByteMatrix getMatrix() {
|
pub fn getMatrix(&self) ->&Option<ByteMatrix>{
|
||||||
return matrix;
|
&self.matrix
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
StringBuilder result = new StringBuilder(200);
|
pub fn setMode(&mut self, value:Mode) {
|
||||||
result.append("<<\n");
|
self.mode = Some(value);
|
||||||
result.append(" mode: ");
|
|
||||||
result.append(mode);
|
|
||||||
result.append("\n ecLevel: ");
|
|
||||||
result.append(ecLevel);
|
|
||||||
result.append("\n version: ");
|
|
||||||
result.append(version);
|
|
||||||
result.append("\n maskPattern: ");
|
|
||||||
result.append(maskPattern);
|
|
||||||
if (matrix == null) {
|
|
||||||
result.append("\n matrix: null\n");
|
|
||||||
} else {
|
|
||||||
result.append("\n matrix:\n");
|
|
||||||
result.append(matrix);
|
|
||||||
}
|
|
||||||
result.append(">>\n");
|
|
||||||
return result.toString();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setMode(Mode value) {
|
pub fn setECLevel(&mut self, value:ErrorCorrectionLevel) {
|
||||||
mode = value;
|
self.ecLevel = Some(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setECLevel(ErrorCorrectionLevel value) {
|
pub fn setVersion(&mut self, version:&'static Version) {
|
||||||
ecLevel = value;
|
self.version = Some(version);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setVersion(Version version) {
|
pub fn setMaskPattern(&mut self, value:i32) {
|
||||||
this.version = version;
|
self.maskPattern = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setMaskPattern(int value) {
|
pub fn setMatrix(&mut self, value:ByteMatrix) {
|
||||||
maskPattern = value;
|
self.matrix = Some(value);
|
||||||
}
|
|
||||||
|
|
||||||
public void setMatrix(ByteMatrix value) {
|
|
||||||
matrix = value;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check if "mask_pattern" is valid.
|
// Check if "mask_pattern" is valid.
|
||||||
public static boolean isValidMaskPattern(int maskPattern) {
|
pub fn isValidMaskPattern( maskPattern:i32) -> bool{
|
||||||
return maskPattern >= 0 && maskPattern < NUM_MASK_PATTERNS;
|
maskPattern >= 0 && maskPattern < NUM_MASK_PATTERNS
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl fmt::Display for QRCode {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
|
let mut result = String::with_capacity(200);
|
||||||
|
result.push_str("<<\n");
|
||||||
|
result.push_str(" mode: ");
|
||||||
|
result.push_str(&format!("{:?}", self.mode));
|
||||||
|
result.push_str("\n ecLevel: ");
|
||||||
|
result.push_str(&format!("{:?}", self.ecLevel));
|
||||||
|
result.push_str("\n version: ");
|
||||||
|
result.push_str(&format!("{}",self.version.as_ref().unwrap()));
|
||||||
|
result.push_str("\n maskPattern: ");
|
||||||
|
result.push_str(&format!("{}",self.maskPattern));
|
||||||
|
if self.matrix.is_none() {
|
||||||
|
result.push_str("\n matrix: null\n");
|
||||||
|
} else {
|
||||||
|
result.push_str("\n matrix:\n");
|
||||||
|
result.push_str(&format!("{}",self.matrix.as_ref().unwrap()));
|
||||||
|
}
|
||||||
|
result.push_str(">>\n");
|
||||||
|
|
||||||
|
write!(f, "{}", result)
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user