bitcoin-atm
bitcoin atm for pyc inc.
git clone https://9o.is/git/bitcoin-atm.git
qrcode.js
(9751B)
1 /*
2 Copyright 2011 Lazar Laszlo (lazarsoft@gmail.com, www.lazarsoft.info)
3
4 Licensed under the Apache License, Version 2.0 (the "License");
5 you may not use this file except in compliance with the License.
6 You may obtain a copy of the License at
7
8 http://www.apache.org/licenses/LICENSE-2.0
9
10 Unless required by applicable law or agreed to in writing, software
11 distributed under the License is distributed on an "AS IS" BASIS,
12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 See the License for the specific language governing permissions and
14 limitations under the License.
15 */
16
17
18 qrcode = {};
19 qrcode.imagedata = null;
20 qrcode.width = 0;
21 qrcode.height = 0;
22 qrcode.qrCodeSymbol = null;
23 qrcode.debug = false;
24 qrcode.maxImgSize = 1024*1024;
25
26 qrcode.sizeOfDataLengthInfo = [ [ 10, 9, 8, 8 ], [ 12, 11, 16, 10 ], [ 14, 13, 16, 12 ] ];
27
28 qrcode.callback = null;
29
30 qrcode.decode = function(src){
31
32 if(arguments.length==0)
33 {
34 var canvas_qr = document.getElementById("qr-canvas");
35 var context = canvas_qr.getContext('2d');
36 qrcode.width = canvas_qr.width;
37 qrcode.height = canvas_qr.height;
38 qrcode.imagedata = context.getImageData(0, 0, qrcode.width, qrcode.height);
39 qrcode.result = qrcode.process(context);
40 if(qrcode.callback!=null)
41 qrcode.callback(qrcode.result);
42 return qrcode.result;
43 }
44 else
45 {
46 var image = new Image();
47 image.onload=function(){
48 //var canvas_qr = document.getElementById("qr-canvas");
49 var canvas_qr = document.createElement('canvas');
50 var context = canvas_qr.getContext('2d');
51 var nheight = image.height;
52 var nwidth = image.width;
53 if(image.width*image.height>qrcode.maxImgSize)
54 {
55 var ir = image.width / image.height;
56 nheight = Math.sqrt(qrcode.maxImgSize/ir);
57 nwidth=ir*nheight;
58 }
59
60 canvas_qr.width = nwidth;
61 canvas_qr.height = nheight;
62
63 context.drawImage(image, 0, 0, canvas_qr.width, canvas_qr.height );
64 qrcode.width = canvas_qr.width;
65 qrcode.height = canvas_qr.height;
66 try{
67 qrcode.imagedata = context.getImageData(0, 0, canvas_qr.width, canvas_qr.height);
68 }catch(e){
69 qrcode.result = "Cross domain image reading not supported in your browser! Save it to your computer then drag and drop the file!";
70 if(qrcode.callback!=null)
71 qrcode.callback(qrcode.result);
72 return;
73 }
74
75 try
76 {
77 qrcode.result = qrcode.process(context);
78 }
79 catch(e)
80 {
81 console.log(e);
82 qrcode.result = "error decoding QR Code";
83 }
84 if(qrcode.callback!=null)
85 qrcode.callback(qrcode.result);
86 }
87 image.src = src;
88 }
89 }
90
91 qrcode.isUrl = function(s)
92 {
93 var regexp = /(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/;
94 return regexp.test(s);
95 }
96
97 qrcode.decode_url = function (s)
98 {
99 var escaped = "";
100 try{
101 escaped = escape( s );
102 }
103 catch(e)
104 {
105 console.log(e);
106 escaped = s;
107 }
108 var ret = "";
109 try{
110 ret = decodeURIComponent( escaped );
111 }
112 catch(e)
113 {
114 console.log(e);
115 ret = escaped;
116 }
117 return ret;
118 }
119
120 qrcode.decode_utf8 = function ( s )
121 {
122 if(qrcode.isUrl(s))
123 return qrcode.decode_url(s);
124 else
125 return s;
126 }
127
128 qrcode.process = function(ctx){
129
130 var start = new Date().getTime();
131
132 var image = qrcode.grayScaleToBitmap(qrcode.grayscale());
133 //var image = qrcode.binarize(128);
134
135 if(qrcode.debug)
136 {
137 for (var y = 0; y < qrcode.height; y++)
138 {
139 for (var x = 0; x < qrcode.width; x++)
140 {
141 var point = (x * 4) + (y * qrcode.width * 4);
142 qrcode.imagedata.data[point] = image[x+y*qrcode.width]?0:0;
143 qrcode.imagedata.data[point+1] = image[x+y*qrcode.width]?0:0;
144 qrcode.imagedata.data[point+2] = image[x+y*qrcode.width]?255:0;
145 }
146 }
147 ctx.putImageData(qrcode.imagedata, 0, 0);
148 }
149
150 //var finderPatternInfo = new FinderPatternFinder().findFinderPattern(image);
151
152 var detector = new Detector(image);
153
154 var qRCodeMatrix = detector.detect();
155
156 /*for (var y = 0; y < qRCodeMatrix.bits.Height; y++)
157 {
158 for (var x = 0; x < qRCodeMatrix.bits.Width; x++)
159 {
160 var point = (x * 4*2) + (y*2 * qrcode.width * 4);
161 qrcode.imagedata.data[point] = qRCodeMatrix.bits.get_Renamed(x,y)?0:0;
162 qrcode.imagedata.data[point+1] = qRCodeMatrix.bits.get_Renamed(x,y)?0:0;
163 qrcode.imagedata.data[point+2] = qRCodeMatrix.bits.get_Renamed(x,y)?255:0;
164 }
165 }*/
166 if(qrcode.debug)
167 ctx.putImageData(qrcode.imagedata, 0, 0);
168
169 var reader = Decoder.decode(qRCodeMatrix.bits);
170 var data = reader.DataByte;
171 var str="";
172 for(var i=0;i<data.length;i++)
173 {
174 for(var j=0;j<data[i].length;j++)
175 str+=String.fromCharCode(data[i][j]);
176 }
177
178 var end = new Date().getTime();
179 var time = end - start;
180 console.log(time);
181
182 return qrcode.decode_utf8(str);
183 //alert("Time:" + time + " Code: "+str);
184 }
185
186 qrcode.getPixel = function(x,y){
187 if (qrcode.width < x) {
188 throw "point error";
189 }
190 if (qrcode.height < y) {
191 throw "point error";
192 }
193 point = (x * 4) + (y * qrcode.width * 4);
194 p = (qrcode.imagedata.data[point]*33 + qrcode.imagedata.data[point + 1]*34 + qrcode.imagedata.data[point + 2]*33)/100;
195 return p;
196 }
197
198 qrcode.binarize = function(th){
199 var ret = new Array(qrcode.width*qrcode.height);
200 for (var y = 0; y < qrcode.height; y++)
201 {
202 for (var x = 0; x < qrcode.width; x++)
203 {
204 var gray = qrcode.getPixel(x, y);
205
206 ret[x+y*qrcode.width] = gray<=th?true:false;
207 }
208 }
209 return ret;
210 }
211
212 qrcode.getMiddleBrightnessPerArea=function(image)
213 {
214 var numSqrtArea = 4;
215 //obtain middle brightness((min + max) / 2) per area
216 var areaWidth = Math.floor(qrcode.width / numSqrtArea);
217 var areaHeight = Math.floor(qrcode.height / numSqrtArea);
218 var minmax = new Array(numSqrtArea);
219 for (var i = 0; i < numSqrtArea; i++)
220 {
221 minmax[i] = new Array(numSqrtArea);
222 for (var i2 = 0; i2 < numSqrtArea; i2++)
223 {
224 minmax[i][i2] = new Array(0,0);
225 }
226 }
227 for (var ay = 0; ay < numSqrtArea; ay++)
228 {
229 for (var ax = 0; ax < numSqrtArea; ax++)
230 {
231 minmax[ax][ay][0] = 0xFF;
232 for (var dy = 0; dy < areaHeight; dy++)
233 {
234 for (var dx = 0; dx < areaWidth; dx++)
235 {
236 var target = image[areaWidth * ax + dx+(areaHeight * ay + dy)*qrcode.width];
237 if (target < minmax[ax][ay][0])
238 minmax[ax][ay][0] = target;
239 if (target > minmax[ax][ay][1])
240 minmax[ax][ay][1] = target;
241 }
242 }
243 //minmax[ax][ay][0] = (minmax[ax][ay][0] + minmax[ax][ay][1]) / 2;
244 }
245 }
246 var middle = new Array(numSqrtArea);
247 for (var i3 = 0; i3 < numSqrtArea; i3++)
248 {
249 middle[i3] = new Array(numSqrtArea);
250 }
251 for (var ay = 0; ay < numSqrtArea; ay++)
252 {
253 for (var ax = 0; ax < numSqrtArea; ax++)
254 {
255 middle[ax][ay] = Math.floor((minmax[ax][ay][0] + minmax[ax][ay][1]) / 2);
256 //Console.out.print(middle[ax][ay] + ",");
257 }
258 //Console.out.println("");
259 }
260 //Console.out.println("");
261
262 return middle;
263 }
264
265 qrcode.grayScaleToBitmap=function(grayScale)
266 {
267 var middle = qrcode.getMiddleBrightnessPerArea(grayScale);
268 var sqrtNumArea = middle.length;
269 var areaWidth = Math.floor(qrcode.width / sqrtNumArea);
270 var areaHeight = Math.floor(qrcode.height / sqrtNumArea);
271 var bitmap = new Array(qrcode.height*qrcode.width);
272
273 for (var ay = 0; ay < sqrtNumArea; ay++)
274 {
275 for (var ax = 0; ax < sqrtNumArea; ax++)
276 {
277 for (var dy = 0; dy < areaHeight; dy++)
278 {
279 for (var dx = 0; dx < areaWidth; dx++)
280 {
281 bitmap[areaWidth * ax + dx+ (areaHeight * ay + dy)*qrcode.width] = (grayScale[areaWidth * ax + dx+ (areaHeight * ay + dy)*qrcode.width] < middle[ax][ay])?true:false;
282 }
283 }
284 }
285 }
286 return bitmap;
287 }
288
289 qrcode.grayscale = function(){
290 var ret = new Array(qrcode.width*qrcode.height);
291 for (var y = 0; y < qrcode.height; y++)
292 {
293 for (var x = 0; x < qrcode.width; x++)
294 {
295 var gray = qrcode.getPixel(x, y);
296
297 ret[x+y*qrcode.width] = gray;
298 }
299 }
300 return ret;
301 }
302
303
304
305
306 function URShift( number, bits)
307 {
308 if (number >= 0)
309 return number >> bits;
310 else
311 return (number >> bits) + (2 << ~bits);
312 }
313
314 /*
315 Array.prototype.remove = function(from, to) {
316 var rest = this.slice((to || from) + 1 || this.length);
317 this.length = from < 0 ? this.length + from : from;
318 return this.push.apply(this, rest);
319 };
320 */