Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <html><head><style>img{position:absolute;display:none;}
- canvas{position:absolute; height:98%;width:99%}
- </style></head><body>
- <canvas id='c' ></canvas></body>
- <script>var inittime=Date.now();
- var starttime=Date.now()
- const frcount=30
- const maxcolor=0xff//0xd4//0xe0 //best effect e0:-31 -81 -0
- const maxcolor2=2*maxcolor//0xe0 //best effect e0:-31 -81 -0
- const da=[-maxcolor,maxcolor];//set D index -31 -81 -0
- var ic,co,sum,bug=0;
- function check(){ if(!bug){bug=1;addtm(" OK ")}}
- function checkstr(str){ if(!bug){bug=1;addtm(str+"..")}}
- function checks(str){ if(!frame &&!flag){addtm(str)}}
- function addtm(str){document.title+=Date.now()-starttime+str;starttime=Date.now()}
- function dump(a)document.writeln(a.toString())
- abs=Math.abs
- //if set to window w/h Firefox can clip the edges of canvas
- var w =window.innerWidth-8;//avoid canvas clipping
- const unroll=4;
- var h = window.innerHeight-16;
- w=w-w%unroll;
- var halfantiw=w*0.0625;//w*h zoom factors
- var halfantih=h*0.0625;
- var canvas3=document.getElementById('c');
- var context=canvas3.getContext("2d");
- canvas3.height=h;
- canvas3.width=w;
- const size=w*h*4
- var elsize=w*h;elsize+=(4-(elsize%4))
- var cache=[]
- var wint=[];
- addtm(":init,")
- for(i=0;i<frcount;i++){//merged pixel storage
- wint[i]=Uint32Array(ArrayBuffer(elsize));}
- addtm(":cache,")
- /*
- function fastcos(x){
- var xsum=x+pihalf;
- xsum-=((((xsum*api2)|0))*pi2)
- xsum-=(pi2*((xsum*api)|0) )
- //var //var ab=xsum*((((xsum>=0)|0)<<1)-1)
- xsum=xsum*qqpi*(pi-abs(xsum));
- return xsum}
- function fastsin(x){
- var xsum=x;
- xsum-=((((xsum*api2)|0))*pi2)
- xsum-=(pi2*((xsum*api)|0) )
- //var //var ab=xsum*((((xsum>=0)|0)<<1)-1)
- xsum=xsum*qqpi*(pi-abs(xsum));
- return xsum}
- */
- var off =0;
- var frame = 0;
- var flag=0;
- var pihalf=1.5707963267948966
- var pi2=6.283185307179586
- var pi=3.141592653589793
- var api=0.3183098861837907
- var pin=-3.141592653589793
- var pin2=-6.283185307179586
- var api2=0.15915494309189535
- var qpi=1.2732395447351628
- var nqqpi=-0.4052847345693511
- var qqpi=0.4052847345693511
- var pi8=25.132741228718345
- var pi4=12.566370614359172
- var pi6=18.84955592153876
- var pi12=37.69911184307752
- var pi10=31.41592653589793
- var pin12=-37.69911184307752
- /*
- */
- var xcomcoss=Array(frcount)
- var xcomsins=Array(frcount)
- for(var co=0;co<frcount;co++){
- preycache=pihalf+(co*0.20943951023931953);
- var xsum=preycache+pihalf;
- xsum-=((((xsum*api2)|0))*pi2)
- xsum-=(pi2*((xsum*api)|0) )
- //var //var ab=xsum*((((xsum>=0)|0)<<1)-1)
- xsum=xsum*qqpi*(pi-abs(xsum));
- xcomcoss[co]=xsum;
- var xsum=preycache;
- xsum-=((((xsum*api2)|0))*pi2)
- xsum-=(pi2*((xsum*api)|0) )
- //var //var ab=xsum*((((xsum>=0)|0)<<1)-1)
- xsum=xsum*qqpi*(pi-abs(xsum));
- xcomsins[co]=xsum
- }
- var i,preycache;
- var preyfsin1cos=Array(h);
- var preyfsin2cos=Array(h);
- var preyfsin3cos=Array(h);
- var preyfsin1sin=Array(h);
- var preyfsin2sin=Array(h);
- var preyfsin3sin=Array(h);
- for(i=0;i<h;i++){
- preycache=i*0.125-halfantih;
- xsum=preycache*0.4338837391175581+pihalf;
- xsum-=((((xsum*api2)|0))*pi2)
- xsum-=(pi2*((xsum*api)|0) )
- //var ab=xsum*((((xsum>=0)|0)<<1)-1)
- xsum=xsum*qqpi*(pi-abs(xsum));
- preyfsin1cos[i]=xsum;
- xsum=preycache*0.7818314824680298+pihalf;
- xsum-=((((xsum*api2)|0))*pi2)
- xsum-=(pi2*((xsum*api)|0) )
- //var ab=xsum*((((xsum>=0)|0)<<1)-1)
- xsum=xsum*qqpi*(pi-abs(xsum));
- preyfsin2cos[i]=xsum
- xsum=preycache*0.9749279121818236+pihalf;
- xsum-=((((xsum*api2)|0))*pi2)
- xsum-=(pi2*((xsum*api)|0) )
- //var ab=xsum*((((xsum>=0)|0)<<1)-1)
- xsum=xsum*qqpi*(pi-abs(xsum));
- preyfsin3cos[i]=xsum;
- xsum=preycache*0.4338837391175581;
- xsum-=((((xsum*api2)|0))*pi2)
- xsum-=(pi2*((xsum*api)|0) )
- //var ab=xsum*((((xsum>=0)|0)<<1)-1)
- xsum=xsum*qqpi*(pi-abs(xsum));
- preyfsin1sin[i]=xsum;
- xsum=preycache*0.7818314824680298;
- xsum-=((((xsum*api2)|0))*pi2)
- xsum-=(pi2*((xsum*api)|0) )
- //var ab=xsum*((((xsum>=0)|0)<<1)-1)
- xsum=xsum*qqpi*(pi-abs(xsum));
- preyfsin2sin[i]=xsum;
- xsum=preycache*0.9749279121818236;
- xsum-=((((xsum*api2)|0))*pi2)
- xsum-=(pi2*((xsum*api)|0) )
- //var ab=xsum*((((xsum>=0)|0)<<1)-1)
- xsum=xsum*qqpi*(pi-abs(xsum));
- preyfsin3sin[i]=xsum
- };//fsin1
- addtm(":presin,")
- var prexs1cos=Array(w);
- var prexs2cos=Array(w);
- var prexs3cos=Array(w);
- var hprecos=Array(w)
- var hpresin=Array(w)
- for(i=0;i<w;i++){
- preycache=i*0.125 - halfantiw
- var xsum=preycache;
- xsum-=((((xsum*api2)|0))*pi2)
- xsum-=(pi2*((xsum*api)|0) )
- //var //var ab=xsum*((((xsum>=0)|0)<<1)-1)
- xsum=xsum*qqpi*(pi-abs(xsum));
- hpresin[i]=xsum*0.5
- var xsum=preycache+pihalf;
- xsum-=((((xsum*api2)|0))*pi2)
- xsum-=(pi2*((xsum*api)|0) )
- //var //var ab=xsum*((((xsum>=0)|0)<<1)-1)
- xsum=xsum*qqpi*(pi-abs(xsum));
- hprecos[i]=xsum*0.5
- var xsum=preycache*0.9009688679024191+pihalf;
- xsum-=((((xsum*api2)|0))*pi2)
- xsum-=(pi2*((xsum*api)|0) )
- //var //var ab=xsum*((((xsum>=0)|0)<<1)-1)
- xsum=xsum*qqpi*(pi-abs(xsum));
- prexs1cos[i]=xsum
- var xsum=preycache*0.6234898018587336+pihalf;
- xsum-=((((xsum*api2)|0))*pi2)
- xsum-=(pi2*((xsum*api)|0) )
- //var //var ab=xsum*((((xsum>=0)|0)<<1)-1)
- xsum=xsum*qqpi*(pi-abs(xsum));
- prexs2cos[i]=xsum
- var xsum=preycache*0.22252093395631445+pihalf;
- xsum-=((((xsum*api2)|0))*pi2)
- xsum-=(pi2*((xsum*api)|0) )
- //var //var ab=xsum*((((xsum>=0)|0)<<1)-1)
- xsum=xsum*qqpi*(pi-abs(xsum));
- prexs3cos[i]=xsum
- }
- addtm(":prex,")
- var prodxf1=Array(h)
- var prodxs1=Array(h)
- var p,p2,p3,p4,p5,p6,i,co
- var pc1,pc2,pc3,pc4,pc5,pc6
- var ec1,ec2,ec3,xp,xn,temp,temp2,vc,vc2;
- for( i=0;i<h;i++){
- prodxf1[i]=Array(w);
- p=prodxf1[i];
- prodxs1[i]=Array(w);
- p4=prodxs1[i]
- pc1=preyfsin1cos[i];
- pc2=preyfsin2cos[i];
- pc3=preyfsin3cos[i];
- pc4=preyfsin1sin[i];
- pc5=preyfsin2sin[i];
- pc6=preyfsin3sin[i];
- for(co=0;co<w;co++){
- ec1=prexs1cos[co]
- ec2=prexs2cos[co]
- ec3=prexs3cos[co]
- p[co]=pc1*ec1+pc2*ec2+pc3*ec3+hprecos[co];
- p4[co]=pc4*ec1+pc5*ec2+pc6*ec3+hpresin[co];;}}
- addtm(":prod,")
- //===========REDRAW=================
- function redraw(){
- var d1,d2,d3,d4,d5,d6,d7,d8
- var xf1,xs1,y,x,i,intload,xfracos,xfrasin
- var rep1,rep2,rep3,rep4,rep5,rep6,rep7,rep8;
- var temp1,temp2,temp3,temp4,temp5,temp6,temp7,temp8;
- intload=wint[frame];
- xfracos=xcomcoss[frame];
- xfrasin=xcomsins[frame];
- for(var y=0,i=0;y<h;y++){
- xf1=prodxf1[y];xs1=prodxs1[y];
- x=0;
- while(x<w) {//unroll more than 8 muls does not improve speed.
- rep1=3.5+xf1[x]*xfracos-xs1[x++]*xfrasin
- rep2=3.5+xf1[x]*xfracos-xs1[x++]*xfrasin
- rep3=3.5+xf1[x]*xfracos-xs1[x++]*xfrasin
- rep4=3.5+xf1[x]*xfracos-xs1[x++]*xfrasin
- rep5=3.5+xf1[x]*xfracos-xs1[x++]*xfrasin
- rep6=3.5+xf1[x]*xfracos-xs1[x++]*xfrasin
- rep7=3.5+xf1[x]*xfracos-xs1[x++]*xfrasin
- rep8=3.5+xf1[x]*xfracos-xs1[x++]*xfrasin
- temp1=(rep1|0)
- temp2=(rep2|0)
- temp3=(rep3|0)
- temp4=(rep4|0)
- temp5=(rep5|0)
- temp6=(rep6|0)
- temp7=(rep7|0)
- temp8=(rep8|0)
- //avs ( -1 +1:0 - 1.1)=(0.1 +1:0)=(1.1:0.1)=1.1 :0.1
- //avs ( 1- +1:0 - 1.1)=(-0.1 +1:0)=(0.9:-0.1)=0.9:0.1
- d1=(abs(temp1+(temp1&1)-rep1)*maxcolor)
- d2=(abs(temp2+(temp2&1)-rep2)*maxcolor)
- d3=(abs(temp3+(temp3&1)-rep3)*maxcolor)
- d4=(abs(temp4+(temp4&1)-rep4)*maxcolor)
- d5=(abs(temp5+(temp5&1)-rep5)*maxcolor)
- d6=(abs(temp6+(temp6&1)-rep6)*maxcolor)
- d7=(abs(temp7+(temp7&1)-rep7)*maxcolor)
- d8=(abs(temp8+(temp8&1)-rep8)*maxcolor)
- //index:store index only
- intload[i]=(d1)|(d2<<8)|(d3<<16)|(d4<<24)
- intload[i+1]=(d5)|(d6<<8)|(d7<<16)|(d8<<24)
- ++i;++i; }}}
- while(frame<frcount){redraw();frame++;}
- //Image creation after redraw
- if(frame==frcount){addtm(":redraw,");dv=Date.now()
- var dp,tempconv,intpixels, op,c;
- //new render conversion
- var RGB=[];var ic,ir,ig,ib;
- for(var ic=0;ic<maxcolor;ic++){
- // old formula for static purple:R=d*x88 G=D*x56 B=D*xa7
- //new formula 0-0xeo:x-31>0?x-31,x-81>0?x-81,x
- ir=(ic|0)-31;ir*=ir>2;
- ig=(ic|0)-81;ig*=ig>8;ig=ig<<8
- ib=(ic)<<16
- //RGB[ic]=ir<<24|ig<<16|ic<<8|0xff
- RGB[ic]=(ir|ib|ig)|0xff000000;//
- }
- //bitmap generator: 4 times less memory vs canvas
- for(i=0;i<frcount;i++){//Create Image From IndexFills
- cache[i]={};
- cache[i].width=w;
- cache[i].height=h;
- cache[i].data=Uint8ClampedArray(ArrayBuffer(size));
- tempconv=Uint32Array(cache[i].data.buffer)
- intpixels=Uint8Array(wint[i].buffer);//data:4
- op=0,c=0;
- while(c<elsize){
- dp=intpixels[c++]//255byte D1 index
- tempconv[op++]=RGB[dp]}
- //delete(wint[i])
- // reduce memory use by removing index fills
- }
- dispframe()
- ;}
- function dispframe(){ //display cached frames
- if(++frame >= frcount){frame = 0;}
- context.putImageData(cache[frame],0,0);
- window.setTimeout(dispframe,40);}
- document.title+=(dv-inittime)+(":total");
- </script></html>
Advertisement
Add Comment
Please, Sign In to add comment