1#![allow(clippy::many_single_char_names)]
2
3use num_traits::{FromPrimitive, ToPrimitive};
4use std::convert::TryFrom;
5
6use crate::DecodeError;
7use crate::quirc::*;
8use crate::version_db::*;
9
10#[derive(Copy, Clone)]
11struct Datastream {
12 raw: [u8; 8896],
13 data_bits: i32,
14 ptr: i32,
15 data: [u8; 8896],
16}
17
18#[derive(Copy, Clone)]
20struct GaloisField {
21 p: i32,
22 log: &'static [u8],
23 exp: &'static [u8],
24}
25
26static GF16_EXP: [u8; 16] = [0x1, 0x2, 0x4, 0x8, 0x3, 0x6, 0xc, 0xb, 0x5, 0xa, 0x7, 0xe, 0xf, 0xd, 0x9, 0x1];
27static GF16_LOG: [u8; 16] = [0, 0xf, 0x1, 0x4, 0x2, 0x8, 0x5, 0xa, 0x3, 0xe, 0x9, 0x7, 0x6, 0xd, 0xb, 0xc];
28
29static GF16: GaloisField = GaloisField { p: 15, log: &GF16_LOG, exp: &GF16_EXP };
30
31static GF256_EXP: [u8; 256] = [
32 0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80, 0x1d, 0x3a, 0x74, 0xe8, 0xcd, 0x87, 0x13, 0x26, 0x4c, 0x98, 0x2d, 0x5a, 0xb4, 0x75, 0xea, 0xc9, 0x8f, 0x3, 0x6,
33 0xc, 0x18, 0x30, 0x60, 0xc0, 0x9d, 0x27, 0x4e, 0x9c, 0x25, 0x4a, 0x94, 0x35, 0x6a, 0xd4, 0xb5, 0x77, 0xee, 0xc1, 0x9f, 0x23, 0x46, 0x8c, 0x5, 0xa, 0x14,
34 0x28, 0x50, 0xa0, 0x5d, 0xba, 0x69, 0xd2, 0xb9, 0x6f, 0xde, 0xa1, 0x5f, 0xbe, 0x61, 0xc2, 0x99, 0x2f, 0x5e, 0xbc, 0x65, 0xca, 0x89, 0xf, 0x1e, 0x3c, 0x78,
35 0xf0, 0xfd, 0xe7, 0xd3, 0xbb, 0x6b, 0xd6, 0xb1, 0x7f, 0xfe, 0xe1, 0xdf, 0xa3, 0x5b, 0xb6, 0x71, 0xe2, 0xd9, 0xaf, 0x43, 0x86, 0x11, 0x22, 0x44, 0x88, 0xd,
36 0x1a, 0x34, 0x68, 0xd0, 0xbd, 0x67, 0xce, 0x81, 0x1f, 0x3e, 0x7c, 0xf8, 0xed, 0xc7, 0x93, 0x3b, 0x76, 0xec, 0xc5, 0x97, 0x33, 0x66, 0xcc, 0x85, 0x17, 0x2e,
37 0x5c, 0xb8, 0x6d, 0xda, 0xa9, 0x4f, 0x9e, 0x21, 0x42, 0x84, 0x15, 0x2a, 0x54, 0xa8, 0x4d, 0x9a, 0x29, 0x52, 0xa4, 0x55, 0xaa, 0x49, 0x92, 0x39, 0x72, 0xe4,
38 0xd5, 0xb7, 0x73, 0xe6, 0xd1, 0xbf, 0x63, 0xc6, 0x91, 0x3f, 0x7e, 0xfc, 0xe5, 0xd7, 0xb3, 0x7b, 0xf6, 0xf1, 0xff, 0xe3, 0xdb, 0xab, 0x4b, 0x96, 0x31, 0x62,
39 0xc4, 0x95, 0x37, 0x6e, 0xdc, 0xa5, 0x57, 0xae, 0x41, 0x82, 0x19, 0x32, 0x64, 0xc8, 0x8d, 0x7, 0xe, 0x1c, 0x38, 0x70, 0xe0, 0xdd, 0xa7, 0x53, 0xa6, 0x51,
40 0xa2, 0x59, 0xb2, 0x79, 0xf2, 0xf9, 0xef, 0xc3, 0x9b, 0x2b, 0x56, 0xac, 0x45, 0x8a, 0x9, 0x12, 0x24, 0x48, 0x90, 0x3d, 0x7a, 0xf4, 0xf5, 0xf7, 0xf3, 0xfb,
41 0xeb, 0xcb, 0x8b, 0xb, 0x16, 0x2c, 0x58, 0xb0, 0x7d, 0xfa, 0xe9, 0xcf, 0x83, 0x1b, 0x36, 0x6c, 0xd8, 0xad, 0x47, 0x8e, 0x1,
42];
43static GF256_LOG: [u8; 256] = [
44 0, 0xff, 0x1, 0x19, 0x2, 0x32, 0x1a, 0xc6, 0x3, 0xdf, 0x33, 0xee, 0x1b, 0x68, 0xc7, 0x4b, 0x4, 0x64, 0xe0, 0xe, 0x34, 0x8d, 0xef, 0x81, 0x1c, 0xc1, 0x69,
45 0xf8, 0xc8, 0x8, 0x4c, 0x71, 0x5, 0x8a, 0x65, 0x2f, 0xe1, 0x24, 0xf, 0x21, 0x35, 0x93, 0x8e, 0xda, 0xf0, 0x12, 0x82, 0x45, 0x1d, 0xb5, 0xc2, 0x7d, 0x6a,
46 0x27, 0xf9, 0xb9, 0xc9, 0x9a, 0x9, 0x78, 0x4d, 0xe4, 0x72, 0xa6, 0x6, 0xbf, 0x8b, 0x62, 0x66, 0xdd, 0x30, 0xfd, 0xe2, 0x98, 0x25, 0xb3, 0x10, 0x91, 0x22,
47 0x88, 0x36, 0xd0, 0x94, 0xce, 0x8f, 0x96, 0xdb, 0xbd, 0xf1, 0xd2, 0x13, 0x5c, 0x83, 0x38, 0x46, 0x40, 0x1e, 0x42, 0xb6, 0xa3, 0xc3, 0x48, 0x7e, 0x6e, 0x6b,
48 0x3a, 0x28, 0x54, 0xfa, 0x85, 0xba, 0x3d, 0xca, 0x5e, 0x9b, 0x9f, 0xa, 0x15, 0x79, 0x2b, 0x4e, 0xd4, 0xe5, 0xac, 0x73, 0xf3, 0xa7, 0x57, 0x7, 0x70, 0xc0,
49 0xf7, 0x8c, 0x80, 0x63, 0xd, 0x67, 0x4a, 0xde, 0xed, 0x31, 0xc5, 0xfe, 0x18, 0xe3, 0xa5, 0x99, 0x77, 0x26, 0xb8, 0xb4, 0x7c, 0x11, 0x44, 0x92, 0xd9, 0x23,
50 0x20, 0x89, 0x2e, 0x37, 0x3f, 0xd1, 0x5b, 0x95, 0xbc, 0xcf, 0xcd, 0x90, 0x87, 0x97, 0xb2, 0xdc, 0xfc, 0xbe, 0x61, 0xf2, 0x56, 0xd3, 0xab, 0x14, 0x2a, 0x5d,
51 0x9e, 0x84, 0x3c, 0x39, 0x53, 0x47, 0x6d, 0x41, 0xa2, 0x1f, 0x2d, 0x43, 0xd8, 0xb7, 0x7b, 0xa4, 0x76, 0xc4, 0x17, 0x49, 0xec, 0x7f, 0xc, 0x6f, 0xf6, 0x6c,
52 0xa1, 0x3b, 0x52, 0x29, 0x9d, 0x55, 0xaa, 0xfb, 0x60, 0x86, 0xb1, 0xbb, 0xcc, 0x3e, 0x5a, 0xcb, 0x59, 0x5f, 0xb0, 0x9c, 0xa9, 0xa0, 0x51, 0xb, 0xf5, 0x16,
53 0xeb, 0x7a, 0x75, 0x2c, 0xd7, 0x4f, 0xae, 0xd5, 0xe9, 0xe6, 0xe7, 0xad, 0xe8, 0x74, 0xd6, 0xf4, 0xea, 0xa8, 0x50, 0x58, 0xaf,
54];
55
56static GF256: GaloisField = GaloisField { p: 255, log: &GF256_LOG, exp: &GF256_EXP };
57
58fn poly_add(dst: &mut [u8], src: &[u8], c: u8, shift: i32, gf: &GaloisField) {
60 if c == 0 {
61 return;
62 }
63
64 let log_c = gf.log[c as usize] as i32;
65 for (i, v) in src.iter().enumerate() {
66 let p = i + shift as usize;
67
68 if p >= 64 {
69 continue;
70 }
71 if *v == 0 {
72 continue;
73 }
74
75 dst[p] ^= (gf.exp[((gf.log[*v as usize] as i32 + log_c) % gf.p) as usize] as i32) as u8;
76 }
77}
78
79fn poly_eval(s: &[u8], x: u8, gf: &GaloisField) -> u8 {
80 if x == 0 {
81 return s[0];
82 }
83
84 let mut sum = 0;
85 let log_x = gf.log[x as usize];
86
87 for i in 0..64 {
88 let c = s[i as usize];
89 if c == 0 {
90 continue;
91 }
92 sum ^= gf.exp[((gf.log[c as usize] as i32 + log_x as i32 * i) % gf.p) as usize]
93 }
94
95 sum
96}
97
98#[allow(non_snake_case)]
100fn berlekamp_massey(s: &[u8], n: usize, gf: &GaloisField, sigma: &mut [u8]) {
101 let mut C: [u8; 64] = [0; 64];
102 let mut B: [u8; 64] = [0; 64];
103 let mut L = 0;
104 let mut m = 1;
105 let mut b = 1;
106
107 B[0] = 1;
108 C[0] = 1;
109
110 for n in 0..n {
111 let mut d = s[n];
112 for i in 1..=L {
113 if C[i] as i32 != 0 && s[n - i] as i32 != 0 {
114 let a = gf.log[C[i] as usize] as usize;
115 let b = gf.log[s[n - i] as usize] as usize;
116 let index = (a + b) % gf.p as usize;
117
118 d ^= gf.exp[index];
119 }
120 }
121
122 let mult = gf.exp[((gf.p - gf.log[b as usize] as i32 + gf.log[d as usize] as i32) % gf.p) as usize];
123
124 if d == 0 {
125 m += 1
126 } else if L * 2 <= n {
127 let T = C;
128 poly_add(&mut C, &B, mult, m, gf);
129 B.copy_from_slice(&T);
130 L = n + 1 - L;
131 b = d;
132 m = 1
133 } else {
134 poly_add(&mut C, &B, mult, m, gf);
135 m += 1
136 }
137 }
138
139 sigma[..64].copy_from_slice(&C);
140}
141
142fn block_syndromes(data: &[u8], bs: i32, npar: usize, s: &mut [u8]) -> i32 {
145 for val in s.iter_mut().take(64) {
146 *val = 0;
147 }
148
149 let mut nonzero = 0;
150
151 for i in 0..npar {
152 for j in 0..bs {
153 let c = data[(bs - j - 1) as usize];
154 if c == 0 {
155 continue;
156 }
157 s[i] ^= GF256_EXP[((GF256_LOG[c as usize] as i32 + i as i32 * j) % 255) as usize];
158 }
159
160 if s[i] != 0 {
161 nonzero = 1;
162 }
163 }
164
165 nonzero
166}
167
168fn eloc_poly(omega: &mut [u8], s: &[u8], sigma: &[u8], npar: usize) {
169 for val in omega.iter_mut().take(64) {
170 *val = 0;
171 }
172
173 for i in 0..npar {
174 let a = sigma[i];
175 let log_a = GF256_LOG[a as usize];
176 if a == 0 {
177 continue;
178 }
179 for j in 0..64 - 1 {
180 let b = s[j + 1];
181 if i + j >= npar {
182 break;
183 }
184 if b == 0 {
185 continue;
186 }
187
188 omega[i + j] ^= GF256_EXP[((log_a as i32 + GF256_LOG[b as usize] as i32) % 255) as usize];
189 }
190 }
191}
192
193fn correct_block(data: &mut [u8], ecc: &RsParams) -> Result<(), DecodeError> {
194 let npar = ecc.bs as usize - ecc.dw as usize;
195 let mut s: [u8; 64] = [0; 64];
196 let mut sigma: [u8; 64] = [0; 64];
197 let mut sigma_deriv: [u8; 64] = [0; 64];
198 let mut omega: [u8; 64] = [0; 64];
199 if block_syndromes(data, ecc.bs, npar, &mut s) == 0 {
201 return Ok(());
202 }
203 berlekamp_massey(&s, npar, &GF256, &mut sigma);
204 let mut i = 0;
206 while i + 1 < 64 {
207 sigma_deriv[i as usize] = sigma[(i + 1) as usize];
208 i += 2
209 }
210 eloc_poly(&mut omega, &s, &sigma, npar - 1);
212
213 i = 0;
215 while i < ecc.bs {
216 let xinv = GF256_EXP[(255 - i) as usize];
217 if poly_eval(&sigma, xinv, &GF256) == 0 {
218 let sd_x = poly_eval(&sigma_deriv, xinv, &GF256);
219 let omega_x = poly_eval(&omega, xinv, &GF256);
220 let error = GF256_EXP[((255 - GF256_LOG[sd_x as usize] as i32 + GF256_LOG[omega_x as usize] as i32) % 255) as usize];
221
222 let index = (ecc.bs - i - 1) as usize;
223 data[index] ^= error;
224 }
225 i += 1
226 }
227 if block_syndromes(data, ecc.bs, npar, &mut s) != 0 {
228 return Err(DecodeError::DataEcc);
229 }
230 Ok(())
231}
232
233fn format_syndromes(u: u16, s: &mut [u8]) -> i32 {
234 let mut nonzero = 0;
235 for val in s.iter_mut().take(64) {
236 *val = 0;
237 }
238 let mut i = 0;
239 while i < 3 * 2 {
240 s[i] = 0;
241 for j in 0..15 {
242 if u as i32 & 1 << j != 0 {
243 s[i] ^= GF16_EXP[(i + 1) * j % 15];
244 }
245 }
246
247 if s[i] != 0 {
248 nonzero = 1;
249 }
250 i += 1
251 }
252
253 nonzero
254}
255
256fn correct_format(f_ret: &mut u16) -> Result<(), DecodeError> {
257 let mut u: u16 = *f_ret;
258 let mut s: [u8; 64] = [0; 64];
259 let mut sigma: [u8; 64] = [0; 64];
260
261 if format_syndromes(u, &mut s) == 0 {
263 return Ok(());
264 }
265 berlekamp_massey(&s, 3 * 2, &GF16, &mut sigma);
266
267 for i in 0..15 {
269 if poly_eval(&sigma, GF16_EXP[(15 - i) as usize], &GF16) == 0 {
270 u ^= (1 << i) as u16;
271 }
272 }
273
274 if format_syndromes(u, &mut s) != 0 {
275 return Err(DecodeError::FormatEcc);
276 }
277 *f_ret = u;
278
279 Ok(())
280}
281
282#[inline]
283fn grid_bit(code: &Code, x: i32, y: i32) -> i32 {
284 let p: i32 = y * code.size + x;
285 code.cell_bitmap[(p >> 3) as usize] as i32 >> (p & 7) & 1
286}
287
288fn read_format(code: &Code, data: &mut Data, which: i32) -> Result<(), DecodeError> {
289 let mut format = 0_u16;
290 if which != 0 {
291 for i in 0..7 {
292 format = ((format as i32) << 1 | grid_bit(code, 8, code.size - 1 - i)) as u16;
293 }
294 for i in 0..8 {
295 format = ((format as i32) << 1 | grid_bit(code, code.size - 8 + i, 8)) as u16;
296 }
297 } else {
298 static XS: [i32; 15] = [8, 8, 8, 8, 8, 8, 8, 8, 7, 5, 4, 3, 2, 1, 0];
299 static YS: [i32; 15] = [0, 1, 2, 3, 4, 5, 7, 8, 8, 8, 8, 8, 8, 8, 8];
300
301 for i in (0..=14).rev() {
302 format = ((format as i32) << 1 | grid_bit(code, XS[i as usize], YS[i as usize])) as u16;
303 }
304 }
305 format ^= 0x5412;
306
307 correct_format(&mut format)?;
308
309 let fdata = (format as i32 >> 10) as u16;
310 data.ecc_level = EccLevel::from_i32(fdata as i32 >> 3).unwrap();
311 data.mask = fdata as i32 & 7;
312
313 Ok(())
314}
315
316fn mask_bit(mask: i32, i: i32, j: i32) -> i32 {
317 match mask {
318 0 => ((i + j) % 2 == 0) as i32,
319 1 => (i % 2 == 0) as i32,
320 2 => (j % 3 == 0) as i32,
321 3 => ((i + j) % 3 == 0) as i32,
322 4 => ((i / 2 + j / 3) % 2 == 0) as i32,
323 5 => (i * j % 2 + i * j % 3 == 0) as i32,
324 6 => ((i * j % 2 + i * j % 3) % 2 == 0) as i32,
325 7 => ((i * j % 3 + (i + j) % 2) % 2 == 0) as i32,
326 _ => 0,
327 }
328}
329
330fn reserved_cell(version: usize, i: i32, j: i32) -> i32 {
331 let ver = &VERSION_DB[version];
332 let size = version as i32 * 4 + 17;
333 let mut ai: i32 = -1;
334 let mut aj: i32 = -1;
335 if i < 9 && j < 9 {
337 return 1;
338 }
339 if i + 8 >= size && j < 9 {
341 return 1;
342 }
343 if i < 9 && j + 8 >= size {
345 return 1;
346 }
347 if i == 6 || j == 6 {
349 return 1;
350 }
351 if version >= 7 {
354 if i < 6 && j + 11 >= size {
355 return 1;
356 }
357 if i + 11 >= size && j < 6 {
358 return 1;
359 }
360 }
361 let mut a = 0;
363 while a < 7 && ver.apat[a as usize] != 0 {
364 let p: i32 = ver.apat[a as usize];
365 if (p - i).abs() < 3 {
366 ai = a
367 }
368 if (p - j).abs() < 3 {
369 aj = a
370 }
371 a += 1
372 }
373 if ai >= 0 && aj >= 0 {
374 a -= 1;
375 if ai > 0 && ai < a {
376 return 1;
377 }
378 if aj > 0 && aj < a {
379 return 1;
380 }
381 if aj == a && ai == a {
382 return 1;
383 }
384 }
385
386 0
387}
388
389fn read_bit(code: &Code, data: &mut Data, ds: &mut Datastream, i: i32, j: i32) {
390 let bitpos: i32 = ds.data_bits & 7;
391 let bytepos: i32 = ds.data_bits >> 3;
392 let mut v: i32 = grid_bit(code, j, i);
393 if mask_bit(data.mask, i, j) != 0 {
394 v ^= 1
395 }
396 if v != 0 {
397 ds.raw[bytepos as usize] = (ds.raw[bytepos as usize] as i32 | 0x80 >> bitpos) as u8;
398 }
399 ds.data_bits += 1;
400}
401
402fn read_data(code: &Code, data: &mut Data, ds: &mut Datastream) {
403 let mut y: i32 = code.size - 1;
404 let mut x: i32 = code.size - 1;
405 let mut dir: i32 = -1;
406 while x > 0 {
407 if x == 6 {
408 x -= 1
409 }
410 if reserved_cell(data.version, y, x) == 0 {
411 read_bit(code, data, ds, y, x);
412 }
413 if reserved_cell(data.version, y, x - 1) == 0 {
414 read_bit(code, data, ds, y, x - 1);
415 }
416 y += dir;
417 if y < 0 || y >= code.size {
418 dir = -dir;
419 x -= 2;
420 y += dir
421 }
422 }
423}
424
425fn codestream_ecc(data: &mut Data, ds: &mut Datastream) -> Result<(), DecodeError> {
426 let ver = &VERSION_DB[data.version];
427 let sb_ecc = &ver.ecc[data.ecc_level as usize];
428
429 let lb_count = (ver.data_bytes - sb_ecc.bs * sb_ecc.ns) / (sb_ecc.bs + 1);
430 let bc = lb_count + sb_ecc.ns;
431 let ecc_offset = sb_ecc.dw * bc + lb_count;
432 let mut dst_offset = 0;
433
434 let mut lb_ecc = sb_ecc.clone();
435 lb_ecc.dw += 1;
436 lb_ecc.bs += 1;
437
438 for i in 0..bc {
439 let dst = &mut ds.data[dst_offset as usize..];
440 let ecc = if i < sb_ecc.ns { sb_ecc } else { &lb_ecc };
441 let num_ec = ecc.bs - ecc.dw;
442 for j in 0..ecc.dw {
443 dst[j as usize] = ds.raw[(j * bc + i) as usize];
444 }
445 for j in 0..num_ec {
446 dst[(ecc.dw + j) as usize] = ds.raw[(ecc_offset + j * bc + i) as usize];
447 }
448
449 correct_block(dst, ecc)?;
450 dst_offset += ecc.dw;
451 }
452
453 ds.data_bits = dst_offset * 8;
454 Ok(())
455}
456
457#[inline]
458fn bits_remaining(ds: &Datastream) -> i32 {
459 ds.data_bits - ds.ptr
460}
461
462fn take_bits(ds: &mut Datastream, mut len: i32) -> i32 {
463 let mut ret: i32 = 0;
464 while len != 0 && ds.ptr < ds.data_bits {
465 let b: u8 = ds.data[(ds.ptr >> 3) as usize];
466 let bitpos: i32 = ds.ptr & 7;
467 ret <<= 1;
468 if (b as i32) << bitpos & 0x80 != 0 {
469 ret |= 1
470 }
471 ds.ptr += 1;
472 len -= 1
473 }
474
475 ret
476}
477
478fn numeric_tuple(data: &mut Data, ds: &mut Datastream, bits: i32, digits: usize) -> i32 {
479 if bits_remaining(ds) < bits {
480 return -1;
481 }
482 let mut tuple = take_bits(ds, bits);
483 let len = data.payload.len();
484 data.payload.resize(len + digits, 0);
485
486 for val in data.payload[len..].iter_mut().rev() {
487 *val = (tuple % 10 + '0' as i32) as u8;
488 tuple /= 10;
489 }
490
491 0
492}
493
494fn decode_numeric(data: &mut Data, ds: &mut Datastream) -> Result<(), DecodeError> {
495 let mut bits: i32 = 14;
496 if data.version < 10 {
497 bits = 10;
498 } else if data.version < 27 {
499 bits = 12;
500 }
501 let mut count = take_bits(ds, bits);
502 if data.payload.len() + count as usize + 1 > 8896 {
503 return Err(DecodeError::DataOverflow);
504 }
505 while count >= 3 {
506 if numeric_tuple(data, ds, 10, 3) < 0 {
507 return Err(DecodeError::DataUnderflow);
508 }
509 count -= 3;
510 }
511 if count >= 2 {
512 if numeric_tuple(data, ds, 7, 2) < 0 {
513 return Err(DecodeError::DataUnderflow);
514 }
515 count -= 2;
516 }
517
518 if count != 0 && numeric_tuple(data, ds, 4, 1) < 0 {
519 return Err(DecodeError::DataUnderflow);
520 }
521
522 Ok(())
523}
524
525fn alpha_tuple(data: &mut Data, ds: &mut Datastream, bits: i32, digits: usize) -> i32 {
526 if bits_remaining(ds) < bits {
527 return -1;
528 }
529 let mut tuple = take_bits(ds, bits);
530 static ALPHA_MAP: &[u8] = b"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:";
531
532 let len = data.payload.len();
533 data.payload.resize(len + digits, 0);
534
535 for val in data.payload[len..].iter_mut().rev() {
536 *val = ALPHA_MAP[(tuple % 45) as usize];
537 tuple /= 45;
538 }
539
540 0
541}
542
543fn decode_alpha(data: &mut Data, ds: &mut Datastream) -> Result<(), DecodeError> {
544 let mut bits: i32 = 13;
545 if data.version < 10 {
546 bits = 9
547 } else if data.version < 27 {
548 bits = 11
549 }
550 let mut count = take_bits(ds, bits);
551 if data.payload.len() + count as usize + 1 > 8896 {
552 return Err(DecodeError::DataOverflow);
553 }
554 while count >= 2 {
555 if alpha_tuple(data, ds, 11, 2) < 0 {
556 return Err(DecodeError::DataUnderflow);
557 }
558 count -= 2
559 }
560 if count != 0 && alpha_tuple(data, ds, 6, 1) < 0 {
561 return Err(DecodeError::DataUnderflow);
562 }
563
564 Ok(())
565}
566
567fn decode_byte(data: &mut Data, ds: &mut Datastream) -> Result<(), DecodeError> {
568 let bits = if data.version < 10 { 8 } else { 16 };
569 let count = take_bits(ds, bits);
570 if data.payload.len() + count as usize + 1 > 8896 {
571 return Err(DecodeError::DataOverflow);
572 }
573 if bits_remaining(ds) < count * 8 {
574 return Err(DecodeError::DataUnderflow);
575 }
576
577 for _i in 0..count {
578 data.payload.push(take_bits(ds, 8) as u8);
579 }
580
581 Ok(())
582}
583
584fn decode_kanji(data: &mut Data, ds: &mut Datastream) -> Result<(), DecodeError> {
585 let mut bits = 12;
586 if data.version < 10 {
587 bits = 8;
588 } else if data.version < 27 {
589 bits = 10;
590 }
591
592 let count = take_bits(ds, bits);
593 if data.payload.len() + count as usize * 2 + 1 > 8896 {
594 return Err(DecodeError::DataOverflow);
595 }
596 if bits_remaining(ds) < count * 13 {
597 return Err(DecodeError::DataUnderflow);
598 }
599
600 for _i in 0..count {
601 let d = take_bits(ds, 13);
602 let msb = d / 0xc0;
603 let lsb = d % 0xc0;
604 let intermediate = msb << 8 | lsb;
605 let sjw = if intermediate + 0x8140 <= 0x9ffc {
606 (intermediate + 0x8140) as u16
608 } else {
609 (intermediate + 0xc140) as u16
611 };
612
613 data.payload.push((sjw as i32 >> 8) as u8);
614 data.payload.push((sjw as i32 & 0xff) as u8);
615 }
616
617 Ok(())
618}
619
620fn decode_eci(data: &mut Data, ds: &mut Datastream) -> Result<(), DecodeError> {
621 if bits_remaining(ds) < 8 {
622 return Err(DecodeError::DataUnderflow);
623 }
624 data.eci = Eci::from_u32(take_bits(ds, 8) as u32);
625 if data.eci.and_then(|e| e.to_u32()).unwrap_or_default() & 0xc0_u32 == 0x80_u32 {
626 if bits_remaining(ds) < 8 {
627 return Err(DecodeError::DataUnderflow);
628 }
629 data.eci = Eci::from_u32(data.eci.and_then(|e| e.to_u32()).unwrap_or_default() << 8 | take_bits(ds, 8) as u32);
630 } else if data.eci.and_then(|e| e.to_u32()).unwrap_or_default() & 0xe0_u32 == 0xc0_u32 {
631 if bits_remaining(ds) < 16 {
632 return Err(DecodeError::DataUnderflow);
633 }
634 data.eci = Eci::from_u32(data.eci.and_then(|e| e.to_u32()).unwrap_or_default() << 16 | take_bits(ds, 16) as u32);
635 }
636
637 Ok(())
638}
639
640fn decode_payload(data: &mut Data, ds: &mut Datastream) -> Result<(), DecodeError> {
641 while bits_remaining(ds) >= 4 {
642 let type_0 = DataType::from_i32(take_bits(ds, 4));
643 match type_0 {
644 Some(DataType::Numeric) => decode_numeric(data, ds)?,
645 Some(DataType::Alpha) => decode_alpha(data, ds)?,
646 Some(DataType::Byte) => decode_byte(data, ds)?,
647 Some(DataType::Kanji) => decode_kanji(data, ds)?,
648 Some(DataType::Eci) => decode_eci(data, ds)?,
649 _ => {
650 break;
651 }
652 }
653
654 let t = type_0.map(|t| t as i32).unwrap_or_default();
655 let d = data.data_type.map(|t| t as i32).unwrap_or_default();
656 if t & (t - 1) == 0 && t > d {
657 data.data_type = type_0;
658 }
659 }
660
661 Ok(())
662}
663
664impl Code {
665 pub fn decode(&self) -> Result<Data, DecodeError> {
667 let mut ds: Datastream = Datastream { raw: [0; 8896], data_bits: 0, ptr: 0, data: [0; 8896] };
668 if (self.size - 17) % 4 != 0 {
670 return Err(DecodeError::InvalidGridSize);
671 }
672
673 let mut data = Data { version: usize::try_from((self.size - 17) / 4).map_err(|_| DecodeError::InvalidVersion)?, ..Default::default() };
674
675 if data.version < VERSION_MIN || data.version > VERSION_MAX {
676 return Err(DecodeError::InvalidVersion);
677 }
678
679 let mut res = read_format(self, &mut data, 0);
681 if res.is_err() {
682 res = read_format(self, &mut data, 1);
683 }
684 res?;
685
686 read_data(self, &mut data, &mut ds);
687 codestream_ecc(&mut data, &mut ds)?;
688 decode_payload(&mut data, &mut ds)?;
689
690 Ok(data)
691 }
692}