Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
Y
ydLife
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Sweet Zhang
ydLife
Commits
ca277f93
Commit
ca277f93
authored
Jan 02, 2020
by
Sweet Zhang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
二维码增加ICON
parent
19589fbd
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
786 additions
and
32 deletions
+786
-32
src/app/my/mk-material-detail/mk-material-detail.component.html
+2
-2
src/app/my/mk-material-detail/mk-material-detail.component.ts
+59
-27
src/assets/images/icons/yd.jpg
+0
-0
src/assets/js/qrcode.js
+724
-0
src/assets/js/qrcode.min.js
+0
-2
src/index.html
+1
-1
No files found.
src/app/my/mk-material-detail/mk-material-detail.component.html
View file @
ca277f93
<!-- 这个元素用来承载生成的二维码 不显示 -->
<!-- 这个元素用来承载生成的二维码 不显示
style="display: none"
-->
<div
id=
"qrcode"
style=
"display: none"
></div>
<div
id=
"qrcode"
style=
"display: none"
></div>
<!-- 点击这个按钮之后下载图片 -->
<!-- 点击这个按钮之后下载图片 -->
...
@@ -8,4 +8,4 @@
...
@@ -8,4 +8,4 @@
<canvas
id=
"canvas"
#
canvas
></canvas>
<canvas
id=
"canvas"
#
canvas
></canvas>
<!--生成图片-->
<!--生成图片-->
<
!--<img src="" alt="" id="bannerImg" class="img-responsive">--
>
<
img
src=
""
alt=
""
id=
"bannerImg"
class=
"img-responsive"
>
src/app/my/mk-material-detail/mk-material-detail.component.ts
View file @
ca277f93
...
@@ -20,9 +20,9 @@ export class MkMaterialDetailComponent implements OnInit {
...
@@ -20,9 +20,9 @@ export class MkMaterialDetailComponent implements OnInit {
// 二维码宽度
// 二维码宽度
qrcodeWidth
:
number
=
70
;
qrcodeWidth
:
number
=
70
;
qrcodeBgWidth
:
number
=
80
;
qrcodeBgWidth
:
number
=
80
;
qrcodePadding
:
number
=
5
;
qrcodePadding
=
5
;
rightWidth
:
number
=
5
;
rightWidth
=
5
;
bottomHeight
:
number
=
5
;
bottomHeight
=
5
;
constructor
(
private
activateRoute
:
ActivatedRoute
,
constructor
(
private
activateRoute
:
ActivatedRoute
,
private
lifeCommonService
:
LifeCommonService
,
private
lifeCommonService
:
LifeCommonService
,
...
@@ -45,7 +45,8 @@ export class MkMaterialDetailComponent implements OnInit {
...
@@ -45,7 +45,8 @@ export class MkMaterialDetailComponent implements OnInit {
this
.
shareCallBack
();
this
.
shareCallBack
();
}
}
canvasPic
()
{
async
canvasPic
()
{
const
qrcodeUrl
=
await
this
.
qrcode
()
+
''
;
const
canvas
=
this
.
canvas
.
nativeElement
as
HTMLCanvasElement
;
const
canvas
=
this
.
canvas
.
nativeElement
as
HTMLCanvasElement
;
const
ctx
=
canvas
.
getContext
(
'2d'
);
const
ctx
=
canvas
.
getContext
(
'2d'
);
const
ratio
=
this
.
getPixelRatio
(
ctx
);
const
ratio
=
this
.
getPixelRatio
(
ctx
);
...
@@ -55,7 +56,7 @@ export class MkMaterialDetailComponent implements OnInit {
...
@@ -55,7 +56,7 @@ export class MkMaterialDetailComponent implements OnInit {
canvas
.
height
=
H
*
ratio
;
canvas
.
height
=
H
*
ratio
;
canvas
.
style
.
width
=
W
+
'px'
;
canvas
.
style
.
width
=
W
+
'px'
;
canvas
.
style
.
height
=
H
+
'px'
;
canvas
.
style
.
height
=
H
+
'px'
;
const
qr
=
document
.
querySelector
(
'#qrcode'
);
//
const qr = document.querySelector('#qrcode');
const
img
=
new
Image
();
const
img
=
new
Image
();
// 画圆形头像
// 画圆形头像
const
avatarurlWidth
=
50
*
ratio
;
// 绘制的头像宽度
const
avatarurlWidth
=
50
*
ratio
;
// 绘制的头像宽度
...
@@ -79,43 +80,31 @@ export class MkMaterialDetailComponent implements OnInit {
...
@@ -79,43 +80,31 @@ export class MkMaterialDetailComponent implements OnInit {
ctx
.
drawImage
(
avatarImg
,
avatarurlX
,
avatarurlY
,
avatarurlWidth
,
avatarurlHeigth
);
// 推进去图片,必须是https图片
ctx
.
drawImage
(
avatarImg
,
avatarurlX
,
avatarurlY
,
avatarurlWidth
,
avatarurlHeigth
);
// 推进去图片,必须是https图片
ctx
.
restore
();
// 恢复之前保存的绘图上下文 恢复之前保存的绘图上下午即状态 还可以继续绘制
ctx
.
restore
();
// 恢复之前保存的绘图上下文 恢复之前保存的绘图上下午即状态 还可以继续绘制
ctx
.
save
();
ctx
.
save
();
// 对二维码进行初始化
const
qrCode
=
new
QRCode
(
qr
,
{
width
:
100
,
height
:
100
,
colorDark
:
'#000000'
,
colorLight
:
'#ffffff'
,
correctLevel
:
QRCode
.
CorrectLevel
.
H
});
// 为二维码设置内容
qrCode
.
makeCode
(
this
.
shareInfo
.
url
);
// 我们的qrcode生成二维码之后也会有一个canvas对象我们获取到这个元素
const
newCanvas
=
qr
.
firstChild
as
HTMLCanvasElement
;
const
base64
=
newCanvas
.
toDataURL
(
'image/png'
,
1
);
// 这里的image只能在onload里面绘制 在外面就会被覆盖了 因为优先加载完毕就会优先绘制 然后就被之后绘制的海报背景遮挡了
// 这里的image只能在onload里面绘制 在外面就会被覆盖了 因为优先加载完毕就会优先绘制 然后就被之后绘制的海报背景遮挡了
const
shareQr
=
new
Image
();
const
shareQr
=
new
Image
();
// 设置base64编码格式值
shareQr
.
src
=
qrcodeUrl
;
shareQr
.
onload
=
()
=>
{
const
qrcodeBgX
=
document
.
body
.
clientWidth
-
(
this
.
rightWidth
+
this
.
qrcodeBgWidth
);
const
qrcodeBgX
=
document
.
body
.
clientWidth
-
(
this
.
rightWidth
+
this
.
qrcodeBgWidth
);
const
qrcodeBgY
=
document
.
body
.
clientHeight
-
(
this
.
bottomHeight
+
this
.
qrcodeBgWidth
);
const
qrcodeBgY
=
document
.
body
.
clientHeight
-
(
this
.
bottomHeight
+
this
.
qrcodeBgWidth
);
const
qrcodeX
=
qrcodeBgX
+
this
.
qrcodePadding
;
const
qrcodeX
=
qrcodeBgX
+
this
.
qrcodePadding
;
const
qrcodeY
=
qrcodeBgY
+
this
.
qrcodePadding
;
const
qrcodeY
=
qrcodeBgY
+
this
.
qrcodePadding
;
// 设置base64编码格式值
shareQr
.
src
=
base64
;
shareQr
.
onload
=
()
=>
{
ctx
.
save
();
ctx
.
fillStyle
=
'#fff'
;
ctx
.
fillStyle
=
'#fff'
;
ctx
.
fillRect
(
qrcodeBgX
,
qrcodeBgY
,
this
.
qrcodeBgWidth
,
this
.
qrcodeBgWidth
);
ctx
.
fillRect
(
qrcodeBgX
,
qrcodeBgY
,
this
.
qrcodeBgWidth
,
this
.
qrcodeBgWidth
);
ctx
.
save
();
ctx
.
save
();
// 绘制图像 就是绘制二维码到我们自己写的canvas中去
//
//
绘制图像 就是绘制二维码到我们自己写的canvas中去
ctx
.
drawImage
(
shareQr
,
qrcodeX
,
qrcodeY
,
this
.
qrcodeWidth
,
this
.
qrcodeWidth
);
ctx
.
drawImage
(
shareQr
,
qrcodeX
,
qrcodeY
,
this
.
qrcodeWidth
,
this
.
qrcodeWidth
);
document
.
querySelector
(
'#bannerImg'
).
setAttribute
(
'src'
,
canvas
.
toDataURL
(
'image/png'
,
1
));
document
.
querySelector
(
'#bannerImg'
).
setAttribute
(
'src'
,
canvas
.
toDataURL
(
'image/png'
,
1
));
this
.
canvas
.
nativeElement
.
style
.
display
=
'none'
;
this
.
canvas
.
nativeElement
.
style
.
display
=
'none'
;
};
};
// 绘制字体
// 绘制字体
ctx
.
fillStyle
=
'#000'
;
ctx
.
fillStyle
=
'#000'
;
ctx
.
font
=
`bold
${
15
*
ratio
}
px 微软雅黑`
;
ctx
.
font
=
`
${
12
*
ratio
}
px 微软雅黑`
;
ctx
.
fillText
(
`银盾保险经纪
${
this
.
lifeCustomerInfo
.
practitionerBasicInfo
.
name
}
`
,
75
*
ratio
,
avatarurlY
+
15
*
ratio
);
// Y指的是文字底部的位置
ctx
.
fillText
(
`
${
this
.
lifeCustomerInfo
.
practitionerBasicInfo
.
name
}
`
,
75
*
ratio
,
avatarurlY
+
15
*
ratio
);
// Y指的是文字底部的位置
ctx
.
fillText
(
`手机号:
${
this
.
lifeCustomerInfo
.
mobileNo
}
`
,
75
*
ratio
,
avatarurlY
+
45
*
ratio
);
ctx
.
fillText
(
`银盾保险经纪`
,
75
*
ratio
,
avatarurlY
+
30
*
ratio
);
// Y指的是文字底部的位置
ctx
.
fillText
(
`
${
this
.
lifeCustomerInfo
.
mobileNo
}
`
,
75
*
ratio
,
avatarurlY
+
45
*
ratio
);
ctx
.
scale
(
ratio
,
ratio
);
ctx
.
scale
(
ratio
,
ratio
);
};
};
}
}
...
@@ -142,13 +131,56 @@ export class MkMaterialDetailComponent implements OnInit {
...
@@ -142,13 +131,56 @@ export class MkMaterialDetailComponent implements OnInit {
});
});
}
}
download
(
canvas
)
{
download
()
{
const
a
=
document
.
createElement
(
'a'
);
const
a
=
document
.
createElement
(
'a'
);
// 设置地址
// 设置地址
const
canvas
=
document
.
querySelector
(
'#qrcode canvas'
)
as
HTMLCanvasElement
;
a
.
href
=
canvas
.
toDataURL
(
'image/png'
,
1
);
a
.
href
=
canvas
.
toDataURL
(
'image/png'
,
1
);
// 设置下载名称
// 设置下载名称
a
.
download
=
'银盾保险经纪'
;
a
.
download
=
'银盾保险经纪'
;
// 触发点击事件
// 触发点击事件
a
.
click
();
a
.
click
();
}
}
qrcode
()
{
return
new
Promise
((
resolve
,
reject
)
=>
{
const
qr
=
document
.
querySelector
(
'#qrcode'
);
// 对二维码进行初始化
const
qrCode
=
new
QRCode
(
qr
,
{
// 二维码内容
text
:
`
${
this
.
shareInfo
.
url
}
`
,
// 二维码宽度
width
:
100
,
// 二维码高度
height
:
100
,
// 二维码前景色
colorDark
:
'#000'
,
// 二维码背景色
colorLight
:
'#fff'
,
/*!
容错级别,可设置为:
QRCode.CorrectLevel.L
QRCode.CorrectLevel.M
QRCode.CorrectLevel.Q
QRCode.CorrectLevel.H
*/
correctLevel
:
QRCode
.
CorrectLevel
.
H
,
// 二维码中心图片
iconSrc
:
`./assets/images/icons/yd.jpg`
,
// 二维码中心图片边框弧度
iconRadius
:
6
,
// 二维码中心图片边框宽度
iconBorderWidth
:
5
,
// 二维码中心图片边框颜色
iconBorderColor
:
'#fff'
,
});
// 我们的qrcode生成二维码之后也会有一个canvas对象我们获取到这个元素
// 这里的image只能在onload里面绘制 在外面就会被覆盖了 因为优先加载完毕就会优先绘制 然后就被之后绘制的海报背景遮挡了
setTimeout
(()
=>
{
const
newCanvas
=
document
.
querySelector
(
'#qrcode canvas'
)
as
HTMLCanvasElement
;
const
qrcodeUrl
=
newCanvas
.
toDataURL
(
'image/png'
,
1
);
resolve
(
qrcodeUrl
);
},
100
)
});
}
}
}
src/assets/images/icons/yd.jpg
0 → 100644
View file @
ca277f93
38.1 KB
src/assets/js/qrcode.js
0 → 100644
View file @
ca277f93
/**
* @fileoverview
* - Using the 'QRCode for Javascript library'
* - Fixed dataset of 'QRCode for Javascript library' for support full-spec.
* - this library has no dependencies.
*
* @author davidshimjs
* @see <a href="http://www.d-project.com/" target="_blank">http://www.d-project.com/</a>
* @see <a href="http://jeromeetienne.github.com/jquery-qrcode/" target="_blank">http://jeromeetienne.github.com/jquery-qrcode/</a>
*/
var
QRCode
;
(
function
()
{
//---------------------------------------------------------------------
// QRCode 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
//
// The word "QR Code" is registered trademark of
// DENSO WAVE INCORPORATED
// http://www.denso-wave.com/qrcode/faqpatent-e.html
//
//---------------------------------------------------------------------
function
QR8bitByte
(
data
)
{
this
.
mode
=
QRMode
.
MODE_8BIT_BYTE
;
this
.
data
=
data
;
this
.
parsedData
=
[];
// Added to support UTF-8 Characters
for
(
var
i
=
0
,
l
=
this
.
data
.
length
;
i
<
l
;
i
++
)
{
var
byteArray
=
[];
var
code
=
this
.
data
.
charCodeAt
(
i
);
if
(
code
>
0x10000
)
{
byteArray
[
0
]
=
0xF0
|
((
code
&
0x1C0000
)
>>>
18
);
byteArray
[
1
]
=
0x80
|
((
code
&
0x3F000
)
>>>
12
);
byteArray
[
2
]
=
0x80
|
((
code
&
0xFC0
)
>>>
6
);
byteArray
[
3
]
=
0x80
|
(
code
&
0x3F
);
}
else
if
(
code
>
0x800
)
{
byteArray
[
0
]
=
0xE0
|
((
code
&
0xF000
)
>>>
12
);
byteArray
[
1
]
=
0x80
|
((
code
&
0xFC0
)
>>>
6
);
byteArray
[
2
]
=
0x80
|
(
code
&
0x3F
);
}
else
if
(
code
>
0x80
)
{
byteArray
[
0
]
=
0xC0
|
((
code
&
0x7C0
)
>>>
6
);
byteArray
[
1
]
=
0x80
|
(
code
&
0x3F
);
}
else
{
byteArray
[
0
]
=
code
;
}
this
.
parsedData
.
push
(
byteArray
);
}
this
.
parsedData
=
Array
.
prototype
.
concat
.
apply
([],
this
.
parsedData
);
if
(
this
.
parsedData
.
length
!=
this
.
data
.
length
)
{
this
.
parsedData
.
unshift
(
191
);
this
.
parsedData
.
unshift
(
187
);
this
.
parsedData
.
unshift
(
239
);
}
}
QR8bitByte
.
prototype
=
{
getLength
:
function
(
buffer
)
{
return
this
.
parsedData
.
length
;
},
write
:
function
(
buffer
)
{
for
(
var
i
=
0
,
l
=
this
.
parsedData
.
length
;
i
<
l
;
i
++
)
{
buffer
.
put
(
this
.
parsedData
[
i
],
8
);
}
}
};
function
QRCodeModel
(
typeNumber
,
errorCorrectLevel
)
{
this
.
typeNumber
=
typeNumber
;
this
.
errorCorrectLevel
=
errorCorrectLevel
;
this
.
modules
=
null
;
this
.
moduleCount
=
0
;
this
.
dataCache
=
null
;
this
.
dataList
=
[];
}
QRCodeModel
.
prototype
=
{
addData
:
function
(
data
){
var
newData
=
new
QR8bitByte
(
data
);
this
.
dataList
.
push
(
newData
);
this
.
dataCache
=
null
;},
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
];},
getModuleCount
:
function
(){
return
this
.
moduleCount
;},
make
:
function
(){
this
.
makeImpl
(
false
,
this
.
getBestMaskPattern
());},
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
;}}
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
=
QRCodeModel
.
createData
(
this
.
typeNumber
,
this
.
errorCorrectLevel
,
this
.
dataList
);}
this
.
mapData
(
this
.
dataCache
,
maskPattern
);},
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
;}}}},
getBestMaskPattern
:
function
(){
var
minLostPoint
=
0
;
var
pattern
=
0
;
for
(
var
i
=
0
;
i
<
8
;
i
++
){
this
.
makeImpl
(
true
,
i
);
var
lostPoint
=
QRUtil
.
getLostPoint
(
this
);
if
(
i
==
0
||
minLostPoint
>
lostPoint
){
minLostPoint
=
lostPoint
;
pattern
=
i
;}}
return
pattern
;},
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
;},
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
);}},
setupPositionAdjustPattern
:
function
(){
var
pos
=
QRUtil
.
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
;}}}}}},
setupTypeNumber
:
function
(
test
){
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
;}
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
;}},
setupTypeInfo
:
function
(
test
,
maskPattern
){
var
data
=
(
this
.
errorCorrectLevel
<<
3
)
|
maskPattern
;
var
bits
=
QRUtil
.
getBCHTypeInfo
(
data
);
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
;}}
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
;}}
this
.
modules
[
this
.
moduleCount
-
8
][
8
]
=
(
!
test
);},
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
=
QRUtil
.
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
;}}}}};
QRCodeModel
.
PAD0
=
0xEC
;
QRCodeModel
.
PAD1
=
0x11
;
QRCodeModel
.
createData
=
function
(
typeNumber
,
errorCorrectLevel
,
dataList
){
var
rsBlocks
=
QRRSBlock
.
getRSBlocks
(
typeNumber
,
errorCorrectLevel
);
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
));
data
.
write
(
buffer
);}
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
+
")"
);}
if
(
buffer
.
getLengthInBits
()
+
4
<=
totalDataCount
*
8
){
buffer
.
put
(
0
,
4
);}
while
(
buffer
.
getLengthInBits
()
%
8
!=
0
){
buffer
.
putBit
(
false
);}
while
(
true
){
if
(
buffer
.
getLengthInBits
()
>=
totalDataCount
*
8
){
break
;}
buffer
.
put
(
QRCodeModel
.
PAD0
,
8
);
if
(
buffer
.
getLengthInBits
()
>=
totalDataCount
*
8
){
break
;}
buffer
.
put
(
QRCodeModel
.
PAD1
,
8
);}
return
QRCodeModel
.
createBytes
(
buffer
,
rsBlocks
);};
QRCodeModel
.
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
=
QRUtil
.
getErrorCorrectPolynomial
(
ecCount
);
var
rawPoly
=
new
QRPolynomial
(
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
;};
var
QRMode
=
{
MODE_NUMBER
:
1
<<
0
,
MODE_ALPHA_NUM
:
1
<<
1
,
MODE_8BIT_BYTE
:
1
<<
2
,
MODE_KANJI
:
1
<<
3
};
var
QRErrorCorrectLevel
=
{
L
:
1
,
M
:
0
,
Q
:
3
,
H
:
2
};
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
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
){
if
(
1
<=
type
&&
type
<
10
){
switch
(
mode
){
case
QRMode
.
MODE_NUMBER
:
return
10
;
case
QRMode
.
MODE_ALPHA_NUM
:
return
9
;
case
QRMode
.
MODE_8BIT_BYTE
:
return
8
;
case
QRMode
.
MODE_KANJI
:
return
8
;
default
:
throw
new
Error
(
"mode:"
+
mode
);}}
else
if
(
type
<
27
){
switch
(
mode
){
case
QRMode
.
MODE_NUMBER
:
return
12
;
case
QRMode
.
MODE_ALPHA_NUM
:
return
11
;
case
QRMode
.
MODE_8BIT_BYTE
:
return
16
;
case
QRMode
.
MODE_KANJI
:
return
10
;
default
:
throw
new
Error
(
"mode:"
+
mode
);}}
else
if
(
type
<
41
){
switch
(
mode
){
case
QRMode
.
MODE_NUMBER
:
return
14
;
case
QRMode
.
MODE_ALPHA_NUM
:
return
13
;
case
QRMode
.
MODE_8BIT_BYTE
:
return
16
;
case
QRMode
.
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
;
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
);}}}
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
;}}}
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
;}}}
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
;}};
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
;}
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
]
^=
QRMath
.
gexp
(
QRMath
.
glog
(
this
.
get
(
i
))
+
QRMath
.
glog
(
e
.
get
(
j
)));}}
return
new
QRPolynomial
(
num
,
0
);},
mod
:
function
(
e
){
if
(
this
.
getLength
()
-
e
.
getLength
()
<
0
){
return
this
;}
var
ratio
=
QRMath
.
glog
(
this
.
get
(
0
))
-
QRMath
.
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
]
^=
QRMath
.
gexp
(
QRMath
.
glog
(
e
.
get
(
i
))
+
ratio
);}
return
new
QRPolynomial
(
num
,
0
).
mod
(
e
);}};
function
QRRSBlock
(
totalCount
,
dataCount
){
this
.
totalCount
=
totalCount
;
this
.
dataCount
=
dataCount
;}
QRRSBlock
.
RS_BLOCK_TABLE
=
[[
1
,
26
,
19
],[
1
,
26
,
16
],[
1
,
26
,
13
],[
1
,
26
,
9
],[
1
,
44
,
34
],[
1
,
44
,
28
],[
1
,
44
,
22
],[
1
,
44
,
16
],[
1
,
70
,
55
],[
1
,
70
,
44
],[
2
,
35
,
17
],[
2
,
35
,
13
],[
1
,
100
,
80
],[
2
,
50
,
32
],[
2
,
50
,
24
],[
4
,
25
,
9
],[
1
,
134
,
108
],[
2
,
67
,
43
],[
2
,
33
,
15
,
2
,
34
,
16
],[
2
,
33
,
11
,
2
,
34
,
12
],[
2
,
86
,
68
],[
4
,
43
,
27
],[
4
,
43
,
19
],[
4
,
43
,
15
],[
2
,
98
,
78
],[
4
,
49
,
31
],[
2
,
32
,
14
,
4
,
33
,
15
],[
4
,
39
,
13
,
1
,
40
,
14
],[
2
,
121
,
97
],[
2
,
60
,
38
,
2
,
61
,
39
],[
4
,
40
,
18
,
2
,
41
,
19
],[
4
,
40
,
14
,
2
,
41
,
15
],[
2
,
146
,
116
],[
3
,
58
,
36
,
2
,
59
,
37
],[
4
,
36
,
16
,
4
,
37
,
17
],[
4
,
36
,
12
,
4
,
37
,
13
],[
2
,
86
,
68
,
2
,
87
,
69
],[
4
,
69
,
43
,
1
,
70
,
44
],[
6
,
43
,
19
,
2
,
44
,
20
],[
6
,
43
,
15
,
2
,
44
,
16
],[
4
,
101
,
81
],[
1
,
80
,
50
,
4
,
81
,
51
],[
4
,
50
,
22
,
4
,
51
,
23
],[
3
,
36
,
12
,
8
,
37
,
13
],[
2
,
116
,
92
,
2
,
117
,
93
],[
6
,
58
,
36
,
2
,
59
,
37
],[
4
,
46
,
20
,
6
,
47
,
21
],[
7
,
42
,
14
,
4
,
43
,
15
],[
4
,
133
,
107
],[
8
,
59
,
37
,
1
,
60
,
38
],[
8
,
44
,
20
,
4
,
45
,
21
],[
12
,
33
,
11
,
4
,
34
,
12
],[
3
,
145
,
115
,
1
,
146
,
116
],[
4
,
64
,
40
,
5
,
65
,
41
],[
11
,
36
,
16
,
5
,
37
,
17
],[
11
,
36
,
12
,
5
,
37
,
13
],[
5
,
109
,
87
,
1
,
110
,
88
],[
5
,
65
,
41
,
5
,
66
,
42
],[
5
,
54
,
24
,
7
,
55
,
25
],[
11
,
36
,
12
],[
5
,
122
,
98
,
1
,
123
,
99
],[
7
,
73
,
45
,
3
,
74
,
46
],[
15
,
43
,
19
,
2
,
44
,
20
],[
3
,
45
,
15
,
13
,
46
,
16
],[
1
,
135
,
107
,
5
,
136
,
108
],[
10
,
74
,
46
,
1
,
75
,
47
],[
1
,
50
,
22
,
15
,
51
,
23
],[
2
,
42
,
14
,
17
,
43
,
15
],[
5
,
150
,
120
,
1
,
151
,
121
],[
9
,
69
,
43
,
4
,
70
,
44
],[
17
,
50
,
22
,
1
,
51
,
23
],[
2
,
42
,
14
,
19
,
43
,
15
],[
3
,
141
,
113
,
4
,
142
,
114
],[
3
,
70
,
44
,
11
,
71
,
45
],[
17
,
47
,
21
,
4
,
48
,
22
],[
9
,
39
,
13
,
16
,
40
,
14
],[
3
,
135
,
107
,
5
,
136
,
108
],[
3
,
67
,
41
,
13
,
68
,
42
],[
15
,
54
,
24
,
5
,
55
,
25
],[
15
,
43
,
15
,
10
,
44
,
16
],[
4
,
144
,
116
,
4
,
145
,
117
],[
17
,
68
,
42
],[
17
,
50
,
22
,
6
,
51
,
23
],[
19
,
46
,
16
,
6
,
47
,
17
],[
2
,
139
,
111
,
7
,
140
,
112
],[
17
,
74
,
46
],[
7
,
54
,
24
,
16
,
55
,
25
],[
34
,
37
,
13
],[
4
,
151
,
121
,
5
,
152
,
122
],[
4
,
75
,
47
,
14
,
76
,
48
],[
11
,
54
,
24
,
14
,
55
,
25
],[
16
,
45
,
15
,
14
,
46
,
16
],[
6
,
147
,
117
,
4
,
148
,
118
],[
6
,
73
,
45
,
14
,
74
,
46
],[
11
,
54
,
24
,
16
,
55
,
25
],[
30
,
46
,
16
,
2
,
47
,
17
],[
8
,
132
,
106
,
4
,
133
,
107
],[
8
,
75
,
47
,
13
,
76
,
48
],[
7
,
54
,
24
,
22
,
55
,
25
],[
22
,
45
,
15
,
13
,
46
,
16
],[
10
,
142
,
114
,
2
,
143
,
115
],[
19
,
74
,
46
,
4
,
75
,
47
],[
28
,
50
,
22
,
6
,
51
,
23
],[
33
,
46
,
16
,
4
,
47
,
17
],[
8
,
152
,
122
,
4
,
153
,
123
],[
22
,
73
,
45
,
3
,
74
,
46
],[
8
,
53
,
23
,
26
,
54
,
24
],[
12
,
45
,
15
,
28
,
46
,
16
],[
3
,
147
,
117
,
10
,
148
,
118
],[
3
,
73
,
45
,
23
,
74
,
46
],[
4
,
54
,
24
,
31
,
55
,
25
],[
11
,
45
,
15
,
31
,
46
,
16
],[
7
,
146
,
116
,
7
,
147
,
117
],[
21
,
73
,
45
,
7
,
74
,
46
],[
1
,
53
,
23
,
37
,
54
,
24
],[
19
,
45
,
15
,
26
,
46
,
16
],[
5
,
145
,
115
,
10
,
146
,
116
],[
19
,
75
,
47
,
10
,
76
,
48
],[
15
,
54
,
24
,
25
,
55
,
25
],[
23
,
45
,
15
,
25
,
46
,
16
],[
13
,
145
,
115
,
3
,
146
,
116
],[
2
,
74
,
46
,
29
,
75
,
47
],[
42
,
54
,
24
,
1
,
55
,
25
],[
23
,
45
,
15
,
28
,
46
,
16
],[
17
,
145
,
115
],[
10
,
74
,
46
,
23
,
75
,
47
],[
10
,
54
,
24
,
35
,
55
,
25
],[
19
,
45
,
15
,
35
,
46
,
16
],[
17
,
145
,
115
,
1
,
146
,
116
],[
14
,
74
,
46
,
21
,
75
,
47
],[
29
,
54
,
24
,
19
,
55
,
25
],[
11
,
45
,
15
,
46
,
46
,
16
],[
13
,
145
,
115
,
6
,
146
,
116
],[
14
,
74
,
46
,
23
,
75
,
47
],[
44
,
54
,
24
,
7
,
55
,
25
],[
59
,
46
,
16
,
1
,
47
,
17
],[
12
,
151
,
121
,
7
,
152
,
122
],[
12
,
75
,
47
,
26
,
76
,
48
],[
39
,
54
,
24
,
14
,
55
,
25
],[
22
,
45
,
15
,
41
,
46
,
16
],[
6
,
151
,
121
,
14
,
152
,
122
],[
6
,
75
,
47
,
34
,
76
,
48
],[
46
,
54
,
24
,
10
,
55
,
25
],[
2
,
45
,
15
,
64
,
46
,
16
],[
17
,
152
,
122
,
4
,
153
,
123
],[
29
,
74
,
46
,
14
,
75
,
47
],[
49
,
54
,
24
,
10
,
55
,
25
],[
24
,
45
,
15
,
46
,
46
,
16
],[
4
,
152
,
122
,
18
,
153
,
123
],[
13
,
74
,
46
,
32
,
75
,
47
],[
48
,
54
,
24
,
14
,
55
,
25
],[
42
,
45
,
15
,
32
,
46
,
16
],[
20
,
147
,
117
,
4
,
148
,
118
],[
40
,
75
,
47
,
7
,
76
,
48
],[
43
,
54
,
24
,
22
,
55
,
25
],[
10
,
45
,
15
,
67
,
46
,
16
],[
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
=
[];
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
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
;}};
function
QRBitBuffer
(){
this
.
buffer
=
[];
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
++
;}};
var
QRCodeLimitLength
=
[[
17
,
14
,
11
,
7
],[
32
,
26
,
20
,
14
],[
53
,
42
,
32
,
24
],[
78
,
62
,
46
,
34
],[
106
,
84
,
60
,
44
],[
134
,
106
,
74
,
58
],[
154
,
122
,
86
,
64
],[
192
,
152
,
108
,
84
],[
230
,
180
,
130
,
98
],[
271
,
213
,
151
,
119
],[
321
,
251
,
177
,
137
],[
367
,
287
,
203
,
155
],[
425
,
331
,
241
,
177
],[
458
,
362
,
258
,
194
],[
520
,
412
,
292
,
220
],[
586
,
450
,
322
,
250
],[
644
,
504
,
364
,
280
],[
718
,
560
,
394
,
310
],[
792
,
624
,
442
,
338
],[
858
,
666
,
482
,
382
],[
929
,
711
,
509
,
403
],[
1003
,
779
,
565
,
439
],[
1091
,
857
,
611
,
461
],[
1171
,
911
,
661
,
511
],[
1273
,
997
,
715
,
535
],[
1367
,
1059
,
751
,
593
],[
1465
,
1125
,
805
,
625
],[
1528
,
1190
,
868
,
658
],[
1628
,
1264
,
908
,
698
],[
1732
,
1370
,
982
,
742
],[
1840
,
1452
,
1030
,
790
],[
1952
,
1538
,
1112
,
842
],[
2068
,
1628
,
1168
,
898
],[
2188
,
1722
,
1228
,
958
],[
2303
,
1809
,
1283
,
983
],[
2431
,
1911
,
1351
,
1051
],[
2563
,
1989
,
1423
,
1093
],[
2699
,
2099
,
1499
,
1139
],[
2809
,
2213
,
1579
,
1219
],[
2953
,
2331
,
1663
,
1273
]];
function
_isSupportCanvas
()
{
return
typeof
CanvasRenderingContext2D
!=
"undefined"
;
}
// android 2.x doesn't support Data-URI spec
function
_getAndroid
()
{
/*
var android = false;
var sAgent = navigator.userAgent;
if (/android/i.test(sAgent)) { // android
android = true;
var aMat = sAgent.toString().match(/android ([0-9]\.[0-9])/i);
if (aMat && aMat[1]) {
android = parseFloat(aMat[1]);
}
}
return android;
由于android 2.x的旧机子已经根本不用考虑了,
而这个方法在makeImage的时候被调用,并不是用来判断是否是android机子,
只是用来判断是需要考虑android老设备不支持Data-URI的问题,所以这里直接置false,不考虑即可
*/
return
false
;
}
var
svgDrawer
=
(
function
()
{
var
Drawing
=
function
(
el
,
htOption
)
{
this
.
_el
=
el
;
this
.
_htOption
=
htOption
;
};
Drawing
.
prototype
.
draw
=
function
(
oQRCode
)
{
var
_htOption
=
this
.
_htOption
;
var
_el
=
this
.
_el
;
var
nCount
=
oQRCode
.
getModuleCount
();
var
nWidth
=
Math
.
floor
(
_htOption
.
width
/
nCount
);
var
nHeight
=
Math
.
floor
(
_htOption
.
height
/
nCount
);
this
.
clear
();
function
makeSVG
(
tag
,
attrs
)
{
var
el
=
document
.
createElementNS
(
'http://www.w3.org/2000/svg'
,
tag
);
for
(
var
k
in
attrs
)
if
(
attrs
.
hasOwnProperty
(
k
))
el
.
setAttribute
(
k
,
attrs
[
k
]);
return
el
;
}
var
svg
=
makeSVG
(
"svg"
,
{
'viewBox'
:
'0 0 '
+
String
(
nCount
)
+
" "
+
String
(
nCount
),
'width'
:
'100%'
,
'height'
:
'100%'
,
'fill'
:
_htOption
.
colorLight
});
svg
.
setAttributeNS
(
"http://www.w3.org/2000/xmlns/"
,
"xmlns:xlink"
,
"http://www.w3.org/1999/xlink"
);
_el
.
appendChild
(
svg
);
svg
.
appendChild
(
makeSVG
(
"rect"
,
{
"fill"
:
_htOption
.
colorLight
,
"width"
:
"100%"
,
"height"
:
"100%"
}));
svg
.
appendChild
(
makeSVG
(
"rect"
,
{
"fill"
:
_htOption
.
colorDark
,
"width"
:
"1"
,
"height"
:
"1"
,
"id"
:
"template"
}));
for
(
var
row
=
0
;
row
<
nCount
;
row
++
)
{
for
(
var
col
=
0
;
col
<
nCount
;
col
++
)
{
if
(
oQRCode
.
isDark
(
row
,
col
))
{
var
child
=
makeSVG
(
"use"
,
{
"x"
:
String
(
col
),
"y"
:
String
(
row
)});
child
.
setAttributeNS
(
"http://www.w3.org/1999/xlink"
,
"href"
,
"#template"
)
svg
.
appendChild
(
child
);
}
}
}
};
Drawing
.
prototype
.
clear
=
function
()
{
while
(
this
.
_el
.
hasChildNodes
())
this
.
_el
.
removeChild
(
this
.
_el
.
lastChild
);
};
return
Drawing
;
})();
var
useSVG
=
document
.
documentElement
.
tagName
.
toLowerCase
()
===
"svg"
;
// Drawing in DOM by using Table tag
var
Drawing
=
useSVG
?
svgDrawer
:
!
_isSupportCanvas
()
?
(
function
()
{
var
Drawing
=
function
(
el
,
htOption
)
{
this
.
_el
=
el
;
this
.
_htOption
=
htOption
;
};
/**
* Draw the QRCode
*
* @param {QRCode} oQRCode
*/
Drawing
.
prototype
.
draw
=
function
(
oQRCode
)
{
var
_htOption
=
this
.
_htOption
;
var
_el
=
this
.
_el
;
var
nCount
=
oQRCode
.
getModuleCount
();
var
nWidth
=
Math
.
floor
(
_htOption
.
width
/
nCount
);
var
nHeight
=
Math
.
floor
(
_htOption
.
height
/
nCount
);
var
aHTML
=
[
'<table style="border:0;border-collapse:collapse;">'
];
for
(
var
row
=
0
;
row
<
nCount
;
row
++
)
{
aHTML
.
push
(
'<tr>'
);
for
(
var
col
=
0
;
col
<
nCount
;
col
++
)
{
aHTML
.
push
(
'<td style="border:0;border-collapse:collapse;padding:0;margin:0;width:'
+
nWidth
+
'px;height:'
+
nHeight
+
'px;background-color:'
+
(
oQRCode
.
isDark
(
row
,
col
)
?
_htOption
.
colorDark
:
_htOption
.
colorLight
)
+
';"></td>'
);
}
aHTML
.
push
(
'</tr>'
);
}
aHTML
.
push
(
'</table>'
);
_el
.
innerHTML
=
aHTML
.
join
(
''
);
// Fix the margin values as real size.
var
elTable
=
_el
.
childNodes
[
0
];
var
nLeftMarginTable
=
(
_htOption
.
width
-
elTable
.
offsetWidth
)
/
2
;
var
nTopMarginTable
=
(
_htOption
.
height
-
elTable
.
offsetHeight
)
/
2
;
if
(
nLeftMarginTable
>
0
&&
nTopMarginTable
>
0
)
{
elTable
.
style
.
margin
=
nTopMarginTable
+
"px "
+
nLeftMarginTable
+
"px"
;
}
};
/**
* Clear the QRCode
*/
Drawing
.
prototype
.
clear
=
function
()
{
this
.
_el
.
innerHTML
=
''
;
};
return
Drawing
;
})()
:
(
function
()
{
// Drawing in Canvas
function
_onMakeImage
()
{
this
.
_elImage
.
src
=
this
.
_elCanvas
.
toDataURL
(
"image/png"
);
this
.
_elImage
.
style
.
display
=
"block"
;
//如果没有中心icon的话,二维码display会被设为none
//this._elCanvas.style.display = "none";
}
// Android 2.1 bug workaround
// http://code.google.com/p/android/issues/detail?id=5141
if
(
this
.
_android
&&
this
.
_android
<=
2.1
)
{
var
factor
=
1
/
window
.
devicePixelRatio
;
var
drawImage
=
CanvasRenderingContext2D
.
prototype
.
drawImage
;
CanvasRenderingContext2D
.
prototype
.
drawImage
=
function
(
image
,
sx
,
sy
,
sw
,
sh
,
dx
,
dy
,
dw
,
dh
)
{
if
((
"nodeName"
in
image
)
&&
/img/i
.
test
(
image
.
nodeName
))
{
for
(
var
i
=
arguments
.
length
-
1
;
i
>=
1
;
i
--
)
{
arguments
[
i
]
=
arguments
[
i
]
*
factor
;
}
}
else
if
(
typeof
dw
==
"undefined"
)
{
arguments
[
1
]
*=
factor
;
arguments
[
2
]
*=
factor
;
arguments
[
3
]
*=
factor
;
arguments
[
4
]
*=
factor
;
}
drawImage
.
apply
(
this
,
arguments
);
};
}
/**
* Check whether the user's browser supports Data URI or not
*
* @private
* @param {Function} fSuccess Occurs if it supports Data URI
* @param {Function} fFail Occurs if it doesn't support Data URI
*/
function
_safeSetDataURI
(
fSuccess
,
fFail
)
{
var
self
=
this
;
self
.
_fFail
=
fFail
;
self
.
_fSuccess
=
fSuccess
;
// Check it just once
if
(
self
.
_bSupportDataURI
===
null
)
{
var
el
=
document
.
createElement
(
"img"
);
var
fOnError
=
function
()
{
self
.
_bSupportDataURI
=
false
;
if
(
self
.
_fFail
)
{
self
.
_fFail
.
call
(
self
);
}
};
var
fOnSuccess
=
function
()
{
self
.
_bSupportDataURI
=
true
;
if
(
self
.
_fSuccess
)
{
self
.
_fSuccess
.
call
(
self
);
}
};
el
.
onabort
=
fOnError
;
el
.
onerror
=
fOnError
;
el
.
onload
=
fOnSuccess
;
el
.
src
=
"data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=="
;
// the Image contains 1px data.
return
;
}
else
if
(
self
.
_bSupportDataURI
===
true
&&
self
.
_fSuccess
)
{
self
.
_fSuccess
.
call
(
self
);
}
else
if
(
self
.
_bSupportDataURI
===
false
&&
self
.
_fFail
)
{
self
.
_fFail
.
call
(
self
);
}
};
/**
* Drawing QRCode by using canvas
*
* @constructor
* @param {HTMLElement} el
* @param {Object} htOption QRCode Options
*/
var
Drawing
=
function
(
el
,
htOption
)
{
this
.
_bIsPainted
=
false
;
this
.
_android
=
_getAndroid
();
this
.
_htOption
=
htOption
;
this
.
_elCanvas
=
document
.
createElement
(
"canvas"
);
this
.
_elCanvas
.
width
=
htOption
.
curtainWidth
?
htOption
.
curtainWidth
:
htOption
.
width
;
this
.
_elCanvas
.
height
=
htOption
.
curtainHeight
?
htOption
.
curtainHeight
:
htOption
.
height
;
el
.
appendChild
(
this
.
_elCanvas
);
this
.
_el
=
el
;
this
.
_oContext
=
this
.
_elCanvas
.
getContext
(
"2d"
);
this
.
_bIsPainted
=
false
;
this
.
_elImage
=
document
.
createElement
(
"img"
);
this
.
_elImage
.
alt
=
"Scan me!"
;
this
.
_elImage
.
style
.
display
=
"none"
;
//this._el.appendChild(this._elImage);
this
.
_bSupportDataURI
=
null
;
};
/**
* Draw the QRCode
*
* @param {QRCode} oQRCode
*/
Drawing
.
prototype
.
draw
=
function
(
oQRCode
)
{
//目前真正被调用的是该draw方法
var
_elImage
=
this
.
_elImage
;
var
_oContext
=
this
.
_oContext
;
var
_htOption
=
this
.
_htOption
;
var
nCount
=
oQRCode
.
getModuleCount
();
var
nWidth
=
_htOption
.
width
/
nCount
;
var
nHeight
=
_htOption
.
height
/
nCount
;
var
nRoundedWidth
=
Math
.
round
(
nWidth
);
var
nRoundedHeight
=
Math
.
round
(
nHeight
);
_elImage
.
style
.
display
=
"none"
;
this
.
clear
();
for
(
var
row
=
0
;
row
<
nCount
;
row
++
)
{
for
(
var
col
=
0
;
col
<
nCount
;
col
++
)
{
var
bIsDark
=
oQRCode
.
isDark
(
row
,
col
);
var
nLeft
=
col
*
nWidth
;
var
nTop
=
row
*
nHeight
;
_oContext
.
strokeStyle
=
bIsDark
?
_htOption
.
colorDark
:
_htOption
.
colorLight
;
_oContext
.
lineWidth
=
1
;
_oContext
.
fillStyle
=
bIsDark
?
_htOption
.
colorDark
:
_htOption
.
colorLight
;
_oContext
.
fillRect
(
nLeft
,
nTop
,
nWidth
,
nHeight
);
// 안티 앨리어싱 방지 처리
_oContext
.
strokeRect
(
Math
.
floor
(
nLeft
)
+
0.5
,
Math
.
floor
(
nTop
)
+
0.5
,
nRoundedWidth
,
nRoundedHeight
);
_oContext
.
strokeRect
(
Math
.
ceil
(
nLeft
)
-
0.5
,
Math
.
ceil
(
nTop
)
-
0.5
,
nRoundedWidth
,
nRoundedHeight
);
}
}
this
.
_bIsPainted
=
true
;
};
function
drawRoundRect
(
ctx
,
x
,
y
,
width
,
height
,
radius
,
lineWidth
,
lineColor
)
{
ctx
.
lineWidth
=
lineWidth
;
ctx
.
strokeStyle
=
lineColor
;
ctx
.
beginPath
();
ctx
.
arc
(
x
+
radius
,
y
+
radius
,
radius
,
Math
.
PI
,
Math
.
PI
*
3
/
2
);
ctx
.
lineTo
(
width
-
radius
+
x
,
y
);
ctx
.
arc
(
width
-
radius
+
x
,
radius
+
y
,
radius
,
Math
.
PI
*
3
/
2
,
Math
.
PI
*
2
);
ctx
.
lineTo
(
width
+
x
,
height
+
y
-
radius
);
ctx
.
arc
(
width
-
radius
+
x
,
height
-
radius
+
y
,
radius
,
0
,
Math
.
PI
*
1
/
2
);
ctx
.
lineTo
(
radius
+
x
,
height
+
y
);
ctx
.
arc
(
radius
+
x
,
height
-
radius
+
y
,
radius
,
Math
.
PI
*
1
/
2
,
Math
.
PI
);
ctx
.
closePath
();
//因为有的时候图片不需要设置边框线
if
(
lineWidth
>
0
)
ctx
.
stroke
();
};
Drawing
.
prototype
.
addIcon
=
async
function
(
iconSrc
)
{
//通过ES6的async/await语法将异步的Promise转为同步方法
const
image
=
await
new
Promise
((
resolve
,
reject
)
=>
{
const
image
=
new
Image
();
image
.
src
=
iconSrc
;
image
.
onload
=
()
=>
{
resolve
(
image
);};
});
//图片占整个二维码的比例,在QRCode.CorrectLevel.L测试可行,那么更高的纠错率就更没问题了
const
ratio
=
0.3
;
const
radius
=
10
;
const
marginRatio
=
(
1
-
ratio
)
/
2
;
const
x
=
this
.
_htOption
.
width
*
marginRatio
;
const
y
=
this
.
_htOption
.
height
*
marginRatio
;
const
width
=
this
.
_htOption
.
width
*
ratio
;
const
height
=
this
.
_htOption
.
height
*
ratio
;
drawRoundRect
(
this
.
_oContext
,
x
,
y
,
width
,
height
,
this
.
_htOption
.
iconRadius
,
this
.
_htOption
.
iconBorderWidth
,
this
.
_htOption
.
iconBorderColor
);
this
.
_oContext
.
save
();
this
.
_oContext
.
clip
();
this
.
_oContext
.
drawImage
(
image
,
x
,
y
,
width
,
height
);
this
.
_oContext
.
restore
();
};
Drawing
.
prototype
.
addCurtain
=
async
function
(
curtainSrc
)
{
const
image
=
await
new
Promise
((
resolve
,
reject
)
=>
{
const
image
=
new
Image
();
image
.
src
=
curtainSrc
;
image
.
onload
=
()
=>
{
resolve
(
image
);};
});
this
.
_oContext
.
drawImage
(
image
,
0
,
0
,
this
.
_htOption
.
curtainWidth
,
this
.
_htOption
.
curtainHeight
);
}
/**
* Make the image from Canvas if the browser supports Data URI.
*/
Drawing
.
prototype
.
makeImage
=
function
()
{
if
(
this
.
_bIsPainted
)
{
_safeSetDataURI
.
call
(
this
,
_onMakeImage
);
}
};
/**
* Return whether the QRCode is painted or not
*
* @return {Boolean}
*/
Drawing
.
prototype
.
isPainted
=
function
()
{
return
this
.
_bIsPainted
;
};
/**
* Clear the QRCode
*/
Drawing
.
prototype
.
clear
=
function
()
{
this
.
_oContext
.
clearRect
(
0
,
0
,
this
.
_elCanvas
.
width
,
this
.
_elCanvas
.
height
);
this
.
_bIsPainted
=
false
;
};
/**
* @private
* @param {Number} nNumber
*/
Drawing
.
prototype
.
round
=
function
(
nNumber
)
{
if
(
!
nNumber
)
{
return
nNumber
;
}
return
Math
.
floor
(
nNumber
*
1000
)
/
1000
;
};
return
Drawing
;
})();
/**
* Get the type by string length
*
* @private
* @param {String} sText
* @param {Number} nCorrectLevel
* @return {Number} type
*/
function
_getTypeNumber
(
sText
,
nCorrectLevel
)
{
var
nType
=
1
;
var
length
=
_getUTF8Length
(
sText
);
for
(
var
i
=
0
,
len
=
QRCodeLimitLength
.
length
;
i
<=
len
;
i
++
)
{
var
nLimit
=
0
;
switch
(
nCorrectLevel
)
{
case
QRErrorCorrectLevel
.
L
:
nLimit
=
QRCodeLimitLength
[
i
][
0
];
break
;
case
QRErrorCorrectLevel
.
M
:
nLimit
=
QRCodeLimitLength
[
i
][
1
];
break
;
case
QRErrorCorrectLevel
.
Q
:
nLimit
=
QRCodeLimitLength
[
i
][
2
];
break
;
case
QRErrorCorrectLevel
.
H
:
nLimit
=
QRCodeLimitLength
[
i
][
3
];
break
;
}
if
(
length
<=
nLimit
)
{
break
;
}
else
{
nType
++
;
}
}
if
(
nType
>
QRCodeLimitLength
.
length
)
{
throw
new
Error
(
"Too long data"
);
}
return
nType
;
}
function
_getUTF8Length
(
sText
)
{
var
replacedText
=
encodeURI
(
sText
).
toString
().
replace
(
/
\%[
0-9a-fA-F
]{2}
/g
,
'a'
);
return
replacedText
.
length
+
(
replacedText
.
length
!=
sText
?
3
:
0
);
}
/**
* @class QRCode
* @constructor
* @example
* new QRCode(document.getElementById("test"), "http://jindo.dev.naver.com/collie");
*
* @example
* var oQRCode = new QRCode("test", {
* text : "http://naver.com",
* width : 128,
* height : 128
* });
*
* oQRCode.clear(); // Clear the QRCode.
* oQRCode.makeCode("http://map.naver.com"); // Re-create the QRCode.
*
* @param {HTMLElement|String} el target element or 'id' attribute of element.
* @param {Object|String} vOption
* @param {String} vOption.text QRCode link data
* @param {Number} [vOption.width=256]
* @param {Number} [vOption.height=256]
* @param {String} [vOption.colorDark="#000000"]
* @param {String} [vOption.colorLight="#ffffff"]
* @param {QRCode.CorrectLevel} [vOption.correctLevel=QRCode.CorrectLevel.H] [L|M|Q|H]
*/
QRCode
=
function
(
el
,
vOption
)
{
this
.
_htOption
=
{
//二维码大小
width
:
256
,
height
:
256
,
typeNumber
:
4
,
colorDark
:
"#000000"
,
colorLight
:
"#ffffff"
,
correctLevel
:
QRErrorCorrectLevel
.
H
,
//二维码中间图标
iconSrc
:
undefined
,
iconBorderWidth
:
0
,
iconBorderColor
:
"black"
,
//幕布图片
curtainImg
:
undefined
,
curtainBgColor
:
undefined
,
//整个画布大小,边框充满整个画布
curtainWidth
:
undefined
,
curtainHeight
:
undefined
,
//二维码相对画布或边框图片的偏移
qrcodeOffsetX
:
undefined
,
qrcodeOffsetY
:
undefined
,
};
if
(
typeof
vOption
===
'string'
)
{
vOption
=
{
text
:
vOption
};
}
// Overwrites options
if
(
vOption
)
{
for
(
var
i
in
vOption
)
{
this
.
_htOption
[
i
]
=
vOption
[
i
];
}
}
if
(
typeof
el
==
"string"
)
{
el
=
document
.
getElementById
(
el
);
}
if
(
this
.
_htOption
.
useSVG
)
{
Drawing
=
svgDrawer
;
}
this
.
_android
=
_getAndroid
();
this
.
_el
=
el
;
this
.
_oQRCode
=
null
;
this
.
_oDrawing
=
new
Drawing
(
this
.
_el
,
this
.
_htOption
);
if
(
this
.
_htOption
.
text
)
{
this
.
makeCode
(
this
.
_htOption
.
text
);
}
};
/**
* Make the QRCode
*
* @param {String} sText link data
*/
QRCode
.
prototype
.
makeCode
=
async
function
(
sText
)
{
this
.
_oQRCode
=
new
QRCodeModel
(
_getTypeNumber
(
sText
,
this
.
_htOption
.
correctLevel
),
this
.
_htOption
.
correctLevel
);
this
.
_oQRCode
.
addData
(
sText
);
this
.
_oQRCode
.
make
();
this
.
_el
.
title
=
sText
;
const
offsetExists
=
typeof
(
this
.
_htOption
.
qrcodeOffsetX
)
!==
"undefined"
&&
typeof
(
this
.
_htOption
.
qrcodeOffsetY
)
!==
"undefined"
;
const
curtainExists
=
typeof
(
this
.
_htOption
.
curtainWidth
)
!==
"undefined"
&&
typeof
(
this
.
_htOption
.
curtainHeight
)
!==
"undefined"
;
const
curtainImgExists
=
typeof
(
this
.
_htOption
.
curtainImg
)
!==
"undefined"
;
const
curtainBgColorExists
=
typeof
this
.
_htOption
.
curtainBgColor
!==
"undefined"
&&
curtainExists
;
if
(
curtainBgColorExists
)
{
//如果不填充白色,下载下来的图片默认为透明色,很难看
this
.
_oDrawing
.
_oContext
.
fillStyle
=
this
.
_htOption
.
curtainBgColor
?
this
.
_htOption
.
curtainBgColor
:
"white"
;
this
.
_oDrawing
.
_oContext
.
fillRect
(
0
,
0
,
this
.
_htOption
.
curtainWidth
,
this
.
_htOption
.
curtainHeight
);
this
.
_oDrawing
.
_oContext
.
save
();
}
if
(
offsetExists
)
{
const
x
=
this
.
_htOption
.
qrcodeOffsetX
;
const
y
=
this
.
_htOption
.
qrcodeOffsetY
;
this
.
_oDrawing
.
_oContext
.
save
();
this
.
_oDrawing
.
_oContext
.
translate
(
x
,
y
);
}
if
(
curtainBgColorExists
)
{
this
.
_oDrawing
.
_oContext
.
rect
(
0
,
0
,
this
.
_htOption
.
width
,
this
.
_htOption
.
height
);
this
.
_oDrawing
.
_oContext
.
clip
();
}
this
.
_oDrawing
.
draw
(
this
.
_oQRCode
);
if
(
typeof
(
this
.
_htOption
.
iconSrc
)
!==
"undefined"
)
{
//这里是异步的函数,只有加了await才会变成同步(注意:即使函数里面有await,这个函数也是异步执行的)
await
this
.
_oDrawing
.
addIcon
(
this
.
_htOption
.
iconSrc
);
}
if
(
curtainBgColorExists
)
{
this
.
_oDrawing
.
_oContext
.
restore
();
}
if
(
offsetExists
)
{
this
.
_oDrawing
.
_oContext
.
restore
();
}
if
(
curtainImgExists
)
{
this
.
_oDrawing
.
_oContext
.
globalCompositeOperation
=
"destination-over"
;
await
this
.
_oDrawing
.
addCurtain
(
this
.
_htOption
.
curtainImg
);
this
.
_oDrawing
.
_oContext
.
globalCompositeOperation
=
"source-over"
;
}
this
.
makeImage
();
};
/**
* Make the Image from Canvas element
* - It occurs automatically
* - Android below 3 doesn't support Data-URI spec.
*
* @private
*/
QRCode
.
prototype
.
makeImage
=
function
()
{
if
(
typeof
this
.
_oDrawing
.
makeImage
==
"function"
&&
(
!
this
.
_android
||
this
.
_android
>=
3
))
{
this
.
_oDrawing
.
makeImage
();
}
};
/**
* Clear the QRCode
*/
QRCode
.
prototype
.
clear
=
function
()
{
this
.
_oDrawing
.
clear
();
};
/**
* @name QRCode.CorrectLevel
*/
QRCode
.
CorrectLevel
=
QRErrorCorrectLevel
;
})();
src/assets/js/qrcode.min.js
deleted
100644 → 0
View file @
19589fbd
var
QRCode
;
!
function
(){
function
a
(
a
){
this
.
mode
=
c
.
MODE_8BIT_BYTE
,
this
.
data
=
a
,
this
.
parsedData
=
[];
for
(
var
b
=
[],
d
=
0
,
e
=
this
.
data
.
length
;
e
>
d
;
d
++
){
var
f
=
this
.
data
.
charCodeAt
(
d
);
f
>
65536
?(
b
[
0
]
=
240
|
(
1835008
&
f
)
>>>
18
,
b
[
1
]
=
128
|
(
258048
&
f
)
>>>
12
,
b
[
2
]
=
128
|
(
4032
&
f
)
>>>
6
,
b
[
3
]
=
128
|
63
&
f
):
f
>
2048
?(
b
[
0
]
=
224
|
(
61440
&
f
)
>>>
12
,
b
[
1
]
=
128
|
(
4032
&
f
)
>>>
6
,
b
[
2
]
=
128
|
63
&
f
):
f
>
128
?(
b
[
0
]
=
192
|
(
1984
&
f
)
>>>
6
,
b
[
1
]
=
128
|
63
&
f
):
b
[
0
]
=
f
,
this
.
parsedData
=
this
.
parsedData
.
concat
(
b
)}
this
.
parsedData
.
length
!=
this
.
data
.
length
&&
(
this
.
parsedData
.
unshift
(
191
),
this
.
parsedData
.
unshift
(
187
),
this
.
parsedData
.
unshift
(
239
))}
function
b
(
a
,
b
){
this
.
typeNumber
=
a
,
this
.
errorCorrectLevel
=
b
,
this
.
modules
=
null
,
this
.
moduleCount
=
0
,
this
.
dataCache
=
null
,
this
.
dataList
=
[]}
function
i
(
a
,
b
){
if
(
void
0
==
a
.
length
)
throw
new
Error
(
a
.
length
+
"/"
+
b
);
for
(
var
c
=
0
;
c
<
a
.
length
&&
0
==
a
[
c
];)
c
++
;
this
.
num
=
new
Array
(
a
.
length
-
c
+
b
);
for
(
var
d
=
0
;
d
<
a
.
length
-
c
;
d
++
)
this
.
num
[
d
]
=
a
[
d
+
c
]}
function
j
(
a
,
b
){
this
.
totalCount
=
a
,
this
.
dataCount
=
b
}
function
k
(){
this
.
buffer
=
[],
this
.
length
=
0
}
function
m
(){
return
"undefined"
!=
typeof
CanvasRenderingContext2D
}
function
n
(){
var
a
=!
1
,
b
=
navigator
.
userAgent
;
return
/android/i
.
test
(
b
)
&&
(
a
=!
0
,
aMat
=
b
.
toString
().
match
(
/android
([
0-9
]\.[
0-9
])
/i
),
aMat
&&
aMat
[
1
]
&&
(
a
=
parseFloat
(
aMat
[
1
]))),
a
}
function
r
(
a
,
b
){
for
(
var
c
=
1
,
e
=
s
(
a
),
f
=
0
,
g
=
l
.
length
;
g
>=
f
;
f
++
){
var
h
=
0
;
switch
(
b
){
case
d
.
L
:
h
=
l
[
f
][
0
];
break
;
case
d
.
M
:
h
=
l
[
f
][
1
];
break
;
case
d
.
Q
:
h
=
l
[
f
][
2
];
break
;
case
d
.
H
:
h
=
l
[
f
][
3
]}
if
(
h
>=
e
)
break
;
c
++
}
if
(
c
>
l
.
length
)
throw
new
Error
(
"Too long data"
);
return
c
}
function
s
(
a
){
var
b
=
encodeURI
(
a
).
toString
().
replace
(
/
\%[
0-9a-fA-F
]{2}
/g
,
"a"
);
return
b
.
length
+
(
b
.
length
!=
a
?
3
:
0
)}
a
.
prototype
=
{
getLength
:
function
(){
return
this
.
parsedData
.
length
},
write
:
function
(
a
){
for
(
var
b
=
0
,
c
=
this
.
parsedData
.
length
;
c
>
b
;
b
++
)
a
.
put
(
this
.
parsedData
[
b
],
8
)}},
b
.
prototype
=
{
addData
:
function
(
b
){
var
c
=
new
a
(
b
);
this
.
dataList
.
push
(
c
),
this
.
dataCache
=
null
},
isDark
:
function
(
a
,
b
){
if
(
0
>
a
||
this
.
moduleCount
<=
a
||
0
>
b
||
this
.
moduleCount
<=
b
)
throw
new
Error
(
a
+
","
+
b
);
return
this
.
modules
[
a
][
b
]},
getModuleCount
:
function
(){
return
this
.
moduleCount
},
make
:
function
(){
this
.
makeImpl
(
!
1
,
this
.
getBestMaskPattern
())},
makeImpl
:
function
(
a
,
c
){
this
.
moduleCount
=
4
*
this
.
typeNumber
+
17
,
this
.
modules
=
new
Array
(
this
.
moduleCount
);
for
(
var
d
=
0
;
d
<
this
.
moduleCount
;
d
++
){
this
.
modules
[
d
]
=
new
Array
(
this
.
moduleCount
);
for
(
var
e
=
0
;
e
<
this
.
moduleCount
;
e
++
)
this
.
modules
[
d
][
e
]
=
null
}
this
.
setupPositionProbePattern
(
0
,
0
),
this
.
setupPositionProbePattern
(
this
.
moduleCount
-
7
,
0
),
this
.
setupPositionProbePattern
(
0
,
this
.
moduleCount
-
7
),
this
.
setupPositionAdjustPattern
(),
this
.
setupTimingPattern
(),
this
.
setupTypeInfo
(
a
,
c
),
this
.
typeNumber
>=
7
&&
this
.
setupTypeNumber
(
a
),
null
==
this
.
dataCache
&&
(
this
.
dataCache
=
b
.
createData
(
this
.
typeNumber
,
this
.
errorCorrectLevel
,
this
.
dataList
)),
this
.
mapData
(
this
.
dataCache
,
c
)},
setupPositionProbePattern
:
function
(
a
,
b
){
for
(
var
c
=-
1
;
7
>=
c
;
c
++
)
if
(
!
(
-
1
>=
a
+
c
||
this
.
moduleCount
<=
a
+
c
))
for
(
var
d
=-
1
;
7
>=
d
;
d
++
)
-
1
>=
b
+
d
||
this
.
moduleCount
<=
b
+
d
||
(
this
.
modules
[
a
+
c
][
b
+
d
]
=
c
>=
0
&&
6
>=
c
&&
(
0
==
d
||
6
==
d
)
||
d
>=
0
&&
6
>=
d
&&
(
0
==
c
||
6
==
c
)
||
c
>=
2
&&
4
>=
c
&&
d
>=
2
&&
4
>=
d
?
!
0
:
!
1
)},
getBestMaskPattern
:
function
(){
for
(
var
a
=
0
,
b
=
0
,
c
=
0
;
8
>
c
;
c
++
){
this
.
makeImpl
(
!
0
,
c
);
var
d
=
f
.
getLostPoint
(
this
);(
0
==
c
||
a
>
d
)
&&
(
a
=
d
,
b
=
c
)}
return
b
},
createMovieClip
:
function
(
a
,
b
,
c
){
var
d
=
a
.
createEmptyMovieClip
(
b
,
c
),
e
=
1
;
this
.
make
();
for
(
var
f
=
0
;
f
<
this
.
modules
.
length
;
f
++
)
for
(
var
g
=
f
*
e
,
h
=
0
;
h
<
this
.
modules
[
f
].
length
;
h
++
){
var
i
=
h
*
e
,
j
=
this
.
modules
[
f
][
h
];
j
&&
(
d
.
beginFill
(
0
,
100
),
d
.
moveTo
(
i
,
g
),
d
.
lineTo
(
i
+
e
,
g
),
d
.
lineTo
(
i
+
e
,
g
+
e
),
d
.
lineTo
(
i
,
g
+
e
),
d
.
endFill
())}
return
d
},
setupTimingPattern
:
function
(){
for
(
var
a
=
8
;
a
<
this
.
moduleCount
-
8
;
a
++
)
null
==
this
.
modules
[
a
][
6
]
&&
(
this
.
modules
[
a
][
6
]
=
0
==
a
%
2
);
for
(
var
b
=
8
;
b
<
this
.
moduleCount
-
8
;
b
++
)
null
==
this
.
modules
[
6
][
b
]
&&
(
this
.
modules
[
6
][
b
]
=
0
==
b
%
2
)},
setupPositionAdjustPattern
:
function
(){
for
(
var
a
=
f
.
getPatternPosition
(
this
.
typeNumber
),
b
=
0
;
b
<
a
.
length
;
b
++
)
for
(
var
c
=
0
;
c
<
a
.
length
;
c
++
){
var
d
=
a
[
b
],
e
=
a
[
c
];
if
(
null
==
this
.
modules
[
d
][
e
])
for
(
var
g
=-
2
;
2
>=
g
;
g
++
)
for
(
var
h
=-
2
;
2
>=
h
;
h
++
)
this
.
modules
[
d
+
g
][
e
+
h
]
=-
2
==
g
||
2
==
g
||-
2
==
h
||
2
==
h
||
0
==
g
&&
0
==
h
?
!
0
:
!
1
}},
setupTypeNumber
:
function
(
a
){
for
(
var
b
=
f
.
getBCHTypeNumber
(
this
.
typeNumber
),
c
=
0
;
18
>
c
;
c
++
){
var
d
=!
a
&&
1
==
(
1
&
b
>>
c
);
this
.
modules
[
Math
.
floor
(
c
/
3
)][
c
%
3
+
this
.
moduleCount
-
8
-
3
]
=
d
}
for
(
var
c
=
0
;
18
>
c
;
c
++
){
var
d
=!
a
&&
1
==
(
1
&
b
>>
c
);
this
.
modules
[
c
%
3
+
this
.
moduleCount
-
8
-
3
][
Math
.
floor
(
c
/
3
)]
=
d
}},
setupTypeInfo
:
function
(
a
,
b
){
for
(
var
c
=
this
.
errorCorrectLevel
<<
3
|
b
,
d
=
f
.
getBCHTypeInfo
(
c
),
e
=
0
;
15
>
e
;
e
++
){
var
g
=!
a
&&
1
==
(
1
&
d
>>
e
);
6
>
e
?
this
.
modules
[
e
][
8
]
=
g
:
8
>
e
?
this
.
modules
[
e
+
1
][
8
]
=
g
:
this
.
modules
[
this
.
moduleCount
-
15
+
e
][
8
]
=
g
}
for
(
var
e
=
0
;
15
>
e
;
e
++
){
var
g
=!
a
&&
1
==
(
1
&
d
>>
e
);
8
>
e
?
this
.
modules
[
8
][
this
.
moduleCount
-
e
-
1
]
=
g
:
9
>
e
?
this
.
modules
[
8
][
15
-
e
-
1
+
1
]
=
g
:
this
.
modules
[
8
][
15
-
e
-
1
]
=
g
}
this
.
modules
[
this
.
moduleCount
-
8
][
8
]
=!
a
},
mapData
:
function
(
a
,
b
){
for
(
var
c
=-
1
,
d
=
this
.
moduleCount
-
1
,
e
=
7
,
g
=
0
,
h
=
this
.
moduleCount
-
1
;
h
>
0
;
h
-=
2
)
for
(
6
==
h
&&
h
--
;;){
for
(
var
i
=
0
;
2
>
i
;
i
++
)
if
(
null
==
this
.
modules
[
d
][
h
-
i
]){
var
j
=!
1
;
g
<
a
.
length
&&
(
j
=
1
==
(
1
&
a
[
g
]
>>>
e
));
var
k
=
f
.
getMask
(
b
,
d
,
h
-
i
);
k
&&
(
j
=!
j
),
this
.
modules
[
d
][
h
-
i
]
=
j
,
e
--
,
-
1
==
e
&&
(
g
++
,
e
=
7
)}
if
(
d
+=
c
,
0
>
d
||
this
.
moduleCount
<=
d
){
d
-=
c
,
c
=-
c
;
break
}}}},
b
.
PAD0
=
236
,
b
.
PAD1
=
17
,
b
.
createData
=
function
(
a
,
c
,
d
){
for
(
var
e
=
j
.
getRSBlocks
(
a
,
c
),
g
=
new
k
,
h
=
0
;
h
<
d
.
length
;
h
++
){
var
i
=
d
[
h
];
g
.
put
(
i
.
mode
,
4
),
g
.
put
(
i
.
getLength
(),
f
.
getLengthInBits
(
i
.
mode
,
a
)),
i
.
write
(
g
)}
for
(
var
l
=
0
,
h
=
0
;
h
<
e
.
length
;
h
++
)
l
+=
e
[
h
].
dataCount
;
if
(
g
.
getLengthInBits
()
>
8
*
l
)
throw
new
Error
(
"code length overflow. ("
+
g
.
getLengthInBits
()
+
">"
+
8
*
l
+
")"
);
for
(
g
.
getLengthInBits
()
+
4
<=
8
*
l
&&
g
.
put
(
0
,
4
);
0
!=
g
.
getLengthInBits
()
%
8
;)
g
.
putBit
(
!
1
);
for
(;;){
if
(
g
.
getLengthInBits
()
>=
8
*
l
)
break
;
if
(
g
.
put
(
b
.
PAD0
,
8
),
g
.
getLengthInBits
()
>=
8
*
l
)
break
;
g
.
put
(
b
.
PAD1
,
8
)}
return
b
.
createBytes
(
g
,
e
)},
b
.
createBytes
=
function
(
a
,
b
){
for
(
var
c
=
0
,
d
=
0
,
e
=
0
,
g
=
new
Array
(
b
.
length
),
h
=
new
Array
(
b
.
length
),
j
=
0
;
j
<
b
.
length
;
j
++
){
var
k
=
b
[
j
].
dataCount
,
l
=
b
[
j
].
totalCount
-
k
;
d
=
Math
.
max
(
d
,
k
),
e
=
Math
.
max
(
e
,
l
),
g
[
j
]
=
new
Array
(
k
);
for
(
var
m
=
0
;
m
<
g
[
j
].
length
;
m
++
)
g
[
j
][
m
]
=
255
&
a
.
buffer
[
m
+
c
];
c
+=
k
;
var
n
=
f
.
getErrorCorrectPolynomial
(
l
),
o
=
new
i
(
g
[
j
],
n
.
getLength
()
-
1
),
p
=
o
.
mod
(
n
);
h
[
j
]
=
new
Array
(
n
.
getLength
()
-
1
);
for
(
var
m
=
0
;
m
<
h
[
j
].
length
;
m
++
){
var
q
=
m
+
p
.
getLength
()
-
h
[
j
].
length
;
h
[
j
][
m
]
=
q
>=
0
?
p
.
get
(
q
):
0
}}
for
(
var
r
=
0
,
m
=
0
;
m
<
b
.
length
;
m
++
)
r
+=
b
[
m
].
totalCount
;
for
(
var
s
=
new
Array
(
r
),
t
=
0
,
m
=
0
;
d
>
m
;
m
++
)
for
(
var
j
=
0
;
j
<
b
.
length
;
j
++
)
m
<
g
[
j
].
length
&&
(
s
[
t
++
]
=
g
[
j
][
m
]);
for
(
var
m
=
0
;
e
>
m
;
m
++
)
for
(
var
j
=
0
;
j
<
b
.
length
;
j
++
)
m
<
h
[
j
].
length
&&
(
s
[
t
++
]
=
h
[
j
][
m
]);
return
s
};
for
(
var
c
=
{
MODE_NUMBER
:
1
,
MODE_ALPHA_NUM
:
2
,
MODE_8BIT_BYTE
:
4
,
MODE_KANJI
:
8
},
d
=
{
L
:
1
,
M
:
0
,
Q
:
3
,
H
:
2
},
e
=
{
PATTERN000
:
0
,
PATTERN001
:
1
,
PATTERN010
:
2
,
PATTERN011
:
3
,
PATTERN100
:
4
,
PATTERN101
:
5
,
PATTERN110
:
6
,
PATTERN111
:
7
},
f
=
{
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
:
1335
,
G18
:
7973
,
G15_MASK
:
21522
,
getBCHTypeInfo
:
function
(
a
){
for
(
var
b
=
a
<<
10
;
f
.
getBCHDigit
(
b
)
-
f
.
getBCHDigit
(
f
.
G15
)
>=
0
;)
b
^=
f
.
G15
<<
f
.
getBCHDigit
(
b
)
-
f
.
getBCHDigit
(
f
.
G15
);
return
(
a
<<
10
|
b
)
^
f
.
G15_MASK
},
getBCHTypeNumber
:
function
(
a
){
for
(
var
b
=
a
<<
12
;
f
.
getBCHDigit
(
b
)
-
f
.
getBCHDigit
(
f
.
G18
)
>=
0
;)
b
^=
f
.
G18
<<
f
.
getBCHDigit
(
b
)
-
f
.
getBCHDigit
(
f
.
G18
);
return
a
<<
12
|
b
},
getBCHDigit
:
function
(
a
){
for
(
var
b
=
0
;
0
!=
a
;)
b
++
,
a
>>>=
1
;
return
b
},
getPatternPosition
:
function
(
a
){
return
f
.
PATTERN_POSITION_TABLE
[
a
-
1
]},
getMask
:
function
(
a
,
b
,
c
){
switch
(
a
){
case
e
.
PATTERN000
:
return
0
==
(
b
+
c
)
%
2
;
case
e
.
PATTERN001
:
return
0
==
b
%
2
;
case
e
.
PATTERN010
:
return
0
==
c
%
3
;
case
e
.
PATTERN011
:
return
0
==
(
b
+
c
)
%
3
;
case
e
.
PATTERN100
:
return
0
==
(
Math
.
floor
(
b
/
2
)
+
Math
.
floor
(
c
/
3
))
%
2
;
case
e
.
PATTERN101
:
return
0
==
b
*
c
%
2
+
b
*
c
%
3
;
case
e
.
PATTERN110
:
return
0
==
(
b
*
c
%
2
+
b
*
c
%
3
)
%
2
;
case
e
.
PATTERN111
:
return
0
==
(
b
*
c
%
3
+
(
b
+
c
)
%
2
)
%
2
;
default
:
throw
new
Error
(
"bad maskPattern:"
+
a
)}},
getErrorCorrectPolynomial
:
function
(
a
){
for
(
var
b
=
new
i
([
1
],
0
),
c
=
0
;
a
>
c
;
c
++
)
b
=
b
.
multiply
(
new
i
([
1
,
g
.
gexp
(
c
)],
0
));
return
b
},
getLengthInBits
:
function
(
a
,
b
){
if
(
b
>=
1
&&
10
>
b
)
switch
(
a
){
case
c
.
MODE_NUMBER
:
return
10
;
case
c
.
MODE_ALPHA_NUM
:
return
9
;
case
c
.
MODE_8BIT_BYTE
:
return
8
;
case
c
.
MODE_KANJI
:
return
8
;
default
:
throw
new
Error
(
"mode:"
+
a
)}
else
if
(
27
>
b
)
switch
(
a
){
case
c
.
MODE_NUMBER
:
return
12
;
case
c
.
MODE_ALPHA_NUM
:
return
11
;
case
c
.
MODE_8BIT_BYTE
:
return
16
;
case
c
.
MODE_KANJI
:
return
10
;
default
:
throw
new
Error
(
"mode:"
+
a
)}
else
{
if
(
!
(
41
>
b
))
throw
new
Error
(
"type:"
+
b
);
switch
(
a
){
case
c
.
MODE_NUMBER
:
return
14
;
case
c
.
MODE_ALPHA_NUM
:
return
13
;
case
c
.
MODE_8BIT_BYTE
:
return
16
;
case
c
.
MODE_KANJI
:
return
12
;
default
:
throw
new
Error
(
"mode:"
+
a
)}}},
getLostPoint
:
function
(
a
){
for
(
var
b
=
a
.
getModuleCount
(),
c
=
0
,
d
=
0
;
b
>
d
;
d
++
)
for
(
var
e
=
0
;
b
>
e
;
e
++
){
for
(
var
f
=
0
,
g
=
a
.
isDark
(
d
,
e
),
h
=-
1
;
1
>=
h
;
h
++
)
if
(
!
(
0
>
d
+
h
||
d
+
h
>=
b
))
for
(
var
i
=-
1
;
1
>=
i
;
i
++
)
0
>
e
+
i
||
e
+
i
>=
b
||
(
0
!=
h
||
0
!=
i
)
&&
g
==
a
.
isDark
(
d
+
h
,
e
+
i
)
&&
f
++
;
f
>
5
&&
(
c
+=
3
+
f
-
5
)}
for
(
var
d
=
0
;
b
-
1
>
d
;
d
++
)
for
(
var
e
=
0
;
b
-
1
>
e
;
e
++
){
var
j
=
0
;
a
.
isDark
(
d
,
e
)
&&
j
++
,
a
.
isDark
(
d
+
1
,
e
)
&&
j
++
,
a
.
isDark
(
d
,
e
+
1
)
&&
j
++
,
a
.
isDark
(
d
+
1
,
e
+
1
)
&&
j
++
,(
0
==
j
||
4
==
j
)
&&
(
c
+=
3
)}
for
(
var
d
=
0
;
b
>
d
;
d
++
)
for
(
var
e
=
0
;
b
-
6
>
e
;
e
++
)
a
.
isDark
(
d
,
e
)
&&!
a
.
isDark
(
d
,
e
+
1
)
&&
a
.
isDark
(
d
,
e
+
2
)
&&
a
.
isDark
(
d
,
e
+
3
)
&&
a
.
isDark
(
d
,
e
+
4
)
&&!
a
.
isDark
(
d
,
e
+
5
)
&&
a
.
isDark
(
d
,
e
+
6
)
&&
(
c
+=
40
);
for
(
var
e
=
0
;
b
>
e
;
e
++
)
for
(
var
d
=
0
;
b
-
6
>
d
;
d
++
)
a
.
isDark
(
d
,
e
)
&&!
a
.
isDark
(
d
+
1
,
e
)
&&
a
.
isDark
(
d
+
2
,
e
)
&&
a
.
isDark
(
d
+
3
,
e
)
&&
a
.
isDark
(
d
+
4
,
e
)
&&!
a
.
isDark
(
d
+
5
,
e
)
&&
a
.
isDark
(
d
+
6
,
e
)
&&
(
c
+=
40
);
for
(
var
k
=
0
,
e
=
0
;
b
>
e
;
e
++
)
for
(
var
d
=
0
;
b
>
d
;
d
++
)
a
.
isDark
(
d
,
e
)
&&
k
++
;
var
l
=
Math
.
abs
(
100
*
k
/
b
/
b
-
50
)
/
5
;
return
c
+=
10
*
l
}},
g
=
{
glog
:
function
(
a
){
if
(
1
>
a
)
throw
new
Error
(
"glog("
+
a
+
")"
);
return
g
.
LOG_TABLE
[
a
]},
gexp
:
function
(
a
){
for
(;
0
>
a
;)
a
+=
255
;
for
(;
a
>=
256
;)
a
-=
255
;
return
g
.
EXP_TABLE
[
a
]},
EXP_TABLE
:
new
Array
(
256
),
LOG_TABLE
:
new
Array
(
256
)},
h
=
0
;
8
>
h
;
h
++
)
g
.
EXP_TABLE
[
h
]
=
1
<<
h
;
for
(
var
h
=
8
;
256
>
h
;
h
++
)
g
.
EXP_TABLE
[
h
]
=
g
.
EXP_TABLE
[
h
-
4
]
^
g
.
EXP_TABLE
[
h
-
5
]
^
g
.
EXP_TABLE
[
h
-
6
]
^
g
.
EXP_TABLE
[
h
-
8
];
for
(
var
h
=
0
;
255
>
h
;
h
++
)
g
.
LOG_TABLE
[
g
.
EXP_TABLE
[
h
]]
=
h
;
i
.
prototype
=
{
get
:
function
(
a
){
return
this
.
num
[
a
]},
getLength
:
function
(){
return
this
.
num
.
length
},
multiply
:
function
(
a
){
for
(
var
b
=
new
Array
(
this
.
getLength
()
+
a
.
getLength
()
-
1
),
c
=
0
;
c
<
this
.
getLength
();
c
++
)
for
(
var
d
=
0
;
d
<
a
.
getLength
();
d
++
)
b
[
c
+
d
]
^=
g
.
gexp
(
g
.
glog
(
this
.
get
(
c
))
+
g
.
glog
(
a
.
get
(
d
)));
return
new
i
(
b
,
0
)},
mod
:
function
(
a
){
if
(
this
.
getLength
()
-
a
.
getLength
()
<
0
)
return
this
;
for
(
var
b
=
g
.
glog
(
this
.
get
(
0
))
-
g
.
glog
(
a
.
get
(
0
)),
c
=
new
Array
(
this
.
getLength
()),
d
=
0
;
d
<
this
.
getLength
();
d
++
)
c
[
d
]
=
this
.
get
(
d
);
for
(
var
d
=
0
;
d
<
a
.
getLength
();
d
++
)
c
[
d
]
^=
g
.
gexp
(
g
.
glog
(
a
.
get
(
d
))
+
b
);
return
new
i
(
c
,
0
).
mod
(
a
)}},
j
.
RS_BLOCK_TABLE
=
[[
1
,
26
,
19
],[
1
,
26
,
16
],[
1
,
26
,
13
],[
1
,
26
,
9
],[
1
,
44
,
34
],[
1
,
44
,
28
],[
1
,
44
,
22
],[
1
,
44
,
16
],[
1
,
70
,
55
],[
1
,
70
,
44
],[
2
,
35
,
17
],[
2
,
35
,
13
],[
1
,
100
,
80
],[
2
,
50
,
32
],[
2
,
50
,
24
],[
4
,
25
,
9
],[
1
,
134
,
108
],[
2
,
67
,
43
],[
2
,
33
,
15
,
2
,
34
,
16
],[
2
,
33
,
11
,
2
,
34
,
12
],[
2
,
86
,
68
],[
4
,
43
,
27
],[
4
,
43
,
19
],[
4
,
43
,
15
],[
2
,
98
,
78
],[
4
,
49
,
31
],[
2
,
32
,
14
,
4
,
33
,
15
],[
4
,
39
,
13
,
1
,
40
,
14
],[
2
,
121
,
97
],[
2
,
60
,
38
,
2
,
61
,
39
],[
4
,
40
,
18
,
2
,
41
,
19
],[
4
,
40
,
14
,
2
,
41
,
15
],[
2
,
146
,
116
],[
3
,
58
,
36
,
2
,
59
,
37
],[
4
,
36
,
16
,
4
,
37
,
17
],[
4
,
36
,
12
,
4
,
37
,
13
],[
2
,
86
,
68
,
2
,
87
,
69
],[
4
,
69
,
43
,
1
,
70
,
44
],[
6
,
43
,
19
,
2
,
44
,
20
],[
6
,
43
,
15
,
2
,
44
,
16
],[
4
,
101
,
81
],[
1
,
80
,
50
,
4
,
81
,
51
],[
4
,
50
,
22
,
4
,
51
,
23
],[
3
,
36
,
12
,
8
,
37
,
13
],[
2
,
116
,
92
,
2
,
117
,
93
],[
6
,
58
,
36
,
2
,
59
,
37
],[
4
,
46
,
20
,
6
,
47
,
21
],[
7
,
42
,
14
,
4
,
43
,
15
],[
4
,
133
,
107
],[
8
,
59
,
37
,
1
,
60
,
38
],[
8
,
44
,
20
,
4
,
45
,
21
],[
12
,
33
,
11
,
4
,
34
,
12
],[
3
,
145
,
115
,
1
,
146
,
116
],[
4
,
64
,
40
,
5
,
65
,
41
],[
11
,
36
,
16
,
5
,
37
,
17
],[
11
,
36
,
12
,
5
,
37
,
13
],[
5
,
109
,
87
,
1
,
110
,
88
],[
5
,
65
,
41
,
5
,
66
,
42
],[
5
,
54
,
24
,
7
,
55
,
25
],[
11
,
36
,
12
],[
5
,
122
,
98
,
1
,
123
,
99
],[
7
,
73
,
45
,
3
,
74
,
46
],[
15
,
43
,
19
,
2
,
44
,
20
],[
3
,
45
,
15
,
13
,
46
,
16
],[
1
,
135
,
107
,
5
,
136
,
108
],[
10
,
74
,
46
,
1
,
75
,
47
],[
1
,
50
,
22
,
15
,
51
,
23
],[
2
,
42
,
14
,
17
,
43
,
15
],[
5
,
150
,
120
,
1
,
151
,
121
],[
9
,
69
,
43
,
4
,
70
,
44
],[
17
,
50
,
22
,
1
,
51
,
23
],[
2
,
42
,
14
,
19
,
43
,
15
],[
3
,
141
,
113
,
4
,
142
,
114
],[
3
,
70
,
44
,
11
,
71
,
45
],[
17
,
47
,
21
,
4
,
48
,
22
],[
9
,
39
,
13
,
16
,
40
,
14
],[
3
,
135
,
107
,
5
,
136
,
108
],[
3
,
67
,
41
,
13
,
68
,
42
],[
15
,
54
,
24
,
5
,
55
,
25
],[
15
,
43
,
15
,
10
,
44
,
16
],[
4
,
144
,
116
,
4
,
145
,
117
],[
17
,
68
,
42
],[
17
,
50
,
22
,
6
,
51
,
23
],[
19
,
46
,
16
,
6
,
47
,
17
],[
2
,
139
,
111
,
7
,
140
,
112
],[
17
,
74
,
46
],[
7
,
54
,
24
,
16
,
55
,
25
],[
34
,
37
,
13
],[
4
,
151
,
121
,
5
,
152
,
122
],[
4
,
75
,
47
,
14
,
76
,
48
],[
11
,
54
,
24
,
14
,
55
,
25
],[
16
,
45
,
15
,
14
,
46
,
16
],[
6
,
147
,
117
,
4
,
148
,
118
],[
6
,
73
,
45
,
14
,
74
,
46
],[
11
,
54
,
24
,
16
,
55
,
25
],[
30
,
46
,
16
,
2
,
47
,
17
],[
8
,
132
,
106
,
4
,
133
,
107
],[
8
,
75
,
47
,
13
,
76
,
48
],[
7
,
54
,
24
,
22
,
55
,
25
],[
22
,
45
,
15
,
13
,
46
,
16
],[
10
,
142
,
114
,
2
,
143
,
115
],[
19
,
74
,
46
,
4
,
75
,
47
],[
28
,
50
,
22
,
6
,
51
,
23
],[
33
,
46
,
16
,
4
,
47
,
17
],[
8
,
152
,
122
,
4
,
153
,
123
],[
22
,
73
,
45
,
3
,
74
,
46
],[
8
,
53
,
23
,
26
,
54
,
24
],[
12
,
45
,
15
,
28
,
46
,
16
],[
3
,
147
,
117
,
10
,
148
,
118
],[
3
,
73
,
45
,
23
,
74
,
46
],[
4
,
54
,
24
,
31
,
55
,
25
],[
11
,
45
,
15
,
31
,
46
,
16
],[
7
,
146
,
116
,
7
,
147
,
117
],[
21
,
73
,
45
,
7
,
74
,
46
],[
1
,
53
,
23
,
37
,
54
,
24
],[
19
,
45
,
15
,
26
,
46
,
16
],[
5
,
145
,
115
,
10
,
146
,
116
],[
19
,
75
,
47
,
10
,
76
,
48
],[
15
,
54
,
24
,
25
,
55
,
25
],[
23
,
45
,
15
,
25
,
46
,
16
],[
13
,
145
,
115
,
3
,
146
,
116
],[
2
,
74
,
46
,
29
,
75
,
47
],[
42
,
54
,
24
,
1
,
55
,
25
],[
23
,
45
,
15
,
28
,
46
,
16
],[
17
,
145
,
115
],[
10
,
74
,
46
,
23
,
75
,
47
],[
10
,
54
,
24
,
35
,
55
,
25
],[
19
,
45
,
15
,
35
,
46
,
16
],[
17
,
145
,
115
,
1
,
146
,
116
],[
14
,
74
,
46
,
21
,
75
,
47
],[
29
,
54
,
24
,
19
,
55
,
25
],[
11
,
45
,
15
,
46
,
46
,
16
],[
13
,
145
,
115
,
6
,
146
,
116
],[
14
,
74
,
46
,
23
,
75
,
47
],[
44
,
54
,
24
,
7
,
55
,
25
],[
59
,
46
,
16
,
1
,
47
,
17
],[
12
,
151
,
121
,
7
,
152
,
122
],[
12
,
75
,
47
,
26
,
76
,
48
],[
39
,
54
,
24
,
14
,
55
,
25
],[
22
,
45
,
15
,
41
,
46
,
16
],[
6
,
151
,
121
,
14
,
152
,
122
],[
6
,
75
,
47
,
34
,
76
,
48
],[
46
,
54
,
24
,
10
,
55
,
25
],[
2
,
45
,
15
,
64
,
46
,
16
],[
17
,
152
,
122
,
4
,
153
,
123
],[
29
,
74
,
46
,
14
,
75
,
47
],[
49
,
54
,
24
,
10
,
55
,
25
],[
24
,
45
,
15
,
46
,
46
,
16
],[
4
,
152
,
122
,
18
,
153
,
123
],[
13
,
74
,
46
,
32
,
75
,
47
],[
48
,
54
,
24
,
14
,
55
,
25
],[
42
,
45
,
15
,
32
,
46
,
16
],[
20
,
147
,
117
,
4
,
148
,
118
],[
40
,
75
,
47
,
7
,
76
,
48
],[
43
,
54
,
24
,
22
,
55
,
25
],[
10
,
45
,
15
,
67
,
46
,
16
],[
19
,
148
,
118
,
6
,
149
,
119
],[
18
,
75
,
47
,
31
,
76
,
48
],[
34
,
54
,
24
,
34
,
55
,
25
],[
20
,
45
,
15
,
61
,
46
,
16
]],
j
.
getRSBlocks
=
function
(
a
,
b
){
var
c
=
j
.
getRsBlockTable
(
a
,
b
);
if
(
void
0
==
c
)
throw
new
Error
(
"bad rs block @ typeNumber:"
+
a
+
"/errorCorrectLevel:"
+
b
);
for
(
var
d
=
c
.
length
/
3
,
e
=
[],
f
=
0
;
d
>
f
;
f
++
)
for
(
var
g
=
c
[
3
*
f
+
0
],
h
=
c
[
3
*
f
+
1
],
i
=
c
[
3
*
f
+
2
],
k
=
0
;
g
>
k
;
k
++
)
e
.
push
(
new
j
(
h
,
i
));
return
e
},
j
.
getRsBlockTable
=
function
(
a
,
b
){
switch
(
b
){
case
d
.
L
:
return
j
.
RS_BLOCK_TABLE
[
4
*
(
a
-
1
)
+
0
];
case
d
.
M
:
return
j
.
RS_BLOCK_TABLE
[
4
*
(
a
-
1
)
+
1
];
case
d
.
Q
:
return
j
.
RS_BLOCK_TABLE
[
4
*
(
a
-
1
)
+
2
];
case
d
.
H
:
return
j
.
RS_BLOCK_TABLE
[
4
*
(
a
-
1
)
+
3
];
default
:
return
void
0
}},
k
.
prototype
=
{
get
:
function
(
a
){
var
b
=
Math
.
floor
(
a
/
8
);
return
1
==
(
1
&
this
.
buffer
[
b
]
>>>
7
-
a
%
8
)},
put
:
function
(
a
,
b
){
for
(
var
c
=
0
;
b
>
c
;
c
++
)
this
.
putBit
(
1
==
(
1
&
a
>>>
b
-
c
-
1
))},
getLengthInBits
:
function
(){
return
this
.
length
},
putBit
:
function
(
a
){
var
b
=
Math
.
floor
(
this
.
length
/
8
);
this
.
buffer
.
length
<=
b
&&
this
.
buffer
.
push
(
0
),
a
&&
(
this
.
buffer
[
b
]
|=
128
>>>
this
.
length
%
8
),
this
.
length
++
}};
var
l
=
[[
17
,
14
,
11
,
7
],[
32
,
26
,
20
,
14
],[
53
,
42
,
32
,
24
],[
78
,
62
,
46
,
34
],[
106
,
84
,
60
,
44
],[
134
,
106
,
74
,
58
],[
154
,
122
,
86
,
64
],[
192
,
152
,
108
,
84
],[
230
,
180
,
130
,
98
],[
271
,
213
,
151
,
119
],[
321
,
251
,
177
,
137
],[
367
,
287
,
203
,
155
],[
425
,
331
,
241
,
177
],[
458
,
362
,
258
,
194
],[
520
,
412
,
292
,
220
],[
586
,
450
,
322
,
250
],[
644
,
504
,
364
,
280
],[
718
,
560
,
394
,
310
],[
792
,
624
,
442
,
338
],[
858
,
666
,
482
,
382
],[
929
,
711
,
509
,
403
],[
1003
,
779
,
565
,
439
],[
1091
,
857
,
611
,
461
],[
1171
,
911
,
661
,
511
],[
1273
,
997
,
715
,
535
],[
1367
,
1059
,
751
,
593
],[
1465
,
1125
,
805
,
625
],[
1528
,
1190
,
868
,
658
],[
1628
,
1264
,
908
,
698
],[
1732
,
1370
,
982
,
742
],[
1840
,
1452
,
1030
,
790
],[
1952
,
1538
,
1112
,
842
],[
2068
,
1628
,
1168
,
898
],[
2188
,
1722
,
1228
,
958
],[
2303
,
1809
,
1283
,
983
],[
2431
,
1911
,
1351
,
1051
],[
2563
,
1989
,
1423
,
1093
],[
2699
,
2099
,
1499
,
1139
],[
2809
,
2213
,
1579
,
1219
],[
2953
,
2331
,
1663
,
1273
]],
o
=
function
(){
var
a
=
function
(
a
,
b
){
this
.
_el
=
a
,
this
.
_htOption
=
b
};
return
a
.
prototype
.
draw
=
function
(
a
){
function
g
(
a
,
b
){
var
c
=
document
.
createElementNS
(
"http://www.w3.org/2000/svg"
,
a
);
for
(
var
d
in
b
)
b
.
hasOwnProperty
(
d
)
&&
c
.
setAttribute
(
d
,
b
[
d
]);
return
c
}
var
b
=
this
.
_htOption
,
c
=
this
.
_el
,
d
=
a
.
getModuleCount
();
Math
.
floor
(
b
.
width
/
d
),
Math
.
floor
(
b
.
height
/
d
),
this
.
clear
();
var
h
=
g
(
"svg"
,{
viewBox
:
"0 0 "
+
String
(
d
)
+
" "
+
String
(
d
),
width
:
"100%"
,
height
:
"100%"
,
fill
:
b
.
colorLight
});
h
.
setAttributeNS
(
"http://www.w3.org/2000/xmlns/"
,
"xmlns:xlink"
,
"http://www.w3.org/1999/xlink"
),
c
.
appendChild
(
h
),
h
.
appendChild
(
g
(
"rect"
,{
fill
:
b
.
colorDark
,
width
:
"1"
,
height
:
"1"
,
id
:
"template"
}));
for
(
var
i
=
0
;
d
>
i
;
i
++
)
for
(
var
j
=
0
;
d
>
j
;
j
++
)
if
(
a
.
isDark
(
i
,
j
)){
var
k
=
g
(
"use"
,{
x
:
String
(
i
),
y
:
String
(
j
)});
k
.
setAttributeNS
(
"http://www.w3.org/1999/xlink"
,
"href"
,
"#template"
),
h
.
appendChild
(
k
)}},
a
.
prototype
.
clear
=
function
(){
for
(;
this
.
_el
.
hasChildNodes
();)
this
.
_el
.
removeChild
(
this
.
_el
.
lastChild
)},
a
}(),
p
=
"svg"
===
document
.
documentElement
.
tagName
.
toLowerCase
(),
q
=
p
?
o
:
m
()?
function
(){
function
a
(){
this
.
_elImage
.
src
=
this
.
_elCanvas
.
toDataURL
(
"image/png"
),
this
.
_elImage
.
style
.
display
=
"block"
,
this
.
_elCanvas
.
style
.
display
=
"none"
}
function
d
(
a
,
b
){
var
c
=
this
;
if
(
c
.
_fFail
=
b
,
c
.
_fSuccess
=
a
,
null
===
c
.
_bSupportDataURI
){
var
d
=
document
.
createElement
(
"img"
),
e
=
function
(){
c
.
_bSupportDataURI
=!
1
,
c
.
_fFail
&&
_fFail
.
call
(
c
)},
f
=
function
(){
c
.
_bSupportDataURI
=!
0
,
c
.
_fSuccess
&&
c
.
_fSuccess
.
call
(
c
)};
return
d
.
onabort
=
e
,
d
.
onerror
=
e
,
d
.
onload
=
f
,
d
.
src
=
"data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=="
,
void
0
}
c
.
_bSupportDataURI
===!
0
&&
c
.
_fSuccess
?
c
.
_fSuccess
.
call
(
c
):
c
.
_bSupportDataURI
===!
1
&&
c
.
_fFail
&&
c
.
_fFail
.
call
(
c
)}
if
(
this
.
_android
&&
this
.
_android
<=
2.1
){
var
b
=
1
/
window
.
devicePixelRatio
,
c
=
CanvasRenderingContext2D
.
prototype
.
drawImage
;
CanvasRenderingContext2D
.
prototype
.
drawImage
=
function
(
a
,
d
,
e
,
f
,
g
,
h
,
i
,
j
){
if
(
"nodeName"
in
a
&&
/img/i
.
test
(
a
.
nodeName
))
for
(
var
l
=
arguments
.
length
-
1
;
l
>=
1
;
l
--
)
arguments
[
l
]
=
arguments
[
l
]
*
b
;
else
"undefined"
==
typeof
j
&&
(
arguments
[
1
]
*=
b
,
arguments
[
2
]
*=
b
,
arguments
[
3
]
*=
b
,
arguments
[
4
]
*=
b
);
c
.
apply
(
this
,
arguments
)}}
var
e
=
function
(
a
,
b
){
this
.
_bIsPainted
=!
1
,
this
.
_android
=
n
(),
this
.
_htOption
=
b
,
this
.
_elCanvas
=
document
.
createElement
(
"canvas"
),
this
.
_elCanvas
.
width
=
b
.
width
,
this
.
_elCanvas
.
height
=
b
.
height
,
a
.
appendChild
(
this
.
_elCanvas
),
this
.
_el
=
a
,
this
.
_oContext
=
this
.
_elCanvas
.
getContext
(
"2d"
),
this
.
_bIsPainted
=!
1
,
this
.
_elImage
=
document
.
createElement
(
"img"
),
this
.
_elImage
.
style
.
display
=
"none"
,
this
.
_el
.
appendChild
(
this
.
_elImage
),
this
.
_bSupportDataURI
=
null
};
return
e
.
prototype
.
draw
=
function
(
a
){
var
b
=
this
.
_elImage
,
c
=
this
.
_oContext
,
d
=
this
.
_htOption
,
e
=
a
.
getModuleCount
(),
f
=
d
.
width
/
e
,
g
=
d
.
height
/
e
,
h
=
Math
.
round
(
f
),
i
=
Math
.
round
(
g
);
b
.
style
.
display
=
"none"
,
this
.
clear
();
for
(
var
j
=
0
;
e
>
j
;
j
++
)
for
(
var
k
=
0
;
e
>
k
;
k
++
){
var
l
=
a
.
isDark
(
j
,
k
),
m
=
k
*
f
,
n
=
j
*
g
;
c
.
strokeStyle
=
l
?
d
.
colorDark
:
d
.
colorLight
,
c
.
lineWidth
=
1
,
c
.
fillStyle
=
l
?
d
.
colorDark
:
d
.
colorLight
,
c
.
fillRect
(
m
,
n
,
f
,
g
),
c
.
strokeRect
(
Math
.
floor
(
m
)
+
.
5
,
Math
.
floor
(
n
)
+
.
5
,
h
,
i
),
c
.
strokeRect
(
Math
.
ceil
(
m
)
-
.
5
,
Math
.
ceil
(
n
)
-
.
5
,
h
,
i
)}
this
.
_bIsPainted
=!
0
},
e
.
prototype
.
makeImage
=
function
(){
this
.
_bIsPainted
&&
d
.
call
(
this
,
a
)},
e
.
prototype
.
isPainted
=
function
(){
return
this
.
_bIsPainted
},
e
.
prototype
.
clear
=
function
(){
this
.
_oContext
.
clearRect
(
0
,
0
,
this
.
_elCanvas
.
width
,
this
.
_elCanvas
.
height
),
this
.
_bIsPainted
=!
1
},
e
.
prototype
.
round
=
function
(
a
){
return
a
?
Math
.
floor
(
1
e3
*
a
)
/
1
e3
:
a
},
e
}():
function
(){
var
a
=
function
(
a
,
b
){
this
.
_el
=
a
,
this
.
_htOption
=
b
};
return
a
.
prototype
.
draw
=
function
(
a
){
for
(
var
b
=
this
.
_htOption
,
c
=
this
.
_el
,
d
=
a
.
getModuleCount
(),
e
=
Math
.
floor
(
b
.
width
/
d
),
f
=
Math
.
floor
(
b
.
height
/
d
),
g
=
[
'<table style="border:0;border-collapse:collapse;">'
],
h
=
0
;
d
>
h
;
h
++
){
g
.
push
(
"<tr>"
);
for
(
var
i
=
0
;
d
>
i
;
i
++
)
g
.
push
(
'<td style="border:0;border-collapse:collapse;padding:0;margin:0;width:'
+
e
+
"px;height:"
+
f
+
"px;background-color:"
+
(
a
.
isDark
(
h
,
i
)?
b
.
colorDark
:
b
.
colorLight
)
+
';"></td>'
);
g
.
push
(
"</tr>"
)}
g
.
push
(
"</table>"
),
c
.
innerHTML
=
g
.
join
(
""
);
var
j
=
c
.
childNodes
[
0
],
k
=
(
b
.
width
-
j
.
offsetWidth
)
/
2
,
l
=
(
b
.
height
-
j
.
offsetHeight
)
/
2
;
k
>
0
&&
l
>
0
&&
(
j
.
style
.
margin
=
l
+
"px "
+
k
+
"px"
)},
a
.
prototype
.
clear
=
function
(){
this
.
_el
.
innerHTML
=
""
},
a
}();
QRCode
=
function
(
a
,
b
){
if
(
this
.
_htOption
=
{
width
:
256
,
height
:
256
,
typeNumber
:
4
,
colorDark
:
"#000000"
,
colorLight
:
"#ffffff"
,
correctLevel
:
d
.
H
},
"string"
==
typeof
b
&&
(
b
=
{
text
:
b
}),
b
)
for
(
var
c
in
b
)
this
.
_htOption
[
c
]
=
b
[
c
];
"string"
==
typeof
a
&&
(
a
=
document
.
getElementById
(
a
)),
this
.
_android
=
n
(),
this
.
_el
=
a
,
this
.
_oQRCode
=
null
,
this
.
_oDrawing
=
new
q
(
this
.
_el
,
this
.
_htOption
),
this
.
_htOption
.
text
&&
this
.
makeCode
(
this
.
_htOption
.
text
)},
QRCode
.
prototype
.
makeCode
=
function
(
a
){
this
.
_oQRCode
=
new
b
(
r
(
a
,
this
.
_htOption
.
correctLevel
),
this
.
_htOption
.
correctLevel
),
this
.
_oQRCode
.
addData
(
a
),
this
.
_oQRCode
.
make
(),
this
.
_el
.
title
=
a
,
this
.
_oDrawing
.
draw
(
this
.
_oQRCode
),
this
.
makeImage
()},
QRCode
.
prototype
.
makeImage
=
function
(){
"function"
==
typeof
this
.
_oDrawing
.
makeImage
&&
(
!
this
.
_android
||
this
.
_android
>=
3
)
&&
this
.
_oDrawing
.
makeImage
()},
QRCode
.
prototype
.
clear
=
function
(){
this
.
_oDrawing
.
clear
()},
QRCode
.
CorrectLevel
=
d
}();
\ No newline at end of file
src/index.html
View file @
ca277f93
...
@@ -17,7 +17,7 @@
...
@@ -17,7 +17,7 @@
<body>
<body>
<app-root></app-root>
<app-root></app-root>
<script
src=
"assets/js/jquery.min.js"
></script>
<script
src=
"assets/js/jquery.min.js"
></script>
<script
src=
"assets/js/qrcode.
min.
js"
></script>
<script
src=
"assets/js/qrcode.js"
></script>
<!--<script src="https://res.wx.qq.com/open/js/jweixin-1.4.0.js"></script>-->
<!--<script src="https://res.wx.qq.com/open/js/jweixin-1.4.0.js"></script>-->
<script
src=
"https://res2.wx.qq.com/open/js/jweixin-1.4.0.js"
></script>
<script
src=
"https://res2.wx.qq.com/open/js/jweixin-1.4.0.js"
></script>
</body>
</body>
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment