Skip to content

Instantly share code, notes, and snippets.

@XayOn
Created November 6, 2012 21:09
Show Gist options
  • Save XayOn/4027564 to your computer and use it in GitHub Desktop.
Save XayOn/4027564 to your computer and use it in GitHub Desktop.
Print a file as a qr code animation in firefox
# QR code generation library by http://code.google.com/p/jsqrencode/ GPL3
# This code is GPL3 as well by David Francos Cuartero (XayOn)
{ cat <<EOF
<!DOCTYPE html><html><head><meta name="apple-touch-fullscreen" content="yes" /><style type="text/css">html { width:100%; height: 100% } body { width:100%; height: 100%; margin: 0px; padding: 0px } div#qrdiv {width:200px; height:200px} </style><script type="text/javascript">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=[];var version,width,neccblk1,neccblk2,datablkw,eccblkwid;var ecclevel=1;function setmask(a,c){var b;if(a>c){b=a;a=c;c=b}b=c;b*=c;b+=c;b>>=1;b+=a;framask[b]=1}function putalign(a,c){var b;qrframe[a+width*c]=1;for(b=-2;b<2;b++){qrframe[(a+b)+width*(c-2)]=1;qrframe[(a-2)+width*(c+b+1)]=1;qrframe[(a+2)+width*(c+b)]=1;qrframe[(a+b+1)+width*(c+2)]=1}for(b=0;b<2;b++){setmask(a-1,c+b);setmask(a+1,c-b);setmask(a-b,c-1);setmask(a+b,c+1)}}function modnn(a){while(a>=255){a-=255;a=(a>>8)+(a&255)}return a}var genpoly=[];function appendrs(g,h,e,a){var c,b,f;for(c=0;c<a;c++){strinbuf[e+c]=0}for(c=0;c<h;c++){f=glog[strinbuf[g+c]^strinbuf[e]];if(f!=255){for(b=1;b<a;b++){strinbuf[e+b-1]=strinbuf[e+b]^gexp[modnn(f+genpoly[a-b])]}}else{for(b=e;b<e+a;b++){strinbuf[b]=strinbuf[b+1]}}strinbuf[e+a-1]=f==255?0:gexp[modnn(f+genpoly[0])]}}function ismasked(a,c){var b;if(a>c){b=a;a=c;c=b}b=c;b+=c*c;b>>=1;b+=a;return framask[b]}function applymask(b){var a,f,e,c;switch(b){case 0:for(f=0;f<width;f++){for(a=0;a<width;a++){if(!((a+f)&1)&&!ismasked(a,f)){qrframe[a+f*width]^=1}}}break;case 1:for(f=0;f<width;f++){for(a=0;a<width;a++){if(!(f&1)&&!ismasked(a,f)){qrframe[a+f*width]^=1}}}break;case 2:for(f=0;f<width;f++){for(e=0,a=0;a<width;a++,e++){if(e==3){e=0}if(!e&&!ismasked(a,f)){qrframe[a+f*width]^=1}}}break;case 3:for(c=0,f=0;f<width;f++,c++){if(c==3){c=0}for(e=c,a=0;a<width;a++,e++){if(e==3){e=0}if(!e&&!ismasked(a,f)){qrframe[a+f*width]^=1}}}break;case 4:for(f=0;f<width;f++){for(e=0,c=((f>>1)&1),a=0;a<width;a++,e++){if(e==3){e=0;c=!c}if(!c&&!ismasked(a,f)){qrframe[a+f*width]^=1}}}break;case 5:for(c=0,f=0;f<width;f++,c++){if(c==3){c=0}for(e=0,a=0;a<width;a++,e++){if(e==3){e=0}if(!((a&f&1)+!(!e|!c))&&!ismasked(a,f)){qrframe[a+f*width]^=1}}}break;case 6:for(c=0,f=0;f<width;f++,c++){if(c==3){c=0}for(e=0,a=0;a<width;a++,e++){if(e==3){e=0}if(!(((a&f&1)+(e&&(e==c)))&1)&&!ismasked(a,f)){qrframe[a+f*width]^=1}}}break;case 7:for(c=0,f=0;f<width;f++,c++){if(c==3){c=0}for(e=0,a=0;a<width;a++,e++){if(e==3){e=0}if(!(((e&&(e==c))+((a+f)&1))&1)&&!ismasked(a,f)){qrframe[a+f*width]^=1}}}break}return}var N1=3,N2=3,N3=40,N4=10;function badruns(a){var c;var b=0;for(c=0;c<=a;c++){if(rlens[c]>=5){b+=N1+rlens[c]-5}}for(c=3;c<a-1;c+=2){if(rlens[c-2]==rlens[c+2]&&rlens[c+2]==rlens[c-1]&&rlens[c-1]==rlens[c+1]&&rlens[c-1]*3==rlens[c]&&(rlens[c-3]==0||c+3>a||rlens[c-3]*3>=rlens[c]*4||rlens[c+3]*3>=rlens[c]*4)){b+=N3}}return b}function badcheck(){var e,k,i,c,f;var g=0;var j=0;for(k=0;k<width-1;k++){for(e=0;e<width-1;e++){if((qrframe[e+width*k]&&qrframe[(e+1)+width*k]&&qrframe[e+width*(k+1)]&&qrframe[(e+1)+width*(k+1)])||!(qrframe[e+width*k]||qrframe[(e+1)+width*k]||qrframe[e+width*(k+1)]||qrframe[(e+1)+width*(k+1)])){g+=N2}}}for(k=0;k<width;k++){rlens[0]=0;for(i=c=e=0;e<width;e++){if((f=qrframe[e+width*k])==c){rlens[i]++}else{rlens[++i]=1}c=f;j+=c?1:-1}g+=badruns(i)}if(j<0){j=-j}var a=j;count=0;a+=a<<2;a<<=1;while(a>width*width){a-=width*width,count++}g+=count*N4;for(e=0;e<width;e++){rlens[0]=0;for(i=c=k=0;k<width;k++){if((f=qrframe[e+width*k])==c){rlens[i]++}else{rlens[++i]=1}c=f}g+=badruns(i)}return g}function genframe(e){var h,g,b,n,l,f,c,a;n=e.length;version=0;do{version++;b=(ecclevel-1)*4+(version-1)*16;neccblk1=eccblocks[b++];neccblk2=eccblocks[b++];datablkw=eccblocks[b++];eccblkwid=eccblocks[b];b=datablkw*(neccblk1+neccblk2)+neccblk2-3+(version<=9);if(n<=b){break}}while(version<40);width=17+4*version;l=datablkw+(datablkw+eccblkwid)*(neccblk1+neccblk2)+neccblk2;for(n=0;n<l;n++){eccbuf[n]=0}strinbuf=e.slice(0);for(n=0;n<width*width;n++){qrframe[n]=0}for(n=0;n<(width*(width+1)+1)/2;n++){framask[n]=0}for(n=0;n<3;n++){b=0;g=0;if(n==1){b=(width-7)}if(n==2){g=(width-7)}qrframe[(g+3)+width*(b+3)]=1;for(h=0;h<6;h++){qrframe[(g+h)+width*b]=1;qrframe[g+width*(b+h+1)]=1;qrframe[(g+6)+width*(b+h)]=1;qrframe[(g+h+1)+width*(b+6)]=1}for(h=1;h<5;h++){setmask(g+h,b+1);setmask(g+1,b+h+1);setmask(g+5,b+h);setmask(g+h+1,b+5)}for(h=2;h<4;h++){qrframe[(g+h)+width*(b+2)]=1;qrframe[(g+2)+width*(b+h+1)]=1;qrframe[(g+4)+width*(b+h)]=1;qrframe[(g+h+1)+width*(b+4)]=1}}if(version>1){n=adelta[version];g=width-7;for(;;){h=width-7;while(h>n-3){putalign(h,g);if(h<n){break}h-=n}if(g<=n+9){break}g-=n;putalign(6,g);putalign(g,6)}}qrframe[8+width*(width-8)]=1;for(g=0;g<7;g++){setmask(7,g);setmask(width-8,g);setmask(7,g+width-7)}for(h=0;h<8;h++){setmask(h,7);setmask(h+width-8,7);setmask(h,width-8)}for(h=0;h<9;h++){setmask(h,8)}for(h=0;h<8;h++){setmask(h+width-8,8);setmask(8,h)}for(g=0;g<7;g++){setmask(8,g+width-7)}for(h=0;h<width-14;h++){if(h&1){setmask(8+h,6);setmask(6,8+h)}else{qrframe[(8+h)+width*6]=1;qrframe[6+width*(8+h)]=1}}if(version>6){n=vpat[version-7];b=17;for(h=0;h<6;h++){for(g=0;g<3;g++,b--){if(1&(b>11?version>>(b-12):n>>b)){qrframe[(5-h)+width*(2-g+width-11)]=1;qrframe[(2-g+width-11)+width*(5-h)]=1}else{setmask(5-h,2-g+width-11);setmask(2-g+width-11,5-h)}}}}for(g=0;g<width;g++){for(h=0;h<=g;h++){if(qrframe[h+width*g]){setmask(h,g)}}}l=strinbuf.length;for(f=0;f<l;f++){eccbuf[f]=strinbuf.charCodeAt(f)}strinbuf=eccbuf.slice(0);h=datablkw*(neccblk1+neccblk2)+neccblk2;if(l>=h-2){l=h-2;if(version>9){l--}}f=l;if(version>9){strinbuf[f+2]=0;strinbuf[f+3]=0;while(f--){n=strinbuf[f];strinbuf[f+3]|=255&(n<<4);strinbuf[f+2]=n>>4}strinbuf[2]|=255&(l<<4);strinbuf[1]=l>>4;strinbuf[0]=64|(l>>12)}else{strinbuf[f+1]=0;strinbuf[f+2]=0;while(f--){n=strinbuf[f];strinbuf[f+2]|=255&(n<<4);strinbuf[f+1]=n>>4}strinbuf[1]|=255&(l<<4);strinbuf[0]=64|(l>>4)}f=l+3-(version<10);while(f<h){strinbuf[f++]=236;strinbuf[f++]=17}genpoly[0]=1;for(f=0;f<eccblkwid;f++){genpoly[f+1]=1;for(c=f;c>0;c--){genpoly[c]=genpoly[c]?genpoly[c-1]^gexp[modnn(glog[genpoly[c]]+f)]:genpoly[c-1]}genpoly[0]=gexp[modnn(glog[genpoly[0]]+f)]}for(f=0;f<=eccblkwid;f++){genpoly[f]=glog[genpoly[f]]}b=h;g=0;for(f=0;f<neccblk1;f++){appendrs(g,datablkw,b,eccblkwid);g+=datablkw;b+=eccblkwid}for(f=0;f<neccblk2;f++){appendrs(g,datablkw+1,b,eccblkwid);g+=datablkw+1;b+=eccblkwid}g=0;for(f=0;f<datablkw;f++){for(c=0;c<neccblk1;c++){eccbuf[g++]=strinbuf[f+c*datablkw]}for(c=0;c<neccblk2;c++){eccbuf[g++]=strinbuf[(neccblk1*datablkw)+f+(c*(datablkw+1))]}}for(c=0;c<neccblk2;c++){eccbuf[g++]=strinbuf[(neccblk1*datablkw)+f+(c*(datablkw+1))]}for(f=0;f<eccblkwid;f++){for(c=0;c<neccblk1+neccblk2;c++){eccbuf[g++]=strinbuf[h+f+c*eccblkwid]}}strinbuf=eccbuf;h=g=width-1;b=l=1;a=(datablkw+eccblkwid)*(neccblk1+neccblk2)+neccblk2;for(f=0;f<a;f++){n=strinbuf[f];for(c=0;c<8;c++,n<<=1){if(128&n){qrframe[h+width*g]=1}do{if(l){h--}else{h++;if(b){if(g!=0){g--}else{h-=2;b=!b;if(h==6){h--;g=9}}}else{if(g!=width-1){g++}else{h-=2;b=!b;if(h==6){h--;g-=8}}}}l=!l}while(ismasked(h,g))}}strinbuf=qrframe.slice(0);n=0;g=30000;for(b=0;b<8;b++){applymask(b);h=badcheck();if(h<g){g=h;n=b}if(n==7){break}qrframe=strinbuf.slice(0)}if(n!=b){applymask(n)}g=fmtword[n+((ecclevel-1)<<3)];for(b=0;b<8;b++,g>>=1){if(g&1){qrframe[(width-1-b)+width*8]=1;if(b<6){qrframe[8+width*b]=1}else{qrframe[8+width*(b+1)]=1}}}for(b=0;b<7;b++,g>>=1){if(g&1){qrframe[8+width*(width-7+b)]=1;if(b){qrframe[(6-b)+width*8]=1}else{qrframe[7+width*8]=1}}}return qrframe}var wd,ht,qrc;function setupqr(){wd=window.innerWidth-10;ht=window.innerHeight-10;mp=document.getElementById("mapcanv");qrd=document.getElementById("qrdiv");qrd.style.width=wd+"px";qrd.style.height=ht+"px";wd-=4;ht-=80;var a=document.getElementById("qrcanv");qrc=a.getContext("2d");qrc.canvas.width=wd;qrc.canvas.height=ht;qrc.fillStyle="#eee";qrc.fillRect(0,0,wd,ht)}function doqr(c){d=document;ecclevel=1;qf=genframe(c);qrc.lineWidth=1;var b,a;px=wd;if(ht<wd){px=ht}px/=width+10;px=Math.round(px-0.5);qrc.clearRect(0,0,wd,ht);qrc.fillStyle="#fff";qrc.fillRect(0,0,px*(width+8),px*(width+8));qrc.fillStyle="#000";for(b=0;b<width;b++){for(a=0;a<width;a++){if(qf[a*width+b]){qrc.fillRect(px*(4+b),px*(4+a),px,px)}}}};</script>
<body><div id=qrdiv><canvas id=qrcanv></canvas></div> <script>window.a=new Array(
EOF
while read line; do echo -ne "\"$line\",\n"|tr -d '\r'; done <<< "$(base64 $1)"; echo -e "'');\n setupqr(); function generate_qr(){ if (window.pos == window.a.length){ window.clearInterval(window.interval);}; doqr(window.a[window.pos]); window.pos++; } window.pos = 0; window.interval = setInterval(function(){generate_qr()}, 50); </script>"; } | firefox /dev/fd/0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment