litecanvas 0.206.1 → 0.206.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/dist.dev.js CHANGED
@@ -115,7 +115,7 @@
115
115
  var assert = (condition, message = "Assertion failed") => {
116
116
  if (!condition) throw new Error("[litecanvas] " + message);
117
117
  };
118
- var version = "0.206.1";
118
+ var version = "0.206.2";
119
119
  function litecanvas(settings = {}) {
120
120
  const root = window,
121
121
  math = Math,
@@ -450,102 +450,98 @@
450
450
  _ctx[radii ? "roundRect" : "rect"](~~x, ~~y, ~~width, ~~height, radii);
451
451
  instance.fill(color);
452
452
  },
453
- circ(x, y, radius, color) {
453
+ oval(x, y, radiusX, radiusY, color) {
454
454
  DEV: assert(
455
455
  isNumber(x),
456
- loggerPrefix + "circ() 1st param must be a number",
456
+ loggerPrefix + "oval() 1st param must be a number",
457
457
  );
458
458
  DEV: assert(
459
459
  isNumber(y),
460
- loggerPrefix + "circ() 2nd param must be a number",
460
+ loggerPrefix + "oval() 2nd param must be a number",
461
461
  );
462
462
  DEV: assert(
463
- isNumber(radius) && radius >= 0,
464
- loggerPrefix + "circ() 3rd param must be a positive number or zero",
463
+ isNumber(radiusX) && radiusX >= 0,
464
+ loggerPrefix + "oval() 3rd param must be a positive number or zero",
465
+ );
466
+ DEV: assert(
467
+ isNumber(radiusY) && radiusY >= 0,
468
+ loggerPrefix + "oval() 4th param must be a positive number or zero",
465
469
  );
466
470
  DEV: assert(
467
471
  null == color || (isNumber(color) && color >= 0),
468
- loggerPrefix + "circ() 4th param must be a positive number or zero",
472
+ loggerPrefix + "oval() 5th param must be a positive number or zero",
469
473
  );
470
474
  beginPath(_ctx);
471
- _ctx.arc(~~x, ~~y, ~~radius, 0, TWO_PI);
475
+ _ctx.ellipse(~~x, ~~y, ~~radiusX, ~~radiusY, 0, 0, TWO_PI);
472
476
  instance.stroke(color);
473
477
  },
474
- circfill(x, y, radius, color) {
478
+ ovalfill(x, y, radiusX, radiusY, color) {
475
479
  DEV: assert(
476
480
  isNumber(x),
477
- loggerPrefix + "circfill() 1st param must be a number",
481
+ loggerPrefix + "ovalfill() 1st param must be a number",
478
482
  );
479
483
  DEV: assert(
480
484
  isNumber(y),
481
- loggerPrefix + "circfill() 2nd param must be a number",
485
+ loggerPrefix + "ovalfill() 2nd param must be a number",
482
486
  );
483
487
  DEV: assert(
484
- isNumber(radius) && radius >= 0,
488
+ isNumber(radiusX) && radiusX >= 0,
485
489
  loggerPrefix +
486
- "circfill() 3rd param must be a positive number or zero",
490
+ "ovalfill() 3rd param must be a positive number or zero",
491
+ );
492
+ DEV: assert(
493
+ isNumber(radiusY) && radiusY >= 0,
494
+ loggerPrefix +
495
+ "ovalfill() 4th param must be a positive number or zero",
487
496
  );
488
497
  DEV: assert(
489
498
  null == color || (isNumber(color) && color >= 0),
490
499
  loggerPrefix +
491
- "circfill() 4th param must be a positive number or zero",
500
+ "ovalfill() 5th param must be a positive number or zero",
492
501
  );
493
502
  beginPath(_ctx);
494
- _ctx.arc(~~x, ~~y, ~~radius, 0, TWO_PI);
503
+ _ctx.ellipse(~~x, ~~y, ~~radiusX, ~~radiusY, 0, 0, TWO_PI);
495
504
  instance.fill(color);
496
505
  },
497
- oval(x, y, radiusX, radiusY, color) {
506
+ circ(x, y, radius, color) {
498
507
  DEV: assert(
499
508
  isNumber(x),
500
- loggerPrefix + "oval() 1st param must be a number",
509
+ loggerPrefix + "circ() 1st param must be a number",
501
510
  );
502
511
  DEV: assert(
503
512
  isNumber(y),
504
- loggerPrefix + "oval() 2nd param must be a number",
505
- );
506
- DEV: assert(
507
- isNumber(radiusX) && radiusX >= 0,
508
- loggerPrefix + "oval() 3rd param must be a positive number or zero",
513
+ loggerPrefix + "circ() 2nd param must be a number",
509
514
  );
510
515
  DEV: assert(
511
- isNumber(radiusY) && radiusY >= 0,
512
- loggerPrefix + "oval() 4th param must be a positive number or zero",
516
+ isNumber(radius) && radius >= 0,
517
+ loggerPrefix + "circ() 3rd param must be a positive number or zero",
513
518
  );
514
519
  DEV: assert(
515
520
  null == color || (isNumber(color) && color >= 0),
516
- loggerPrefix + "oval() 5th param must be a positive number or zero",
521
+ loggerPrefix + "circ() 4th param must be a positive number or zero",
517
522
  );
518
- beginPath(_ctx);
519
- _ctx.ellipse(~~x, ~~y, ~~radiusX, ~~radiusY, 0, 0, TWO_PI);
520
- instance.stroke(color);
523
+ instance.oval(x, y, radius, radius, color);
521
524
  },
522
- ovalfill(x, y, radiusX, radiusY, color) {
525
+ circfill(x, y, radius, color) {
523
526
  DEV: assert(
524
527
  isNumber(x),
525
- loggerPrefix + "ovalfill() 1st param must be a number",
528
+ loggerPrefix + "circfill() 1st param must be a number",
526
529
  );
527
530
  DEV: assert(
528
531
  isNumber(y),
529
- loggerPrefix + "ovalfill() 2nd param must be a number",
530
- );
531
- DEV: assert(
532
- isNumber(radiusX) && radiusX >= 0,
533
- loggerPrefix +
534
- "ovalfill() 3rd param must be a positive number or zero",
532
+ loggerPrefix + "circfill() 2nd param must be a number",
535
533
  );
536
534
  DEV: assert(
537
- isNumber(radiusY) && radiusY >= 0,
535
+ isNumber(radius) && radius >= 0,
538
536
  loggerPrefix +
539
- "ovalfill() 4th param must be a positive number or zero",
537
+ "circfill() 3rd param must be a positive number or zero",
540
538
  );
541
539
  DEV: assert(
542
540
  null == color || (isNumber(color) && color >= 0),
543
541
  loggerPrefix +
544
- "ovalfill() 5th param must be a positive number or zero",
542
+ "circfill() 4th param must be a positive number or zero",
545
543
  );
546
- beginPath(_ctx);
547
- _ctx.ellipse(~~x, ~~y, ~~radiusX, ~~radiusY, 0, 0, TWO_PI);
548
- instance.fill(color);
544
+ instance.ovalfill(x, y, radius, radius, color);
549
545
  },
550
546
  shape(points) {
551
547
  DEV: assert(
package/dist/dist.js CHANGED
@@ -242,16 +242,6 @@
242
242
  _ctx[radii ? "roundRect" : "rect"](~~x, ~~y, ~~width, ~~height, radii);
243
243
  instance.fill(color);
244
244
  },
245
- circ(x, y, radius, color) {
246
- beginPath(_ctx);
247
- _ctx.arc(~~x, ~~y, ~~radius, 0, TWO_PI);
248
- instance.stroke(color);
249
- },
250
- circfill(x, y, radius, color) {
251
- beginPath(_ctx);
252
- _ctx.arc(~~x, ~~y, ~~radius, 0, TWO_PI);
253
- instance.fill(color);
254
- },
255
245
  oval(x, y, radiusX, radiusY, color) {
256
246
  beginPath(_ctx);
257
247
  _ctx.ellipse(~~x, ~~y, ~~radiusX, ~~radiusY, 0, 0, TWO_PI);
@@ -262,6 +252,12 @@
262
252
  _ctx.ellipse(~~x, ~~y, ~~radiusX, ~~radiusY, 0, 0, TWO_PI);
263
253
  instance.fill(color);
264
254
  },
255
+ circ(x, y, radius, color) {
256
+ instance.oval(x, y, radius, radius, color);
257
+ },
258
+ circfill(x, y, radius, color) {
259
+ instance.ovalfill(x, y, radius, radius, color);
260
+ },
265
261
  shape(points) {
266
262
  beginPath(_ctx);
267
263
  for (let i = 0; i < points.length; i += 2) {
package/dist/dist.min.js CHANGED
@@ -1 +1 @@
1
- (()=>{var e=["#211e20","#555568","#a0a08b","#e9efec"];window.litecanvas=function(t={}){let a,l,n=window,i=Math,o=performance,r=2*i.PI,s=requestAnimationFrame,f=[],c=(e,t,a)=>{e.addEventListener(t,a,!1),f.push(()=>e.removeEventListener(t,a,!1))},d=(a=new AudioContext,n.zzfxV=1,(e=1,t=.05,l=220,i=0,o=0,r=.1,s=0,f=1,c=0,d=0,u=0,p=0,h=0,m=0,g=0,w=0,v=0,x=1,y=0,b=0,k=0)=>{let E=Math,P=2*E.PI,T=c*=500*P/44100/44100,z=l*=(1-t+2*t*E.random(t=[]))*P/44100,C=0,I=0,L=0,D=1,A=0,S=0,H=0,M=k<0?-1:1,N=P*M*k*2/44100,W=E.cos(N),q=E.sin,B=q(N)/4,V=1+B,O=-2*W/V,R=(1-B)/V,F=(1+M*W)/2/V,G=-(M+W)/V,X=0,Y=0,$=0,j=0;for(i=44100*i+9,y*=44100,o*=44100,r*=44100,v*=44100,d*=500*P/85766121e6,g*=P/44100,u*=P/44100,p*=44100,h=44100*h|0,e*=.3*n.zzfxV,M=i+y+o+r+v|0;L<M;t[L++]=H*e)++S%(100*w|0)||(H=s?1<s?2<s?3<s?q(C*C):E.max(E.min(E.tan(C),1),-1):1-(2*C/P%2+2)%2:1-4*E.abs(E.round(C/P)-C/P):q(C),H=(h?1-b+b*q(P*L/h):1)*(H<0?-1:1)*E.abs(H)**f*(L<i?L/i:L<i+y?1-(L-i)/y*(1-x):L<i+y+o?x:L<M-v?(M-L-v)/r*x:0),H=v?H/2+(v>L?0:(L<M-v?1:(M-L)/v)*t[L-v|0]/2/e):H,k&&(H=j=F*X+G*(X=Y)+F*(Y=H)-R*$-O*($=j))),C+=(N=(l+=c+=d)*E.cos(g*I++))+N*m*q(L**5),D&&++D>p&&(l+=u,z+=u,D=0),!h||++A%h||(l=z,c=T,D=D||1);(e=a.createBuffer(1,M,44100)).getChannelData(0).set(t),(l=a.createBufferSource()).buffer=e,l.connect(a.destination),l.start()}),u=(t=Object.assign({width:null,height:null,autoscale:!0,canvas:null,global:!0,loop:null,tapEvents:!0,keyboardEvents:!0},t)).loop,p=!1,h,m,g=1,w,v=.5,x=1,y,b=1e3/60,k,E=0,P=3,T="sans-serif",z=20,C=1.2,I=Date.now(),L=e,D=[],A=[.5,0,1750,,,.3,1,,,,600,.1],S={},H={W:0,H:0,T:0,MX:-1,MY:-1,TWO_PI:r,HALF_PI:r/4,lerp:(e,t,a)=>e+a*(t-e),deg2rad:e=>i.PI/180*e,rad2deg:e=>180/i.PI*e,round:(e,t=0)=>{if(!t)return i.round(e);let a=10**t;return i.round(e*a)/a},clamp:(e,t,a)=>e<t?t:e>a?a:e,dist:(e,t,a,l)=>i.hypot(a-e,l-t),wrap:(e,t,a)=>e-(a-t)*i.floor((e-t)/(a-t)),map(e,t,a,l,n,i){let o=(e-t)/(a-t)*(n-l)+l;return i?H.clamp(o,l,n):o},norm:(e,t,a)=>H.map(e,t,a,0,1),rand:(e=0,t=1)=>(I=(1664525*I+0x3c6ef35f)%0x100000000)/0x100000000*(t-e)+e,randi:(e=0,t=1)=>~~H.rand(e,t+1),rseed(e){I=~~e},cls(e){null==e?w.clearRect(0,0,H.W,H.H):H.rectfill(0,0,H.W,H.H,e)},rect(e,t,a,l,n,i){w.beginPath(),w[i?"roundRect":"rect"](~~e-v,~~t-v,~~a+2*v,~~l+2*v,i),H.stroke(n)},rectfill(e,t,a,l,n,i){w.beginPath(),w[i?"roundRect":"rect"](~~e,~~t,~~a,~~l,i),H.fill(n)},circ(e,t,a,l){w.beginPath(),w.arc(~~e,~~t,~~a,0,r),H.stroke(l)},circfill(e,t,a,l){w.beginPath(),w.arc(~~e,~~t,~~a,0,r),H.fill(l)},oval(e,t,a,l,n){w.beginPath(),w.ellipse(~~e,~~t,~~a,~~l,0,0,r),H.stroke(n)},ovalfill(e,t,a,l,n){w.beginPath(),w.ellipse(~~e,~~t,~~a,~~l,0,0,r),H.fill(n)},shape(e){w.beginPath();for(let t=0;t<e.length;t+=2)0===t?w.moveTo(~~e[t],~~e[t+1]):w.lineTo(~~e[t],~~e[t+1]);w.lineTo(~~e[0],~~e[1])},line(e,t,a,l,n){w.beginPath();let i=.5*(0!==v&&~~e==~~a),o=.5*(0!==v&&~~t==~~l);w.moveTo(~~e+i,~~t+o),w.lineTo(~~a+i,~~l+o),H.stroke(n)},linewidth(e){w.lineWidth=~~e,v=.5*(0!=~~e%2)},linedash(e,t=0){w.setLineDash(e),w.lineDashOffset=t},text(e,t,a,l=P,n="normal"){w.font=`${n} ${z}px ${T}`,w.fillStyle=B(l);let i=(""+a).split("\n");for(let a=0;a<i.length;a++)w.fillText(i[a],~~e,~~t+z*C*a)},textgap(e){C=e},textfont(e){T=e},textsize(e){z=e},textalign(e,t){e&&(w.textAlign=e),t&&(w.textBaseline=t)},image(e,t,a){w.drawImage(a,~~e,~~t)},spr(e,t,a){let l=a.trim().split("\n");for(let a=0;a<l.length;a++){let n=l[a].trim();for(let l=0;l<n.length;l++){let i=n[l];"."!==i&&" "!==i&&H.rectfill(e+l,t+a,1,1,parseInt(i,36)||0)}}},paint(e,t,a,l={}){let n=l.canvas||new OffscreenCanvas(1,1),i=l.scale||1,o=w;return n.width=e*i,n.height=t*i,(w=n.getContext("2d")).scale(i,i),a(w),w=o,n.transferToImageBitmap()},ctx:e=>(e&&(w=e),w),push(){w.save()},pop(){w.restore()},translate(e,t){w.translate(~~e,~~t)},scale(e,t=e){w.scale(e,t)},rotate(e){w.rotate(e)},alpha(e){w.globalAlpha=H.clamp(e,0,1)},fill(e){w.fillStyle=B(e),w.fill()},stroke(e){w.strokeStyle=B(e),w.stroke()},clip(e){w.beginPath(),e(w),w.clip()},sfx:(e,t,a)=>!!n.zzfxV&&(!navigator.userActivation||!!navigator.userActivation.hasBeenActive)&&(e||=A,(t||a)&&((e=e.slice())[0]=(a||1)*(e[0]||1),e[10]=~~e[10]+t),d.apply(0,e),e),volume(e){n.zzfxV=e},canvas:()=>m,use(e,t={}){var a=e,l=t;let n=a(H,l);for(let e in n)H.def(e,n[e])},listen:(e,t)=>{S[e=e.toLowerCase()]=S[e]||new Set,S[e].add(t)},unlisten:(e,t)=>{S[e=e.toLowerCase()]&&S[e].delete(t)},emit:(e,t,a,l,i)=>(p&&(q("before:"+(e=e.toLowerCase()),t,a,l,i),u||n[e]===H[e]||"function"!=typeof n[e]||n[e](t,a,l,i),q(e,t,a,l,i),q("after:"+e,t,a,l,i)),t),pal(t,a=3){L=t||e,D=[],P=a,H.emit("pal",L,P)},palc(e,t){null==e?D=[]:D[e]=t},def(e,a){H[e]=a,t.global&&(n[e]=a)},timescale(e){x=e},framerate(e){b=1e3/~~e},stat:e=>[t,p,b/1e3,g,S,L,A,x,n.zzfxV,I,z,T,D,C][e],pause(){h||(h=!0,E=~~cancelAnimationFrame(E),H.emit("paused"))},resume(){p&&h&&(M(),h=!1,H.emit("resumed"))},ispaused:()=>h,quit(){for(let e of(H.emit("quit"),H.pause(),p=!1,S={},f))e();if(t.global){for(let e in H)delete n[e];delete n.ENGINE}}};for(let e of"PI,sin,cos,atan2,hypot,tan,abs,ceil,floor,trunc,min,max,pow,sqrt,sign,exp".split(","))H[e]=i[e];function M(){E||(k=0,y=o.now(),E=s(N))}function N(){E=s(N);let e=o.now(),t=0,a=e-y;for(y=e,k+=a<100?a:b;k>=b;){t++,k-=b;let e=b/1e3*x;H.emit("update",e,t),H.def("T",H.T+e)}t&&(H.emit("draw",w),t>1&&(k=0))}function W(){let e=t.width>0?t.width:innerWidth,a=t.width>0?t.height||t.width:innerHeight;if(H.def("W",e),H.def("H",a),m.width=e,m.height=a,t.autoscale){let l=+t.autoscale;m.style.display||(m.style.display="block",m.style.margin="auto"),g=i.min(innerWidth/e,innerHeight/a),g=l>1&&g>l?l:g,m.style.width=e*g+"px",m.style.height=a*g+"px"}w.imageSmoothingEnabled=!1,H.textalign("start","top"),H.emit("resized",g)}function q(e,t,a,l,n){if(S[e])for(let i of S[e])i(t,a,l,n)}function B(e){return L[~~(D[e]??e)%L.length]}if(t.global){if(n.ENGINE)throw Error("only one global litecanvas is allowed");Object.assign(n,H),n.ENGINE=H}if(l=document,w=(m=(m="string"==typeof t.canvas?l.querySelector(t.canvas):t.canvas)||l.createElement("canvas")).getContext("2d"),c(m,"click",()=>focus()),W(),m.parentNode||l.body.appendChild(m),m.style.imageRendering="pixelated",m.oncontextmenu=()=>!1,u)for(let e in u)u[e]&&H.listen(e,u[e]);return s(function(){if(t.autoscale&&c(n,"resize",W),t.tapEvents){let e=e=>[(e.pageX-m.offsetLeft)/g,(e.pageY-m.offsetTop)/g],t=new Map,a=(e,a,l)=>{let n={x:a,y:l,xi:a,yi:l,t:o.now()};return t.set(e,n),n},l=(e,l,n)=>{let i=t.get(e)||a(e);i.x=l,i.y=n},i=e=>e&&o.now()-e.t<=300,r=!1;c(m,"mousedown",t=>{if(0===t.button){t.preventDefault();let[l,n]=e(t);H.emit("tap",l,n,0),a(0,l,n),r=!0}}),c(m,"mouseup",a=>{if(0===a.button){a.preventDefault();let l=t.get(0),[n,o]=e(a);i(l)&&H.emit("tapped",l.xi,l.yi,0),H.emit("untap",n,o,0),t.delete(0),r=!1}}),c(n,"mousemove",t=>{t.preventDefault();let[a,n]=e(t);H.def("MX",a),H.def("MY",n),r&&(H.emit("tapping",a,n,0),l(0,a,n))}),c(m,"touchstart",t=>{for(let l of(t.preventDefault(),t.changedTouches)){let[t,n]=e(l);H.emit("tap",t,n,l.identifier+1),a(l.identifier+1,t,n)}}),c(m,"touchmove",t=>{for(let a of(t.preventDefault(),t.changedTouches)){let[t,n]=e(a);H.emit("tapping",t,n,a.identifier+1),l(a.identifier+1,t,n)}});let s=e=>{e.preventDefault();let a=[];if(e.targetTouches.length>0)for(let t of e.targetTouches)a.push(t.identifier+1);for(let[e,l]of t)a.includes(e)||(i(l)&&H.emit("tapped",l.xi,l.yi,e),H.emit("untap",l.x,l.y,e),t.delete(e))};c(m,"touchend",s),c(m,"touchcancel",s),c(n,"blur",()=>{for(let[e,a]of(r=!1,t))H.emit("untap",a.x,a.y,e),t.delete(e)})}if(t.keyboardEvents){let e=new Set,t=new Set,a=(e,t="")=>(t=t.toLowerCase())?e.has("space"===t?" ":t):e.size>0,l="";c(n,"keydown",a=>{let n=a.key.toLowerCase();e.has(n)||(e.add(n),t.add(n),l=" "===n?"space":n)}),c(n,"keyup",t=>{e.delete(t.key.toLowerCase())}),c(n,"blur",()=>e.clear()),H.listen("after:update",()=>t.clear()),H.def("iskeydown",t=>a(e,t)),H.def("iskeypressed",e=>a(t,e)),H.def("lastkey",()=>l)}p=!0,H.emit("init",H),h||M()}),H}})();
1
+ (()=>{var e=["#211e20","#555568","#a0a08b","#e9efec"];window.litecanvas=function(t={}){let a,l,n=window,i=Math,o=performance,r=2*i.PI,s=requestAnimationFrame,f=[],d=(e,t,a)=>{e.addEventListener(t,a,!1),f.push(()=>e.removeEventListener(t,a,!1))},c=(a=new AudioContext,n.zzfxV=1,(e=1,t=.05,l=220,i=0,o=0,r=.1,s=0,f=1,d=0,c=0,u=0,p=0,h=0,m=0,g=0,v=0,w=0,x=1,y=0,b=0,k=0)=>{let E=Math,T=2*E.PI,z=d*=500*T/44100/44100,P=l*=(1-t+2*t*E.random(t=[]))*T/44100,C=0,I=0,L=0,D=1,A=0,S=0,H=0,M=k<0?-1:1,N=T*M*k*2/44100,W=E.cos(N),q=E.sin,B=q(N)/4,V=1+B,O=-2*W/V,R=(1-B)/V,F=(1+M*W)/2/V,G=-(M+W)/V,X=0,Y=0,$=0,j=0;for(i=44100*i+9,y*=44100,o*=44100,r*=44100,w*=44100,c*=500*T/85766121e6,g*=T/44100,u*=T/44100,p*=44100,h=44100*h|0,e*=.3*n.zzfxV,M=i+y+o+r+w|0;L<M;t[L++]=H*e)++S%(100*v|0)||(H=s?1<s?2<s?3<s?q(C*C):E.max(E.min(E.tan(C),1),-1):1-(2*C/T%2+2)%2:1-4*E.abs(E.round(C/T)-C/T):q(C),H=(h?1-b+b*q(T*L/h):1)*(H<0?-1:1)*E.abs(H)**f*(L<i?L/i:L<i+y?1-(L-i)/y*(1-x):L<i+y+o?x:L<M-w?(M-L-w)/r*x:0),H=w?H/2+(w>L?0:(L<M-w?1:(M-L)/w)*t[L-w|0]/2/e):H,k&&(H=j=F*X+G*(X=Y)+F*(Y=H)-R*$-O*($=j))),C+=(N=(l+=d+=c)*E.cos(g*I++))+N*m*q(L**5),D&&++D>p&&(l+=u,P+=u,D=0),!h||++A%h||(l=P,d=z,D=D||1);(e=a.createBuffer(1,M,44100)).getChannelData(0).set(t),(l=a.createBufferSource()).buffer=e,l.connect(a.destination),l.start()}),u=(t=Object.assign({width:null,height:null,autoscale:!0,canvas:null,global:!0,loop:null,tapEvents:!0,keyboardEvents:!0},t)).loop,p=!1,h,m,g=1,v,w=.5,x=1,y,b=1e3/60,k,E=0,T=3,z="sans-serif",P=20,C=1.2,I=Date.now(),L=e,D=[],A=[.5,0,1750,,,.3,1,,,,600,.1],S={},H={W:0,H:0,T:0,MX:-1,MY:-1,TWO_PI:r,HALF_PI:r/4,lerp:(e,t,a)=>e+a*(t-e),deg2rad:e=>i.PI/180*e,rad2deg:e=>180/i.PI*e,round:(e,t=0)=>{if(!t)return i.round(e);let a=10**t;return i.round(e*a)/a},clamp:(e,t,a)=>e<t?t:e>a?a:e,dist:(e,t,a,l)=>i.hypot(a-e,l-t),wrap:(e,t,a)=>e-(a-t)*i.floor((e-t)/(a-t)),map(e,t,a,l,n,i){let o=(e-t)/(a-t)*(n-l)+l;return i?H.clamp(o,l,n):o},norm:(e,t,a)=>H.map(e,t,a,0,1),rand:(e=0,t=1)=>(I=(1664525*I+0x3c6ef35f)%0x100000000)/0x100000000*(t-e)+e,randi:(e=0,t=1)=>~~H.rand(e,t+1),rseed(e){I=~~e},cls(e){null==e?v.clearRect(0,0,H.W,H.H):H.rectfill(0,0,H.W,H.H,e)},rect(e,t,a,l,n,i){v.beginPath(),v[i?"roundRect":"rect"](~~e-w,~~t-w,~~a+2*w,~~l+2*w,i),H.stroke(n)},rectfill(e,t,a,l,n,i){v.beginPath(),v[i?"roundRect":"rect"](~~e,~~t,~~a,~~l,i),H.fill(n)},oval(e,t,a,l,n){v.beginPath(),v.ellipse(~~e,~~t,~~a,~~l,0,0,r),H.stroke(n)},ovalfill(e,t,a,l,n){v.beginPath(),v.ellipse(~~e,~~t,~~a,~~l,0,0,r),H.fill(n)},circ(e,t,a,l){H.oval(e,t,a,a,l)},circfill(e,t,a,l){H.ovalfill(e,t,a,a,l)},shape(e){v.beginPath();for(let t=0;t<e.length;t+=2)0===t?v.moveTo(~~e[t],~~e[t+1]):v.lineTo(~~e[t],~~e[t+1]);v.lineTo(~~e[0],~~e[1])},line(e,t,a,l,n){v.beginPath();let i=.5*(0!==w&&~~e==~~a),o=.5*(0!==w&&~~t==~~l);v.moveTo(~~e+i,~~t+o),v.lineTo(~~a+i,~~l+o),H.stroke(n)},linewidth(e){v.lineWidth=~~e,w=.5*(0!=~~e%2)},linedash(e,t=0){v.setLineDash(e),v.lineDashOffset=t},text(e,t,a,l=T,n="normal"){v.font=`${n} ${P}px ${z}`,v.fillStyle=B(l);let i=(""+a).split("\n");for(let a=0;a<i.length;a++)v.fillText(i[a],~~e,~~t+P*C*a)},textgap(e){C=e},textfont(e){z=e},textsize(e){P=e},textalign(e,t){e&&(v.textAlign=e),t&&(v.textBaseline=t)},image(e,t,a){v.drawImage(a,~~e,~~t)},spr(e,t,a){let l=a.trim().split("\n");for(let a=0;a<l.length;a++){let n=l[a].trim();for(let l=0;l<n.length;l++){let i=n[l];"."!==i&&" "!==i&&H.rectfill(e+l,t+a,1,1,parseInt(i,36)||0)}}},paint(e,t,a,l={}){let n=l.canvas||new OffscreenCanvas(1,1),i=l.scale||1,o=v;return n.width=e*i,n.height=t*i,(v=n.getContext("2d")).scale(i,i),a(v),v=o,n.transferToImageBitmap()},ctx:e=>(e&&(v=e),v),push(){v.save()},pop(){v.restore()},translate(e,t){v.translate(~~e,~~t)},scale(e,t=e){v.scale(e,t)},rotate(e){v.rotate(e)},alpha(e){v.globalAlpha=H.clamp(e,0,1)},fill(e){v.fillStyle=B(e),v.fill()},stroke(e){v.strokeStyle=B(e),v.stroke()},clip(e){v.beginPath(),e(v),v.clip()},sfx:(e,t,a)=>!!n.zzfxV&&(!navigator.userActivation||!!navigator.userActivation.hasBeenActive)&&(e||=A,(t||a)&&((e=e.slice())[0]=(a||1)*(e[0]||1),e[10]=~~e[10]+t),c.apply(0,e),e),volume(e){n.zzfxV=e},canvas:()=>m,use(e,t={}){var a=e,l=t;let n=a(H,l);for(let e in n)H.def(e,n[e])},listen:(e,t)=>{S[e=e.toLowerCase()]=S[e]||new Set,S[e].add(t)},unlisten:(e,t)=>{S[e=e.toLowerCase()]&&S[e].delete(t)},emit:(e,t,a,l,i)=>(p&&(q("before:"+(e=e.toLowerCase()),t,a,l,i),u||n[e]===H[e]||"function"!=typeof n[e]||n[e](t,a,l,i),q(e,t,a,l,i),q("after:"+e,t,a,l,i)),t),pal(t,a=3){L=t||e,D=[],T=a,H.emit("pal",L,T)},palc(e,t){null==e?D=[]:D[e]=t},def(e,a){H[e]=a,t.global&&(n[e]=a)},timescale(e){x=e},framerate(e){b=1e3/~~e},stat:e=>[t,p,b/1e3,g,S,L,A,x,n.zzfxV,I,P,z,D,C][e],pause(){h||(h=!0,E=~~cancelAnimationFrame(E),H.emit("paused"))},resume(){p&&h&&(M(),h=!1,H.emit("resumed"))},ispaused:()=>h,quit(){for(let e of(H.emit("quit"),H.pause(),p=!1,S={},f))e();if(t.global){for(let e in H)delete n[e];delete n.ENGINE}}};for(let e of"PI,sin,cos,atan2,hypot,tan,abs,ceil,floor,trunc,min,max,pow,sqrt,sign,exp".split(","))H[e]=i[e];function M(){E||(k=0,y=o.now(),E=s(N))}function N(){E=s(N);let e=o.now(),t=0,a=e-y;for(y=e,k+=a<100?a:b;k>=b;){t++,k-=b;let e=b/1e3*x;H.emit("update",e,t),H.def("T",H.T+e)}t&&(H.emit("draw",v),t>1&&(k=0))}function W(){let e=t.width>0?t.width:innerWidth,a=t.width>0?t.height||t.width:innerHeight;if(H.def("W",e),H.def("H",a),m.width=e,m.height=a,t.autoscale){let l=+t.autoscale;m.style.display||(m.style.display="block",m.style.margin="auto"),g=i.min(innerWidth/e,innerHeight/a),g=l>1&&g>l?l:g,m.style.width=e*g+"px",m.style.height=a*g+"px"}v.imageSmoothingEnabled=!1,H.textalign("start","top"),H.emit("resized",g)}function q(e,t,a,l,n){if(S[e])for(let i of S[e])i(t,a,l,n)}function B(e){return L[~~(D[e]??e)%L.length]}if(t.global){if(n.ENGINE)throw Error("only one global litecanvas is allowed");Object.assign(n,H),n.ENGINE=H}if(l=document,v=(m=(m="string"==typeof t.canvas?l.querySelector(t.canvas):t.canvas)||l.createElement("canvas")).getContext("2d"),d(m,"click",()=>focus()),W(),m.parentNode||l.body.appendChild(m),m.style.imageRendering="pixelated",m.oncontextmenu=()=>!1,u)for(let e in u)u[e]&&H.listen(e,u[e]);return s(function(){if(t.autoscale&&d(n,"resize",W),t.tapEvents){let e=e=>[(e.pageX-m.offsetLeft)/g,(e.pageY-m.offsetTop)/g],t=new Map,a=(e,a,l)=>{let n={x:a,y:l,xi:a,yi:l,t:o.now()};return t.set(e,n),n},l=(e,l,n)=>{let i=t.get(e)||a(e);i.x=l,i.y=n},i=e=>e&&o.now()-e.t<=300,r=!1;d(m,"mousedown",t=>{if(0===t.button){t.preventDefault();let[l,n]=e(t);H.emit("tap",l,n,0),a(0,l,n),r=!0}}),d(m,"mouseup",a=>{if(0===a.button){a.preventDefault();let l=t.get(0),[n,o]=e(a);i(l)&&H.emit("tapped",l.xi,l.yi,0),H.emit("untap",n,o,0),t.delete(0),r=!1}}),d(n,"mousemove",t=>{t.preventDefault();let[a,n]=e(t);H.def("MX",a),H.def("MY",n),r&&(H.emit("tapping",a,n,0),l(0,a,n))}),d(m,"touchstart",t=>{for(let l of(t.preventDefault(),t.changedTouches)){let[t,n]=e(l);H.emit("tap",t,n,l.identifier+1),a(l.identifier+1,t,n)}}),d(m,"touchmove",t=>{for(let a of(t.preventDefault(),t.changedTouches)){let[t,n]=e(a);H.emit("tapping",t,n,a.identifier+1),l(a.identifier+1,t,n)}});let s=e=>{e.preventDefault();let a=[];if(e.targetTouches.length>0)for(let t of e.targetTouches)a.push(t.identifier+1);for(let[e,l]of t)a.includes(e)||(i(l)&&H.emit("tapped",l.xi,l.yi,e),H.emit("untap",l.x,l.y,e),t.delete(e))};d(m,"touchend",s),d(m,"touchcancel",s),d(n,"blur",()=>{for(let[e,a]of(r=!1,t))H.emit("untap",a.x,a.y,e),t.delete(e)})}if(t.keyboardEvents){let e=new Set,t=new Set,a=(e,t="")=>(t=t.toLowerCase())?e.has("space"===t?" ":t):e.size>0,l="";d(n,"keydown",a=>{let n=a.key.toLowerCase();e.has(n)||(e.add(n),t.add(n),l=" "===n?"space":n)}),d(n,"keyup",t=>{e.delete(t.key.toLowerCase())}),d(n,"blur",()=>e.clear()),H.listen("after:update",()=>t.clear()),H.def("iskeydown",t=>a(e,t)),H.def("iskeypressed",e=>a(t,e)),H.def("lastkey",()=>l)}p=!0,H.emit("init",H),h||M()}),H}})();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "litecanvas",
3
- "version": "0.206.1",
3
+ "version": "0.206.2",
4
4
  "description": "Lightweight HTML5 canvas 2D game engine suitable for small projects and creative coding. Inspired by PICO-8 and p5.js/Processing.",
5
5
  "license": "MIT",
6
6
  "author": "Luiz Bills <luizbills@pm.me>",
package/src/index.js CHANGED
@@ -459,56 +459,6 @@ export default function litecanvas(settings = {}) {
459
459
  instance.fill(color)
460
460
  },
461
461
 
462
- /**
463
- * Draw a circle outline
464
- *
465
- * @param {number} x
466
- * @param {number} y
467
- * @param {number} radius
468
- * @param {number} [color=0] the color index
469
- */
470
- circ(x, y, radius, color) {
471
- DEV: assert(isNumber(x), loggerPrefix + 'circ() 1st param must be a number')
472
- DEV: assert(isNumber(y), loggerPrefix + 'circ() 2nd param must be a number')
473
- DEV: assert(
474
- isNumber(radius) && radius >= 0,
475
- loggerPrefix + 'circ() 3rd param must be a positive number or zero'
476
- )
477
- DEV: assert(
478
- null == color || (isNumber(color) && color >= 0),
479
- loggerPrefix + 'circ() 4th param must be a positive number or zero'
480
- )
481
-
482
- beginPath(_ctx)
483
- _ctx.arc(~~x, ~~y, ~~radius, 0, TWO_PI)
484
- instance.stroke(color)
485
- },
486
-
487
- /**
488
- * Draw a color-filled circle
489
- *
490
- * @param {number} x
491
- * @param {number} y
492
- * @param {number} radius
493
- * @param {number} [color=0] the color index
494
- */
495
- circfill(x, y, radius, color) {
496
- DEV: assert(isNumber(x), loggerPrefix + 'circfill() 1st param must be a number')
497
- DEV: assert(isNumber(y), loggerPrefix + 'circfill() 2nd param must be a number')
498
- DEV: assert(
499
- isNumber(radius) && radius >= 0,
500
- loggerPrefix + 'circfill() 3rd param must be a positive number or zero'
501
- )
502
- DEV: assert(
503
- null == color || (isNumber(color) && color >= 0),
504
- loggerPrefix + 'circfill() 4th param must be a positive number or zero'
505
- )
506
-
507
- beginPath(_ctx)
508
- _ctx.arc(~~x, ~~y, ~~radius, 0, TWO_PI)
509
- instance.fill(color)
510
- },
511
-
512
462
  /**
513
463
  * Draw a ellipse outline
514
464
  *
@@ -569,6 +519,52 @@ export default function litecanvas(settings = {}) {
569
519
  instance.fill(color)
570
520
  },
571
521
 
522
+ /**
523
+ * Draw a circle outline
524
+ *
525
+ * @param {number} x
526
+ * @param {number} y
527
+ * @param {number} radius
528
+ * @param {number} [color=0] the color index
529
+ */
530
+ circ(x, y, radius, color) {
531
+ DEV: assert(isNumber(x), loggerPrefix + 'circ() 1st param must be a number')
532
+ DEV: assert(isNumber(y), loggerPrefix + 'circ() 2nd param must be a number')
533
+ DEV: assert(
534
+ isNumber(radius) && radius >= 0,
535
+ loggerPrefix + 'circ() 3rd param must be a positive number or zero'
536
+ )
537
+ DEV: assert(
538
+ null == color || (isNumber(color) && color >= 0),
539
+ loggerPrefix + 'circ() 4th param must be a positive number or zero'
540
+ )
541
+
542
+ instance.oval(x, y, radius, radius, color)
543
+ },
544
+
545
+ /**
546
+ * Draw a color-filled circle
547
+ *
548
+ * @param {number} x
549
+ * @param {number} y
550
+ * @param {number} radius
551
+ * @param {number} [color=0] the color index
552
+ */
553
+ circfill(x, y, radius, color) {
554
+ DEV: assert(isNumber(x), loggerPrefix + 'circfill() 1st param must be a number')
555
+ DEV: assert(isNumber(y), loggerPrefix + 'circfill() 2nd param must be a number')
556
+ DEV: assert(
557
+ isNumber(radius) && radius >= 0,
558
+ loggerPrefix + 'circfill() 3rd param must be a positive number or zero'
559
+ )
560
+ DEV: assert(
561
+ null == color || (isNumber(color) && color >= 0),
562
+ loggerPrefix + 'circfill() 4th param must be a positive number or zero'
563
+ )
564
+
565
+ instance.ovalfill(x, y, radius, radius, color)
566
+ },
567
+
572
568
  /**
573
569
  * Make a custom shape in the canvas context.
574
570
  * Then, just use `fill` or `stroke` to draw the shape.
package/src/version.js CHANGED
@@ -1,2 +1,2 @@
1
1
  // Generated by genversion.
2
- export const version = '0.206.1'
2
+ export const version = '0.206.2'