PageSourceSearch

https://www.synclyst.app/vendor/qrcode-generator.js

js synclyst.app collected 2026-10-02 01:15:12 UTC 45,119 bytes, 1,857 lines download raw bytes

vendor: 9,196 bytes, lines 1-352
1//---------------------------------------------------------------------
2//
3// QR Code Generator for JavaScript
4//
5// Copyright (c) 2009 Kazuhiko Arase
6//
7// URL: http://www.d-project.com/
8//
9// Licensed under the MIT license:
10//  http://www.opensource.org/licenses/mit-license.php
11//
12// The word 'QR Code' is registered trademark of
13// DENSO WAVE INCORPORATED
14//  http://www.denso-wave.com/qrcode/faqpatent-e.html
15//
16//---------------------------------------------------------------------
17
18var qrcode = function() {
19
20  //---------------------------------------------------------------------
21  // qrcode
22  //---------------------------------------------------------------------
23
24  /**
25   * qrcode
26   * @param typeNumber 1 to 40
27   * @param errorCorrectionLevel 'L','M','Q','H'
28   */
29  var qrcode = function(typeNumber, errorCorrectionLevel) {
30
31    var PAD0 = 0xEC;
32    var PAD1 = 0x11;
33
34    var _typeNumber = typeNumber;
35    var _errorCorrectionLevel = QRErrorCorrectionLevel[errorCorrectionLevel];
36    var _modules = null;
37    var _moduleCount = 0;
38    var _dataCache = null;
39    var _dataList = new Array();
40
41    var _this = {};
42
43    var makeImpl = function(test, maskPattern) {
44
45      _moduleCount = _typeNumber * 4 + 17;
46      _modules = function(moduleCount) {
47        var modules = new Array(moduleCount);
48        for (var row = 0; row < moduleCount; row += 1) {
49          modules[row] = new Array(moduleCount);
50          for (var col = 0; col < moduleCount; col += 1) {
51            modules[row][col] = null;
52          }
53        }
54        return modules;
55      }(_moduleCount);
56
57      setupPositionProbePattern(0, 0);
58      setupPositionProbePattern(_moduleCount - 7, 0);
59      setupPositionProbePattern(0, _moduleCount - 7);
60      setupPositionAdjustPattern();
61      setupTimingPattern();
62      setupTypeInfo(test, maskPattern);
63
64      if (_typeNumber >= 7) {
65        setupTypeNumber(test);
66      }
67
68      if (_dataCache == null) {
69        _dataCache = createData(_typeNumber, _errorCorrectionLevel, _dataList);
70      }
71
72      mapData(_dataCache, maskPattern);
73    };
74
75    var setupPositionProbePattern = function(row, col) {
76
77      for (var r = -1; r <= 7; r += 1) {
78
79        if (row + r <= -1 || _moduleCount <= row + r) continue;
80
81        for (var c = -1; c <= 7; c += 1) {
82
83          if (col + c <= -1 || _moduleCount <= col + c) continue;
84
85          if ( (0 <= r && r <= 6 && (c == 0 || c == 6) )
86              || (0 <= c && c <= 6 && (r == 0 || r == 6) )
87              || (2 <= r && r <= 4 && 2 <= c && c <= 4) ) {
88            _modules[row + r][col + c] = true;
89          } else {
90            _modules[row + r][col + c] = false;
91          }
92        }
93      }
94    };
95
96    var getBestMaskPattern = function() {
97
98      var minLostPoint = 0;
99      var pattern = 0;
100
101      for (var i = 0; i < 8; i += 1) {
102
103        makeImpl(true, i);
104
105        var lostPoint = QRUtil.getLostPoint(_this);
106
107        if (i == 0 || minLostPoint > lostPoint) {
108          minLostPoint = lostPoint;
109          pattern = i;
110        }
111      }
112
113      return pattern;
114    };
115
116    var setupTimingPattern = function() {
117
118      for (var r = 8; r < _moduleCount - 8; r += 1) {
119        if (_modules[r][6] != null) {
120          continue;
121        }
122        _modules[r][6] = (r % 2 == 0);
123      }
124
125      for (var c = 8; c < _moduleCount - 8; c += 1) {
126        if (_modules[6][c] != null) {
127          continue;
128        }
129        _modules[6][c] = (c % 2 == 0);
130      }
131    };
132
133    var setupPositionAdjustPattern = function() {
134
135      var pos = QRUtil.getPatternPosition(_typeNumber);
136
137      for (var i = 0; i < pos.length; i += 1) {
138
139        for (var j = 0; j < pos.length; j += 1) {
140
141          var row = pos[i];
142          var col = pos[j];
143
144          if (_modules[row][col] != null) {
145            continue;
146          }
147
148          for (var r = -2; r <= 2; r += 1) {
149
150            for (var c = -2; c <= 2; c += 1) {
151
152              if (r == -2 || r == 2 || c == -2 || c == 2
153                  || (r == 0 && c == 0) ) {
154                _modules[row + r][col + c] = true;
155              } else {
156                _modules[row + r][col + c] = false;
157              }
158            }
159          }
160        }
161      }
162    };
163
164    var setupTypeNumber = function(test) {
165
166      var bits = QRUtil.getBCHTypeNumber(_typeNumber);
167
168      for (var i = 0; i < 18; i += 1) {
169        var mod = (!test && ( (bits >> i) & 1) == 1);
170        _modules[Math.floor(i / 3)][i % 3 + _moduleCount - 8 - 3] = mod;
171      }
172
173      for (var i = 0; i < 18; i += 1) {
174        var mod = (!test && ( (bits >> i) & 1) == 1);
175        _modules[i % 3 + _moduleCount - 8 - 3][Math.floor(i / 3)] = mod;
176      }
177    };
178
179    var setupTypeInfo = function(test, maskPattern) {
180
181      var data = (_errorCorrectionLevel << 3) | maskPattern;
182      var bits = QRUtil.getBCHTypeInfo(data);
183
184      // vertical
185      for (var i = 0; i < 15; i += 1) {
186
187        var mod = (!test && ( (bits >> i) & 1) == 1);
188
189        if (i < 6) {
190          _modules[i][8] = mod;
191        } else if (i < 8) {
192          _modules[i + 1][8] = mod;
193        } else {
194          _modules[_moduleCount - 15 + i][8] = mod;
195        }
196      }
197
198      // horizontal
199      for (var i = 0; i < 15; i += 1) {
200
201        var mod = (!test && ( (bits >> i) & 1) == 1);
202
203        if (i < 8) {
204          _modules[8][_moduleCount - i - 1] = mod;
205        } else if (i < 9) {
206          _modules[8][15 - i - 1 + 1] = mod;
207        } else {
208          _modules[8][15 - i - 1] = mod;
209        }
210      }
211
212      // fixed module
213      _modules[_moduleCount - 8][8] = (!test);
214    };
215
216    var mapData = function(data, maskPattern) {
217
218      var inc = -1;
219      var row = _moduleCount - 1;
220      var bitIndex = 7;
221      var byteIndex = 0;
222      var maskFunc = QRUtil.getMaskFunction(maskPattern);
223
224      for (var col = _moduleCount - 1; col > 0; col -= 2) {
225
226        if (col == 6) col -= 1;
227
228        while (true) {
229
230          for (var c = 0; c < 2; c += 1) {
231
232            if (_modules[row][col - c] == null) {
233
234              var dark = false;
235
236              if (byteIndex < data.length) {
237                dark = ( ( (data[byteIndex] >>> bitIndex) & 1) == 1);
238              }
239
240              var mask = maskFunc(row, col - c);
241
242              if (mask) {
243                dark = !dark;
244              }
245
246              _modules[row][col - c] = dark;
247              bitIndex -= 1;
248
249              if (bitIndex == -1) {
250                byteIndex += 1;
251                bitIndex = 7;
252              }
253            }
254          }
255
256          row += inc;
257
258          if (row < 0 || _moduleCount <= row) {
259            row -= inc;
260            inc = -inc;
261            break;
262          }
263        }
264      }
265    };
266
267    var createBytes = function(buffer, rsBlocks) {
268
269      var offset = 0;
270
271      var maxDcCount = 0;
272      var maxEcCount = 0;
273
274      var dcdata = new Array(rsBlocks.length);
275      var ecdata = new Array(rsBlocks.length);
276
277      for (var r = 0; r < rsBlocks.length; r += 1) {
278
279        var dcCount = rsBlocks[r].dataCount;
280        var ecCount = rsBlocks[r].totalCount - dcCount;
281
282        maxDcCount = Math.max(maxDcCount, dcCount);
283        maxEcCount = Math.max(maxEcCount, ecCount);
284
285        dcdata[r] = new Array(dcCount);
286
287        for (var i = 0; i < dcdata[r].length; i += 1) {
288          dcdata[r][i] = 0xff & buffer.getBuffer()[i + offset];
289        }
290        offset += dcCount;
291
292        var rsPoly = QRUtil.getErrorCorrectPolynomial(ecCount);
293        var rawPoly = qrPolynomial(dcdata[r], rsPoly.getLength() - 1);
294
295        var modPoly = rawPoly.mod(rsPoly);
296        ecdata[r] = new Array(rsPoly.getLength() - 1);
297        for (var i = 0; i < ecdata[r].length; i += 1) {
298          var modIndex = i + modPoly.getLength() - ecdata[r].length;
299          ecdata[r][i] = (modIndex >= 0)? modPoly.getAt(modIndex) : 0;
300        }
301      }
302
303      var totalCodeCount = 0;
304      for (var i = 0; i < rsBlocks.length; i += 1) {
305        totalCodeCount += rsBlocks[i].totalCount;
306      }
307
308      var data = new Array(totalCodeCount);
309      var index = 0;
310
311      for (var i = 0; i < maxDcCount; i += 1) {
312        for (var r = 0; r < rsBlocks.length; r += 1) {
313          if (i < dcdata[r].length) {
314            data[index] = dcdata[r][i];
315            index += 1;
316          }
317        }
318      }
319
320      for (var i = 0; i < maxEcCount; i += 1) {
321        for (var r = 0; r < rsBlocks.length; r += 1) {
322          if (i < ecdata[r].length) {
323            data[index] = ecdata[r][i];
324            index += 1;
325          }
326        }
327      }
328
329      return data;
330    };
331
332    var createData = function(typeNumber, errorCorrectionLevel, dataList) {
333
334      var rsBlocks = QRRSBlock.getRSBlocks(typeNumber, errorCorrectionLevel);
335
336      var buffer = qrBitBuffer();
337
338      for (var i = 0; i < dataList.length; i += 1) {
339        var data = dataList[i];
340        buffer.put(data.getMode(), 4);
341        buffer.put(data.getLength(), QRUtil.getLengthInBits(data.getMode(), typeNumber) );
342        data.write(buffer);
343      }
344
345      // calc num max data.
346      var totalDataCount = 0;
347      for (var i = 0; i < rsBlocks.length; i += 1) {
348        totalDataCount += rsBlocks[i].dataCount;
349      }
350
351      if (buffer.getLengthInBits() > totalDataCount * 8) {
352        throw new Error('code length overflow. ('
vendor: 4,268 bytes, lines 353-509
353          + buffer.getLengthInBits()
354          + '>'
355          + totalDataCount * 8
356          + ')');
357      }
358
359      // end code
360      if (buffer.getLengthInBits() + 4 <= totalDataCount * 8) {
361        buffer.put(0, 4);
362      }
363
364      // padding
365      while (buffer.getLengthInBits() % 8 != 0) {
366        buffer.putBit(false);
367      }
368
369      // padding
370      while (true) {
371
372        if (buffer.getLengthInBits() >= totalDataCount * 8) {
373          break;
374        }
375        buffer.put(PAD0, 8);
376
377        if (buffer.getLengthInBits() >= totalDataCount * 8) {
378          break;
379        }
380        buffer.put(PAD1, 8);
381      }
382
383      return createBytes(buffer, rsBlocks);
384    };
385
386    _this.addData = function(data) {
387      var newData = qr8BitByte(data);
388      _dataList.push(newData);
389      _dataCache = null;
390    };
391
392    _this.isDark = function(row, col) {
393      if (row < 0 || _moduleCount <= row || col < 0 || _moduleCount <= col) {
394        throw new Error(row + ',' + col);
395      }
396      return _modules[row][col];
397    };
398
399    _this.getModuleCount = function() {
400      return _moduleCount;
401    };
402
403    _this.make = function() {
404      makeImpl(false, getBestMaskPattern() );
405    };
406
407    _this.createTableTag = function(cellSize, margin) {
408
409      cellSize = cellSize || 2;
410      margin = (typeof margin == 'undefined')? cellSize * 4 : margin;
411
412      var qrHtml = '';
413
414      qrHtml += '<table style="';
415      qrHtml += ' border-width: 0px; border-style: none;';
416      qrHtml += ' border-collapse: collapse;';
417      qrHtml += ' padding: 0px; margin: ' + margin + 'px;';
418      qrHtml += '">';
419      qrHtml += '<tbody>';
420
421      for (var r = 0; r < _this.getModuleCount(); r += 1) {
422
423        qrHtml += '<tr>';
424
425        for (var c = 0; c < _this.getModuleCount(); c += 1) {
426          qrHtml += '<td style="';
427          qrHtml += ' border-width: 0px; border-style: none;';
428          qrHtml += ' border-collapse: collapse;';
429          qrHtml += ' padding: 0px; margin: 0px;';
430          qrHtml += ' width: ' + cellSize + 'px;';
431          qrHtml += ' height: ' + cellSize + 'px;';
432          qrHtml += ' background-color: ';
433          qrHtml += _this.isDark(r, c)? '#000000' : '#ffffff';
434          qrHtml += ';';
435          qrHtml += '"/>';
436        }
437
438        qrHtml += '</tr>';
439      }
440
441      qrHtml += '</tbody>';
442      qrHtml += '</table>';
443
444      return qrHtml;
445    };
446
447    _this.createSvgTag = function(cellSize, margin) {
448
449      cellSize = cellSize || 2;
450      margin = (typeof margin == 'undefined')? cellSize * 4 : margin;
451      var size = _this.getModuleCount() * cellSize + margin * 2;
452      var c, mc, r, mr, qrSvg='', rect;
453
454      rect = 'l' + cellSize + ',0 0,' + cellSize +
455        ' -' + cellSize + ',0 0,-' + cellSize + 'z ';
456
457      qrSvg += '<svg';
458      qrSvg += ' width="' + size + 'px"';
459      qrSvg += ' height="' + size + 'px"';
460      qrSvg += ' xmlns="http://www.w3.org/2000/svg"';
461      qrSvg += '>';
462      qrSvg += '<path d="';
463
464      for (r = 0; r < _this.getModuleCount(); r += 1) {
465        mr = r * cellSize + margin;
466        for (c = 0; c < _this.getModuleCount(); c += 1) {
467          if (_this.isDark(r, c) ) {
468            mc = c*cellSize+margin;
469            qrSvg += 'M' + mc + ',' + mr + rect;
470          }
471        }
472      }
473
474      qrSvg += '" stroke="transparent" fill="black"/>';
475      qrSvg += '</svg>';
476
477      return qrSvg;
478    };
479
480    _this.createImgTag = function(cellSize, margin) {
481
482      cellSize = cellSize || 2;
483      margin = (typeof margin == 'undefined')? cellSize * 4 : margin;
484
485      var size = _this.getModuleCount() * cellSize + margin * 2;
486      var min = margin;
487      var max = size - margin;
488
489      return createImgTag(size, size, function(x, y) {
490        if (min <= x && x < max && min <= y && y < max) {
491          var c = Math.floor( (x - min) / cellSize);
492          var r = Math.floor( (y - min) / cellSize);
493          return _this.isDark(r, c)? 0 : 1;
494        } else {
495          return 1;
496        }
497      } );
498    };
499
500    return _this;
501  };
502
503  //---------------------------------------------------------------------
504  // qrcode.stringToBytes
505  //---------------------------------------------------------------------
506
507  qrcode.stringToBytes = function(s) {
508    var bytes = new Array();
509    for (var i = 0; i < s.length; i += 1) {
vendor: 31,655 bytes, lines 510-1857
510      var c = s.charCodeAt(i);
511      bytes.push(c & 0xff);
512    }
513    return bytes;
514  };
515
516  //---------------------------------------------------------------------
517  // qrcode.createStringToBytes
518  //---------------------------------------------------------------------
519
520  /**
521   * @param unicodeData base64 string of byte array.
522   * [16bit Unicode],[16bit Bytes], ...
523   * @param numChars
524   */
525  qrcode.createStringToBytes = function(unicodeData, numChars) {
526
527    // create conversion map.
528
529    var unicodeMap = function() {
530
531      var bin = base64DecodeInputStream(unicodeData);
532      var read = function() {
533        var b = bin.read();
534        if (b == -1) throw new Error();
535        return b;
536      };
537
538      var count = 0;
539      var unicodeMap = {};
540      while (true) {
541        var b0 = bin.read();
542        if (b0 == -1) break;
543        var b1 = read();
544        var b2 = read();
545        var b3 = read();
546        var k = String.fromCharCode( (b0 << 8) | b1);
547        var v = (b2 << 8) | b3;
548        unicodeMap[k] = v;
549        count += 1;
550      }
551      if (count != numChars) {
552        throw new Error(count + ' != ' + numChars);
553      }
554
555      return unicodeMap;
556    }();
557
558    var unknownChar = '?'.charCodeAt(0);
559
560    return function(s) {
561      var bytes = new Array();
562      for (var i = 0; i < s.length; i += 1) {
563        var c = s.charCodeAt(i);
564        if (c < 128) {
565          bytes.push(c);
566        } else {
567          var b = unicodeMap[s.charAt(i)];
568          if (typeof b == 'number') {
569            if ( (b & 0xff) == b) {
570              // 1byte
571              bytes.push(b);
572            } else {
573              // 2bytes
574              bytes.push(b >>> 8);
575              bytes.push(b & 0xff);
576            }
577          } else {
578            bytes.push(unknownChar);
579          }
580        }
581      }
582      return bytes;
583    };
584  };
585
586  //---------------------------------------------------------------------
587  // QRMode
588  //---------------------------------------------------------------------
589
590  var QRMode = {
591    MODE_NUMBER :    1 << 0,
592    MODE_ALPHA_NUM : 1 << 1,
593    MODE_8BIT_BYTE : 1 << 2,
594    MODE_KANJI :     1 << 3
595  };
596
597  //---------------------------------------------------------------------
598  // QRErrorCorrectionLevel
599  //---------------------------------------------------------------------
600
601  var QRErrorCorrectionLevel = {
602    L : 1,
603    M : 0,
604    Q : 3,
605    H : 2
606  };
607
608  //---------------------------------------------------------------------
609  // QRMaskPattern
610  //---------------------------------------------------------------------
611
612  var QRMaskPattern = {
613    PATTERN000 : 0,
614    PATTERN001 : 1,
615    PATTERN010 : 2,
616    PATTERN011 : 3,
617    PATTERN100 : 4,
618    PATTERN101 : 5,
619    PATTERN110 : 6,
620    PATTERN111 : 7
621  };
622
623  //---------------------------------------------------------------------
624  // QRUtil
625  //---------------------------------------------------------------------
626
627  var QRUtil = function() {
628
629    var PATTERN_POSITION_TABLE = [
630      [],
631      [6, 18],
632      [6, 22],
633      [6, 26],
634      [6, 30],
635      [6, 34],
636      [6, 22, 38],
637      [6, 24, 42],
638      [6, 26, 46],
639      [6, 28, 50],
640      [6, 30, 54],
641      [6, 32, 58],
642      [6, 34, 62],
643      [6, 26, 46, 66],
644      [6, 26, 48, 70],
645      [6, 26, 50, 74],
646      [6, 30, 54, 78],
647      [6, 30, 56, 82],
648      [6, 30, 58, 86],
649      [6, 34, 62, 90],
650      [6, 28, 50, 72, 94],
651      [6, 26, 50, 74, 98],
652      [6, 30, 54, 78, 102],
653      [6, 28, 54, 80, 106],
654      [6, 32, 58, 84, 110],
655      [6, 30, 58, 86, 114],
656      [6, 34, 62, 90, 118],
657      [6, 26, 50, 74, 98, 122],
658      [6, 30, 54, 78, 102, 126],
659      [6, 26, 52, 78, 104, 130],
660      [6, 30, 56, 82, 108, 134],
661      [6, 34, 60, 86, 112, 138],
662      [6, 30, 58, 86, 114, 142],
663      [6, 34, 62, 90, 118, 146],
664      [6, 30, 54, 78, 102, 126, 150],
665      [6, 24, 50, 76, 102, 128, 154],
666      [6, 28, 54, 80, 106, 132, 158],
667      [6, 32, 58, 84, 110, 136, 162],
668      [6, 26, 54, 82, 110, 138, 166],
669      [6, 30, 58, 86, 114, 142, 170]
670    ];
671    var G15 = (1 << 10) | (1 << 8) | (1 << 5) | (1 << 4) | (1 << 2) | (1 << 1) | (1 << 0);
672    var G18 = (1 << 12) | (1 << 11) | (1 << 10) | (1 << 9) | (1 << 8) | (1 << 5) | (1 << 2) | (1 << 0);
673    var G15_MASK = (1 << 14) | (1 << 12) | (1 << 10) | (1 << 4) | (1 << 1);
674
675    var _this = {};
676
677    var getBCHDigit = function(data) {
678      var digit = 0;
679      while (data != 0) {
680        digit += 1;
681        data >>>= 1;
682      }
683      return digit;
684    };
685
686    _this.getBCHTypeInfo = function(data) {
687      var d = data << 10;
688      while (getBCHDigit(d) - getBCHDigit(G15) >= 0) {
689        d ^= (G15 << (getBCHDigit(d) - getBCHDigit(G15) ) );
690      }
691      return ( (data << 10) | d) ^ G15_MASK;
692    };
693
694    _this.getBCHTypeNumber = function(data) {
695      var d = data << 12;
696      while (getBCHDigit(d) - getBCHDigit(G18) >= 0) {
697        d ^= (G18 << (getBCHDigit(d) - getBCHDigit(G18) ) );
698      }
699      return (data << 12) | d;
700    };
701
702    _this.getPatternPosition = function(typeNumber) {
703      return PATTERN_POSITION_TABLE[typeNumber - 1];
704    };
705
706    _this.getMaskFunction = function(maskPattern) {
707
708      switch (maskPattern) {
709
710      case QRMaskPattern.PATTERN000 :
711        return function(i, j) { return (i + j) % 2 == 0; };
712      case QRMaskPattern.PATTERN001 :
713        return function(i, j) { return i % 2 == 0; };
714      case QRMaskPattern.PATTERN010 :
715        return function(i, j) { return j % 3 == 0; };
716      case QRMaskPattern.PATTERN011 :
717        return function(i, j) { return (i + j) % 3 == 0; };
718      case QRMaskPattern.PATTERN100 :
719        return function(i, j) { return (Math.floor(i / 2) + Math.floor(j / 3) ) % 2 == 0; };
720      case QRMaskPattern.PATTERN101 :
721        return function(i, j) { return (i * j) % 2 + (i * j) % 3 == 0; };
722      case QRMaskPattern.PATTERN110 :
723        return function(i, j) { return ( (i * j) % 2 + (i * j) % 3) % 2 == 0; };
724      case QRMaskPattern.PATTERN111 :
725        return function(i, j) { return ( (i * j) % 3 + (i + j) % 2) % 2 == 0; };
726
727      default :
728        throw new Error('bad maskPattern:' + maskPattern);
729      }
730    };
731
732    _this.getErrorCorrectPolynomial = function(errorCorrectLength) {
733      var a = qrPolynomial([1], 0);
734      for (var i = 0; i < errorCorrectLength; i += 1) {
735        a = a.multiply(qrPolynomial([1, QRMath.gexp(i)], 0) );
736      }
737      return a;
738    };
739
740    _this.getLengthInBits = function(mode, type) {
741
742      if (1 <= type && type < 10) {
743
744        // 1 - 9
745
746        switch(mode) {
747        case QRMode.MODE_NUMBER    : return 10;
748        case QRMode.MODE_ALPHA_NUM : return 9;
749        case QRMode.MODE_8BIT_BYTE : return 8;
750        case QRMode.MODE_KANJI     : return 8;
751        default :
752          throw new Error('mode:' + mode);
753        }
754
755      } else if (type < 27) {
756
757        // 10 - 26
758
759        switch(mode) {
760        case QRMode.MODE_NUMBER    : return 12;
761        case QRMode.MODE_ALPHA_NUM : return 11;
762        case QRMode.MODE_8BIT_BYTE : return 16;
763        case QRMode.MODE_KANJI     : return 10;
764        default :
765          throw new Error('mode:' + mode);
766        }
767
768      } else if (type < 41) {
769
770        // 27 - 40
771
772        switch(mode) {
773        case QRMode.MODE_NUMBER    : return 14;
774        case QRMode.MODE_ALPHA_NUM : return 13;
775        case QRMode.MODE_8BIT_BYTE : return 16;
776        case QRMode.MODE_KANJI     : return 12;
777        default :
778          throw new Error('mode:' + mode);
779        }
780
781      } else {
782        throw new Error('type:' + type);
783      }
784    };
785
786    _this.getLostPoint = function(qrcode) {
787
788      var moduleCount = qrcode.getModuleCount();
789
790      var lostPoint = 0;
791
792      // LEVEL1
793
794      for (var row = 0; row < moduleCount; row += 1) {
795        for (var col = 0; col < moduleCount; col += 1) {
796
797          var sameCount = 0;
798          var dark = qrcode.isDark(row, col);
799
800          for (var r = -1; r <= 1; r += 1) {
801
802            if (row + r < 0 || moduleCount <= row + r) {
803              continue;
804            }
805
806            for (var c = -1; c <= 1; c += 1) {
807
808              if (col + c < 0 || moduleCount <= col + c) {
809                continue;
810              }
811
812              if (r == 0 && c == 0) {
813                continue;
814              }
815
816              if (dark == qrcode.isDark(row + r, col + c) ) {
817                sameCount += 1;
818              }
819            }
820          }
821
822          if (sameCount > 5) {
823            lostPoint += (3 + sameCount - 5);
824          }
825        }
826      };
827
828      // LEVEL2
829
830      for (var row = 0; row < moduleCount - 1; row += 1) {
831        for (var col = 0; col < moduleCount - 1; col += 1) {
832          var count = 0;
833          if (qrcode.isDark(row, col) ) count += 1;
834          if (qrcode.isDark(row + 1, col) ) count += 1;
835          if (qrcode.isDark(row, col + 1) ) count += 1;
836          if (qrcode.isDark(row + 1, col + 1) ) count += 1;
837          if (count == 0 || count == 4) {
838            lostPoint += 3;
839          }
840        }
841      }
842
843      // LEVEL3
844
845      for (var row = 0; row < moduleCount; row += 1) {
846        for (var col = 0; col < moduleCount - 6; col += 1) {
847          if (qrcode.isDark(row, col)
848              && !qrcode.isDark(row, col + 1)
849              &&  qrcode.isDark(row, col + 2)
850              &&  qrcode.isDark(row, col + 3)
851              &&  qrcode.isDark(row, col + 4)
852              && !qrcode.isDark(row, col + 5)
853              &&  qrcode.isDark(row, col + 6) ) {
854            lostPoint += 40;
855          }
856        }
857      }
858
859      for (var col = 0; col < moduleCount; col += 1) {
860        for (var row = 0; row < moduleCount - 6; row += 1) {
861          if (qrcode.isDark(row, col)
862              && !qrcode.isDark(row + 1, col)
863              &&  qrcode.isDark(row + 2, col)
864              &&  qrcode.isDark(row + 3, col)
865              &&  qrcode.isDark(row + 4, col)
866              && !qrcode.isDark(row + 5, col)
867              &&  qrcode.isDark(row + 6, col) ) {
868            lostPoint += 40;
869          }
870        }
871      }
872
873      // LEVEL4
874
875      var darkCount = 0;
876
877      for (var col = 0; col < moduleCount; col += 1) {
878        for (var row = 0; row < moduleCount; row += 1) {
879          if (qrcode.isDark(row, col) ) {
880            darkCount += 1;
881          }
882        }
883      }
884
885      var ratio = Math.abs(100 * darkCount / moduleCount / moduleCount - 50) / 5;
886      lostPoint += ratio * 10;
887
888      return lostPoint;
889    };
890
891    return _this;
892  }();
893
894  //---------------------------------------------------------------------
895  // QRMath
896  //---------------------------------------------------------------------
897
898  var QRMath = function() {
899
900    var EXP_TABLE = new Array(256);
901    var LOG_TABLE = new Array(256);
902
903    // initialize tables
904    for (var i = 0; i < 8; i += 1) {
905      EXP_TABLE[i] = 1 << i;
906    }
907    for (var i = 8; i < 256; i += 1) {
908      EXP_TABLE[i] = EXP_TABLE[i - 4]
909        ^ EXP_TABLE[i - 5]
910        ^ EXP_TABLE[i - 6]
911        ^ EXP_TABLE[i - 8];
912    }
913    for (var i = 0; i < 255; i += 1) {
914      LOG_TABLE[EXP_TABLE[i] ] = i;
915    }
916
917    var _this = {};
918
919    _this.glog = function(n) {
920
921      if (n < 1) {
922        throw new Error('glog(' + n + ')');
923      }
924
925      return LOG_TABLE[n];
926    };
927
928    _this.gexp = function(n) {
929
930      while (n < 0) {
931        n += 255;
932      }
933
934      while (n >= 256) {
935        n -= 255;
936      }
937
938      return EXP_TABLE[n];
939    };
940
941    return _this;
942  }();
943
944  //---------------------------------------------------------------------
945  // qrPolynomial
946  //---------------------------------------------------------------------
947
948  function qrPolynomial(num, shift) {
949
950    if (typeof num.length == 'undefined') {
951      throw new Error(num.length + '/' + shift);
952    }
953
954    var _num = function() {
955      var offset = 0;
956      while (offset < num.length && num[offset] == 0) {
957        offset += 1;
958      }
959      var _num = new Array(num.length - offset + shift);
960      for (var i = 0; i < num.length - offset; i += 1) {
961        _num[i] = num[i + offset];
962      }
963      return _num;
964    }();
965
966    var _this = {};
967
968    _this.getAt = function(index) {
969      return _num[index];
970    };
971
972    _this.getLength = function() {
973      return _num.length;
974    };
975
976    _this.multiply = function(e) {
977
978      var num = new Array(_this.getLength() + e.getLength() - 1);
979
980      for (var i = 0; i < _this.getLength(); i += 1) {
981        for (var j = 0; j < e.getLength(); j += 1) {
982          num[i + j] ^= QRMath.gexp(QRMath.glog(_this.getAt(i) ) + QRMath.glog(e.getAt(j) ) );
983        }
984      }
985
986      return qrPolynomial(num, 0);
987    };
988
989    _this.mod = function(e) {
990
991      if (_this.getLength() - e.getLength() < 0) {
992        return _this;
993      }
994
995      var ratio = QRMath.glog(_this.getAt(0) ) - QRMath.glog(e.getAt(0) );
996
997      var num = new Array(_this.getLength() );
998      for (var i = 0; i < _this.getLength(); i += 1) {
999        num[i] = _this.getAt(i);
1000      }
1001
1002      for (var i = 0; i < e.getLength(); i += 1) {
1003        num[i] ^= QRMath.gexp(QRMath.glog(e.getAt(i) ) + ratio);
1004      }
1005
1006      // recursive call
1007      return qrPolynomial(num, 0).mod(e);
1008    };
1009
1010    return _this;
1011  };
1012
1013  //---------------------------------------------------------------------
1014  // QRRSBlock
1015  //---------------------------------------------------------------------
1016
1017  var QRRSBlock = function() {
1018
1019    var RS_BLOCK_TABLE = [
1020
1021      // L
1022      // M
1023      // Q
1024      // H
1025
1026      // 1
1027      [1, 26, 19],
1028      [1, 26, 16],
1029      [1, 26, 13],
1030      [1, 26, 9],
1031
1032      // 2
1033      [1, 44, 34],
1034      [1, 44, 28],
1035      [1, 44, 22],
1036      [1, 44, 16],
1037
1038      // 3
1039      [1, 70, 55],
1040      [1, 70, 44],
1041      [2, 35, 17],
1042      [2, 35, 13],
1043
1044      // 4
1045      [1, 100, 80],
1046      [2, 50, 32],
1047      [2, 50, 24],
1048      [4, 25, 9],
1049
1050      // 5
1051      [1, 134, 108],
1052      [2, 67, 43],
1053      [2, 33, 15, 2, 34, 16],
1054      [2, 33, 11, 2, 34, 12],
1055
1056      // 6
1057      [2, 86, 68],
1058      [4, 43, 27],
1059      [4, 43, 19],
1060      [4, 43, 15],
1061
1062      // 7
1063      [2, 98, 78],
1064      [4, 49, 31],
1065      [2, 32, 14, 4, 33, 15],
1066      [4, 39, 13, 1, 40, 14],
1067
1068      // 8
1069      [2, 121, 97],
1070      [2, 60, 38, 2, 61, 39],
1071      [4, 40, 18, 2, 41, 19],
1072      [4, 40, 14, 2, 41, 15],
1073
1074      // 9
1075      [2, 146, 116],
1076      [3, 58, 36, 2, 59, 37],
1077      [4, 36, 16, 4, 37, 17],
1078      [4, 36, 12, 4, 37, 13],
1079
1080      // 10
1081      [2, 86, 68, 2, 87, 69],
1082      [4, 69, 43, 1, 70, 44],
1083      [6, 43, 19, 2, 44, 20],
1084      [6, 43, 15, 2, 44, 16],
1085
1086      // 11
1087      [4, 101, 81],
1088      [1, 80, 50, 4, 81, 51],
1089      [4, 50, 22, 4, 51, 23],
1090      [3, 36, 12, 8, 37, 13],
1091
1092      // 12
1093      [2, 116, 92, 2, 117, 93],
1094      [6, 58, 36, 2, 59, 37],
1095      [4, 46, 20, 6, 47, 21],
1096      [7, 42, 14, 4, 43, 15],
1097
1098      // 13
1099      [4, 133, 107],
1100      [8, 59, 37, 1, 60, 38],
1101      [8, 44, 20, 4, 45, 21],
1102      [12, 33, 11, 4, 34, 12],
1103
1104      // 14
1105      [3, 145, 115, 1, 146, 116],
1106      [4, 64, 40, 5, 65, 41],
1107      [11, 36, 16, 5, 37, 17],
1108      [11, 36, 12, 5, 37, 13],
1109
1110      // 15
1111      [5, 109, 87, 1, 110, 88],
1112      [5, 65, 41, 5, 66, 42],
1113      [5, 54, 24, 7, 55, 25],
1114      [11, 36, 12, 7, 37, 13],
1115
1116      // 16
1117      [5, 122, 98, 1, 123, 99],
1118      [7, 73, 45, 3, 74, 46],
1119      [15, 43, 19, 2, 44, 20],
1120      [3, 45, 15, 13, 46, 16],
1121
1122      // 17
1123      [1, 135, 107, 5, 136, 108],
1124      [10, 74, 46, 1, 75, 47],
1125      [1, 50, 22, 15, 51, 23],
1126      [2, 42, 14, 17, 43, 15],
1127
1128      // 18
1129      [5, 150, 120, 1, 151, 121],
1130      [9, 69, 43, 4, 70, 44],
1131      [17, 50, 22, 1, 51, 23],
1132      [2, 42, 14, 19, 43, 15],
1133
1134      // 19
1135      [3, 141, 113, 4, 142, 114],
1136      [3, 70, 44, 11, 71, 45],
1137      [17, 47, 21, 4, 48, 22],
1138      [9, 39, 13, 16, 40, 14],
1139
1140      // 20
1141      [3, 135, 107, 5, 136, 108],
1142      [3, 67, 41, 13, 68, 42],
1143      [15, 54, 24, 5, 55, 25],
1144      [15, 43, 15, 10, 44, 16],
1145
1146      // 21
1147      [4, 144, 116, 4, 145, 117],
1148      [17, 68, 42],
1149      [17, 50, 22, 6, 51, 23],
1150      [19, 46, 16, 6, 47, 17],
1151
1152      // 22
1153      [2, 139, 111, 7, 140, 112],
1154      [17, 74, 46],
1155      [7, 54, 24, 16, 55, 25],
1156      [34, 37, 13],
1157
1158      // 23
1159      [4, 151, 121, 5, 152, 122],
1160      [4, 75, 47, 14, 76, 48],
1161      [11, 54, 24, 14, 55, 25],
1162      [16, 45, 15, 14, 46, 16],
1163
1164      // 24
1165      [6, 147, 117, 4, 148, 118],
1166      [6, 73, 45, 14, 74, 46],
1167      [11, 54, 24, 16, 55, 25],
1168      [30, 46, 16, 2, 47, 17],
1169
1170      // 25
1171      [8, 132, 106, 4, 133, 107],
1172      [8, 75, 47, 13, 76, 48],
1173      [7, 54, 24, 22, 55, 25],
1174      [22, 45, 15, 13, 46, 16],
1175
1176      // 26
1177      [10, 142, 114, 2, 143, 115],
1178      [19, 74, 46, 4, 75, 47],
1179      [28, 50, 22, 6, 51, 23],
1180      [33, 46, 16, 4, 47, 17],
1181
1182      // 27
1183      [8, 152, 122, 4, 153, 123],
1184      [22, 73, 45, 3, 74, 46],
1185      [8, 53, 23, 26, 54, 24],
1186      [12, 45, 15, 28, 46, 16],
1187
1188      // 28
1189      [3, 147, 117, 10, 148, 118],
1190      [3, 73, 45, 23, 74, 46],
1191      [4, 54, 24, 31, 55, 25],
1192      [11, 45, 15, 31, 46, 16],
1193
1194      // 29
1195      [7, 146, 116, 7, 147, 117],
1196      [21, 73, 45, 7, 74, 46],
1197      [1, 53, 23, 37, 54, 24],
1198      [19, 45, 15, 26, 46, 16],
1199
1200      // 30
1201      [5, 145, 115, 10, 146, 116],
1202      [19, 75, 47, 10, 76, 48],
1203      [15, 54, 24, 25, 55, 25],
1204      [23, 45, 15, 25, 46, 16],
1205
1206      // 31
1207      [13, 145, 115, 3, 146, 116],
1208      [2, 74, 46, 29, 75, 47],
1209      [42, 54, 24, 1, 55, 25],
1210      [23, 45, 15, 28, 46, 16],
1211
1212      // 32
1213      [17, 145, 115],
1214      [10, 74, 46, 23, 75, 47],
1215      [10, 54, 24, 35, 55, 25],
1216      [19, 45, 15, 35, 46, 16],
1217
1218      // 33
1219      [17, 145, 115, 1, 146, 116],
1220      [14, 74, 46, 21, 75, 47],
1221      [29, 54, 24, 19, 55, 25],
1222      [11, 45, 15, 46, 46, 16],
1223
1224      // 34
1225      [13, 145, 115, 6, 146, 116],
1226      [14, 74, 46, 23, 75, 47],
1227      [44, 54, 24, 7, 55, 25],
1228      [59, 46, 16, 1, 47, 17],
1229
1230      // 35
1231      [12, 151, 121, 7, 152, 122],
1232      [12, 75, 47, 26, 76, 48],
1233      [39, 54, 24, 14, 55, 25],
1234      [22, 45, 15, 41, 46, 16],
1235
1236      // 36
1237      [6, 151, 121, 14, 152, 122],
1238      [6, 75, 47, 34, 76, 48],
1239      [46, 54, 24, 10, 55, 25],
1240      [2, 45, 15, 64, 46, 16],
1241
1242      // 37
1243      [17, 152, 122, 4, 153, 123],
1244      [29, 74, 46, 14, 75, 47],
1245      [49, 54, 24, 10, 55, 25],
1246      [24, 45, 15, 46, 46, 16],
1247
1248      // 38
1249      [4, 152, 122, 18, 153, 123],
1250      [13, 74, 46, 32, 75, 47],
1251      [48, 54, 24, 14, 55, 25],
1252      [42, 45, 15, 32, 46, 16],
1253
1254      // 39
1255      [20, 147, 117, 4, 148, 118],
1256      [40, 75, 47, 7, 76, 48],
1257      [43, 54, 24, 22, 55, 25],
1258      [10, 45, 15, 67, 46, 16],
1259
1260      // 40
1261      [19, 148, 118, 6, 149, 119],
1262      [18, 75, 47, 31, 76, 48],
1263      [34, 54, 24, 34, 55, 25],
1264      [20, 45, 15, 61, 46, 16]
1265    ];
1266
1267    var qrRSBlock = function(totalCount, dataCount) {
1268      var _this = {};
1269      _this.totalCount = totalCount;
1270      _this.dataCount = dataCount;
1271      return _this;
1272    };
1273
1274    var _this = {};
1275
1276    var getRsBlockTable = function(typeNumber, errorCorrectionLevel) {
1277
1278      switch(errorCorrectionLevel) {
1279      case QRErrorCorrectionLevel.L :
1280        return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 0];
1281      case QRErrorCorrectionLevel.M :
1282        return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 1];
1283      case QRErrorCorrectionLevel.Q :
1284        return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 2];
1285      case QRErrorCorrectionLevel.H :
1286        return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 3];
1287      default :
1288        return undefined;
1289      }
1290    };
1291
1292    _this.getRSBlocks = function(typeNumber, errorCorrectionLevel) {
1293
1294      var rsBlock = getRsBlockTable(typeNumber, errorCorrectionLevel);
1295
1296      if (typeof rsBlock == 'undefined') {
1297        throw new Error('bad rs block @ typeNumber:' + typeNumber +
1298            '/errorCorrectionLevel:' + errorCorrectionLevel);
1299      }
1300
1301      var length = rsBlock.length / 3;
1302
1303      var list = new Array();
1304
1305      for (var i = 0; i < length; i += 1) {
1306
1307        var count = rsBlock[i * 3 + 0];
1308        var totalCount = rsBlock[i * 3 + 1];
1309        var dataCount = rsBlock[i * 3 + 2];
1310
1311        for (var j = 0; j < count; j += 1) {
1312          list.push(qrRSBlock(totalCount, dataCount) );
1313        }
1314      }
1315
1316      return list;
1317    };
1318
1319    return _this;
1320  }();
1321
1322  //---------------------------------------------------------------------
1323  // qrBitBuffer
1324  //---------------------------------------------------------------------
1325
1326  var qrBitBuffer = function() {
1327
1328    var _buffer = new Array();
1329    var _length = 0;
1330
1331    var _this = {};
1332
1333    _this.getBuffer = function() {
1334      return _buffer;
1335    };
1336
1337    _this.getAt = function(index) {
1338      var bufIndex = Math.floor(index / 8);
1339      return ( (_buffer[bufIndex] >>> (7 - index % 8) ) & 1) == 1;
1340    };
1341
1342    _this.put = function(num, length) {
1343      for (var i = 0; i < length; i += 1) {
1344        _this.putBit( ( (num >>> (length - i - 1) ) & 1) == 1);
1345      }
1346    };
1347
1348    _this.getLengthInBits = function() {
1349      return _length;
1350    };
1351
1352    _this.putBit = function(bit) {
1353
1354      var bufIndex = Math.floor(_length / 8);
1355      if (_buffer.length <= bufIndex) {
1356        _buffer.push(0);
1357      }
1358
1359      if (bit) {
1360        _buffer[bufIndex] |= (0x80 >>> (_length % 8) );
1361      }
1362
1363      _length += 1;
1364    };
1365
1366    return _this;
1367  };
1368
1369  //---------------------------------------------------------------------
1370  // qr8BitByte
1371  //---------------------------------------------------------------------
1372
1373  var qr8BitByte = function(data) {
1374
1375    var _mode = QRMode.MODE_8BIT_BYTE;
1376    var _data = data;
1377    var _bytes = qrcode.stringToBytes(data);
1378
1379    var _this = {};
1380
1381    _this.getMode = function() {
1382      return _mode;
1383    };
1384
1385    _this.getLength = function(buffer) {
1386      return _bytes.length;
1387    };
1388
1389    _this.write = function(buffer) {
1390      for (var i = 0; i < _bytes.length; i += 1) {
1391        buffer.put(_bytes[i], 8);
1392      }
1393    };
1394
1395    return _this;
1396  };
1397
1398  //=====================================================================
1399  // GIF Support etc.
1400  //
1401
1402  //---------------------------------------------------------------------
1403  // byteArrayOutputStream
1404  //---------------------------------------------------------------------
1405
1406  var byteArrayOutputStream = function() {
1407
1408    var _bytes = new Array();
1409
1410    var _this = {};
1411
1412    _this.writeByte = function(b) {
1413      _bytes.push(b & 0xff);
1414    };
1415
1416    _this.writeShort = function(i) {
1417      _this.writeByte(i);
1418      _this.writeByte(i >>> 8);
1419    };
1420
1421    _this.writeBytes = function(b, off, len) {
1422      off = off || 0;
1423      len = len || b.length;
1424      for (var i = 0; i < len; i += 1) {
1425        _this.writeByte(b[i + off]);
1426      }
1427    };
1428
1429    _this.writeString = function(s) {
1430      for (var i = 0; i < s.length; i += 1) {
1431        _this.writeByte(s.charCodeAt(i) );
1432      }
1433    };
1434
1435    _this.toByteArray = function() {
1436      return _bytes;
1437    };
1438
1439    _this.toString = function() {
1440      var s = '';
1441      s += '[';
1442      for (var i = 0; i < _bytes.length; i += 1) {
1443        if (i > 0) {
1444          s += ',';
1445        }
1446        s += _bytes[i];
1447      }
1448      s += ']';
1449      return s;
1450    };
1451
1452    return _this;
1453  };
1454
1455  //---------------------------------------------------------------------
1456  // base64EncodeOutputStream
1457  //---------------------------------------------------------------------
1458
1459  var base64EncodeOutputStream = function() {
1460
1461    var _buffer = 0;
1462    var _buflen = 0;
1463    var _length = 0;
1464    var _base64 = '';
1465
1466    var _this = {};
1467
1468    var writeEncoded = function(b) {
1469      _base64 += String.fromCharCode(encode(b & 0x3f) );
1470    };
1471
1472    var encode = function(n) {
1473      if (n < 0) {
1474        // error.
1475      } else if (n < 26) {
1476        return 0x41 + n;
1477      } else if (n < 52) {
1478        return 0x61 + (n - 26);
1479      } else if (n < 62) {
1480        return 0x30 + (n - 52);
1481      } else if (n == 62) {
1482        return 0x2b;
1483      } else if (n == 63) {
1484        return 0x2f;
1485      }
1486      throw new Error('n:' + n);
1487    };
1488
1489    _this.writeByte = function(n) {
1490
1491      _buffer = (_buffer << 8) | (n & 0xff);
1492      _buflen += 8;
1493      _length += 1;
1494
1495      while (_buflen >= 6) {
1496        writeEncoded(_buffer >>> (_buflen - 6) );
1497        _buflen -= 6;
1498      }
1499    };
1500
1501    _this.flush = function() {
1502
1503      if (_buflen > 0) {
1504        writeEncoded(_buffer << (6 - _buflen) );
1505        _buffer = 0;
1506        _buflen = 0;
1507      }
1508
1509      if (_length % 3 != 0) {
1510        // padding
1511        var padlen = 3 - _length % 3;
1512        for (var i = 0; i < padlen; i += 1) {
1513          _base64 += '=';
1514        }
1515      }
1516    };
1517
1518    _this.toString = function() {
1519      return _base64;
1520    };
1521
1522    return _this;
1523  };
1524
1525  //---------------------------------------------------------------------
1526  // base64DecodeInputStream
1527  //---------------------------------------------------------------------
1528
1529  var base64DecodeInputStream = function(str) {
1530
1531    var _str = str;
1532    var _pos = 0;
1533    var _buffer = 0;
1534    var _buflen = 0;
1535
1536    var _this = {};
1537
1538    _this.read = function() {
1539
1540      while (_buflen < 8) {
1541
1542        if (_pos >= _str.length) {
1543          if (_buflen == 0) {
1544            return -1;
1545          }
1546          throw new Error('unexpected end of file./' + _buflen);
1547        }
1548
1549        var c = _str.charAt(_pos);
1550        _pos += 1;
1551
1552        if (c == '=') {
1553          _buflen = 0;
1554          return -1;
1555        } else if (c.match(/^\s$/) ) {
1556          // ignore if whitespace.
1557          continue;
1558        }
1559
1560        _buffer = (_buffer << 6) | decode(c.charCodeAt(0) );
1561        _buflen += 6;
1562      }
1563
1564      var n = (_buffer >>> (_buflen - 8) ) & 0xff;
1565      _buflen -= 8;
1566      return n;
1567    };
1568
1569    var decode = function(c) {
1570      if (0x41 <= c && c <= 0x5a) {
1571        return c - 0x41;
1572      } else if (0x61 <= c && c <= 0x7a) {
1573        return c - 0x61 + 26;
1574      } else if (0x30 <= c && c <= 0x39) {
1575        return c - 0x30 + 52;
1576      } else if (c == 0x2b) {
1577        return 62;
1578      } else if (c == 0x2f) {
1579        return 63;
1580      } else {
1581        throw new Error('c:' + c);
1582      }
1583    };
1584
1585    return _this;
1586  };
1587
1588  //---------------------------------------------------------------------
1589  // gifImage (B/W)
1590  //---------------------------------------------------------------------
1591
1592  var gifImage = function(width, height) {
1593
1594    var _width = width;
1595    var _height = height;
1596    var _data = new Array(width * height);
1597
1598    var _this = {};
1599
1600    _this.setPixel = function(x, y, pixel) {
1601      _data[y * _width + x] = pixel;
1602    };
1603
1604    _this.write = function(out) {
1605
1606      //---------------------------------
1607      // GIF Signature
1608
1609      out.writeString('GIF87a');
1610
1611      //---------------------------------
1612      // Screen Descriptor
1613
1614      out.writeShort(_width);
1615      out.writeShort(_height);
1616
1617      out.writeByte(0x80); // 2bit
1618      out.writeByte(0);
1619      out.writeByte(0);
1620
1621      //---------------------------------
1622      // Global Color Map
1623
1624      // black
1625      out.writeByte(0x00);
1626      out.writeByte(0x00);
1627      out.writeByte(0x00);
1628
1629      // white
1630      out.writeByte(0xff);
1631      out.writeByte(0xff);
1632      out.writeByte(0xff);
1633
1634      //---------------------------------
1635      // Image Descriptor
1636
1637      out.writeString(',');
1638      out.writeShort(0);
1639      out.writeShort(0);
1640      out.writeShort(_width);
1641      out.writeShort(_height);
1642      out.writeByte(0);
1643
1644      //---------------------------------
1645      // Local Color Map
1646
1647      //---------------------------------
1648      // Raster Data
1649
1650      var lzwMinCodeSize = 2;
1651      var raster = getLZWRaster(lzwMinCodeSize);
1652
1653      out.writeByte(lzwMinCodeSize);
1654
1655      var offset = 0;
1656
1657      while (raster.length - offset > 255) {
1658        out.writeByte(255);
1659        out.writeBytes(raster, offset, 255);
1660        offset += 255;
1661      }
1662
1663      out.writeByte(raster.length - offset);
1664      out.writeBytes(raster, offset, raster.length - offset);
1665      out.writeByte(0x00);
1666
1667      //---------------------------------
1668      // GIF Terminator
1669      out.writeString(';');
1670    };
1671
1672    var bitOutputStream = function(out) {
1673
1674      var _out = out;
1675      var _bitLength = 0;
1676      var _bitBuffer = 0;
1677
1678      var _this = {};
1679
1680      _this.write = function(data, length) {
1681
1682        if ( (data >>> length) != 0) {
1683          throw new Error('length over');
1684        }
1685
1686        while (_bitLength + length >= 8) {
1687          _out.writeByte(0xff & ( (data << _bitLength) | _bitBuffer) );
1688          length -= (8 - _bitLength);
1689          data >>>= (8 - _bitLength);
1690          _bitBuffer = 0;
1691          _bitLength = 0;
1692        }
1693
1694        _bitBuffer = (data << _bitLength) | _bitBuffer;
1695        _bitLength = _bitLength + length;
1696      };
1697
1698      _this.flush = function() {
1699        if (_bitLength > 0) {
1700          _out.writeByte(_bitBuffer);
1701        }
1702      };
1703
1704      return _this;
1705    };
1706
1707    var getLZWRaster = function(lzwMinCodeSize) {
1708
1709      var clearCode = 1 << lzwMinCodeSize;
1710      var endCode = (1 << lzwMinCodeSize) + 1;
1711      var bitLength = lzwMinCodeSize + 1;
1712
1713      // Setup LZWTable
1714      var table = lzwTable();
1715
1716      for (var i = 0; i < clearCode; i += 1) {
1717        table.add(String.fromCharCode(i) );
1718      }
1719      table.add(String.fromCharCode(clearCode) );
1720      table.add(String.fromCharCode(endCode) );
1721
1722      var byteOut = byteArrayOutputStream();
1723      var bitOut = bitOutputStream(byteOut);
1724
1725      // clear code
1726      bitOut.write(clearCode, bitLength);
1727
1728      var dataIndex = 0;
1729
1730      var s = String.fromCharCode(_data[dataIndex]);
1731      dataIndex += 1;
1732
1733      while (dataIndex < _data.length) {
1734
1735        var c = String.fromCharCode(_data[dataIndex]);
1736        dataIndex += 1;
1737
1738        if (table.contains(s + c) ) {
1739
1740          s = s + c;
1741
1742        } else {
1743
1744          bitOut.write(table.indexOf(s), bitLength);
1745
1746          if (table.size() < 0xfff) {
1747
1748            if (table.size() == (1 << bitLength) ) {
1749              bitLength += 1;
1750            }
1751
1752            table.add(s + c);
1753          }
1754
1755          s = c;
1756        }
1757      }
1758
1759      bitOut.write(table.indexOf(s), bitLength);
1760
1761      // end code
1762      bitOut.write(endCode, bitLength);
1763
1764      bitOut.flush();
1765
1766      return byteOut.toByteArray();
1767    };
1768
1769    var lzwTable = function() {
1770
1771      var _map = {};
1772      var _size = 0;
1773
1774      var _this = {};
1775
1776      _this.add = function(key) {
1777        if (_this.contains(key) ) {
1778          throw new Error('dup key:' + key);
1779        }
1780        _map[key] = _size;
1781        _size += 1;
1782      };
1783
1784      _this.size = function() {
1785        return _size;
1786      };
1787
1788      _this.indexOf = function(key) {
1789        return _map[key];
1790      };
1791
1792      _this.contains = function(key) {
1793        return typeof _map[key] != 'undefined';
1794      };
1795
1796      return _this;
1797    };
1798
1799    return _this;
1800  };
1801
1802  var createImgTag = function(width, height, getPixel, alt) {
1803
1804    var gif = gifImage(width, height);
1805    for (var y = 0; y < height; y += 1) {
1806      for (var x = 0; x < width; x += 1) {
1807        gif.setPixel(x, y, getPixel(x, y) );
1808      }
1809    }
1810
1811    var b = byteArrayOutputStream();
1812    gif.write(b);
1813
1814    var base64 = base64EncodeOutputStream();
1815    var bytes = b.toByteArray();
1816    for (var i = 0; i < bytes.length; i += 1) {
1817      base64.writeByte(bytes[i]);
1818    }
1819    base64.flush();
1820
1821    var img = '';
1822    img += '<img';
1823    img += '\u0020src="';
1824    img += 'data:image/gif;base64,';
1825    img += base64;
1826    img += '"';
1827    img += '\u0020width="';
1828    img += width;
1829    img += '"';
1830    img += '\u0020height="';
1831    img += height;
1832    img += '"';
1833    if (alt) {
1834      img += '\u0020alt="';
1835      img += alt;
1836      img += '"';
1837    }
1838    img += '/>';
1839
1840    return img;
1841  };
1842
1843  //---------------------------------------------------------------------
1844  // returns qrcode function.
1845
1846  return qrcode;
1847}();
1848
1849(function (factory) {
1850  if (typeof define === 'function' && define.amd) {
1851      define([], factory);
1852  } else if (typeof exports === 'object' && typeof module !== 'undefined' && module.exports) {
1853      module.exports = factory();
1854  }
1855}(function () {
1856    return qrcode;
1857}));

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.