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 */