qrcode.js 57 KB

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