vendor: 12,770 bytes, lines 1-495
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 = []; 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 'code length overflow. (' 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, mode) { 387 388 mode = mode || 'Byte'; 389 390 var newData = null; 391 392 switch(mode) { 393 case 'Numeric' : 394 newData = qrNumber(data); 395 break; 396 case 'Alphanumeric' : 397 newData = qrAlphaNum(data); 398 break; 399 case 'Byte' : 400 newData = qr8BitByte(data); 401 break; 402 case 'Kanji' : 403 newData = qrKanji(data); 404 break; 405 default : 406 throw 'mode:' + mode; 407 } 408 409 _dataList.push(newData); 410 _dataCache = null; 411 }; 412 413 _this.isDark = function(row, col) { 414 if (row < 0 || _moduleCount <= row || col < 0 || _moduleCount <= col) { 415 throw row + ',' + col; 416 } 417 return _modules[row][col]; 418 }; 419 420 _this.getModuleCount = function() { 421 return _moduleCount; 422 }; 423 424 _this.make = function() { 425 if (_typeNumber < 1) { 426 var typeNumber = 1; 427 428 for (; typeNumber < 40; typeNumber++) { 429 var rsBlocks = QRRSBlock.getRSBlocks(typeNumber, _errorCorrectionLevel); 430 var buffer = qrBitBuffer(); 431 432 for (var i = 0; i < _dataList.length; i++) { 433 var data = _dataList[i]; 434 buffer.put(data.getMode(), 4); 435 buffer.put(data.getLength(), QRUtil.getLengthInBits(data.getMode(), typeNumber) ); 436 data.write(buffer); 437 } 438 439 var totalDataCount = 0; 440 for (var i = 0; i < rsBlocks.length; i++) { 441 totalDataCount += rsBlocks[i].dataCount; 442 } 443 444 if (buffer.getLengthInBits() <= totalDataCount * 8) { 445 break; 446 } 447 } 448 449 _typeNumber = typeNumber; 450 } 451 452 makeImpl(false, getBestMaskPattern() ); 453 }; 454 455 _this.createTableTag = function(cellSize, margin) { 456 457 cellSize = cellSize || 2; 458 margin = (typeof margin == 'undefined')? cellSize * 4 : margin; 459 460 var qrHtml = ''; 461 462 qrHtml += '<table style="'; 463 qrHtml += ' border-width: 0px; border-style: none;'; 464 qrHtml += ' border-collapse: collapse;'; 465 qrHtml += ' padding: 0px; margin: ' + margin + 'px;'; 466 qrHtml += '">'; 467 qrHtml += '<tbody>'; 468 469 for (var r = 0; r < _this.getModuleCount(); r += 1) { 470 471 qrHtml += '<tr>'; 472 473 for (var c = 0; c < _this.getModuleCount(); c += 1) { 474 qrHtml += '<td style="'; 475 qrHtml += ' border-width: 0px; border-style: none;'; 476 qrHtml += ' border-collapse: collapse;'; 477 qrHtml += ' padding: 0px; margin: 0px;'; 478 qrHtml += ' width: ' + cellSize + 'px;'; 479 qrHtml += ' height: ' + cellSize + 'px;'; 480 qrHtml += ' background-color: '; 481 qrHtml += _this.isDark(r, c)? '#000000' : '#ffffff'; 482 qrHtml += ';'; 483 qrHtml += '"/>'; 484 } 485 486 qrHtml += '</tr>'; 487 } 488 489 qrHtml += '</tbody>'; 490 qrHtml += '</table>'; 491 492 return qrHtml; 493 }; 494 495 _this.createSvgTag = function(cellSize, margin
vendor: 5,247 bytes, lines 495-675
495) { 496 497 cellSize = cellSize || 2; 498 margin = (typeof margin == 'undefined')? cellSize * 4 : margin; 499 var size = _this.getModuleCount() * cellSize + margin * 2; 500 var c, mc, r, mr, qrSvg='', rect; 501 502 rect = 'l' + cellSize + ',0 0,' + cellSize + 503 ' -' + cellSize + ',0 0,-' + cellSize + 'z '; 504 505 qrSvg += '<svg version="1.1" xmlns="http://www.w3.org/2000/svg"'; 506 qrSvg += ' width="' + size + 'px"'; 507 qrSvg += ' height="' + size + 'px"'; 508 qrSvg += ' viewBox="0 0 ' + size + ' ' + size + '" '; 509 qrSvg += ' preserveAspectRatio="xMinYMin meet">'; 510 qrSvg += '<rect width="100%" height="100%" fill="white" cx="0" cy="0"/>'; 511 qrSvg += '<path d="'; 512 513 for (r = 0; r < _this.getModuleCount(); r += 1) { 514 mr = r * cellSize + margin; 515 for (c = 0; c < _this.getModuleCount(); c += 1) { 516 if (_this.isDark(r, c) ) { 517 mc = c*cellSize+margin; 518 qrSvg += 'M' + mc + ',' + mr + rect; 519 } 520 } 521 } 522 523 qrSvg += '" stroke="transparent" fill="black"/>'; 524 qrSvg += '</svg>'; 525 526 return qrSvg; 527 }; 528 529 _this.createDataURL = function(cellSize, margin) { 530 531 cellSize = cellSize || 2; 532 margin = (typeof margin == 'undefined')? cellSize * 4 : margin; 533 534 var size = _this.getModuleCount() * cellSize + margin * 2; 535 var min = margin; 536 var max = size - margin; 537 538 return createDataURL(size, size, function(x, y) { 539 if (min <= x && x < max && min <= y && y < max) { 540 var c = Math.floor( (x - min) / cellSize); 541 var r = Math.floor( (y - min) / cellSize); 542 return _this.isDark(r, c)? 0 : 1; 543 } else { 544 return 1; 545 } 546 } ); 547 }; 548 549 _this.createImgTag = function(cellSize, margin, alt) { 550 551 cellSize = cellSize || 2; 552 margin = (typeof margin == 'undefined')? cellSize * 4 : margin; 553 554 var size = _this.getModuleCount() * cellSize + margin * 2; 555 556 var img = ''; 557 img += '<img'; 558 img += '\u0020src="'; 559 img += _this.createDataURL(cellSize, margin); 560 img += '"'; 561 img += '\u0020width="'; 562 img += size; 563 img += '"'; 564 img += '\u0020height="'; 565 img += size; 566 img += '"'; 567 if (alt) { 568 img += '\u0020alt="'; 569 img += alt; 570 img += '"'; 571 } 572 img += '/>'; 573 574 return img; 575 }; 576 577 var _createHalfASCII = function(margin) { 578 var cellSize = 1; 579 margin = (typeof margin == 'undefined')? cellSize * 2 : margin; 580 581 var size = _this.getModuleCount() * cellSize + margin * 2; 582 var min = margin; 583 var max = size - margin; 584 585 var y, x, r1, r2, p; 586 587 var blocks = { 588 '██': '█', 589 '█ ': '▀', 590 ' █': '▄', 591 ' ': ' ' 592 }; 593 594 var ascii = ''; 595 for (y = 0; y < size; y += 2) { 596 r1 = Math.floor((y - min) / cellSize); 597 r2 = Math.floor((y + 1 - min) / cellSize); 598 for (x = 0; x < size; x += 1) { 599 p = '█'; 600 601 if (min <= x && x < max && min <= y && y < max && _this.isDark(r1, Math.floor((x - min) / cellSize))) { 602 p = ' '; 603 } 604 605 if (min <= x && x < max && min <= y+1 && y+1 < max && _this.isDark(r2, Math.floor((x - min) / cellSize))) { 606 p += ' '; 607 } 608 else { 609 p += '█'; 610 } 611 612 // Output 2 characters per pixel, to create full square. 1 character per pixels gives only half width of square. 613 ascii += blocks[p]; 614 } 615 616 ascii += '\n'; 617 } 618 619 if (size % 2) { 620 return ascii.substring(0, ascii.length - size - 1) + Array(size+1).join('▀'); 621 } 622 623 return ascii.substring(0, ascii.length-1); 624 }; 625 626 _this.createASCII = function(cellSize, margin) { 627 cellSize = cellSize || 1; 628 629 if (cellSize < 2) { 630 return _createHalfASCII(margin); 631 } 632 633 cellSize -= 1; 634 margin = (typeof margin == 'undefined')? cellSize * 2 : margin; 635 636 var size = _this.getModuleCount() * cellSize + margin * 2; 637 var min = margin; 638 var max = size - margin; 639 640 var y, x, r, p; 641 642 var white = Array(cellSize+1).join('██'); 643 var black = Array(cellSize+1).join(' '); 644 645 var ascii = ''; 646 var line = ''; 647 for (y = 0; y < size; y += 1) { 648 r = Math.floor( (y - min) / cellSize); 649 line = ''; 650 for (x = 0; x < size; x += 1) { 651 p = 1; 652 653 if (min <= x && x < max && min <= y && y < max && _this.isDark(r, Math.floor((x - min) / cellSize))) { 654 p = 0; 655 } 656 657 // Output 2 characters per pixel, to create full square. 1 character per pixels gives only half width of square. 658 line += p ? white : black; 659 } 660 661 for (r = 0; r < cellSize; r += 1) { 662 ascii += line + '\n'; 663 } 664 } 665 666 return ascii.substring(0, ascii.length-1); 667 }; 668 669 _this.renderTo2dContext = function(context, cellSize) { 670 cellSize = cellSize || 2; 671 var length = _this.getModuleCount(); 672 for (var row = 0; row < length; row++) { 673 for (var col = 0; col < length; col++) { 674 context.fillStyle = _this.isDark(row, col) ? 'black' : 'white'; 675 context.fillRect(row * cellSize, col
vendor: 16,983 bytes, lines 675-1369
675 * cellSize, cellSize, cellSize); 676 } 677 } 678 } 679 680 return _this; 681 }; 682 683 //--------------------------------------------------------------------- 684 // qrcode.stringToBytes 685 //--------------------------------------------------------------------- 686 687 qrcode.stringToBytesFuncs = { 688 'default' : function(s) { 689 var bytes = []; 690 for (var i = 0; i < s.length; i += 1) { 691 var c = s.charCodeAt(i); 692 bytes.push(c & 0xff); 693 } 694 return bytes; 695 } 696 }; 697 698 qrcode.stringToBytes = qrcode.stringToBytesFuncs['default']; 699 700 //--------------------------------------------------------------------- 701 // qrcode.createStringToBytes 702 //--------------------------------------------------------------------- 703 704 /** 705 * @param unicodeData base64 string of byte array. 706 * [16bit Unicode],[16bit Bytes], ... 707 * @param numChars 708 */ 709 qrcode.createStringToBytes = function(unicodeData, numChars) { 710 711 // create conversion map. 712 713 var unicodeMap = function() { 714 715 var bin = base64DecodeInputStream(unicodeData); 716 var read = function() { 717 var b = bin.read(); 718 if (b == -1) throw 'eof'; 719 return b; 720 }; 721 722 var count = 0; 723 var unicodeMap = {}; 724 while (true) { 725 var b0 = bin.read(); 726 if (b0 == -1) break; 727 var b1 = read(); 728 var b2 = read(); 729 var b3 = read(); 730 var k = String.fromCharCode( (b0 << 8) | b1); 731 var v = (b2 << 8) | b3; 732 unicodeMap[k] = v; 733 count += 1; 734 } 735 if (count != numChars) { 736 throw count + ' != ' + numChars; 737 } 738 739 return unicodeMap; 740 }(); 741 742 var unknownChar = '?'.charCodeAt(0); 743 744 return function(s) { 745 var bytes = []; 746 for (var i = 0; i < s.length; i += 1) { 747 var c = s.charCodeAt(i); 748 if (c < 128) { 749 bytes.push(c); 750 } else { 751 var b = unicodeMap[s.charAt(i)]; 752 if (typeof b == 'number') { 753 if ( (b & 0xff) == b) { 754 // 1byte 755 bytes.push(b); 756 } else { 757 // 2bytes 758 bytes.push(b >>> 8); 759 bytes.push(b & 0xff); 760 } 761 } else { 762 bytes.push(unknownChar); 763 } 764 } 765 } 766 return bytes; 767 }; 768 }; 769 770 //--------------------------------------------------------------------- 771 // QRMode 772 //--------------------------------------------------------------------- 773 774 var QRMode = { 775 MODE_NUMBER : 1 << 0, 776 MODE_ALPHA_NUM : 1 << 1, 777 MODE_8BIT_BYTE : 1 << 2, 778 MODE_KANJI : 1 << 3 779 }; 780 781 //--------------------------------------------------------------------- 782 // QRErrorCorrectionLevel 783 //--------------------------------------------------------------------- 784 785 var QRErrorCorrectionLevel = { 786 L : 1, 787 M : 0, 788 Q : 3, 789 H : 2 790 }; 791 792 //--------------------------------------------------------------------- 793 // QRMaskPattern 794 //--------------------------------------------------------------------- 795 796 var QRMaskPattern = { 797 PATTERN000 : 0, 798 PATTERN001 : 1, 799 PATTERN010 : 2, 800 PATTERN011 : 3, 801 PATTERN100 : 4, 802 PATTERN101 : 5, 803 PATTERN110 : 6, 804 PATTERN111 : 7 805 }; 806 807 //--------------------------------------------------------------------- 808 // QRUtil 809 //--------------------------------------------------------------------- 810 811 var QRUtil = function() { 812 813 var PATTERN_POSITION_TABLE = [ 814 [], 815 [6, 18], 816 [6, 22], 817 [6, 26], 818 [6, 30], 819 [6, 34], 820 [6, 22, 38], 821 [6, 24, 42], 822 [6, 26, 46], 823 [6, 28, 50], 824 [6, 30, 54], 825 [6, 32, 58], 826 [6, 34, 62], 827 [6, 26, 46, 66], 828 [6, 26, 48, 70], 829 [6, 26, 50, 74], 830 [6, 30, 54, 78], 831 [6, 30, 56, 82], 832 [6, 30, 58, 86], 833 [6, 34, 62, 90], 834 [6, 28, 50, 72, 94], 835 [6, 26, 50, 74, 98], 836 [6, 30, 54, 78, 102], 837 [6, 28, 54, 80, 106], 838 [6, 32, 58, 84, 110], 839 [6, 30, 58, 86, 114], 840 [6, 34, 62, 90, 118], 841 [6, 26, 50, 74, 98, 122], 842 [6, 30, 54, 78, 102, 126], 843 [6, 26, 52, 78, 104, 130], 844 [6, 30, 56, 82, 108, 134], 845 [6, 34, 60, 86, 112, 138], 846 [6, 30, 58, 86, 114, 142], 847 [6, 34, 62, 90, 118, 146], 848 [6, 30, 54, 78, 102, 126, 150], 849 [6, 24, 50, 76, 102, 128, 154], 850 [6, 28, 54, 80, 106, 132, 158], 851 [6, 32, 58, 84, 110, 136, 162], 852 [6, 26, 54, 82, 110, 138, 166], 853 [6, 30, 58, 86, 114, 142, 170] 854 ]; 855 var G15 = (1 << 10) | (1 << 8) | (1 << 5) | (1 << 4) | (1 << 2) | (1 << 1) | (1 << 0); 856 var G18 = (1 << 12) | (1 << 11) | (1 << 10) | (1 << 9) | (1 << 8) | (1 << 5) | (1 << 2) | (1 << 0); 857 var G15_MASK = (1 << 14) | (1 << 12) | (1 << 10) | (1 << 4) | (1 << 1); 858 859 var _this = {}; 860 861 var getBCHDigit = function(data) { 862 var digit = 0; 863 while (data != 0) { 864 digit += 1; 865 data >>>= 1; 866 } 867 return digit; 868 }; 869 870 _this.getBCHTypeInfo = function(data) { 871 var d = data << 10; 872 while (getBCHDigit(d) - getBCHDigit(G15) >= 0) { 873 d ^= (G15 << (getBCHDigit(d) - getBCHDigit(G15) ) ); 874 } 875 return ( (data << 10) | d) ^ G15_MASK; 876 }; 877 878 _this.getBCHTypeNumber = function(data) { 879 var d = data << 12; 880 while (getBCHDigit(d) - getBCHDigit(G18) >= 0) { 881 d ^= (G18 << (getBCHDigit(d) - getBCHDigit(G18) ) ); 882 } 883 return (data << 12) | d; 884 }; 885 886 _this.getPatternPosition = function(typeNumber) { 887 return PATTERN_POSITION_TABLE[typeNumber - 1]; 888 }; 889 890 _this.getMaskFunction = function(maskPattern) { 891 892 switch (maskPattern) { 893 894 case QRMaskPattern.PATTERN000 : 895 return function(i, j) { return (i + j) % 2 == 0; }; 896 case QRMaskPattern.PATTERN001 : 897 return function(i, j) { return i % 2 == 0; }; 898 case QRMaskPattern.PATTERN010 : 899 return function(i, j) { return j % 3 == 0; }; 900 case QRMaskPattern.PATTERN011 : 901 return function(i, j) { return (i + j) % 3 == 0; }; 902 case QRMaskPattern.PATTERN100 : 903 return function(i, j) { return (Math.floor(i / 2) + Math.floor(j / 3) ) % 2 == 0; }; 904 case QRMaskPattern.PATTERN101 : 905 return function(i, j) { return (i * j) % 2 + (i * j) % 3 == 0; }; 906 case QRMaskPattern.PATTERN110 : 907 return function(i, j) { return ( (i * j) % 2 + (i * j) % 3) % 2 == 0; }; 908 case QRMaskPattern.PATTERN111 : 909 return function(i, j) { return ( (i * j) % 3 + (i + j) % 2) % 2 == 0; }; 910 911 default : 912 throw 'bad maskPattern:' + maskPattern; 913 } 914 }; 915 916 _this.getErrorCorrectPolynomial = function(errorCorrectLength) { 917 var a = qrPolynomial([1], 0); 918 for (var i = 0; i < errorCorrectLength; i += 1) { 919 a = a.multiply(qrPolynomial([1, QRMath.gexp(i)], 0) ); 920 } 921 return a; 922 }; 923 924 _this.getLengthInBits = function(mode, type) { 925 926 if (1 <= type && type < 10) { 927 928 // 1 - 9 929 930 switch(mode) { 931 case QRMode.MODE_NUMBER : return 10; 932 case QRMode.MODE_ALPHA_NUM : return 9; 933 case QRMode.MODE_8BIT_BYTE : return 8; 934 case QRMode.MODE_KANJI : return 8; 935 default : 936 throw 'mode:' + mode; 937 } 938 939 } else if (type < 27) { 940 941 // 10 - 26 942 943 switch(mode) { 944 case QRMode.MODE_NUMBER : return 12; 945 case QRMode.MODE_ALPHA_NUM : return 11; 946 case QRMode.MODE_8BIT_BYTE : return 16; 947 case QRMode.MODE_KANJI : return 10; 948 default : 949 throw 'mode:' + mode; 950 } 951 952 } else if (type < 41) { 953 954 // 27 - 40 955 956 switch(mode) { 957 case QRMode.MODE_NUMBER : return 14; 958 case QRMode.MODE_ALPHA_NUM : return 13; 959 case QRMode.MODE_8BIT_BYTE : return 16; 960 case QRMode.MODE_KANJI : return 12; 961 default : 962 throw 'mode:' + mode; 963 } 964 965 } else { 966 throw 'type:' + type; 967 } 968 }; 969 970 _this.getLostPoint = function(qrcode) { 971 972 var moduleCount = qrcode.getModuleCount(); 973 974 var lostPoint = 0; 975 976 // LEVEL1 977 978 for (var row = 0; row < moduleCount; row += 1) { 979 for (var col = 0; col < moduleCount; col += 1) { 980 981 var sameCount = 0; 982 var dark = qrcode.isDark(row, col); 983 984 for (var r = -1; r <= 1; r += 1) { 985 986 if (row + r < 0 || moduleCount <= row + r) { 987 continue; 988 } 989 990 for (var c = -1; c <= 1; c += 1) { 991 992 if (col + c < 0 || moduleCount <= col + c) { 993 continue; 994 } 995 996 if (r == 0 && c == 0) { 997 continue; 998 } 999 1000 if (dark == qrcode.isDark(row + r, col + c) ) { 1001 sameCount += 1; 1002 } 1003 } 1004 } 1005 1006 if (sameCount > 5) { 1007 lostPoint += (3 + sameCount - 5); 1008 } 1009 } 1010 }; 1011 1012 // LEVEL2 1013 1014 for (var row = 0; row < moduleCount - 1; row += 1) { 1015 for (var col = 0; col < moduleCount - 1; col += 1) { 1016 var count = 0; 1017 if (qrcode.isDark(row, col) ) count += 1; 1018 if (qrcode.isDark(row + 1, col) ) count += 1; 1019 if (qrcode.isDark(row, col + 1) ) count += 1; 1020 if (qrcode.isDark(row + 1, col + 1) ) count += 1; 1021 if (count == 0 || count == 4) { 1022 lostPoint += 3; 1023 } 1024 } 1025 } 1026 1027 // LEVEL3 1028 1029 for (var row = 0; row < moduleCount; row += 1) { 1030 for (var col = 0; col < moduleCount - 6; col += 1) { 1031 if (qrcode.isDark(row, col) 1032 && !qrcode.isDark(row, col + 1) 1033 && qrcode.isDark(row, col + 2) 1034 && qrcode.isDark(row, col + 3) 1035 && qrcode.isDark(row, col + 4) 1036 && !qrcode.isDark(row, col + 5) 1037 && qrcode.isDark(row, col + 6) ) { 1038 lostPoint += 40; 1039 } 1040 } 1041 } 1042 1043 for (var col = 0; col < moduleCount; col += 1) { 1044 for (var row = 0; row < moduleCount - 6; row += 1) { 1045 if (qrcode.isDark(row, col) 1046 && !qrcode.isDark(row + 1, col) 1047 && qrcode.isDark(row + 2, col) 1048 && qrcode.isDark(row + 3, col) 1049 && qrcode.isDark(row + 4, col) 1050 && !qrcode.isDark(row + 5, col) 1051 && qrcode.isDark(row + 6, col) ) { 1052 lostPoint += 40; 1053 } 1054 } 1055 } 1056 1057 // LEVEL4 1058 1059 var darkCount = 0; 1060 1061 for (var col = 0; col < moduleCount; col += 1) { 1062 for (var row = 0; row < moduleCount; row += 1) { 1063 if (qrcode.isDark(row, col) ) { 1064 darkCount += 1; 1065 } 1066 } 1067 } 1068 1069 var ratio = Math.abs(100 * darkCount / moduleCount / moduleCount - 50) / 5; 1070 lostPoint += ratio * 10; 1071 1072 return lostPoint; 1073 }; 1074 1075 return _this; 1076 }(); 1077 1078 //--------------------------------------------------------------------- 1079 // QRMath 1080 //--------------------------------------------------------------------- 1081 1082 var QRMath = function() { 1083 1084 var EXP_TABLE = new Array(256); 1085 var LOG_TABLE = new Array(256); 1086 1087 // initialize tables 1088 for (var i = 0; i < 8; i += 1) { 1089 EXP_TABLE[i] = 1 << i; 1090 } 1091 for (var i = 8; i < 256; i += 1) { 1092 EXP_TABLE[i] = EXP_TABLE[i - 4] 1093 ^ EXP_TABLE[i - 5] 1094 ^ EXP_TABLE[i - 6] 1095 ^ EXP_TABLE[i - 8]; 1096 } 1097 for (var i = 0; i < 255; i += 1) { 1098 LOG_TABLE[EXP_TABLE[i] ] = i; 1099 } 1100 1101 var _this = {}; 1102 1103 _this.glog = function(n) { 1104 1105 if (n < 1) { 1106 throw 'glog(' + n + ')'; 1107 } 1108 1109 return LOG_TABLE[n]; 1110 }; 1111 1112 _this.gexp = function(n) { 1113 1114 while (n < 0) { 1115 n += 255; 1116 } 1117 1118 while (n >= 256) { 1119 n -= 255; 1120 } 1121 1122 return EXP_TABLE[n]; 1123 }; 1124 1125 return _this; 1126 }(); 1127 1128 //--------------------------------------------------------------------- 1129 // qrPolynomial 1130 //--------------------------------------------------------------------- 1131 1132 function qrPolynomial(num, shift) { 1133 1134 if (typeof num.length == 'undefined') { 1135 throw num.length + '/' + shift; 1136 } 1137 1138 var _num = function() { 1139 var offset = 0; 1140 while (offset < num.length && num[offset] == 0) { 1141 offset += 1; 1142 } 1143 var _num = new Array(num.length - offset + shift); 1144 for (var i = 0; i < num.length - offset; i += 1) { 1145 _num[i] = num[i + offset]; 1146 } 1147 return _num; 1148 }(); 1149 1150 var _this = {}; 1151 1152 _this.getAt = function(index) { 1153 return _num[index]; 1154 }; 1155 1156 _this.getLength = function() { 1157 return _num.length; 1158 }; 1159 1160 _this.multiply = function(e) { 1161 1162 var num = new Array(_this.getLength() + e.getLength() - 1); 1163 1164 for (var i = 0; i < _this.getLength(); i += 1) { 1165 for (var j = 0; j < e.getLength(); j += 1) { 1166 num[i + j] ^= QRMath.gexp(QRMath.glog(_this.getAt(i) ) + QRMath.glog(e.getAt(j) ) ); 1167 } 1168 } 1169 1170 return qrPolynomial(num, 0); 1171 }; 1172 1173 _this.mod = function(e) { 1174 1175 if (_this.getLength() - e.getLength() < 0) { 1176 return _this; 1177 } 1178 1179 var ratio = QRMath.glog(_this.getAt(0) ) - QRMath.glog(e.getAt(0) ); 1180 1181 var num = new Array(_this.getLength() ); 1182 for (var i = 0; i < _this.getLength(); i += 1) { 1183 num[i] = _this.getAt(i); 1184 } 1185 1186 for (var i = 0; i < e.getLength(); i += 1) { 1187 num[i] ^= QRMath.gexp(QRMath.glog(e.getAt(i) ) + ratio); 1188 } 1189 1190 // recursive call 1191 return qrPolynomial(num, 0).mod(e); 1192 }; 1193 1194 return _this; 1195 }; 1196 1197 //--------------------------------------------------------------------- 1198 // QRRSBlock 1199 //--------------------------------------------------------------------- 1200 1201 var QRRSBlock = function() { 1202 1203 var RS_BLOCK_TABLE = [ 1204 1205 // L 1206 // M 1207 // Q 1208 // H 1209 1210 // 1 1211 [1, 26, 19], 1212 [1, 26, 16], 1213 [1, 26, 13], 1214 [1, 26, 9], 1215 1216 // 2 1217 [1, 44, 34], 1218 [1, 44, 28], 1219 [1, 44, 22], 1220 [1, 44, 16], 1221 1222 // 3 1223 [1, 70, 55], 1224 [1, 70, 44], 1225 [2, 35, 17], 1226 [2, 35, 13], 1227 1228 // 4 1229 [1, 100, 80], 1230 [2, 50, 32], 1231 [2, 50, 24], 1232 [4, 25, 9], 1233 1234 // 5 1235 [1, 134, 108], 1236 [2, 67, 43], 1237 [2, 33, 15, 2, 34, 16], 1238 [2, 33, 11, 2, 34, 12], 1239 1240 // 6 1241 [2, 86, 68], 1242 [4, 43, 27], 1243 [4, 43, 19], 1244 [4, 43, 15], 1245 1246 // 7 1247 [2, 98, 78], 1248 [4, 49, 31], 1249 [2, 32, 14, 4, 33, 15], 1250 [4, 39, 13, 1, 40, 14], 1251 1252 // 8 1253 [2, 121, 97], 1254 [2, 60, 38, 2, 61, 39], 1255 [4, 40, 18, 2, 41, 19], 1256 [4, 40, 14, 2, 41, 15], 1257 1258 // 9 1259 [2, 146, 116], 1260 [3, 58, 36, 2, 59, 37], 1261 [4, 36, 16, 4, 37, 17], 1262 [4, 36, 12, 4, 37, 13], 1263 1264 // 10 1265 [2, 86, 68, 2, 87, 69], 1266 [4, 69, 43, 1, 70, 44], 1267 [6, 43, 19, 2, 44, 20], 1268 [6, 43, 15, 2, 44, 16], 1269 1270 // 11 1271 [4, 101, 81], 1272 [1, 80, 50, 4, 81, 51], 1273 [4, 50, 22, 4, 51, 23], 1274 [3, 36, 12, 8, 37, 13], 1275 1276 // 12 1277 [2, 116, 92, 2, 117, 93], 1278 [6, 58, 36, 2, 59, 37], 1279 [4, 46, 20, 6, 47, 21], 1280 [7, 42, 14, 4, 43, 15], 1281 1282 // 13 1283 [4, 133, 107], 1284 [8, 59, 37, 1, 60, 38], 1285 [8, 44, 20, 4, 45, 21], 1286 [12, 33, 11, 4, 34, 12], 1287 1288 // 14 1289 [3, 145, 115, 1, 146, 116], 1290 [4, 64, 40, 5, 65, 41], 1291 [11, 36, 16, 5, 37, 17], 1292 [11, 36, 12, 5, 37, 13], 1293 1294 // 15 1295 [5, 109, 87, 1, 110, 88], 1296 [5, 65, 41, 5, 66, 42], 1297 [5, 54, 24, 7, 55, 25], 1298 [11, 36, 12, 7, 37, 13], 1299 1300 // 16 1301 [5, 122, 98, 1, 123, 99], 1302 [7, 73, 45, 3, 74, 46], 1303 [15, 43, 19, 2, 44, 20], 1304 [3, 45, 15, 13, 46, 16], 1305 1306 // 17 1307 [1, 135, 107, 5, 136, 108], 1308 [10, 74, 46, 1, 75, 47], 1309 [1, 50, 22, 15, 51, 23], 1310 [2, 42, 14, 17, 43, 15], 1311 1312 // 18 1313 [5, 150, 120, 1, 151, 121], 1314 [9, 69, 43, 4, 70, 44], 1315 [17, 50, 22, 1, 51, 23], 1316 [2, 42, 14, 19, 43, 15], 1317 1318 // 19 1319 [3, 141, 113, 4, 142, 114], 1320 [3, 70, 44, 11, 71, 45], 1321 [17, 47, 21, 4, 48, 22], 1322 [9, 39, 13, 16, 40, 14], 1323 1324 // 20 1325 [3, 135, 107, 5, 136, 108], 1326 [3, 67, 41, 13, 68, 42], 1327 [15, 54, 24, 5, 55, 25], 1328 [15, 43, 15, 10, 44, 16], 1329 1330 // 21 1331 [4, 144, 116, 4, 145, 117], 1332 [17, 68, 42], 1333 [17, 50, 22, 6, 51, 23], 1334 [19, 46, 16, 6, 47, 17], 1335 1336 // 22 1337 [2, 139, 111, 7, 140, 112], 1338 [17, 74, 46], 1339 [7, 54, 24, 16, 55, 25], 1340 [34, 37, 13], 1341 1342 // 23 1343 [4, 151, 121, 5, 152, 122], 1344 [4, 75, 47, 14, 76, 48], 1345 [11, 54, 24, 14, 55, 25], 1346 [16, 45, 15, 14, 46, 16], 1347 1348 // 24 1349 [6, 147, 117, 4, 148, 118], 1350 [6, 73, 45, 14, 74, 46], 1351 [11, 54, 24, 16, 55, 25], 1352 [30, 46, 16, 2, 47, 17], 1353 1354 // 25 1355 [8, 132, 106, 4, 133, 107], 1356 [8, 75, 47, 13, 76, 48], 1357 [7, 54, 24, 22, 55, 25], 1358 [22, 45, 15, 13, 46, 16], 1359 1360 // 26 1361 [10, 142, 114, 2, 143, 115], 1362 [19, 74, 46, 4, 75, 47], 1363 [28, 50, 22, 6, 51, 23], 1364 [33, 46, 16, 4, 47, 17], 1365 1366 // 27 1367 [8, 152, 122, 4, 153, 123], 1368 [22, 73, 45, 3, 74, 46], 1369 [8, 53, 23, 26, 54, 24],
vendor: 12,682 bytes, lines 1370-1934
1370 [12, 45, 15, 28, 46, 16], 1371 1372 // 28 1373 [3, 147, 117, 10, 148, 118], 1374 [3, 73, 45, 23, 74, 46], 1375 [4, 54, 24, 31, 55, 25], 1376 [11, 45, 15, 31, 46, 16], 1377 1378 // 29 1379 [7, 146, 116, 7, 147, 117], 1380 [21, 73, 45, 7, 74, 46], 1381 [1, 53, 23, 37, 54, 24], 1382 [19, 45, 15, 26, 46, 16], 1383 1384 // 30 1385 [5, 145, 115, 10, 146, 116], 1386 [19, 75, 47, 10, 76, 48], 1387 [15, 54, 24, 25, 55, 25], 1388 [23, 45, 15, 25, 46, 16], 1389 1390 // 31 1391 [13, 145, 115, 3, 146, 116], 1392 [2, 74, 46, 29, 75, 47], 1393 [42, 54, 24, 1, 55, 25], 1394 [23, 45, 15, 28, 46, 16], 1395 1396 // 32 1397 [17, 145, 115], 1398 [10, 74, 46, 23, 75, 47], 1399 [10, 54, 24, 35, 55, 25], 1400 [19, 45, 15, 35, 46, 16], 1401 1402 // 33 1403 [17, 145, 115, 1, 146, 116], 1404 [14, 74, 46, 21, 75, 47], 1405 [29, 54, 24, 19, 55, 25], 1406 [11, 45, 15, 46, 46, 16], 1407 1408 // 34 1409 [13, 145, 115, 6, 146, 116], 1410 [14, 74, 46, 23, 75, 47], 1411 [44, 54, 24, 7, 55, 25], 1412 [59, 46, 16, 1, 47, 17], 1413 1414 // 35 1415 [12, 151, 121, 7, 152, 122], 1416 [12, 75, 47, 26, 76, 48], 1417 [39, 54, 24, 14, 55, 25], 1418 [22, 45, 15, 41, 46, 16], 1419 1420 // 36 1421 [6, 151, 121, 14, 152, 122], 1422 [6, 75, 47, 34, 76, 48], 1423 [46, 54, 24, 10, 55, 25], 1424 [2, 45, 15, 64, 46, 16], 1425 1426 // 37 1427 [17, 152, 122, 4, 153, 123], 1428 [29, 74, 46, 14, 75, 47], 1429 [49, 54, 24, 10, 55, 25], 1430 [24, 45, 15, 46, 46, 16], 1431 1432 // 38 1433 [4, 152, 122, 18, 153, 123], 1434 [13, 74, 46, 32, 75, 47], 1435 [48, 54, 24, 14, 55, 25], 1436 [42, 45, 15, 32, 46, 16], 1437 1438 // 39 1439 [20, 147, 117, 4, 148, 118], 1440 [40, 75, 47, 7, 76, 48], 1441 [43, 54, 24, 22, 55, 25], 1442 [10, 45, 15, 67, 46, 16], 1443 1444 // 40 1445 [19, 148, 118, 6, 149, 119], 1446 [18, 75, 47, 31, 76, 48], 1447 [34, 54, 24, 34, 55, 25], 1448 [20, 45, 15, 61, 46, 16] 1449 ]; 1450 1451 var qrRSBlock = function(totalCount, dataCount) { 1452 var _this = {}; 1453 _this.totalCount = totalCount; 1454 _this.dataCount = dataCount; 1455 return _this; 1456 }; 1457 1458 var _this = {}; 1459 1460 var getRsBlockTable = function(typeNumber, errorCorrectionLevel) { 1461 1462 switch(errorCorrectionLevel) { 1463 case QRErrorCorrectionLevel.L : 1464 return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 0]; 1465 case QRErrorCorrectionLevel.M : 1466 return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 1]; 1467 case QRErrorCorrectionLevel.Q : 1468 return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 2]; 1469 case QRErrorCorrectionLevel.H : 1470 return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 3]; 1471 default : 1472 return undefined; 1473 } 1474 }; 1475 1476 _this.getRSBlocks = function(typeNumber, errorCorrectionLevel) { 1477 1478 var rsBlock = getRsBlockTable(typeNumber, errorCorrectionLevel); 1479 1480 if (typeof rsBlock == 'undefined') { 1481 throw 'bad rs block @ typeNumber:' + typeNumber + 1482 '/errorCorrectionLevel:' + errorCorrectionLevel; 1483 } 1484 1485 var length = rsBlock.length / 3; 1486 1487 var list = []; 1488 1489 for (var i = 0; i < length; i += 1) { 1490 1491 var count = rsBlock[i * 3 + 0]; 1492 var totalCount = rsBlock[i * 3 + 1]; 1493 var dataCount = rsBlock[i * 3 + 2]; 1494 1495 for (var j = 0; j < count; j += 1) { 1496 list.push(qrRSBlock(totalCount, dataCount) ); 1497 } 1498 } 1499 1500 return list; 1501 }; 1502 1503 return _this; 1504 }(); 1505 1506 //--------------------------------------------------------------------- 1507 // qrBitBuffer 1508 //--------------------------------------------------------------------- 1509 1510 var qrBitBuffer = function() { 1511 1512 var _buffer = []; 1513 var _length = 0; 1514 1515 var _this = {}; 1516 1517 _this.getBuffer = function() { 1518 return _buffer; 1519 }; 1520 1521 _this.getAt = function(index) { 1522 var bufIndex = Math.floor(index / 8); 1523 return ( (_buffer[bufIndex] >>> (7 - index % 8) ) & 1) == 1; 1524 }; 1525 1526 _this.put = function(num, length) { 1527 for (var i = 0; i < length; i += 1) { 1528 _this.putBit( ( (num >>> (length - i - 1) ) & 1) == 1); 1529 } 1530 }; 1531 1532 _this.getLengthInBits = function() { 1533 return _length; 1534 }; 1535 1536 _this.putBit = function(bit) { 1537 1538 var bufIndex = Math.floor(_length / 8); 1539 if (_buffer.length <= bufIndex) { 1540 _buffer.push(0); 1541 } 1542 1543 if (bit) { 1544 _buffer[bufIndex] |= (0x80 >>> (_length % 8) ); 1545 } 1546 1547 _length += 1; 1548 }; 1549 1550 return _this; 1551 }; 1552 1553 //--------------------------------------------------------------------- 1554 // qrNumber 1555 //--------------------------------------------------------------------- 1556 1557 var qrNumber = function(data) { 1558 1559 var _mode = QRMode.MODE_NUMBER; 1560 var _data = data; 1561 1562 var _this = {}; 1563 1564 _this.getMode = function() { 1565 return _mode; 1566 }; 1567 1568 _this.getLength = function(buffer) { 1569 return _data.length; 1570 }; 1571 1572 _this.write = function(buffer) { 1573 1574 var data = _data; 1575 1576 var i = 0; 1577 1578 while (i + 2 < data.length) { 1579 buffer.put(strToNum(data.substring(i, i + 3) ), 10); 1580 i += 3; 1581 } 1582 1583 if (i < data.length) { 1584 if (data.length - i == 1) { 1585 buffer.put(strToNum(data.substring(i, i + 1) ), 4); 1586 } else if (data.length - i == 2) { 1587 buffer.put(strToNum(data.substring(i, i + 2) ), 7); 1588 } 1589 } 1590 }; 1591 1592 var strToNum = function(s) { 1593 var num = 0; 1594 for (var i = 0; i < s.length; i += 1) { 1595 num = num * 10 + chatToNum(s.charAt(i) ); 1596 } 1597 return num; 1598 }; 1599 1600 var chatToNum = function(c) { 1601 if ('0' <= c && c <= '9') { 1602 return c.charCodeAt(0) - '0'.charCodeAt(0); 1603 } 1604 throw 'illegal char :' + c; 1605 }; 1606 1607 return _this; 1608 }; 1609 1610 //--------------------------------------------------------------------- 1611 // qrAlphaNum 1612 //--------------------------------------------------------------------- 1613 1614 var qrAlphaNum = function(data) { 1615 1616 var _mode = QRMode.MODE_ALPHA_NUM; 1617 var _data = data; 1618 1619 var _this = {}; 1620 1621 _this.getMode = function() { 1622 return _mode; 1623 }; 1624 1625 _this.getLength = function(buffer) { 1626 return _data.length; 1627 }; 1628 1629 _this.write = function(buffer) { 1630 1631 var s = _data; 1632 1633 var i = 0; 1634 1635 while (i + 1 < s.length) { 1636 buffer.put( 1637 getCode(s.charAt(i) ) * 45 + 1638 getCode(s.charAt(i + 1) ), 11); 1639 i += 2; 1640 } 1641 1642 if (i < s.length) { 1643 buffer.put(getCode(s.charAt(i) ), 6); 1644 } 1645 }; 1646 1647 var getCode = function(c) { 1648 1649 if ('0' <= c && c <= '9') { 1650 return c.charCodeAt(0) - '0'.charCodeAt(0); 1651 } else if ('A' <= c && c <= 'Z') { 1652 return c.charCodeAt(0) - 'A'.charCodeAt(0) + 10; 1653 } else { 1654 switch (c) { 1655 case ' ' : return 36; 1656 case '$' : return 37; 1657 case '%' : return 38; 1658 case '*' : return 39; 1659 case '+' : return 40; 1660 case '-' : return 41; 1661 case '.' : return 42; 1662 case '/' : return 43; 1663 case ':' : return 44; 1664 default : 1665 throw 'illegal char :' + c; 1666 } 1667 } 1668 }; 1669 1670 return _this; 1671 }; 1672 1673 //--------------------------------------------------------------------- 1674 // qr8BitByte 1675 //--------------------------------------------------------------------- 1676 1677 var qr8BitByte = function(data) { 1678 1679 var _mode = QRMode.MODE_8BIT_BYTE; 1680 var _data = data; 1681 var _bytes = qrcode.stringToBytes(data); 1682 1683 var _this = {}; 1684 1685 _this.getMode = function() { 1686 return _mode; 1687 }; 1688 1689 _this.getLength = function(buffer) { 1690 return _bytes.length; 1691 }; 1692 1693 _this.write = function(buffer) { 1694 for (var i = 0; i < _bytes.length; i += 1) { 1695 buffer.put(_bytes[i], 8); 1696 } 1697 }; 1698 1699 return _this; 1700 }; 1701 1702 //--------------------------------------------------------------------- 1703 // qrKanji 1704 //--------------------------------------------------------------------- 1705 1706 var qrKanji = function(data) { 1707 1708 var _mode = QRMode.MODE_KANJI; 1709 var _data = data; 1710 1711 var stringToBytes = qrcode.stringToBytesFuncs['SJIS']; 1712 if (!stringToBytes) { 1713 throw 'sjis not supported.'; 1714 } 1715 !function(c, code) { 1716 // self test for sjis support. 1717 var test = stringToBytes(c); 1718 if (test.length != 2 || ( (test[0] << 8) | test[1]) != code) { 1719 throw 'sjis not supported.'; 1720 } 1721 }('\u53cb', 0x9746); 1722 1723 var _bytes = stringToBytes(data); 1724 1725 var _this = {}; 1726 1727 _this.getMode = function() { 1728 return _mode; 1729 }; 1730 1731 _this.getLength = function(buffer) { 1732 return ~~(_bytes.length / 2); 1733 }; 1734 1735 _this.write = function(buffer) { 1736 1737 var data = _bytes; 1738 1739 var i = 0; 1740 1741 while (i + 1 < data.length) { 1742 1743 var c = ( (0xff & data[i]) << 8) | (0xff & data[i + 1]); 1744 1745 if (0x8140 <= c && c <= 0x9FFC) { 1746 c -= 0x8140; 1747 } else if (0xE040 <= c && c <= 0xEBBF) { 1748 c -= 0xC140; 1749 } else { 1750 throw 'illegal char at ' + (i + 1) + '/' + c; 1751 } 1752 1753 c = ( (c >>> 8) & 0xff) * 0xC0 + (c & 0xff); 1754 1755 buffer.put(c, 13); 1756 1757 i += 2; 1758 } 1759 1760 if (i < data.length) { 1761 throw 'illegal char at ' + (i + 1); 1762 } 1763 }; 1764 1765 return _this; 1766 }; 1767 1768 //===================================================================== 1769 // GIF Support etc. 1770 // 1771 1772 //--------------------------------------------------------------------- 1773 // byteArrayOutputStream 1774 //--------------------------------------------------------------------- 1775 1776 var byteArrayOutputStream = function() { 1777 1778 var _bytes = []; 1779 1780 var _this = {}; 1781 1782 _this.writeByte = function(b) { 1783 _bytes.push(b & 0xff); 1784 }; 1785 1786 _this.writeShort = function(i) { 1787 _this.writeByte(i); 1788 _this.writeByte(i >>> 8); 1789 }; 1790 1791 _this.writeBytes = function(b, off, len) { 1792 off = off || 0; 1793 len = len || b.length; 1794 for (var i = 0; i < len; i += 1) { 1795 _this.writeByte(b[i + off]); 1796 } 1797 }; 1798 1799 _this.writeString = function(s) { 1800 for (var i = 0; i < s.length; i += 1) { 1801 _this.writeByte(s.charCodeAt(i) ); 1802 } 1803 }; 1804 1805 _this.toByteArray = function() { 1806 return _bytes; 1807 }; 1808 1809 _this.toString = function() { 1810 var s = ''; 1811 s += '['; 1812 for (var i = 0; i < _bytes.length; i += 1) { 1813 if (i > 0) { 1814 s += ','; 1815 } 1816 s += _bytes[i]; 1817 } 1818 s += ']'; 1819 return s; 1820 }; 1821 1822 return _this; 1823 }; 1824 1825 //--------------------------------------------------------------------- 1826 // base64EncodeOutputStream 1827 //--------------------------------------------------------------------- 1828 1829 var base64EncodeOutputStream = function() { 1830 1831 var _buffer = 0; 1832 var _buflen = 0; 1833 var _length = 0; 1834 var _base64 = ''; 1835 1836 var _this = {}; 1837 1838 var writeEncoded = function(b) { 1839 _base64 += String.fromCharCode(encode(b & 0x3f) ); 1840 }; 1841 1842 var encode = function(n) { 1843 if (n < 0) { 1844 // error. 1845 } else if (n < 26) { 1846 return 0x41 + n; 1847 } else if (n < 52) { 1848 return 0x61 + (n - 26); 1849 } else if (n < 62) { 1850 return 0x30 + (n - 52); 1851 } else if (n == 62) { 1852 return 0x2b; 1853 } else if (n == 63) { 1854 return 0x2f; 1855 } 1856 throw 'n:' + n; 1857 }; 1858 1859 _this.writeByte = function(n) { 1860 1861 _buffer = (_buffer << 8) | (n & 0xff); 1862 _buflen += 8; 1863 _length += 1; 1864 1865 while (_buflen >= 6) { 1866 writeEncoded(_buffer >>> (_buflen - 6) ); 1867 _buflen -= 6; 1868 } 1869 }; 1870 1871 _this.flush = function() { 1872 1873 if (_buflen > 0) { 1874 writeEncoded(_buffer << (6 - _buflen) ); 1875 _buffer = 0; 1876 _buflen = 0; 1877 } 1878 1879 if (_length % 3 != 0) { 1880 // padding 1881 var padlen = 3 - _length % 3; 1882 for (var i = 0; i < padlen; i += 1) { 1883 _base64 += '='; 1884 } 1885 } 1886 }; 1887 1888 _this.toString = function() { 1889 return _base64; 1890 }; 1891 1892 return _this; 1893 }; 1894 1895 //--------------------------------------------------------------------- 1896 // base64DecodeInputStream 1897 //--------------------------------------------------------------------- 1898 1899 var base64DecodeInputStream = function(str) { 1900 1901 var _str = str; 1902 var _pos = 0; 1903 var _buffer = 0; 1904 var _buflen = 0; 1905 1906 var _this = {}; 1907 1908 _this.read = function() { 1909 1910 while (_buflen < 8) { 1911 1912 if (_pos >= _str.length) { 1913 if (_buflen == 0) { 1914 return -1; 1915 } 1916 throw 'unexpected end of file./' + _buflen; 1917 } 1918 1919 var c = _str.charAt(_pos); 1920 _pos += 1; 1921 1922 if (c == '=') { 1923 _buflen = 0; 1924 return -1; 1925 } else if (c.match(/^\s$/) ) { 1926 // ignore if whitespace. 1927 continue; 1928 } 1929 1930 _buffer = (_buffer << 6) | decode(c.charCodeAt(0) ); 1931 _buflen += 6; 1932 } 1933 1934 var n = (_buffer >>> (_buflen - 8) ) & 0xff;
vendor: 7,216 bytes, lines 1935-2247
1935 _buflen -= 8; 1936 return n; 1937 }; 1938 1939 var decode = function(c) { 1940 if (0x41 <= c && c <= 0x5a) { 1941 return c - 0x41; 1942 } else if (0x61 <= c && c <= 0x7a) { 1943 return c - 0x61 + 26; 1944 } else if (0x30 <= c && c <= 0x39) { 1945 return c - 0x30 + 52; 1946 } else if (c == 0x2b) { 1947 return 62; 1948 } else if (c == 0x2f) { 1949 return 63; 1950 } else { 1951 throw 'c:' + c; 1952 } 1953 }; 1954 1955 return _this; 1956 }; 1957 1958 //--------------------------------------------------------------------- 1959 // gifImage (B/W) 1960 //--------------------------------------------------------------------- 1961 1962 var gifImage = function(width, height) { 1963 1964 var _width = width; 1965 var _height = height; 1966 var _data = new Array(width * height); 1967 1968 var _this = {}; 1969 1970 _this.setPixel = function(x, y, pixel) { 1971 _data[y * _width + x] = pixel; 1972 }; 1973 1974 _this.write = function(out) { 1975 1976 //--------------------------------- 1977 // GIF Signature 1978 1979 out.writeString('GIF87a'); 1980 1981 //--------------------------------- 1982 // Screen Descriptor 1983 1984 out.writeShort(_width); 1985 out.writeShort(_height); 1986 1987 out.writeByte(0x80); // 2bit 1988 out.writeByte(0); 1989 out.writeByte(0); 1990 1991 //--------------------------------- 1992 // Global Color Map 1993 1994 // black 1995 out.writeByte(0x00); 1996 out.writeByte(0x00); 1997 out.writeByte(0x00); 1998 1999 // white 2000 out.writeByte(0xff); 2001 out.writeByte(0xff); 2002 out.writeByte(0xff); 2003 2004 //--------------------------------- 2005 // Image Descriptor 2006 2007 out.writeString(','); 2008 out.writeShort(0); 2009 out.writeShort(0); 2010 out.writeShort(_width); 2011 out.writeShort(_height); 2012 out.writeByte(0); 2013 2014 //--------------------------------- 2015 // Local Color Map 2016 2017 //--------------------------------- 2018 // Raster Data 2019 2020 var lzwMinCodeSize = 2; 2021 var raster = getLZWRaster(lzwMinCodeSize); 2022 2023 out.writeByte(lzwMinCodeSize); 2024 2025 var offset = 0; 2026 2027 while (raster.length - offset > 255) { 2028 out.writeByte(255); 2029 out.writeBytes(raster, offset, 255); 2030 offset += 255; 2031 } 2032 2033 out.writeByte(raster.length - offset); 2034 out.writeBytes(raster, offset, raster.length - offset); 2035 out.writeByte(0x00); 2036 2037 //--------------------------------- 2038 // GIF Terminator 2039 out.writeString(';'); 2040 }; 2041 2042 var bitOutputStream = function(out) { 2043 2044 var _out = out; 2045 var _bitLength = 0; 2046 var _bitBuffer = 0; 2047 2048 var _this = {}; 2049 2050 _this.write = function(data, length) { 2051 2052 if ( (data >>> length) != 0) { 2053 throw 'length over'; 2054 } 2055 2056 while (_bitLength + length >= 8) { 2057 _out.writeByte(0xff & ( (data << _bitLength) | _bitBuffer) ); 2058 length -= (8 - _bitLength); 2059 data >>>= (8 - _bitLength); 2060 _bitBuffer = 0; 2061 _bitLength = 0; 2062 } 2063 2064 _bitBuffer = (data << _bitLength) | _bitBuffer; 2065 _bitLength = _bitLength + length; 2066 }; 2067 2068 _this.flush = function() { 2069 if (_bitLength > 0) { 2070 _out.writeByte(_bitBuffer); 2071 } 2072 }; 2073 2074 return _this; 2075 }; 2076 2077 var getLZWRaster = function(lzwMinCodeSize) { 2078 2079 var clearCode = 1 << lzwMinCodeSize; 2080 var endCode = (1 << lzwMinCodeSize) + 1; 2081 var bitLength = lzwMinCodeSize + 1; 2082 2083 // Setup LZWTable 2084 var table = lzwTable(); 2085 2086 for (var i = 0; i < clearCode; i += 1) { 2087 table.add(String.fromCharCode(i) ); 2088 } 2089 table.add(String.fromCharCode(clearCode) ); 2090 table.add(String.fromCharCode(endCode) ); 2091 2092 var byteOut = byteArrayOutputStream(); 2093 var bitOut = bitOutputStream(byteOut); 2094 2095 // clear code 2096 bitOut.write(clearCode, bitLength); 2097 2098 var dataIndex = 0; 2099 2100 var s = String.fromCharCode(_data[dataIndex]); 2101 dataIndex += 1; 2102 2103 while (dataIndex < _data.length) { 2104 2105 var c = String.fromCharCode(_data[dataIndex]); 2106 dataIndex += 1; 2107 2108 if (table.contains(s + c) ) { 2109 2110 s = s + c; 2111 2112 } else { 2113 2114 bitOut.write(table.indexOf(s), bitLength); 2115 2116 if (table.size() < 0xfff) { 2117 2118 if (table.size() == (1 << bitLength) ) { 2119 bitLength += 1; 2120 } 2121 2122 table.add(s + c); 2123 } 2124 2125 s = c; 2126 } 2127 } 2128 2129 bitOut.write(table.indexOf(s), bitLength); 2130 2131 // end code 2132 bitOut.write(endCode, bitLength); 2133 2134 bitOut.flush(); 2135 2136 return byteOut.toByteArray(); 2137 }; 2138 2139 var lzwTable = function() { 2140 2141 var _map = {}; 2142 var _size = 0; 2143 2144 var _this = {}; 2145 2146 _this.add = function(key) { 2147 if (_this.contains(key) ) { 2148 throw 'dup key:' + key; 2149 } 2150 _map[key] = _size; 2151 _size += 1; 2152 }; 2153 2154 _this.size = function() { 2155 return _size; 2156 }; 2157 2158 _this.indexOf = function(key) { 2159 return _map[key]; 2160 }; 2161 2162 _this.contains = function(key) { 2163 return typeof _map[key] != 'undefined'; 2164 }; 2165 2166 return _this; 2167 }; 2168 2169 return _this; 2170 }; 2171 2172 var createDataURL = function(width, height, getPixel) { 2173 var gif = gifImage(width, height); 2174 for (var y = 0; y < height; y += 1) { 2175 for (var x = 0; x < width; x += 1) { 2176 gif.setPixel(x, y, getPixel(x, y) ); 2177 } 2178 } 2179 2180 var b = byteArrayOutputStream(); 2181 gif.write(b); 2182 2183 var base64 = base64EncodeOutputStream(); 2184 var bytes = b.toByteArray(); 2185 for (var i = 0; i < bytes.length; i += 1) { 2186 base64.writeByte(bytes[i]); 2187 } 2188 base64.flush(); 2189 2190 return 'data:image/gif;base64,' + base64; 2191 }; 2192 2193 //--------------------------------------------------------------------- 2194 // returns qrcode function. 2195 2196 return qrcode; 2197}(); 2198 2199// multibyte support 2200!function() { 2201 2202 qrcode.stringToBytesFuncs['UTF-8'] = function(s) { 2203 // http://stackoverflow.com/questions/18729405/how-to-convert-utf8-string-to-byte-array 2204 function toUTF8Array(str) { 2205 var utf8 = []; 2206 for (var i=0; i < str.length; i++) { 2207 var charcode = str.charCodeAt(i); 2208 if (charcode < 0x80) utf8.push(charcode); 2209 else if (charcode < 0x800) { 2210 utf8.push(0xc0 | (charcode >> 6), 2211 0x80 | (charcode & 0x3f)); 2212 } 2213 else if (charcode < 0xd800 || charcode >= 0xe000) { 2214 utf8.push(0xe0 | (charcode >> 12), 2215 0x80 | ((charcode>>6) & 0x3f), 2216 0x80 | (charcode & 0x3f)); 2217 } 2218 // surrogate pair 2219 else { 2220 i++; 2221 // UTF-16 encodes 0x10000-0x10FFFF by 2222 // subtracting 0x10000 and splitting the 2223 // 20 bits of 0x0-0xFFFFF into two halves 2224 charcode = 0x10000 + (((charcode & 0x3ff)<<10) 2225 | (str.charCodeAt(i) & 0x3ff)); 2226 utf8.push(0xf0 | (charcode >>18), 2227 0x80 | ((charcode>>12) & 0x3f), 2228 0x80 | ((charcode>>6) & 0x3f), 2229 0x80 | (charcode & 0x3f)); 2230 } 2231 } 2232 return utf8; 2233 } 2234 return toUTF8Array(s); 2235 }; 2236 2237}(); 2238 2239(function (factory) { 2240 if (typeof define === 'function' && define.amd) { 2241 define([], factory); 2242 } else if (typeof exports === 'object') { 2243 module.exports = factory(); 2244 } 2245}(function () { 2246 return qrcode; 2247}));
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.