comparison mupdf-source/thirdparty/zint/backend/qr.h @ 2:b50eed0cc0ef upstream

ADD: MuPDF v1.26.7: the MuPDF source as downloaded by a default build of PyMuPDF 1.26.4. The directory name has changed: no version number in the expanded directory now.
author Franz Glasner <fzglas.hg@dom66.de>
date Mon, 15 Sep 2025 11:43:07 +0200
parents
children
comparison
equal deleted inserted replaced
1:1d09e1dec1d9 2:b50eed0cc0ef
1 /* qr.h Data for QR Code, Micro QR Code and rMQR */
2 /*
3 libzint - the open source barcode library
4 Copyright (C) 2008-2024 Robin Stuart <rstuart114@gmail.com>
5 Copyright (C) 2006 Kentaro Fukuchi <fukuchi@megaui.net>
6
7 Redistribution and use in source and binary forms, with or without
8 modification, are permitted provided that the following conditions
9 are met:
10
11 1. Redistributions of source code must retain the above copyright
12 notice, this list of conditions and the following disclaimer.
13 2. Redistributions in binary form must reproduce the above copyright
14 notice, this list of conditions and the following disclaimer in the
15 documentation and/or other materials provided with the distribution.
16 3. Neither the name of the project nor the names of its contributors
17 may be used to endorse or promote products derived from this software
18 without specific prior written permission.
19
20 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
21 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
24 FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26 OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27 HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29 OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 SUCH DAMAGE.
31 */
32 /* SPDX-License-Identifier: BSD-3-Clause */
33
34 #ifndef Z_QR_H
35 #define Z_QR_H
36
37 /* From ISO/IEC 18004:2015 Table 5 - Encoding/decoding table for Alphanumeric mode */
38 static const signed char qr_alphanumeric[59] = {
39 36, -1, -1, -1, 37, 38, -1, -1, -1, -1, 39, 40, -1, 41, 42, 43, /* SP-/ */
40 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 44, -1, -1, -1, -1, -1, /* 0-? */
41 -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, /* @-O */
42 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35 /* P-Z */
43 };
44
45 /* From ISO/IEC 18004:2015 Table 7 - Number of symbol characters and input data capacity for QR Code */
46 static const unsigned short qr_data_codewords[4][40] = { {
47 19, 34, 55, 80, 108, 136, 156, 194, 232, 274, /* L */
48 324, 370, 428, 461, 523, 589, 647, 721, 795, 861,
49 932, 1006, 1094, 1174, 1276, 1370, 1468, 1531, 1631, 1735,
50 1843, 1955, 2071, 2191, 2306, 2434, 2566, 2702, 2812, 2956
51 }, {
52 16, 28, 44, 64, 86, 108, 124, 154, 182, 216, /* M */
53 254, 290, 334, 365, 415, 453, 507, 563, 627, 669,
54 714, 782, 860, 914, 1000, 1062, 1128, 1193, 1267, 1373,
55 1455, 1541, 1631, 1725, 1812, 1914, 1992, 2102, 2216, 2334
56 }, {
57 13, 22, 34, 48, 62, 76, 88, 110, 132, 154, /* Q */
58 180, 206, 244, 261, 295, 325, 367, 397, 445, 485,
59 512, 568, 614, 664, 718, 754, 808, 871, 911, 985,
60 1033, 1115, 1171, 1231, 1286, 1354, 1426, 1502, 1582, 1666
61 }, {
62 9, 16, 26, 36, 46, 60, 66, 86, 100, 122, /* H */
63 140, 158, 180, 197, 223, 253, 283, 313, 341, 385,
64 406, 442, 464, 514, 538, 596, 628, 661, 701, 745,
65 793, 845, 901, 961, 986, 1054, 1096, 1142, 1222, 1276
66 }
67 };
68
69 /* From ISO/IEC 18004:2015 Table 1 - Codeword capacity of all versions of QRCode */
70 static const unsigned short qr_total_codewords[40] = {
71 26, 44, 70, 100, 134, 172, 196, 242, 292, 346,
72 404, 466, 532, 581, 655, 733, 815, 901, 991, 1085,
73 1156, 1258, 1364, 1474, 1588, 1706, 1828, 1921, 2051, 2185,
74 2323, 2465, 2611, 2761, 2876, 3034, 3196, 3362, 3532, 3706
75 };
76
77 /* From ISO/IEC 23941:2022 Table 1 - Codeword capacity of all versions of rMQR symbols */
78 static const unsigned char rmqr_height[32] = {
79 7, 7, 7, 7, 7,
80 9, 9, 9, 9, 9,
81 11, 11, 11, 11, 11, 11,
82 13, 13, 13, 13, 13, 13,
83 15, 15, 15, 15, 15,
84 17, 17, 17, 17, 17
85 };
86
87 static const unsigned char rmqr_width[32] = {
88 43, 59, 77, 99, 139,
89 43, 59, 77, 99, 139,
90 27, 43, 59, 77, 99, 139,
91 27, 43, 59, 77, 99, 139,
92 43, 59, 77, 99, 139,
93 43, 59, 77, 99, 139
94 };
95
96 /* From ISO/IEC 23941:2022 Table 6 - Number of data codewords and input data capacity for rMQR */
97 static const unsigned char rmqr_data_codewords[2][32] = { {
98 6, 12, 20, 28, 44, /* R7x */ /* M */
99 12, 21, 31, 42, 63, /* R9x */
100 7, 19, 31, 43, 57, 84, /* R11x */
101 12, 27, 38, 53, 73, 106, /* R13x */
102 33, 48, 67, 88, 127, /* R15x */
103 39, 56, 78, 100, 152 /* R17x */
104 }, {
105 3, 7, 10, 14, 24, /* R7x */ /* H */
106 7, 11, 17, 22, 33, /* R9x */
107 5, 11, 15, 23, 29, 42, /* R11x */
108 7, 13, 20, 29, 35, 54, /* R13x */
109 15, 26, 31, 48, 69, /* R15x */
110 21, 28, 38, 56, 76 /* R17x */
111 }
112 };
113
114 /* Highest index in `rmqr_total_codewords` for each given row (R7x, R9x etc) */
115 static const signed char rmqr_fixed_height_upper_bound[7] = {
116 -1, 4, 9, 15, 21, 26, 31
117 };
118
119 /* From ISO/IEC 23941:2022 Table 1 - Codeword capacity of all versions of rMQR symbols */
120 static const unsigned char rmqr_total_codewords[32] = {
121 13, 21, 32, 44, 68, /* R7x */
122 21, 33, 49, 66, 99, /* R9x */
123 15, 31, 47, 67, 89, 132, /* R11x */
124 21, 41, 60, 85, 113, 166, /* R13x */
125 51, 74, 103, 136, 199, /* R15x */
126 61, 88, 122, 160, 232 /* R17x */
127 };
128
129 /* From ISO/IEC 23941:2022 Table 3 - Number of bits of character count indicator */
130 static const unsigned char rmqr_numeric_cci[32] = {
131 4, 5, 6, 7, 7,
132 5, 6, 7, 7, 8,
133 4, 6, 7, 7, 8, 8,
134 5, 6, 7, 7, 8, 8,
135 7, 7, 8, 8, 9,
136 7, 8, 8, 8, 9
137 };
138
139 static const unsigned char rmqr_alphanum_cci[32] = {
140 3, 5, 5, 6, 6,
141 5, 5, 6, 6, 7,
142 4, 5, 6, 6, 7, 7,
143 5, 6, 6, 7, 7, 8,
144 6, 7, 7, 7, 8,
145 6, 7, 7, 8, 8
146 };
147
148 static const unsigned char rmqr_byte_cci[32] = {
149 3, 4, 5, 5, 6,
150 4, 5, 5, 6, 6,
151 3, 5, 5, 6, 6, 7,
152 4, 5, 6, 6, 7, 7,
153 6, 6, 7, 7, 7,
154 6, 6, 7, 7, 8
155 };
156
157 static const unsigned char rmqr_kanji_cci[32] = {
158 2, 3, 4, 5, 5,
159 3, 4, 5, 5, 6,
160 2, 4, 5, 5, 6, 6,
161 3, 5, 5, 6, 6, 7,
162 5, 5, 6, 6, 7,
163 5, 6, 6, 6, 7
164 };
165
166 /* From ISO/IEC 18004:2015 Table 9 - Error correction characteristics for QR Code */
167 static const char qr_blocks[4][40] = { {
168 1, 1, 1, 1, 1, 2, 2, 2, 2, 4, /* L */
169 4, 4, 4, 4, 6, 6, 6, 6, 7, 8,
170 8, 9, 9, 10, 12, 12, 12, 13, 14, 15,
171 16, 17, 18, 19, 19, 20, 21, 22, 24, 25
172 }, {
173 1, 1, 1, 2, 2, 4, 4, 4, 5, 5, /* M */
174 5, 8, 9, 9, 10, 10, 11, 13, 14, 16,
175 17, 17, 18, 20, 21, 23, 25, 26, 28, 29,
176 31, 33, 35, 37, 38, 40, 43, 45, 47, 49
177 }, {
178 1, 1, 2, 2, 4, 4, 6, 6, 8, 8, /* Q */
179 8, 10, 12, 16, 12, 17, 16, 18, 21, 20,
180 23, 23, 25, 27, 29, 34, 34, 35, 38, 40,
181 43, 45, 48, 51, 53, 56, 59, 62, 65, 68
182 }, {
183 1, 1, 2, 4, 4, 4, 5, 6, 8, 8, /* H */
184 11, 11, 16, 16, 18, 16, 19, 21, 25, 25,
185 25, 34, 30, 32, 35, 37, 40, 42, 45, 48,
186 51, 54, 57, 60, 63, 66, 70, 74, 77, 81
187 }
188 };
189
190 /* From ISO/IEC 23941:2022 Table 8 - Error correction characteristics for rMQR */
191 static const char rmqr_blocks[2][32] = { {
192 1, 1, 1, 1, 1, /* R7x */ /* M */
193 1, 1, 1, 1, 2, /* R9x */
194 1, 1, 1, 1, 2, 2, /* R11x */
195 1, 1, 1, 2, 2, 3, /* R13x */
196 1, 1, 2, 2, 3, /* R15x */
197 1, 2, 2, 3, 4 /* R17x */
198 }, {
199 1, 1, 1, 1, 2, /* R7x */ /* H */
200 1, 1, 2, 2, 3, /* R9x */
201 1, 1, 2, 2, 2, 3, /* R11x */
202 1, 1, 2, 2, 3, 4, /* R13x */
203 2, 2, 3, 4, 5, /* R15x */
204 2, 2, 3, 4, 6 /* R17x */
205 }
206 };
207
208 /* From ISO/IEC 18004:2015 Table 1 - Codeword capacity of all versions of QR Code */
209 static const unsigned char qr_sizes[40] = {
210 21, 25, 29, 33, 37, 41, 45, 49, 53, 57,
211 61, 65, 69, 73, 77, 81, 85, 89, 93, 97,
212 101, 105, 109, 113, 117, 121, 125, 129, 133, 137,
213 141, 145, 149, 153, 157, 161, 165, 169, 173, 177
214 };
215
216 static const char microqr_sizes[4] = {
217 11, 13, 15, 17
218 };
219
220 /* From ISO/IEC 18004:2015 Table 7 - Number of symbol characters and input data capacity for QR Code and
221 Table 9 — Error correction characteristics for QR Code, M1-4 only, indexed by ecc_level & version as
222 { data bits, data codewords, ecc codewords } */
223 static const unsigned char microqr_data[3][4][3] = { {
224 { 20, 3, 2 }, { 40, 5, 5 }, { 84, 11, 6 }, { 128, 16, 8 } /* L */
225 }, {
226 { 0, 0, 0 }, { 32, 4, 6 }, { 68, 9, 8 }, { 112, 14, 10 } /* M */
227 }, {
228 { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 }, { 80, 10, 14 } /* Q */
229 }
230 };
231
232 /* No. of entries in `qr_table_e1` (Table E.1) per version */
233 static const char qr_align_loopsize[40] = {
234 0, 2, 2, 2, 2, 2, 3, 3, 3, 3,
235 3, 3, 3, 4, 4, 4, 4, 4, 4, 4,
236 5, 5, 5, 5, 5, 5, 5, 6, 6, 6,
237 6, 6, 6, 6, 7, 7, 7, 7, 7, 7
238 };
239
240 /* Table E.1 - Row/column coordinates of center module of alignment patterns */
241 static const unsigned char qr_table_e1[40 * 7] = {
242 6, 18, 0, 0, 0, 0, 0,
243 6, 22, 0, 0, 0, 0, 0,
244 6, 26, 0, 0, 0, 0, 0,
245 6, 30, 0, 0, 0, 0, 0,
246 6, 34, 0, 0, 0, 0, 0,
247 6, 22, 38, 0, 0, 0, 0,
248 6, 24, 42, 0, 0, 0, 0,
249 6, 26, 46, 0, 0, 0, 0,
250 6, 28, 50, 0, 0, 0, 0,
251 6, 30, 54, 0, 0, 0, 0,
252 6, 32, 58, 0, 0, 0, 0,
253 6, 34, 62, 0, 0, 0, 0,
254 6, 26, 46, 66, 0, 0, 0,
255 6, 26, 48, 70, 0, 0, 0,
256 6, 26, 50, 74, 0, 0, 0,
257 6, 30, 54, 78, 0, 0, 0,
258 6, 30, 56, 82, 0, 0, 0,
259 6, 30, 58, 86, 0, 0, 0,
260 6, 34, 62, 90, 0, 0, 0,
261 6, 28, 50, 72, 94, 0, 0,
262 6, 26, 50, 74, 98, 0, 0,
263 6, 30, 54, 78, 102, 0, 0,
264 6, 28, 54, 80, 106, 0, 0,
265 6, 32, 58, 84, 110, 0, 0,
266 6, 30, 58, 86, 114, 0, 0,
267 6, 34, 62, 90, 118, 0, 0,
268 6, 26, 50, 74, 98, 122, 0,
269 6, 30, 54, 78, 102, 126, 0,
270 6, 26, 52, 78, 104, 130, 0,
271 6, 30, 56, 82, 108, 134, 0,
272 6, 34, 60, 86, 112, 138, 0,
273 6, 30, 58, 86, 114, 142, 0,
274 6, 34, 62, 90, 118, 146, 0,
275 6, 30, 54, 78, 102, 126, 150,
276 6, 24, 50, 76, 102, 128, 154,
277 6, 28, 54, 80, 106, 132, 158,
278 6, 32, 58, 84, 110, 136, 162,
279 6, 26, 54, 82, 110, 138, 166,
280 6, 30, 58, 86, 114, 142, 170
281 };
282
283 /* Table D.1 - Column coordinates of centre module of alignment patterns */
284 static const unsigned char rmqr_table_d1[20] = {
285 21, 0, 0, 0,
286 19, 39, 0, 0,
287 25, 51, 0, 0,
288 23, 49, 75, 0,
289 27, 55, 83, 111
290 };
291
292 /* Format information bit sequences */
293 static const unsigned short qr_annex_c[32] = {
294 0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0, 0x77c4, 0x72f3,
295 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41, 0x6976, 0x1689, 0x13be, 0x1ce7, 0x19d0,
296 0x0762, 0x0255, 0x0d0c, 0x083b, 0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183,
297 0x2eda, 0x2bed
298 };
299
300 /* Version information bit sequences */
301 static const unsigned int qr_annex_d[34] = {
302 0x07c94, 0x085bc, 0x09a99, 0x0a4d3, 0x0bbf6, 0x0c762, 0x0d847, 0x0e60d, 0x0f928, 0x10b78,
303 0x1145d, 0x12a17, 0x13532, 0x149a6, 0x15683, 0x168c9, 0x177ec, 0x18ec4, 0x191e1, 0x1afab,
304 0x1b08e, 0x1cc1a, 0x1d33f, 0x1ed75, 0x1f250, 0x209d5, 0x216f0, 0x228ba, 0x2379f, 0x24b0b,
305 0x2542e, 0x26a64, 0x27541, 0x28c69
306 };
307
308 /* Micro QR Code format information */
309 static const unsigned short qr_annex_c1[32] = {
310 0x4445, 0x4172, 0x4e2b, 0x4b1c, 0x55ae, 0x5099, 0x5fc0, 0x5af7, 0x6793, 0x62a4,
311 0x6dfd, 0x68ca, 0x7678, 0x734f, 0x7c16, 0x7921, 0x06de, 0x03e9, 0x0cb0, 0x0987,
312 0x1735, 0x1202, 0x1d5b, 0x186c, 0x2508, 0x203f, 0x2f66, 0x2a51, 0x34e3, 0x31d4,
313 0x3e8d, 0x3bba
314 };
315
316 /* rMQR format information for finder pattern side */
317 static const unsigned int rmqr_format_info_left[64] = {
318 0x1FAB2, 0x1E597, 0x1DBDD, 0x1C4F8, 0x1B86C, 0x1A749, 0x19903, 0x18626, 0x17F0E, 0x1602B,
319 0x15E61, 0x14144, 0x13DD0, 0x122F5, 0x11CBF, 0x1039A, 0x0F1CA, 0x0EEEF, 0x0D0A5, 0x0CF80,
320 0x0B314, 0x0AC31, 0x0927B, 0x08D5E, 0x07476, 0x06B53, 0x05519, 0x04A3C, 0x036A8, 0x0298D,
321 0x017C7, 0x008E2, 0x3F367, 0x3EC42, 0x3D208, 0x3CD2D, 0x3B1B9, 0x3AE9C, 0x390D6, 0x38FF3,
322 0x376DB, 0x369FE, 0x357B4, 0x34891, 0x33405, 0x32B20, 0x3156A, 0x30A4F, 0x2F81F, 0x2E73A,
323 0x2D970, 0x2C655, 0x2BAC1, 0x2A5E4, 0x29BAE, 0x2848B, 0x27DA3, 0x26286, 0x25CCC, 0x243E9,
324 0x23F7D, 0x22058, 0x21E12, 0x20137
325 };
326
327 /* rMQR format information for subfinder pattern side */
328 static const unsigned int rmqr_format_info_right[64] = {
329 0x20A7B, 0x2155E, 0x22B14, 0x23431, 0x248A5, 0x25780, 0x269CA, 0x276EF, 0x28FC7, 0x290E2,
330 0x2AEA8, 0x2B18D, 0x2CD19, 0x2D23C, 0x2EC76, 0x2F353, 0x30103, 0x31E26, 0x3206C, 0x33F49,
331 0x343DD, 0x35CF8, 0x362B2, 0x37D97, 0x384BF, 0x39B9A, 0x3A5D0, 0x3BAF5, 0x3C661, 0x3D944,
332 0x3E70E, 0x3F82B, 0x003AE, 0x01C8B, 0x022C1, 0x03DE4, 0x04170, 0x05E55, 0x0601F, 0x07F3A,
333 0x08612, 0x09937, 0x0A77D, 0x0B858, 0x0C4CC, 0x0DBE9, 0x0E5A3, 0x0FA86, 0x108D6, 0x117F3,
334 0x129B9, 0x1369C, 0x14A08, 0x1552D, 0x16B67, 0x17442, 0x18D6A, 0x1924F, 0x1AC05, 0x1B320,
335 0x1CFB4, 0x1D091, 0x1EEDB, 0x1F1FE
336 };
337
338 /* vim: set ts=4 sw=4 et : */
339 #endif /* Z_QR_H */