@sythos/js_barcode_universal 1.5.8 → 1.5.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +5 -4
- package/NOTICE.md +2 -2
- package/README.md +17 -13
- package/bundle/sythos-barcode.esm.js +11658 -11244
- package/bundle/sythos-barcode.js +11658 -11244
- package/package.json +10 -3
- package/src/index.d.ts +1 -1
- package/src/index.js +508 -516
- package/src/js/aztec/decoder.js +208 -199
- package/src/js/aztec/detector.js +153 -126
- package/src/js/aztec/encoder.js +172 -153
- package/src/js/aztec/high-level.js +106 -101
- package/src/js/aztec/index.js +1 -12
- package/src/js/aztec/tables.js +106 -120
- package/src/js/aztecrune/decoder.js +76 -85
- package/src/js/aztecrune/detector.js +107 -93
- package/src/js/aztecrune/encoder.js +50 -68
- package/src/js/aztecrune/index.js +1 -16
- package/src/js/aztecrune/tables.js +59 -54
- package/src/js/compactpdf417/decoder.js +69 -74
- package/src/js/compactpdf417/detector.js +74 -75
- package/src/js/compactpdf417/encoder.js +68 -81
- package/src/js/compactpdf417/index.js +1 -13
- package/src/js/compactpdf417/tables.js +71 -80
- package/src/js/core/bit-buffer.js +106 -122
- package/src/js/core/bit-matrix.js +196 -194
- package/src/js/core/errors.js +13 -15
- package/src/js/core/galois-field.js +119 -133
- package/src/js/core/index.js +2 -19
- package/src/js/core/reed-solomon.js +195 -204
- package/src/js/databar/codec.js +93 -108
- package/src/js/databar/decoder.js +149 -140
- package/src/js/databar/encoder.js +47 -55
- package/src/js/databar/gs1.js +122 -123
- package/src/js/databar/index.js +4 -36
- package/src/js/databar/patterns.js +81 -85
- package/src/js/databar/tables.js +51 -52
- package/src/js/datamatrix/decoder.js +216 -182
- package/src/js/datamatrix/detector.js +161 -132
- package/src/js/datamatrix/encoder.js +192 -133
- package/src/js/datamatrix/index.js +1 -9
- package/src/js/datamatrix/tables.js +68 -69
- package/src/js/frameqr/decoder.js +102 -125
- package/src/js/frameqr/detector.js +101 -94
- package/src/js/frameqr/encoder.js +67 -80
- package/src/js/frameqr/index.js +1 -10
- package/src/js/frameqr/tables.js +145 -163
- package/src/js/image/binarizer.js +146 -162
- package/src/js/image/grid-sampler.js +63 -79
- package/src/js/image/index.js +0 -2
- package/src/js/image/luminance.js +129 -140
- package/src/js/image/perspective.js +112 -149
- package/src/js/micropdf417/compaction.js +64 -65
- package/src/js/micropdf417/decoder.js +106 -109
- package/src/js/micropdf417/detector.js +73 -70
- package/src/js/micropdf417/encoder.js +129 -154
- package/src/js/micropdf417/error-correction.js +6 -11
- package/src/js/micropdf417/index.js +2 -16
- package/src/js/micropdf417/tables.js +112 -99
- package/src/js/microqr/decoder.js +177 -182
- package/src/js/microqr/detector.js +240 -256
- package/src/js/microqr/encoder.js +239 -194
- package/src/js/microqr/index.js +0 -2
- package/src/js/microqr/tables.js +208 -200
- package/src/js/oned/addons.js +167 -191
- package/src/js/oned/index.js +27 -58
- package/src/js/oned/patterns.js +194 -213
- package/src/js/oned/reader.js +1003 -984
- package/src/js/oned/writers.js +411 -466
- package/src/js/pdf417/compaction.js +315 -222
- package/src/js/pdf417/decoder.js +71 -36
- package/src/js/pdf417/detector.js +377 -361
- package/src/js/pdf417/encoder.js +57 -46
- package/src/js/pdf417/error-correction.js +5 -8
- package/src/js/pdf417/tables.js +248 -250
- package/src/js/qr/decoder.js +311 -347
- package/src/js/qr/detector.js +378 -395
- package/src/js/qr/encoder.js +514 -599
- package/src/js/qr/index.js +0 -2
- package/src/js/qr/tables.js +375 -422
- package/src/js/render/image-data.js +57 -62
- package/src/js/render/index.js +21 -23
- package/src/js/render/options.js +82 -90
- package/src/js/render/png.js +144 -169
- package/src/js/render/svg.js +41 -44
- package/src/js/render/webgl.js +103 -109
- package/src/js/render/webgpu.js +205 -217
- package/src/js/rmqr/decoder.js +161 -53
- package/src/js/rmqr/detector.js +73 -41
- package/src/js/rmqr/encoder.js +253 -104
- package/src/js/rmqr/index.js +1 -5
- package/src/js/rmqr/tables.js +108 -85
- package/src/ts/aztec/decoder.ts +317 -0
- package/src/ts/aztec/detector.ts +224 -0
- package/src/ts/aztec/encoder.ts +257 -0
- package/src/ts/aztec/high-level.ts +211 -0
- package/src/ts/aztec/index.ts +45 -0
- package/src/ts/aztec/tables.ts +210 -0
- package/src/ts/aztecrune/decoder.ts +155 -0
- package/src/ts/aztecrune/detector.ts +166 -0
- package/src/ts/aztecrune/encoder.ts +121 -0
- package/src/ts/aztecrune/index.ts +49 -0
- package/src/ts/aztecrune/tables.ts +137 -0
- package/src/ts/compactpdf417/decoder.ts +128 -0
- package/src/ts/compactpdf417/detector.ts +139 -0
- package/src/ts/compactpdf417/encoder.ts +140 -0
- package/src/ts/compactpdf417/index.ts +17 -0
- package/src/ts/compactpdf417/tables.ts +173 -0
- package/src/ts/core/bit-buffer.ts +174 -0
- package/src/ts/core/bit-matrix.ts +241 -0
- package/src/ts/core/errors.ts +61 -0
- package/src/ts/core/galois-field.ts +207 -0
- package/src/ts/core/index.ts +56 -0
- package/src/ts/core/reed-solomon.ts +327 -0
- package/src/ts/databar/codec.ts +181 -0
- package/src/ts/databar/decoder.ts +215 -0
- package/src/ts/databar/encoder.ts +96 -0
- package/src/ts/databar/gs1.ts +177 -0
- package/src/ts/databar/index.ts +68 -0
- package/src/ts/databar/patterns.ts +143 -0
- package/src/ts/databar/tables.ts +124 -0
- package/src/ts/datamatrix/decoder.ts +262 -0
- package/src/ts/datamatrix/detector.ts +225 -0
- package/src/ts/datamatrix/encoder.ts +191 -0
- package/src/ts/datamatrix/index.ts +42 -0
- package/src/ts/datamatrix/tables.ts +123 -0
- package/src/ts/frameqr/decoder.ts +239 -0
- package/src/ts/frameqr/detector.ts +192 -0
- package/src/ts/frameqr/encoder.ts +156 -0
- package/src/ts/frameqr/index.ts +42 -0
- package/src/ts/frameqr/tables.ts +270 -0
- package/src/ts/image/binarizer.ts +270 -0
- package/src/ts/image/grid-sampler.ts +164 -0
- package/src/ts/image/index.ts +40 -0
- package/src/ts/image/luminance.ts +196 -0
- package/src/ts/image/perspective.ts +195 -0
- package/src/ts/index.d.ts +1 -1
- package/src/ts/index.ts +790 -0
- package/src/ts/micropdf417/compaction.ts +116 -0
- package/src/ts/micropdf417/decoder.ts +183 -0
- package/src/ts/micropdf417/detector.ts +149 -0
- package/src/ts/micropdf417/encoder.ts +209 -0
- package/src/ts/micropdf417/error-correction.ts +55 -0
- package/src/ts/micropdf417/index.ts +49 -0
- package/src/ts/micropdf417/tables.ts +184 -0
- package/src/ts/microqr/decoder.ts +245 -0
- package/src/ts/microqr/detector.ts +355 -0
- package/src/ts/microqr/encoder.ts +269 -0
- package/src/ts/microqr/index.ts +36 -0
- package/src/ts/microqr/tables.ts +316 -0
- package/src/ts/oned/addons.ts +420 -0
- package/src/ts/oned/index.ts +106 -0
- package/src/ts/oned/patterns.ts +384 -0
- package/src/ts/oned/reader.ts +1364 -0
- package/src/ts/oned/writers.ts +746 -0
- package/src/ts/pdf417/compaction.ts +298 -0
- package/src/ts/pdf417/decoder.ts +75 -0
- package/src/ts/pdf417/detector.ts +468 -0
- package/src/ts/pdf417/encoder.ts +91 -0
- package/src/ts/pdf417/error-correction.ts +47 -0
- package/src/ts/pdf417/index.ts +6 -0
- package/src/ts/pdf417/tables.ts +317 -0
- package/src/ts/qr/decoder.ts +575 -0
- package/src/ts/qr/detector.ts +630 -0
- package/src/ts/qr/encoder.ts +958 -0
- package/src/ts/qr/index.ts +44 -0
- package/src/ts/qr/tables.ts +737 -0
- package/src/ts/render/image-data.ts +125 -0
- package/src/ts/render/index.ts +130 -0
- package/src/ts/render/options.ts +160 -0
- package/src/ts/render/png.ts +295 -0
- package/src/ts/render/svg.ts +120 -0
- package/src/ts/render/webgl.ts +206 -0
- package/src/ts/render/webgpu.ts +369 -0
- package/src/ts/rmqr/decoder.ts +101 -0
- package/src/ts/rmqr/detector.ts +90 -0
- package/src/ts/rmqr/encoder.ts +172 -0
- package/src/ts/rmqr/index.ts +37 -0
- package/src/ts/rmqr/tables.ts +154 -0
|
@@ -27,219 +27,214 @@
|
|
|
27
27
|
*
|
|
28
28
|
* Original work. No code from any other barcode implementation.
|
|
29
29
|
*/
|
|
30
|
-
|
|
31
30
|
/**
|
|
32
31
|
* Micro QR decoder for an already sampled M1-M4 module matrix.
|
|
33
32
|
*
|
|
34
33
|
* @module microqr/decoder
|
|
35
34
|
*/
|
|
36
|
-
|
|
37
35
|
import { ChecksumError, FormatError } from '../core/errors.js';
|
|
38
36
|
import { GF256_QR } from '../core/galois-field.js';
|
|
39
37
|
import { rsDecode } from '../core/reed-solomon.js';
|
|
40
|
-
import {
|
|
41
|
-
microQrBlockLayout,
|
|
42
|
-
microQrDataModuleOrder,
|
|
43
|
-
microQrDecodeFormatInfo,
|
|
44
|
-
microQrFormatInfoPositions,
|
|
45
|
-
microQrMaskBit,
|
|
46
|
-
} from './tables.js';
|
|
47
|
-
|
|
38
|
+
import { microQrBlockLayout, microQrDataModuleOrder, microQrDecodeFormatInfo, microQrFormatInfoPositions, microQrMaskBit, } from './tables.js';
|
|
48
39
|
const ALPHANUMERIC = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:';
|
|
49
40
|
const MODE_NAMES = ['numeric', 'alphanumeric', 'byte', 'kanji'];
|
|
50
41
|
const COUNT_BITS = {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
42
|
+
numeric: [0, 3, 4, 5, 6],
|
|
43
|
+
alphanumeric: [0, 0, 3, 4, 5],
|
|
44
|
+
byte: [0, 0, 0, 4, 5],
|
|
45
|
+
kanji: [0, 0, 0, 3, 4],
|
|
55
46
|
};
|
|
56
|
-
|
|
57
47
|
class LimitedBitReader {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
}
|
|
74
|
-
return value >>> 0;
|
|
75
|
-
}
|
|
48
|
+
constructor(bytes, limit) {
|
|
49
|
+
this.bytes = bytes;
|
|
50
|
+
this.limit = limit;
|
|
51
|
+
this.offset = 0;
|
|
52
|
+
}
|
|
53
|
+
available() { return this.limit - this.offset; }
|
|
54
|
+
read(count) {
|
|
55
|
+
if (!Number.isInteger(count) || count < 1 || count > 32 || count > this.available()) {
|
|
56
|
+
throw new FormatError(`Micro QR: needed ${count} bits, ${Math.max(0, this.available())} remain`);
|
|
57
|
+
}
|
|
58
|
+
let value = 0;
|
|
59
|
+
for (let i = 0; i < count; i++, this.offset++) {
|
|
60
|
+
value = (value << 1) | ((this.bytes[this.offset >>> 3] >>> (7 - (this.offset & 7))) & 1);
|
|
61
|
+
}
|
|
62
|
+
return value >>> 0;
|
|
63
|
+
}
|
|
76
64
|
}
|
|
77
|
-
|
|
78
65
|
function moduleAt(matrix, x, y, mirrored) {
|
|
79
|
-
|
|
66
|
+
return mirrored ? matrix.get(y, x) : matrix.get(x, y);
|
|
80
67
|
}
|
|
81
|
-
|
|
82
68
|
function readFormat(matrix, expectedVersion, mirrored) {
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
69
|
+
let bits = 0;
|
|
70
|
+
const positions = microQrFormatInfoPositions(matrix.width);
|
|
71
|
+
for (let i = 0; i < positions.length; i++) {
|
|
72
|
+
const [x, y] = positions[i];
|
|
73
|
+
if (moduleAt(matrix, x, y, mirrored))
|
|
74
|
+
bits |= 1 << i;
|
|
75
|
+
}
|
|
76
|
+
const format = microQrDecodeFormatInfo(bits);
|
|
77
|
+
if (!format)
|
|
78
|
+
throw new FormatError('Micro QR: format information is unreadable');
|
|
79
|
+
if (format.version !== expectedVersion) {
|
|
80
|
+
throw new FormatError(`Micro QR: format identifies ${format.version}, but the matrix dimension identifies ${expectedVersion}`);
|
|
81
|
+
}
|
|
82
|
+
return format;
|
|
97
83
|
}
|
|
98
|
-
|
|
99
84
|
function readCodewords(matrix, layout, mask, mirrored) {
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
85
|
+
const order = microQrDataModuleOrder(layout.version);
|
|
86
|
+
const data = new Array(layout.dataCodewords).fill(0);
|
|
87
|
+
const ecc = new Array(layout.eccCodewords).fill(0);
|
|
88
|
+
let streamOffset = 0;
|
|
89
|
+
const readBit = () => {
|
|
90
|
+
const x = order[streamOffset * 2];
|
|
91
|
+
const y = order[streamOffset * 2 + 1];
|
|
92
|
+
if (x === undefined || y === undefined)
|
|
93
|
+
throw new FormatError('Micro QR: encoding region is truncated');
|
|
94
|
+
streamOffset++;
|
|
95
|
+
return moduleAt(matrix, x, y, mirrored) !== microQrMaskBit(mask, x, y) ? 1 : 0;
|
|
96
|
+
};
|
|
97
|
+
const readInto = (target, index, count, highBit = 7) => {
|
|
98
|
+
for (let bit = highBit; bit > highBit - count; bit--)
|
|
99
|
+
target[index] |= readBit() << bit;
|
|
100
|
+
};
|
|
101
|
+
const fullData = layout.shortDataCodewordBits === 4 ? layout.dataCodewords - 1 : layout.dataCodewords;
|
|
102
|
+
for (let i = 0; i < fullData; i++)
|
|
103
|
+
readInto(data, i, 8);
|
|
104
|
+
if (layout.shortDataCodewordBits === 4)
|
|
105
|
+
readInto(data, data.length - 1, 4);
|
|
106
|
+
for (let i = 0; i < ecc.length; i++)
|
|
107
|
+
readInto(ecc, i, 8);
|
|
108
|
+
if (streamOffset !== order.length / 2) {
|
|
109
|
+
throw new FormatError(`Micro QR: read ${streamOffset} of ${order.length / 2} encoding modules`);
|
|
110
|
+
}
|
|
111
|
+
return data.concat(ecc);
|
|
125
112
|
}
|
|
126
|
-
|
|
127
113
|
function correctCodewords(received, layout) {
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
114
|
+
const corrections = rsDecode(received, layout.eccCodewords, GF256_QR, 0);
|
|
115
|
+
if (layout.version === 'M1' && corrections !== 0) {
|
|
116
|
+
throw new ChecksumError('Micro QR: M1 provides error detection only');
|
|
117
|
+
}
|
|
118
|
+
return { data: Uint8Array.from(received.slice(0, layout.dataCodewords)), corrections };
|
|
133
119
|
}
|
|
134
|
-
|
|
135
120
|
function decodeKanjiValue(value) {
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
121
|
+
const combined = (Math.floor(value / 0xc0) << 8) | (value % 0xc0);
|
|
122
|
+
const sjis = combined + (combined < 0x1f00 ? 0x8140 : 0xc140);
|
|
123
|
+
const bytes = Uint8Array.of(sjis >>> 8, sjis & 0xff);
|
|
124
|
+
try {
|
|
125
|
+
return new TextDecoder('shift_jis', { fatal: true }).decode(bytes);
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
throw new FormatError(`Micro QR: invalid Kanji value ${value}`);
|
|
129
|
+
}
|
|
144
130
|
}
|
|
145
|
-
|
|
146
131
|
function parsePayload(data, version, dataBits) {
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
132
|
+
const reader = new LimitedBitReader(data, dataBits);
|
|
133
|
+
const modeValue = version === 1 ? 0 : reader.read(version - 1);
|
|
134
|
+
if (modeValue > 3 || (version === 2 && modeValue > 1)) {
|
|
135
|
+
throw new FormatError(`Micro QR: mode indicator ${modeValue} is unavailable in M${version}`);
|
|
136
|
+
}
|
|
137
|
+
const mode = MODE_NAMES[modeValue];
|
|
138
|
+
const countWidth = COUNT_BITS[mode][version];
|
|
139
|
+
if (!countWidth)
|
|
140
|
+
throw new FormatError(`Micro QR: ${mode} mode is unavailable in M${version}`);
|
|
141
|
+
const count = reader.read(countWidth);
|
|
142
|
+
if (count === 0)
|
|
143
|
+
throw new FormatError('Micro QR: zero-length data segment');
|
|
144
|
+
let text = '';
|
|
145
|
+
const rawBytes = [];
|
|
146
|
+
if (mode === 'numeric') {
|
|
147
|
+
let remaining = count;
|
|
148
|
+
while (remaining >= 3) {
|
|
149
|
+
const value = reader.read(10);
|
|
150
|
+
if (value >= 1000)
|
|
151
|
+
throw new FormatError(`Micro QR: invalid numeric triplet ${value}`);
|
|
152
|
+
text += String(value).padStart(3, '0');
|
|
153
|
+
remaining -= 3;
|
|
154
|
+
}
|
|
155
|
+
if (remaining === 2) {
|
|
156
|
+
const value = reader.read(7);
|
|
157
|
+
if (value >= 100)
|
|
158
|
+
throw new FormatError(`Micro QR: invalid numeric pair ${value}`);
|
|
159
|
+
text += String(value).padStart(2, '0');
|
|
160
|
+
}
|
|
161
|
+
else if (remaining === 1) {
|
|
162
|
+
const value = reader.read(4);
|
|
163
|
+
if (value >= 10)
|
|
164
|
+
throw new FormatError(`Micro QR: invalid numeric digit ${value}`);
|
|
165
|
+
text += String(value);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
else if (mode === 'alphanumeric') {
|
|
169
|
+
let remaining = count;
|
|
170
|
+
while (remaining >= 2) {
|
|
171
|
+
const value = reader.read(11);
|
|
172
|
+
if (value >= 45 * 45)
|
|
173
|
+
throw new FormatError(`Micro QR: invalid alphanumeric pair ${value}`);
|
|
174
|
+
text += ALPHANUMERIC[Math.floor(value / 45)] + ALPHANUMERIC[value % 45];
|
|
175
|
+
remaining -= 2;
|
|
176
|
+
}
|
|
177
|
+
if (remaining === 1) {
|
|
178
|
+
const value = reader.read(6);
|
|
179
|
+
if (value >= 45)
|
|
180
|
+
throw new FormatError(`Micro QR: invalid alphanumeric value ${value}`);
|
|
181
|
+
text += ALPHANUMERIC[value];
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
else if (mode === 'byte') {
|
|
185
|
+
for (let i = 0; i < count; i++) {
|
|
186
|
+
const value = reader.read(8);
|
|
187
|
+
rawBytes.push(value);
|
|
188
|
+
text += String.fromCharCode(value);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
for (let i = 0; i < count; i++)
|
|
193
|
+
text += decodeKanjiValue(reader.read(13));
|
|
194
|
+
}
|
|
195
|
+
return { text, bytes: Uint8Array.from(rawBytes), mode };
|
|
200
196
|
}
|
|
201
|
-
|
|
202
197
|
function decodeOrientation(matrix, expectedVersion, mirrored) {
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
198
|
+
const format = readFormat(matrix, expectedVersion, mirrored);
|
|
199
|
+
const layout = microQrBlockLayout(format.version, format.ecc);
|
|
200
|
+
const received = readCodewords(matrix, layout, format.mask, mirrored);
|
|
201
|
+
const { data, corrections } = correctCodewords(received, layout);
|
|
202
|
+
const payload = parsePayload(data, Number(format.version.slice(1)), layout.dataBits);
|
|
203
|
+
return {
|
|
204
|
+
text: payload.text,
|
|
205
|
+
bytes: payload.bytes,
|
|
206
|
+
mode: payload.mode,
|
|
207
|
+
version: format.version,
|
|
208
|
+
ecc: format.ecc,
|
|
209
|
+
mask: format.mask,
|
|
210
|
+
corrections,
|
|
211
|
+
formatCorrections: format.correctedBits,
|
|
212
|
+
mirrored,
|
|
213
|
+
};
|
|
219
214
|
}
|
|
220
|
-
|
|
221
215
|
/** Decode a sampled Micro QR Code symbol without its quiet zone. */
|
|
222
216
|
export function decodeMicroQR(matrix) {
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
try {
|
|
235
|
-
return decodeOrientation(matrix, expectedVersion, false);
|
|
236
|
-
} catch (primaryError) {
|
|
217
|
+
if (!matrix || !Number.isInteger(matrix.width) || typeof matrix.get !== 'function') {
|
|
218
|
+
throw new FormatError('Micro QR: no matrix supplied');
|
|
219
|
+
}
|
|
220
|
+
if (matrix.height !== matrix.width) {
|
|
221
|
+
throw new FormatError(`Micro QR: symbol must be square, got ${matrix.width}x${matrix.height}`);
|
|
222
|
+
}
|
|
223
|
+
const version = (matrix.width - 9) / 2;
|
|
224
|
+
if (!Number.isInteger(version) || version < 1 || version > 4) {
|
|
225
|
+
throw new FormatError(`Micro QR: ${matrix.width} modules is not a valid M1-M4 symbol size`);
|
|
226
|
+
}
|
|
227
|
+
const expectedVersion = `M${version}`;
|
|
237
228
|
try {
|
|
238
|
-
|
|
239
|
-
}
|
|
240
|
-
|
|
229
|
+
return decodeOrientation(matrix, expectedVersion, false);
|
|
230
|
+
}
|
|
231
|
+
catch (primaryError) {
|
|
232
|
+
try {
|
|
233
|
+
return decodeOrientation(matrix, expectedVersion, true);
|
|
234
|
+
}
|
|
235
|
+
catch {
|
|
236
|
+
throw primaryError;
|
|
237
|
+
}
|
|
241
238
|
}
|
|
242
|
-
}
|
|
243
239
|
}
|
|
244
|
-
|
|
245
240
|
export { ChecksumError, FormatError };
|