@10yun/cv-mobile-ui 0.5.35 → 0.5.36

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.
@@ -0,0 +1,1295 @@
1
+ //---------------------------------------------------------------------
2
+ // github https://github.com/Sansnn/uQRCode
3
+ //---------------------------------------------------------------------
4
+
5
+ let uQRCode = {};
6
+
7
+ (function () {
8
+ //---------------------------------------------------------------------
9
+ // QRCode for JavaScript
10
+ //
11
+ // Copyright (c) 2009 Kazuhiko Arase
12
+ //
13
+ // URL: http://www.d-project.com/
14
+ //
15
+ // Licensed under the MIT license:
16
+ // http://www.opensource.org/licenses/mit-license.php
17
+ //
18
+ // The word "QR Code" is registered trademark of
19
+ // DENSO WAVE INCORPORATED
20
+ // http://www.denso-wave.com/qrcode/faqpatent-e.html
21
+ //
22
+ //---------------------------------------------------------------------
23
+
24
+ //---------------------------------------------------------------------
25
+ // QR8bitByte
26
+ //---------------------------------------------------------------------
27
+
28
+ function QR8bitByte(data) {
29
+ this.mode = QRMode.MODE_8BIT_BYTE;
30
+ this.data = data;
31
+ }
32
+
33
+ QR8bitByte.prototype = {
34
+ getLength: function (buffer) {
35
+ return this.data.length;
36
+ },
37
+
38
+ write: function (buffer) {
39
+ for (var i = 0; i < this.data.length; i++) {
40
+ // not JIS ...
41
+ buffer.put(this.data.charCodeAt(i), 8);
42
+ }
43
+ }
44
+ };
45
+
46
+ //---------------------------------------------------------------------
47
+ // QRCode
48
+ //---------------------------------------------------------------------
49
+
50
+ function QRCode(typeNumber, errorCorrectLevel) {
51
+ this.typeNumber = typeNumber;
52
+ this.errorCorrectLevel = errorCorrectLevel;
53
+ this.modules = null;
54
+ this.moduleCount = 0;
55
+ this.dataCache = null;
56
+ this.dataList = new Array();
57
+ }
58
+
59
+ QRCode.prototype = {
60
+ addData: function (data) {
61
+ var newData = new QR8bitByte(data);
62
+ this.dataList.push(newData);
63
+ this.dataCache = null;
64
+ },
65
+
66
+ isDark: function (row, col) {
67
+ if (row < 0 || this.moduleCount <= row || col < 0 || this.moduleCount <= col) {
68
+ throw new Error(row + ',' + col);
69
+ }
70
+ return this.modules[row][col];
71
+ },
72
+ getModuleCount: function () {
73
+ return this.moduleCount;
74
+ },
75
+
76
+ make: function () {
77
+ // Calculate automatically typeNumber if provided is < 1
78
+ if (this.typeNumber < 1) {
79
+ var typeNumber = 1;
80
+ for (typeNumber = 1; typeNumber < 40; typeNumber++) {
81
+ var rsBlocks = QRRSBlock.getRSBlocks(typeNumber, this.errorCorrectLevel);
82
+
83
+ var buffer = new QRBitBuffer();
84
+ var totalDataCount = 0;
85
+ for (var i = 0; i < rsBlocks.length; i++) {
86
+ totalDataCount += rsBlocks[i].dataCount;
87
+ }
88
+
89
+ for (var i = 0; i < this.dataList.length; i++) {
90
+ var data = this.dataList[i];
91
+ buffer.put(data.mode, 4);
92
+ buffer.put(data.getLength(), QRUtil.getLengthInBits(data.mode, typeNumber));
93
+ data.write(buffer);
94
+ }
95
+ if (buffer.getLengthInBits() <= totalDataCount * 8) break;
96
+ }
97
+ this.typeNumber = typeNumber;
98
+ }
99
+ this.makeImpl(false, this.getBestMaskPattern());
100
+ },
101
+
102
+ makeImpl: function (test, maskPattern) {
103
+ this.moduleCount = this.typeNumber * 4 + 17;
104
+ this.modules = new Array(this.moduleCount);
105
+
106
+ for (var row = 0; row < this.moduleCount; row++) {
107
+ this.modules[row] = new Array(this.moduleCount);
108
+
109
+ for (var col = 0; col < this.moduleCount; col++) {
110
+ this.modules[row][col] = null; //(col + row) % 3;
111
+ }
112
+ }
113
+
114
+ this.setupPositionProbePattern(0, 0);
115
+ this.setupPositionProbePattern(this.moduleCount - 7, 0);
116
+ this.setupPositionProbePattern(0, this.moduleCount - 7);
117
+ this.setupPositionAdjustPattern();
118
+ this.setupTimingPattern();
119
+ this.setupTypeInfo(test, maskPattern);
120
+
121
+ if (this.typeNumber >= 7) {
122
+ this.setupTypeNumber(test);
123
+ }
124
+
125
+ if (this.dataCache == null) {
126
+ this.dataCache = QRCode.createData(this.typeNumber, this.errorCorrectLevel, this.dataList);
127
+ }
128
+
129
+ this.mapData(this.dataCache, maskPattern);
130
+ },
131
+
132
+ setupPositionProbePattern: function (row, col) {
133
+ for (var r = -1; r <= 7; r++) {
134
+ if (row + r <= -1 || this.moduleCount <= row + r) continue;
135
+
136
+ for (var c = -1; c <= 7; c++) {
137
+ if (col + c <= -1 || this.moduleCount <= col + c) continue;
138
+
139
+ if (
140
+ (0 <= r && r <= 6 && (c == 0 || c == 6)) ||
141
+ (0 <= c && c <= 6 && (r == 0 || r == 6)) ||
142
+ (2 <= r && r <= 4 && 2 <= c && c <= 4)
143
+ ) {
144
+ this.modules[row + r][col + c] = true;
145
+ } else {
146
+ this.modules[row + r][col + c] = false;
147
+ }
148
+ }
149
+ }
150
+ },
151
+
152
+ getBestMaskPattern: function () {
153
+ var minLostPoint = 0;
154
+ var pattern = 0;
155
+
156
+ for (var i = 0; i < 8; i++) {
157
+ this.makeImpl(true, i);
158
+
159
+ var lostPoint = QRUtil.getLostPoint(this);
160
+
161
+ if (i == 0 || minLostPoint > lostPoint) {
162
+ minLostPoint = lostPoint;
163
+ pattern = i;
164
+ }
165
+ }
166
+
167
+ return pattern;
168
+ },
169
+
170
+ createMovieClip: function (target_mc, instance_name, depth) {
171
+ var qr_mc = target_mc.createEmptyMovieClip(instance_name, depth);
172
+ var cs = 1;
173
+
174
+ this.make();
175
+
176
+ for (var row = 0; row < this.modules.length; row++) {
177
+ var y = row * cs;
178
+
179
+ for (var col = 0; col < this.modules[row].length; col++) {
180
+ var x = col * cs;
181
+ var dark = this.modules[row][col];
182
+
183
+ if (dark) {
184
+ qr_mc.beginFill(0, 100);
185
+ qr_mc.moveTo(x, y);
186
+ qr_mc.lineTo(x + cs, y);
187
+ qr_mc.lineTo(x + cs, y + cs);
188
+ qr_mc.lineTo(x, y + cs);
189
+ qr_mc.endFill();
190
+ }
191
+ }
192
+ }
193
+
194
+ return qr_mc;
195
+ },
196
+
197
+ setupTimingPattern: function () {
198
+ for (var r = 8; r < this.moduleCount - 8; r++) {
199
+ if (this.modules[r][6] != null) {
200
+ continue;
201
+ }
202
+ this.modules[r][6] = r % 2 == 0;
203
+ }
204
+
205
+ for (var c = 8; c < this.moduleCount - 8; c++) {
206
+ if (this.modules[6][c] != null) {
207
+ continue;
208
+ }
209
+ this.modules[6][c] = c % 2 == 0;
210
+ }
211
+ },
212
+
213
+ setupPositionAdjustPattern: function () {
214
+ var pos = QRUtil.getPatternPosition(this.typeNumber);
215
+
216
+ for (var i = 0; i < pos.length; i++) {
217
+ for (var j = 0; j < pos.length; j++) {
218
+ var row = pos[i];
219
+ var col = pos[j];
220
+
221
+ if (this.modules[row][col] != null) {
222
+ continue;
223
+ }
224
+
225
+ for (var r = -2; r <= 2; r++) {
226
+ for (var c = -2; c <= 2; c++) {
227
+ if (r == -2 || r == 2 || c == -2 || c == 2 || (r == 0 && c == 0)) {
228
+ this.modules[row + r][col + c] = true;
229
+ } else {
230
+ this.modules[row + r][col + c] = false;
231
+ }
232
+ }
233
+ }
234
+ }
235
+ }
236
+ },
237
+
238
+ setupTypeNumber: function (test) {
239
+ var bits = QRUtil.getBCHTypeNumber(this.typeNumber);
240
+
241
+ for (var i = 0; i < 18; i++) {
242
+ var mod = !test && ((bits >> i) & 1) == 1;
243
+ this.modules[Math.floor(i / 3)][(i % 3) + this.moduleCount - 8 - 3] = mod;
244
+ }
245
+
246
+ for (var i = 0; i < 18; i++) {
247
+ var mod = !test && ((bits >> i) & 1) == 1;
248
+ this.modules[(i % 3) + this.moduleCount - 8 - 3][Math.floor(i / 3)] = mod;
249
+ }
250
+ },
251
+
252
+ setupTypeInfo: function (test, maskPattern) {
253
+ var data = (this.errorCorrectLevel << 3) | maskPattern;
254
+ var bits = QRUtil.getBCHTypeInfo(data);
255
+
256
+ // vertical
257
+ for (var i = 0; i < 15; i++) {
258
+ var mod = !test && ((bits >> i) & 1) == 1;
259
+
260
+ if (i < 6) {
261
+ this.modules[i][8] = mod;
262
+ } else if (i < 8) {
263
+ this.modules[i + 1][8] = mod;
264
+ } else {
265
+ this.modules[this.moduleCount - 15 + i][8] = mod;
266
+ }
267
+ }
268
+
269
+ // horizontal
270
+ for (var i = 0; i < 15; i++) {
271
+ var mod = !test && ((bits >> i) & 1) == 1;
272
+
273
+ if (i < 8) {
274
+ this.modules[8][this.moduleCount - i - 1] = mod;
275
+ } else if (i < 9) {
276
+ this.modules[8][15 - i - 1 + 1] = mod;
277
+ } else {
278
+ this.modules[8][15 - i - 1] = mod;
279
+ }
280
+ }
281
+
282
+ // fixed module
283
+ this.modules[this.moduleCount - 8][8] = !test;
284
+ },
285
+
286
+ mapData: function (data, maskPattern) {
287
+ var inc = -1;
288
+ var row = this.moduleCount - 1;
289
+ var bitIndex = 7;
290
+ var byteIndex = 0;
291
+
292
+ for (var col = this.moduleCount - 1; col > 0; col -= 2) {
293
+ if (col == 6) col--;
294
+
295
+ while (true) {
296
+ for (var c = 0; c < 2; c++) {
297
+ if (this.modules[row][col - c] == null) {
298
+ var dark = false;
299
+
300
+ if (byteIndex < data.length) {
301
+ dark = ((data[byteIndex] >>> bitIndex) & 1) == 1;
302
+ }
303
+
304
+ var mask = QRUtil.getMask(maskPattern, row, col - c);
305
+
306
+ if (mask) {
307
+ dark = !dark;
308
+ }
309
+
310
+ this.modules[row][col - c] = dark;
311
+ bitIndex--;
312
+
313
+ if (bitIndex == -1) {
314
+ byteIndex++;
315
+ bitIndex = 7;
316
+ }
317
+ }
318
+ }
319
+
320
+ row += inc;
321
+
322
+ if (row < 0 || this.moduleCount <= row) {
323
+ row -= inc;
324
+ inc = -inc;
325
+ break;
326
+ }
327
+ }
328
+ }
329
+ }
330
+ };
331
+
332
+ QRCode.PAD0 = 0xec;
333
+ QRCode.PAD1 = 0x11;
334
+
335
+ QRCode.createData = function (typeNumber, errorCorrectLevel, dataList) {
336
+ var rsBlocks = QRRSBlock.getRSBlocks(typeNumber, errorCorrectLevel);
337
+
338
+ var buffer = new QRBitBuffer();
339
+
340
+ for (var i = 0; i < dataList.length; i++) {
341
+ var data = dataList[i];
342
+ buffer.put(data.mode, 4);
343
+ buffer.put(data.getLength(), QRUtil.getLengthInBits(data.mode, typeNumber));
344
+ data.write(buffer);
345
+ }
346
+
347
+ // calc num max data.
348
+ var totalDataCount = 0;
349
+ for (var i = 0; i < rsBlocks.length; i++) {
350
+ totalDataCount += rsBlocks[i].dataCount;
351
+ }
352
+
353
+ if (buffer.getLengthInBits() > totalDataCount * 8) {
354
+ throw new Error('code length overflow. (' + buffer.getLengthInBits() + '>' + totalDataCount * 8 + ')');
355
+ }
356
+
357
+ // end code
358
+ if (buffer.getLengthInBits() + 4 <= totalDataCount * 8) {
359
+ buffer.put(0, 4);
360
+ }
361
+
362
+ // padding
363
+ while (buffer.getLengthInBits() % 8 != 0) {
364
+ buffer.putBit(false);
365
+ }
366
+
367
+ // padding
368
+ while (true) {
369
+ if (buffer.getLengthInBits() >= totalDataCount * 8) {
370
+ break;
371
+ }
372
+ buffer.put(QRCode.PAD0, 8);
373
+
374
+ if (buffer.getLengthInBits() >= totalDataCount * 8) {
375
+ break;
376
+ }
377
+ buffer.put(QRCode.PAD1, 8);
378
+ }
379
+
380
+ return QRCode.createBytes(buffer, rsBlocks);
381
+ };
382
+
383
+ QRCode.createBytes = function (buffer, rsBlocks) {
384
+ var offset = 0;
385
+
386
+ var maxDcCount = 0;
387
+ var maxEcCount = 0;
388
+
389
+ var dcdata = new Array(rsBlocks.length);
390
+ var ecdata = new Array(rsBlocks.length);
391
+
392
+ for (var r = 0; r < rsBlocks.length; r++) {
393
+ var dcCount = rsBlocks[r].dataCount;
394
+ var ecCount = rsBlocks[r].totalCount - dcCount;
395
+
396
+ maxDcCount = Math.max(maxDcCount, dcCount);
397
+ maxEcCount = Math.max(maxEcCount, ecCount);
398
+
399
+ dcdata[r] = new Array(dcCount);
400
+
401
+ for (var i = 0; i < dcdata[r].length; i++) {
402
+ dcdata[r][i] = 0xff & buffer.buffer[i + offset];
403
+ }
404
+ offset += dcCount;
405
+
406
+ var rsPoly = QRUtil.getErrorCorrectPolynomial(ecCount);
407
+ var rawPoly = new QRPolynomial(dcdata[r], rsPoly.getLength() - 1);
408
+
409
+ var modPoly = rawPoly.mod(rsPoly);
410
+ ecdata[r] = new Array(rsPoly.getLength() - 1);
411
+ for (var i = 0; i < ecdata[r].length; i++) {
412
+ var modIndex = i + modPoly.getLength() - ecdata[r].length;
413
+ ecdata[r][i] = modIndex >= 0 ? modPoly.get(modIndex) : 0;
414
+ }
415
+ }
416
+
417
+ var totalCodeCount = 0;
418
+ for (var i = 0; i < rsBlocks.length; i++) {
419
+ totalCodeCount += rsBlocks[i].totalCount;
420
+ }
421
+
422
+ var data = new Array(totalCodeCount);
423
+ var index = 0;
424
+
425
+ for (var i = 0; i < maxDcCount; i++) {
426
+ for (var r = 0; r < rsBlocks.length; r++) {
427
+ if (i < dcdata[r].length) {
428
+ data[index++] = dcdata[r][i];
429
+ }
430
+ }
431
+ }
432
+
433
+ for (var i = 0; i < maxEcCount; i++) {
434
+ for (var r = 0; r < rsBlocks.length; r++) {
435
+ if (i < ecdata[r].length) {
436
+ data[index++] = ecdata[r][i];
437
+ }
438
+ }
439
+ }
440
+
441
+ return data;
442
+ };
443
+
444
+ //---------------------------------------------------------------------
445
+ // QRMode
446
+ //---------------------------------------------------------------------
447
+
448
+ var QRMode = {
449
+ MODE_NUMBER: 1 << 0,
450
+ MODE_ALPHA_NUM: 1 << 1,
451
+ MODE_8BIT_BYTE: 1 << 2,
452
+ MODE_KANJI: 1 << 3
453
+ };
454
+
455
+ //---------------------------------------------------------------------
456
+ // QRErrorCorrectLevel
457
+ //---------------------------------------------------------------------
458
+
459
+ var QRErrorCorrectLevel = {
460
+ L: 1,
461
+ M: 0,
462
+ Q: 3,
463
+ H: 2
464
+ };
465
+
466
+ //---------------------------------------------------------------------
467
+ // QRMaskPattern
468
+ //---------------------------------------------------------------------
469
+
470
+ var QRMaskPattern = {
471
+ PATTERN000: 0,
472
+ PATTERN001: 1,
473
+ PATTERN010: 2,
474
+ PATTERN011: 3,
475
+ PATTERN100: 4,
476
+ PATTERN101: 5,
477
+ PATTERN110: 6,
478
+ PATTERN111: 7
479
+ };
480
+
481
+ //---------------------------------------------------------------------
482
+ // QRUtil
483
+ //---------------------------------------------------------------------
484
+
485
+ var QRUtil = {
486
+ PATTERN_POSITION_TABLE: [
487
+ [],
488
+ [6, 18],
489
+ [6, 22],
490
+ [6, 26],
491
+ [6, 30],
492
+ [6, 34],
493
+ [6, 22, 38],
494
+ [6, 24, 42],
495
+ [6, 26, 46],
496
+ [6, 28, 50],
497
+ [6, 30, 54],
498
+ [6, 32, 58],
499
+ [6, 34, 62],
500
+ [6, 26, 46, 66],
501
+ [6, 26, 48, 70],
502
+ [6, 26, 50, 74],
503
+ [6, 30, 54, 78],
504
+ [6, 30, 56, 82],
505
+ [6, 30, 58, 86],
506
+ [6, 34, 62, 90],
507
+ [6, 28, 50, 72, 94],
508
+ [6, 26, 50, 74, 98],
509
+ [6, 30, 54, 78, 102],
510
+ [6, 28, 54, 80, 106],
511
+ [6, 32, 58, 84, 110],
512
+ [6, 30, 58, 86, 114],
513
+ [6, 34, 62, 90, 118],
514
+ [6, 26, 50, 74, 98, 122],
515
+ [6, 30, 54, 78, 102, 126],
516
+ [6, 26, 52, 78, 104, 130],
517
+ [6, 30, 56, 82, 108, 134],
518
+ [6, 34, 60, 86, 112, 138],
519
+ [6, 30, 58, 86, 114, 142],
520
+ [6, 34, 62, 90, 118, 146],
521
+ [6, 30, 54, 78, 102, 126, 150],
522
+ [6, 24, 50, 76, 102, 128, 154],
523
+ [6, 28, 54, 80, 106, 132, 158],
524
+ [6, 32, 58, 84, 110, 136, 162],
525
+ [6, 26, 54, 82, 110, 138, 166],
526
+ [6, 30, 58, 86, 114, 142, 170]
527
+ ],
528
+
529
+ G15: (1 << 10) | (1 << 8) | (1 << 5) | (1 << 4) | (1 << 2) | (1 << 1) | (1 << 0),
530
+ G18: (1 << 12) | (1 << 11) | (1 << 10) | (1 << 9) | (1 << 8) | (1 << 5) | (1 << 2) | (1 << 0),
531
+ G15_MASK: (1 << 14) | (1 << 12) | (1 << 10) | (1 << 4) | (1 << 1),
532
+
533
+ getBCHTypeInfo: function (data) {
534
+ var d = data << 10;
535
+ while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15) >= 0) {
536
+ d ^= QRUtil.G15 << (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15));
537
+ }
538
+ return ((data << 10) | d) ^ QRUtil.G15_MASK;
539
+ },
540
+
541
+ getBCHTypeNumber: function (data) {
542
+ var d = data << 12;
543
+ while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18) >= 0) {
544
+ d ^= QRUtil.G18 << (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18));
545
+ }
546
+ return (data << 12) | d;
547
+ },
548
+
549
+ getBCHDigit: function (data) {
550
+ var digit = 0;
551
+
552
+ while (data != 0) {
553
+ digit++;
554
+ data >>>= 1;
555
+ }
556
+
557
+ return digit;
558
+ },
559
+
560
+ getPatternPosition: function (typeNumber) {
561
+ return QRUtil.PATTERN_POSITION_TABLE[typeNumber - 1];
562
+ },
563
+
564
+ getMask: function (maskPattern, i, j) {
565
+ switch (maskPattern) {
566
+ case QRMaskPattern.PATTERN000:
567
+ return (i + j) % 2 == 0;
568
+ case QRMaskPattern.PATTERN001:
569
+ return i % 2 == 0;
570
+ case QRMaskPattern.PATTERN010:
571
+ return j % 3 == 0;
572
+ case QRMaskPattern.PATTERN011:
573
+ return (i + j) % 3 == 0;
574
+ case QRMaskPattern.PATTERN100:
575
+ return (Math.floor(i / 2) + Math.floor(j / 3)) % 2 == 0;
576
+ case QRMaskPattern.PATTERN101:
577
+ return ((i * j) % 2) + ((i * j) % 3) == 0;
578
+ case QRMaskPattern.PATTERN110:
579
+ return (((i * j) % 2) + ((i * j) % 3)) % 2 == 0;
580
+ case QRMaskPattern.PATTERN111:
581
+ return (((i * j) % 3) + ((i + j) % 2)) % 2 == 0;
582
+
583
+ default:
584
+ throw new Error('bad maskPattern:' + maskPattern);
585
+ }
586
+ },
587
+
588
+ getErrorCorrectPolynomial: function (errorCorrectLength) {
589
+ var a = new QRPolynomial([1], 0);
590
+
591
+ for (var i = 0; i < errorCorrectLength; i++) {
592
+ a = a.multiply(new QRPolynomial([1, QRMath.gexp(i)], 0));
593
+ }
594
+
595
+ return a;
596
+ },
597
+
598
+ getLengthInBits: function (mode, type) {
599
+ if (1 <= type && type < 10) {
600
+ // 1 - 9
601
+
602
+ switch (mode) {
603
+ case QRMode.MODE_NUMBER:
604
+ return 10;
605
+ case QRMode.MODE_ALPHA_NUM:
606
+ return 9;
607
+ case QRMode.MODE_8BIT_BYTE:
608
+ return 8;
609
+ case QRMode.MODE_KANJI:
610
+ return 8;
611
+ default:
612
+ throw new Error('mode:' + mode);
613
+ }
614
+ } else if (type < 27) {
615
+ // 10 - 26
616
+
617
+ switch (mode) {
618
+ case QRMode.MODE_NUMBER:
619
+ return 12;
620
+ case QRMode.MODE_ALPHA_NUM:
621
+ return 11;
622
+ case QRMode.MODE_8BIT_BYTE:
623
+ return 16;
624
+ case QRMode.MODE_KANJI:
625
+ return 10;
626
+ default:
627
+ throw new Error('mode:' + mode);
628
+ }
629
+ } else if (type < 41) {
630
+ // 27 - 40
631
+
632
+ switch (mode) {
633
+ case QRMode.MODE_NUMBER:
634
+ return 14;
635
+ case QRMode.MODE_ALPHA_NUM:
636
+ return 13;
637
+ case QRMode.MODE_8BIT_BYTE:
638
+ return 16;
639
+ case QRMode.MODE_KANJI:
640
+ return 12;
641
+ default:
642
+ throw new Error('mode:' + mode);
643
+ }
644
+ } else {
645
+ throw new Error('type:' + type);
646
+ }
647
+ },
648
+
649
+ getLostPoint: function (qrCode) {
650
+ var moduleCount = qrCode.getModuleCount();
651
+
652
+ var lostPoint = 0;
653
+
654
+ // LEVEL1
655
+
656
+ for (var row = 0; row < moduleCount; row++) {
657
+ for (var col = 0; col < moduleCount; col++) {
658
+ var sameCount = 0;
659
+ var dark = qrCode.isDark(row, col);
660
+
661
+ for (var r = -1; r <= 1; r++) {
662
+ if (row + r < 0 || moduleCount <= row + r) {
663
+ continue;
664
+ }
665
+
666
+ for (var c = -1; c <= 1; c++) {
667
+ if (col + c < 0 || moduleCount <= col + c) {
668
+ continue;
669
+ }
670
+
671
+ if (r == 0 && c == 0) {
672
+ continue;
673
+ }
674
+
675
+ if (dark == qrCode.isDark(row + r, col + c)) {
676
+ sameCount++;
677
+ }
678
+ }
679
+ }
680
+
681
+ if (sameCount > 5) {
682
+ lostPoint += 3 + sameCount - 5;
683
+ }
684
+ }
685
+ }
686
+
687
+ // LEVEL2
688
+
689
+ for (var row = 0; row < moduleCount - 1; row++) {
690
+ for (var col = 0; col < moduleCount - 1; col++) {
691
+ var count = 0;
692
+ if (qrCode.isDark(row, col)) count++;
693
+ if (qrCode.isDark(row + 1, col)) count++;
694
+ if (qrCode.isDark(row, col + 1)) count++;
695
+ if (qrCode.isDark(row + 1, col + 1)) count++;
696
+ if (count == 0 || count == 4) {
697
+ lostPoint += 3;
698
+ }
699
+ }
700
+ }
701
+
702
+ // LEVEL3
703
+
704
+ for (var row = 0; row < moduleCount; row++) {
705
+ for (var col = 0; col < moduleCount - 6; col++) {
706
+ if (
707
+ qrCode.isDark(row, col) &&
708
+ !qrCode.isDark(row, col + 1) &&
709
+ qrCode.isDark(row, col + 2) &&
710
+ qrCode.isDark(row, col + 3) &&
711
+ qrCode.isDark(row, col + 4) &&
712
+ !qrCode.isDark(row, col + 5) &&
713
+ qrCode.isDark(row, col + 6)
714
+ ) {
715
+ lostPoint += 40;
716
+ }
717
+ }
718
+ }
719
+
720
+ for (var col = 0; col < moduleCount; col++) {
721
+ for (var row = 0; row < moduleCount - 6; row++) {
722
+ if (
723
+ qrCode.isDark(row, col) &&
724
+ !qrCode.isDark(row + 1, col) &&
725
+ qrCode.isDark(row + 2, col) &&
726
+ qrCode.isDark(row + 3, col) &&
727
+ qrCode.isDark(row + 4, col) &&
728
+ !qrCode.isDark(row + 5, col) &&
729
+ qrCode.isDark(row + 6, col)
730
+ ) {
731
+ lostPoint += 40;
732
+ }
733
+ }
734
+ }
735
+
736
+ // LEVEL4
737
+
738
+ var darkCount = 0;
739
+
740
+ for (var col = 0; col < moduleCount; col++) {
741
+ for (var row = 0; row < moduleCount; row++) {
742
+ if (qrCode.isDark(row, col)) {
743
+ darkCount++;
744
+ }
745
+ }
746
+ }
747
+
748
+ var ratio = Math.abs((100 * darkCount) / moduleCount / moduleCount - 50) / 5;
749
+ lostPoint += ratio * 10;
750
+
751
+ return lostPoint;
752
+ }
753
+ };
754
+
755
+ //---------------------------------------------------------------------
756
+ // QRMath
757
+ //---------------------------------------------------------------------
758
+
759
+ var QRMath = {
760
+ glog: function (n) {
761
+ if (n < 1) {
762
+ throw new Error('glog(' + n + ')');
763
+ }
764
+
765
+ return QRMath.LOG_TABLE[n];
766
+ },
767
+
768
+ gexp: function (n) {
769
+ while (n < 0) {
770
+ n += 255;
771
+ }
772
+
773
+ while (n >= 256) {
774
+ n -= 255;
775
+ }
776
+
777
+ return QRMath.EXP_TABLE[n];
778
+ },
779
+
780
+ EXP_TABLE: new Array(256),
781
+
782
+ LOG_TABLE: new Array(256)
783
+ };
784
+
785
+ for (var i = 0; i < 8; i++) {
786
+ QRMath.EXP_TABLE[i] = 1 << i;
787
+ }
788
+ for (var i = 8; i < 256; i++) {
789
+ QRMath.EXP_TABLE[i] = QRMath.EXP_TABLE[i - 4] ^ QRMath.EXP_TABLE[i - 5] ^ QRMath.EXP_TABLE[i - 6] ^ QRMath.EXP_TABLE[i - 8];
790
+ }
791
+ for (var i = 0; i < 255; i++) {
792
+ QRMath.LOG_TABLE[QRMath.EXP_TABLE[i]] = i;
793
+ }
794
+
795
+ //---------------------------------------------------------------------
796
+ // QRPolynomial
797
+ //---------------------------------------------------------------------
798
+
799
+ function QRPolynomial(num, shift) {
800
+ if (num.length == undefined) {
801
+ throw new Error(num.length + '/' + shift);
802
+ }
803
+
804
+ var offset = 0;
805
+
806
+ while (offset < num.length && num[offset] == 0) {
807
+ offset++;
808
+ }
809
+
810
+ this.num = new Array(num.length - offset + shift);
811
+ for (var i = 0; i < num.length - offset; i++) {
812
+ this.num[i] = num[i + offset];
813
+ }
814
+ }
815
+
816
+ QRPolynomial.prototype = {
817
+ get: function (index) {
818
+ return this.num[index];
819
+ },
820
+ getLength: function () {
821
+ return this.num.length;
822
+ },
823
+ multiply: function (e) {
824
+ var num = new Array(this.getLength() + e.getLength() - 1);
825
+ for (var i = 0; i < this.getLength(); i++) {
826
+ for (var j = 0; j < e.getLength(); j++) {
827
+ num[i + j] ^= QRMath.gexp(QRMath.glog(this.get(i)) + QRMath.glog(e.get(j)));
828
+ }
829
+ }
830
+ return new QRPolynomial(num, 0);
831
+ },
832
+ mod: function (e) {
833
+ if (this.getLength() - e.getLength() < 0) {
834
+ return this;
835
+ }
836
+ var ratio = QRMath.glog(this.get(0)) - QRMath.glog(e.get(0));
837
+ var num = new Array(this.getLength());
838
+ for (var i = 0; i < this.getLength(); i++) {
839
+ num[i] = this.get(i);
840
+ }
841
+ for (var i = 0; i < e.getLength(); i++) {
842
+ num[i] ^= QRMath.gexp(QRMath.glog(e.get(i)) + ratio);
843
+ }
844
+ // recursive call
845
+ return new QRPolynomial(num, 0).mod(e);
846
+ }
847
+ };
848
+ //---------------------------------------------------------------------
849
+ // QRRSBlock
850
+ //---------------------------------------------------------------------
851
+ function QRRSBlock(totalCount, dataCount) {
852
+ this.totalCount = totalCount;
853
+ this.dataCount = dataCount;
854
+ }
855
+ QRRSBlock.RS_BLOCK_TABLE = [
856
+ // L
857
+ // M
858
+ // Q
859
+ // H
860
+
861
+ // 1
862
+ [1, 26, 19],
863
+ [1, 26, 16],
864
+ [1, 26, 13],
865
+ [1, 26, 9],
866
+
867
+ // 2
868
+ [1, 44, 34],
869
+ [1, 44, 28],
870
+ [1, 44, 22],
871
+ [1, 44, 16],
872
+
873
+ // 3
874
+ [1, 70, 55],
875
+ [1, 70, 44],
876
+ [2, 35, 17],
877
+ [2, 35, 13],
878
+
879
+ // 4
880
+ [1, 100, 80],
881
+ [2, 50, 32],
882
+ [2, 50, 24],
883
+ [4, 25, 9],
884
+
885
+ // 5
886
+ [1, 134, 108],
887
+ [2, 67, 43],
888
+ [2, 33, 15, 2, 34, 16],
889
+ [2, 33, 11, 2, 34, 12],
890
+
891
+ // 6
892
+ [2, 86, 68],
893
+ [4, 43, 27],
894
+ [4, 43, 19],
895
+ [4, 43, 15],
896
+
897
+ // 7
898
+ [2, 98, 78],
899
+ [4, 49, 31],
900
+ [2, 32, 14, 4, 33, 15],
901
+ [4, 39, 13, 1, 40, 14],
902
+
903
+ // 8
904
+ [2, 121, 97],
905
+ [2, 60, 38, 2, 61, 39],
906
+ [4, 40, 18, 2, 41, 19],
907
+ [4, 40, 14, 2, 41, 15],
908
+
909
+ // 9
910
+ [2, 146, 116],
911
+ [3, 58, 36, 2, 59, 37],
912
+ [4, 36, 16, 4, 37, 17],
913
+ [4, 36, 12, 4, 37, 13],
914
+
915
+ // 10
916
+ [2, 86, 68, 2, 87, 69],
917
+ [4, 69, 43, 1, 70, 44],
918
+ [6, 43, 19, 2, 44, 20],
919
+ [6, 43, 15, 2, 44, 16],
920
+
921
+ // 11
922
+ [4, 101, 81],
923
+ [1, 80, 50, 4, 81, 51],
924
+ [4, 50, 22, 4, 51, 23],
925
+ [3, 36, 12, 8, 37, 13],
926
+
927
+ // 12
928
+ [2, 116, 92, 2, 117, 93],
929
+ [6, 58, 36, 2, 59, 37],
930
+ [4, 46, 20, 6, 47, 21],
931
+ [7, 42, 14, 4, 43, 15],
932
+
933
+ // 13
934
+ [4, 133, 107],
935
+ [8, 59, 37, 1, 60, 38],
936
+ [8, 44, 20, 4, 45, 21],
937
+ [12, 33, 11, 4, 34, 12],
938
+
939
+ // 14
940
+ [3, 145, 115, 1, 146, 116],
941
+ [4, 64, 40, 5, 65, 41],
942
+ [11, 36, 16, 5, 37, 17],
943
+ [11, 36, 12, 5, 37, 13],
944
+
945
+ // 15
946
+ [5, 109, 87, 1, 110, 88],
947
+ [5, 65, 41, 5, 66, 42],
948
+ [5, 54, 24, 7, 55, 25],
949
+ [11, 36, 12],
950
+
951
+ // 16
952
+ [5, 122, 98, 1, 123, 99],
953
+ [7, 73, 45, 3, 74, 46],
954
+ [15, 43, 19, 2, 44, 20],
955
+ [3, 45, 15, 13, 46, 16],
956
+
957
+ // 17
958
+ [1, 135, 107, 5, 136, 108],
959
+ [10, 74, 46, 1, 75, 47],
960
+ [1, 50, 22, 15, 51, 23],
961
+ [2, 42, 14, 17, 43, 15],
962
+
963
+ // 18
964
+ [5, 150, 120, 1, 151, 121],
965
+ [9, 69, 43, 4, 70, 44],
966
+ [17, 50, 22, 1, 51, 23],
967
+ [2, 42, 14, 19, 43, 15],
968
+
969
+ // 19
970
+ [3, 141, 113, 4, 142, 114],
971
+ [3, 70, 44, 11, 71, 45],
972
+ [17, 47, 21, 4, 48, 22],
973
+ [9, 39, 13, 16, 40, 14],
974
+
975
+ // 20
976
+ [3, 135, 107, 5, 136, 108],
977
+ [3, 67, 41, 13, 68, 42],
978
+ [15, 54, 24, 5, 55, 25],
979
+ [15, 43, 15, 10, 44, 16],
980
+
981
+ // 21
982
+ [4, 144, 116, 4, 145, 117],
983
+ [17, 68, 42],
984
+ [17, 50, 22, 6, 51, 23],
985
+ [19, 46, 16, 6, 47, 17],
986
+
987
+ // 22
988
+ [2, 139, 111, 7, 140, 112],
989
+ [17, 74, 46],
990
+ [7, 54, 24, 16, 55, 25],
991
+ [34, 37, 13],
992
+
993
+ // 23
994
+ [4, 151, 121, 5, 152, 122],
995
+ [4, 75, 47, 14, 76, 48],
996
+ [11, 54, 24, 14, 55, 25],
997
+ [16, 45, 15, 14, 46, 16],
998
+
999
+ // 24
1000
+ [6, 147, 117, 4, 148, 118],
1001
+ [6, 73, 45, 14, 74, 46],
1002
+ [11, 54, 24, 16, 55, 25],
1003
+ [30, 46, 16, 2, 47, 17],
1004
+
1005
+ // 25
1006
+ [8, 132, 106, 4, 133, 107],
1007
+ [8, 75, 47, 13, 76, 48],
1008
+ [7, 54, 24, 22, 55, 25],
1009
+ [22, 45, 15, 13, 46, 16],
1010
+
1011
+ // 26
1012
+ [10, 142, 114, 2, 143, 115],
1013
+ [19, 74, 46, 4, 75, 47],
1014
+ [28, 50, 22, 6, 51, 23],
1015
+ [33, 46, 16, 4, 47, 17],
1016
+
1017
+ // 27
1018
+ [8, 152, 122, 4, 153, 123],
1019
+ [22, 73, 45, 3, 74, 46],
1020
+ [8, 53, 23, 26, 54, 24],
1021
+ [12, 45, 15, 28, 46, 16],
1022
+
1023
+ // 28
1024
+ [3, 147, 117, 10, 148, 118],
1025
+ [3, 73, 45, 23, 74, 46],
1026
+ [4, 54, 24, 31, 55, 25],
1027
+ [11, 45, 15, 31, 46, 16],
1028
+
1029
+ // 29
1030
+ [7, 146, 116, 7, 147, 117],
1031
+ [21, 73, 45, 7, 74, 46],
1032
+ [1, 53, 23, 37, 54, 24],
1033
+ [19, 45, 15, 26, 46, 16],
1034
+
1035
+ // 30
1036
+ [5, 145, 115, 10, 146, 116],
1037
+ [19, 75, 47, 10, 76, 48],
1038
+ [15, 54, 24, 25, 55, 25],
1039
+ [23, 45, 15, 25, 46, 16],
1040
+
1041
+ // 31
1042
+ [13, 145, 115, 3, 146, 116],
1043
+ [2, 74, 46, 29, 75, 47],
1044
+ [42, 54, 24, 1, 55, 25],
1045
+ [23, 45, 15, 28, 46, 16],
1046
+
1047
+ // 32
1048
+ [17, 145, 115],
1049
+ [10, 74, 46, 23, 75, 47],
1050
+ [10, 54, 24, 35, 55, 25],
1051
+ [19, 45, 15, 35, 46, 16],
1052
+
1053
+ // 33
1054
+ [17, 145, 115, 1, 146, 116],
1055
+ [14, 74, 46, 21, 75, 47],
1056
+ [29, 54, 24, 19, 55, 25],
1057
+ [11, 45, 15, 46, 46, 16],
1058
+
1059
+ // 34
1060
+ [13, 145, 115, 6, 146, 116],
1061
+ [14, 74, 46, 23, 75, 47],
1062
+ [44, 54, 24, 7, 55, 25],
1063
+ [59, 46, 16, 1, 47, 17],
1064
+
1065
+ // 35
1066
+ [12, 151, 121, 7, 152, 122],
1067
+ [12, 75, 47, 26, 76, 48],
1068
+ [39, 54, 24, 14, 55, 25],
1069
+ [22, 45, 15, 41, 46, 16],
1070
+
1071
+ // 36
1072
+ [6, 151, 121, 14, 152, 122],
1073
+ [6, 75, 47, 34, 76, 48],
1074
+ [46, 54, 24, 10, 55, 25],
1075
+ [2, 45, 15, 64, 46, 16],
1076
+
1077
+ // 37
1078
+ [17, 152, 122, 4, 153, 123],
1079
+ [29, 74, 46, 14, 75, 47],
1080
+ [49, 54, 24, 10, 55, 25],
1081
+ [24, 45, 15, 46, 46, 16],
1082
+
1083
+ // 38
1084
+ [4, 152, 122, 18, 153, 123],
1085
+ [13, 74, 46, 32, 75, 47],
1086
+ [48, 54, 24, 14, 55, 25],
1087
+ [42, 45, 15, 32, 46, 16],
1088
+
1089
+ // 39
1090
+ [20, 147, 117, 4, 148, 118],
1091
+ [40, 75, 47, 7, 76, 48],
1092
+ [43, 54, 24, 22, 55, 25],
1093
+ [10, 45, 15, 67, 46, 16],
1094
+
1095
+ // 40
1096
+ [19, 148, 118, 6, 149, 119],
1097
+ [18, 75, 47, 31, 76, 48],
1098
+ [34, 54, 24, 34, 55, 25],
1099
+ [20, 45, 15, 61, 46, 16]
1100
+ ];
1101
+
1102
+ QRRSBlock.getRSBlocks = function (typeNumber, errorCorrectLevel) {
1103
+ var rsBlock = QRRSBlock.getRsBlockTable(typeNumber, errorCorrectLevel);
1104
+
1105
+ if (rsBlock == undefined) {
1106
+ throw new Error('bad rs block @ typeNumber:' + typeNumber + '/errorCorrectLevel:' + errorCorrectLevel);
1107
+ }
1108
+
1109
+ var length = rsBlock.length / 3;
1110
+
1111
+ var list = new Array();
1112
+
1113
+ for (var i = 0; i < length; i++) {
1114
+ var count = rsBlock[i * 3 + 0];
1115
+ var totalCount = rsBlock[i * 3 + 1];
1116
+ var dataCount = rsBlock[i * 3 + 2];
1117
+
1118
+ for (var j = 0; j < count; j++) {
1119
+ list.push(new QRRSBlock(totalCount, dataCount));
1120
+ }
1121
+ }
1122
+
1123
+ return list;
1124
+ };
1125
+
1126
+ QRRSBlock.getRsBlockTable = function (typeNumber, errorCorrectLevel) {
1127
+ switch (errorCorrectLevel) {
1128
+ case QRErrorCorrectLevel.L:
1129
+ return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 0];
1130
+ case QRErrorCorrectLevel.M:
1131
+ return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 1];
1132
+ case QRErrorCorrectLevel.Q:
1133
+ return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 2];
1134
+ case QRErrorCorrectLevel.H:
1135
+ return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 3];
1136
+ default:
1137
+ return undefined;
1138
+ }
1139
+ };
1140
+
1141
+ //---------------------------------------------------------------------
1142
+ // QRBitBuffer
1143
+ //---------------------------------------------------------------------
1144
+
1145
+ function QRBitBuffer() {
1146
+ this.buffer = new Array();
1147
+ this.length = 0;
1148
+ }
1149
+
1150
+ QRBitBuffer.prototype = {
1151
+ get: function (index) {
1152
+ var bufIndex = Math.floor(index / 8);
1153
+ return ((this.buffer[bufIndex] >>> (7 - (index % 8))) & 1) == 1;
1154
+ },
1155
+
1156
+ put: function (num, length) {
1157
+ for (var i = 0; i < length; i++) {
1158
+ this.putBit(((num >>> (length - i - 1)) & 1) == 1);
1159
+ }
1160
+ },
1161
+
1162
+ getLengthInBits: function () {
1163
+ return this.length;
1164
+ },
1165
+
1166
+ putBit: function (bit) {
1167
+ var bufIndex = Math.floor(this.length / 8);
1168
+ if (this.buffer.length <= bufIndex) {
1169
+ this.buffer.push(0);
1170
+ }
1171
+
1172
+ if (bit) {
1173
+ this.buffer[bufIndex] |= 0x80 >>> this.length % 8;
1174
+ }
1175
+
1176
+ this.length++;
1177
+ }
1178
+ };
1179
+
1180
+ //---------------------------------------------------------------------
1181
+ // Support Chinese
1182
+ //---------------------------------------------------------------------
1183
+ function utf16To8(text) {
1184
+ var result = '';
1185
+ var c;
1186
+ for (var i = 0; i < text.length; i++) {
1187
+ c = text.charCodeAt(i);
1188
+ if (c >= 0x0001 && c <= 0x007f) {
1189
+ result += text.charAt(i);
1190
+ } else if (c > 0x07ff) {
1191
+ result += String.fromCharCode(0xe0 | ((c >> 12) & 0x0f));
1192
+ result += String.fromCharCode(0x80 | ((c >> 6) & 0x3f));
1193
+ result += String.fromCharCode(0x80 | ((c >> 0) & 0x3f));
1194
+ } else {
1195
+ result += String.fromCharCode(0xc0 | ((c >> 6) & 0x1f));
1196
+ result += String.fromCharCode(0x80 | ((c >> 0) & 0x3f));
1197
+ }
1198
+ }
1199
+ return result;
1200
+ }
1201
+
1202
+ uQRCode = {
1203
+ errorCorrectLevel: QRErrorCorrectLevel,
1204
+ defaults: {
1205
+ size: 256,
1206
+ margin: 0,
1207
+ backgroundColor: '#ffffff',
1208
+ foregroundColor: '#000000',
1209
+ fileType: 'png', // 'jpg', 'png'
1210
+ errorCorrectLevel: QRErrorCorrectLevel.H,
1211
+ typeNumber: -1
1212
+ },
1213
+ make: function (options) {
1214
+ var defaultOptions = {
1215
+ canvasId: options.canvasId,
1216
+ componentInstance: options.componentInstance,
1217
+ text: options.text,
1218
+ size: this.defaults.size,
1219
+ margin: this.defaults.margin,
1220
+ backgroundColor: this.defaults.backgroundColor,
1221
+ foregroundColor: this.defaults.foregroundColor,
1222
+ fileType: this.defaults.fileType,
1223
+ errorCorrectLevel: this.defaults.errorCorrectLevel,
1224
+ typeNumber: this.defaults.typeNumber
1225
+ };
1226
+ if (options) {
1227
+ for (var i in options) {
1228
+ defaultOptions[i] = options[i];
1229
+ }
1230
+ }
1231
+ options = defaultOptions;
1232
+ if (!options.canvasId) {
1233
+ console.error('uQRCode: Please set canvasId!');
1234
+ return;
1235
+ }
1236
+ function createCanvas() {
1237
+ var qrcode = new QRCode(options.typeNumber, options.errorCorrectLevel);
1238
+ qrcode.addData(utf16To8(options.text));
1239
+ qrcode.make();
1240
+
1241
+ var ctx = uni.createCanvasContext(options.canvasId, options.componentInstance);
1242
+ ctx.setFillStyle(options.backgroundColor);
1243
+ ctx.fillRect(0, 0, options.size, options.size);
1244
+
1245
+ var tileW = (options.size - options.margin * 2) / qrcode.getModuleCount();
1246
+ var tileH = tileW;
1247
+
1248
+ for (var row = 0; row < qrcode.getModuleCount(); row++) {
1249
+ for (var col = 0; col < qrcode.getModuleCount(); col++) {
1250
+ var style = qrcode.isDark(row, col) ? options.foregroundColor : options.backgroundColor;
1251
+ ctx.setFillStyle(style);
1252
+ var x = Math.round(col * tileW) + options.margin;
1253
+ var y = Math.round(row * tileH) + options.margin;
1254
+ var w = Math.ceil((col + 1) * tileW) - Math.floor(col * tileW);
1255
+ var h = Math.ceil((row + 1) * tileW) - Math.floor(row * tileW);
1256
+ ctx.fillRect(x, y, w, h);
1257
+ }
1258
+ }
1259
+
1260
+ setTimeout(function () {
1261
+ ctx.draw(
1262
+ false,
1263
+ (function () {
1264
+ setTimeout(function () {
1265
+ uni.canvasToTempFilePath(
1266
+ {
1267
+ canvasId: options.canvasId,
1268
+ fileType: options.fileType,
1269
+ width: options.size,
1270
+ height: options.size,
1271
+ destWidth: options.size,
1272
+ destHeight: options.size,
1273
+ success: function (res) {
1274
+ options.success && options.success(res.tempFilePath);
1275
+ },
1276
+ fail: function (error) {
1277
+ options.fail && options.fail(error);
1278
+ },
1279
+ complete: function (res) {
1280
+ options.complete && options.complete(res);
1281
+ }
1282
+ },
1283
+ options.componentInstance
1284
+ );
1285
+ }, options.text.length + 100);
1286
+ })()
1287
+ );
1288
+ }, 150);
1289
+ }
1290
+ createCanvas();
1291
+ }
1292
+ };
1293
+ })();
1294
+
1295
+ export default uQRCode;