textmode.js 0.3.2-beta.1 → 0.3.2-beta.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/textmode.esm.js
CHANGED
|
@@ -2655,7 +2655,7 @@ class Q {
|
|
|
2655
2655
|
N.A(t);
|
|
2656
2656
|
}
|
|
2657
2657
|
static get version() {
|
|
2658
|
-
return "0.3.2-beta.
|
|
2658
|
+
return "0.3.2-beta.2";
|
|
2659
2659
|
}
|
|
2660
2660
|
}
|
|
2661
2661
|
const ie = Object.freeze(Object.defineProperty({ __proto__: null }, Symbol.toStringTag, { value: "Module" })), se = Object.freeze(Object.defineProperty({ __proto__: null, keyboard: jt, mouse: Ht, touch: kt }, Symbol.toStringTag, { value: "Module" })), re = Q.create, ne = Q.setErrorLevel, oe = Q.version;
|
package/dist/textmode.esm.min.js
CHANGED
|
@@ -363,7 +363,7 @@ class M {
|
|
|
363
363
|
}
|
|
364
364
|
}
|
|
365
365
|
const W = `#version 300 es
|
|
366
|
-
in vec2 a_position;in vec2 a_texCoord;in vec2 a_instancePosition;in vec2 a_instanceSize;in vec3 a_instanceCharacter;in vec4 a_instancePrimaryColor;in vec4 a_instanceSecondaryColor;in vec2 a_instanceRotation;in vec3 a_instanceTransform;in vec3 a_instanceGlobalRotation;in vec2 a_instanceRotationCenter;in vec2 a_instanceBezierCP1;in vec2 a_instanceBezierCP2;in vec2 a_instanceBezierStart;in vec2 a_instanceBezierEnd;in vec2 a_instanceArcAngles;uniform float U9;uniform vec2
|
|
366
|
+
in vec2 a_position;in vec2 a_texCoord;in vec2 a_instancePosition;in vec2 a_instanceSize;in vec3 a_instanceCharacter;in vec4 a_instancePrimaryColor;in vec4 a_instanceSecondaryColor;in vec2 a_instanceRotation;in vec3 a_instanceTransform;in vec3 a_instanceGlobalRotation;in vec2 a_instanceRotationCenter;in vec2 a_instanceBezierCP1;in vec2 a_instanceBezierCP2;in vec2 a_instanceBezierStart;in vec2 a_instanceBezierEnd;in vec2 a_instanceArcAngles;uniform float U9;uniform vec2 Uy;out vec2 v_uv;out vec3 v_character;out vec4 v_primaryColor;out vec4 v_secondaryColor;out vec2 v_rotation;out vec3 v_transform;mat3 A(float B){float C=sin(B),D=cos(B);return mat3(1,0,0,0,D,-C,0,C,D);}mat3 E(float B){float C=sin(B),D=cos(B);return mat3(D,0,C,0,1,0,-C,0,D);}mat3 F(float B){float C=sin(B),D=cos(B);return mat3(D,-C,0,C,D,0,0,0,1);}vec2 G(float H,vec2 I,vec2 J,vec2 K,vec2 L){float M=1.-H,N=M*M,O=H*H;return N*M*I+3.*N*H*J+3.*M*O*K+O*H*L;}vec2 P(float H,vec2 I,vec2 J,vec2 K,vec2 L){float M=1.-H,N=M*M,O=H*H;return-3.*N*I+3.*N*J-6.*M*H*J+6.*M*H*K-3.*O*K+3.*O*L;}void main(){v_uv=a_texCoord;v_character=a_instanceCharacter;v_primaryColor=a_instancePrimaryColor;v_secondaryColor=a_instanceSecondaryColor;v_rotation=a_instanceRotation;v_transform=a_instanceTransform;vec2 Q;bool R=length(a_instanceBezierCP1)+length(a_instanceBezierCP2)+length(a_instanceBezierStart)+length(a_instanceBezierEnd)>0.;bool S=a_instanceArcAngles.x!=0.||a_instanceArcAngles.y!=0.;if(R){float H=a_position.x;vec2 T=G(H,a_instanceBezierStart,a_instanceBezierCP1,a_instanceBezierCP2,a_instanceBezierEnd);vec2 U=P(H,a_instanceBezierStart,a_instanceBezierCP1,a_instanceBezierCP2,a_instanceBezierEnd);float V=length(U);U=V>0.?U/V:vec2(1,0);Q=T+vec2(-U.y,U.x)*a_position.y*a_instanceSize.y;}else if(S){float C=a_instanceArcAngles.x,W=a_instanceArcAngles.y;C=mod(C,6.28318530718);if(C<0.)C+=6.28318530718;W=mod(W,6.28318530718);if(W<0.)W+=6.28318530718;float X=C-W;if(X<=0.)X+=6.28318530718;float Y=C-a_position.x*X;vec2 Z=vec2(cos(Y),sin(Y))*a_position.y;Q=Z*a_instanceSize*.5+a_instanceSize*.5+a_instancePosition;}else{Q=a_position*a_instanceSize+a_instancePosition;}vec2 a=(Q/Uy)*2.-1.;a.y=-a.y;if(length(a_instanceGlobalRotation)>0.){vec3 b=vec3(a-a_instanceRotationCenter,0);b.x*=U9;if(a_instanceGlobalRotation.x!=0.)b=A(-a_instanceGlobalRotation.x)*b;if(a_instanceGlobalRotation.y!=0.)b=E(-a_instanceGlobalRotation.y)*b;if(a_instanceGlobalRotation.z!=0.)b=F(-a_instanceGlobalRotation.z)*b;b.x/=U9;a=b.xy+a_instanceRotationCenter;}gl_Position=vec4(a,0,1);}`, st = "attribute vec2 a_position;attribute vec2 a_texCoord;varying vec2 v_uv;void main(){v_uv=a_texCoord;gl_Position=vec4(a_position,0.,1.);}";
|
|
367
367
|
class lt {
|
|
368
368
|
constructor(t) {
|
|
369
369
|
h(this, "gt");
|
|
@@ -437,7 +437,7 @@ class ft {
|
|
|
437
437
|
}
|
|
438
438
|
bs(t, e, i) {
|
|
439
439
|
const { shader: s } = t, r = k(this.gt) || this.gt.getParameter(this.gt.VIEWPORT);
|
|
440
|
-
s.Xt({ U9: r[2] / r[3],
|
|
440
|
+
s.Xt({ U9: r[2] / r[3], Uy: [r[2], r[3]] });
|
|
441
441
|
const n = (l) => {
|
|
442
442
|
if (!l || !l.$s()) return;
|
|
443
443
|
const f = l.unitGeometry, u = l.unitBuffer;
|
|
@@ -468,7 +468,7 @@ class ft {
|
|
|
468
468
|
ks(t, e, i, s, r, n, o, c) {
|
|
469
469
|
e.Ht(), e.Xt(i);
|
|
470
470
|
const l = this.gt.getParameter(this.gt.VIEWPORT);
|
|
471
|
-
if (e.Xt({ U9: l[2] / l[3],
|
|
471
|
+
if (e.Xt({ U9: l[2] / l[3], Uy: [l[2], l[3]] }), t.As(), t.Es({ x: s, y: r, width: n, height: o }, c), t.$s()) {
|
|
472
472
|
const f = t.unitGeometry, u = t.unitBuffer;
|
|
473
473
|
try {
|
|
474
474
|
this.gs.us(e.Zt, t.type + "", f, u), t.batch.Ms(e), t.batch.Rs(f.Fs, f.Ss);
|
|
@@ -2655,7 +2655,7 @@ class Z {
|
|
|
2655
2655
|
z.C(t);
|
|
2656
2656
|
}
|
|
2657
2657
|
static get version() {
|
|
2658
|
-
return "0.3.2-beta.
|
|
2658
|
+
return "0.3.2-beta.2";
|
|
2659
2659
|
}
|
|
2660
2660
|
}
|
|
2661
2661
|
const ie = Object.freeze(Object.defineProperty({ __proto__: null }, Symbol.toStringTag, { value: "Module" })), se = Object.freeze(Object.defineProperty({ __proto__: null, keyboard: jt, mouse: kt, touch: Ht }, Symbol.toStringTag, { value: "Module" })), re = Z.create, ne = Z.setErrorLevel, oe = Z.version;
|
package/dist/textmode.umd.js
CHANGED
|
@@ -8,4 +8,4 @@ ${"↓".repeat(24)}
|
|
|
8
8
|
in vec2 a_position;in vec2 a_texCoord;in vec2 a_instancePosition;in vec2 a_instanceSize;in vec3 a_instanceCharacter;in vec4 a_instancePrimaryColor;in vec4 a_instanceSecondaryColor;in vec2 a_instanceRotation;in vec3 a_instanceTransform;in vec3 a_instanceGlobalRotation;in vec2 a_instanceRotationCenter;in vec2 a_instanceBezierCP1;in vec2 a_instanceBezierCP2;in vec2 a_instanceBezierStart;in vec2 a_instanceBezierEnd;in vec2 a_instanceArcAngles;uniform float U9;uniform vec2 Uw;out vec2 v_uv;out vec3 v_character;out vec4 v_primaryColor;out vec4 v_secondaryColor;out vec2 v_rotation;out vec3 v_transform;mat3 A(float B){float C=sin(B),D=cos(B);return mat3(1,0,0,0,D,-C,0,C,D);}mat3 E(float B){float C=sin(B),D=cos(B);return mat3(D,0,C,0,1,0,-C,0,D);}mat3 F(float B){float C=sin(B),D=cos(B);return mat3(D,-C,0,C,D,0,0,0,1);}vec2 G(float H,vec2 I,vec2 J,vec2 K,vec2 L){float M=1.-H,N=M*M,O=H*H;return N*M*I+3.*N*H*J+3.*M*O*K+O*H*L;}vec2 P(float H,vec2 I,vec2 J,vec2 K,vec2 L){float M=1.-H,N=M*M,O=H*H;return-3.*N*I+3.*N*J-6.*M*H*J+6.*M*H*K-3.*O*K+3.*O*L;}void main(){v_uv=a_texCoord;v_character=a_instanceCharacter;v_primaryColor=a_instancePrimaryColor;v_secondaryColor=a_instanceSecondaryColor;v_rotation=a_instanceRotation;v_transform=a_instanceTransform;vec2 Q;bool R=length(a_instanceBezierCP1)+length(a_instanceBezierCP2)+length(a_instanceBezierStart)+length(a_instanceBezierEnd)>0.;bool S=a_instanceArcAngles.x!=0.||a_instanceArcAngles.y!=0.;if(R){float H=a_position.x;vec2 T=G(H,a_instanceBezierStart,a_instanceBezierCP1,a_instanceBezierCP2,a_instanceBezierEnd);vec2 U=P(H,a_instanceBezierStart,a_instanceBezierCP1,a_instanceBezierCP2,a_instanceBezierEnd);float V=length(U);U=V>0.?U/V:vec2(1,0);Q=T+vec2(-U.y,U.x)*a_position.y*a_instanceSize.y;}else if(S){float C=a_instanceArcAngles.x,W=a_instanceArcAngles.y;C=mod(C,6.28318530718);if(C<0.)C+=6.28318530718;W=mod(W,6.28318530718);if(W<0.)W+=6.28318530718;float X=C-W;if(X<=0.)X+=6.28318530718;float Y=C-a_position.x*X;vec2 Z=vec2(cos(Y),sin(Y))*a_position.y;Q=Z*a_instanceSize*.5+a_instanceSize*.5+a_instancePosition;}else{Q=a_position*a_instanceSize+a_instancePosition;}vec2 a=(Q/Uw)*2.-1.;a.y=-a.y;if(length(a_instanceGlobalRotation)>0.){vec3 b=vec3(a-a_instanceRotationCenter,0);b.x*=U9;if(a_instanceGlobalRotation.x!=0.)b=A(-a_instanceGlobalRotation.x)*b;if(a_instanceGlobalRotation.y!=0.)b=E(-a_instanceGlobalRotation.y)*b;if(a_instanceGlobalRotation.z!=0.)b=F(-a_instanceGlobalRotation.z)*b;b.x/=U9;a=b.xy+a_instanceRotationCenter;}gl_Position=vec4(a,0,1);}`,rt="attribute vec2 a_position;attribute vec2 a_texCoord;varying vec2 v_uv;void main(){v_uv=a_texCoord;gl_Position=vec4(a_position,0.,1.);}";class mt{constructor(t){c(this,"gt");c(this,"Qt");c(this,"Jt");c(this,"ts");c(this,"ss");this.gt=t,this.Jt=new N(this.gt,q,`#version 300 es
|
|
9
9
|
precision highp float;in vec2 v_uv;in vec3 v_character;in vec4 v_primaryColor;in vec4 v_secondaryColor;in vec2 v_rotation;in vec3 v_transform;layout(location=0)out vec4 o_character;layout(location=1)out vec4 o_primaryColor;layout(location=2)out vec4 o_secondaryColor;layout(location=3)out vec4 o_rotation;layout(location=4)out vec4 o_transform;void main(){o_character=vec4(v_character,1.);o_primaryColor=v_primaryColor;o_secondaryColor=v_secondaryColor;o_rotation=vec4(v_rotation,0.,1.);o_transform=vec4(v_transform,1.);}`),this.Qt=new N(this.gt,q,`#version 300 es
|
|
10
10
|
precision highp float;in vec2 v_uv;uniform sampler2D Ue;uniform sampler2D Uf;uniform sampler2D Ug;uniform sampler2D Uh;uniform sampler2D Ui;uniform vec2 Uj;layout(location=0)out vec4 o_character;layout(location=1)out vec4 o_primaryColor;layout(location=2)out vec4 o_secondaryColor;layout(location=3)out vec4 o_rotation;layout(location=4)out vec4 o_transform;void main(){vec2 A=vec2(v_uv.x,1.-v_uv.y);vec2 B=A*Uj;vec2 C=(floor(B)+0.5f)/Uj;vec4 D=texture(Ue,C);vec4 E=texture(Uf,C);if(E.a==0.){discard;}vec4 F=texture(Ug,C);vec4 G=texture(Uh,C);vec4 H=texture(Ui,C);o_character=D;o_primaryColor=E;o_secondaryColor=F;o_rotation=G;o_transform=H;}`),this.ts=new N(this.gt,rt,"precision mediump float;uniform sampler2D U0;uniform vec2 U1;uniform sampler2D U3;uniform sampler2D U4;uniform sampler2D U5;uniform sampler2D U2;uniform sampler2D U6;uniform vec2 U7;uniform vec2 U8;mat2 A(float B){float C=sin(B);float D=cos(B);return mat2(D,-C,C,D);}void main(){vec2 E=gl_FragCoord.xy/U8;vec2 F=E*U7;vec2 G=floor(F);vec2 H=(G+0.5)/U7;vec4 I=texture2D(U3,H);vec4 J=texture2D(U4,H);vec4 K=texture2D(U5,H);bool L=K.r>0.5;bool M=K.g>0.5;bool N=K.b>0.5;vec4 O=texture2D(U2,H);int P=int(O.r*255.+0.5)+int(O.g*255.+0.5)*256;int Q=int(mod(float(P),U1.x));int R=P/int(U1.x);float S=(U1.y-1.)-float(R);vec2 T=vec2(float(Q),S)/U1;vec4 U=texture2D(U6,H);float V=U.r*255.+U.g;float W=-(V*360./255.)*0.017453292;vec2 X=fract(F)-0.5;if(M)X.x=-X.x;if(N)X.y=-X.y;X=A(W)*X+0.5;vec2 Y=1./U1;vec2 Z=T+X*Y;vec2 a=T+Y;if(any(lessThan(Z,T))||any(greaterThan(Z,a))){gl_FragColor=L?I:J;return;}vec4 b=texture2D(U0,Z);if(L)b.rgb=1.-b.rgb;gl_FragColor=mix(J,I,b);}"),this.ss=new N(this.gt,q,`#version 300 es
|
|
11
|
-
precision highp float;in vec2 v_uv;uniform sampler2D Uk;uniform bool Ul;uniform bool Um;uniform bool Un;uniform vec2 Uo;uniform bool Up;uniform vec4 Uq;uniform bool Ur;uniform vec4 Us;uniform vec4 Ut;uniform int Uu;uniform vec3 Uv[64];layout(location=0)out vec4 o_character;layout(location=1)out vec4 o_primaryColor;layout(location=2)out vec4 o_secondaryColor;layout(location=3)out vec4 o_rotation;layout(location=4)out vec4 o_transform;float A(vec3 B){return dot(B,vec3(0.299f,0.587f,0.114f));}void main(){vec2 C=vec2(v_uv.x,1.0f-v_uv.y);vec4 D=texture(Uk,C);float E=A(D.rgb);if(Uu>0){float F=float(Uu);float G=clamp(E*(F-1.0f),0.0f,F-1.0f);int H=int(floor(G+0.5f));vec3 I=Uv[H];o_character=vec4(I,1.0f);}else{o_character=vec4(E,0.0f,0.0f,1.0f);}vec4 J=Up?Uq:D;vec4 K=Ur?Us:D;if(D.a<0.01f){J=Ut;K=Ut;}else{}o_primaryColor=vec4(J);o_secondaryColor=vec4(K);o_rotation=vec4(Uo.xy,0.0f,1.0f);o_transform=vec4(float(Ul),float(Um),float(Un),1.0f);}`)}es(){return this.Qt}Pt(){return this.Jt}rs(){return this.ts}ns(){return this.ss}hs(t){return new N(this.gt,q,t)}cs(t,i){return new N(this.gt,t,i)}Dt(){this.Qt.Dt(),this.Jt.Dt(),this.ts.Dt(),this.ss.Dt()}}var w=(l=>(l.RECTANGLE="rectangle",l.LINE="line",l.ELLIPSE="ellipse",l.ARC="arc",l.TRIANGLE="triangle",l.BEZIER_CURVE="bezier_curve",l.CUSTOM="custom",l))(w||{});class At{constructor(t){c(this,"gt");c(this,"ls",new Map);this.gt=t}us(t,i,r,n){const o=this.gt;let h=this.ls.get(t);h||(h=new Map,this.ls.set(t,h));let a=h.get(i)||null;if(!a){a=o.createVertexArray(),h.set(i,a),o.bindVertexArray(a),o.bindBuffer(o.ARRAY_BUFFER,n);const u=o.getAttribLocation(t,"a_position");u!==-1&&(o.enableVertexAttribArray(u),o.vertexAttribPointer(u,r.ds.fs.size,o.FLOAT,!1,r._s,r.ds.fs.offset),o.vertexAttribDivisor(u,0));const f=o.getAttribLocation(t,"a_texCoord");f!==-1&&(o.enableVertexAttribArray(f),o.vertexAttribPointer(f,r.ds.ps.size,o.FLOAT,!1,r._s,r.ds.ps.offset),o.vertexAttribDivisor(f,0))}o.bindVertexArray(a)}vs(){this.gt.bindVertexArray(null)}Dt(){for(const[,t]of this.ls)for(const[,i]of t)i&&this.gt.deleteVertexArray(i)}}class pt{constructor(t,i){c(this,"gs");c(this,"gt");c(this,"xt");c(this,"As",null);c(this,"Cs",null);this.gt=t,this.gs=new At(t),this.xt=i}ws(t,i,r){const{shader:n}=t,o=V(this.gt)||this.gt.getParameter(this.gt.VIEWPORT);n.Wt({U9:o[2]/o[3],Uw:[o[2],o[3]]});const h=f=>{if(!f||!f.bs())return;const g=f.unitGeometry,d=f.unitBuffer;try{this.gs.us(n.Zt,f.type+"",g,d),f.batch.Ms(n),f.batch.Fs(g.zs,g.Rs)}finally{f.batch.Ts(n),this.gs.vs(),f.Ps()}};let a=null,u=null;for(const f of i){if(f.type===w.CUSTOM){u&&(h(u),a=null,u=null),this.Ss(t,f.params,f.state,r.get(w.RECTANGLE));continue}a!==null&&f.type!==a&&(h(u),a=null,u=null);let g=u;g&&f.type===a||(g=r.get(f.type)||null,u=g,a=f.type),g&&g.Es(f.params,f.state)}h(u)}Ss(t,i,r,n){const{x:o,y:h,width:a,height:u,shader:f,uniforms:g}=i,d=this.$s(Math.max(1,Math.floor(a)),Math.max(1,Math.floor(u)));d.begin(),this.Ds(n,f,g,0,0,d.width,d.height,{}),d.end();const p=this.ks(),y={Ue:d.textures[0],Uf:d.textures[1],Ug:d.textures[2],Uh:d.textures[3],Ui:d.textures[4],Uj:[d.width,d.height]};this.Ds(n,p,y,Math.floor(o),Math.floor(h),Math.max(1,Math.floor(a)),Math.max(1,Math.floor(u)),r),t.shader.Nt()}Ds(t,i,r,n,o,h,a,u){i.Nt(),i.Wt(r);const f=this.gt.getParameter(this.gt.VIEWPORT);if(i.Wt({U9:f[2]/f[3],Uw:[f[2],f[3]]}),t.Ps(),t.Es({x:n,y:o,width:h,height:a},u),t.bs()){const g=t.unitGeometry,d=t.unitBuffer;try{this.gs.us(i.Zt,t.type+"",g,d),t.batch.Ms(i),t.batch.Fs(g.zs,g.Rs)}finally{t.batch.Ts(i),this.gs.vs(),t.Ps()}}}ks(){return this.xt.es()}$s(t,i){return this.As&&this.Cs&&this.Cs.w===t&&this.Cs.h===i||(this.As&&this.As.Dt(),this.As=new j(this.gt,t,i,5),this.Cs={w:t,h:i}),this.As}Dt(){this.gs.Dt(),this.As&&this.As.Dt()}}class vt{constructor(){c(this,"Bs",[]);c(this,"Os",1);c(this,"Ls",0)}Gs(t){if(this.Ls>=this.Bs.length){const r={id:this.Os++,type:t,params:{},state:{I:1,N:0,X:0,W:0,Y:[0,0,0],V:[1,1,1,1],q:[0,0,0,1],K:!1,j:!1,k:!1,O:[0,0]}};this.Bs.push(r)}const i=this.Bs[this.Ls];return i.id=this.Os++,i.type=t,this.Ls++,i}Hs(t,i,r,n,o){const h=this.Gs(w.RECTANGLE);return h.params.x=t,h.params.y=i,h.params.width=r,h.params.height=n,o.J(h.state),h.id}Is(t,i,r,n,o,h,a){const u=this.Gs(w.CUSTOM);return u.params.x=t,u.params.y=i,u.params.width=r,u.params.height=n,u.params.shader=o,u.params.uniforms=h,a.J(u.state),u.id}Ns(t,i,r,n,o,h){const a=this.Gs(w.LINE);return a.params.x1=t,a.params.y1=i,a.params.x2=r,a.params.y2=n,a.params.thickness=o,h.J(a.state),a.id}Xs(t,i,r,n,o){const h=this.Gs(w.ELLIPSE);return h.params.x=t,h.params.y=i,h.params.width=r,h.params.height=n,o.J(h.state),h.id}Ws(t,i,r,n,o,h,a){const u=this.Gs(w.ARC);return u.params.x=t,u.params.y=i,u.params.width=r,u.params.height=n,u.params.start=o,u.params.stop=h,a.J(u.state),u.id}Ks(t,i,r,n,o,h,a){const u=this.Gs(w.TRIANGLE);return u.params.x1=t,u.params.y1=i,u.params.x2=r,u.params.y2=n,u.params.x3=o,u.params.y3=h,a.J(u.state),u.id}js(t,i,r,n,o,h,a,u,f,g){const d=this.Gs(w.BEZIER_CURVE);return d.params.x1=t,d.params.y1=i,d.params.cp1x=r,d.params.cp1y=n,d.params.cp2x=o,d.params.cp2y=h,d.params.x2=a,d.params.y2=u,d.params.thickness=f,g.J(d.state),d.id}get length(){return this.Ls}get isEmpty(){return this.Ls===0}Ys(){this.Ls=0}[Symbol.iterator](){let t=0;const i=this.Ls,r=this.Bs;return{next:()=>t<i?{value:r[t++],done:!1}:{value:void 0,done:!0}}}}const _=class _{static Vs(t,i,r=0){var h,a,u,f,g,d,p,y,A,m;const n=i||new Float32Array(_.FLOATS_PER_INSTANCE);let o=r;return n[o++]=t.fs[0],n[o++]=t.fs[1],n[o++]=t.Ls[0],n[o++]=t.Ls[1],n[o++]=t.Y[0],n[o++]=t.Y[1],n[o++]=t.Y[2],n[o++]=t.V[0],n[o++]=t.V[1],n[o++]=t.V[2],n[o++]=t.V[3],n[o++]=t.q[0],n[o++]=t.q[1],n[o++]=t.q[2],n[o++]=t.q[3],n[o++]=t.O[0],n[o++]=t.O[1],n[o++]=t.qs[0],n[o++]=t.qs[1],n[o++]=t.qs[2],n[o++]=t.N,n[o++]=t.X,n[o++]=t.W,n[o++]=t.Zs[0],n[o++]=t.Zs[1],n[o++]=((h=t.Qs)==null?void 0:h[0])||0,n[o++]=((a=t.Qs)==null?void 0:a[1])||0,n[o++]=((u=t.Js)==null?void 0:u[0])||0,n[o++]=((f=t.Js)==null?void 0:f[1])||0,n[o++]=((g=t.te)==null?void 0:g[0])||0,n[o++]=((d=t.te)==null?void 0:d[1])||0,n[o++]=((p=t.se)==null?void 0:p[0])||0,n[o++]=((y=t.se)==null?void 0:y[1])||0,n[o++]=((A=t.ee)==null?void 0:A[0])||0,n[o++]=((m=t.ee)==null?void 0:m[1])||0,n}static ie(t){const i=t.length*_.FLOATS_PER_INSTANCE,r=new Float32Array(i);for(let n=0;n<t.length;n++){const o=n*_.FLOATS_PER_INSTANCE;_.Vs(t[n],r,o)}return r}};c(_,"BYTES_PER_INSTANCE",140),c(_,"FLOATS_PER_INSTANCE",35);let D=_;const U=class U{};c(U,"STRIDE",D.BYTES_PER_INSTANCE),c(U,"ATTRIBUTES",{a_instancePosition:{location:-1,size:2,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:U.STRIDE,offset:0,divisor:1},a_instanceSize:{location:-1,size:2,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:U.STRIDE,offset:8,divisor:1},a_instanceCharacter:{location:-1,size:3,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:U.STRIDE,offset:16,divisor:1},a_instancePrimaryColor:{location:-1,size:4,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:U.STRIDE,offset:28,divisor:1},a_instanceSecondaryColor:{location:-1,size:4,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:U.STRIDE,offset:44,divisor:1},a_instanceRotation:{location:-1,size:2,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:U.STRIDE,offset:60,divisor:1},a_instanceTransform:{location:-1,size:3,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:U.STRIDE,offset:68,divisor:1},a_instanceGlobalRotation:{location:-1,size:3,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:U.STRIDE,offset:80,divisor:1},a_instanceRotationCenter:{location:-1,size:2,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:U.STRIDE,offset:92,divisor:1},a_instanceArcAngles:{location:-1,size:2,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:U.STRIDE,offset:100,divisor:1},a_instanceBezierCP1:{location:-1,size:2,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:U.STRIDE,offset:108,divisor:1},a_instanceBezierCP2:{location:-1,size:2,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:U.STRIDE,offset:116,divisor:1},a_instanceBezierStart:{location:-1,size:2,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:U.STRIDE,offset:124,divisor:1},a_instanceBezierEnd:{location:-1,size:2,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:U.STRIDE,offset:132,divisor:1}});let K=U;class yt{constructor(t,i=1e3,r=1.5){c(this,"gt");c(this,"re",[]);c(this,"ne");c(this,"oe");c(this,"he",null);c(this,"ae",!0);c(this,"ce",0);c(this,"le",new Map);c(this,"ue",null);this.gt=t,this.ne=i,this.oe=r,this.fe()}Es(t){const i=this.re.length;return this.re.push(t),this.ae=!0,i}get count(){return this.re.length}get isEmpty(){return this.re.length===0}clear(){this.re.length=0,this.ae=!0}de(t){if(t<=this.ne)return;const i=Math.ceil(t*this.oe);this.ne=i,this.fe()}fe(){const t=this.gt;this.he&&t.deleteBuffer(this.he),this.he=t.createBuffer();const i=this.ne*D.BYTES_PER_INSTANCE;t.bindBuffer(t.ARRAY_BUFFER,this.he),t.bufferData(t.ARRAY_BUFFER,i,t.DYNAMIC_DRAW),t.bindBuffer(t.ARRAY_BUFFER,null),this.ae=!0,this.ce=0}_e(){if(!this.ae||this.re.length===0)return;const t=this.gt,i=this.re.length;this.de(i),(!this.ue||this.ue.length<i*D.FLOATS_PER_INSTANCE)&&(this.ue=new Float32Array(i*D.FLOATS_PER_INSTANCE));const r=D.ie(this.re);t.bindBuffer(t.ARRAY_BUFFER,this.he),i<=this.ce?t.bufferSubData(t.ARRAY_BUFFER,0,r):t.bufferData(t.ARRAY_BUFFER,r,t.DYNAMIC_DRAW),t.bindBuffer(t.ARRAY_BUFFER,null),this.ae=!1,this.ce=i}pe(t){let i=this.le.get(t);if(!i){i=new Map;const r=this.gt;for(const n in K.ATTRIBUTES){const o=r.getAttribLocation(t,n);o!==-1&&i.set(n,o)}this.le.set(t,i)}return i}Ms(t){if(!this.he||this.re.length===0)return;const i=this.gt,r=t.Zt;this._e();const n=this.pe(r);i.bindBuffer(i.ARRAY_BUFFER,this.he);for(const[o,h]of n){const a=K.ATTRIBUTES[o];a&&(i.enableVertexAttribArray(h),i.vertexAttribPointer(h,a.size,a.type,a.normalized,a.stride,a.offset),i.vertexAttribDivisor(h,a.divisor))}}Ts(t){const i=this.gt,r=this.pe(t.Zt);for(const[,n]of r)i.disableVertexAttribArray(n),i.vertexAttribDivisor(n,0)}Fs(t,i){this.re.length!==0&&this.gt.drawArraysInstanced(t,0,i,this.re.length)}Dt(){this.he&&this.gt.deleteBuffer(this.he)}}class G{constructor(t,i,r,n){c(this,"gt");c(this,"ve");c(this,"me");c(this,"ge");c(this,"Ae",null);this.gt=t,this.ve=i,this.me=r,this.ge=n;const o=this.gt.createBuffer();if(!o)throw Error("Failed to create unit geometry buffer");this.gt.bindBuffer(this.gt.ARRAY_BUFFER,o),this.gt.bufferData(this.gt.ARRAY_BUFFER,this.ge.ye,this.gt.STATIC_DRAW),this.gt.bindBuffer(this.gt.ARRAY_BUFFER,null),this.Ae=o}get type(){return this.me}get unitGeometry(){return this.ge}get unitBuffer(){return this.Ae}get batch(){return this.ve}Ps(){this.ve.clear()}bs(){return!this.ve.isEmpty}Dt(){this.ve.Dt(),this.gt.deleteBuffer(this.Ae)}Ce(t,i,r,n,o){const h=this.we(t,i,r,n,o.N||0,o.X||0,o.W||0);return{fs:[t,i],Ls:[r,n],Y:o.Y||[0,0,0],V:o.V||[1,1,1,1],q:o.q||[0,0,0,1],O:o.O||[0,0],qs:[o.k?1:0,o.K?1:0,o.j?1:0],N:h.radiansX,X:h.radiansY,W:h.radiansZ,Zs:[h.centerX,h.centerY]}}be(t,i){const r=V(this.gt)||[0,0,this.gt.canvas.width,this.gt.canvas.height];return{nx:t/r[2]*2-1,ny:1-i/r[3]*2}}xe(t,i,r){const n=this.be(i,r);t.Zs=[n.nx,n.ny]}we(t,i,r,n,o,h,a){const u=V(this.gt)||[0,0,this.gt.canvas.width,this.gt.canvas.height],f=u[2],g=u[3];return{centerX:(t+r/2)/f*2-1,centerY:1-(i+n/2)/g*2,radiansX:-o*Math.PI/180,radiansY:-h*Math.PI/180,radiansZ:-a*Math.PI/180,aspectRatio:f/g}}}const Et={ye:new Float32Array([0,0,0,0,1,0,1,0,0,1,0,1,0,1,0,1,1,0,1,0,1,1,1,1]),Rs:6,zs:WebGL2RenderingContext.TRIANGLES,_s:16,ds:{fs:{size:2,offset:0},ps:{size:2,offset:8}}};class xt extends G{constructor(t,i){super(t,i,w.RECTANGLE,Et)}Es(t,i){const r=this.Ce(t.x,t.y,t.width,t.height,i);return this.ve.Es(r)}}const wt={ye:new Float32Array([0,-.5,0,0,1,-.5,1,0,0,.5,0,1,0,.5,0,1,1,-.5,1,0,1,.5,1,1]),Rs:6,zs:WebGL2RenderingContext.TRIANGLES,_s:16,ds:{fs:{size:2,offset:0},ps:{size:2,offset:8}}};class Tt extends G{constructor(t,i){super(t,i,w.LINE,wt)}Es(t,i){const r=t.x2-t.x1,n=t.y2-t.y1,o=Math.hypot(r,n),h=t.thickness||i.I||1,a=t.x1+r/2,u=t.y1+n/2,f=a-o/2,g=u,d=this.Ce(f,g,o,h,i);return this.xe(d,a,u),this.ve.Es(d)}}const Rt={ye:function(l=32){const t=[],i=2*Math.PI/l;for(let r=0;r<l;r++){const n=r*i,o=(r+1)%l*i,h=Math.cos(n),a=Math.sin(n),u=.5*(h+1),f=.5*(a+1),g=Math.cos(o),d=Math.sin(o),p=.5*(g+1),y=.5*(d+1);t.push(0,0,.5,.5,h,a,u,f,g,d,p,y)}return new Float32Array(t)}(32),Rs:96,zs:WebGL2RenderingContext.TRIANGLES,_s:16,ds:{fs:{size:2,offset:0},ps:{size:2,offset:8}}};class bt extends G{constructor(t,i){super(t,i,w.ELLIPSE,Rt)}Es(t,i){const r=this.Ce(t.x,t.y,t.width,t.height,i);return this.xe(r,t.x,t.y),this.ve.Es(r)}}let Ct={ye:function(l){const t=[];for(let i=0;i<l;i++){const r=i/l,n=(i+1)/l;t.push(r,0,r,0,r,1,r,1,n,1,n,1)}return new Float32Array(t)}(32),Rs:96,zs:WebGL2RenderingContext.TRIANGLES,_s:16,ds:{fs:{size:2,offset:0},ps:{size:2,offset:8}}};class Ut extends G{constructor(t,i){super(t,i,w.ARC,Ct)}Es(t,i){const r=t.x-t.width/2,n=t.y-t.height/2,o=t.start*Math.PI/180,h=t.stop*Math.PI/180,a=this.Ce(r,n,t.width,t.height,i);return this.xe(a,t.x,t.y),a.Qs=[o,h],this.ve.Es(a)}}const Ft={ye:new Float32Array([0,0,0,0,1,0,1,0,.5,1,.5,1]),Rs:3,zs:WebGL2RenderingContext.TRIANGLES,_s:16,ds:{fs:{size:2,offset:0},ps:{size:2,offset:8}}};class Bt extends G{constructor(t,i){super(t,i,w.TRIANGLE,Ft)}Es(t,i){const r=Math.min(t.x1,t.x2,t.x3),n=Math.max(t.x1,t.x2,t.x3),o=Math.min(t.y1,t.y2,t.y3),h=n-r,a=Math.max(t.y1,t.y2,t.y3)-o,u=this.Ce(r,o,h,a,i),f=r+.5*h,g=o+a*(1/3);return this.xe(u,f,g),this.ve.Es(u)}}function nt(l,t,i,r,n){const o=1-l,h=o*o,a=l*l;return h*o*t+3*h*l*i+3*o*a*r+a*l*n}const Pt={ye:function(l=16){const t=[];for(let i=0;i<l;i++){const r=i/l,n=(i+1)/l;t.push(r,-.5,r,0),t.push(n,-.5,n,0),t.push(r,.5,r,1),t.push(r,.5,r,1),t.push(n,-.5,n,0),t.push(n,.5,n,1)}return new Float32Array(t)}(16),Rs:96,zs:WebGL2RenderingContext.TRIANGLES,_s:16,ds:{fs:{size:2,offset:0},ps:{size:2,offset:8}}};class Lt extends G{constructor(t,i){super(t,i,w.BEZIER_CURVE,Pt)}Es(t,i){const r=i.I||1,n=nt(.5,t.x1,t.cp1x,t.cp2x,t.x2),o=nt(.5,t.y1,t.cp1y,t.cp2y,t.y2),h=this.Ce(0,0,1,r,i);return this.xe(h,n,o),h.se=[t.x1,t.y1],h.Js=[t.cp1x,t.cp1y],h.te=[t.cp2x,t.cp2y],h.ee=[t.x2,t.y2],this.ve.Es(h)}}class Ot{constructor(t){c(this,"gt");c(this,"Me",null);c(this,"Fe");c(this,"ze",null);c(this,"Re",{});c(this,"Te",null);c(this,"Pe",new Map);c(this,"Se");c(this,"Ee");c(this,"$e");c(this,"G",[]);this.gt=t,this.Fe=new mt(t),this.$e=new st,this.Se=new pt(t,this),this.Ee=new vt,this.Te=t.createBuffer(),k(this.gt,[0,0,this.gt.canvas.width,this.gt.canvas.height])}De(t){let i=this.Pe.get(t);if(i)return i;const r=new yt(this.gt);return i=(0,{[w.RECTANGLE]:()=>new xt(this.gt,r),[w.LINE]:()=>new Tt(this.gt,r),[w.ELLIPSE]:()=>new bt(this.gt,r),[w.ARC]:()=>new Ut(this.gt,r),[w.TRIANGLE]:()=>new Bt(this.gt,r),[w.BEZIER_CURVE]:()=>new Lt(this.gt,r)}[t])(),this.Pe.set(t,i),i}ke(t){this.Me!==t&&(this.Me=t,t.Nt())}cs(t,i){return this.Fe.cs(t,i)}es(){return this.Fe.es()}Pt(){return this.Fe.Pt()}rs(){return this.Fe.rs()}ns(){return this.Fe.ns()}Be(t){this.ze=t,t&&(this.Re={})}Kt(t,i){this.Re[t]=i}Oe(t){Object.assign(this.Re,t)}hs(t){return this.Fe.hs(t)}Le(t,i,r,n,o){const h=this.es(),a={Ue:t.textures[0],Uf:t.textures[1],Ug:t.textures[2],Uh:t.textures[3],Ui:t.textures[4],Uj:[t.width,t.height]};this.Ee.Is(i,r,n,o,h,a,this.$e)}Ge(t,i,r,n,o){const h=this.ns(),a=t.He(),u={Uk:a.texture,Ul:!!a.invert,Um:!!a.flipX,Un:!!a.flipY,Uo:a.charRotation,Up:a.charColorFixed,Uq:a.charColor,Ur:a.cellColorFixed,Us:a.cellColor,Ut:a.backgroundColor,Uu:a.charCount,Uv:a.charList};this.Ee.Is(i,r,n,o,h,u,this.$e)}Ie(t,i,r,n){var m;const o=this.gt,h=o.canvas.width,a=o.canvas.height,u=t/h*2-1,f=(t+r)/h*2-1,g=1-i/a*2,d=1-(i+n)/a*2,p=new Float32Array([u,d,f,d,u,g,f,d,f,g,u,g]);o.bindBuffer(o.ARRAY_BUFFER,this.Te),o.bufferData(o.ARRAY_BUFFER,p,o.DYNAMIC_DRAW);const y=((m=this.Me)==null?void 0:m.Zt)||o.getParameter(o.CURRENT_PROGRAM),A=y?o.getAttribLocation(y,"a_position"):-1;A!==-1&&(o.enableVertexAttribArray(A),o.vertexAttribPointer(A,2,o.FLOAT,!1,8,0)),o.drawArrays(o.TRIANGLES,0,6),A!==-1&&o.disableVertexAttribArray(A)}Ne(t,i,r,n){this.ze?(this.Ee.Is(t,i,r,n,this.ze,{...this.Re},this.$e),this.ze=null,this.Re={}):this.Ee.Hs(t,i,r,n,this.$e)}Xe(t,i,r,n){this.Ee.Ns(t,i,r,n,this.$e.lineWeight,this.$e)}We(t,i,r,n){this.Ee.Xs(t,i,r,n,this.$e)}Ke(t,i,r,n,o,h){this.Ee.Ks(t,i,r,n,o,h,this.$e)}je(t,i,r,n,o,h,a,u){const f=this.$e.lineWeight;this.Ee.js(t,i,r,n,o,h,a,u,f,this.$e)}Ye(t,i,r=1,n={}){return new j(this.gt,t,i,r,n,this,!0)}Ve(t,i,r,n,o,h){this.Ee.Ws(t,i,r,n,o,h,this.$e)}qe(t,i=t,r=t,n=255){this.$e.ft(t,i,r,n),this.Ys(t/255,i/255,r/255,n/255)}Ys(t=0,i=0,r=0,n=0){this.gt.clearColor(t,i,r,n),this.gt.clear(this.gt.COLOR_BUFFER_BIT)}Ze(){this.gt.viewport(0,0,this.gt.canvas.width,this.gt.canvas.height),k(this.gt,[0,0,this.gt.canvas.width,this.gt.canvas.height])}get context(){return this.gt}get state(){return this.$e}Et(t){this.G.push(this.$e),this.$e=t}$t(){const t=this.G.pop();t&&(this.$e=t)}St(t){const i=t,r=V(this.gt)??this.gt.getParameter(this.gt.VIEWPORT),n={shader:i,gl:this.gt,viewport:r};this.ke(i);const o=new Set;for(const h of this.Ee)h.type===w.CUSTOM?o.add(w.RECTANGLE):o.add(h.type);for(const h of o)h!==w.CUSTOM&&this.De(h);this.Se.ws(n,this.Ee,this.Pe),this.Ee.Ys()}Dt(){this.gt.deleteBuffer(this.Te),this.Ee.Ys();for(const t of this.Pe.values())t.Dt();this.Fe.Dt(),this.Se.Dt()}}const C={readShort:(l,t)=>(C.t.uint16[0]=l[t]<<8|l[t+1],C.t.int16[0]),readUshort:(l,t)=>l[t]<<8|l[t+1],readUshorts(l,t,i){const r=[];for(let n=0;n<i;n++)r.push(C.readUshort(l,t+2*n));return r},readUint(l,t){const i=C.t.uint8;return i[3]=l[t],i[2]=l[t+1],i[1]=l[t+2],i[0]=l[t+3],C.t.uint32[0]},readASCII(l,t,i){let r="";for(let n=0;n<i;n++)r+=String.fromCharCode(l[t+n]);return r},writeUshort(l,t,i){l[t]=i>>>8&255,l[t+1]=255&i},writeUint(l,t,i){l[t]=i>>>24&255,l[t+1]=i>>>16&255,l[t+2]=i>>>8&255,l[t+3]=255&i},writeASCII(l,t,i){for(let r=0;r<i.length;r++)l[t+r]=255&i.charCodeAt(r)},t:(()=>{const l=new ArrayBuffer(8);return{uint8:new Uint8Array(l),int16:new Int16Array(l),uint16:new Uint16Array(l),uint32:new Uint32Array(l)}})()};function Z(l){return l+3&-4}function $(l,t,i){const r=t+i;let n=0;const o=C.t;for(let h=t;h<r;h+=4)o.uint8[3]=l[h]||0,o.uint8[2]=l[h+1]||0,o.uint8[1]=l[h+2]||0,o.uint8[0]=l[h+3]||0,n=n+(o.uint32[0]>>>0)>>>0;return n>>>0}class Mt{constructor(t){c(this,"b");c(this,"p",0);c(this,"bitbuf",0);c(this,"bitcnt",0);this.b=t}readBits(t){for(;this.bitcnt<t;){const r=this.b[this.p++]||0;this.bitbuf|=r<<this.bitcnt,this.bitcnt+=8}const i=this.bitbuf&(1<<t)-1;return this.bitbuf>>>=t,this.bitcnt-=t,i}alignToByte(){this.bitbuf=0,this.bitcnt=0}get offset(){return this.p}}function W(l){let t=32,i=0;for(const a of l)a&&(a<t&&(t=a),a>i&&(i=a));if(i===0)return{min:0,max:0,table:new Map};const r=new Uint32Array(i+1);for(const a of l)a&&r[a]++;const n=new Uint32Array(i+1);let o=0;r[0]=0;for(let a=1;a<=i;a++)o=o+r[a-1]<<1,n[a]=o;const h=new Map;for(let a=0;a<l.length;a++){const u=l[a];if(!u)continue;const f=n[u]++;let g=h.get(u);g||(g=[],h.set(u,g)),g[_t(f,u)]=a}return{min:t,max:i,table:h}}function tt(l,t){let i=0;for(let r=1;r<=t.max;r++){i|=l.readBits(1)<<r-1;const n=t.table.get(r);if(n&&i<n.length){const o=n[i];if(o!==void 0)return o}}throw Error("Invalid Huffman code")}function _t(l,t){let i=0;for(let r=0;r<t;r++)i=i<<1|1&l,l>>>=1;return i>>>0}function St(l){if(l.length<2)throw Error("ZLIB data too short");const t=l[0],i=l[1];if((15&t)!=8)throw Error("Unsupported ZLIB compression method");if(((t<<8)+i)%31!=0)throw Error("Bad ZLIB header check");let r=2;32&i&&(r+=4);const n=[];return function(o,h){const a=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258],u=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],f=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577],g=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13];let d=0;for(;!d;){d=o.readBits(1);const p=o.readBits(2);if(p===0){o.alignToByte();const y=o.readBits(16);if((65535&(65535^y))!==o.readBits(16))throw Error("DEFLATE uncompressed LEN/NLEN mismatch");for(let A=0;A<y;A++)h.push(o.readBits(8))}else{if(p!==1&&p!==2)throw Error("Unsupported DEFLATE type");{let y,A;if(p===1){const m=Array(288).fill(0);for(let E=0;E<=143;E++)m[E]=8;for(let E=144;E<=255;E++)m[E]=9;for(let E=256;E<=279;E++)m[E]=7;for(let E=280;E<=287;E++)m[E]=8;y=W(m),A=W(Array(32).fill(5))}else{const m=o.readBits(5)+257,E=o.readBits(5)+1,v=o.readBits(4)+4,T=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],x=Array(19).fill(0);for(let L=0;L<v;L++)x[T[L]]=o.readBits(3);const P=W(x),F=[];for(;F.length<m+E;){const L=tt(o,P);if(L<=15)F.push(L);else if(L===16){const H=o.readBits(2)+3,z=F[F.length-1]||0;for(let gt=0;gt<H;gt++)F.push(z)}else if(L===17){const H=o.readBits(3)+3;for(let z=0;z<H;z++)F.push(0)}else{if(L!==18)throw Error("Invalid code length symbol");{const H=o.readBits(7)+11;for(let z=0;z<H;z++)F.push(0)}}}const B=F.slice(0,m),O=F.slice(m,m+E);y=W(B),A=W(O)}for(;;){const m=tt(o,y);if(m<256)h.push(m);else{if(m===256)break;if(m>256&&m<286){const E=m-257;let v=a[E];const T=u[E];T&&(v+=o.readBits(T));const x=tt(o,A);if(x>=30)throw Error("Invalid distance symbol");let P=f[x];const F=g[x];F&&(P+=o.readBits(F));const B=h.length-P;if(B<0)throw Error("Invalid distance");for(let O=0;O<v;O++)h.push(h[B+O]||0)}else if(m===286||m===287)throw Error("Reserved length symbol")}}}}}}(new Mt(l.subarray(r)),n),new Uint8Array(n)}function Dt(l){const t=C,i=new Uint8Array(l);if(t.readASCII(i,0,4)!=="wOFF")throw Error("Invalid WOFF signature");const r=t.readUint(i,4),n=t.readUshort(i,12),o=t.readUint(i,16),h=[];let a=44;for(let v=0;v<n;v++){const T=t.readASCII(i,a,4),x=t.readUint(i,a+4),P=t.readUint(i,a+8),F=t.readUint(i,a+12),B=t.readUint(i,a+16);h.push({tag:T,offset:x,compLength:P,origLength:F,checksum:B}),a+=20}for(const v of h){const T=new Uint8Array(i.buffer,v.offset,v.compLength);if(v.compLength===v.origLength)v.data=new Uint8Array(T);else if(v.data=St(T),v.data.length!==v.origLength)if(v.data.length<v.origLength){const x=new Uint8Array(v.origLength);x.set(v.data),v.data=x}else v.data=v.data.subarray(0,v.origLength)}const u=n;let f=1,g=0;for(;f<<1<=u;)f<<=1,g++;const d=16*f,p=16*u-d;let y=12+16*u;const A={};for(const v of h)A[v.tag]=y,y=Z(y+v.data.length);const m=new Uint8Array(Math.max(o||0,y));t.writeUint(m,0,r),t.writeUshort(m,4,u),t.writeUshort(m,6,d),t.writeUshort(m,8,g),t.writeUshort(m,10,p);let E=12;for(const v of h){t.writeASCII(m,E,v.tag),E+=4;let T=v.data;if(v.tag==="head"&&T.length>=12){const x=new Uint8Array(T);t.writeUint(x,8,0);const P=$(x,0,Z(x.length));t.writeUint(m,E,P),E+=4}else{const x=$(T,0,Z(T.length));t.writeUint(m,E,x),E+=4}t.writeUint(m,E,A[v.tag]),E+=4,t.writeUint(m,E,v.data.length),E+=4}for(const v of h){const T=A[v.tag];m.set(v.data,T)}if(h.find(v=>v.tag==="head")){const v=A.head,T=function(x,P){const F=C,B=P+8,O=[x[B],x[B+1],x[B+2],x[B+3]];F.writeUint(x,B,0);const L=2981146554-($(x,0,Z(x.length))>>>0)>>>0;return x[B]=O[0],x[B+1]=O[1],x[B+2]=O[2],x[B+3]=O[3],L>>>0}(m,v);t.writeUint(m,v+8,T)}return m.buffer}const It={parseTab(l,t,i){const r={tables:[],ids:{},off:t};l=new Uint8Array(l.buffer,t,i),t=0;const n=C,o=n.readUshort,h=o(l,t+=2);t+=2;const a=[];for(let u=0;u<h;u++){const f=o(l,t),g=o(l,t+=2);t+=2;const d=n.readUint(l,t);t+=4;const p=`p${f}e${g}`;let y=a.indexOf(d);if(y===-1){let A;y=r.tables.length,a.push(d);const m=o(l,d);A=m===4?this.parse4(l,d):m===12?this.parse12(l,d):{format:m},r.tables.push(A)}r.ids[p]=y}return r},parse4(l,t){const i=C,r=i.readUshort,n=i.readUshorts,o=t,h=r(l,t+=2);t+=2;const a=r(l,t+=2)>>>1,u={format:4,searchRange:r(l,t+=2),entrySelector:0,rangeShift:0,endCount:[],startCount:[],idDelta:[],idRangeOffset:[],glyphIdArray:[]};t+=2,u.entrySelector=r(l,t),t+=2,u.rangeShift=r(l,t),t+=2,u.endCount=n(l,t,a),t+=2*a,t+=2,u.startCount=n(l,t,a),t+=2*a;for(let f=0;f<a;f++)u.idDelta.push(i.readShort(l,t)),t+=2;return u.idRangeOffset=n(l,t,a),t+=2*a,u.glyphIdArray=n(l,t,o+h-t>>1),u},parse12(l,t){const i=C.readUint;i(l,t+=4),i(l,t+=4);const r=i(l,t+=4);t+=4;const n=new Uint32Array(3*r);for(let o=0;o<3*r;o+=3)n[o]=i(l,t+(o<<2)),n[o+1]=i(l,t+(o<<2)+4),n[o+2]=i(l,t+(o<<2)+8);return{format:12,groups:n}}},zt={parseTab(l,t,i){const r=C;t+=18;const n=r.readUshort(l,t);t+=2,t+=16;const o=r.readShort(l,t);t+=2;const h=r.readShort(l,t);t+=2;const a=r.readShort(l,t);t+=2;const u=r.readShort(l,t);return t+=2,t+=6,{unitsPerEm:n,xMin:o,yMin:h,xMax:a,yMax:u,indexToLocFormat:r.readShort(l,t)}}},Nt={parseTab(l,t,i){const r=C;t+=4;const n=["ascender","descender","lineGap","advanceWidthMax","minLeftSideBearing","minRightSideBearing","xMaxExtent","caretSlopeRise","caretSlopeRun","caretOffset","res0","res1","res2","res3","metricDataFormat","numberOfHMetrics"],o={};for(let h=0;h<n.length;h++){const a=n[h],u=a==="advanceWidthMax"||a==="numberOfHMetrics"?r.readUshort:r.readShort;o[a]=u(l,t+2*h)}return o}},Gt={parseTab(l,t,i,r){const n=C,o=[],h=[],a=r.maxp.numGlyphs,u=r.hhea.numberOfHMetrics;let f=0,g=0,d=0;for(;d<u;)f=n.readUshort(l,t+(d<<2)),g=n.readShort(l,t+(d<<2)+2),o.push(f),h.push(g),d++;for(;d<a;)o.push(f),h.push(g),d++;return{aWidth:o,lsBearing:h}}},ot={cmap:It,head:zt,hhea:Nt,maxp:{parseTab(l,t,i){const r=C;return r.readUint(l,t),t+=4,{numGlyphs:r.readUshort(l,t)}}},hmtx:Gt,loca:{parseTab(l,t,i,r){const n=C,o=[],h=r.head.indexToLocFormat,a=r.maxp.numGlyphs+1;if(h===0)for(let u=0;u<a;u++)o.push(n.readUshort(l,t+(u<<1))<<1);else if(h===1)for(let u=0;u<a;u++)o.push(n.readUint(l,t+(u<<2)));return o}},glyf:{parseTab(l,t,i,r){const n=[],o=r.maxp.numGlyphs;for(let h=0;h<o;h++)n.push(null);return n},Qe(l,t){const i=C,r=l.Je,n=l.loca;if(n[t]===n[t+1])return null;const o=M.findTable(r,"glyf",l.ti);if(!o)return null;let h=o[0]+n[t];const a={};if(a.noc=i.readShort(r,h),h+=2,a.xMin=i.readShort(r,h),h+=2,a.yMin=i.readShort(r,h),h+=2,a.xMax=i.readShort(r,h),h+=2,a.yMax=i.readShort(r,h),h+=2,a.xMin>=a.xMax||a.yMin>=a.yMax)return null;if(a.noc>0){a.endPts=[];for(let p=0;p<a.noc;p++)a.endPts.push(i.readUshort(r,h)),h+=2;const u=i.readUshort(r,h);if(h+=2,r.length-h<u)return null;h+=u;const f=a.endPts[a.noc-1]+1;a.flags=[];for(let p=0;p<f;p++){const y=r[h];if(h++,a.flags.push(y),8&y){const A=r[h];h++;for(let m=0;m<A;m++)a.flags.push(y),p++}}a.xs=[];for(let p=0;p<f;p++){const y=a.flags[p],A=!!(16&y);2&y?(a.xs.push(A?r[h]:-r[h]),h++):A?a.xs.push(0):(a.xs.push(i.readShort(r,h)),h+=2)}a.ys=[];for(let p=0;p<f;p++){const y=a.flags[p],A=!!(32&y);4&y?(a.ys.push(A?r[h]:-r[h]),h++):A?a.ys.push(0):(a.ys.push(i.readShort(r,h)),h+=2)}let g=0,d=0;for(let p=0;p<f;p++)g+=a.xs[p],d+=a.ys[p],a.xs[p]=g,a.ys[p]=d}else a.parts=[],a.endPts=[],a.flags=[],a.xs=[],a.ys=[];return a}}},M={parse(l){const t=new Uint8Array(l),i=C.readASCII(t,0,4);if(i==="wOFF")l=Dt(l);else if(i==="wOF2")throw Error("WOFF2 is not supported in this build (Brotli + WOFF2 transforms required)");return[((r,n,o,h)=>{const a=ot,u={Je:r,si:n,ti:o};for(const f in a){const g=f,d=M.findTable(r,g,o);if(d){const[p,y]=d;let A=h[p];A==null&&(A=a[g].parseTab(r,p,y,u),h[p]=A),u[g]=A}}return u})(new Uint8Array(l),0,0,{})]},findTable(l,t,i){const r=C,n=r.readUshort(l,i+4);let o=i+12;for(let h=0;h<n;h++){const a=r.readASCII(l,o,4);r.readUint(l,o+4);const u=r.readUint(l,o+8),f=r.readUint(l,o+12);if(a===t)return[u,f];o+=16}return null},T:ot,B:C};class Yt{ei(t){var r;const i=[];return(r=t.cmap)!=null&&r.tables?(t.cmap.tables.forEach(n=>{if(n.format===4){const o=this.ii(n);i.push(...o)}else if(n.format===12){const o=this.ri(n);i.push(...o)}}),[...new Set(i)]):[]}ni(t){return t.filter(i=>this.oi(i))}ii(t){const i=[];if(!(t.startCount&&t.endCount&&t.idRangeOffset&&t.idDelta))return i;for(let r=0;r<t.startCount.length;r++){const n=t.startCount[r],o=t.endCount[r];if(n!==65535||o!==65535){for(let h=n;h<=o;h++)if(this.hi(t,h,r)>0)try{const a=String.fromCodePoint(h);i.push(a)}catch{}}}return i}ri(t){const i=[];if(!t.groups)return i;for(let r=0;r<t.groups.length;r+=3){const n=t.groups[r],o=t.groups[r+1],h=t.groups[r+2];for(let a=n;a<=o;a++)if(h+(a-n)>0)try{const u=String.fromCodePoint(a);i.push(u)}catch{}}return i}hi(t,i,r){if(t.idRangeOffset[r]===0)return i+t.idDelta[r]&65535;{const n=t.idRangeOffset[r]/2+(i-t.startCount[r])-(t.startCount.length-r);if(n>=0&&t.glyphIdArray&&n<t.glyphIdArray.length){const o=t.glyphIdArray[n];if(o!==0)return o+t.idDelta[r]&65535}}return 0}oi(t){const i=t.codePointAt(0)||0;return!(i>=0&&i<=31&&i!==9&&i!==10&&i!==13||i>=127&&i<=159)}}class et{constructor(){c(this,"ai",new Map);c(this,"ci",new Map)}li(t,i){const r=`${this.ui(t)}_${i}`;if(this.ai.has(r))return this.ai.get(r);const n=t.cmap;if(!n||!n.tables)return this.ai.set(r,0),0;let o=0;for(const h of n.tables)if(h.format===4?o=this.fi(i,h):h.format===12&&(o=this.di(i,h)),o>0)break;return this.ai.set(r,o),o}_i(t,i){const r=i.codePointAt(0);return r===void 0?0:this.li(t,r)}pi(t,i){const r=t.hmtx;return r&&r.aWidth&&r.aWidth.length!==0?i<r.aWidth.length?r.aWidth[i]:r.aWidth[r.aWidth.length-1]:0}mi(t,i){const r=i/t.head.unitsPerEm,n=t.hhea.ascender*r,o=t.hhea.descender*r,h=t.hhea.lineGap*r;return{ascender:n,descender:o,lineGap:h,lineHeight:n-o+h,unitsPerEm:t.head.unitsPerEm,scale:r}}gi(){this.ai.clear(),this.ci.clear()}ui(t){return`${t.ti}_${t.Je.length}`}fi(t,i){const r=i.endCount.length;let n=-1;for(let o=0;o<r;o++)if(t<=i.endCount[o]){n=o;break}if(n===-1||t<i.startCount[n])return 0;if(i.idRangeOffset[n]===0)return t+i.idDelta[n]&65535;{const o=i.idRangeOffset[n]/2+(t-i.startCount[n])-(r-n);if(o>=0&&o<i.glyphIdArray.length){const h=i.glyphIdArray[o];return h===0?0:h+i.idDelta[n]&65535}}return 0}di(t,i){const r=i.groups.length/3;for(let n=0;n<r;n++){const o=i.groups[3*n],h=i.groups[3*n+1],a=i.groups[3*n+2];if(t>=o&&t<=h)return a+(t-o)}return 0}}class Xt{constructor(t){c(this,"Ai");c(this,"yi");c(this,"xt");c(this,"Ci");this.xt=t,this.Ci=new et,this.Ai=document.createElement("canvas"),this.yi=this.Ai.getContext("2d",{willReadFrequently:!0,alpha:!0})}createTextureAtlas(t,i,r,n){const o=t.length,h=Math.ceil(Math.sqrt(o)),a=Math.ceil(o/h),u=i.width*h,f=i.height*a,g=typeof n=="object"?n:null;this.wi(u,f),this.bi(t,i,h,r,g);const d=this.xt.Ye(u,f,1,{filter:"nearest"});return d.Tt(this.Ai),{framebuffer:d,columns:h,rows:a}}wi(t,i){this.Ai.width=t,this.Ai.height=i,this.Ai.style.width=t+"px",this.Ai.style.height=i+"px",this.yi.imageSmoothingEnabled=!1,this.Ai.style.imageRendering="pixelated",this.yi.clearRect(0,0,t,i),this.yi.textBaseline="top",this.yi.textAlign="left",this.yi.fillStyle="white"}bi(t,i,r,n,o){const h=n/o.head.unitsPerEm;for(let a=0;a<t.length;a++){const u=a%r,f=Math.floor(a/r),g=t[a].character,d=this.xi(o,g);if(!d)continue;const p=g.codePointAt(0)||0,y=this.Ci.li(o,p),A=this.Mi(o,y)*h,m=u*i.width,E=f*i.height,v=m+.5*i.width,T=E+.5*i.height,x=Math.round(v-.5*i.width),P=Math.round(T-.5*n),F=x+.5*(i.width-A),B=P+o.hhea.ascender*h;this.Fi(d,F,B,h)}}xi(t,i){const r=i.codePointAt(0)||0,n=this.Ci.li(t,r);if(n===0)return null;if(t.glyf&&t.glyf[n]!==null)return t.glyf[n];if(M&&M.T&&M.T.glyf){const o=M.T.glyf.Qe(t,n);return t.glyf&&o&&(t.glyf[n]=o),o}return null}Mi(t,i){const r=t.hmtx;return r&&r.aWidth?i<r.aWidth.length?r.aWidth[i]:r.aWidth[r.aWidth.length-1]:0}Fi(t,i,r,n){if(!t||!t.xs||t.noc===0)return;const{xs:o,ys:h,endPts:a,flags:u}=t;if(!(o&&h&&a&&u))return;this.yi.beginPath();let f=0;for(let g=0;g<a.length;g++){const d=a[g];if(!(d<f)){if(d>=f){const p=i+o[f]*n,y=r-h[f]*n;this.yi.moveTo(p,y);let A=f+1;for(;A<=d;)if(1&u[A]){const m=i+o[A]*n,E=r-h[A]*n;this.yi.lineTo(m,E),A++}else{const m=i+o[A]*n,E=r-h[A]*n;let v=A+1>d?f:A+1;if(1&u[v]){const T=i+o[v]*n,x=r-h[v]*n;this.yi.quadraticCurveTo(m,E,T,x),A=v+1}else{const T=(m+(i+o[v]*n))/2,x=(E+(r-h[v]*n))/2;this.yi.quadraticCurveTo(m,E,T,x),A=v}}this.yi.closePath()}f=d+1}}this.yi.fill()}}class Wt{constructor(){c(this,"zi");this.zi=new et}Ri(t,i,r){let n=0;const o=this.zi.mi(r,i),h=o.lineHeight;for(const a of t){const u=this.zi._i(r,a);if(u===0)continue;const f=this.zi.pi(r,u)*o.scale;n=Math.max(n,f)}return{width:Math.ceil(n),height:Math.ceil(h)}}gi(){this.zi.gi()}}class Ht{constructor(){c(this,"Ci");this.Ci=new et}createCharacterObjects(t,i){return t.map((r,n)=>{const o=r.codePointAt(0)||0,h=this.Ti(n);let a=0;if(i.hmtx&&i.hmtx.aWidth){const u=this.Ci.li(i,o);u>0&&i.hmtx.aWidth[u]!==void 0&&(a=i.hmtx.aWidth[u])}return{character:r,unicode:o,color:h,advanceWidth:a}})}Ti(t){return[t%256/255,Math.floor(t/256)%256/255,Math.floor(t/65536)%256/255]}Pi(t,i){if(!X.m(typeof t=="string","Character must be a string.",{method:"getCharacterColor",providedValue:t}))return[0,0,0];const r=i.find(n=>n.character===t);return r?r.color:[0,0,0]}Si(t,i){return X.m(typeof t=="string"&&t.length>0,"Characters must be a string with at least one character.",{method:"getCharacterColors",providedValue:t})?Array.from(t).map(r=>this.Pi(r,i)||[0,0,0]):[[0,0,0]]}}class ht{constructor(t,i=16){c(this,"Ei");c(this,"$i",[]);c(this,"Di");c(this,"ki",16);c(this,"Bi",0);c(this,"Oi",0);c(this,"Li",{width:0,height:0});c(this,"Gi");c(this,"Hi");c(this,"Ii");c(this,"Ni");c(this,"Xi");this.ki=i,this.Hi=new Yt,this.Ii=new Xt(t),this.Ni=new Wt,this.Xi=new Ht}async Wi(t){let i;if(t){const r=await fetch(t);if(!r.ok)throw new R(`Failed to load font file: ${r.status} ${r.statusText}`);i=await r.arrayBuffer()}else i=await(await fetch("data:font/woff;base64,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")).arrayBuffer();await this.Ki(i),this.Ei=M.parse(i)[0],await this.ji()}Yi(t){if(t===void 0)return this.ki;this.ki=t,this.Li=this.Ni.Ri(this.$i.map(r=>r.character),this.ki,this.Ei);const i=this.Ii.createTextureAtlas(this.$i,this.Li,this.ki,this.Ei);this.Di=i.framebuffer,this.Bi=i.columns,this.Oi=i.rows}async Vi(t){try{const i=await fetch(t);if(!i.ok)throw new R(`Failed to load font file: ${i.status} ${i.statusText}`);const r=await i.arrayBuffer();await this.Ki(r);const n=M.parse(r);if(!n||n.length===0)throw Error("Failed to parse font file");this.Ei=n[0],await this.ji()}catch(i){throw new R("Failed to load font: "+(i instanceof Error?i.message:"Unknown error"),i)}}async Ki(t){const i=Date.now();this.Gi=new FontFace("CustomFont_"+i,t),await this.Gi.load(),document.fonts.add(this.Gi)}async ji(){const t=this.Hi.ei(this.Ei),i=this.Hi.ni(t);this.$i=this.Xi.createCharacterObjects(i,this.Ei),this.Li=this.Ni.Ri(i,this.ki,this.Ei);const r=this.Ii.createTextureAtlas(this.$i,this.Li,this.ki,this.Ei);this.Di=r.framebuffer,this.Bi=r.columns,this.Oi=r.rows}Pi(t){return this.Xi.Pi(t,this.$i)}Si(t){return this.Xi.Si(t,this.$i)}Dt(){this.Di.Dt(),document.fonts.delete(this.Gi)}get fontFramebuffer(){return this.Di}get characters(){return this.$i}get textureColumns(){return this.Bi}get textureRows(){return this.Oi}get maxGlyphDimensions(){return this.Li}get fontSize(){return this.ki}get font(){return this.Ei}}class at{constructor(t,i,r){c(this,"qi");c(this,"Zi");c(this,"dt");c(this,"_t");c(this,"Qi");c(this,"Ji");c(this,"tr");c(this,"sr");c(this,"er");this.tr=t,this.sr=i,this.er=r,this.ir()}ir(){this.qi=Math.floor(this.tr.width/this.sr),this.Zi=Math.floor(this.tr.height/this.er),this.dt=this.qi*this.sr,this._t=this.Zi*this.er,this.Qi=Math.floor((this.tr.width-this.dt)/2),this.Ji=Math.floor((this.tr.height-this._t)/2)}rr(t,i){this.sr=t,this.er=i,this.ir()}get cellWidth(){return this.sr}get cellHeight(){return this.er}get cols(){return this.qi}get rows(){return this.Zi}get width(){return this.dt}get height(){return this._t}get offsetX(){return this.Qi}get offsetY(){return this.Ji}}class ct{constructor(t={}){c(this,"tr");c(this,"nr",null);c(this,"hr",!1);c(this,"ar");c(this,"cr");this.hr=t.overlay??!1,this.hr&&t.canvas?(this.nr=t.canvas,this.tr=this.lr(),this.cr=!0,this.ur()):t.canvas?(this.tr=t.canvas,this.cr=!1):(this.tr=this.dr(t.width,t.height),this.cr=!0),this.tr.style.imageRendering="pixelated"}dr(t,i){const r=document.createElement("canvas");return r.className="textmodeCanvas",r.style.imageRendering="pixelated",r.width=t||800,r.height=i||600,document.body.appendChild(r),r}lr(){const t=document.createElement("canvas");t.className="textmodeCanvas",t.style.imageRendering="pixelated";const i=this.nr.getBoundingClientRect();let r=Math.round(i.width),n=Math.round(i.height);if(this.nr instanceof HTMLVideoElement){const a=this.nr;(r===0||n===0)&&a.videoWidth>0&&a.videoHeight>0&&(r=a.videoWidth,n=a.videoHeight)}t.width=r,t.height=n,t.style.position="absolute",t.style.pointerEvents="none";const o=window.getComputedStyle(this.nr);let h=parseInt(o.zIndex||"0",10);return isNaN(h)&&(h=0),t.style.zIndex=""+(h+1),t}ur(){var t;this._r(),(t=this.nr.parentNode)==null||t.insertBefore(this.tr,this.nr.nextSibling),window.ResizeObserver&&(this.ar=new ResizeObserver(()=>{this.pr()}),this.ar.observe(this.nr)),window.addEventListener("resize",()=>{this.pr()})}_r(){if(!this.nr)return;const t=this.nr.getBoundingClientRect();let i=this.nr.offsetParent;if(i&&i!==document.body){const r=i.getBoundingClientRect();this.tr.style.top=t.top-r.top+"px",this.tr.style.left=t.left-r.left+"px"}else this.tr.style.top=t.top+window.scrollY+"px",this.tr.style.left=t.left+window.scrollX+"px"}pr(t,i){if(this.hr){const r=this.nr.getBoundingClientRect();let n=Math.round(r.width),o=Math.round(r.height);if(this.nr instanceof HTMLVideoElement){const h=this.nr;(n===0||o===0)&&h.videoWidth>0&&h.videoHeight>0&&(n=h.videoWidth,o=h.videoHeight)}this.tr.width=n,this.tr.height=o,this._r()}else this.tr.width=t??this.tr.width,this.tr.height=i??this.tr.height}vr(){const t=this.tr.getContext("webgl2",{alpha:!0,premultipliedAlpha:!1,preserveDrawingBuffer:!0,antialias:!1,depth:!1,stencil:!1,powerPreference:"high-performance"});if(!t)throw new R("`textmode.js` requires WebGL2 support.");return t}Dt(){this.ar&&this.ar.disconnect();const t=this.tr.getContext("webgl")||this.tr.getContext("webgl2");if(t){const i=t.getExtension("WEBGL_lose_context");i&&i.loseContext()}this.cr&&this.tr.parentNode&&this.tr.parentNode.removeChild(this.tr)}get canvas(){return this.tr}get targetCanvas(){return this.nr}get width(){return this.tr.width}get height(){return this.tr.height}}class Y{constructor(t,i,r,n){c(this,"mr");c(this,"dt");c(this,"_t");c(this,"gt");c(this,"k",0);c(this,"K",0);c(this,"j",0);c(this,"O",[0,0]);c(this,"gr","sampled");c(this,"Ar","fixed");c(this,"V",[1,1,1,1]);c(this,"q",[0,0,0,1]);c(this,"yr",[0,0,0,1]);c(this,"Cr",[[.1,0,0]]);c(this,"wr");this.gt=t,this.mr=i,this.dt=r,this._t=n}Dt(){this.gt.deleteTexture(this.mr)}br(t){return typeof t=="boolean"?t?1:0:(t==null?0:Number(t))>0?1:0}invert(t=!0){return this.k=this.br(t),this}flipX(t=!0){return this.K=this.br(t),this}flipY(t=!0){return this.j=this.br(t),this}charRotation(t){const i=255*t/360,r=Math.floor(i)/255,n=Math.round(i-Math.floor(i));return this.O=[r,n],this}He(){return{texture:this.mr,invert:this.k,flipX:this.K,flipY:this.j,charRotation:this.O,charColorFixed:this.gr==="fixed",charColor:this.V,cellColorFixed:this.Ar==="fixed",cellColor:this.q,backgroundColor:this.yr,charCount:this.Cr.length,charList:this.Cr}}charColorMode(t){return this.gr=t,this}cellColorMode(t){return this.Ar=t,this}charColor(t,i,r,n){return this.V=[(t??0)/255,(i??t??0)/255,(r??t??0)/255,(n??255)/255],this}cellColor(t,i,r,n){return this.q=[(t??0)/255,(i??t??0)/255,(r??t??0)/255,(n??255)/255],this}background(t,i,r,n){return this.yr=[(t??0)/255,(i??t??0)/255,(r??t??0)/255,(n??255)/255],this}characters(t){const i=this.wr(t).filter(r=>Array.isArray(r)).slice(0,64);return this.Cr=i,this}static Mr(t,i,r){const n=t.context,o=n.createTexture();n.bindTexture(n.TEXTURE_2D,o),n.pixelStorei(n.UNPACK_FLIP_Y_WEBGL,1),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_MIN_FILTER,n.NEAREST),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_MAG_FILTER,n.NEAREST),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_S,n.CLAMP_TO_EDGE),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_T,n.CLAMP_TO_EDGE),n.texImage2D(n.TEXTURE_2D,0,n.RGBA,n.RGBA,n.UNSIGNED_BYTE,i),n.bindTexture(n.TEXTURE_2D,null);const h=i.naturalWidth??i.width??i.videoWidth??0,a=i.naturalHeight??i.height??i.videoHeight??0,u=new Y(n,o,h,a);return u.wr=r,u}get texture(){return this.mr}get width(){return this.dt}get height(){return this._t}}class kt{constructor(t=60){c(this,"Fr");c(this,"zr");c(this,"Rr",null);c(this,"Tr",0);c(this,"Pr",!0);c(this,"Sr",0);c(this,"Er",0);c(this,"$r",[]);c(this,"Dr",10);c(this,"kr",0);this.Fr=t,this.zr=1e3/t}start(t){if(!this.Pr)return;this.Tr=performance.now();const i=r=>{if(!this.Pr)return void(this.Rr=null);const n=r-this.Tr;n>=this.zr&&(t(),this.Tr=r-n%this.zr),this.Pr&&(this.Rr=requestAnimationFrame(i))};this.Rr=requestAnimationFrame(i)}stop(){this.Rr&&(cancelAnimationFrame(this.Rr),this.Rr=null)}pause(){this.Pr&&(this.Pr=!1,this.stop())}resume(t){this.Pr||(this.Pr=!0,this.start(t))}frameRate(t,i){if(t===void 0)return this.Sr;this.Fr=t,this.zr=1e3/t,this.Pr&&i&&(this.stop(),this.start(i))}measureFrameRate(){const t=performance.now();if(this.Er>0){const i=t-this.Er;this.$r.push(i),this.$r.length>this.Dr&&this.$r.shift();const r=this.$r.reduce((n,o)=>n+o,0)/this.$r.length;this.Sr=1e3/r}this.Er=t}get isLooping(){return this.Pr}get frameRateLimit(){return this.Fr}get currentFrameRate(){return this.Sr}get frameCount(){return this.kr}set frameCount(t){this.kr=t}incrementFrame(){this.kr++}resetFrameCount(){this.kr=0}}class lt{constructor(t){c(this,"tr");c(this,"Br");c(this,"Or",{x:-1,y:-1});c(this,"Lr",{x:-1,y:-1});c(this,"Gr",null);c(this,"Hr",0);c(this,"Ir");c(this,"Nr");c(this,"Xr");c(this,"Wr");c(this,"Kr");c(this,"jr");c(this,"Yr",!1);c(this,"Vr");c(this,"qr");c(this,"Zr");c(this,"Qr");c(this,"Jr");this.tr=t}tn(t){const i=performance.now()+Math.max(0,t);i>this.Hr&&(this.Hr=i)}sn(){return performance.now()<this.Hr}en(t){const i=this.tr.canvas;i.style.cursor=t==null||t===""?"":t}Wi(t){this.Br=t,this.rn()}nn(){if(this.Yr)return;const t=this.tr.canvas;this.Ir=i=>{this.hn(i),this.an(i)},this.Nr=()=>{this.Lr={...this.Or},this.Or.x=-1,this.Or.y=-1,this.Gr=null},this.Xr=i=>{this.hn(i),this.cn(i)},this.Wr=i=>{this.hn(i),this.ln(i)},this.Kr=i=>{this.hn(i),this.un(i)},this.jr=i=>{this.hn(i),this.fn(i)},t.addEventListener("mousemove",this.Ir,{passive:!0}),t.addEventListener("mouseleave",this.Nr,{passive:!0}),t.addEventListener("mousedown",this.Xr,{passive:!0}),t.addEventListener("mouseup",this.Wr,{passive:!0}),t.addEventListener("click",this.Kr,{passive:!0}),t.addEventListener("wheel",this.jr,{passive:!1}),this.Yr=!0}dn(){if(!this.Yr)return;const t=this.tr.canvas;t.removeEventListener("mousemove",this.Ir),t.removeEventListener("mouseleave",this.Nr),t.removeEventListener("mousedown",this.Xr),t.removeEventListener("mouseup",this.Wr),t.removeEventListener("click",this.Kr),t.removeEventListener("wheel",this.jr),this.Yr=!1}rn(){if(this.Yr)try{if(this.Gr){const t=new MouseEvent("mousemove",{clientX:this.Gr.x,clientY:this.Gr.y,bubbles:!1,cancelable:!1});this.hn(t)}else this.Or.x!==-1&&this.Or.y!==-1&&(this.Or.x>=this.Br.cols||this.Or.y>=this.Br.rows)&&(this.Or.x=-1,this.Or.y=-1)}catch{this.Or.x=-1,this.Or.y=-1}}_n(t){this.Vr=t}pn(t){this.qr=t}vn(t){this.Zr=t}mn(t){this.Qr=t}gn(t){this.Jr=t}An(){return{x:this.Or.x,y:this.Or.y}}an(t){if(this.Qr&&!this.sn()){const i={position:{...this.Or},previousPosition:{...this.Lr},originalEvent:t};this.Qr(i)}}cn(t){if(this.qr&&!this.sn()){const i={position:{...this.Or},previousPosition:{...this.Lr},button:t.button,originalEvent:t};this.qr(i)}}ln(t){if(this.Zr&&!this.sn()){const i={position:{...this.Or},previousPosition:{...this.Lr},button:t.button,originalEvent:t};this.Zr(i)}}un(t){if(this.Vr&&!this.sn()){const i={position:{...this.Or},previousPosition:{...this.Lr},button:t.button,originalEvent:t};this.Vr(i)}}fn(t){if(this.Jr&&!this.sn()){const i={position:{...this.Or},previousPosition:{...this.Lr},delta:{x:t.deltaX,y:t.deltaY},originalEvent:t};this.Jr(i)}}hn(t){const i=this.tr.canvas;this.Lr={...this.Or},this.Gr={x:t.clientX,y:t.clientY};const r=i.getBoundingClientRect(),n=t.clientX-r.left,o=t.clientY-r.top,h=i.width/r.width,a=o*(i.height/r.height),u=n*h-this.Br.offsetX,f=a-this.Br.offsetY,g=Math.floor(u/this.Br.cellWidth),d=Math.floor(f/this.Br.cellHeight);g>=0&&g<this.Br.cols&&d>=0&&d<this.Br.rows?(this.Or.x=g,this.Or.y=d):(this.Or.x=-1,this.Or.y=-1)}}const Vt=Object.freeze(Object.defineProperty({__proto__:null,MouseManager:lt},Symbol.toStringTag,{value:"Module"}));class ut{constructor(){c(this,"yn",new Map);c(this,"Cn",null);c(this,"wn",null);c(this,"bn");c(this,"xn");c(this,"Yr",!1);c(this,"Mn");c(this,"Fn");c(this,"zn",{ArrowUp:"UP_ARROW",ArrowDown:"DOWN_ARROW",ArrowLeft:"LEFT_ARROW",ArrowRight:"RIGHT_ARROW",F1:"F1",F2:"F2",F3:"F3",F4:"F4",F5:"F5",F6:"F6",F7:"F7",F8:"F8",F9:"F9",F10:"F10",F11:"F11",F12:"F12",Enter:"ENTER",Return:"RETURN",Tab:"TAB",Escape:"ESCAPE",Backspace:"BACKSPACE",Delete:"DELETE",Insert:"INSERT",Home:"HOME",End:"END",PageUp:"PAGE_UP",PageDown:"PAGE_DOWN",Shift:"SHIFT",Control:"CONTROL",Alt:"ALT",Meta:"META"," ":"SPACE"})}nn(){this.Yr||(this.bn=t=>{this.Rn(t)},this.xn=t=>{this.Tn(t)},window.addEventListener("keydown",this.bn,{passive:!1}),window.addEventListener("keyup",this.xn,{passive:!1}),this.Yr=!0)}dn(){this.Yr&&(window.removeEventListener("keydown",this.bn),window.removeEventListener("keyup",this.xn),this.Yr=!1,this.yn.clear(),this.Cn=null,this.wn=null)}pn(t){this.Mn=t}vn(t){this.Fn=t}Pn(t){const i=this.Sn(t),r=this.yn.get(t)||this.yn.get(i);return(r==null?void 0:r.isPressed)||!1}En(){return this.Cn}$n(){return this.wn}Dn(){const t=[];for(const[i,r]of this.yn)r.isPressed&&t.push(i);return t}kn(){return{ctrl:this.Pn("Control"),shift:this.Pn("Shift"),alt:this.Pn("Alt"),meta:this.Pn("Meta")}}Bn(){this.yn.clear(),this.Cn=null,this.wn=null}Rn(t){const i=t.key,r=Date.now();this.yn.has(i)||this.yn.set(i,{isPressed:!1,lastPressTime:0,lastReleaseTime:0});const n=this.yn.get(i);if(!n.isPressed&&(n.isPressed=!0,n.lastPressTime=r,this.Cn=i,this.Mn)){const o={key:i,keyCode:t.keyCode,ctrlKey:t.ctrlKey,shiftKey:t.shiftKey,altKey:t.altKey,metaKey:t.metaKey,isPressed:!0,originalEvent:t};this.Mn(o)}}Tn(t){const i=t.key,r=Date.now();this.yn.has(i)||this.yn.set(i,{isPressed:!1,lastPressTime:0,lastReleaseTime:0});const n=this.yn.get(i);if(n.isPressed=!1,n.lastReleaseTime=r,this.wn=i,this.Fn){const o={key:i,keyCode:t.keyCode,ctrlKey:t.ctrlKey,shiftKey:t.shiftKey,altKey:t.altKey,metaKey:t.metaKey,isPressed:!1,originalEvent:t};this.Fn(o)}}Sn(t){return this.zn[t]||t.toLowerCase()}}const jt=Object.freeze(Object.defineProperty({__proto__:null,KeyboardManager:ut},Symbol.toStringTag,{value:"Module"}));class ft{constructor(t,i){c(this,"tr");c(this,"On");c(this,"Br");c(this,"Ln",new Map);c(this,"Gn",new Map);c(this,"Hn",new Map);c(this,"In",null);c(this,"Nn");c(this,"Xn");c(this,"Wn");c(this,"Kn");c(this,"jn");c(this,"Yn");c(this,"Yr",!1);c(this,"Vn");c(this,"qn");c(this,"Zn");c(this,"Qn");c(this,"Jn");c(this,"so");c(this,"eo");c(this,"io");c(this,"ro");c(this,"no");c(this,"oo",320);c(this,"ho",350);c(this,"ao",10);c(this,"co",550);c(this,"lo",14);c(this,"uo",48);c(this,"fo",650);c(this,"do",.02);c(this,"_o",2);c(this,"po",600);c(this,"vo",0);c(this,"mo",null);this.tr=t,this.On=i;const r=this.tr.canvas;this.Nn=r.style.touchAction,this.Xn=r.style.userSelect,r.style.touchAction||(r.style.touchAction="none"),r.style.userSelect||(r.style.userSelect="none")}Wi(t){this.Br=t,this.Ao()}nn(){if(this.Yr)return;const t=this.tr.canvas;this.Wn=i=>{this.yo(i)},this.Kn=i=>{this.Co(i)},this.jn=i=>{this.wo(i)},this.Yn=i=>{this.bo(i)},t.addEventListener("touchstart",this.Wn,{passive:!1}),t.addEventListener("touchmove",this.Kn,{passive:!1}),t.addEventListener("touchend",this.jn,{passive:!1}),t.addEventListener("touchcancel",this.Yn,{passive:!1}),this.Yr=!0}dn(){if(!this.Yr)return;const t=this.tr.canvas;t.removeEventListener("touchstart",this.Wn),t.removeEventListener("touchmove",this.Kn),t.removeEventListener("touchend",this.jn),t.removeEventListener("touchcancel",this.Yn),this.Yr=!1,this.In=null,this.Ln.clear(),this.Gn.clear(),this.Hn.forEach(i=>{i.longPressTimer!==null&&window.clearTimeout(i.longPressTimer)}),this.Hn.clear(),this.mo=null,this.vo=0,t.style.touchAction=this.Nn,t.style.userSelect=this.Xn}Ao(){if(!this.Br||this.Ln.size===0)return;const t=new Map;for(const i of this.Ln.values()){const r=this.xo(i.clientX,i.clientY,i.id,i);t.set(i.id,r)}this.Ln=t}Mo(){return Array.from(this.Ln.values()).map(t=>({...t}))}Fo(t){this.Vn=t}mn(t){this.qn=t}zo(t){this.Zn=t}Ro(t){this.Qn=t}To(t){this.Jn=t}Po(t){this.so=t}So(t){this.eo=t}Eo(t){this.io=t}$o(t){this.ro=t}Do(t){this.no=t}yo(t){var n;if(!this.Br)return;t.preventDefault(),(n=this.On)==null||n.tn(this.po);const i=performance.now(),r=this.ko(t.changedTouches);for(const o of r){const h=this.Ln.get(o.id);h&&this.Gn.set(o.id,this.Bo(h)),this.Ln.set(o.id,o);const a={id:o.id,startPosition:o,lastPosition:o,startTime:i,lastTime:i,longPressTimer:null,longPressFired:!1};this.eo&&(a.longPressTimer=window.setTimeout(()=>{const u=this.Ln.get(o.id);u&&(a.longPressFired=!0,this.eo({touch:this.Bo(u),duration:performance.now()-a.startTime,originalEvent:t}))},this.co)),this.Hn.set(o.id,a),this.Vn&&this.Vn(this.Oo(o,t,void 0,i))}this.Ln.size===2&&this.Lo()}Co(t){var n;if(!this.Br)return;t.preventDefault(),(n=this.On)==null||n.tn(this.po);const i=performance.now(),r=this.ko(t.changedTouches);for(const o of r){const h=this.Ln.get(o.id),a=h?this.Bo(h):void 0;a&&this.Gn.set(o.id,a),this.Ln.set(o.id,o);const u=this.Hn.get(o.id);u&&(u.lastPosition=o,u.lastTime=i,a)&&this.Go(a,o,!0)>this.lo&&u.longPressTimer!==null&&(window.clearTimeout(u.longPressTimer),u.longPressTimer=null),this.qn&&this.qn(this.Oo(o,t,a,i))}this.Ln.size===2?this.Ho(t):this.In=null}wo(t){if(!this.Br)return;t.preventDefault();const i=performance.now(),r=this.ko(t.changedTouches);for(const n of r){const o=this.Ln.get(n.id),h=o?this.Bo(o):void 0,a=this.Hn.get(n.id);a&&a.longPressTimer!==null&&(window.clearTimeout(a.longPressTimer),a.longPressTimer=null),this.Zn&&this.Zn(this.Oo(n,t,h,i)),a&&this.Io(a,t),this.Hn.delete(n.id),this.Gn.delete(n.id),this.Ln.delete(n.id)}this.Ln.size<2&&(this.In=null)}bo(t){if(!this.Br)return;t.preventDefault();const i=performance.now(),r=this.ko(t.changedTouches);for(const n of r){const o=this.Ln.get(n.id),h=o?this.Bo(o):void 0,a=this.Hn.get(n.id);a&&a.longPressTimer!==null&&(window.clearTimeout(a.longPressTimer),a.longPressTimer=null),this.Qn&&this.Qn(this.Oo(n,t,h,i)),this.Hn.delete(n.id),this.Gn.delete(n.id),this.Ln.delete(n.id)}this.Ln.size<2&&(this.In=null)}ko(t){const i=[];for(let r=0;r<t.length;r+=1){const n=t.item(r);n&&i.push(this.No(n))}return i}No(t){return this.xo(t.clientX,t.clientY,t.identifier,{id:t.identifier,x:-1,y:-1,clientX:t.clientX,clientY:t.clientY,pressure:t.force,radiusX:t.radiusX,radiusY:t.radiusY,rotationAngle:t.rotationAngle})}xo(t,i,r,n){const o=this.tr.canvas,h=o.getBoundingClientRect(),a=t-h.left,u=i-h.top,f=o.width/h.width,g=u*(o.height/h.height),d=a*f-this.Br.offsetX,p=g-this.Br.offsetY,y=Math.floor(d/this.Br.cellWidth),A=Math.floor(p/this.Br.cellHeight),m=y>=0&&y<this.Br.cols&&A>=0&&A<this.Br.rows;return{id:r,x:m?y:-1,y:m?A:-1,clientX:t,clientY:i,pressure:n.pressure,radiusX:n.radiusX,radiusY:n.radiusY,rotationAngle:n.rotationAngle}}Oo(t,i,r,n){const o=this.Hn.get(t.id),h=Array.from(this.Gn.values()).map(f=>this.Bo(f)),a=Array.from(this.Ln.values()).map(f=>this.Bo(f)),u=this.ko(i.changedTouches);return{touch:this.Bo(t),previousTouch:r?this.Bo(r):void 0,touches:a,previousTouches:h,changedTouches:u,deltaTime:o?n-o.lastTime:0,originalEvent:i}}Lo(){if(this.Ln.size!==2)return void(this.In=null);const t=Array.from(this.Ln.values()),[i,r]=t,n=this.Go(i,r,!1),o=this.Xo(i,r);this.In={ids:[i.id,r.id],initialDistance:Math.max(n,1e-4),initialAngle:o,lastScale:1,lastRotation:0}}Ho(t){if(this.In||this.Lo(),!this.In)return;const[i,r]=this.In.ids,n=this.Ln.get(i),o=this.Ln.get(r);if(!n||!o)return;const h=this.Go(n,o,!1)/this.In.initialDistance,a=h-this.In.lastScale;this.ro&&Math.abs(a)>this.do&&(this.ro({touches:[this.Bo(n),this.Bo(o)],scale:h,deltaScale:a,center:this.Wo(n,o),originalEvent:t}),this.In.lastScale=h);let u=this.Xo(n,o)-this.In.initialAngle;u=(u+180)%360-180;const f=u-this.In.lastRotation;this.no&&Math.abs(f)>this._o&&(this.no({touches:[this.Bo(n),this.Bo(o)],rotation:u,deltaRotation:f,center:this.Wo(n,o),originalEvent:t}),this.In.lastRotation=u)}Wo(t,i){const r=(t.clientX+i.clientX)/2,n=(t.clientY+i.clientY)/2,o=this.xo(r,n,-1,{id:-1,x:-1,y:-1,clientX:r,clientY:n});return{x:o.x,y:o.y}}Io(t,i){const r=performance.now(),n=r-t.startTime,o=this.Go(t.startPosition,t.lastPosition,!0);if(!t.longPressFired&&n<=this.oo&&o<=this.ao)this.Ko(t.lastPosition,r)&&this.so?this.so({touch:this.Bo(t.lastPosition),taps:2,originalEvent:i}):this.Jn&&this.Jn({touch:this.Bo(t.lastPosition),taps:1,originalEvent:i});else if(!t.longPressFired&&n<=this.fo&&o>=this.uo){const h={x:t.lastPosition.clientX-t.startPosition.clientX,y:t.lastPosition.clientY-t.startPosition.clientY},a=Math.max(Math.hypot(h.x,h.y),1e-4),u={x:h.x/a,y:h.y/a},f={x:h.x/n,y:h.y/n};this.io&&this.io({touch:this.Bo(t.lastPosition),direction:u,distance:a,velocity:f,originalEvent:i})}this.vo=r,this.mo=this.Bo(t.lastPosition)}Ko(t,i){return!!this.mo&&!(i-this.vo>this.ho)&&this.Go(t,this.mo,!0)<=this.ao}Bo(t){return{...t}}Go(t,i,r){return r?Math.hypot(t.clientX-i.clientX,t.clientY-i.clientY):Math.hypot(t.x-i.x,t.y-i.y)}Xo(t,i){return 180*Math.atan2(i.clientY-t.clientY,i.clientX-t.clientX)/Math.PI}}const qt=Object.freeze(Object.defineProperty({__proto__:null,TouchManager:ft},Symbol.toStringTag,{value:"Module"})),Kt=l=>class extends l{rotate(t=0,i=0,r=0){this.xt.state.st(t),this.xt.state.et(i),this.xt.state.it(r)}rotateX(t){this.xt.state.st(t)}rotateY(t){this.xt.state.et(t)}rotateZ(t){this.xt.state.it(t)}push(){this.xt.state.H()}pop(){this.xt.state.Z()}rect(t,i,r=1,n=1){this.xt.Ne(t,i,r,n)}point(t,i){this.xt.Ne(t,i,1,1)}line(t,i,r,n){this.xt.Xe(t,i,r,n)}lineWeight(t){this.xt.state.tt(t)}background(t,i=t,r=t,n=255){this.xt.qe(t,i,r,n)}char(t){this.xt.state.rt(this.Ei.Pi(t))}charColor(t,i,r,n=255){this.xt.state.nt(t,i,r,n)}cellColor(t,i,r,n=255){this.xt.state.ot(t,i,r,n)}flipX(t){this.xt.state.ht(t)}flipY(t){this.xt.state.ct(t)}charRotation(t){this.xt.state.ut(t)}invert(t){this.xt.state.lt(t)}clear(){this.xt.qe(0,0,0,0)}ellipse(t,i,r,n){this.xt.We(t,i,r/2,n/2)}triangle(t,i,r,n,o,h){this.xt.Ke(t,i,r,n,o,h)}bezierCurve(t,i,r,n,o,h,a,u){this.xt.je(t,i,r,n,o,h,a,u)}arc(t,i,r,n,o,h){this.xt.Ve(t,i,r,n,o,h)}shader(t){this.xt.Be(t)}setUniform(t,i){this.xt.Kt(t,i)}setUniforms(t){this.xt.Oe(t)}createFilterShader(t){return this.xt.hs(t)}createFramebuffer(t){return this.xt.Ye(t.width,t.height,5,{filter:"nearest",wrap:"clamp",format:"rgba",type:"unsigned_byte"})}image(t,i,r,n,o){if(t.textures){const h=t;this.xt.Le(h,i,r,n??h.width,o??h.height)}else{const h=t;this.xt.Ge(h,i,r,n??Math.floor(this.Br.cols/2),o??Math.floor(this.Br.rows/2))}}async loadImage(t){if(typeof t!="string")return Y.Mr(this.xt,t,n=>this.Ei.Si(n));const i=t,r=await new Promise((n,o)=>{const h=new Image;h.crossOrigin="anonymous",h.onload=()=>n(h),h.onerror=a=>o(a),h.src=i});return Y.Mr(this.xt,r,n=>this.Ei.Si(n))}},Zt=l=>class extends l{async loadFont(t){return this.Ei.Vi(t).then(()=>{const i=this.Ei.maxGlyphDimensions;this.Br.rr(i.width,i.height),this.jo.resize(this.Br.cols,this.Br.rows),this.xt.Ze(),this.On.rn()})}fontSize(t){if(!X.m(typeof t=="number"&&t>0,"Font size must be a positive number greater than 0.",{method:"fontSize",providedValue:t})||this.Ei.fontSize===t)return;this.Ei.Yi(t);const i=this.Ei.maxGlyphDimensions;this.Br.rr(i.width,i.height),this.jo.resize(this.Br.cols,this.Br.rows),this.xt.Ze(),this.On.rn()}glyphColor(t){return this.Ei.Pi(t)}glyphColors(t){return this.Ei.Si(t)}},Qt=l=>class extends l{get frameCount(){return this.Yo.frameCount}set frameCount(t){this.Yo.frameCount=t}frameRate(t){return t===void 0?this.Yo.currentFrameRate:this.Yo.frameRate(t,()=>this.Vo())}noLoop(){this.Yo.pause()}loop(){this.Yo.resume(()=>this.Vo())}redraw(t=1){if(X.m(typeof t=="number"&&t>0&&Number.isInteger(t),"Redraw count must be a positive integer.",{method:"redraw",providedValue:t}))for(let i=0;i<t;i++)this.Vo()}isLooping(){return this.Yo.isLooping}},Jt=l=>class extends l{constructor(...t){super(...t)}mouseClicked(t){this.On._n(t)}mousePressed(t){this.On.pn(t)}mouseReleased(t){this.On.vn(t)}mouseMoved(t){this.On.mn(t)}mouseScrolled(t){this.On.gn(t)}get mouse(){return this.On.An()}cursor(t){this.On.en(t)}},$t=l=>class extends l{constructor(...t){super(...t)}touchStarted(t){this.qo.Fo(t)}touchMoved(t){this.qo.mn(t)}touchEnded(t){this.qo.zo(t)}touchCancelled(t){this.qo.Ro(t)}tap(t){this.qo.To(t)}doubleTap(t){this.qo.Po(t)}longPress(t){this.qo.So(t)}swipe(t){this.qo.Eo(t)}pinch(t){this.qo.$o(t)}rotateGesture(t){this.qo.Do(t)}get touches(){return this.qo.Mo()}},te=l=>class extends l{constructor(...t){super(...t)}keyPressed(t){this.Zo.pn(t)}keyReleased(t){this.Zo.vn(t)}isKeyPressed(t){return this.Zo.Pn(t)}get lastKeyPressed(){return this.Zo.En()}get lastKeyReleased(){return this.Zo.$n()}get pressedKeys(){return this.Zo.Dn()}get modifierState(){return this.Zo.kn()}};class ee{constructor(){c(this,"xt");c(this,"Ei");c(this,"tr");c(this,"Br");c(this,"Yo");c(this,"On");c(this,"qo");c(this,"Zo");c(this,"Qo");c(this,"jo");c(this,"Jo");c(this,"th");c(this,"sh")}Vo(){}}class dt extends function(i,...r){return r.reduce((n,o)=>o(n),i)}(ee,Kt,Zt,Qt,Jt,$t,te){constructor(i={}){var r;super();c(this,"eh",new Map);c(this,"ih");c(this,"rh",!1);c(this,"nh",!1);c(this,"oh",()=>{});c(this,"hh",()=>{});c(this,"ah",()=>{});c(this,"uh");c(this,"ar");c(this,"hr",!1);c(this,"fh");this.ih=((r=i.plugins)==null?void 0:r.slice())??[],this.hr=i.overlay??!1,this.tr=new ct(i),this.xt=new Ot(this.tr.vr()),this.Ei=new ht(this.xt,i.fontSize??16),this.Yo=new kt(i.frameRate??60),this.On=new lt(this.tr),this.qo=new ft(this.tr,this.On),this.Zo=new ut,this.Qo=this.xt.Pt(),this.Jo=this.xt.rs(),this.dh(i)}async dh(i){await this.Ei.Wi(i.fontSource);const r=this.Ei.maxGlyphDimensions;this.Br=new at(this.tr.canvas,r.width,r.height),this.On.Wi(this.Br),this.qo.Wi(this.Br),this.jo=this.xt.Ye(this.Br.cols,this.Br.rows,5),this.th=this.xt.Ye(this.Br.width,this.Br.height,1),this.hr&&(this.fh=Y.Mr(this.xt,this.tr.targetCanvas,n=>this.Ei.Si(n))),this.sh=this.xt.cs(rt,"precision mediump float;uniform sampler2D Ua;uniform vec2 Ub;uniform vec2 Uc;uniform vec2 Ud;void main(){vec2 A=gl_FragCoord.xy-Uc;vec2 B=A*(Ub/Ud);vec2 C=(floor(B)+0.5)/Ub;gl_FragColor=texture2D(Ua,C);}"),this._h(),await this.ph(this.ih),this.ih=[],this.rh=!0,this.oh(),this.Yo.start(()=>this.Vo())}async ph(i){if(i.length)for(const r of i)this.eh.has(r.name)?console.warn(`[textmode.js] Plugin "${r.name}" is already installed.`):(await r.install(this,this.mh()),this.eh.set(r.name,r))}async gh(i){const r=this.eh.get(i);r&&(r.uninstall&&await r.uninstall(this,this.mh()),this.eh.delete(i))}async use(i){return this.rh?await this.ph([i]):this.ih.push(i),this}async unuse(i){return this.rh?(await this.gh(i),this):(this.ih=this.ih.filter(r=>r.name!==i),this)}hasPlugin(i){return this.rh?this.eh.has(i):this.ih.some(r=>r.name===i)||this.eh.has(i)}mh(){return{renderer:this.xt,font:this.Ei,grid:this.Br,canvas:this.tr,drawFramebuffer:this.jo,asciiFramebuffer:this.th,flushDrawCommands:()=>{this.xt.St(this.Qo)}}}_h(){this.uh=()=>{this.hr&&this.resizeCanvas(this.tr.targetCanvas.width,this.tr.targetCanvas.height),this.ah()},window.addEventListener("resize",this.uh),this.On.nn(),this.qo.nn(),this.Zo.nn(),window.addEventListener("blur",()=>{this.Zo.Bn()}),window.ResizeObserver&&this.hr&&(this.ar=new ResizeObserver(()=>{this.resizeCanvas(this.tr.targetCanvas.width,this.tr.targetCanvas.height)}),this.ar.observe(this.tr.targetCanvas))}Vo(){if(this.Yo.measureFrameRate(),this.Yo.incrementFrame(),this.nh)return;if(this.hr){const r=this.xt.context;r.bindTexture(r.TEXTURE_2D,this.fh.texture),r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,1),r.texImage2D(r.TEXTURE_2D,0,r.RGBA,r.RGBA,r.UNSIGNED_BYTE,this.tr.targetCanvas),r.bindTexture(r.TEXTURE_2D,null)}this.jo.begin(),this.xt.ke(this.Qo),this.hh(),this.xt.St(this.Qo),this.jo.end(),this.th.begin(),this.xt.ke(this.Jo),this.Jo.Wt({U0:this.Ei.fontFramebuffer,U1:[this.Ei.textureColumns,this.Ei.textureRows],U2:this.jo.textures[0],U3:this.jo.textures[1],U4:this.jo.textures[2],U5:this.jo.textures[4],U6:this.jo.textures[3],U7:[this.Br.cols,this.Br.rows],U8:[this.th.width,this.th.height],U9:this.th.width/this.th.height}),this.xt.Ie(0,0,this.tr.width,this.tr.height),this.th.end();const i=this.xt.state.canvasBackgroundColor;this.xt.Ys(i[0],i[1],i[2],i[3]),this.xt.ke(this.sh),this.sh.Wt({Ua:this.th.textures[0],Ub:[this.th.width,this.th.height],Uc:[this.Br.offsetX,this.Br.offsetY],Ud:[this.Br.width,this.Br.height]}),this.xt.Ie(this.Br.offsetX,this.Br.offsetY,this.Br.width,this.Br.height)}setup(i){this.oh=i}draw(i){this.hh=i}windowResized(i){this.ah=i}resizeCanvas(i,r){this.tr.pr(i,r),this.Br.ir(),this.jo.resize(this.Br.cols,this.Br.rows),this.th.resize(this.Br.width,this.Br.height),this.xt.Ze(),this.On.rn(),this.qo.Ao(),this.Vo()}destroy(){this.nh||(this.Yo.stop(),window.removeEventListener("resize",this.uh),this.On.dn(),this.qo.dn(),this.Zo.dn(),this.Ei.Dt(),this.xt.Dt(),this.th.Dt(),this.sh.Dt(),this.fh&&this.fh.Dt(),this.nh=!0)}get grid(){return this.Br}get font(){return this.Ei}get width(){return this.tr.width}get height(){return this.tr.height}get canvas(){return this.tr.canvas}get isDisposed(){return this.nh}get overlay(){return this.fh}}class Q{constructor(){}static create(t={}){return new dt(t)}static setErrorLevel(t){X.A(t)}static get version(){return"0.3.2-beta.1"}}const ie=Object.freeze(Object.defineProperty({__proto__:null},Symbol.toStringTag,{value:"Module"})),se=Object.freeze(Object.defineProperty({__proto__:null,keyboard:jt,mouse:Vt,touch:qt},Symbol.toStringTag,{value:"Module"})),re=Q.create,ne=Q.setErrorLevel,oe=Q.version;b.TextmodeCanvas=ct,b.TextmodeErrorLevel=S,b.TextmodeFont=ht,b.TextmodeFramebuffer=j,b.TextmodeGrid=at,b.TextmodeImage=Y,b.Textmodifier=dt,b.create=re,b.export=ie,b.input=se,b.setErrorLevel=ne,b.textmode=Q,b.version=oe,Object.defineProperty(b,Symbol.toStringTag,{value:"Module"})},typeof exports=="object"&&typeof module<"u"?e(exports):typeof define=="function"&&define.amd?define(["exports"],e):e((s=typeof globalThis<"u"?globalThis:s||self).textmode={});
|
|
11
|
+
precision highp float;in vec2 v_uv;uniform sampler2D Uk;uniform bool Ul;uniform bool Um;uniform bool Un;uniform vec2 Uo;uniform bool Up;uniform vec4 Uq;uniform bool Ur;uniform vec4 Us;uniform vec4 Ut;uniform int Uu;uniform vec3 Uv[64];layout(location=0)out vec4 o_character;layout(location=1)out vec4 o_primaryColor;layout(location=2)out vec4 o_secondaryColor;layout(location=3)out vec4 o_rotation;layout(location=4)out vec4 o_transform;float A(vec3 B){return dot(B,vec3(0.299f,0.587f,0.114f));}void main(){vec2 C=vec2(v_uv.x,1.0f-v_uv.y);vec4 D=texture(Uk,C);float E=A(D.rgb);if(Uu>0){float F=float(Uu);float G=clamp(E*(F-1.0f),0.0f,F-1.0f);int H=int(floor(G+0.5f));vec3 I=Uv[H];o_character=vec4(I,1.0f);}else{o_character=vec4(E,0.0f,0.0f,1.0f);}vec4 J=Up?Uq:D;vec4 K=Ur?Us:D;if(D.a<0.01f){J=Ut;K=Ut;}else{}o_primaryColor=vec4(J);o_secondaryColor=vec4(K);o_rotation=vec4(Uo.xy,0.0f,1.0f);o_transform=vec4(float(Ul),float(Um),float(Un),1.0f);}`)}es(){return this.Qt}Pt(){return this.Jt}rs(){return this.ts}ns(){return this.ss}hs(t){return new N(this.gt,q,t)}cs(t,i){return new N(this.gt,t,i)}Dt(){this.Qt.Dt(),this.Jt.Dt(),this.ts.Dt(),this.ss.Dt()}}var w=(l=>(l.RECTANGLE="rectangle",l.LINE="line",l.ELLIPSE="ellipse",l.ARC="arc",l.TRIANGLE="triangle",l.BEZIER_CURVE="bezier_curve",l.CUSTOM="custom",l))(w||{});class At{constructor(t){c(this,"gt");c(this,"ls",new Map);this.gt=t}us(t,i,r,n){const o=this.gt;let h=this.ls.get(t);h||(h=new Map,this.ls.set(t,h));let a=h.get(i)||null;if(!a){a=o.createVertexArray(),h.set(i,a),o.bindVertexArray(a),o.bindBuffer(o.ARRAY_BUFFER,n);const u=o.getAttribLocation(t,"a_position");u!==-1&&(o.enableVertexAttribArray(u),o.vertexAttribPointer(u,r.ds.fs.size,o.FLOAT,!1,r._s,r.ds.fs.offset),o.vertexAttribDivisor(u,0));const f=o.getAttribLocation(t,"a_texCoord");f!==-1&&(o.enableVertexAttribArray(f),o.vertexAttribPointer(f,r.ds.ps.size,o.FLOAT,!1,r._s,r.ds.ps.offset),o.vertexAttribDivisor(f,0))}o.bindVertexArray(a)}vs(){this.gt.bindVertexArray(null)}Dt(){for(const[,t]of this.ls)for(const[,i]of t)i&&this.gt.deleteVertexArray(i)}}class pt{constructor(t,i){c(this,"gs");c(this,"gt");c(this,"xt");c(this,"As",null);c(this,"Cs",null);this.gt=t,this.gs=new At(t),this.xt=i}ws(t,i,r){const{shader:n}=t,o=V(this.gt)||this.gt.getParameter(this.gt.VIEWPORT);n.Wt({U9:o[2]/o[3],Uw:[o[2],o[3]]});const h=f=>{if(!f||!f.bs())return;const g=f.unitGeometry,d=f.unitBuffer;try{this.gs.us(n.Zt,f.type+"",g,d),f.batch.Ms(n),f.batch.Fs(g.zs,g.Rs)}finally{f.batch.Ts(n),this.gs.vs(),f.Ps()}};let a=null,u=null;for(const f of i){if(f.type===w.CUSTOM){u&&(h(u),a=null,u=null),this.Ss(t,f.params,f.state,r.get(w.RECTANGLE));continue}a!==null&&f.type!==a&&(h(u),a=null,u=null);let g=u;g&&f.type===a||(g=r.get(f.type)||null,u=g,a=f.type),g&&g.Es(f.params,f.state)}h(u)}Ss(t,i,r,n){const{x:o,y:h,width:a,height:u,shader:f,uniforms:g}=i,d=this.$s(Math.max(1,Math.floor(a)),Math.max(1,Math.floor(u)));d.begin(),this.Ds(n,f,g,0,0,d.width,d.height,{}),d.end();const p=this.ks(),y={Ue:d.textures[0],Uf:d.textures[1],Ug:d.textures[2],Uh:d.textures[3],Ui:d.textures[4],Uj:[d.width,d.height]};this.Ds(n,p,y,Math.floor(o),Math.floor(h),Math.max(1,Math.floor(a)),Math.max(1,Math.floor(u)),r),t.shader.Nt()}Ds(t,i,r,n,o,h,a,u){i.Nt(),i.Wt(r);const f=this.gt.getParameter(this.gt.VIEWPORT);if(i.Wt({U9:f[2]/f[3],Uw:[f[2],f[3]]}),t.Ps(),t.Es({x:n,y:o,width:h,height:a},u),t.bs()){const g=t.unitGeometry,d=t.unitBuffer;try{this.gs.us(i.Zt,t.type+"",g,d),t.batch.Ms(i),t.batch.Fs(g.zs,g.Rs)}finally{t.batch.Ts(i),this.gs.vs(),t.Ps()}}}ks(){return this.xt.es()}$s(t,i){return this.As&&this.Cs&&this.Cs.w===t&&this.Cs.h===i||(this.As&&this.As.Dt(),this.As=new j(this.gt,t,i,5),this.Cs={w:t,h:i}),this.As}Dt(){this.gs.Dt(),this.As&&this.As.Dt()}}class vt{constructor(){c(this,"Bs",[]);c(this,"Os",1);c(this,"Ls",0)}Gs(t){if(this.Ls>=this.Bs.length){const r={id:this.Os++,type:t,params:{},state:{I:1,N:0,X:0,W:0,Y:[0,0,0],V:[1,1,1,1],q:[0,0,0,1],K:!1,j:!1,k:!1,O:[0,0]}};this.Bs.push(r)}const i=this.Bs[this.Ls];return i.id=this.Os++,i.type=t,this.Ls++,i}Hs(t,i,r,n,o){const h=this.Gs(w.RECTANGLE);return h.params.x=t,h.params.y=i,h.params.width=r,h.params.height=n,o.J(h.state),h.id}Is(t,i,r,n,o,h,a){const u=this.Gs(w.CUSTOM);return u.params.x=t,u.params.y=i,u.params.width=r,u.params.height=n,u.params.shader=o,u.params.uniforms=h,a.J(u.state),u.id}Ns(t,i,r,n,o,h){const a=this.Gs(w.LINE);return a.params.x1=t,a.params.y1=i,a.params.x2=r,a.params.y2=n,a.params.thickness=o,h.J(a.state),a.id}Xs(t,i,r,n,o){const h=this.Gs(w.ELLIPSE);return h.params.x=t,h.params.y=i,h.params.width=r,h.params.height=n,o.J(h.state),h.id}Ws(t,i,r,n,o,h,a){const u=this.Gs(w.ARC);return u.params.x=t,u.params.y=i,u.params.width=r,u.params.height=n,u.params.start=o,u.params.stop=h,a.J(u.state),u.id}Ks(t,i,r,n,o,h,a){const u=this.Gs(w.TRIANGLE);return u.params.x1=t,u.params.y1=i,u.params.x2=r,u.params.y2=n,u.params.x3=o,u.params.y3=h,a.J(u.state),u.id}js(t,i,r,n,o,h,a,u,f,g){const d=this.Gs(w.BEZIER_CURVE);return d.params.x1=t,d.params.y1=i,d.params.cp1x=r,d.params.cp1y=n,d.params.cp2x=o,d.params.cp2y=h,d.params.x2=a,d.params.y2=u,d.params.thickness=f,g.J(d.state),d.id}get length(){return this.Ls}get isEmpty(){return this.Ls===0}Ys(){this.Ls=0}[Symbol.iterator](){let t=0;const i=this.Ls,r=this.Bs;return{next:()=>t<i?{value:r[t++],done:!1}:{value:void 0,done:!0}}}}const _=class _{static Vs(t,i,r=0){var h,a,u,f,g,d,p,y,A,m;const n=i||new Float32Array(_.FLOATS_PER_INSTANCE);let o=r;return n[o++]=t.fs[0],n[o++]=t.fs[1],n[o++]=t.Ls[0],n[o++]=t.Ls[1],n[o++]=t.Y[0],n[o++]=t.Y[1],n[o++]=t.Y[2],n[o++]=t.V[0],n[o++]=t.V[1],n[o++]=t.V[2],n[o++]=t.V[3],n[o++]=t.q[0],n[o++]=t.q[1],n[o++]=t.q[2],n[o++]=t.q[3],n[o++]=t.O[0],n[o++]=t.O[1],n[o++]=t.qs[0],n[o++]=t.qs[1],n[o++]=t.qs[2],n[o++]=t.N,n[o++]=t.X,n[o++]=t.W,n[o++]=t.Zs[0],n[o++]=t.Zs[1],n[o++]=((h=t.Qs)==null?void 0:h[0])||0,n[o++]=((a=t.Qs)==null?void 0:a[1])||0,n[o++]=((u=t.Js)==null?void 0:u[0])||0,n[o++]=((f=t.Js)==null?void 0:f[1])||0,n[o++]=((g=t.te)==null?void 0:g[0])||0,n[o++]=((d=t.te)==null?void 0:d[1])||0,n[o++]=((p=t.se)==null?void 0:p[0])||0,n[o++]=((y=t.se)==null?void 0:y[1])||0,n[o++]=((A=t.ee)==null?void 0:A[0])||0,n[o++]=((m=t.ee)==null?void 0:m[1])||0,n}static ie(t){const i=t.length*_.FLOATS_PER_INSTANCE,r=new Float32Array(i);for(let n=0;n<t.length;n++){const o=n*_.FLOATS_PER_INSTANCE;_.Vs(t[n],r,o)}return r}};c(_,"BYTES_PER_INSTANCE",140),c(_,"FLOATS_PER_INSTANCE",35);let D=_;const U=class U{};c(U,"STRIDE",D.BYTES_PER_INSTANCE),c(U,"ATTRIBUTES",{a_instancePosition:{location:-1,size:2,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:U.STRIDE,offset:0,divisor:1},a_instanceSize:{location:-1,size:2,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:U.STRIDE,offset:8,divisor:1},a_instanceCharacter:{location:-1,size:3,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:U.STRIDE,offset:16,divisor:1},a_instancePrimaryColor:{location:-1,size:4,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:U.STRIDE,offset:28,divisor:1},a_instanceSecondaryColor:{location:-1,size:4,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:U.STRIDE,offset:44,divisor:1},a_instanceRotation:{location:-1,size:2,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:U.STRIDE,offset:60,divisor:1},a_instanceTransform:{location:-1,size:3,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:U.STRIDE,offset:68,divisor:1},a_instanceGlobalRotation:{location:-1,size:3,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:U.STRIDE,offset:80,divisor:1},a_instanceRotationCenter:{location:-1,size:2,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:U.STRIDE,offset:92,divisor:1},a_instanceArcAngles:{location:-1,size:2,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:U.STRIDE,offset:100,divisor:1},a_instanceBezierCP1:{location:-1,size:2,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:U.STRIDE,offset:108,divisor:1},a_instanceBezierCP2:{location:-1,size:2,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:U.STRIDE,offset:116,divisor:1},a_instanceBezierStart:{location:-1,size:2,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:U.STRIDE,offset:124,divisor:1},a_instanceBezierEnd:{location:-1,size:2,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:U.STRIDE,offset:132,divisor:1}});let K=U;class yt{constructor(t,i=1e3,r=1.5){c(this,"gt");c(this,"re",[]);c(this,"ne");c(this,"oe");c(this,"he",null);c(this,"ae",!0);c(this,"ce",0);c(this,"le",new Map);c(this,"ue",null);this.gt=t,this.ne=i,this.oe=r,this.fe()}Es(t){const i=this.re.length;return this.re.push(t),this.ae=!0,i}get count(){return this.re.length}get isEmpty(){return this.re.length===0}clear(){this.re.length=0,this.ae=!0}de(t){if(t<=this.ne)return;const i=Math.ceil(t*this.oe);this.ne=i,this.fe()}fe(){const t=this.gt;this.he&&t.deleteBuffer(this.he),this.he=t.createBuffer();const i=this.ne*D.BYTES_PER_INSTANCE;t.bindBuffer(t.ARRAY_BUFFER,this.he),t.bufferData(t.ARRAY_BUFFER,i,t.DYNAMIC_DRAW),t.bindBuffer(t.ARRAY_BUFFER,null),this.ae=!0,this.ce=0}_e(){if(!this.ae||this.re.length===0)return;const t=this.gt,i=this.re.length;this.de(i),(!this.ue||this.ue.length<i*D.FLOATS_PER_INSTANCE)&&(this.ue=new Float32Array(i*D.FLOATS_PER_INSTANCE));const r=D.ie(this.re);t.bindBuffer(t.ARRAY_BUFFER,this.he),i<=this.ce?t.bufferSubData(t.ARRAY_BUFFER,0,r):t.bufferData(t.ARRAY_BUFFER,r,t.DYNAMIC_DRAW),t.bindBuffer(t.ARRAY_BUFFER,null),this.ae=!1,this.ce=i}pe(t){let i=this.le.get(t);if(!i){i=new Map;const r=this.gt;for(const n in K.ATTRIBUTES){const o=r.getAttribLocation(t,n);o!==-1&&i.set(n,o)}this.le.set(t,i)}return i}Ms(t){if(!this.he||this.re.length===0)return;const i=this.gt,r=t.Zt;this._e();const n=this.pe(r);i.bindBuffer(i.ARRAY_BUFFER,this.he);for(const[o,h]of n){const a=K.ATTRIBUTES[o];a&&(i.enableVertexAttribArray(h),i.vertexAttribPointer(h,a.size,a.type,a.normalized,a.stride,a.offset),i.vertexAttribDivisor(h,a.divisor))}}Ts(t){const i=this.gt,r=this.pe(t.Zt);for(const[,n]of r)i.disableVertexAttribArray(n),i.vertexAttribDivisor(n,0)}Fs(t,i){this.re.length!==0&&this.gt.drawArraysInstanced(t,0,i,this.re.length)}Dt(){this.he&&this.gt.deleteBuffer(this.he)}}class G{constructor(t,i,r,n){c(this,"gt");c(this,"ve");c(this,"me");c(this,"ge");c(this,"Ae",null);this.gt=t,this.ve=i,this.me=r,this.ge=n;const o=this.gt.createBuffer();if(!o)throw Error("Failed to create unit geometry buffer");this.gt.bindBuffer(this.gt.ARRAY_BUFFER,o),this.gt.bufferData(this.gt.ARRAY_BUFFER,this.ge.ye,this.gt.STATIC_DRAW),this.gt.bindBuffer(this.gt.ARRAY_BUFFER,null),this.Ae=o}get type(){return this.me}get unitGeometry(){return this.ge}get unitBuffer(){return this.Ae}get batch(){return this.ve}Ps(){this.ve.clear()}bs(){return!this.ve.isEmpty}Dt(){this.ve.Dt(),this.gt.deleteBuffer(this.Ae)}Ce(t,i,r,n,o){const h=this.we(t,i,r,n,o.N||0,o.X||0,o.W||0);return{fs:[t,i],Ls:[r,n],Y:o.Y||[0,0,0],V:o.V||[1,1,1,1],q:o.q||[0,0,0,1],O:o.O||[0,0],qs:[o.k?1:0,o.K?1:0,o.j?1:0],N:h.radiansX,X:h.radiansY,W:h.radiansZ,Zs:[h.centerX,h.centerY]}}be(t,i){const r=V(this.gt)||[0,0,this.gt.canvas.width,this.gt.canvas.height];return{nx:t/r[2]*2-1,ny:1-i/r[3]*2}}xe(t,i,r){const n=this.be(i,r);t.Zs=[n.nx,n.ny]}we(t,i,r,n,o,h,a){const u=V(this.gt)||[0,0,this.gt.canvas.width,this.gt.canvas.height],f=u[2],g=u[3];return{centerX:(t+r/2)/f*2-1,centerY:1-(i+n/2)/g*2,radiansX:-o*Math.PI/180,radiansY:-h*Math.PI/180,radiansZ:-a*Math.PI/180,aspectRatio:f/g}}}const Et={ye:new Float32Array([0,0,0,0,1,0,1,0,0,1,0,1,0,1,0,1,1,0,1,0,1,1,1,1]),Rs:6,zs:WebGL2RenderingContext.TRIANGLES,_s:16,ds:{fs:{size:2,offset:0},ps:{size:2,offset:8}}};class xt extends G{constructor(t,i){super(t,i,w.RECTANGLE,Et)}Es(t,i){const r=this.Ce(t.x,t.y,t.width,t.height,i);return this.ve.Es(r)}}const wt={ye:new Float32Array([0,-.5,0,0,1,-.5,1,0,0,.5,0,1,0,.5,0,1,1,-.5,1,0,1,.5,1,1]),Rs:6,zs:WebGL2RenderingContext.TRIANGLES,_s:16,ds:{fs:{size:2,offset:0},ps:{size:2,offset:8}}};class Tt extends G{constructor(t,i){super(t,i,w.LINE,wt)}Es(t,i){const r=t.x2-t.x1,n=t.y2-t.y1,o=Math.hypot(r,n),h=t.thickness||i.I||1,a=t.x1+r/2,u=t.y1+n/2,f=a-o/2,g=u,d=this.Ce(f,g,o,h,i);return this.xe(d,a,u),this.ve.Es(d)}}const Rt={ye:function(l=32){const t=[],i=2*Math.PI/l;for(let r=0;r<l;r++){const n=r*i,o=(r+1)%l*i,h=Math.cos(n),a=Math.sin(n),u=.5*(h+1),f=.5*(a+1),g=Math.cos(o),d=Math.sin(o),p=.5*(g+1),y=.5*(d+1);t.push(0,0,.5,.5,h,a,u,f,g,d,p,y)}return new Float32Array(t)}(32),Rs:96,zs:WebGL2RenderingContext.TRIANGLES,_s:16,ds:{fs:{size:2,offset:0},ps:{size:2,offset:8}}};class bt extends G{constructor(t,i){super(t,i,w.ELLIPSE,Rt)}Es(t,i){const r=this.Ce(t.x,t.y,t.width,t.height,i);return this.xe(r,t.x,t.y),this.ve.Es(r)}}let Ct={ye:function(l){const t=[];for(let i=0;i<l;i++){const r=i/l,n=(i+1)/l;t.push(r,0,r,0,r,1,r,1,n,1,n,1)}return new Float32Array(t)}(32),Rs:96,zs:WebGL2RenderingContext.TRIANGLES,_s:16,ds:{fs:{size:2,offset:0},ps:{size:2,offset:8}}};class Ut extends G{constructor(t,i){super(t,i,w.ARC,Ct)}Es(t,i){const r=t.x-t.width/2,n=t.y-t.height/2,o=t.start*Math.PI/180,h=t.stop*Math.PI/180,a=this.Ce(r,n,t.width,t.height,i);return this.xe(a,t.x,t.y),a.Qs=[o,h],this.ve.Es(a)}}const Ft={ye:new Float32Array([0,0,0,0,1,0,1,0,.5,1,.5,1]),Rs:3,zs:WebGL2RenderingContext.TRIANGLES,_s:16,ds:{fs:{size:2,offset:0},ps:{size:2,offset:8}}};class Bt extends G{constructor(t,i){super(t,i,w.TRIANGLE,Ft)}Es(t,i){const r=Math.min(t.x1,t.x2,t.x3),n=Math.max(t.x1,t.x2,t.x3),o=Math.min(t.y1,t.y2,t.y3),h=n-r,a=Math.max(t.y1,t.y2,t.y3)-o,u=this.Ce(r,o,h,a,i),f=r+.5*h,g=o+a*(1/3);return this.xe(u,f,g),this.ve.Es(u)}}function nt(l,t,i,r,n){const o=1-l,h=o*o,a=l*l;return h*o*t+3*h*l*i+3*o*a*r+a*l*n}const Pt={ye:function(l=16){const t=[];for(let i=0;i<l;i++){const r=i/l,n=(i+1)/l;t.push(r,-.5,r,0),t.push(n,-.5,n,0),t.push(r,.5,r,1),t.push(r,.5,r,1),t.push(n,-.5,n,0),t.push(n,.5,n,1)}return new Float32Array(t)}(16),Rs:96,zs:WebGL2RenderingContext.TRIANGLES,_s:16,ds:{fs:{size:2,offset:0},ps:{size:2,offset:8}}};class Lt extends G{constructor(t,i){super(t,i,w.BEZIER_CURVE,Pt)}Es(t,i){const r=i.I||1,n=nt(.5,t.x1,t.cp1x,t.cp2x,t.x2),o=nt(.5,t.y1,t.cp1y,t.cp2y,t.y2),h=this.Ce(0,0,1,r,i);return this.xe(h,n,o),h.se=[t.x1,t.y1],h.Js=[t.cp1x,t.cp1y],h.te=[t.cp2x,t.cp2y],h.ee=[t.x2,t.y2],this.ve.Es(h)}}class Ot{constructor(t){c(this,"gt");c(this,"Me",null);c(this,"Fe");c(this,"ze",null);c(this,"Re",{});c(this,"Te",null);c(this,"Pe",new Map);c(this,"Se");c(this,"Ee");c(this,"$e");c(this,"G",[]);this.gt=t,this.Fe=new mt(t),this.$e=new st,this.Se=new pt(t,this),this.Ee=new vt,this.Te=t.createBuffer(),k(this.gt,[0,0,this.gt.canvas.width,this.gt.canvas.height])}De(t){let i=this.Pe.get(t);if(i)return i;const r=new yt(this.gt);return i=(0,{[w.RECTANGLE]:()=>new xt(this.gt,r),[w.LINE]:()=>new Tt(this.gt,r),[w.ELLIPSE]:()=>new bt(this.gt,r),[w.ARC]:()=>new Ut(this.gt,r),[w.TRIANGLE]:()=>new Bt(this.gt,r),[w.BEZIER_CURVE]:()=>new Lt(this.gt,r)}[t])(),this.Pe.set(t,i),i}ke(t){this.Me!==t&&(this.Me=t,t.Nt())}cs(t,i){return this.Fe.cs(t,i)}es(){return this.Fe.es()}Pt(){return this.Fe.Pt()}rs(){return this.Fe.rs()}ns(){return this.Fe.ns()}Be(t){this.ze=t,t&&(this.Re={})}Kt(t,i){this.Re[t]=i}Oe(t){Object.assign(this.Re,t)}hs(t){return this.Fe.hs(t)}Le(t,i,r,n,o){const h=this.es(),a={Ue:t.textures[0],Uf:t.textures[1],Ug:t.textures[2],Uh:t.textures[3],Ui:t.textures[4],Uj:[t.width,t.height]};this.Ee.Is(i,r,n,o,h,a,this.$e)}Ge(t,i,r,n,o){const h=this.ns(),a=t.He(),u={Uk:a.texture,Ul:!!a.invert,Um:!!a.flipX,Un:!!a.flipY,Uo:a.charRotation,Up:a.charColorFixed,Uq:a.charColor,Ur:a.cellColorFixed,Us:a.cellColor,Ut:a.backgroundColor,Uu:a.charCount,Uv:a.charList};this.Ee.Is(i,r,n,o,h,u,this.$e)}Ie(t,i,r,n){var m;const o=this.gt,h=o.canvas.width,a=o.canvas.height,u=t/h*2-1,f=(t+r)/h*2-1,g=1-i/a*2,d=1-(i+n)/a*2,p=new Float32Array([u,d,f,d,u,g,f,d,f,g,u,g]);o.bindBuffer(o.ARRAY_BUFFER,this.Te),o.bufferData(o.ARRAY_BUFFER,p,o.DYNAMIC_DRAW);const y=((m=this.Me)==null?void 0:m.Zt)||o.getParameter(o.CURRENT_PROGRAM),A=y?o.getAttribLocation(y,"a_position"):-1;A!==-1&&(o.enableVertexAttribArray(A),o.vertexAttribPointer(A,2,o.FLOAT,!1,8,0)),o.drawArrays(o.TRIANGLES,0,6),A!==-1&&o.disableVertexAttribArray(A)}Ne(t,i,r,n){this.ze?(this.Ee.Is(t,i,r,n,this.ze,{...this.Re},this.$e),this.ze=null,this.Re={}):this.Ee.Hs(t,i,r,n,this.$e)}Xe(t,i,r,n){this.Ee.Ns(t,i,r,n,this.$e.lineWeight,this.$e)}We(t,i,r,n){this.Ee.Xs(t,i,r,n,this.$e)}Ke(t,i,r,n,o,h){this.Ee.Ks(t,i,r,n,o,h,this.$e)}je(t,i,r,n,o,h,a,u){const f=this.$e.lineWeight;this.Ee.js(t,i,r,n,o,h,a,u,f,this.$e)}Ye(t,i,r=1,n={}){return new j(this.gt,t,i,r,n,this,!0)}Ve(t,i,r,n,o,h){this.Ee.Ws(t,i,r,n,o,h,this.$e)}qe(t,i=t,r=t,n=255){this.$e.ft(t,i,r,n),this.Ys(t/255,i/255,r/255,n/255)}Ys(t=0,i=0,r=0,n=0){this.gt.clearColor(t,i,r,n),this.gt.clear(this.gt.COLOR_BUFFER_BIT)}Ze(){this.gt.viewport(0,0,this.gt.canvas.width,this.gt.canvas.height),k(this.gt,[0,0,this.gt.canvas.width,this.gt.canvas.height])}get context(){return this.gt}get state(){return this.$e}Et(t){this.G.push(this.$e),this.$e=t}$t(){const t=this.G.pop();t&&(this.$e=t)}St(t){const i=t,r=V(this.gt)??this.gt.getParameter(this.gt.VIEWPORT),n={shader:i,gl:this.gt,viewport:r};this.ke(i);const o=new Set;for(const h of this.Ee)h.type===w.CUSTOM?o.add(w.RECTANGLE):o.add(h.type);for(const h of o)h!==w.CUSTOM&&this.De(h);this.Se.ws(n,this.Ee,this.Pe),this.Ee.Ys()}Dt(){this.gt.deleteBuffer(this.Te),this.Ee.Ys();for(const t of this.Pe.values())t.Dt();this.Fe.Dt(),this.Se.Dt()}}const C={readShort:(l,t)=>(C.t.uint16[0]=l[t]<<8|l[t+1],C.t.int16[0]),readUshort:(l,t)=>l[t]<<8|l[t+1],readUshorts(l,t,i){const r=[];for(let n=0;n<i;n++)r.push(C.readUshort(l,t+2*n));return r},readUint(l,t){const i=C.t.uint8;return i[3]=l[t],i[2]=l[t+1],i[1]=l[t+2],i[0]=l[t+3],C.t.uint32[0]},readASCII(l,t,i){let r="";for(let n=0;n<i;n++)r+=String.fromCharCode(l[t+n]);return r},writeUshort(l,t,i){l[t]=i>>>8&255,l[t+1]=255&i},writeUint(l,t,i){l[t]=i>>>24&255,l[t+1]=i>>>16&255,l[t+2]=i>>>8&255,l[t+3]=255&i},writeASCII(l,t,i){for(let r=0;r<i.length;r++)l[t+r]=255&i.charCodeAt(r)},t:(()=>{const l=new ArrayBuffer(8);return{uint8:new Uint8Array(l),int16:new Int16Array(l),uint16:new Uint16Array(l),uint32:new Uint32Array(l)}})()};function Z(l){return l+3&-4}function $(l,t,i){const r=t+i;let n=0;const o=C.t;for(let h=t;h<r;h+=4)o.uint8[3]=l[h]||0,o.uint8[2]=l[h+1]||0,o.uint8[1]=l[h+2]||0,o.uint8[0]=l[h+3]||0,n=n+(o.uint32[0]>>>0)>>>0;return n>>>0}class Mt{constructor(t){c(this,"b");c(this,"p",0);c(this,"bitbuf",0);c(this,"bitcnt",0);this.b=t}readBits(t){for(;this.bitcnt<t;){const r=this.b[this.p++]||0;this.bitbuf|=r<<this.bitcnt,this.bitcnt+=8}const i=this.bitbuf&(1<<t)-1;return this.bitbuf>>>=t,this.bitcnt-=t,i}alignToByte(){this.bitbuf=0,this.bitcnt=0}get offset(){return this.p}}function W(l){let t=32,i=0;for(const a of l)a&&(a<t&&(t=a),a>i&&(i=a));if(i===0)return{min:0,max:0,table:new Map};const r=new Uint32Array(i+1);for(const a of l)a&&r[a]++;const n=new Uint32Array(i+1);let o=0;r[0]=0;for(let a=1;a<=i;a++)o=o+r[a-1]<<1,n[a]=o;const h=new Map;for(let a=0;a<l.length;a++){const u=l[a];if(!u)continue;const f=n[u]++;let g=h.get(u);g||(g=[],h.set(u,g)),g[_t(f,u)]=a}return{min:t,max:i,table:h}}function tt(l,t){let i=0;for(let r=1;r<=t.max;r++){i|=l.readBits(1)<<r-1;const n=t.table.get(r);if(n&&i<n.length){const o=n[i];if(o!==void 0)return o}}throw Error("Invalid Huffman code")}function _t(l,t){let i=0;for(let r=0;r<t;r++)i=i<<1|1&l,l>>>=1;return i>>>0}function St(l){if(l.length<2)throw Error("ZLIB data too short");const t=l[0],i=l[1];if((15&t)!=8)throw Error("Unsupported ZLIB compression method");if(((t<<8)+i)%31!=0)throw Error("Bad ZLIB header check");let r=2;32&i&&(r+=4);const n=[];return function(o,h){const a=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258],u=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],f=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577],g=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13];let d=0;for(;!d;){d=o.readBits(1);const p=o.readBits(2);if(p===0){o.alignToByte();const y=o.readBits(16);if((65535&(65535^y))!==o.readBits(16))throw Error("DEFLATE uncompressed LEN/NLEN mismatch");for(let A=0;A<y;A++)h.push(o.readBits(8))}else{if(p!==1&&p!==2)throw Error("Unsupported DEFLATE type");{let y,A;if(p===1){const m=Array(288).fill(0);for(let E=0;E<=143;E++)m[E]=8;for(let E=144;E<=255;E++)m[E]=9;for(let E=256;E<=279;E++)m[E]=7;for(let E=280;E<=287;E++)m[E]=8;y=W(m),A=W(Array(32).fill(5))}else{const m=o.readBits(5)+257,E=o.readBits(5)+1,v=o.readBits(4)+4,T=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],x=Array(19).fill(0);for(let L=0;L<v;L++)x[T[L]]=o.readBits(3);const P=W(x),F=[];for(;F.length<m+E;){const L=tt(o,P);if(L<=15)F.push(L);else if(L===16){const H=o.readBits(2)+3,z=F[F.length-1]||0;for(let gt=0;gt<H;gt++)F.push(z)}else if(L===17){const H=o.readBits(3)+3;for(let z=0;z<H;z++)F.push(0)}else{if(L!==18)throw Error("Invalid code length symbol");{const H=o.readBits(7)+11;for(let z=0;z<H;z++)F.push(0)}}}const B=F.slice(0,m),O=F.slice(m,m+E);y=W(B),A=W(O)}for(;;){const m=tt(o,y);if(m<256)h.push(m);else{if(m===256)break;if(m>256&&m<286){const E=m-257;let v=a[E];const T=u[E];T&&(v+=o.readBits(T));const x=tt(o,A);if(x>=30)throw Error("Invalid distance symbol");let P=f[x];const F=g[x];F&&(P+=o.readBits(F));const B=h.length-P;if(B<0)throw Error("Invalid distance");for(let O=0;O<v;O++)h.push(h[B+O]||0)}else if(m===286||m===287)throw Error("Reserved length symbol")}}}}}}(new Mt(l.subarray(r)),n),new Uint8Array(n)}function Dt(l){const t=C,i=new Uint8Array(l);if(t.readASCII(i,0,4)!=="wOFF")throw Error("Invalid WOFF signature");const r=t.readUint(i,4),n=t.readUshort(i,12),o=t.readUint(i,16),h=[];let a=44;for(let v=0;v<n;v++){const T=t.readASCII(i,a,4),x=t.readUint(i,a+4),P=t.readUint(i,a+8),F=t.readUint(i,a+12),B=t.readUint(i,a+16);h.push({tag:T,offset:x,compLength:P,origLength:F,checksum:B}),a+=20}for(const v of h){const T=new Uint8Array(i.buffer,v.offset,v.compLength);if(v.compLength===v.origLength)v.data=new Uint8Array(T);else if(v.data=St(T),v.data.length!==v.origLength)if(v.data.length<v.origLength){const x=new Uint8Array(v.origLength);x.set(v.data),v.data=x}else v.data=v.data.subarray(0,v.origLength)}const u=n;let f=1,g=0;for(;f<<1<=u;)f<<=1,g++;const d=16*f,p=16*u-d;let y=12+16*u;const A={};for(const v of h)A[v.tag]=y,y=Z(y+v.data.length);const m=new Uint8Array(Math.max(o||0,y));t.writeUint(m,0,r),t.writeUshort(m,4,u),t.writeUshort(m,6,d),t.writeUshort(m,8,g),t.writeUshort(m,10,p);let E=12;for(const v of h){t.writeASCII(m,E,v.tag),E+=4;let T=v.data;if(v.tag==="head"&&T.length>=12){const x=new Uint8Array(T);t.writeUint(x,8,0);const P=$(x,0,Z(x.length));t.writeUint(m,E,P),E+=4}else{const x=$(T,0,Z(T.length));t.writeUint(m,E,x),E+=4}t.writeUint(m,E,A[v.tag]),E+=4,t.writeUint(m,E,v.data.length),E+=4}for(const v of h){const T=A[v.tag];m.set(v.data,T)}if(h.find(v=>v.tag==="head")){const v=A.head,T=function(x,P){const F=C,B=P+8,O=[x[B],x[B+1],x[B+2],x[B+3]];F.writeUint(x,B,0);const L=2981146554-($(x,0,Z(x.length))>>>0)>>>0;return x[B]=O[0],x[B+1]=O[1],x[B+2]=O[2],x[B+3]=O[3],L>>>0}(m,v);t.writeUint(m,v+8,T)}return m.buffer}const It={parseTab(l,t,i){const r={tables:[],ids:{},off:t};l=new Uint8Array(l.buffer,t,i),t=0;const n=C,o=n.readUshort,h=o(l,t+=2);t+=2;const a=[];for(let u=0;u<h;u++){const f=o(l,t),g=o(l,t+=2);t+=2;const d=n.readUint(l,t);t+=4;const p=`p${f}e${g}`;let y=a.indexOf(d);if(y===-1){let A;y=r.tables.length,a.push(d);const m=o(l,d);A=m===4?this.parse4(l,d):m===12?this.parse12(l,d):{format:m},r.tables.push(A)}r.ids[p]=y}return r},parse4(l,t){const i=C,r=i.readUshort,n=i.readUshorts,o=t,h=r(l,t+=2);t+=2;const a=r(l,t+=2)>>>1,u={format:4,searchRange:r(l,t+=2),entrySelector:0,rangeShift:0,endCount:[],startCount:[],idDelta:[],idRangeOffset:[],glyphIdArray:[]};t+=2,u.entrySelector=r(l,t),t+=2,u.rangeShift=r(l,t),t+=2,u.endCount=n(l,t,a),t+=2*a,t+=2,u.startCount=n(l,t,a),t+=2*a;for(let f=0;f<a;f++)u.idDelta.push(i.readShort(l,t)),t+=2;return u.idRangeOffset=n(l,t,a),t+=2*a,u.glyphIdArray=n(l,t,o+h-t>>1),u},parse12(l,t){const i=C.readUint;i(l,t+=4),i(l,t+=4);const r=i(l,t+=4);t+=4;const n=new Uint32Array(3*r);for(let o=0;o<3*r;o+=3)n[o]=i(l,t+(o<<2)),n[o+1]=i(l,t+(o<<2)+4),n[o+2]=i(l,t+(o<<2)+8);return{format:12,groups:n}}},zt={parseTab(l,t,i){const r=C;t+=18;const n=r.readUshort(l,t);t+=2,t+=16;const o=r.readShort(l,t);t+=2;const h=r.readShort(l,t);t+=2;const a=r.readShort(l,t);t+=2;const u=r.readShort(l,t);return t+=2,t+=6,{unitsPerEm:n,xMin:o,yMin:h,xMax:a,yMax:u,indexToLocFormat:r.readShort(l,t)}}},Nt={parseTab(l,t,i){const r=C;t+=4;const n=["ascender","descender","lineGap","advanceWidthMax","minLeftSideBearing","minRightSideBearing","xMaxExtent","caretSlopeRise","caretSlopeRun","caretOffset","res0","res1","res2","res3","metricDataFormat","numberOfHMetrics"],o={};for(let h=0;h<n.length;h++){const a=n[h],u=a==="advanceWidthMax"||a==="numberOfHMetrics"?r.readUshort:r.readShort;o[a]=u(l,t+2*h)}return o}},Gt={parseTab(l,t,i,r){const n=C,o=[],h=[],a=r.maxp.numGlyphs,u=r.hhea.numberOfHMetrics;let f=0,g=0,d=0;for(;d<u;)f=n.readUshort(l,t+(d<<2)),g=n.readShort(l,t+(d<<2)+2),o.push(f),h.push(g),d++;for(;d<a;)o.push(f),h.push(g),d++;return{aWidth:o,lsBearing:h}}},ot={cmap:It,head:zt,hhea:Nt,maxp:{parseTab(l,t,i){const r=C;return r.readUint(l,t),t+=4,{numGlyphs:r.readUshort(l,t)}}},hmtx:Gt,loca:{parseTab(l,t,i,r){const n=C,o=[],h=r.head.indexToLocFormat,a=r.maxp.numGlyphs+1;if(h===0)for(let u=0;u<a;u++)o.push(n.readUshort(l,t+(u<<1))<<1);else if(h===1)for(let u=0;u<a;u++)o.push(n.readUint(l,t+(u<<2)));return o}},glyf:{parseTab(l,t,i,r){const n=[],o=r.maxp.numGlyphs;for(let h=0;h<o;h++)n.push(null);return n},Qe(l,t){const i=C,r=l.Je,n=l.loca;if(n[t]===n[t+1])return null;const o=M.findTable(r,"glyf",l.ti);if(!o)return null;let h=o[0]+n[t];const a={};if(a.noc=i.readShort(r,h),h+=2,a.xMin=i.readShort(r,h),h+=2,a.yMin=i.readShort(r,h),h+=2,a.xMax=i.readShort(r,h),h+=2,a.yMax=i.readShort(r,h),h+=2,a.xMin>=a.xMax||a.yMin>=a.yMax)return null;if(a.noc>0){a.endPts=[];for(let p=0;p<a.noc;p++)a.endPts.push(i.readUshort(r,h)),h+=2;const u=i.readUshort(r,h);if(h+=2,r.length-h<u)return null;h+=u;const f=a.endPts[a.noc-1]+1;a.flags=[];for(let p=0;p<f;p++){const y=r[h];if(h++,a.flags.push(y),8&y){const A=r[h];h++;for(let m=0;m<A;m++)a.flags.push(y),p++}}a.xs=[];for(let p=0;p<f;p++){const y=a.flags[p],A=!!(16&y);2&y?(a.xs.push(A?r[h]:-r[h]),h++):A?a.xs.push(0):(a.xs.push(i.readShort(r,h)),h+=2)}a.ys=[];for(let p=0;p<f;p++){const y=a.flags[p],A=!!(32&y);4&y?(a.ys.push(A?r[h]:-r[h]),h++):A?a.ys.push(0):(a.ys.push(i.readShort(r,h)),h+=2)}let g=0,d=0;for(let p=0;p<f;p++)g+=a.xs[p],d+=a.ys[p],a.xs[p]=g,a.ys[p]=d}else a.parts=[],a.endPts=[],a.flags=[],a.xs=[],a.ys=[];return a}}},M={parse(l){const t=new Uint8Array(l),i=C.readASCII(t,0,4);if(i==="wOFF")l=Dt(l);else if(i==="wOF2")throw Error("WOFF2 is not supported in this build (Brotli + WOFF2 transforms required)");return[((r,n,o,h)=>{const a=ot,u={Je:r,si:n,ti:o};for(const f in a){const g=f,d=M.findTable(r,g,o);if(d){const[p,y]=d;let A=h[p];A==null&&(A=a[g].parseTab(r,p,y,u),h[p]=A),u[g]=A}}return u})(new Uint8Array(l),0,0,{})]},findTable(l,t,i){const r=C,n=r.readUshort(l,i+4);let o=i+12;for(let h=0;h<n;h++){const a=r.readASCII(l,o,4);r.readUint(l,o+4);const u=r.readUint(l,o+8),f=r.readUint(l,o+12);if(a===t)return[u,f];o+=16}return null},T:ot,B:C};class Yt{ei(t){var r;const i=[];return(r=t.cmap)!=null&&r.tables?(t.cmap.tables.forEach(n=>{if(n.format===4){const o=this.ii(n);i.push(...o)}else if(n.format===12){const o=this.ri(n);i.push(...o)}}),[...new Set(i)]):[]}ni(t){return t.filter(i=>this.oi(i))}ii(t){const i=[];if(!(t.startCount&&t.endCount&&t.idRangeOffset&&t.idDelta))return i;for(let r=0;r<t.startCount.length;r++){const n=t.startCount[r],o=t.endCount[r];if(n!==65535||o!==65535){for(let h=n;h<=o;h++)if(this.hi(t,h,r)>0)try{const a=String.fromCodePoint(h);i.push(a)}catch{}}}return i}ri(t){const i=[];if(!t.groups)return i;for(let r=0;r<t.groups.length;r+=3){const n=t.groups[r],o=t.groups[r+1],h=t.groups[r+2];for(let a=n;a<=o;a++)if(h+(a-n)>0)try{const u=String.fromCodePoint(a);i.push(u)}catch{}}return i}hi(t,i,r){if(t.idRangeOffset[r]===0)return i+t.idDelta[r]&65535;{const n=t.idRangeOffset[r]/2+(i-t.startCount[r])-(t.startCount.length-r);if(n>=0&&t.glyphIdArray&&n<t.glyphIdArray.length){const o=t.glyphIdArray[n];if(o!==0)return o+t.idDelta[r]&65535}}return 0}oi(t){const i=t.codePointAt(0)||0;return!(i>=0&&i<=31&&i!==9&&i!==10&&i!==13||i>=127&&i<=159)}}class et{constructor(){c(this,"ai",new Map);c(this,"ci",new Map)}li(t,i){const r=`${this.ui(t)}_${i}`;if(this.ai.has(r))return this.ai.get(r);const n=t.cmap;if(!n||!n.tables)return this.ai.set(r,0),0;let o=0;for(const h of n.tables)if(h.format===4?o=this.fi(i,h):h.format===12&&(o=this.di(i,h)),o>0)break;return this.ai.set(r,o),o}_i(t,i){const r=i.codePointAt(0);return r===void 0?0:this.li(t,r)}pi(t,i){const r=t.hmtx;return r&&r.aWidth&&r.aWidth.length!==0?i<r.aWidth.length?r.aWidth[i]:r.aWidth[r.aWidth.length-1]:0}mi(t,i){const r=i/t.head.unitsPerEm,n=t.hhea.ascender*r,o=t.hhea.descender*r,h=t.hhea.lineGap*r;return{ascender:n,descender:o,lineGap:h,lineHeight:n-o+h,unitsPerEm:t.head.unitsPerEm,scale:r}}gi(){this.ai.clear(),this.ci.clear()}ui(t){return`${t.ti}_${t.Je.length}`}fi(t,i){const r=i.endCount.length;let n=-1;for(let o=0;o<r;o++)if(t<=i.endCount[o]){n=o;break}if(n===-1||t<i.startCount[n])return 0;if(i.idRangeOffset[n]===0)return t+i.idDelta[n]&65535;{const o=i.idRangeOffset[n]/2+(t-i.startCount[n])-(r-n);if(o>=0&&o<i.glyphIdArray.length){const h=i.glyphIdArray[o];return h===0?0:h+i.idDelta[n]&65535}}return 0}di(t,i){const r=i.groups.length/3;for(let n=0;n<r;n++){const o=i.groups[3*n],h=i.groups[3*n+1],a=i.groups[3*n+2];if(t>=o&&t<=h)return a+(t-o)}return 0}}class Xt{constructor(t){c(this,"Ai");c(this,"yi");c(this,"xt");c(this,"Ci");this.xt=t,this.Ci=new et,this.Ai=document.createElement("canvas"),this.yi=this.Ai.getContext("2d",{willReadFrequently:!0,alpha:!0})}createTextureAtlas(t,i,r,n){const o=t.length,h=Math.ceil(Math.sqrt(o)),a=Math.ceil(o/h),u=i.width*h,f=i.height*a,g=typeof n=="object"?n:null;this.wi(u,f),this.bi(t,i,h,r,g);const d=this.xt.Ye(u,f,1,{filter:"nearest"});return d.Tt(this.Ai),{framebuffer:d,columns:h,rows:a}}wi(t,i){this.Ai.width=t,this.Ai.height=i,this.Ai.style.width=t+"px",this.Ai.style.height=i+"px",this.yi.imageSmoothingEnabled=!1,this.Ai.style.imageRendering="pixelated",this.yi.clearRect(0,0,t,i),this.yi.textBaseline="top",this.yi.textAlign="left",this.yi.fillStyle="white"}bi(t,i,r,n,o){const h=n/o.head.unitsPerEm;for(let a=0;a<t.length;a++){const u=a%r,f=Math.floor(a/r),g=t[a].character,d=this.xi(o,g);if(!d)continue;const p=g.codePointAt(0)||0,y=this.Ci.li(o,p),A=this.Mi(o,y)*h,m=u*i.width,E=f*i.height,v=m+.5*i.width,T=E+.5*i.height,x=Math.round(v-.5*i.width),P=Math.round(T-.5*n),F=x+.5*(i.width-A),B=P+o.hhea.ascender*h;this.Fi(d,F,B,h)}}xi(t,i){const r=i.codePointAt(0)||0,n=this.Ci.li(t,r);if(n===0)return null;if(t.glyf&&t.glyf[n]!==null)return t.glyf[n];if(M&&M.T&&M.T.glyf){const o=M.T.glyf.Qe(t,n);return t.glyf&&o&&(t.glyf[n]=o),o}return null}Mi(t,i){const r=t.hmtx;return r&&r.aWidth?i<r.aWidth.length?r.aWidth[i]:r.aWidth[r.aWidth.length-1]:0}Fi(t,i,r,n){if(!t||!t.xs||t.noc===0)return;const{xs:o,ys:h,endPts:a,flags:u}=t;if(!(o&&h&&a&&u))return;this.yi.beginPath();let f=0;for(let g=0;g<a.length;g++){const d=a[g];if(!(d<f)){if(d>=f){const p=i+o[f]*n,y=r-h[f]*n;this.yi.moveTo(p,y);let A=f+1;for(;A<=d;)if(1&u[A]){const m=i+o[A]*n,E=r-h[A]*n;this.yi.lineTo(m,E),A++}else{const m=i+o[A]*n,E=r-h[A]*n;let v=A+1>d?f:A+1;if(1&u[v]){const T=i+o[v]*n,x=r-h[v]*n;this.yi.quadraticCurveTo(m,E,T,x),A=v+1}else{const T=(m+(i+o[v]*n))/2,x=(E+(r-h[v]*n))/2;this.yi.quadraticCurveTo(m,E,T,x),A=v}}this.yi.closePath()}f=d+1}}this.yi.fill()}}class Wt{constructor(){c(this,"zi");this.zi=new et}Ri(t,i,r){let n=0;const o=this.zi.mi(r,i),h=o.lineHeight;for(const a of t){const u=this.zi._i(r,a);if(u===0)continue;const f=this.zi.pi(r,u)*o.scale;n=Math.max(n,f)}return{width:Math.ceil(n),height:Math.ceil(h)}}gi(){this.zi.gi()}}class Ht{constructor(){c(this,"Ci");this.Ci=new et}createCharacterObjects(t,i){return t.map((r,n)=>{const o=r.codePointAt(0)||0,h=this.Ti(n);let a=0;if(i.hmtx&&i.hmtx.aWidth){const u=this.Ci.li(i,o);u>0&&i.hmtx.aWidth[u]!==void 0&&(a=i.hmtx.aWidth[u])}return{character:r,unicode:o,color:h,advanceWidth:a}})}Ti(t){return[t%256/255,Math.floor(t/256)%256/255,Math.floor(t/65536)%256/255]}Pi(t,i){if(!X.m(typeof t=="string","Character must be a string.",{method:"getCharacterColor",providedValue:t}))return[0,0,0];const r=i.find(n=>n.character===t);return r?r.color:[0,0,0]}Si(t,i){return X.m(typeof t=="string"&&t.length>0,"Characters must be a string with at least one character.",{method:"getCharacterColors",providedValue:t})?Array.from(t).map(r=>this.Pi(r,i)||[0,0,0]):[[0,0,0]]}}class ht{constructor(t,i=16){c(this,"Ei");c(this,"$i",[]);c(this,"Di");c(this,"ki",16);c(this,"Bi",0);c(this,"Oi",0);c(this,"Li",{width:0,height:0});c(this,"Gi");c(this,"Hi");c(this,"Ii");c(this,"Ni");c(this,"Xi");this.ki=i,this.Hi=new Yt,this.Ii=new Xt(t),this.Ni=new Wt,this.Xi=new Ht}async Wi(t){let i;if(t){const r=await fetch(t);if(!r.ok)throw new R(`Failed to load font file: ${r.status} ${r.statusText}`);i=await r.arrayBuffer()}else i=await(await fetch("data:font/woff;base64,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")).arrayBuffer();await this.Ki(i),this.Ei=M.parse(i)[0],await this.ji()}Yi(t){if(t===void 0)return this.ki;this.ki=t,this.Li=this.Ni.Ri(this.$i.map(r=>r.character),this.ki,this.Ei);const i=this.Ii.createTextureAtlas(this.$i,this.Li,this.ki,this.Ei);this.Di=i.framebuffer,this.Bi=i.columns,this.Oi=i.rows}async Vi(t){try{const i=await fetch(t);if(!i.ok)throw new R(`Failed to load font file: ${i.status} ${i.statusText}`);const r=await i.arrayBuffer();await this.Ki(r);const n=M.parse(r);if(!n||n.length===0)throw Error("Failed to parse font file");this.Ei=n[0],await this.ji()}catch(i){throw new R("Failed to load font: "+(i instanceof Error?i.message:"Unknown error"),i)}}async Ki(t){const i=Date.now();this.Gi=new FontFace("CustomFont_"+i,t),await this.Gi.load(),document.fonts.add(this.Gi)}async ji(){const t=this.Hi.ei(this.Ei),i=this.Hi.ni(t);this.$i=this.Xi.createCharacterObjects(i,this.Ei),this.Li=this.Ni.Ri(i,this.ki,this.Ei);const r=this.Ii.createTextureAtlas(this.$i,this.Li,this.ki,this.Ei);this.Di=r.framebuffer,this.Bi=r.columns,this.Oi=r.rows}Pi(t){return this.Xi.Pi(t,this.$i)}Si(t){return this.Xi.Si(t,this.$i)}Dt(){this.Di.Dt(),document.fonts.delete(this.Gi)}get fontFramebuffer(){return this.Di}get characters(){return this.$i}get textureColumns(){return this.Bi}get textureRows(){return this.Oi}get maxGlyphDimensions(){return this.Li}get fontSize(){return this.ki}get font(){return this.Ei}}class at{constructor(t,i,r){c(this,"qi");c(this,"Zi");c(this,"dt");c(this,"_t");c(this,"Qi");c(this,"Ji");c(this,"tr");c(this,"sr");c(this,"er");this.tr=t,this.sr=i,this.er=r,this.ir()}ir(){this.qi=Math.floor(this.tr.width/this.sr),this.Zi=Math.floor(this.tr.height/this.er),this.dt=this.qi*this.sr,this._t=this.Zi*this.er,this.Qi=Math.floor((this.tr.width-this.dt)/2),this.Ji=Math.floor((this.tr.height-this._t)/2)}rr(t,i){this.sr=t,this.er=i,this.ir()}get cellWidth(){return this.sr}get cellHeight(){return this.er}get cols(){return this.qi}get rows(){return this.Zi}get width(){return this.dt}get height(){return this._t}get offsetX(){return this.Qi}get offsetY(){return this.Ji}}class ct{constructor(t={}){c(this,"tr");c(this,"nr",null);c(this,"hr",!1);c(this,"ar");c(this,"cr");this.hr=t.overlay??!1,this.hr&&t.canvas?(this.nr=t.canvas,this.tr=this.lr(),this.cr=!0,this.ur()):t.canvas?(this.tr=t.canvas,this.cr=!1):(this.tr=this.dr(t.width,t.height),this.cr=!0),this.tr.style.imageRendering="pixelated"}dr(t,i){const r=document.createElement("canvas");return r.className="textmodeCanvas",r.style.imageRendering="pixelated",r.width=t||800,r.height=i||600,document.body.appendChild(r),r}lr(){const t=document.createElement("canvas");t.className="textmodeCanvas",t.style.imageRendering="pixelated";const i=this.nr.getBoundingClientRect();let r=Math.round(i.width),n=Math.round(i.height);if(this.nr instanceof HTMLVideoElement){const a=this.nr;(r===0||n===0)&&a.videoWidth>0&&a.videoHeight>0&&(r=a.videoWidth,n=a.videoHeight)}t.width=r,t.height=n,t.style.position="absolute",t.style.pointerEvents="none";const o=window.getComputedStyle(this.nr);let h=parseInt(o.zIndex||"0",10);return isNaN(h)&&(h=0),t.style.zIndex=""+(h+1),t}ur(){var t;this._r(),(t=this.nr.parentNode)==null||t.insertBefore(this.tr,this.nr.nextSibling),window.ResizeObserver&&(this.ar=new ResizeObserver(()=>{this.pr()}),this.ar.observe(this.nr)),window.addEventListener("resize",()=>{this.pr()})}_r(){if(!this.nr)return;const t=this.nr.getBoundingClientRect();let i=this.nr.offsetParent;if(i&&i!==document.body){const r=i.getBoundingClientRect();this.tr.style.top=t.top-r.top+"px",this.tr.style.left=t.left-r.left+"px"}else this.tr.style.top=t.top+window.scrollY+"px",this.tr.style.left=t.left+window.scrollX+"px"}pr(t,i){if(this.hr){const r=this.nr.getBoundingClientRect();let n=Math.round(r.width),o=Math.round(r.height);if(this.nr instanceof HTMLVideoElement){const h=this.nr;(n===0||o===0)&&h.videoWidth>0&&h.videoHeight>0&&(n=h.videoWidth,o=h.videoHeight)}this.tr.width=n,this.tr.height=o,this._r()}else this.tr.width=t??this.tr.width,this.tr.height=i??this.tr.height}vr(){const t=this.tr.getContext("webgl2",{alpha:!0,premultipliedAlpha:!1,preserveDrawingBuffer:!0,antialias:!1,depth:!1,stencil:!1,powerPreference:"high-performance"});if(!t)throw new R("`textmode.js` requires WebGL2 support.");return t}Dt(){this.ar&&this.ar.disconnect();const t=this.tr.getContext("webgl")||this.tr.getContext("webgl2");if(t){const i=t.getExtension("WEBGL_lose_context");i&&i.loseContext()}this.cr&&this.tr.parentNode&&this.tr.parentNode.removeChild(this.tr)}get canvas(){return this.tr}get targetCanvas(){return this.nr}get width(){return this.tr.width}get height(){return this.tr.height}}class Y{constructor(t,i,r,n){c(this,"mr");c(this,"dt");c(this,"_t");c(this,"gt");c(this,"k",0);c(this,"K",0);c(this,"j",0);c(this,"O",[0,0]);c(this,"gr","sampled");c(this,"Ar","fixed");c(this,"V",[1,1,1,1]);c(this,"q",[0,0,0,1]);c(this,"yr",[0,0,0,1]);c(this,"Cr",[[.1,0,0]]);c(this,"wr");this.gt=t,this.mr=i,this.dt=r,this._t=n}Dt(){this.gt.deleteTexture(this.mr)}br(t){return typeof t=="boolean"?t?1:0:(t==null?0:Number(t))>0?1:0}invert(t=!0){return this.k=this.br(t),this}flipX(t=!0){return this.K=this.br(t),this}flipY(t=!0){return this.j=this.br(t),this}charRotation(t){const i=255*t/360,r=Math.floor(i)/255,n=Math.round(i-Math.floor(i));return this.O=[r,n],this}He(){return{texture:this.mr,invert:this.k,flipX:this.K,flipY:this.j,charRotation:this.O,charColorFixed:this.gr==="fixed",charColor:this.V,cellColorFixed:this.Ar==="fixed",cellColor:this.q,backgroundColor:this.yr,charCount:this.Cr.length,charList:this.Cr}}charColorMode(t){return this.gr=t,this}cellColorMode(t){return this.Ar=t,this}charColor(t,i,r,n){return this.V=[(t??0)/255,(i??t??0)/255,(r??t??0)/255,(n??255)/255],this}cellColor(t,i,r,n){return this.q=[(t??0)/255,(i??t??0)/255,(r??t??0)/255,(n??255)/255],this}background(t,i,r,n){return this.yr=[(t??0)/255,(i??t??0)/255,(r??t??0)/255,(n??255)/255],this}characters(t){const i=this.wr(t).filter(r=>Array.isArray(r)).slice(0,64);return this.Cr=i,this}static Mr(t,i,r){const n=t.context,o=n.createTexture();n.bindTexture(n.TEXTURE_2D,o),n.pixelStorei(n.UNPACK_FLIP_Y_WEBGL,1),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_MIN_FILTER,n.NEAREST),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_MAG_FILTER,n.NEAREST),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_S,n.CLAMP_TO_EDGE),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_T,n.CLAMP_TO_EDGE),n.texImage2D(n.TEXTURE_2D,0,n.RGBA,n.RGBA,n.UNSIGNED_BYTE,i),n.bindTexture(n.TEXTURE_2D,null);const h=i.naturalWidth??i.width??i.videoWidth??0,a=i.naturalHeight??i.height??i.videoHeight??0,u=new Y(n,o,h,a);return u.wr=r,u}get texture(){return this.mr}get width(){return this.dt}get height(){return this._t}}class kt{constructor(t=60){c(this,"Fr");c(this,"zr");c(this,"Rr",null);c(this,"Tr",0);c(this,"Pr",!0);c(this,"Sr",0);c(this,"Er",0);c(this,"$r",[]);c(this,"Dr",10);c(this,"kr",0);this.Fr=t,this.zr=1e3/t}start(t){if(!this.Pr)return;this.Tr=performance.now();const i=r=>{if(!this.Pr)return void(this.Rr=null);const n=r-this.Tr;n>=this.zr&&(t(),this.Tr=r-n%this.zr),this.Pr&&(this.Rr=requestAnimationFrame(i))};this.Rr=requestAnimationFrame(i)}stop(){this.Rr&&(cancelAnimationFrame(this.Rr),this.Rr=null)}pause(){this.Pr&&(this.Pr=!1,this.stop())}resume(t){this.Pr||(this.Pr=!0,this.start(t))}frameRate(t,i){if(t===void 0)return this.Sr;this.Fr=t,this.zr=1e3/t,this.Pr&&i&&(this.stop(),this.start(i))}measureFrameRate(){const t=performance.now();if(this.Er>0){const i=t-this.Er;this.$r.push(i),this.$r.length>this.Dr&&this.$r.shift();const r=this.$r.reduce((n,o)=>n+o,0)/this.$r.length;this.Sr=1e3/r}this.Er=t}get isLooping(){return this.Pr}get frameRateLimit(){return this.Fr}get currentFrameRate(){return this.Sr}get frameCount(){return this.kr}set frameCount(t){this.kr=t}incrementFrame(){this.kr++}resetFrameCount(){this.kr=0}}class lt{constructor(t){c(this,"tr");c(this,"Br");c(this,"Or",{x:-1,y:-1});c(this,"Lr",{x:-1,y:-1});c(this,"Gr",null);c(this,"Hr",0);c(this,"Ir");c(this,"Nr");c(this,"Xr");c(this,"Wr");c(this,"Kr");c(this,"jr");c(this,"Yr",!1);c(this,"Vr");c(this,"qr");c(this,"Zr");c(this,"Qr");c(this,"Jr");this.tr=t}tn(t){const i=performance.now()+Math.max(0,t);i>this.Hr&&(this.Hr=i)}sn(){return performance.now()<this.Hr}en(t){const i=this.tr.canvas;i.style.cursor=t==null||t===""?"":t}Wi(t){this.Br=t,this.rn()}nn(){if(this.Yr)return;const t=this.tr.canvas;this.Ir=i=>{this.hn(i),this.an(i)},this.Nr=()=>{this.Lr={...this.Or},this.Or.x=-1,this.Or.y=-1,this.Gr=null},this.Xr=i=>{this.hn(i),this.cn(i)},this.Wr=i=>{this.hn(i),this.ln(i)},this.Kr=i=>{this.hn(i),this.un(i)},this.jr=i=>{this.hn(i),this.fn(i)},t.addEventListener("mousemove",this.Ir,{passive:!0}),t.addEventListener("mouseleave",this.Nr,{passive:!0}),t.addEventListener("mousedown",this.Xr,{passive:!0}),t.addEventListener("mouseup",this.Wr,{passive:!0}),t.addEventListener("click",this.Kr,{passive:!0}),t.addEventListener("wheel",this.jr,{passive:!1}),this.Yr=!0}dn(){if(!this.Yr)return;const t=this.tr.canvas;t.removeEventListener("mousemove",this.Ir),t.removeEventListener("mouseleave",this.Nr),t.removeEventListener("mousedown",this.Xr),t.removeEventListener("mouseup",this.Wr),t.removeEventListener("click",this.Kr),t.removeEventListener("wheel",this.jr),this.Yr=!1}rn(){if(this.Yr)try{if(this.Gr){const t=new MouseEvent("mousemove",{clientX:this.Gr.x,clientY:this.Gr.y,bubbles:!1,cancelable:!1});this.hn(t)}else this.Or.x!==-1&&this.Or.y!==-1&&(this.Or.x>=this.Br.cols||this.Or.y>=this.Br.rows)&&(this.Or.x=-1,this.Or.y=-1)}catch{this.Or.x=-1,this.Or.y=-1}}_n(t){this.Vr=t}pn(t){this.qr=t}vn(t){this.Zr=t}mn(t){this.Qr=t}gn(t){this.Jr=t}An(){return{x:this.Or.x,y:this.Or.y}}an(t){if(this.Qr&&!this.sn()){const i={position:{...this.Or},previousPosition:{...this.Lr},originalEvent:t};this.Qr(i)}}cn(t){if(this.qr&&!this.sn()){const i={position:{...this.Or},previousPosition:{...this.Lr},button:t.button,originalEvent:t};this.qr(i)}}ln(t){if(this.Zr&&!this.sn()){const i={position:{...this.Or},previousPosition:{...this.Lr},button:t.button,originalEvent:t};this.Zr(i)}}un(t){if(this.Vr&&!this.sn()){const i={position:{...this.Or},previousPosition:{...this.Lr},button:t.button,originalEvent:t};this.Vr(i)}}fn(t){if(this.Jr&&!this.sn()){const i={position:{...this.Or},previousPosition:{...this.Lr},delta:{x:t.deltaX,y:t.deltaY},originalEvent:t};this.Jr(i)}}hn(t){const i=this.tr.canvas;this.Lr={...this.Or},this.Gr={x:t.clientX,y:t.clientY};const r=i.getBoundingClientRect(),n=t.clientX-r.left,o=t.clientY-r.top,h=i.width/r.width,a=o*(i.height/r.height),u=n*h-this.Br.offsetX,f=a-this.Br.offsetY,g=Math.floor(u/this.Br.cellWidth),d=Math.floor(f/this.Br.cellHeight);g>=0&&g<this.Br.cols&&d>=0&&d<this.Br.rows?(this.Or.x=g,this.Or.y=d):(this.Or.x=-1,this.Or.y=-1)}}const Vt=Object.freeze(Object.defineProperty({__proto__:null,MouseManager:lt},Symbol.toStringTag,{value:"Module"}));class ut{constructor(){c(this,"yn",new Map);c(this,"Cn",null);c(this,"wn",null);c(this,"bn");c(this,"xn");c(this,"Yr",!1);c(this,"Mn");c(this,"Fn");c(this,"zn",{ArrowUp:"UP_ARROW",ArrowDown:"DOWN_ARROW",ArrowLeft:"LEFT_ARROW",ArrowRight:"RIGHT_ARROW",F1:"F1",F2:"F2",F3:"F3",F4:"F4",F5:"F5",F6:"F6",F7:"F7",F8:"F8",F9:"F9",F10:"F10",F11:"F11",F12:"F12",Enter:"ENTER",Return:"RETURN",Tab:"TAB",Escape:"ESCAPE",Backspace:"BACKSPACE",Delete:"DELETE",Insert:"INSERT",Home:"HOME",End:"END",PageUp:"PAGE_UP",PageDown:"PAGE_DOWN",Shift:"SHIFT",Control:"CONTROL",Alt:"ALT",Meta:"META"," ":"SPACE"})}nn(){this.Yr||(this.bn=t=>{this.Rn(t)},this.xn=t=>{this.Tn(t)},window.addEventListener("keydown",this.bn,{passive:!1}),window.addEventListener("keyup",this.xn,{passive:!1}),this.Yr=!0)}dn(){this.Yr&&(window.removeEventListener("keydown",this.bn),window.removeEventListener("keyup",this.xn),this.Yr=!1,this.yn.clear(),this.Cn=null,this.wn=null)}pn(t){this.Mn=t}vn(t){this.Fn=t}Pn(t){const i=this.Sn(t),r=this.yn.get(t)||this.yn.get(i);return(r==null?void 0:r.isPressed)||!1}En(){return this.Cn}$n(){return this.wn}Dn(){const t=[];for(const[i,r]of this.yn)r.isPressed&&t.push(i);return t}kn(){return{ctrl:this.Pn("Control"),shift:this.Pn("Shift"),alt:this.Pn("Alt"),meta:this.Pn("Meta")}}Bn(){this.yn.clear(),this.Cn=null,this.wn=null}Rn(t){const i=t.key,r=Date.now();this.yn.has(i)||this.yn.set(i,{isPressed:!1,lastPressTime:0,lastReleaseTime:0});const n=this.yn.get(i);if(!n.isPressed&&(n.isPressed=!0,n.lastPressTime=r,this.Cn=i,this.Mn)){const o={key:i,keyCode:t.keyCode,ctrlKey:t.ctrlKey,shiftKey:t.shiftKey,altKey:t.altKey,metaKey:t.metaKey,isPressed:!0,originalEvent:t};this.Mn(o)}}Tn(t){const i=t.key,r=Date.now();this.yn.has(i)||this.yn.set(i,{isPressed:!1,lastPressTime:0,lastReleaseTime:0});const n=this.yn.get(i);if(n.isPressed=!1,n.lastReleaseTime=r,this.wn=i,this.Fn){const o={key:i,keyCode:t.keyCode,ctrlKey:t.ctrlKey,shiftKey:t.shiftKey,altKey:t.altKey,metaKey:t.metaKey,isPressed:!1,originalEvent:t};this.Fn(o)}}Sn(t){return this.zn[t]||t.toLowerCase()}}const jt=Object.freeze(Object.defineProperty({__proto__:null,KeyboardManager:ut},Symbol.toStringTag,{value:"Module"}));class ft{constructor(t,i){c(this,"tr");c(this,"On");c(this,"Br");c(this,"Ln",new Map);c(this,"Gn",new Map);c(this,"Hn",new Map);c(this,"In",null);c(this,"Nn");c(this,"Xn");c(this,"Wn");c(this,"Kn");c(this,"jn");c(this,"Yn");c(this,"Yr",!1);c(this,"Vn");c(this,"qn");c(this,"Zn");c(this,"Qn");c(this,"Jn");c(this,"so");c(this,"eo");c(this,"io");c(this,"ro");c(this,"no");c(this,"oo",320);c(this,"ho",350);c(this,"ao",10);c(this,"co",550);c(this,"lo",14);c(this,"uo",48);c(this,"fo",650);c(this,"do",.02);c(this,"_o",2);c(this,"po",600);c(this,"vo",0);c(this,"mo",null);this.tr=t,this.On=i;const r=this.tr.canvas;this.Nn=r.style.touchAction,this.Xn=r.style.userSelect,r.style.touchAction||(r.style.touchAction="none"),r.style.userSelect||(r.style.userSelect="none")}Wi(t){this.Br=t,this.Ao()}nn(){if(this.Yr)return;const t=this.tr.canvas;this.Wn=i=>{this.yo(i)},this.Kn=i=>{this.Co(i)},this.jn=i=>{this.wo(i)},this.Yn=i=>{this.bo(i)},t.addEventListener("touchstart",this.Wn,{passive:!1}),t.addEventListener("touchmove",this.Kn,{passive:!1}),t.addEventListener("touchend",this.jn,{passive:!1}),t.addEventListener("touchcancel",this.Yn,{passive:!1}),this.Yr=!0}dn(){if(!this.Yr)return;const t=this.tr.canvas;t.removeEventListener("touchstart",this.Wn),t.removeEventListener("touchmove",this.Kn),t.removeEventListener("touchend",this.jn),t.removeEventListener("touchcancel",this.Yn),this.Yr=!1,this.In=null,this.Ln.clear(),this.Gn.clear(),this.Hn.forEach(i=>{i.longPressTimer!==null&&window.clearTimeout(i.longPressTimer)}),this.Hn.clear(),this.mo=null,this.vo=0,t.style.touchAction=this.Nn,t.style.userSelect=this.Xn}Ao(){if(!this.Br||this.Ln.size===0)return;const t=new Map;for(const i of this.Ln.values()){const r=this.xo(i.clientX,i.clientY,i.id,i);t.set(i.id,r)}this.Ln=t}Mo(){return Array.from(this.Ln.values()).map(t=>({...t}))}Fo(t){this.Vn=t}mn(t){this.qn=t}zo(t){this.Zn=t}Ro(t){this.Qn=t}To(t){this.Jn=t}Po(t){this.so=t}So(t){this.eo=t}Eo(t){this.io=t}$o(t){this.ro=t}Do(t){this.no=t}yo(t){var n;if(!this.Br)return;t.preventDefault(),(n=this.On)==null||n.tn(this.po);const i=performance.now(),r=this.ko(t.changedTouches);for(const o of r){const h=this.Ln.get(o.id);h&&this.Gn.set(o.id,this.Bo(h)),this.Ln.set(o.id,o);const a={id:o.id,startPosition:o,lastPosition:o,startTime:i,lastTime:i,longPressTimer:null,longPressFired:!1};this.eo&&(a.longPressTimer=window.setTimeout(()=>{const u=this.Ln.get(o.id);u&&(a.longPressFired=!0,this.eo({touch:this.Bo(u),duration:performance.now()-a.startTime,originalEvent:t}))},this.co)),this.Hn.set(o.id,a),this.Vn&&this.Vn(this.Oo(o,t,void 0,i))}this.Ln.size===2&&this.Lo()}Co(t){var n;if(!this.Br)return;t.preventDefault(),(n=this.On)==null||n.tn(this.po);const i=performance.now(),r=this.ko(t.changedTouches);for(const o of r){const h=this.Ln.get(o.id),a=h?this.Bo(h):void 0;a&&this.Gn.set(o.id,a),this.Ln.set(o.id,o);const u=this.Hn.get(o.id);u&&(u.lastPosition=o,u.lastTime=i,a)&&this.Go(a,o,!0)>this.lo&&u.longPressTimer!==null&&(window.clearTimeout(u.longPressTimer),u.longPressTimer=null),this.qn&&this.qn(this.Oo(o,t,a,i))}this.Ln.size===2?this.Ho(t):this.In=null}wo(t){if(!this.Br)return;t.preventDefault();const i=performance.now(),r=this.ko(t.changedTouches);for(const n of r){const o=this.Ln.get(n.id),h=o?this.Bo(o):void 0,a=this.Hn.get(n.id);a&&a.longPressTimer!==null&&(window.clearTimeout(a.longPressTimer),a.longPressTimer=null),this.Zn&&this.Zn(this.Oo(n,t,h,i)),a&&this.Io(a,t),this.Hn.delete(n.id),this.Gn.delete(n.id),this.Ln.delete(n.id)}this.Ln.size<2&&(this.In=null)}bo(t){if(!this.Br)return;t.preventDefault();const i=performance.now(),r=this.ko(t.changedTouches);for(const n of r){const o=this.Ln.get(n.id),h=o?this.Bo(o):void 0,a=this.Hn.get(n.id);a&&a.longPressTimer!==null&&(window.clearTimeout(a.longPressTimer),a.longPressTimer=null),this.Qn&&this.Qn(this.Oo(n,t,h,i)),this.Hn.delete(n.id),this.Gn.delete(n.id),this.Ln.delete(n.id)}this.Ln.size<2&&(this.In=null)}ko(t){const i=[];for(let r=0;r<t.length;r+=1){const n=t.item(r);n&&i.push(this.No(n))}return i}No(t){return this.xo(t.clientX,t.clientY,t.identifier,{id:t.identifier,x:-1,y:-1,clientX:t.clientX,clientY:t.clientY,pressure:t.force,radiusX:t.radiusX,radiusY:t.radiusY,rotationAngle:t.rotationAngle})}xo(t,i,r,n){const o=this.tr.canvas,h=o.getBoundingClientRect(),a=t-h.left,u=i-h.top,f=o.width/h.width,g=u*(o.height/h.height),d=a*f-this.Br.offsetX,p=g-this.Br.offsetY,y=Math.floor(d/this.Br.cellWidth),A=Math.floor(p/this.Br.cellHeight),m=y>=0&&y<this.Br.cols&&A>=0&&A<this.Br.rows;return{id:r,x:m?y:-1,y:m?A:-1,clientX:t,clientY:i,pressure:n.pressure,radiusX:n.radiusX,radiusY:n.radiusY,rotationAngle:n.rotationAngle}}Oo(t,i,r,n){const o=this.Hn.get(t.id),h=Array.from(this.Gn.values()).map(f=>this.Bo(f)),a=Array.from(this.Ln.values()).map(f=>this.Bo(f)),u=this.ko(i.changedTouches);return{touch:this.Bo(t),previousTouch:r?this.Bo(r):void 0,touches:a,previousTouches:h,changedTouches:u,deltaTime:o?n-o.lastTime:0,originalEvent:i}}Lo(){if(this.Ln.size!==2)return void(this.In=null);const t=Array.from(this.Ln.values()),[i,r]=t,n=this.Go(i,r,!1),o=this.Xo(i,r);this.In={ids:[i.id,r.id],initialDistance:Math.max(n,1e-4),initialAngle:o,lastScale:1,lastRotation:0}}Ho(t){if(this.In||this.Lo(),!this.In)return;const[i,r]=this.In.ids,n=this.Ln.get(i),o=this.Ln.get(r);if(!n||!o)return;const h=this.Go(n,o,!1)/this.In.initialDistance,a=h-this.In.lastScale;this.ro&&Math.abs(a)>this.do&&(this.ro({touches:[this.Bo(n),this.Bo(o)],scale:h,deltaScale:a,center:this.Wo(n,o),originalEvent:t}),this.In.lastScale=h);let u=this.Xo(n,o)-this.In.initialAngle;u=(u+180)%360-180;const f=u-this.In.lastRotation;this.no&&Math.abs(f)>this._o&&(this.no({touches:[this.Bo(n),this.Bo(o)],rotation:u,deltaRotation:f,center:this.Wo(n,o),originalEvent:t}),this.In.lastRotation=u)}Wo(t,i){const r=(t.clientX+i.clientX)/2,n=(t.clientY+i.clientY)/2,o=this.xo(r,n,-1,{id:-1,x:-1,y:-1,clientX:r,clientY:n});return{x:o.x,y:o.y}}Io(t,i){const r=performance.now(),n=r-t.startTime,o=this.Go(t.startPosition,t.lastPosition,!0);if(!t.longPressFired&&n<=this.oo&&o<=this.ao)this.Ko(t.lastPosition,r)&&this.so?this.so({touch:this.Bo(t.lastPosition),taps:2,originalEvent:i}):this.Jn&&this.Jn({touch:this.Bo(t.lastPosition),taps:1,originalEvent:i});else if(!t.longPressFired&&n<=this.fo&&o>=this.uo){const h={x:t.lastPosition.clientX-t.startPosition.clientX,y:t.lastPosition.clientY-t.startPosition.clientY},a=Math.max(Math.hypot(h.x,h.y),1e-4),u={x:h.x/a,y:h.y/a},f={x:h.x/n,y:h.y/n};this.io&&this.io({touch:this.Bo(t.lastPosition),direction:u,distance:a,velocity:f,originalEvent:i})}this.vo=r,this.mo=this.Bo(t.lastPosition)}Ko(t,i){return!!this.mo&&!(i-this.vo>this.ho)&&this.Go(t,this.mo,!0)<=this.ao}Bo(t){return{...t}}Go(t,i,r){return r?Math.hypot(t.clientX-i.clientX,t.clientY-i.clientY):Math.hypot(t.x-i.x,t.y-i.y)}Xo(t,i){return 180*Math.atan2(i.clientY-t.clientY,i.clientX-t.clientX)/Math.PI}}const qt=Object.freeze(Object.defineProperty({__proto__:null,TouchManager:ft},Symbol.toStringTag,{value:"Module"})),Kt=l=>class extends l{rotate(t=0,i=0,r=0){this.xt.state.st(t),this.xt.state.et(i),this.xt.state.it(r)}rotateX(t){this.xt.state.st(t)}rotateY(t){this.xt.state.et(t)}rotateZ(t){this.xt.state.it(t)}push(){this.xt.state.H()}pop(){this.xt.state.Z()}rect(t,i,r=1,n=1){this.xt.Ne(t,i,r,n)}point(t,i){this.xt.Ne(t,i,1,1)}line(t,i,r,n){this.xt.Xe(t,i,r,n)}lineWeight(t){this.xt.state.tt(t)}background(t,i=t,r=t,n=255){this.xt.qe(t,i,r,n)}char(t){this.xt.state.rt(this.Ei.Pi(t))}charColor(t,i,r,n=255){this.xt.state.nt(t,i,r,n)}cellColor(t,i,r,n=255){this.xt.state.ot(t,i,r,n)}flipX(t){this.xt.state.ht(t)}flipY(t){this.xt.state.ct(t)}charRotation(t){this.xt.state.ut(t)}invert(t){this.xt.state.lt(t)}clear(){this.xt.qe(0,0,0,0)}ellipse(t,i,r,n){this.xt.We(t,i,r/2,n/2)}triangle(t,i,r,n,o,h){this.xt.Ke(t,i,r,n,o,h)}bezierCurve(t,i,r,n,o,h,a,u){this.xt.je(t,i,r,n,o,h,a,u)}arc(t,i,r,n,o,h){this.xt.Ve(t,i,r,n,o,h)}shader(t){this.xt.Be(t)}setUniform(t,i){this.xt.Kt(t,i)}setUniforms(t){this.xt.Oe(t)}createFilterShader(t){return this.xt.hs(t)}createFramebuffer(t){return this.xt.Ye(t.width,t.height,5,{filter:"nearest",wrap:"clamp",format:"rgba",type:"unsigned_byte"})}image(t,i,r,n,o){if(t.textures){const h=t;this.xt.Le(h,i,r,n??h.width,o??h.height)}else{const h=t;this.xt.Ge(h,i,r,n??Math.floor(this.Br.cols/2),o??Math.floor(this.Br.rows/2))}}async loadImage(t){if(typeof t!="string")return Y.Mr(this.xt,t,n=>this.Ei.Si(n));const i=t,r=await new Promise((n,o)=>{const h=new Image;h.crossOrigin="anonymous",h.onload=()=>n(h),h.onerror=a=>o(a),h.src=i});return Y.Mr(this.xt,r,n=>this.Ei.Si(n))}},Zt=l=>class extends l{async loadFont(t){return this.Ei.Vi(t).then(()=>{const i=this.Ei.maxGlyphDimensions;this.Br.rr(i.width,i.height),this.jo.resize(this.Br.cols,this.Br.rows),this.xt.Ze(),this.On.rn()})}fontSize(t){if(!X.m(typeof t=="number"&&t>0,"Font size must be a positive number greater than 0.",{method:"fontSize",providedValue:t})||this.Ei.fontSize===t)return;this.Ei.Yi(t);const i=this.Ei.maxGlyphDimensions;this.Br.rr(i.width,i.height),this.jo.resize(this.Br.cols,this.Br.rows),this.xt.Ze(),this.On.rn()}glyphColor(t){return this.Ei.Pi(t)}glyphColors(t){return this.Ei.Si(t)}},Qt=l=>class extends l{get frameCount(){return this.Yo.frameCount}set frameCount(t){this.Yo.frameCount=t}frameRate(t){return t===void 0?this.Yo.currentFrameRate:this.Yo.frameRate(t,()=>this.Vo())}noLoop(){this.Yo.pause()}loop(){this.Yo.resume(()=>this.Vo())}redraw(t=1){if(X.m(typeof t=="number"&&t>0&&Number.isInteger(t),"Redraw count must be a positive integer.",{method:"redraw",providedValue:t}))for(let i=0;i<t;i++)this.Vo()}isLooping(){return this.Yo.isLooping}},Jt=l=>class extends l{constructor(...t){super(...t)}mouseClicked(t){this.On._n(t)}mousePressed(t){this.On.pn(t)}mouseReleased(t){this.On.vn(t)}mouseMoved(t){this.On.mn(t)}mouseScrolled(t){this.On.gn(t)}get mouse(){return this.On.An()}cursor(t){this.On.en(t)}},$t=l=>class extends l{constructor(...t){super(...t)}touchStarted(t){this.qo.Fo(t)}touchMoved(t){this.qo.mn(t)}touchEnded(t){this.qo.zo(t)}touchCancelled(t){this.qo.Ro(t)}tap(t){this.qo.To(t)}doubleTap(t){this.qo.Po(t)}longPress(t){this.qo.So(t)}swipe(t){this.qo.Eo(t)}pinch(t){this.qo.$o(t)}rotateGesture(t){this.qo.Do(t)}get touches(){return this.qo.Mo()}},te=l=>class extends l{constructor(...t){super(...t)}keyPressed(t){this.Zo.pn(t)}keyReleased(t){this.Zo.vn(t)}isKeyPressed(t){return this.Zo.Pn(t)}get lastKeyPressed(){return this.Zo.En()}get lastKeyReleased(){return this.Zo.$n()}get pressedKeys(){return this.Zo.Dn()}get modifierState(){return this.Zo.kn()}};class ee{constructor(){c(this,"xt");c(this,"Ei");c(this,"tr");c(this,"Br");c(this,"Yo");c(this,"On");c(this,"qo");c(this,"Zo");c(this,"Qo");c(this,"jo");c(this,"Jo");c(this,"th");c(this,"sh")}Vo(){}}class dt extends function(i,...r){return r.reduce((n,o)=>o(n),i)}(ee,Kt,Zt,Qt,Jt,$t,te){constructor(i={}){var r;super();c(this,"eh",new Map);c(this,"ih");c(this,"rh",!1);c(this,"nh",!1);c(this,"oh",()=>{});c(this,"hh",()=>{});c(this,"ah",()=>{});c(this,"uh");c(this,"ar");c(this,"hr",!1);c(this,"fh");this.ih=((r=i.plugins)==null?void 0:r.slice())??[],this.hr=i.overlay??!1,this.tr=new ct(i),this.xt=new Ot(this.tr.vr()),this.Ei=new ht(this.xt,i.fontSize??16),this.Yo=new kt(i.frameRate??60),this.On=new lt(this.tr),this.qo=new ft(this.tr,this.On),this.Zo=new ut,this.Qo=this.xt.Pt(),this.Jo=this.xt.rs(),this.dh(i)}async dh(i){await this.Ei.Wi(i.fontSource);const r=this.Ei.maxGlyphDimensions;this.Br=new at(this.tr.canvas,r.width,r.height),this.On.Wi(this.Br),this.qo.Wi(this.Br),this.jo=this.xt.Ye(this.Br.cols,this.Br.rows,5),this.th=this.xt.Ye(this.Br.width,this.Br.height,1),this.hr&&(this.fh=Y.Mr(this.xt,this.tr.targetCanvas,n=>this.Ei.Si(n))),this.sh=this.xt.cs(rt,"precision mediump float;uniform sampler2D Ua;uniform vec2 Ub;uniform vec2 Uc;uniform vec2 Ud;void main(){vec2 A=gl_FragCoord.xy-Uc;vec2 B=A*(Ub/Ud);vec2 C=(floor(B)+0.5)/Ub;gl_FragColor=texture2D(Ua,C);}"),this._h(),await this.ph(this.ih),this.ih=[],this.rh=!0,this.oh(),this.Yo.start(()=>this.Vo())}async ph(i){if(i.length)for(const r of i)this.eh.has(r.name)?console.warn(`[textmode.js] Plugin "${r.name}" is already installed.`):(await r.install(this,this.mh()),this.eh.set(r.name,r))}async gh(i){const r=this.eh.get(i);r&&(r.uninstall&&await r.uninstall(this,this.mh()),this.eh.delete(i))}async use(i){return this.rh?await this.ph([i]):this.ih.push(i),this}async unuse(i){return this.rh?(await this.gh(i),this):(this.ih=this.ih.filter(r=>r.name!==i),this)}hasPlugin(i){return this.rh?this.eh.has(i):this.ih.some(r=>r.name===i)||this.eh.has(i)}mh(){return{renderer:this.xt,font:this.Ei,grid:this.Br,canvas:this.tr,drawFramebuffer:this.jo,asciiFramebuffer:this.th,flushDrawCommands:()=>{this.xt.St(this.Qo)}}}_h(){this.uh=()=>{this.hr&&this.resizeCanvas(this.tr.targetCanvas.width,this.tr.targetCanvas.height),this.ah()},window.addEventListener("resize",this.uh),this.On.nn(),this.qo.nn(),this.Zo.nn(),window.addEventListener("blur",()=>{this.Zo.Bn()}),window.ResizeObserver&&this.hr&&(this.ar=new ResizeObserver(()=>{this.resizeCanvas(this.tr.targetCanvas.width,this.tr.targetCanvas.height)}),this.ar.observe(this.tr.targetCanvas))}Vo(){if(this.Yo.measureFrameRate(),this.Yo.incrementFrame(),this.nh)return;if(this.hr){const r=this.xt.context;r.bindTexture(r.TEXTURE_2D,this.fh.texture),r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,1),r.texImage2D(r.TEXTURE_2D,0,r.RGBA,r.RGBA,r.UNSIGNED_BYTE,this.tr.targetCanvas),r.bindTexture(r.TEXTURE_2D,null)}this.jo.begin(),this.xt.ke(this.Qo),this.hh(),this.xt.St(this.Qo),this.jo.end(),this.th.begin(),this.xt.ke(this.Jo),this.Jo.Wt({U0:this.Ei.fontFramebuffer,U1:[this.Ei.textureColumns,this.Ei.textureRows],U2:this.jo.textures[0],U3:this.jo.textures[1],U4:this.jo.textures[2],U5:this.jo.textures[4],U6:this.jo.textures[3],U7:[this.Br.cols,this.Br.rows],U8:[this.th.width,this.th.height],U9:this.th.width/this.th.height}),this.xt.Ie(0,0,this.tr.width,this.tr.height),this.th.end();const i=this.xt.state.canvasBackgroundColor;this.xt.Ys(i[0],i[1],i[2],i[3]),this.xt.ke(this.sh),this.sh.Wt({Ua:this.th.textures[0],Ub:[this.th.width,this.th.height],Uc:[this.Br.offsetX,this.Br.offsetY],Ud:[this.Br.width,this.Br.height]}),this.xt.Ie(this.Br.offsetX,this.Br.offsetY,this.Br.width,this.Br.height)}setup(i){this.oh=i}draw(i){this.hh=i}windowResized(i){this.ah=i}resizeCanvas(i,r){this.tr.pr(i,r),this.Br.ir(),this.jo.resize(this.Br.cols,this.Br.rows),this.th.resize(this.Br.width,this.Br.height),this.xt.Ze(),this.On.rn(),this.qo.Ao(),this.Vo()}destroy(){this.nh||(this.Yo.stop(),window.removeEventListener("resize",this.uh),this.On.dn(),this.qo.dn(),this.Zo.dn(),this.Ei.Dt(),this.xt.Dt(),this.th.Dt(),this.sh.Dt(),this.fh&&this.fh.Dt(),this.nh=!0)}get grid(){return this.Br}get font(){return this.Ei}get width(){return this.tr.width}get height(){return this.tr.height}get canvas(){return this.tr.canvas}get isDisposed(){return this.nh}get overlay(){return this.fh}}class Q{constructor(){}static create(t={}){return new dt(t)}static setErrorLevel(t){X.A(t)}static get version(){return"0.3.2-beta.2"}}const ie=Object.freeze(Object.defineProperty({__proto__:null},Symbol.toStringTag,{value:"Module"})),se=Object.freeze(Object.defineProperty({__proto__:null,keyboard:jt,mouse:Vt,touch:qt},Symbol.toStringTag,{value:"Module"})),re=Q.create,ne=Q.setErrorLevel,oe=Q.version;b.TextmodeCanvas=ct,b.TextmodeErrorLevel=S,b.TextmodeFont=ht,b.TextmodeFramebuffer=j,b.TextmodeGrid=at,b.TextmodeImage=Y,b.Textmodifier=dt,b.create=re,b.export=ie,b.input=se,b.setErrorLevel=ne,b.textmode=Q,b.version=oe,Object.defineProperty(b,Symbol.toStringTag,{value:"Module"})},typeof exports=="object"&&typeof module<"u"?e(exports):typeof define=="function"&&define.amd?define(["exports"],e):e((s=typeof globalThis<"u"?globalThis:s||self).textmode={});
|
package/dist/textmode.umd.min.js
CHANGED
|
@@ -5,7 +5,7 @@ var he=Object.defineProperty;var ae=(b,R,M)=>R in b?he(b,R,{enumerable:!0,config
|
|
|
5
5
|
|
|
6
6
|
${"↓".repeat(24)}
|
|
7
7
|
`}static o(t){if(t===null)return"null";if(t===void 0)return"undefined";if(typeof t=="string")return`"${t}"`;if(typeof t=="number"||typeof t=="boolean")return t+"";if(Array.isArray(t))return t.length===0?"[]":t.length<=5?`[${t.map(i=>R.o(i)).join(", ")}]`:`[${t.slice(0,3).map(i=>R.o(i)).join(", ")}, ... +${t.length-3} more]`;if(typeof t=="object"){const i=Object.keys(t);return i.length===0?"{}":i.length<=3?`{ ${i.map(r=>`${r}: ${R.o(t[r])}`).join(", ")} }`:`{ ${i.slice(0,2).map(r=>`${r}: ${R.o(t[r])}`).join(", ")}, ... +${i.length-2} more }`}return t+""}}var M=(l=>(l[l.SILENT=0]="SILENT",l[l.WARNING=1]="WARNING",l[l.ERROR=2]="ERROR",l[l.THROW=3]="THROW",l))(M||{});const G=class G{constructor(){c(this,"u",{globalLevel:3})}static _(){return G.l||(G.l=new G),G.l}m(t,i){const r="%c[textmode.js] Oops! (╯°□°)╯︵ Something went wrong in your code.",n="color: #f44336; font-weight: bold; background: #ffebee; padding: 2px 6px; border-radius: 3px;";switch(this.u.globalLevel){case 0:return!1;case 1:return console.group(r,n),console.warn(R.i(t,i)),console.groupEnd(),!1;case 2:return console.group(r,n),console.error(R.i(t,i)),console.groupEnd(),!1;default:throw new R(t,i)}}v(t,i,r){return!!t||(this.m(i,r),!1)}C(t){this.u.globalLevel=t}};c(G,"l",null);let J=G;const Y=J._(),it=new WeakMap;function H(l,t){it.set(l,t)}function V(l){return it.get(l)}class st{constructor(){c(this,"$",1);c(this,"U",0);c(this,"M",0);c(this,"R",0);c(this,"F",[0,0,0]);c(this,"S",[1,1,1,1]);c(this,"A",[0,0,0,1]);c(this,"P",!1);c(this,"k",!1);c(this,"L",!1);c(this,"D",[0,0]);c(this,"G",[0,0,0,1]);c(this,"I",[])}O(){this.I.push({W:this.$,H:this.U,K:this.M,X:this.R,D:[...this.D],N:this.P,j:this.k,L:this.L,Y:[...this.F],V:[...this.S],q:[...this.A]})}Z(){const t=this.I.pop();t?(this.$=t.W,this.U=t.H,this.M=t.K,this.R=t.X,this.D=t.D,this.P=t.N,this.k=t.j,this.L=t.L,this.F=t.Y,this.S=t.V,this.A=t.q):console.warn("pop() called without matching push()")}J(t){t.W=this.$,t.H=this.U,t.K=this.M,t.X=this.R,t.Y[0]=this.F[0],t.Y[1]=this.F[1],t.Y[2]=this.F[2],t.V[0]=this.S[0],t.V[1]=this.S[1],t.V[2]=this.S[2],t.V[3]=this.S[3],t.q[0]=this.A[0],t.q[1]=this.A[1],t.q[2]=this.A[2],t.q[3]=this.A[3],t.N=this.P,t.j=this.k,t.L=this.L,t.D[0]=this.D[0],t.D[1]=this.D[1]}get lineWeight(){return this.$}get canvasBackgroundColor(){return this.G}tt(t){this.$=Math.abs(t)}st(t){this.U=t}et(t){this.M=t}it(t){this.R=t}rt(t){this.F=t}nt(t,i,r,n=255){this.S=[t/255,i/255,r/255,n/255]}ot(t,i,r,n=255){this.A=[t/255,i/255,r/255,n/255]}ht(t){this.P=t}ct(t){this.k=t}lt(t){this.L=t}ut(t){const i=255*t/360,r=Math.floor(i)/255,n=Math.round(i-Math.floor(i));this.D=[r,n]}ft(t,i,r,n){this.G=[t/255,i/255,r/255,n/255]}}class ${constructor(t,i,r=i,n=1,o={},h=null,a=!1){c(this,"dt");c(this,"_t");c(this,"u");c(this,"vt",null);c(this,"gt");c(this,"yt");c(this,"Ct",[]);c(this,"wt");c(this,"bt",null);c(this,"$t",[]);c(this,"xt",null);c(this,"Mt",!1);c(this,"Rt",null);this.dt=i,this._t=r,this.u={filter:"nearest",wrap:"clamp",format:"rgba",type:"unsigned_byte",...o},this.gt=t,this.wt=Math.min(Math.max(1,n),8),this.xt=h,this.Mt=!!a,this.Rt=this.Mt?new st:null;const u=t.getParameter(t.MAX_DRAW_BUFFERS),f=t.getParameter(t.MAX_COLOR_ATTACHMENTS);this.wt=Math.min(this.wt,u,f),this.yt=t.createFramebuffer(),this.Ft(),this.St(),this.$t=Array(this.wt).fill(null)}Ft(){const t=this.gt,i=this.u.filter==="linear"?t.LINEAR:t.NEAREST,r=this.u.wrap==="repeat"?t.REPEAT:t.CLAMP_TO_EDGE,n=this.u.type==="float"?t.FLOAT:t.UNSIGNED_BYTE;for(let o=0;o<this.wt;o++){const h=t.createTexture();t.bindTexture(t.TEXTURE_2D,h),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,i),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,i),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,r),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,r),t.texImage2D(t.TEXTURE_2D,0,t.RGBA,this.dt,this._t,0,t.RGBA,n,null),this.Ct.push(h)}t.bindTexture(t.TEXTURE_2D,null)}St(){const t=this.gt;if(t.bindFramebuffer(t.FRAMEBUFFER,this.yt),this.wt===1)t.framebufferTexture2D(t.FRAMEBUFFER,t.COLOR_ATTACHMENT0,t.TEXTURE_2D,this.Ct[0],0);else{const r=[];for(let n=0;n<this.wt;n++){const o=t.COLOR_ATTACHMENT0+n;t.framebufferTexture2D(t.FRAMEBUFFER,o,t.TEXTURE_2D,this.Ct[n],0),r.push(o)}t.drawBuffers(r)}const i=t.checkFramebufferStatus(t.FRAMEBUFFER);i!==t.FRAMEBUFFER_COMPLETE&&console.error("GLFramebuffer is not complete:",i),t.bindFramebuffer(t.FRAMEBUFFER,null)}Tt(t){const i=this.gt;i.bindTexture(i.TEXTURE_2D,this.Ct[0]),i.pixelStorei(i.UNPACK_FLIP_Y_WEBGL,1),i.texImage2D(i.TEXTURE_2D,0,i.RGBA,i.RGBA,i.UNSIGNED_BYTE,t),i.bindTexture(i.TEXTURE_2D,null)}resize(t,i){this.dt=t,this._t=i,this.vt=null,this.$t=Array(this.wt).fill(null);const r=this.gt,n=this.u.type==="float"?r.FLOAT:r.UNSIGNED_BYTE;for(const o of this.Ct)r.bindTexture(r.TEXTURE_2D,o),r.texImage2D(r.TEXTURE_2D,0,r.RGBA,this.dt,this._t,0,r.RGBA,n,null);r.bindTexture(r.TEXTURE_2D,null)}readPixels(t){const i=this.gt,r=this.$t[t];if(r)return r;const n=this.dt,o=this._t,h=new Uint8Array(n*o*4),a=i.getParameter(i.READ_FRAMEBUFFER_BINDING);i.bindFramebuffer(i.READ_FRAMEBUFFER,this.yt),i.readBuffer(i.COLOR_ATTACHMENT0+t),i.readPixels(0,0,n,o,i.RGBA,i.UNSIGNED_BYTE,h),i.bindFramebuffer(i.READ_FRAMEBUFFER,a);const u=4*n,f=new Uint8Array(h.length);for(let g=0;g<o;g++){const d=(o-1-g)*u,v=g*u;f.set(h.subarray(d,d+u),v)}return this.$t[t]=f,f}begin(){var i,r,n,o;const t=this.gt;if(this.xt){const h=((r=(i=this.xt).At)==null?void 0:r.call(i))??null;h&&this.xt.zt(h),this.Mt&&this.Rt&&((o=(n=this.xt).Et)==null||o.call(n,this.Rt))}this.bt={framebuffer:t.getParameter(t.FRAMEBUFFER_BINDING),viewport:t.getParameter(t.VIEWPORT)},t.bindFramebuffer(t.FRAMEBUFFER,this.yt),this.$t=Array(this.wt).fill(null);for(let h=0;h<this.wt;h++)t.clearBufferfv(t.COLOR,h,new Float32Array([0,0,0,0]));t.viewport(0,0,this.dt,this._t),H(t,[0,0,this.dt,this._t])}end(){var i,r,n,o;if(!this.bt)return;const t=this.gt;if(this.xt){const h=((r=(i=this.xt).At)==null?void 0:r.call(i))??null;h&&this.xt.zt(h)}t.bindFramebuffer(t.FRAMEBUFFER,this.bt.framebuffer),t.viewport(...this.bt.viewport),H(t,this.bt.viewport),this.bt=null,this.xt&&this.Mt&&this.Rt&&((o=(n=this.xt).Pt)==null||o.call(n))}kt(){const t=this.gt;t.deleteFramebuffer(this.yt);for(const i of this.Ct)t.deleteTexture(i)}get width(){return this.dt}get height(){return this._t}get textures(){return[...this.Ct]}}class z{constructor(t,i,r){c(this,"gt");c(this,"Lt");c(this,"Dt",new Map);c(this,"Bt",new Map);c(this,"Gt",0);this.gt=t,this.Lt=this.It(i,r),this.Ot()}Ot(){const t=this.gt.getProgramParameter(this.Lt,this.gt.ACTIVE_UNIFORMS);for(let i=0;i<t;i++){const r=this.gt.getActiveUniform(this.Lt,i);if(r){const n=this.gt.getUniformLocation(this.Lt,r.name);if(n&&(this.Dt.set(r.name,n),this.Bt.set(r.name,{type:r.type,size:r.size}),r.size>1)){const o=r.name.replace(/\[.*\]$/,"");this.Dt.has(o)||(this.Dt.set(o,n),this.Bt.set(o,{type:r.type,size:r.size}))}}}}It(t,i){const r=this.Wt(this.gt.VERTEX_SHADER,t),n=this.Wt(this.gt.FRAGMENT_SHADER,i),o=this.gt.createProgram();if(this.gt.attachShader(o,r),this.gt.attachShader(o,n),this.gt.linkProgram(o),!this.gt.getProgramParameter(o,this.gt.LINK_STATUS)){const h=this.gt.getProgramInfoLog(o);throw Error("Shader program link error: "+h)}return this.gt.deleteShader(r),this.gt.deleteShader(n),o}Wt(t,i){const r=this.gt.createShader(t);if(this.gt.shaderSource(r,i),this.gt.compileShader(r),!this.gt.getShaderParameter(r,this.gt.COMPILE_STATUS)){const n=this.gt.getShaderInfoLog(r);throw this.gt.deleteShader(r),Error("Shader compilation error: "+n)}return r}Ht(){this.gt.useProgram(this.Lt),this.Kt()}Kt(){this.Gt=0}Xt(t){for(const[i,r]of Object.entries(t))this.Nt(i,r)}jt(t){return this.Dt.has(t)}Yt(t){return this.Bt.get(t)||null}Vt(){const t=[];for(const[i,r]of this.Bt.entries())t.push({name:i,...r});return t}Nt(t,i){var u;const r=this.Dt.get(t);if(!r)return;const n=this.Bt.get(t);if(!n)return void console.warn(`No type information found for uniform '${t}'`);const{type:o,size:h}=n,a=this.gt;if(typeof i=="number")switch(o){case a.INT:case a.BOOL:a.uniform1i(r,i);break;case a.FLOAT:a.uniform1f(r,i);break;default:console.warn(`Unexpected uniform type for scalar '${t}': ${o}`),a.uniform1f(r,i)}else if(typeof i=="boolean")a.uniform1i(r,i?1:0);else if(Array.isArray(i))if(Array.isArray(i[0])){const f=i,g=((u=f[0])==null?void 0:u.length)||0,d=f.flat();switch(o){case a.FLOAT_VEC2:g===2?a.uniform2fv(r,d):console.warn(`Vector length mismatch for '${t}': expected 2, got ${g}`);break;case a.FLOAT_VEC3:g===3?a.uniform3fv(r,d):console.warn(`Vector length mismatch for '${t}': expected 3, got ${g}`);break;case a.FLOAT_VEC4:g===4?a.uniform4fv(r,d):console.warn(`Vector length mismatch for '${t}': expected 4, got ${g}`);break;default:console.warn(`Unsupported uniform type for vector array '${t}': ${o}`)}}else switch(o){case a.FLOAT_VEC2:i.length===2?a.uniform2f(r,i[0],i[1]):console.warn(`Vector length mismatch for '${t}': expected 2, got ${i.length}`);break;case a.FLOAT_VEC3:i.length===3?a.uniform3f(r,i[0],i[1],i[2]):console.warn(`Vector length mismatch for '${t}': expected 3, got ${i.length}`);break;case a.FLOAT_VEC4:i.length===4?a.uniform4f(r,i[0],i[1],i[2],i[3]):console.warn(`Vector length mismatch for '${t}': expected 4, got ${i.length}`);break;case a.INT:h>1?a.uniform1iv(r,i):console.warn(`Array provided for scalar uniform '${t}'`);break;case a.FLOAT:h>1?a.uniform1fv(r,i):console.warn(`Array provided for scalar uniform '${t}'`);break;default:console.warn(`Unsupported uniform type for array '${t}': ${o}`)}else if(i instanceof WebGLTexture){const f=this.qt();a.uniform1i(r,f),a.activeTexture(a.TEXTURE0+f),a.bindTexture(a.TEXTURE_2D,i)}else if(i instanceof $){const f=this.qt();a.uniform1i(r,f),a.activeTexture(a.TEXTURE0+f),a.bindTexture(a.TEXTURE_2D,i.textures[0])}else console.warn(`Unsupported uniform type for '${t}':`,typeof i)}qt(){return this.Gt++}get Zt(){return this.Lt}kt(){this.gt.deleteProgram(this.Lt)}}const j=`#version 300 es
|
|
8
|
-
in vec2 a_position;in vec2 a_texCoord;in vec2 a_instancePosition;in vec2 a_instanceSize;in vec3 a_instanceCharacter;in vec4 a_instancePrimaryColor;in vec4 a_instanceSecondaryColor;in vec2 a_instanceRotation;in vec3 a_instanceTransform;in vec3 a_instanceGlobalRotation;in vec2 a_instanceRotationCenter;in vec2 a_instanceBezierCP1;in vec2 a_instanceBezierCP2;in vec2 a_instanceBezierStart;in vec2 a_instanceBezierEnd;in vec2 a_instanceArcAngles;uniform float U9;uniform vec2
|
|
8
|
+
in vec2 a_position;in vec2 a_texCoord;in vec2 a_instancePosition;in vec2 a_instanceSize;in vec3 a_instanceCharacter;in vec4 a_instancePrimaryColor;in vec4 a_instanceSecondaryColor;in vec2 a_instanceRotation;in vec3 a_instanceTransform;in vec3 a_instanceGlobalRotation;in vec2 a_instanceRotationCenter;in vec2 a_instanceBezierCP1;in vec2 a_instanceBezierCP2;in vec2 a_instanceBezierStart;in vec2 a_instanceBezierEnd;in vec2 a_instanceArcAngles;uniform float U9;uniform vec2 Uy;out vec2 v_uv;out vec3 v_character;out vec4 v_primaryColor;out vec4 v_secondaryColor;out vec2 v_rotation;out vec3 v_transform;mat3 A(float B){float C=sin(B),D=cos(B);return mat3(1,0,0,0,D,-C,0,C,D);}mat3 E(float B){float C=sin(B),D=cos(B);return mat3(D,0,C,0,1,0,-C,0,D);}mat3 F(float B){float C=sin(B),D=cos(B);return mat3(D,-C,0,C,D,0,0,0,1);}vec2 G(float H,vec2 I,vec2 J,vec2 K,vec2 L){float M=1.-H,N=M*M,O=H*H;return N*M*I+3.*N*H*J+3.*M*O*K+O*H*L;}vec2 P(float H,vec2 I,vec2 J,vec2 K,vec2 L){float M=1.-H,N=M*M,O=H*H;return-3.*N*I+3.*N*J-6.*M*H*J+6.*M*H*K-3.*O*K+3.*O*L;}void main(){v_uv=a_texCoord;v_character=a_instanceCharacter;v_primaryColor=a_instancePrimaryColor;v_secondaryColor=a_instanceSecondaryColor;v_rotation=a_instanceRotation;v_transform=a_instanceTransform;vec2 Q;bool R=length(a_instanceBezierCP1)+length(a_instanceBezierCP2)+length(a_instanceBezierStart)+length(a_instanceBezierEnd)>0.;bool S=a_instanceArcAngles.x!=0.||a_instanceArcAngles.y!=0.;if(R){float H=a_position.x;vec2 T=G(H,a_instanceBezierStart,a_instanceBezierCP1,a_instanceBezierCP2,a_instanceBezierEnd);vec2 U=P(H,a_instanceBezierStart,a_instanceBezierCP1,a_instanceBezierCP2,a_instanceBezierEnd);float V=length(U);U=V>0.?U/V:vec2(1,0);Q=T+vec2(-U.y,U.x)*a_position.y*a_instanceSize.y;}else if(S){float C=a_instanceArcAngles.x,W=a_instanceArcAngles.y;C=mod(C,6.28318530718);if(C<0.)C+=6.28318530718;W=mod(W,6.28318530718);if(W<0.)W+=6.28318530718;float X=C-W;if(X<=0.)X+=6.28318530718;float Y=C-a_position.x*X;vec2 Z=vec2(cos(Y),sin(Y))*a_position.y;Q=Z*a_instanceSize*.5+a_instanceSize*.5+a_instancePosition;}else{Q=a_position*a_instanceSize+a_instancePosition;}vec2 a=(Q/Uy)*2.-1.;a.y=-a.y;if(length(a_instanceGlobalRotation)>0.){vec3 b=vec3(a-a_instanceRotationCenter,0);b.x*=U9;if(a_instanceGlobalRotation.x!=0.)b=A(-a_instanceGlobalRotation.x)*b;if(a_instanceGlobalRotation.y!=0.)b=E(-a_instanceGlobalRotation.y)*b;if(a_instanceGlobalRotation.z!=0.)b=F(-a_instanceGlobalRotation.z)*b;b.x/=U9;a=b.xy+a_instanceRotationCenter;}gl_Position=vec4(a,0,1);}`,rt="attribute vec2 a_position;attribute vec2 a_texCoord;varying vec2 v_uv;void main(){v_uv=a_texCoord;gl_Position=vec4(a_position,0.,1.);}";class mt{constructor(t){c(this,"gt");c(this,"Jt");c(this,"Qt");c(this,"ts");c(this,"ss");this.gt=t,this.Qt=new z(this.gt,j,`#version 300 es
|
|
9
9
|
precision highp float;in vec2 v_uv;in vec3 v_character;in vec4 v_primaryColor;in vec4 v_secondaryColor;in vec2 v_rotation;in vec3 v_transform;layout(location=0)out vec4 o_character;layout(location=1)out vec4 o_primaryColor;layout(location=2)out vec4 o_secondaryColor;layout(location=3)out vec4 o_rotation;layout(location=4)out vec4 o_transform;void main(){o_character=vec4(v_character,1.);o_primaryColor=v_primaryColor;o_secondaryColor=v_secondaryColor;o_rotation=vec4(v_rotation,0.,1.);o_transform=vec4(v_transform,1.);}`),this.Jt=new z(this.gt,j,`#version 300 es
|
|
10
10
|
precision highp float;in vec2 v_uv;uniform sampler2D Ue;uniform sampler2D Uf;uniform sampler2D Ug;uniform sampler2D Uh;uniform sampler2D Ui;uniform vec2 Uj;layout(location=0)out vec4 o_character;layout(location=1)out vec4 o_primaryColor;layout(location=2)out vec4 o_secondaryColor;layout(location=3)out vec4 o_rotation;layout(location=4)out vec4 o_transform;void main(){vec2 A=vec2(v_uv.x,1.-v_uv.y);vec2 B=A*Uj;vec2 C=(floor(B)+0.5f)/Uj;vec4 D=texture(Ue,C);vec4 E=texture(Uf,C);if(E.a==0.){discard;}vec4 F=texture(Ug,C);vec4 G=texture(Uh,C);vec4 H=texture(Ui,C);o_character=D;o_primaryColor=E;o_secondaryColor=F;o_rotation=G;o_transform=H;}`),this.ts=new z(this.gt,rt,"precision mediump float;uniform sampler2D U0;uniform vec2 U1;uniform sampler2D U3;uniform sampler2D U4;uniform sampler2D U5;uniform sampler2D U2;uniform sampler2D U6;uniform vec2 U7;uniform vec2 U8;mat2 A(float B){float C=sin(B);float D=cos(B);return mat2(D,-C,C,D);}void main(){vec2 E=gl_FragCoord.xy/U8;vec2 F=E*U7;vec2 G=floor(F);vec2 H=(G+0.5)/U7;vec4 I=texture2D(U3,H);vec4 J=texture2D(U4,H);vec4 K=texture2D(U5,H);bool L=K.r>0.5;bool M=K.g>0.5;bool N=K.b>0.5;vec4 O=texture2D(U2,H);int P=int(O.r*255.+0.5)+int(O.g*255.+0.5)*256;int Q=int(mod(float(P),U1.x));int R=P/int(U1.x);float S=(U1.y-1.)-float(R);vec2 T=vec2(float(Q),S)/U1;vec4 U=texture2D(U6,H);float V=U.r*255.+U.g;float W=-(V*360./255.)*0.017453292;vec2 X=fract(F)-0.5;if(M)X.x=-X.x;if(N)X.y=-X.y;X=A(W)*X+0.5;vec2 Y=1./U1;vec2 Z=T+X*Y;vec2 a=T+Y;if(any(lessThan(Z,T))||any(greaterThan(Z,a))){gl_FragColor=L?I:J;return;}vec4 b=texture2D(U0,Z);if(L)b.rgb=1.-b.rgb;gl_FragColor=mix(J,I,b);}"),this.ss=new z(this.gt,j,`#version 300 es
|
|
11
|
-
precision highp float;in vec2 v_uv;uniform sampler2D Uk;uniform bool Ul;uniform bool Um;uniform bool Un;uniform vec2 Uo;uniform bool Up;uniform vec4 Uq;uniform bool Ur;uniform vec4 Us;uniform vec4 Ut;uniform int Uu;uniform vec3 Uv[64];layout(location=0)out vec4 o_character;layout(location=1)out vec4 o_primaryColor;layout(location=2)out vec4 o_secondaryColor;layout(location=3)out vec4 o_rotation;layout(location=4)out vec4 o_transform;float A(vec3 B){return dot(B,vec3(0.299f,0.587f,0.114f));}void main(){vec2 C=vec2(v_uv.x,1.0f-v_uv.y);vec4 D=texture(Uk,C);float E=A(D.rgb);if(Uu>0){float F=float(Uu);float G=clamp(E*(F-1.0f),0.0f,F-1.0f);int H=int(floor(G+0.5f));vec3 I=Uv[H];o_character=vec4(I,1.0f);}else{o_character=vec4(E,0.0f,0.0f,1.0f);}vec4 J=Up?Uq:D;vec4 K=Ur?Us:D;if(D.a<0.01f){J=Ut;K=Ut;}else{}o_primaryColor=vec4(J);o_secondaryColor=vec4(K);o_rotation=vec4(Uo.xy,0.0f,1.0f);o_transform=vec4(float(Ul),float(Um),float(Un),1.0f);}`)}es(){return this.Jt}At(){return this.Qt}rs(){return this.ts}ns(){return this.ss}hs(t){return new z(this.gt,j,t)}cs(t,i){return new z(this.gt,t,i)}kt(){this.Jt.kt(),this.Qt.kt(),this.ts.kt(),this.ss.kt()}}var A=(l=>(l.RECTANGLE="rectangle",l.LINE="line",l.ELLIPSE="ellipse",l.ARC="arc",l.TRIANGLE="triangle",l.BEZIER_CURVE="bezier_curve",l.CUSTOM="custom",l))(A||{});class pt{constructor(t){c(this,"gt");c(this,"ls",new Map);this.gt=t}us(t,i,r,n){const o=this.gt;let h=this.ls.get(t);h||(h=new Map,this.ls.set(t,h));let a=h.get(i)||null;if(!a){a=o.createVertexArray(),h.set(i,a),o.bindVertexArray(a),o.bindBuffer(o.ARRAY_BUFFER,n);const u=o.getAttribLocation(t,"a_position");u!==-1&&(o.enableVertexAttribArray(u),o.vertexAttribPointer(u,r.ds.fs.size,o.FLOAT,!1,r._s,r.ds.fs.offset),o.vertexAttribDivisor(u,0));const f=o.getAttribLocation(t,"a_texCoord");f!==-1&&(o.enableVertexAttribArray(f),o.vertexAttribPointer(f,r.ds.ps.size,o.FLOAT,!1,r._s,r.ds.ps.offset),o.vertexAttribDivisor(f,0))}o.bindVertexArray(a)}vs(){this.gt.bindVertexArray(null)}kt(){for(const[,t]of this.ls)for(const[,i]of t)i&&this.gt.deleteVertexArray(i)}}class vt{constructor(t,i){c(this,"gs");c(this,"gt");c(this,"xt");c(this,"Cs",null);c(this,"ws",null);this.gt=t,this.gs=new pt(t),this.xt=i}bs(t,i,r){const{shader:n}=t,o=V(this.gt)||this.gt.getParameter(this.gt.VIEWPORT);n.Xt({U9:o[2]/o[3],Uw:[o[2],o[3]]});const h=f=>{if(!f||!f.$s())return;const g=f.unitGeometry,d=f.unitBuffer;try{this.gs.us(n.Zt,f.type+"",g,d),f.batch.Ms(n),f.batch.Rs(g.Fs,g.Ss)}finally{f.batch.Ts(n),this.gs.vs(),f.As()}};let a=null,u=null;for(const f of i){if(f.type===A.CUSTOM){u&&(h(u),a=null,u=null),this.zs(t,f.params,f.state,r.get(A.RECTANGLE));continue}a!==null&&f.type!==a&&(h(u),a=null,u=null);let g=u;g&&f.type===a||(g=r.get(f.type)||null,u=g,a=f.type),g&&g.Es(f.params,f.state)}h(u)}zs(t,i,r,n){const{x:o,y:h,width:a,height:u,shader:f,uniforms:g}=i,d=this.Ps(Math.max(1,Math.floor(a)),Math.max(1,Math.floor(u)));d.begin(),this.ks(n,f,g,0,0,d.width,d.height,{}),d.end();const v=this.Ls(),y={Ue:d.textures[0],Uf:d.textures[1],Ug:d.textures[2],Uh:d.textures[3],Ui:d.textures[4],Uj:[d.width,d.height]};this.ks(n,v,y,Math.floor(o),Math.floor(h),Math.max(1,Math.floor(a)),Math.max(1,Math.floor(u)),r),t.shader.Ht()}ks(t,i,r,n,o,h,a,u){i.Ht(),i.Xt(r);const f=this.gt.getParameter(this.gt.VIEWPORT);if(i.Xt({U9:f[2]/f[3],Uw:[f[2],f[3]]}),t.As(),t.Es({x:n,y:o,width:h,height:a},u),t.$s()){const g=t.unitGeometry,d=t.unitBuffer;try{this.gs.us(i.Zt,t.type+"",g,d),t.batch.Ms(i),t.batch.Rs(g.Fs,g.Ss)}finally{t.batch.Ts(i),this.gs.vs(),t.As()}}}Ls(){return this.xt.es()}Ps(t,i){return this.Cs&&this.ws&&this.ws.w===t&&this.ws.h===i||(this.Cs&&this.Cs.kt(),this.Cs=new $(this.gt,t,i,5),this.ws={w:t,h:i}),this.Cs}kt(){this.gs.kt(),this.Cs&&this.Cs.kt()}}class Et{constructor(){c(this,"Ds",[]);c(this,"Bs",1);c(this,"Gs",0)}Is(t){if(this.Gs>=this.Ds.length){const r={id:this.Bs++,type:t,params:{},state:{W:1,H:0,K:0,X:0,Y:[0,0,0],V:[1,1,1,1],q:[0,0,0,1],N:!1,j:!1,L:!1,D:[0,0]}};this.Ds.push(r)}const i=this.Ds[this.Gs];return i.id=this.Bs++,i.type=t,this.Gs++,i}Os(t,i,r,n,o){const h=this.Is(A.RECTANGLE);return h.params.x=t,h.params.y=i,h.params.width=r,h.params.height=n,o.J(h.state),h.id}Ws(t,i,r,n,o,h,a){const u=this.Is(A.CUSTOM);return u.params.x=t,u.params.y=i,u.params.width=r,u.params.height=n,u.params.shader=o,u.params.uniforms=h,a.J(u.state),u.id}Hs(t,i,r,n,o,h){const a=this.Is(A.LINE);return a.params.x1=t,a.params.y1=i,a.params.x2=r,a.params.y2=n,a.params.thickness=o,h.J(a.state),a.id}Ks(t,i,r,n,o){const h=this.Is(A.ELLIPSE);return h.params.x=t,h.params.y=i,h.params.width=r,h.params.height=n,o.J(h.state),h.id}Xs(t,i,r,n,o,h,a){const u=this.Is(A.ARC);return u.params.x=t,u.params.y=i,u.params.width=r,u.params.height=n,u.params.start=o,u.params.stop=h,a.J(u.state),u.id}Ns(t,i,r,n,o,h,a){const u=this.Is(A.TRIANGLE);return u.params.x1=t,u.params.y1=i,u.params.x2=r,u.params.y2=n,u.params.x3=o,u.params.y3=h,a.J(u.state),u.id}js(t,i,r,n,o,h,a,u,f,g){const d=this.Is(A.BEZIER_CURVE);return d.params.x1=t,d.params.y1=i,d.params.cp1x=r,d.params.cp1y=n,d.params.cp2x=o,d.params.cp2y=h,d.params.x2=a,d.params.y2=u,d.params.thickness=f,g.J(d.state),d.id}get length(){return this.Gs}get isEmpty(){return this.Gs===0}Ys(){this.Gs=0}[Symbol.iterator](){let t=0;const i=this.Gs,r=this.Ds;return{next:()=>t<i?{value:r[t++],done:!1}:{value:void 0,done:!0}}}}const S=class S{static Vs(t,i,r=0){var h,a,u,f,g,d,v,y,p,m;const n=i||new Float32Array(S.FLOATS_PER_INSTANCE);let o=r;return n[o++]=t.fs[0],n[o++]=t.fs[1],n[o++]=t.Gs[0],n[o++]=t.Gs[1],n[o++]=t.Y[0],n[o++]=t.Y[1],n[o++]=t.Y[2],n[o++]=t.V[0],n[o++]=t.V[1],n[o++]=t.V[2],n[o++]=t.V[3],n[o++]=t.q[0],n[o++]=t.q[1],n[o++]=t.q[2],n[o++]=t.q[3],n[o++]=t.D[0],n[o++]=t.D[1],n[o++]=t.qs[0],n[o++]=t.qs[1],n[o++]=t.qs[2],n[o++]=t.H,n[o++]=t.K,n[o++]=t.X,n[o++]=t.Zs[0],n[o++]=t.Zs[1],n[o++]=((h=t.Js)==null?void 0:h[0])||0,n[o++]=((a=t.Js)==null?void 0:a[1])||0,n[o++]=((u=t.Qs)==null?void 0:u[0])||0,n[o++]=((f=t.Qs)==null?void 0:f[1])||0,n[o++]=((g=t.te)==null?void 0:g[0])||0,n[o++]=((d=t.te)==null?void 0:d[1])||0,n[o++]=((v=t.se)==null?void 0:v[0])||0,n[o++]=((y=t.se)==null?void 0:y[1])||0,n[o++]=((p=t.ee)==null?void 0:p[0])||0,n[o++]=((m=t.ee)==null?void 0:m[1])||0,n}static ie(t){const i=t.length*S.FLOATS_PER_INSTANCE,r=new Float32Array(i);for(let n=0;n<t.length;n++){const o=n*S.FLOATS_PER_INSTANCE;S.Vs(t[n],r,o)}return r}};c(S,"BYTES_PER_INSTANCE",140),c(S,"FLOATS_PER_INSTANCE",35);let I=S;const _=class _{};c(_,"STRIDE",I.BYTES_PER_INSTANCE),c(_,"ATTRIBUTES",{a_instancePosition:{location:-1,size:2,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:_.STRIDE,offset:0,divisor:1},a_instanceSize:{location:-1,size:2,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:_.STRIDE,offset:8,divisor:1},a_instanceCharacter:{location:-1,size:3,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:_.STRIDE,offset:16,divisor:1},a_instancePrimaryColor:{location:-1,size:4,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:_.STRIDE,offset:28,divisor:1},a_instanceSecondaryColor:{location:-1,size:4,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:_.STRIDE,offset:44,divisor:1},a_instanceRotation:{location:-1,size:2,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:_.STRIDE,offset:60,divisor:1},a_instanceTransform:{location:-1,size:3,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:_.STRIDE,offset:68,divisor:1},a_instanceGlobalRotation:{location:-1,size:3,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:_.STRIDE,offset:80,divisor:1},a_instanceRotationCenter:{location:-1,size:2,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:_.STRIDE,offset:92,divisor:1},a_instanceArcAngles:{location:-1,size:2,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:_.STRIDE,offset:100,divisor:1},a_instanceBezierCP1:{location:-1,size:2,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:_.STRIDE,offset:108,divisor:1},a_instanceBezierCP2:{location:-1,size:2,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:_.STRIDE,offset:116,divisor:1},a_instanceBezierStart:{location:-1,size:2,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:_.STRIDE,offset:124,divisor:1},a_instanceBezierEnd:{location:-1,size:2,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:_.STRIDE,offset:132,divisor:1}});let q=_;class yt{constructor(t,i=1e3,r=1.5){c(this,"gt");c(this,"re",[]);c(this,"ne");c(this,"oe");c(this,"he",null);c(this,"ae",!0);c(this,"ce",0);c(this,"le",new Map);c(this,"ue",null);this.gt=t,this.ne=i,this.oe=r,this.fe()}Es(t){const i=this.re.length;return this.re.push(t),this.ae=!0,i}get count(){return this.re.length}get isEmpty(){return this.re.length===0}clear(){this.re.length=0,this.ae=!0}de(t){if(t<=this.ne)return;const i=Math.ceil(t*this.oe);this.ne=i,this.fe()}fe(){const t=this.gt;this.he&&t.deleteBuffer(this.he),this.he=t.createBuffer();const i=this.ne*I.BYTES_PER_INSTANCE;t.bindBuffer(t.ARRAY_BUFFER,this.he),t.bufferData(t.ARRAY_BUFFER,i,t.DYNAMIC_DRAW),t.bindBuffer(t.ARRAY_BUFFER,null),this.ae=!0,this.ce=0}_e(){if(!this.ae||this.re.length===0)return;const t=this.gt,i=this.re.length;this.de(i),(!this.ue||this.ue.length<i*I.FLOATS_PER_INSTANCE)&&(this.ue=new Float32Array(i*I.FLOATS_PER_INSTANCE));const r=I.ie(this.re);t.bindBuffer(t.ARRAY_BUFFER,this.he),i<=this.ce?t.bufferSubData(t.ARRAY_BUFFER,0,r):t.bufferData(t.ARRAY_BUFFER,r,t.DYNAMIC_DRAW),t.bindBuffer(t.ARRAY_BUFFER,null),this.ae=!1,this.ce=i}pe(t){let i=this.le.get(t);if(!i){i=new Map;const r=this.gt;for(const n in q.ATTRIBUTES){const o=r.getAttribLocation(t,n);o!==-1&&i.set(n,o)}this.le.set(t,i)}return i}Ms(t){if(!this.he||this.re.length===0)return;const i=this.gt,r=t.Zt;this._e();const n=this.pe(r);i.bindBuffer(i.ARRAY_BUFFER,this.he);for(const[o,h]of n){const a=q.ATTRIBUTES[o];a&&(i.enableVertexAttribArray(h),i.vertexAttribPointer(h,a.size,a.type,a.normalized,a.stride,a.offset),i.vertexAttribDivisor(h,a.divisor))}}Ts(t){const i=this.gt,r=this.pe(t.Zt);for(const[,n]of r)i.disableVertexAttribArray(n),i.vertexAttribDivisor(n,0)}Rs(t,i){this.re.length!==0&&this.gt.drawArraysInstanced(t,0,i,this.re.length)}kt(){this.he&&this.gt.deleteBuffer(this.he)}}class N{constructor(t,i,r,n){c(this,"gt");c(this,"me");c(this,"ve");c(this,"ge");c(this,"ye",null);this.gt=t,this.me=i,this.ve=r,this.ge=n;const o=this.gt.createBuffer();if(!o)throw Error("Failed to create unit geometry buffer");this.gt.bindBuffer(this.gt.ARRAY_BUFFER,o),this.gt.bufferData(this.gt.ARRAY_BUFFER,this.ge.Ce,this.gt.STATIC_DRAW),this.gt.bindBuffer(this.gt.ARRAY_BUFFER,null),this.ye=o}get type(){return this.ve}get unitGeometry(){return this.ge}get unitBuffer(){return this.ye}get batch(){return this.me}As(){this.me.clear()}$s(){return!this.me.isEmpty}kt(){this.me.kt(),this.gt.deleteBuffer(this.ye)}we(t,i,r,n,o){const h=this.be(t,i,r,n,o.H||0,o.K||0,o.X||0);return{fs:[t,i],Gs:[r,n],Y:o.Y||[0,0,0],V:o.V||[1,1,1,1],q:o.q||[0,0,0,1],D:o.D||[0,0],qs:[o.L?1:0,o.N?1:0,o.j?1:0],H:h.radiansX,K:h.radiansY,X:h.radiansZ,Zs:[h.centerX,h.centerY]}}$e(t,i){const r=V(this.gt)||[0,0,this.gt.canvas.width,this.gt.canvas.height];return{nx:t/r[2]*2-1,ny:1-i/r[3]*2}}xe(t,i,r){const n=this.$e(i,r);t.Zs=[n.nx,n.ny]}be(t,i,r,n,o,h,a){const u=V(this.gt)||[0,0,this.gt.canvas.width,this.gt.canvas.height],f=u[2],g=u[3];return{centerX:(t+r/2)/f*2-1,centerY:1-(i+n/2)/g*2,radiansX:-o*Math.PI/180,radiansY:-h*Math.PI/180,radiansZ:-a*Math.PI/180,aspectRatio:f/g}}}const xt={Ce:new Float32Array([0,0,0,0,1,0,1,0,0,1,0,1,0,1,0,1,1,0,1,0,1,1,1,1]),Ss:6,Fs:WebGL2RenderingContext.TRIANGLES,_s:16,ds:{fs:{size:2,offset:0},ps:{size:2,offset:8}}};class wt extends N{constructor(t,i){super(t,i,A.RECTANGLE,xt)}Es(t,i){const r=this.we(t.x,t.y,t.width,t.height,i);return this.me.Es(r)}}const At={Ce:new Float32Array([0,-.5,0,0,1,-.5,1,0,0,.5,0,1,0,.5,0,1,1,-.5,1,0,1,.5,1,1]),Ss:6,Fs:WebGL2RenderingContext.TRIANGLES,_s:16,ds:{fs:{size:2,offset:0},ps:{size:2,offset:8}}};class Tt extends N{constructor(t,i){super(t,i,A.LINE,At)}Es(t,i){const r=t.x2-t.x1,n=t.y2-t.y1,o=Math.hypot(r,n),h=t.thickness||i.W||1,a=t.x1+r/2,u=t.y1+n/2,f=a-o/2,g=u,d=this.we(f,g,o,h,i);return this.xe(d,a,u),this.me.Es(d)}}const Rt={Ce:function(l=32){const t=[],i=2*Math.PI/l;for(let r=0;r<l;r++){const n=r*i,o=(r+1)%l*i,h=Math.cos(n),a=Math.sin(n),u=.5*(h+1),f=.5*(a+1),g=Math.cos(o),d=Math.sin(o),v=.5*(g+1),y=.5*(d+1);t.push(0,0,.5,.5,h,a,u,f,g,d,v,y)}return new Float32Array(t)}(32),Ss:96,Fs:WebGL2RenderingContext.TRIANGLES,_s:16,ds:{fs:{size:2,offset:0},ps:{size:2,offset:8}}};class bt extends N{constructor(t,i){super(t,i,A.ELLIPSE,Rt)}Es(t,i){const r=this.we(t.x,t.y,t.width,t.height,i);return this.xe(r,t.x,t.y),this.me.Es(r)}}let Ct={Ce:function(l){const t=[];for(let i=0;i<l;i++){const r=i/l,n=(i+1)/l;t.push(r,0,r,0,r,1,r,1,n,1,n,1)}return new Float32Array(t)}(32),Ss:96,Fs:WebGL2RenderingContext.TRIANGLES,_s:16,ds:{fs:{size:2,offset:0},ps:{size:2,offset:8}}};class _t extends N{constructor(t,i){super(t,i,A.ARC,Ct)}Es(t,i){const r=t.x-t.width/2,n=t.y-t.height/2,o=t.start*Math.PI/180,h=t.stop*Math.PI/180,a=this.we(r,n,t.width,t.height,i);return this.xe(a,t.x,t.y),a.Js=[o,h],this.me.Es(a)}}const Ut={Ce:new Float32Array([0,0,0,0,1,0,1,0,.5,1,.5,1]),Ss:3,Fs:WebGL2RenderingContext.TRIANGLES,_s:16,ds:{fs:{size:2,offset:0},ps:{size:2,offset:8}}};class Dt extends N{constructor(t,i){super(t,i,A.TRIANGLE,Ut)}Es(t,i){const r=Math.min(t.x1,t.x2,t.x3),n=Math.max(t.x1,t.x2,t.x3),o=Math.min(t.y1,t.y2,t.y3),h=n-r,a=Math.max(t.y1,t.y2,t.y3)-o,u=this.we(r,o,h,a,i),f=r+.5*h,g=o+a*(1/3);return this.xe(u,f,g),this.me.Es(u)}}function nt(l,t,i,r,n){const o=1-l,h=o*o,a=l*l;return h*o*t+3*h*l*i+3*o*a*r+a*l*n}const Ft={Ce:function(l=16){const t=[];for(let i=0;i<l;i++){const r=i/l,n=(i+1)/l;t.push(r,-.5,r,0),t.push(n,-.5,n,0),t.push(r,.5,r,1),t.push(r,.5,r,1),t.push(n,-.5,n,0),t.push(n,.5,n,1)}return new Float32Array(t)}(16),Ss:96,Fs:WebGL2RenderingContext.TRIANGLES,_s:16,ds:{fs:{size:2,offset:0},ps:{size:2,offset:8}}};class Lt extends N{constructor(t,i){super(t,i,A.BEZIER_CURVE,Ft)}Es(t,i){const r=i.W||1,n=nt(.5,t.x1,t.cp1x,t.cp2x,t.x2),o=nt(.5,t.y1,t.cp1y,t.cp2y,t.y2),h=this.we(0,0,1,r,i);return this.xe(h,n,o),h.se=[t.x1,t.y1],h.Qs=[t.cp1x,t.cp1y],h.te=[t.cp2x,t.cp2y],h.ee=[t.x2,t.y2],this.me.Es(h)}}class Pt{constructor(t){c(this,"gt");c(this,"Me",null);c(this,"Re");c(this,"Fe",null);c(this,"Se",{});c(this,"Te",null);c(this,"Ae",new Map);c(this,"ze");c(this,"Ee");c(this,"Pe");c(this,"I",[]);this.gt=t,this.Re=new mt(t),this.Pe=new st,this.ze=new vt(t,this),this.Ee=new Et,this.Te=t.createBuffer(),H(this.gt,[0,0,this.gt.canvas.width,this.gt.canvas.height])}ke(t){let i=this.Ae.get(t);if(i)return i;const r=new yt(this.gt);return i=(0,{[A.RECTANGLE]:()=>new wt(this.gt,r),[A.LINE]:()=>new Tt(this.gt,r),[A.ELLIPSE]:()=>new bt(this.gt,r),[A.ARC]:()=>new _t(this.gt,r),[A.TRIANGLE]:()=>new Dt(this.gt,r),[A.BEZIER_CURVE]:()=>new Lt(this.gt,r)}[t])(),this.Ae.set(t,i),i}Le(t){this.Me!==t&&(this.Me=t,t.Ht())}cs(t,i){return this.Re.cs(t,i)}es(){return this.Re.es()}At(){return this.Re.At()}rs(){return this.Re.rs()}ns(){return this.Re.ns()}De(t){this.Fe=t,t&&(this.Se={})}Nt(t,i){this.Se[t]=i}Be(t){Object.assign(this.Se,t)}hs(t){return this.Re.hs(t)}Ge(t,i,r,n,o){const h=this.es(),a={Ue:t.textures[0],Uf:t.textures[1],Ug:t.textures[2],Uh:t.textures[3],Ui:t.textures[4],Uj:[t.width,t.height]};this.Ee.Ws(i,r,n,o,h,a,this.Pe)}Ie(t,i,r,n,o){const h=this.ns(),a=t.Oe(),u={Uk:a.texture,Ul:!!a.invert,Um:!!a.flipX,Un:!!a.flipY,Uo:a.charRotation,Up:a.charColorFixed,Uq:a.charColor,Ur:a.cellColorFixed,Us:a.cellColor,Ut:a.backgroundColor,Uu:a.charCount,Uv:a.charList};this.Ee.Ws(i,r,n,o,h,u,this.Pe)}We(t,i,r,n){var m;const o=this.gt,h=o.canvas.width,a=o.canvas.height,u=t/h*2-1,f=(t+r)/h*2-1,g=1-i/a*2,d=1-(i+n)/a*2,v=new Float32Array([u,d,f,d,u,g,f,d,f,g,u,g]);o.bindBuffer(o.ARRAY_BUFFER,this.Te),o.bufferData(o.ARRAY_BUFFER,v,o.DYNAMIC_DRAW);const y=((m=this.Me)==null?void 0:m.Zt)||o.getParameter(o.CURRENT_PROGRAM),p=y?o.getAttribLocation(y,"a_position"):-1;p!==-1&&(o.enableVertexAttribArray(p),o.vertexAttribPointer(p,2,o.FLOAT,!1,8,0)),o.drawArrays(o.TRIANGLES,0,6),p!==-1&&o.disableVertexAttribArray(p)}He(t,i,r,n){this.Fe?(this.Ee.Ws(t,i,r,n,this.Fe,{...this.Se},this.Pe),this.Fe=null,this.Se={}):this.Ee.Os(t,i,r,n,this.Pe)}Ke(t,i,r,n){this.Ee.Hs(t,i,r,n,this.Pe.lineWeight,this.Pe)}Xe(t,i,r,n){this.Ee.Ks(t,i,r,n,this.Pe)}Ne(t,i,r,n,o,h){this.Ee.Ns(t,i,r,n,o,h,this.Pe)}je(t,i,r,n,o,h,a,u){const f=this.Pe.lineWeight;this.Ee.js(t,i,r,n,o,h,a,u,f,this.Pe)}Ye(t,i,r=1,n={}){return new $(this.gt,t,i,r,n,this,!0)}Ve(t,i,r,n,o,h){this.Ee.Xs(t,i,r,n,o,h,this.Pe)}qe(t,i=t,r=t,n=255){this.Pe.ft(t,i,r,n),this.Ys(t/255,i/255,r/255,n/255)}Ys(t=0,i=0,r=0,n=0){this.gt.clearColor(t,i,r,n),this.gt.clear(this.gt.COLOR_BUFFER_BIT)}Ze(){this.gt.viewport(0,0,this.gt.canvas.width,this.gt.canvas.height),H(this.gt,[0,0,this.gt.canvas.width,this.gt.canvas.height])}get context(){return this.gt}get state(){return this.Pe}Et(t){this.I.push(this.Pe),this.Pe=t}Pt(){const t=this.I.pop();t&&(this.Pe=t)}zt(t){const i=t,r=V(this.gt)??this.gt.getParameter(this.gt.VIEWPORT),n={shader:i,gl:this.gt,viewport:r};this.Le(i);const o=new Set;for(const h of this.Ee)h.type===A.CUSTOM?o.add(A.RECTANGLE):o.add(h.type);for(const h of o)h!==A.CUSTOM&&this.ke(h);this.ze.bs(n,this.Ee,this.Ae),this.Ee.Ys()}kt(){this.gt.deleteBuffer(this.Te),this.Ee.Ys();for(const t of this.Ae.values())t.kt();this.Re.kt(),this.ze.kt()}}const C={readShort:(l,t)=>(C.t.uint16[0]=l[t]<<8|l[t+1],C.t.int16[0]),readUshort:(l,t)=>l[t]<<8|l[t+1],readUshorts(l,t,i){const r=[];for(let n=0;n<i;n++)r.push(C.readUshort(l,t+2*n));return r},readUint(l,t){const i=C.t.uint8;return i[3]=l[t],i[2]=l[t+1],i[1]=l[t+2],i[0]=l[t+3],C.t.uint32[0]},readASCII(l,t,i){let r="";for(let n=0;n<i;n++)r+=String.fromCharCode(l[t+n]);return r},writeUshort(l,t,i){l[t]=i>>>8&255,l[t+1]=255&i},writeUint(l,t,i){l[t]=i>>>24&255,l[t+1]=i>>>16&255,l[t+2]=i>>>8&255,l[t+3]=255&i},writeASCII(l,t,i){for(let r=0;r<i.length;r++)l[t+r]=255&i.charCodeAt(r)},t:(()=>{const l=new ArrayBuffer(8);return{uint8:new Uint8Array(l),int16:new Int16Array(l),uint16:new Uint16Array(l),uint32:new Uint32Array(l)}})()};function K(l){return l+3&-4}function Q(l,t,i){const r=t+i;let n=0;const o=C.t;for(let h=t;h<r;h+=4)o.uint8[3]=l[h]||0,o.uint8[2]=l[h+1]||0,o.uint8[1]=l[h+2]||0,o.uint8[0]=l[h+3]||0,n=n+(o.uint32[0]>>>0)>>>0;return n>>>0}class Bt{constructor(t){c(this,"b");c(this,"p",0);c(this,"bitbuf",0);c(this,"bitcnt",0);this.b=t}readBits(t){for(;this.bitcnt<t;){const r=this.b[this.p++]||0;this.bitbuf|=r<<this.bitcnt,this.bitcnt+=8}const i=this.bitbuf&(1<<t)-1;return this.bitbuf>>>=t,this.bitcnt-=t,i}alignToByte(){this.bitbuf=0,this.bitcnt=0}get offset(){return this.p}}function X(l){let t=32,i=0;for(const a of l)a&&(a<t&&(t=a),a>i&&(i=a));if(i===0)return{min:0,max:0,table:new Map};const r=new Uint32Array(i+1);for(const a of l)a&&r[a]++;const n=new Uint32Array(i+1);let o=0;r[0]=0;for(let a=1;a<=i;a++)o=o+r[a-1]<<1,n[a]=o;const h=new Map;for(let a=0;a<l.length;a++){const u=l[a];if(!u)continue;const f=n[u]++;let g=h.get(u);g||(g=[],h.set(u,g)),g[St(f,u)]=a}return{min:t,max:i,table:h}}function tt(l,t){let i=0;for(let r=1;r<=t.max;r++){i|=l.readBits(1)<<r-1;const n=t.table.get(r);if(n&&i<n.length){const o=n[i];if(o!==void 0)return o}}throw Error("Invalid Huffman code")}function St(l,t){let i=0;for(let r=0;r<t;r++)i=i<<1|1&l,l>>>=1;return i>>>0}function Mt(l){if(l.length<2)throw Error("ZLIB data too short");const t=l[0],i=l[1];if((15&t)!=8)throw Error("Unsupported ZLIB compression method");if(((t<<8)+i)%31!=0)throw Error("Bad ZLIB header check");let r=2;32&i&&(r+=4);const n=[];return function(o,h){const a=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258],u=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],f=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577],g=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13];let d=0;for(;!d;){d=o.readBits(1);const v=o.readBits(2);if(v===0){o.alignToByte();const y=o.readBits(16);if((65535&(65535^y))!==o.readBits(16))throw Error("DEFLATE uncompressed LEN/NLEN mismatch");for(let p=0;p<y;p++)h.push(o.readBits(8))}else{if(v!==1&&v!==2)throw Error("Unsupported DEFLATE type");{let y,p;if(v===1){const m=Array(288).fill(0);for(let x=0;x<=143;x++)m[x]=8;for(let x=144;x<=255;x++)m[x]=9;for(let x=256;x<=279;x++)m[x]=7;for(let x=280;x<=287;x++)m[x]=8;y=X(m),p=X(Array(32).fill(5))}else{const m=o.readBits(5)+257,x=o.readBits(5)+1,E=o.readBits(4)+4,T=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],w=Array(19).fill(0);for(let L=0;L<E;L++)w[T[L]]=o.readBits(3);const F=X(w),U=[];for(;U.length<m+x;){const L=tt(o,F);if(L<=15)U.push(L);else if(L===16){const k=o.readBits(2)+3,O=U[U.length-1]||0;for(let gt=0;gt<k;gt++)U.push(O)}else if(L===17){const k=o.readBits(3)+3;for(let O=0;O<k;O++)U.push(0)}else{if(L!==18)throw Error("Invalid code length symbol");{const k=o.readBits(7)+11;for(let O=0;O<k;O++)U.push(0)}}}const D=U.slice(0,m),P=U.slice(m,m+x);y=X(D),p=X(P)}for(;;){const m=tt(o,y);if(m<256)h.push(m);else{if(m===256)break;if(m>256&&m<286){const x=m-257;let E=a[x];const T=u[x];T&&(E+=o.readBits(T));const w=tt(o,p);if(w>=30)throw Error("Invalid distance symbol");let F=f[w];const U=g[w];U&&(F+=o.readBits(U));const D=h.length-F;if(D<0)throw Error("Invalid distance");for(let P=0;P<E;P++)h.push(h[D+P]||0)}else if(m===286||m===287)throw Error("Reserved length symbol")}}}}}}(new Bt(l.subarray(r)),n),new Uint8Array(n)}function It(l){const t=C,i=new Uint8Array(l);if(t.readASCII(i,0,4)!=="wOFF")throw Error("Invalid WOFF signature");const r=t.readUint(i,4),n=t.readUshort(i,12),o=t.readUint(i,16),h=[];let a=44;for(let E=0;E<n;E++){const T=t.readASCII(i,a,4),w=t.readUint(i,a+4),F=t.readUint(i,a+8),U=t.readUint(i,a+12),D=t.readUint(i,a+16);h.push({tag:T,offset:w,compLength:F,origLength:U,checksum:D}),a+=20}for(const E of h){const T=new Uint8Array(i.buffer,E.offset,E.compLength);if(E.compLength===E.origLength)E.data=new Uint8Array(T);else if(E.data=Mt(T),E.data.length!==E.origLength)if(E.data.length<E.origLength){const w=new Uint8Array(E.origLength);w.set(E.data),E.data=w}else E.data=E.data.subarray(0,E.origLength)}const u=n;let f=1,g=0;for(;f<<1<=u;)f<<=1,g++;const d=16*f,v=16*u-d;let y=12+16*u;const p={};for(const E of h)p[E.tag]=y,y=K(y+E.data.length);const m=new Uint8Array(Math.max(o||0,y));t.writeUint(m,0,r),t.writeUshort(m,4,u),t.writeUshort(m,6,d),t.writeUshort(m,8,g),t.writeUshort(m,10,v);let x=12;for(const E of h){t.writeASCII(m,x,E.tag),x+=4;let T=E.data;if(E.tag==="head"&&T.length>=12){const w=new Uint8Array(T);t.writeUint(w,8,0);const F=Q(w,0,K(w.length));t.writeUint(m,x,F),x+=4}else{const w=Q(T,0,K(T.length));t.writeUint(m,x,w),x+=4}t.writeUint(m,x,p[E.tag]),x+=4,t.writeUint(m,x,E.data.length),x+=4}for(const E of h){const T=p[E.tag];m.set(E.data,T)}if(h.find(E=>E.tag==="head")){const E=p.head,T=function(w,F){const U=C,D=F+8,P=[w[D],w[D+1],w[D+2],w[D+3]];U.writeUint(w,D,0);const L=2981146554-(Q(w,0,K(w.length))>>>0)>>>0;return w[D]=P[0],w[D+1]=P[1],w[D+2]=P[2],w[D+3]=P[3],L>>>0}(m,E);t.writeUint(m,E+8,T)}return m.buffer}const Gt={parseTab(l,t,i){const r={tables:[],ids:{},off:t};l=new Uint8Array(l.buffer,t,i),t=0;const n=C,o=n.readUshort,h=o(l,t+=2);t+=2;const a=[];for(let u=0;u<h;u++){const f=o(l,t),g=o(l,t+=2);t+=2;const d=n.readUint(l,t);t+=4;const v=`p${f}e${g}`;let y=a.indexOf(d);if(y===-1){let p;y=r.tables.length,a.push(d);const m=o(l,d);p=m===4?this.parse4(l,d):m===12?this.parse12(l,d):{format:m},r.tables.push(p)}r.ids[v]=y}return r},parse4(l,t){const i=C,r=i.readUshort,n=i.readUshorts,o=t,h=r(l,t+=2);t+=2;const a=r(l,t+=2)>>>1,u={format:4,searchRange:r(l,t+=2),entrySelector:0,rangeShift:0,endCount:[],startCount:[],idDelta:[],idRangeOffset:[],glyphIdArray:[]};t+=2,u.entrySelector=r(l,t),t+=2,u.rangeShift=r(l,t),t+=2,u.endCount=n(l,t,a),t+=2*a,t+=2,u.startCount=n(l,t,a),t+=2*a;for(let f=0;f<a;f++)u.idDelta.push(i.readShort(l,t)),t+=2;return u.idRangeOffset=n(l,t,a),t+=2*a,u.glyphIdArray=n(l,t,o+h-t>>1),u},parse12(l,t){const i=C.readUint;i(l,t+=4),i(l,t+=4);const r=i(l,t+=4);t+=4;const n=new Uint32Array(3*r);for(let o=0;o<3*r;o+=3)n[o]=i(l,t+(o<<2)),n[o+1]=i(l,t+(o<<2)+4),n[o+2]=i(l,t+(o<<2)+8);return{format:12,groups:n}}},Ot={parseTab(l,t,i){const r=C;t+=18;const n=r.readUshort(l,t);t+=2,t+=16;const o=r.readShort(l,t);t+=2;const h=r.readShort(l,t);t+=2;const a=r.readShort(l,t);t+=2;const u=r.readShort(l,t);return t+=2,t+=6,{unitsPerEm:n,xMin:o,yMin:h,xMax:a,yMax:u,indexToLocFormat:r.readShort(l,t)}}},zt={parseTab(l,t,i){const r=C;t+=4;const n=["ascender","descender","lineGap","advanceWidthMax","minLeftSideBearing","minRightSideBearing","xMaxExtent","caretSlopeRise","caretSlopeRun","caretOffset","res0","res1","res2","res3","metricDataFormat","numberOfHMetrics"],o={};for(let h=0;h<n.length;h++){const a=n[h],u=a==="advanceWidthMax"||a==="numberOfHMetrics"?r.readUshort:r.readShort;o[a]=u(l,t+2*h)}return o}},Nt={parseTab(l,t,i,r){const n=C,o=[],h=[],a=r.maxp.numGlyphs,u=r.hhea.numberOfHMetrics;let f=0,g=0,d=0;for(;d<u;)f=n.readUshort(l,t+(d<<2)),g=n.readShort(l,t+(d<<2)+2),o.push(f),h.push(g),d++;for(;d<a;)o.push(f),h.push(g),d++;return{aWidth:o,lsBearing:h}}},ot={cmap:Gt,head:Ot,hhea:zt,maxp:{parseTab(l,t,i){const r=C;return r.readUint(l,t),t+=4,{numGlyphs:r.readUshort(l,t)}}},hmtx:Nt,loca:{parseTab(l,t,i,r){const n=C,o=[],h=r.head.indexToLocFormat,a=r.maxp.numGlyphs+1;if(h===0)for(let u=0;u<a;u++)o.push(n.readUshort(l,t+(u<<1))<<1);else if(h===1)for(let u=0;u<a;u++)o.push(n.readUint(l,t+(u<<2)));return o}},glyf:{parseTab(l,t,i,r){const n=[],o=r.maxp.numGlyphs;for(let h=0;h<o;h++)n.push(null);return n},Je(l,t){const i=C,r=l.Qe,n=l.loca;if(n[t]===n[t+1])return null;const o=B.findTable(r,"glyf",l.ti);if(!o)return null;let h=o[0]+n[t];const a={};if(a.noc=i.readShort(r,h),h+=2,a.xMin=i.readShort(r,h),h+=2,a.yMin=i.readShort(r,h),h+=2,a.xMax=i.readShort(r,h),h+=2,a.yMax=i.readShort(r,h),h+=2,a.xMin>=a.xMax||a.yMin>=a.yMax)return null;if(a.noc>0){a.endPts=[];for(let v=0;v<a.noc;v++)a.endPts.push(i.readUshort(r,h)),h+=2;const u=i.readUshort(r,h);if(h+=2,r.length-h<u)return null;h+=u;const f=a.endPts[a.noc-1]+1;a.flags=[];for(let v=0;v<f;v++){const y=r[h];if(h++,a.flags.push(y),8&y){const p=r[h];h++;for(let m=0;m<p;m++)a.flags.push(y),v++}}a.xs=[];for(let v=0;v<f;v++){const y=a.flags[v],p=!!(16&y);2&y?(a.xs.push(p?r[h]:-r[h]),h++):p?a.xs.push(0):(a.xs.push(i.readShort(r,h)),h+=2)}a.ys=[];for(let v=0;v<f;v++){const y=a.flags[v],p=!!(32&y);4&y?(a.ys.push(p?r[h]:-r[h]),h++):p?a.ys.push(0):(a.ys.push(i.readShort(r,h)),h+=2)}let g=0,d=0;for(let v=0;v<f;v++)g+=a.xs[v],d+=a.ys[v],a.xs[v]=g,a.ys[v]=d}else a.parts=[],a.endPts=[],a.flags=[],a.xs=[],a.ys=[];return a}}},B={parse(l){const t=new Uint8Array(l),i=C.readASCII(t,0,4);if(i==="wOFF")l=It(l);else if(i==="wOF2")throw Error("WOFF2 is not supported in this build (Brotli + WOFF2 transforms required)");return[((r,n,o,h)=>{const a=ot,u={Qe:r,si:n,ti:o};for(const f in a){const g=f,d=B.findTable(r,g,o);if(d){const[v,y]=d;let p=h[v];p==null&&(p=a[g].parseTab(r,v,y,u),h[v]=p),u[g]=p}}return u})(new Uint8Array(l),0,0,{})]},findTable(l,t,i){const r=C,n=r.readUshort(l,i+4);let o=i+12;for(let h=0;h<n;h++){const a=r.readASCII(l,o,4);r.readUint(l,o+4);const u=r.readUint(l,o+8),f=r.readUint(l,o+12);if(a===t)return[u,f];o+=16}return null},T:ot,B:C};class Wt{ei(t){var r;const i=[];return(r=t.cmap)!=null&&r.tables?(t.cmap.tables.forEach(n=>{if(n.format===4){const o=this.ii(n);i.push(...o)}else if(n.format===12){const o=this.ri(n);i.push(...o)}}),[...new Set(i)]):[]}ni(t){return t.filter(i=>this.oi(i))}ii(t){const i=[];if(!(t.startCount&&t.endCount&&t.idRangeOffset&&t.idDelta))return i;for(let r=0;r<t.startCount.length;r++){const n=t.startCount[r],o=t.endCount[r];if(n!==65535||o!==65535){for(let h=n;h<=o;h++)if(this.hi(t,h,r)>0)try{const a=String.fromCodePoint(h);i.push(a)}catch{}}}return i}ri(t){const i=[];if(!t.groups)return i;for(let r=0;r<t.groups.length;r+=3){const n=t.groups[r],o=t.groups[r+1],h=t.groups[r+2];for(let a=n;a<=o;a++)if(h+(a-n)>0)try{const u=String.fromCodePoint(a);i.push(u)}catch{}}return i}hi(t,i,r){if(t.idRangeOffset[r]===0)return i+t.idDelta[r]&65535;{const n=t.idRangeOffset[r]/2+(i-t.startCount[r])-(t.startCount.length-r);if(n>=0&&t.glyphIdArray&&n<t.glyphIdArray.length){const o=t.glyphIdArray[n];if(o!==0)return o+t.idDelta[r]&65535}}return 0}oi(t){const i=t.codePointAt(0)||0;return!(i>=0&&i<=31&&i!==9&&i!==10&&i!==13||i>=127&&i<=159)}}class et{constructor(){c(this,"ai",new Map);c(this,"ci",new Map)}li(t,i){const r=`${this.ui(t)}_${i}`;if(this.ai.has(r))return this.ai.get(r);const n=t.cmap;if(!n||!n.tables)return this.ai.set(r,0),0;let o=0;for(const h of n.tables)if(h.format===4?o=this.fi(i,h):h.format===12&&(o=this.di(i,h)),o>0)break;return this.ai.set(r,o),o}_i(t,i){const r=i.codePointAt(0);return r===void 0?0:this.li(t,r)}pi(t,i){const r=t.hmtx;return r&&r.aWidth&&r.aWidth.length!==0?i<r.aWidth.length?r.aWidth[i]:r.aWidth[r.aWidth.length-1]:0}mi(t,i){const r=i/t.head.unitsPerEm,n=t.hhea.ascender*r,o=t.hhea.descender*r,h=t.hhea.lineGap*r;return{ascender:n,descender:o,lineGap:h,lineHeight:n-o+h,unitsPerEm:t.head.unitsPerEm,scale:r}}gi(){this.ai.clear(),this.ci.clear()}ui(t){return`${t.ti}_${t.Qe.length}`}fi(t,i){const r=i.endCount.length;let n=-1;for(let o=0;o<r;o++)if(t<=i.endCount[o]){n=o;break}if(n===-1||t<i.startCount[n])return 0;if(i.idRangeOffset[n]===0)return t+i.idDelta[n]&65535;{const o=i.idRangeOffset[n]/2+(t-i.startCount[n])-(r-n);if(o>=0&&o<i.glyphIdArray.length){const h=i.glyphIdArray[o];return h===0?0:h+i.idDelta[n]&65535}}return 0}di(t,i){const r=i.groups.length/3;for(let n=0;n<r;n++){const o=i.groups[3*n],h=i.groups[3*n+1],a=i.groups[3*n+2];if(t>=o&&t<=h)return a+(t-o)}return 0}}class Yt{constructor(t){c(this,"yi");c(this,"Ci");c(this,"xt");c(this,"wi");this.xt=t,this.wi=new et,this.yi=document.createElement("canvas"),this.Ci=this.yi.getContext("2d",{willReadFrequently:!0,alpha:!0})}createTextureAtlas(t,i,r,n){const o=t.length,h=Math.ceil(Math.sqrt(o)),a=Math.ceil(o/h),u=i.width*h,f=i.height*a,g=typeof n=="object"?n:null;this.bi(u,f),this.$i(t,i,h,r,g);const d=this.xt.Ye(u,f,1,{filter:"nearest"});return d.Tt(this.yi),{framebuffer:d,columns:h,rows:a}}bi(t,i){this.yi.width=t,this.yi.height=i,this.yi.style.width=t+"px",this.yi.style.height=i+"px",this.Ci.imageSmoothingEnabled=!1,this.yi.style.imageRendering="pixelated",this.Ci.clearRect(0,0,t,i),this.Ci.textBaseline="top",this.Ci.textAlign="left",this.Ci.fillStyle="white"}$i(t,i,r,n,o){const h=n/o.head.unitsPerEm;for(let a=0;a<t.length;a++){const u=a%r,f=Math.floor(a/r),g=t[a].character,d=this.xi(o,g);if(!d)continue;const v=g.codePointAt(0)||0,y=this.wi.li(o,v),p=this.Mi(o,y)*h,m=u*i.width,x=f*i.height,E=m+.5*i.width,T=x+.5*i.height,w=Math.round(E-.5*i.width),F=Math.round(T-.5*n),U=w+.5*(i.width-p),D=F+o.hhea.ascender*h;this.Ri(d,U,D,h)}}xi(t,i){const r=i.codePointAt(0)||0,n=this.wi.li(t,r);if(n===0)return null;if(t.glyf&&t.glyf[n]!==null)return t.glyf[n];if(B&&B.T&&B.T.glyf){const o=B.T.glyf.Je(t,n);return t.glyf&&o&&(t.glyf[n]=o),o}return null}Mi(t,i){const r=t.hmtx;return r&&r.aWidth?i<r.aWidth.length?r.aWidth[i]:r.aWidth[r.aWidth.length-1]:0}Ri(t,i,r,n){if(!t||!t.xs||t.noc===0)return;const{xs:o,ys:h,endPts:a,flags:u}=t;if(!(o&&h&&a&&u))return;this.Ci.beginPath();let f=0;for(let g=0;g<a.length;g++){const d=a[g];if(!(d<f)){if(d>=f){const v=i+o[f]*n,y=r-h[f]*n;this.Ci.moveTo(v,y);let p=f+1;for(;p<=d;)if(1&u[p]){const m=i+o[p]*n,x=r-h[p]*n;this.Ci.lineTo(m,x),p++}else{const m=i+o[p]*n,x=r-h[p]*n;let E=p+1>d?f:p+1;if(1&u[E]){const T=i+o[E]*n,w=r-h[E]*n;this.Ci.quadraticCurveTo(m,x,T,w),p=E+1}else{const T=(m+(i+o[E]*n))/2,w=(x+(r-h[E]*n))/2;this.Ci.quadraticCurveTo(m,x,T,w),p=E}}this.Ci.closePath()}f=d+1}}this.Ci.fill()}}class Xt{constructor(){c(this,"Fi");this.Fi=new et}Si(t,i,r){let n=0;const o=this.Fi.mi(r,i),h=o.lineHeight;for(const a of t){const u=this.Fi._i(r,a);if(u===0)continue;const f=this.Fi.pi(r,u)*o.scale;n=Math.max(n,f)}return{width:Math.ceil(n),height:Math.ceil(h)}}gi(){this.Fi.gi()}}class kt{constructor(){c(this,"wi");this.wi=new et}createCharacterObjects(t,i){return t.map((r,n)=>{const o=r.codePointAt(0)||0,h=this.Ti(n);let a=0;if(i.hmtx&&i.hmtx.aWidth){const u=this.wi.li(i,o);u>0&&i.hmtx.aWidth[u]!==void 0&&(a=i.hmtx.aWidth[u])}return{character:r,unicode:o,color:h,advanceWidth:a}})}Ti(t){return[t%256/255,Math.floor(t/256)%256/255,Math.floor(t/65536)%256/255]}Ai(t,i){if(!Y.v(typeof t=="string","Character must be a string.",{method:"getCharacterColor",providedValue:t}))return[0,0,0];const r=i.find(n=>n.character===t);return r?r.color:[0,0,0]}zi(t,i){return Y.v(typeof t=="string"&&t.length>0,"Characters must be a string with at least one character.",{method:"getCharacterColors",providedValue:t})?Array.from(t).map(r=>this.Ai(r,i)||[0,0,0]):[[0,0,0]]}}class ht{constructor(t,i=16){c(this,"Ei");c(this,"Pi",[]);c(this,"ki");c(this,"Li",16);c(this,"Di",0);c(this,"Bi",0);c(this,"Gi",{width:0,height:0});c(this,"Ii");c(this,"Oi");c(this,"Wi");c(this,"Hi");c(this,"Ki");this.Li=i,this.Oi=new Wt,this.Wi=new Yt(t),this.Hi=new Xt,this.Ki=new kt}async Xi(t){let i;if(!t)throw new R("Embedded font not available. This appears to be a minified build - please provide `fontSource`.");{const r=await fetch(t);if(!r.ok)throw new R(`Failed to load font file: ${r.status} ${r.statusText}`);i=await r.arrayBuffer()}await this.Ni(i),this.Ei=B.parse(i)[0],await this.ji()}Yi(t){if(t===void 0)return this.Li;this.Li=t,this.Gi=this.Hi.Si(this.Pi.map(r=>r.character),this.Li,this.Ei);const i=this.Wi.createTextureAtlas(this.Pi,this.Gi,this.Li,this.Ei);this.ki=i.framebuffer,this.Di=i.columns,this.Bi=i.rows}async Vi(t){try{const i=await fetch(t);if(!i.ok)throw new R(`Failed to load font file: ${i.status} ${i.statusText}`);const r=await i.arrayBuffer();await this.Ni(r);const n=B.parse(r);if(!n||n.length===0)throw Error("Failed to parse font file");this.Ei=n[0],await this.ji()}catch(i){throw new R("Failed to load font: "+(i instanceof Error?i.message:"Unknown error"),i)}}async Ni(t){const i=Date.now();this.Ii=new FontFace("CustomFont_"+i,t),await this.Ii.load(),document.fonts.add(this.Ii)}async ji(){const t=this.Oi.ei(this.Ei),i=this.Oi.ni(t);this.Pi=this.Ki.createCharacterObjects(i,this.Ei),this.Gi=this.Hi.Si(i,this.Li,this.Ei);const r=this.Wi.createTextureAtlas(this.Pi,this.Gi,this.Li,this.Ei);this.ki=r.framebuffer,this.Di=r.columns,this.Bi=r.rows}Ai(t){return this.Ki.Ai(t,this.Pi)}zi(t){return this.Ki.zi(t,this.Pi)}kt(){this.ki.kt(),document.fonts.delete(this.Ii)}get fontFramebuffer(){return this.ki}get characters(){return this.Pi}get textureColumns(){return this.Di}get textureRows(){return this.Bi}get maxGlyphDimensions(){return this.Gi}get fontSize(){return this.Li}get font(){return this.Ei}}class at{constructor(t,i,r){c(this,"qi");c(this,"Zi");c(this,"dt");c(this,"_t");c(this,"Ji");c(this,"Qi");c(this,"tr");c(this,"sr");c(this,"er");this.tr=t,this.sr=i,this.er=r,this.ir()}ir(){this.qi=Math.floor(this.tr.width/this.sr),this.Zi=Math.floor(this.tr.height/this.er),this.dt=this.qi*this.sr,this._t=this.Zi*this.er,this.Ji=Math.floor((this.tr.width-this.dt)/2),this.Qi=Math.floor((this.tr.height-this._t)/2)}rr(t,i){this.sr=t,this.er=i,this.ir()}get cellWidth(){return this.sr}get cellHeight(){return this.er}get cols(){return this.qi}get rows(){return this.Zi}get width(){return this.dt}get height(){return this._t}get offsetX(){return this.Ji}get offsetY(){return this.Qi}}class ct{constructor(t={}){c(this,"tr");c(this,"nr",null);c(this,"hr",!1);c(this,"ar");c(this,"cr");this.hr=t.overlay??!1,this.hr&&t.canvas?(this.nr=t.canvas,this.tr=this.lr(),this.cr=!0,this.ur()):t.canvas?(this.tr=t.canvas,this.cr=!1):(this.tr=this.dr(t.width,t.height),this.cr=!0),this.tr.style.imageRendering="pixelated"}dr(t,i){const r=document.createElement("canvas");return r.className="textmodeCanvas",r.style.imageRendering="pixelated",r.width=t||800,r.height=i||600,document.body.appendChild(r),r}lr(){const t=document.createElement("canvas");t.className="textmodeCanvas",t.style.imageRendering="pixelated";const i=this.nr.getBoundingClientRect();let r=Math.round(i.width),n=Math.round(i.height);if(this.nr instanceof HTMLVideoElement){const a=this.nr;(r===0||n===0)&&a.videoWidth>0&&a.videoHeight>0&&(r=a.videoWidth,n=a.videoHeight)}t.width=r,t.height=n,t.style.position="absolute",t.style.pointerEvents="none";const o=window.getComputedStyle(this.nr);let h=parseInt(o.zIndex||"0",10);return isNaN(h)&&(h=0),t.style.zIndex=""+(h+1),t}ur(){var t;this._r(),(t=this.nr.parentNode)==null||t.insertBefore(this.tr,this.nr.nextSibling),window.ResizeObserver&&(this.ar=new ResizeObserver(()=>{this.pr()}),this.ar.observe(this.nr)),window.addEventListener("resize",()=>{this.pr()})}_r(){if(!this.nr)return;const t=this.nr.getBoundingClientRect();let i=this.nr.offsetParent;if(i&&i!==document.body){const r=i.getBoundingClientRect();this.tr.style.top=t.top-r.top+"px",this.tr.style.left=t.left-r.left+"px"}else this.tr.style.top=t.top+window.scrollY+"px",this.tr.style.left=t.left+window.scrollX+"px"}pr(t,i){if(this.hr){const r=this.nr.getBoundingClientRect();let n=Math.round(r.width),o=Math.round(r.height);if(this.nr instanceof HTMLVideoElement){const h=this.nr;(n===0||o===0)&&h.videoWidth>0&&h.videoHeight>0&&(n=h.videoWidth,o=h.videoHeight)}this.tr.width=n,this.tr.height=o,this._r()}else this.tr.width=t??this.tr.width,this.tr.height=i??this.tr.height}mr(){const t=this.tr.getContext("webgl2",{alpha:!0,premultipliedAlpha:!1,preserveDrawingBuffer:!0,antialias:!1,depth:!1,stencil:!1,powerPreference:"high-performance"});if(!t)throw new R("`textmode.js` requires WebGL2 support.");return t}kt(){this.ar&&this.ar.disconnect();const t=this.tr.getContext("webgl")||this.tr.getContext("webgl2");if(t){const i=t.getExtension("WEBGL_lose_context");i&&i.loseContext()}this.cr&&this.tr.parentNode&&this.tr.parentNode.removeChild(this.tr)}get canvas(){return this.tr}get targetCanvas(){return this.nr}get width(){return this.tr.width}get height(){return this.tr.height}}class W{constructor(t,i,r,n){c(this,"vr");c(this,"dt");c(this,"_t");c(this,"gt");c(this,"L",0);c(this,"N",0);c(this,"j",0);c(this,"D",[0,0]);c(this,"gr","sampled");c(this,"yr","fixed");c(this,"V",[1,1,1,1]);c(this,"q",[0,0,0,1]);c(this,"Cr",[0,0,0,1]);c(this,"wr",[[.1,0,0]]);c(this,"br");this.gt=t,this.vr=i,this.dt=r,this._t=n}kt(){this.gt.deleteTexture(this.vr)}$r(t){return typeof t=="boolean"?t?1:0:(t==null?0:Number(t))>0?1:0}invert(t=!0){return this.L=this.$r(t),this}flipX(t=!0){return this.N=this.$r(t),this}flipY(t=!0){return this.j=this.$r(t),this}charRotation(t){const i=255*t/360,r=Math.floor(i)/255,n=Math.round(i-Math.floor(i));return this.D=[r,n],this}Oe(){return{texture:this.vr,invert:this.L,flipX:this.N,flipY:this.j,charRotation:this.D,charColorFixed:this.gr==="fixed",charColor:this.V,cellColorFixed:this.yr==="fixed",cellColor:this.q,backgroundColor:this.Cr,charCount:this.wr.length,charList:this.wr}}charColorMode(t){return this.gr=t,this}cellColorMode(t){return this.yr=t,this}charColor(t,i,r,n){return this.V=[(t??0)/255,(i??t??0)/255,(r??t??0)/255,(n??255)/255],this}cellColor(t,i,r,n){return this.q=[(t??0)/255,(i??t??0)/255,(r??t??0)/255,(n??255)/255],this}background(t,i,r,n){return this.Cr=[(t??0)/255,(i??t??0)/255,(r??t??0)/255,(n??255)/255],this}characters(t){const i=this.br(t).filter(r=>Array.isArray(r)).slice(0,64);return this.wr=i,this}static Mr(t,i,r){const n=t.context,o=n.createTexture();n.bindTexture(n.TEXTURE_2D,o),n.pixelStorei(n.UNPACK_FLIP_Y_WEBGL,1),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_MIN_FILTER,n.NEAREST),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_MAG_FILTER,n.NEAREST),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_S,n.CLAMP_TO_EDGE),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_T,n.CLAMP_TO_EDGE),n.texImage2D(n.TEXTURE_2D,0,n.RGBA,n.RGBA,n.UNSIGNED_BYTE,i),n.bindTexture(n.TEXTURE_2D,null);const h=i.naturalWidth??i.width??i.videoWidth??0,a=i.naturalHeight??i.height??i.videoHeight??0,u=new W(n,o,h,a);return u.br=r,u}get texture(){return this.vr}get width(){return this.dt}get height(){return this._t}}class Ht{constructor(t=60){c(this,"Rr");c(this,"Fr");c(this,"Sr",null);c(this,"Tr",0);c(this,"Ar",!0);c(this,"zr",0);c(this,"Er",0);c(this,"Pr",[]);c(this,"kr",10);c(this,"Lr",0);this.Rr=t,this.Fr=1e3/t}start(t){if(!this.Ar)return;this.Tr=performance.now();const i=r=>{if(!this.Ar)return void(this.Sr=null);const n=r-this.Tr;n>=this.Fr&&(t(),this.Tr=r-n%this.Fr),this.Ar&&(this.Sr=requestAnimationFrame(i))};this.Sr=requestAnimationFrame(i)}stop(){this.Sr&&(cancelAnimationFrame(this.Sr),this.Sr=null)}pause(){this.Ar&&(this.Ar=!1,this.stop())}resume(t){this.Ar||(this.Ar=!0,this.start(t))}frameRate(t,i){if(t===void 0)return this.zr;this.Rr=t,this.Fr=1e3/t,this.Ar&&i&&(this.stop(),this.start(i))}measureFrameRate(){const t=performance.now();if(this.Er>0){const i=t-this.Er;this.Pr.push(i),this.Pr.length>this.kr&&this.Pr.shift();const r=this.Pr.reduce((n,o)=>n+o,0)/this.Pr.length;this.zr=1e3/r}this.Er=t}get isLooping(){return this.Ar}get frameRateLimit(){return this.Rr}get currentFrameRate(){return this.zr}get frameCount(){return this.Lr}set frameCount(t){this.Lr=t}incrementFrame(){this.Lr++}resetFrameCount(){this.Lr=0}}class lt{constructor(t){c(this,"tr");c(this,"Dr");c(this,"Br",{x:-1,y:-1});c(this,"Gr",{x:-1,y:-1});c(this,"Ir",null);c(this,"Or",0);c(this,"Wr");c(this,"Hr");c(this,"Kr");c(this,"Xr");c(this,"Nr");c(this,"jr");c(this,"Yr",!1);c(this,"Vr");c(this,"qr");c(this,"Zr");c(this,"Jr");c(this,"Qr");this.tr=t}tn(t){const i=performance.now()+Math.max(0,t);i>this.Or&&(this.Or=i)}sn(){return performance.now()<this.Or}en(t){const i=this.tr.canvas;i.style.cursor=t==null||t===""?"":t}Xi(t){this.Dr=t,this.rn()}nn(){if(this.Yr)return;const t=this.tr.canvas;this.Wr=i=>{this.hn(i),this.an(i)},this.Hr=()=>{this.Gr={...this.Br},this.Br.x=-1,this.Br.y=-1,this.Ir=null},this.Kr=i=>{this.hn(i),this.cn(i)},this.Xr=i=>{this.hn(i),this.ln(i)},this.Nr=i=>{this.hn(i),this.un(i)},this.jr=i=>{this.hn(i),this.fn(i)},t.addEventListener("mousemove",this.Wr,{passive:!0}),t.addEventListener("mouseleave",this.Hr,{passive:!0}),t.addEventListener("mousedown",this.Kr,{passive:!0}),t.addEventListener("mouseup",this.Xr,{passive:!0}),t.addEventListener("click",this.Nr,{passive:!0}),t.addEventListener("wheel",this.jr,{passive:!1}),this.Yr=!0}dn(){if(!this.Yr)return;const t=this.tr.canvas;t.removeEventListener("mousemove",this.Wr),t.removeEventListener("mouseleave",this.Hr),t.removeEventListener("mousedown",this.Kr),t.removeEventListener("mouseup",this.Xr),t.removeEventListener("click",this.Nr),t.removeEventListener("wheel",this.jr),this.Yr=!1}rn(){if(this.Yr)try{if(this.Ir){const t=new MouseEvent("mousemove",{clientX:this.Ir.x,clientY:this.Ir.y,bubbles:!1,cancelable:!1});this.hn(t)}else this.Br.x!==-1&&this.Br.y!==-1&&(this.Br.x>=this.Dr.cols||this.Br.y>=this.Dr.rows)&&(this.Br.x=-1,this.Br.y=-1)}catch{this.Br.x=-1,this.Br.y=-1}}_n(t){this.Vr=t}pn(t){this.qr=t}mn(t){this.Zr=t}vn(t){this.Jr=t}gn(t){this.Qr=t}yn(){return{x:this.Br.x,y:this.Br.y}}an(t){if(this.Jr&&!this.sn()){const i={position:{...this.Br},previousPosition:{...this.Gr},originalEvent:t};this.Jr(i)}}cn(t){if(this.qr&&!this.sn()){const i={position:{...this.Br},previousPosition:{...this.Gr},button:t.button,originalEvent:t};this.qr(i)}}ln(t){if(this.Zr&&!this.sn()){const i={position:{...this.Br},previousPosition:{...this.Gr},button:t.button,originalEvent:t};this.Zr(i)}}un(t){if(this.Vr&&!this.sn()){const i={position:{...this.Br},previousPosition:{...this.Gr},button:t.button,originalEvent:t};this.Vr(i)}}fn(t){if(this.Qr&&!this.sn()){const i={position:{...this.Br},previousPosition:{...this.Gr},delta:{x:t.deltaX,y:t.deltaY},originalEvent:t};this.Qr(i)}}hn(t){const i=this.tr.canvas;this.Gr={...this.Br},this.Ir={x:t.clientX,y:t.clientY};const r=i.getBoundingClientRect(),n=t.clientX-r.left,o=t.clientY-r.top,h=i.width/r.width,a=o*(i.height/r.height),u=n*h-this.Dr.offsetX,f=a-this.Dr.offsetY,g=Math.floor(u/this.Dr.cellWidth),d=Math.floor(f/this.Dr.cellHeight);g>=0&&g<this.Dr.cols&&d>=0&&d<this.Dr.rows?(this.Br.x=g,this.Br.y=d):(this.Br.x=-1,this.Br.y=-1)}}const Vt=Object.freeze(Object.defineProperty({__proto__:null,MouseManager:lt},Symbol.toStringTag,{value:"Module"}));class ut{constructor(){c(this,"Cn",new Map);c(this,"wn",null);c(this,"bn",null);c(this,"$n");c(this,"xn");c(this,"Yr",!1);c(this,"Mn");c(this,"Rn");c(this,"Fn",{ArrowUp:"UP_ARROW",ArrowDown:"DOWN_ARROW",ArrowLeft:"LEFT_ARROW",ArrowRight:"RIGHT_ARROW",F1:"F1",F2:"F2",F3:"F3",F4:"F4",F5:"F5",F6:"F6",F7:"F7",F8:"F8",F9:"F9",F10:"F10",F11:"F11",F12:"F12",Enter:"ENTER",Return:"RETURN",Tab:"TAB",Escape:"ESCAPE",Backspace:"BACKSPACE",Delete:"DELETE",Insert:"INSERT",Home:"HOME",End:"END",PageUp:"PAGE_UP",PageDown:"PAGE_DOWN",Shift:"SHIFT",Control:"CONTROL",Alt:"ALT",Meta:"META"," ":"SPACE"})}nn(){this.Yr||(this.$n=t=>{this.Sn(t)},this.xn=t=>{this.Tn(t)},window.addEventListener("keydown",this.$n,{passive:!1}),window.addEventListener("keyup",this.xn,{passive:!1}),this.Yr=!0)}dn(){this.Yr&&(window.removeEventListener("keydown",this.$n),window.removeEventListener("keyup",this.xn),this.Yr=!1,this.Cn.clear(),this.wn=null,this.bn=null)}pn(t){this.Mn=t}mn(t){this.Rn=t}An(t){const i=this.zn(t),r=this.Cn.get(t)||this.Cn.get(i);return(r==null?void 0:r.isPressed)||!1}En(){return this.wn}Pn(){return this.bn}kn(){const t=[];for(const[i,r]of this.Cn)r.isPressed&&t.push(i);return t}Ln(){return{ctrl:this.An("Control"),shift:this.An("Shift"),alt:this.An("Alt"),meta:this.An("Meta")}}Dn(){this.Cn.clear(),this.wn=null,this.bn=null}Sn(t){const i=t.key,r=Date.now();this.Cn.has(i)||this.Cn.set(i,{isPressed:!1,lastPressTime:0,lastReleaseTime:0});const n=this.Cn.get(i);if(!n.isPressed&&(n.isPressed=!0,n.lastPressTime=r,this.wn=i,this.Mn)){const o={key:i,keyCode:t.keyCode,ctrlKey:t.ctrlKey,shiftKey:t.shiftKey,altKey:t.altKey,metaKey:t.metaKey,isPressed:!0,originalEvent:t};this.Mn(o)}}Tn(t){const i=t.key,r=Date.now();this.Cn.has(i)||this.Cn.set(i,{isPressed:!1,lastPressTime:0,lastReleaseTime:0});const n=this.Cn.get(i);if(n.isPressed=!1,n.lastReleaseTime=r,this.bn=i,this.Rn){const o={key:i,keyCode:t.keyCode,ctrlKey:t.ctrlKey,shiftKey:t.shiftKey,altKey:t.altKey,metaKey:t.metaKey,isPressed:!1,originalEvent:t};this.Rn(o)}}zn(t){return this.Fn[t]||t.toLowerCase()}}const $t=Object.freeze(Object.defineProperty({__proto__:null,KeyboardManager:ut},Symbol.toStringTag,{value:"Module"}));class ft{constructor(t,i){c(this,"tr");c(this,"Bn");c(this,"Dr");c(this,"Gn",new Map);c(this,"In",new Map);c(this,"On",new Map);c(this,"Wn",null);c(this,"Hn");c(this,"Kn");c(this,"Xn");c(this,"Nn");c(this,"jn");c(this,"Yn");c(this,"Yr",!1);c(this,"Vn");c(this,"qn");c(this,"Zn");c(this,"Jn");c(this,"Qn");c(this,"so");c(this,"eo");c(this,"io");c(this,"ro");c(this,"no");c(this,"oo",320);c(this,"ho",350);c(this,"ao",10);c(this,"co",550);c(this,"lo",14);c(this,"uo",48);c(this,"fo",650);c(this,"do",.02);c(this,"_o",2);c(this,"po",600);c(this,"mo",0);c(this,"vo",null);this.tr=t,this.Bn=i;const r=this.tr.canvas;this.Hn=r.style.touchAction,this.Kn=r.style.userSelect,r.style.touchAction||(r.style.touchAction="none"),r.style.userSelect||(r.style.userSelect="none")}Xi(t){this.Dr=t,this.yo()}nn(){if(this.Yr)return;const t=this.tr.canvas;this.Xn=i=>{this.Co(i)},this.Nn=i=>{this.wo(i)},this.jn=i=>{this.bo(i)},this.Yn=i=>{this.$o(i)},t.addEventListener("touchstart",this.Xn,{passive:!1}),t.addEventListener("touchmove",this.Nn,{passive:!1}),t.addEventListener("touchend",this.jn,{passive:!1}),t.addEventListener("touchcancel",this.Yn,{passive:!1}),this.Yr=!0}dn(){if(!this.Yr)return;const t=this.tr.canvas;t.removeEventListener("touchstart",this.Xn),t.removeEventListener("touchmove",this.Nn),t.removeEventListener("touchend",this.jn),t.removeEventListener("touchcancel",this.Yn),this.Yr=!1,this.Wn=null,this.Gn.clear(),this.In.clear(),this.On.forEach(i=>{i.longPressTimer!==null&&window.clearTimeout(i.longPressTimer)}),this.On.clear(),this.vo=null,this.mo=0,t.style.touchAction=this.Hn,t.style.userSelect=this.Kn}yo(){if(!this.Dr||this.Gn.size===0)return;const t=new Map;for(const i of this.Gn.values()){const r=this.xo(i.clientX,i.clientY,i.id,i);t.set(i.id,r)}this.Gn=t}Mo(){return Array.from(this.Gn.values()).map(t=>({...t}))}Ro(t){this.Vn=t}vn(t){this.qn=t}Fo(t){this.Zn=t}So(t){this.Jn=t}To(t){this.Qn=t}Ao(t){this.so=t}zo(t){this.eo=t}Eo(t){this.io=t}Po(t){this.ro=t}ko(t){this.no=t}Co(t){var n;if(!this.Dr)return;t.preventDefault(),(n=this.Bn)==null||n.tn(this.po);const i=performance.now(),r=this.Lo(t.changedTouches);for(const o of r){const h=this.Gn.get(o.id);h&&this.In.set(o.id,this.Do(h)),this.Gn.set(o.id,o);const a={id:o.id,startPosition:o,lastPosition:o,startTime:i,lastTime:i,longPressTimer:null,longPressFired:!1};this.eo&&(a.longPressTimer=window.setTimeout(()=>{const u=this.Gn.get(o.id);u&&(a.longPressFired=!0,this.eo({touch:this.Do(u),duration:performance.now()-a.startTime,originalEvent:t}))},this.co)),this.On.set(o.id,a),this.Vn&&this.Vn(this.Bo(o,t,void 0,i))}this.Gn.size===2&&this.Go()}wo(t){var n;if(!this.Dr)return;t.preventDefault(),(n=this.Bn)==null||n.tn(this.po);const i=performance.now(),r=this.Lo(t.changedTouches);for(const o of r){const h=this.Gn.get(o.id),a=h?this.Do(h):void 0;a&&this.In.set(o.id,a),this.Gn.set(o.id,o);const u=this.On.get(o.id);u&&(u.lastPosition=o,u.lastTime=i,a)&&this.Io(a,o,!0)>this.lo&&u.longPressTimer!==null&&(window.clearTimeout(u.longPressTimer),u.longPressTimer=null),this.qn&&this.qn(this.Bo(o,t,a,i))}this.Gn.size===2?this.Oo(t):this.Wn=null}bo(t){if(!this.Dr)return;t.preventDefault();const i=performance.now(),r=this.Lo(t.changedTouches);for(const n of r){const o=this.Gn.get(n.id),h=o?this.Do(o):void 0,a=this.On.get(n.id);a&&a.longPressTimer!==null&&(window.clearTimeout(a.longPressTimer),a.longPressTimer=null),this.Zn&&this.Zn(this.Bo(n,t,h,i)),a&&this.Wo(a,t),this.On.delete(n.id),this.In.delete(n.id),this.Gn.delete(n.id)}this.Gn.size<2&&(this.Wn=null)}$o(t){if(!this.Dr)return;t.preventDefault();const i=performance.now(),r=this.Lo(t.changedTouches);for(const n of r){const o=this.Gn.get(n.id),h=o?this.Do(o):void 0,a=this.On.get(n.id);a&&a.longPressTimer!==null&&(window.clearTimeout(a.longPressTimer),a.longPressTimer=null),this.Jn&&this.Jn(this.Bo(n,t,h,i)),this.On.delete(n.id),this.In.delete(n.id),this.Gn.delete(n.id)}this.Gn.size<2&&(this.Wn=null)}Lo(t){const i=[];for(let r=0;r<t.length;r+=1){const n=t.item(r);n&&i.push(this.Ho(n))}return i}Ho(t){return this.xo(t.clientX,t.clientY,t.identifier,{id:t.identifier,x:-1,y:-1,clientX:t.clientX,clientY:t.clientY,pressure:t.force,radiusX:t.radiusX,radiusY:t.radiusY,rotationAngle:t.rotationAngle})}xo(t,i,r,n){const o=this.tr.canvas,h=o.getBoundingClientRect(),a=t-h.left,u=i-h.top,f=o.width/h.width,g=u*(o.height/h.height),d=a*f-this.Dr.offsetX,v=g-this.Dr.offsetY,y=Math.floor(d/this.Dr.cellWidth),p=Math.floor(v/this.Dr.cellHeight),m=y>=0&&y<this.Dr.cols&&p>=0&&p<this.Dr.rows;return{id:r,x:m?y:-1,y:m?p:-1,clientX:t,clientY:i,pressure:n.pressure,radiusX:n.radiusX,radiusY:n.radiusY,rotationAngle:n.rotationAngle}}Bo(t,i,r,n){const o=this.On.get(t.id),h=Array.from(this.In.values()).map(f=>this.Do(f)),a=Array.from(this.Gn.values()).map(f=>this.Do(f)),u=this.Lo(i.changedTouches);return{touch:this.Do(t),previousTouch:r?this.Do(r):void 0,touches:a,previousTouches:h,changedTouches:u,deltaTime:o?n-o.lastTime:0,originalEvent:i}}Go(){if(this.Gn.size!==2)return void(this.Wn=null);const t=Array.from(this.Gn.values()),[i,r]=t,n=this.Io(i,r,!1),o=this.Ko(i,r);this.Wn={ids:[i.id,r.id],initialDistance:Math.max(n,1e-4),initialAngle:o,lastScale:1,lastRotation:0}}Oo(t){if(this.Wn||this.Go(),!this.Wn)return;const[i,r]=this.Wn.ids,n=this.Gn.get(i),o=this.Gn.get(r);if(!n||!o)return;const h=this.Io(n,o,!1)/this.Wn.initialDistance,a=h-this.Wn.lastScale;this.ro&&Math.abs(a)>this.do&&(this.ro({touches:[this.Do(n),this.Do(o)],scale:h,deltaScale:a,center:this.Xo(n,o),originalEvent:t}),this.Wn.lastScale=h);let u=this.Ko(n,o)-this.Wn.initialAngle;u=(u+180)%360-180;const f=u-this.Wn.lastRotation;this.no&&Math.abs(f)>this._o&&(this.no({touches:[this.Do(n),this.Do(o)],rotation:u,deltaRotation:f,center:this.Xo(n,o),originalEvent:t}),this.Wn.lastRotation=u)}Xo(t,i){const r=(t.clientX+i.clientX)/2,n=(t.clientY+i.clientY)/2,o=this.xo(r,n,-1,{id:-1,x:-1,y:-1,clientX:r,clientY:n});return{x:o.x,y:o.y}}Wo(t,i){const r=performance.now(),n=r-t.startTime,o=this.Io(t.startPosition,t.lastPosition,!0);if(!t.longPressFired&&n<=this.oo&&o<=this.ao)this.No(t.lastPosition,r)&&this.so?this.so({touch:this.Do(t.lastPosition),taps:2,originalEvent:i}):this.Qn&&this.Qn({touch:this.Do(t.lastPosition),taps:1,originalEvent:i});else if(!t.longPressFired&&n<=this.fo&&o>=this.uo){const h={x:t.lastPosition.clientX-t.startPosition.clientX,y:t.lastPosition.clientY-t.startPosition.clientY},a=Math.max(Math.hypot(h.x,h.y),1e-4),u={x:h.x/a,y:h.y/a},f={x:h.x/n,y:h.y/n};this.io&&this.io({touch:this.Do(t.lastPosition),direction:u,distance:a,velocity:f,originalEvent:i})}this.mo=r,this.vo=this.Do(t.lastPosition)}No(t,i){return!!this.vo&&!(i-this.mo>this.ho)&&this.Io(t,this.vo,!0)<=this.ao}Do(t){return{...t}}Io(t,i,r){return r?Math.hypot(t.clientX-i.clientX,t.clientY-i.clientY):Math.hypot(t.x-i.x,t.y-i.y)}Ko(t,i){return 180*Math.atan2(i.clientY-t.clientY,i.clientX-t.clientX)/Math.PI}}const jt=Object.freeze(Object.defineProperty({__proto__:null,TouchManager:ft},Symbol.toStringTag,{value:"Module"})),qt=l=>class extends l{rotate(t=0,i=0,r=0){this.xt.state.st(t),this.xt.state.et(i),this.xt.state.it(r)}rotateX(t){this.xt.state.st(t)}rotateY(t){this.xt.state.et(t)}rotateZ(t){this.xt.state.it(t)}push(){this.xt.state.O()}pop(){this.xt.state.Z()}rect(t,i,r=1,n=1){this.xt.He(t,i,r,n)}point(t,i){this.xt.He(t,i,1,1)}line(t,i,r,n){this.xt.Ke(t,i,r,n)}lineWeight(t){this.xt.state.tt(t)}background(t,i=t,r=t,n=255){this.xt.qe(t,i,r,n)}char(t){this.xt.state.rt(this.Ei.Ai(t))}charColor(t,i,r,n=255){this.xt.state.nt(t,i,r,n)}cellColor(t,i,r,n=255){this.xt.state.ot(t,i,r,n)}flipX(t){this.xt.state.ht(t)}flipY(t){this.xt.state.ct(t)}charRotation(t){this.xt.state.ut(t)}invert(t){this.xt.state.lt(t)}clear(){this.xt.qe(0,0,0,0)}ellipse(t,i,r,n){this.xt.Xe(t,i,r/2,n/2)}triangle(t,i,r,n,o,h){this.xt.Ne(t,i,r,n,o,h)}bezierCurve(t,i,r,n,o,h,a,u){this.xt.je(t,i,r,n,o,h,a,u)}arc(t,i,r,n,o,h){this.xt.Ve(t,i,r,n,o,h)}shader(t){this.xt.De(t)}setUniform(t,i){this.xt.Nt(t,i)}setUniforms(t){this.xt.Be(t)}createFilterShader(t){return this.xt.hs(t)}createFramebuffer(t){return this.xt.Ye(t.width,t.height,5,{filter:"nearest",wrap:"clamp",format:"rgba",type:"unsigned_byte"})}image(t,i,r,n,o){if(t.textures){const h=t;this.xt.Ge(h,i,r,n??h.width,o??h.height)}else{const h=t;this.xt.Ie(h,i,r,n??Math.floor(this.Dr.cols/2),o??Math.floor(this.Dr.rows/2))}}async loadImage(t){if(typeof t!="string")return W.Mr(this.xt,t,n=>this.Ei.zi(n));const i=t,r=await new Promise((n,o)=>{const h=new Image;h.crossOrigin="anonymous",h.onload=()=>n(h),h.onerror=a=>o(a),h.src=i});return W.Mr(this.xt,r,n=>this.Ei.zi(n))}},Kt=l=>class extends l{async loadFont(t){return this.Ei.Vi(t).then(()=>{const i=this.Ei.maxGlyphDimensions;this.Dr.rr(i.width,i.height),this.jo.resize(this.Dr.cols,this.Dr.rows),this.xt.Ze(),this.Bn.rn()})}fontSize(t){if(!Y.v(typeof t=="number"&&t>0,"Font size must be a positive number greater than 0.",{method:"fontSize",providedValue:t})||this.Ei.fontSize===t)return;this.Ei.Yi(t);const i=this.Ei.maxGlyphDimensions;this.Dr.rr(i.width,i.height),this.jo.resize(this.Dr.cols,this.Dr.rows),this.xt.Ze(),this.Bn.rn()}glyphColor(t){return this.Ei.Ai(t)}glyphColors(t){return this.Ei.zi(t)}},Zt=l=>class extends l{get frameCount(){return this.Yo.frameCount}set frameCount(t){this.Yo.frameCount=t}frameRate(t){return t===void 0?this.Yo.currentFrameRate:this.Yo.frameRate(t,()=>this.Vo())}noLoop(){this.Yo.pause()}loop(){this.Yo.resume(()=>this.Vo())}redraw(t=1){if(Y.v(typeof t=="number"&&t>0&&Number.isInteger(t),"Redraw count must be a positive integer.",{method:"redraw",providedValue:t}))for(let i=0;i<t;i++)this.Vo()}isLooping(){return this.Yo.isLooping}},Jt=l=>class extends l{constructor(...t){super(...t)}mouseClicked(t){this.Bn._n(t)}mousePressed(t){this.Bn.pn(t)}mouseReleased(t){this.Bn.mn(t)}mouseMoved(t){this.Bn.vn(t)}mouseScrolled(t){this.Bn.gn(t)}get mouse(){return this.Bn.yn()}cursor(t){this.Bn.en(t)}},Qt=l=>class extends l{constructor(...t){super(...t)}touchStarted(t){this.qo.Ro(t)}touchMoved(t){this.qo.vn(t)}touchEnded(t){this.qo.Fo(t)}touchCancelled(t){this.qo.So(t)}tap(t){this.qo.To(t)}doubleTap(t){this.qo.Ao(t)}longPress(t){this.qo.zo(t)}swipe(t){this.qo.Eo(t)}pinch(t){this.qo.Po(t)}rotateGesture(t){this.qo.ko(t)}get touches(){return this.qo.Mo()}},te=l=>class extends l{constructor(...t){super(...t)}keyPressed(t){this.Zo.pn(t)}keyReleased(t){this.Zo.mn(t)}isKeyPressed(t){return this.Zo.An(t)}get lastKeyPressed(){return this.Zo.En()}get lastKeyReleased(){return this.Zo.Pn()}get pressedKeys(){return this.Zo.kn()}get modifierState(){return this.Zo.Ln()}};class ee{constructor(){c(this,"xt");c(this,"Ei");c(this,"tr");c(this,"Dr");c(this,"Yo");c(this,"Bn");c(this,"qo");c(this,"Zo");c(this,"Jo");c(this,"jo");c(this,"Qo");c(this,"th");c(this,"sh")}Vo(){}}class dt extends function(i,...r){return r.reduce((n,o)=>o(n),i)}(ee,qt,Kt,Zt,Jt,Qt,te){constructor(i={}){var r;super();c(this,"eh",new Map);c(this,"ih");c(this,"rh",!1);c(this,"nh",!1);c(this,"oh",()=>{});c(this,"hh",()=>{});c(this,"ah",()=>{});c(this,"uh");c(this,"ar");c(this,"hr",!1);c(this,"fh");this.ih=((r=i.plugins)==null?void 0:r.slice())??[],this.hr=i.overlay??!1,this.tr=new ct(i),this.xt=new Pt(this.tr.mr()),this.Ei=new ht(this.xt,i.fontSize??16),this.Yo=new Ht(i.frameRate??60),this.Bn=new lt(this.tr),this.qo=new ft(this.tr,this.Bn),this.Zo=new ut,this.Jo=this.xt.At(),this.Qo=this.xt.rs(),this.dh(i)}async dh(i){await this.Ei.Xi(i.fontSource);const r=this.Ei.maxGlyphDimensions;this.Dr=new at(this.tr.canvas,r.width,r.height),this.Bn.Xi(this.Dr),this.qo.Xi(this.Dr),this.jo=this.xt.Ye(this.Dr.cols,this.Dr.rows,5),this.th=this.xt.Ye(this.Dr.width,this.Dr.height,1),this.hr&&(this.fh=W.Mr(this.xt,this.tr.targetCanvas,n=>this.Ei.zi(n))),this.sh=this.xt.cs(rt,"precision mediump float;uniform sampler2D Ua;uniform vec2 Ub;uniform vec2 Uc;uniform vec2 Ud;void main(){vec2 A=gl_FragCoord.xy-Uc;vec2 B=A*(Ub/Ud);vec2 C=(floor(B)+0.5)/Ub;gl_FragColor=texture2D(Ua,C);}"),this._h(),await this.ph(this.ih),this.ih=[],this.rh=!0,this.oh(),this.Yo.start(()=>this.Vo())}async ph(i){if(i.length)for(const r of i)this.eh.has(r.name)?console.warn(`[textmode.js] Plugin "${r.name}" is already installed.`):(await r.install(this,this.mh()),this.eh.set(r.name,r))}async gh(i){const r=this.eh.get(i);r&&(r.uninstall&&await r.uninstall(this,this.mh()),this.eh.delete(i))}async use(i){return this.rh?await this.ph([i]):this.ih.push(i),this}async unuse(i){return this.rh?(await this.gh(i),this):(this.ih=this.ih.filter(r=>r.name!==i),this)}hasPlugin(i){return this.rh?this.eh.has(i):this.ih.some(r=>r.name===i)||this.eh.has(i)}mh(){return{renderer:this.xt,font:this.Ei,grid:this.Dr,canvas:this.tr,drawFramebuffer:this.jo,asciiFramebuffer:this.th,flushDrawCommands:()=>{this.xt.zt(this.Jo)}}}_h(){this.uh=()=>{this.hr&&this.resizeCanvas(this.tr.targetCanvas.width,this.tr.targetCanvas.height),this.ah()},window.addEventListener("resize",this.uh),this.Bn.nn(),this.qo.nn(),this.Zo.nn(),window.addEventListener("blur",()=>{this.Zo.Dn()}),window.ResizeObserver&&this.hr&&(this.ar=new ResizeObserver(()=>{this.resizeCanvas(this.tr.targetCanvas.width,this.tr.targetCanvas.height)}),this.ar.observe(this.tr.targetCanvas))}Vo(){if(this.Yo.measureFrameRate(),this.Yo.incrementFrame(),this.nh)return;if(this.hr){const r=this.xt.context;r.bindTexture(r.TEXTURE_2D,this.fh.texture),r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,1),r.texImage2D(r.TEXTURE_2D,0,r.RGBA,r.RGBA,r.UNSIGNED_BYTE,this.tr.targetCanvas),r.bindTexture(r.TEXTURE_2D,null)}this.jo.begin(),this.xt.Le(this.Jo),this.hh(),this.xt.zt(this.Jo),this.jo.end(),this.th.begin(),this.xt.Le(this.Qo),this.Qo.Xt({U0:this.Ei.fontFramebuffer,U1:[this.Ei.textureColumns,this.Ei.textureRows],U2:this.jo.textures[0],U3:this.jo.textures[1],U4:this.jo.textures[2],U5:this.jo.textures[4],U6:this.jo.textures[3],U7:[this.Dr.cols,this.Dr.rows],U8:[this.th.width,this.th.height],U9:this.th.width/this.th.height}),this.xt.We(0,0,this.tr.width,this.tr.height),this.th.end();const i=this.xt.state.canvasBackgroundColor;this.xt.Ys(i[0],i[1],i[2],i[3]),this.xt.Le(this.sh),this.sh.Xt({Ua:this.th.textures[0],Ub:[this.th.width,this.th.height],Uc:[this.Dr.offsetX,this.Dr.offsetY],Ud:[this.Dr.width,this.Dr.height]}),this.xt.We(this.Dr.offsetX,this.Dr.offsetY,this.Dr.width,this.Dr.height)}setup(i){this.oh=i}draw(i){this.hh=i}windowResized(i){this.ah=i}resizeCanvas(i,r){this.tr.pr(i,r),this.Dr.ir(),this.jo.resize(this.Dr.cols,this.Dr.rows),this.th.resize(this.Dr.width,this.Dr.height),this.xt.Ze(),this.Bn.rn(),this.qo.yo(),this.Vo()}destroy(){this.nh||(this.Yo.stop(),window.removeEventListener("resize",this.uh),this.Bn.dn(),this.qo.dn(),this.Zo.dn(),this.Ei.kt(),this.xt.kt(),this.th.kt(),this.sh.kt(),this.fh&&this.fh.kt(),this.nh=!0)}get grid(){return this.Dr}get font(){return this.Ei}get width(){return this.tr.width}get height(){return this.tr.height}get canvas(){return this.tr.canvas}get isDisposed(){return this.nh}get overlay(){return this.fh}}class Z{constructor(){}static create(t={}){return new dt(t)}static setErrorLevel(t){Y.C(t)}static get version(){return"0.3.2-beta.1"}}const ie=Object.freeze(Object.defineProperty({__proto__:null},Symbol.toStringTag,{value:"Module"})),se=Object.freeze(Object.defineProperty({__proto__:null,keyboard:$t,mouse:Vt,touch:jt},Symbol.toStringTag,{value:"Module"})),re=Z.create,ne=Z.setErrorLevel,oe=Z.version;b.TextmodeCanvas=ct,b.TextmodeErrorLevel=M,b.TextmodeFont=ht,b.TextmodeFramebuffer=$,b.TextmodeGrid=at,b.TextmodeImage=W,b.Textmodifier=dt,b.create=re,b.export=ie,b.input=se,b.setErrorLevel=ne,b.textmode=Z,b.version=oe,Object.defineProperty(b,Symbol.toStringTag,{value:"Module"})},typeof exports=="object"&&typeof module<"u"?e(exports):typeof define=="function"&&define.amd?define(["exports"],e):e((s=typeof globalThis<"u"?globalThis:s||self).textmode={});
|
|
11
|
+
precision highp float;in vec2 v_uv;uniform sampler2D Uk;uniform bool Ul;uniform bool Um;uniform bool Un;uniform vec2 Uo;uniform bool Up;uniform vec4 Uq;uniform bool Ur;uniform vec4 Us;uniform vec4 Ut;uniform int Uu;uniform vec3 Uv[64];layout(location=0)out vec4 o_character;layout(location=1)out vec4 o_primaryColor;layout(location=2)out vec4 o_secondaryColor;layout(location=3)out vec4 o_rotation;layout(location=4)out vec4 o_transform;float A(vec3 B){return dot(B,vec3(0.299f,0.587f,0.114f));}void main(){vec2 C=vec2(v_uv.x,1.0f-v_uv.y);vec4 D=texture(Uk,C);float E=A(D.rgb);if(Uu>0){float F=float(Uu);float G=clamp(E*(F-1.0f),0.0f,F-1.0f);int H=int(floor(G+0.5f));vec3 I=Uv[H];o_character=vec4(I,1.0f);}else{o_character=vec4(E,0.0f,0.0f,1.0f);}vec4 J=Up?Uq:D;vec4 K=Ur?Us:D;if(D.a<0.01f){J=Ut;K=Ut;}else{}o_primaryColor=vec4(J);o_secondaryColor=vec4(K);o_rotation=vec4(Uo.xy,0.0f,1.0f);o_transform=vec4(float(Ul),float(Um),float(Un),1.0f);}`)}es(){return this.Jt}At(){return this.Qt}rs(){return this.ts}ns(){return this.ss}hs(t){return new z(this.gt,j,t)}cs(t,i){return new z(this.gt,t,i)}kt(){this.Jt.kt(),this.Qt.kt(),this.ts.kt(),this.ss.kt()}}var A=(l=>(l.RECTANGLE="rectangle",l.LINE="line",l.ELLIPSE="ellipse",l.ARC="arc",l.TRIANGLE="triangle",l.BEZIER_CURVE="bezier_curve",l.CUSTOM="custom",l))(A||{});class pt{constructor(t){c(this,"gt");c(this,"ls",new Map);this.gt=t}us(t,i,r,n){const o=this.gt;let h=this.ls.get(t);h||(h=new Map,this.ls.set(t,h));let a=h.get(i)||null;if(!a){a=o.createVertexArray(),h.set(i,a),o.bindVertexArray(a),o.bindBuffer(o.ARRAY_BUFFER,n);const u=o.getAttribLocation(t,"a_position");u!==-1&&(o.enableVertexAttribArray(u),o.vertexAttribPointer(u,r.ds.fs.size,o.FLOAT,!1,r._s,r.ds.fs.offset),o.vertexAttribDivisor(u,0));const f=o.getAttribLocation(t,"a_texCoord");f!==-1&&(o.enableVertexAttribArray(f),o.vertexAttribPointer(f,r.ds.ps.size,o.FLOAT,!1,r._s,r.ds.ps.offset),o.vertexAttribDivisor(f,0))}o.bindVertexArray(a)}vs(){this.gt.bindVertexArray(null)}kt(){for(const[,t]of this.ls)for(const[,i]of t)i&&this.gt.deleteVertexArray(i)}}class vt{constructor(t,i){c(this,"gs");c(this,"gt");c(this,"xt");c(this,"Cs",null);c(this,"ws",null);this.gt=t,this.gs=new pt(t),this.xt=i}bs(t,i,r){const{shader:n}=t,o=V(this.gt)||this.gt.getParameter(this.gt.VIEWPORT);n.Xt({U9:o[2]/o[3],Uy:[o[2],o[3]]});const h=f=>{if(!f||!f.$s())return;const g=f.unitGeometry,d=f.unitBuffer;try{this.gs.us(n.Zt,f.type+"",g,d),f.batch.Ms(n),f.batch.Rs(g.Fs,g.Ss)}finally{f.batch.Ts(n),this.gs.vs(),f.As()}};let a=null,u=null;for(const f of i){if(f.type===A.CUSTOM){u&&(h(u),a=null,u=null),this.zs(t,f.params,f.state,r.get(A.RECTANGLE));continue}a!==null&&f.type!==a&&(h(u),a=null,u=null);let g=u;g&&f.type===a||(g=r.get(f.type)||null,u=g,a=f.type),g&&g.Es(f.params,f.state)}h(u)}zs(t,i,r,n){const{x:o,y:h,width:a,height:u,shader:f,uniforms:g}=i,d=this.Ps(Math.max(1,Math.floor(a)),Math.max(1,Math.floor(u)));d.begin(),this.ks(n,f,g,0,0,d.width,d.height,{}),d.end();const v=this.Ls(),y={Ue:d.textures[0],Uf:d.textures[1],Ug:d.textures[2],Uh:d.textures[3],Ui:d.textures[4],Uj:[d.width,d.height]};this.ks(n,v,y,Math.floor(o),Math.floor(h),Math.max(1,Math.floor(a)),Math.max(1,Math.floor(u)),r),t.shader.Ht()}ks(t,i,r,n,o,h,a,u){i.Ht(),i.Xt(r);const f=this.gt.getParameter(this.gt.VIEWPORT);if(i.Xt({U9:f[2]/f[3],Uy:[f[2],f[3]]}),t.As(),t.Es({x:n,y:o,width:h,height:a},u),t.$s()){const g=t.unitGeometry,d=t.unitBuffer;try{this.gs.us(i.Zt,t.type+"",g,d),t.batch.Ms(i),t.batch.Rs(g.Fs,g.Ss)}finally{t.batch.Ts(i),this.gs.vs(),t.As()}}}Ls(){return this.xt.es()}Ps(t,i){return this.Cs&&this.ws&&this.ws.w===t&&this.ws.h===i||(this.Cs&&this.Cs.kt(),this.Cs=new $(this.gt,t,i,5),this.ws={w:t,h:i}),this.Cs}kt(){this.gs.kt(),this.Cs&&this.Cs.kt()}}class Et{constructor(){c(this,"Ds",[]);c(this,"Bs",1);c(this,"Gs",0)}Is(t){if(this.Gs>=this.Ds.length){const r={id:this.Bs++,type:t,params:{},state:{W:1,H:0,K:0,X:0,Y:[0,0,0],V:[1,1,1,1],q:[0,0,0,1],N:!1,j:!1,L:!1,D:[0,0]}};this.Ds.push(r)}const i=this.Ds[this.Gs];return i.id=this.Bs++,i.type=t,this.Gs++,i}Os(t,i,r,n,o){const h=this.Is(A.RECTANGLE);return h.params.x=t,h.params.y=i,h.params.width=r,h.params.height=n,o.J(h.state),h.id}Ws(t,i,r,n,o,h,a){const u=this.Is(A.CUSTOM);return u.params.x=t,u.params.y=i,u.params.width=r,u.params.height=n,u.params.shader=o,u.params.uniforms=h,a.J(u.state),u.id}Hs(t,i,r,n,o,h){const a=this.Is(A.LINE);return a.params.x1=t,a.params.y1=i,a.params.x2=r,a.params.y2=n,a.params.thickness=o,h.J(a.state),a.id}Ks(t,i,r,n,o){const h=this.Is(A.ELLIPSE);return h.params.x=t,h.params.y=i,h.params.width=r,h.params.height=n,o.J(h.state),h.id}Xs(t,i,r,n,o,h,a){const u=this.Is(A.ARC);return u.params.x=t,u.params.y=i,u.params.width=r,u.params.height=n,u.params.start=o,u.params.stop=h,a.J(u.state),u.id}Ns(t,i,r,n,o,h,a){const u=this.Is(A.TRIANGLE);return u.params.x1=t,u.params.y1=i,u.params.x2=r,u.params.y2=n,u.params.x3=o,u.params.y3=h,a.J(u.state),u.id}js(t,i,r,n,o,h,a,u,f,g){const d=this.Is(A.BEZIER_CURVE);return d.params.x1=t,d.params.y1=i,d.params.cp1x=r,d.params.cp1y=n,d.params.cp2x=o,d.params.cp2y=h,d.params.x2=a,d.params.y2=u,d.params.thickness=f,g.J(d.state),d.id}get length(){return this.Gs}get isEmpty(){return this.Gs===0}Ys(){this.Gs=0}[Symbol.iterator](){let t=0;const i=this.Gs,r=this.Ds;return{next:()=>t<i?{value:r[t++],done:!1}:{value:void 0,done:!0}}}}const S=class S{static Vs(t,i,r=0){var h,a,u,f,g,d,v,y,p,m;const n=i||new Float32Array(S.FLOATS_PER_INSTANCE);let o=r;return n[o++]=t.fs[0],n[o++]=t.fs[1],n[o++]=t.Gs[0],n[o++]=t.Gs[1],n[o++]=t.Y[0],n[o++]=t.Y[1],n[o++]=t.Y[2],n[o++]=t.V[0],n[o++]=t.V[1],n[o++]=t.V[2],n[o++]=t.V[3],n[o++]=t.q[0],n[o++]=t.q[1],n[o++]=t.q[2],n[o++]=t.q[3],n[o++]=t.D[0],n[o++]=t.D[1],n[o++]=t.qs[0],n[o++]=t.qs[1],n[o++]=t.qs[2],n[o++]=t.H,n[o++]=t.K,n[o++]=t.X,n[o++]=t.Zs[0],n[o++]=t.Zs[1],n[o++]=((h=t.Js)==null?void 0:h[0])||0,n[o++]=((a=t.Js)==null?void 0:a[1])||0,n[o++]=((u=t.Qs)==null?void 0:u[0])||0,n[o++]=((f=t.Qs)==null?void 0:f[1])||0,n[o++]=((g=t.te)==null?void 0:g[0])||0,n[o++]=((d=t.te)==null?void 0:d[1])||0,n[o++]=((v=t.se)==null?void 0:v[0])||0,n[o++]=((y=t.se)==null?void 0:y[1])||0,n[o++]=((p=t.ee)==null?void 0:p[0])||0,n[o++]=((m=t.ee)==null?void 0:m[1])||0,n}static ie(t){const i=t.length*S.FLOATS_PER_INSTANCE,r=new Float32Array(i);for(let n=0;n<t.length;n++){const o=n*S.FLOATS_PER_INSTANCE;S.Vs(t[n],r,o)}return r}};c(S,"BYTES_PER_INSTANCE",140),c(S,"FLOATS_PER_INSTANCE",35);let I=S;const _=class _{};c(_,"STRIDE",I.BYTES_PER_INSTANCE),c(_,"ATTRIBUTES",{a_instancePosition:{location:-1,size:2,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:_.STRIDE,offset:0,divisor:1},a_instanceSize:{location:-1,size:2,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:_.STRIDE,offset:8,divisor:1},a_instanceCharacter:{location:-1,size:3,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:_.STRIDE,offset:16,divisor:1},a_instancePrimaryColor:{location:-1,size:4,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:_.STRIDE,offset:28,divisor:1},a_instanceSecondaryColor:{location:-1,size:4,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:_.STRIDE,offset:44,divisor:1},a_instanceRotation:{location:-1,size:2,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:_.STRIDE,offset:60,divisor:1},a_instanceTransform:{location:-1,size:3,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:_.STRIDE,offset:68,divisor:1},a_instanceGlobalRotation:{location:-1,size:3,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:_.STRIDE,offset:80,divisor:1},a_instanceRotationCenter:{location:-1,size:2,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:_.STRIDE,offset:92,divisor:1},a_instanceArcAngles:{location:-1,size:2,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:_.STRIDE,offset:100,divisor:1},a_instanceBezierCP1:{location:-1,size:2,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:_.STRIDE,offset:108,divisor:1},a_instanceBezierCP2:{location:-1,size:2,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:_.STRIDE,offset:116,divisor:1},a_instanceBezierStart:{location:-1,size:2,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:_.STRIDE,offset:124,divisor:1},a_instanceBezierEnd:{location:-1,size:2,type:WebGL2RenderingContext.FLOAT,normalized:!1,stride:_.STRIDE,offset:132,divisor:1}});let q=_;class yt{constructor(t,i=1e3,r=1.5){c(this,"gt");c(this,"re",[]);c(this,"ne");c(this,"oe");c(this,"he",null);c(this,"ae",!0);c(this,"ce",0);c(this,"le",new Map);c(this,"ue",null);this.gt=t,this.ne=i,this.oe=r,this.fe()}Es(t){const i=this.re.length;return this.re.push(t),this.ae=!0,i}get count(){return this.re.length}get isEmpty(){return this.re.length===0}clear(){this.re.length=0,this.ae=!0}de(t){if(t<=this.ne)return;const i=Math.ceil(t*this.oe);this.ne=i,this.fe()}fe(){const t=this.gt;this.he&&t.deleteBuffer(this.he),this.he=t.createBuffer();const i=this.ne*I.BYTES_PER_INSTANCE;t.bindBuffer(t.ARRAY_BUFFER,this.he),t.bufferData(t.ARRAY_BUFFER,i,t.DYNAMIC_DRAW),t.bindBuffer(t.ARRAY_BUFFER,null),this.ae=!0,this.ce=0}_e(){if(!this.ae||this.re.length===0)return;const t=this.gt,i=this.re.length;this.de(i),(!this.ue||this.ue.length<i*I.FLOATS_PER_INSTANCE)&&(this.ue=new Float32Array(i*I.FLOATS_PER_INSTANCE));const r=I.ie(this.re);t.bindBuffer(t.ARRAY_BUFFER,this.he),i<=this.ce?t.bufferSubData(t.ARRAY_BUFFER,0,r):t.bufferData(t.ARRAY_BUFFER,r,t.DYNAMIC_DRAW),t.bindBuffer(t.ARRAY_BUFFER,null),this.ae=!1,this.ce=i}pe(t){let i=this.le.get(t);if(!i){i=new Map;const r=this.gt;for(const n in q.ATTRIBUTES){const o=r.getAttribLocation(t,n);o!==-1&&i.set(n,o)}this.le.set(t,i)}return i}Ms(t){if(!this.he||this.re.length===0)return;const i=this.gt,r=t.Zt;this._e();const n=this.pe(r);i.bindBuffer(i.ARRAY_BUFFER,this.he);for(const[o,h]of n){const a=q.ATTRIBUTES[o];a&&(i.enableVertexAttribArray(h),i.vertexAttribPointer(h,a.size,a.type,a.normalized,a.stride,a.offset),i.vertexAttribDivisor(h,a.divisor))}}Ts(t){const i=this.gt,r=this.pe(t.Zt);for(const[,n]of r)i.disableVertexAttribArray(n),i.vertexAttribDivisor(n,0)}Rs(t,i){this.re.length!==0&&this.gt.drawArraysInstanced(t,0,i,this.re.length)}kt(){this.he&&this.gt.deleteBuffer(this.he)}}class N{constructor(t,i,r,n){c(this,"gt");c(this,"me");c(this,"ve");c(this,"ge");c(this,"ye",null);this.gt=t,this.me=i,this.ve=r,this.ge=n;const o=this.gt.createBuffer();if(!o)throw Error("Failed to create unit geometry buffer");this.gt.bindBuffer(this.gt.ARRAY_BUFFER,o),this.gt.bufferData(this.gt.ARRAY_BUFFER,this.ge.Ce,this.gt.STATIC_DRAW),this.gt.bindBuffer(this.gt.ARRAY_BUFFER,null),this.ye=o}get type(){return this.ve}get unitGeometry(){return this.ge}get unitBuffer(){return this.ye}get batch(){return this.me}As(){this.me.clear()}$s(){return!this.me.isEmpty}kt(){this.me.kt(),this.gt.deleteBuffer(this.ye)}we(t,i,r,n,o){const h=this.be(t,i,r,n,o.H||0,o.K||0,o.X||0);return{fs:[t,i],Gs:[r,n],Y:o.Y||[0,0,0],V:o.V||[1,1,1,1],q:o.q||[0,0,0,1],D:o.D||[0,0],qs:[o.L?1:0,o.N?1:0,o.j?1:0],H:h.radiansX,K:h.radiansY,X:h.radiansZ,Zs:[h.centerX,h.centerY]}}$e(t,i){const r=V(this.gt)||[0,0,this.gt.canvas.width,this.gt.canvas.height];return{nx:t/r[2]*2-1,ny:1-i/r[3]*2}}xe(t,i,r){const n=this.$e(i,r);t.Zs=[n.nx,n.ny]}be(t,i,r,n,o,h,a){const u=V(this.gt)||[0,0,this.gt.canvas.width,this.gt.canvas.height],f=u[2],g=u[3];return{centerX:(t+r/2)/f*2-1,centerY:1-(i+n/2)/g*2,radiansX:-o*Math.PI/180,radiansY:-h*Math.PI/180,radiansZ:-a*Math.PI/180,aspectRatio:f/g}}}const xt={Ce:new Float32Array([0,0,0,0,1,0,1,0,0,1,0,1,0,1,0,1,1,0,1,0,1,1,1,1]),Ss:6,Fs:WebGL2RenderingContext.TRIANGLES,_s:16,ds:{fs:{size:2,offset:0},ps:{size:2,offset:8}}};class wt extends N{constructor(t,i){super(t,i,A.RECTANGLE,xt)}Es(t,i){const r=this.we(t.x,t.y,t.width,t.height,i);return this.me.Es(r)}}const At={Ce:new Float32Array([0,-.5,0,0,1,-.5,1,0,0,.5,0,1,0,.5,0,1,1,-.5,1,0,1,.5,1,1]),Ss:6,Fs:WebGL2RenderingContext.TRIANGLES,_s:16,ds:{fs:{size:2,offset:0},ps:{size:2,offset:8}}};class Tt extends N{constructor(t,i){super(t,i,A.LINE,At)}Es(t,i){const r=t.x2-t.x1,n=t.y2-t.y1,o=Math.hypot(r,n),h=t.thickness||i.W||1,a=t.x1+r/2,u=t.y1+n/2,f=a-o/2,g=u,d=this.we(f,g,o,h,i);return this.xe(d,a,u),this.me.Es(d)}}const Rt={Ce:function(l=32){const t=[],i=2*Math.PI/l;for(let r=0;r<l;r++){const n=r*i,o=(r+1)%l*i,h=Math.cos(n),a=Math.sin(n),u=.5*(h+1),f=.5*(a+1),g=Math.cos(o),d=Math.sin(o),v=.5*(g+1),y=.5*(d+1);t.push(0,0,.5,.5,h,a,u,f,g,d,v,y)}return new Float32Array(t)}(32),Ss:96,Fs:WebGL2RenderingContext.TRIANGLES,_s:16,ds:{fs:{size:2,offset:0},ps:{size:2,offset:8}}};class bt extends N{constructor(t,i){super(t,i,A.ELLIPSE,Rt)}Es(t,i){const r=this.we(t.x,t.y,t.width,t.height,i);return this.xe(r,t.x,t.y),this.me.Es(r)}}let Ct={Ce:function(l){const t=[];for(let i=0;i<l;i++){const r=i/l,n=(i+1)/l;t.push(r,0,r,0,r,1,r,1,n,1,n,1)}return new Float32Array(t)}(32),Ss:96,Fs:WebGL2RenderingContext.TRIANGLES,_s:16,ds:{fs:{size:2,offset:0},ps:{size:2,offset:8}}};class _t extends N{constructor(t,i){super(t,i,A.ARC,Ct)}Es(t,i){const r=t.x-t.width/2,n=t.y-t.height/2,o=t.start*Math.PI/180,h=t.stop*Math.PI/180,a=this.we(r,n,t.width,t.height,i);return this.xe(a,t.x,t.y),a.Js=[o,h],this.me.Es(a)}}const Ut={Ce:new Float32Array([0,0,0,0,1,0,1,0,.5,1,.5,1]),Ss:3,Fs:WebGL2RenderingContext.TRIANGLES,_s:16,ds:{fs:{size:2,offset:0},ps:{size:2,offset:8}}};class Dt extends N{constructor(t,i){super(t,i,A.TRIANGLE,Ut)}Es(t,i){const r=Math.min(t.x1,t.x2,t.x3),n=Math.max(t.x1,t.x2,t.x3),o=Math.min(t.y1,t.y2,t.y3),h=n-r,a=Math.max(t.y1,t.y2,t.y3)-o,u=this.we(r,o,h,a,i),f=r+.5*h,g=o+a*(1/3);return this.xe(u,f,g),this.me.Es(u)}}function nt(l,t,i,r,n){const o=1-l,h=o*o,a=l*l;return h*o*t+3*h*l*i+3*o*a*r+a*l*n}const Ft={Ce:function(l=16){const t=[];for(let i=0;i<l;i++){const r=i/l,n=(i+1)/l;t.push(r,-.5,r,0),t.push(n,-.5,n,0),t.push(r,.5,r,1),t.push(r,.5,r,1),t.push(n,-.5,n,0),t.push(n,.5,n,1)}return new Float32Array(t)}(16),Ss:96,Fs:WebGL2RenderingContext.TRIANGLES,_s:16,ds:{fs:{size:2,offset:0},ps:{size:2,offset:8}}};class Lt extends N{constructor(t,i){super(t,i,A.BEZIER_CURVE,Ft)}Es(t,i){const r=i.W||1,n=nt(.5,t.x1,t.cp1x,t.cp2x,t.x2),o=nt(.5,t.y1,t.cp1y,t.cp2y,t.y2),h=this.we(0,0,1,r,i);return this.xe(h,n,o),h.se=[t.x1,t.y1],h.Qs=[t.cp1x,t.cp1y],h.te=[t.cp2x,t.cp2y],h.ee=[t.x2,t.y2],this.me.Es(h)}}class Pt{constructor(t){c(this,"gt");c(this,"Me",null);c(this,"Re");c(this,"Fe",null);c(this,"Se",{});c(this,"Te",null);c(this,"Ae",new Map);c(this,"ze");c(this,"Ee");c(this,"Pe");c(this,"I",[]);this.gt=t,this.Re=new mt(t),this.Pe=new st,this.ze=new vt(t,this),this.Ee=new Et,this.Te=t.createBuffer(),H(this.gt,[0,0,this.gt.canvas.width,this.gt.canvas.height])}ke(t){let i=this.Ae.get(t);if(i)return i;const r=new yt(this.gt);return i=(0,{[A.RECTANGLE]:()=>new wt(this.gt,r),[A.LINE]:()=>new Tt(this.gt,r),[A.ELLIPSE]:()=>new bt(this.gt,r),[A.ARC]:()=>new _t(this.gt,r),[A.TRIANGLE]:()=>new Dt(this.gt,r),[A.BEZIER_CURVE]:()=>new Lt(this.gt,r)}[t])(),this.Ae.set(t,i),i}Le(t){this.Me!==t&&(this.Me=t,t.Ht())}cs(t,i){return this.Re.cs(t,i)}es(){return this.Re.es()}At(){return this.Re.At()}rs(){return this.Re.rs()}ns(){return this.Re.ns()}De(t){this.Fe=t,t&&(this.Se={})}Nt(t,i){this.Se[t]=i}Be(t){Object.assign(this.Se,t)}hs(t){return this.Re.hs(t)}Ge(t,i,r,n,o){const h=this.es(),a={Ue:t.textures[0],Uf:t.textures[1],Ug:t.textures[2],Uh:t.textures[3],Ui:t.textures[4],Uj:[t.width,t.height]};this.Ee.Ws(i,r,n,o,h,a,this.Pe)}Ie(t,i,r,n,o){const h=this.ns(),a=t.Oe(),u={Uk:a.texture,Ul:!!a.invert,Um:!!a.flipX,Un:!!a.flipY,Uo:a.charRotation,Up:a.charColorFixed,Uq:a.charColor,Ur:a.cellColorFixed,Us:a.cellColor,Ut:a.backgroundColor,Uu:a.charCount,Uv:a.charList};this.Ee.Ws(i,r,n,o,h,u,this.Pe)}We(t,i,r,n){var m;const o=this.gt,h=o.canvas.width,a=o.canvas.height,u=t/h*2-1,f=(t+r)/h*2-1,g=1-i/a*2,d=1-(i+n)/a*2,v=new Float32Array([u,d,f,d,u,g,f,d,f,g,u,g]);o.bindBuffer(o.ARRAY_BUFFER,this.Te),o.bufferData(o.ARRAY_BUFFER,v,o.DYNAMIC_DRAW);const y=((m=this.Me)==null?void 0:m.Zt)||o.getParameter(o.CURRENT_PROGRAM),p=y?o.getAttribLocation(y,"a_position"):-1;p!==-1&&(o.enableVertexAttribArray(p),o.vertexAttribPointer(p,2,o.FLOAT,!1,8,0)),o.drawArrays(o.TRIANGLES,0,6),p!==-1&&o.disableVertexAttribArray(p)}He(t,i,r,n){this.Fe?(this.Ee.Ws(t,i,r,n,this.Fe,{...this.Se},this.Pe),this.Fe=null,this.Se={}):this.Ee.Os(t,i,r,n,this.Pe)}Ke(t,i,r,n){this.Ee.Hs(t,i,r,n,this.Pe.lineWeight,this.Pe)}Xe(t,i,r,n){this.Ee.Ks(t,i,r,n,this.Pe)}Ne(t,i,r,n,o,h){this.Ee.Ns(t,i,r,n,o,h,this.Pe)}je(t,i,r,n,o,h,a,u){const f=this.Pe.lineWeight;this.Ee.js(t,i,r,n,o,h,a,u,f,this.Pe)}Ye(t,i,r=1,n={}){return new $(this.gt,t,i,r,n,this,!0)}Ve(t,i,r,n,o,h){this.Ee.Xs(t,i,r,n,o,h,this.Pe)}qe(t,i=t,r=t,n=255){this.Pe.ft(t,i,r,n),this.Ys(t/255,i/255,r/255,n/255)}Ys(t=0,i=0,r=0,n=0){this.gt.clearColor(t,i,r,n),this.gt.clear(this.gt.COLOR_BUFFER_BIT)}Ze(){this.gt.viewport(0,0,this.gt.canvas.width,this.gt.canvas.height),H(this.gt,[0,0,this.gt.canvas.width,this.gt.canvas.height])}get context(){return this.gt}get state(){return this.Pe}Et(t){this.I.push(this.Pe),this.Pe=t}Pt(){const t=this.I.pop();t&&(this.Pe=t)}zt(t){const i=t,r=V(this.gt)??this.gt.getParameter(this.gt.VIEWPORT),n={shader:i,gl:this.gt,viewport:r};this.Le(i);const o=new Set;for(const h of this.Ee)h.type===A.CUSTOM?o.add(A.RECTANGLE):o.add(h.type);for(const h of o)h!==A.CUSTOM&&this.ke(h);this.ze.bs(n,this.Ee,this.Ae),this.Ee.Ys()}kt(){this.gt.deleteBuffer(this.Te),this.Ee.Ys();for(const t of this.Ae.values())t.kt();this.Re.kt(),this.ze.kt()}}const C={readShort:(l,t)=>(C.t.uint16[0]=l[t]<<8|l[t+1],C.t.int16[0]),readUshort:(l,t)=>l[t]<<8|l[t+1],readUshorts(l,t,i){const r=[];for(let n=0;n<i;n++)r.push(C.readUshort(l,t+2*n));return r},readUint(l,t){const i=C.t.uint8;return i[3]=l[t],i[2]=l[t+1],i[1]=l[t+2],i[0]=l[t+3],C.t.uint32[0]},readASCII(l,t,i){let r="";for(let n=0;n<i;n++)r+=String.fromCharCode(l[t+n]);return r},writeUshort(l,t,i){l[t]=i>>>8&255,l[t+1]=255&i},writeUint(l,t,i){l[t]=i>>>24&255,l[t+1]=i>>>16&255,l[t+2]=i>>>8&255,l[t+3]=255&i},writeASCII(l,t,i){for(let r=0;r<i.length;r++)l[t+r]=255&i.charCodeAt(r)},t:(()=>{const l=new ArrayBuffer(8);return{uint8:new Uint8Array(l),int16:new Int16Array(l),uint16:new Uint16Array(l),uint32:new Uint32Array(l)}})()};function K(l){return l+3&-4}function Q(l,t,i){const r=t+i;let n=0;const o=C.t;for(let h=t;h<r;h+=4)o.uint8[3]=l[h]||0,o.uint8[2]=l[h+1]||0,o.uint8[1]=l[h+2]||0,o.uint8[0]=l[h+3]||0,n=n+(o.uint32[0]>>>0)>>>0;return n>>>0}class Bt{constructor(t){c(this,"b");c(this,"p",0);c(this,"bitbuf",0);c(this,"bitcnt",0);this.b=t}readBits(t){for(;this.bitcnt<t;){const r=this.b[this.p++]||0;this.bitbuf|=r<<this.bitcnt,this.bitcnt+=8}const i=this.bitbuf&(1<<t)-1;return this.bitbuf>>>=t,this.bitcnt-=t,i}alignToByte(){this.bitbuf=0,this.bitcnt=0}get offset(){return this.p}}function X(l){let t=32,i=0;for(const a of l)a&&(a<t&&(t=a),a>i&&(i=a));if(i===0)return{min:0,max:0,table:new Map};const r=new Uint32Array(i+1);for(const a of l)a&&r[a]++;const n=new Uint32Array(i+1);let o=0;r[0]=0;for(let a=1;a<=i;a++)o=o+r[a-1]<<1,n[a]=o;const h=new Map;for(let a=0;a<l.length;a++){const u=l[a];if(!u)continue;const f=n[u]++;let g=h.get(u);g||(g=[],h.set(u,g)),g[St(f,u)]=a}return{min:t,max:i,table:h}}function tt(l,t){let i=0;for(let r=1;r<=t.max;r++){i|=l.readBits(1)<<r-1;const n=t.table.get(r);if(n&&i<n.length){const o=n[i];if(o!==void 0)return o}}throw Error("Invalid Huffman code")}function St(l,t){let i=0;for(let r=0;r<t;r++)i=i<<1|1&l,l>>>=1;return i>>>0}function Mt(l){if(l.length<2)throw Error("ZLIB data too short");const t=l[0],i=l[1];if((15&t)!=8)throw Error("Unsupported ZLIB compression method");if(((t<<8)+i)%31!=0)throw Error("Bad ZLIB header check");let r=2;32&i&&(r+=4);const n=[];return function(o,h){const a=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258],u=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],f=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577],g=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13];let d=0;for(;!d;){d=o.readBits(1);const v=o.readBits(2);if(v===0){o.alignToByte();const y=o.readBits(16);if((65535&(65535^y))!==o.readBits(16))throw Error("DEFLATE uncompressed LEN/NLEN mismatch");for(let p=0;p<y;p++)h.push(o.readBits(8))}else{if(v!==1&&v!==2)throw Error("Unsupported DEFLATE type");{let y,p;if(v===1){const m=Array(288).fill(0);for(let x=0;x<=143;x++)m[x]=8;for(let x=144;x<=255;x++)m[x]=9;for(let x=256;x<=279;x++)m[x]=7;for(let x=280;x<=287;x++)m[x]=8;y=X(m),p=X(Array(32).fill(5))}else{const m=o.readBits(5)+257,x=o.readBits(5)+1,E=o.readBits(4)+4,T=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],w=Array(19).fill(0);for(let L=0;L<E;L++)w[T[L]]=o.readBits(3);const F=X(w),U=[];for(;U.length<m+x;){const L=tt(o,F);if(L<=15)U.push(L);else if(L===16){const k=o.readBits(2)+3,O=U[U.length-1]||0;for(let gt=0;gt<k;gt++)U.push(O)}else if(L===17){const k=o.readBits(3)+3;for(let O=0;O<k;O++)U.push(0)}else{if(L!==18)throw Error("Invalid code length symbol");{const k=o.readBits(7)+11;for(let O=0;O<k;O++)U.push(0)}}}const D=U.slice(0,m),P=U.slice(m,m+x);y=X(D),p=X(P)}for(;;){const m=tt(o,y);if(m<256)h.push(m);else{if(m===256)break;if(m>256&&m<286){const x=m-257;let E=a[x];const T=u[x];T&&(E+=o.readBits(T));const w=tt(o,p);if(w>=30)throw Error("Invalid distance symbol");let F=f[w];const U=g[w];U&&(F+=o.readBits(U));const D=h.length-F;if(D<0)throw Error("Invalid distance");for(let P=0;P<E;P++)h.push(h[D+P]||0)}else if(m===286||m===287)throw Error("Reserved length symbol")}}}}}}(new Bt(l.subarray(r)),n),new Uint8Array(n)}function It(l){const t=C,i=new Uint8Array(l);if(t.readASCII(i,0,4)!=="wOFF")throw Error("Invalid WOFF signature");const r=t.readUint(i,4),n=t.readUshort(i,12),o=t.readUint(i,16),h=[];let a=44;for(let E=0;E<n;E++){const T=t.readASCII(i,a,4),w=t.readUint(i,a+4),F=t.readUint(i,a+8),U=t.readUint(i,a+12),D=t.readUint(i,a+16);h.push({tag:T,offset:w,compLength:F,origLength:U,checksum:D}),a+=20}for(const E of h){const T=new Uint8Array(i.buffer,E.offset,E.compLength);if(E.compLength===E.origLength)E.data=new Uint8Array(T);else if(E.data=Mt(T),E.data.length!==E.origLength)if(E.data.length<E.origLength){const w=new Uint8Array(E.origLength);w.set(E.data),E.data=w}else E.data=E.data.subarray(0,E.origLength)}const u=n;let f=1,g=0;for(;f<<1<=u;)f<<=1,g++;const d=16*f,v=16*u-d;let y=12+16*u;const p={};for(const E of h)p[E.tag]=y,y=K(y+E.data.length);const m=new Uint8Array(Math.max(o||0,y));t.writeUint(m,0,r),t.writeUshort(m,4,u),t.writeUshort(m,6,d),t.writeUshort(m,8,g),t.writeUshort(m,10,v);let x=12;for(const E of h){t.writeASCII(m,x,E.tag),x+=4;let T=E.data;if(E.tag==="head"&&T.length>=12){const w=new Uint8Array(T);t.writeUint(w,8,0);const F=Q(w,0,K(w.length));t.writeUint(m,x,F),x+=4}else{const w=Q(T,0,K(T.length));t.writeUint(m,x,w),x+=4}t.writeUint(m,x,p[E.tag]),x+=4,t.writeUint(m,x,E.data.length),x+=4}for(const E of h){const T=p[E.tag];m.set(E.data,T)}if(h.find(E=>E.tag==="head")){const E=p.head,T=function(w,F){const U=C,D=F+8,P=[w[D],w[D+1],w[D+2],w[D+3]];U.writeUint(w,D,0);const L=2981146554-(Q(w,0,K(w.length))>>>0)>>>0;return w[D]=P[0],w[D+1]=P[1],w[D+2]=P[2],w[D+3]=P[3],L>>>0}(m,E);t.writeUint(m,E+8,T)}return m.buffer}const Gt={parseTab(l,t,i){const r={tables:[],ids:{},off:t};l=new Uint8Array(l.buffer,t,i),t=0;const n=C,o=n.readUshort,h=o(l,t+=2);t+=2;const a=[];for(let u=0;u<h;u++){const f=o(l,t),g=o(l,t+=2);t+=2;const d=n.readUint(l,t);t+=4;const v=`p${f}e${g}`;let y=a.indexOf(d);if(y===-1){let p;y=r.tables.length,a.push(d);const m=o(l,d);p=m===4?this.parse4(l,d):m===12?this.parse12(l,d):{format:m},r.tables.push(p)}r.ids[v]=y}return r},parse4(l,t){const i=C,r=i.readUshort,n=i.readUshorts,o=t,h=r(l,t+=2);t+=2;const a=r(l,t+=2)>>>1,u={format:4,searchRange:r(l,t+=2),entrySelector:0,rangeShift:0,endCount:[],startCount:[],idDelta:[],idRangeOffset:[],glyphIdArray:[]};t+=2,u.entrySelector=r(l,t),t+=2,u.rangeShift=r(l,t),t+=2,u.endCount=n(l,t,a),t+=2*a,t+=2,u.startCount=n(l,t,a),t+=2*a;for(let f=0;f<a;f++)u.idDelta.push(i.readShort(l,t)),t+=2;return u.idRangeOffset=n(l,t,a),t+=2*a,u.glyphIdArray=n(l,t,o+h-t>>1),u},parse12(l,t){const i=C.readUint;i(l,t+=4),i(l,t+=4);const r=i(l,t+=4);t+=4;const n=new Uint32Array(3*r);for(let o=0;o<3*r;o+=3)n[o]=i(l,t+(o<<2)),n[o+1]=i(l,t+(o<<2)+4),n[o+2]=i(l,t+(o<<2)+8);return{format:12,groups:n}}},Ot={parseTab(l,t,i){const r=C;t+=18;const n=r.readUshort(l,t);t+=2,t+=16;const o=r.readShort(l,t);t+=2;const h=r.readShort(l,t);t+=2;const a=r.readShort(l,t);t+=2;const u=r.readShort(l,t);return t+=2,t+=6,{unitsPerEm:n,xMin:o,yMin:h,xMax:a,yMax:u,indexToLocFormat:r.readShort(l,t)}}},zt={parseTab(l,t,i){const r=C;t+=4;const n=["ascender","descender","lineGap","advanceWidthMax","minLeftSideBearing","minRightSideBearing","xMaxExtent","caretSlopeRise","caretSlopeRun","caretOffset","res0","res1","res2","res3","metricDataFormat","numberOfHMetrics"],o={};for(let h=0;h<n.length;h++){const a=n[h],u=a==="advanceWidthMax"||a==="numberOfHMetrics"?r.readUshort:r.readShort;o[a]=u(l,t+2*h)}return o}},Nt={parseTab(l,t,i,r){const n=C,o=[],h=[],a=r.maxp.numGlyphs,u=r.hhea.numberOfHMetrics;let f=0,g=0,d=0;for(;d<u;)f=n.readUshort(l,t+(d<<2)),g=n.readShort(l,t+(d<<2)+2),o.push(f),h.push(g),d++;for(;d<a;)o.push(f),h.push(g),d++;return{aWidth:o,lsBearing:h}}},ot={cmap:Gt,head:Ot,hhea:zt,maxp:{parseTab(l,t,i){const r=C;return r.readUint(l,t),t+=4,{numGlyphs:r.readUshort(l,t)}}},hmtx:Nt,loca:{parseTab(l,t,i,r){const n=C,o=[],h=r.head.indexToLocFormat,a=r.maxp.numGlyphs+1;if(h===0)for(let u=0;u<a;u++)o.push(n.readUshort(l,t+(u<<1))<<1);else if(h===1)for(let u=0;u<a;u++)o.push(n.readUint(l,t+(u<<2)));return o}},glyf:{parseTab(l,t,i,r){const n=[],o=r.maxp.numGlyphs;for(let h=0;h<o;h++)n.push(null);return n},Je(l,t){const i=C,r=l.Qe,n=l.loca;if(n[t]===n[t+1])return null;const o=B.findTable(r,"glyf",l.ti);if(!o)return null;let h=o[0]+n[t];const a={};if(a.noc=i.readShort(r,h),h+=2,a.xMin=i.readShort(r,h),h+=2,a.yMin=i.readShort(r,h),h+=2,a.xMax=i.readShort(r,h),h+=2,a.yMax=i.readShort(r,h),h+=2,a.xMin>=a.xMax||a.yMin>=a.yMax)return null;if(a.noc>0){a.endPts=[];for(let v=0;v<a.noc;v++)a.endPts.push(i.readUshort(r,h)),h+=2;const u=i.readUshort(r,h);if(h+=2,r.length-h<u)return null;h+=u;const f=a.endPts[a.noc-1]+1;a.flags=[];for(let v=0;v<f;v++){const y=r[h];if(h++,a.flags.push(y),8&y){const p=r[h];h++;for(let m=0;m<p;m++)a.flags.push(y),v++}}a.xs=[];for(let v=0;v<f;v++){const y=a.flags[v],p=!!(16&y);2&y?(a.xs.push(p?r[h]:-r[h]),h++):p?a.xs.push(0):(a.xs.push(i.readShort(r,h)),h+=2)}a.ys=[];for(let v=0;v<f;v++){const y=a.flags[v],p=!!(32&y);4&y?(a.ys.push(p?r[h]:-r[h]),h++):p?a.ys.push(0):(a.ys.push(i.readShort(r,h)),h+=2)}let g=0,d=0;for(let v=0;v<f;v++)g+=a.xs[v],d+=a.ys[v],a.xs[v]=g,a.ys[v]=d}else a.parts=[],a.endPts=[],a.flags=[],a.xs=[],a.ys=[];return a}}},B={parse(l){const t=new Uint8Array(l),i=C.readASCII(t,0,4);if(i==="wOFF")l=It(l);else if(i==="wOF2")throw Error("WOFF2 is not supported in this build (Brotli + WOFF2 transforms required)");return[((r,n,o,h)=>{const a=ot,u={Qe:r,si:n,ti:o};for(const f in a){const g=f,d=B.findTable(r,g,o);if(d){const[v,y]=d;let p=h[v];p==null&&(p=a[g].parseTab(r,v,y,u),h[v]=p),u[g]=p}}return u})(new Uint8Array(l),0,0,{})]},findTable(l,t,i){const r=C,n=r.readUshort(l,i+4);let o=i+12;for(let h=0;h<n;h++){const a=r.readASCII(l,o,4);r.readUint(l,o+4);const u=r.readUint(l,o+8),f=r.readUint(l,o+12);if(a===t)return[u,f];o+=16}return null},T:ot,B:C};class Wt{ei(t){var r;const i=[];return(r=t.cmap)!=null&&r.tables?(t.cmap.tables.forEach(n=>{if(n.format===4){const o=this.ii(n);i.push(...o)}else if(n.format===12){const o=this.ri(n);i.push(...o)}}),[...new Set(i)]):[]}ni(t){return t.filter(i=>this.oi(i))}ii(t){const i=[];if(!(t.startCount&&t.endCount&&t.idRangeOffset&&t.idDelta))return i;for(let r=0;r<t.startCount.length;r++){const n=t.startCount[r],o=t.endCount[r];if(n!==65535||o!==65535){for(let h=n;h<=o;h++)if(this.hi(t,h,r)>0)try{const a=String.fromCodePoint(h);i.push(a)}catch{}}}return i}ri(t){const i=[];if(!t.groups)return i;for(let r=0;r<t.groups.length;r+=3){const n=t.groups[r],o=t.groups[r+1],h=t.groups[r+2];for(let a=n;a<=o;a++)if(h+(a-n)>0)try{const u=String.fromCodePoint(a);i.push(u)}catch{}}return i}hi(t,i,r){if(t.idRangeOffset[r]===0)return i+t.idDelta[r]&65535;{const n=t.idRangeOffset[r]/2+(i-t.startCount[r])-(t.startCount.length-r);if(n>=0&&t.glyphIdArray&&n<t.glyphIdArray.length){const o=t.glyphIdArray[n];if(o!==0)return o+t.idDelta[r]&65535}}return 0}oi(t){const i=t.codePointAt(0)||0;return!(i>=0&&i<=31&&i!==9&&i!==10&&i!==13||i>=127&&i<=159)}}class et{constructor(){c(this,"ai",new Map);c(this,"ci",new Map)}li(t,i){const r=`${this.ui(t)}_${i}`;if(this.ai.has(r))return this.ai.get(r);const n=t.cmap;if(!n||!n.tables)return this.ai.set(r,0),0;let o=0;for(const h of n.tables)if(h.format===4?o=this.fi(i,h):h.format===12&&(o=this.di(i,h)),o>0)break;return this.ai.set(r,o),o}_i(t,i){const r=i.codePointAt(0);return r===void 0?0:this.li(t,r)}pi(t,i){const r=t.hmtx;return r&&r.aWidth&&r.aWidth.length!==0?i<r.aWidth.length?r.aWidth[i]:r.aWidth[r.aWidth.length-1]:0}mi(t,i){const r=i/t.head.unitsPerEm,n=t.hhea.ascender*r,o=t.hhea.descender*r,h=t.hhea.lineGap*r;return{ascender:n,descender:o,lineGap:h,lineHeight:n-o+h,unitsPerEm:t.head.unitsPerEm,scale:r}}gi(){this.ai.clear(),this.ci.clear()}ui(t){return`${t.ti}_${t.Qe.length}`}fi(t,i){const r=i.endCount.length;let n=-1;for(let o=0;o<r;o++)if(t<=i.endCount[o]){n=o;break}if(n===-1||t<i.startCount[n])return 0;if(i.idRangeOffset[n]===0)return t+i.idDelta[n]&65535;{const o=i.idRangeOffset[n]/2+(t-i.startCount[n])-(r-n);if(o>=0&&o<i.glyphIdArray.length){const h=i.glyphIdArray[o];return h===0?0:h+i.idDelta[n]&65535}}return 0}di(t,i){const r=i.groups.length/3;for(let n=0;n<r;n++){const o=i.groups[3*n],h=i.groups[3*n+1],a=i.groups[3*n+2];if(t>=o&&t<=h)return a+(t-o)}return 0}}class Yt{constructor(t){c(this,"yi");c(this,"Ci");c(this,"xt");c(this,"wi");this.xt=t,this.wi=new et,this.yi=document.createElement("canvas"),this.Ci=this.yi.getContext("2d",{willReadFrequently:!0,alpha:!0})}createTextureAtlas(t,i,r,n){const o=t.length,h=Math.ceil(Math.sqrt(o)),a=Math.ceil(o/h),u=i.width*h,f=i.height*a,g=typeof n=="object"?n:null;this.bi(u,f),this.$i(t,i,h,r,g);const d=this.xt.Ye(u,f,1,{filter:"nearest"});return d.Tt(this.yi),{framebuffer:d,columns:h,rows:a}}bi(t,i){this.yi.width=t,this.yi.height=i,this.yi.style.width=t+"px",this.yi.style.height=i+"px",this.Ci.imageSmoothingEnabled=!1,this.yi.style.imageRendering="pixelated",this.Ci.clearRect(0,0,t,i),this.Ci.textBaseline="top",this.Ci.textAlign="left",this.Ci.fillStyle="white"}$i(t,i,r,n,o){const h=n/o.head.unitsPerEm;for(let a=0;a<t.length;a++){const u=a%r,f=Math.floor(a/r),g=t[a].character,d=this.xi(o,g);if(!d)continue;const v=g.codePointAt(0)||0,y=this.wi.li(o,v),p=this.Mi(o,y)*h,m=u*i.width,x=f*i.height,E=m+.5*i.width,T=x+.5*i.height,w=Math.round(E-.5*i.width),F=Math.round(T-.5*n),U=w+.5*(i.width-p),D=F+o.hhea.ascender*h;this.Ri(d,U,D,h)}}xi(t,i){const r=i.codePointAt(0)||0,n=this.wi.li(t,r);if(n===0)return null;if(t.glyf&&t.glyf[n]!==null)return t.glyf[n];if(B&&B.T&&B.T.glyf){const o=B.T.glyf.Je(t,n);return t.glyf&&o&&(t.glyf[n]=o),o}return null}Mi(t,i){const r=t.hmtx;return r&&r.aWidth?i<r.aWidth.length?r.aWidth[i]:r.aWidth[r.aWidth.length-1]:0}Ri(t,i,r,n){if(!t||!t.xs||t.noc===0)return;const{xs:o,ys:h,endPts:a,flags:u}=t;if(!(o&&h&&a&&u))return;this.Ci.beginPath();let f=0;for(let g=0;g<a.length;g++){const d=a[g];if(!(d<f)){if(d>=f){const v=i+o[f]*n,y=r-h[f]*n;this.Ci.moveTo(v,y);let p=f+1;for(;p<=d;)if(1&u[p]){const m=i+o[p]*n,x=r-h[p]*n;this.Ci.lineTo(m,x),p++}else{const m=i+o[p]*n,x=r-h[p]*n;let E=p+1>d?f:p+1;if(1&u[E]){const T=i+o[E]*n,w=r-h[E]*n;this.Ci.quadraticCurveTo(m,x,T,w),p=E+1}else{const T=(m+(i+o[E]*n))/2,w=(x+(r-h[E]*n))/2;this.Ci.quadraticCurveTo(m,x,T,w),p=E}}this.Ci.closePath()}f=d+1}}this.Ci.fill()}}class Xt{constructor(){c(this,"Fi");this.Fi=new et}Si(t,i,r){let n=0;const o=this.Fi.mi(r,i),h=o.lineHeight;for(const a of t){const u=this.Fi._i(r,a);if(u===0)continue;const f=this.Fi.pi(r,u)*o.scale;n=Math.max(n,f)}return{width:Math.ceil(n),height:Math.ceil(h)}}gi(){this.Fi.gi()}}class kt{constructor(){c(this,"wi");this.wi=new et}createCharacterObjects(t,i){return t.map((r,n)=>{const o=r.codePointAt(0)||0,h=this.Ti(n);let a=0;if(i.hmtx&&i.hmtx.aWidth){const u=this.wi.li(i,o);u>0&&i.hmtx.aWidth[u]!==void 0&&(a=i.hmtx.aWidth[u])}return{character:r,unicode:o,color:h,advanceWidth:a}})}Ti(t){return[t%256/255,Math.floor(t/256)%256/255,Math.floor(t/65536)%256/255]}Ai(t,i){if(!Y.v(typeof t=="string","Character must be a string.",{method:"getCharacterColor",providedValue:t}))return[0,0,0];const r=i.find(n=>n.character===t);return r?r.color:[0,0,0]}zi(t,i){return Y.v(typeof t=="string"&&t.length>0,"Characters must be a string with at least one character.",{method:"getCharacterColors",providedValue:t})?Array.from(t).map(r=>this.Ai(r,i)||[0,0,0]):[[0,0,0]]}}class ht{constructor(t,i=16){c(this,"Ei");c(this,"Pi",[]);c(this,"ki");c(this,"Li",16);c(this,"Di",0);c(this,"Bi",0);c(this,"Gi",{width:0,height:0});c(this,"Ii");c(this,"Oi");c(this,"Wi");c(this,"Hi");c(this,"Ki");this.Li=i,this.Oi=new Wt,this.Wi=new Yt(t),this.Hi=new Xt,this.Ki=new kt}async Xi(t){let i;if(!t)throw new R("Embedded font not available. This appears to be a minified build - please provide `fontSource`.");{const r=await fetch(t);if(!r.ok)throw new R(`Failed to load font file: ${r.status} ${r.statusText}`);i=await r.arrayBuffer()}await this.Ni(i),this.Ei=B.parse(i)[0],await this.ji()}Yi(t){if(t===void 0)return this.Li;this.Li=t,this.Gi=this.Hi.Si(this.Pi.map(r=>r.character),this.Li,this.Ei);const i=this.Wi.createTextureAtlas(this.Pi,this.Gi,this.Li,this.Ei);this.ki=i.framebuffer,this.Di=i.columns,this.Bi=i.rows}async Vi(t){try{const i=await fetch(t);if(!i.ok)throw new R(`Failed to load font file: ${i.status} ${i.statusText}`);const r=await i.arrayBuffer();await this.Ni(r);const n=B.parse(r);if(!n||n.length===0)throw Error("Failed to parse font file");this.Ei=n[0],await this.ji()}catch(i){throw new R("Failed to load font: "+(i instanceof Error?i.message:"Unknown error"),i)}}async Ni(t){const i=Date.now();this.Ii=new FontFace("CustomFont_"+i,t),await this.Ii.load(),document.fonts.add(this.Ii)}async ji(){const t=this.Oi.ei(this.Ei),i=this.Oi.ni(t);this.Pi=this.Ki.createCharacterObjects(i,this.Ei),this.Gi=this.Hi.Si(i,this.Li,this.Ei);const r=this.Wi.createTextureAtlas(this.Pi,this.Gi,this.Li,this.Ei);this.ki=r.framebuffer,this.Di=r.columns,this.Bi=r.rows}Ai(t){return this.Ki.Ai(t,this.Pi)}zi(t){return this.Ki.zi(t,this.Pi)}kt(){this.ki.kt(),document.fonts.delete(this.Ii)}get fontFramebuffer(){return this.ki}get characters(){return this.Pi}get textureColumns(){return this.Di}get textureRows(){return this.Bi}get maxGlyphDimensions(){return this.Gi}get fontSize(){return this.Li}get font(){return this.Ei}}class at{constructor(t,i,r){c(this,"qi");c(this,"Zi");c(this,"dt");c(this,"_t");c(this,"Ji");c(this,"Qi");c(this,"tr");c(this,"sr");c(this,"er");this.tr=t,this.sr=i,this.er=r,this.ir()}ir(){this.qi=Math.floor(this.tr.width/this.sr),this.Zi=Math.floor(this.tr.height/this.er),this.dt=this.qi*this.sr,this._t=this.Zi*this.er,this.Ji=Math.floor((this.tr.width-this.dt)/2),this.Qi=Math.floor((this.tr.height-this._t)/2)}rr(t,i){this.sr=t,this.er=i,this.ir()}get cellWidth(){return this.sr}get cellHeight(){return this.er}get cols(){return this.qi}get rows(){return this.Zi}get width(){return this.dt}get height(){return this._t}get offsetX(){return this.Ji}get offsetY(){return this.Qi}}class ct{constructor(t={}){c(this,"tr");c(this,"nr",null);c(this,"hr",!1);c(this,"ar");c(this,"cr");this.hr=t.overlay??!1,this.hr&&t.canvas?(this.nr=t.canvas,this.tr=this.lr(),this.cr=!0,this.ur()):t.canvas?(this.tr=t.canvas,this.cr=!1):(this.tr=this.dr(t.width,t.height),this.cr=!0),this.tr.style.imageRendering="pixelated"}dr(t,i){const r=document.createElement("canvas");return r.className="textmodeCanvas",r.style.imageRendering="pixelated",r.width=t||800,r.height=i||600,document.body.appendChild(r),r}lr(){const t=document.createElement("canvas");t.className="textmodeCanvas",t.style.imageRendering="pixelated";const i=this.nr.getBoundingClientRect();let r=Math.round(i.width),n=Math.round(i.height);if(this.nr instanceof HTMLVideoElement){const a=this.nr;(r===0||n===0)&&a.videoWidth>0&&a.videoHeight>0&&(r=a.videoWidth,n=a.videoHeight)}t.width=r,t.height=n,t.style.position="absolute",t.style.pointerEvents="none";const o=window.getComputedStyle(this.nr);let h=parseInt(o.zIndex||"0",10);return isNaN(h)&&(h=0),t.style.zIndex=""+(h+1),t}ur(){var t;this._r(),(t=this.nr.parentNode)==null||t.insertBefore(this.tr,this.nr.nextSibling),window.ResizeObserver&&(this.ar=new ResizeObserver(()=>{this.pr()}),this.ar.observe(this.nr)),window.addEventListener("resize",()=>{this.pr()})}_r(){if(!this.nr)return;const t=this.nr.getBoundingClientRect();let i=this.nr.offsetParent;if(i&&i!==document.body){const r=i.getBoundingClientRect();this.tr.style.top=t.top-r.top+"px",this.tr.style.left=t.left-r.left+"px"}else this.tr.style.top=t.top+window.scrollY+"px",this.tr.style.left=t.left+window.scrollX+"px"}pr(t,i){if(this.hr){const r=this.nr.getBoundingClientRect();let n=Math.round(r.width),o=Math.round(r.height);if(this.nr instanceof HTMLVideoElement){const h=this.nr;(n===0||o===0)&&h.videoWidth>0&&h.videoHeight>0&&(n=h.videoWidth,o=h.videoHeight)}this.tr.width=n,this.tr.height=o,this._r()}else this.tr.width=t??this.tr.width,this.tr.height=i??this.tr.height}mr(){const t=this.tr.getContext("webgl2",{alpha:!0,premultipliedAlpha:!1,preserveDrawingBuffer:!0,antialias:!1,depth:!1,stencil:!1,powerPreference:"high-performance"});if(!t)throw new R("`textmode.js` requires WebGL2 support.");return t}kt(){this.ar&&this.ar.disconnect();const t=this.tr.getContext("webgl")||this.tr.getContext("webgl2");if(t){const i=t.getExtension("WEBGL_lose_context");i&&i.loseContext()}this.cr&&this.tr.parentNode&&this.tr.parentNode.removeChild(this.tr)}get canvas(){return this.tr}get targetCanvas(){return this.nr}get width(){return this.tr.width}get height(){return this.tr.height}}class W{constructor(t,i,r,n){c(this,"vr");c(this,"dt");c(this,"_t");c(this,"gt");c(this,"L",0);c(this,"N",0);c(this,"j",0);c(this,"D",[0,0]);c(this,"gr","sampled");c(this,"yr","fixed");c(this,"V",[1,1,1,1]);c(this,"q",[0,0,0,1]);c(this,"Cr",[0,0,0,1]);c(this,"wr",[[.1,0,0]]);c(this,"br");this.gt=t,this.vr=i,this.dt=r,this._t=n}kt(){this.gt.deleteTexture(this.vr)}$r(t){return typeof t=="boolean"?t?1:0:(t==null?0:Number(t))>0?1:0}invert(t=!0){return this.L=this.$r(t),this}flipX(t=!0){return this.N=this.$r(t),this}flipY(t=!0){return this.j=this.$r(t),this}charRotation(t){const i=255*t/360,r=Math.floor(i)/255,n=Math.round(i-Math.floor(i));return this.D=[r,n],this}Oe(){return{texture:this.vr,invert:this.L,flipX:this.N,flipY:this.j,charRotation:this.D,charColorFixed:this.gr==="fixed",charColor:this.V,cellColorFixed:this.yr==="fixed",cellColor:this.q,backgroundColor:this.Cr,charCount:this.wr.length,charList:this.wr}}charColorMode(t){return this.gr=t,this}cellColorMode(t){return this.yr=t,this}charColor(t,i,r,n){return this.V=[(t??0)/255,(i??t??0)/255,(r??t??0)/255,(n??255)/255],this}cellColor(t,i,r,n){return this.q=[(t??0)/255,(i??t??0)/255,(r??t??0)/255,(n??255)/255],this}background(t,i,r,n){return this.Cr=[(t??0)/255,(i??t??0)/255,(r??t??0)/255,(n??255)/255],this}characters(t){const i=this.br(t).filter(r=>Array.isArray(r)).slice(0,64);return this.wr=i,this}static Mr(t,i,r){const n=t.context,o=n.createTexture();n.bindTexture(n.TEXTURE_2D,o),n.pixelStorei(n.UNPACK_FLIP_Y_WEBGL,1),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_MIN_FILTER,n.NEAREST),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_MAG_FILTER,n.NEAREST),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_S,n.CLAMP_TO_EDGE),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_T,n.CLAMP_TO_EDGE),n.texImage2D(n.TEXTURE_2D,0,n.RGBA,n.RGBA,n.UNSIGNED_BYTE,i),n.bindTexture(n.TEXTURE_2D,null);const h=i.naturalWidth??i.width??i.videoWidth??0,a=i.naturalHeight??i.height??i.videoHeight??0,u=new W(n,o,h,a);return u.br=r,u}get texture(){return this.vr}get width(){return this.dt}get height(){return this._t}}class Ht{constructor(t=60){c(this,"Rr");c(this,"Fr");c(this,"Sr",null);c(this,"Tr",0);c(this,"Ar",!0);c(this,"zr",0);c(this,"Er",0);c(this,"Pr",[]);c(this,"kr",10);c(this,"Lr",0);this.Rr=t,this.Fr=1e3/t}start(t){if(!this.Ar)return;this.Tr=performance.now();const i=r=>{if(!this.Ar)return void(this.Sr=null);const n=r-this.Tr;n>=this.Fr&&(t(),this.Tr=r-n%this.Fr),this.Ar&&(this.Sr=requestAnimationFrame(i))};this.Sr=requestAnimationFrame(i)}stop(){this.Sr&&(cancelAnimationFrame(this.Sr),this.Sr=null)}pause(){this.Ar&&(this.Ar=!1,this.stop())}resume(t){this.Ar||(this.Ar=!0,this.start(t))}frameRate(t,i){if(t===void 0)return this.zr;this.Rr=t,this.Fr=1e3/t,this.Ar&&i&&(this.stop(),this.start(i))}measureFrameRate(){const t=performance.now();if(this.Er>0){const i=t-this.Er;this.Pr.push(i),this.Pr.length>this.kr&&this.Pr.shift();const r=this.Pr.reduce((n,o)=>n+o,0)/this.Pr.length;this.zr=1e3/r}this.Er=t}get isLooping(){return this.Ar}get frameRateLimit(){return this.Rr}get currentFrameRate(){return this.zr}get frameCount(){return this.Lr}set frameCount(t){this.Lr=t}incrementFrame(){this.Lr++}resetFrameCount(){this.Lr=0}}class lt{constructor(t){c(this,"tr");c(this,"Dr");c(this,"Br",{x:-1,y:-1});c(this,"Gr",{x:-1,y:-1});c(this,"Ir",null);c(this,"Or",0);c(this,"Wr");c(this,"Hr");c(this,"Kr");c(this,"Xr");c(this,"Nr");c(this,"jr");c(this,"Yr",!1);c(this,"Vr");c(this,"qr");c(this,"Zr");c(this,"Jr");c(this,"Qr");this.tr=t}tn(t){const i=performance.now()+Math.max(0,t);i>this.Or&&(this.Or=i)}sn(){return performance.now()<this.Or}en(t){const i=this.tr.canvas;i.style.cursor=t==null||t===""?"":t}Xi(t){this.Dr=t,this.rn()}nn(){if(this.Yr)return;const t=this.tr.canvas;this.Wr=i=>{this.hn(i),this.an(i)},this.Hr=()=>{this.Gr={...this.Br},this.Br.x=-1,this.Br.y=-1,this.Ir=null},this.Kr=i=>{this.hn(i),this.cn(i)},this.Xr=i=>{this.hn(i),this.ln(i)},this.Nr=i=>{this.hn(i),this.un(i)},this.jr=i=>{this.hn(i),this.fn(i)},t.addEventListener("mousemove",this.Wr,{passive:!0}),t.addEventListener("mouseleave",this.Hr,{passive:!0}),t.addEventListener("mousedown",this.Kr,{passive:!0}),t.addEventListener("mouseup",this.Xr,{passive:!0}),t.addEventListener("click",this.Nr,{passive:!0}),t.addEventListener("wheel",this.jr,{passive:!1}),this.Yr=!0}dn(){if(!this.Yr)return;const t=this.tr.canvas;t.removeEventListener("mousemove",this.Wr),t.removeEventListener("mouseleave",this.Hr),t.removeEventListener("mousedown",this.Kr),t.removeEventListener("mouseup",this.Xr),t.removeEventListener("click",this.Nr),t.removeEventListener("wheel",this.jr),this.Yr=!1}rn(){if(this.Yr)try{if(this.Ir){const t=new MouseEvent("mousemove",{clientX:this.Ir.x,clientY:this.Ir.y,bubbles:!1,cancelable:!1});this.hn(t)}else this.Br.x!==-1&&this.Br.y!==-1&&(this.Br.x>=this.Dr.cols||this.Br.y>=this.Dr.rows)&&(this.Br.x=-1,this.Br.y=-1)}catch{this.Br.x=-1,this.Br.y=-1}}_n(t){this.Vr=t}pn(t){this.qr=t}mn(t){this.Zr=t}vn(t){this.Jr=t}gn(t){this.Qr=t}yn(){return{x:this.Br.x,y:this.Br.y}}an(t){if(this.Jr&&!this.sn()){const i={position:{...this.Br},previousPosition:{...this.Gr},originalEvent:t};this.Jr(i)}}cn(t){if(this.qr&&!this.sn()){const i={position:{...this.Br},previousPosition:{...this.Gr},button:t.button,originalEvent:t};this.qr(i)}}ln(t){if(this.Zr&&!this.sn()){const i={position:{...this.Br},previousPosition:{...this.Gr},button:t.button,originalEvent:t};this.Zr(i)}}un(t){if(this.Vr&&!this.sn()){const i={position:{...this.Br},previousPosition:{...this.Gr},button:t.button,originalEvent:t};this.Vr(i)}}fn(t){if(this.Qr&&!this.sn()){const i={position:{...this.Br},previousPosition:{...this.Gr},delta:{x:t.deltaX,y:t.deltaY},originalEvent:t};this.Qr(i)}}hn(t){const i=this.tr.canvas;this.Gr={...this.Br},this.Ir={x:t.clientX,y:t.clientY};const r=i.getBoundingClientRect(),n=t.clientX-r.left,o=t.clientY-r.top,h=i.width/r.width,a=o*(i.height/r.height),u=n*h-this.Dr.offsetX,f=a-this.Dr.offsetY,g=Math.floor(u/this.Dr.cellWidth),d=Math.floor(f/this.Dr.cellHeight);g>=0&&g<this.Dr.cols&&d>=0&&d<this.Dr.rows?(this.Br.x=g,this.Br.y=d):(this.Br.x=-1,this.Br.y=-1)}}const Vt=Object.freeze(Object.defineProperty({__proto__:null,MouseManager:lt},Symbol.toStringTag,{value:"Module"}));class ut{constructor(){c(this,"Cn",new Map);c(this,"wn",null);c(this,"bn",null);c(this,"$n");c(this,"xn");c(this,"Yr",!1);c(this,"Mn");c(this,"Rn");c(this,"Fn",{ArrowUp:"UP_ARROW",ArrowDown:"DOWN_ARROW",ArrowLeft:"LEFT_ARROW",ArrowRight:"RIGHT_ARROW",F1:"F1",F2:"F2",F3:"F3",F4:"F4",F5:"F5",F6:"F6",F7:"F7",F8:"F8",F9:"F9",F10:"F10",F11:"F11",F12:"F12",Enter:"ENTER",Return:"RETURN",Tab:"TAB",Escape:"ESCAPE",Backspace:"BACKSPACE",Delete:"DELETE",Insert:"INSERT",Home:"HOME",End:"END",PageUp:"PAGE_UP",PageDown:"PAGE_DOWN",Shift:"SHIFT",Control:"CONTROL",Alt:"ALT",Meta:"META"," ":"SPACE"})}nn(){this.Yr||(this.$n=t=>{this.Sn(t)},this.xn=t=>{this.Tn(t)},window.addEventListener("keydown",this.$n,{passive:!1}),window.addEventListener("keyup",this.xn,{passive:!1}),this.Yr=!0)}dn(){this.Yr&&(window.removeEventListener("keydown",this.$n),window.removeEventListener("keyup",this.xn),this.Yr=!1,this.Cn.clear(),this.wn=null,this.bn=null)}pn(t){this.Mn=t}mn(t){this.Rn=t}An(t){const i=this.zn(t),r=this.Cn.get(t)||this.Cn.get(i);return(r==null?void 0:r.isPressed)||!1}En(){return this.wn}Pn(){return this.bn}kn(){const t=[];for(const[i,r]of this.Cn)r.isPressed&&t.push(i);return t}Ln(){return{ctrl:this.An("Control"),shift:this.An("Shift"),alt:this.An("Alt"),meta:this.An("Meta")}}Dn(){this.Cn.clear(),this.wn=null,this.bn=null}Sn(t){const i=t.key,r=Date.now();this.Cn.has(i)||this.Cn.set(i,{isPressed:!1,lastPressTime:0,lastReleaseTime:0});const n=this.Cn.get(i);if(!n.isPressed&&(n.isPressed=!0,n.lastPressTime=r,this.wn=i,this.Mn)){const o={key:i,keyCode:t.keyCode,ctrlKey:t.ctrlKey,shiftKey:t.shiftKey,altKey:t.altKey,metaKey:t.metaKey,isPressed:!0,originalEvent:t};this.Mn(o)}}Tn(t){const i=t.key,r=Date.now();this.Cn.has(i)||this.Cn.set(i,{isPressed:!1,lastPressTime:0,lastReleaseTime:0});const n=this.Cn.get(i);if(n.isPressed=!1,n.lastReleaseTime=r,this.bn=i,this.Rn){const o={key:i,keyCode:t.keyCode,ctrlKey:t.ctrlKey,shiftKey:t.shiftKey,altKey:t.altKey,metaKey:t.metaKey,isPressed:!1,originalEvent:t};this.Rn(o)}}zn(t){return this.Fn[t]||t.toLowerCase()}}const $t=Object.freeze(Object.defineProperty({__proto__:null,KeyboardManager:ut},Symbol.toStringTag,{value:"Module"}));class ft{constructor(t,i){c(this,"tr");c(this,"Bn");c(this,"Dr");c(this,"Gn",new Map);c(this,"In",new Map);c(this,"On",new Map);c(this,"Wn",null);c(this,"Hn");c(this,"Kn");c(this,"Xn");c(this,"Nn");c(this,"jn");c(this,"Yn");c(this,"Yr",!1);c(this,"Vn");c(this,"qn");c(this,"Zn");c(this,"Jn");c(this,"Qn");c(this,"so");c(this,"eo");c(this,"io");c(this,"ro");c(this,"no");c(this,"oo",320);c(this,"ho",350);c(this,"ao",10);c(this,"co",550);c(this,"lo",14);c(this,"uo",48);c(this,"fo",650);c(this,"do",.02);c(this,"_o",2);c(this,"po",600);c(this,"mo",0);c(this,"vo",null);this.tr=t,this.Bn=i;const r=this.tr.canvas;this.Hn=r.style.touchAction,this.Kn=r.style.userSelect,r.style.touchAction||(r.style.touchAction="none"),r.style.userSelect||(r.style.userSelect="none")}Xi(t){this.Dr=t,this.yo()}nn(){if(this.Yr)return;const t=this.tr.canvas;this.Xn=i=>{this.Co(i)},this.Nn=i=>{this.wo(i)},this.jn=i=>{this.bo(i)},this.Yn=i=>{this.$o(i)},t.addEventListener("touchstart",this.Xn,{passive:!1}),t.addEventListener("touchmove",this.Nn,{passive:!1}),t.addEventListener("touchend",this.jn,{passive:!1}),t.addEventListener("touchcancel",this.Yn,{passive:!1}),this.Yr=!0}dn(){if(!this.Yr)return;const t=this.tr.canvas;t.removeEventListener("touchstart",this.Xn),t.removeEventListener("touchmove",this.Nn),t.removeEventListener("touchend",this.jn),t.removeEventListener("touchcancel",this.Yn),this.Yr=!1,this.Wn=null,this.Gn.clear(),this.In.clear(),this.On.forEach(i=>{i.longPressTimer!==null&&window.clearTimeout(i.longPressTimer)}),this.On.clear(),this.vo=null,this.mo=0,t.style.touchAction=this.Hn,t.style.userSelect=this.Kn}yo(){if(!this.Dr||this.Gn.size===0)return;const t=new Map;for(const i of this.Gn.values()){const r=this.xo(i.clientX,i.clientY,i.id,i);t.set(i.id,r)}this.Gn=t}Mo(){return Array.from(this.Gn.values()).map(t=>({...t}))}Ro(t){this.Vn=t}vn(t){this.qn=t}Fo(t){this.Zn=t}So(t){this.Jn=t}To(t){this.Qn=t}Ao(t){this.so=t}zo(t){this.eo=t}Eo(t){this.io=t}Po(t){this.ro=t}ko(t){this.no=t}Co(t){var n;if(!this.Dr)return;t.preventDefault(),(n=this.Bn)==null||n.tn(this.po);const i=performance.now(),r=this.Lo(t.changedTouches);for(const o of r){const h=this.Gn.get(o.id);h&&this.In.set(o.id,this.Do(h)),this.Gn.set(o.id,o);const a={id:o.id,startPosition:o,lastPosition:o,startTime:i,lastTime:i,longPressTimer:null,longPressFired:!1};this.eo&&(a.longPressTimer=window.setTimeout(()=>{const u=this.Gn.get(o.id);u&&(a.longPressFired=!0,this.eo({touch:this.Do(u),duration:performance.now()-a.startTime,originalEvent:t}))},this.co)),this.On.set(o.id,a),this.Vn&&this.Vn(this.Bo(o,t,void 0,i))}this.Gn.size===2&&this.Go()}wo(t){var n;if(!this.Dr)return;t.preventDefault(),(n=this.Bn)==null||n.tn(this.po);const i=performance.now(),r=this.Lo(t.changedTouches);for(const o of r){const h=this.Gn.get(o.id),a=h?this.Do(h):void 0;a&&this.In.set(o.id,a),this.Gn.set(o.id,o);const u=this.On.get(o.id);u&&(u.lastPosition=o,u.lastTime=i,a)&&this.Io(a,o,!0)>this.lo&&u.longPressTimer!==null&&(window.clearTimeout(u.longPressTimer),u.longPressTimer=null),this.qn&&this.qn(this.Bo(o,t,a,i))}this.Gn.size===2?this.Oo(t):this.Wn=null}bo(t){if(!this.Dr)return;t.preventDefault();const i=performance.now(),r=this.Lo(t.changedTouches);for(const n of r){const o=this.Gn.get(n.id),h=o?this.Do(o):void 0,a=this.On.get(n.id);a&&a.longPressTimer!==null&&(window.clearTimeout(a.longPressTimer),a.longPressTimer=null),this.Zn&&this.Zn(this.Bo(n,t,h,i)),a&&this.Wo(a,t),this.On.delete(n.id),this.In.delete(n.id),this.Gn.delete(n.id)}this.Gn.size<2&&(this.Wn=null)}$o(t){if(!this.Dr)return;t.preventDefault();const i=performance.now(),r=this.Lo(t.changedTouches);for(const n of r){const o=this.Gn.get(n.id),h=o?this.Do(o):void 0,a=this.On.get(n.id);a&&a.longPressTimer!==null&&(window.clearTimeout(a.longPressTimer),a.longPressTimer=null),this.Jn&&this.Jn(this.Bo(n,t,h,i)),this.On.delete(n.id),this.In.delete(n.id),this.Gn.delete(n.id)}this.Gn.size<2&&(this.Wn=null)}Lo(t){const i=[];for(let r=0;r<t.length;r+=1){const n=t.item(r);n&&i.push(this.Ho(n))}return i}Ho(t){return this.xo(t.clientX,t.clientY,t.identifier,{id:t.identifier,x:-1,y:-1,clientX:t.clientX,clientY:t.clientY,pressure:t.force,radiusX:t.radiusX,radiusY:t.radiusY,rotationAngle:t.rotationAngle})}xo(t,i,r,n){const o=this.tr.canvas,h=o.getBoundingClientRect(),a=t-h.left,u=i-h.top,f=o.width/h.width,g=u*(o.height/h.height),d=a*f-this.Dr.offsetX,v=g-this.Dr.offsetY,y=Math.floor(d/this.Dr.cellWidth),p=Math.floor(v/this.Dr.cellHeight),m=y>=0&&y<this.Dr.cols&&p>=0&&p<this.Dr.rows;return{id:r,x:m?y:-1,y:m?p:-1,clientX:t,clientY:i,pressure:n.pressure,radiusX:n.radiusX,radiusY:n.radiusY,rotationAngle:n.rotationAngle}}Bo(t,i,r,n){const o=this.On.get(t.id),h=Array.from(this.In.values()).map(f=>this.Do(f)),a=Array.from(this.Gn.values()).map(f=>this.Do(f)),u=this.Lo(i.changedTouches);return{touch:this.Do(t),previousTouch:r?this.Do(r):void 0,touches:a,previousTouches:h,changedTouches:u,deltaTime:o?n-o.lastTime:0,originalEvent:i}}Go(){if(this.Gn.size!==2)return void(this.Wn=null);const t=Array.from(this.Gn.values()),[i,r]=t,n=this.Io(i,r,!1),o=this.Ko(i,r);this.Wn={ids:[i.id,r.id],initialDistance:Math.max(n,1e-4),initialAngle:o,lastScale:1,lastRotation:0}}Oo(t){if(this.Wn||this.Go(),!this.Wn)return;const[i,r]=this.Wn.ids,n=this.Gn.get(i),o=this.Gn.get(r);if(!n||!o)return;const h=this.Io(n,o,!1)/this.Wn.initialDistance,a=h-this.Wn.lastScale;this.ro&&Math.abs(a)>this.do&&(this.ro({touches:[this.Do(n),this.Do(o)],scale:h,deltaScale:a,center:this.Xo(n,o),originalEvent:t}),this.Wn.lastScale=h);let u=this.Ko(n,o)-this.Wn.initialAngle;u=(u+180)%360-180;const f=u-this.Wn.lastRotation;this.no&&Math.abs(f)>this._o&&(this.no({touches:[this.Do(n),this.Do(o)],rotation:u,deltaRotation:f,center:this.Xo(n,o),originalEvent:t}),this.Wn.lastRotation=u)}Xo(t,i){const r=(t.clientX+i.clientX)/2,n=(t.clientY+i.clientY)/2,o=this.xo(r,n,-1,{id:-1,x:-1,y:-1,clientX:r,clientY:n});return{x:o.x,y:o.y}}Wo(t,i){const r=performance.now(),n=r-t.startTime,o=this.Io(t.startPosition,t.lastPosition,!0);if(!t.longPressFired&&n<=this.oo&&o<=this.ao)this.No(t.lastPosition,r)&&this.so?this.so({touch:this.Do(t.lastPosition),taps:2,originalEvent:i}):this.Qn&&this.Qn({touch:this.Do(t.lastPosition),taps:1,originalEvent:i});else if(!t.longPressFired&&n<=this.fo&&o>=this.uo){const h={x:t.lastPosition.clientX-t.startPosition.clientX,y:t.lastPosition.clientY-t.startPosition.clientY},a=Math.max(Math.hypot(h.x,h.y),1e-4),u={x:h.x/a,y:h.y/a},f={x:h.x/n,y:h.y/n};this.io&&this.io({touch:this.Do(t.lastPosition),direction:u,distance:a,velocity:f,originalEvent:i})}this.mo=r,this.vo=this.Do(t.lastPosition)}No(t,i){return!!this.vo&&!(i-this.mo>this.ho)&&this.Io(t,this.vo,!0)<=this.ao}Do(t){return{...t}}Io(t,i,r){return r?Math.hypot(t.clientX-i.clientX,t.clientY-i.clientY):Math.hypot(t.x-i.x,t.y-i.y)}Ko(t,i){return 180*Math.atan2(i.clientY-t.clientY,i.clientX-t.clientX)/Math.PI}}const jt=Object.freeze(Object.defineProperty({__proto__:null,TouchManager:ft},Symbol.toStringTag,{value:"Module"})),qt=l=>class extends l{rotate(t=0,i=0,r=0){this.xt.state.st(t),this.xt.state.et(i),this.xt.state.it(r)}rotateX(t){this.xt.state.st(t)}rotateY(t){this.xt.state.et(t)}rotateZ(t){this.xt.state.it(t)}push(){this.xt.state.O()}pop(){this.xt.state.Z()}rect(t,i,r=1,n=1){this.xt.He(t,i,r,n)}point(t,i){this.xt.He(t,i,1,1)}line(t,i,r,n){this.xt.Ke(t,i,r,n)}lineWeight(t){this.xt.state.tt(t)}background(t,i=t,r=t,n=255){this.xt.qe(t,i,r,n)}char(t){this.xt.state.rt(this.Ei.Ai(t))}charColor(t,i,r,n=255){this.xt.state.nt(t,i,r,n)}cellColor(t,i,r,n=255){this.xt.state.ot(t,i,r,n)}flipX(t){this.xt.state.ht(t)}flipY(t){this.xt.state.ct(t)}charRotation(t){this.xt.state.ut(t)}invert(t){this.xt.state.lt(t)}clear(){this.xt.qe(0,0,0,0)}ellipse(t,i,r,n){this.xt.Xe(t,i,r/2,n/2)}triangle(t,i,r,n,o,h){this.xt.Ne(t,i,r,n,o,h)}bezierCurve(t,i,r,n,o,h,a,u){this.xt.je(t,i,r,n,o,h,a,u)}arc(t,i,r,n,o,h){this.xt.Ve(t,i,r,n,o,h)}shader(t){this.xt.De(t)}setUniform(t,i){this.xt.Nt(t,i)}setUniforms(t){this.xt.Be(t)}createFilterShader(t){return this.xt.hs(t)}createFramebuffer(t){return this.xt.Ye(t.width,t.height,5,{filter:"nearest",wrap:"clamp",format:"rgba",type:"unsigned_byte"})}image(t,i,r,n,o){if(t.textures){const h=t;this.xt.Ge(h,i,r,n??h.width,o??h.height)}else{const h=t;this.xt.Ie(h,i,r,n??Math.floor(this.Dr.cols/2),o??Math.floor(this.Dr.rows/2))}}async loadImage(t){if(typeof t!="string")return W.Mr(this.xt,t,n=>this.Ei.zi(n));const i=t,r=await new Promise((n,o)=>{const h=new Image;h.crossOrigin="anonymous",h.onload=()=>n(h),h.onerror=a=>o(a),h.src=i});return W.Mr(this.xt,r,n=>this.Ei.zi(n))}},Kt=l=>class extends l{async loadFont(t){return this.Ei.Vi(t).then(()=>{const i=this.Ei.maxGlyphDimensions;this.Dr.rr(i.width,i.height),this.jo.resize(this.Dr.cols,this.Dr.rows),this.xt.Ze(),this.Bn.rn()})}fontSize(t){if(!Y.v(typeof t=="number"&&t>0,"Font size must be a positive number greater than 0.",{method:"fontSize",providedValue:t})||this.Ei.fontSize===t)return;this.Ei.Yi(t);const i=this.Ei.maxGlyphDimensions;this.Dr.rr(i.width,i.height),this.jo.resize(this.Dr.cols,this.Dr.rows),this.xt.Ze(),this.Bn.rn()}glyphColor(t){return this.Ei.Ai(t)}glyphColors(t){return this.Ei.zi(t)}},Zt=l=>class extends l{get frameCount(){return this.Yo.frameCount}set frameCount(t){this.Yo.frameCount=t}frameRate(t){return t===void 0?this.Yo.currentFrameRate:this.Yo.frameRate(t,()=>this.Vo())}noLoop(){this.Yo.pause()}loop(){this.Yo.resume(()=>this.Vo())}redraw(t=1){if(Y.v(typeof t=="number"&&t>0&&Number.isInteger(t),"Redraw count must be a positive integer.",{method:"redraw",providedValue:t}))for(let i=0;i<t;i++)this.Vo()}isLooping(){return this.Yo.isLooping}},Jt=l=>class extends l{constructor(...t){super(...t)}mouseClicked(t){this.Bn._n(t)}mousePressed(t){this.Bn.pn(t)}mouseReleased(t){this.Bn.mn(t)}mouseMoved(t){this.Bn.vn(t)}mouseScrolled(t){this.Bn.gn(t)}get mouse(){return this.Bn.yn()}cursor(t){this.Bn.en(t)}},Qt=l=>class extends l{constructor(...t){super(...t)}touchStarted(t){this.qo.Ro(t)}touchMoved(t){this.qo.vn(t)}touchEnded(t){this.qo.Fo(t)}touchCancelled(t){this.qo.So(t)}tap(t){this.qo.To(t)}doubleTap(t){this.qo.Ao(t)}longPress(t){this.qo.zo(t)}swipe(t){this.qo.Eo(t)}pinch(t){this.qo.Po(t)}rotateGesture(t){this.qo.ko(t)}get touches(){return this.qo.Mo()}},te=l=>class extends l{constructor(...t){super(...t)}keyPressed(t){this.Zo.pn(t)}keyReleased(t){this.Zo.mn(t)}isKeyPressed(t){return this.Zo.An(t)}get lastKeyPressed(){return this.Zo.En()}get lastKeyReleased(){return this.Zo.Pn()}get pressedKeys(){return this.Zo.kn()}get modifierState(){return this.Zo.Ln()}};class ee{constructor(){c(this,"xt");c(this,"Ei");c(this,"tr");c(this,"Dr");c(this,"Yo");c(this,"Bn");c(this,"qo");c(this,"Zo");c(this,"Jo");c(this,"jo");c(this,"Qo");c(this,"th");c(this,"sh")}Vo(){}}class dt extends function(i,...r){return r.reduce((n,o)=>o(n),i)}(ee,qt,Kt,Zt,Jt,Qt,te){constructor(i={}){var r;super();c(this,"eh",new Map);c(this,"ih");c(this,"rh",!1);c(this,"nh",!1);c(this,"oh",()=>{});c(this,"hh",()=>{});c(this,"ah",()=>{});c(this,"uh");c(this,"ar");c(this,"hr",!1);c(this,"fh");this.ih=((r=i.plugins)==null?void 0:r.slice())??[],this.hr=i.overlay??!1,this.tr=new ct(i),this.xt=new Pt(this.tr.mr()),this.Ei=new ht(this.xt,i.fontSize??16),this.Yo=new Ht(i.frameRate??60),this.Bn=new lt(this.tr),this.qo=new ft(this.tr,this.Bn),this.Zo=new ut,this.Jo=this.xt.At(),this.Qo=this.xt.rs(),this.dh(i)}async dh(i){await this.Ei.Xi(i.fontSource);const r=this.Ei.maxGlyphDimensions;this.Dr=new at(this.tr.canvas,r.width,r.height),this.Bn.Xi(this.Dr),this.qo.Xi(this.Dr),this.jo=this.xt.Ye(this.Dr.cols,this.Dr.rows,5),this.th=this.xt.Ye(this.Dr.width,this.Dr.height,1),this.hr&&(this.fh=W.Mr(this.xt,this.tr.targetCanvas,n=>this.Ei.zi(n))),this.sh=this.xt.cs(rt,"precision mediump float;uniform sampler2D Ua;uniform vec2 Ub;uniform vec2 Uc;uniform vec2 Ud;void main(){vec2 A=gl_FragCoord.xy-Uc;vec2 B=A*(Ub/Ud);vec2 C=(floor(B)+0.5)/Ub;gl_FragColor=texture2D(Ua,C);}"),this._h(),await this.ph(this.ih),this.ih=[],this.rh=!0,this.oh(),this.Yo.start(()=>this.Vo())}async ph(i){if(i.length)for(const r of i)this.eh.has(r.name)?console.warn(`[textmode.js] Plugin "${r.name}" is already installed.`):(await r.install(this,this.mh()),this.eh.set(r.name,r))}async gh(i){const r=this.eh.get(i);r&&(r.uninstall&&await r.uninstall(this,this.mh()),this.eh.delete(i))}async use(i){return this.rh?await this.ph([i]):this.ih.push(i),this}async unuse(i){return this.rh?(await this.gh(i),this):(this.ih=this.ih.filter(r=>r.name!==i),this)}hasPlugin(i){return this.rh?this.eh.has(i):this.ih.some(r=>r.name===i)||this.eh.has(i)}mh(){return{renderer:this.xt,font:this.Ei,grid:this.Dr,canvas:this.tr,drawFramebuffer:this.jo,asciiFramebuffer:this.th,flushDrawCommands:()=>{this.xt.zt(this.Jo)}}}_h(){this.uh=()=>{this.hr&&this.resizeCanvas(this.tr.targetCanvas.width,this.tr.targetCanvas.height),this.ah()},window.addEventListener("resize",this.uh),this.Bn.nn(),this.qo.nn(),this.Zo.nn(),window.addEventListener("blur",()=>{this.Zo.Dn()}),window.ResizeObserver&&this.hr&&(this.ar=new ResizeObserver(()=>{this.resizeCanvas(this.tr.targetCanvas.width,this.tr.targetCanvas.height)}),this.ar.observe(this.tr.targetCanvas))}Vo(){if(this.Yo.measureFrameRate(),this.Yo.incrementFrame(),this.nh)return;if(this.hr){const r=this.xt.context;r.bindTexture(r.TEXTURE_2D,this.fh.texture),r.pixelStorei(r.UNPACK_FLIP_Y_WEBGL,1),r.texImage2D(r.TEXTURE_2D,0,r.RGBA,r.RGBA,r.UNSIGNED_BYTE,this.tr.targetCanvas),r.bindTexture(r.TEXTURE_2D,null)}this.jo.begin(),this.xt.Le(this.Jo),this.hh(),this.xt.zt(this.Jo),this.jo.end(),this.th.begin(),this.xt.Le(this.Qo),this.Qo.Xt({U0:this.Ei.fontFramebuffer,U1:[this.Ei.textureColumns,this.Ei.textureRows],U2:this.jo.textures[0],U3:this.jo.textures[1],U4:this.jo.textures[2],U5:this.jo.textures[4],U6:this.jo.textures[3],U7:[this.Dr.cols,this.Dr.rows],U8:[this.th.width,this.th.height],U9:this.th.width/this.th.height}),this.xt.We(0,0,this.tr.width,this.tr.height),this.th.end();const i=this.xt.state.canvasBackgroundColor;this.xt.Ys(i[0],i[1],i[2],i[3]),this.xt.Le(this.sh),this.sh.Xt({Ua:this.th.textures[0],Ub:[this.th.width,this.th.height],Uc:[this.Dr.offsetX,this.Dr.offsetY],Ud:[this.Dr.width,this.Dr.height]}),this.xt.We(this.Dr.offsetX,this.Dr.offsetY,this.Dr.width,this.Dr.height)}setup(i){this.oh=i}draw(i){this.hh=i}windowResized(i){this.ah=i}resizeCanvas(i,r){this.tr.pr(i,r),this.Dr.ir(),this.jo.resize(this.Dr.cols,this.Dr.rows),this.th.resize(this.Dr.width,this.Dr.height),this.xt.Ze(),this.Bn.rn(),this.qo.yo(),this.Vo()}destroy(){this.nh||(this.Yo.stop(),window.removeEventListener("resize",this.uh),this.Bn.dn(),this.qo.dn(),this.Zo.dn(),this.Ei.kt(),this.xt.kt(),this.th.kt(),this.sh.kt(),this.fh&&this.fh.kt(),this.nh=!0)}get grid(){return this.Dr}get font(){return this.Ei}get width(){return this.tr.width}get height(){return this.tr.height}get canvas(){return this.tr.canvas}get isDisposed(){return this.nh}get overlay(){return this.fh}}class Z{constructor(){}static create(t={}){return new dt(t)}static setErrorLevel(t){Y.C(t)}static get version(){return"0.3.2-beta.2"}}const ie=Object.freeze(Object.defineProperty({__proto__:null},Symbol.toStringTag,{value:"Module"})),se=Object.freeze(Object.defineProperty({__proto__:null,keyboard:$t,mouse:Vt,touch:jt},Symbol.toStringTag,{value:"Module"})),re=Z.create,ne=Z.setErrorLevel,oe=Z.version;b.TextmodeCanvas=ct,b.TextmodeErrorLevel=M,b.TextmodeFont=ht,b.TextmodeFramebuffer=$,b.TextmodeGrid=at,b.TextmodeImage=W,b.Textmodifier=dt,b.create=re,b.export=ie,b.input=se,b.setErrorLevel=ne,b.textmode=Z,b.version=oe,Object.defineProperty(b,Symbol.toStringTag,{value:"Module"})},typeof exports=="object"&&typeof module<"u"?e(exports):typeof define=="function"&&define.amd?define(["exports"],e):e((s=typeof globalThis<"u"?globalThis:s||self).textmode={});
|
package/dist/types/index.d.ts
CHANGED
|
@@ -8,6 +8,7 @@ export { TextmodeGrid } from './textmode/Grid';
|
|
|
8
8
|
export type { TextmodeOptions } from './textmode/Textmodifier';
|
|
9
9
|
export type { TextmodeFramebufferOptions } from './textmode/mixins/RenderingMixin';
|
|
10
10
|
export type { TextmodeCharacter } from './textmode/font';
|
|
11
|
+
export type { TextmodePlugin } from './textmode/Textmodifier';
|
|
11
12
|
/** All types related to export options for different formats. */
|
|
12
13
|
export * as export from './export';
|
|
13
14
|
export { TextmodeErrorLevel } from './errors/ErrorHandler';
|
package/package.json
CHANGED