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