1use crate::qr_code_model::QRErrorCorrectLevel;
4
5pub struct QRRSBlock {
6 pub total_count: i32,
7 pub data_count: i32,
8}
9
10impl QRRSBlock {
11 pub fn new(total_count: i32, data_count: i32) -> Self {
12 QRRSBlock {
13 total_count,
14 data_count,
15 }
16 }
17}
18
19const RS_BLOCK_TABLE: &[[i32; 6]] = &[
21 [1, 26, 19, 0, 0, 0],
22 [1, 26, 16, 0, 0, 0],
23 [1, 26, 13, 0, 0, 0],
24 [1, 26, 9, 0, 0, 0],
25 [1, 44, 34, 0, 0, 0],
26 [1, 44, 28, 0, 0, 0],
27 [1, 44, 22, 0, 0, 0],
28 [1, 44, 16, 0, 0, 0],
29 [1, 70, 55, 0, 0, 0],
30 [1, 70, 44, 0, 0, 0],
31 [2, 35, 17, 0, 0, 0],
32 [2, 35, 13, 0, 0, 0],
33 [1, 100, 80, 0, 0, 0],
34 [2, 50, 32, 0, 0, 0],
35 [2, 50, 24, 0, 0, 0],
36 [4, 25, 9, 0, 0, 0],
37 [1, 134, 108, 0, 0, 0],
38 [2, 67, 43, 0, 0, 0],
39 [2, 33, 15, 2, 34, 16],
40 [2, 33, 11, 2, 34, 12],
41 [2, 86, 68, 0, 0, 0],
42 [4, 43, 27, 0, 0, 0],
43 [4, 43, 19, 0, 0, 0],
44 [4, 43, 15, 0, 0, 0],
45 [2, 98, 78, 0, 0, 0],
46 [4, 49, 31, 0, 0, 0],
47 [2, 32, 14, 4, 33, 15],
48 [4, 39, 13, 1, 40, 14],
49 [2, 121, 97, 0, 0, 0],
50 [2, 60, 38, 2, 61, 39],
51 [4, 40, 18, 2, 41, 19],
52 [4, 40, 14, 2, 41, 15],
53 [2, 146, 116, 0, 0, 0],
54 [3, 58, 36, 2, 59, 37],
55 [4, 36, 16, 4, 37, 17],
56 [4, 36, 12, 4, 37, 13],
57 [2, 86, 68, 2, 87, 69],
58 [4, 69, 43, 1, 70, 44],
59 [6, 43, 19, 2, 44, 20],
60 [6, 43, 15, 2, 44, 16],
61 [4, 101, 81, 0, 0, 0],
62 [1, 80, 50, 4, 81, 51],
63 [4, 50, 22, 4, 51, 23],
64 [3, 36, 12, 8, 37, 13],
65 [2, 116, 92, 2, 117, 93],
66 [6, 58, 36, 2, 59, 37],
67 [4, 46, 20, 6, 47, 21],
68 [7, 42, 14, 4, 43, 15],
69 [4, 133, 107, 0, 0, 0],
70 [8, 59, 37, 1, 60, 38],
71 [8, 44, 20, 4, 45, 21],
72 [12, 33, 11, 4, 34, 12],
73 [3, 145, 115, 1, 146, 116],
74 [4, 64, 40, 5, 65, 41],
75 [11, 36, 16, 5, 37, 17],
76 [11, 36, 12, 5, 37, 13],
77 [5, 109, 87, 1, 110, 88],
78 [5, 65, 41, 5, 66, 42],
79 [5, 54, 24, 7, 55, 25],
80 [11, 36, 12, 0, 0, 0],
81 [5, 122, 98, 1, 123, 99],
82 [7, 73, 45, 3, 74, 46],
83 [15, 43, 19, 2, 44, 20],
84 [3, 45, 15, 13, 46, 16],
85 [1, 135, 107, 5, 136, 108],
86 [10, 74, 46, 1, 75, 47],
87 [1, 50, 22, 15, 51, 23],
88 [2, 42, 14, 17, 43, 15],
89 [5, 150, 120, 1, 151, 121],
90 [9, 69, 43, 4, 70, 44],
91 [17, 50, 22, 1, 51, 23],
92 [2, 42, 14, 19, 43, 15],
93 [3, 141, 113, 4, 142, 114],
94 [3, 70, 44, 11, 71, 45],
95 [17, 47, 21, 4, 48, 22],
96 [9, 39, 13, 16, 40, 14],
97 [3, 135, 107, 5, 136, 108],
98 [3, 67, 41, 13, 68, 42],
99 [15, 54, 24, 5, 55, 25],
100 [15, 43, 15, 10, 44, 16],
101 [4, 144, 116, 4, 145, 117],
102 [17, 68, 42, 0, 0, 0],
103 [17, 50, 22, 6, 51, 23],
104 [19, 46, 16, 6, 47, 17],
105 [2, 139, 111, 7, 140, 112],
106 [17, 74, 46, 0, 0, 0],
107 [7, 54, 24, 16, 55, 25],
108 [34, 37, 13, 0, 0, 0],
109 [4, 151, 121, 5, 152, 122],
110 [4, 75, 47, 14, 76, 48],
111 [11, 54, 24, 14, 55, 25],
112 [16, 45, 15, 14, 46, 16],
113 [6, 147, 117, 4, 148, 118],
114 [6, 73, 45, 14, 74, 46],
115 [11, 54, 24, 16, 55, 25],
116 [30, 46, 16, 2, 47, 17],
117 [8, 132, 106, 4, 133, 107],
118 [8, 75, 47, 13, 76, 48],
119 [7, 54, 24, 22, 55, 25],
120 [22, 45, 15, 13, 46, 16],
121 [10, 142, 114, 2, 143, 115],
122 [19, 74, 46, 4, 75, 47],
123 [28, 50, 22, 6, 51, 23],
124 [33, 46, 16, 4, 47, 17],
125 [8, 152, 122, 4, 153, 123],
126 [22, 73, 45, 3, 74, 46],
127 [8, 53, 23, 26, 54, 24],
128 [12, 45, 15, 28, 46, 16],
129 [3, 147, 117, 10, 148, 118],
130 [3, 73, 45, 23, 74, 46],
131 [4, 54, 24, 31, 55, 25],
132 [11, 45, 15, 31, 46, 16],
133 [7, 146, 116, 7, 147, 117],
134 [21, 73, 45, 7, 74, 46],
135 [1, 53, 23, 37, 54, 24],
136 [19, 45, 15, 26, 46, 16],
137 [5, 145, 115, 10, 146, 116],
138 [19, 75, 47, 10, 76, 48],
139 [15, 54, 24, 25, 55, 25],
140 [23, 45, 15, 25, 46, 16],
141 [13, 145, 115, 3, 146, 116],
142 [2, 74, 46, 29, 75, 47],
143 [42, 54, 24, 1, 55, 25],
144 [23, 45, 15, 28, 46, 16],
145 [17, 145, 115, 0, 0, 0],
146 [10, 74, 46, 23, 75, 47],
147 [10, 54, 24, 35, 55, 25],
148 [19, 45, 15, 35, 46, 16],
149 [17, 145, 115, 1, 146, 116],
150 [14, 74, 46, 21, 75, 47],
151 [29, 54, 24, 19, 55, 25],
152 [11, 45, 15, 46, 46, 16],
153 [13, 145, 115, 6, 146, 116],
154 [14, 74, 46, 23, 75, 47],
155 [44, 54, 24, 7, 55, 25],
156 [59, 46, 16, 1, 47, 17],
157 [12, 151, 121, 7, 152, 122],
158 [12, 75, 47, 26, 76, 48],
159 [39, 54, 24, 14, 55, 25],
160 [22, 45, 15, 41, 46, 16],
161 [6, 151, 121, 14, 152, 122],
162 [6, 75, 47, 34, 76, 48],
163 [46, 54, 24, 10, 55, 25],
164 [2, 45, 15, 64, 46, 16],
165 [17, 152, 122, 4, 153, 123],
166 [29, 74, 46, 14, 75, 47],
167 [49, 54, 24, 10, 55, 25],
168 [24, 45, 15, 46, 46, 16],
169 [4, 152, 122, 18, 153, 123],
170 [13, 74, 46, 32, 75, 47],
171 [48, 54, 24, 14, 55, 25],
172 [42, 45, 15, 32, 46, 16],
173 [20, 147, 117, 4, 148, 118],
174 [40, 75, 47, 7, 76, 48],
175 [43, 54, 24, 22, 55, 25],
176 [10, 45, 15, 67, 46, 16],
177 [19, 148, 118, 6, 149, 119],
178 [18, 75, 47, 31, 76, 48],
179 [34, 54, 24, 34, 55, 25],
180 [20, 45, 15, 61, 46, 16],
181];
182
183pub fn get_rs_blocks(type_number: i32, error_correct_level: QRErrorCorrectLevel) -> Vec<QRRSBlock> {
184 let level_map = [1, 0, 3, 2];
185 let level_index = level_map[error_correct_level as usize];
186 let index = ((type_number - 1) * 4 + level_index) as usize;
187
188 let rs_block = RS_BLOCK_TABLE.get(index).unwrap_or(&RS_BLOCK_TABLE[0]);
189 let mut list = Vec::new();
190
191 let length = rs_block.len() / 3;
192 for i in 0..length {
193 let count = rs_block[i * 3];
194 let total_count = rs_block[i * 3 + 1];
195 let data_count = rs_block[i * 3 + 2];
196
197 for _ in 0..count {
198 list.push(QRRSBlock::new(total_count, data_count));
199 }
200 }
201
202 list
203}
204
205#[cfg(test)]
206mod tests {
207 use super::*;
208
209 #[test]
210 fn test_get_rs_blocks_v1() {
211 let blocks = get_rs_blocks(1, QRErrorCorrectLevel::H);
212 assert!(!blocks.is_empty());
213 }
214
215 #[test]
216 fn test_get_rs_blocks_all_levels() {
217 for level in [
218 QRErrorCorrectLevel::L,
219 QRErrorCorrectLevel::M,
220 QRErrorCorrectLevel::Q,
221 QRErrorCorrectLevel::H,
222 ] {
223 let blocks = get_rs_blocks(2, level);
224 assert!(
225 !blocks.is_empty(),
226 "Version 2 {:?} should have blocks",
227 level
228 );
229 }
230 }
231}