diff --git a/packages/common/src/qrcode.ts b/packages/common/src/qrcode.ts
index ac816743..d27fa82f 100644
--- a/packages/common/src/qrcode.ts
+++ b/packages/common/src/qrcode.ts
@@ -1,72 +1,53 @@
//---------------------------------------------------------------------
-// QRCode for JavaScript
+//
+// QR Code Generator for JavaScript
//
// Copyright (c) 2009 Kazuhiko Arase
//
// URL: http://www.d-project.com/
//
// Licensed under the MIT license:
-// http://www.opensource.org/licenses/mit-license.php
+// http://www.opensource.org/licenses/mit-license.php
//
-// The word "QR Code" is registered trademark of
+// The word 'QR Code' is registered trademark of
// DENSO WAVE INCORPORATED
-// http://www.denso-wave.com/qrcode/faqpatent-e.html
+// http://www.denso-wave.com/qrcode/faqpatent-e.html
//
//---------------------------------------------------------------------
-//---------------------------------------------------------------------
-// QR8bitByte
-//---------------------------------------------------------------------
-
-class QR8bitByte {
- mode: number
- data: any
- constructor(data) {
- this.mode = QRMode.MODE_8BIT_BYTE
- this.data = data
- }
- getLength(buffer) {
- return this.data.length
- }
- write(buffer) {
- for (var i = 0; i < this.data.length; i++) {
- // not JIS ...
- buffer.put(this.data.charCodeAt(i), 8)
- }
- }
-}
-
//---------------------------------------------------------------------
// QRCode
//---------------------------------------------------------------------
-
export class QRCode {
- static PAD0 = 0xEC
- static PAD1 = 0x11
- typeNumber: any
- errorCorrectLevel: any
- modules: any
- moduleCount: number
- dataCache: any
- dataList: any[]
- constructor(typeNumber, errorCorrectLevel: QRErrorCorrectLevel) {
- this.typeNumber = typeNumber
- this.errorCorrectLevel = errorCorrectLevel
- this.modules = null
- this.moduleCount = 0
- this.dataCache = null
- this.dataList = new Array()
- }
- static createData(typeNumber, errorCorrectLevel, dataList) {
+ public static PAD0 = 0xEC
+ public static PAD1 = 0x11
- var rsBlocks = QRRSBlock.getRSBlocks(typeNumber, errorCorrectLevel)
+ private _typeNumber = 1
+ private _errorCorrectionLevel = QRErrorCorrectionLevel.L
+ private _modules = null
+ private _moduleCount = 0
+ private _dataCache = null
+ private _dataList = []
+
+ /**
+ * @param typeNumber 1 to 40
+ * @param errorCorrectionLevel 'L','M','Q','H'
+ */
+ constructor(typeNumber: number, errorCorrectionLevel: QRErrorCorrectionLevel) {
+ this._typeNumber = typeNumber
+ this._errorCorrectionLevel = errorCorrectionLevel
+ }
+
+ static createData(typeNumber: number, errorCorrectionLevel: QRErrorCorrectionLevel, dataList: any[]) {
+
+ var rsBlocks = QRRSBlock.getRSBlocks(typeNumber, errorCorrectionLevel)
var buffer = new QRBitBuffer()
for (var i = 0; i < dataList.length; i++) {
var data = dataList[i]
- buffer.put(data.mode, 4)
- buffer.put(data.getLength(), QRUtil.getLengthInBits(data.mode, typeNumber))
+ buffer.put(data.getMode(), 4)
+ buffer.put(data.getLength(), QRUtil.getLengthInBits(data.getMode(), typeNumber))
data.write(buffer)
}
@@ -77,11 +58,11 @@ export class QRCode {
}
if (buffer.getLengthInBits() > totalDataCount * 8) {
- throw new Error("code length overflow. ("
- + buffer.getLengthInBits()
- + ">"
- + totalDataCount * 8
- + ")")
+ throw 'code length overflow. ('
+ + buffer.getLengthInBits()
+ + '>'
+ + totalDataCount * 8
+ + ')'
}
// end code
@@ -110,7 +91,7 @@ export class QRCode {
return QRCode.createBytes(buffer, rsBlocks)
}
- static createBytes(buffer, rsBlocks) {
+ static createBytes(buffer: QRBitBuffer, rsBlocks: any[]) {
var offset = 0
@@ -131,7 +112,7 @@ export class QRCode {
dcdata[r] = new Array(dcCount)
for (var i = 0; i < dcdata[r].length; i++) {
- dcdata[r][i] = 0xff & buffer.buffer[i + offset]
+ dcdata[r][i] = 0xff & buffer.getBuffer()[i + offset]
}
offset += dcCount
@@ -142,9 +123,8 @@ export class QRCode {
ecdata[r] = new Array(rsPoly.getLength() - 1)
for (var i = 0; i < ecdata[r].length; i++) {
var modIndex = i + modPoly.getLength() - ecdata[r].length
- ecdata[r][i] = (modIndex >= 0) ? modPoly.get(modIndex) : 0
+ ecdata[r][i] = (modIndex >= 0) ? modPoly.getAt(modIndex) : 0
}
-
}
var totalCodeCount = 0
@@ -158,7 +138,8 @@ export class QRCode {
for (var i = 0; i < maxDcCount; i++) {
for (var r = 0; r < rsBlocks.length; r++) {
if (i < dcdata[r].length) {
- data[index++] = dcdata[r][i]
+ data[index] = dcdata[r][i]
+ index++
}
}
}
@@ -166,106 +147,65 @@ export class QRCode {
for (var i = 0; i < maxEcCount; i++) {
for (var r = 0; r < rsBlocks.length; r++) {
if (i < ecdata[r].length) {
- data[index++] = ecdata[r][i]
+ data[index] = ecdata[r][i]
+ index++
}
}
}
return data
-
- }
- addData(data) {
- var newData = new QR8bitByte(data)
- this.dataList.push(newData)
- this.dataCache = null
}
- isDark(row, col) {
- if (row < 0 || this.moduleCount <= row || col < 0 || this.moduleCount <= col) {
- throw new Error(row + "," + col)
- }
- return this.modules[row][col]
- }
+ makeImpl(test: boolean, maskPattern: number) {
- getModuleCount() {
- return this.moduleCount
- }
-
- make() {
- // Calculate automatically typeNumber if provided is < 1
- if (this.typeNumber < 1) {
- var typeNumber = 1
- for (typeNumber = 1; typeNumber < 40; typeNumber++) {
- var rsBlocks = QRRSBlock.getRSBlocks(typeNumber, this.errorCorrectLevel)
-
- var buffer = new QRBitBuffer()
- var totalDataCount = 0
- for (var i = 0; i < rsBlocks.length; i++) {
- totalDataCount += rsBlocks[i].dataCount
+ this._moduleCount = this._typeNumber * 4 + 17
+ this._modules = function (moduleCount) {
+ var modules = new Array(moduleCount)
+ for (var row = 0; row < moduleCount; row++) {
+ modules[row] = new Array(moduleCount)
+ for (var col = 0; col < moduleCount; col++) {
+ modules[row][col] = null
}
-
- for (var i = 0; i < this.dataList.length; i++) {
- var data = this.dataList[i]
- buffer.put(data.mode, 4)
- buffer.put(data.getLength(), QRUtil.getLengthInBits(data.mode, typeNumber))
- data.write(buffer)
- }
- if (buffer.getLengthInBits() <= totalDataCount * 8)
- break
}
- this.typeNumber = typeNumber
- }
- this.makeImpl(false, this.getBestMaskPattern())
- }
-
- makeImpl(test, maskPattern) {
-
- this.moduleCount = this.typeNumber * 4 + 17
- this.modules = new Array(this.moduleCount)
-
- for (var row = 0; row < this.moduleCount; row++) {
-
- this.modules[row] = new Array(this.moduleCount)
-
- for (var col = 0; col < this.moduleCount; col++) {
- this.modules[row][col] = null//(col + row) % 3;
- }
- }
+ return modules
+ }(this._moduleCount)
this.setupPositionProbePattern(0, 0)
- this.setupPositionProbePattern(this.moduleCount - 7, 0)
- this.setupPositionProbePattern(0, this.moduleCount - 7)
+ this.setupPositionProbePattern(this._moduleCount - 7, 0)
+ this.setupPositionProbePattern(0, this._moduleCount - 7)
this.setupPositionAdjustPattern()
this.setupTimingPattern()
this.setupTypeInfo(test, maskPattern)
- if (this.typeNumber >= 7) {
+ if (this._typeNumber >= 7) {
this.setupTypeNumber(test)
}
- if (this.dataCache == null) {
- this.dataCache = QRCode.createData(this.typeNumber, this.errorCorrectLevel, this.dataList)
+ if (this._dataCache == null) {
+ this._dataCache = QRCode.createData(this._typeNumber, this._errorCorrectionLevel, this._dataList)
}
- this.mapData(this.dataCache, maskPattern)
+ this.mapData(this._dataCache, maskPattern)
}
- setupPositionProbePattern(row, col) {
+ setupPositionProbePattern(row: number, col: number) {
for (var r = -1; r <= 7; r++) {
- if (row + r <= -1 || this.moduleCount <= row + r) continue
+ if (row + r <= -1 || this._moduleCount <= row + r)
+ continue
for (var c = -1; c <= 7; c++) {
- if (col + c <= -1 || this.moduleCount <= col + c) continue
+ if (col + c <= -1 || this._moduleCount <= col + c)
+ continue
if ((0 <= r && r <= 6 && (c == 0 || c == 6))
|| (0 <= c && c <= 6 && (r == 0 || r == 6))
|| (2 <= r && r <= 4 && 2 <= c && c <= 4)) {
- this.modules[row + r][col + c] = true
+ this._modules[row + r][col + c] = true
} else {
- this.modules[row + r][col + c] = false
+ this._modules[row + r][col + c] = false
}
}
}
@@ -291,56 +231,26 @@ export class QRCode {
return pattern
}
- createMovieClip(target_mc, instance_name, depth) {
-
- var qr_mc = target_mc.createEmptyMovieClip(instance_name, depth)
- var cs = 1
-
- this.make()
-
- for (var row = 0; row < this.modules.length; row++) {
-
- var y = row * cs
-
- for (var col = 0; col < this.modules[row].length; col++) {
-
- var x = col * cs
- var dark = this.modules[row][col]
-
- if (dark) {
- qr_mc.beginFill(0, 100)
- qr_mc.moveTo(x, y)
- qr_mc.lineTo(x + cs, y)
- qr_mc.lineTo(x + cs, y + cs)
- qr_mc.lineTo(x, y + cs)
- qr_mc.endFill()
- }
- }
- }
-
- return qr_mc
- }
-
setupTimingPattern() {
- for (var r = 8; r < this.moduleCount - 8; r++) {
- if (this.modules[r][6] != null) {
+ for (var r = 8; r < this._moduleCount - 8; r++) {
+ if (this._modules[r][6] != null) {
continue
}
- this.modules[r][6] = (r % 2 == 0)
+ this._modules[r][6] = (r % 2 == 0)
}
- for (var c = 8; c < this.moduleCount - 8; c++) {
- if (this.modules[6][c] != null) {
+ for (var c = 8; c < this._moduleCount - 8; c++) {
+ if (this._modules[6][c] != null) {
continue
}
- this.modules[6][c] = (c % 2 == 0)
+ this._modules[6][c] = (c % 2 == 0)
}
}
setupPositionAdjustPattern() {
- var pos = QRUtil.getPatternPosition(this.typeNumber)
+ var pos = QRUtil.getPatternPosition(this._typeNumber)
for (var i = 0; i < pos.length; i++) {
@@ -349,7 +259,7 @@ export class QRCode {
var row = pos[i]
var col = pos[j]
- if (this.modules[row][col] != null) {
+ if (this._modules[row][col] != null) {
continue
}
@@ -359,9 +269,10 @@ export class QRCode {
if (r == -2 || r == 2 || c == -2 || c == 2
|| (r == 0 && c == 0)) {
- this.modules[row + r][col + c] = true
- } else {
- this.modules[row + r][col + c] = false
+ this._modules[row + r][col + c] = true
+ }
+ else {
+ this._modules[row + r][col + c] = false
}
}
}
@@ -369,37 +280,39 @@ export class QRCode {
}
}
- setupTypeNumber(test) {
+ setupTypeNumber(test: any) {
- var bits = QRUtil.getBCHTypeNumber(this.typeNumber)
+ var bits = QRUtil.getBCHTypeNumber(this._typeNumber)
for (var i = 0; i < 18; i++) {
var mod = (!test && ((bits >> i) & 1) == 1)
- this.modules[Math.floor(i / 3)][i % 3 + this.moduleCount - 8 - 3] = mod
+ this._modules[Math.floor(i / 3)][i % 3 + this._moduleCount - 8 - 3] = mod
}
for (var i = 0; i < 18; i++) {
var mod = (!test && ((bits >> i) & 1) == 1)
- this.modules[i % 3 + this.moduleCount - 8 - 3][Math.floor(i / 3)] = mod
+ this._modules[i % 3 + this._moduleCount - 8 - 3][Math.floor(i / 3)] = mod
}
}
- setupTypeInfo(test, maskPattern) {
+ setupTypeInfo(test: any, maskPattern: number) {
- var data = (this.errorCorrectLevel << 3) | maskPattern
+ var data = (this._errorCorrectionLevel << 3) | maskPattern
var bits = QRUtil.getBCHTypeInfo(data)
- // vertical
+ // vertical
for (var i = 0; i < 15; i++) {
var mod = (!test && ((bits >> i) & 1) == 1)
if (i < 6) {
- this.modules[i][8] = mod
- } else if (i < 8) {
- this.modules[i + 1][8] = mod
- } else {
- this.modules[this.moduleCount - 15 + i][8] = mod
+ this._modules[i][8] = mod
+ }
+ else if (i < 8) {
+ this._modules[i + 1][8] = mod
+ }
+ else {
+ this._modules[this._moduleCount - 15 + i][8] = mod
}
}
@@ -409,35 +322,38 @@ export class QRCode {
var mod = (!test && ((bits >> i) & 1) == 1)
if (i < 8) {
- this.modules[8][this.moduleCount - i - 1] = mod
- } else if (i < 9) {
- this.modules[8][15 - i - 1 + 1] = mod
- } else {
- this.modules[8][15 - i - 1] = mod
+ this._modules[8][this._moduleCount - i - 1] = mod
+ }
+ else if (i < 9) {
+ this._modules[8][15 - i - 1 + 1] = mod
+ }
+ else {
+ this._modules[8][15 - i - 1] = mod
}
}
// fixed module
- this.modules[this.moduleCount - 8][8] = (!test)
-
+ this._modules[this._moduleCount - 8][8] = (!test)
}
- mapData(data, maskPattern) {
+ mapData(data: string | any[], maskPattern: any) {
var inc = -1
- var row = this.moduleCount - 1
+ var row = this._moduleCount - 1
var bitIndex = 7
var byteIndex = 0
+ var maskFunc = QRUtil.getMaskFunction(maskPattern)
- for (var col = this.moduleCount - 1; col > 0; col -= 2) {
+ for (var col = this._moduleCount - 1; col > 0; col -= 2) {
- if (col == 6) col--
+ if (col == 6)
+ col -= 1
while (true) {
for (var c = 0; c < 2; c++) {
- if (this.modules[row][col - c] == null) {
+ if (this._modules[row][col - c] == null) {
var dark = false
@@ -445,14 +361,14 @@ export class QRCode {
dark = (((data[byteIndex] >>> bitIndex) & 1) == 1)
}
- var mask = QRUtil.getMask(maskPattern, row, col - c)
+ var mask = maskFunc(row, col - c)
if (mask) {
dark = !dark
}
- this.modules[row][col - c] = dark
- bitIndex--
+ this._modules[row][col - c] = dark
+ bitIndex -= 1
if (bitIndex == -1) {
byteIndex++
@@ -463,37 +379,460 @@ export class QRCode {
row += inc
- if (row < 0 || this.moduleCount <= row) {
+ if (row < 0 || this._moduleCount <= row) {
row -= inc
inc = -inc
break
}
}
}
-
}
+
+ addData(data: any, mode: string) {
+
+ mode = mode || 'Byte'
+
+ var newData = null
+
+ switch (mode) {
+ // case 'Numeric':
+ // newData = qrNumber(data)
+ // break
+ // case 'Alphanumeric':
+ // newData = qrAlphaNum(data)
+ // break
+ case 'Byte':
+ newData = new qr8BitByte(data)
+ break
+ // case 'Kanji':
+ // newData = qrKanji(data)
+ // break
+ default:
+ throw 'mode:' + mode
+ }
+
+ this._dataList.push(newData)
+ this._dataCache = null
+ }
+
+ isDark(row: string | number, col: string | number) {
+ if (row < 0 || this._moduleCount <= row || col < 0 || this._moduleCount <= col) {
+ throw row + ',' + col
+ }
+ return this._modules[row][col]
+ }
+
+ getModuleCount() {
+ return this._moduleCount
+ }
+
+ make() {
+ if (this._typeNumber < 1) {
+ var typeNumber = 1
+
+ for (; typeNumber < 40; typeNumber++) {
+ var rsBlocks = QRRSBlock.getRSBlocks(typeNumber, this._errorCorrectionLevel)
+ var buffer = new QRBitBuffer()
+
+ for (var i = 0; i < this._dataList.length; i++) {
+ var data = this._dataList[i]
+ buffer.put(data.getMode(), 4)
+ buffer.put(data.getLength(), QRUtil.getLengthInBits(data.getMode(), typeNumber))
+ data.write(buffer)
+ }
+
+ var totalDataCount = 0
+ for (var i = 0; i < rsBlocks.length; i++) {
+ totalDataCount += rsBlocks[i].dataCount
+ }
+
+ if (buffer.getLengthInBits() <= totalDataCount * 8) {
+ break
+ }
+ }
+
+ this._typeNumber = typeNumber
+ }
+
+ this.makeImpl(false, this.getBestMaskPattern())
+ }
+
+ createTableTag(cellSize: number = 2, margin: number = cellSize * 4) {
+ var qrHtml = ''
+
+ qrHtml += '
'
+ qrHtml += ''
+
+ for (var r = 0; r < this.getModuleCount(); r++) {
+
+ qrHtml += ''
+
+ for (var c = 0; c < this.getModuleCount(); c++) {
+ qrHtml += ' | '
+ }
+
+ qrHtml += '
'
+ }
+
+ qrHtml += ''
+ qrHtml += '
'
+
+ return qrHtml
+ }
+
+ createSvgTag(cellSize: number = 2, margin: number = cellSize * 4, alt: any, title: any) {
+
+ var opts: any = {}
+ if (typeof arguments[0] == 'object') {
+ // Called by options.
+ opts = arguments[0]
+ // overwrite cellSize and margin.
+ cellSize = opts.cellSize
+ margin = opts.margin
+ alt = opts.alt
+ title = opts.title
+ }
+
+ // Compose alt property surrogate
+ alt = (typeof alt === 'string') ? { text: alt } : alt || {}
+ alt.text = alt.text || null
+ alt.id = (alt.text) ? alt.id || 'qrcode-description' : null
+
+ // Compose title property surrogate
+ title = (typeof title === 'string') ? { text: title } : title || {}
+ title.text = title.text || null
+ title.id = (title.text) ? title.id || 'qrcode-title' : null
+
+ var size = this.getModuleCount() * cellSize + margin * 2
+ var c: number, mc: number, r: number, mr: number, qrSvg = '', rect: string
+
+ rect = 'l' + cellSize + ',0 0,' + cellSize +
+ ' -' + cellSize + ',0 0,-' + cellSize + 'z '
+
+ qrSvg += ''
+
+ return qrSvg
+ }
+
+ // createDataURL(cellSize, margin) {
+
+ // cellSize = cellSize || 2
+ // margin = (typeof margin == 'undefined') ? cellSize * 4 : margin
+
+ // var size = this.getModuleCount() * cellSize + margin * 2
+ // var min = margin
+ // var max = size - margin
+
+ // return createDataURL(size, size, (x, y) => {
+ // if (min <= x && x < max && min <= y && y < max) {
+ // var c = Math.floor((x - min) / cellSize)
+ // var r = Math.floor((y - min) / cellSize)
+ // return this.isDark(r, c) ? 0 : 1
+ // } else {
+ // return 1
+ // }
+ // })
+ // }
+
+ // createImgTag(cellSize, margin, alt) {
+
+ // cellSize = cellSize || 2
+ // margin = (typeof margin == 'undefined') ? cellSize * 4 : margin
+
+ // var size = this.getModuleCount() * cellSize + margin * 2
+
+ // var img = ''
+ // img += ''
+
+ // return img
+ // }
+
+ escapeXml(s: string) {
+ var escaped = ''
+ for (var i = 0; i < s.length; i++) {
+ var c = s.charAt(i)
+ switch (c) {
+ case '<': escaped += '<'; break
+ case '>': escaped += '>'; break
+ case '&': escaped += '&'; break
+ case '"': escaped += '"'; break
+ default: escaped += c; break
+ }
+ }
+ return escaped
+ }
+
+ _createHalfASCII(margin: number) {
+ var cellSize = 1
+ margin = (typeof margin == 'undefined') ? cellSize * 2 : margin
+
+ var size = this.getModuleCount() * cellSize + margin * 2
+ var min = margin
+ var max = size - margin
+
+ var y: number, x: number, r1: number, r2: number, p: string
+
+ var blocks = {
+ '██': '█',
+ '█ ': '▀',
+ ' █': '▄',
+ ' ': ' '
+ }
+
+ var blocksLastLineNoMargin = {
+ '██': '▀',
+ '█ ': '▀',
+ ' █': ' ',
+ ' ': ' '
+ }
+
+ var ascii = ''
+ for (y = 0; y < size; y += 2) {
+ r1 = Math.floor((y - min) / cellSize)
+ r2 = Math.floor((y + 1 - min) / cellSize)
+ for (x = 0; x < size; x++) {
+ p = '█'
+
+ if (min <= x && x < max && min <= y && y < max && this.isDark(r1, Math.floor((x - min) / cellSize))) {
+ p = ' '
+ }
+
+ if (min <= x && x < max && min <= y + 1 && y + 1 < max && this.isDark(r2, Math.floor((x - min) / cellSize))) {
+ p += ' '
+ }
+ else {
+ p += '█'
+ }
+
+ // Output 2 characters per pixel, to create full square. 1 character per pixels gives only half width of square.
+ ascii += (margin < 1 && y + 1 >= max) ? blocksLastLineNoMargin[p] : blocks[p]
+ }
+
+ ascii += '\n'
+ }
+
+ if (size % 2 && margin > 0) {
+ return ascii.substring(0, ascii.length - size - 1) + Array(size + 1).join('▀')
+ }
+
+ return ascii.substring(0, ascii.length - 1)
+ }
+
+ createASCII(cellSize: number, margin: number) {
+ cellSize = cellSize || 1
+
+ if (cellSize < 2) {
+ return this._createHalfASCII(margin)
+ }
+
+ cellSize -= 1
+ margin = (typeof margin == 'undefined') ? cellSize * 2 : margin
+
+ var size = this.getModuleCount() * cellSize + margin * 2
+ var min = margin
+ var max = size - margin
+
+ var y: number, x: number, r: number, p: number
+
+ var white = Array(cellSize + 1).join('██')
+ var black = Array(cellSize + 1).join(' ')
+
+ var ascii = ''
+ var line = ''
+ for (y = 0; y < size; y++) {
+ r = Math.floor((y - min) / cellSize)
+ line = ''
+ for (x = 0; x < size; x++) {
+ p = 1
+
+ if (min <= x && x < max && min <= y && y < max && this.isDark(r, Math.floor((x - min) / cellSize))) {
+ p = 0
+ }
+
+ // Output 2 characters per pixel, to create full square. 1 character per pixels gives only half width of square.
+ line += p ? white : black
+ }
+
+ for (r = 0; r < cellSize; r++) {
+ ascii += line + '\n'
+ }
+ }
+
+ return ascii.substring(0, ascii.length - 1)
+ }
+
+ renderTo2dContext(context: { fillStyle: string; fillRect: (arg0: number, arg1: number, arg2: any, arg3: any) => void }, cellSize: number) {
+ cellSize = cellSize || 2
+ var length = this.getModuleCount()
+ for (var row = 0; row < length; row++) {
+ for (var col = 0; col < length; col++) {
+ context.fillStyle = this.isDark(row, col) ? 'black' : 'white'
+ context.fillRect(row * cellSize, col * cellSize, cellSize, cellSize)
+ }
+ }
+ }
+
+ // //---------------------------------------------------------------------
+ // // qrcode.createStringToBytes
+ // //---------------------------------------------------------------------
+ // /**
+ // * @param unicodeData base64 string of byte array.
+ // * [16bit Unicode],[16bit Bytes], ...
+ // * @param numChars
+ // */
+ // static createStringToBytes(unicodeData, numChars) {
+ // // create conversion map.
+
+ // var unicodeMap = function () {
+
+ // var bin = base64DecodeInputStream(unicodeData)
+ // var read = function () {
+ // var b = bin.read()
+ // if (b == -1)
+ // throw 'eof'
+ // return b
+ // }
+
+ // var count = 0
+ // var unicodeMap = {}
+ // while (true) {
+ // var b0 = bin.read()
+ // if (b0 == -1)
+ // break
+ // var b1 = read()
+ // var b2 = read()
+ // var b3 = read()
+ // var k = String.fromCharCode((b0 << 8) | b1)
+ // var v = (b2 << 8) | b3
+ // unicodeMap[k] = v
+ // count++
+ // }
+ // if (count != numChars) {
+ // throw count + ' != ' + numChars
+ // }
+
+ // return unicodeMap
+ // }()
+
+ // var unknownChar = '?'.charCodeAt(0)
+
+ // return function (s) {
+ // var bytes = []
+ // for (var i = 0; i < s.length; i++) {
+ // var c = s.charCodeAt(i)
+ // if (c < 128) {
+ // bytes.push(c)
+ // }
+ // else {
+ // var b = unicodeMap[s.charAt(i)]
+ // if (typeof b == 'number') {
+ // if ((b & 0xff) == b) {
+ // // 1byte
+ // bytes.push(b)
+ // }
+ // else {
+ // // 2bytes
+ // bytes.push(b >>> 8)
+ // bytes.push(b & 0xff)
+ // }
+ // }
+ // else {
+ // bytes.push(unknownChar)
+ // }
+ // }
+ // }
+ // return bytes
+ // }
+ // }
+
+ // //---------------------------------------------------------------------
+ // // qrcode.stringToBytes
+ // //---------------------------------------------------------------------
+
+ // static stringToBytesFuncs = {
+ // 'default': function (s) {
+ // var bytes = []
+ // for (var i = 0; i < s.length; i++) {
+ // var c = s.charCodeAt(i)
+ // bytes.push(c & 0xff)
+ // }
+ // return bytes
+ // }
+ // }
+ // static stringToBytes = QRCode.stringToBytesFuncs['default']
}
-
-
//---------------------------------------------------------------------
// QRMode
//---------------------------------------------------------------------
-export enum QRMode {
- MODE_NUMBER = 1 << 0,
- MODE_ALPHA_NUM = 1 << 1,
- MODE_8BIT_BYTE = 1 << 2,
- MODE_KANJI = 1 << 3
+var QRMode = {
+ MODE_NUMBER: 1 << 0,
+ MODE_ALPHA_NUM: 1 << 1,
+ MODE_8BIT_BYTE: 1 << 2,
+ MODE_KANJI: 1 << 3
}
//---------------------------------------------------------------------
-// QRErrorCorrectLevel
+// QRErrorCorrectionLevel
//---------------------------------------------------------------------
-export enum QRErrorCorrectLevel {
+export enum QRErrorCorrectionLevel {
L = 1,
M = 0,
Q = 3,
@@ -519,9 +858,9 @@ export enum QRMaskPattern {
// QRUtil
//---------------------------------------------------------------------
-export const QRUtil = {
+export class QRUtil {
- PATTERN_POSITION_TABLE: [
+ static PATTERN_POSITION_TABLE = [
[],
[6, 18],
[6, 22],
@@ -562,74 +901,74 @@ export const QRUtil = {
[6, 32, 58, 84, 110, 136, 162],
[6, 26, 54, 82, 110, 138, 166],
[6, 30, 58, 86, 114, 142, 170]
- ],
+ ]
+ static G15 = (1 << 10) | (1 << 8) | (1 << 5) | (1 << 4) | (1 << 2) | (1 << 1) | (1 << 0)
+ static G18 = (1 << 12) | (1 << 11) | (1 << 10) | (1 << 9) | (1 << 8) | (1 << 5) | (1 << 2) | (1 << 0)
+ static G15_MASK = (1 << 14) | (1 << 12) | (1 << 10) | (1 << 4) | (1 << 1)
- G15: (1 << 10) | (1 << 8) | (1 << 5) | (1 << 4) | (1 << 2) | (1 << 1) | (1 << 0),
- G18: (1 << 12) | (1 << 11) | (1 << 10) | (1 << 9) | (1 << 8) | (1 << 5) | (1 << 2) | (1 << 0),
- G15_MASK: (1 << 14) | (1 << 12) | (1 << 10) | (1 << 4) | (1 << 1),
+ static getBCHDigit(data: number) {
+ var digit = 0
+ while (data != 0) {
+ digit++
+ data >>>= 1
+ }
+ return digit
+ }
- getBCHTypeInfo: function (data) {
+ static getBCHTypeInfo(data: number) {
var d = data << 10
while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15) >= 0) {
d ^= (QRUtil.G15 << (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15)))
}
return ((data << 10) | d) ^ QRUtil.G15_MASK
- },
+ }
- getBCHTypeNumber: function (data) {
+ static getBCHTypeNumber(data: number) {
var d = data << 12
while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18) >= 0) {
d ^= (QRUtil.G18 << (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18)))
}
return (data << 12) | d
- },
+ }
- getBCHDigit: function (data) {
-
- var digit = 0
-
- while (data != 0) {
- digit++
- data >>>= 1
- }
-
- return digit
- },
-
- getPatternPosition: function (typeNumber) {
+ static getPatternPosition(typeNumber: number) {
return QRUtil.PATTERN_POSITION_TABLE[typeNumber - 1]
- },
+ }
- getMask: function (maskPattern, i, j) {
+ static getMaskFunction(maskPattern: number) {
switch (maskPattern) {
-
- case QRMaskPattern.PATTERN000: return (i + j) % 2 == 0
- case QRMaskPattern.PATTERN001: return i % 2 == 0
- case QRMaskPattern.PATTERN010: return j % 3 == 0
- case QRMaskPattern.PATTERN011: return (i + j) % 3 == 0
- case QRMaskPattern.PATTERN100: return (Math.floor(i / 2) + Math.floor(j / 3)) % 2 == 0
- case QRMaskPattern.PATTERN101: return (i * j) % 2 + (i * j) % 3 == 0
- case QRMaskPattern.PATTERN110: return ((i * j) % 2 + (i * j) % 3) % 2 == 0
- case QRMaskPattern.PATTERN111: return ((i * j) % 3 + (i + j) % 2) % 2 == 0
+ case QRMaskPattern.PATTERN000:
+ return function (i: any, j: any) { return (i + j) % 2 == 0 }
+ case QRMaskPattern.PATTERN001:
+ return function (i: number, j: any) { return i % 2 == 0 }
+ case QRMaskPattern.PATTERN010:
+ return function (i: any, j: number) { return j % 3 == 0 }
+ case QRMaskPattern.PATTERN011:
+ return function (i: any, j: any) { return (i + j) % 3 == 0 }
+ case QRMaskPattern.PATTERN100:
+ return function (i: number, j: number) { return (Math.floor(i / 2) + Math.floor(j / 3)) % 2 == 0 }
+ case QRMaskPattern.PATTERN101:
+ return function (i: number, j: number) { return (i * j) % 2 + (i * j) % 3 == 0 }
+ case QRMaskPattern.PATTERN110:
+ return function (i: number, j: number) { return ((i * j) % 2 + (i * j) % 3) % 2 == 0 }
+ case QRMaskPattern.PATTERN111:
+ return function (i: number, j: number) { return ((i * j) % 3 + (i + j) % 2) % 2 == 0 }
default:
- throw new Error("bad maskPattern:" + maskPattern)
+ throw 'bad maskPattern:' + maskPattern
}
- },
-
- getErrorCorrectPolynomial: function (errorCorrectLength) {
+ }
+ static getErrorCorrectPolynomial(errorCorrectLength: number) {
var a = new QRPolynomial([1], 0)
-
for (var i = 0; i < errorCorrectLength; i++) {
a = a.multiply(new QRPolynomial([1, QRMath.gexp(i)], 0))
}
-
return a
- },
+ }
- getLengthInBits: function (mode, type) {
+ static getLengthInBits(mode: number, type: string | number) {
if (1 <= type && type < 10) {
@@ -641,7 +980,7 @@ export const QRUtil = {
case QRMode.MODE_8BIT_BYTE: return 8
case QRMode.MODE_KANJI: return 8
default:
- throw new Error("mode:" + mode)
+ throw 'mode:' + mode
}
} else if (type < 27) {
@@ -654,7 +993,7 @@ export const QRUtil = {
case QRMode.MODE_8BIT_BYTE: return 16
case QRMode.MODE_KANJI: return 10
default:
- throw new Error("mode:" + mode)
+ throw 'mode:' + mode
}
} else if (type < 41) {
@@ -667,28 +1006,27 @@ export const QRUtil = {
case QRMode.MODE_8BIT_BYTE: return 16
case QRMode.MODE_KANJI: return 12
default:
- throw new Error("mode:" + mode)
+ throw 'mode:' + mode
}
} else {
- throw new Error("type:" + type)
+ throw 'type:' + type
}
- },
+ }
- getLostPoint: function (qrCode) {
+ static getLostPoint(qrcode: QRCode) {
- var moduleCount = qrCode.getModuleCount()
+ var moduleCount = qrcode.getModuleCount()
var lostPoint = 0
// LEVEL1
for (var row = 0; row < moduleCount; row++) {
-
for (var col = 0; col < moduleCount; col++) {
var sameCount = 0
- var dark = qrCode.isDark(row, col)
+ var dark = qrcode.isDark(row, col)
for (var r = -1; r <= 1; r++) {
@@ -706,7 +1044,7 @@ export const QRUtil = {
continue
}
- if (dark == qrCode.isDark(row + r, col + c)) {
+ if (dark == qrcode.isDark(row + r, col + c)) {
sameCount++
}
}
@@ -716,17 +1054,17 @@ export const QRUtil = {
lostPoint += (3 + sameCount - 5)
}
}
- }
+ };
// LEVEL2
for (var row = 0; row < moduleCount - 1; row++) {
for (var col = 0; col < moduleCount - 1; col++) {
var count = 0
- if (qrCode.isDark(row, col)) count++
- if (qrCode.isDark(row + 1, col)) count++
- if (qrCode.isDark(row, col + 1)) count++
- if (qrCode.isDark(row + 1, col + 1)) count++
+ if (qrcode.isDark(row, col)) count++
+ if (qrcode.isDark(row + 1, col)) count++
+ if (qrcode.isDark(row, col + 1)) count++
+ if (qrcode.isDark(row + 1, col + 1)) count++
if (count == 0 || count == 4) {
lostPoint += 3
}
@@ -737,13 +1075,13 @@ export const QRUtil = {
for (var row = 0; row < moduleCount; row++) {
for (var col = 0; col < moduleCount - 6; col++) {
- if (qrCode.isDark(row, col)
- && !qrCode.isDark(row, col + 1)
- && qrCode.isDark(row, col + 2)
- && qrCode.isDark(row, col + 3)
- && qrCode.isDark(row, col + 4)
- && !qrCode.isDark(row, col + 5)
- && qrCode.isDark(row, col + 6)) {
+ if (qrcode.isDark(row, col)
+ && !qrcode.isDark(row, col + 1)
+ && qrcode.isDark(row, col + 2)
+ && qrcode.isDark(row, col + 3)
+ && qrcode.isDark(row, col + 4)
+ && !qrcode.isDark(row, col + 5)
+ && qrcode.isDark(row, col + 6)) {
lostPoint += 40
}
}
@@ -751,13 +1089,13 @@ export const QRUtil = {
for (var col = 0; col < moduleCount; col++) {
for (var row = 0; row < moduleCount - 6; row++) {
- if (qrCode.isDark(row, col)
- && !qrCode.isDark(row + 1, col)
- && qrCode.isDark(row + 2, col)
- && qrCode.isDark(row + 3, col)
- && qrCode.isDark(row + 4, col)
- && !qrCode.isDark(row + 5, col)
- && qrCode.isDark(row + 6, col)) {
+ if (qrcode.isDark(row, col)
+ && !qrcode.isDark(row + 1, col)
+ && qrcode.isDark(row + 2, col)
+ && qrcode.isDark(row + 3, col)
+ && qrcode.isDark(row + 4, col)
+ && !qrcode.isDark(row + 5, col)
+ && qrcode.isDark(row + 6, col)) {
lostPoint += 40
}
}
@@ -769,7 +1107,7 @@ export const QRUtil = {
for (var col = 0; col < moduleCount; col++) {
for (var row = 0; row < moduleCount; row++) {
- if (qrCode.isDark(row, col)) {
+ if (qrcode.isDark(row, col)) {
darkCount++
}
}
@@ -780,17 +1118,15 @@ export const QRUtil = {
return lostPoint
}
-
}
-
//---------------------------------------------------------------------
// QRMath
//---------------------------------------------------------------------
var QRMath = {
- glog: function (n) {
+ glog: function (n: string | number) {
if (n < 1) {
throw new Error("glog(" + n + ")")
@@ -799,7 +1135,7 @@ var QRMath = {
return QRMath.LOG_TABLE[n]
},
- gexp: function (n) {
+ gexp: function (n: number) {
while (n < 0) {
n += 255
@@ -832,96 +1168,361 @@ for (var i = 0; i < 255; i++) {
}
//---------------------------------------------------------------------
-// QRPolynomial
+// qrPolynomial
//---------------------------------------------------------------------
class QRPolynomial {
- num: any[]
- constructor(num, shift) {
-
- if (num.length == undefined) {
- throw new Error(num.length + "/" + shift)
+ _num: any[]
+ constructor(num: any[], shift: number) {
+ if (typeof num.length == 'undefined') {
+ throw num.length + '/' + shift
}
var offset = 0
-
while (offset < num.length && num[offset] == 0) {
offset++
}
-
- this.num = new Array(num.length - offset + shift)
+ this._num = new Array(num.length - offset + shift)
for (var i = 0; i < num.length - offset; i++) {
- this.num[i] = num[i + offset]
+ this._num[i] = num[i + offset]
}
}
- get(index) {
- return this.num[index]
+
+ getAt(index: number) {
+ return this._num[index]
}
getLength() {
- return this.num.length
+ return this._num.length
}
- multiply(e) {
-
+ multiply(e: QRPolynomial) {
var num = new Array(this.getLength() + e.getLength() - 1)
for (var i = 0; i < this.getLength(); i++) {
for (var j = 0; j < e.getLength(); j++) {
- num[i + j] ^= QRMath.gexp(QRMath.glog(this.get(i)) + QRMath.glog(e.get(j)))
+ num[i + j] ^= QRMath.gexp(QRMath.glog(this.getAt(i)) + QRMath.glog(e.getAt(j)))
}
}
-
return new QRPolynomial(num, 0)
}
- mod(e) {
+ mod(e: QRPolynomial) {
if (this.getLength() - e.getLength() < 0) {
return this
}
- var ratio = QRMath.glog(this.get(0)) - QRMath.glog(e.get(0))
+ var ratio = QRMath.glog(this.getAt(0)) - QRMath.glog(e.getAt(0))
var num = new Array(this.getLength())
-
for (var i = 0; i < this.getLength(); i++) {
- num[i] = this.get(i)
+ num[i] = this.getAt(i)
}
for (var i = 0; i < e.getLength(); i++) {
- num[i] ^= QRMath.gexp(QRMath.glog(e.get(i)) + ratio)
+ num[i] ^= QRMath.gexp(QRMath.glog(e.getAt(i)) + ratio)
}
// recursive call
return new QRPolynomial(num, 0).mod(e)
}
-}
+}
//---------------------------------------------------------------------
// QRRSBlock
//---------------------------------------------------------------------
class QRRSBlock {
+ static RS_BLOCK_TABLE = [
+
+ // L
+ // M
+ // Q
+ // H
+
+ // 1
+ [1, 26, 19],
+ [1, 26, 16],
+ [1, 26, 13],
+ [1, 26, 9],
+
+ // 2
+ [1, 44, 34],
+ [1, 44, 28],
+ [1, 44, 22],
+ [1, 44, 16],
+
+ // 3
+ [1, 70, 55],
+ [1, 70, 44],
+ [2, 35, 17],
+ [2, 35, 13],
+
+ // 4
+ // 4
+ // 4
+ [1, 100, 80],
+ [2, 50, 32],
+ [2, 50, 24],
+ [4, 25, 9],
+
+ // 5
+ [1, 134, 108],
+ [2, 67, 43],
+ [2, 33, 15, 2, 34, 16],
+ [2, 33, 11, 2, 34, 12],
+
+ // 6
+ [2, 86, 68],
+ [4, 43, 27],
+ [4, 43, 19],
+ [4, 43, 15],
+
+ // 7
+ // 7
+ // 7
+ [2, 98, 78],
+ [4, 49, 31],
+ [2, 32, 14, 4, 33, 15],
+ [4, 39, 13, 1, 40, 14],
+
+ // 8
+ [2, 121, 97],
+ [2, 60, 38, 2, 61, 39],
+ [4, 40, 18, 2, 41, 19],
+ [4, 40, 14, 2, 41, 15],
+
+ // 9
+ [2, 146, 116],
+ [3, 58, 36, 2, 59, 37],
+ [4, 36, 16, 4, 37, 17],
+ [4, 36, 12, 4, 37, 13],
+
+ // 10
+ // 10
+ // 10
+ [2, 86, 68, 2, 87, 69],
+ [4, 69, 43, 1, 70, 44],
+ [6, 43, 19, 2, 44, 20],
+ [6, 43, 15, 2, 44, 16],
+
+ // 11
+ [4, 101, 81],
+ [1, 80, 50, 4, 81, 51],
+ [4, 50, 22, 4, 51, 23],
+ [3, 36, 12, 8, 37, 13],
+
+ // 12
+ [2, 116, 92, 2, 117, 93],
+ [6, 58, 36, 2, 59, 37],
+ [4, 46, 20, 6, 47, 21],
+ [7, 42, 14, 4, 43, 15],
+
+ // 13
+ [4, 133, 107],
+ [8, 59, 37, 1, 60, 38],
+ [8, 44, 20, 4, 45, 21],
+ [12, 33, 11, 4, 34, 12],
+
+ // 14
+ [3, 145, 115, 1, 146, 116],
+ [4, 64, 40, 5, 65, 41],
+ [11, 36, 16, 5, 37, 17],
+ [11, 36, 12, 5, 37, 13],
+
+ // 15
+ [5, 109, 87, 1, 110, 88],
+ [5, 65, 41, 5, 66, 42],
+ [5, 54, 24, 7, 55, 25],
+ [11, 36, 12, 7, 37, 13],
+
+ // 16
+ [5, 122, 98, 1, 123, 99],
+ [7, 73, 45, 3, 74, 46],
+ [15, 43, 19, 2, 44, 20],
+ [3, 45, 15, 13, 46, 16],
+
+ // 17
+ [1, 135, 107, 5, 136, 108],
+ [10, 74, 46, 1, 75, 47],
+ [1, 50, 22, 15, 51, 23],
+ [2, 42, 14, 17, 43, 15],
+
+ // 18
+ [5, 150, 120, 1, 151, 121],
+ [9, 69, 43, 4, 70, 44],
+ [17, 50, 22, 1, 51, 23],
+ [2, 42, 14, 19, 43, 15],
+
+ // 19
+ [3, 141, 113, 4, 142, 114],
+ [3, 70, 44, 11, 71, 45],
+ [17, 47, 21, 4, 48, 22],
+ [9, 39, 13, 16, 40, 14],
+
+ // 20
+ [3, 135, 107, 5, 136, 108],
+ [3, 67, 41, 13, 68, 42],
+ [15, 54, 24, 5, 55, 25],
+ [15, 43, 15, 10, 44, 16],
+
+ // 21
+ [4, 144, 116, 4, 145, 117],
+ [17, 68, 42],
+ [17, 50, 22, 6, 51, 23],
+ [19, 46, 16, 6, 47, 17],
+
+ // 22
+ [2, 139, 111, 7, 140, 112],
+ [17, 74, 46],
+ [7, 54, 24, 16, 55, 25],
+ [34, 37, 13],
+
+ // 23
+ [4, 151, 121, 5, 152, 122],
+ [4, 75, 47, 14, 76, 48],
+ [11, 54, 24, 14, 55, 25],
+ [16, 45, 15, 14, 46, 16],
+
+ // 24
+ [6, 147, 117, 4, 148, 118],
+ [6, 73, 45, 14, 74, 46],
+ [11, 54, 24, 16, 55, 25],
+ [30, 46, 16, 2, 47, 17],
+
+ // 25
+ [8, 132, 106, 4, 133, 107],
+ [8, 75, 47, 13, 76, 48],
+ [7, 54, 24, 22, 55, 25],
+ [22, 45, 15, 13, 46, 16],
+
+ // 26
+ [10, 142, 114, 2, 143, 115],
+ [19, 74, 46, 4, 75, 47],
+ [28, 50, 22, 6, 51, 23],
+ [33, 46, 16, 4, 47, 17],
+
+ // 27
+ [8, 152, 122, 4, 153, 123],
+ [22, 73, 45, 3, 74, 46],
+ [8, 53, 23, 26, 54, 24],
+ [12, 45, 15, 28, 46, 16],
+
+ // 28
+ [3, 147, 117, 10, 148, 118],
+ [3, 73, 45, 23, 74, 46],
+ [4, 54, 24, 31, 55, 25],
+ [11, 45, 15, 31, 46, 16],
+
+ // 29
+ [7, 146, 116, 7, 147, 117],
+ [21, 73, 45, 7, 74, 46],
+ [1, 53, 23, 37, 54, 24],
+ [19, 45, 15, 26, 46, 16],
+
+ // 30
+ [5, 145, 115, 10, 146, 116],
+ [19, 75, 47, 10, 76, 48],
+ [15, 54, 24, 25, 55, 25],
+ [23, 45, 15, 25, 46, 16],
+
+ // 31
+ [13, 145, 115, 3, 146, 116],
+ [2, 74, 46, 29, 75, 47],
+ [42, 54, 24, 1, 55, 25],
+ [23, 45, 15, 28, 46, 16],
+
+ // 32
+ [17, 145, 115],
+ [10, 74, 46, 23, 75, 47],
+ [10, 54, 24, 35, 55, 25],
+ [19, 45, 15, 35, 46, 16],
+
+ // 33
+ [17, 145, 115, 1, 146, 116],
+ [14, 74, 46, 21, 75, 47],
+ [29, 54, 24, 19, 55, 25],
+ [11, 45, 15, 46, 46, 16],
+
+ // 34
+ [13, 145, 115, 6, 146, 116],
+ [14, 74, 46, 23, 75, 47],
+ [44, 54, 24, 7, 55, 25],
+ [59, 46, 16, 1, 47, 17],
+
+ // 35
+ [12, 151, 121, 7, 152, 122],
+ [12, 75, 47, 26, 76, 48],
+ [39, 54, 24, 14, 55, 25],
+ [22, 45, 15, 41, 46, 16],
+
+ // 36
+ [6, 151, 121, 14, 152, 122],
+ [6, 75, 47, 34, 76, 48],
+ [46, 54, 24, 10, 55, 25],
+ [2, 45, 15, 64, 46, 16],
+
+ // 37
+ [17, 152, 122, 4, 153, 123],
+ [29, 74, 46, 14, 75, 47],
+ [49, 54, 24, 10, 55, 25],
+ [24, 45, 15, 46, 46, 16],
+
+ // 38
+ [4, 152, 122, 18, 153, 123],
+ [13, 74, 46, 32, 75, 47],
+ [48, 54, 24, 14, 55, 25],
+ [42, 45, 15, 32, 46, 16],
+
+ // 39
+ [20, 147, 117, 4, 148, 118],
+ [40, 75, 47, 7, 76, 48],
+ [43, 54, 24, 22, 55, 25],
+ [10, 45, 15, 67, 46, 16],
+
+ // 40
+ [19, 148, 118, 6, 149, 119],
+ [18, 75, 47, 31, 76, 48],
+ [34, 54, 24, 34, 55, 25],
+ [20, 45, 15, 61, 46, 16]
+ ]
totalCount: any
dataCount: any
- static RS_BLOCK_TABLE: any
- constructor(totalCount, dataCount) {
+ constructor(totalCount: number, dataCount: number) {
this.totalCount = totalCount
this.dataCount = dataCount
}
- static getRSBlocks(typeNumber, errorCorrectLevel) {
- var rsBlock = QRRSBlock.getRsBlockTable(typeNumber, errorCorrectLevel)
+ static getRsBlockTable(typeNumber: number, errorCorrectionLevel: any) {
- if (rsBlock == undefined) {
- throw new Error("bad rs block @ typeNumber:" + typeNumber + "/errorCorrectLevel:" + errorCorrectLevel)
+ switch (errorCorrectionLevel) {
+ case QRErrorCorrectionLevel.L:
+ return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 0]
+ case QRErrorCorrectionLevel.M:
+ return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 1]
+ case QRErrorCorrectionLevel.Q:
+ return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 2]
+ case QRErrorCorrectionLevel.H:
+ return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 3]
+ default:
+ return undefined
+ }
+ }
+
+ static getRSBlocks(typeNumber: number, errorCorrectionLevel: QRErrorCorrectionLevel) {
+
+ var rsBlock = QRRSBlock.getRsBlockTable(typeNumber, errorCorrectionLevel)
+
+ if (typeof rsBlock == 'undefined') {
+ throw 'bad rs block @ typeNumber:' + typeNumber +
+ '/errorCorrectionLevel:' + errorCorrectionLevel
}
var length = rsBlock.length / 3
- var list = new Array()
+ var list = []
for (var i = 0; i < length; i++) {
@@ -936,308 +1537,726 @@ class QRRSBlock {
return list
}
- static getRsBlockTable(typeNumber: number, errorCorrectLevel: QRErrorCorrectLevel) {
- switch (errorCorrectLevel) {
- case QRErrorCorrectLevel.L:
- return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 0]
- case QRErrorCorrectLevel.M:
- return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 1]
- case QRErrorCorrectLevel.Q:
- return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 2]
- case QRErrorCorrectLevel.H:
- return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 3]
- default:
- return undefined
- }
- }
}
-QRRSBlock.RS_BLOCK_TABLE = [
- // L
- // M
- // Q
- // H
-
- // 1
- [1, 26, 19],
- [1, 26, 16],
- [1, 26, 13],
- [1, 26, 9],
-
- // 2
- [1, 44, 34],
- [1, 44, 28],
- [1, 44, 22],
- [1, 44, 16],
-
- // 3
- [1, 70, 55],
- [1, 70, 44],
- [2, 35, 17],
- [2, 35, 13],
-
- // 4
- [1, 100, 80],
- [2, 50, 32],
- [2, 50, 24],
- [4, 25, 9],
-
- // 5
- [1, 134, 108],
- [2, 67, 43],
- [2, 33, 15, 2, 34, 16],
- [2, 33, 11, 2, 34, 12],
-
- // 6
- [2, 86, 68],
- [4, 43, 27],
- [4, 43, 19],
- [4, 43, 15],
-
- // 7
- [2, 98, 78],
- [4, 49, 31],
- [2, 32, 14, 4, 33, 15],
- [4, 39, 13, 1, 40, 14],
-
- // 8
- [2, 121, 97],
- [2, 60, 38, 2, 61, 39],
- [4, 40, 18, 2, 41, 19],
- [4, 40, 14, 2, 41, 15],
-
- // 9
- [2, 146, 116],
- [3, 58, 36, 2, 59, 37],
- [4, 36, 16, 4, 37, 17],
- [4, 36, 12, 4, 37, 13],
-
- // 10
- [2, 86, 68, 2, 87, 69],
- [4, 69, 43, 1, 70, 44],
- [6, 43, 19, 2, 44, 20],
- [6, 43, 15, 2, 44, 16],
-
- // 11
- [4, 101, 81],
- [1, 80, 50, 4, 81, 51],
- [4, 50, 22, 4, 51, 23],
- [3, 36, 12, 8, 37, 13],
-
- // 12
- [2, 116, 92, 2, 117, 93],
- [6, 58, 36, 2, 59, 37],
- [4, 46, 20, 6, 47, 21],
- [7, 42, 14, 4, 43, 15],
-
- // 13
- [4, 133, 107],
- [8, 59, 37, 1, 60, 38],
- [8, 44, 20, 4, 45, 21],
- [12, 33, 11, 4, 34, 12],
-
- // 14
- [3, 145, 115, 1, 146, 116],
- [4, 64, 40, 5, 65, 41],
- [11, 36, 16, 5, 37, 17],
- [11, 36, 12, 5, 37, 13],
-
- // 15
- [5, 109, 87, 1, 110, 88],
- [5, 65, 41, 5, 66, 42],
- [5, 54, 24, 7, 55, 25],
- [11, 36, 12],
-
- // 16
- [5, 122, 98, 1, 123, 99],
- [7, 73, 45, 3, 74, 46],
- [15, 43, 19, 2, 44, 20],
- [3, 45, 15, 13, 46, 16],
-
- // 17
- [1, 135, 107, 5, 136, 108],
- [10, 74, 46, 1, 75, 47],
- [1, 50, 22, 15, 51, 23],
- [2, 42, 14, 17, 43, 15],
-
- // 18
- [5, 150, 120, 1, 151, 121],
- [9, 69, 43, 4, 70, 44],
- [17, 50, 22, 1, 51, 23],
- [2, 42, 14, 19, 43, 15],
-
- // 19
- [3, 141, 113, 4, 142, 114],
- [3, 70, 44, 11, 71, 45],
- [17, 47, 21, 4, 48, 22],
- [9, 39, 13, 16, 40, 14],
-
- // 20
- [3, 135, 107, 5, 136, 108],
- [3, 67, 41, 13, 68, 42],
- [15, 54, 24, 5, 55, 25],
- [15, 43, 15, 10, 44, 16],
-
- // 21
- [4, 144, 116, 4, 145, 117],
- [17, 68, 42],
- [17, 50, 22, 6, 51, 23],
- [19, 46, 16, 6, 47, 17],
-
- // 22
- [2, 139, 111, 7, 140, 112],
- [17, 74, 46],
- [7, 54, 24, 16, 55, 25],
- [34, 37, 13],
-
- // 23
- [4, 151, 121, 5, 152, 122],
- [4, 75, 47, 14, 76, 48],
- [11, 54, 24, 14, 55, 25],
- [16, 45, 15, 14, 46, 16],
-
- // 24
- [6, 147, 117, 4, 148, 118],
- [6, 73, 45, 14, 74, 46],
- [11, 54, 24, 16, 55, 25],
- [30, 46, 16, 2, 47, 17],
-
- // 25
- [8, 132, 106, 4, 133, 107],
- [8, 75, 47, 13, 76, 48],
- [7, 54, 24, 22, 55, 25],
- [22, 45, 15, 13, 46, 16],
-
- // 26
- [10, 142, 114, 2, 143, 115],
- [19, 74, 46, 4, 75, 47],
- [28, 50, 22, 6, 51, 23],
- [33, 46, 16, 4, 47, 17],
-
- // 27
- [8, 152, 122, 4, 153, 123],
- [22, 73, 45, 3, 74, 46],
- [8, 53, 23, 26, 54, 24],
- [12, 45, 15, 28, 46, 16],
-
- // 28
- [3, 147, 117, 10, 148, 118],
- [3, 73, 45, 23, 74, 46],
- [4, 54, 24, 31, 55, 25],
- [11, 45, 15, 31, 46, 16],
-
- // 29
- [7, 146, 116, 7, 147, 117],
- [21, 73, 45, 7, 74, 46],
- [1, 53, 23, 37, 54, 24],
- [19, 45, 15, 26, 46, 16],
-
- // 30
- [5, 145, 115, 10, 146, 116],
- [19, 75, 47, 10, 76, 48],
- [15, 54, 24, 25, 55, 25],
- [23, 45, 15, 25, 46, 16],
-
- // 31
- [13, 145, 115, 3, 146, 116],
- [2, 74, 46, 29, 75, 47],
- [42, 54, 24, 1, 55, 25],
- [23, 45, 15, 28, 46, 16],
-
- // 32
- [17, 145, 115],
- [10, 74, 46, 23, 75, 47],
- [10, 54, 24, 35, 55, 25],
- [19, 45, 15, 35, 46, 16],
-
- // 33
- [17, 145, 115, 1, 146, 116],
- [14, 74, 46, 21, 75, 47],
- [29, 54, 24, 19, 55, 25],
- [11, 45, 15, 46, 46, 16],
-
- // 34
- [13, 145, 115, 6, 146, 116],
- [14, 74, 46, 23, 75, 47],
- [44, 54, 24, 7, 55, 25],
- [59, 46, 16, 1, 47, 17],
-
- // 35
- [12, 151, 121, 7, 152, 122],
- [12, 75, 47, 26, 76, 48],
- [39, 54, 24, 14, 55, 25],
- [22, 45, 15, 41, 46, 16],
-
- // 36
- [6, 151, 121, 14, 152, 122],
- [6, 75, 47, 34, 76, 48],
- [46, 54, 24, 10, 55, 25],
- [2, 45, 15, 64, 46, 16],
-
- // 37
- [17, 152, 122, 4, 153, 123],
- [29, 74, 46, 14, 75, 47],
- [49, 54, 24, 10, 55, 25],
- [24, 45, 15, 46, 46, 16],
-
- // 38
- [4, 152, 122, 18, 153, 123],
- [13, 74, 46, 32, 75, 47],
- [48, 54, 24, 14, 55, 25],
- [42, 45, 15, 32, 46, 16],
-
- // 39
- [20, 147, 117, 4, 148, 118],
- [40, 75, 47, 7, 76, 48],
- [43, 54, 24, 22, 55, 25],
- [10, 45, 15, 67, 46, 16],
-
- // 40
- [19, 148, 118, 6, 149, 119],
- [18, 75, 47, 31, 76, 48],
- [34, 54, 24, 34, 55, 25],
- [20, 45, 15, 61, 46, 16]
-]
-
-
-
//---------------------------------------------------------------------
-// QRBitBuffer
+// qrBitBuffer
//---------------------------------------------------------------------
class QRBitBuffer {
- buffer: any[]
- length: number
- constructor() {
- this.buffer = new Array()
- this.length = 0
- }
- get(index) {
- var bufIndex = Math.floor(index / 8)
- return ((this.buffer[bufIndex] >>> (7 - index % 8)) & 1) == 1
+ private _buffer = []
+ private _length = 0
+
+ getBuffer() {
+ return this._buffer
}
- put(num, length) {
+ getAt(index: number) {
+ var bufIndex = Math.floor(index / 8)
+ return ((this._buffer[bufIndex] >>> (7 - index % 8)) & 1) == 1
+ }
+
+ put(num: number, length: number) {
for (var i = 0; i < length; i++) {
this.putBit(((num >>> (length - i - 1)) & 1) == 1)
}
}
getLengthInBits() {
- return this.length
+ return this._length
}
- putBit(bit) {
+ putBit(bit: boolean) {
- var bufIndex = Math.floor(this.length / 8)
- if (this.buffer.length <= bufIndex) {
- this.buffer.push(0)
+ var bufIndex = Math.floor(this._length / 8)
+ if (this._buffer.length <= bufIndex) {
+ this._buffer.push(0)
}
if (bit) {
- this.buffer[bufIndex] |= (0x80 >>> (this.length % 8))
+ this._buffer[bufIndex] |= (0x80 >>> (this._length % 8))
}
- this.length++
+ this._length++
}
}
+
+// //---------------------------------------------------------------------
+// // qrNumber
+// //---------------------------------------------------------------------
+
+// var qrNumber = function (data) {
+
+// var _mode = QRMode.MODE_NUMBER
+// var _data = data
+
+// var this = {}
+
+// this.getMode = function () {
+// return _mode
+// }
+
+// this.getLength = function (buffer) {
+// return _data.length
+// }
+
+// this.write = function (buffer) {
+
+// var data = _data
+
+// var i = 0
+
+// while (i + 2 < data.length) {
+// buffer.put(strToNum(data.substring(i, i + 3)), 10)
+// i += 3
+// }
+
+// if (i < data.length) {
+// if (data.length - i == 1) {
+// buffer.put(strToNum(data.substring(i, i + 1)), 4)
+// } else if (data.length - i == 2) {
+// buffer.put(strToNum(data.substring(i, i + 2)), 7)
+// }
+// }
+// }
+
+// var strToNum = function (s) {
+// var num = 0
+// for (var i = 0; i < s.length; i++) {
+// num = num * 10 + chatToNum(s.charAt(i))
+// }
+// return num
+// }
+
+// var chatToNum = function (c) {
+// if ('0' <= c && c <= '9') {
+// return c.charCodeAt(0) - '0'.charCodeAt(0)
+// }
+// throw 'illegal char :' + c
+// }
+
+// return this
+// }
+
+// //---------------------------------------------------------------------
+// // qrAlphaNum
+// //---------------------------------------------------------------------
+
+// var qrAlphaNum = function (data) {
+
+// var _mode = QRMode.MODE_ALPHA_NUM
+// var _data = data
+
+// var this = {}
+
+// this.getMode = function () {
+// return _mode
+// }
+
+// this.getLength = function (buffer) {
+// return _data.length
+// }
+
+// this.write = function (buffer) {
+
+// var s = _data
+
+// var i = 0
+
+// while (i + 1 < s.length) {
+// buffer.put(
+// getCode(s.charAt(i)) * 45 +
+// getCode(s.charAt(i + 1)), 11)
+// i += 2
+// }
+
+// if (i < s.length) {
+// buffer.put(getCode(s.charAt(i)), 6)
+// }
+// }
+
+// var getCode = function (c) {
+
+// if ('0' <= c && c <= '9') {
+// return c.charCodeAt(0) - '0'.charCodeAt(0)
+// } else if ('A' <= c && c <= 'Z') {
+// return c.charCodeAt(0) - 'A'.charCodeAt(0) + 10
+// } else {
+// switch (c) {
+// case ' ': return 36
+// case '$': return 37
+// case '%': return 38
+// case '*': return 39
+// case '+': return 40
+// case '-': return 41
+// case '.': return 42
+// case '/': return 43
+// case ':': return 44
+// default:
+// throw 'illegal char :' + c
+// }
+// }
+// }
+
+// return this
+// }
+
+//---------------------------------------------------------------------
+// qr8BitByte
+//---------------------------------------------------------------------
+
+class qr8BitByte {
+ private _mode: number
+ private _data: any
+ private _bytes: string | any[]
+
+ constructor(data: any) {
+ this._mode = QRMode.MODE_8BIT_BYTE
+ this._data = data
+ this._bytes = data// QRCode.stringToBytes(data)
+ }
+ getMode() {
+ return this._mode
+ }
+
+ getLength(buffer: any) {
+ return this._bytes.length
+ }
+
+ write(buffer: { put: (arg0: any, arg1: number) => void }) {
+ for (var i = 0; i < this._bytes.length; i++) {
+ buffer.put(this._bytes[i], 8)
+ }
+ }
+}
+
+// //---------------------------------------------------------------------
+// // qrKanji
+// //---------------------------------------------------------------------
+
+// var qrKanji = function (data) {
+
+// var _mode = QRMode.MODE_KANJI
+// var _data = data
+
+// var stringToBytes = QRCode.stringToBytesFuncs['SJIS']
+// if (!stringToBytes) {
+// throw 'sjis not supported.'
+// }
+// !function (c, code) {
+// // self test for sjis support.
+// var test = stringToBytes(c)
+// if (test.length != 2 || ((test[0] << 8) | test[1]) != code) {
+// throw 'sjis not supported.'
+// }
+// }('\u53cb', 0x9746)
+
+// var _bytes = stringToBytes(data)
+
+// var this = {}
+
+// this.getMode = function () {
+// return _mode
+// }
+
+// this.getLength = function (buffer) {
+// return ~~(_bytes.length / 2)
+// }
+
+// this.write = function (buffer) {
+
+// var data = _bytes
+
+// var i = 0
+
+// while (i + 1 < data.length) {
+
+// var c = ((0xff & data[i]) << 8) | (0xff & data[i + 1])
+
+// if (0x8140 <= c && c <= 0x9FFC) {
+// c -= 0x8140
+// } else if (0xE040 <= c && c <= 0xEBBF) {
+// c -= 0xC140
+// } else {
+// throw 'illegal char at ' + (i + 1) + '/' + c
+// }
+
+// c = ((c >>> 8) & 0xff) * 0xC0 + (c & 0xff)
+
+// buffer.put(c, 13)
+
+// i += 2
+// }
+
+// if (i < data.length) {
+// throw 'illegal char at ' + (i + 1)
+// }
+// }
+
+// return this
+// }
+
+// //=====================================================================
+// // GIF Support etc.
+// //
+
+// //---------------------------------------------------------------------
+// // byteArrayOutputStream
+// //---------------------------------------------------------------------
+
+// var byteArrayOutputStream = function () {
+
+// var _bytes = []
+
+// var this = {}
+
+// this.writeByte = function (b) {
+// _bytes.push(b & 0xff)
+// }
+
+// this.writeShort = function (i) {
+// this.writeByte(i)
+// this.writeByte(i >>> 8)
+// }
+
+// this.writeBytes = function (b, off, len) {
+// off = off || 0
+// len = len || b.length
+// for (var i = 0; i < len; i++) {
+// this.writeByte(b[i + off])
+// }
+// }
+
+// this.writeString = function (s) {
+// for (var i = 0; i < s.length; i++) {
+// this.writeByte(s.charCodeAt(i))
+// }
+// }
+
+// this.toByteArray = function () {
+// return _bytes
+// }
+
+// this.toString = function () {
+// var s = ''
+// s += '['
+// for (var i = 0; i < _bytes.length; i++) {
+// if (i > 0) {
+// s += ','
+// }
+// s += _bytes[i]
+// }
+// s += ']'
+// return s
+// }
+
+// return this
+// }
+
+// //---------------------------------------------------------------------
+// // base64EncodeOutputStream
+// //---------------------------------------------------------------------
+
+// var base64EncodeOutputStream = function () {
+
+// var _buffer = 0
+// var _buflen = 0
+// var _length = 0
+// var _base64 = ''
+
+// var this = {}
+
+// var writeEncoded = function (b) {
+// _base64 += String.fromCharCode(encode(b & 0x3f))
+// }
+
+// var encode = function (n) {
+// if (n < 0) {
+// // error.
+// } else if (n < 26) {
+// return 0x41 + n
+// } else if (n < 52) {
+// return 0x61 + (n - 26)
+// } else if (n < 62) {
+// return 0x30 + (n - 52)
+// } else if (n == 62) {
+// return 0x2b
+// } else if (n == 63) {
+// return 0x2f
+// }
+// throw 'n:' + n
+// }
+
+// this.writeByte = function (n) {
+
+// _buffer = (_buffer << 8) | (n & 0xff)
+// _buflen += 8
+// _length++
+
+// while (_buflen >= 6) {
+// writeEncoded(_buffer >>> (_buflen - 6))
+// _buflen -= 6
+// }
+// }
+
+// this.flush = function () {
+
+// if (_buflen > 0) {
+// writeEncoded(_buffer << (6 - _buflen))
+// _buffer = 0
+// _buflen = 0
+// }
+
+// if (_length % 3 != 0) {
+// // padding
+// var padlen = 3 - _length % 3
+// for (var i = 0; i < padlen; i++) {
+// _base64 += '='
+// }
+// }
+// }
+
+// this.toString = function () {
+// return _base64
+// }
+
+// return this
+// }
+
+// //---------------------------------------------------------------------
+// // base64DecodeInputStream
+// //---------------------------------------------------------------------
+
+// var base64DecodeInputStream = function (str) {
+
+// var _str = str
+// var _pos = 0
+// var _buffer = 0
+// var _buflen = 0
+
+// var this = {}
+
+// this.read = function () {
+
+// while (_buflen < 8) {
+
+// if (_pos >= _str.length) {
+// if (_buflen == 0) {
+// return -1
+// }
+// throw 'unexpected end of file./' + _buflen
+// }
+
+// var c = _str.charAt(_pos)
+// _pos++
+
+// if (c == '=') {
+// _buflen = 0
+// return -1
+// } else if (c.match(/^\s$/)) {
+// // ignore if whitespace.
+// continue
+// }
+
+// _buffer = (_buffer << 6) | decode(c.charCodeAt(0))
+// _buflen += 6
+// }
+
+// var n = (_buffer >>> (_buflen - 8)) & 0xff
+// _buflen -= 8
+// return n
+// }
+
+// var decode = function (c) {
+// if (0x41 <= c && c <= 0x5a) {
+// return c - 0x41
+// } else if (0x61 <= c && c <= 0x7a) {
+// return c - 0x61 + 26
+// } else if (0x30 <= c && c <= 0x39) {
+// return c - 0x30 + 52
+// } else if (c == 0x2b) {
+// return 62
+// } else if (c == 0x2f) {
+// return 63
+// } else {
+// throw 'c:' + c
+// }
+// }
+
+// return this
+// }
+
+// //---------------------------------------------------------------------
+// // gifImage (B/W)
+// //---------------------------------------------------------------------
+
+// var gifImage = function (width, height) {
+
+// var _width = width
+// var _height = height
+// var _data = new Array(width * height)
+
+// var this = {}
+
+// this.setPixel = function (x, y, pixel) {
+// _data[y * _width + x] = pixel
+// }
+
+// this.write = function (out) {
+
+// //---------------------------------
+// // GIF Signature
+
+// out.writeString('GIF87a')
+
+// //---------------------------------
+// // Screen Descriptor
+
+// out.writeShort(_width)
+// out.writeShort(_height)
+
+// out.writeByte(0x80) // 2bit
+// out.writeByte(0)
+// out.writeByte(0)
+
+// //---------------------------------
+// // Global Color Map
+
+// // black
+// out.writeByte(0x00)
+// out.writeByte(0x00)
+// out.writeByte(0x00)
+
+// // white
+// out.writeByte(0xff)
+// out.writeByte(0xff)
+// out.writeByte(0xff)
+
+// //---------------------------------
+// // Image Descriptor
+
+// out.writeString(',')
+// out.writeShort(0)
+// out.writeShort(0)
+// out.writeShort(_width)
+// out.writeShort(_height)
+// out.writeByte(0)
+
+// //---------------------------------
+// // Local Color Map
+
+// //---------------------------------
+// // Raster Data
+
+// var lzwMinCodeSize = 2
+// var raster = getLZWRaster(lzwMinCodeSize)
+
+// out.writeByte(lzwMinCodeSize)
+
+// var offset = 0
+
+// while (raster.length - offset > 255) {
+// out.writeByte(255)
+// out.writeBytes(raster, offset, 255)
+// offset += 255
+// }
+
+// out.writeByte(raster.length - offset)
+// out.writeBytes(raster, offset, raster.length - offset)
+// out.writeByte(0x00)
+
+// //---------------------------------
+// // GIF Terminator
+// out.writeString(';')
+// }
+
+// var bitOutputStream = function (out) {
+
+// var _out = out
+// var _bitLength = 0
+// var _bitBuffer = 0
+
+// var this = {}
+
+// this.write = function (data, length) {
+
+// if ((data >>> length) != 0) {
+// throw 'length over'
+// }
+
+// while (_bitLength + length >= 8) {
+// _out.writeByte(0xff & ((data << _bitLength) | _bitBuffer))
+// length -= (8 - _bitLength)
+// data >>>= (8 - _bitLength)
+// _bitBuffer = 0
+// _bitLength = 0
+// }
+
+// _bitBuffer = (data << _bitLength) | _bitBuffer
+// _bitLength = _bitLength + length
+// }
+
+// this.flush = function () {
+// if (_bitLength > 0) {
+// _out.writeByte(_bitBuffer)
+// }
+// }
+
+// return this
+// }
+
+// var getLZWRaster = function (lzwMinCodeSize) {
+
+// var clearCode = 1 << lzwMinCodeSize
+// var endCode = (1 << lzwMinCodeSize) + 1
+// var bitLength = lzwMinCodeSize + 1
+
+// // Setup LZWTable
+// var table = lzwTable()
+
+// for (var i = 0; i < clearCode; i++) {
+// table.add(String.fromCharCode(i))
+// }
+// table.add(String.fromCharCode(clearCode))
+// table.add(String.fromCharCode(endCode))
+
+// var byteOut = byteArrayOutputStream()
+// var bitOut = bitOutputStream(byteOut)
+
+// // clear code
+// bitOut.write(clearCode, bitLength)
+
+// var dataIndex = 0
+
+// var s = String.fromCharCode(_data[dataIndex])
+// dataIndex++
+
+// while (dataIndex < _data.length) {
+
+// var c = String.fromCharCode(_data[dataIndex])
+// dataIndex++
+
+// if (table.contains(s + c)) {
+
+// s = s + c
+
+// } else {
+
+// bitOut.write(table.indexOf(s), bitLength)
+
+// if (table.size() < 0xfff) {
+
+// if (table.size() == (1 << bitLength)) {
+// bitLength++
+// }
+
+// table.add(s + c)
+// }
+
+// s = c
+// }
+// }
+
+// bitOut.write(table.indexOf(s), bitLength)
+
+// // end code
+// bitOut.write(endCode, bitLength)
+
+// bitOut.flush()
+
+// return byteOut.toByteArray()
+// }
+
+// var lzwTable = function () {
+
+// var _map = {}
+// var _size = 0
+
+// var this = {}
+
+// this.add = function (key) {
+// if (this.contains(key)) {
+// throw 'dup key:' + key
+// }
+// _map[key] = _size
+// _size++
+// }
+
+// this.size = function () {
+// return _size
+// }
+
+// this.indexOf = function (key) {
+// return _map[key]
+// }
+
+// this.contains = function (key) {
+// return typeof _map[key] != 'undefined'
+// }
+
+// return this
+// }
+
+// return this
+// }
+
+// var createDataURL = function (width, height, getPixel) {
+// var gif = gifImage(width, height)
+// for (var y = 0; y < height; y++) {
+// for (var x = 0; x < width; x++) {
+// gif.setPixel(x, y, getPixel(x, y))
+// }
+// }
+
+// var b = byteArrayOutputStream()
+// gif.write(b)
+
+// var base64 = base64EncodeOutputStream()
+// var bytes = b.toByteArray()
+// for (var i = 0; i < bytes.length; i++) {
+// base64.writeByte(bytes[i])
+// }
+// base64.flush()
+
+// return 'data:image/gif;base64,' + base64
+// }
+
+// // multibyte support
+// !function () {
+
+// QRCode.stringToBytesFuncs['UTF-8'] = function (s) {
+// // http://stackoverflow.com/questions/18729405/how-to-convert-utf8-string-to-byte-array
+// function toUTF8Array(str) {
+// var utf8 = []
+// for (var i = 0; i < str.length; i++) {
+// var charcode = str.charCodeAt(i)
+// if (charcode < 0x80) utf8.push(charcode)
+// else if (charcode < 0x800) {
+// utf8.push(0xc0 | (charcode >> 6),
+// 0x80 | (charcode & 0x3f))
+// }
+// else if (charcode < 0xd800 || charcode >= 0xe000) {
+// utf8.push(0xe0 | (charcode >> 12),
+// 0x80 | ((charcode >> 6) & 0x3f),
+// 0x80 | (charcode & 0x3f))
+// }
+// // surrogate pair
+// else {
+// i++
+// // UTF-16 encodes 0x10000-0x10FFFF by
+// // subtracting 0x10000 and splitting the
+// // 20 bits of 0x0-0xFFFFF into two halves
+// charcode = 0x10000 + (((charcode & 0x3ff) << 10)
+// | (str.charCodeAt(i) & 0x3ff))
+// utf8.push(0xf0 | (charcode >> 18),
+// 0x80 | ((charcode >> 12) & 0x3f),
+// 0x80 | ((charcode >> 6) & 0x3f),
+// 0x80 | (charcode & 0x3f))
+// }
+// }
+// return utf8
+// }
+// return toUTF8Array(s)
+// }
+
+// }();