3 lines
11 KiB
JavaScript
3 lines
11 KiB
JavaScript
//Javascript QR Encoder, Copyright 2010, tz@execpc.com, released under GPLv3
|
|
function setmask(r,e){var t;r>e&&(t=r,r=e,e=t),t=e,t*=e,t+=e,t>>=1,t+=r,framask[t]=1}function putalign(r,e){var t;for(qrframe[r+width*e]=1,t=-2;2>t;t++)qrframe[r+t+width*(e-2)]=1,qrframe[r-2+width*(e+t+1)]=1,qrframe[r+2+width*(e+t)]=1,qrframe[r+t+1+width*(e+2)]=1;for(t=0;2>t;t++)setmask(r-1,e+t),setmask(r+1,e-t),setmask(r-t,e-1),setmask(r+t,e+1)}function modnn(r){for(;r>=255;)r-=255,r=(r>>8)+(255&r);return r}function appendrs(r,e,t,i){var f,a,d;for(f=0;i>f;f++)strinbuf[t+f]=0;for(f=0;e>f;f++){if(d=glog[strinbuf[r+f]^strinbuf[t]],255!=d)for(a=1;i>a;a++)strinbuf[t+a-1]=strinbuf[t+a]^gexp[modnn(d+genpoly[i-a])];else for(a=t;t+i>a;a++)strinbuf[a]=strinbuf[a+1];strinbuf[t+i-1]=255==d?0:gexp[modnn(d+genpoly[0])]}}function ismasked(r,e){var t;return r>e&&(t=r,r=e,e=t),t=e,t+=e*e,t>>=1,t+=r,framask[t]}function applymask(r){var e,t,i,f;switch(r){case 0:for(t=0;width>t;t++)for(e=0;width>e;e++)e+t&1||ismasked(e,t)||(qrframe[e+t*width]^=1);break;case 1:for(t=0;width>t;t++)for(e=0;width>e;e++)1&t||ismasked(e,t)||(qrframe[e+t*width]^=1);break;case 2:for(t=0;width>t;t++)for(i=0,e=0;width>e;e++,i++)3==i&&(i=0),i||ismasked(e,t)||(qrframe[e+t*width]^=1);break;case 3:for(f=0,t=0;width>t;t++,f++)for(3==f&&(f=0),i=f,e=0;width>e;e++,i++)3==i&&(i=0),i||ismasked(e,t)||(qrframe[e+t*width]^=1);break;case 4:for(t=0;width>t;t++)for(i=0,f=t>>1&1,e=0;width>e;e++,i++)3==i&&(i=0,f=!f),f||ismasked(e,t)||(qrframe[e+t*width]^=1);break;case 5:for(f=0,t=0;width>t;t++,f++)for(3==f&&(f=0),i=0,e=0;width>e;e++,i++)3==i&&(i=0),(e&t&1)+!(!i|!f)||ismasked(e,t)||(qrframe[e+t*width]^=1);break;case 6:for(f=0,t=0;width>t;t++,f++)for(3==f&&(f=0),i=0,e=0;width>e;e++,i++)3==i&&(i=0),(e&t&1)+(i&&i==f)&1||ismasked(e,t)||(qrframe[e+t*width]^=1);break;case 7:for(f=0,t=0;width>t;t++,f++)for(3==f&&(f=0),i=0,e=0;width>e;e++,i++)3==i&&(i=0),(i&&i==f)+(e+t&1)&1||ismasked(e,t)||(qrframe[e+t*width]^=1)}}function badruns(r){var e,t=0;for(e=0;r>=e;e++)rlens[e]>=5&&(t+=N1+rlens[e]-5);for(e=3;r-1>e;e+=2)rlens[e-2]==rlens[e+2]&&rlens[e+2]==rlens[e-1]&&rlens[e-1]==rlens[e+1]&&3*rlens[e-1]==rlens[e]&&(0==rlens[e-3]||e+3>r||3*rlens[e-3]>=4*rlens[e]||3*rlens[e+3]>=4*rlens[e])&&(t+=N3);return t}function badcheck(){var r,e,t,i,f,a=0,d=0;for(e=0;width-1>e;e++)for(r=0;width-1>r;r++)(qrframe[r+width*e]&&qrframe[r+1+width*e]&&qrframe[r+width*(e+1)]&&qrframe[r+1+width*(e+1)]||!(qrframe[r+width*e]||qrframe[r+1+width*e]||qrframe[r+width*(e+1)]||qrframe[r+1+width*(e+1)]))&&(a+=N2);for(e=0;width>e;e++){for(rlens[0]=0,t=i=r=0;width>r;r++)(f=qrframe[r+width*e])==i?rlens[t]++:rlens[++t]=1,i=f,d+=i?1:-1;a+=badruns(t)}0>d&&(d=-d);var s=d;for(count=0,s+=s<<2,s<<=1;s>width*width;)s-=width*width,count++;for(a+=count*N4,r=0;width>r;r++){for(rlens[0]=0,t=i=e=0;width>e;e++)(f=qrframe[r+width*e])==i?rlens[t]++:rlens[++t]=1,i=f;a+=badruns(t)}return a}function genframe(r){var e,t,i,f,a,d,s,n;f=r.length,version=0;do if(version++,i=4*(ecclevel-1)+16*(version-1),neccblk1=eccblocks[i++],neccblk2=eccblocks[i++],datablkw=eccblocks[i++],eccblkwid=eccblocks[i],i=datablkw*(neccblk1+neccblk2)+neccblk2-3+(9>=version),i>=f)break;while(40>version);for(width=17+4*version,a=datablkw+(datablkw+eccblkwid)*(neccblk1+neccblk2)+neccblk2,f=0;a>f;f++)eccbuf[f]=0;for(strinbuf=r.slice(0),f=0;width*width>f;f++)qrframe[f]=0;for(f=0;(width*(width+1)+1)/2>f;f++)framask[f]=0;for(f=0;3>f;f++){for(i=0,t=0,1==f&&(i=width-7),2==f&&(t=width-7),qrframe[t+3+width*(i+3)]=1,e=0;6>e;e++)qrframe[t+e+width*i]=1,qrframe[t+width*(i+e+1)]=1,qrframe[t+6+width*(i+e)]=1,qrframe[t+e+1+width*(i+6)]=1;for(e=1;5>e;e++)setmask(t+e,i+1),setmask(t+1,i+e+1),setmask(t+5,i+e),setmask(t+e+1,i+5);for(e=2;4>e;e++)qrframe[t+e+width*(i+2)]=1,qrframe[t+2+width*(i+e+1)]=1,qrframe[t+4+width*(i+e)]=1,qrframe[t+e+1+width*(i+4)]=1}if(version>1)for(f=adelta[version],t=width-7;;){for(e=width-7;e>f-3&&(putalign(e,t),!(f>e));)e-=f;if(f+9>=t)break;t-=f,putalign(6,t),putalign(t,6)}for(qrframe[8+width*(width-8)]=1,t=0;7>t;t++)setmask(7,t),setmask(width-8,t),setmask(7,t+width-7);for(e=0;8>e;e++)setmask(e,7),setmask(e+width-8,7),setmask(e,width-8);for(e=0;9>e;e++)setmask(e,8);for(e=0;8>e;e++)setmask(e+width-8,8),setmask(8,e);for(t=0;7>t;t++)setmask(8,t+width-7);for(e=0;width-14>e;e++)1&e?(setmask(8+e,6),setmask(6,8+e)):(qrframe[8+e+6*width]=1,qrframe[6+width*(8+e)]=1);if(version>6)for(f=vpat[version-7],i=17,e=0;6>e;e++)for(t=0;3>t;t++,i--)1&(i>11?version>>i-12:f>>i)?(qrframe[5-e+width*(2-t+width-11)]=1,qrframe[2-t+width-11+width*(5-e)]=1):(setmask(5-e,2-t+width-11),setmask(2-t+width-11,5-e));for(t=0;width>t;t++)for(e=0;t>=e;e++)qrframe[e+width*t]&&setmask(e,t);for(a=strinbuf.length,d=0;a>d;d++)eccbuf[d]=strinbuf.charCodeAt(d);if(strinbuf=eccbuf.slice(0),e=datablkw*(neccblk1+neccblk2)+neccblk2,a>=e-2&&(a=e-2,version>9&&a--),d=a,version>9){for(strinbuf[d+2]=0,strinbuf[d+3]=0;d--;)f=strinbuf[d],strinbuf[d+3]|=255&f<<4,strinbuf[d+2]=f>>4;strinbuf[2]|=255&a<<4,strinbuf[1]=a>>4,strinbuf[0]=64|a>>12}else{for(strinbuf[d+1]=0,strinbuf[d+2]=0;d--;)f=strinbuf[d],strinbuf[d+2]|=255&f<<4,strinbuf[d+1]=f>>4;strinbuf[1]|=255&a<<4,strinbuf[0]=64|a>>4}for(d=a+3-(10>version);e>d;)strinbuf[d++]=236,strinbuf[d++]=17;for(genpoly[0]=1,d=0;eccblkwid>d;d++){for(genpoly[d+1]=1,s=d;s>0;s--)genpoly[s]=genpoly[s]?genpoly[s-1]^gexp[modnn(glog[genpoly[s]]+d)]:genpoly[s-1];genpoly[0]=gexp[modnn(glog[genpoly[0]]+d)]}for(d=0;eccblkwid>=d;d++)genpoly[d]=glog[genpoly[d]];for(i=e,t=0,d=0;neccblk1>d;d++)appendrs(t,datablkw,i,eccblkwid),t+=datablkw,i+=eccblkwid;for(d=0;neccblk2>d;d++)appendrs(t,datablkw+1,i,eccblkwid),t+=datablkw+1,i+=eccblkwid;for(t=0,d=0;datablkw>d;d++){for(s=0;neccblk1>s;s++)eccbuf[t++]=strinbuf[d+s*datablkw];for(s=0;neccblk2>s;s++)eccbuf[t++]=strinbuf[neccblk1*datablkw+d+s*(datablkw+1)]}for(s=0;neccblk2>s;s++)eccbuf[t++]=strinbuf[neccblk1*datablkw+d+s*(datablkw+1)];for(d=0;eccblkwid>d;d++)for(s=0;neccblk1+neccblk2>s;s++)eccbuf[t++]=strinbuf[e+d+s*eccblkwid];for(strinbuf=eccbuf,e=t=width-1,i=a=1,n=(datablkw+eccblkwid)*(neccblk1+neccblk2)+neccblk2,d=0;n>d;d++)for(f=strinbuf[d],s=0;8>s;s++,f<<=1){128&f&&(qrframe[e+width*t]=1);do a?e--:(e++,i?0!=t?t--:(e-=2,i=!i,6==e&&(e--,t=9)):t!=width-1?t++:(e-=2,i=!i,6==e&&(e--,t-=8))),a=!a;while(ismasked(e,t))}for(strinbuf=qrframe.slice(0),f=0,t=3e4,i=0;8>i&&(applymask(i),e=badcheck(),t>e&&(t=e,f=i),7!=f);i++)qrframe=strinbuf.slice(0);for(f!=i&&applymask(f),t=fmtword[f+(ecclevel-1<<3)],i=0;8>i;i++,t>>=1)1&t&&(qrframe[width-1-i+8*width]=1,6>i?qrframe[8+width*i]=1:qrframe[8+width*(i+1)]=1);for(i=0;7>i;i++,t>>=1)1&t&&(qrframe[8+width*(width-7+i)]=1,i?qrframe[6-i+8*width]=1:qrframe[7+8*width]=1);return qrframe}function setupqr(){wd=250,ht=250;var r=document.getElementById("qrcanv");qrc=r.getContext("2d"),qrc.canvas.width=wd,qrc.canvas.height=ht,qrc.fillStyle="#eee",qrc.fillRect(0,0,wd,ht)}function doqr(){setupqr(),d=document,ecclevel=1,qf=genframe(d.getElementById("qrdiv").getAttribute("value")),qrc.lineWidth=1;var r,e;for(px=wd,wd>ht&&(px=ht),px/=width+10,px=Math.round(px-.5),qrc.clearRect(0,0,wd,ht),qrc.fillStyle="#fff",qrc.fillRect(0,0,px*(width+8),px*(width+8)),qrc.fillStyle="#000",r=0;width>r;r++)for(e=0;width>e;e++)qf[e*width+r]&&qrc.fillRect(px*(4+r),px*(4+e),px,px)}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],vpat=[3220,1468,2713,1235,3062,1890,2119,1549,2344,2936,1117,2583,1330,2470,1667,2249,2028,3780,481,4011,142,3098,831,3445,592,2517,1776,2234,1951,2827,1070,2660,1345,3177],fmtword=[30660,29427,32170,30877,26159,25368,27713,26998,21522,20773,24188,23371,17913,16590,20375,19104,13663,12392,16177,14854,9396,8579,11994,11245,5769,5054,7399,6608,1890,597,3340,2107],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],glog=[255,0,1,25,2,50,26,198,3,223,51,238,27,104,199,75,4,100,224,14,52,141,239,129,28,193,105,248,200,8,76,113,5,138,101,47,225,36,15,33,53,147,142,218,240,18,130,69,29,181,194,125,106,39,249,185,201,154,9,120,77,228,114,166,6,191,139,98,102,221,48,253,226,152,37,179,16,145,34,136,54,208,148,206,143,150,219,189,241,210,19,92,131,56,70,64,30,66,182,163,195,72,126,110,107,58,40,84,250,133,186,61,202,94,155,159,10,21,121,43,78,212,229,172,115,243,167,87,7,112,192,247,140,128,99,13,103,74,222,237,49,197,254,24,227,165,153,119,38,184,180,124,17,68,146,217,35,32,137,46,55,63,209,91,149,188,207,205,144,135,151,178,220,252,190,97,242,86,211,171,20,42,93,158,132,60,57,83,71,109,65,162,31,45,67,216,183,123,164,118,196,23,73,236,127,12,111,246,108,161,59,82,41,157,85,170,251,96,134,177,187,204,62,90,203,89,95,176,156,169,160,81,11,245,22,235,122,117,44,215,79,174,213,233,230,231,173,232,116,214,244,234,168,80,88,175],gexp=[1,2,4,8,16,32,64,128,29,58,116,232,205,135,19,38,76,152,45,90,180,117,234,201,143,3,6,12,24,48,96,192,157,39,78,156,37,74,148,53,106,212,181,119,238,193,159,35,70,140,5,10,20,40,80,160,93,186,105,210,185,111,222,161,95,190,97,194,153,47,94,188,101,202,137,15,30,60,120,240,253,231,211,187,107,214,177,127,254,225,223,163,91,182,113,226,217,175,67,134,17,34,68,136,13,26,52,104,208,189,103,206,129,31,62,124,248,237,199,147,59,118,236,197,151,51,102,204,133,23,46,92,184,109,218,169,79,158,33,66,132,21,42,84,168,77,154,41,82,164,85,170,73,146,57,114,228,213,183,115,230,209,191,99,198,145,63,126,252,229,215,179,123,246,241,255,227,219,171,75,150,49,98,196,149,55,110,220,165,87,174,65,130,25,50,100,200,141,7,14,28,56,112,224,221,167,83,166,81,162,89,178,121,242,249,239,195,155,43,86,172,69,138,9,18,36,72,144,61,122,244,245,247,243,251,235,203,139,11,22,44,88,176,125,250,233,207,131,27,54,108,216,173,71,142,0];var strinbuf=[],eccbuf=[],qrframe=[],framask=[],rlens=[],version,width,neccblk1,neccblk2,datablkw,eccblkwid,ecclevel=1,genpoly=[],N1=3,N2=3,N3=40,N4=10,wd,ht,qrc;
|