diff --git a/src/collection/bitMatrix.ts b/src/collection/bitMatrix.ts index 07431e5..bf010d1 100644 --- a/src/collection/bitMatrix.ts +++ b/src/collection/bitMatrix.ts @@ -7,11 +7,16 @@ export class BitMatrix { private static ACCESS_HINT_PRIVATE = Symbol(); - static of(array: number[][]): BitMatrix { - if (array.length < 1) return new BitMatrix(0, 0); - const ret = new BitMatrix(array[0].length, array.length); - for (let y=0; y < array.length; y++) { - ret.setRow(y, BitArray.of(array[y])); + /** + * For internal usage. Creates a BitMatrix from the specified bits with a width of at most 8 + */ + static raw(width: number, ...rows: number[]): BitMatrix { + const height: number = rows.length; + const row = new BitArray(width); + const ret = new BitMatrix(width, height); + for (let i=0; i < height; i++) { + row.setBulk(0, rows[i]); + ret.setRow(i, row); } return ret; } diff --git a/src/qr/version.ts b/src/qr/version.ts index a28796e..37bdeee 100644 --- a/src/qr/version.ts +++ b/src/qr/version.ts @@ -4,6 +4,7 @@ */ import {ErrorCorrectionLevel} from "../ec/level"; +import {Buffer} from "safer-buffer"; export interface ECB { readonly count: number, @@ -39,7 +40,7 @@ export class Version { readonly versionNumber: number; readonly alignmentPatternCenters: number[]; - private readonly ecBlocks: ECBlocks[]; + readonly ecBlocks: ECBlocks[]; readonly totalCodewords: number; constructor(versionNumber: number, alignmentPatternCenters: number[], ...ecBlocks: ECBlocks[]) { this.versionNumber = versionNumber; @@ -162,336 +163,47 @@ export namespace Version { // function buildVersions(): Version[] { - return [ - new Version(1, [], - new ECBlocks(7, ECB(1, 19)), - new ECBlocks(10, ECB(1, 16)), - new ECBlocks(13, ECB(1, 13)), - new ECBlocks(17, ECB(1, 9))), - new Version(2, [6, 18], - new ECBlocks(10, ECB(1, 34)), - new ECBlocks(16, ECB(1, 28)), - new ECBlocks(22, ECB(1, 22)), - new ECBlocks(28, ECB(1, 16))), - new Version(3, [6, 22], - new ECBlocks(15, ECB(1, 55)), - new ECBlocks(26, ECB(1, 44)), - new ECBlocks(18, ECB(2, 17)), - new ECBlocks(22, ECB(2, 13))), - new Version(4, [6, 26], - new ECBlocks(20, ECB(1, 80)), - new ECBlocks(18, ECB(2, 32)), - new ECBlocks(26, ECB(2, 24)), - new ECBlocks(16, ECB(4, 9))), - new Version(5, [6, 30], - new ECBlocks(26, ECB(1, 108)), - new ECBlocks(24, ECB(2, 43)), - new ECBlocks(18, ECB(2, 15), - ECB(2, 16)), - new ECBlocks(22, ECB(2, 11), - ECB(2, 12))), - new Version(6, [6, 34], - new ECBlocks(18, ECB(2, 68)), - new ECBlocks(16, ECB(4, 27)), - new ECBlocks(24, ECB(4, 19)), - new ECBlocks(28, ECB(4, 15))), - new Version(7, [6, 22, 38], - new ECBlocks(20, ECB(2, 78)), - new ECBlocks(18, ECB(4, 31)), - new ECBlocks(18, ECB(2, 14), - ECB(4, 15)), - new ECBlocks(26, ECB(4, 13), - ECB(1, 14))), - new Version(8, [6, 24, 42], - new ECBlocks(24, ECB(2, 97)), - new ECBlocks(22, ECB(2, 38), - ECB(2, 39)), - new ECBlocks(22, ECB(4, 18), - ECB(2, 19)), - new ECBlocks(26, ECB(4, 14), - ECB(2, 15))), - new Version(9, [6, 26, 46], - new ECBlocks(30, ECB(2, 116)), - new ECBlocks(22, ECB(3, 36), - ECB(2, 37)), - new ECBlocks(20, ECB(4, 16), - ECB(4, 17)), - new ECBlocks(24, ECB(4, 12), - ECB(4, 13))), - new Version(10, [6, 28, 50], - new ECBlocks(18, ECB(2, 68), - ECB(2, 69)), - new ECBlocks(26, ECB(4, 43), - ECB(1, 44)), - new ECBlocks(24, ECB(6, 19), - ECB(2, 20)), - new ECBlocks(28, ECB(6, 15), - ECB(2, 16))), - new Version(11, [6, 30, 54], - new ECBlocks(20, ECB(4, 81)), - new ECBlocks(30, ECB(1, 50), - ECB(4, 51)), - new ECBlocks(28, ECB(4, 22), - ECB(4, 23)), - new ECBlocks(24, ECB(3, 12), - ECB(8, 13))), - new Version(12, [6, 32, 58], - new ECBlocks(24, ECB(2, 92), - ECB(2, 93)), - new ECBlocks(22, ECB(6, 36), - ECB(2, 37)), - new ECBlocks(26, ECB(4, 20), - ECB(6, 21)), - new ECBlocks(28, ECB(7, 14), - ECB(4, 15))), - new Version(13, [6, 34, 62], - new ECBlocks(26, ECB(4, 107)), - new ECBlocks(22, ECB(8, 37), - ECB(1, 38)), - new ECBlocks(24, ECB(8, 20), - ECB(4, 21)), - new ECBlocks(22, ECB(12, 11), - ECB(4, 12))), - new Version(14, [6, 26, 46, 66], - new ECBlocks(30, ECB(3, 115), - ECB(1, 116)), - new ECBlocks(24, ECB(4, 40), - ECB(5, 41)), - new ECBlocks(20, ECB(11, 16), - ECB(5, 17)), - new ECBlocks(24, ECB(11, 12), - ECB(5, 13))), - new Version(15, [6, 26, 48, 70], - new ECBlocks(22, ECB(5, 87), - ECB(1, 88)), - new ECBlocks(24, ECB(5, 41), - ECB(5, 42)), - new ECBlocks(30, ECB(5, 24), - ECB(7, 25)), - new ECBlocks(24, ECB(11, 12), - ECB(7, 13))), - new Version(16, [6, 26, 50, 74], - new ECBlocks(24, ECB(5, 98), - ECB(1, 99)), - new ECBlocks(28, ECB(7, 45), - ECB(3, 46)), - new ECBlocks(24, ECB(15, 19), - ECB(2, 20)), - new ECBlocks(30, ECB(3, 15), - ECB(13, 16))), - new Version(17, [6, 30, 54, 78], - new ECBlocks(28, ECB(1, 107), - ECB(5, 108)), - new ECBlocks(28, ECB(10, 46), - ECB(1, 47)), - new ECBlocks(28, ECB(1, 22), - ECB(15, 23)), - new ECBlocks(28, ECB(2, 14), - ECB(17, 15))), - new Version(18, [6, 30, 56, 82], - new ECBlocks(30, ECB(5, 120), - ECB(1, 121)), - new ECBlocks(26, ECB(9, 43), - ECB(4, 44)), - new ECBlocks(28, ECB(17, 22), - ECB(1, 23)), - new ECBlocks(28, ECB(2, 14), - ECB(19, 15))), - new Version(19, [6, 30, 58, 86], - new ECBlocks(28, ECB(3, 113), - ECB(4, 114)), - new ECBlocks(26, ECB(3, 44), - ECB(11, 45)), - new ECBlocks(26, ECB(17, 21), - ECB(4, 22)), - new ECBlocks(26, ECB(9, 13), - ECB(16, 14))), - new Version(20, [6, 34, 62, 90], - new ECBlocks(28, ECB(3, 107), - ECB(5, 108)), - new ECBlocks(26, ECB(3, 41), - ECB(13, 42)), - new ECBlocks(30, ECB(15, 24), - ECB(5, 25)), - new ECBlocks(28, ECB(15, 15), - ECB(10, 16))), - new Version(21, [6, 28, 50, 72, 94], - new ECBlocks(28, ECB(4, 116), - ECB(4, 117)), - new ECBlocks(26, ECB(17, 42)), - new ECBlocks(28, ECB(17, 22), - ECB(6, 23)), - new ECBlocks(30, ECB(19, 16), - ECB(6, 17))), - new Version(22, [6, 26, 50, 74, 98], - new ECBlocks(28, ECB(2, 111), - ECB(7, 112)), - new ECBlocks(28, ECB(17, 46)), - new ECBlocks(30, ECB(7, 24), - ECB(16, 25)), - new ECBlocks(24, ECB(34, 13))), - new Version(23, [6, 30, 54, 78, 102], - new ECBlocks(30, ECB(4, 121), - ECB(5, 122)), - new ECBlocks(28, ECB(4, 47), - ECB(14, 48)), - new ECBlocks(30, ECB(11, 24), - ECB(14, 25)), - new ECBlocks(30, ECB(16, 15), - ECB(14, 16))), - new Version(24, [6, 28, 54, 80, 106], - new ECBlocks(30, ECB(6, 117), - ECB(4, 118)), - new ECBlocks(28, ECB(6, 45), - ECB(14, 46)), - new ECBlocks(30, ECB(11, 24), - ECB(16, 25)), - new ECBlocks(30, ECB(30, 16), - ECB(2, 17))), - new Version(25, [6, 32, 58, 84, 110], - new ECBlocks(26, ECB(8, 106), - ECB(4, 107)), - new ECBlocks(28, ECB(8, 47), - ECB(13, 48)), - new ECBlocks(30, ECB(7, 24), - ECB(22, 25)), - new ECBlocks(30, ECB(22, 15), - ECB(13, 16))), - new Version(26, [6, 30, 58, 86, 114], - new ECBlocks(28, ECB(10, 114), - ECB(2, 115)), - new ECBlocks(28, ECB(19, 46), - ECB(4, 47)), - new ECBlocks(28, ECB(28, 22), - ECB(6, 23)), - new ECBlocks(30, ECB(33, 16), - ECB(4, 17))), - new Version(27, [6, 34, 62, 90, 118], - new ECBlocks(30, ECB(8, 122), - ECB(4, 123)), - new ECBlocks(28, ECB(22, 45), - ECB(3, 46)), - new ECBlocks(30, ECB(8, 23), - ECB(26, 24)), - new ECBlocks(30, ECB(12, 15), - ECB(28, 16))), - new Version(28, [6, 26, 50, 74, 98, 122], - new ECBlocks(30, ECB(3, 117), - ECB(10, 118)), - new ECBlocks(28, ECB(3, 45), - ECB(23, 46)), - new ECBlocks(30, ECB(4, 24), - ECB(31, 25)), - new ECBlocks(30, ECB(11, 15), - ECB(31, 16))), - new Version(29, [6, 30, 54, 78, 102, 126], - new ECBlocks(30, ECB(7, 116), - ECB(7, 117)), - new ECBlocks(28, ECB(21, 45), - ECB(7, 46)), - new ECBlocks(30, ECB(1, 23), - ECB(37, 24)), - new ECBlocks(30, ECB(19, 15), - ECB(26, 16))), - new Version(30, [6, 26, 52, 78, 104, 130], - new ECBlocks(30, ECB(5, 115), - ECB(10, 116)), - new ECBlocks(28, ECB(19, 47), - ECB(10, 48)), - new ECBlocks(30, ECB(15, 24), - ECB(25, 25)), - new ECBlocks(30, ECB(23, 15), - ECB(25, 16))), - new Version(31, [6, 30, 56, 82, 108, 134], - new ECBlocks(30, ECB(13, 115), - ECB(3, 116)), - new ECBlocks(28, ECB(2, 46), - ECB(29, 47)), - new ECBlocks(30, ECB(42, 24), - ECB(1, 25)), - new ECBlocks(30, ECB(23, 15), - ECB(28, 16))), - new Version(32, [6, 34, 60, 86, 112, 138], - new ECBlocks(30, ECB(17, 115)), - new ECBlocks(28, ECB(10, 46), - ECB(23, 47)), - new ECBlocks(30, ECB(10, 24), - ECB(35, 25)), - new ECBlocks(30, ECB(19, 15), - ECB(35, 16))), - new Version(33, [6, 30, 58, 86, 114, 142], - new ECBlocks(30, ECB(17, 115), - ECB(1, 116)), - new ECBlocks(28, ECB(14, 46), - ECB(21, 47)), - new ECBlocks(30, ECB(29, 24), - ECB(19, 25)), - new ECBlocks(30, ECB(11, 15), - ECB(46, 16))), - new Version(34, [6, 34, 62, 90, 118, 146], - new ECBlocks(30, ECB(13, 115), - ECB(6, 116)), - new ECBlocks(28, ECB(14, 46), - ECB(23, 47)), - new ECBlocks(30, ECB(44, 24), - ECB(7, 25)), - new ECBlocks(30, ECB(59, 16), - ECB(1, 17))), - new Version(35, [6, 30, 54, 78, 102, 126, 150], - new ECBlocks(30, ECB(12, 121), - ECB(7, 122)), - new ECBlocks(28, ECB(12, 47), - ECB(26, 48)), - new ECBlocks(30, ECB(39, 24), - ECB(14, 25)), - new ECBlocks(30, ECB(22, 15), - ECB(41, 16))), - new Version(36, [6, 24, 50, 76, 102, 128, 154], - new ECBlocks(30, ECB(6, 121), - ECB(14, 122)), - new ECBlocks(28, ECB(6, 47), - ECB(34, 48)), - new ECBlocks(30, ECB(46, 24), - ECB(10, 25)), - new ECBlocks(30, ECB(2, 15), - ECB(64, 16))), - new Version(37, [6, 28, 54, 80, 106, 132, 158], - new ECBlocks(30, ECB(17, 122), - ECB(4, 123)), - new ECBlocks(28, ECB(29, 46), - ECB(14, 47)), - new ECBlocks(30, ECB(49, 24), - ECB(10, 25)), - new ECBlocks(30, ECB(24, 15), - ECB(46, 16))), - new Version(38, [6, 32, 58, 84, 110, 136, 162], - new ECBlocks(30, ECB(4, 122), - ECB(18, 123)), - new ECBlocks(28, ECB(13, 46), - ECB(32, 47)), - new ECBlocks(30, ECB(48, 24), - ECB(14, 25)), - new ECBlocks(30, ECB(42, 15), - ECB(32, 16))), - new Version(39, [6, 26, 54, 82, 110, 138, 166], - new ECBlocks(30, ECB(20, 117), - ECB(4, 118)), - new ECBlocks(28, ECB(40, 47), - ECB(7, 48)), - new ECBlocks(30, ECB(43, 24), - ECB(22, 25)), - new ECBlocks(30, ECB(10, 15), - ECB(67, 16))), - new Version(40, [6, 30, 58, 86, 114, 142, 170], - new ECBlocks(30, ECB(19, 118), - ECB(6, 119)), - new ECBlocks(28, ECB(18, 47), - ECB(31, 48)), - new ECBlocks(30, ECB(34, 24), - ECB(34, 25)), - new ECBlocks(30, ECB(20, 15), - ECB(61, 16))) - ]; + const CWPB_MAP: number[] = [7,10,13,15,16,17,18,20,22,24,26,28,30]; + const dat = `AAElARMBEAENAQkCBhSLASIBHAEWARACCDpoATcBLAIRAg0CCnakAVACIAIYBAliDKloAWwCKwIPAhACCwIMAg5kmwJEBBsEEwQPYwgQdmoCTgQfAg4EDwQNAQ5zCRKYigJhAiYCJwQSAhMEDgIPcwoUyHkCdAMkAiUEEAQRBAwEDXsLFmqbAkQCRQQrASwGEwIUBg8CEHMMGHy5BFEBMgQzBBYEFwMMCA17DRqYqwJcAl0GJAIlBBQGFQcOBA9zDhyomARrCCUBJggUBBUMCwQMfAoUHsl5A3MBdAQoBSkLEAURCwwFDXwKFSCJyQVXAVgFKQUqBRgHGQsMBw18ChYim5wFYgFjBy0DLg8TAhQDDw0QfAwYJLu7AWsFbAouAS8BFg8XAg4RD3wMGSbKuwV4AXkJKwQsERYBFwIOEw98DBoouqoDcQRyAywLLREVBBYJDRAOfA4cKrrLA2sFbAMpDSoPGAUZDw8KEG0LFiEsurwEdAR1ESoRFgYXExAGES0KFiIuu8kCbwdwES4HGBAZIg19DBgkMMvMBHkFegQvDjALGA4ZEA8OEH0LGCUyy8wGdQR2Bi0OLgsYEBkeEAIRfQ0aJzSrzAhqBGsILw0wBxgWGRYPDRB9DBooNru8CnICcxMuBC8cFgYXIRAEEX0OHCo4y8wIegR7Fi0DLggXGhgMDxwQfgoWIi46y8wDdQp2Ay0XLgQYHxkLDx8QfgwYJDA8y8wHdAd1FS0HLgEXJRgTDxoQfgoXJDE+y8wFcwp0Ey8KMA8YGRkXDxkQfgwZJjNAy8wNcwN0Ai4dLyoYARkXDxwQdg4bKDVCy8wRcwouFy8KGCMZEw8jEH4MGig2RMvMEXMBdA4uFS8dGBMZCw8uEH4OHCo4RsvMDXMGdA4uFy8sGAcZOxABEX8MGCQwPEjLzAx5B3oMLxowJxgOGRYPKRB/CRYjMD1Ky8wGeQ56Bi8iMC4YChkCD0AQfwsYJTI/TMvMEXoEex0uDi8xGAoZGA8uEH8NGic0QU7LzAR6EnsNLiAvMBgOGSoPIBB/ChgmNEJQy8wUdQR2KC8HMCsYFhkKD0MQfwwaKDZEUsvME3YGdxIvHzAiGCIZFA89EA==`; + const bin: Uint8Array = Buffer.from(dat, "base64"); + + let i = 0; + let version: number = 0; + const versions: Version[] = new Array(40); + + while (i < bin.length && (version++) < 40) { + let flag: number = bin[i++]; + const alignmentPatternCentersLength: number = flag & 7; + flag >>= 3; + + const alignmentPatternCenters: number[] = new Array(alignmentPatternCentersLength); + if (alignmentPatternCentersLength !== 0) alignmentPatternCenters[0] = 6; + for (let z=1; z < alignmentPatternCentersLength; z++) + alignmentPatternCenters[z] = (bin[i++] << 1) + 6; + + const codewordsPerBlockHi = bin[i++]; + const codewordsPerBlockLo = bin[i++]; + + const ecBlocks: ECBlocks[] = new Array(4); + for (let q=0; q < 4; q++) { + const count: number = (flag & 1) ? 2 : 1; + flag >>= 1; + + const ecbs: ECB[] = new Array(count); + let tmp: number; + for (let z=0; z < count; z++) { + tmp = bin[i++]; + ecbs[z] = ECB(tmp, bin[i++]); + } + + let cwpb = (q < 2) ? codewordsPerBlockHi : codewordsPerBlockLo; + ecBlocks[q] = new ECBlocks(CWPB_MAP[(q & 1) ? (cwpb & 0xF) : (cwpb >> 4)], ...ecbs); + } + + versions[version - 1] = new Version(version, alignmentPatternCenters, ...ecBlocks); + } + + return versions; } VERSIONS = buildVersions(); diff --git a/src/util/matrix.ts b/src/util/matrix.ts index 252b727..156f242 100644 --- a/src/util/matrix.ts +++ b/src/util/matrix.ts @@ -12,65 +12,50 @@ import {MaskUtil} from "./mask"; export namespace MatrixUtil { - export const POSITION_DETECTION_PATTERN: BitMatrix = BitMatrix.of([ - [1, 1, 1, 1, 1, 1, 1], - [1, 0, 0, 0, 0, 0, 1], - [1, 0, 1, 1, 1, 0, 1], - [1, 0, 1, 1, 1, 0, 1], - [1, 0, 1, 1, 1, 0, 1], - [1, 0, 0, 0, 0, 0, 1], - [1, 1, 1, 1, 1, 1, 1], - ]); - - export const POSITION_ADJUSTMENT_PATTERN: BitMatrix = BitMatrix.of([ - [ 1, 1, 1, 1, 1 ], - [ 1, 0, 0, 0, 1 ], - [ 1, 0, 1, 0, 1 ], - [ 1, 0, 0, 0, 1 ], - [ 1, 1, 1, 1, 1 ], - ]); + export const POSITION_DETECTION_PATTERN: BitMatrix = BitMatrix.raw(7,127,65,93,93,93,65,127); + + export const POSITION_ADJUSTMENT_PATTERN: BitMatrix = BitMatrix.raw(5,31,17,21,17,31); export const POSITION_ADJUSTMENT_PATTERN_COORDINATE_TABLE: number[][] = [ - [-1, -1, -1, -1, -1, -1, -1], // Version 1 - [ 6, 18, -1, -1, -1, -1, -1], // Version 2 - [ 6, 22, -1, -1, -1, -1, -1], // Version 3 - [ 6, 26, -1, -1, -1, -1, -1], // Version 4 - [ 6, 30, -1, -1, -1, -1, -1], // Version 5 - [ 6, 34, -1, -1, -1, -1, -1], // Version 6 - [ 6, 22, 38, -1, -1, -1, -1], // Version 7 - [ 6, 24, 42, -1, -1, -1, -1], // Version 8 - [ 6, 26, 46, -1, -1, -1, -1], // Version 9 - [ 6, 28, 50, -1, -1, -1, -1], // Version 10 - [ 6, 30, 54, -1, -1, -1, -1], // Version 11 - [ 6, 32, 58, -1, -1, -1, -1], // Version 12 - [ 6, 34, 62, -1, -1, -1, -1], // Version 13 - [ 6, 26, 46, 66, -1, -1, -1], // Version 14 - [ 6, 26, 48, 70, -1, -1, -1], // Version 15 - [ 6, 26, 50, 74, -1, -1, -1], // Version 16 - [ 6, 30, 54, 78, -1, -1, -1], // Version 17 - [ 6, 30, 56, 82, -1, -1, -1], // Version 18 - [ 6, 30, 58, 86, -1, -1, -1], // Version 19 - [ 6, 34, 62, 90, -1, -1, -1], // Version 20 - [ 6, 28, 50, 72, 94, -1, -1], // Version 21 - [ 6, 26, 50, 74, 98, -1, -1], // Version 22 - [ 6, 30, 54, 78, 102, -1, -1], // Version 23 - [ 6, 28, 54, 80, 106, -1, -1], // Version 24 - [ 6, 32, 58, 84, 110, -1, -1], // Version 25 - [ 6, 30, 58, 86, 114, -1, -1], // Version 26 - [ 6, 34, 62, 90, 118, -1, -1], // Version 27 - [ 6, 26, 50, 74, 98, 122, -1], // Version 28 - [ 6, 30, 54, 78, 102, 126, -1], // Version 29 - [ 6, 26, 52, 78, 104, 130, -1], // Version 30 - [ 6, 30, 56, 82, 108, 134, -1], // Version 31 - [ 6, 34, 60, 86, 112, 138, -1], // Version 32 - [ 6, 30, 58, 86, 114, 142, -1], // Version 33 - [ 6, 34, 62, 90, 118, 146, -1], // Version 34 - [ 6, 30, 54, 78, 102, 126, 150], // Version 35 - [ 6, 24, 50, 76, 102, 128, 154], // Version 36 - [ 6, 28, 54, 80, 106, 132, 158], // Version 37 - [ 6, 32, 58, 84, 110, 136, 162], // Version 38 - [ 6, 26, 54, 82, 110, 138, 166], // Version 39 - [ 6, 30, 58, 86, 114, 142, 170], // Version 40 + [ 6, 18 ], // Version 2 + [ 6, 22 ], // Version 3 + [ 6, 26 ], // Version 4 + [ 6, 30 ], // Version 5 + [ 6, 34 ], // Version 6 + [ 6, 22, 38 ], // Version 7 + [ 6, 24, 42 ], // Version 8 + [ 6, 26, 46 ], // Version 9 + [ 6, 28, 50 ], // Version 10 + [ 6, 30, 54 ], // Version 11 + [ 6, 32, 58 ], // Version 12 + [ 6, 34, 62 ], // Version 13 + [ 6, 26, 46, 66 ], // Version 14 + [ 6, 26, 48, 70 ], // Version 15 + [ 6, 26, 50, 74 ], // Version 16 + [ 6, 30, 54, 78 ], // Version 17 + [ 6, 30, 56, 82 ], // Version 18 + [ 6, 30, 58, 86 ], // Version 19 + [ 6, 34, 62, 90 ], // Version 20 + [ 6, 28, 50, 72, 94 ], // Version 21 + [ 6, 26, 50, 74, 98 ], // Version 22 + [ 6, 30, 54, 78, 102 ], // Version 23 + [ 6, 28, 54, 80, 106 ], // Version 24 + [ 6, 32, 58, 84, 110 ], // Version 25 + [ 6, 30, 58, 86, 114 ], // Version 26 + [ 6, 34, 62, 90, 118 ], // Version 27 + [ 6, 26, 50, 74, 98, 122 ], // Version 28 + [ 6, 30, 54, 78, 102, 126 ], // Version 29 + [ 6, 26, 52, 78, 104, 130 ], // Version 30 + [ 6, 30, 56, 82, 108, 134 ], // Version 31 + [ 6, 34, 60, 86, 112, 138 ], // Version 32 + [ 6, 30, 58, 86, 114, 142 ], // Version 33 + [ 6, 34, 62, 90, 118, 146 ], // Version 34 + [ 6, 30, 54, 78, 102, 126, 150 ], // Version 35 + [ 6, 24, 50, 76, 102, 128, 154 ], // Version 36 + [ 6, 28, 54, 80, 106, 132, 158 ], // Version 37 + [ 6, 32, 58, 84, 110, 136, 162 ], // Version 38 + [ 6, 26, 54, 82, 110, 138, 166 ], // Version 39 + [ 6, 30, 58, 86, 114, 142, 170 ], // Version 40 ]; export const TYPE_INFO_COORDINATES: [ number, number ][] = [ @@ -265,12 +250,11 @@ export namespace MatrixUtil { function maybeEmbedPositionAdjustmentPatterns(version: Version, matrix: TernaryMatrix): void { if (version.versionNumber < 2) return; - const index: number = version.versionNumber - 1; + const index: number = version.versionNumber - 2; const coordinates: number[] = POSITION_ADJUSTMENT_PATTERN_COORDINATE_TABLE[index]; for (let y of coordinates) { - if (y < 0) continue; for (let x of coordinates) { - if (x >= 0 && matrix.get(x, y) === -1) { + if (matrix.get(x, y) === -1) { embedPositionAdjustmentPattern(x - 2, y - 2, matrix); } }