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