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.