Module refinery.lib.qr.tables
Expand source code Browse git
from __future__ import annotations
import enum
from typing import Callable, NamedTuple
class ECLevel(enum.IntEnum):
L = 0
M = 1
Q = 2
H = 3
class ECBlockInfo(NamedTuple):
total_codewords: int
ec_per_block: int
group1_blocks: int
group1_data_cw: int
group2_blocks: int
group2_data_cw: int
def version_size(version: int) -> int:
return 4 * version + 17
ALIGNMENT_POSITIONS: dict[int, list[int]] = {
1: [],
2: [6, 18],
3: [6, 22],
4: [6, 26],
5: [6, 30],
6: [6, 34],
7: [6, 22, 38],
8: [6, 24, 42],
9: [6, 26, 46],
10: [6, 28, 50],
11: [6, 30, 54],
12: [6, 32, 58],
13: [6, 34, 62],
14: [6, 26, 46, 66],
15: [6, 26, 48, 70],
16: [6, 26, 50, 74],
17: [6, 30, 54, 78],
18: [6, 30, 56, 82],
19: [6, 30, 58, 86],
20: [6, 34, 62, 90],
21: [6, 28, 50, 72, 94],
22: [6, 26, 50, 74, 98],
23: [6, 30, 54, 78, 102],
24: [6, 28, 54, 80, 106],
25: [6, 32, 58, 84, 110],
26: [6, 30, 58, 86, 114],
27: [6, 34, 62, 90, 118],
28: [6, 26, 50, 74, 98, 122],
29: [6, 30, 54, 78, 102, 126],
30: [6, 26, 52, 78, 104, 130],
31: [6, 30, 56, 82, 108, 134],
32: [6, 34, 60, 86, 112, 138],
33: [6, 30, 58, 86, 114, 142],
34: [6, 34, 62, 90, 118, 146],
35: [6, 30, 54, 78, 102, 126, 150],
36: [6, 24, 50, 76, 102, 128, 154],
37: [6, 28, 54, 80, 106, 132, 158],
38: [6, 32, 58, 84, 110, 136, 162],
39: [6, 26, 54, 82, 110, 138, 166],
40: [6, 30, 58, 86, 114, 142, 170],
}
EC_PARAMETERS: dict[tuple[int, ECLevel], ECBlockInfo] = {
( 1, ECLevel.L): ECBlockInfo( 26, 7, 1, 19, 0, 0), # noqa
( 1, ECLevel.M): ECBlockInfo( 26, 10, 1, 16, 0, 0), # noqa
( 1, ECLevel.Q): ECBlockInfo( 26, 13, 1, 13, 0, 0), # noqa
( 1, ECLevel.H): ECBlockInfo( 26, 17, 1, 9, 0, 0), # noqa
( 2, ECLevel.L): ECBlockInfo( 44, 10, 1, 34, 0, 0), # noqa
( 2, ECLevel.M): ECBlockInfo( 44, 16, 1, 28, 0, 0), # noqa
( 2, ECLevel.Q): ECBlockInfo( 44, 22, 1, 22, 0, 0), # noqa
( 2, ECLevel.H): ECBlockInfo( 44, 28, 1, 16, 0, 0), # noqa
( 3, ECLevel.L): ECBlockInfo( 70, 15, 1, 55, 0, 0), # noqa
( 3, ECLevel.M): ECBlockInfo( 70, 26, 1, 44, 0, 0), # noqa
( 3, ECLevel.Q): ECBlockInfo( 70, 18, 2, 17, 0, 0), # noqa
( 3, ECLevel.H): ECBlockInfo( 70, 22, 2, 13, 0, 0), # noqa
( 4, ECLevel.L): ECBlockInfo( 100, 20, 1, 80, 0, 0), # noqa
( 4, ECLevel.M): ECBlockInfo( 100, 18, 2, 32, 0, 0), # noqa
( 4, ECLevel.Q): ECBlockInfo( 100, 26, 2, 24, 0, 0), # noqa
( 4, ECLevel.H): ECBlockInfo( 100, 16, 4, 9, 0, 0), # noqa
( 5, ECLevel.L): ECBlockInfo( 134, 26, 1, 108, 0, 0), # noqa
( 5, ECLevel.M): ECBlockInfo( 134, 24, 2, 43, 0, 0), # noqa
( 5, ECLevel.Q): ECBlockInfo( 134, 18, 2, 15, 2, 16), # noqa
( 5, ECLevel.H): ECBlockInfo( 134, 22, 2, 11, 2, 12), # noqa
( 6, ECLevel.L): ECBlockInfo( 172, 18, 2, 68, 0, 0), # noqa
( 6, ECLevel.M): ECBlockInfo( 172, 16, 4, 27, 0, 0), # noqa
( 6, ECLevel.Q): ECBlockInfo( 172, 24, 4, 19, 0, 0), # noqa
( 6, ECLevel.H): ECBlockInfo( 172, 28, 4, 15, 0, 0), # noqa
( 7, ECLevel.L): ECBlockInfo( 196, 20, 2, 78, 0, 0), # noqa
( 7, ECLevel.M): ECBlockInfo( 196, 18, 4, 31, 0, 0), # noqa
( 7, ECLevel.Q): ECBlockInfo( 196, 18, 2, 14, 4, 15), # noqa
( 7, ECLevel.H): ECBlockInfo( 196, 26, 4, 13, 1, 14), # noqa
( 8, ECLevel.L): ECBlockInfo( 242, 24, 2, 97, 0, 0), # noqa
( 8, ECLevel.M): ECBlockInfo( 242, 22, 2, 38, 2, 39), # noqa
( 8, ECLevel.Q): ECBlockInfo( 242, 22, 4, 18, 2, 19), # noqa
( 8, ECLevel.H): ECBlockInfo( 242, 26, 4, 14, 2, 15), # noqa
( 9, ECLevel.L): ECBlockInfo( 292, 30, 2, 116, 0, 0), # noqa
( 9, ECLevel.M): ECBlockInfo( 292, 22, 3, 36, 2, 37), # noqa
( 9, ECLevel.Q): ECBlockInfo( 292, 20, 4, 16, 4, 17), # noqa
( 9, ECLevel.H): ECBlockInfo( 292, 24, 4, 12, 4, 13), # noqa
(10, ECLevel.L): ECBlockInfo( 346, 18, 2, 68, 2, 69), # noqa
(10, ECLevel.M): ECBlockInfo( 346, 26, 4, 43, 1, 44), # noqa
(10, ECLevel.Q): ECBlockInfo( 346, 24, 6, 19, 2, 20), # noqa
(10, ECLevel.H): ECBlockInfo( 346, 28, 6, 15, 2, 16), # noqa
(11, ECLevel.L): ECBlockInfo( 404, 20, 4, 81, 0, 0), # noqa
(11, ECLevel.M): ECBlockInfo( 404, 30, 1, 50, 4, 51), # noqa
(11, ECLevel.Q): ECBlockInfo( 404, 28, 4, 22, 4, 23), # noqa
(11, ECLevel.H): ECBlockInfo( 404, 24, 3, 12, 8, 13), # noqa
(12, ECLevel.L): ECBlockInfo( 466, 24, 2, 92, 2, 93), # noqa
(12, ECLevel.M): ECBlockInfo( 466, 22, 6, 36, 2, 37), # noqa
(12, ECLevel.Q): ECBlockInfo( 466, 26, 4, 20, 6, 21), # noqa
(12, ECLevel.H): ECBlockInfo( 466, 28, 7, 14, 4, 15), # noqa
(13, ECLevel.L): ECBlockInfo( 532, 26, 4, 107, 0, 0), # noqa
(13, ECLevel.M): ECBlockInfo( 532, 22, 8, 37, 1, 38), # noqa
(13, ECLevel.Q): ECBlockInfo( 532, 24, 8, 20, 4, 21), # noqa
(13, ECLevel.H): ECBlockInfo( 532, 22, 12, 11, 4, 12), # noqa
(14, ECLevel.L): ECBlockInfo( 581, 30, 3, 115, 1, 116), # noqa
(14, ECLevel.M): ECBlockInfo( 581, 24, 4, 40, 5, 41), # noqa
(14, ECLevel.Q): ECBlockInfo( 581, 20, 11, 16, 5, 17), # noqa
(14, ECLevel.H): ECBlockInfo( 581, 24, 11, 12, 5, 13), # noqa
(15, ECLevel.L): ECBlockInfo( 655, 22, 5, 87, 1, 88), # noqa
(15, ECLevel.M): ECBlockInfo( 655, 24, 5, 41, 5, 42), # noqa
(15, ECLevel.Q): ECBlockInfo( 655, 30, 5, 24, 7, 25), # noqa
(15, ECLevel.H): ECBlockInfo( 655, 24, 11, 12, 7, 13), # noqa
(16, ECLevel.L): ECBlockInfo( 733, 24, 5, 98, 1, 99), # noqa
(16, ECLevel.M): ECBlockInfo( 733, 28, 7, 45, 3, 46), # noqa
(16, ECLevel.Q): ECBlockInfo( 733, 24, 15, 19, 2, 20), # noqa
(16, ECLevel.H): ECBlockInfo( 733, 30, 3, 15, 13, 16), # noqa
(17, ECLevel.L): ECBlockInfo( 815, 28, 1, 107, 5, 108), # noqa
(17, ECLevel.M): ECBlockInfo( 815, 28, 10, 46, 1, 47), # noqa
(17, ECLevel.Q): ECBlockInfo( 815, 28, 1, 22, 15, 23), # noqa
(17, ECLevel.H): ECBlockInfo( 815, 28, 2, 14, 17, 15), # noqa
(18, ECLevel.L): ECBlockInfo( 901, 30, 5, 120, 1, 121), # noqa
(18, ECLevel.M): ECBlockInfo( 901, 26, 9, 43, 4, 44), # noqa
(18, ECLevel.Q): ECBlockInfo( 901, 28, 17, 22, 1, 23), # noqa
(18, ECLevel.H): ECBlockInfo( 901, 28, 2, 14, 19, 15), # noqa
(19, ECLevel.L): ECBlockInfo( 991, 28, 3, 113, 4, 114), # noqa
(19, ECLevel.M): ECBlockInfo( 991, 26, 3, 44, 11, 45), # noqa
(19, ECLevel.Q): ECBlockInfo( 991, 26, 17, 21, 4, 22), # noqa
(19, ECLevel.H): ECBlockInfo( 991, 26, 9, 13, 16, 14), # noqa
(20, ECLevel.L): ECBlockInfo(1085, 28, 3, 107, 5, 108), # noqa
(20, ECLevel.M): ECBlockInfo(1085, 26, 3, 41, 13, 42), # noqa
(20, ECLevel.Q): ECBlockInfo(1085, 30, 15, 24, 5, 25), # noqa
(20, ECLevel.H): ECBlockInfo(1085, 28, 15, 15, 10, 16), # noqa
(21, ECLevel.L): ECBlockInfo(1156, 28, 4, 116, 4, 117), # noqa
(21, ECLevel.M): ECBlockInfo(1156, 26, 17, 42, 0, 0), # noqa
(21, ECLevel.Q): ECBlockInfo(1156, 28, 17, 22, 6, 23), # noqa
(21, ECLevel.H): ECBlockInfo(1156, 30, 19, 16, 6, 17), # noqa
(22, ECLevel.L): ECBlockInfo(1258, 28, 2, 111, 7, 112), # noqa
(22, ECLevel.M): ECBlockInfo(1258, 28, 17, 46, 0, 0), # noqa
(22, ECLevel.Q): ECBlockInfo(1258, 30, 7, 24, 16, 25), # noqa
(22, ECLevel.H): ECBlockInfo(1258, 24, 34, 13, 0, 0), # noqa
(23, ECLevel.L): ECBlockInfo(1364, 30, 4, 121, 5, 122), # noqa
(23, ECLevel.M): ECBlockInfo(1364, 28, 4, 47, 14, 48), # noqa
(23, ECLevel.Q): ECBlockInfo(1364, 30, 11, 24, 14, 25), # noqa
(23, ECLevel.H): ECBlockInfo(1364, 30, 16, 15, 14, 16), # noqa
(24, ECLevel.L): ECBlockInfo(1474, 30, 6, 117, 4, 118), # noqa
(24, ECLevel.M): ECBlockInfo(1474, 28, 6, 45, 14, 46), # noqa
(24, ECLevel.Q): ECBlockInfo(1474, 30, 11, 24, 16, 25), # noqa
(24, ECLevel.H): ECBlockInfo(1474, 30, 30, 16, 2, 17), # noqa
(25, ECLevel.L): ECBlockInfo(1588, 26, 8, 106, 4, 107), # noqa
(25, ECLevel.M): ECBlockInfo(1588, 28, 8, 47, 13, 48), # noqa
(25, ECLevel.Q): ECBlockInfo(1588, 30, 7, 24, 22, 25), # noqa
(25, ECLevel.H): ECBlockInfo(1588, 30, 22, 15, 13, 16), # noqa
(26, ECLevel.L): ECBlockInfo(1706, 28, 10, 114, 2, 115), # noqa
(26, ECLevel.M): ECBlockInfo(1706, 28, 19, 46, 4, 47), # noqa
(26, ECLevel.Q): ECBlockInfo(1706, 28, 28, 22, 6, 23), # noqa
(26, ECLevel.H): ECBlockInfo(1706, 30, 33, 16, 4, 17), # noqa
(27, ECLevel.L): ECBlockInfo(1828, 30, 8, 122, 4, 123), # noqa
(27, ECLevel.M): ECBlockInfo(1828, 28, 22, 45, 3, 46), # noqa
(27, ECLevel.Q): ECBlockInfo(1828, 30, 8, 23, 26, 24), # noqa
(27, ECLevel.H): ECBlockInfo(1828, 30, 12, 15, 28, 16), # noqa
(28, ECLevel.L): ECBlockInfo(1921, 30, 3, 117, 10, 118), # noqa
(28, ECLevel.M): ECBlockInfo(1921, 28, 3, 45, 23, 46), # noqa
(28, ECLevel.Q): ECBlockInfo(1921, 30, 4, 24, 31, 25), # noqa
(28, ECLevel.H): ECBlockInfo(1921, 30, 11, 15, 31, 16), # noqa
(29, ECLevel.L): ECBlockInfo(2051, 30, 7, 116, 7, 117), # noqa
(29, ECLevel.M): ECBlockInfo(2051, 28, 21, 45, 7, 46), # noqa
(29, ECLevel.Q): ECBlockInfo(2051, 30, 1, 23, 37, 24), # noqa
(29, ECLevel.H): ECBlockInfo(2051, 30, 19, 15, 26, 16), # noqa
(30, ECLevel.L): ECBlockInfo(2185, 30, 5, 115, 10, 116), # noqa
(30, ECLevel.M): ECBlockInfo(2185, 28, 19, 47, 10, 48), # noqa
(30, ECLevel.Q): ECBlockInfo(2185, 30, 15, 24, 25, 25), # noqa
(30, ECLevel.H): ECBlockInfo(2185, 30, 23, 15, 25, 16), # noqa
(31, ECLevel.L): ECBlockInfo(2323, 30, 13, 115, 3, 116), # noqa
(31, ECLevel.M): ECBlockInfo(2323, 28, 2, 46, 29, 47), # noqa
(31, ECLevel.Q): ECBlockInfo(2323, 30, 42, 24, 1, 25), # noqa
(31, ECLevel.H): ECBlockInfo(2323, 30, 23, 15, 28, 16), # noqa
(32, ECLevel.L): ECBlockInfo(2465, 30, 17, 115, 0, 0), # noqa
(32, ECLevel.M): ECBlockInfo(2465, 28, 10, 46, 23, 47), # noqa
(32, ECLevel.Q): ECBlockInfo(2465, 30, 10, 24, 35, 25), # noqa
(32, ECLevel.H): ECBlockInfo(2465, 30, 19, 15, 35, 16), # noqa
(33, ECLevel.L): ECBlockInfo(2611, 30, 17, 115, 1, 116), # noqa
(33, ECLevel.M): ECBlockInfo(2611, 28, 14, 46, 21, 47), # noqa
(33, ECLevel.Q): ECBlockInfo(2611, 30, 29, 24, 19, 25), # noqa
(33, ECLevel.H): ECBlockInfo(2611, 30, 11, 15, 46, 16), # noqa
(34, ECLevel.L): ECBlockInfo(2761, 30, 13, 115, 6, 116), # noqa
(34, ECLevel.M): ECBlockInfo(2761, 28, 14, 46, 23, 47), # noqa
(34, ECLevel.Q): ECBlockInfo(2761, 30, 44, 24, 7, 25), # noqa
(34, ECLevel.H): ECBlockInfo(2761, 30, 59, 16, 1, 17), # noqa
(35, ECLevel.L): ECBlockInfo(2876, 30, 12, 121, 7, 122), # noqa
(35, ECLevel.M): ECBlockInfo(2876, 28, 12, 47, 26, 48), # noqa
(35, ECLevel.Q): ECBlockInfo(2876, 30, 39, 24, 14, 25), # noqa
(35, ECLevel.H): ECBlockInfo(2876, 30, 22, 15, 41, 16), # noqa
(36, ECLevel.L): ECBlockInfo(3034, 30, 6, 121, 14, 122), # noqa
(36, ECLevel.M): ECBlockInfo(3034, 28, 6, 47, 34, 48), # noqa
(36, ECLevel.Q): ECBlockInfo(3034, 30, 46, 24, 10, 25), # noqa
(36, ECLevel.H): ECBlockInfo(3034, 30, 2, 15, 64, 16), # noqa
(37, ECLevel.L): ECBlockInfo(3196, 30, 17, 122, 4, 123), # noqa
(37, ECLevel.M): ECBlockInfo(3196, 28, 29, 46, 14, 47), # noqa
(37, ECLevel.Q): ECBlockInfo(3196, 30, 49, 24, 10, 25), # noqa
(37, ECLevel.H): ECBlockInfo(3196, 30, 24, 15, 46, 16), # noqa
(38, ECLevel.L): ECBlockInfo(3362, 30, 4, 122, 18, 123), # noqa
(38, ECLevel.M): ECBlockInfo(3362, 28, 13, 46, 32, 47), # noqa
(38, ECLevel.Q): ECBlockInfo(3362, 30, 48, 24, 14, 25), # noqa
(38, ECLevel.H): ECBlockInfo(3362, 30, 42, 15, 32, 16), # noqa
(39, ECLevel.L): ECBlockInfo(3532, 30, 20, 117, 4, 118), # noqa
(39, ECLevel.M): ECBlockInfo(3532, 28, 40, 47, 7, 48), # noqa
(39, ECLevel.Q): ECBlockInfo(3532, 30, 43, 24, 22, 25), # noqa
(39, ECLevel.H): ECBlockInfo(3532, 30, 10, 15, 67, 16), # noqa
(40, ECLevel.L): ECBlockInfo(3706, 30, 19, 118, 6, 119), # noqa
(40, ECLevel.M): ECBlockInfo(3706, 28, 18, 47, 31, 48), # noqa
(40, ECLevel.Q): ECBlockInfo(3706, 30, 34, 24, 34, 25), # noqa
(40, ECLevel.H): ECBlockInfo(3706, 30, 20, 15, 61, 16), # noqa
}
FORMAT_INFO_STRINGS: list[int] = [
0x5412, 0x5125, 0x5E7C, 0x5B4B, 0x45F9, 0x40CE, 0x4F97, 0x4AA0,
0x77C4, 0x72F3, 0x7DAA, 0x789D, 0x662F, 0x6318, 0x6C41, 0x6976,
0x1689, 0x13BE, 0x1CE7, 0x19D0, 0x0762, 0x0255, 0x0D0C, 0x083B,
0x355F, 0x3068, 0x3F31, 0x3A06, 0x24B4, 0x2183, 0x2EDA, 0x2BED,
]
VERSION_INFO_STRINGS: dict[int, int] = {
7: 0x07C94,
8: 0x085BC,
9: 0x09A99,
10: 0x0A4D3,
11: 0x0BBF6,
12: 0x0C762,
13: 0x0D847,
14: 0x0E60D,
15: 0x0F928,
16: 0x10B78,
17: 0x1145D,
18: 0x12A17,
19: 0x13532,
20: 0x149A6,
21: 0x15683,
22: 0x168C9,
23: 0x177EC,
24: 0x18EC4,
25: 0x191E1,
26: 0x1AFAB,
27: 0x1B08E,
28: 0x1CC1A,
29: 0x1D33F,
30: 0x1ED75,
31: 0x1F250,
32: 0x209D5,
33: 0x216F0,
34: 0x228BA,
35: 0x2379F,
36: 0x24B0B,
37: 0x2542E,
38: 0x26A64,
39: 0x27541,
40: 0x28C69,
}
MASK_FUNCTIONS: list[Callable[[int, int], bool]] = [
lambda r, c: (r + c) % 2 == 0,
lambda r, c: r % 2 == 0,
lambda r, c: c % 3 == 0,
lambda r, c: (r + c) % 3 == 0,
lambda r, c: (r // 2 + c // 3) % 2 == 0,
lambda r, c: (r * c) % 2 + (r * c) % 3 == 0,
lambda r, c: ((r * c) % 2 + (r * c) % 3) % 2 == 0,
lambda r, c: ((r + c) % 2 + (r * c) % 3) % 2 == 0,
]
ALPHANUMERIC_CHARSET = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:'
CHAR_COUNT_BITS: dict[str, list[int]] = {
'numeric' : [10, 12, 14],
'alphanumeric' : [9, 11, 13],
'byte' : [8, 16, 16],
'kanji' : [8, 10, 12],
}
def char_count_bits(mode: str, version: int) -> int:
if version <= 9:
group = 0
elif version <= 26:
group = 1
else:
group = 2
return CHAR_COUNT_BITS[mode][group]
Functions
def version_size(version)-
Expand source code Browse git
def version_size(version: int) -> int: return 4 * version + 17 def char_count_bits(mode, version)-
Expand source code Browse git
def char_count_bits(mode: str, version: int) -> int: if version <= 9: group = 0 elif version <= 26: group = 1 else: group = 2 return CHAR_COUNT_BITS[mode][group]
Classes
class ECLevel (*args, **kwds)-
Enum where members are also (and must be) ints
Expand source code Browse git
class ECLevel(enum.IntEnum): L = 0 M = 1 Q = 2 H = 3Ancestors
- enum.IntEnum
- builtins.int
- enum.ReprEnum
- enum.Enum
Class variables
var L-
The type of the None singleton.
var M-
The type of the None singleton.
var Q-
The type of the None singleton.
var H-
The type of the None singleton.
class ECBlockInfo (total_codewords, ec_per_block, group1_blocks, group1_data_cw, group2_blocks, group2_data_cw)-
ECBlockInfo(total_codewords, ec_per_block, group1_blocks, group1_data_cw, group2_blocks, group2_data_cw)
Expand source code Browse git
class ECBlockInfo(NamedTuple): total_codewords: int ec_per_block: int group1_blocks: int group1_data_cw: int group2_blocks: int group2_data_cw: intAncestors
- builtins.tuple
Instance variables
var total_codewords-
Alias for field number 0
Expand source code Browse git
class ECBlockInfo(NamedTuple): total_codewords: int ec_per_block: int group1_blocks: int group1_data_cw: int group2_blocks: int group2_data_cw: int var ec_per_block-
Alias for field number 1
Expand source code Browse git
class ECBlockInfo(NamedTuple): total_codewords: int ec_per_block: int group1_blocks: int group1_data_cw: int group2_blocks: int group2_data_cw: int var group1_blocks-
Alias for field number 2
Expand source code Browse git
class ECBlockInfo(NamedTuple): total_codewords: int ec_per_block: int group1_blocks: int group1_data_cw: int group2_blocks: int group2_data_cw: int var group1_data_cw-
Alias for field number 3
Expand source code Browse git
class ECBlockInfo(NamedTuple): total_codewords: int ec_per_block: int group1_blocks: int group1_data_cw: int group2_blocks: int group2_data_cw: int var group2_blocks-
Alias for field number 4
Expand source code Browse git
class ECBlockInfo(NamedTuple): total_codewords: int ec_per_block: int group1_blocks: int group1_data_cw: int group2_blocks: int group2_data_cw: int var group2_data_cw-
Alias for field number 5
Expand source code Browse git
class ECBlockInfo(NamedTuple): total_codewords: int ec_per_block: int group1_blocks: int group1_data_cw: int group2_blocks: int group2_data_cw: int