Built files from Bizgaze WebServer
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

qrcode.js 55KB

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