Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
M
mallapp
Project
Project
Details
Activity
Releases
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
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
viitto
mallapp
Commits
47808a3c
Commit
47808a3c
authored
Mar 02, 2022
by
罗超
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
新增咖啡页面
parent
9551a9be
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
2267 additions
and
0 deletions
+2267
-0
pages.json
pages.json
+18
-0
buy.vue
pages/coffee/buy.vue
+202
-0
index.vue
pages/coffee/index.vue
+340
-0
ay-qrcode.vue
pages/coffee/qrcode/ay-qrcode.vue
+411
-0
qrcode_wx.js
pages/coffee/qrcode/qrcode_wx.js
+872
-0
weapp-qrcode.js
pages/coffee/qrcode/weapp-qrcode.js
+424
-0
No files found.
pages.json
View file @
47808a3c
...
@@ -840,6 +840,24 @@
...
@@ -840,6 +840,24 @@
"navigationStyle"
:
"custom"
"navigationStyle"
:
"custom"
}
}
}]
}]
},
//
咖啡
{
"root"
:
"pages/coffee"
,
"pages"
:
[
{
"path"
:
"index"
,
//咖啡首页
"style"
:
{
"navigationStyle"
:
"custom"
}
},
{
"path"
:
"buy"
,
//购买页
"style"
:
{
"navigationStyle"
:
"custom"
}
}
]
}
}
],
],
"globalStyle"
:
{
"globalStyle"
:
{
...
...
pages/coffee/buy.vue
0 → 100644
View file @
47808a3c
<
template
>
<view
class=
"coffeeBuy"
>
<view
class=
"topBox"
:style=
"
{paddingTop:`${statusNavBar}px`}">
<image
src=
"https://viitto-1301420277.cos.ap-chengdu.myqcloud.com/Static/educationStu/coffee/banner2.png"
mode=
"widthFix"
class=
"bg"
></image>
<view
class=
"nav"
>
<u-icon
name=
"arrow-left"
size=
"40"
color=
"#fff"
></u-icon>
<view
class=
"title"
>
购买
</view>
</view>
</view>
<view
class=
"con"
>
<view
v-for=
"(item,index) in pageData.GiveAwayList"
:key=
"index"
class=
"item"
>
<image
src=
"https://viitto-1301420277.cos.ap-chengdu.myqcloud.com/Static/educationStu/coffee/cup2.png"
style=
"width: 130rpx;height: 130rpx;"
></image>
<view
class=
"itemInfo"
>
<view
class=
"BuyNum"
>
星巴克咖啡
{{
item
.
BuyNum
}}
杯
</view>
<view
class=
"GiveAway"
>
买
{{
item
.
BuyNum
}}
杯赠
{{
item
.
GiveAwayNum
}}
杯
</view>
<view
class=
"validate"
>
购入有限期9个月
</view>
</view>
<view
class=
"itemInfo2"
>
<view
class=
"money"
>
<text
class=
"icon"
>
¥
</text>
<text>
{{
item
.
BuyNum
*
pageData
.
SellingPrice
}}
</text>
</view>
<view
class=
"buyBtn"
>
立即购买
</view>
</view>
</view>
</view>
<view
class=
"menu"
>
<view
class=
"menuTitle"
>
咖啡菜单
</view>
</view>
</view>
</
template
>
<
script
>
export
default
{
data
()
{
return
{
statusNavBar
:
0
,
pageData
:
{},
}
},
methods
:
{
getData
()
{
this
.
request2
({
url
:
'/api/AppletCoffee/GetMyCoffeeCouponsInfo'
,
data
:
{}
},
res
=>
{
this
.
pageData
=
res
.
data
}
);
},
},
mounted
()
{
this
.
statusNavBar
=
uni
.
getSystemInfoSync
().
statusBarHeight
this
.
getData
()
},
}
</
script
>
<
style
lang=
"scss"
scoped
>
.coffeeBuy
{
box-sizing
:
border-box
;
min-height
:
100vh
;
background-color
:
#FFFFFF
;
}
.topBox
{
height
:
489rpx
;
position
:
relative
;
.bg
{
width
:
100vw
;
height
:
auto
;
position
:
absolute
;
top
:
0
;
left
:
0
;
z-index
:
0
;
}
.nav
{
height
:
80rpx
;
padding
:
0
30rpx
;
display
:
flex
;
align-items
:
center
;
.title
{
font-size
:
30rpx
;
font-weight
:
500
;
color
:
#FFFFFF
;
margin-left
:
275rpx
;
z-index
:
5
;
}
}
}
.con
{
padding
:
40rpx
;
.item
{
height
:
214rpx
;
background-color
:
#FBF5E9
;
border
:
3rpx
solid
;
border-radius
:
10rpx
;
border-image
:
-webkit-linear-gradient
(
left
,
#f3edda
,
#eadfbc
,
#ece0bd
)
3
3
;
margin-bottom
:
36rpx
;
display
:
flex
;
justify-content
:
space-between
;
align-items
:
center
;
padding
:
30rpx
40rpx
;
.itemInfo
{
width
:
230rpx
;
.BuyNum
{
font-size
:
32rpx
;
font-weight
:
500
;
color
:
#000000
;
margin-bottom
:
20rpx
;
}
.GiveAway
{
padding
:
4rpx
10rpx
;
background-color
:
#F65C10
;
border-radius
:
4rpx
;
text-align
:
center
;
font-size
:
20rpx
;
font-weight
:
500
;
color
:
#FFFFFF
;
display
:
inline-block
;
margin-bottom
:
15rpx
;
}
.validate
{
font-size
:
20rpx
;
font-weight
:
400
;
color
:
#C2B499
;
}
}
.itemInfo2
{
// width: 200rpx;
.money
{
text-align
:
center
;
font-size
:
48rpx
;
font-weight
:
bold
;
color
:
#F65C10
;
.icon
{
font-size
:
28rpx
;
}
}
.buyBtn
{
width
:
200rpx
;
height
:
78rpx
;
background-color
:
#3E766E
;
border-radius
:
39rpx
;
font-size
:
28rpx
;
font-weight
:
500
;
color
:
#FFFFFF
;
text-align
:
center
;
line-height
:
78rpx
;
}
}
}
}
.menu
{
width
:
670rpx
;
height
:
270rpx
;
background-color
:
#F4F4F5
;
border-radius
:
10rpx
;
margin
:
0
auto
;
padding
:
25rpx
40rpx
;
.menuTitle
{
margin
:
20rpx
150rpx
;
line-height
:
2rpx
;
border-left
:
70rpx
solid
#000
;
border-right
:
70rpx
solid
#000
;
text-align
:
center
;
font-size
:
28rpx
;
font-weight
:
bold
;
color
:
#101010
;
}
}
</
style
>
pages/coffee/index.vue
0 → 100644
View file @
47808a3c
<
template
>
<view
class=
"coffeeIndex"
>
<view
class=
"topBox"
:style=
"
{paddingTop:`${statusNavBar}px`}">
<view
class=
"bg1"
></view>
<image
src=
"https://viitto-1301420277.cos.ap-chengdu.myqcloud.com/Static/educationStu/coffee/bg.png"
mode=
"widthFix"
style=
"width: 100vw;height: auto;"
class=
"bg2"
></image>
<view
class=
"nav"
>
<u-icon
name=
"arrow-left"
size=
"40"
></u-icon>
</view>
<view
class=
"welcomeText"
>
你好,同学
</view>
<view
class=
"scanBtn"
@
click=
"showPopup"
>
<image
src=
"https://viitto-1301420277.cos.ap-chengdu.myqcloud.com/Static/educationStu/coffee/ScanCode.png"
mode=
"heightFix"
style=
"height: 37rpx; width: auto;margin-right: 10px;"
></image>
<text>
消费码
</text>
</view>
</view>
<view
class=
"goods"
>
<view
class=
"goodsItem goodsItem1"
>
<view
class=
"num"
>
<text>
{{
pageData
.
SurplusBugNum
||
0
}}
</text>
<text
class=
"unit"
>
杯
</text>
</view>
<view
class=
"goodsinfo"
>
<view
class=
"left"
>
<view
class=
"goodsinfoTitle"
>
剩余已购
</view>
<view
class=
"validate"
>
有效期:2022.12.25
</view>
</view>
<image
src=
"https://viitto-1301420277.cos.ap-chengdu.myqcloud.com/Static/educationStu/coffee/cup.png"
mode=
"heightFix"
style=
"height: 90rpx;width: auto;"
></image>
</view>
</view>
<view
class=
"goodsItem goodsItem2"
>
<image
src=
"https://viitto-1301420277.cos.ap-chengdu.myqcloud.com/Static/educationStu/coffee/free.png"
mode=
"heightFix"
class=
"freeLogo"
></image>
<view
class=
"num"
>
<text>
{{
pageData
.
FreeNum
||
0
}}
</text>
<text
class=
"unit"
>
杯
</text>
</view>
<view
class=
"goodsinfo"
>
<view
class=
"left"
>
<view
class=
"goodsinfoTitle"
>
剩余已购
</view>
<view
class=
"validate"
>
有效期:2022.12.25
</view>
</view>
<image
src=
"https://viitto-1301420277.cos.ap-chengdu.myqcloud.com/Static/educationStu/coffee/cup.png"
mode=
"heightFix"
style=
"height: 90rpx;width: auto;"
></image>
</view>
</view>
</view>
<view
class=
"buyBtn"
@
click=
"jump('/coffee/buy')"
>
<text>
立即购买
</text>
<view
class=
"tipBox"
v-if=
"pageData.GiveAwayList&&pageData.GiveAwayList.length>0"
>
<view
class=
"tipText"
>
买
{{
pageData
.
GiveAwayList
[
0
].
BuyNum
}}
赠
{{
pageData
.
GiveAwayList
[
0
].
GiveAwayNum
}}
</view>
<view
class=
"tipIcon"
>
</view>
</view>
</view>
<view
class=
"logBtn"
>
<view
class=
"logitem buy"
>
购买记录
</view>
<view
class=
"logitem spend"
>
消费记录
</view>
</view>
<u-popup
v-model=
"isShowQrcode"
mode=
"center"
>
<view
style=
"margin: 60rpx;"
>
<Qrcode
ref=
"qrcode"
:modal=
"modal_qr"
:url=
"url"
@
hideQrcode=
"hideQrcode"
:width=
"300"
:height=
"300"
themeColor=
"#44766E"
is_themeImg
:h_w_img=
"80"
:themeImg=
"headImg"
/>
</view>
</u-popup>
</view>
</
template
>
<
script
>
import
Qrcode
from
"./qrcode/ay-qrcode.vue"
export
default
{
components
:
{
Qrcode
},
data
()
{
return
{
statusNavBar
:
0
,
modal_qr
:
false
,
url
:
'http://baidu.com/s'
,
// 要生成的二维码值
isShowQrcode
:
false
,
headImg
:
"https://viitto-1301420277.cos.ap-chengdu.myqcloud.com/Static/educationStu/coffee/cup.png"
,
pageData
:{}
}
},
onLoad
()
{
this
.
statusNavBar
=
uni
.
getSystemInfoSync
().
statusBarHeight
if
(
uni
.
getStorageSync
(
'mall_UserInfo'
).
Photo
){
this
.
headImg
=
uni
.
getStorageSync
(
'mall_UserInfo'
).
Photo
}
this
.
showQrcode
();
//一加载生成二维码
this
.
getData
()
},
methods
:
{
showPopup
(){
this
.
isShowQrcode
=
true
},
// 展示二维码
showQrcode
()
{
let
_this
=
this
;
this
.
modal_qr
=
true
;
setTimeout
(
function
()
{
_this
.
$refs
.
qrcode
.
crtQrCode
()
},
50
)
},
//传入组件的方法
hideQrcode
()
{
this
.
modal_qr
=
false
;
},
jump
(
url
){
uni
.
navigateTo
({
url
:
"/pages"
+
url
,
})
},
getData
(){
this
.
request2
({
url
:
'/api/AppletCoffee/GetMyCoffeeCouponsInfo'
,
data
:
{}
},
res
=>
{
this
.
pageData
=
res
.
data
}
);
},
}
}
</
script
>
<
style
lang=
"scss"
scoped
>
.coffeeIndex
{
box-sizing
:
border-box
;
min-height
:
100vh
;
background-color
:
#F5F5F5
;
}
.topBox
{
height
:
725rpx
;
position
:
relative
;
}
.bg1
{
width
:
600rpx
;
height
:
420rpx
;
border-radius
:
50%
;
background-color
:
#EFE9DA
;
position
:
absolute
;
top
:
-190rpx
;
left
:
-195rpx
;
}
.bg2
{
position
:
absolute
;
bottom
:
0rpx
;
left
:
0rpx
;
}
.nav
{
height
:
80rpx
;
padding
:
0
30rpx
;
display
:
flex
;
align-items
:
center
;
}
.welcomeText
{
font-size
:
46rpx
;
font-family
:
PingFang
SC
;
font-weight
:
bold
;
color
:
#232323
;
position
:
absolute
;
top
:
150rpx
;
left
:
65rpx
;
}
.scanBtn
{
width
:
185rpx
;
height
:
78rpx
;
background-color
:
#3E766E
;
border-radius
:
39rpx
;
position
:
absolute
;
top
:
235rpx
;
left
:
65rpx
;
display
:
flex
;
justify-content
:
center
;
align-items
:
center
;
font-size
:
28rpx
;
font-family
:
PingFang
SC
;
// font-weight: 500;
color
:
#FFFFFF
;
}
.goods
{
position
:
relative
;
.goodsItem
{
width
:
320rpx
;
height
:
216rpx
;
background
:
linear-gradient
(
90deg
,
#F7F7F7
,
#FFFFFF
);
box-shadow
:
0px
27rpx
40rpx
0rpx
rgba
(
76
,
76
,
76
,
0
.1
);
border-radius
:
20rpx
;
position
:
absolute
;
top
:
-40rpx
;
padding
:
40rpx
25rpx
30rpx
30rpx
;
.num
{
font-size
:
50rpx
;
font-family
:
PingFang
SC
;
font-weight
:
800
;
color
:
#000000
;
margin-bottom
:
15rpx
;
line-height
:
40rpx
;
.unit
{
font-size
:
28rpx
;
margin-left
:
10px
;
font-weight
:
500
;
}
}
}
.goodsinfo
{
display
:
flex
;
justify-content
:
space-between
;
.goodsinfoTitle
{
font-size
:
28rpx
;
font-weight
:
500
;
color
:
#000000
;
margin
:
10rpx
0
;
}
.validate
{
font-size
:
20rpx
;
font-weight
:
500
;
color
:
#CCCCCC
;
}
}
.goodsItem1
{
left
:
40rpx
;
}
.goodsItem2
{
right
:
40rpx
;
overflow
:
hidden
;
.freeLogo
{
height
:
80rpx
;
width
:
auto
;
position
:
absolute
;
top
:
0
;
right
:
0
;
border-top-right-radius
:
20rpx
;
}
}
}
.buyBtn
{
width
:
656rpx
;
height
:
90rpx
;
background-color
:
#3E766E
;
border-radius
:
45rpx
;
display
:
flex
;
justify-content
:
center
;
align-items
:
center
;
margin
:
295rpx
auto
0
;
font-size
:
28rpx
;
font-family
:
PingFang
SC
;
font-weight
:
500
;
color
:
#FFFFFF
;
position
:
relative
;
.tipBox
{
position
:
absolute
;
top
:
-20rpx
;
left
:
390rpx
;
.tipText
{
width
:
146rpx
;
height
:
45rpx
;
background-color
:
#F3ED4A
;
border-radius
:
22
.5rpx
;
font-size
:
24rpx
;
font-weight
:
600
;
color
:
#484501
;
display
:
flex
;
justify-content
:
center
;
align-items
:
center
;
}
.tipIcon
{
width
:
0
;
height
:
0
;
border-top
:
15rpx
solid
#F3ED4A
;
border-right
:
10rpx
solid
transparent
;
border-left
:
6rpx
solid
transparent
;
margin-left
:
20rpx
;
}
}
}
.logBtn
{
display
:
flex
;
justify-content
:
center
;
align-items
:
center
;
margin-top
:
90rpx
;
.logitem
{
font-size
:
28rpx
;
font-family
:
PingFang
SC
;
font-weight
:
500
;
color
:
#3E766E
;
}
.buy
{
margin-right
:
130rpx
;
}
}
</
style
>
pages/coffee/qrcode/ay-qrcode.vue
0 → 100644
View file @
47808a3c
<
template
>
<view
:class=
"modal?'show-qrcode':'hide-qrcode'"
>
<view
class=
"box-qrcode"
:style=
"
{'margin-left': marginLeft + 'px'}" @longtap="longtapCode">
<!-- style="width: 550rpx;height: 550rpx;" -->
<canvas
class=
"canvas-qrcode"
:style=
"style_w_h"
:canvas-id=
"qrcode_id"
>
<!-- #ifndef MP -->
<view
v-if=
"modal&&is_themeImg"
:style=
"style_w_h"
class=
"box-img-qrcode"
>
<image
:style=
"style_w_h_img"
mode=
"scaleToFill"
:src=
"themeImg"
></image>
</view>
<!-- #endif -->
</canvas>
<!--
<image
mode=
"scaleToFill"
:src=
"imagePath"
></image>
-->
</view>
</view>
</
template
>
<
script
>
var
qr_we
=
require
(
"./qrcode_wx.js"
);
const
qrCode
=
require
(
'./weapp-qrcode.js'
)
export
default
{
data
()
{
return
{
isAndroid
:
false
,
show
:
true
,
imagePath
:
''
,
// qrcode_id: 'qrcode_id',
marginLeft
:
0
,
//一般的安卓app只需加30就能显示全
//苹果app的不加就能显示全,加了就要弄margin-left
//有些安卓app显示不全
add_num
:
30
,
add_num_key
:
'rectify_code_key'
,
}
},
props
:
{
modal
:
{
type
:
Boolean
,
default
:
false
},
url
:
{
type
:
String
,
default
:
''
},
height
:
{
type
:
Number
,
default
:
260
},
width
:
{
type
:
Number
,
default
:
260
},
themeColor
:
{
type
:
String
,
default
:
'#333333'
,
},
qrcode_id
:
{
type
:
String
,
default
:
'qrcode_id'
,
},
is_themeImg
:
{
type
:
Boolean
,
default
:
false
,
},
themeImg
:
{
type
:
String
,
default
:
'https://cdn.pixabay.com/photo/2016/11/29/13/24/balloons-1869816__340.jpg'
,
},
h_w_img
:
{
type
:
Number
,
default
:
30
},
},
watch
:{
},
computed
:
{
style_w_h
()
{
return
this
.
set_style_w_h
();
},
style_w_h_img
()
{
let
that
=
this
;
var
height
=
parseInt
(
that
.
h_w_img
);
var
width
=
parseInt
(
that
.
h_w_img
);
var
style
=
''
;
if
(
height
>
0
)
{
style
=
`height:
${
height
*
2
}
rpx;`
;
}
if
(
width
>
0
)
{
style
+=
`width:
${
width
*
2
}
rpx;z-index: 2;`
;
}
return
style
;
},
},
created
:
function
()
{
let
that
=
this
;
try
{
//app苹果二维码不居中
//#ifndef MP
let
isAndroid
=
false
;
const
res
=
uni
.
getSystemInfoSync
();
if
(
res
.
platform
==
'android'
){
isAndroid
=
true
;
}
else
{
isAndroid
=
false
;
}
if
(
!
isAndroid
)
{
that
.
marginLeft
=
46
;
}
that
.
isAndroid
=
isAndroid
;
try
{
const
add_num
=
uni
.
getStorageSync
(
that
.
add_num_key
);
if
(
add_num
)
{
that
.
add_num
=
add_num
;
}
}
catch
(
e
)
{
// error
}
// #endif
}
catch
(
e
)
{
// error
}
//#ifdef MP
//that.marginLeft = 40;
// #endif
},
methods
:
{
set_style_w_h
(){
let
that
=
this
;
var
height
=
parseInt
(
that
.
height
);
var
width
=
parseInt
(
that
.
width
);
var
style
=
''
;
var
height
=
height
*
2
;
var
width
=
width
*
2
;
//#ifndef MP
var
add
=
that
.
add_num
;
height
+=
add
;
width
+=
add
;
// #endif
if
(
height
>
0
)
{
style
=
`height:
${
height
}
rpx;`
;
}
if
(
width
>
0
)
{
style
+=
`width:
${
width
}
rpx;`
;
}
return
style
;
},
hideQrcode
()
{
this
.
$emit
(
"hideQrcode"
)
},
// 二维码生成工具
crtQrCode
()
{
let
that
=
this
;
//#ifndef MP
new
qrCode
(
that
.
qrcode_id
,
{
text
:
this
.
url
,
width
:
that
.
width
,
height
:
that
.
height
,
colorDark
:
that
.
themeColor
,
//#333333
colorLight
:
"#FFFFFF"
,
correctLevel
:
qrCode
.
CorrectLevel
.
H
,
})
// #endif
//#ifdef MP
that
.
createQrCode
(
this
.
url
,
that
.
qrcode_id
,
that
.
width
,
that
.
height
,
that
.
themeColor
,
that
.
is_themeImg
,
that
.
themeImg
,
that
.
h_w_img
);
// #endif
//that.createQrCode(this.url, that.qrcode_id, that.width, that.height);
},
//#ifdef MP
createQrCode
:
function
(
url
,
canvasId
,
cavW
,
cavH
,
cavColor
,
haveImg
,
imgurl
,
imgsize
)
{
//调用插件中的draw方法,绘制二维码图片
qr_we
.
api
.
draw
(
url
,
canvasId
,
cavW
,
cavH
,
cavColor
,
haveImg
,
imgurl
,
imgsize
,
this
,
this
.
canvasToTempImage
);
// setTimeout(() => { this.canvasToTempImage();},100);
},
// #endif
//获取临时缓存照片路径,存入data中
canvasToTempImage
:
function
()
{
var
that
=
this
;
},
saveImage
:
function
()
{
var
that
=
this
;
uni
.
canvasToTempFilePath
({
canvasId
:
that
.
qrcode_id
,
success
:
function
(
res
)
{
var
tempFilePath
=
res
.
tempFilePath
;
console
.
log
(
tempFilePath
);
that
.
imagePath
=
tempFilePath
;
//保存到相册
// uni.saveFile({
// tempFilePath: tempFilePath,
// success: function (res2) {
// var savedFilePath = res2.savedFilePath;
// }
// });
uni
.
saveImageToPhotosAlbum
({
filePath
:
tempFilePath
,
success
:
function
(
res3
)
{
uni
.
showModal
({
title
:
'提示'
,
content
:
'保存成功'
,
confirmText
:
'确定'
,
showCancel
:
false
,
confirmColor
:
'#33CCCC'
,
success
(
res4
)
{
}
})
},
});
},
fail
:
function
(
res
)
{
console
.
log
(
res
);
}
},
that
);
},
//微信小程序支持:长按二维码,提示是否保存相册
//安卓APP长按校正二维码
longtapCode
(){
var
that
=
this
;
//#ifndef MP
uni
.
showModal
({
title
:
'校正二维码'
,
content
:
'二维码是否异常'
,
confirmText
:
'确定'
,
confirmColor
:
'#33CCCC'
,
success
(
res
)
{
if
(
res
.
confirm
)
{
that
.
rectify_code
();
}
}
})
// #endif
//#ifdef MP-WEIXIN
uni
.
showModal
({
title
:
'提示'
,
content
:
'是否保存到相册'
,
confirmText
:
'确定'
,
confirmColor
:
'#33CCCC'
,
success
(
res
)
{
if
(
res
.
confirm
)
{
that
.
saveImage
();
}
}
})
// #endif
},
//安卓有些手机不正常,长按可选择矫正
rectify_code
(){
var
that
=
this
;
let
add_num
=
that
.
add_num
;
add_num
+=
30
;
that
.
add_num
=
add_num
;
that
.
crtQrCode
();
//重新生成才会立即覆盖
try
{
//第一次长按校正设置了就不用在设置
uni
.
setStorage
({
key
:
that
.
add_num_key
,
data
:
add_num
,
success
:
function
()
{
}
});
}
catch
(
e
)
{
// error
}
},
},
mounted
()
{}
}
</
script
>
<
style
scoped
lang=
"scss"
>
// .qrcode-box {
// position: fixed;
// left: 0;
// top: 0;
// right: 0;
// bottom: 0;
// height: 100vh;
// width: 100vw;
// background-color: rgba(59, 59, 59, 0.6);
// // opacity: 0.8;
// text-align: center;
// display: flex;
// align-items: center;
// display: none;
// .qrcode-item {
// flex: 1;
// position: relative;
// text-align: center;
// .item-box {
// width: 90%;
// margin: auto;
// display: inline-block;
// margin-top: 30%;
// padding-bottom: 30rpx;
// // animation: show 0.7s;
// .title {
// font-size: 46rpx;
// text-align: center;
// margin-bottom: 24rpx;
// }
// .canvas {
// margin: auto;
// display: inline-block;
// margin: auto;
// }
// background-color: #FFFFFF;
// }
// }
// }
.box-qrcode
{
text-align
:
center
;
position
:
relative
;
.box-img-qrcode
{
position
:
absolute
;
display
:
flex
;
flex-direction
:
column
;
justify-content
:
center
;
align-items
:
center
;
z-index
:
2
;
}
}
image
{
width
:
60upx
;
height
:
60upx
;
border-radius
:
50%
;
}
.canvas-qrcode
{
margin
:
auto
;
display
:
inline-block
;
float
:
left
;
}
.opacity-qrcode
{
opacity
:
0
;
display
:
block
;
}
.show-qrcode
{
display
:
block
;
animation
:
fade
0
.7s
;
// -moz-animation: fade 0.5s; /* Firefox */
// -webkit-animation: fade 0.5s; /* Safari 和 Chrome */
// -o-animation: fade 0.5s;
}
.hide-qrcode
{
animation
:
hide
0
.7s
;
}
@keyframes
fade
{
from
{
opacity
:
0
.8
;
}
to
{
opacity
:
1
;
}
}
@keyframes
hide
{
from
{
opacity
:
1
;
}
to
{
opacity
:
0
;
}
}
</
style
>
pages/coffee/qrcode/qrcode_wx.js
0 → 100644
View file @
47808a3c
!
(
function
()
{
// alignment pattern
var
adelta
=
[
0
,
11
,
15
,
19
,
23
,
27
,
31
,
16
,
18
,
20
,
22
,
24
,
26
,
28
,
20
,
22
,
24
,
24
,
26
,
28
,
28
,
22
,
24
,
24
,
26
,
26
,
28
,
28
,
24
,
24
,
26
,
26
,
26
,
28
,
28
,
24
,
26
,
26
,
26
,
28
,
28
];
// version block
var
vpat
=
[
0xc94
,
0x5bc
,
0xa99
,
0x4d3
,
0xbf6
,
0x762
,
0x847
,
0x60d
,
0x928
,
0xb78
,
0x45d
,
0xa17
,
0x532
,
0x9a6
,
0x683
,
0x8c9
,
0x7ec
,
0xec4
,
0x1e1
,
0xfab
,
0x08e
,
0xc1a
,
0x33f
,
0xd75
,
0x250
,
0x9d5
,
0x6f0
,
0x8ba
,
0x79f
,
0xb0b
,
0x42e
,
0xa64
,
0x541
,
0xc69
];
// final format bits with mask: level << 3 | mask
var
fmtword
=
[
0x77c4
,
0x72f3
,
0x7daa
,
0x789d
,
0x662f
,
0x6318
,
0x6c41
,
0x6976
,
//L
0x5412
,
0x5125
,
0x5e7c
,
0x5b4b
,
0x45f9
,
0x40ce
,
0x4f97
,
0x4aa0
,
//M
0x355f
,
0x3068
,
0x3f31
,
0x3a06
,
0x24b4
,
0x2183
,
0x2eda
,
0x2bed
,
//Q
0x1689
,
0x13be
,
0x1ce7
,
0x19d0
,
0x0762
,
0x0255
,
0x0d0c
,
0x083b
//H
];
// 4 per version: number of blocks 1,2; data width; ecc width
var
eccblocks
=
[
1
,
0
,
19
,
7
,
1
,
0
,
16
,
10
,
1
,
0
,
13
,
13
,
1
,
0
,
9
,
17
,
1
,
0
,
34
,
10
,
1
,
0
,
28
,
16
,
1
,
0
,
22
,
22
,
1
,
0
,
16
,
28
,
1
,
0
,
55
,
15
,
1
,
0
,
44
,
26
,
2
,
0
,
17
,
18
,
2
,
0
,
13
,
22
,
1
,
0
,
80
,
20
,
2
,
0
,
32
,
18
,
2
,
0
,
24
,
26
,
4
,
0
,
9
,
16
,
1
,
0
,
108
,
26
,
2
,
0
,
43
,
24
,
2
,
2
,
15
,
18
,
2
,
2
,
11
,
22
,
2
,
0
,
68
,
18
,
4
,
0
,
27
,
16
,
4
,
0
,
19
,
24
,
4
,
0
,
15
,
28
,
2
,
0
,
78
,
20
,
4
,
0
,
31
,
18
,
2
,
4
,
14
,
18
,
4
,
1
,
13
,
26
,
2
,
0
,
97
,
24
,
2
,
2
,
38
,
22
,
4
,
2
,
18
,
22
,
4
,
2
,
14
,
26
,
2
,
0
,
116
,
30
,
3
,
2
,
36
,
22
,
4
,
4
,
16
,
20
,
4
,
4
,
12
,
24
,
2
,
2
,
68
,
18
,
4
,
1
,
43
,
26
,
6
,
2
,
19
,
24
,
6
,
2
,
15
,
28
,
4
,
0
,
81
,
20
,
1
,
4
,
50
,
30
,
4
,
4
,
22
,
28
,
3
,
8
,
12
,
24
,
2
,
2
,
92
,
24
,
6
,
2
,
36
,
22
,
4
,
6
,
20
,
26
,
7
,
4
,
14
,
28
,
4
,
0
,
107
,
26
,
8
,
1
,
37
,
22
,
8
,
4
,
20
,
24
,
12
,
4
,
11
,
22
,
3
,
1
,
115
,
30
,
4
,
5
,
40
,
24
,
11
,
5
,
16
,
20
,
11
,
5
,
12
,
24
,
5
,
1
,
87
,
22
,
5
,
5
,
41
,
24
,
5
,
7
,
24
,
30
,
11
,
7
,
12
,
24
,
5
,
1
,
98
,
24
,
7
,
3
,
45
,
28
,
15
,
2
,
19
,
24
,
3
,
13
,
15
,
30
,
1
,
5
,
107
,
28
,
10
,
1
,
46
,
28
,
1
,
15
,
22
,
28
,
2
,
17
,
14
,
28
,
5
,
1
,
120
,
30
,
9
,
4
,
43
,
26
,
17
,
1
,
22
,
28
,
2
,
19
,
14
,
28
,
3
,
4
,
113
,
28
,
3
,
11
,
44
,
26
,
17
,
4
,
21
,
26
,
9
,
16
,
13
,
26
,
3
,
5
,
107
,
28
,
3
,
13
,
41
,
26
,
15
,
5
,
24
,
30
,
15
,
10
,
15
,
28
,
4
,
4
,
116
,
28
,
17
,
0
,
42
,
26
,
17
,
6
,
22
,
28
,
19
,
6
,
16
,
30
,
2
,
7
,
111
,
28
,
17
,
0
,
46
,
28
,
7
,
16
,
24
,
30
,
34
,
0
,
13
,
24
,
4
,
5
,
121
,
30
,
4
,
14
,
47
,
28
,
11
,
14
,
24
,
30
,
16
,
14
,
15
,
30
,
6
,
4
,
117
,
30
,
6
,
14
,
45
,
28
,
11
,
16
,
24
,
30
,
30
,
2
,
16
,
30
,
8
,
4
,
106
,
26
,
8
,
13
,
47
,
28
,
7
,
22
,
24
,
30
,
22
,
13
,
15
,
30
,
10
,
2
,
114
,
28
,
19
,
4
,
46
,
28
,
28
,
6
,
22
,
28
,
33
,
4
,
16
,
30
,
8
,
4
,
122
,
30
,
22
,
3
,
45
,
28
,
8
,
26
,
23
,
30
,
12
,
28
,
15
,
30
,
3
,
10
,
117
,
30
,
3
,
23
,
45
,
28
,
4
,
31
,
24
,
30
,
11
,
31
,
15
,
30
,
7
,
7
,
116
,
30
,
21
,
7
,
45
,
28
,
1
,
37
,
23
,
30
,
19
,
26
,
15
,
30
,
5
,
10
,
115
,
30
,
19
,
10
,
47
,
28
,
15
,
25
,
24
,
30
,
23
,
25
,
15
,
30
,
13
,
3
,
115
,
30
,
2
,
29
,
46
,
28
,
42
,
1
,
24
,
30
,
23
,
28
,
15
,
30
,
17
,
0
,
115
,
30
,
10
,
23
,
46
,
28
,
10
,
35
,
24
,
30
,
19
,
35
,
15
,
30
,
17
,
1
,
115
,
30
,
14
,
21
,
46
,
28
,
29
,
19
,
24
,
30
,
11
,
46
,
15
,
30
,
13
,
6
,
115
,
30
,
14
,
23
,
46
,
28
,
44
,
7
,
24
,
30
,
59
,
1
,
16
,
30
,
12
,
7
,
121
,
30
,
12
,
26
,
47
,
28
,
39
,
14
,
24
,
30
,
22
,
41
,
15
,
30
,
6
,
14
,
121
,
30
,
6
,
34
,
47
,
28
,
46
,
10
,
24
,
30
,
2
,
64
,
15
,
30
,
17
,
4
,
122
,
30
,
29
,
14
,
46
,
28
,
49
,
10
,
24
,
30
,
24
,
46
,
15
,
30
,
4
,
18
,
122
,
30
,
13
,
32
,
46
,
28
,
48
,
14
,
24
,
30
,
42
,
32
,
15
,
30
,
20
,
4
,
117
,
30
,
40
,
7
,
47
,
28
,
43
,
22
,
24
,
30
,
10
,
67
,
15
,
30
,
19
,
6
,
118
,
30
,
18
,
31
,
47
,
28
,
34
,
34
,
24
,
30
,
20
,
61
,
15
,
30
];
// Galois field log table
var
glog
=
[
0xff
,
0x00
,
0x01
,
0x19
,
0x02
,
0x32
,
0x1a
,
0xc6
,
0x03
,
0xdf
,
0x33
,
0xee
,
0x1b
,
0x68
,
0xc7
,
0x4b
,
0x04
,
0x64
,
0xe0
,
0x0e
,
0x34
,
0x8d
,
0xef
,
0x81
,
0x1c
,
0xc1
,
0x69
,
0xf8
,
0xc8
,
0x08
,
0x4c
,
0x71
,
0x05
,
0x8a
,
0x65
,
0x2f
,
0xe1
,
0x24
,
0x0f
,
0x21
,
0x35
,
0x93
,
0x8e
,
0xda
,
0xf0
,
0x12
,
0x82
,
0x45
,
0x1d
,
0xb5
,
0xc2
,
0x7d
,
0x6a
,
0x27
,
0xf9
,
0xb9
,
0xc9
,
0x9a
,
0x09
,
0x78
,
0x4d
,
0xe4
,
0x72
,
0xa6
,
0x06
,
0xbf
,
0x8b
,
0x62
,
0x66
,
0xdd
,
0x30
,
0xfd
,
0xe2
,
0x98
,
0x25
,
0xb3
,
0x10
,
0x91
,
0x22
,
0x88
,
0x36
,
0xd0
,
0x94
,
0xce
,
0x8f
,
0x96
,
0xdb
,
0xbd
,
0xf1
,
0xd2
,
0x13
,
0x5c
,
0x83
,
0x38
,
0x46
,
0x40
,
0x1e
,
0x42
,
0xb6
,
0xa3
,
0xc3
,
0x48
,
0x7e
,
0x6e
,
0x6b
,
0x3a
,
0x28
,
0x54
,
0xfa
,
0x85
,
0xba
,
0x3d
,
0xca
,
0x5e
,
0x9b
,
0x9f
,
0x0a
,
0x15
,
0x79
,
0x2b
,
0x4e
,
0xd4
,
0xe5
,
0xac
,
0x73
,
0xf3
,
0xa7
,
0x57
,
0x07
,
0x70
,
0xc0
,
0xf7
,
0x8c
,
0x80
,
0x63
,
0x0d
,
0x67
,
0x4a
,
0xde
,
0xed
,
0x31
,
0xc5
,
0xfe
,
0x18
,
0xe3
,
0xa5
,
0x99
,
0x77
,
0x26
,
0xb8
,
0xb4
,
0x7c
,
0x11
,
0x44
,
0x92
,
0xd9
,
0x23
,
0x20
,
0x89
,
0x2e
,
0x37
,
0x3f
,
0xd1
,
0x5b
,
0x95
,
0xbc
,
0xcf
,
0xcd
,
0x90
,
0x87
,
0x97
,
0xb2
,
0xdc
,
0xfc
,
0xbe
,
0x61
,
0xf2
,
0x56
,
0xd3
,
0xab
,
0x14
,
0x2a
,
0x5d
,
0x9e
,
0x84
,
0x3c
,
0x39
,
0x53
,
0x47
,
0x6d
,
0x41
,
0xa2
,
0x1f
,
0x2d
,
0x43
,
0xd8
,
0xb7
,
0x7b
,
0xa4
,
0x76
,
0xc4
,
0x17
,
0x49
,
0xec
,
0x7f
,
0x0c
,
0x6f
,
0xf6
,
0x6c
,
0xa1
,
0x3b
,
0x52
,
0x29
,
0x9d
,
0x55
,
0xaa
,
0xfb
,
0x60
,
0x86
,
0xb1
,
0xbb
,
0xcc
,
0x3e
,
0x5a
,
0xcb
,
0x59
,
0x5f
,
0xb0
,
0x9c
,
0xa9
,
0xa0
,
0x51
,
0x0b
,
0xf5
,
0x16
,
0xeb
,
0x7a
,
0x75
,
0x2c
,
0xd7
,
0x4f
,
0xae
,
0xd5
,
0xe9
,
0xe6
,
0xe7
,
0xad
,
0xe8
,
0x74
,
0xd6
,
0xf4
,
0xea
,
0xa8
,
0x50
,
0x58
,
0xaf
];
// Galios field exponent table
var
gexp
=
[
0x01
,
0x02
,
0x04
,
0x08
,
0x10
,
0x20
,
0x40
,
0x80
,
0x1d
,
0x3a
,
0x74
,
0xe8
,
0xcd
,
0x87
,
0x13
,
0x26
,
0x4c
,
0x98
,
0x2d
,
0x5a
,
0xb4
,
0x75
,
0xea
,
0xc9
,
0x8f
,
0x03
,
0x06
,
0x0c
,
0x18
,
0x30
,
0x60
,
0xc0
,
0x9d
,
0x27
,
0x4e
,
0x9c
,
0x25
,
0x4a
,
0x94
,
0x35
,
0x6a
,
0xd4
,
0xb5
,
0x77
,
0xee
,
0xc1
,
0x9f
,
0x23
,
0x46
,
0x8c
,
0x05
,
0x0a
,
0x14
,
0x28
,
0x50
,
0xa0
,
0x5d
,
0xba
,
0x69
,
0xd2
,
0xb9
,
0x6f
,
0xde
,
0xa1
,
0x5f
,
0xbe
,
0x61
,
0xc2
,
0x99
,
0x2f
,
0x5e
,
0xbc
,
0x65
,
0xca
,
0x89
,
0x0f
,
0x1e
,
0x3c
,
0x78
,
0xf0
,
0xfd
,
0xe7
,
0xd3
,
0xbb
,
0x6b
,
0xd6
,
0xb1
,
0x7f
,
0xfe
,
0xe1
,
0xdf
,
0xa3
,
0x5b
,
0xb6
,
0x71
,
0xe2
,
0xd9
,
0xaf
,
0x43
,
0x86
,
0x11
,
0x22
,
0x44
,
0x88
,
0x0d
,
0x1a
,
0x34
,
0x68
,
0xd0
,
0xbd
,
0x67
,
0xce
,
0x81
,
0x1f
,
0x3e
,
0x7c
,
0xf8
,
0xed
,
0xc7
,
0x93
,
0x3b
,
0x76
,
0xec
,
0xc5
,
0x97
,
0x33
,
0x66
,
0xcc
,
0x85
,
0x17
,
0x2e
,
0x5c
,
0xb8
,
0x6d
,
0xda
,
0xa9
,
0x4f
,
0x9e
,
0x21
,
0x42
,
0x84
,
0x15
,
0x2a
,
0x54
,
0xa8
,
0x4d
,
0x9a
,
0x29
,
0x52
,
0xa4
,
0x55
,
0xaa
,
0x49
,
0x92
,
0x39
,
0x72
,
0xe4
,
0xd5
,
0xb7
,
0x73
,
0xe6
,
0xd1
,
0xbf
,
0x63
,
0xc6
,
0x91
,
0x3f
,
0x7e
,
0xfc
,
0xe5
,
0xd7
,
0xb3
,
0x7b
,
0xf6
,
0xf1
,
0xff
,
0xe3
,
0xdb
,
0xab
,
0x4b
,
0x96
,
0x31
,
0x62
,
0xc4
,
0x95
,
0x37
,
0x6e
,
0xdc
,
0xa5
,
0x57
,
0xae
,
0x41
,
0x82
,
0x19
,
0x32
,
0x64
,
0xc8
,
0x8d
,
0x07
,
0x0e
,
0x1c
,
0x38
,
0x70
,
0xe0
,
0xdd
,
0xa7
,
0x53
,
0xa6
,
0x51
,
0xa2
,
0x59
,
0xb2
,
0x79
,
0xf2
,
0xf9
,
0xef
,
0xc3
,
0x9b
,
0x2b
,
0x56
,
0xac
,
0x45
,
0x8a
,
0x09
,
0x12
,
0x24
,
0x48
,
0x90
,
0x3d
,
0x7a
,
0xf4
,
0xf5
,
0xf7
,
0xf3
,
0xfb
,
0xeb
,
0xcb
,
0x8b
,
0x0b
,
0x16
,
0x2c
,
0x58
,
0xb0
,
0x7d
,
0xfa
,
0xe9
,
0xcf
,
0x83
,
0x1b
,
0x36
,
0x6c
,
0xd8
,
0xad
,
0x47
,
0x8e
,
0x00
];
// Working buffers:
// data input and ecc append, image working buffer, fixed part of image, run lengths for badness
var
strinbuf
=
[],
eccbuf
=
[],
qrframe
=
[],
framask
=
[],
rlens
=
[];
// Control values - width is based on version, last 4 are from table.
var
version
,
width
,
neccblk1
,
neccblk2
,
datablkw
,
eccblkwid
;
var
ecclevel
=
2
;
// set bit to indicate cell in qrframe is immutable. symmetric around diagonal
function
setmask
(
x
,
y
)
{
var
bt
;
if
(
x
>
y
)
{
bt
=
x
;
x
=
y
;
y
=
bt
;
}
// y*y = 1+3+5...
bt
=
y
;
bt
*=
y
;
bt
+=
y
;
bt
>>=
1
;
bt
+=
x
;
framask
[
bt
]
=
1
;
}
// enter alignment pattern - black to qrframe, white to mask (later black frame merged to mask)
function
putalign
(
x
,
y
)
{
var
j
;
qrframe
[
x
+
width
*
y
]
=
1
;
for
(
j
=
-
2
;
j
<
2
;
j
++
)
{
qrframe
[(
x
+
j
)
+
width
*
(
y
-
2
)]
=
1
;
qrframe
[(
x
-
2
)
+
width
*
(
y
+
j
+
1
)]
=
1
;
qrframe
[(
x
+
2
)
+
width
*
(
y
+
j
)]
=
1
;
qrframe
[(
x
+
j
+
1
)
+
width
*
(
y
+
2
)]
=
1
;
}
for
(
j
=
0
;
j
<
2
;
j
++
)
{
setmask
(
x
-
1
,
y
+
j
);
setmask
(
x
+
1
,
y
-
j
);
setmask
(
x
-
j
,
y
-
1
);
setmask
(
x
+
j
,
y
+
1
);
}
}
//========================================================================
// Reed Solomon error correction
// exponentiation mod N
function
modnn
(
x
)
{
while
(
x
>=
255
)
{
x
-=
255
;
x
=
(
x
>>
8
)
+
(
x
&
255
);
}
return
x
;
}
var
genpoly
=
[];
// Calculate and append ECC data to data block. Block is in strinbuf, indexes to buffers given.
function
appendrs
(
data
,
dlen
,
ecbuf
,
eclen
)
{
var
i
,
j
,
fb
;
for
(
i
=
0
;
i
<
eclen
;
i
++
)
strinbuf
[
ecbuf
+
i
]
=
0
;
for
(
i
=
0
;
i
<
dlen
;
i
++
)
{
fb
=
glog
[
strinbuf
[
data
+
i
]
^
strinbuf
[
ecbuf
]];
if
(
fb
!=
255
)
/* fb term is non-zero */
for
(
j
=
1
;
j
<
eclen
;
j
++
)
strinbuf
[
ecbuf
+
j
-
1
]
=
strinbuf
[
ecbuf
+
j
]
^
gexp
[
modnn
(
fb
+
genpoly
[
eclen
-
j
])];
else
for
(
j
=
ecbuf
;
j
<
ecbuf
+
eclen
;
j
++
)
strinbuf
[
j
]
=
strinbuf
[
j
+
1
];
strinbuf
[
ecbuf
+
eclen
-
1
]
=
fb
==
255
?
0
:
gexp
[
modnn
(
fb
+
genpoly
[
0
])];
}
}
//========================================================================
// Frame data insert following the path rules
// check mask - since symmetrical use half.
function
ismasked
(
x
,
y
)
{
var
bt
;
if
(
x
>
y
)
{
bt
=
x
;
x
=
y
;
y
=
bt
;
}
bt
=
y
;
bt
+=
y
*
y
;
bt
>>=
1
;
bt
+=
x
;
return
framask
[
bt
];
}
//========================================================================
// Apply the selected mask out of the 8.
function
applymask
(
m
)
{
var
x
,
y
,
r3x
,
r3y
;
switch
(
m
)
{
case
0
:
for
(
y
=
0
;
y
<
width
;
y
++
)
for
(
x
=
0
;
x
<
width
;
x
++
)
if
(
!
((
x
+
y
)
&
1
)
&&
!
ismasked
(
x
,
y
))
qrframe
[
x
+
y
*
width
]
^=
1
;
break
;
case
1
:
for
(
y
=
0
;
y
<
width
;
y
++
)
for
(
x
=
0
;
x
<
width
;
x
++
)
if
(
!
(
y
&
1
)
&&
!
ismasked
(
x
,
y
))
qrframe
[
x
+
y
*
width
]
^=
1
;
break
;
case
2
:
for
(
y
=
0
;
y
<
width
;
y
++
)
for
(
r3x
=
0
,
x
=
0
;
x
<
width
;
x
++
,
r3x
++
)
{
if
(
r3x
==
3
)
r3x
=
0
;
if
(
!
r3x
&&
!
ismasked
(
x
,
y
))
qrframe
[
x
+
y
*
width
]
^=
1
;
}
break
;
case
3
:
for
(
r3y
=
0
,
y
=
0
;
y
<
width
;
y
++
,
r3y
++
)
{
if
(
r3y
==
3
)
r3y
=
0
;
for
(
r3x
=
r3y
,
x
=
0
;
x
<
width
;
x
++
,
r3x
++
)
{
if
(
r3x
==
3
)
r3x
=
0
;
if
(
!
r3x
&&
!
ismasked
(
x
,
y
))
qrframe
[
x
+
y
*
width
]
^=
1
;
}
}
break
;
case
4
:
for
(
y
=
0
;
y
<
width
;
y
++
)
for
(
r3x
=
0
,
r3y
=
((
y
>>
1
)
&
1
),
x
=
0
;
x
<
width
;
x
++
,
r3x
++
)
{
if
(
r3x
==
3
)
{
r3x
=
0
;
r3y
=
!
r3y
;
}
if
(
!
r3y
&&
!
ismasked
(
x
,
y
))
qrframe
[
x
+
y
*
width
]
^=
1
;
}
break
;
case
5
:
for
(
r3y
=
0
,
y
=
0
;
y
<
width
;
y
++
,
r3y
++
)
{
if
(
r3y
==
3
)
r3y
=
0
;
for
(
r3x
=
0
,
x
=
0
;
x
<
width
;
x
++
,
r3x
++
)
{
if
(
r3x
==
3
)
r3x
=
0
;
if
(
!
((
x
&
y
&
1
)
+
!
(
!
r3x
|
!
r3y
))
&&
!
ismasked
(
x
,
y
))
qrframe
[
x
+
y
*
width
]
^=
1
;
}
}
break
;
case
6
:
for
(
r3y
=
0
,
y
=
0
;
y
<
width
;
y
++
,
r3y
++
)
{
if
(
r3y
==
3
)
r3y
=
0
;
for
(
r3x
=
0
,
x
=
0
;
x
<
width
;
x
++
,
r3x
++
)
{
if
(
r3x
==
3
)
r3x
=
0
;
if
(
!
(((
x
&
y
&
1
)
+
(
r3x
&&
(
r3x
==
r3y
)))
&
1
)
&&
!
ismasked
(
x
,
y
))
qrframe
[
x
+
y
*
width
]
^=
1
;
}
}
break
;
case
7
:
for
(
r3y
=
0
,
y
=
0
;
y
<
width
;
y
++
,
r3y
++
)
{
if
(
r3y
==
3
)
r3y
=
0
;
for
(
r3x
=
0
,
x
=
0
;
x
<
width
;
x
++
,
r3x
++
)
{
if
(
r3x
==
3
)
r3x
=
0
;
if
(
!
(((
r3x
&&
(
r3x
==
r3y
))
+
((
x
+
y
)
&
1
))
&
1
)
&&
!
ismasked
(
x
,
y
))
qrframe
[
x
+
y
*
width
]
^=
1
;
}
}
break
;
}
return
;
}
// Badness coefficients.
var
N1
=
3
,
N2
=
3
,
N3
=
40
,
N4
=
10
;
// Using the table of the length of each run, calculate the amount of bad image
// - long runs or those that look like finders; called twice, once each for X and Y
function
badruns
(
length
)
{
var
i
;
var
runsbad
=
0
;
for
(
i
=
0
;
i
<=
length
;
i
++
)
if
(
rlens
[
i
]
>=
5
)
runsbad
+=
N1
+
rlens
[
i
]
-
5
;
// BwBBBwB as in finder
for
(
i
=
3
;
i
<
length
-
1
;
i
+=
2
)
if
(
rlens
[
i
-
2
]
==
rlens
[
i
+
2
]
&&
rlens
[
i
+
2
]
==
rlens
[
i
-
1
]
&&
rlens
[
i
-
1
]
==
rlens
[
i
+
1
]
&&
rlens
[
i
-
1
]
*
3
==
rlens
[
i
]
// white around the black pattern? Not part of spec
&&
(
rlens
[
i
-
3
]
==
0
// beginning
||
i
+
3
>
length
// end
||
rlens
[
i
-
3
]
*
3
>=
rlens
[
i
]
*
4
||
rlens
[
i
+
3
]
*
3
>=
rlens
[
i
]
*
4
)
)
runsbad
+=
N3
;
return
runsbad
;
}
// Calculate how bad the masked image is - blocks, imbalance, runs, or finders.
function
badcheck
()
{
var
x
,
y
,
h
,
b
,
b1
;
var
thisbad
=
0
;
var
bw
=
0
;
// blocks of same color.
for
(
y
=
0
;
y
<
width
-
1
;
y
++
)
for
(
x
=
0
;
x
<
width
-
1
;
x
++
)
if
((
qrframe
[
x
+
width
*
y
]
&&
qrframe
[(
x
+
1
)
+
width
*
y
]
&&
qrframe
[
x
+
width
*
(
y
+
1
)]
&&
qrframe
[(
x
+
1
)
+
width
*
(
y
+
1
)])
// all black
||
!
(
qrframe
[
x
+
width
*
y
]
||
qrframe
[(
x
+
1
)
+
width
*
y
]
||
qrframe
[
x
+
width
*
(
y
+
1
)]
||
qrframe
[(
x
+
1
)
+
width
*
(
y
+
1
)]))
// all white
thisbad
+=
N2
;
// X runs
for
(
y
=
0
;
y
<
width
;
y
++
)
{
rlens
[
0
]
=
0
;
for
(
h
=
b
=
x
=
0
;
x
<
width
;
x
++
)
{
if
((
b1
=
qrframe
[
x
+
width
*
y
])
==
b
)
rlens
[
h
]
++
;
else
rlens
[
++
h
]
=
1
;
b
=
b1
;
bw
+=
b
?
1
:
-
1
;
}
thisbad
+=
badruns
(
h
);
}
// black/white imbalance
if
(
bw
<
0
)
bw
=
-
bw
;
var
big
=
bw
;
var
count
=
0
;
big
+=
big
<<
2
;
big
<<=
1
;
while
(
big
>
width
*
width
)
big
-=
width
*
width
,
count
++
;
thisbad
+=
count
*
N4
;
// Y runs
for
(
x
=
0
;
x
<
width
;
x
++
)
{
rlens
[
0
]
=
0
;
for
(
h
=
b
=
y
=
0
;
y
<
width
;
y
++
)
{
if
((
b1
=
qrframe
[
x
+
width
*
y
])
==
b
)
rlens
[
h
]
++
;
else
rlens
[
++
h
]
=
1
;
b
=
b1
;
}
thisbad
+=
badruns
(
h
);
}
return
thisbad
;
}
function
genframe
(
instring
)
{
var
x
,
y
,
k
,
t
,
v
,
i
,
j
,
m
;
// find the smallest version that fits the string
t
=
instring
.
length
;
version
=
0
;
do
{
version
++
;
k
=
(
ecclevel
-
1
)
*
4
+
(
version
-
1
)
*
16
;
neccblk1
=
eccblocks
[
k
++
];
neccblk2
=
eccblocks
[
k
++
];
datablkw
=
eccblocks
[
k
++
];
eccblkwid
=
eccblocks
[
k
];
k
=
datablkw
*
(
neccblk1
+
neccblk2
)
+
neccblk2
-
3
+
(
version
<=
9
);
if
(
t
<=
k
)
break
;
}
while
(
version
<
40
);
// FIXME - insure that it fits insted of being truncated
width
=
17
+
4
*
version
;
// allocate, clear and setup data structures
v
=
datablkw
+
(
datablkw
+
eccblkwid
)
*
(
neccblk1
+
neccblk2
)
+
neccblk2
;
for
(
t
=
0
;
t
<
v
;
t
++
)
eccbuf
[
t
]
=
0
;
strinbuf
=
instring
.
slice
(
0
);
for
(
t
=
0
;
t
<
width
*
width
;
t
++
)
qrframe
[
t
]
=
0
;
for
(
t
=
0
;
t
<
(
width
*
(
width
+
1
)
+
1
)
/
2
;
t
++
)
framask
[
t
]
=
0
;
// insert finders - black to frame, white to mask
for
(
t
=
0
;
t
<
3
;
t
++
)
{
k
=
0
;
y
=
0
;
if
(
t
==
1
)
k
=
(
width
-
7
);
if
(
t
==
2
)
y
=
(
width
-
7
);
qrframe
[(
y
+
3
)
+
width
*
(
k
+
3
)]
=
1
;
for
(
x
=
0
;
x
<
6
;
x
++
)
{
qrframe
[(
y
+
x
)
+
width
*
k
]
=
1
;
qrframe
[
y
+
width
*
(
k
+
x
+
1
)]
=
1
;
qrframe
[(
y
+
6
)
+
width
*
(
k
+
x
)]
=
1
;
qrframe
[(
y
+
x
+
1
)
+
width
*
(
k
+
6
)]
=
1
;
}
for
(
x
=
1
;
x
<
5
;
x
++
)
{
setmask
(
y
+
x
,
k
+
1
);
setmask
(
y
+
1
,
k
+
x
+
1
);
setmask
(
y
+
5
,
k
+
x
);
setmask
(
y
+
x
+
1
,
k
+
5
);
}
for
(
x
=
2
;
x
<
4
;
x
++
)
{
qrframe
[(
y
+
x
)
+
width
*
(
k
+
2
)]
=
1
;
qrframe
[(
y
+
2
)
+
width
*
(
k
+
x
+
1
)]
=
1
;
qrframe
[(
y
+
4
)
+
width
*
(
k
+
x
)]
=
1
;
qrframe
[(
y
+
x
+
1
)
+
width
*
(
k
+
4
)]
=
1
;
}
}
// alignment blocks
if
(
version
>
1
)
{
t
=
adelta
[
version
];
y
=
width
-
7
;
for
(;;)
{
x
=
width
-
7
;
while
(
x
>
t
-
3
)
{
putalign
(
x
,
y
);
if
(
x
<
t
)
break
;
x
-=
t
;
}
if
(
y
<=
t
+
9
)
break
;
y
-=
t
;
putalign
(
6
,
y
);
putalign
(
y
,
6
);
}
}
// single black
qrframe
[
8
+
width
*
(
width
-
8
)]
=
1
;
// timing gap - mask only
for
(
y
=
0
;
y
<
7
;
y
++
)
{
setmask
(
7
,
y
);
setmask
(
width
-
8
,
y
);
setmask
(
7
,
y
+
width
-
7
);
}
for
(
x
=
0
;
x
<
8
;
x
++
)
{
setmask
(
x
,
7
);
setmask
(
x
+
width
-
8
,
7
);
setmask
(
x
,
width
-
8
);
}
// reserve mask-format area
for
(
x
=
0
;
x
<
9
;
x
++
)
setmask
(
x
,
8
);
for
(
x
=
0
;
x
<
8
;
x
++
)
{
setmask
(
x
+
width
-
8
,
8
);
setmask
(
8
,
x
);
}
for
(
y
=
0
;
y
<
7
;
y
++
)
setmask
(
8
,
y
+
width
-
7
);
// timing row/col
for
(
x
=
0
;
x
<
width
-
14
;
x
++
)
if
(
x
&
1
)
{
setmask
(
8
+
x
,
6
);
setmask
(
6
,
8
+
x
);
}
else
{
qrframe
[(
8
+
x
)
+
width
*
6
]
=
1
;
qrframe
[
6
+
width
*
(
8
+
x
)]
=
1
;
}
// version block
if
(
version
>
6
)
{
t
=
vpat
[
version
-
7
];
k
=
17
;
for
(
x
=
0
;
x
<
6
;
x
++
)
for
(
y
=
0
;
y
<
3
;
y
++
,
k
--
)
if
(
1
&
(
k
>
11
?
version
>>
(
k
-
12
)
:
t
>>
k
))
{
qrframe
[(
5
-
x
)
+
width
*
(
2
-
y
+
width
-
11
)]
=
1
;
qrframe
[(
2
-
y
+
width
-
11
)
+
width
*
(
5
-
x
)]
=
1
;
}
else
{
setmask
(
5
-
x
,
2
-
y
+
width
-
11
);
setmask
(
2
-
y
+
width
-
11
,
5
-
x
);
}
}
// sync mask bits - only set above for white spaces, so add in black bits
for
(
y
=
0
;
y
<
width
;
y
++
)
for
(
x
=
0
;
x
<=
y
;
x
++
)
if
(
qrframe
[
x
+
width
*
y
])
setmask
(
x
,
y
);
// convert string to bitstream
// 8 bit data to QR-coded 8 bit data (numeric or alphanum, or kanji not supported)
v
=
strinbuf
.
length
;
// string to array
for
(
i
=
0
;
i
<
v
;
i
++
)
eccbuf
[
i
]
=
strinbuf
.
charCodeAt
(
i
);
strinbuf
=
eccbuf
.
slice
(
0
);
// calculate max string length
x
=
datablkw
*
(
neccblk1
+
neccblk2
)
+
neccblk2
;
if
(
v
>=
x
-
2
)
{
v
=
x
-
2
;
if
(
version
>
9
)
v
--
;
}
// shift and repack to insert length prefix
i
=
v
;
if
(
version
>
9
)
{
strinbuf
[
i
+
2
]
=
0
;
strinbuf
[
i
+
3
]
=
0
;
while
(
i
--
)
{
t
=
strinbuf
[
i
];
strinbuf
[
i
+
3
]
|=
255
&
(
t
<<
4
);
strinbuf
[
i
+
2
]
=
t
>>
4
;
}
strinbuf
[
2
]
|=
255
&
(
v
<<
4
);
strinbuf
[
1
]
=
v
>>
4
;
strinbuf
[
0
]
=
0x40
|
(
v
>>
12
);
}
else
{
strinbuf
[
i
+
1
]
=
0
;
strinbuf
[
i
+
2
]
=
0
;
while
(
i
--
)
{
t
=
strinbuf
[
i
];
strinbuf
[
i
+
2
]
|=
255
&
(
t
<<
4
);
strinbuf
[
i
+
1
]
=
t
>>
4
;
}
strinbuf
[
1
]
|=
255
&
(
v
<<
4
);
strinbuf
[
0
]
=
0x40
|
(
v
>>
4
);
}
// fill to end with pad pattern
i
=
v
+
3
-
(
version
<
10
);
while
(
i
<
x
)
{
strinbuf
[
i
++
]
=
0xec
;
// buffer has room if (i == x) break;
strinbuf
[
i
++
]
=
0x11
;
}
// calculate and append ECC
// calculate generator polynomial
genpoly
[
0
]
=
1
;
for
(
i
=
0
;
i
<
eccblkwid
;
i
++
)
{
genpoly
[
i
+
1
]
=
1
;
for
(
j
=
i
;
j
>
0
;
j
--
)
genpoly
[
j
]
=
genpoly
[
j
]
?
genpoly
[
j
-
1
]
^
gexp
[
modnn
(
glog
[
genpoly
[
j
]]
+
i
)]
:
genpoly
[
j
-
1
];
genpoly
[
0
]
=
gexp
[
modnn
(
glog
[
genpoly
[
0
]]
+
i
)];
}
for
(
i
=
0
;
i
<=
eccblkwid
;
i
++
)
genpoly
[
i
]
=
glog
[
genpoly
[
i
]];
// use logs for genpoly[] to save calc step
// append ecc to data buffer
k
=
x
;
y
=
0
;
for
(
i
=
0
;
i
<
neccblk1
;
i
++
)
{
appendrs
(
y
,
datablkw
,
k
,
eccblkwid
);
y
+=
datablkw
;
k
+=
eccblkwid
;
}
for
(
i
=
0
;
i
<
neccblk2
;
i
++
)
{
appendrs
(
y
,
datablkw
+
1
,
k
,
eccblkwid
);
y
+=
datablkw
+
1
;
k
+=
eccblkwid
;
}
// interleave blocks
y
=
0
;
for
(
i
=
0
;
i
<
datablkw
;
i
++
)
{
for
(
j
=
0
;
j
<
neccblk1
;
j
++
)
eccbuf
[
y
++
]
=
strinbuf
[
i
+
j
*
datablkw
];
for
(
j
=
0
;
j
<
neccblk2
;
j
++
)
eccbuf
[
y
++
]
=
strinbuf
[(
neccblk1
*
datablkw
)
+
i
+
(
j
*
(
datablkw
+
1
))];
}
for
(
j
=
0
;
j
<
neccblk2
;
j
++
)
eccbuf
[
y
++
]
=
strinbuf
[(
neccblk1
*
datablkw
)
+
i
+
(
j
*
(
datablkw
+
1
))];
for
(
i
=
0
;
i
<
eccblkwid
;
i
++
)
for
(
j
=
0
;
j
<
neccblk1
+
neccblk2
;
j
++
)
eccbuf
[
y
++
]
=
strinbuf
[
x
+
i
+
j
*
eccblkwid
];
strinbuf
=
eccbuf
;
// pack bits into frame avoiding masked area.
x
=
y
=
width
-
1
;
k
=
v
=
1
;
// up, minus
/* inteleaved data and ecc codes */
m
=
(
datablkw
+
eccblkwid
)
*
(
neccblk1
+
neccblk2
)
+
neccblk2
;
for
(
i
=
0
;
i
<
m
;
i
++
)
{
t
=
strinbuf
[
i
];
for
(
j
=
0
;
j
<
8
;
j
++
,
t
<<=
1
)
{
if
(
0x80
&
t
)
qrframe
[
x
+
width
*
y
]
=
1
;
do
{
// find next fill position
if
(
v
)
x
--
;
else
{
x
++
;
if
(
k
)
{
if
(
y
!=
0
)
y
--
;
else
{
x
-=
2
;
k
=
!
k
;
if
(
x
==
6
)
{
x
--
;
y
=
9
;
}
}
}
else
{
if
(
y
!=
width
-
1
)
y
++
;
else
{
x
-=
2
;
k
=
!
k
;
if
(
x
==
6
)
{
x
--
;
y
-=
8
;
}
}
}
}
v
=
!
v
;
}
while
(
ismasked
(
x
,
y
));
}
}
// save pre-mask copy of frame
strinbuf
=
qrframe
.
slice
(
0
);
t
=
0
;
// best
y
=
30000
;
// demerit
// for instead of while since in original arduino code
// if an early mask was "good enough" it wouldn't try for a better one
// since they get more complex and take longer.
for
(
k
=
0
;
k
<
8
;
k
++
)
{
applymask
(
k
);
// returns black-white imbalance
x
=
badcheck
();
if
(
x
<
y
)
{
// current mask better than previous best?
y
=
x
;
t
=
k
;
}
if
(
t
==
7
)
break
;
// don't increment i to a void redoing mask
qrframe
=
strinbuf
.
slice
(
0
);
// reset for next pass
}
if
(
t
!=
k
)
// redo best mask - none good enough, last wasn't t
applymask
(
t
);
// add in final mask/ecclevel bytes
y
=
fmtword
[
t
+
((
ecclevel
-
1
)
<<
3
)];
// low byte
for
(
k
=
0
;
k
<
8
;
k
++
,
y
>>=
1
)
if
(
y
&
1
)
{
qrframe
[(
width
-
1
-
k
)
+
width
*
8
]
=
1
;
if
(
k
<
6
)
qrframe
[
8
+
width
*
k
]
=
1
;
else
qrframe
[
8
+
width
*
(
k
+
1
)]
=
1
;
}
// high byte
for
(
k
=
0
;
k
<
7
;
k
++
,
y
>>=
1
)
if
(
y
&
1
)
{
qrframe
[
8
+
width
*
(
width
-
7
+
k
)]
=
1
;
if
(
k
)
qrframe
[(
6
-
k
)
+
width
*
8
]
=
1
;
else
qrframe
[
7
+
width
*
8
]
=
1
;
}
return
qrframe
;
}
var
_canvas
=
null
;
var
api
=
{
get
ecclevel
()
{
return
ecclevel
;
},
set
ecclevel
(
val
)
{
ecclevel
=
val
;
},
get
size
()
{
return
_size
;
},
set
size
(
val
)
{
_size
=
val
},
get
canvas
()
{
return
_canvas
;
},
set
canvas
(
el
)
{
_canvas
=
el
;
},
getFrame
:
function
(
string
)
{
return
genframe
(
string
);
},
//这里的utf16to8(str)是对Text中的字符串进行转码,让其支持中文
utf16to8
:
function
(
str
)
{
var
out
,
i
,
len
,
c
;
out
=
""
;
len
=
str
.
length
;
for
(
i
=
0
;
i
<
len
;
i
++
)
{
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
;
},
/**
* 新增$this参数,传入组件的this,兼容在组件中生成
*/
draw
:
function
(
str
,
canvas
,
cavW
,
cavH
,
cavColor
,
haveImg
,
imageUrl
,
imageSize
,
$this
,
cb
=
function
()
{},
ecc
)
{
var
that
=
this
;
ecclevel
=
ecc
||
ecclevel
;
canvas
=
canvas
||
_canvas
;
if
(
!
canvas
)
{
console
.
warn
(
'No canvas provided to draw QR code in!'
)
return
;
}
let
pre_background
=
"#ffffff"
;
var
size
=
Math
.
min
(
cavW
,
cavH
);
str
=
that
.
utf16to8
(
str
);
//增加中文显示
var
frame
=
that
.
getFrame
(
str
);
// 组件中生成qrcode需要绑定this
var
ctx
=
uni
.
createCanvasContext
(
canvas
,
$this
);
var
px
=
Math
.
round
(
size
/
(
width
));
var
roundedSize
=
px
*
(
width
);
// var px = 1 ;
// var roundedSize = px * (width + 8) ;
//var roundedSize = 0 ;
//var offset = Math.floor((size - roundedSize) / 2);
var
offset
=
0
;
size
=
roundedSize
;
//ctx.clearRect(0, 0, cavW, cavW);
ctx
.
setFillStyle
(
pre_background
)
ctx
.
fillRect
(
0
,
0
,
cavW
,
cavW
);
ctx
.
setFillStyle
(
cavColor
);
for
(
var
i
=
0
;
i
<
width
;
i
++
)
{
for
(
var
j
=
0
;
j
<
width
;
j
++
)
{
if
(
frame
[
j
*
width
+
i
])
{
ctx
.
fillRect
(
px
*
(
i
)
+
offset
,
px
*
(
j
)
+
offset
,
px
,
px
);
}
}
}
//画图片
if
(
haveImg
)
{
try
{
var
x
=
Number
(((
cavW
-
imageSize
-
14
)
/
2
).
toFixed
(
2
));
var
y
=
Number
(((
cavH
-
imageSize
-
14
)
/
2
).
toFixed
(
2
));
drawRoundedRect
(
ctx
,
x
,
y
,
imageSize
,
imageSize
,
imageSize
/
2
,
6
,
true
,
true
)
let
isNetImg
=
false
;
isNetImg
=
imageUrl
.
substr
(
0
,
4
)
==
'http'
?
true
:
false
;
if
(
isNetImg
)
{
//网络图片下载到本地
uni
.
getImageInfo
({
src
:
imageUrl
,
success
:
function
(
res
)
{
ctx
.
drawImage
(
res
.
path
,
x
,
y
,
imageSize
,
imageSize
);
//--增加绘制完成回调
ctx
.
draw
(
false
,
function
()
{
cb
();
})
}
})
}
else
{
ctx
.
drawImage
(
imageUrl
,
x
,
y
,
imageSize
,
imageSize
);
//--增加绘制完成回调
ctx
.
draw
(
false
,
function
()
{
cb
();
})
}
// 画圆角矩形
function
drawRoundedRect
(
ctxi
,
x
,
y
,
width
,
height
,
r
,
lineWidth
,
fill
,
stroke
)
{
ctxi
.
setLineWidth
(
lineWidth
);
ctxi
.
setFillStyle
(
pre_background
);
ctxi
.
setStrokeStyle
(
pre_background
);
ctxi
.
beginPath
();
// draw top and top right corner
ctxi
.
moveTo
(
x
+
r
,
y
);
ctxi
.
arcTo
(
x
+
width
,
y
,
x
+
width
,
y
+
r
,
r
);
// draw right side and bottom right corner
ctxi
.
arcTo
(
x
+
width
,
y
+
height
,
x
+
width
-
r
,
y
+
height
,
r
);
// draw bottom and bottom left corner
ctxi
.
arcTo
(
x
,
y
+
height
,
x
,
y
+
height
-
r
,
r
);
// draw left and top left corner
ctxi
.
arcTo
(
x
,
y
,
x
+
r
,
y
,
r
);
ctxi
.
closePath
();
if
(
fill
)
{
ctxi
.
fill
();
}
if
(
stroke
)
{
ctxi
.
stroke
();
}
}
}
catch
(
e
)
{
//TODO handle the exception
}
}
else
{
//--增加绘制完成回调
ctx
.
draw
(
false
,
function
()
{
cb
();
})
}
}
}
module
.
exports
=
{
api
}
})();
pages/coffee/qrcode/weapp-qrcode.js
0 → 100644
View file @
47808a3c
//Core code comes from https://github.com/davidshimjs/qrcodejs
var
QRCode
;
(
function
()
{
/**
* 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
);
}
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
);
}
}
};
// QRCodeModel
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
]];
// QRCode object
QRCode
=
function
(
canvasId
,
vOption
)
{
this
.
_htOption
=
{
width
:
256
,
height
:
256
,
typeNumber
:
4
,
colorDark
:
"#000000"
,
colorLight
:
"#ffffff"
,
correctLevel
:
QRErrorCorrectLevel
.
H
};
if
(
typeof
vOption
===
'string'
)
{
vOption
=
{
text
:
vOption
};
}
// Overwrites options
if
(
vOption
)
{
for
(
var
i
in
vOption
)
{
this
.
_htOption
[
i
]
=
vOption
[
i
];
}
}
this
.
_oQRCode
=
null
;
this
.
canvasId
=
canvasId
if
(
this
.
_htOption
.
text
&&
this
.
canvasId
)
{
this
.
makeCode
(
this
.
_htOption
.
text
);
}
};
QRCode
.
prototype
.
makeCode
=
function
(
sText
)
{
this
.
_oQRCode
=
new
QRCodeModel
(
_getTypeNumber
(
sText
,
this
.
_htOption
.
correctLevel
),
this
.
_htOption
.
correctLevel
);
this
.
_oQRCode
.
addData
(
sText
);
this
.
_oQRCode
.
make
();
this
.
makeImage
();
};
QRCode
.
prototype
.
makeImage
=
function
()
{
var
_oContext
if
(
this
.
_htOption
.
usingIn
)
{
_oContext
=
wx
.
createCanvasContext
(
this
.
canvasId
,
this
.
_htOption
.
usingIn
)
}
else
{
_oContext
=
wx
.
createCanvasContext
(
this
.
canvasId
)
}
var
_htOption
=
this
.
_htOption
;
var
oQRCode
=
this
.
_oQRCode
var
nCount
=
oQRCode
.
getModuleCount
();
var
nWidth
=
_htOption
.
width
/
nCount
;
var
nHeight
=
_htOption
.
height
/
nCount
;
var
nRoundedWidth
=
Math
.
round
(
nWidth
);
var
nRoundedHeight
=
Math
.
round
(
nHeight
);
if
(
_htOption
.
image
&&
_htOption
.
image
!=
''
)
{
_oContext
.
drawImage
(
_htOption
.
image
,
0
,
0
,
_htOption
.
width
,
_htOption
.
height
)
}
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
.
setStrokeStyle
(
bIsDark
?
_htOption
.
colorDark
:
_htOption
.
colorLight
)
// _oContext.setStrokeStyle('yellow')
_oContext
.
setLineWidth
(
1
)
_oContext
.
setFillStyle
(
bIsDark
?
_htOption
.
colorDark
:
_htOption
.
colorLight
)
// _oContext.setFillStyle('red')
// if (bIsDark) {
_oContext
.
fillRect
(
nLeft
,
nTop
,
nWidth
,
nHeight
);
// }
// 안티 앨리어싱 방지 처리
// if (bIsDark) {
_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
);
// }
// _oContext.fillRect(
// Math.floor(nLeft) + 0.5,
// Math.floor(nTop) + 0.5,
// nRoundedWidth,
// nRoundedHeight
// );
// _oContext.fillRect(
// Math.ceil(nLeft) - 0.5,
// Math.ceil(nTop) - 0.5,
// nRoundedWidth,
// nRoundedHeight
// );
// _oContext.clearRect(
// Math.floor(nLeft) + 0.5,
// Math.floor(nTop) + 0.5,
// nRoundedWidth,
// nRoundedHeight
// );
// _oContext.clearRect(
// Math.ceil(nLeft) - 0.5,
// Math.ceil(nTop) - 0.5,
// nRoundedWidth,
// nRoundedHeight
// );
}
}
_oContext
.
draw
()
};
// 保存为图片,将临时路径传给回调
QRCode
.
prototype
.
exportImage
=
function
(
callback
)
{
if
(
!
callback
)
{
return
}
wx
.
canvasToTempFilePath
({
x
:
0
,
y
:
0
,
width
:
this
.
_htOption
.
width
,
height
:
this
.
_htOption
.
height
,
destWidth
:
this
.
_htOption
.
width
,
destHeight
:
this
.
_htOption
.
height
,
canvasId
:
this
.
canvasId
,
success
:
function
(
res
)
{
console
.
log
(
res
.
tempFilePath
)
callback
(
res
.
tempFilePath
)
}
})
}
QRCode
.
CorrectLevel
=
QRErrorCorrectLevel
;
})();
module
.
exports
=
QRCode
\ No newline at end of file
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