qrcode-matrix 0.1.1 → 1.0.0-beta.2

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/src/utils.js DELETED
@@ -1,1113 +0,0 @@
1
- var QRMode = {
2
- MODE_NUMBER: 1 << 0,
3
- MODE_ALPHA_NUM: 1 << 1,
4
- MODE_8BIT_BYTE: 1 << 2,
5
- MODE_KANJI: 1 << 3
6
- };
7
-
8
- var QRErrorCorrectionLevel = {
9
- L: 1,
10
- M: 0,
11
- Q: 3,
12
- H: 2
13
- };
14
-
15
- var QRMaskPattern = {
16
- PATTERN000: 0,
17
- PATTERN001: 1,
18
- PATTERN010: 2,
19
- PATTERN011: 3,
20
- PATTERN100: 4,
21
- PATTERN101: 5,
22
- PATTERN110: 6,
23
- PATTERN111: 7
24
- };
25
-
26
- // 获取掩模函数
27
- var getQRMaskFunction = (function () {
28
- var QRMaskFunctions = [
29
- function (i, j) {
30
- return (i + j) % 2 == 0;
31
- },
32
- function (i, j) {
33
- return i % 2 == 0;
34
- },
35
- function (i, j) {
36
- return j % 3 == 0;
37
- },
38
- function (i, j) {
39
- return (i + j) % 3 == 0;
40
- },
41
- function (i, j) {
42
- return (Math.floor(i / 2) + Math.floor(j / 3)) % 2 == 0;
43
- },
44
- function (i, j) {
45
- return (i * j) % 2 + (i * j) % 3 == 0;
46
- },
47
- function (i, j) {
48
- return ((i * j) % 2 + (i * j) % 3) % 2 == 0;
49
- },
50
- function (i, j) {
51
- return ((i * j) % 3 + (i + j) % 2) % 2 == 0;
52
- }
53
- ];
54
- return function (maskPattern) {
55
- var fn = QRMaskFunctions[maskPattern];
56
- if (!fn) throw new Error('maskPattern:' + maskPattern);
57
- return fn;
58
- }
59
- }());
60
-
61
- // 获取数据块长度
62
- var getLengthInBits = (function () {
63
- // 各模式数据块长度
64
- var BITS_LENGTH_LIST = {}
65
- BITS_LENGTH_LIST[QRMode.MODE_NUMBER] = [10, 12, 14];
66
- BITS_LENGTH_LIST[QRMode.MODE_ALPHA_NUM] = [9, 11, 13];
67
- BITS_LENGTH_LIST[QRMode.MODE_8BIT_BYTE] = [8, 16, 16];
68
- BITS_LENGTH_LIST[QRMode.MODE_KANJI] = [8, 10, 12];
69
-
70
- return function (mode, type) {
71
- if (1 <= type && type <= 40) {
72
- var lengths = BITS_LENGTH_LIST[mode];
73
- if (!lengths) throw 'mode:' + mode;
74
- var index = type <= 9 ? 0 :
75
- type <= 26 ? 1 :
76
- 2;
77
- return lengths[index];
78
- } else {
79
- throw new Error('type:' + type);
80
- }
81
- }
82
- }());
83
-
84
- // 通过矩阵获取,版本
85
- var map2typeNumber = function (map) {
86
- return (map.length - 17) / 4;
87
- }
88
-
89
- var G15 = (1 << 10) | (1 << 8) | (1 << 5) | (1 << 4) | (1 << 2) | (1 << 1) | (1 << 0);
90
- var G18 = (1 << 12) | (1 << 11) | (1 << 10) | (1 << 9) | (1 << 8) | (1 << 5) | (1 << 2) | (1 << 0);
91
- var G15_MASK = (1 << 14) | (1 << 12) | (1 << 10) | (1 << 4) | (1 << 1);
92
-
93
- var getBCHDigit = function (data) {
94
- var digit = 0;
95
- while (data != 0) {
96
- digit++;
97
- data >>>= 1;
98
- }
99
- return digit;
100
- };
101
-
102
- var getBCHTypeInfo = function (data) {
103
- var d = data << 10;
104
- while (getBCHDigit(d) - getBCHDigit(G15) >= 0) {
105
- d ^= (G15 << (getBCHDigit(d) - getBCHDigit(G15)));
106
- }
107
- return ((data << 10) | d) ^ G15_MASK;
108
- };
109
-
110
- var getBCHTypeNumber = function (data) {
111
- var d = data << 12;
112
- while (getBCHDigit(d) - getBCHDigit(G18) >= 0) {
113
- d ^= (G18 << (getBCHDigit(d) - getBCHDigit(G18)));
114
- }
115
- return (data << 12) | d;
116
- };
117
-
118
- // 模拟Buffer
119
- var qrBitBuffer = function () {
120
-
121
- var _buffer = [];
122
- var _length = 0;
123
- var _this = {};
124
-
125
- _this.getBuffer = function () {
126
- return _buffer;
127
- };
128
-
129
- _this.getAt = function (index) {
130
- var bufIndex = ~~(index / 8);
131
- var bitIndex = 7 - index % 8;
132
- return ((_buffer[bufIndex] >>> bitIndex) & 1) === 1;
133
- };
134
-
135
- _this.put = function (num, length) {
136
- length = ~~length;
137
- if (length < 0) throw new Error('length:' + length)
138
- while (length--) {
139
- _this.putBit(((num >>> length) & 1) === 1);
140
- }
141
- };
142
-
143
- _this.getLengthInBits = function () {
144
- return _length;
145
- };
146
-
147
- _this.putBit = function (bit) {
148
- var bufIndex = ~~(_length / 8);
149
- var bitIndex = 7 - _length % 8;
150
- if (_buffer.length <= bufIndex) {
151
- _buffer.push(0);
152
- }
153
- if (bit) {
154
- _buffer[bufIndex] |= (0x80 >>> (_length % 8));
155
- }
156
- _length += 1;
157
- };
158
-
159
- return _this;
160
- }
161
-
162
- // 填充侦测图
163
- var setupPositionProbePattern = function (map, row, col) {
164
- // var mapLength = map.length;
165
- // for (var r = -1; r <= 7; r++) {
166
- // if (row + r <= -1 || mapLength <= row + r) continue;
167
- // for (var c = -1; c <= 7; c++) {
168
- // if (col + c <= -1 || mapLength <= col + c) continue;
169
- // if ((0 <= r && r <= 6 && (c == 0 || c == 6)) ||
170
- // (0 <= c && c <= 6 && (r == 0 || r == 6)) ||
171
- // (2 <= r && r <= 4 && 2 <= c && c <= 4)) {
172
- // map[row + r][col + c] = true;
173
- // } else {
174
- // map[row + r][col + c] = false;
175
- // }
176
- // }
177
- // }
178
- square_wk(map, row - 1, col - 1, false, 7 + 2);
179
- square_wk(map, row, col, true, 7);
180
- square_wk(map, row + 1, col + 1, false, 7 - 2);
181
- square_fill(map, row + 2, col + 2, true, 3);
182
- };
183
-
184
- //画正方型
185
- var square_wk = function (map, row, col, val, L) {
186
- var mapLength = map.length;
187
- function w(x, y) {
188
- var l = L;
189
- while (--l) {
190
- row += x, col += y;
191
- if (row < 0 || col < 0 || row >= mapLength || col >= mapLength) continue;
192
- map[row][col] = val;
193
- }
194
- }
195
- if (L < 0) return;
196
- (row < 0 || col < 0 || row >= mapLength || col >= mapLength) || (map[row][col] = val);
197
- if (L > 1) {
198
- w(1, 0), w(0, 1), w(-1, 0), w(0, -1);
199
- }
200
- }
201
-
202
- //填充正方型
203
- var square_fill = function (map, row, col, val, L) {
204
- while (L > 0) {
205
- square_wk(map, row++, col++, val, L)
206
- L -= 2;
207
- }
208
- }
209
-
210
- // 填充所有侦测图
211
- var setupAllPositionProbePattern = function (map) {
212
- var mapLength = map.length;
213
- setupPositionProbePattern(map, 0, 0);
214
- setupPositionProbePattern(map, mapLength - 7, 0);
215
- setupPositionProbePattern(map, 0, mapLength - 7);
216
- }
217
-
218
- // 填充校正图
219
- var setupPositionAdjustPattern = (function () {
220
- var PATTERN_POSITION_TABLE = [
221
- [],
222
- [6, 18],
223
- [6, 22],
224
- [6, 26],
225
- [6, 30],
226
- [6, 34],
227
- [6, 22, 38],
228
- [6, 24, 42],
229
- [6, 26, 46],
230
- [6, 28, 50],
231
- [6, 30, 54],
232
- [6, 32, 58],
233
- [6, 34, 62],
234
- [6, 26, 46, 66],
235
- [6, 26, 48, 70],
236
- [6, 26, 50, 74],
237
- [6, 30, 54, 78],
238
- [6, 30, 56, 82],
239
- [6, 30, 58, 86],
240
- [6, 34, 62, 90],
241
- [6, 28, 50, 72, 94],
242
- [6, 26, 50, 74, 98],
243
- [6, 30, 54, 78, 102],
244
- [6, 28, 54, 80, 106],
245
- [6, 32, 58, 84, 110],
246
- [6, 30, 58, 86, 114],
247
- [6, 34, 62, 90, 118],
248
- [6, 26, 50, 74, 98, 122],
249
- [6, 30, 54, 78, 102, 126],
250
- [6, 26, 52, 78, 104, 130],
251
- [6, 30, 56, 82, 108, 134],
252
- [6, 34, 60, 86, 112, 138],
253
- [6, 30, 58, 86, 114, 142],
254
- [6, 34, 62, 90, 118, 146],
255
- [6, 30, 54, 78, 102, 126, 150],
256
- [6, 24, 50, 76, 102, 128, 154],
257
- [6, 28, 54, 80, 106, 132, 158],
258
- [6, 32, 58, 84, 110, 136, 162],
259
- [6, 26, 54, 82, 110, 138, 166],
260
- [6, 30, 58, 86, 114, 142, 170]
261
- ];
262
- return function (map, typeNumber) {
263
- typeNumber = typeNumber || map2typeNumber(map);
264
- var pos = PATTERN_POSITION_TABLE[typeNumber - 1];
265
- for (var i = 0; i < pos.length; i++) {
266
- for (var j = 0; j < pos.length; j++) {
267
- var row = pos[i];
268
- var col = pos[j];
269
- if (map[row][col] != null) continue;
270
- for (var r = -2; r <= 2; r++) {
271
- for (var c = -2; c <= 2; c++) {
272
- if (r == -2 || r == 2 || c == -2 || c == 2 ||
273
- (r == 0 && c == 0)) {
274
- map[row + r][col + c] = true;
275
- } else {
276
- map[row + r][col + c] = false;
277
- }
278
- }
279
- }
280
- }
281
- }
282
- }
283
- }());
284
-
285
- // 填充定位图
286
- var setupTimingPattern = function (map) {
287
- var mapLength = map.length;
288
- for (var r = 8; r < mapLength - 8; r += 1) {
289
- if (map[r][6] != null) {
290
- continue;
291
- }
292
- map[r][6] = (r % 2 == 0);
293
- }
294
- for (var c = 8; c < mapLength - 8; c += 1) {
295
- if (map[6][c] != null) {
296
- continue;
297
- }
298
- map[6][c] = (c % 2 == 0);
299
- }
300
- };
301
-
302
- // 填充格式信息
303
- var setupTypeInfo = function (map, test, errorCorrectionLevel, maskPattern) {
304
- var mapLength = map.length;
305
- var data = (errorCorrectionLevel << 3) | maskPattern;
306
- var bits = getBCHTypeInfo(data);
307
- // vertical
308
- for (var i = 0; i < 15; i += 1) {
309
- var mod = (!test && ((bits >> i) & 1) == 1);
310
- if (i < 6) {
311
- map[i][8] = mod;
312
- } else if (i < 8) {
313
- map[i + 1][8] = mod;
314
- } else {
315
- map[mapLength - 15 + i][8] = mod;
316
- }
317
- }
318
-
319
- // horizontal
320
- for (var i = 0; i < 15; i += 1) {
321
- var mod = (!test && ((bits >> i) & 1) == 1);
322
- if (i < 8) {
323
- map[8][mapLength - i - 1] = mod;
324
- } else if (i < 9) {
325
- map[8][15 - i - 1 + 1] = mod;
326
- } else {
327
- map[8][15 - i - 1] = mod;
328
- }
329
- }
330
-
331
- // fixed module
332
- map[mapLength - 8][8] = (!test);
333
- };
334
-
335
- // 填充版本信息
336
- var setupTypeNumber = function (map, test, typeNumber) {
337
- typeNumber = typeNumber || map2typeNumber(map);
338
- var mapLength = map.length;
339
- var bits = getBCHTypeNumber(typeNumber);
340
- for (var i = 0; i < 18; i += 1) {
341
- var mod = (!test && ((bits >> i) & 1) == 1);
342
- map[Math.floor(i / 3)][i % 3 + mapLength - 8 - 3] = mod;
343
- }
344
- for (var i = 0; i < 18; i += 1) {
345
- var mod = (!test && ((bits >> i) & 1) == 1);
346
- map[i % 3 + mapLength - 8 - 3][Math.floor(i / 3)] = mod;
347
- }
348
- };
349
-
350
- // 生成空矩阵
351
- function mapInit(size) {
352
- try{
353
- var map = [],
354
- emptyArr = [];
355
- emptyArr.length = size;
356
- while (size--) {
357
- map.push(emptyArr.slice(0));
358
- }
359
- return map;
360
-
361
- }catch(e){
362
- console.log(size);
363
- }
364
- }
365
-
366
- // 拷贝矩阵
367
- function copyMap(map) {
368
- return map.map(function (v) {
369
- return v.slice(0);
370
- })
371
- }
372
-
373
- function compareMap(map, map1, type) {
374
- type = type || "and";
375
- var nMap = [];
376
- var fn = function () {
377
- switch (type) {
378
- case 'or':
379
- case '|':
380
- return function (r, c) {
381
- var a = map[r][c],b = map1[r][c];
382
- if(a || b){return true}
383
- if(a === false || b === false){return false}
384
- // return map[r][c] || map1[r][c];
385
- }
386
- case 'xor':
387
- case '^':
388
- return function (r, c) {
389
- var a = map[r][c],b = map1[r][c];
390
- if(a !== b){ return a || b}
391
- // return !map[r][c] != !map1[r][c];
392
- }
393
- case 'and':
394
- case '&':
395
- return function (r, c) {
396
- var a = map[r][c],b = map1[r][c];
397
- if(a && b){return true}
398
- if(a === false && b === false){return false}
399
- // return map[r][c] && map1[r][c];
400
- }
401
- default:
402
- throw 'type err!'
403
- }
404
- }();
405
- for (var r = 0; r < map.length; r++) {
406
- nMap[r] = [];
407
- for (var c = 0; c < map.length; c++) {
408
- nMap[r][c] = fn(r, c);
409
- }
410
- }
411
- return nMap;
412
- }
413
-
414
- // 获取数据块信息
415
- var getRSBlocks = (function () {
416
- var RS_BLOCK_TABLE = [
417
-
418
- // L
419
- // M
420
- // Q
421
- // H
422
-
423
- // 1
424
- [1, 26, 19],
425
- [1, 26, 16],
426
- [1, 26, 13],
427
- [1, 26, 9],
428
-
429
- // 2
430
- [1, 44, 34],
431
- [1, 44, 28],
432
- [1, 44, 22],
433
- [1, 44, 16],
434
-
435
- // 3
436
- [1, 70, 55],
437
- [1, 70, 44],
438
- [2, 35, 17],
439
- [2, 35, 13],
440
-
441
- // 4
442
- [1, 100, 80],
443
- [2, 50, 32],
444
- [2, 50, 24],
445
- [4, 25, 9],
446
-
447
- // 5
448
- [1, 134, 108],
449
- [2, 67, 43],
450
- [2, 33, 15, 2, 34, 16],
451
- [2, 33, 11, 2, 34, 12],
452
-
453
- // 6
454
- [2, 86, 68],
455
- [4, 43, 27],
456
- [4, 43, 19],
457
- [4, 43, 15],
458
-
459
- // 7
460
- [2, 98, 78],
461
- [4, 49, 31],
462
- [2, 32, 14, 4, 33, 15],
463
- [4, 39, 13, 1, 40, 14],
464
-
465
- // 8
466
- [2, 121, 97],
467
- [2, 60, 38, 2, 61, 39],
468
- [4, 40, 18, 2, 41, 19],
469
- [4, 40, 14, 2, 41, 15],
470
-
471
- // 9
472
- [2, 146, 116],
473
- [3, 58, 36, 2, 59, 37],
474
- [4, 36, 16, 4, 37, 17],
475
- [4, 36, 12, 4, 37, 13],
476
-
477
- // 10
478
- [2, 86, 68, 2, 87, 69],
479
- [4, 69, 43, 1, 70, 44],
480
- [6, 43, 19, 2, 44, 20],
481
- [6, 43, 15, 2, 44, 16],
482
-
483
- // 11
484
- [4, 101, 81],
485
- [1, 80, 50, 4, 81, 51],
486
- [4, 50, 22, 4, 51, 23],
487
- [3, 36, 12, 8, 37, 13],
488
-
489
- // 12
490
- [2, 116, 92, 2, 117, 93],
491
- [6, 58, 36, 2, 59, 37],
492
- [4, 46, 20, 6, 47, 21],
493
- [7, 42, 14, 4, 43, 15],
494
-
495
- // 13
496
- [4, 133, 107],
497
- [8, 59, 37, 1, 60, 38],
498
- [8, 44, 20, 4, 45, 21],
499
- [12, 33, 11, 4, 34, 12],
500
-
501
- // 14
502
- [3, 145, 115, 1, 146, 116],
503
- [4, 64, 40, 5, 65, 41],
504
- [11, 36, 16, 5, 37, 17],
505
- [11, 36, 12, 5, 37, 13],
506
-
507
- // 15
508
- [5, 109, 87, 1, 110, 88],
509
- [5, 65, 41, 5, 66, 42],
510
- [5, 54, 24, 7, 55, 25],
511
- [11, 36, 12, 7, 37, 13],
512
-
513
- // 16
514
- [5, 122, 98, 1, 123, 99],
515
- [7, 73, 45, 3, 74, 46],
516
- [15, 43, 19, 2, 44, 20],
517
- [3, 45, 15, 13, 46, 16],
518
-
519
- // 17
520
- [1, 135, 107, 5, 136, 108],
521
- [10, 74, 46, 1, 75, 47],
522
- [1, 50, 22, 15, 51, 23],
523
- [2, 42, 14, 17, 43, 15],
524
-
525
- // 18
526
- [5, 150, 120, 1, 151, 121],
527
- [9, 69, 43, 4, 70, 44],
528
- [17, 50, 22, 1, 51, 23],
529
- [2, 42, 14, 19, 43, 15],
530
-
531
- // 19
532
- [3, 141, 113, 4, 142, 114],
533
- [3, 70, 44, 11, 71, 45],
534
- [17, 47, 21, 4, 48, 22],
535
- [9, 39, 13, 16, 40, 14],
536
-
537
- // 20
538
- [3, 135, 107, 5, 136, 108],
539
- [3, 67, 41, 13, 68, 42],
540
- [15, 54, 24, 5, 55, 25],
541
- [15, 43, 15, 10, 44, 16],
542
-
543
- // 21
544
- [4, 144, 116, 4, 145, 117],
545
- [17, 68, 42],
546
- [17, 50, 22, 6, 51, 23],
547
- [19, 46, 16, 6, 47, 17],
548
-
549
- // 22
550
- [2, 139, 111, 7, 140, 112],
551
- [17, 74, 46],
552
- [7, 54, 24, 16, 55, 25],
553
- [34, 37, 13],
554
-
555
- // 23
556
- [4, 151, 121, 5, 152, 122],
557
- [4, 75, 47, 14, 76, 48],
558
- [11, 54, 24, 14, 55, 25],
559
- [16, 45, 15, 14, 46, 16],
560
-
561
- // 24
562
- [6, 147, 117, 4, 148, 118],
563
- [6, 73, 45, 14, 74, 46],
564
- [11, 54, 24, 16, 55, 25],
565
- [30, 46, 16, 2, 47, 17],
566
-
567
- // 25
568
- [8, 132, 106, 4, 133, 107],
569
- [8, 75, 47, 13, 76, 48],
570
- [7, 54, 24, 22, 55, 25],
571
- [22, 45, 15, 13, 46, 16],
572
-
573
- // 26
574
- [10, 142, 114, 2, 143, 115],
575
- [19, 74, 46, 4, 75, 47],
576
- [28, 50, 22, 6, 51, 23],
577
- [33, 46, 16, 4, 47, 17],
578
-
579
- // 27
580
- [8, 152, 122, 4, 153, 123],
581
- [22, 73, 45, 3, 74, 46],
582
- [8, 53, 23, 26, 54, 24],
583
- [12, 45, 15, 28, 46, 16],
584
-
585
- // 28
586
- [3, 147, 117, 10, 148, 118],
587
- [3, 73, 45, 23, 74, 46],
588
- [4, 54, 24, 31, 55, 25],
589
- [11, 45, 15, 31, 46, 16],
590
-
591
- // 29
592
- [7, 146, 116, 7, 147, 117],
593
- [21, 73, 45, 7, 74, 46],
594
- [1, 53, 23, 37, 54, 24],
595
- [19, 45, 15, 26, 46, 16],
596
-
597
- // 30
598
- [5, 145, 115, 10, 146, 116],
599
- [19, 75, 47, 10, 76, 48],
600
- [15, 54, 24, 25, 55, 25],
601
- [23, 45, 15, 25, 46, 16],
602
-
603
- // 31
604
- [13, 145, 115, 3, 146, 116],
605
- [2, 74, 46, 29, 75, 47],
606
- [42, 54, 24, 1, 55, 25],
607
- [23, 45, 15, 28, 46, 16],
608
-
609
- // 32
610
- [17, 145, 115],
611
- [10, 74, 46, 23, 75, 47],
612
- [10, 54, 24, 35, 55, 25],
613
- [19, 45, 15, 35, 46, 16],
614
-
615
- // 33
616
- [17, 145, 115, 1, 146, 116],
617
- [14, 74, 46, 21, 75, 47],
618
- [29, 54, 24, 19, 55, 25],
619
- [11, 45, 15, 46, 46, 16],
620
-
621
- // 34
622
- [13, 145, 115, 6, 146, 116],
623
- [14, 74, 46, 23, 75, 47],
624
- [44, 54, 24, 7, 55, 25],
625
- [59, 46, 16, 1, 47, 17],
626
-
627
- // 35
628
- [12, 151, 121, 7, 152, 122],
629
- [12, 75, 47, 26, 76, 48],
630
- [39, 54, 24, 14, 55, 25],
631
- [22, 45, 15, 41, 46, 16],
632
-
633
- // 36
634
- [6, 151, 121, 14, 152, 122],
635
- [6, 75, 47, 34, 76, 48],
636
- [46, 54, 24, 10, 55, 25],
637
- [2, 45, 15, 64, 46, 16],
638
-
639
- // 37
640
- [17, 152, 122, 4, 153, 123],
641
- [29, 74, 46, 14, 75, 47],
642
- [49, 54, 24, 10, 55, 25],
643
- [24, 45, 15, 46, 46, 16],
644
-
645
- // 38
646
- [4, 152, 122, 18, 153, 123],
647
- [13, 74, 46, 32, 75, 47],
648
- [48, 54, 24, 14, 55, 25],
649
- [42, 45, 15, 32, 46, 16],
650
-
651
- // 39
652
- [20, 147, 117, 4, 148, 118],
653
- [40, 75, 47, 7, 76, 48],
654
- [43, 54, 24, 22, 55, 25],
655
- [10, 45, 15, 67, 46, 16],
656
-
657
- // 40
658
- [19, 148, 118, 6, 149, 119],
659
- [18, 75, 47, 31, 76, 48],
660
- [34, 54, 24, 34, 55, 25],
661
- [20, 45, 15, 61, 46, 16]
662
- ];
663
-
664
- var qrRSBlock = function (totalCount, dataCount) {
665
- return {
666
- "totalCount": totalCount,
667
- "dataCount": dataCount
668
- }
669
- };
670
-
671
- var getRsBlockTable = function (typeNumber, errorCorrectionLevel) {
672
- switch (errorCorrectionLevel) {
673
- case QRErrorCorrectionLevel.L:
674
- return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 0];
675
- case QRErrorCorrectionLevel.M:
676
- return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 1];
677
- case QRErrorCorrectionLevel.Q:
678
- return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 2];
679
- case QRErrorCorrectionLevel.H:
680
- return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 3];
681
- default:
682
- throw 'bad rs block @ typeNumber:' + typeNumber + '/errorCorrectionLevel:' + errorCorrectionLevel;
683
- }
684
- };
685
-
686
- return function (typeNumber, errorCorrectionLevel) {
687
- var rsBlock = getRsBlockTable(typeNumber, errorCorrectionLevel);
688
- var length = rsBlock.length / 3;
689
- var list = [];
690
- for (var i = 0; i < length; i += 1) {
691
-
692
- var count = rsBlock[i * 3 + 0];
693
- var totalCount = rsBlock[i * 3 + 1];
694
- var dataCount = rsBlock[i * 3 + 2];
695
-
696
- for (var j = 0; j < count; j += 1) {
697
- list.push(qrRSBlock(totalCount, dataCount));
698
- }
699
- }
700
- return list;
701
- };
702
- }());
703
-
704
- // 矩阵分布评分 (筛选最优掩模方案)
705
- var getLostPoint = function (map) {
706
- var moduleCount = map.length;
707
- var lostPoint = 0;
708
- var isDark = function (row, col) {
709
- return map[row][col];
710
- }
711
-
712
- // LEVEL1
713
- for (var row = 0; row < moduleCount; row += 1) {
714
- for (var col = 0; col < moduleCount; col += 1) {
715
- var sameCount = 0;
716
- var dark = isDark(row, col);
717
- for (var r = -1; r <= 1; r += 1) {
718
- if (row + r < 0 || moduleCount <= row + r) {
719
- continue;
720
- }
721
- for (var c = -1; c <= 1; c += 1) {
722
- if (col + c < 0 || moduleCount <= col + c) {
723
- continue;
724
- }
725
- if (r == 0 && c == 0) {
726
- continue;
727
- }
728
- if (dark == isDark(row + r, col + c)) {
729
- sameCount += 1;
730
- }
731
- }
732
- }
733
- if (sameCount > 5) {
734
- lostPoint += (3 + sameCount - 5);
735
- }
736
- }
737
- };
738
-
739
- // LEVEL2
740
- for (var row = 0; row < moduleCount - 1; row += 1) {
741
- for (var col = 0; col < moduleCount - 1; col += 1) {
742
- var count = 0;
743
- if (isDark(row, col)) count += 1;
744
- if (isDark(row + 1, col)) count += 1;
745
- if (isDark(row, col + 1)) count += 1;
746
- if (isDark(row + 1, col + 1)) count += 1;
747
- if (count == 0 || count == 4) {
748
- lostPoint += 3;
749
- }
750
- }
751
- }
752
-
753
- // LEVEL3
754
- for (var row = 0; row < moduleCount; row += 1) {
755
- for (var col = 0; col < moduleCount - 6; col += 1) {
756
- if (isDark(row, col) &&
757
- !isDark(row, col + 1) &&
758
- isDark(row, col + 2) &&
759
- isDark(row, col + 3) &&
760
- isDark(row, col + 4) &&
761
- !isDark(row, col + 5) &&
762
- isDark(row, col + 6)) {
763
- lostPoint += 40;
764
- }
765
- }
766
- }
767
-
768
- for (var col = 0; col < moduleCount; col += 1) {
769
- for (var row = 0; row < moduleCount - 6; row += 1) {
770
- if (isDark(row, col) &&
771
- !isDark(row + 1, col) &&
772
- isDark(row + 2, col) &&
773
- isDark(row + 3, col) &&
774
- isDark(row + 4, col) &&
775
- !isDark(row + 5, col) &&
776
- isDark(row + 6, col)) {
777
- lostPoint += 40;
778
- }
779
- }
780
- }
781
-
782
- // LEVEL4
783
-
784
- var darkCount = 0;
785
-
786
- for (var col = 0; col < moduleCount; col += 1) {
787
- for (var row = 0; row < moduleCount; row += 1) {
788
- if (isDark(row, col)) {
789
- darkCount += 1;
790
- }
791
- }
792
- }
793
-
794
- var ratio = Math.abs(100 * darkCount / moduleCount / moduleCount - 50) / 5;
795
- lostPoint += ratio * 10;
796
-
797
- return lostPoint;
798
- };
799
-
800
- var getErrorCorrectPolynomial = function (errorCorrectLength) {
801
- var a = qrPolynomial([1], 0);
802
- for (var i = 0; i < errorCorrectLength; i += 1) {
803
- a = a.multiply(qrPolynomial([1, QRMath.gexp(i)], 0));
804
- }
805
- return a;
806
- };
807
-
808
- var qrPolynomial = function (num, shift) {
809
-
810
- if (typeof num.length == 'undefined') {
811
- throw num.length + '/' + shift;
812
- }
813
-
814
- var _num = function () {
815
- var offset = 0;
816
- while (offset < num.length && num[offset] == 0) {
817
- offset += 1;
818
- }
819
- var _num = new Array(num.length - offset + shift);
820
- for (var i = 0; i < num.length - offset; i += 1) {
821
- _num[i] = num[i + offset];
822
- }
823
- return _num;
824
- }();
825
-
826
- var _this = {};
827
-
828
- _this.getAt = function (index) {
829
- return _num[index];
830
- };
831
-
832
- _this.getLength = function () {
833
- return _num.length;
834
- };
835
-
836
- _this.multiply = function (e) {
837
-
838
- var num = new Array(_this.getLength() + e.getLength() - 1);
839
-
840
- for (var i = 0; i < _this.getLength(); i += 1) {
841
- for (var j = 0; j < e.getLength(); j += 1) {
842
- num[i + j] ^= QRMath.gexp(QRMath.glog(_this.getAt(i)) + QRMath.glog(e.getAt(j)));
843
- }
844
- }
845
-
846
- return qrPolynomial(num, 0);
847
- };
848
-
849
- _this.mod = function (e) {
850
-
851
- if (_this.getLength() - e.getLength() < 0) {
852
- return _this;
853
- }
854
-
855
- var ratio = QRMath.glog(_this.getAt(0)) - QRMath.glog(e.getAt(0));
856
-
857
- var num = new Array(_this.getLength());
858
- for (var i = 0; i < _this.getLength(); i += 1) {
859
- num[i] = _this.getAt(i);
860
- }
861
-
862
- for (var i = 0; i < e.getLength(); i += 1) {
863
- num[i] ^= QRMath.gexp(QRMath.glog(e.getAt(i)) + ratio);
864
- }
865
-
866
- // recursive call
867
- return qrPolynomial(num, 0).mod(e);
868
- };
869
-
870
- return _this;
871
- };
872
-
873
- var QRMath = (function () {
874
-
875
- var EXP_TABLE = new Array(256);
876
- var LOG_TABLE = new Array(256);
877
-
878
- // initialize tables
879
- for (var i = 0; i < 8; i += 1) {
880
- EXP_TABLE[i] = 1 << i;
881
- }
882
- for (var i = 8; i < 256; i += 1) {
883
- EXP_TABLE[i] = EXP_TABLE[i - 4] ^
884
- EXP_TABLE[i - 5] ^
885
- EXP_TABLE[i - 6] ^
886
- EXP_TABLE[i - 8];
887
- }
888
- for (var i = 0; i < 255; i += 1) {
889
- LOG_TABLE[EXP_TABLE[i]] = i;
890
- }
891
-
892
- var _this = {};
893
-
894
- _this.glog = function (n) {
895
-
896
- if (n < 1) {
897
- throw 'glog(' + n + ')';
898
- }
899
-
900
- return LOG_TABLE[n];
901
- };
902
-
903
- _this.gexp = function (n) {
904
-
905
- while (n < 0) {
906
- n += 255;
907
- }
908
-
909
- while (n >= 256) {
910
- n -= 255;
911
- }
912
-
913
- return EXP_TABLE[n];
914
- };
915
-
916
- return _this;
917
- }());
918
-
919
- var createBytes = function (buffer, rsBlocks) {
920
- var offset = 0;
921
- var maxDcCount = 0;
922
- var maxEcCount = 0;
923
-
924
- var dcdata = new Array(rsBlocks.length);
925
- var ecdata = new Array(rsBlocks.length);
926
-
927
- for (var r = 0; r < rsBlocks.length; r += 1) {
928
- var dcCount = rsBlocks[r].dataCount;
929
- var ecCount = rsBlocks[r].totalCount - dcCount;
930
-
931
- maxDcCount = Math.max(maxDcCount, dcCount);
932
- maxEcCount = Math.max(maxEcCount, ecCount);
933
-
934
- dcdata[r] = new Array(dcCount);
935
- for (var i = 0; i < dcdata[r].length; i += 1) {
936
- dcdata[r][i] = 0xff & buffer.getBuffer()[i + offset];
937
- }
938
- offset += dcCount;
939
-
940
- var rsPoly = getErrorCorrectPolynomial(ecCount);
941
- var rawPoly = qrPolynomial(dcdata[r], rsPoly.getLength() - 1);
942
-
943
- var modPoly = rawPoly.mod(rsPoly);
944
- ecdata[r] = new Array(rsPoly.getLength() - 1);
945
- for (var i = 0; i < ecdata[r].length; i += 1) {
946
- var modIndex = i + modPoly.getLength() - ecdata[r].length;
947
- ecdata[r][i] = (modIndex >= 0) ? modPoly.getAt(modIndex) : 0;
948
- }
949
- }
950
-
951
- var totalCodeCount = 0;
952
- for (var i = 0; i < rsBlocks.length; i += 1) {
953
- totalCodeCount += rsBlocks[i].totalCount;
954
- }
955
-
956
- var data = new Array(totalCodeCount);
957
- var index = 0;
958
-
959
- for (var i = 0; i < maxDcCount; i += 1) {
960
- for (var r = 0; r < rsBlocks.length; r += 1) {
961
- if (i < dcdata[r].length) {
962
- data[index] = dcdata[r][i];
963
- index += 1;
964
- }
965
- }
966
- }
967
-
968
- for (var i = 0; i < maxEcCount; i += 1) {
969
- for (var r = 0; r < rsBlocks.length; r += 1) {
970
- if (i < ecdata[r].length) {
971
- data[index] = ecdata[r][i];
972
- index += 1;
973
- }
974
- }
975
- }
976
-
977
- return data;
978
- };
979
-
980
- var _createData = function (buffer, rsBlocks) {
981
- var PAD0 = 0xEC;
982
- var PAD1 = 0x11;
983
-
984
- // calc num max data.
985
- var totalDataCount = 0;
986
- for (var i = 0; i < rsBlocks.length; i += 1) {
987
- totalDataCount += rsBlocks[i].dataCount;
988
- }
989
-
990
- if (buffer.getLengthInBits() > totalDataCount * 8) {
991
- throw 'code length overflow. (' +
992
- buffer.getLengthInBits() +
993
- '>' +
994
- totalDataCount * 8 +
995
- ')';
996
- }
997
-
998
- // end code
999
- if (buffer.getLengthInBits() + 4 <= totalDataCount * 8) {
1000
- buffer.put(0, 4);
1001
- }
1002
-
1003
- // padding
1004
- while (buffer.getLengthInBits() % 8 != 0) {
1005
- buffer.putBit(false);
1006
- }
1007
-
1008
- // padding
1009
- while (true) {
1010
-
1011
- if (buffer.getLengthInBits() >= totalDataCount * 8) {
1012
- break;
1013
- }
1014
- buffer.put(PAD0, 8);
1015
-
1016
- if (buffer.getLengthInBits() >= totalDataCount * 8) {
1017
- break;
1018
- }
1019
- buffer.put(PAD1, 8);
1020
- }
1021
-
1022
- return createBytes(buffer, rsBlocks);
1023
- };
1024
-
1025
- var createDataForBytes = function (typeNumber, errorCorrectionLevel, byteArray, mode) {
1026
- var rsBlocks = getRSBlocks(typeNumber, errorCorrectionLevel);
1027
- var buffer = qrBitBuffer();
1028
- var data = byteArray;
1029
- buffer.put(mode, 4);
1030
- buffer.put(data.length, getLengthInBits(mode, typeNumber));
1031
- for (var i = 0; i < data.length; i++) {
1032
- buffer.put(data[i], 8)
1033
- }
1034
- return _createData(buffer, rsBlocks);
1035
- };
1036
-
1037
- var createDataForModes = function (typeNumber, errorCorrectionLevel, dataList) {
1038
- var rsBlocks = getRSBlocks(typeNumber, errorCorrectionLevel);
1039
- var buffer = qrBitBuffer();
1040
- for (var i = 0; i < dataList.length; i += 1) {
1041
- var data = dataList[i];
1042
- buffer.put(data.getMode(), 4);
1043
- buffer.put(data.getLength(), getLengthInBits(data.getMode(), typeNumber));
1044
- data.write(buffer);
1045
- }
1046
- return _createData(buffer, rsBlocks);
1047
- };
1048
-
1049
- var createData = function (typeNumber, errorCorrectionLevel, byteArray, mode) {
1050
- var cb = mode ? createDataForBytes : createDataForModes;
1051
- return cb.apply(null, arguments)
1052
- }
1053
-
1054
- var mapData = function (map, data, maskPattern) {
1055
- var _moduleCount = map.length;
1056
- var inc = -1;
1057
- var row = _moduleCount - 1;
1058
- var bitIndex = 7;
1059
- var byteIndex = 0;
1060
- var maskFunc = getQRMaskFunction(maskPattern);
1061
-
1062
- for (var col = _moduleCount - 1; col > 0; col -= 2) {
1063
- if (col == 6) col -= 1;
1064
- while (true) {
1065
- for (var c = 0; c < 2; c += 1) {
1066
- if (map[row][col - c] == null) {
1067
- var dark = false;
1068
- if (byteIndex < data.length) {
1069
- dark = (((data[byteIndex] >>> bitIndex) & 1) == 1);
1070
- }
1071
- var mask = maskFunc(row, col - c);
1072
- if (mask) {
1073
- dark = !dark;
1074
- }
1075
- map[row][col - c] = dark;
1076
- bitIndex -= 1;
1077
- if (bitIndex == -1) {
1078
- byteIndex += 1;
1079
- bitIndex = 7;
1080
- }
1081
- }
1082
- }
1083
- row += inc;
1084
- if (row < 0 || _moduleCount <= row) {
1085
- row -= inc;
1086
- inc = -inc;
1087
- break;
1088
- }
1089
- }
1090
- }
1091
-
1092
- return map;
1093
- };
1094
-
1095
- module.exports = {
1096
- QRMode: QRMode,
1097
- QRErrorCorrectionLevel: QRErrorCorrectionLevel,
1098
- QRMaskPattern: QRMaskPattern,
1099
- qrBitBuffer: qrBitBuffer,
1100
- setupAllPositionProbePattern: setupAllPositionProbePattern,
1101
- setupPositionAdjustPattern: setupPositionAdjustPattern,
1102
- setupTimingPattern: setupTimingPattern,
1103
- setupTypeInfo: setupTypeInfo,
1104
- setupTypeNumber: setupTypeNumber,
1105
- mapInit: mapInit,
1106
- copyMap: copyMap,
1107
- compareMap: compareMap,
1108
- createData: createData,
1109
- mapData: mapData,
1110
- getLengthInBits: getLengthInBits,
1111
- getRSBlocks: getRSBlocks,
1112
- getLostPoint: getLostPoint,
1113
- }