Skip to content

Commit 71cb11c

Browse files
authored
Merge pull request #98 from rxing-core/fixes/97-binary-eci
fix: fix an issue with ECI encoding markers above 170 (Binary == 899)
2 parents 2240570 + 3654e29 commit 71cb11c

2 files changed

Lines changed: 34 additions & 3 deletions

File tree

‎src/common/eci.rs‎

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,37 @@ pub enum Eci {
4040
Binary = 899,
4141
}
4242

43+
const ECI_8: u64 = 0b0000_0000;
44+
const ECI_16: u64 = 0b1000_0000_0000_0000;
45+
const ECI_24: u64 = 0b1100_0000_0000_0000_0000_0000;
46+
4347
impl Eci {
4448
pub const fn can_encode(self) -> bool {
4549
(self as i32) >= 899
4650
}
4751

52+
pub const fn get_bitwidth(self) -> u8 {
53+
match self as u64 {
54+
0..=127 => 8,
55+
128..=16383 => 16,
56+
_ => 24,
57+
}
58+
}
59+
60+
pub const fn get_qreci_encode_bits(self) -> u64 {
61+
match self as u64 {
62+
0..=127 => ECI_8 | (self as u64),
63+
128..=16383 => ECI_16 | (self as u64),
64+
16384..=999999 => ECI_24 | (self as u64),
65+
_ => self as u64,
66+
// Self::Binary => {
67+
// let raw_bits = self as u64;
68+
// ECI_16 | raw_bits
69+
// },
70+
// _ => ECI_8 | (self as u64),
71+
}
72+
}
73+
4874
// pub fn try_from_i32(value: i32) -> Result<Self> {
4975
// let v = Self::from(value);
5076
// if v == Eci::Unknown {
@@ -100,7 +126,7 @@ impl From<i32> for Eci {
100126
34 => Eci::UTF32BE,
101127
35 => Eci::UTF32LE,
102128
170 => Eci::ASCII,
103-
898 => Eci::Binary,
129+
898 | 899 => Eci::Binary,
104130
_ => Eci::Unknown,
105131
}
106132
}

‎src/qrcode/encoder/qrcode_encoder.rs‎

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -717,6 +717,11 @@ pub fn appendKanjiBytes(content: &str, bits: &mut BitArray) -> Result<()> {
717717

718718
fn appendECI(eci: Eci, bits: &mut BitArray) -> Result<()> {
719719
bits.appendBits(Mode::ECI.getBits() as BitFieldBaseType, 4)?;
720-
// This is correct for values up to 127, which is all we need now.
721-
bits.appendBits(eci as BitFieldBaseType, 8)
720+
// This is correct for values up to 16383, the only ECI we have over 127 is Binary.
721+
// For values over 16383 (eci can reach 999999), we need to use the 3-byte encoding,
722+
// which is implemented but disabled.
723+
bits.appendBits(
724+
eci.get_qreci_encode_bits() as BitFieldBaseType,
725+
eci.get_bitwidth() as usize,
726+
)
722727
}

0 commit comments

Comments
 (0)