vendor: 72,174 bytes, lines 1-2815
1/*! jquery-qrcode v0.17.0 - https://larsjung.de/jquery-qrcode/ */ 2(function webpackUniversalModuleDefinition(root, factory) { 3 if(typeof exports === 'object' && typeof module === 'object') 4 module.exports = factory(); 5 else if(typeof define === 'function' && define.amd) 6 define("jquery-qrcode", [], factory); 7 else if(typeof exports === 'object') 8 exports["jquery-qrcode"] = factory(); 9 else 10 root["jquery-qrcode"] = factory(); 11})((typeof self !== 'undefined' ? self : this), function() { 12return /******/ (function(modules) { // webpackBootstrap 13/******/ // The module cache 14/******/ var installedModules = {}; 15/******/ 16/******/ // The require function 17/******/ function __webpack_require__(moduleId) { 18/******/ 19/******/ // Check if module is in cache 20/******/ if(installedModules[moduleId]) { 21/******/ return installedModules[moduleId].exports; 22/******/ } 23/******/ // Create a new module (and put it into the cache) 24/******/ var module = installedModules[moduleId] = { 25/******/ i: moduleId, 26/******/ l: false, 27/******/ exports: {} 28/******/ }; 29/******/ 30/******/ // Execute the module function 31/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); 32/******/ 33/******/ // Flag the module as loaded 34/******/ module.l = true; 35/******/ 36/******/ // Return the exports of the module 37/******/ return module.exports; 38/******/ } 39/******/ 40/******/ 41/******/ // expose the modules object (__webpack_modules__) 42/******/ __webpack_require__.m = modules; 43/******/ 44/******/ // expose the module cache 45/******/ __webpack_require__.c = installedModules; 46/******/ 47/******/ // define getter function for harmony exports 48/******/ __webpack_require__.d = function(exports, name, getter) { 49/******/ if(!__webpack_require__.o(exports, name)) { 50/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); 51/******/ } 52/******/ }; 53/******/ 54/******/ // define __esModule on exports 55/******/ __webpack_require__.r = function(exports) { 56/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { 57/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); 58/******/ } 59/******/ Object.defineProperty(exports, '__esModule', { value: true }); 60/******/ }; 61/******/ 62/******/ // create a fake namespace object 63/******/ // mode & 1: value is a module id, require it 64/******/ // mode & 2: merge all properties of value into the ns 65/******/ // mode & 4: return value when already ns object 66/******/ // mode & 8|1: behave like require 67/******/ __webpack_require__.t = function(value, mode) { 68/******/ if(mode & 1) value = __webpack_require__(value); 69/******/ if(mode & 8) return value; 70/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; 71/******/ var ns = Object.create(null); 72/******/ __webpack_require__.r(ns); 73/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); 74/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); 75/******/ return ns; 76/******/ }; 77/******/ 78/******/ // getDefaultExport function for compatibility with non-harmony modules 79/******/ __webpack_require__.n = function(module) { 80/******/ var getter = module && module.__esModule ? 81/******/ function getDefault() { return module['default']; } : 82/******/ function getModuleExports() { return module; }; 83/******/ __webpack_require__.d(getter, 'a', getter); 84/******/ return getter; 85/******/ }; 86/******/ 87/******/ // Object.prototype.hasOwnProperty.call 88/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; 89/******/ 90/******/ // __webpack_public_path__ 91/******/ __webpack_require__.p = ""; 92/******/ 93/******/ 94/******/ // Load entry module and return exports 95/******/ return __webpack_require__(__webpack_require__.s = 0); 96/******/ }) 97/************************************************************************/ 98/******/ ([ 99/* 0 */ 100/***/ (function(module, exports, __webpack_require__) { 101 102/* WEBPACK VAR INJECTION */(function(global) {var WIN = global.window; 103var JQ = WIN.jQuery; // Check if canvas is available in the browser (as Modernizr does) 104 105var HAS_CANVAS = function () { 106 var el = WIN.document.createElement('canvas'); 107 return !!(el.getContext && el.getContext('2d')); 108}(); 109 110var is_img_el = function is_img_el(x) { 111 return x && typeof x.tagName === 'string' && x.tagName.toUpperCase() === 'IMG'; 112}; // Wrapper for the original QR code generator. 113 114 115var create_qrcode = function create_qrcode(text, level, version, quiet) { 116 var qr = {}; 117 118 var qr_gen = __webpack_require__(2); 119 120 qr_gen.stringToBytes = qr_gen.stringToBytesFuncs['UTF-8']; 121 var vqr = qr_gen(version, level); 122 vqr.addData(text); 123 vqr.make(); 124 quiet = quiet || 0; 125 var module_count = vqr.getModuleCount(); 126 var quiet_module_count = module_count + 2 * quiet; 127 128 var is_dark = function is_dark(row, col) { 129 row -= quiet; 130 col -= quiet; 131 return row >= 0 && row < module_count && col >= 0 && col < module_count && vqr.isDark(row, col); 132 }; 133 134 var add_blank = function add_blank(l, t, r, b) { 135 var prev_is_dark = qr.is_dark; 136 var module_size = 1 / quiet_module_count; 137 138 qr.is_dark = function (row, col) { 139 var ml = col * module_size; 140 var mt = row * module_size; 141 var mr = ml + module_size; 142 var mb = mt + module_size; 143 return prev_is_dark(row, col) && (l > mr || ml > r || t > mb || mt > b); 144 }; 145 }; 146 147 qr.text = text; 148 qr.level = level; 149 qr.version = version; 150 qr.module_count = quiet_module_count; 151 qr.is_dark = is_dark; 152 qr.add_blank = add_blank; 153 return qr; 154}; // Returns a minimal QR code for the given text starting with version `min_ver`. 155// Returns `undefined` if `text` is too long to be encoded in `max_ver`. 156 157 158var create_min_qrcode = function create_min_qrcode(text, level, min_ver, max_ver, quiet) { 159 min_ver = Math.max(1, min_ver || 1); 160 max_ver = Math.min(40, max_ver || 40); 161 162 for (var ver = min_ver; ver <= max_ver; ver += 1) { 163 try { 164 return create_qrcode(text, level, ver, quiet); 165 } catch (err) { 166 /* empty */ 167 } 168 } 169 170 return undefined; 171}; 172 173var draw_background_label = function draw_background_label(qr, context, settings) { 174 var size = settings.size; 175 var font = 'bold ' + settings.mSize * size + 'px ' + settings.fontname; 176 var ctx = JQ('<canvas/>')[0].getContext('2d'); 177 ctx.font = font; 178 var w = ctx.measureText(settings.label).width; 179 var sh = settings.mSize; 180 var sw = w / size; 181 var sl = (1 - sw) * settings.mPosX; 182 var st = (1 - sh) * settings.mPosY; 183 var sr = sl + sw; 184 var sb = st + sh; 185 var pad = 0.01; 186 187 if (settings.mode === 1) { 188 // Strip 189 qr.add_blank(0, st - pad, size, sb + pad); 190 } else { 191 // Box 192 qr.add_blank(sl - pad, st - pad, sr + pad, sb + pad); 193 } 194 195 context.fillStyle = settings.fontcolor; 196 context.font = font; 197 context.fillText(settings.label, sl * size, st * size + 0.75 * settings.mSize * size); 198}; 199 200var draw_background_img = function draw_background_img(qr, context, settings) { 201 var size = settings.size; 202 var w = settings.image.naturalWidth || 1; 203 var h = settings.image.naturalHeight || 1; 204 var sh = settings.mSize; 205 var sw = sh * w / h; 206 var sl = (1 - sw) * settings.mPosX; 207 var st = (1 - sh) * settings.mPosY; 208 var sr = sl + sw; 209 var sb = st + sh; 210 var pad = 0.01; 211 212 if (settings.mode === 3) { 213 // Strip 214 qr.add_blank(0, st - pad, size, sb + pad); 215 } else { 216 // Box 217 qr.add_blank(sl - pad, st - pad, sr + pad, sb + pad); 218 } 219 220 context.drawImage(settings.image, sl * size, st * size, sw * size, sh * size); 221}; 222 223var draw_background = function draw_background(qr, context, settings) { 224 if (is_img_el(settings.background)) { 225 context.drawImage(settings.background, 0, 0, settings.size, settings.size); 226 } else if (settings.background) { 227 context.fillStyle = settings.background; 228 context.fillRect(settings.left, settings.top, settings.size, settings.size); 229 } 230 231 var mode = settings.mode; 232 233 if (mode === 1 || mode === 2) { 234 draw_background_label(qr, context, settings); 235 } else if (is_img_el(settings.image) && (mode === 3 || mode === 4)) { 236 draw_background_img(qr, context, settings); 237 } 238}; 239 240var draw_modules_default = function draw_modules_default(qr, context, settings, left, top, width, row, col) { 241 if (qr.is_dark(row, col)) { 242 context.rect(left, top, width, width); 243 } 244}; 245 246var draw_modules_rounded_dark = function draw_modules_rounded_dark(ctx, l, t, r, b, rad, nw, ne, se, sw) { 247 if (nw) { 248 ctx.moveTo(l + rad, t); 249 } else { 250 ctx.moveTo(l, t); 251 } 252 253 if (ne) { 254 ctx.lineTo(r - rad, t); 255 ctx.arcTo(r, t, r, b, rad); 256 } else { 257 ctx.lineTo(r, t); 258 } 259 260 if (se) { 261 ctx.lineTo(r, b - rad); 262 ctx.arcTo(r, b, l, b, rad); 263 } else { 264 ctx.lineTo(r, b); 265 } 266 267 if (sw) { 268 ctx.lineTo(l + rad, b); 269 ctx.arcTo(l, b, l, t, rad); 270 } else { 271 ctx.lineTo(l, b); 272 } 273 274 if (nw) { 275 ctx.lineTo(l, t + rad); 276 ctx.arcTo(l, t, r, t, rad); 277 } else { 278 ctx.lineTo(l, t); 279 } 280}; 281 282var draw_modules_rounded_light = function draw_modules_rounded_light(ctx, l, t, r, b, rad, nw, ne, se, sw) { 283 if (nw) { 284 ctx.moveTo(l + rad, t); 285 ctx.lineTo(l, t); 286 ctx.lineTo(l, t + rad); 287 ctx.arcTo(l, t, l + rad, t, rad); 288 } 289 290 if (ne) { 291 ctx.moveTo(r - rad, t); 292 ctx.lineTo(r, t); 293 ctx.lineTo(r, t + rad); 294 ctx.arcTo(r, t, r - rad, t, rad); 295 } 296 297 if (se) { 298 ctx.moveTo(r - rad, b); 299 ctx.lineTo(r, b); 300 ctx.lineTo(r, b - rad); 301 ctx.arcTo(r, b, r - rad, b, rad); 302 } 303 304 if (sw) { 305 ctx.moveTo(l + rad, b); 306 ctx.lineTo(l, b); 307 ctx.lineTo(l, b - rad); 308 ctx.arcTo(l, b, l + rad, b, rad); 309 } 310}; 311 312var draw_modules_rounded = function draw_modules_rounded(qr, context, settings, left, top, width, row, col) { 313 var is_dark = qr.is_dark; 314 var right = left + width; 315 var bottom = top + width; 316 var radius = settings.radius * width; 317 var rowT = row - 1; 318 var rowB = row + 1; 319 var colL = col - 1; 320 var colR = col + 1; 321 var center = is_dark(row, col); 322 var northwest = is_dark(rowT, colL); 323 var north = is_dark(rowT, col); 324 var northeast = is_dark(rowT, colR); 325 var east = is_dark(row, colR); 326 var southeast = is_dark(rowB, colR); 327 var south = is_dark(rowB, col); 328 var southwest = is_dark(rowB, colL); 329 var west = is_dark(row, colL); 330 331 if (center) { 332 draw_modules_rounded_dark(context, left, top, right, bottom, radius, !north && !west, !north && !east, !south && !east, !south && !west); 333 } else { 334 draw_modules_rounded_light(context, left, top, right, bottom, radius, north && west && northwest, north && east && northeast, south && east && southeast, south && west && southwest); 335 } 336}; 337 338var draw_modules = function draw_modules(qr, context, settings) { 339 var module_count = qr.module_count; 340 var module_size = settings.size / module_count; 341 var fn = draw_modules_default; 342 var row; 343 var col; 344 345 if (settings.radius > 0 && settings.radius <= 0.5) { 346 fn = draw_modules_rounded; 347 } 348 349 context.beginPath(); 350 351 for (row = 0; row < module_count; row += 1) { 352 for (col = 0; col < module_count; col += 1) { 353 var l = settings.left + col * module_size; 354 var t = settings.top + row * module_size; 355 var w = module_size; 356 fn(qr, context, settings, l, t, w, row, col); 357 } 358 } 359 360 if (is_img_el(settings.fill)) { 361 context.strokeStyle = 'rgba(0,0,0,0.5)'; 362 context.lineWidth = 2; 363 context.stroke(); 364 var prev = context.globalCompositeOperation; 365 context.globalCompositeOperation = 'destination-out'; 366 context.fill(); 367 context.globalCompositeOperation = prev; 368 context.clip(); 369 context.drawImage(settings.fill, 0, 0, settings.size, settings.size); 370 context.restore(); 371 } else { 372 context.fillStyle = settings.fill; 373 context.fill(); 374 } 375}; // Draws QR code to the given `canvas` and returns it. 376 377 378var draw_on_canvas = function draw_on_canvas(canvas, settings) { 379 var qr = create_min_qrcode(settings.text, settings.ecLevel, settings.minVersion, settings.maxVersion, settings.quiet); 380 381 if (!qr) { 382 return null; 383 } 384 385 var $canvas = JQ(canvas).data('qrcode', qr); 386 var context = $canvas[0].getContext('2d'); 387 draw_background(qr, context, settings); 388 draw_modules(qr, context, settings); 389 return $canvas; 390}; // Returns a `canvas` element representing the QR code for the given settings. 391 392 393var create_canvas = function create_canvas(settings) { 394 var $canvas = JQ('<canvas/>').attr('width', settings.size).attr('height', settings.size); 395 return draw_on_canvas($canvas, settings); 396}; // Returns an `image` element representing the QR code for the given settings. 397 398 399var create_img = function create_img(settings) { 400 return JQ('<img/>').attr('src', create_canvas(settings)[0].toDataURL('image/png')); 401}; // Returns a `div` element representing the QR code for the given settings. 402 403 404var create_div = function create_div(settings) { 405 var qr = create_min_qrcode(settings.text, settings.ecLevel, settings.minVersion, settings.maxVersion, settings.quiet); 406 407 if (!qr) { 408 return null; 409 } // some shortcuts to improve compression 410 411 412 var settings_size = settings.size; 413 var settings_bgColor = settings.background; 414 var math_floor = Math.floor; 415 var module_count = qr.module_count; 416 var module_size = math_floor(settings_size / module_count); 417 var offset = math_floor(0.5 * (settings_size - module_size * module_count)); 418 var row; 419 var col; 420 var container_css = { 421 position: 'relative', 422 left: 0, 423 top: 0, 424 padding: 0, 425 margin: 0, 426 width: settings_size, 427 height: settings_size 428 }; 429 var dark_css = { 430 position: 'absolute', 431 padding: 0, 432 margin: 0, 433 width: module_size, 434 height: module_size, 435 'background-color': settings.fill 436 }; 437 var $div = JQ('<div/>').data('qrcode', qr).css(container_css); 438 439 if (settings_bgColor) { 440 $div.css('background-color', settings_bgColor); 441 } 442 443 for (row = 0; row < module_count; row += 1) { 444 for (col = 0; col < module_count; col += 1) { 445 if (qr.is_dark(row, col)) { 446 JQ('<div/>').css(dark_css).css({ 447 left: offset + col * module_size, 448 top: offset + row * module_size 449 }).appendTo($div); 450 } 451 } 452 } 453 454 return $div; 455}; 456 457var create_html = function create_html(settings) { 458 if (HAS_CANVAS && settings.render === 'canvas') { 459 return create_canvas(settings); 460 } else if (HAS_CANVAS && settings.render === 'image') { 461 return create_img(settings); 462 } 463 464 return create_div(settings); 465}; 466 467var DEFAULTS = { 468 // render method: `'canvas'`, `'image'` or `'div'` 469 render: 'canvas', 470 // version range somewhere in 1 .. 40 471 minVersion: 1, 472 maxVersion: 40, 473 // error correction level: `'L'`, `'M'`, `'Q'` or `'H'` 474 ecLevel: 'L', 475 // offset in pixel if drawn onto existing canvas 476 left: 0, 477 top: 0, 478 // size in pixel 479 size: 200, 480 // code color or image element 481 fill: '#000', 482 // background color or image element, `null` for transparent background 483 background: '#fff', 484 // content 485 text: 'no text', 486 // corner radius relative to module width: 0.0 .. 0.5 487 radius: 0, 488 // quiet zone in modules 489 quiet: 0, 490 // modes 491 // 0: normal 492 // 1: label strip 493 // 2: label box 494 // 3: image strip 495 // 4: image box 496 mode: 0, 497 mSize: 0.1, 498 mPosX: 0.5, 499 mPosY: 0.5, 500 label: 'no label', 501 fontname: 'sans', 502 fontcolor: '#000', 503 image: null 504}; 505 506JQ.fn.qrcode = module.exports = function main(options) { 507 var settings = JQ.extend({}, DEFAULTS, options); 508 return this.each(function (idx, el) { 509 if (el.nodeName.toLowerCase() === 'canvas') { 510 draw_on_canvas(el, settings); 511 } else { 512 JQ(el).append(create_html(settings)); 513 } 514 }); 515}; 516/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(1))) 517 518/***/ }), 519/* 1 */ 520/***/ (function(module, exports) { 521 522var g; 523 524// This works in non-strict mode 525g = (function() { 526 return this; 527})(); 528 529try { 530 // This works if eval is allowed (see CSP) 531 g = g || new Function("return this")(); 532} catch (e) { 533 // This works if the window reference is available 534 if (typeof window === "object") g = window; 535} 536 537// g can still be undefined, but nothing to do about it... 538// We return undefined, instead of nothing here, so it's 539// easier to handle this case. if(!global) { ...} 540 541module.exports = g; 542 543 544/***/ }), 545/* 2 */ 546/***/ (function(module, exports, __webpack_require__) { 547 548var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;//--------------------------------------------------------------------- 549// 550// QR Code Generator for JavaScript 551// 552// Copyright (c) 2009 Kazuhiko Arase 553// 554// URL: http://www.d-project.com/ 555// 556// Licensed under the MIT license: 557// http://www.opensource.org/licenses/mit-license.php 558// 559// The word 'QR Code' is registered trademark of 560// DENSO WAVE INCORPORATED 561// http://www.denso-wave.com/qrcode/faqpatent-e.html 562// 563//--------------------------------------------------------------------- 564 565var qrcode = function() { 566 567 //--------------------------------------------------------------------- 568 // qrcode 569 //--------------------------------------------------------------------- 570 571 /** 572 * qrcode 573 * @param typeNumber 1 to 40 574 * @param errorCorrectionLevel 'L','M','Q','H' 575 */ 576 var qrcode = function(typeNumber, errorCorrectionLevel) { 577 578 var PAD0 = 0xEC; 579 var PAD1 = 0x11; 580 581 var _typeNumber = typeNumber; 582 var _errorCorrectionLevel = QRErrorCorrectionLevel[errorCorrectionLevel]; 583 var _modules = null; 584 var _moduleCount = 0; 585 var _dataCache = null; 586 var _dataList = []; 587 588 var _this = {}; 589 590 var makeImpl = function(test, maskPattern) { 591 592 _moduleCount = _typeNumber * 4 + 17; 593 _modules = function(moduleCount) { 594 var modules = new Array(moduleCount); 595 for (var row = 0; row < moduleCount; row += 1) { 596 modules[row] = new Array(moduleCount); 597 for (var col = 0; col < moduleCount; col += 1) { 598 modules[row][col] = null; 599 } 600 } 601 return modules; 602 }(_moduleCount); 603 604 setupPositionProbePattern(0, 0); 605 setupPositionProbePattern(_moduleCount - 7, 0); 606 setupPositionProbePattern(0, _moduleCount - 7); 607 setupPositionAdjustPattern(); 608 setupTimingPattern(); 609 setupTypeInfo(test, maskPattern); 610 611 if (_typeNumber >= 7) { 612 setupTypeNumber(test); 613 } 614 615 if (_dataCache == null) { 616 _dataCache = createData(_typeNumber, _errorCorrectionLevel, _dataList); 617 } 618 619 mapData(_dataCache, maskPattern); 620 }; 621 622 var setupPositionProbePattern = function(row, col) { 623 624 for (var r = -1; r <= 7; r += 1) { 625 626 if (row + r <= -1 || _moduleCount <= row + r) continue; 627 628 for (var c = -1; c <= 7; c += 1) { 629 630 if (col + c <= -1 || _moduleCount <= col + c) continue; 631 632 if ( (0 <= r && r <= 6 && (c == 0 || c == 6) ) 633 || (0 <= c && c <= 6 && (r == 0 || r == 6) ) 634 || (2 <= r && r <= 4 && 2 <= c && c <= 4) ) { 635 _modules[row + r][col + c] = true; 636 } else { 637 _modules[row + r][col + c] = false; 638 } 639 } 640 } 641 }; 642 643 var getBestMaskPattern = function() { 644 645 var minLostPoint = 0; 646 var pattern = 0; 647 648 for (var i = 0; i < 8; i += 1) { 649 650 makeImpl(true, i); 651 652 var lostPoint = QRUtil.getLostPoint(_this); 653 654 if (i == 0 || minLostPoint > lostPoint) { 655 minLostPoint = lostPoint; 656 pattern = i; 657 } 658 } 659 660 return pattern; 661 }; 662 663 var setupTimingPattern = function() { 664 665 for (var r = 8; r < _moduleCount - 8; r += 1) { 666 if (_modules[r][6] != null) { 667 continue; 668 } 669 _modules[r][6] = (r % 2 == 0); 670 } 671 672 for (var c = 8; c < _moduleCount - 8; c += 1) { 673 if (_modules[6][c] != null) { 674 continue; 675 } 676 _modules[6][c] = (c % 2 == 0); 677 } 678 }; 679 680 var setupPositionAdjustPattern = function() { 681 682 var pos = QRUtil.getPatternPosition(_typeNumber); 683 684 for (var i = 0; i < pos.length; i += 1) { 685 686 for (var j = 0; j < pos.length; j += 1) { 687 688 var row = pos[i]; 689 var col = pos[j]; 690 691 if (_modules[row][col] != null) { 692 continue; 693 } 694 695 for (var r = -2; r <= 2; r += 1) { 696 697 for (var c = -2; c <= 2; c += 1) { 698 699 if (r == -2 || r == 2 || c == -2 || c == 2 700 || (r == 0 && c == 0) ) { 701 _modules[row + r][col + c] = true; 702 } else { 703 _modules[row + r][col + c] = false; 704 } 705 } 706 } 707 } 708 } 709 }; 710 711 var setupTypeNumber = function(test) { 712 713 var bits = QRUtil.getBCHTypeNumber(_typeNumber); 714 715 for (var i = 0; i < 18; i += 1) { 716 var mod = (!test && ( (bits >> i) & 1) == 1); 717 _modules[Math.floor(i / 3)][i % 3 + _moduleCount - 8 - 3] = mod; 718 } 719 720 for (var i = 0; i < 18; i += 1) { 721 var mod = (!test && ( (bits >> i) & 1) == 1); 722 _modules[i % 3 + _moduleCount - 8 - 3][Math.floor(i / 3)] = mod; 723 } 724 }; 725 726 var setupTypeInfo = function(test, maskPattern) { 727 728 var data = (_errorCorrectionLevel << 3) | maskPattern; 729 var bits = QRUtil.getBCHTypeInfo(data); 730 731 // vertical 732 for (var i = 0; i < 15; i += 1) { 733 734 var mod = (!test && ( (bits >> i) & 1) == 1); 735 736 if (i < 6) { 737 _modules[i][8] = mod; 738 } else if (i < 8) { 739 _modules[i + 1][8] = mod; 740 } else { 741 _modules[_moduleCount - 15 + i][8] = mod; 742 } 743 } 744 745 // horizontal 746 for (var i = 0; i < 15; i += 1) { 747 748 var mod = (!test && ( (bits >> i) & 1) == 1); 749 750 if (i < 8) { 751 _modules[8][_moduleCount - i - 1] = mod; 752 } else if (i < 9) { 753 _modules[8][15 - i - 1 + 1] = mod; 754 } else { 755 _modules[8][15 - i - 1] = mod; 756 } 757 } 758 759 // fixed module 760 _modules[_moduleCount - 8][8] = (!test); 761 }; 762 763 var mapData = function(data, maskPattern) { 764 765 var inc = -1; 766 var row = _moduleCount - 1; 767 var bitIndex = 7; 768 var byteIndex = 0; 769 var maskFunc = QRUtil.getMaskFunction(maskPattern); 770 771 for (var col = _moduleCount - 1; col > 0; col -= 2) { 772 773 if (col == 6) col -= 1; 774 775 while (true) { 776 777 for (var c = 0; c < 2; c += 1) { 778 779 if (_modules[row][col - c] == null) { 780 781 var dark = false; 782 783 if (byteIndex < data.length) { 784 dark = ( ( (data[byteIndex] >>> bitIndex) & 1) == 1); 785 } 786 787 var mask = maskFunc(row, col - c); 788 789 if (mask) { 790 dark = !dark; 791 } 792 793 _modules[row][col - c] = dark; 794 bitIndex -= 1; 795 796 if (bitIndex == -1) { 797 byteIndex += 1; 798 bitIndex = 7; 799 } 800 } 801 } 802 803 row += inc; 804 805 if (row < 0 || _moduleCount <= row) { 806 row -= inc; 807 inc = -inc; 808 break; 809 } 810 } 811 } 812 }; 813 814 var createBytes = function(buffer, rsBlocks) { 815 816 var offset = 0; 817 818 var maxDcCount = 0; 819 var maxEcCount = 0; 820 821 var dcdata = new Array(rsBlocks.length); 822 var ecdata = new Array(rsBlocks.length); 823 824 for (var r = 0; r < rsBlocks.length; r += 1) { 825 826 var dcCount = rsBlocks[r].dataCount; 827 var ecCount = rsBlocks[r].totalCount - dcCount; 828 829 maxDcCount = Math.max(maxDcCount, dcCount); 830 maxEcCount = Math.max(maxEcCount, ecCount); 831 832 dcdata[r] = new Array(dcCount); 833 834 for (var i = 0; i < dcdata[r].length; i += 1) { 835 dcdata[r][i] = 0xff & buffer.getBuffer()[i + offset]; 836 } 837 offset += dcCount; 838 839 var rsPoly = QRUtil.getErrorCorrectPolynomial(ecCount); 840 var rawPoly = qrPolynomial(dcdata[r], rsPoly.getLength() - 1); 841 842 var modPoly = rawPoly.mod(rsPoly); 843 ecdata[r] = new Array(rsPoly.getLength() - 1); 844 for (var i = 0; i < ecdata[r].length; i += 1) { 845 var modIndex = i + modPoly.getLength() - ecdata[r].length; 846 ecdata[r][i] = (modIndex >= 0)? modPoly.getAt(modIndex) : 0; 847 } 848 } 849 850 var totalCodeCount = 0; 851 for (var i = 0; i < rsBlocks.length; i += 1) { 852 totalCodeCount += rsBlocks[i].totalCount; 853 } 854 855 var data = new Array(totalCodeCount); 856 var index = 0; 857 858 for (var i = 0; i < maxDcCount; i += 1) { 859 for (var r = 0; r < rsBlocks.length; r += 1) { 860 if (i < dcdata[r].length) { 861 data[index] = dcdata[r][i]; 862 index += 1; 863 } 864 } 865 } 866 867 for (var i = 0; i < maxEcCount; i += 1) { 868 for (var r = 0; r < rsBlocks.length; r += 1) { 869 if (i < ecdata[r].length) { 870 data[index] = ecdata[r][i]; 871 index += 1; 872 } 873 } 874 } 875 876 return data; 877 }; 878 879 var createData = function(typeNumber, errorCorrectionLevel, dataList) { 880 881 var rsBlocks = QRRSBlock.getRSBlocks(typeNumber, errorCorrectionLevel); 882 883 var buffer = qrBitBuffer(); 884 885 for (var i = 0; i < dataList.length; i += 1) { 886 var data = dataList[i]; 887 buffer.put(data.getMode(), 4); 888 buffer.put(data.getLength(), QRUtil.getLengthInBits(data.getMode(), typeNumber) ); 889 data.write(buffer); 890 } 891 892 // calc num max data. 893 var totalDataCount = 0; 894 for (var i = 0; i < rsBlocks.length; i += 1) { 895 totalDataCount += rsBlocks[i].dataCount; 896 } 897 898 if (buffer.getLengthInBits() > totalDataCount * 8) { 899 throw 'code length overflow. (' 900 + buffer.getLengthInBits() 901 + '>' 902 + totalDataCount * 8 903 + ')'; 904 } 905 906 // end code 907 if (buffer.getLengthInBits() + 4 <= totalDataCount * 8) { 908 buffer.put(0, 4); 909 } 910 911 // padding 912 while (buffer.getLengthInBits() % 8 != 0) { 913 buffer.putBit(false); 914 } 915 916 // padding 917 while (true) { 918 919 if (buffer.getLengthInBits() >= totalDataCount * 8) { 920 break; 921 } 922 buffer.put(PAD0, 8); 923 924 if (buffer.getLengthInBits() >= totalDataCount * 8) { 925 break; 926 } 927 buffer.put(PAD1, 8); 928 } 929 930 return createBytes(buffer, rsBlocks); 931 }; 932 933 _this.addData = function(data, mode) { 934 935 mode = mode || 'Byte'; 936 937 var newData = null; 938 939 switch(mode) { 940 case 'Numeric' : 941 newData = qrNumber(data); 942 break; 943 case 'Alphanumeric' : 944 newData = qrAlphaNum(data); 945 break; 946 case 'Byte' : 947 newData = qr8BitByte(data); 948 break; 949 case 'Kanji' : 950 newData = qrKanji(data); 951 break; 952 default : 953 throw 'mode:' + mode; 954 } 955 956 _dataList.push(newData); 957 _dataCache = null; 958 }; 959 960 _this.isDark = function(row, col) { 961 if (row < 0 || _moduleCount <= row || col < 0 || _moduleCount <= col) { 962 throw row + ',' + col; 963 } 964 return _modules[row][col]; 965 }; 966 967 _this.getModuleCount = function() { 968 return _moduleCount; 969 }; 970 971 _this.make = function() { 972 if (_typeNumber < 1) { 973 var typeNumber = 1; 974 975 for (; typeNumber < 40; typeNumber++) { 976 var rsBlocks = QRRSBlock.getRSBlocks(typeNumber, _errorCorrectionLevel); 977 var buffer = qrBitBuffer(); 978 979 for (var i = 0; i < _dataList.length; i++) { 980 var data = _dataList[i]; 981 buffer.put(data.getMode(), 4); 982 buffer.put(data.getLength(), QRUtil.getLengthInBits(data.getMode(), typeNumber) ); 983 data.write(buffer); 984 } 985 986 var totalDataCount = 0; 987 for (var i = 0; i < rsBlocks.length; i++) { 988 totalDataCount += rsBlocks[i].dataCount; 989 } 990 991 if (buffer.getLengthInBits() <= totalDataCount * 8) { 992 break; 993 } 994 } 995 996 _typeNumber = typeNumber; 997 } 998 999 makeImpl(false, getBestMaskPattern() ); 1000 }; 1001 1002 _this.createTableTag = function(cellSize, margin) { 1003 1004 cellSize = cellSize || 2; 1005 margin = (typeof margin == 'undefined')? cellSize * 4 : margin; 1006 1007 var qrHtml = ''; 1008 1009 qrHtml += '<table style="'; 1010 qrHtml += ' border-width: 0px; border-style: none;'; 1011 qrHtml += ' border-collapse: collapse;'; 1012 qrHtml += ' padding: 0px; margin: ' + margin + 'px;'; 1013 qrHtml += '">'; 1014 qrHtml += '<tbody>'; 1015 1016 for (var r = 0; r < _this.getModuleCount(); r += 1) { 1017 1018 qrHtml += '<tr>'; 1019 1020 for (var c = 0; c < _this.getModuleCount(); c += 1) { 1021 qrHtml += '<td style="'; 1022 qrHtml += ' border-width: 0px; border-style: none;'; 1023 qrHtml += ' border-collapse: collapse;'; 1024 qrHtml += ' padding: 0px; margin: 0px;'; 1025 qrHtml += ' width: ' + cellSize + 'px;'; 1026 qrHtml += ' height: ' + cellSize + 'px;'; 1027 qrHtml += ' background-color: '; 1028 qrHtml += _this.isDark(r, c)? '#000000' : '#ffffff'; 1029 qrHtml += ';'; 1030 qrHtml += '"/>'; 1031 } 1032 1033 qrHtml += '</tr>'; 1034 } 1035 1036 qrHtml += '</tbody>'; 1037 qrHtml += '</table>'; 1038 1039 return qrHtml; 1040 }; 1041 1042 _this.createSvgTag = function(cellSize, margin) { 1043 1044 var opts = {}; 1045 if (typeof arguments[0] == 'object') { 1046 // Called by options. 1047 opts = arguments[0]; 1048 // overwrite cellSize and margin. 1049 cellSize = opts.cellSize; 1050 margin = opts.margin; 1051 } 1052 1053 cellSize = cellSize || 2; 1054 margin = (typeof margin == 'undefined')? cellSize * 4 : margin; 1055 var size = _this.getModuleCount() * cellSize + margin * 2; 1056 var c, mc, r, mr, qrSvg='', rect; 1057 1058 rect = 'l' + cellSize + ',0 0,' + cellSize + 1059 ' -' + cellSize + ',0 0,-' + cellSize + 'z '; 1060 1061 qrSvg += '<svg version="1.1" xmlns="http://www.w3.org/2000/svg"'; 1062 qrSvg += !opts.scalable ? ' width="' + size + 'px" height="' + size + 'px"' : ''; 1063 qrSvg += ' viewBox="0 0 ' + size + ' ' + size + '" '; 1064 qrSvg += ' preserveAspectRatio="xMinYMin meet">'; 1065 qrSvg += '<rect width="100%" height="100%" fill="white" cx="0" cy="0"/>'; 1066 qrSvg += '<path d="'; 1067 1068 for (r = 0; r < _this.getModuleCount(); r += 1) { 1069 mr = r * cellSize + margin; 1070 for (c = 0; c < _this.getModuleCount(); c += 1) { 1071 if (_this.isDark(r, c) ) { 1072 mc = c*cellSize+margin; 1073 qrSvg += 'M' + mc + ',' + mr + rect; 1074 } 1075 } 1076 } 1077 1078 qrSvg += '" stroke="transparent" fill="black"/>'; 1079 qrSvg += '</svg>'; 1080 1081 return qrSvg; 1082 }; 1083 1084 _this.createDataURL = function(cellSize, margin) { 1085 1086 cellSize = cellSize || 2; 1087 margin = (typeof margin == 'undefined')? cellSize * 4 : margin; 1088 1089 var size = _this.getModuleCount() * cellSize + margin * 2; 1090 var min = margin; 1091 var max = size - margin; 1092 1093 return createDataURL(size, size, function(x, y) { 1094 if (min <= x && x < max && min <= y && y < max) { 1095 var c = Math.floor( (x - min) / cellSize); 1096 var r = Math.floor( (y - min) / cellSize); 1097 return _this.isDark(r, c)? 0 : 1; 1098 } else { 1099 return 1; 1100 } 1101 } ); 1102 }; 1103 1104 _this.createImgTag = function(cellSize, margin, alt) { 1105 1106 cellSize = cellSize || 2; 1107 margin = (typeof margin == 'undefined')? cellSize * 4 : margin; 1108 1109 var size = _this.getModuleCount() * cellSize + margin * 2; 1110 1111 var img = ''; 1112 img += '<img'; 1113 img += '\u0020src="'; 1114 img += _this.createDataURL(cellSize, margin); 1115 img += '"'; 1116 img += '\u0020width="'; 1117 img += size; 1118 img += '"'; 1119 img += '\u0020height="'; 1120 img += size; 1121 img += '"'; 1122 if (alt) { 1123 img += '\u0020alt="'; 1124 img += alt; 1125 img += '"'; 1126 } 1127 img += '/>'; 1128 1129 return img; 1130 }; 1131 1132 var _createHalfASCII = function(margin) { 1133 var cellSize = 1; 1134 margin = (typeof margin == 'undefined')? cellSize * 2 : margin; 1135 1136 var size = _this.getModuleCount() * cellSize + margin * 2; 1137 var min = margin; 1138 var max = size - margin; 1139 1140 var y, x, r1, r2, p; 1141 1142 var blocks = { 1143 '██': '█', 1144 '█ ': '▀', 1145 ' █': '▄', 1146 ' ': ' ' 1147 }; 1148 1149 var blocksLastLineNoMargin = { 1150 '██': '▀', 1151 '█ ': '▀', 1152 ' █': ' ', 1153 ' ': ' ' 1154 }; 1155 1156 var ascii = ''; 1157 for (y = 0; y < size; y += 2) { 1158 r1 = Math.floor((y - min) / cellSize); 1159 r2 = Math.floor((y + 1 - min) / cellSize); 1160 for (x = 0; x < size; x += 1) { 1161 p = '█'; 1162 1163 if (min <= x && x < max && min <= y && y < max && _this.isDark(r1, Math.floor((x - min) / cellSize))) { 1164 p = ' '; 1165 } 1166 1167 if (min <= x && x < max && min <= y+1 && y+1 < max && _this.isDark(r2, Math.floor((x - min) / cellSize))) { 1168 p += ' '; 1169 } 1170 else { 1171 p += '█'; 1172 } 1173 1174 // Output 2 characters per pixel, to create full square. 1 character per pixels gives only half width of square. 1175 ascii += (margin < 1 && y+1 >= max) ? blocksLastLineNoMargin[p] : blocks[p]; 1176 } 1177 1178 ascii += '\n'; 1179 } 1180 1181 if (size % 2 && margin > 0) { 1182 return ascii.substring(0, ascii.length - size - 1) + Array(size+1).join('▀'); 1183 } 1184 1185 return ascii.substring(0, ascii.length-1); 1186 }; 1187 1188 _this.createASCII = function(cellSize, margin) { 1189 cellSize = cellSize || 1; 1190 1191 if (cellSize < 2) { 1192 return _createHalfASCII(margin); 1193 } 1194 1195 cellSize -= 1; 1196 margin = (typeof margin == 'undefined')? cellSize * 2 : margin; 1197 1198 var size = _this.getModuleCount() * cellSize + margin * 2; 1199 var min = margin; 1200 var max = size - margin; 1201 1202 var y, x, r, p; 1203 1204 var white = Array(cellSize+1).join('██'); 1205 var black = Array(cellSize+1).join(' '); 1206 1207 var ascii = ''; 1208 var line = ''; 1209 for (y = 0; y < size; y += 1) { 1210 r = Math.floor( (y - min) / cellSize); 1211 line = ''; 1212 for (x = 0; x < size; x += 1) { 1213 p = 1; 1214 1215 if (min <= x && x < max && min <= y && y < max && _this.isDark(r, Math.floor((x - min) / cellSize))) { 1216 p = 0; 1217 } 1218 1219 // Output 2 characters per pixel, to create full square. 1 character per pixels gives only half width of square. 1220 line += p ? white : black; 1221 } 1222 1223 for (r = 0; r < cellSize; r += 1) { 1224 ascii += line + '\n'; 1225 } 1226 } 1227 1228 return ascii.substring(0, ascii.length-1); 1229 }; 1230 1231 _this.renderTo2dContext = function(context, cellSize) { 1232 cellSize = cellSize || 2; 1233 var length = _this.getModuleCount(); 1234 for (var row = 0; row < length; row++) { 1235 for (var col = 0; col < length; col++) { 1236 context.fillStyle = _this.isDark(row, col) ? 'black' : 'white'; 1237 context.fillRect(row * cellSize, col * cellSize, cellSize, cellSize); 1238 } 1239 } 1240 } 1241 1242 return _this; 1243 }; 1244 1245 //--------------------------------------------------------------------- 1246 // qrcode.stringToBytes 1247 //--------------------------------------------------------------------- 1248 1249 qrcode.stringToBytesFuncs = { 1250 'default' : function(s) { 1251 var bytes = []; 1252 for (var i = 0; i < s.length; i += 1) { 1253 var c = s.charCodeAt(i); 1254 bytes.push(c & 0xff); 1255 } 1256 return bytes; 1257 } 1258 }; 1259 1260 qrcode.stringToBytes = qrcode.stringToBytesFuncs['default']; 1261 1262 //--------------------------------------------------------------------- 1263 // qrcode.createStringToBytes 1264 //--------------------------------------------------------------------- 1265 1266 /** 1267 * @param unicodeData base64 string of byte array. 1268 * [16bit Unicode],[16bit Bytes], ... 1269 * @param numChars 1270 */ 1271 qrcode.createStringToBytes = function(unicodeData, numChars) { 1272 1273 // create conversion map. 1274 1275 var unicodeMap = function() { 1276 1277 var bin = base64DecodeInputStream(unicodeData); 1278 var read = function() { 1279 var b = bin.read(); 1280 if (b == -1) throw 'eof'; 1281 return b; 1282 }; 1283 1284 var count = 0; 1285 var unicodeMap = {}; 1286 while (true) { 1287 var b0 = bin.read(); 1288 if (b0 == -1) break; 1289 var b1 = read(); 1290 var b2 = read(); 1291 var b3 = read(); 1292 var k = String.fromCharCode( (b0 << 8) | b1); 1293 var v = (b2 << 8) | b3; 1294 unicodeMap[k] = v; 1295 count += 1; 1296 } 1297 if (count != numChars) { 1298 throw count + ' != ' + numChars; 1299 } 1300 1301 return unicodeMap; 1302 }(); 1303 1304 var unknownChar = '?'.charCodeAt(0); 1305 1306 return function(s) { 1307 var bytes = []; 1308 for (var i = 0; i < s.length; i += 1) { 1309 var c = s.charCodeAt(i); 1310 if (c < 128) { 1311 bytes.push(c); 1312 } else { 1313 var b = unicodeMap[s.charAt(i)]; 1314 if (typeof b == 'number') { 1315 if ( (b & 0xff) == b) { 1316 // 1byte 1317 bytes.push(b); 1318 } else { 1319 // 2bytes 1320 bytes.push(b >>> 8); 1321 bytes.push(b & 0xff); 1322 } 1323 } else { 1324 bytes.push(unknownChar); 1325 } 1326 } 1327 } 1328 return bytes; 1329 }; 1330 }; 1331 1332 //--------------------------------------------------------------------- 1333 // QRMode 1334 //--------------------------------------------------------------------- 1335 1336 var QRMode = { 1337 MODE_NUMBER : 1 << 0, 1338 MODE_ALPHA_NUM : 1 << 1, 1339 MODE_8BIT_BYTE : 1 << 2, 1340 MODE_KANJI : 1 << 3 1341 }; 1342 1343 //--------------------------------------------------------------------- 1344 // QRErrorCorrectionLevel 1345 //--------------------------------------------------------------------- 1346 1347 var QRErrorCorrectionLevel = { 1348 L : 1, 1349 M : 0, 1350 Q : 3, 1351 H : 2 1352 }; 1353 1354 //--------------------------------------------------------------------- 1355 // QRMaskPattern 1356 //--------------------------------------------------------------------- 1357 1358 var QRMaskPattern = { 1359 PATTERN000 : 0, 1360 PATTERN001 : 1, 1361 PATTERN010 : 2, 1362 PATTERN011 : 3, 1363 PATTERN100 : 4, 1364 PATTERN101 : 5, 1365 PATTERN110 : 6, 1366 PATTERN111 : 7 1367 }; 1368 1369 //--------------------------------------------------------------------- 1370 // QRUtil 1371 //--------------------------------------------------------------------- 1372 1373 var QRUtil = function() { 1374 1375 var PATTERN_POSITION_TABLE = [ 1376 [], 1377 [6, 18], 1378 [6, 22], 1379 [6, 26], 1380 [6, 30], 1381 [6, 34], 1382 [6, 22, 38], 1383 [6, 24, 42], 1384 [6, 26, 46], 1385 [6, 28, 50], 1386 [6, 30, 54], 1387 [6, 32, 58], 1388 [6, 34, 62], 1389 [6, 26, 46, 66], 1390 [6, 26, 48, 70], 1391 [6, 26, 50, 74], 1392 [6, 30, 54, 78], 1393 [6, 30, 56, 82], 1394 [6, 30, 58, 86], 1395 [6, 34, 62, 90], 1396 [6, 28, 50, 72, 94], 1397 [6, 26, 50, 74, 98], 1398 [6, 30, 54, 78, 102], 1399 [6, 28, 54, 80, 106], 1400 [6, 32, 58, 84, 110], 1401 [6, 30, 58, 86, 114], 1402 [6, 34, 62, 90, 118], 1403 [6, 26, 50, 74, 98, 122], 1404 [6, 30, 54, 78, 102, 126], 1405 [6, 26, 52, 78, 104, 130], 1406 [6, 30, 56, 82, 108, 134], 1407 [6, 34, 60, 86, 112, 138], 1408 [6, 30, 58, 86, 114, 142], 1409 [6, 34, 62, 90, 118, 146], 1410 [6, 30, 54, 78, 102, 126, 150], 1411 [6, 24, 50, 76, 102, 128, 154], 1412 [6, 28, 54, 80, 106, 132, 158], 1413 [6, 32, 58, 84, 110, 136, 162], 1414 [6, 26, 54, 82, 110, 138, 166], 1415 [6, 30, 58, 86, 114, 142, 170] 1416 ]; 1417 var G15 = (1 << 10) | (1 << 8) | (1 << 5) | (1 << 4) | (1 << 2) | (1 << 1) | (1 << 0); 1418 var G18 = (1 << 12) | (1 << 11) | (1 << 10) | (1 << 9) | (1 << 8) | (1 << 5) | (1 << 2) | (1 << 0); 1419 var G15_MASK = (1 << 14) | (1 << 12) | (1 << 10) | (1 << 4) | (1 << 1); 1420 1421 var _this = {}; 1422 1423 var getBCHDigit = function(data) { 1424 var digit = 0; 1425 while (data != 0) { 1426 digit += 1; 1427 data >>>= 1; 1428 } 1429 return digit; 1430 }; 1431 1432 _this.getBCHTypeInfo = function(data) { 1433 var d = data << 10; 1434 while (getBCHDigit(d) - getBCHDigit(G15) >= 0) { 1435 d ^= (G15 << (getBCHDigit(d) - getBCHDigit(G15) ) ); 1436 } 1437 return ( (data << 10) | d) ^ G15_MASK; 1438 }; 1439 1440 _this.getBCHTypeNumber = function(data) { 1441 var d = data << 12; 1442 while (getBCHDigit(d) - getBCHDigit(G18) >= 0) { 1443 d ^= (G18 << (getBCHDigit(d) - getBCHDigit(G18) ) ); 1444 } 1445 return (data << 12) | d; 1446 }; 1447 1448 _this.getPatternPosition = function(typeNumber) { 1449 return PATTERN_POSITION_TABLE[typeNumber - 1]; 1450 }; 1451 1452 _this.getMaskFunction = function(maskPattern) { 1453 1454 switch (maskPattern) { 1455 1456 case QRMaskPattern.PATTERN000 : 1457 return function(i, j) { return (i + j) % 2 == 0; }; 1458 case QRMaskPattern.PATTERN001 : 1459 return function(i, j) { return i % 2 == 0; }; 1460 case QRMaskPattern.PATTERN010 : 1461 return function(i, j) { return j % 3 == 0; }; 1462 case QRMaskPattern.PATTERN011 : 1463 return function(i, j) { return (i + j) % 3 == 0; }; 1464 case QRMaskPattern.PATTERN100 : 1465 return function(i, j) { return (Math.floor(i / 2) + Math.floor(j / 3) ) % 2 == 0; }; 1466 case QRMaskPattern.PATTERN101 : 1467 return function(i, j) { return (i * j) % 2 + (i * j) % 3 == 0; }; 1468 case QRMaskPattern.PATTERN110 : 1469 return function(i, j) { return ( (i * j) % 2 + (i * j) % 3) % 2 == 0; }; 1470 case QRMaskPattern.PATTERN111 : 1471 return function(i, j) { return ( (i * j) % 3 + (i + j) % 2) % 2 == 0; }; 1472 1473 default : 1474 throw 'bad maskPattern:' + maskPattern; 1475 } 1476 }; 1477 1478 _this.getErrorCorrectPolynomial = function(errorCorrectLength) { 1479 var a = qrPolynomial([1], 0); 1480 for (var i = 0; i < errorCorrectLength; i += 1) { 1481 a = a.multiply(qrPolynomial([1, QRMath.gexp(i)], 0) ); 1482 } 1483 return a; 1484 }; 1485 1486 _this.getLengthInBits = function(mode, type) { 1487 1488 if (1 <= type && type < 10) { 1489 1490 // 1 - 9 1491 1492 switch(mode) { 1493 case QRMode.MODE_NUMBER : return 10; 1494 case QRMode.MODE_ALPHA_NUM : return 9; 1495 case QRMode.MODE_8BIT_BYTE : return 8; 1496 case QRMode.MODE_KANJI : return 8; 1497 default : 1498 throw 'mode:' + mode; 1499 } 1500 1501 } else if (type < 27) { 1502 1503 // 10 - 26 1504 1505 switch(mode) { 1506 case QRMode.MODE_NUMBER : return 12; 1507 case QRMode.MODE_ALPHA_NUM : return 11; 1508 case QRMode.MODE_8BIT_BYTE : return 16; 1509 case QRMode.MODE_KANJI : return 10; 1510 default : 1511 throw 'mode:' + mode; 1512 } 1513 1514 } else if (type < 41) { 1515 1516 // 27 - 40 1517 1518 switch(mode) { 1519 case QRMode.MODE_NUMBER : return 14; 1520 case QRMode.MODE_ALPHA_NUM : return 13; 1521 case QRMode.MODE_8BIT_BYTE : return 16; 1522 case QRMode.MODE_KANJI : return 12; 1523 default : 1524 throw 'mode:' + mode; 1525 } 1526 1527 } else { 1528 throw 'type:' + type; 1529 } 1530 }; 1531 1532 _this.getLostPoint = function(qrcode) { 1533 1534 var moduleCount = qrcode.getModuleCount(); 1535 1536 var lostPoint = 0; 1537 1538 // LEVEL1 1539 1540 for (var row = 0; row < moduleCount; row += 1) { 1541 for (var col = 0; col < moduleCount; col += 1) { 1542 1543 var sameCount = 0; 1544 var dark = qrcode.isDark(row, col); 1545 1546 for (var r = -1; r <= 1; r += 1) { 1547 1548 if (row + r < 0 || moduleCount <= row + r) { 1549 continue; 1550 } 1551 1552 for (var c = -1; c <= 1; c += 1) { 1553 1554 if (col + c < 0 || moduleCount <= col + c) { 1555 continue; 1556 } 1557 1558 if (r == 0 && c == 0) { 1559 continue; 1560 } 1561 1562 if (dark == qrcode.isDark(row + r, col + c) ) { 1563 sameCount += 1; 1564 } 1565 } 1566 } 1567 1568 if (sameCount > 5) { 1569 lostPoint += (3 + sameCount - 5); 1570 } 1571 } 1572 }; 1573 1574 // LEVEL2 1575 1576 for (var row = 0; row < moduleCount - 1; row += 1) { 1577 for (var col = 0; col < moduleCount - 1; col += 1) { 1578 var count = 0; 1579 if (qrcode.isDark(row, col) ) count += 1; 1580 if (qrcode.isDark(row + 1, col) ) count += 1; 1581 if (qrcode.isDark(row, col + 1) ) count += 1; 1582 if (qrcode.isDark(row + 1, col + 1) ) count += 1; 1583 if (count == 0 || count == 4) { 1584 lostPoint += 3; 1585 } 1586 } 1587 } 1588 1589 // LEVEL3 1590 1591 for (var row = 0; row < moduleCount; row += 1) { 1592 for (var col = 0; col < moduleCount - 6; col += 1) { 1593 if (qrcode.isDark(row, col) 1594 && !qrcode.isDark(row, col + 1) 1595 && qrcode.isDark(row, col + 2) 1596 && qrcode.isDark(row, col + 3) 1597 && qrcode.isDark(row, col + 4) 1598 && !qrcode.isDark(row, col + 5) 1599 && qrcode.isDark(row, col + 6) ) { 1600 lostPoint += 40; 1601 } 1602 } 1603 } 1604 1605 for (var col = 0; col < moduleCount; col += 1) { 1606 for (var row = 0; row < moduleCount - 6; row += 1) { 1607 if (qrcode.isDark(row, col) 1608 && !qrcode.isDark(row + 1, col) 1609 && qrcode.isDark(row + 2, col) 1610 && qrcode.isDark(row + 3, col) 1611 && qrcode.isDark(row + 4, col) 1612 && !qrcode.isDark(row + 5, col) 1613 && qrcode.isDark(row + 6, col) ) { 1614 lostPoint += 40; 1615 } 1616 } 1617 } 1618 1619 // LEVEL4 1620 1621 var darkCount = 0; 1622 1623 for (var col = 0; col < moduleCount; col += 1) { 1624 for (var row = 0; row < moduleCount; row += 1) { 1625 if (qrcode.isDark(row, col) ) { 1626 darkCount += 1; 1627 } 1628 } 1629 } 1630 1631 var ratio = Math.abs(100 * darkCount / moduleCount / moduleCount - 50) / 5; 1632 lostPoint += ratio * 10; 1633 1634 return lostPoint; 1635 }; 1636 1637 return _this; 1638 }(); 1639 1640 //--------------------------------------------------------------------- 1641 // QRMath 1642 //--------------------------------------------------------------------- 1643 1644 var QRMath = function() { 1645 1646 var EXP_TABLE = new Array(256); 1647 var LOG_TABLE = new Array(256); 1648 1649 // initialize tables 1650 for (var i = 0; i < 8; i += 1) { 1651 EXP_TABLE[i] = 1 << i; 1652 } 1653 for (var i = 8; i < 256; i += 1) { 1654 EXP_TABLE[i] = EXP_TABLE[i - 4] 1655 ^ EXP_TABLE[i - 5] 1656 ^ EXP_TABLE[i - 6] 1657 ^ EXP_TABLE[i - 8]; 1658 } 1659 for (var i = 0; i < 255; i += 1) { 1660 LOG_TABLE[EXP_TABLE[i] ] = i; 1661 } 1662 1663 var _this = {}; 1664 1665 _this.glog = function(n) { 1666 1667 if (n < 1) { 1668 throw 'glog(' + n + ')'; 1669 } 1670 1671 return LOG_TABLE[n]; 1672 }; 1673 1674 _this.gexp = function(n) { 1675 1676 while (n < 0) { 1677 n += 255; 1678 } 1679 1680 while (n >= 256) { 1681 n -= 255; 1682 } 1683 1684 return EXP_TABLE[n]; 1685 }; 1686 1687 return _this; 1688 }(); 1689 1690 //--------------------------------------------------------------------- 1691 // qrPolynomial 1692 //--------------------------------------------------------------------- 1693 1694 function qrPolynomial(num, shift) { 1695 1696 if (typeof num.length == 'undefined') { 1697 throw num.length + '/' + shift; 1698 } 1699 1700 var _num = function() { 1701 var offset = 0; 1702 while (offset < num.length && num[offset] == 0) { 1703 offset += 1; 1704 } 1705 var _num = new Array(num.length - offset + shift); 1706 for (var i = 0; i < num.length - offset; i += 1) { 1707 _num[i] = num[i + offset]; 1708 } 1709 return _num; 1710 }(); 1711 1712 var _this = {}; 1713 1714 _this.getAt = function(index) { 1715 return _num[index]; 1716 }; 1717 1718 _this.getLength = function() { 1719 return _num.length; 1720 }; 1721 1722 _this.multiply = function(e) { 1723 1724 var num = new Array(_this.getLength() + e.getLength() - 1); 1725 1726 for (var i = 0; i < _this.getLength(); i += 1) { 1727 for (var j = 0; j < e.getLength(); j += 1) { 1728 num[i + j] ^= QRMath.gexp(QRMath.glog(_this.getAt(i) ) + QRMath.glog(e.getAt(j) ) ); 1729 } 1730 } 1731 1732 return qrPolynomial(num, 0); 1733 }; 1734 1735 _this.mod = function(e) { 1736 1737 if (_this.getLength() - e.getLength() < 0) { 1738 return _this; 1739 } 1740 1741 var ratio = QRMath.glog(_this.getAt(0) ) - QRMath.glog(e.getAt(0) ); 1742 1743 var num = new Array(_this.getLength() ); 1744 for (var i = 0; i < _this.getLength(); i += 1) { 1745 num[i] = _this.getAt(i); 1746 } 1747 1748 for (var i = 0; i < e.getLength(); i += 1) { 1749 num[i] ^= QRMath.gexp(QRMath.glog(e.getAt(i) ) + ratio); 1750 } 1751 1752 // recursive call 1753 return qrPolynomial(num, 0).mod(e); 1754 }; 1755 1756 return _this; 1757 }; 1758 1759 //--------------------------------------------------------------------- 1760 // QRRSBlock 1761 //--------------------------------------------------------------------- 1762 1763 var QRRSBlock = function() { 1764 1765 var RS_BLOCK_TABLE = [ 1766 1767 // L 1768 // M 1769 // Q 1770 // H 1771 1772 // 1 1773 [1, 26, 19], 1774 [1, 26, 16], 1775 [1, 26, 13], 1776 [1, 26, 9], 1777 1778 // 2 1779 [1, 44, 34], 1780 [1, 44, 28], 1781 [1, 44, 22], 1782 [1, 44, 16], 1783 1784 // 3 1785 [1, 70, 55], 1786 [1, 70, 44], 1787 [2, 35, 17], 1788 [2, 35, 13], 1789 1790 // 4 1791 [1, 100, 80], 1792 [2, 50, 32], 1793 [2, 50, 24], 1794 [4, 25, 9], 1795 1796 // 5 1797 [1, 134, 108], 1798 [2, 67, 43], 1799 [2, 33, 15, 2, 34, 16], 1800 [2, 33, 11, 2, 34, 12], 1801 1802 // 6 1803 [2, 86, 68], 1804 [4, 43, 27], 1805 [4, 43, 19], 1806 [4, 43, 15], 1807 1808 // 7 1809 [2, 98, 78], 1810 [4, 49, 31], 1811 [2, 32, 14, 4, 33, 15], 1812 [4, 39, 13, 1, 40, 14], 1813 1814 // 8 1815 [2, 121, 97], 1816 [2, 60, 38, 2, 61, 39], 1817 [4, 40, 18, 2, 41, 19], 1818 [4, 40, 14, 2, 41, 15], 1819 1820 // 9 1821 [2, 146, 116], 1822 [3, 58, 36, 2, 59, 37], 1823 [4, 36, 16, 4, 37, 17], 1824 [4, 36, 12, 4, 37, 13], 1825 1826 // 10 1827 [2, 86, 68, 2, 87, 69], 1828 [4, 69, 43, 1, 70, 44], 1829 [6, 43, 19, 2, 44, 20], 1830 [6, 43, 15, 2, 44, 16], 1831 1832 // 11 1833 [4, 101, 81], 1834 [1, 80, 50, 4, 81, 51], 1835 [4, 50, 22, 4, 51, 23], 1836 [3, 36, 12, 8, 37, 13], 1837 1838 // 12 1839 [2, 116, 92, 2, 117, 93], 1840 [6, 58, 36, 2, 59, 37], 1841 [4, 46, 20, 6, 47, 21], 1842 [7, 42, 14, 4, 43, 15], 1843 1844 // 13 1845 [4, 133, 107], 1846 [8, 59, 37, 1, 60, 38], 1847 [8, 44, 20, 4, 45, 21], 1848 [12, 33, 11, 4, 34, 12], 1849 1850 // 14 1851 [3, 145, 115, 1, 146, 116], 1852 [4, 64, 40, 5, 65, 41], 1853 [11, 36, 16, 5, 37, 17], 1854 [11, 36, 12, 5, 37, 13], 1855 1856 // 15 1857 [5, 109, 87, 1, 110, 88], 1858 [5, 65, 41, 5, 66, 42], 1859 [5, 54, 24, 7, 55, 25], 1860 [11, 36, 12, 7, 37, 13], 1861 1862 // 16 1863 [5, 122, 98, 1, 123, 99], 1864 [7, 73, 45, 3, 74, 46], 1865 [15, 43, 19, 2, 44, 20], 1866 [3, 45, 15, 13, 46, 16], 1867 1868 // 17 1869 [1, 135, 107, 5, 136, 108], 1870 [10, 74, 46, 1, 75, 47], 1871 [1, 50, 22, 15, 51, 23], 1872 [2, 42, 14, 17, 43, 15], 1873 1874 // 18 1875 [5, 150, 120, 1, 151, 121], 1876 [9, 69, 43, 4, 70, 44], 1877 [17, 50, 22, 1, 51, 23], 1878 [2, 42, 14, 19, 43, 15], 1879 1880 // 19 1881 [3, 141, 113, 4, 142, 114], 1882 [3, 70, 44, 11, 71, 45], 1883 [17, 47, 21, 4, 48, 22], 1884 [9, 39, 13, 16, 40, 14], 1885 1886 // 20 1887 [3, 135, 107, 5, 136, 108], 1888 [3, 67, 41, 13, 68, 42], 1889 [15, 54, 24, 5, 55, 25], 1890 [15, 43, 15, 10, 44, 16], 1891 1892 // 21 1893 [4, 144, 116, 4, 145, 117], 1894 [17, 68, 42], 1895 [17, 50, 22, 6, 51, 23], 1896 [19, 46, 16, 6, 47, 17], 1897 1898 // 22 1899 [2, 139, 111, 7, 140, 112], 1900 [17, 74, 46], 1901 [7, 54, 24, 16, 55, 25], 1902 [34, 37, 13], 1903 1904 // 23 1905 [4, 151, 121, 5, 152, 122], 1906 [4, 75, 47, 14, 76, 48], 1907 [11, 54, 24, 14, 55, 25], 1908 [16, 45, 15, 14, 46, 16], 1909 1910 // 24 1911 [6, 147, 117, 4, 148, 118], 1912 [6, 73, 45, 14, 74, 46], 1913 [11, 54, 24, 16, 55, 25], 1914 [30, 46, 16, 2, 47, 17], 1915 1916 // 25 1917 [8, 132, 106, 4, 133, 107], 1918 [8, 75, 47, 13, 76, 48], 1919 [7, 54, 24, 22, 55, 25], 1920 [22, 45, 15, 13, 46, 16], 1921 1922 // 26 1923 [10, 142, 114, 2, 143, 115], 1924 [19, 74, 46, 4, 75, 47], 1925 [28, 50, 22, 6, 51, 23], 1926 [33, 46, 16, 4, 47, 17], 1927 1928 // 27 1929 [8, 152, 122, 4, 153, 123], 1930 [22, 73, 45, 3, 74, 46], 1931 [8, 53, 23, 26, 54, 24], 1932 [12, 45, 15, 28, 46, 16], 1933 1934 // 28 1935 [3, 147, 117, 10, 148, 118], 1936 [3, 73, 45, 23, 74, 46], 1937 [4, 54, 24, 31, 55, 25], 1938 [11, 45, 15, 31, 46, 16], 1939 1940 // 29 1941 [7, 146, 116, 7, 147, 117], 1942 [21, 73, 45, 7, 74, 46], 1943 [1, 53, 23, 37, 54, 24], 1944 [19, 45, 15, 26, 46, 16], 1945 1946 // 30 1947 [5, 145, 115, 10, 146, 116], 1948 [19, 75, 47, 10, 76, 48], 1949 [15, 54, 24, 25, 55, 25], 1950 [23, 45, 15, 25, 46, 16], 1951 1952 // 31 1953 [13, 145, 115, 3, 146, 116], 1954 [2, 74, 46, 29, 75, 47], 1955 [42, 54, 24, 1, 55, 25], 1956 [23, 45, 15, 28, 46, 16], 1957 1958 // 32 1959 [17, 145, 115], 1960 [10, 74, 46, 23, 75, 47], 1961 [10, 54, 24, 35, 55, 25], 1962 [19, 45, 15, 35, 46, 16], 1963 1964 // 33 1965 [17, 145, 115, 1, 146, 116], 1966 [14, 74, 46, 21, 75, 47], 1967 [29, 54, 24, 19, 55, 25], 1968 [11, 45, 15, 46, 46, 16], 1969 1970 // 34 1971 [13, 145, 115, 6, 146, 116], 1972 [14, 74, 46, 23, 75, 47], 1973 [44, 54, 24, 7, 55, 25], 1974 [59, 46, 16, 1, 47, 17], 1975 1976 // 35 1977 [12, 151, 121, 7, 152, 122], 1978 [12, 75, 47, 26, 76, 48], 1979 [39, 54, 24, 14, 55, 25], 1980 [22, 45, 15, 41, 46, 16], 1981 1982 // 36 1983 [6, 151, 121, 14, 152, 122], 1984 [6, 75, 47, 34, 76, 48], 1985 [46, 54, 24, 10, 55, 25], 1986 [2, 45, 15, 64, 46, 16], 1987 1988 // 37 1989 [17, 152, 122, 4, 153, 123], 1990 [29, 74, 46, 14, 75, 47], 1991 [49, 54, 24, 10, 55, 25], 1992 [24, 45, 15, 46, 46, 16], 1993 1994 // 38 1995 [4, 152, 122, 18, 153, 123], 1996 [13, 74, 46, 32, 75, 47], 1997 [48, 54, 24, 14, 55, 25], 1998 [42, 45, 15, 32, 46, 16], 1999 2000 // 39 2001 [20, 147, 117, 4, 148, 118], 2002 [40, 75, 47, 7, 76, 48], 2003 [43, 54, 24, 22, 55, 25], 2004 [10, 45, 15, 67, 46, 16], 2005 2006 // 40 2007 [19, 148, 118, 6, 149, 119], 2008 [18, 75, 47, 31, 76, 48], 2009 [34, 54, 24, 34, 55, 25], 2010 [20, 45, 15, 61, 46, 16] 2011 ]; 2012 2013 var qrRSBlock = function(totalCount, dataCount) { 2014 var _this = {}; 2015 _this.totalCount = totalCount; 2016 _this.dataCount = dataCount; 2017 return _this; 2018 }; 2019 2020 var _this = {}; 2021 2022 var getRsBlockTable = function(typeNumber, errorCorrectionLevel) { 2023 2024 switch(errorCorrectionLevel) { 2025 case QRErrorCorrectionLevel.L : 2026 return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 0]; 2027 case QRErrorCorrectionLevel.M : 2028 return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 1]; 2029 case QRErrorCorrectionLevel.Q : 2030 return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 2]; 2031 case QRErrorCorrectionLevel.H : 2032 return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 3]; 2033 default : 2034 return undefined; 2035 } 2036 }; 2037 2038 _this.getRSBlocks = function(typeNumber, errorCorrectionLevel) { 2039 2040 var rsBlock = getRsBlockTable(typeNumber, errorCorrectionLevel); 2041 2042 if (typeof rsBlock == 'undefined') { 2043 throw 'bad rs block @ typeNumber:' + typeNumber + 2044 '/errorCorrectionLevel:' + errorCorrectionLevel; 2045 } 2046 2047 var length = rsBlock.length / 3; 2048 2049 var list = []; 2050 2051 for (var i = 0; i < length; i += 1) { 2052 2053 var count = rsBlock[i * 3 + 0]; 2054 var totalCount = rsBlock[i * 3 + 1]; 2055 var dataCount = rsBlock[i * 3 + 2]; 2056 2057 for (var j = 0; j < count; j += 1) { 2058 list.push(qrRSBlock(totalCount, dataCount) ); 2059 } 2060 } 2061 2062 return list; 2063 }; 2064 2065 return _this; 2066 }(); 2067 2068 //--------------------------------------------------------------------- 2069 // qrBitBuffer 2070 //--------------------------------------------------------------------- 2071 2072 var qrBitBuffer = function() { 2073 2074 var _buffer = []; 2075 var _length = 0; 2076 2077 var _this = {}; 2078 2079 _this.getBuffer = function() { 2080 return _buffer; 2081 }; 2082 2083 _this.getAt = function(index) { 2084 var bufIndex = Math.floor(index / 8); 2085 return ( (_buffer[bufIndex] >>> (7 - index % 8) ) & 1) == 1; 2086 }; 2087 2088 _this.put = function(num, length) { 2089 for (var i = 0; i < length; i += 1) { 2090 _this.putBit( ( (num >>> (length - i - 1) ) & 1) == 1); 2091 } 2092 }; 2093 2094 _this.getLengthInBits = function() { 2095 return _length; 2096 }; 2097 2098 _this.putBit = function(bit) { 2099 2100 var bufIndex = Math.floor(_length / 8); 2101 if (_buffer.length <= bufIndex) { 2102 _buffer.push(0); 2103 } 2104 2105 if (bit) { 2106 _buffer[bufIndex] |= (0x80 >>> (_length % 8) ); 2107 } 2108 2109 _length += 1; 2110 }; 2111 2112 return _this; 2113 }; 2114 2115 //--------------------------------------------------------------------- 2116 // qrNumber 2117 //--------------------------------------------------------------------- 2118 2119 var qrNumber = function(data) { 2120 2121 var _mode = QRMode.MODE_NUMBER; 2122 var _data = data; 2123 2124 var _this = {}; 2125 2126 _this.getMode = function() { 2127 return _mode; 2128 }; 2129 2130 _this.getLength = function(buffer) { 2131 return _data.length; 2132 }; 2133 2134 _this.write = function(buffer) { 2135 2136 var data = _data; 2137 2138 var i = 0; 2139 2140 while (i + 2 < data.length) { 2141 buffer.put(strToNum(data.substring(i, i + 3) ), 10); 2142 i += 3; 2143 } 2144 2145 if (i < data.length) { 2146 if (data.length - i == 1) { 2147 buffer.put(strToNum(data.substring(i, i + 1) ), 4); 2148 } else if (data.length - i == 2) { 2149 buffer.put(strToNum(data.substring(i, i + 2) ), 7); 2150 } 2151 } 2152 }; 2153 2154 var strToNum = function(s) { 2155 var num = 0; 2156 for (var i = 0; i < s.length; i += 1) { 2157 num = num * 10 + chatToNum(s.charAt(i) ); 2158 } 2159 return num; 2160 }; 2161 2162 var chatToNum = function(c) { 2163 if ('0' <= c && c <= '9') { 2164 return c.charCodeAt(0) - '0'.charCodeAt(0); 2165 } 2166 throw 'illegal char :' + c; 2167 }; 2168 2169 return _this; 2170 }; 2171 2172 //--------------------------------------------------------------------- 2173 // qrAlphaNum 2174 //--------------------------------------------------------------------- 2175 2176 var qrAlphaNum = function(data) { 2177 2178 var _mode = QRMode.MODE_ALPHA_NUM; 2179 var _data = data; 2180 2181 var _this = {}; 2182 2183 _this.getMode = function() { 2184 return _mode; 2185 }; 2186 2187 _this.getLength = function(buffer) { 2188 return _data.length; 2189 }; 2190 2191 _this.write = function(buffer) { 2192 2193 var s = _data; 2194 2195 var i = 0; 2196 2197 while (i + 1 < s.length) { 2198 buffer.put( 2199 getCode(s.charAt(i) ) * 45 + 2200 getCode(s.charAt(i + 1) ), 11); 2201 i += 2; 2202 } 2203 2204 if (i < s.length) { 2205 buffer.put(getCode(s.charAt(i) ), 6); 2206 } 2207 }; 2208 2209 var getCode = function(c) { 2210 2211 if ('0' <= c && c <= '9') { 2212 return c.charCodeAt(0) - '0'.charCodeAt(0); 2213 } else if ('A' <= c && c <= 'Z') { 2214 return c.charCodeAt(0) - 'A'.charCodeAt(0) + 10; 2215 } else { 2216 switch (c) { 2217 case ' ' : return 36; 2218 case '$' : return 37; 2219 case '%' : return 38; 2220 case '*' : return 39; 2221 case '+' : return 40; 2222 case '-' : return 41; 2223 case '.' : return 42; 2224 case '/' : return 43; 2225 case ':' : return 44; 2226 default : 2227 throw 'illegal char :' + c; 2228 } 2229 } 2230 }; 2231 2232 return _this; 2233 }; 2234 2235 //--------------------------------------------------------------------- 2236 // qr8BitByte 2237 //--------------------------------------------------------------------- 2238 2239 var qr8BitByte = function(data) { 2240 2241 var _mode = QRMode.MODE_8BIT_BYTE; 2242 var _data = data; 2243 var _bytes = qrcode.stringToBytes(data); 2244 2245 var _this = {}; 2246 2247 _this.getMode = function() { 2248 return _mode; 2249 }; 2250 2251 _this.getLength = function(buffer) { 2252 return _bytes.length; 2253 }; 2254 2255 _this.write = function(buffer) { 2256 for (var i = 0; i < _bytes.length; i += 1) { 2257 buffer.put(_bytes[i], 8); 2258 } 2259 }; 2260 2261 return _this; 2262 }; 2263 2264 //--------------------------------------------------------------------- 2265 // qrKanji 2266 //--------------------------------------------------------------------- 2267 2268 var qrKanji = function(data) { 2269 2270 var _mode = QRMode.MODE_KANJI; 2271 var _data = data; 2272 2273 var stringToBytes = qrcode.stringToBytesFuncs['SJIS']; 2274 if (!stringToBytes) { 2275 throw 'sjis not supported.'; 2276 } 2277 !function(c, code) { 2278 // self test for sjis support. 2279 var test = stringToBytes(c); 2280 if (test.length != 2 || ( (test[0] << 8) | test[1]) != code) { 2281 throw 'sjis not supported.'; 2282 } 2283 }('\u53cb', 0x9746); 2284 2285 var _bytes = stringToBytes(data); 2286 2287 var _this = {}; 2288 2289 _this.getMode = function() { 2290 return _mode; 2291 }; 2292 2293 _this.getLength = function(buffer) { 2294 return ~~(_bytes.length / 2); 2295 }; 2296 2297 _this.write = function(buffer) { 2298 2299 var data = _bytes; 2300 2301 var i = 0; 2302 2303 while (i + 1 < data.length) { 2304 2305 var c = ( (0xff & data[i]) << 8) | (0xff & data[i + 1]); 2306 2307 if (0x8140 <= c && c <= 0x9FFC) { 2308 c -= 0x8140; 2309 } else if (0xE040 <= c && c <= 0xEBBF) { 2310 c -= 0xC140; 2311 } else { 2312 throw 'illegal char at ' + (i + 1) + '/' + c; 2313 } 2314 2315 c = ( (c >>> 8) & 0xff) * 0xC0 + (c & 0xff); 2316 2317 buffer.put(c, 13); 2318 2319 i += 2; 2320 } 2321 2322 if (i < data.length) { 2323 throw 'illegal char at ' + (i + 1); 2324 } 2325 }; 2326 2327 return _this; 2328 }; 2329 2330 //===================================================================== 2331 // GIF Support etc. 2332 // 2333 2334 //--------------------------------------------------------------------- 2335 // byteArrayOutputStream 2336 //--------------------------------------------------------------------- 2337 2338 var byteArrayOutputStream = function() { 2339 2340 var _bytes = []; 2341 2342 var _this = {}; 2343 2344 _this.writeByte = function(b) { 2345 _bytes.push(b & 0xff); 2346 }; 2347 2348 _this.writeShort = function(i) { 2349 _this.writeByte(i); 2350 _this.writeByte(i >>> 8); 2351 }; 2352 2353 _this.writeBytes = function(b, off, len) { 2354 off = off || 0; 2355 len = len || b.length; 2356 for (var i = 0; i < len; i += 1) { 2357 _this.writeByte(b[i + off]); 2358 } 2359 }; 2360 2361 _this.writeString = function(s) { 2362 for (var i = 0; i < s.length; i += 1) { 2363 _this.writeByte(s.charCodeAt(i) ); 2364 } 2365 }; 2366 2367 _this.toByteArray = function() { 2368 return _bytes; 2369 }; 2370 2371 _this.toString = function() { 2372 var s = ''; 2373 s += '['; 2374 for (var i = 0; i < _bytes.length; i += 1) { 2375 if (i > 0) { 2376 s += ','; 2377 } 2378 s += _bytes[i]; 2379 } 2380 s += ']'; 2381 return s; 2382 }; 2383 2384 return _this; 2385 }; 2386 2387 //--------------------------------------------------------------------- 2388 // base64EncodeOutputStream 2389 //--------------------------------------------------------------------- 2390 2391 var base64EncodeOutputStream = function() { 2392 2393 var _buffer = 0; 2394 var _buflen = 0; 2395 var _length = 0; 2396 var _base64 = ''; 2397 2398 var _this = {}; 2399 2400 var writeEncoded = function(b) { 2401 _base64 += String.fromCharCode(encode(b & 0x3f) ); 2402 }; 2403 2404 var encode = function(n) { 2405 if (n < 0) { 2406 // error. 2407 } else if (n < 26) { 2408 return 0x41 + n; 2409 } else if (n < 52) { 2410 return 0x61 + (n - 26); 2411 } else if (n < 62) { 2412 return 0x30 + (n - 52); 2413 } else if (n == 62) { 2414 return 0x2b; 2415 } else if (n == 63) { 2416 return 0x2f; 2417 } 2418 throw 'n:' + n; 2419 }; 2420 2421 _this.writeByte = function(n) { 2422 2423 _buffer = (_buffer << 8) | (n & 0xff); 2424 _buflen += 8; 2425 _length += 1; 2426 2427 while (_buflen >= 6) { 2428 writeEncoded(_buffer >>> (_buflen - 6) ); 2429 _buflen -= 6; 2430 } 2431 }; 2432 2433 _this.flush = function() { 2434 2435 if (_buflen > 0) { 2436 writeEncoded(_buffer << (6 - _buflen) ); 2437 _buffer = 0; 2438 _buflen = 0; 2439 } 2440 2441 if (_length % 3 != 0) { 2442 // padding 2443 var padlen = 3 - _length % 3; 2444 for (var i = 0; i < padlen; i += 1) { 2445 _base64 += '='; 2446 } 2447 } 2448 }; 2449 2450 _this.toString = function() { 2451 return _base64; 2452 }; 2453 2454 return _this; 2455 }; 2456 2457 //--------------------------------------------------------------------- 2458 // base64DecodeInputStream 2459 //--------------------------------------------------------------------- 2460 2461 var base64DecodeInputStream = function(str) { 2462 2463 var _str = str; 2464 var _pos = 0; 2465 var _buffer = 0; 2466 var _buflen = 0; 2467 2468 var _this = {}; 2469 2470 _this.read = function() { 2471 2472 while (_buflen < 8) { 2473 2474 if (_pos >= _str.length) { 2475 if (_buflen == 0) { 2476 return -1; 2477 } 2478 throw 'unexpected end of file./' + _buflen; 2479 } 2480 2481 var c = _str.charAt(_pos); 2482 _pos += 1; 2483 2484 if (c == '=') { 2485 _buflen = 0; 2486 return -1; 2487 } else if (c.match(/^\s$/) ) { 2488 // ignore if whitespace. 2489 continue; 2490 } 2491 2492 _buffer = (_buffer << 6) | decode(c.charCodeAt(0) ); 2493 _buflen += 6; 2494 } 2495 2496 var n = (_buffer >>> (_buflen - 8) ) & 0xff; 2497 _buflen -= 8; 2498 return n; 2499 }; 2500 2501 var decode = function(c) { 2502 if (0x41 <= c && c <= 0x5a) { 2503 return c - 0x41; 2504 } else if (0x61 <= c && c <= 0x7a) { 2505 return c - 0x61 + 26; 2506 } else if (0x30 <= c && c <= 0x39) { 2507 return c - 0x30 + 52; 2508 } else if (c == 0x2b) { 2509 return 62; 2510 } else if (c == 0x2f) { 2511 return 63; 2512 } else { 2513 throw 'c:' + c; 2514 } 2515 }; 2516 2517 return _this; 2518 }; 2519 2520 //--------------------------------------------------------------------- 2521 // gifImage (B/W) 2522 //--------------------------------------------------------------------- 2523 2524 var gifImage = function(width, height) { 2525 2526 var _width = width; 2527 var _height = height; 2528 var _data = new Array(width * height); 2529 2530 var _this = {}; 2531 2532 _this.setPixel = function(x, y, pixel) { 2533 _data[y * _width + x] = pixel; 2534 }; 2535 2536 _this.write = function(out) { 2537 2538 //--------------------------------- 2539 // GIF Signature 2540 2541 out.writeString('GIF87a'); 2542 2543 //--------------------------------- 2544 // Screen Descriptor 2545 2546 out.writeShort(_width); 2547 out.writeShort(_height); 2548 2549 out.writeByte(0x80); // 2bit 2550 out.writeByte(0); 2551 out.writeByte(0); 2552 2553 //--------------------------------- 2554 // Global Color Map 2555 2556 // black 2557 out.writeByte(0x00); 2558 out.writeByte(0x00); 2559 out.writeByte(0x00); 2560 2561 // white 2562 out.writeByte(0xff); 2563 out.writeByte(0xff); 2564 out.writeByte(0xff); 2565 2566 //--------------------------------- 2567 // Image Descriptor 2568 2569 out.writeString(','); 2570 out.writeShort(0); 2571 out.writeShort(0); 2572 out.writeShort(_width); 2573 out.writeShort(_height); 2574 out.writeByte(0); 2575 2576 //--------------------------------- 2577 // Local Color Map 2578 2579 //--------------------------------- 2580 // Raster Data 2581 2582 var lzwMinCodeSize = 2; 2583 var raster = getLZWRaster(lzwMinCodeSize); 2584 2585 out.writeByte(lzwMinCodeSize); 2586 2587 var offset = 0; 2588 2589 while (raster.length - offset > 255) { 2590 out.writeByte(255); 2591 out.writeBytes(raster, offset, 255); 2592 offset += 255; 2593 } 2594 2595 out.writeByte(raster.length - offset); 2596 out.writeBytes(raster, offset, raster.length - offset); 2597 out.writeByte(0x00); 2598 2599 //--------------------------------- 2600 // GIF Terminator 2601 out.writeString(';'); 2602 }; 2603 2604 var bitOutputStream = function(out) { 2605 2606 var _out = out; 2607 var _bitLength = 0; 2608 var _bitBuffer = 0; 2609 2610 var _this = {}; 2611 2612 _this.write = function(data, length) { 2613 2614 if ( (data >>> length) != 0) { 2615 throw 'length over'; 2616 } 2617 2618 while (_bitLength + length >= 8) { 2619 _out.writeByte(0xff & ( (data << _bitLength) | _bitBuffer) ); 2620 length -= (8 - _bitLength); 2621 data >>>= (8 - _bitLength); 2622 _bitBuffer = 0; 2623 _bitLength = 0; 2624 } 2625 2626 _bitBuffer = (data << _bitLength) | _bitBuffer; 2627 _bitLength = _bitLength + length; 2628 }; 2629 2630 _this.flush = function() { 2631 if (_bitLength > 0) { 2632 _out.writeByte(_bitBuffer); 2633 } 2634 }; 2635 2636 return _this; 2637 }; 2638 2639 var getLZWRaster = function(lzwMinCodeSize) { 2640 2641 var clearCode = 1 << lzwMinCodeSize; 2642 var endCode = (1 << lzwMinCodeSize) + 1; 2643 var bitLength = lzwMinCodeSize + 1; 2644 2645 // Setup LZWTable 2646 var table = lzwTable(); 2647 2648 for (var i = 0; i < clearCode; i += 1) { 2649 table.add(String.fromCharCode(i) ); 2650 } 2651 table.add(String.fromCharCode(clearCode) ); 2652 table.add(String.fromCharCode(endCode) ); 2653 2654 var byteOut = byteArrayOutputStream(); 2655 var bitOut = bitOutputStream(byteOut); 2656 2657 // clear code 2658 bitOut.write(clearCode, bitLength); 2659 2660 var dataIndex = 0; 2661 2662 var s = String.fromCharCode(_data[dataIndex]); 2663 dataIndex += 1; 2664 2665 while (dataIndex < _data.length) { 2666 2667 var c = String.fromCharCode(_data[dataIndex]); 2668 dataIndex += 1; 2669 2670 if (table.contains(s + c) ) { 2671 2672 s = s + c; 2673 2674 } else { 2675 2676 bitOut.write(table.indexOf(s), bitLength); 2677 2678 if (table.size() < 0xfff) { 2679 2680 if (table.size() == (1 << bitLength) ) { 2681 bitLength += 1; 2682 } 2683 2684 table.add(s + c); 2685 } 2686 2687 s = c; 2688 } 2689 } 2690 2691 bitOut.write(table.indexOf(s), bitLength); 2692 2693 // end code 2694 bitOut.write(endCode, bitLength); 2695 2696 bitOut.flush(); 2697 2698 return byteOut.toByteArray(); 2699 }; 2700 2701 var lzwTable = function() { 2702 2703 var _map = {}; 2704 var _size = 0; 2705 2706 var _this = {}; 2707 2708 _this.add = function(key) { 2709 if (_this.contains(key) ) { 2710 throw 'dup key:' + key; 2711 } 2712 _map[key] = _size; 2713 _size += 1; 2714 }; 2715 2716 _this.size = function() { 2717 return _size; 2718 }; 2719 2720 _this.indexOf = function(key) { 2721 return _map[key]; 2722 }; 2723 2724 _this.contains = function(key) { 2725 return typeof _map[key] != 'undefined'; 2726 }; 2727 2728 return _this; 2729 }; 2730 2731 return _this; 2732 }; 2733 2734 var createDataURL = function(width, height, getPixel) { 2735 var gif = gifImage(width, height); 2736 for (var y = 0; y < height; y += 1) { 2737 for (var x = 0; x < width; x += 1) { 2738 gif.setPixel(x, y, getPixel(x, y) ); 2739 } 2740 } 2741 2742 var b = byteArrayOutputStream(); 2743 gif.write(b); 2744 2745 var base64 = base64EncodeOutputStream(); 2746 var bytes = b.toByteArray(); 2747 for (var i = 0; i < bytes.length; i += 1) { 2748 base64.writeByte(bytes[i]); 2749 } 2750 base64.flush(); 2751 2752 return 'data:image/gif;base64,' + base64; 2753 }; 2754 2755 //--------------------------------------------------------------------- 2756 // returns qrcode function. 2757 2758 return qrcode; 2759}(); 2760 2761// multibyte support 2762!function() { 2763 2764 qrcode.stringToBytesFuncs['UTF-8'] = function(s) { 2765 // http://stackoverflow.com/questions/18729405/how-to-convert-utf8-string-to-byte-array 2766 function toUTF8Array(str) { 2767 var utf8 = []; 2768 for (var i=0; i < str.length; i++) { 2769 var charcode = str.charCodeAt(i); 2770 if (charcode < 0x80) utf8.push(charcode); 2771 else if (charcode < 0x800) { 2772 utf8.push(0xc0 | (charcode >> 6), 2773 0x80 | (charcode & 0x3f)); 2774 } 2775 else if (charcode < 0xd800 || charcode >= 0xe000) { 2776 utf8.push(0xe0 | (charcode >> 12), 2777 0x80 | ((charcode>>6) & 0x3f), 2778 0x80 | (charcode & 0x3f)); 2779 } 2780 // surrogate pair 2781 else { 2782 i++; 2783 // UTF-16 encodes 0x10000-0x10FFFF by 2784 // subtracting 0x10000 and splitting the 2785 // 20 bits of 0x0-0xFFFFF into two halves 2786 charcode = 0x10000 + (((charcode & 0x3ff)<<10) 2787 | (str.charCodeAt(i) & 0x3ff)); 2788 utf8.push(0xf0 | (charcode >>18), 2789 0x80 | ((charcode>>12) & 0x3f), 2790 0x80 | ((charcode>>6) & 0x3f), 2791 0x80 | (charcode & 0x3f)); 2792 } 2793 } 2794 return utf8; 2795 } 2796 return toUTF8Array(s); 2797 }; 2798 2799}(); 2800 2801(function (factory) { 2802 if (true) { 2803 !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory), 2804 __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? 2805 (__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__), 2806 __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); 2807 } else {} 2808}(function () { 2809 return qrcode; 2810})); 2811 2812 2813/***/ }) 2814/******/ ]); 2815});
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.