|
|
@@ -35,69 +35,136 @@ class QRMatrix{
|
|
|
|
|
|
/**
|
|
|
* @link http://www.thonky.com/qr-code-tutorial/alignment-pattern-locations
|
|
|
+ *
|
|
|
+ * version -> pattern
|
|
|
*/
|
|
|
protected const alignmentPattern = [
|
|
|
- null, // start at 1
|
|
|
- [],
|
|
|
- [6, 18],
|
|
|
- [6, 22],
|
|
|
- [6, 26],
|
|
|
- [6, 30],
|
|
|
- [6, 34],
|
|
|
- [6, 22, 38],
|
|
|
- [6, 24, 42],
|
|
|
- [6, 26, 46],
|
|
|
- [6, 28, 50],
|
|
|
- [6, 30, 54],
|
|
|
- [6, 32, 58],
|
|
|
- [6, 34, 62],
|
|
|
- [6, 26, 46, 66],
|
|
|
- [6, 26, 48, 70],
|
|
|
- [6, 26, 50, 74],
|
|
|
- [6, 30, 54, 78],
|
|
|
- [6, 30, 56, 82],
|
|
|
- [6, 30, 58, 86],
|
|
|
- [6, 34, 62, 90],
|
|
|
- [6, 28, 50, 72, 94],
|
|
|
- [6, 26, 50, 74, 98],
|
|
|
- [6, 30, 54, 78, 102],
|
|
|
- [6, 28, 54, 80, 106],
|
|
|
- [6, 32, 58, 84, 110],
|
|
|
- [6, 30, 58, 86, 114],
|
|
|
- [6, 34, 62, 90, 118],
|
|
|
- [6, 26, 50, 74, 98, 122],
|
|
|
- [6, 30, 54, 78, 102, 126],
|
|
|
- [6, 26, 52, 78, 104, 130],
|
|
|
- [6, 30, 56, 82, 108, 134],
|
|
|
- [6, 34, 60, 86, 112, 138],
|
|
|
- [6, 30, 58, 86, 114, 142],
|
|
|
- [6, 34, 62, 90, 118, 146],
|
|
|
- [6, 30, 54, 78, 102, 126, 150],
|
|
|
- [6, 24, 50, 76, 102, 128, 154],
|
|
|
- [6, 28, 54, 80, 106, 132, 158],
|
|
|
- [6, 32, 58, 84, 110, 136, 162],
|
|
|
- [6, 26, 54, 82, 110, 138, 166],
|
|
|
- [6, 30, 58, 86, 114, 142, 170],
|
|
|
+ 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],
|
|
|
];
|
|
|
|
|
|
/**
|
|
|
* @link http://www.thonky.com/qr-code-tutorial/format-version-tables
|
|
|
+ *
|
|
|
+ * no version pattern for QR Codes < 7
|
|
|
*/
|
|
|
protected const versionPattern = [
|
|
|
- // 1-based version index
|
|
|
- null,
|
|
|
- // no version pattern for QR Codes < 7
|
|
|
- null , null , null , null , null , null , 0x07c94, 0x085bc, 0x09a99, 0x0a4d3,
|
|
|
- 0x0bbf6, 0x0c762, 0x0d847, 0x0e60d, 0x0f928, 0x10b78, 0x1145d, 0x12a17, 0x13532, 0x149a6,
|
|
|
- 0x15683, 0x168c9, 0x177ec, 0x18ec4, 0x191e1, 0x1afab, 0x1b08e, 0x1cc1a, 0x1d33f, 0x1ed75,
|
|
|
- 0x1f250, 0x209d5, 0x216f0, 0x228ba, 0x2379f, 0x24b0b, 0x2542e, 0x26a64, 0x27541, 0x28c69,
|
|
|
+ 7 => 0b000111110010010100,
|
|
|
+ 8 => 0b001000010110111100,
|
|
|
+ 9 => 0b001001101010011001,
|
|
|
+ 10 => 0b001010010011010011,
|
|
|
+ 11 => 0b001011101111110110,
|
|
|
+ 12 => 0b001100011101100010,
|
|
|
+ 13 => 0b001101100001000111,
|
|
|
+ 14 => 0b001110011000001101,
|
|
|
+ 15 => 0b001111100100101000,
|
|
|
+ 16 => 0b010000101101111000,
|
|
|
+ 17 => 0b010001010001011101,
|
|
|
+ 18 => 0b010010101000010111,
|
|
|
+ 19 => 0b010011010100110010,
|
|
|
+ 20 => 0b010100100110100110,
|
|
|
+ 21 => 0b010101011010000011,
|
|
|
+ 22 => 0b010110100011001001,
|
|
|
+ 23 => 0b010111011111101100,
|
|
|
+ 24 => 0b011000111011000100,
|
|
|
+ 25 => 0b011001000111100001,
|
|
|
+ 26 => 0b011010111110101011,
|
|
|
+ 27 => 0b011011000010001110,
|
|
|
+ 28 => 0b011100110000011010,
|
|
|
+ 29 => 0b011101001100111111,
|
|
|
+ 30 => 0b011110110101110101,
|
|
|
+ 31 => 0b011111001001010000,
|
|
|
+ 32 => 0b100000100111010101,
|
|
|
+ 33 => 0b100001011011110000,
|
|
|
+ 34 => 0b100010100010111010,
|
|
|
+ 35 => 0b100011011110011111,
|
|
|
+ 36 => 0b100100101100001011,
|
|
|
+ 37 => 0b100101010000101110,
|
|
|
+ 38 => 0b100110101001100100,
|
|
|
+ 39 => 0b100111010101000001,
|
|
|
+ 40 => 0b101000110001101001,
|
|
|
];
|
|
|
|
|
|
+ // ECC level -> mask pattern
|
|
|
protected const formatPattern = [
|
|
|
- [0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41, 0x6976], // L
|
|
|
- [0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0], // M
|
|
|
- [0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed], // Q
|
|
|
- [0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b], // H
|
|
|
+ [ // L
|
|
|
+ 0b111011111000100,
|
|
|
+ 0b111001011110011,
|
|
|
+ 0b111110110101010,
|
|
|
+ 0b111100010011101,
|
|
|
+ 0b110011000101111,
|
|
|
+ 0b110001100011000,
|
|
|
+ 0b110110001000001,
|
|
|
+ 0b110100101110110,
|
|
|
+ ],
|
|
|
+ [ // M
|
|
|
+ 0b101010000010010,
|
|
|
+ 0b101000100100101,
|
|
|
+ 0b101111001111100,
|
|
|
+ 0b101101101001011,
|
|
|
+ 0b100010111111001,
|
|
|
+ 0b100000011001110,
|
|
|
+ 0b100111110010111,
|
|
|
+ 0b100101010100000,
|
|
|
+ ],
|
|
|
+ [ // Q
|
|
|
+ 0b011010101011111,
|
|
|
+ 0b011000001101000,
|
|
|
+ 0b011111100110001,
|
|
|
+ 0b011101000000110,
|
|
|
+ 0b010010010110100,
|
|
|
+ 0b010000110000011,
|
|
|
+ 0b010111011011010,
|
|
|
+ 0b010101111101101,
|
|
|
+ ],
|
|
|
+ [ // H
|
|
|
+ 0b001011010001001,
|
|
|
+ 0b001001110111110,
|
|
|
+ 0b001110011100111,
|
|
|
+ 0b001100111010000,
|
|
|
+ 0b000011101100010,
|
|
|
+ 0b000001001010101,
|
|
|
+ 0b000110100001100,
|
|
|
+ 0b000100000111011,
|
|
|
+ ],
|
|
|
];
|
|
|
|
|
|
/**
|