22 changed files with 13 additions and 1544 deletions
Split View
Diff Options
-
1app.json
-
140components/qrcode/index.js
-
3components/qrcode/index.json
-
1components/qrcode/index.wxml
-
0components/qrcode/index.wxss
-
17components/qrcode/qr.js/index.js
-
23components/qrcode/qr.js/lib/8BitByte.js
-
38components/qrcode/qr.js/lib/BitBuffer.js
-
7components/qrcode/qr.js/lib/ErrorCorrectLevel.js
-
67components/qrcode/qr.js/lib/Polynomial.js
-
438components/qrcode/qr.js/lib/QRCode.js
-
299components/qrcode/qr.js/lib/RSBlock.js
-
44components/qrcode/qr.js/lib/math.js
-
6components/qrcode/qr.js/lib/mode.js
-
279components/qrcode/qr.js/lib/util.js
-
17pages/home/index/index.js
-
84pages/home/qrcode/index.js
-
8pages/home/qrcode/index.json
-
35pages/home/qrcode/index.wxml
-
42pages/home/qrcode/index.wxss
-
3pages/html/integral/index.js
-
5pages/ztbvip/index.js
@ -1,140 +0,0 @@ |
|||
import qrjs from './qr.js/index' |
|||
|
|||
/** |
|||
* 字符串转换成 UTF-8 |
|||
* @param {String} str 文本内容 |
|||
*/ |
|||
const utf16to8 = (str) => { |
|||
const len = str.length |
|||
let out = '' |
|||
|
|||
for (let i = 0; i < len; i++) { |
|||
const c = str.charCodeAt(i) |
|||
|
|||
if ((c >= 0x0001) && (c <= 0x007F)) { |
|||
out += str.charAt(i) |
|||
} else if (c > 0x07FF) { |
|||
out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F)) |
|||
out += String.fromCharCode(0x80 | ((c >> 6) & 0x3F)) |
|||
out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F)) |
|||
} else { |
|||
out += String.fromCharCode(0xC0 | ((c >> 6) & 0x1F)) |
|||
out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F)) |
|||
} |
|||
} |
|||
|
|||
return out |
|||
} |
|||
|
|||
Component({ |
|||
properties: { |
|||
typeNumber: { |
|||
type: Number, |
|||
value: -1, |
|||
observer(newVal) { |
|||
this.draw({ |
|||
typeNumber: newVal, |
|||
}) |
|||
}, |
|||
}, |
|||
errorCorrectLevel: { |
|||
type: Number, |
|||
value: 2, |
|||
observer(newVal) { |
|||
this.draw({ |
|||
errorCorrectLevel: newVal, |
|||
}) |
|||
}, |
|||
}, |
|||
width: { |
|||
type: Number, |
|||
value: 200, |
|||
observer(newVal) { |
|||
this.draw({ |
|||
width: newVal, |
|||
}) |
|||
}, |
|||
}, |
|||
height: { |
|||
type: Number, |
|||
value: 200, |
|||
observer(newVal) { |
|||
this.draw({ |
|||
height: newVal, |
|||
}) |
|||
}, |
|||
}, |
|||
fgColor: { |
|||
type: String, |
|||
value: 'black', |
|||
observer(newVal) { |
|||
this.draw({ |
|||
fgColor: newVal, |
|||
}) |
|||
}, |
|||
}, |
|||
bgColor: { |
|||
type: String, |
|||
value: 'white', |
|||
observer(newVal) { |
|||
this.draw({ |
|||
bgColor: newVal, |
|||
}) |
|||
}, |
|||
}, |
|||
canvasId: { |
|||
type: String, |
|||
value: 'wux-qrcode', |
|||
}, |
|||
data: { |
|||
type: String, |
|||
value: '', |
|||
observer(newVal) { |
|||
this.draw({ |
|||
data: newVal, |
|||
}) |
|||
}, |
|||
}, |
|||
}, |
|||
methods: { |
|||
/** |
|||
* 将之前在绘图上下文中的描述(路径、变形、样式)画到 canvas 中 |
|||
*/ |
|||
draw(opts = {}) { |
|||
const { typeNumber, errorCorrectLevel, width, height, fgColor, bgColor, canvasId, data } = Object.assign({}, this.data, opts) |
|||
const qrcode = qrjs(utf16to8(data), { |
|||
typeNumber, |
|||
errorCorrectLevel, |
|||
}) |
|||
const cells = qrcode.modules |
|||
const tileW = width / cells.length |
|||
const tileH = height / cells.length |
|||
|
|||
this.ctx = this.ctx || wx.createCanvasContext(canvasId, this) |
|||
this.ctx.scale(1, 1) |
|||
|
|||
cells.forEach((row, rdx) => { |
|||
row.forEach((cell, cdx) => { |
|||
this.ctx.setFillStyle(cell ? fgColor : bgColor) |
|||
const w = (Math.ceil((cdx + 1) * tileW) - Math.floor(cdx * tileW)) |
|||
const h = (Math.ceil((rdx + 1) * tileH) - Math.floor(rdx * tileH)) |
|||
this.ctx.fillRect(Math.round(cdx * tileW), Math.round(rdx * tileH), w, h) |
|||
}) |
|||
}) |
|||
|
|||
this.ctx.draw() |
|||
}, |
|||
/** |
|||
* 手指触摸后马上离开 |
|||
*/ |
|||
onTap() { |
|||
this.triggerEvent('click') |
|||
}, |
|||
}, |
|||
attached() { |
|||
this.draw() |
|||
}, |
|||
detached() { |
|||
this.ctx = null |
|||
}, |
|||
}) |
|||
@ -1,3 +0,0 @@ |
|||
{ |
|||
"component": true |
|||
} |
|||
@ -1 +0,0 @@ |
|||
<canvas class="wux-class" canvas-id="{{ canvasId }}" style="width: {{ width + 'px' }}; height: {{ height + 'px' }};" bindtap="onTap"></canvas> |
|||
@ -1,17 +0,0 @@ |
|||
var QRCode = require('./lib/QRCode'); |
|||
var ErrorCorrectLevel = require('./lib/ErrorCorrectLevel'); |
|||
|
|||
var qrcode = function(data, opt) { |
|||
opt = opt || {}; |
|||
var qr = new QRCode(opt.typeNumber || -1, |
|||
opt.errorCorrectLevel || ErrorCorrectLevel.H); |
|||
qr.addData(data); |
|||
qr.make(); |
|||
|
|||
return qr; |
|||
}; |
|||
|
|||
qrcode.ErrorCorrectLevel = ErrorCorrectLevel; |
|||
|
|||
module.exports = qrcode; |
|||
|
|||
@ -1,23 +0,0 @@ |
|||
var mode = require('./mode'); |
|||
|
|||
function QR8bitByte(data) { |
|||
this.mode = mode.MODE_8BIT_BYTE; |
|||
this.data = data; |
|||
} |
|||
|
|||
QR8bitByte.prototype = { |
|||
|
|||
getLength : function(buffer) { |
|||
return this.data.length; |
|||
}, |
|||
|
|||
write : function(buffer) { |
|||
for (var i = 0; i < this.data.length; i++) { |
|||
// not JIS ...
|
|||
buffer.put(this.data.charCodeAt(i), 8); |
|||
} |
|||
} |
|||
}; |
|||
|
|||
module.exports = QR8bitByte; |
|||
|
|||
@ -1,38 +0,0 @@ |
|||
function QRBitBuffer() { |
|||
this.buffer = new Array(); |
|||
this.length = 0; |
|||
} |
|||
|
|||
QRBitBuffer.prototype = { |
|||
|
|||
get : function(index) { |
|||
var bufIndex = Math.floor(index / 8); |
|||
return ( (this.buffer[bufIndex] >>> (7 - index % 8) ) & 1) == 1; |
|||
}, |
|||
|
|||
put : function(num, length) { |
|||
for (var i = 0; i < length; i++) { |
|||
this.putBit( ( (num >>> (length - i - 1) ) & 1) == 1); |
|||
} |
|||
}, |
|||
|
|||
getLengthInBits : function() { |
|||
return this.length; |
|||
}, |
|||
|
|||
putBit : function(bit) { |
|||
|
|||
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.length++; |
|||
} |
|||
}; |
|||
|
|||
module.exports = QRBitBuffer; |
|||
@ -1,7 +0,0 @@ |
|||
module.exports = { |
|||
L : 1, |
|||
M : 0, |
|||
Q : 3, |
|||
H : 2 |
|||
}; |
|||
|
|||
@ -1,67 +0,0 @@ |
|||
var math = require('./math'); |
|||
|
|||
function QRPolynomial(num, shift) { |
|||
|
|||
if (num.length == undefined) { |
|||
throw new Error(num.length + "/" + shift); |
|||
} |
|||
|
|||
var offset = 0; |
|||
|
|||
while (offset < num.length && num[offset] == 0) { |
|||
offset++; |
|||
} |
|||
|
|||
this.num = new Array(num.length - offset + shift); |
|||
for (var i = 0; i < num.length - offset; i++) { |
|||
this.num[i] = num[i + offset]; |
|||
} |
|||
} |
|||
|
|||
QRPolynomial.prototype = { |
|||
|
|||
get : function(index) { |
|||
return this.num[index]; |
|||
}, |
|||
|
|||
getLength : function() { |
|||
return this.num.length; |
|||
}, |
|||
|
|||
multiply : function(e) { |
|||
|
|||
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] ^= math.gexp(math.glog(this.get(i) ) + math.glog(e.get(j) ) ); |
|||
} |
|||
} |
|||
|
|||
return new QRPolynomial(num, 0); |
|||
}, |
|||
|
|||
mod : function(e) { |
|||
|
|||
if (this.getLength() - e.getLength() < 0) { |
|||
return this; |
|||
} |
|||
|
|||
var ratio = math.glog(this.get(0) ) - math.glog(e.get(0) ); |
|||
|
|||
var num = new Array(this.getLength() ); |
|||
|
|||
for (var i = 0; i < this.getLength(); i++) { |
|||
num[i] = this.get(i); |
|||
} |
|||
|
|||
for (var i = 0; i < e.getLength(); i++) { |
|||
num[i] ^= math.gexp(math.glog(e.get(i) ) + ratio); |
|||
} |
|||
|
|||
// recursive call
|
|||
return new QRPolynomial(num, 0).mod(e); |
|||
} |
|||
}; |
|||
|
|||
module.exports = QRPolynomial; |
|||
@ -1,438 +0,0 @@ |
|||
var BitByte = require('./8BitByte'); |
|||
var RSBlock = require('./RSBlock'); |
|||
var BitBuffer = require('./BitBuffer'); |
|||
var util = require('./util'); |
|||
var Polynomial = require('./Polynomial'); |
|||
|
|||
function QRCode(typeNumber, errorCorrectLevel) { |
|||
this.typeNumber = typeNumber; |
|||
this.errorCorrectLevel = errorCorrectLevel; |
|||
this.modules = null; |
|||
this.moduleCount = 0; |
|||
this.dataCache = null; |
|||
this.dataList = []; |
|||
} |
|||
|
|||
// for client side minification
|
|||
var proto = QRCode.prototype; |
|||
|
|||
proto.addData = function(data) { |
|||
var newData = new BitByte(data); |
|||
this.dataList.push(newData); |
|||
this.dataCache = null; |
|||
}; |
|||
|
|||
proto.isDark = function(row, col) { |
|||
if (row < 0 || this.moduleCount <= row || col < 0 || this.moduleCount <= col) { |
|||
throw new Error(row + "," + col); |
|||
} |
|||
return this.modules[row][col]; |
|||
}; |
|||
|
|||
proto.getModuleCount = function() { |
|||
return this.moduleCount; |
|||
}; |
|||
|
|||
proto.make = function() { |
|||
// Calculate automatically typeNumber if provided is < 1
|
|||
if (this.typeNumber < 1 ){ |
|||
var typeNumber = 1; |
|||
for (typeNumber = 1; typeNumber < 40; typeNumber++) { |
|||
var rsBlocks = RSBlock.getRSBlocks(typeNumber, this.errorCorrectLevel); |
|||
|
|||
var buffer = new BitBuffer(); |
|||
var totalDataCount = 0; |
|||
for (var i = 0; i < rsBlocks.length; i++) { |
|||
totalDataCount += rsBlocks[i].dataCount; |
|||
} |
|||
|
|||
for (var i = 0; i < this.dataList.length; i++) { |
|||
var data = this.dataList[i]; |
|||
buffer.put(data.mode, 4); |
|||
buffer.put(data.getLength(), util.getLengthInBits(data.mode, typeNumber) ); |
|||
data.write(buffer); |
|||
} |
|||
if (buffer.getLengthInBits() <= totalDataCount * 8) |
|||
break; |
|||
} |
|||
this.typeNumber = typeNumber; |
|||
} |
|||
this.makeImpl(false, this.getBestMaskPattern() ); |
|||
}; |
|||
|
|||
proto.makeImpl = function(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;
|
|||
} |
|||
} |
|||
|
|||
this.setupPositionProbePattern(0, 0); |
|||
this.setupPositionProbePattern(this.moduleCount - 7, 0); |
|||
this.setupPositionProbePattern(0, this.moduleCount - 7); |
|||
this.setupPositionAdjustPattern(); |
|||
this.setupTimingPattern(); |
|||
this.setupTypeInfo(test, maskPattern); |
|||
|
|||
if (this.typeNumber >= 7) { |
|||
this.setupTypeNumber(test); |
|||
} |
|||
|
|||
if (this.dataCache == null) { |
|||
this.dataCache = QRCode.createData(this.typeNumber, this.errorCorrectLevel, this.dataList); |
|||
} |
|||
|
|||
this.mapData(this.dataCache, maskPattern); |
|||
}; |
|||
|
|||
proto.setupPositionProbePattern = function(row, col) { |
|||
|
|||
for (var r = -1; r <= 7; r++) { |
|||
|
|||
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 ( (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; |
|||
} else { |
|||
this.modules[row + r][col + c] = false; |
|||
} |
|||
} |
|||
} |
|||
}; |
|||
|
|||
proto.getBestMaskPattern = function() { |
|||
|
|||
var minLostPoint = 0; |
|||
var pattern = 0; |
|||
|
|||
for (var i = 0; i < 8; i++) { |
|||
|
|||
this.makeImpl(true, i); |
|||
|
|||
var lostPoint = util.getLostPoint(this); |
|||
|
|||
if (i == 0 || minLostPoint > lostPoint) { |
|||
minLostPoint = lostPoint; |
|||
pattern = i; |
|||
} |
|||
} |
|||
|
|||
return pattern; |
|||
}; |
|||
|
|||
proto.createMovieClip = function(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; |
|||
}; |
|||
|
|||
proto.setupTimingPattern = function() { |
|||
|
|||
for (var r = 8; r < this.moduleCount - 8; r++) { |
|||
if (this.modules[r][6] != null) { |
|||
continue; |
|||
} |
|||
this.modules[r][6] = (r % 2 == 0); |
|||
} |
|||
|
|||
for (var c = 8; c < this.moduleCount - 8; c++) { |
|||
if (this.modules[6][c] != null) { |
|||
continue; |
|||
} |
|||
this.modules[6][c] = (c % 2 == 0); |
|||
} |
|||
}; |
|||
|
|||
proto.setupPositionAdjustPattern = function() { |
|||
|
|||
var pos = util.getPatternPosition(this.typeNumber); |
|||
|
|||
for (var i = 0; i < pos.length; i++) { |
|||
|
|||
for (var j = 0; j < pos.length; j++) { |
|||
|
|||
var row = pos[i]; |
|||
var col = pos[j]; |
|||
|
|||
if (this.modules[row][col] != null) { |
|||
continue; |
|||
} |
|||
|
|||
for (var r = -2; r <= 2; r++) { |
|||
|
|||
for (var c = -2; c <= 2; c++) { |
|||
|
|||
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; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
}; |
|||
|
|||
proto.setupTypeNumber = function(test) { |
|||
|
|||
var bits = util.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; |
|||
} |
|||
|
|||
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; |
|||
} |
|||
}; |
|||
|
|||
proto.setupTypeInfo = function(test, maskPattern) { |
|||
|
|||
var data = (this.errorCorrectLevel << 3) | maskPattern; |
|||
var bits = util.getBCHTypeInfo(data); |
|||
|
|||
// 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; |
|||
} |
|||
} |
|||
|
|||
// horizontal
|
|||
for (var i = 0; i < 15; i++) { |
|||
|
|||
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; |
|||
} |
|||
} |
|||
|
|||
// fixed module
|
|||
this.modules[this.moduleCount - 8][8] = (!test); |
|||
}; |
|||
|
|||
proto.mapData = function(data, maskPattern) { |
|||
|
|||
var inc = -1; |
|||
var row = this.moduleCount - 1; |
|||
var bitIndex = 7; |
|||
var byteIndex = 0; |
|||
|
|||
for (var col = this.moduleCount - 1; col > 0; col -= 2) { |
|||
|
|||
if (col == 6) col--; |
|||
|
|||
while (true) { |
|||
|
|||
for (var c = 0; c < 2; c++) { |
|||
|
|||
if (this.modules[row][col - c] == null) { |
|||
|
|||
var dark = false; |
|||
|
|||
if (byteIndex < data.length) { |
|||
dark = ( ( (data[byteIndex] >>> bitIndex) & 1) == 1); |
|||
} |
|||
|
|||
var mask = util.getMask(maskPattern, row, col - c); |
|||
|
|||
if (mask) { |
|||
dark = !dark; |
|||
} |
|||
|
|||
this.modules[row][col - c] = dark; |
|||
bitIndex--; |
|||
|
|||
if (bitIndex == -1) { |
|||
byteIndex++; |
|||
bitIndex = 7; |
|||
} |
|||
} |
|||
} |
|||
|
|||
row += inc; |
|||
|
|||
if (row < 0 || this.moduleCount <= row) { |
|||
row -= inc; |
|||
inc = -inc; |
|||
break; |
|||
} |
|||
} |
|||
} |
|||
}; |
|||
|
|||
QRCode.PAD0 = 0xEC; |
|||
QRCode.PAD1 = 0x11; |
|||
|
|||
QRCode.createData = function(typeNumber, errorCorrectLevel, dataList) { |
|||
|
|||
var rsBlocks = RSBlock.getRSBlocks(typeNumber, errorCorrectLevel); |
|||
|
|||
var buffer = new BitBuffer(); |
|||
|
|||
for (var i = 0; i < dataList.length; i++) { |
|||
var data = dataList[i]; |
|||
buffer.put(data.mode, 4); |
|||
buffer.put(data.getLength(), util.getLengthInBits(data.mode, typeNumber) ); |
|||
data.write(buffer); |
|||
} |
|||
|
|||
// calc num max data.
|
|||
var totalDataCount = 0; |
|||
for (var i = 0; i < rsBlocks.length; i++) { |
|||
totalDataCount += rsBlocks[i].dataCount; |
|||
} |
|||
|
|||
if (buffer.getLengthInBits() > totalDataCount * 8) { |
|||
throw new Error("code length overflow. (" |
|||
+ buffer.getLengthInBits() |
|||
+ ">" |
|||
+ totalDataCount * 8 |
|||
+ ")"); |
|||
} |
|||
|
|||
// end code
|
|||
if (buffer.getLengthInBits() + 4 <= totalDataCount * 8) { |
|||
buffer.put(0, 4); |
|||
} |
|||
|
|||
// padding
|
|||
while (buffer.getLengthInBits() % 8 != 0) { |
|||
buffer.putBit(false); |
|||
} |
|||
|
|||
// padding
|
|||
while (true) { |
|||
|
|||
if (buffer.getLengthInBits() >= totalDataCount * 8) { |
|||
break; |
|||
} |
|||
buffer.put(QRCode.PAD0, 8); |
|||
|
|||
if (buffer.getLengthInBits() >= totalDataCount * 8) { |
|||
break; |
|||
} |
|||
buffer.put(QRCode.PAD1, 8); |
|||
} |
|||
|
|||
return QRCode.createBytes(buffer, rsBlocks); |
|||
}; |
|||
|
|||
QRCode.createBytes = function(buffer, rsBlocks) { |
|||
|
|||
var offset = 0; |
|||
|
|||
var maxDcCount = 0; |
|||
var maxEcCount = 0; |
|||
|
|||
var dcdata = new Array(rsBlocks.length); |
|||
var ecdata = new Array(rsBlocks.length); |
|||
|
|||
for (var r = 0; r < rsBlocks.length; r++) { |
|||
|
|||
var dcCount = rsBlocks[r].dataCount; |
|||
var ecCount = rsBlocks[r].totalCount - dcCount; |
|||
|
|||
maxDcCount = Math.max(maxDcCount, dcCount); |
|||
maxEcCount = Math.max(maxEcCount, ecCount); |
|||
|
|||
dcdata[r] = new Array(dcCount); |
|||
|
|||
for (var i = 0; i < dcdata[r].length; i++) { |
|||
dcdata[r][i] = 0xff & buffer.buffer[i + offset]; |
|||
} |
|||
offset += dcCount; |
|||
|
|||
var rsPoly = util.getErrorCorrectPolynomial(ecCount); |
|||
var rawPoly = new Polynomial(dcdata[r], rsPoly.getLength() - 1); |
|||
|
|||
var modPoly = rawPoly.mod(rsPoly); |
|||
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; |
|||
} |
|||
|
|||
} |
|||
|
|||
var totalCodeCount = 0; |
|||
for (var i = 0; i < rsBlocks.length; i++) { |
|||
totalCodeCount += rsBlocks[i].totalCount; |
|||
} |
|||
|
|||
var data = new Array(totalCodeCount); |
|||
var index = 0; |
|||
|
|||
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]; |
|||
} |
|||
} |
|||
} |
|||
|
|||
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]; |
|||
} |
|||
} |
|||
} |
|||
|
|||
return data; |
|||
}; |
|||
|
|||
module.exports = QRCode; |
|||
|
|||
@ -1,299 +0,0 @@ |
|||
// ErrorCorrectLevel
|
|||
var ECL = require('./ErrorCorrectLevel'); |
|||
|
|||
function QRRSBlock(totalCount, dataCount) { |
|||
this.totalCount = totalCount; |
|||
this.dataCount = dataCount; |
|||
} |
|||
|
|||
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] |
|||
]; |
|||
|
|||
QRRSBlock.getRSBlocks = function(typeNumber, errorCorrectLevel) { |
|||
|
|||
var rsBlock = QRRSBlock.getRsBlockTable(typeNumber, errorCorrectLevel); |
|||
|
|||
if (rsBlock == undefined) { |
|||
throw new Error("bad rs block @ typeNumber:" + typeNumber + "/errorCorrectLevel:" + errorCorrectLevel); |
|||
} |
|||
|
|||
var length = rsBlock.length / 3; |
|||
|
|||
var list = new Array(); |
|||
|
|||
for (var i = 0; i < length; i++) { |
|||
|
|||
var count = rsBlock[i * 3 + 0]; |
|||
var totalCount = rsBlock[i * 3 + 1]; |
|||
var dataCount = rsBlock[i * 3 + 2]; |
|||
|
|||
for (var j = 0; j < count; j++) { |
|||
list.push(new QRRSBlock(totalCount, dataCount) ); |
|||
} |
|||
} |
|||
|
|||
return list; |
|||
} |
|||
|
|||
QRRSBlock.getRsBlockTable = function(typeNumber, errorCorrectLevel) { |
|||
|
|||
switch(errorCorrectLevel) { |
|||
case ECL.L : |
|||
return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 0]; |
|||
case ECL.M : |
|||
return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 1]; |
|||
case ECL.Q : |
|||
return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 2]; |
|||
case ECL.H : |
|||
return QRRSBlock.RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 3]; |
|||
default : |
|||
return undefined; |
|||
} |
|||
} |
|||
|
|||
module.exports = QRRSBlock; |
|||
@ -1,44 +0,0 @@ |
|||
var QRMath = { |
|||
|
|||
glog : function(n) { |
|||
|
|||
if (n < 1) { |
|||
throw new Error("glog(" + n + ")"); |
|||
} |
|||
|
|||
return QRMath.LOG_TABLE[n]; |
|||
}, |
|||
|
|||
gexp : function(n) { |
|||
|
|||
while (n < 0) { |
|||
n += 255; |
|||
} |
|||
|
|||
while (n >= 256) { |
|||
n -= 255; |
|||
} |
|||
|
|||
return QRMath.EXP_TABLE[n]; |
|||
}, |
|||
|
|||
EXP_TABLE : new Array(256), |
|||
|
|||
LOG_TABLE : new Array(256) |
|||
|
|||
}; |
|||
|
|||
for (var i = 0; i < 8; i++) { |
|||
QRMath.EXP_TABLE[i] = 1 << i; |
|||
} |
|||
for (var i = 8; i < 256; i++) { |
|||
QRMath.EXP_TABLE[i] = QRMath.EXP_TABLE[i - 4] |
|||
^ QRMath.EXP_TABLE[i - 5] |
|||
^ QRMath.EXP_TABLE[i - 6] |
|||
^ QRMath.EXP_TABLE[i - 8]; |
|||
} |
|||
for (var i = 0; i < 255; i++) { |
|||
QRMath.LOG_TABLE[QRMath.EXP_TABLE[i] ] = i; |
|||
} |
|||
|
|||
module.exports = QRMath; |
|||
@ -1,6 +0,0 @@ |
|||
module.exports = { |
|||
MODE_NUMBER : 1 << 0, |
|||
MODE_ALPHA_NUM : 1 << 1, |
|||
MODE_8BIT_BYTE : 1 << 2, |
|||
MODE_KANJI : 1 << 3 |
|||
}; |
|||
@ -1,279 +0,0 @@ |
|||
var Mode = require('./mode'); |
|||
var Polynomial = require('./Polynomial'); |
|||
var math = require('./math'); |
|||
|
|||
var QRMaskPattern = { |
|||
PATTERN000 : 0, |
|||
PATTERN001 : 1, |
|||
PATTERN010 : 2, |
|||
PATTERN011 : 3, |
|||
PATTERN100 : 4, |
|||
PATTERN101 : 5, |
|||
PATTERN110 : 6, |
|||
PATTERN111 : 7 |
|||
}; |
|||
|
|||
var QRUtil = { |
|||
|
|||
PATTERN_POSITION_TABLE : [ |
|||
[], |
|||
[6, 18], |
|||
[6, 22], |
|||
[6, 26], |
|||
[6, 30], |
|||
[6, 34], |
|||
[6, 22, 38], |
|||
[6, 24, 42], |
|||
[6, 26, 46], |
|||
[6, 28, 50], |
|||
[6, 30, 54], |
|||
[6, 32, 58], |
|||
[6, 34, 62], |
|||
[6, 26, 46, 66], |
|||
[6, 26, 48, 70], |
|||
[6, 26, 50, 74], |
|||
[6, 30, 54, 78], |
|||
[6, 30, 56, 82], |
|||
[6, 30, 58, 86], |
|||
[6, 34, 62, 90], |
|||
[6, 28, 50, 72, 94], |
|||
[6, 26, 50, 74, 98], |
|||
[6, 30, 54, 78, 102], |
|||
[6, 28, 54, 80, 106], |
|||
[6, 32, 58, 84, 110], |
|||
[6, 30, 58, 86, 114], |
|||
[6, 34, 62, 90, 118], |
|||
[6, 26, 50, 74, 98, 122], |
|||
[6, 30, 54, 78, 102, 126], |
|||
[6, 26, 52, 78, 104, 130], |
|||
[6, 30, 56, 82, 108, 134], |
|||
[6, 34, 60, 86, 112, 138], |
|||
[6, 30, 58, 86, 114, 142], |
|||
[6, 34, 62, 90, 118, 146], |
|||
[6, 30, 54, 78, 102, 126, 150], |
|||
[6, 24, 50, 76, 102, 128, 154], |
|||
[6, 28, 54, 80, 106, 132, 158], |
|||
[6, 32, 58, 84, 110, 136, 162], |
|||
[6, 26, 54, 82, 110, 138, 166], |
|||
[6, 30, 58, 86, 114, 142, 170] |
|||
], |
|||
|
|||
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), |
|||
|
|||
getBCHTypeInfo : function(data) { |
|||
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) { |
|||
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) { |
|||
return QRUtil.PATTERN_POSITION_TABLE[typeNumber - 1]; |
|||
}, |
|||
|
|||
getMask : function(maskPattern, i, j) { |
|||
|
|||
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; |
|||
|
|||
default : |
|||
throw new Error("bad maskPattern:" + maskPattern); |
|||
} |
|||
}, |
|||
|
|||
getErrorCorrectPolynomial : function(errorCorrectLength) { |
|||
|
|||
var a = new Polynomial([1], 0); |
|||
|
|||
for (var i = 0; i < errorCorrectLength; i++) { |
|||
a = a.multiply(new Polynomial([1, math.gexp(i)], 0) ); |
|||
} |
|||
|
|||
return a; |
|||
}, |
|||
|
|||
getLengthInBits : function(mode, type) { |
|||
|
|||
if (1 <= type && type < 10) { |
|||
|
|||
// 1 - 9
|
|||
|
|||
switch(mode) { |
|||
case Mode.MODE_NUMBER : return 10; |
|||
case Mode.MODE_ALPHA_NUM : return 9; |
|||
case Mode.MODE_8BIT_BYTE : return 8; |
|||
case Mode.MODE_KANJI : return 8; |
|||
default : |
|||
throw new Error("mode:" + mode); |
|||
} |
|||
|
|||
} else if (type < 27) { |
|||
|
|||
// 10 - 26
|
|||
|
|||
switch(mode) { |
|||
case Mode.MODE_NUMBER : return 12; |
|||
case Mode.MODE_ALPHA_NUM : return 11; |
|||
case Mode.MODE_8BIT_BYTE : return 16; |
|||
case Mode.MODE_KANJI : return 10; |
|||
default : |
|||
throw new Error("mode:" + mode); |
|||
} |
|||
|
|||
} else if (type < 41) { |
|||
|
|||
// 27 - 40
|
|||
|
|||
switch(mode) { |
|||
case Mode.MODE_NUMBER : return 14; |
|||
case Mode.MODE_ALPHA_NUM : return 13; |
|||
case Mode.MODE_8BIT_BYTE : return 16; |
|||
case Mode.MODE_KANJI : return 12; |
|||
default : |
|||
throw new Error("mode:" + mode); |
|||
} |
|||
|
|||
} else { |
|||
throw new Error("type:" + type); |
|||
} |
|||
}, |
|||
|
|||
getLostPoint : function(qrCode) { |
|||
|
|||
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); |
|||
|
|||
for (var r = -1; r <= 1; r++) { |
|||
|
|||
if (row + r < 0 || moduleCount <= row + r) { |
|||
continue; |
|||
} |
|||
|
|||
for (var c = -1; c <= 1; c++) { |
|||
|
|||
if (col + c < 0 || moduleCount <= col + c) { |
|||
continue; |
|||
} |
|||
|
|||
if (r == 0 && c == 0) { |
|||
continue; |
|||
} |
|||
|
|||
if (dark == qrCode.isDark(row + r, col + c) ) { |
|||
sameCount++; |
|||
} |
|||
} |
|||
} |
|||
|
|||
if (sameCount > 5) { |
|||
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 (count == 0 || count == 4) { |
|||
lostPoint += 3; |
|||
} |
|||
} |
|||
} |
|||
|
|||
// LEVEL3
|
|||
|
|||
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) ) { |
|||
lostPoint += 40; |
|||
} |
|||
} |
|||
} |
|||
|
|||
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) ) { |
|||
lostPoint += 40; |
|||
} |
|||
} |
|||
} |
|||
|
|||
// LEVEL4
|
|||
|
|||
var darkCount = 0; |
|||
|
|||
for (var col = 0; col < moduleCount; col++) { |
|||
for (var row = 0; row < moduleCount; row++) { |
|||
if (qrCode.isDark(row, col) ) { |
|||
darkCount++; |
|||
} |
|||
} |
|||
} |
|||
|
|||
var ratio = Math.abs(100 * darkCount / moduleCount / moduleCount - 50) / 5; |
|||
lostPoint += ratio * 10; |
|||
|
|||
return lostPoint; |
|||
} |
|||
}; |
|||
|
|||
module.exports = QRUtil; |
|||
@ -1,84 +0,0 @@ |
|||
// pages/home/qrcode/index.js
|
|||
import { getBaseInfo } from "../../api/saas" |
|||
const util = require('../../../utils/util') |
|||
const app = getApp() |
|||
|
|||
Page({ |
|||
/** |
|||
* 页面的初始数据 |
|||
*/ |
|||
data: { |
|||
fgColor: 'black', |
|||
userInfo: null, |
|||
avatarUrl: null, |
|||
screenBrightness: '' |
|||
}, |
|||
|
|||
/** |
|||
* 生命周期函数--监听页面加载 |
|||
*/ |
|||
onLoad: function (options) { |
|||
this.fetchUserInfo() |
|||
var that = this |
|||
// 获取屏幕亮度
|
|||
wx.getScreenBrightness({ |
|||
success: function (res) { |
|||
that.setData({ |
|||
screenBrightness: res.value |
|||
}) |
|||
} |
|||
}) |
|||
//设置屏幕亮度
|
|||
wx.setScreenBrightness({ |
|||
value: 1, //屏幕亮度值,范围 0~1,0 最暗,1 最亮
|
|||
}) |
|||
}, |
|||
|
|||
fetchUserInfo: function () { |
|||
getBaseInfo().then(result => { |
|||
app.globalData.userInfo = result.data |
|||
if (!this.data.avatarUrl) { |
|||
this.setData({ |
|||
avatarUrl: util.isEmpty(app.globalData.userInfo.avatar) ? '/assets/image/ygImg.png' : app.globalData.userInfo.avatar, |
|||
userInfo: app.globalData.userInfo, |
|||
value: app.globalData.userInfo.userId, |
|||
userName: app.globalData.userInfo.userName.substring(0, 14) |
|||
}) |
|||
} else { |
|||
this.setData({ |
|||
userInfo: app.globalData.userInfo, |
|||
value: app.globalData.userInfo.userId, |
|||
userName: app.globalData.userInfo.userName.substring(0, 14) |
|||
}) |
|||
} |
|||
}).catch((e) => { |
|||
|
|||
}) |
|||
}, |
|||
|
|||
previewImage: function() { |
|||
// 在自定义组件下,当前组件实例的 this,以操作组件内 <canvas> 组件
|
|||
const that = this.selectComponent('#qrcode') |
|||
wx.canvasToTempFilePath({ |
|||
canvasId: 'wux-qrcode', |
|||
success: (res) => { |
|||
wx.previewImage({ |
|||
urls: [res.tempFilePath] |
|||
}) |
|||
} |
|||
}, that) |
|||
}, |
|||
toCardInfo: function(){ |
|||
wx.navigateTo({ |
|||
url: '/pages/home/instructions/index' |
|||
}) |
|||
}, |
|||
// 监听页面卸载
|
|||
onUnload: function () { |
|||
//设置屏幕亮度为原来亮度
|
|||
wx.setScreenBrightness({ |
|||
value: this.data.screenBrightness, |
|||
}) |
|||
} |
|||
|
|||
}) |
|||
@ -1,8 +0,0 @@ |
|||
{ |
|||
"usingComponents": { |
|||
"wux-image": "/components/image/index", |
|||
"wux-qrcode": "/components/qrcode/index", |
|||
"wux-cell-group": "/components/cell-group/index", |
|||
"wux-cell": "/components/cell/index" |
|||
} |
|||
} |
|||
@ -1,35 +0,0 @@ |
|||
<!--pages/home/qrcode/index.wxml--> |
|||
<cu-custom bgColor="bg-white" isBack="{{true}}"> |
|||
<view slot="content">电子卡</view> |
|||
</cu-custom> |
|||
|
|||
<view class="content-box" style="padding:48rpx"> |
|||
<view class="header-box" style="padding:24rpx 48rpx" wx:if="{{userInfo}}"> |
|||
<view class="flex"> |
|||
<wux-image width="{{45}}" height="{{45}}" wux-class="image" shape="circle" src="{{avatarUrl}}" /> |
|||
<view class="flex flex-column flex-center" style="margin-left:24rpx;align-items:flex-start"> |
|||
<view class="flex flex-center"> |
|||
<text style="white-space: nowrap">{{userName || ''}}</text> |
|||
</view> |
|||
<view class="flex flex-center" style="font-size:13px" catchtap="toAuthor"> |
|||
<image class="img-auth2" src="{{userInfo.isAuth == 1 ? '/assets/image/icon_author.png' : '/assets/image/icon_unauthor.png'}}"></image> |
|||
<text class="{{userInfo.isAuth == 1 ? 'text-blue' : 'text-gray'}}">{{userInfo.isAuth == 1 ? '已认证' : '未实名认证'}}</text> |
|||
<text class="text-yellow" style="font-size:14px;padding:4px;" wx:if="{{userInfo.isAuth != 1 && userInfo.userType == 1}}">去认证</text> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
<view class="flex flex-center" style="margin:24rpx 0rpx"> |
|||
<wux-qrcode id="qrcode" wux-class="qrcode" data="{{ value }}" fg-color="{{ fgColor }}" width="260" height="260" bind:click="previewImage" /> |
|||
</view> |
|||
</view> |
|||
|
|||
</view> |
|||
|
|||
<view class="cu-list menu card-menu sm-border" style="margin:0rpx 48rpx"> |
|||
<view class="cu-item arrow" bindtap="toCardInfo"> |
|||
<view class="flex content cu-item arrow"> |
|||
<text class="cuIcon-infofill md-icon" style="font-size:16px;"></text> |
|||
<text class="contentText">电子卡说明</text> |
|||
</view> |
|||
</view> |
|||
</view> |
|||
@ -1,42 +0,0 @@ |
|||
/* pages/home/qrcode/index.wxss */ |
|||
.header-box { |
|||
width: 100%; |
|||
background: rgba(255, 255, 255, 1); |
|||
box-shadow: 0px 0px 15px -6px rgba(0, 0, 0, 0.32); |
|||
border-radius: 6px; |
|||
} |
|||
|
|||
.userinfo-avatar { |
|||
overflow: hidden; |
|||
width: 120rpx; |
|||
height: 120rpx; |
|||
border-radius: 12rpx; |
|||
border: 2px solid #fff; |
|||
box-shadow: 3px 3px 10px rgba(0, 0, 0, 0.2); |
|||
} |
|||
|
|||
|
|||
.label { |
|||
font-size: 24rpx; |
|||
font-family: PingFang-SC-Regular, PingFang-SC; |
|||
font-weight: 400; |
|||
color: rgba(255, 255, 255, 1); |
|||
} |
|||
|
|||
.img-auth { |
|||
width: 32rpx; |
|||
height: 32rpx; |
|||
margin-left: 24rpx; |
|||
margin-right: 12rpx |
|||
} |
|||
|
|||
.img-auth2 { |
|||
width: 32rpx; |
|||
height: 32rpx; |
|||
margin-right: 12rpx |
|||
} |
|||
|
|||
.realName { |
|||
max-width: 100px; |
|||
white-space: nowrap; |
|||
} |
|||
Write
Preview
Loading…
Cancel
Save