textmode.js 0.1.6-beta.6 → 0.1.7

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.
Files changed (37) hide show
  1. package/dist/textmode.esm.js +1197 -1168
  2. package/dist/textmode.esm.min.js +1237 -1208
  3. package/dist/textmode.umd.js +56 -18
  4. package/dist/textmode.umd.min.js +56 -18
  5. package/dist/types/errors/Error.d.ts +3 -5
  6. package/dist/types/errors/ErrorHandler.d.ts +3 -3
  7. package/dist/types/export/base/DataExtractor.d.ts +3 -3
  8. package/dist/types/export/base/FileHandler.d.ts +6 -6
  9. package/dist/types/export/image/ImageContentGenerator.d.ts +3 -3
  10. package/dist/types/export/image/ImageDataExtractor.d.ts +1 -1
  11. package/dist/types/export/image/ImageExporter.d.ts +8 -8
  12. package/dist/types/export/image/ImageFileHandler.d.ts +3 -15
  13. package/dist/types/export/svg/SVGContentGenerator.d.ts +11 -11
  14. package/dist/types/export/svg/SVGDataExtractor.d.ts +3 -3
  15. package/dist/types/export/svg/SVGExporter.d.ts +6 -6
  16. package/dist/types/export/svg/SVGFileHandler.d.ts +3 -3
  17. package/dist/types/export/svg/SVGPathGenerator.d.ts +5 -6
  18. package/dist/types/export/txt/TXTContentGenerator.d.ts +1 -1
  19. package/dist/types/export/txt/TXTDataExtractor.d.ts +1 -1
  20. package/dist/types/export/txt/TXTExporter.d.ts +6 -6
  21. package/dist/types/export/txt/TXTFileHandler.d.ts +2 -2
  22. package/dist/types/rendering/webgl/Framebuffer.d.ts +8 -8
  23. package/dist/types/rendering/webgl/Renderer.d.ts +35 -35
  24. package/dist/types/rendering/webgl/Shader.d.ts +14 -14
  25. package/dist/types/rendering/webgl/geometries/BaseGeometry.d.ts +10 -10
  26. package/dist/types/rendering/webgl/geometries/Line.d.ts +1 -1
  27. package/dist/types/rendering/webgl/geometries/Rectangle.d.ts +2 -2
  28. package/dist/types/textmode/Canvas.d.ts +9 -7
  29. package/dist/types/textmode/ConversionPipeline.d.ts +23 -15
  30. package/dist/types/textmode/Grid.d.ts +6 -6
  31. package/dist/types/textmode/Textmodifier.d.ts +15 -16
  32. package/dist/types/textmode/converters/BrightnessConverter.d.ts +8 -8
  33. package/dist/types/textmode/converters/Converter.d.ts +5 -5
  34. package/dist/types/textmode/converters/FeatureConverter.d.ts +6 -6
  35. package/dist/types/textmode/font/TextmodeFont.d.ts +8 -8
  36. package/dist/types/textmode/mixins/TextmodifierMixin.d.ts +1 -1
  37. package/package.json +1 -1
@@ -1,609 +1,606 @@
1
- var Z = Object.defineProperty;
2
- var J = (h, t, e) => t in h ? Z(h, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : h[t] = e;
3
- var a = (h, t, e) => J(h, typeof t != "symbol" ? t + "" : t, e);
4
- class v extends Error {
5
- constructor(e, s, i = {}) {
6
- super(v.i(e, i));
7
- a(this, "t");
8
- a(this, "context");
9
- this.name = "TextmodeError", this.t = s, this.context = i;
10
- }
11
- static i(e, s) {
12
- let i = e;
13
- if (s && Object.keys(s).length > 0) {
14
- i += `
1
+ var J = Object.defineProperty;
2
+ var K = (a, t, e) => t in a ? J(a, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : a[t] = e;
3
+ var h = (a, t, e) => K(a, typeof t != "symbol" ? t + "" : t, e);
4
+ class b extends Error {
5
+ constructor(t, e = {}) {
6
+ super(b.i(t, e)), this.name = "TextmodeError";
7
+ }
8
+ static i(t, e) {
9
+ let r = t;
10
+ if (e && Object.keys(e).length > 0) {
11
+ r += `
15
12
 
16
13
  📋 Context:`;
17
- for (const [r, o] of Object.entries(s))
18
- i += `
19
- - ${r}: ${v.o(o)}`;
14
+ for (const [s, i] of Object.entries(e))
15
+ r += `
16
+ - ${s}: ${b.o(i)}`;
20
17
  }
21
- return i += `
18
+ return r += `
22
19
 
23
- `, i += "↓".repeat(24) + `
24
- `, i;
25
- }
26
- static o(e) {
27
- if (e === null) return "null";
28
- if (e === void 0) return "undefined";
29
- if (typeof e == "string") return `"${e}"`;
30
- if (typeof e == "number" || typeof e == "boolean") return e + "";
31
- if (Array.isArray(e)) return e.length === 0 ? "[]" : e.length <= 5 ? `[${e.map((s) => v.o(s)).join(", ")}]` : `[${e.slice(0, 3).map((s) => v.o(s)).join(", ")}, ... +${e.length - 3} more]`;
32
- if (typeof e == "object") {
33
- const s = Object.keys(e);
34
- return s.length === 0 ? "{}" : s.length <= 3 ? `{ ${s.map((i) => `${i}: ${v.o(e[i])}`).join(", ")} }` : `{ ${s.slice(0, 2).map((i) => `${i}: ${v.o(e[i])}`).join(", ")}, ... +${s.length - 2} more }`;
20
+ `, r += "↓".repeat(24) + `
21
+ `, r;
22
+ }
23
+ static o(t) {
24
+ if (t === null) return "null";
25
+ if (t === void 0) return "undefined";
26
+ if (typeof t == "string") return `"${t}"`;
27
+ if (typeof t == "number" || typeof t == "boolean") return t + "";
28
+ if (Array.isArray(t)) return t.length === 0 ? "[]" : t.length <= 5 ? `[${t.map((e) => b.o(e)).join(", ")}]` : `[${t.slice(0, 3).map((e) => b.o(e)).join(", ")}, ... +${t.length - 3} more]`;
29
+ if (typeof t == "object") {
30
+ const e = Object.keys(t);
31
+ return e.length === 0 ? "{}" : e.length <= 3 ? `{ ${e.map((r) => `${r}: ${b.o(t[r])}`).join(", ")} }` : `{ ${e.slice(0, 2).map((r) => `${r}: ${b.o(t[r])}`).join(", ")}, ... +${e.length - 2} more }`;
35
32
  }
36
- return e + "";
33
+ return t + "";
37
34
  }
38
35
  }
39
- var tt = ((h) => (h[h.SILENT = 0] = "SILENT", h[h.WARNING = 1] = "WARNING", h[h.ERROR = 2] = "ERROR", h[h.THROW = 3] = "THROW", h))(tt || {});
40
- const F = class F {
36
+ var tt = ((a) => (a[a.SILENT = 0] = "SILENT", a[a.WARNING = 1] = "WARNING", a[a.ERROR = 2] = "ERROR", a[a.THROW = 3] = "THROW", a))(tt || {});
37
+ const P = class P {
41
38
  constructor() {
42
- a(this, "l", { u: 3 });
39
+ h(this, "l", { globalLevel: 3 });
43
40
  }
44
- static m() {
45
- return F.h || (F.h = new F()), F.h;
41
+ static u() {
42
+ return P.h || (P.h = new P()), P.h;
46
43
  }
47
- p(t, e, s) {
48
- const i = "%c[textmode.js] Oops! (╯°□°)╯︵ Something went wrong in your code.", r = "color: #f44336; font-weight: bold; background: #ffebee; padding: 2px 6px; border-radius: 3px;";
49
- switch (this.l.u) {
44
+ m(t, e) {
45
+ const r = "%c[textmode.js] Oops! (╯°□°)╯︵ Something went wrong in your code.", s = "color: #f44336; font-weight: bold; background: #ffebee; padding: 2px 6px; border-radius: 3px;";
46
+ switch (this.l.globalLevel) {
50
47
  case 0:
51
48
  return !1;
52
49
  case 1:
53
- return console.group(i, r), console.warn(v.i(t, e)), console.groupEnd(), !1;
50
+ return console.group(r, s), console.warn(b.i(t, e)), console.groupEnd(), !1;
54
51
  case 2:
55
- return console.group(i, r), console.error(v.i(t, e)), console.groupEnd(), !1;
52
+ return console.group(r, s), console.error(b.i(t, e)), console.groupEnd(), !1;
56
53
  default:
57
- throw new v(t, s, e);
54
+ throw new b(t, e);
58
55
  }
59
56
  }
60
- validate(t, e, s) {
61
- return !!t || (this.p(e, s), !1);
57
+ p(t, e, r) {
58
+ return !!t || (this.m(e, r), !1);
62
59
  }
63
- v(t) {
64
- this.l.u = t;
60
+ _(t) {
61
+ this.l.globalLevel = t;
65
62
  }
66
63
  };
67
- a(F, "h", null);
68
- let P = F;
69
- const w = P.m(), W = /* @__PURE__ */ new WeakMap();
70
- function U(h, t) {
71
- W.set(h, t);
64
+ h(P, "h", null);
65
+ let B = P;
66
+ const C = B.u(), X = /* @__PURE__ */ new WeakMap();
67
+ function $(a, t) {
68
+ X.set(a, t);
72
69
  }
73
- function X(h) {
74
- return W.get(h);
70
+ function W(a) {
71
+ return X.get(a);
75
72
  }
76
- class q {
77
- constructor(t, e, s = e, i = {}) {
78
- a(this, "_");
79
- a(this, "C");
80
- a(this, "F");
81
- a(this, "$");
82
- a(this, "D");
83
- a(this, "options");
84
- a(this, "M", null);
85
- a(this, "S", null);
86
- this._ = t, this.$ = e, this.D = s, this.options = { filter: "nearest", wrap: "clamp", format: "rgba", type: "unsigned_byte", ...i }, this.F = this.createTexture(), this.C = t.createFramebuffer(), this.V();
87
- }
88
- R(t) {
89
- const { _: e } = this, s = e.getParameter(e.FRAMEBUFFER_BINDING);
73
+ class H {
74
+ constructor(t, e, r = e, s = {}) {
75
+ h(this, "v");
76
+ h(this, "C");
77
+ h(this, "$");
78
+ h(this, "F");
79
+ h(this, "D");
80
+ h(this, "l");
81
+ h(this, "M", null);
82
+ h(this, "S", null);
83
+ this.v = t, this.F = e, this.D = r, this.l = { filter: "nearest", wrap: "clamp", format: "rgba", type: "unsigned_byte", ...s }, this.$ = this.R(), this.C = t.createFramebuffer(), this.V();
84
+ }
85
+ k(t) {
86
+ const { v: e } = this, r = e.getParameter(e.FRAMEBUFFER_BINDING);
90
87
  e.bindFramebuffer(e.FRAMEBUFFER, this.C);
91
88
  try {
92
89
  return t();
93
90
  } finally {
94
- e.bindFramebuffer(e.FRAMEBUFFER, s);
91
+ e.bindFramebuffer(e.FRAMEBUFFER, r);
95
92
  }
96
93
  }
97
- createTexture() {
98
- const { _: t } = this, e = t.createTexture();
94
+ R() {
95
+ const { v: t } = this, e = t.createTexture();
99
96
  t.bindTexture(t.TEXTURE_2D, e);
100
- const s = this.options.filter === "linear" ? t.LINEAR : t.NEAREST, i = this.options.wrap === "repeat" ? t.REPEAT : t.CLAMP_TO_EDGE;
101
- return t.texParameteri(t.TEXTURE_2D, t.TEXTURE_MIN_FILTER, s), t.texParameteri(t.TEXTURE_2D, t.TEXTURE_MAG_FILTER, s), t.texParameteri(t.TEXTURE_2D, t.TEXTURE_WRAP_S, i), t.texParameteri(t.TEXTURE_2D, t.TEXTURE_WRAP_T, i), this.k(), e;
97
+ const r = this.l.filter === "linear" ? t.LINEAR : t.NEAREST, s = this.l.wrap === "repeat" ? t.REPEAT : t.CLAMP_TO_EDGE;
98
+ return t.texParameteri(t.TEXTURE_2D, t.TEXTURE_MIN_FILTER, r), t.texParameteri(t.TEXTURE_2D, t.TEXTURE_MAG_FILTER, r), t.texParameteri(t.TEXTURE_2D, t.TEXTURE_WRAP_S, s), t.texParameteri(t.TEXTURE_2D, t.TEXTURE_WRAP_T, s), this.I(), e;
102
99
  }
103
- k() {
104
- const { _: t } = this, e = this.options.type === "float" ? t.FLOAT : t.UNSIGNED_BYTE;
105
- t.texImage2D(t.TEXTURE_2D, 0, t.RGBA, this.$, this.D, 0, t.RGBA, e, null);
100
+ I() {
101
+ const { v: t } = this, e = this.l.type === "float" ? t.FLOAT : t.UNSIGNED_BYTE;
102
+ t.texImage2D(t.TEXTURE_2D, 0, t.RGBA, this.F, this.D, 0, t.RGBA, e, null);
106
103
  }
107
104
  V() {
108
- const { _: t } = this;
109
- t.bindFramebuffer(t.FRAMEBUFFER, this.C), t.framebufferTexture2D(t.FRAMEBUFFER, t.COLOR_ATTACHMENT0, t.TEXTURE_2D, this.F, 0), t.bindFramebuffer(t.FRAMEBUFFER, null);
105
+ const { v: t } = this;
106
+ t.bindFramebuffer(t.FRAMEBUFFER, this.C), t.framebufferTexture2D(t.FRAMEBUFFER, t.COLOR_ATTACHMENT0, t.TEXTURE_2D, this.$, 0), t.bindFramebuffer(t.FRAMEBUFFER, null);
110
107
  }
111
108
  update(t) {
112
- const { _: e } = this;
113
- e.bindTexture(e.TEXTURE_2D, this.F), e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL, 1), e.texImage2D(e.TEXTURE_2D, 0, e.RGBA, e.RGBA, e.UNSIGNED_BYTE, t), e.bindTexture(e.TEXTURE_2D, null);
109
+ const { v: e } = this;
110
+ e.bindTexture(e.TEXTURE_2D, this.$), e.pixelStorei(e.UNPACK_FLIP_Y_WEBGL, 1), e.texImage2D(e.TEXTURE_2D, 0, e.RGBA, e.RGBA, e.UNSIGNED_BYTE, t), e.bindTexture(e.TEXTURE_2D, null);
114
111
  }
115
- I(t, e, s) {
116
- const { _: i } = this;
117
- i.bindTexture(i.TEXTURE_2D, this.F), i.texImage2D(i.TEXTURE_2D, 0, i.RGBA, e, s, 0, i.RGBA, i.UNSIGNED_BYTE, t), i.bindTexture(i.TEXTURE_2D, null);
112
+ updatePixels(t, e, r) {
113
+ const { v: s } = this;
114
+ s.bindTexture(s.TEXTURE_2D, this.$), s.texImage2D(s.TEXTURE_2D, 0, s.RGBA, e, r, 0, s.RGBA, s.UNSIGNED_BYTE, t), s.bindTexture(s.TEXTURE_2D, null);
118
115
  }
119
116
  resize(t, e) {
120
- const { _: s } = this;
121
- this.$ = t, this.D = e, this.S = null, s.bindTexture(s.TEXTURE_2D, this.F), this.k(), s.bindTexture(s.TEXTURE_2D, null);
117
+ const { v: r } = this;
118
+ this.F = t, this.D = e, this.S = null, r.bindTexture(r.TEXTURE_2D, this.$), this.I(), r.bindTexture(r.TEXTURE_2D, null);
122
119
  }
123
- P() {
124
- const { _: t } = this;
125
- this.M = { framebuffer: t.getParameter(t.FRAMEBUFFER_BINDING), viewport: t.getParameter(t.VIEWPORT) }, t.bindFramebuffer(t.FRAMEBUFFER, this.C), t.viewport(0, 0, this.$, this.D), U(t, [0, 0, this.$, this.D]);
120
+ begin() {
121
+ const { v: t } = this;
122
+ this.M = { framebuffer: t.getParameter(t.FRAMEBUFFER_BINDING), viewport: t.getParameter(t.VIEWPORT) }, t.bindFramebuffer(t.FRAMEBUFFER, this.C), t.viewport(0, 0, this.F, this.D), $(t, [0, 0, this.F, this.D]);
126
123
  }
127
124
  end() {
128
125
  if (!this.M) return;
129
- const { _: t } = this;
130
- t.bindFramebuffer(t.FRAMEBUFFER, this.M.framebuffer), t.viewport(...this.M.viewport), U(t, this.M.viewport), this.M = null;
126
+ const { v: t } = this;
127
+ t.bindFramebuffer(t.FRAMEBUFFER, this.M.framebuffer), t.viewport(...this.M.viewport), $(t, this.M.viewport), this.M = null;
131
128
  }
132
- A() {
133
- const { _: t } = this;
134
- this.S || (this.S = new Uint8Array(this.$ * this.D * 4)), this.R(() => {
135
- t.readPixels(0, 0, this.$, this.D, t.RGBA, t.UNSIGNED_BYTE, this.S);
129
+ loadPixels() {
130
+ const { v: t } = this;
131
+ this.S || (this.S = new Uint8Array(this.F * this.D * 4)), this.k(() => {
132
+ t.readPixels(0, 0, this.F, this.D, t.RGBA, t.UNSIGNED_BYTE, this.S);
136
133
  });
137
134
  }
138
- get(t, e, s, i) {
139
- const { _: r } = this;
135
+ get(t, e, r, s) {
136
+ const { v: i } = this;
140
137
  if (t === void 0 && e === void 0) {
141
- const o = new Uint8Array(this.$ * this.D * 4);
142
- return this.R(() => (r.readPixels(0, 0, this.$, this.D, r.RGBA, r.UNSIGNED_BYTE, o), o));
138
+ const o = new Uint8Array(this.F * this.D * 4);
139
+ return this.k(() => (i.readPixels(0, 0, this.F, this.D, i.RGBA, i.UNSIGNED_BYTE, o), o));
143
140
  }
144
- if (s === void 0 && i === void 0) {
145
- (t < 0 || e < 0 || t >= this.$ || e >= this.D) && (console.warn("The x and y values passed to Framebuffer.get are outside of its range and will be clamped."), t = Math.max(0, Math.min(t, this.$ - 1)), e = Math.max(0, Math.min(e, this.D - 1)));
141
+ if (r === void 0 && s === void 0) {
142
+ (t < 0 || e < 0 || t >= this.F || e >= this.D) && (console.warn("The x and y values passed to Framebuffer.get are outside of its range and will be clamped."), t = Math.max(0, Math.min(t, this.F - 1)), e = Math.max(0, Math.min(e, this.D - 1)));
146
143
  const o = new Uint8Array(4);
147
- return this.R(() => (r.readPixels(t, e, 1, 1, r.RGBA, r.UNSIGNED_BYTE, o), [o[0], o[1], o[2], o[3]]));
144
+ return this.k(() => (i.readPixels(t, e, 1, 1, i.RGBA, i.UNSIGNED_BYTE, o), [o[0], o[1], o[2], o[3]]));
148
145
  }
149
146
  {
150
- t = Math.max(0, Math.min(t, this.$ - 1)), e = Math.max(0, Math.min(e, this.D - 1)), s = Math.max(1, Math.min(s, this.$ - t)), i = Math.max(1, Math.min(i, this.D - e));
151
- const o = new Uint8Array(s * i * 4);
152
- return this.R(() => (r.readPixels(t, e, s, i, r.RGBA, r.UNSIGNED_BYTE, o), o));
147
+ t = Math.max(0, Math.min(t, this.F - 1)), e = Math.max(0, Math.min(e, this.D - 1)), r = Math.max(1, Math.min(r, this.F - t)), s = Math.max(1, Math.min(s, this.D - e));
148
+ const o = new Uint8Array(r * s * 4);
149
+ return this.k(() => (i.readPixels(t, e, r, s, i.RGBA, i.UNSIGNED_BYTE, o), o));
153
150
  }
154
151
  }
155
- dispose() {
156
- this.C && this._.deleteFramebuffer(this.C), this.F && this._.deleteTexture(this.F);
152
+ P() {
153
+ this.C && this.v.deleteFramebuffer(this.C), this.$ && this.v.deleteTexture(this.$);
157
154
  }
158
155
  get framebuffer() {
159
156
  return this.C;
160
157
  }
161
158
  get texture() {
162
- return this.F;
159
+ return this.$;
163
160
  }
164
161
  get width() {
165
- return this.$;
162
+ return this.F;
166
163
  }
167
164
  get height() {
168
165
  return this.D;
169
166
  }
170
- get U() {
167
+ get pixels() {
171
168
  return this.S;
172
169
  }
173
170
  }
174
- class T {
175
- constructor(t, e, s) {
176
- a(this, "_");
177
- a(this, "G");
178
- a(this, "L", /* @__PURE__ */ new Map());
179
- a(this, "H", /* @__PURE__ */ new Map());
180
- a(this, "O", 0);
181
- a(this, "j");
182
- this._ = t, this.G = this.createProgram(e, s), this.j = t.getParameter(t.MAX_TEXTURE_IMAGE_UNITS), this.W();
183
- }
184
- W() {
185
- const t = this._.getProgramParameter(this.G, this._.ACTIVE_UNIFORMS);
171
+ class y {
172
+ constructor(t, e, r) {
173
+ h(this, "v");
174
+ h(this, "U");
175
+ h(this, "A", /* @__PURE__ */ new Map());
176
+ h(this, "G", /* @__PURE__ */ new Map());
177
+ h(this, "L", 0);
178
+ h(this, "H");
179
+ this.v = t, this.U = this.O(e, r), this.H = t.getParameter(t.MAX_TEXTURE_IMAGE_UNITS), this.j();
180
+ }
181
+ j() {
182
+ const t = this.v.getProgramParameter(this.U, this.v.ACTIVE_UNIFORMS);
186
183
  for (let e = 0; e < t; e++) {
187
- const s = this._.getActiveUniform(this.G, e);
188
- if (s) {
189
- const i = this._.getUniformLocation(this.G, s.name);
190
- i && (this.L.set(s.name, i), this.H.set(s.name, s.type));
184
+ const r = this.v.getActiveUniform(this.U, e);
185
+ if (r) {
186
+ const s = this.v.getUniformLocation(this.U, r.name);
187
+ s && (this.A.set(r.name, s), this.G.set(r.name, r.type));
191
188
  }
192
189
  }
193
190
  }
194
- createProgram(t, e) {
195
- const s = this.createShader(this._.VERTEX_SHADER, t), i = this.createShader(this._.FRAGMENT_SHADER, e), r = this._.createProgram();
196
- if (this._.attachShader(r, s), this._.attachShader(r, i), this._.linkProgram(r), !this._.getProgramParameter(r, this._.LINK_STATUS)) {
197
- const o = this._.getProgramInfoLog(r);
191
+ O(t, e) {
192
+ const r = this.W(this.v.VERTEX_SHADER, t), s = this.W(this.v.FRAGMENT_SHADER, e), i = this.v.createProgram();
193
+ if (this.v.attachShader(i, r), this.v.attachShader(i, s), this.v.linkProgram(i), !this.v.getProgramParameter(i, this.v.LINK_STATUS)) {
194
+ const o = this.v.getProgramInfoLog(i);
198
195
  throw Error("Shader program link error: " + o);
199
196
  }
200
- return this._.deleteShader(s), this._.deleteShader(i), r;
197
+ return this.v.deleteShader(r), this.v.deleteShader(s), i;
201
198
  }
202
- createShader(t, e) {
203
- const s = this._.createShader(t);
204
- if (this._.shaderSource(s, e), this._.compileShader(s), !this._.getShaderParameter(s, this._.COMPILE_STATUS)) {
205
- const i = this._.getShaderInfoLog(s);
206
- throw this._.deleteShader(s), Error("Shader compilation error: " + i);
199
+ W(t, e) {
200
+ const r = this.v.createShader(t);
201
+ if (this.v.shaderSource(r, e), this.v.compileShader(r), !this.v.getShaderParameter(r, this.v.COMPILE_STATUS)) {
202
+ const s = this.v.getShaderInfoLog(r);
203
+ throw this.v.deleteShader(r), Error("Shader compilation error: " + s);
207
204
  }
208
- return s;
205
+ return r;
209
206
  }
210
207
  N() {
211
- this._.useProgram(this.G), this.X();
208
+ this.v.useProgram(this.U), this.X();
212
209
  }
213
- Y(t, e) {
214
- const s = this.L.get(t);
215
- if (s) if (typeof e == "number")
216
- this.q(t) ? this._.uniform1i(s, Math.floor(e)) : this._.uniform1f(s, e);
217
- else if (typeof e == "boolean") this._.uniform1i(s, e ? 1 : 0);
210
+ setUniform(t, e) {
211
+ const r = this.A.get(t);
212
+ if (r) if (typeof e == "number")
213
+ this.q(t) ? this.v.uniform1i(r, Math.floor(e)) : this.v.uniform1f(r, e);
214
+ else if (typeof e == "boolean") this.v.uniform1i(r, e ? 1 : 0);
218
215
  else if (Array.isArray(e)) switch (e.length) {
219
216
  case 2:
220
- this._.uniform2f(s, e[0], e[1]);
217
+ this.v.uniform2f(r, e[0], e[1]);
221
218
  break;
222
219
  case 3:
223
- this._.uniform3f(s, e[0], e[1], e[2]);
220
+ this.v.uniform3f(r, e[0], e[1], e[2]);
224
221
  break;
225
222
  case 4:
226
- this._.uniform4f(s, e[0], e[1], e[2], e[3]);
223
+ this.v.uniform4f(r, e[0], e[1], e[2], e[3]);
227
224
  break;
228
225
  default:
229
226
  console.warn(`Unsupported array length ${e.length} for uniform '${t}'`);
230
227
  }
231
228
  else if (e instanceof WebGLTexture) {
232
- const i = this.Z();
233
- this._.uniform1i(s, i), this._.activeTexture(this._.TEXTURE0 + i), this._.bindTexture(this._.TEXTURE_2D, e);
234
- } else if (e instanceof q) {
235
- const i = this.Z();
236
- this._.uniform1i(s, i), this._.activeTexture(this._.TEXTURE0 + i), this._.bindTexture(this._.TEXTURE_2D, e.texture);
229
+ const s = this.Y();
230
+ this.v.uniform1i(r, s), this.v.activeTexture(this.v.TEXTURE0 + s), this.v.bindTexture(this.v.TEXTURE_2D, e);
231
+ } else if (e instanceof H) {
232
+ const s = this.Y();
233
+ this.v.uniform1i(r, s), this.v.activeTexture(this.v.TEXTURE0 + s), this.v.bindTexture(this.v.TEXTURE_2D, e.texture);
237
234
  } else console.warn(`Unsupported uniform type for '${t}':`, typeof e);
238
235
  }
239
- Z() {
240
- return this.O >= this.j && console.warn(`Exceeded maximum texture units (${this.j}). Texture may not render correctly.`), this.O++;
236
+ Y() {
237
+ return this.L >= this.H && console.warn(`Exceeded maximum texture units (${this.H}). Texture may not render correctly.`), this.L++;
241
238
  }
242
239
  q(t) {
243
- const e = this.H.get(t);
244
- return !!e && (e === this._.INT || e === this._.INT_VEC2 || e === this._.INT_VEC3 || e === this._.INT_VEC4 || e === this._.SAMPLER_2D || e === this._.SAMPLER_CUBE);
240
+ const e = this.G.get(t);
241
+ return !!e && (e === this.v.INT || e === this.v.INT_VEC2 || e === this.v.INT_VEC3 || e === this.v.INT_VEC4 || e === this.v.SAMPLER_2D || e === this.v.SAMPLER_CUBE);
245
242
  }
246
- get J() {
247
- return this.G;
243
+ get glProgram() {
244
+ return this.U;
248
245
  }
249
- dispose() {
250
- this._.deleteProgram(this.G);
246
+ P() {
247
+ this.v.deleteProgram(this.U);
251
248
  }
252
249
  X() {
253
- this.O = 0;
250
+ this.L = 0;
254
251
  }
255
252
  }
256
- class Q {
253
+ class q {
257
254
  constructor(t) {
258
- a(this, "_");
259
- a(this, "K", null);
260
- a(this, "tt", 16);
261
- a(this, "et", /* @__PURE__ */ new Map());
262
- this._ = t;
263
- }
264
- st() {
265
- if (this.K) return;
266
- const t = this._;
267
- this.K = t.createBuffer(), t.bindBuffer(t.ARRAY_BUFFER, this.K);
268
- }
269
- rt() {
270
- const t = this._, e = t.getParameter(t.CURRENT_PROGRAM);
271
- let s = this.et.get(e);
272
- return s || (s = { it: t.getAttribLocation(e, "a_position"), ot: t.getAttribLocation(e, "a_texCoord") }, this.et.set(e, s)), t.enableVertexAttribArray(s.it), t.vertexAttribPointer(s.it, 2, t.FLOAT, !1, this.tt, 0), t.enableVertexAttribArray(s.ot), t.vertexAttribPointer(s.ot, 2, t.FLOAT, !1, this.tt, 8), { nt: s.it, ht: s.ot };
273
- }
274
- lt(t, e) {
275
- const s = this._;
276
- s.disableVertexAttribArray(t), s.disableVertexAttribArray(e);
277
- }
278
- ct(t, e) {
279
- const s = this._, i = X(s) || [0, 0, s.canvas.width, s.canvas.height];
280
- return { ut: t / i[2] * 2 - 1, ft: 1 - e / i[3] * 2 };
281
- }
282
- dt(t, e, s, i) {
283
- const r = this._;
284
- this.st(), r.bindBuffer(r.ARRAY_BUFFER, this.K);
285
- const o = new Float32Array([t, i, 0, 0, s, i, 1, 0, t, e, 0, 1, t, e, 0, 1, s, i, 1, 0, s, e, 1, 1]);
286
- r.bufferData(r.ARRAY_BUFFER, o, r.DYNAMIC_DRAW);
287
- }
288
- dispose() {
289
- this.K && this._.deleteBuffer(this.K);
255
+ h(this, "v");
256
+ h(this, "Z", null);
257
+ h(this, "J", 16);
258
+ h(this, "K", /* @__PURE__ */ new Map());
259
+ this.v = t;
260
+ }
261
+ tt() {
262
+ if (this.Z) return;
263
+ const t = this.v;
264
+ this.Z = t.createBuffer(), t.bindBuffer(t.ARRAY_BUFFER, this.Z);
265
+ }
266
+ et() {
267
+ const t = this.v, e = t.getParameter(t.CURRENT_PROGRAM);
268
+ let r = this.K.get(e);
269
+ return r || (r = { a_position: t.getAttribLocation(e, "a_position"), a_texCoord: t.getAttribLocation(e, "a_texCoord") }, this.K.set(e, r)), t.enableVertexAttribArray(r.a_position), t.vertexAttribPointer(r.a_position, 2, t.FLOAT, !1, this.J, 0), t.enableVertexAttribArray(r.a_texCoord), t.vertexAttribPointer(r.a_texCoord, 2, t.FLOAT, !1, this.J, 8), { positionLoc: r.a_position, texLoc: r.a_texCoord };
270
+ }
271
+ rt(t, e) {
272
+ const r = this.v;
273
+ r.disableVertexAttribArray(t), r.disableVertexAttribArray(e);
274
+ }
275
+ st(t, e) {
276
+ const r = this.v, s = W(r) || [0, 0, r.canvas.width, r.canvas.height];
277
+ return { nx: t / s[2] * 2 - 1, ny: 1 - e / s[3] * 2 };
278
+ }
279
+ it(t, e, r, s) {
280
+ const i = this.v;
281
+ this.tt(), i.bindBuffer(i.ARRAY_BUFFER, this.Z);
282
+ const o = new Float32Array([t, s, 0, 0, r, s, 1, 0, t, e, 0, 1, t, e, 0, 1, r, s, 1, 0, r, e, 1, 1]);
283
+ i.bufferData(i.ARRAY_BUFFER, o, i.DYNAMIC_DRAW);
284
+ }
285
+ P() {
286
+ this.Z && this.v.deleteBuffer(this.Z);
290
287
  }
291
288
  }
292
- class et extends Q {
289
+ class et extends q {
293
290
  constructor(t) {
294
291
  super(t);
295
292
  }
296
- gt(t, e, s, i) {
297
- const r = this.ct(t, e), o = this.ct(t + s, e + i);
298
- this.dt(r.ut, r.ft, o.ut, o.ft);
299
- const n = this.rt();
300
- this._.drawArrays(this._.TRIANGLES, 0, 6), this.lt(n.nt, n.ht);
293
+ ot(t, e, r, s) {
294
+ const i = this.st(t, e), o = this.st(t + r, e + s);
295
+ this.it(i.nx, i.ny, o.nx, o.ny);
296
+ const n = this.et();
297
+ this.v.drawArrays(this.v.TRIANGLES, 0, 6), this.rt(n.positionLoc, n.texLoc);
301
298
  }
302
- vt(t, e, s, i, r) {
303
- this.gt(t, e, s, r), this.gt(t + s - r, e, r, i), this.gt(t, e + i - r, s, r), this.gt(t, e, r, i);
299
+ nt(t, e, r, s, i) {
300
+ this.ot(t, e, r, i), this.ot(t + r - i, e, i, s), this.ot(t, e + s - i, r, i), this.ot(t, e, i, s);
304
301
  }
305
302
  }
306
- class st extends Q {
303
+ class rt extends q {
307
304
  constructor(t) {
308
305
  super(t);
309
306
  }
310
- draw(t, e, s, i, r) {
311
- const o = s - t, n = i - e, l = Math.hypot(o, n);
307
+ ht(t, e, r, s, i) {
308
+ const o = r - t, n = s - e, l = Math.hypot(o, n);
312
309
  if (l === 0) {
313
- const u = r / 2, d = this.ct(t - u, e - u), f = this.ct(t + u, e + u);
314
- this.dt(d.ut, d.ft, f.ut, f.ft);
310
+ const u = i / 2, d = this.st(t - u, e - u), f = this.st(t + u, e + u);
311
+ this.it(d.nx, d.ny, f.nx, f.ny);
315
312
  } else {
316
- const u = -n / l, d = o / l, f = r / 2, p = t + u * f, _ = e + d * f, m = t - u * f, x = e - d * f, y = s + u * f, b = i + d * f, R = s - u * f, E = i - d * f, S = this.ct(p, _), M = this.ct(m, x), L = this.ct(y, b), k = this.ct(R, E), D = this._;
317
- this.st(), D.bindBuffer(D.ARRAY_BUFFER, this.K);
318
- const K = new Float32Array([S.ut, S.ft, 0, 0, M.ut, M.ft, 0, 1, L.ut, L.ft, 1, 0, M.ut, M.ft, 0, 1, k.ut, k.ft, 1, 1, L.ut, L.ft, 1, 0]);
319
- D.bufferData(D.ARRAY_BUFFER, K, D.DYNAMIC_DRAW);
313
+ const u = -n / l, d = o / l, f = i / 2, m = t + u * f, v = e + d * f, p = t - u * f, x = e - d * f, _ = r + u * f, w = s + d * f, T = r - u * f, E = s - d * f, S = this.st(m, v), R = this.st(p, x), F = this.st(_, w), z = this.st(T, E), M = this.v;
314
+ this.tt(), M.bindBuffer(M.ARRAY_BUFFER, this.Z);
315
+ const Q = new Float32Array([S.nx, S.ny, 0, 0, R.nx, R.ny, 0, 1, F.nx, F.ny, 1, 0, R.nx, R.ny, 0, 1, z.nx, z.ny, 1, 1, F.nx, F.ny, 1, 0]);
316
+ M.bufferData(M.ARRAY_BUFFER, Q, M.DYNAMIC_DRAW);
320
317
  }
321
- const c = this.rt();
322
- this._.drawArrays(this._.TRIANGLES, 0, 6), this.lt(c.nt, c.ht);
318
+ const c = this.et();
319
+ this.v.drawArrays(this.v.TRIANGLES, 0, 6), this.rt(c.positionLoc, c.texLoc);
323
320
  }
324
321
  }
325
- var C = "attribute vec2 a_position;attribute vec2 a_texCoord;varying vec2 v_uv;uniform float u_rotation;uniform vec2 u_center;uniform float u_aspectRatio;mat2 rotate2D(float angle){float s=sin(angle);float c=cos(angle);return mat2(c,-s,s,c);}void main(){v_uv=a_texCoord;vec2 pos=a_position;pos-=u_center;pos.x*=u_aspectRatio;pos=rotate2D(-u_rotation)*pos;pos.x/=u_aspectRatio;pos+=u_center;gl_Position=vec4(pos,0.0,1.0);}";
326
- class it {
322
+ var Z = "attribute vec2 a_position;attribute vec2 a_texCoord;varying vec2 v_uv;uniform float u_rotation;uniform vec2 u_center;uniform float u_aspectRatio;mat2 rotate2D(float angle){float s=sin(angle);float c=cos(angle);return mat2(c,-s,s,c);}void main(){v_uv=a_texCoord;vec2 pos=a_position;pos-=u_center;pos.x*=u_aspectRatio;pos=rotate2D(-u_rotation)*pos;pos.x/=u_aspectRatio;pos+=u_center;gl_Position=vec4(pos,0.0,1.0);}";
323
+ class st {
327
324
  constructor(t) {
328
- a(this, "_");
329
- a(this, "_t");
330
- a(this, "xt");
331
- a(this, "bt", null);
332
- a(this, "wt");
333
- a(this, "Ct");
334
- a(this, "yt", [1, 1, 1, 1]);
335
- a(this, "Ft", !0);
336
- a(this, "Tt", [0, 0, 0, 1]);
337
- a(this, "$t", 1);
338
- a(this, "Dt", !0);
339
- a(this, "Mt", 0);
340
- a(this, "St", []);
341
- this._ = t, this._t = new T(this._, C, "precision lowp float;uniform sampler2D u_texture;varying vec2 v_uv;void main(){gl_FragColor=texture2D(u_texture,v_uv);}"), this.xt = new T(this._, C, "precision lowp float;uniform vec4 u_color;void main(){gl_FragColor=u_color;}"), this.wt = new et(this._), this.Ct = new st(this._), this._.enable(this._.BLEND), this._.blendEquation(this._.FUNC_ADD), this._.blendFunc(this._.ONE, this._.ONE_MINUS_SRC_ALPHA), U(this._, [0, 0, this._.canvas.width, this._.canvas.height]);
342
- }
343
- Vt(t) {
344
- this.bt !== t && (this.bt = t, t.N());
345
- }
346
- fill(t, e, s, i) {
347
- if (this.Ft = !0, e === void 0 && s === void 0 && i === void 0) {
348
- const r = t / 255;
349
- this.yt = [r, r, r, 1];
350
- } else if (s !== void 0 && i === void 0) this.yt = [t / 255, e / 255, s / 255, 1];
325
+ h(this, "v");
326
+ h(this, "lt");
327
+ h(this, "ct");
328
+ h(this, "ut", null);
329
+ h(this, "ft");
330
+ h(this, "dt");
331
+ h(this, "gt", [1, 1, 1, 1]);
332
+ h(this, "_t", !0);
333
+ h(this, "vt", [0, 0, 0, 1]);
334
+ h(this, "xt", 1);
335
+ h(this, "bt", !0);
336
+ h(this, "wt", 0);
337
+ h(this, "Ct", []);
338
+ this.v = t, this.lt = new y(this.v, Z, "precision lowp float;uniform sampler2D u_texture;varying vec2 v_uv;void main(){gl_FragColor=texture2D(u_texture,v_uv);}"), this.ct = new y(this.v, Z, "precision lowp float;uniform vec4 u_color;void main(){gl_FragColor=u_color;}"), this.ft = new et(this.v), this.dt = new rt(this.v), this.v.enable(this.v.BLEND), this.v.blendEquation(this.v.FUNC_ADD), this.v.blendFunc(this.v.ONE, this.v.ONE_MINUS_SRC_ALPHA), $(this.v, [0, 0, this.v.canvas.width, this.v.canvas.height]);
339
+ }
340
+ yt(t) {
341
+ this.ut !== t && (this.ut = t, t.N());
342
+ }
343
+ $t(t, e, r, s) {
344
+ if (this._t = !0, e === void 0 && r === void 0 && s === void 0) {
345
+ const i = t / 255;
346
+ this.gt = [i, i, i, 1];
347
+ } else if (r !== void 0 && s === void 0) this.gt = [t / 255, e / 255, r / 255, 1];
351
348
  else {
352
- if (s === void 0 || i === void 0) throw Error("Invalid fill parameters. Use fill(gray), fill(r,g,b), or fill(r,g,b,a)");
353
- this.yt = [t / 255, e / 255, s / 255, i / 255];
349
+ if (r === void 0 || s === void 0) throw Error("Invalid fill parameters. Use fill(gray), fill(r,g,b), or fill(r,g,b,a)");
350
+ this.gt = [t / 255, e / 255, r / 255, s / 255];
354
351
  }
355
352
  }
356
- stroke(t, e, s, i) {
357
- if (this.Dt = !0, e === void 0 && s === void 0 && i === void 0) {
358
- const r = t / 255;
359
- this.Tt = [r, r, r, 1];
360
- } else if (s !== void 0 && i === void 0) this.Tt = [t / 255, e / 255, s / 255, 1];
353
+ Ft(t, e, r, s) {
354
+ if (this.bt = !0, e === void 0 && r === void 0 && s === void 0) {
355
+ const i = t / 255;
356
+ this.vt = [i, i, i, 1];
357
+ } else if (r !== void 0 && s === void 0) this.vt = [t / 255, e / 255, r / 255, 1];
361
358
  else {
362
- if (s === void 0 || i === void 0) throw Error("Invalid stroke parameters. Use stroke(gray), stroke(r,g,b), or stroke(r,g,b,a)");
363
- this.Tt = [t / 255, e / 255, s / 255, i / 255];
359
+ if (r === void 0 || s === void 0) throw Error("Invalid stroke parameters. Use stroke(gray), stroke(r,g,b), or stroke(r,g,b,a)");
360
+ this.vt = [t / 255, e / 255, r / 255, s / 255];
364
361
  }
365
362
  }
366
- Rt(t) {
363
+ Tt(t) {
367
364
  if (t < 0) throw Error("Stroke weight must be non-negative");
368
- this.$t = t;
365
+ this.xt = t;
369
366
  }
370
- kt() {
371
- this.Dt = !1;
367
+ Dt() {
368
+ this.bt = !1;
372
369
  }
373
- zt() {
374
- this.Ft = !1;
370
+ Mt() {
371
+ this._t = !1;
375
372
  }
376
- rotate(t) {
377
- this.Mt = t;
373
+ St(t) {
374
+ this.wt = t;
378
375
  }
379
- push() {
380
- this.St.push({ It: [...this.yt], Ft: this.Ft, Pt: [...this.Tt], Rt: this.$t, Dt: this.Dt, rotation: this.Mt });
376
+ Rt() {
377
+ this.Ct.push({ fillColor: [...this.gt], fillMode: this._t, strokeColor: [...this.vt], strokeWeight: this.xt, strokeMode: this.bt, rotation: this.wt });
381
378
  }
382
- pop() {
383
- const t = this.St.pop();
384
- t ? (this.yt = t.It, this.Ft = t.Ft, this.Tt = t.Pt, this.$t = t.Rt, this.Dt = t.Dt, this.Mt = t.rotation) : console.warn("pop() called without matching push()");
379
+ Vt() {
380
+ const t = this.Ct.pop();
381
+ t ? (this.gt = t.fillColor, this._t = t.fillMode, this.vt = t.strokeColor, this.xt = t.strokeWeight, this.bt = t.strokeMode, this.wt = t.rotation) : console.warn("pop() called without matching push()");
385
382
  }
386
- reset() {
387
- this.bt = null, this.St = [], this.Mt = 0;
383
+ kt() {
384
+ this.ut = null, this.Ct = [], this.wt = 0;
388
385
  }
389
- createShader(t, e) {
390
- return new T(this._, t, e);
386
+ zt(t, e) {
387
+ return new y(this.v, t, e);
391
388
  }
392
- At(t) {
393
- return new T(this._, C, t);
389
+ It(t) {
390
+ return new y(this.v, Z, t);
394
391
  }
395
- Y(t, e) {
396
- this.bt.Y(t, e);
392
+ Pt(t, e) {
393
+ this.ut.setUniform(t, e);
397
394
  }
398
- rect(t, e, s, i) {
399
- if (this.bt !== null) {
400
- const { Ut: d, Gt: f, Et: p, aspectRatio: _ } = this.Lt(t, e, s, i);
401
- return this.Y("u_rotation", p), this.Y("u_center", [d, f]), this.Y("u_aspectRatio", _), this.wt.gt(t, e, s, i), void (this.bt = null);
395
+ Ut(t, e, r, s) {
396
+ if (this.ut !== null) {
397
+ const { centerX: d, centerY: f, radians: m, aspectRatio: v } = this.At(t, e, r, s);
398
+ return this.Pt("u_rotation", m), this.Pt("u_center", [d, f]), this.Pt("u_aspectRatio", v), this.ft.ot(t, e, r, s), void (this.ut = null);
402
399
  }
403
- const r = this.xt;
400
+ const i = this.ct;
404
401
  let o = 0, n = 0, l = 0, c = 1;
405
- const u = this.Lt(t, e, s, i);
406
- o = u.Ut, n = u.Gt, l = u.Et, c = u.aspectRatio, this.Ft && (this.Vt(r), this.Y("u_color", this.yt), this.Y("u_rotation", l), this.Y("u_center", [o, n]), this.Y("u_aspectRatio", c), this.wt.gt(t, e, s, i)), this.Dt && this.$t > 0 && (this.Vt(r), this.Y("u_color", this.Tt), this.Y("u_rotation", l), this.Y("u_center", [o, n]), this.Y("u_aspectRatio", c), this.wt.vt(t, e, s, i, this.$t)), this.bt = null;
407
- }
408
- line(t, e, s, i) {
409
- if (this.bt !== null) {
410
- const m = (t + s) / 2, x = (e + i) / 2, y = Math.abs(s - t) || 1, b = Math.abs(i - e) || 1, { Ut: R, Gt: E, Et: S, aspectRatio: M } = this.Lt(m - y / 2, x - b / 2, y, b);
411
- this.Y("u_rotation", S), this.Y("u_center", [R, E]), this.Y("u_aspectRatio", M);
412
- const L = this.$t > 0 ? this.$t : 1;
413
- return this.Ct.draw(t, e, s, i, L), void (this.bt = null);
402
+ const u = this.At(t, e, r, s);
403
+ o = u.centerX, n = u.centerY, l = u.radians, c = u.aspectRatio, this._t && (this.yt(i), this.Pt("u_color", this.gt), this.Pt("u_rotation", l), this.Pt("u_center", [o, n]), this.Pt("u_aspectRatio", c), this.ft.ot(t, e, r, s)), this.bt && this.xt > 0 && (this.yt(i), this.Pt("u_color", this.vt), this.Pt("u_rotation", l), this.Pt("u_center", [o, n]), this.Pt("u_aspectRatio", c), this.ft.nt(t, e, r, s, this.xt)), this.ut = null;
404
+ }
405
+ Gt(t, e, r, s) {
406
+ if (this.ut !== null) {
407
+ const p = (t + r) / 2, x = (e + s) / 2, _ = Math.abs(r - t) || 1, w = Math.abs(s - e) || 1, { centerX: T, centerY: E, radians: S, aspectRatio: R } = this.At(p - _ / 2, x - w / 2, _, w);
408
+ this.Pt("u_rotation", S), this.Pt("u_center", [T, E]), this.Pt("u_aspectRatio", R);
409
+ const F = this.xt > 0 ? this.xt : 1;
410
+ return this.dt.ht(t, e, r, s, F), void (this.ut = null);
414
411
  }
415
- if (!this.Dt || this.$t <= 0) return;
416
- const r = this.xt, o = (t + s) / 2, n = (e + i) / 2, l = Math.abs(s - t) || 1, c = Math.abs(i - e) || 1, u = this.Mt !== 0;
417
- let d = 0, f = 0, p = 0, _ = 1;
412
+ if (!this.bt || this.xt <= 0) return;
413
+ const i = this.ct, o = (t + r) / 2, n = (e + s) / 2, l = Math.abs(r - t) || 1, c = Math.abs(s - e) || 1, u = this.wt !== 0;
414
+ let d = 0, f = 0, m = 0, v = 1;
418
415
  if (u) {
419
- const m = this.Lt(o - l / 2, n - c / 2, l, c);
420
- d = m.Ut, f = m.Gt, p = m.Et, _ = m.aspectRatio;
416
+ const p = this.At(o - l / 2, n - c / 2, l, c);
417
+ d = p.centerX, f = p.centerY, m = p.radians, v = p.aspectRatio;
421
418
  }
422
- this.Vt(r), this.Y("u_color", this.Tt), u && (this.Y("u_rotation", p), this.Y("u_center", [d, f]), this.Y("u_aspectRatio", _)), this.Ct.draw(t, e, s, i, this.$t);
419
+ this.yt(i), this.Pt("u_color", this.vt), u && (this.Pt("u_rotation", m), this.Pt("u_center", [d, f]), this.Pt("u_aspectRatio", v)), this.dt.ht(t, e, r, s, this.xt);
423
420
  }
424
- Lt(t, e, s, i) {
425
- const r = X(this._) || [0, 0, this._.canvas.width, this._.canvas.height], o = r[2], n = r[3], l = o / n;
426
- return { Ut: (t + s / 2) / o * 2 - 1, Gt: 1 - (e + i / 2) / n * 2, Et: this.Mt * Math.PI / 180, aspectRatio: l };
421
+ At(t, e, r, s) {
422
+ const i = W(this.v) || [0, 0, this.v.canvas.width, this.v.canvas.height], o = i[2], n = i[3], l = o / n;
423
+ return { centerX: (t + r / 2) / o * 2 - 1, centerY: 1 - (e + s / 2) / n * 2, radians: this.wt * Math.PI / 180, aspectRatio: l };
427
424
  }
428
- createFramebuffer(t, e, s = {}) {
429
- return new q(this._, t, e, s);
425
+ Et(t, e, r = {}) {
426
+ return new H(this.v, t, e, r);
430
427
  }
431
- background(t, e = t, s = t, i = 255) {
432
- this.clear(t / 255, e / 255, s / 255, i / 255);
428
+ Lt(t, e = t, r = t, s = 255) {
429
+ this.Bt(t / 255, e / 255, r / 255, s / 255);
433
430
  }
434
- clear(t = 0, e = 0, s = 0, i = 0) {
435
- this._.clearColor(t, e, s, i), this._.clear(this._.COLOR_BUFFER_BIT);
431
+ Bt(t = 0, e = 0, r = 0, s = 0) {
432
+ this.v.clearColor(t, e, r, s), this.v.clear(this.v.COLOR_BUFFER_BIT);
436
433
  }
437
- Bt() {
438
- this._.viewport(0, 0, this._.canvas.width, this._.canvas.height), U(this._, [0, 0, this._.canvas.width, this._.canvas.height]);
434
+ Ht() {
435
+ this.v.viewport(0, 0, this.v.canvas.width, this.v.canvas.height), $(this.v, [0, 0, this.v.canvas.width, this.v.canvas.height]);
439
436
  }
440
437
  get context() {
441
- return this._;
438
+ return this.v;
442
439
  }
443
- dispose() {
444
- this._t.dispose(), this.xt.dispose(), this.wt.dispose(), this.Ct.dispose();
440
+ P() {
441
+ this.lt.P(), this.ct.P(), this.ft.P(), this.dt.P();
445
442
  }
446
- image(t, e, s, i, r) {
447
- const o = this._, n = i ?? t.width, l = r ?? t.height;
448
- this.Vt(this._t), this.Y("u_texture", t.texture);
449
- const c = this.Lt(e, s, n, l);
450
- this.Y("u_rotation", c.Et), this.Y("u_center", [c.Ut, c.Gt]), this.Y("u_aspectRatio", c.aspectRatio), this.wt.gt(e, s, n, l), o.bindTexture(o.TEXTURE_2D, null), this.bt = null;
443
+ Ot(t, e, r, s, i) {
444
+ const o = this.v, n = s ?? t.width, l = i ?? t.height;
445
+ this.yt(this.lt), this.Pt("u_texture", t.texture);
446
+ const c = this.At(e, r, n, l);
447
+ this.Pt("u_rotation", c.radians), this.Pt("u_center", [c.centerX, c.centerY]), this.Pt("u_aspectRatio", c.aspectRatio), this.ft.ot(e, r, n, l), o.bindTexture(o.TEXTURE_2D, null), this.ut = null;
451
448
  }
452
449
  }
453
450
  var A, g = {};
454
- g.parse = function(h) {
455
- var t = function(e, s, i, r) {
456
- var o = g.T, n = { cmap: o.cmap, head: o.head, hhea: o.hhea, maxp: o.maxp, hmtx: o.hmtx, loca: o.loca, glyf: o.glyf }, l = { _data: e, _index: s, _offset: i };
451
+ g.parse = function(a) {
452
+ var t = function(e, r, s, i) {
453
+ var o = g.T, n = { cmap: o.cmap, head: o.head, hhea: o.hhea, maxp: o.maxp, hmtx: o.hmtx, loca: o.loca, glyf: o.glyf }, l = { _data: e, _index: r, _offset: s };
457
454
  for (var c in n) {
458
- var u = g.findTable(e, c, i);
455
+ var u = g.findTable(e, c, s);
459
456
  if (u) {
460
- var d = u[0], f = r[d];
461
- f == null && (f = n[c].Ht(e, d, u[1], l)), l[c] = r[d] = f;
457
+ var d = u[0], f = i[d];
458
+ f == null && (f = n[c].parseTab(e, d, u[1], l)), l[c] = i[d] = f;
462
459
  }
463
460
  }
464
461
  return l;
465
- }(new Uint8Array(h), 0, 0, {});
462
+ }(new Uint8Array(a), 0, 0, {});
466
463
  return [t];
467
- }, g.findTable = function(h, t, e) {
468
- for (var s = g.B, i = s.Ot(h, e + 4), r = e + 12, o = 0; o < i; o++) {
469
- var n = s.jt(h, r, 4);
470
- s.Wt(h, r + 4);
471
- var l = s.Wt(h, r + 8), c = s.Wt(h, r + 12);
464
+ }, g.findTable = function(a, t, e) {
465
+ for (var r = g.B, s = r.readUshort(a, e + 4), i = e + 12, o = 0; o < s; o++) {
466
+ var n = r.readASCII(a, i, 4);
467
+ r.readUint(a, i + 4);
468
+ var l = r.readUint(a, i + 8), c = r.readUint(a, i + 12);
472
469
  if (n == t) return [l, c];
473
- r += 16;
470
+ i += 16;
474
471
  }
475
472
  return null;
476
- }, g.T = {}, g.B = { Nt: function(h, t) {
477
- return g.B.Xt.uint16[0] = h[t] << 8 | h[t + 1], g.B.Xt.int16[0];
478
- }, Ot: function(h, t) {
479
- return h[t] << 8 | h[t + 1];
480
- }, Yt: function(h, t, e) {
481
- for (var s = [], i = 0; i < e; i++) s.push(g.B.Ot(h, t + 2 * i));
482
- return s;
483
- }, Wt: function(h, t) {
484
- var e = g.B.Xt.uint8;
485
- return e[3] = h[t], e[2] = h[t + 1], e[1] = h[t + 2], e[0] = h[t + 3], g.B.Xt.uint32[0];
486
- }, jt: function(h, t, e) {
487
- for (var s = "", i = 0; i < e; i++) s += String.fromCharCode(h[t + i]);
488
- return s;
489
- }, Xt: (A = new ArrayBuffer(8), { uint8: new Uint8Array(A), int16: new Int16Array(A), uint16: new Uint16Array(A), uint32: new Uint32Array(A) }) }, g.T.cmap = { Ht: function(h, t, e) {
490
- var s = { qt: [], Qt: {}, off: t };
491
- h = new Uint8Array(h.buffer, t, e), t = 0;
492
- var i = g.B, r = i.Ot, o = g.T.cmap;
493
- r(h, t);
494
- var n = r(h, t += 2);
473
+ }, g.T = {}, g.B = { readShort: function(a, t) {
474
+ return g.B.t.uint16[0] = a[t] << 8 | a[t + 1], g.B.t.int16[0];
475
+ }, readUshort: function(a, t) {
476
+ return a[t] << 8 | a[t + 1];
477
+ }, readUshorts: function(a, t, e) {
478
+ for (var r = [], s = 0; s < e; s++) r.push(g.B.readUshort(a, t + 2 * s));
479
+ return r;
480
+ }, readUint: function(a, t) {
481
+ var e = g.B.t.uint8;
482
+ return e[3] = a[t], e[2] = a[t + 1], e[1] = a[t + 2], e[0] = a[t + 3], g.B.t.uint32[0];
483
+ }, readASCII: function(a, t, e) {
484
+ for (var r = "", s = 0; s < e; s++) r += String.fromCharCode(a[t + s]);
485
+ return r;
486
+ }, t: (A = new ArrayBuffer(8), { uint8: new Uint8Array(A), int16: new Int16Array(A), uint16: new Uint16Array(A), uint32: new Uint32Array(A) }) }, g.T.cmap = { parseTab: function(a, t, e) {
487
+ var r = { tables: [], ids: {}, off: t };
488
+ a = new Uint8Array(a.buffer, t, e), t = 0;
489
+ var s = g.B, i = s.readUshort, o = g.T.cmap;
490
+ i(a, t);
491
+ var n = i(a, t += 2);
495
492
  t += 2;
496
493
  for (var l = [], c = 0; c < n; c++) {
497
- var u = r(h, t), d = r(h, t += 2);
494
+ var u = i(a, t), d = i(a, t += 2);
498
495
  t += 2;
499
- var f = i.Wt(h, t);
496
+ var f = s.readUint(a, t);
500
497
  t += 4;
501
- var p = "p" + u + "e" + d, _ = l.indexOf(f);
502
- if (_ == -1) {
503
- _ = s.qt.length;
504
- var m = {};
498
+ var m = "p" + u + "e" + d, v = l.indexOf(f);
499
+ if (v == -1) {
500
+ v = r.tables.length;
501
+ var p = {};
505
502
  l.push(f);
506
- var x = m.format = r(h, f);
507
- x == 4 ? m = o.Zt(h, f, m) : x == 12 && (m = o.Jt(h, f, m)), s.qt.push(m);
503
+ var x = p.format = i(a, f);
504
+ x == 4 ? p = o.parse4(a, f, p) : x == 12 && (p = o.parse12(a, f, p)), r.tables.push(p);
508
505
  }
509
- s.Qt[p] != null && console.log("multiple tables for one platform+encoding: " + p), s.Qt[p] = _;
506
+ r.ids[m] != null && console.log("multiple tables for one platform+encoding: " + m), r.ids[m] = v;
510
507
  }
511
- return s;
512
- }, Zt: function(h, t, e) {
513
- var s = g.B, i = s.Ot, r = s.Yt, o = t, n = i(h, t += 2);
514
- i(h, t += 2);
515
- var l = i(h, t += 2);
508
+ return r;
509
+ }, parse4: function(a, t, e) {
510
+ var r = g.B, s = r.readUshort, i = r.readUshorts, o = t, n = s(a, t += 2);
511
+ s(a, t += 2);
512
+ var l = s(a, t += 2);
516
513
  t += 2;
517
514
  var c = l >>> 1;
518
- e.Kt = i(h, t), t += 2, e.te = i(h, t), t += 2, e.ee = i(h, t), t += 2, e.se = r(h, t, c), t += 2 * c, t += 2, e.re = r(h, t, c), t += 2 * c, e.ie = [];
519
- for (var u = 0; u < c; u++) e.ie.push(s.Nt(h, t)), t += 2;
520
- return e.oe = r(h, t, c), t += 2 * c, e.ne = r(h, t, o + n - t >> 1), e;
521
- }, Jt: function(h, t, e) {
522
- var s = g.B.Wt;
523
- s(h, t += 4), s(h, t += 4);
524
- var i = 3 * s(h, t += 4);
515
+ e.searchRange = s(a, t), t += 2, e.entrySelector = s(a, t), t += 2, e.rangeShift = s(a, t), t += 2, e.endCount = i(a, t, c), t += 2 * c, t += 2, e.startCount = i(a, t, c), t += 2 * c, e.idDelta = [];
516
+ for (var u = 0; u < c; u++) e.idDelta.push(r.readShort(a, t)), t += 2;
517
+ return e.idRangeOffset = i(a, t, c), t += 2 * c, e.glyphIdArray = i(a, t, o + n - t >> 1), e;
518
+ }, parse12: function(a, t, e) {
519
+ var r = g.B.readUint;
520
+ r(a, t += 4), r(a, t += 4);
521
+ var s = 3 * r(a, t += 4);
525
522
  t += 4;
526
- for (var r = e.groups = new Uint32Array(i), o = 0; o < i; o += 3) r[o] = s(h, t + (o << 2)), r[o + 1] = s(h, t + (o << 2) + 4), r[o + 2] = s(h, t + (o << 2) + 8);
523
+ for (var i = e.groups = new Uint32Array(s), o = 0; o < s; o += 3) i[o] = r(a, t + (o << 2)), i[o + 1] = r(a, t + (o << 2) + 4), i[o + 2] = r(a, t + (o << 2) + 8);
527
524
  return e;
528
- } }, g.T.head = { Ht: function(h, t, e) {
529
- var s = g.B, i = {};
530
- return t += 18, i.unitsPerEm = s.Ot(h, t), t += 2, t += 16, i.xMin = s.Nt(h, t), t += 2, i.yMin = s.Nt(h, t), t += 2, i.xMax = s.Nt(h, t), t += 2, i.yMax = s.Nt(h, t), t += 2, t += 6, i.indexToLocFormat = s.Nt(h, t), i;
531
- } }, g.T.hhea = { Ht: function(h, t, e) {
532
- var s = g.B, i = {};
525
+ } }, g.T.head = { parseTab: function(a, t, e) {
526
+ var r = g.B, s = {};
527
+ return t += 18, s.unitsPerEm = r.readUshort(a, t), t += 2, t += 16, s.xMin = r.readShort(a, t), t += 2, s.yMin = r.readShort(a, t), t += 2, s.xMax = r.readShort(a, t), t += 2, s.yMax = r.readShort(a, t), t += 2, t += 6, s.indexToLocFormat = r.readShort(a, t), s;
528
+ } }, g.T.hhea = { parseTab: function(a, t, e) {
529
+ var r = g.B, s = {};
533
530
  t += 4;
534
- for (var r = ["ascender", "descender", "lineGap", "advanceWidthMax", "minLeftSideBearing", "minRightSideBearing", "xMaxExtent", "caretSlopeRise", "caretSlopeRun", "caretOffset", "res0", "res1", "res2", "res3", "metricDataFormat", "numberOfHMetrics"], o = 0; o < r.length; o++) {
535
- var n = r[o], l = n == "advanceWidthMax" || n == "numberOfHMetrics" ? s.Ot : s.Nt;
536
- i[n] = l(h, t + 2 * o);
531
+ for (var i = ["ascender", "descender", "lineGap", "advanceWidthMax", "minLeftSideBearing", "minRightSideBearing", "xMaxExtent", "caretSlopeRise", "caretSlopeRun", "caretOffset", "res0", "res1", "res2", "res3", "metricDataFormat", "numberOfHMetrics"], o = 0; o < i.length; o++) {
532
+ var n = i[o], l = n == "advanceWidthMax" || n == "numberOfHMetrics" ? r.readUshort : r.readShort;
533
+ s[n] = l(a, t + 2 * o);
537
534
  }
535
+ return s;
536
+ } }, g.T.hmtx = { parseTab: function(a, t, e, r) {
537
+ for (var s = g.B, i = [], o = [], n = r.maxp.numGlyphs, l = r.hhea.numberOfHMetrics, c = 0, u = 0, d = 0; d < l; ) c = s.readUshort(a, t + (d << 2)), u = s.readShort(a, t + (d << 2) + 2), i.push(c), o.push(u), d++;
538
+ for (; d < n; ) i.push(c), o.push(u), d++;
539
+ return { aWidth: i, lsBearing: o };
540
+ } }, g.T.maxp = { parseTab: function(a, t, e) {
541
+ var r = g.B, s = r.readUshort, i = {};
542
+ return r.readUint(a, t), t += 4, i.numGlyphs = s(a, t), t += 2, i;
543
+ } }, g.T.loca = { parseTab: function(a, t, e, r) {
544
+ var s = g.B, i = [], o = r.head.indexToLocFormat, n = r.maxp.numGlyphs + 1;
545
+ if (o == 0) for (var l = 0; l < n; l++) i.push(s.readUshort(a, t + (l << 1)) << 1);
546
+ if (o == 1) for (l = 0; l < n; l++) i.push(s.readUint(a, t + (l << 2)));
538
547
  return i;
539
- } }, g.T.hmtx = { Ht: function(h, t, e, s) {
540
- for (var i = g.B, r = [], o = [], n = s.maxp.numGlyphs, l = s.hhea.numberOfHMetrics, c = 0, u = 0, d = 0; d < l; ) c = i.Ot(h, t + (d << 2)), u = i.Nt(h, t + (d << 2) + 2), r.push(c), o.push(u), d++;
541
- for (; d < n; ) r.push(c), o.push(u), d++;
542
- return { he: r, ae: o };
543
- } }, g.T.maxp = { Ht: function(h, t, e) {
544
- var s = g.B, i = s.Ot, r = {};
545
- return s.Wt(h, t), t += 4, r.numGlyphs = i(h, t), t += 2, r;
546
- } }, g.T.loca = { Ht: function(h, t, e, s) {
547
- var i = g.B, r = [], o = s.head.indexToLocFormat, n = s.maxp.numGlyphs + 1;
548
- if (o == 0) for (var l = 0; l < n; l++) r.push(i.Ot(h, t + (l << 1)) << 1);
549
- if (o == 1) for (l = 0; l < n; l++) r.push(i.Wt(h, t + (l << 2)));
550
- return r;
551
- } }, g.T.glyf = { Ht: function(h, t, e, s) {
552
- for (var i = [], r = s.maxp.numGlyphs, o = 0; o < r; o++) i.push(null);
553
- return i;
554
- }, le: function(h, t) {
555
- var e = g.B, s = h._data, i = h.loca;
556
- if (i[t] == i[t + 1]) return null;
557
- var r = g.findTable(s, "glyf", h._offset)[0] + i[t], o = {};
558
- if (o.ce = e.Nt(s, r), r += 2, o.xMin = e.Nt(s, r), r += 2, o.yMin = e.Nt(s, r), r += 2, o.xMax = e.Nt(s, r), r += 2, o.yMax = e.Nt(s, r), r += 2, o.xMin >= o.xMax || o.yMin >= o.yMax) return null;
559
- if (o.ce > 0) {
560
- o.ue = [];
561
- for (var n = 0; n < o.ce; n++) o.ue.push(e.Ot(s, r)), r += 2;
562
- var l = e.Ot(s, r);
563
- if (r += 2, s.length - r < l) return null;
564
- r += l;
565
- var c = o.ue[o.ce - 1] + 1;
548
+ } }, g.T.glyf = { parseTab: function(a, t, e, r) {
549
+ for (var s = [], i = r.maxp.numGlyphs, o = 0; o < i; o++) s.push(null);
550
+ return s;
551
+ }, jt: function(a, t) {
552
+ var e = g.B, r = a._data, s = a.loca;
553
+ if (s[t] == s[t + 1]) return null;
554
+ var i = g.findTable(r, "glyf", a._offset)[0] + s[t], o = {};
555
+ if (o.noc = e.readShort(r, i), i += 2, o.xMin = e.readShort(r, i), i += 2, o.yMin = e.readShort(r, i), i += 2, o.xMax = e.readShort(r, i), i += 2, o.yMax = e.readShort(r, i), i += 2, o.xMin >= o.xMax || o.yMin >= o.yMax) return null;
556
+ if (o.noc > 0) {
557
+ o.endPts = [];
558
+ for (var n = 0; n < o.noc; n++) o.endPts.push(e.readUshort(r, i)), i += 2;
559
+ var l = e.readUshort(r, i);
560
+ if (i += 2, r.length - i < l) return null;
561
+ i += l;
562
+ var c = o.endPts[o.noc - 1] + 1;
566
563
  for (o.flags = [], n = 0; n < c; n++) {
567
- var u = s[r];
568
- if (r++, o.flags.push(u), 8 & u) {
569
- var d = s[r];
570
- r++;
564
+ var u = r[i];
565
+ if (i++, o.flags.push(u), 8 & u) {
566
+ var d = r[i];
567
+ i++;
571
568
  for (var f = 0; f < d; f++) o.flags.push(u), n++;
572
569
  }
573
570
  }
574
- for (o.fe = [], n = 0; n < c; n++) {
575
- var p = !!(2 & o.flags[n]), _ = !!(16 & o.flags[n]);
576
- p ? (o.fe.push(_ ? s[r] : -s[r]), r++) : _ ? o.fe.push(0) : (o.fe.push(e.Nt(s, r)), r += 2);
571
+ for (o.xs = [], n = 0; n < c; n++) {
572
+ var m = !!(2 & o.flags[n]), v = !!(16 & o.flags[n]);
573
+ m ? (o.xs.push(v ? r[i] : -r[i]), i++) : v ? o.xs.push(0) : (o.xs.push(e.readShort(r, i)), i += 2);
577
574
  }
578
- for (o.de = [], n = 0; n < c; n++)
579
- p = !!(4 & o.flags[n]), _ = !!(32 & o.flags[n]), p ? (o.de.push(_ ? s[r] : -s[r]), r++) : _ ? o.de.push(0) : (o.de.push(e.Nt(s, r)), r += 2);
580
- var m = 0, x = 0;
581
- for (n = 0; n < c; n++) m += o.fe[n], x += o.de[n], o.fe[n] = m, o.de[n] = x;
582
- } else o.me = [];
575
+ for (o.ys = [], n = 0; n < c; n++)
576
+ m = !!(4 & o.flags[n]), v = !!(32 & o.flags[n]), m ? (o.ys.push(v ? r[i] : -r[i]), i++) : v ? o.ys.push(0) : (o.ys.push(e.readShort(r, i)), i += 2);
577
+ var p = 0, x = 0;
578
+ for (n = 0; n < c; n++) p += o.xs[n], x += o.ys[n], o.xs[n] = p, o.ys[n] = x;
579
+ } else o.parts = [];
583
580
  return o;
584
581
  } }, typeof module < "u" && module.exports ? module.exports = g : typeof window < "u" && (window.Typr = g);
585
- class rt {
586
- ge(t) {
587
- var s;
582
+ class it {
583
+ extractCharacters(t) {
584
+ var r;
588
585
  const e = [];
589
- return (s = t == null ? void 0 : t.cmap) != null && s.qt ? (t.cmap.qt.forEach((i) => {
590
- if (i.format === 4) {
591
- const r = this.pe(i);
592
- e.push(...r);
593
- } else if (i.format === 12) {
594
- const r = this.ve(i);
595
- e.push(...r);
586
+ return (r = t == null ? void 0 : t.cmap) != null && r.tables ? (t.cmap.tables.forEach((s) => {
587
+ if (s.format === 4) {
588
+ const i = this.Wt(s);
589
+ e.push(...i);
590
+ } else if (s.format === 12) {
591
+ const i = this.Nt(s);
592
+ e.push(...i);
596
593
  }
597
594
  }), [...new Set(e)]) : [];
598
595
  }
599
- pe(t) {
596
+ Wt(t) {
600
597
  const e = [];
601
- if (!(t.re && t.se && t.oe && t.ie)) return e;
602
- for (let s = 0; s < t.re.length; s++) {
603
- const i = t.re[s], r = t.se[s];
604
- if (i !== 65535 || r !== 65535) {
605
- for (let o = i; o <= r; o++)
606
- if (this._e(t, o, s) > 0) {
598
+ if (!(t.startCount && t.endCount && t.idRangeOffset && t.idDelta)) return e;
599
+ for (let r = 0; r < t.startCount.length; r++) {
600
+ const s = t.startCount[r], i = t.endCount[r];
601
+ if (s !== 65535 || i !== 65535) {
602
+ for (let o = s; o <= i; o++)
603
+ if (this.Xt(t, o, r) > 0) {
607
604
  const n = String.fromCodePoint(o);
608
605
  e.push(n);
609
606
  }
@@ -611,378 +608,377 @@ class rt {
611
608
  }
612
609
  return e;
613
610
  }
614
- ve(t) {
611
+ Nt(t) {
615
612
  const e = [];
616
613
  if (!t.groups) return e;
617
- for (let s = 0; s < t.groups.length; s += 3) {
618
- const i = t.groups[s], r = t.groups[s + 1], o = t.groups[s + 2];
619
- for (let n = i; n <= r; n++)
620
- if (o + (n - i) > 0) {
614
+ for (let r = 0; r < t.groups.length; r += 3) {
615
+ const s = t.groups[r], i = t.groups[r + 1], o = t.groups[r + 2];
616
+ for (let n = s; n <= i; n++)
617
+ if (o + (n - s) > 0) {
621
618
  const l = String.fromCodePoint(n);
622
619
  e.push(l);
623
620
  }
624
621
  }
625
622
  return e;
626
623
  }
627
- _e(t, e, s) {
628
- if (t.oe[s] === 0) return e + t.ie[s] & 65535;
624
+ Xt(t, e, r) {
625
+ if (t.idRangeOffset[r] === 0) return e + t.idDelta[r] & 65535;
629
626
  {
630
- const i = t.oe[s] / 2 + (e - t.re[s]) - (t.re.length - s);
631
- if (i >= 0 && t.ne && i < t.ne.length) {
632
- const r = t.ne[i];
633
- if (r !== 0) return r + t.ie[s] & 65535;
627
+ const s = t.idRangeOffset[r] / 2 + (e - t.startCount[r]) - (t.startCount.length - r);
628
+ if (s >= 0 && t.glyphIdArray && s < t.glyphIdArray.length) {
629
+ const i = t.glyphIdArray[s];
630
+ if (i !== 0) return i + t.idDelta[r] & 65535;
634
631
  }
635
632
  }
636
633
  return 0;
637
634
  }
638
- xe(t) {
639
- return t.filter((e) => this.be(e));
635
+ filterProblematicCharacters(t) {
636
+ return t.filter((e) => this.qt(e));
640
637
  }
641
- be(t) {
638
+ qt(t) {
642
639
  const e = t.codePointAt(0) || 0;
643
640
  return !(e >= 0 && e <= 31 && e !== 9 && e !== 10 && e !== 13 || e >= 127 && e <= 159);
644
641
  }
645
642
  }
646
643
  class ot {
647
644
  constructor(t) {
648
- a(this, "we");
649
- a(this, "Ce");
650
- a(this, "ye");
651
- this.ye = t, this.we = document.createElement("canvas"), this.Ce = this.we.getContext("2d", { Fe: !0, alpha: !1 });
652
- }
653
- Te(t, e, s, i) {
654
- const r = t.length, o = Math.ceil(Math.sqrt(r)), n = Math.ceil(r / o), l = e.width * o, c = e.height * n;
655
- this.$e(l, c, s, i), this.De(t, e, o, s), this.Me();
656
- const u = this.ye.createFramebuffer(l, c, { filter: "nearest" });
657
- return u.update(this.we), { framebuffer: u, columns: o, rows: n };
658
- }
659
- $e(t, e, s, i) {
660
- this.we.width = t, this.we.height = e, this.we.style.width = t + "px", this.we.style.height = t + "px", this.Ce.imageSmoothingEnabled = !1, this.we.style.imageRendering = "pixelated", this.Ce.fillStyle = "black", this.Ce.fillRect(0, 0, t, e), this.Ce.font = `${s}px ${i}`, this.Ce.textBaseline = "top", this.Ce.textAlign = "left", this.Ce.fillStyle = "white";
661
- }
662
- De(t, e, s, i) {
663
- for (let r = 0; r < t.length; r++) {
664
- const o = r % s, n = Math.floor(r / s), l = o * e.width + 0.5 * e.width, c = n * e.height + 0.5 * e.height, u = Math.round(l - 0.5 * e.width), d = Math.round(c - 0.5 * i);
665
- this.Ce.fillText(t[r].Se, u, d);
645
+ h(this, "Yt");
646
+ h(this, "Qt");
647
+ h(this, "Zt");
648
+ this.Zt = t, this.Yt = document.createElement("canvas"), this.Qt = this.Yt.getContext("2d", { willReadFrequently: !0, alpha: !1 });
649
+ }
650
+ createTextureAtlas(t, e, r, s) {
651
+ const i = t.length, o = Math.ceil(Math.sqrt(i)), n = Math.ceil(i / o), l = e.width * o, c = e.height * n;
652
+ this.Jt(l, c, r, s), this.Kt(t, e, o, r), this.te();
653
+ const u = this.Zt.Et(l, c, { filter: "nearest" });
654
+ return u.update(this.Yt), { framebuffer: u, columns: o, rows: n };
655
+ }
656
+ Jt(t, e, r, s) {
657
+ this.Yt.width = t, this.Yt.height = e, this.Yt.style.width = t + "px", this.Yt.style.height = t + "px", this.Qt.imageSmoothingEnabled = !1, this.Yt.style.imageRendering = "pixelated", this.Qt.fillStyle = "black", this.Qt.fillRect(0, 0, t, e), this.Qt.font = `${r}px ${s}`, this.Qt.textBaseline = "top", this.Qt.textAlign = "left", this.Qt.fillStyle = "white";
658
+ }
659
+ Kt(t, e, r, s) {
660
+ for (let i = 0; i < t.length; i++) {
661
+ const o = i % r, n = Math.floor(i / r), l = o * e.width + 0.5 * e.width, c = n * e.height + 0.5 * e.height, u = Math.round(l - 0.5 * e.width), d = Math.round(c - 0.5 * s);
662
+ this.Qt.fillText(t[i].character, u, d);
666
663
  }
667
664
  }
668
- Me(t = 128) {
669
- const e = this.Ce.getImageData(0, 0, this.we.width, this.we.height), s = e.data;
670
- for (let i = 0; i < s.length; i += 4) {
671
- const r = 0.299 * s[i] + 0.587 * s[i + 1] + 0.114 * s[i + 2] > t + 32 ? 255 : 0;
672
- s[i] = r, s[i + 1] = r, s[i + 2] = r;
665
+ te(t = 128) {
666
+ const e = this.Qt.getImageData(0, 0, this.Yt.width, this.Yt.height), r = e.data;
667
+ for (let s = 0; s < r.length; s += 4) {
668
+ const i = 0.299 * r[s] + 0.587 * r[s + 1] + 0.114 * r[s + 2] > t + 32 ? 255 : 0;
669
+ r[s] = i, r[s + 1] = i, r[s + 2] = i;
673
670
  }
674
- this.Ce.putImageData(e, 0, 0);
671
+ this.Qt.putImageData(e, 0, 0);
675
672
  }
676
673
  }
677
674
  class nt {
678
675
  constructor() {
679
- a(this, "Ve");
680
- a(this, "Re");
681
- this.Ve = document.createElement("canvas"), this.Re = this.Ve.getContext("2d");
676
+ h(this, "ee");
677
+ h(this, "re");
678
+ this.ee = document.createElement("canvas"), this.re = this.ee.getContext("2d");
682
679
  }
683
- ke(t, e, s) {
684
- this.Re.font = `${e}px ${s}`;
685
- let i = 0, r = 0;
680
+ calculateMaxGlyphDimensions(t, e, r) {
681
+ this.re.font = `${e}px ${r}`;
682
+ let s = 0, i = 0;
686
683
  for (const o of t) {
687
- const n = this.Re.measureText(o);
688
- i = Math.max(i, n.width), r = Math.max(r, n.actualBoundingBoxAscent + n.actualBoundingBoxDescent);
684
+ const n = this.re.measureText(o);
685
+ s = Math.max(s, n.width), i = Math.max(i, n.actualBoundingBoxAscent + n.actualBoundingBoxDescent);
689
686
  }
690
- return { width: i, height: r };
687
+ return { width: s, height: i };
691
688
  }
692
689
  }
693
- class ht {
694
- ze(t, e) {
695
- return t.map((s, i) => {
696
- const r = s.codePointAt(0) || 0, o = this.Ie(i);
690
+ class at {
691
+ createCharacterObjects(t, e) {
692
+ return t.map((r, s) => {
693
+ const i = r.codePointAt(0) || 0, o = this.se(s);
697
694
  let n = 0;
698
- if (e.hmtx && e.hmtx.he) {
699
- const l = this.Pe(e, r);
700
- l > 0 && e.hmtx.he[l] !== void 0 && (n = e.hmtx.he[l]);
695
+ if (e.hmtx && e.hmtx.aWidth) {
696
+ const l = this.ie(e, i);
697
+ l > 0 && e.hmtx.aWidth[l] !== void 0 && (n = e.hmtx.aWidth[l]);
701
698
  }
702
- return { Se: s, unicode: r, color: o, Ae: n };
699
+ return { character: r, unicode: i, color: o, advanceWidth: n };
703
700
  });
704
701
  }
705
- Pe(t, e) {
706
- const s = t.cmap;
707
- if (!s || !s.qt) return 0;
708
- for (const i of s.qt) if (i.format === 4) {
709
- for (let r = 0; r < i.re.length; r++) if (e >= i.re[r] && e <= i.se[r]) {
710
- if (i.oe[r] === 0) return e + i.ie[r] & 65535;
702
+ ie(t, e) {
703
+ const r = t.cmap;
704
+ if (!r || !r.tables) return 0;
705
+ for (const s of r.tables) if (s.format === 4) {
706
+ for (let i = 0; i < s.startCount.length; i++) if (e >= s.startCount[i] && e <= s.endCount[i]) {
707
+ if (s.idRangeOffset[i] === 0) return e + s.idDelta[i] & 65535;
711
708
  {
712
- const o = i.oe[r] / 2 + (e - i.re[r]) - (i.re.length - r);
713
- if (o >= 0 && o < i.ne.length) {
714
- const n = i.ne[o];
715
- if (n !== 0) return n + i.ie[r] & 65535;
709
+ const o = s.idRangeOffset[i] / 2 + (e - s.startCount[i]) - (s.startCount.length - i);
710
+ if (o >= 0 && o < s.glyphIdArray.length) {
711
+ const n = s.glyphIdArray[o];
712
+ if (n !== 0) return n + s.idDelta[i] & 65535;
716
713
  }
717
714
  }
718
715
  }
719
716
  }
720
717
  return 0;
721
718
  }
722
- Ie(t) {
719
+ se(t) {
723
720
  return [t % 256, Math.floor(t / 256) % 256, Math.floor(t / 65536) % 256];
724
721
  }
725
- Ue(t, e) {
726
- if (!w.validate(typeof t == "string", "Character must be a string.", { method: "getCharacterColor", Ge: t })) return [0, 0, 0];
727
- const s = e.find((i) => i.Se === t);
728
- return s ? s.color : [0, 0, 0];
722
+ getCharacterColor(t, e) {
723
+ if (!C.p(typeof t == "string", "Character must be a string.", { method: "getCharacterColor", providedValue: t })) return [0, 0, 0];
724
+ const r = e.find((s) => s.character === t);
725
+ return r ? r.color : [0, 0, 0];
729
726
  }
730
- Ee(t, e) {
731
- return w.validate(typeof t == "string" && t.length > 0, "Characters must be a string with at least one character.", { method: "getCharacterColors", Ge: t }) ? t.split("").map((s) => this.Ue(s, e) || [0, 0, 0]) : [[0, 0, 0]];
727
+ getCharacterColors(t, e) {
728
+ return C.p(typeof t == "string" && t.length > 0, "Characters must be a string with at least one character.", { method: "getCharacterColors", providedValue: t }) ? t.split("").map((r) => this.getCharacterColor(r, e) || [0, 0, 0]) : [[0, 0, 0]];
732
729
  }
733
730
  }
734
- class at {
731
+ class ht {
735
732
  constructor(t, e = 16) {
736
- a(this, "Le");
737
- a(this, "Be", []);
738
- a(this, "He");
739
- a(this, "Oe", 16);
740
- a(this, "je", 0);
741
- a(this, "We", 0);
742
- a(this, "Ne", { width: 0, height: 0 });
743
- a(this, "Xe");
744
- a(this, "Ye", "UrsaFont");
745
- a(this, "qe");
746
- a(this, "Qe");
747
- a(this, "Ze");
748
- a(this, "Je");
749
- this.Oe = e, this.qe = new rt(), this.Qe = new ot(t), this.Ze = new nt(), this.Je = new ht();
750
- }
751
- async initialize(t) {
733
+ h(this, "oe");
734
+ h(this, "ne", []);
735
+ h(this, "ae");
736
+ h(this, "he", 16);
737
+ h(this, "le", 0);
738
+ h(this, "ce", 0);
739
+ h(this, "ue", { width: 0, height: 0 });
740
+ h(this, "fe");
741
+ h(this, "de", "UrsaFont");
742
+ h(this, "me");
743
+ h(this, "ge");
744
+ h(this, "pe");
745
+ h(this, "_e");
746
+ this.he = e, this.me = new it(), this.ge = new ot(t), this.pe = new nt(), this._e = new at();
747
+ }
748
+ async ve(t) {
752
749
  let e;
753
- if (!t) throw new v("Embedded font not available. This appears to be a minified build - please provide `fontSource`.");
750
+ if (!t) throw new b("Embedded font not available. This appears to be a minified build - please provide `fontSource`.");
754
751
  {
755
- const s = await fetch(t);
756
- if (!s.ok) throw new v(`Failed to load font file: ${s.status} ${s.statusText}`);
757
- e = await s.arrayBuffer();
752
+ const r = await fetch(t);
753
+ if (!r.ok) throw new b(`Failed to load font file: ${r.status} ${r.statusText}`);
754
+ e = await r.arrayBuffer();
758
755
  }
759
- await this.Ke(e), this.Le = g.parse(e)[0], await this.ts();
756
+ await this.xe(e), this.oe = g.parse(e)[0], await this.be();
760
757
  }
761
- es(t) {
762
- if (t === void 0) return this.Oe;
763
- this.Oe = t, this.Ne = this.Ze.ke(this.Be.map((s) => s.Se), this.Oe, this.Ye);
764
- const e = this.Qe.Te(this.Be, this.Ne, this.Oe, this.Ye);
765
- this.He = e.framebuffer, this.je = e.columns, this.We = e.rows;
758
+ we(t) {
759
+ if (t === void 0) return this.he;
760
+ this.he = t, this.ue = this.pe.calculateMaxGlyphDimensions(this.ne.map((r) => r.character), this.he, this.de);
761
+ const e = this.ge.createTextureAtlas(this.ne, this.ue, this.he, this.de);
762
+ this.ae = e.framebuffer, this.le = e.columns, this.ce = e.rows;
766
763
  }
767
- async ss(t) {
764
+ async Ce(t) {
768
765
  try {
769
766
  const e = await fetch(t);
770
- if (!e.ok) throw new v(`Failed to load font file: ${e.status} ${e.statusText}`);
771
- const s = await e.arrayBuffer();
772
- await this.Ke(s);
773
- const i = g.parse(s);
774
- if (!i || i.length === 0) throw Error("Failed to parse font file");
775
- this.Le = i[0], await this.ts();
767
+ if (!e.ok) throw new b(`Failed to load font file: ${e.status} ${e.statusText}`);
768
+ const r = await e.arrayBuffer();
769
+ await this.xe(r);
770
+ const s = g.parse(r);
771
+ if (!s || s.length === 0) throw Error("Failed to parse font file");
772
+ this.oe = s[0], await this.be();
776
773
  } catch (e) {
777
- throw new v("Failed to load font: " + (e instanceof Error ? e.message : "Unknown error"), e);
774
+ throw new b("Failed to load font: " + (e instanceof Error ? e.message : "Unknown error"), e);
778
775
  }
779
776
  }
780
- async Ke(t) {
777
+ async xe(t) {
781
778
  const e = Date.now();
782
- this.Ye = this.Ye === "UrsaFont" ? "UrsaFont" : "CustomFont_" + e, this.Xe = new FontFace(this.Ye, t), await this.Xe.load(), document.fonts.add(this.Xe);
779
+ this.de = this.de === "UrsaFont" ? "UrsaFont" : "CustomFont_" + e, this.fe = new FontFace(this.de, t), await this.fe.load(), document.fonts.add(this.fe);
783
780
  }
784
- async ts() {
785
- const t = this.qe.ge(this.Le), e = this.qe.xe(t);
786
- this.Be = this.Je.ze(e, this.Le), this.Ne = this.Ze.ke(e, this.Oe, this.Ye);
787
- const s = this.Qe.Te(this.Be, this.Ne, this.Oe, this.Ye);
788
- this.He = s.framebuffer, this.je = s.columns, this.We = s.rows;
781
+ async be() {
782
+ const t = this.me.extractCharacters(this.oe), e = this.me.filterProblematicCharacters(t);
783
+ this.ne = this._e.createCharacterObjects(e, this.oe), this.ue = this.pe.calculateMaxGlyphDimensions(e, this.he, this.de);
784
+ const r = this.ge.createTextureAtlas(this.ne, this.ue, this.he, this.de);
785
+ this.ae = r.framebuffer, this.le = r.columns, this.ce = r.rows;
789
786
  }
790
- Ue(t) {
791
- return this.Je.Ue(t, this.Be);
787
+ getCharacterColor(t) {
788
+ return this._e.getCharacterColor(t, this.ne);
792
789
  }
793
- Ee(t) {
794
- return this.Je.Ee(t, this.Be);
790
+ getCharacterColors(t) {
791
+ return this._e.getCharacterColors(t, this.ne);
795
792
  }
796
- rs(t) {
793
+ hasAllCharacters(t) {
797
794
  if (typeof t != "string" || t.length === 0) return !1;
798
- const e = new Set(this.Be.map((s) => s.Se));
799
- for (const s of t) if (!e.has(s)) return !1;
795
+ const e = new Set(this.ne.map((r) => r.character));
796
+ for (const r of t) if (!e.has(r)) return !1;
800
797
  return !0;
801
798
  }
802
- get ns() {
803
- return this.He;
799
+ P() {
800
+ this.ae.P(), document.fonts.delete(this.fe);
804
801
  }
805
- get hs() {
806
- return this.Be;
802
+ get fontFramebuffer() {
803
+ return this.ae;
807
804
  }
808
- get ls() {
809
- return this.je;
805
+ get characters() {
806
+ return this.ne;
810
807
  }
811
- get cs() {
812
- return this.We;
808
+ get textureColumns() {
809
+ return this.le;
813
810
  }
814
- get us() {
815
- return this.Ne;
811
+ get textureRows() {
812
+ return this.ce;
816
813
  }
817
- dispose() {
818
- this.He.dispose(), document.fonts.delete(this.Xe);
814
+ get maxGlyphDimensions() {
815
+ return this.ue;
819
816
  }
820
817
  get fontSize() {
821
- return this.Oe;
818
+ return this.he;
822
819
  }
823
820
  get font() {
824
- return this.Le;
821
+ return this.oe;
825
822
  }
826
823
  }
827
824
  class lt {
828
- constructor(t, e, s) {
829
- a(this, "fs");
830
- a(this, "ds");
831
- a(this, "$");
832
- a(this, "D");
833
- a(this, "gs");
834
- a(this, "ps");
835
- a(this, "vs", !1);
836
- a(this, "_s");
837
- a(this, "xs");
838
- a(this, "bs");
839
- this._s = t, this.xs = e, this.bs = s, this.reset();
825
+ constructor(t, e, r) {
826
+ h(this, "ye");
827
+ h(this, "$e");
828
+ h(this, "F");
829
+ h(this, "D");
830
+ h(this, "Fe");
831
+ h(this, "Te");
832
+ h(this, "De", !1);
833
+ h(this, "Me");
834
+ h(this, "Se");
835
+ h(this, "Re");
836
+ this.Me = t, this.Se = e, this.Re = r, this.kt();
840
837
  }
841
- reset() {
842
- this.vs || (this.fs = Math.floor(this._s.width / this.xs), this.ds = Math.floor(this._s.height / this.bs)), this.ws();
838
+ kt() {
839
+ this.De || (this.ye = Math.floor(this.Me.width / this.Se), this.$e = Math.floor(this.Me.height / this.Re)), this.Ve();
843
840
  }
844
- ws() {
845
- this.$ = this.fs * this.xs, this.D = this.ds * this.bs, this.gs = Math.floor((this._s.width - this.$) / 2), this.ps = Math.floor((this._s.height - this.D) / 2);
841
+ Ve() {
842
+ this.F = this.ye * this.Se, this.D = this.$e * this.Re, this.Fe = Math.floor((this.Me.width - this.F) / 2), this.Te = Math.floor((this.Me.height - this.D) / 2);
846
843
  }
847
- Cs(t, e) {
848
- this.xs = t, this.bs = e, this.reset();
844
+ ke(t, e) {
845
+ this.Se = t, this.Re = e, this.kt();
849
846
  }
850
- ys(t, e) {
851
- this.vs = !0, this.fs = t, this.ds = e, this.ws();
847
+ ze(t, e) {
848
+ this.De = !0, this.ye = t, this.$e = e, this.Ve();
852
849
  }
853
- Fs() {
854
- this.vs = !1, this.reset();
850
+ Ie() {
851
+ this.De = !1, this.kt();
855
852
  }
856
- resize() {
857
- this.vs ? this.ws() : this.reset();
853
+ Pe() {
854
+ this.De ? this.Ve() : this.kt();
858
855
  }
859
- Ts(t) {
860
- if (t === void 0) return this.vs;
861
- this.vs = t;
856
+ Ue(t) {
857
+ if (t === void 0) return this.De;
858
+ this.De = t;
862
859
  }
863
- get $s() {
864
- return this.xs;
860
+ get cellWidth() {
861
+ return this.Se;
865
862
  }
866
- get Ds() {
867
- return this.bs;
863
+ get cellHeight() {
864
+ return this.Re;
868
865
  }
869
866
  get cols() {
870
- return this.fs;
867
+ return this.ye;
871
868
  }
872
869
  get rows() {
873
- return this.ds;
870
+ return this.$e;
874
871
  }
875
872
  get width() {
876
- return this.$;
873
+ return this.F;
877
874
  }
878
875
  get height() {
879
876
  return this.D;
880
877
  }
881
878
  get offsetX() {
882
- return this.gs;
879
+ return this.Fe;
883
880
  }
884
881
  get offsetY() {
885
- return this.ps;
882
+ return this.Te;
886
883
  }
887
884
  }
888
885
  class ct {
889
- constructor(t, e = !1, s = {}) {
890
- a(this, "_s");
891
- a(this, "Ms");
892
- a(this, "Ss");
893
- a(this, "Vs");
894
- a(this, "Rs");
895
- this.Ms = t, this.Ss = e, this._s = this.ks(s.width, s.height), e && this.zs();
896
- }
897
- ks(t, e) {
898
- var i;
899
- const s = document.createElement("canvas");
900
- if (s.className = "textmodeCanvas", s.style.imageRendering = "pixelated", this.Ss) s.width = t || 800, s.height = e || 600, document.body.appendChild(s);
886
+ constructor(t, e = !1, r = {}) {
887
+ h(this, "Me");
888
+ h(this, "Ae");
889
+ h(this, "Ge");
890
+ h(this, "Ee");
891
+ h(this, "onTransformChange");
892
+ this.Ae = t, this.Ge = e, this.Me = this.Le(r.width, r.height), e && this.setupTransformObserver();
893
+ }
894
+ Le(t, e) {
895
+ var s;
896
+ const r = document.createElement("canvas");
897
+ if (r.className = "textmodeCanvas", r.style.imageRendering = "pixelated", this.Ge) r.width = t || 800, r.height = e || 600, document.body.appendChild(r);
901
898
  else {
902
- const r = this.Ms.getBoundingClientRect();
903
- let o = Math.round(r.width), n = Math.round(r.height);
904
- if (this.Ms instanceof HTMLVideoElement) {
905
- const u = this.Ms;
899
+ const i = this.Ae.getBoundingClientRect();
900
+ let o = Math.round(i.width), n = Math.round(i.height);
901
+ if (this.Ae instanceof HTMLVideoElement) {
902
+ const u = this.Ae;
906
903
  (o === 0 || n === 0) && u.videoWidth > 0 && u.videoHeight > 0 && (o = u.videoWidth, n = u.videoHeight);
907
904
  }
908
- s.width = o, s.height = n, s.style.position = "absolute", s.style.pointerEvents = "none";
909
- const l = window.getComputedStyle(this.Ms);
905
+ r.width = o, r.height = n, r.style.position = "absolute", r.style.pointerEvents = "none";
906
+ const l = window.getComputedStyle(this.Ae);
910
907
  let c = parseInt(l.zIndex || "0", 10);
911
- isNaN(c) && (c = 0), s.style.zIndex = "" + (c + 1), this.Is(s), (i = this.Ms.parentNode) == null || i.insertBefore(s, this.Ms.nextSibling);
908
+ isNaN(c) && (c = 0), r.style.zIndex = "" + (c + 1), this.Be(r), (s = this.Ae.parentNode) == null || s.insertBefore(r, this.Ae.nextSibling);
912
909
  }
913
- return s;
914
- }
915
- Is(t) {
916
- const e = this.Ms.getBoundingClientRect();
917
- let s = this.Ms.offsetParent;
918
- if (s && s !== document.body) {
919
- const i = s.getBoundingClientRect();
920
- t.style.top = e.top - i.top + "px", t.style.left = e.left - i.left + "px";
910
+ return r;
911
+ }
912
+ Be(t) {
913
+ const e = this.Ae.getBoundingClientRect();
914
+ let r = this.Ae.offsetParent;
915
+ if (r && r !== document.body) {
916
+ const s = r.getBoundingClientRect();
917
+ t.style.top = e.top - s.top + "px", t.style.left = e.left - s.left + "px";
921
918
  } else t.style.top = e.top + window.scrollY + "px", t.style.left = e.left + window.scrollX + "px";
922
919
  }
923
- resize(t, e) {
924
- if (this.Ss) this._s.width = t ?? this._s.width, this._s.height = e ?? this._s.height;
920
+ Pe(t, e) {
921
+ if (this.Ge) this.Me.width = t ?? this.Me.width, this.Me.height = e ?? this.Me.height;
925
922
  else {
926
- const s = this.Ms.getBoundingClientRect();
927
- let i = Math.round(s.width), r = Math.round(s.height);
928
- if (this.Ms instanceof HTMLVideoElement) {
929
- const o = this.Ms;
930
- (i === 0 || r === 0) && o.videoWidth > 0 && o.videoHeight > 0 && (i = o.videoWidth, r = o.videoHeight);
923
+ const r = this.Ae.getBoundingClientRect();
924
+ let s = Math.round(r.width), i = Math.round(r.height);
925
+ if (this.Ae instanceof HTMLVideoElement) {
926
+ const o = this.Ae;
927
+ (s === 0 || i === 0) && o.videoWidth > 0 && o.videoHeight > 0 && (s = o.videoWidth, i = o.videoHeight);
931
928
  }
932
- this._s.width = i, this._s.height = r, this.Is(this._s);
929
+ this.Me.width = s, this.Me.height = i, this.Be(this.Me);
933
930
  }
934
931
  }
935
- Ps() {
936
- const t = { alpha: !1, premultipliedAlpha: !1, As: !0, antialias: !1, Us: !1, Gs: !1, powerPreference: "high-performance" }, e = this._s.getContext("webgl2", t) || this._s.getContext("webgl", t);
937
- if (!e) throw new v("WebGL context could not be created. Ensure your browser supports WebGL.");
932
+ He() {
933
+ const t = { alpha: !1, premultipliedAlpha: !1, preserveDrawingBuffer: !0, antialias: !1, depth: !1, stencil: !1, powerPreference: "high-performance" }, e = this.Me.getContext("webgl2", t) || this.Me.getContext("webgl", t);
934
+ if (!e) throw new b("WebGL context could not be created. Ensure your browser supports WebGL.");
938
935
  return e;
939
936
  }
940
- zs() {
941
- this.Vs = new ResizeObserver((t) => {
937
+ setupTransformObserver() {
938
+ this.Ee = new ResizeObserver((t) => {
942
939
  for (const e of t) {
943
- const s = e.contentRect;
944
- !this.Rs || Math.round(s.width) === this._s.width && Math.round(s.height) === this._s.height || this.Rs();
945
- }
946
- }), this.Vs.observe(this._s);
947
- }
948
- dispose() {
949
- if (this.Vs && this.Vs.disconnect(), this._s) {
950
- const t = this._s.getContext("webgl") || this._s.getContext("webgl2");
951
- if (t) {
952
- const e = t.getExtension("WEBGL_lose_context");
953
- e && e.Es();
940
+ const r = e.contentRect;
941
+ !this.onTransformChange || Math.round(r.width) === this.Me.width && Math.round(r.height) === this.Me.height || this.onTransformChange();
954
942
  }
955
- this._s.parentNode && this._s.parentNode.removeChild(this._s);
943
+ }), this.Ee.observe(this.Me);
944
+ }
945
+ P() {
946
+ this.Ee && this.Ee.disconnect();
947
+ const t = this.Me.getContext("webgl") || this.Me.getContext("webgl2");
948
+ if (t) {
949
+ const e = t.getExtension("WEBGL_lose_context");
950
+ e && e.loseContext();
956
951
  }
952
+ this.Me.parentNode && this.Me.parentNode.removeChild(this.Me);
957
953
  }
958
954
  get canvas() {
959
- return this._s;
955
+ return this.Me;
960
956
  }
961
957
  get width() {
962
- return this._s.width;
958
+ return this.Me.width;
963
959
  }
964
960
  get height() {
965
- return this._s.height;
961
+ return this.Me.height;
966
962
  }
967
963
  }
968
- class $ {
969
- constructor(t, e, s, i = {}) {
970
- a(this, "Ls");
971
- a(this, "Bs");
972
- a(this, "grid");
973
- a(this, "Hs");
974
- a(this, "Os");
975
- a(this, "js");
976
- a(this, "Ws");
977
- a(this, "Ns");
978
- a(this, "l");
979
- this.Ls = t, this.Bs = e, this.grid = s, this.l = i;
980
- const r = this.grid.cols, o = this.grid.rows;
981
- this.Hs = this.Ls.createFramebuffer(r, o), this.Os = this.Ls.createFramebuffer(r, o), this.js = this.Ls.createFramebuffer(r, o), this.Ws = this.Ls.createFramebuffer(r, o), this.Ns = this.Ls.createFramebuffer(r, o);
982
- }
983
- resize() {
984
- const t = this.grid.cols, e = this.grid.rows;
985
- this.Hs.resize(t, e), this.Os.resize(t, e), this.js.resize(t, e), this.Ws.resize(t, e), this.Ns.resize(t, e);
964
+ class U {
965
+ constructor(t, e, r, s = {}) {
966
+ h(this, "Zt");
967
+ h(this, "Oe");
968
+ h(this, "je");
969
+ h(this, "We");
970
+ h(this, "Ne");
971
+ h(this, "Xe");
972
+ h(this, "qe");
973
+ h(this, "Ye");
974
+ h(this, "l");
975
+ this.Zt = t, this.Oe = e, this.je = r, this.l = s;
976
+ const i = this.je.cols, o = this.je.rows;
977
+ this.We = this.Zt.Et(i, o), this.Ne = this.Zt.Et(i, o), this.Xe = this.Zt.Et(i, o), this.qe = this.Zt.Et(i, o), this.Ye = this.Zt.Et(i, o);
978
+ }
979
+ Pe() {
980
+ const t = this.je.cols, e = this.je.rows;
981
+ this.We.resize(t, e), this.Ne.resize(t, e), this.Xe.resize(t, e), this.qe.resize(t, e), this.Ye.resize(t, e);
986
982
  }
987
983
  enabled(t) {
988
984
  this.l.enabled = t;
@@ -993,23 +989,23 @@ class $ {
993
989
  disable() {
994
990
  this.enabled(!1);
995
991
  }
996
- dispose() {
997
- this.Hs.dispose(), this.Os.dispose(), this.js.dispose(), this.Ws.dispose(), this.Ns.dispose();
992
+ P() {
993
+ this.We.P(), this.Ne.P(), this.Xe.P(), this.qe.P(), this.Ye.P();
998
994
  }
999
- get Xs() {
1000
- return this.Hs;
995
+ get characterFramebuffer() {
996
+ return this.We;
1001
997
  }
1002
- get Ys() {
1003
- return this.Os;
998
+ get primaryColorFramebuffer() {
999
+ return this.Ne;
1004
1000
  }
1005
- get qs() {
1006
- return this.js;
1001
+ get secondaryColorFramebuffer() {
1002
+ return this.Xe;
1007
1003
  }
1008
- get Qs() {
1009
- return this.Ws;
1004
+ get rotationFramebuffer() {
1005
+ return this.qe;
1010
1006
  }
1011
- get Zs() {
1012
- return this.Ns;
1007
+ get transformFramebuffer() {
1008
+ return this.Ye;
1013
1009
  }
1014
1010
  get options() {
1015
1011
  return this.l;
@@ -1017,28 +1013,28 @@ class $ {
1017
1013
  }
1018
1014
  class ut {
1019
1015
  constructor(t, e) {
1020
- a(this, "C");
1021
- a(this, "ye");
1022
- a(this, "Js");
1023
- this.ye = t, this.Js = e;
1024
- const s = Math.max(this.Js.length, 1);
1025
- this.C = this.ye.createFramebuffer(s, 1), this.Ks();
1026
- }
1027
- Ks() {
1028
- const t = this.Js.length;
1016
+ h(this, "C");
1017
+ h(this, "Zt");
1018
+ h(this, "Qe");
1019
+ this.Zt = t, this.Qe = e;
1020
+ const r = Math.max(this.Qe.length, 1);
1021
+ this.C = this.Zt.Et(r, 1), this.Ze();
1022
+ }
1023
+ Ze() {
1024
+ const t = this.Qe.length;
1029
1025
  this.C.width !== t && this.C.resize(t, 1);
1030
1026
  const e = new Uint8Array(1 * t * 4);
1031
- for (let s = 0; s < t; s++) {
1032
- const i = this.Js[s], r = 4 * s;
1033
- e[r] = i[0], e[r + 1] = i[1], e[r + 2] = i[2], e[r + 3] = 255;
1027
+ for (let r = 0; r < t; r++) {
1028
+ const s = this.Qe[r], i = 4 * r;
1029
+ e[i] = s[0], e[i + 1] = s[1], e[i + 2] = s[2], e[i + 3] = 255;
1034
1030
  }
1035
- this.C.I(e, t, 1);
1031
+ this.C.updatePixels(e, t, 1);
1036
1032
  }
1037
- tr(t) {
1038
- this.Js = t, this.Ks();
1033
+ setColors(t) {
1034
+ this.Qe = t, this.Ze();
1039
1035
  }
1040
- get er() {
1041
- return this.Js;
1036
+ get colors() {
1037
+ return this.Qe;
1042
1038
  }
1043
1039
  get framebuffer() {
1044
1040
  return this.C;
@@ -1047,317 +1043,361 @@ class ut {
1047
1043
  return this.C.texture;
1048
1044
  }
1049
1045
  }
1050
- class N extends $ {
1051
- constructor(e, s, i, r = {}) {
1052
- super(e, s, i, r);
1053
- a(this, "palette");
1054
- this.palette = new ut(this.Ls, this.Bs.Ee(" .:-=+*%@#"));
1046
+ class k extends U {
1047
+ constructor(e, r, s, i = {}) {
1048
+ super(e, r, s, i);
1049
+ h(this, "Je");
1050
+ this.Je = new ut(this.Zt, this.Oe.getCharacterColors(" .:-=+*%@#"));
1055
1051
  }
1056
- hs(e) {
1057
- w.validate(this.Bs.rs(e), "One or more characters do not exist in the current font.", { method: "characters", Ge: e }) && (this.l.hs = e, this.palette.tr(this.Bs.Ee(e)));
1052
+ characters(e) {
1053
+ C.p(this.Oe.hasAllCharacters(e), "One or more characters do not exist in the current font.", { method: "characters", providedValue: e }) && (this.l.characters = e, this.Je.setColors(this.Oe.getCharacterColors(e)));
1058
1054
  }
1059
- sr(e, s, i, r = 255) {
1060
- const o = this.rr(e, "characterColor", s, i, r);
1061
- o && (this.l.sr = o);
1055
+ characterColor(e, r, s, i = 255) {
1056
+ const o = this.Ke(e, "characterColor", r, s, i);
1057
+ o && (this.l.characterColor = o);
1062
1058
  }
1063
- ir(e) {
1064
- this.nr(e, "characterColorMode");
1059
+ characterColorMode(e) {
1060
+ this.tr(e, "characterColorMode");
1065
1061
  }
1066
- hr(e, s, i, r = 255) {
1067
- const o = this.rr(e, "cellColor", s, i, r);
1068
- o && (this.l.hr = o);
1062
+ cellColor(e, r, s, i = 255) {
1063
+ const o = this.Ke(e, "cellColor", r, s, i);
1064
+ o && (this.l.cellColor = o);
1069
1065
  }
1070
- ar(e) {
1071
- this.nr(e, "cellColorMode");
1066
+ cellColorMode(e) {
1067
+ this.tr(e, "cellColorMode");
1072
1068
  }
1073
- lr(e) {
1074
- this.cr(e, "invert", "Invert");
1069
+ invert(e) {
1070
+ this.er(e, "invert", "Invert");
1075
1071
  }
1076
1072
  rotation(e) {
1077
- if (!w.validate(typeof e == "number", "Rotation angle must be a number.", { method: "rotation", Ge: e })) return;
1073
+ if (!C.p(typeof e == "number", "Rotation angle must be a number.", { method: "rotation", providedValue: e })) return;
1078
1074
  (e %= 360) < 0 && (e += 360);
1079
- const s = 255 * e / 360, i = Math.floor(s) / 255, r = Math.round(s - i);
1080
- this.l.rotation = [i, r, 0, 1];
1075
+ const r = 255 * e / 360, s = Math.floor(r) / 255, i = Math.round(r - s);
1076
+ this.l.rotation = [s, i, 0, 1];
1081
1077
  }
1082
- ur(e) {
1083
- this.cr(e, "flipHorizontally", "Flip horizontally");
1078
+ flipHorizontally(e) {
1079
+ this.er(e, "flipHorizontally", "Flip horizontally");
1084
1080
  }
1085
- dr(e) {
1086
- this.cr(e, "flipVertically", "Flip vertically");
1081
+ flipVertically(e) {
1082
+ this.er(e, "flipVertically", "Flip vertically");
1087
1083
  }
1088
- rr(e, s, i, r, o = 255) {
1084
+ Ke(e, r, s, i, o = 255) {
1089
1085
  let n, l, c, u;
1090
1086
  if (typeof e == "string") {
1091
- const d = this.mr(e);
1092
- if (!d) return w.validate(!1, "Invalid hex color format. Use '#FF0000', '#F00', 'FF0000', or 'F00'.", { method: s, Ge: e }), null;
1087
+ const d = this.rr(e);
1088
+ if (!d) return C.p(!1, "Invalid hex color format. Use '#FF0000', '#F00', 'FF0000', or 'F00'.", { method: r, providedValue: e }), null;
1093
1089
  [n, l, c, u] = d;
1094
- } else if (n = e, l = i !== void 0 ? i : e, c = r !== void 0 ? r : e, u = o, !w.validate([n, l, c, u].every((d) => d >= 0 && d <= 255), s.charAt(0).toUpperCase() + s.slice(1) + " color values must be between 0 and 255", { method: s, gr: { r: n, g: l, b: c, a: u } })) return null;
1090
+ } else if (n = e, l = s !== void 0 ? s : e, c = i !== void 0 ? i : e, u = o, !C.p([n, l, c, u].every((d) => d >= 0 && d <= 255), r.charAt(0).toUpperCase() + r.slice(1) + " color values must be between 0 and 255", { method: r, providedValues: { r: n, g: l, b: c, a: u } })) return null;
1095
1091
  return [n / 255, l / 255, c / 255, u / 255];
1096
1092
  }
1097
- nr(e, s) {
1098
- w.validate(["sampled", "fixed"].includes(e), "Invalid color mode. Must be 'sampled' or 'fixed'.", { method: s, Ge: e }) && (this.l[s] = e);
1093
+ tr(e, r) {
1094
+ C.p(["sampled", "fixed"].includes(e), "Invalid color mode. Must be 'sampled' or 'fixed'.", { method: r, providedValue: e }) && (this.l[r] = e);
1099
1095
  }
1100
- cr(e, s, i) {
1101
- w.validate(typeof e == "boolean" || typeof e == "number" && Number.isInteger(e), i + " must be a boolean value or an integer (0 for false, any other number for true).", { method: s, Ge: e }) && (this.l[s] = !!e);
1096
+ er(e, r, s) {
1097
+ C.p(typeof e == "boolean" || typeof e == "number" && Number.isInteger(e), s + " must be a boolean value or an integer (0 for false, any other number for true).", { method: r, providedValue: e }) && (this.l[r] = !!e);
1102
1098
  }
1103
- mr(e) {
1104
- return e = e.replace(/^#/, ""), /^[0-9A-Fa-f]{3}$|^[0-9A-Fa-f]{6}$/.test(e) ? (e.length === 3 && (e = e.split("").map((s) => s + s).join("")), [parseInt(e.slice(0, 2), 16), parseInt(e.slice(2, 4), 16), parseInt(e.slice(4, 6), 16), 255]) : null;
1099
+ rr(e) {
1100
+ return e = e.replace(/^#/, ""), /^[0-9A-Fa-f]{3}$|^[0-9A-Fa-f]{6}$/.test(e) ? (e.length === 3 && (e = e.split("").map((r) => r + r).join("")), [parseInt(e.slice(0, 2), 16), parseInt(e.slice(2, 4), 16), parseInt(e.slice(4, 6), 16), 255]) : null;
1105
1101
  }
1106
1102
  }
1107
- const dt = { enabled: !0, hs: " .:-=+*%@#", sr: [1, 1, 1, 1], ir: "sampled", hr: [0, 0, 0, 1], ar: "fixed", lr: !1, rotation: [0, 0, 0, 255], ur: !1, dr: !1, pr: [0, 255] };
1108
- class Y extends N {
1109
- constructor(e, s, i) {
1110
- super(e, s, i, { ...dt });
1111
- a(this, "vr");
1112
- a(this, "_r");
1113
- a(this, "br");
1114
- a(this, "wr");
1115
- a(this, "Cr");
1116
- a(this, "yr");
1117
- this.vr = new T(e.context, C, "precision lowp float;uniform sampler2D u_sketchTexture;uniform vec2 u_gridCellDimensions;uniform vec2 u_brightnessRange;varying vec2 v_uv;void main(){vec2 cellCenter=(floor(v_uv*u_gridCellDimensions)+vec2(0.5))/u_gridCellDimensions;vec4 color=texture2D(u_sketchTexture,cellCenter);float brightness=dot(color.rgb,vec3(0.299,0.587,0.114));float brightnessValue=brightness*255.0;if(brightnessValue>=u_brightnessRange.x&&brightnessValue<=u_brightnessRange.y){gl_FragColor=color;}else{gl_FragColor=vec4(0.0);}}"), this._r = new T(e.context, C, "precision lowp float;uniform sampler2D u_sampleTexture;uniform vec4 u_fillColor;uniform bool u_useFixedColor;varying vec2 v_uv;void main(){vec4 sampleColor=texture2D(u_sampleTexture,v_uv);if(sampleColor.a>0.0){if(u_useFixedColor){gl_FragColor=u_fillColor;}else{gl_FragColor=sampleColor;}}else{gl_FragColor=vec4(0.0);}}"), this.wr = new T(e.context, C, "precision lowp float;uniform sampler2D u_sampleTexture;uniform bool u_invert;uniform bool u_flipHorizontally;uniform bool u_flipVertically;varying vec2 v_uv;void main(){vec4 sampleColor=texture2D(u_sampleTexture,v_uv);if(sampleColor.a>0.0){float invertValue=u_invert ? 1.0 : 0.0;float flipHValue=u_flipHorizontally ? 1.0 : 0.0;float flipVValue=u_flipVertically ? 1.0 : 0.0;gl_FragColor=vec4(invertValue,flipHValue,flipVValue,1.0);}else{gl_FragColor=vec4(0.0);}}"), this.Cr = new T(e.context, C, "precision lowp float;uniform sampler2D u_sampleTexture;uniform vec4 u_rotationColor;varying vec2 v_uv;void main(){vec4 sampleColor=texture2D(u_sampleTexture,v_uv);if(sampleColor.a>0.0){gl_FragColor=u_rotationColor;}else{gl_FragColor=vec4(0.0);}}"), this.br = new T(e.context, C, "precision lowp float;uniform sampler2D u_colorSampleFramebuffer;uniform sampler2D u_charPaletteTexture;uniform vec2 u_charPaletteSize;uniform vec2 u_brightnessRange;varying vec2 v_uv;void main(){vec4 color=texture2D(u_colorSampleFramebuffer,v_uv);if(color.a==0.0){gl_FragColor=vec4(0.0);return;}float brightness=dot(color.rgb,vec3(0.299,0.587,0.114))*255.0;vec2 range=u_brightnessRange;if(brightness<range.x||brightness>range.y){gl_FragColor=vec4(0.0);return;}float t=(brightness-range.x)/(range.y-range.x);float idx=clamp(floor(t*u_charPaletteSize.x),0.0,u_charPaletteSize.x-1.0);vec3 charColor=texture2D(u_charPaletteTexture,vec2((idx+0.5)/u_charPaletteSize.x,0.0)).rgb;gl_FragColor=vec4(charColor,1.0);}"), this.yr = this.Ls.createFramebuffer(this.grid.cols, this.grid.rows);
1118
- }
1119
- Fr(e) {
1120
- const s = this.grid.cols, i = this.grid.rows;
1121
- this.yr.P(), this.Ls.clear(), this.Ls.Vt(this.vr), this.Ls.Y("u_sketchTexture", e), this.Ls.Y("u_gridCellDimensions", [s, i]), this.Ls.Y("u_brightnessRange", this.l.pr), this.Ls.rect(0, 0, s, i), this.yr.end(), this.Os.P(), this.Ls.clear(), this.Ls.Vt(this._r), this.Ls.Y("u_sampleTexture", this.yr), this.Ls.Y("u_fillColor", this.l.sr), this.Ls.Y("u_useFixedColor", this.l.ir === "fixed"), this.Ls.rect(0, 0, s, i), this.Os.end(), this.js.P(), this.Ls.clear(), this.Ls.Vt(this._r), this.Ls.Y("u_sampleTexture", this.yr), this.Ls.Y("u_fillColor", this.l.hr), this.Ls.Y("u_useFixedColor", this.l.ar === "fixed"), this.Ls.rect(0, 0, s, i), this.js.end(), this.Ns.P(), this.Ls.clear(), this.Ls.Vt(this.wr), this.Ls.Y("u_sampleTexture", this.yr), this.Ls.Y("u_invert", this.l.lr), this.Ls.Y("u_flipHorizontally", this.l.ur), this.Ls.Y("u_flipVertically", this.l.dr), this.Ls.rect(0, 0, s, i), this.Ns.end(), this.Ws.P(), this.Ls.clear(), this.Ls.Vt(this.Cr), this.Ls.Y("u_sampleTexture", this.yr), this.Ls.Y("u_rotationColor", this.l.rotation), this.Ls.rect(0, 0, s, i), this.Ws.end(), this.Hs.P(), this.Ls.clear(), this.Ls.Vt(this.br), this.Ls.Y("u_colorSampleFramebuffer", this.yr), this.Ls.Y("u_charPaletteTexture", this.palette.texture), this.Ls.Y("u_charPaletteSize", [this.palette.er.length, 1]), this.Ls.Y("u_brightnessRange", this.l.pr), this.Ls.rect(0, 0, s, i), this.Hs.end();
1122
- }
1123
- resize() {
1124
- super.resize(), this.yr.resize(this.grid.cols, this.grid.rows);
1125
- }
1126
- pr(e) {
1127
- w.validate(Array.isArray(e) && e.length === 2 && e.every((s) => typeof s == "number" && s >= 0 && s <= 255), "Brightness range must be an array of two numbers between 0 and 255.", { method: "brightnessRange", Ge: e }) && (this.l.pr = e);
1103
+ const D = `attribute vec2 a_position;\r
1104
+ attribute vec2 a_texCoord;\r
1105
+ varying vec2 v_uv;\r
1106
+ \r
1107
+ uniform float u_rotation; // rotation angle in radians\r
1108
+ uniform vec2 u_center; // rotation center in normalized coordinates\r
1109
+ uniform float u_aspectRatio; // canvas width / canvas height\r
1110
+ \r
1111
+ mat2 rotate2D(float angle) {\r
1112
+ float s = sin(angle);\r
1113
+ float c = cos(angle);\r
1114
+ return mat2(c, -s, s, c);\r
1115
+ }\r
1116
+ \r
1117
+ void main() {\r
1118
+ v_uv = a_texCoord;\r
1119
+ \r
1120
+ // Use the position directly (it's already in normalized device coordinates)\r
1121
+ vec2 pos = a_position;\r
1122
+ \r
1123
+ // Translate to origin for rotation\r
1124
+ pos -= u_center;\r
1125
+ \r
1126
+ // Correct for aspect ratio: scale X coordinate to make space square\r
1127
+ pos.x *= u_aspectRatio;\r
1128
+ \r
1129
+ // Rotate in corrected space\r
1130
+ // Negate rotation to make positive values rotate clockwise (like p5.js)\r
1131
+ pos = rotate2D(-u_rotation) * pos;\r
1132
+ \r
1133
+ // Restore aspect ratio: scale X coordinate back\r
1134
+ pos.x /= u_aspectRatio;\r
1135
+ \r
1136
+ // Translate back from origin\r
1137
+ pos += u_center;\r
1138
+ \r
1139
+ gl_Position = vec4(pos, 0.0, 1.0);\r
1140
+ }\r
1141
+ `, dt = { enabled: !0, characters: " .:-=+*%@#", characterColor: [1, 1, 1, 1], characterColorMode: "sampled", cellColor: [0, 0, 0, 1], cellColorMode: "fixed", invert: !1, rotation: [0, 0, 0, 255], flipHorizontally: !1, flipVertically: !1, brightnessRange: [0, 255] };
1142
+ class I extends k {
1143
+ constructor(e, r, s) {
1144
+ super(e, r, s, { ...dt });
1145
+ h(this, "sr");
1146
+ h(this, "ir");
1147
+ h(this, "nr");
1148
+ h(this, "ar");
1149
+ h(this, "hr");
1150
+ h(this, "lr");
1151
+ this.sr = new y(e.context, D, "precision lowp float;uniform sampler2D u_sketchTexture;uniform vec2 u_gridCellDimensions;uniform vec2 u_brightnessRange;varying vec2 v_uv;void main(){vec2 cellCenter=(floor(v_uv*u_gridCellDimensions)+vec2(0.5))/u_gridCellDimensions;vec4 color=texture2D(u_sketchTexture,cellCenter);float brightness=dot(color.rgb,vec3(0.299,0.587,0.114));float brightnessValue=brightness*255.0;if(brightnessValue>=u_brightnessRange.x&&brightnessValue<=u_brightnessRange.y){gl_FragColor=color;}else{gl_FragColor=vec4(0.0);}}"), this.ir = new y(e.context, D, "precision lowp float;uniform sampler2D u_sampleTexture;uniform vec4 u_fillColor;uniform bool u_useFixedColor;varying vec2 v_uv;void main(){vec4 sampleColor=texture2D(u_sampleTexture,v_uv);if(sampleColor.a>0.0){if(u_useFixedColor){gl_FragColor=u_fillColor;}else{gl_FragColor=sampleColor;}}else{gl_FragColor=vec4(0.0);}}"), this.ar = new y(e.context, D, "precision lowp float;uniform sampler2D u_sampleTexture;uniform bool u_invert;uniform bool u_flipHorizontally;uniform bool u_flipVertically;varying vec2 v_uv;void main(){vec4 sampleColor=texture2D(u_sampleTexture,v_uv);if(sampleColor.a>0.0){float invertValue=u_invert ? 1.0 : 0.0;float flipHValue=u_flipHorizontally ? 1.0 : 0.0;float flipVValue=u_flipVertically ? 1.0 : 0.0;gl_FragColor=vec4(invertValue,flipHValue,flipVValue,1.0);}else{gl_FragColor=vec4(0.0);}}"), this.hr = new y(e.context, D, "precision lowp float;uniform sampler2D u_sampleTexture;uniform vec4 u_rotationColor;varying vec2 v_uv;void main(){vec4 sampleColor=texture2D(u_sampleTexture,v_uv);if(sampleColor.a>0.0){gl_FragColor=u_rotationColor;}else{gl_FragColor=vec4(0.0);}}"), this.nr = new y(e.context, D, "precision lowp float;uniform sampler2D u_colorSampleFramebuffer;uniform sampler2D u_charPaletteTexture;uniform vec2 u_charPaletteSize;uniform vec2 u_brightnessRange;varying vec2 v_uv;void main(){vec4 color=texture2D(u_colorSampleFramebuffer,v_uv);if(color.a==0.0){gl_FragColor=vec4(0.0);return;}float brightness=dot(color.rgb,vec3(0.299,0.587,0.114))*255.0;vec2 range=u_brightnessRange;if(brightness<range.x||brightness>range.y){gl_FragColor=vec4(0.0);return;}float t=(brightness-range.x)/(range.y-range.x);float idx=clamp(floor(t*u_charPaletteSize.x),0.0,u_charPaletteSize.x-1.0);vec3 charColor=texture2D(u_charPaletteTexture,vec2((idx+0.5)/u_charPaletteSize.x,0.0)).rgb;gl_FragColor=vec4(charColor,1.0);}"), this.lr = this.Zt.Et(this.je.cols, this.je.rows);
1152
+ }
1153
+ cr(e) {
1154
+ const r = this.je.cols, s = this.je.rows;
1155
+ this.lr.begin(), this.Zt.Bt(), this.Zt.yt(this.sr), this.Zt.Pt("u_sketchTexture", e), this.Zt.Pt("u_gridCellDimensions", [r, s]), this.Zt.Pt("u_brightnessRange", this.l.brightnessRange), this.Zt.Ut(0, 0, r, s), this.lr.end(), this.Ne.begin(), this.Zt.Bt(), this.Zt.yt(this.ir), this.Zt.Pt("u_sampleTexture", this.lr), this.Zt.Pt("u_fillColor", this.l.characterColor), this.Zt.Pt("u_useFixedColor", this.l.characterColorMode === "fixed"), this.Zt.Ut(0, 0, r, s), this.Ne.end(), this.Xe.begin(), this.Zt.Bt(), this.Zt.yt(this.ir), this.Zt.Pt("u_sampleTexture", this.lr), this.Zt.Pt("u_fillColor", this.l.cellColor), this.Zt.Pt("u_useFixedColor", this.l.cellColorMode === "fixed"), this.Zt.Ut(0, 0, r, s), this.Xe.end(), this.Ye.begin(), this.Zt.Bt(), this.Zt.yt(this.ar), this.Zt.Pt("u_sampleTexture", this.lr), this.Zt.Pt("u_invert", this.l.invert), this.Zt.Pt("u_flipHorizontally", this.l.flipHorizontally), this.Zt.Pt("u_flipVertically", this.l.flipVertically), this.Zt.Ut(0, 0, r, s), this.Ye.end(), this.qe.begin(), this.Zt.Bt(), this.Zt.yt(this.hr), this.Zt.Pt("u_sampleTexture", this.lr), this.Zt.Pt("u_rotationColor", this.l.rotation), this.Zt.Ut(0, 0, r, s), this.qe.end(), this.We.begin(), this.Zt.Bt(), this.Zt.yt(this.nr), this.Zt.Pt("u_colorSampleFramebuffer", this.lr), this.Zt.Pt("u_charPaletteTexture", this.Je.texture), this.Zt.Pt("u_charPaletteSize", [this.Je.colors.length, 1]), this.Zt.Pt("u_brightnessRange", this.l.brightnessRange), this.Zt.Ut(0, 0, r, s), this.We.end();
1156
+ }
1157
+ Pe() {
1158
+ super.Pe(), this.lr.resize(this.je.cols, this.je.rows);
1159
+ }
1160
+ brightnessRange(e) {
1161
+ C.p(Array.isArray(e) && e.length === 2 && e.every((r) => typeof r == "number" && r >= 0 && r <= 255), "Brightness range must be an array of two numbers between 0 and 255.", { method: "brightnessRange", providedValue: e }) && (this.l.brightnessRange = e);
1128
1162
  }
1129
1163
  }
1130
- const At = Object.freeze(Object.defineProperty({ __proto__: null, Tr: Y, $r: $, Dr: N }, Symbol.toStringTag, { value: "Module" }));
1164
+ const Ut = Object.freeze(Object.defineProperty({ __proto__: null, TextmodeBrightnessConverter: I, TextmodeConverter: U, TextmodeFeatureConverter: k }, Symbol.toStringTag, { value: "Module" }));
1131
1165
  class ft {
1132
- constructor(t, e, s) {
1133
- a(this, "Ls");
1134
- a(this, "font");
1135
- a(this, "grid");
1136
- a(this, "Mr");
1137
- a(this, "Sr");
1138
- a(this, "Vr");
1139
- a(this, "Rr");
1140
- a(this, "kr");
1141
- a(this, "Hs");
1142
- a(this, "Os");
1143
- a(this, "js");
1144
- a(this, "Ws");
1145
- a(this, "Ns");
1146
- this.Ls = t, this.font = e, this.grid = s, this.kr = this.Ls.createShader(C, "precision mediump float;uniform sampler2D u_characterTexture;uniform vec2 u_charsetDimensions;uniform sampler2D u_primaryColorTexture;uniform sampler2D u_secondaryColorTexture;uniform sampler2D u_transformTexture;uniform sampler2D u_asciiCharacterTexture;uniform sampler2D u_rotationTexture;uniform sampler2D u_captureTexture;uniform vec2 u_captureDimensions;uniform int u_backgroundMode;uniform vec2 u_gridCellDimensions;uniform vec2 u_gridPixelDimensions;mat2 rotate2D(float angle){float s=sin(angle);float c=cos(angle);return mat2(c,-s,s,c);}void main(){vec2 adjustedCoord=gl_FragCoord.xy/u_gridPixelDimensions;vec2 gridCoord=adjustedCoord*u_gridCellDimensions;vec2 cellCoord=floor(gridCoord);vec2 charIndexTexCoord=(cellCoord+0.5)/u_gridCellDimensions;vec4 primaryColor=texture2D(u_primaryColorTexture,charIndexTexCoord);vec4 secondaryColor=texture2D(u_secondaryColorTexture,charIndexTexCoord);vec4 transformColor=texture2D(u_transformTexture,charIndexTexCoord);bool isInverted=transformColor.r>0.5;bool flipHorizontal=transformColor.g>0.5;bool flipVertical=transformColor.b>0.5;vec4 encodedIndexVec=texture2D(u_asciiCharacterTexture,charIndexTexCoord);if(encodedIndexVec.a<0.01){gl_FragColor=(u_backgroundMode==0)? vec4(0.0):texture2D(u_captureTexture,gl_FragCoord.xy/u_captureDimensions);return;}int charIndex=int(encodedIndexVec.r*255.0+0.5)+int(encodedIndexVec.g*255.0+0.5)*256;int charCol=int(mod(float(charIndex),u_charsetDimensions.x));int charRow=charIndex/int(u_charsetDimensions.x);float flippedRow=(u_charsetDimensions.y-1.0)-float(charRow);vec2 charCoord=vec2(float(charCol),flippedRow)/u_charsetDimensions;vec4 rotationColor=texture2D(u_rotationTexture,charIndexTexCoord);float scaledAngle=rotationColor.r*255.0+rotationColor.g;float rotationAngle=(scaledAngle*360.0/255.0)*0.017453292;vec2 fractionalPart=fract(gridCoord)-0.5;if(flipHorizontal)fractionalPart.x=-fractionalPart.x;if(flipVertical)fractionalPart.y=-fractionalPart.y;fractionalPart=rotate2D(rotationAngle)*fractionalPart+0.5;vec2 cellSize=1.0/u_charsetDimensions;vec2 texCoord=charCoord+fractionalPart*cellSize;vec2 cellMax=charCoord+cellSize;if(any(lessThan(texCoord,charCoord))||any(greaterThan(texCoord,cellMax))){gl_FragColor=isInverted ? primaryColor : secondaryColor;return;}vec4 charTexel=texture2D(u_characterTexture,texCoord);if(isInverted)charTexel.rgb=1.0-charTexel.rgb;gl_FragColor=mix(secondaryColor,primaryColor,charTexel);}"), this.Sr = new Y(t, e, s), this.Vr = new $(t, e, s), this.Mr = [this.Sr, this.Vr], this.Hs = this.Ls.createFramebuffer(s.cols, s.rows), this.Os = this.Ls.createFramebuffer(s.cols, s.rows), this.js = this.Ls.createFramebuffer(s.cols, s.rows), this.Ws = this.Ls.createFramebuffer(s.cols, s.rows), this.Ns = this.Ls.createFramebuffer(s.cols, s.rows), this.Rr = this.Ls.createFramebuffer(this.grid.width, this.grid.height);
1147
- }
1148
- zr(t) {
1149
- for (const s of this.Mr) s.options.enabled && s instanceof N && s.Fr(t);
1150
- const e = (s, i) => {
1151
- s.P(), this.Ls.clear();
1152
- for (const r of this.Mr) r.options.enabled && this.Ls.image(i(r), 0, 0);
1153
- s.end();
1166
+ constructor(t, e, r) {
1167
+ h(this, "Zt");
1168
+ h(this, "oe");
1169
+ h(this, "je");
1170
+ h(this, "ur");
1171
+ h(this, "dr");
1172
+ h(this, "mr");
1173
+ h(this, "gr");
1174
+ h(this, "pr");
1175
+ h(this, "We");
1176
+ h(this, "Ne");
1177
+ h(this, "Xe");
1178
+ h(this, "qe");
1179
+ h(this, "Ye");
1180
+ this.Zt = t, this.oe = e, this.je = r, this.pr = this.Zt.zt(Z, "precision mediump float;uniform sampler2D u_characterTexture;uniform vec2 u_charsetDimensions;uniform sampler2D u_primaryColorTexture;uniform sampler2D u_secondaryColorTexture;uniform sampler2D u_transformTexture;uniform sampler2D u_asciiCharacterTexture;uniform sampler2D u_rotationTexture;uniform sampler2D u_captureTexture;uniform vec2 u_captureDimensions;uniform int u_backgroundMode;uniform vec2 u_gridCellDimensions;uniform vec2 u_gridPixelDimensions;mat2 rotate2D(float angle){float s=sin(angle);float c=cos(angle);return mat2(c,-s,s,c);}void main(){vec2 adjustedCoord=gl_FragCoord.xy/u_gridPixelDimensions;vec2 gridCoord=adjustedCoord*u_gridCellDimensions;vec2 cellCoord=floor(gridCoord);vec2 charIndexTexCoord=(cellCoord+0.5)/u_gridCellDimensions;vec4 primaryColor=texture2D(u_primaryColorTexture,charIndexTexCoord);vec4 secondaryColor=texture2D(u_secondaryColorTexture,charIndexTexCoord);vec4 transformColor=texture2D(u_transformTexture,charIndexTexCoord);bool isInverted=transformColor.r>0.5;bool flipHorizontal=transformColor.g>0.5;bool flipVertical=transformColor.b>0.5;vec4 encodedIndexVec=texture2D(u_asciiCharacterTexture,charIndexTexCoord);if(encodedIndexVec.a<0.01){gl_FragColor=(u_backgroundMode==0)? vec4(0.0):texture2D(u_captureTexture,gl_FragCoord.xy/u_captureDimensions);return;}int charIndex=int(encodedIndexVec.r*255.0+0.5)+int(encodedIndexVec.g*255.0+0.5)*256;int charCol=int(mod(float(charIndex),u_charsetDimensions.x));int charRow=charIndex/int(u_charsetDimensions.x);float flippedRow=(u_charsetDimensions.y-1.0)-float(charRow);vec2 charCoord=vec2(float(charCol),flippedRow)/u_charsetDimensions;vec4 rotationColor=texture2D(u_rotationTexture,charIndexTexCoord);float scaledAngle=rotationColor.r*255.0+rotationColor.g;float rotationAngle=(scaledAngle*360.0/255.0)*0.017453292;vec2 fractionalPart=fract(gridCoord)-0.5;if(flipHorizontal)fractionalPart.x=-fractionalPart.x;if(flipVertical)fractionalPart.y=-fractionalPart.y;fractionalPart=rotate2D(rotationAngle)*fractionalPart+0.5;vec2 cellSize=1.0/u_charsetDimensions;vec2 texCoord=charCoord+fractionalPart*cellSize;vec2 cellMax=charCoord+cellSize;if(any(lessThan(texCoord,charCoord))||any(greaterThan(texCoord,cellMax))){gl_FragColor=isInverted ? primaryColor : secondaryColor;return;}vec4 charTexel=texture2D(u_characterTexture,texCoord);if(isInverted)charTexel.rgb=1.0-charTexel.rgb;gl_FragColor=mix(secondaryColor,primaryColor,charTexel);}"), this.dr = new I(t, e, r), this.mr = new U(t, e, r), this.ur = [this.dr, this.mr], this.We = this.Zt.Et(r.cols, r.rows), this.Ne = this.Zt.Et(r.cols, r.rows), this.Xe = this.Zt.Et(r.cols, r.rows), this.qe = this.Zt.Et(r.cols, r.rows), this.Ye = this.Zt.Et(r.cols, r.rows), this.gr = this.Zt.Et(this.je.width, this.je.height);
1181
+ }
1182
+ _r(t) {
1183
+ for (const r of this.ur) r.options.enabled && r instanceof k && r.cr(t);
1184
+ const e = (r, s) => {
1185
+ r.begin(), this.Zt.Bt();
1186
+ for (const i of this.ur) i.options.enabled && this.Zt.Ot(s(i), 0, 0);
1187
+ r.end();
1154
1188
  };
1155
- e(this.Hs, (s) => s.Xs), e(this.Os, (s) => s.Ys), e(this.js, (s) => s.qs), e(this.Ws, (s) => s.Qs), e(this.Ns, (s) => s.Zs), this.Rr.P(), this.Ls.clear(), this.Ls.Vt(this.kr), this.Ls.Y("u_characterTexture", this.font.ns), this.Ls.Y("u_charsetDimensions", [this.font.ls, this.font.cs]), this.Ls.Y("u_asciiCharacterTexture", this.Hs.texture), this.Ls.Y("u_primaryColorTexture", this.Os.texture), this.Ls.Y("u_secondaryColorTexture", this.js.texture), this.Ls.Y("u_transformTexture", this.Ns.texture), this.Ls.Y("u_rotationTexture", this.Ws.texture), this.Ls.Y("u_captureTexture", t.texture), this.Ls.Y("u_backgroundMode", !1), this.Ls.Y("u_captureDimensions", [t.width, t.height]), this.Ls.Y("u_gridCellDimensions", [this.grid.cols, this.grid.rows]), this.Ls.Y("u_gridPixelDimensions", [this.grid.width, this.grid.height]), this.Ls.rect(0, 0, this.Rr.width, this.Rr.height), this.Rr.end();
1189
+ e(this.We, (r) => r.characterFramebuffer), e(this.Ne, (r) => r.primaryColorFramebuffer), e(this.Xe, (r) => r.secondaryColorFramebuffer), e(this.qe, (r) => r.rotationFramebuffer), e(this.Ye, (r) => r.transformFramebuffer), this.gr.begin(), this.Zt.Bt(), this.Zt.yt(this.pr), this.Zt.Pt("u_characterTexture", this.oe.fontFramebuffer), this.Zt.Pt("u_charsetDimensions", [this.oe.textureColumns, this.oe.textureRows]), this.Zt.Pt("u_asciiCharacterTexture", this.We.texture), this.Zt.Pt("u_primaryColorTexture", this.Ne.texture), this.Zt.Pt("u_secondaryColorTexture", this.Xe.texture), this.Zt.Pt("u_transformTexture", this.Ye.texture), this.Zt.Pt("u_rotationTexture", this.qe.texture), this.Zt.Pt("u_captureTexture", t.texture), this.Zt.Pt("u_backgroundMode", !1), this.Zt.Pt("u_captureDimensions", [t.width, t.height]), this.Zt.Pt("u_gridCellDimensions", [this.je.cols, this.je.rows]), this.Zt.Pt("u_gridPixelDimensions", [this.je.width, this.je.height]), this.Zt.Ut(0, 0, this.gr.width, this.gr.height), this.gr.end();
1156
1190
  }
1157
1191
  add(t) {
1158
- if (!w.validate(t === "brightness" || t === "custom", 'Converter type must be either "brightness" or "custom". Provided: ' + t, { method: "add", Ge: t })) return;
1192
+ if (!C.p(t === "brightness" || t === "custom", 'Converter type must be either "brightness" or "custom".', { method: "add", providedValue: t })) return;
1159
1193
  let e;
1160
- return e = t === "brightness" ? new Y(this.Ls, this.font, this.grid) : new $(this.Ls, this.font, this.grid), this.Mr.push(e), e;
1194
+ return e = t === "brightness" ? new I(this.Zt, this.oe, this.je) : new U(this.Zt, this.oe, this.je), this.ur.push(e), e;
1161
1195
  }
1162
1196
  remove(t) {
1163
- if (!w.validate(t instanceof $, "Parameter must be a TextmodeConverter instance.", { method: "remove", Ge: t })) return;
1164
- const e = this.Mr.indexOf(t);
1165
- w.validate(e !== -1, "Converter instance not found in pipeline.", { method: "remove", Ge: t, Ir: this.Mr.length }) && this.Mr.splice(e, 1);
1197
+ if (!C.p(t instanceof U, "Parameter must be a TextmodeConverter instance.", { method: "remove", providedValue: t })) return;
1198
+ const e = this.ur.indexOf(t);
1199
+ C.p(e !== -1, "Converter instance not found in pipeline.", { method: "remove", providedValue: t, convertersCount: this.ur.length }) && this.ur.splice(e, 1);
1166
1200
  }
1167
- get texture() {
1168
- return this.Rr;
1201
+ Pe() {
1202
+ this.gr.resize(this.je.width, this.je.height);
1203
+ const t = this.je.cols, e = this.je.rows;
1204
+ this.We.resize(t, e), this.Ne.resize(t, e), this.Xe.resize(t, e), this.qe.resize(t, e), this.Ye.resize(t, e);
1205
+ for (const r of this.ur) r.Pe();
1169
1206
  }
1170
- resize() {
1171
- this.Rr.resize(this.grid.width, this.grid.height);
1172
- const t = this.grid.cols, e = this.grid.rows;
1173
- this.Hs.resize(t, e), this.Os.resize(t, e), this.js.resize(t, e), this.Ws.resize(t, e), this.Ns.resize(t, e);
1174
- for (const s of this.Mr) s.resize();
1175
- }
1176
- Pr() {
1177
- return this.Mr.some((t) => t.options.enabled);
1207
+ hasEnabledConverters() {
1208
+ return this.ur.some((t) => t.options.enabled);
1178
1209
  }
1179
1210
  disable() {
1180
- for (const t of this.Mr) t.disable();
1211
+ for (const t of this.ur) t.disable();
1181
1212
  }
1182
1213
  enable() {
1183
- for (const t of this.Mr) t.enable();
1214
+ for (const t of this.ur) t.enable();
1215
+ }
1216
+ P() {
1217
+ for (const t of this.ur) t.P();
1218
+ this.We.P(), this.Ne.P(), this.Xe.P(), this.qe.P(), this.Ye.P(), this.gr.P(), this.pr.P();
1219
+ }
1220
+ get texture() {
1221
+ return this.gr;
1184
1222
  }
1185
- dispose() {
1186
- for (const t of this.Mr) t.dispose();
1187
- this.Hs.dispose(), this.Os.dispose(), this.js.dispose(), this.Ws.dispose(), this.Ns.dispose(), this.Rr.dispose(), this.kr.dispose();
1223
+ get characterFramebuffer() {
1224
+ return this.We;
1225
+ }
1226
+ get primaryColorFramebuffer() {
1227
+ return this.Ne;
1188
1228
  }
1189
- get Xs() {
1190
- return this.Hs;
1229
+ get secondaryColorFramebuffer() {
1230
+ return this.Xe;
1191
1231
  }
1192
- get Ys() {
1193
- return this.Os;
1232
+ get rotationFramebuffer() {
1233
+ return this.qe;
1194
1234
  }
1195
- get qs() {
1196
- return this.js;
1235
+ get transformFramebuffer() {
1236
+ return this.Ye;
1197
1237
  }
1198
- get Qs() {
1199
- return this.Ws;
1238
+ get brightness() {
1239
+ return this.dr;
1200
1240
  }
1201
- get Zs() {
1202
- return this.Ns;
1241
+ get custom() {
1242
+ return this.mr;
1203
1243
  }
1204
1244
  }
1205
- const gt = (h) => class extends h {
1206
- fill(t, e, s, i) {
1207
- this.ye.fill(t, e, s, i);
1245
+ const gt = (a) => class extends a {
1246
+ fill(t, e, r, s) {
1247
+ this.Zt.$t(t, e, r, s);
1208
1248
  }
1209
- stroke(t, e, s, i) {
1210
- this.ye.stroke(t, e, s, i);
1249
+ stroke(t, e, r, s) {
1250
+ this.Zt.Ft(t, e, r, s);
1211
1251
  }
1212
- Rt(t) {
1213
- this.ye.Rt(t);
1252
+ strokeWeight(t) {
1253
+ this.Zt.Tt(t);
1214
1254
  }
1215
- kt() {
1216
- this.ye.kt();
1255
+ noStroke() {
1256
+ this.Zt.Dt();
1217
1257
  }
1218
- zt() {
1219
- this.ye.zt();
1258
+ noFill() {
1259
+ this.Zt.Mt();
1220
1260
  }
1221
1261
  rotate(t) {
1222
- this.ye.rotate(t);
1262
+ this.Zt.St(t);
1223
1263
  }
1224
1264
  push() {
1225
- this.ye.push();
1265
+ this.Zt.Rt();
1226
1266
  }
1227
1267
  pop() {
1228
- this.ye.pop();
1268
+ this.Zt.Vt();
1229
1269
  }
1230
- rect(t, e, s = 1, i = 1) {
1231
- this.ye.rect(t, e, s, i);
1270
+ rect(t, e, r = 1, s = 1) {
1271
+ this.Zt.Ut(t, e, r, s);
1232
1272
  }
1233
- line(t, e, s, i) {
1234
- this.ye.line(t, e, s, i);
1273
+ line(t, e, r, s) {
1274
+ this.Zt.Gt(t, e, r, s);
1235
1275
  }
1236
- background(t, e = t, s = t, i = 255) {
1237
- this.ye.background(t, e, s, i);
1276
+ background(t, e = t, r = t, s = 255) {
1277
+ this.Zt.Lt(t, e, r, s);
1238
1278
  }
1239
1279
  createShader(t, e) {
1240
- return this.ye.createShader(t, e);
1280
+ return this.Zt.zt(t, e);
1241
1281
  }
1242
- At(t) {
1243
- return this.ye.At(t);
1282
+ createFilterShader(t) {
1283
+ return this.Zt.It(t);
1244
1284
  }
1245
- Vt(t) {
1246
- this.ye.Vt(t);
1285
+ shader(t) {
1286
+ this.Zt.yt(t);
1247
1287
  }
1248
- Y(t, e) {
1249
- this.ye.Y(t, e);
1288
+ setUniform(t, e) {
1289
+ this.Zt.Pt(t, e);
1250
1290
  }
1251
1291
  };
1252
- class I {
1253
- Ar(t) {
1254
- const e = t.get("brightness"), s = e == null ? void 0 : e.Xs, i = e == null ? void 0 : e.Ys, r = e == null ? void 0 : e.qs, o = e == null ? void 0 : e.Zs, n = e == null ? void 0 : e.Qs;
1255
- return s == null || s.A(), i == null || i.A(), r == null || r.A(), o == null || o.A(), n == null || n.A(), { Ur: (s == null ? void 0 : s.U) || new Uint8Array(0), Gr: (i == null ? void 0 : i.U) || new Uint8Array(0), Er: (r == null ? void 0 : r.U) || new Uint8Array(0), Lr: (o == null ? void 0 : o.U) || new Uint8Array(0), Br: (n == null ? void 0 : n.U) || new Uint8Array(0) };
1292
+ class j {
1293
+ vr(t) {
1294
+ const e = t.get("brightness"), r = e == null ? void 0 : e.characterFramebuffer, s = e == null ? void 0 : e.primaryColorFramebuffer, i = e == null ? void 0 : e.secondaryColorFramebuffer, o = e == null ? void 0 : e.transformFramebuffer, n = e == null ? void 0 : e.rotationFramebuffer;
1295
+ return r == null || r.loadPixels(), s == null || s.loadPixels(), i == null || i.loadPixels(), o == null || o.loadPixels(), n == null || n.loadPixels(), { characterPixels: (r == null ? void 0 : r.pixels) || new Uint8Array(0), primaryColorPixels: (s == null ? void 0 : s.pixels) || new Uint8Array(0), secondaryColorPixels: (i == null ? void 0 : i.pixels) || new Uint8Array(0), transformPixels: (o == null ? void 0 : o.pixels) || new Uint8Array(0), rotationPixels: (n == null ? void 0 : n.pixels) || new Uint8Array(0) };
1256
1296
  }
1257
- Hr(t, e) {
1297
+ br(t, e) {
1258
1298
  return t[e] + (t[e + 1] << 8);
1259
1299
  }
1260
- Or(t, e) {
1300
+ wr(t, e) {
1261
1301
  return { r: t[e], g: t[e + 1], b: t[e + 2], a: t[e + 3] };
1262
1302
  }
1263
1303
  }
1264
- class z {
1265
- jr(t, e) {
1304
+ class L {
1305
+ Cr(t, e) {
1266
1306
  return new Blob([t], { type: e });
1267
1307
  }
1268
- Wr(t, e, s) {
1308
+ yr(t, e, r) {
1269
1309
  try {
1270
- const i = this.jr(t, s), r = URL.createObjectURL(i), o = document.createElement("a");
1271
- o.href = r, o.download = e, o.style.display = "none", o.rel = "noopener", document.body.appendChild(o), o.click(), document.body.removeChild(o), URL.revokeObjectURL(r);
1272
- } catch (i) {
1273
- throw console.error("Failed to download file:", i), Error("File download failed: " + (i instanceof Error ? i.message : "Unknown error"));
1310
+ const s = this.Cr(t, r), i = URL.createObjectURL(s), o = document.createElement("a");
1311
+ o.href = i, o.download = e, o.style.display = "none", o.rel = "noopener", document.body.appendChild(o), o.click(), document.body.removeChild(o), URL.revokeObjectURL(i);
1312
+ } catch (s) {
1313
+ throw console.error("Failed to download file:", s), Error("File download failed: " + (s instanceof Error ? s.message : "Unknown error"));
1274
1314
  }
1275
1315
  }
1276
- Nr() {
1316
+ $r() {
1277
1317
  return (/* @__PURE__ */ new Date()).toISOString().slice(0, 19).replace(/:/g, "-");
1278
1318
  }
1279
- Xr() {
1319
+ Fr() {
1280
1320
  const t = /* @__PURE__ */ new Date();
1281
- return { Yr: t.toISOString().split("T")[0], time: t.toTimeString().split(" ")[0].replace(/:/g, "-") };
1321
+ return { date: t.toISOString().split("T")[0], time: t.toTimeString().split(" ")[0].replace(/:/g, "-") };
1282
1322
  }
1283
- qr(t) {
1323
+ Tr(t) {
1284
1324
  return t.replace(/[<>:"/\\|?*]/g, "_").replace(/\s+/g, "_").replace(/_{2,}/g, "_").replace(/^_+|_+$/g, "").substring(0, 255);
1285
1325
  }
1286
- Qr() {
1287
- return "'textmode-export'-" + this.Nr();
1326
+ Dr() {
1327
+ return "'textmode-export'-" + this.$r();
1288
1328
  }
1289
1329
  }
1290
- class mt extends I {
1291
- Zr(t, e, s) {
1292
- const i = t[s] === 255, r = t[s + 1] === 255, o = t[s + 2] === 255, n = e[s], l = e[s + 1];
1293
- return { Jr: i, Kr: r, ti: o, rotation: Math.round(360 * (n + l / 255) / 255 * 100) / 100 };
1294
- }
1295
- ei(t, e, s) {
1296
- return { x: t, y: e, si: t * s.$s, ri: e * s.Ds };
1297
- }
1298
- ii(t, e) {
1299
- const s = [];
1300
- let i = 0;
1301
- for (let r = 0; r < e.rows; r++) for (let o = 0; o < e.cols; o++) {
1302
- const n = 4 * i, l = this.Hr(t.Ur, n);
1303
- let c = this.Or(t.Gr, n), u = this.Or(t.Er, n);
1304
- const d = this.Zr(t.Lr, t.Br, n);
1305
- if (d.Jr) {
1306
- const p = c;
1307
- c = u, u = p;
1330
+ class pt extends j {
1331
+ Mr(t, e, r) {
1332
+ const s = t[r] === 255, i = t[r + 1] === 255, o = t[r + 2] === 255, n = e[r], l = e[r + 1];
1333
+ return { isInverted: s, flipHorizontal: i, flipVertical: o, rotation: Math.round(360 * (n + l / 255) / 255 * 100) / 100 };
1334
+ }
1335
+ Sr(t, e, r) {
1336
+ return { x: t, y: e, cellX: t * r.cellWidth, cellY: e * r.cellHeight };
1337
+ }
1338
+ Rr(t, e) {
1339
+ const r = [];
1340
+ let s = 0;
1341
+ for (let i = 0; i < e.rows; i++) for (let o = 0; o < e.cols; o++) {
1342
+ const n = 4 * s, l = this.br(t.characterPixels, n);
1343
+ let c = this.wr(t.primaryColorPixels, n), u = this.wr(t.secondaryColorPixels, n);
1344
+ const d = this.Mr(t.transformPixels, t.rotationPixels, n);
1345
+ if (d.isInverted) {
1346
+ const m = c;
1347
+ c = u, u = m;
1308
1348
  }
1309
- const f = this.ei(o, r, e);
1310
- s.push({ charIndex: l, oi: c, ni: u, transform: d, position: f }), i++;
1349
+ const f = this.Sr(o, i, e);
1350
+ r.push({ charIndex: l, primaryColor: c, secondaryColor: u, transform: d, position: f }), s++;
1311
1351
  }
1312
- return s;
1352
+ return r;
1313
1353
  }
1314
1354
  }
1315
- class pt {
1316
- hi(t, e) {
1317
- const s = t.cmap;
1318
- for (const i of s.qt) if (i.format === 4) {
1319
- for (let r = 0; r < i.re.length; r++) if (e >= i.re[r] && e <= i.se[r]) {
1320
- if (i.oe[r] === 0) return e + i.ie[r] & 65535;
1355
+ class mt {
1356
+ ie(t, e) {
1357
+ const r = t.cmap;
1358
+ for (const s of r.tables) if (s.format === 4) {
1359
+ for (let i = 0; i < s.startCount.length; i++) if (e >= s.startCount[i] && e <= s.endCount[i]) {
1360
+ if (s.idRangeOffset[i] === 0) return e + s.idDelta[i] & 65535;
1321
1361
  {
1322
- const o = i.oe[r] / 2 + (e - i.re[r]) - (i.re.length - r);
1323
- if (o >= 0 && o < i.ne.length) {
1324
- const n = i.ne[o];
1325
- if (n !== 0) return n + i.ie[r] & 65535;
1362
+ const o = s.idRangeOffset[i] / 2 + (e - s.startCount[i]) - (s.startCount.length - i);
1363
+ if (o >= 0 && o < s.glyphIdArray.length) {
1364
+ const n = s.glyphIdArray[o];
1365
+ if (n !== 0) return n + s.idDelta[i] & 65535;
1326
1366
  }
1327
1367
  }
1328
1368
  }
1329
1369
  }
1330
1370
  return 0;
1331
1371
  }
1332
- ai(t, e, s, i, r) {
1333
- const o = r / t.head.unitsPerEm;
1334
- return { li: () => ({ x1: s + e.xMin * o, y1: i + -e.yMax * o, x2: s + e.xMax * o, y2: i + -e.yMin * o }), ci: () => this.ui(e, s, i, o) };
1372
+ Vr(t, e, r, s, i) {
1373
+ const o = i / t.head.unitsPerEm;
1374
+ return { getBoundingBox: () => ({ x1: r + e.xMin * o, y1: s + -e.yMax * o, x2: r + e.xMax * o, y2: s + -e.yMin * o }), toSVG: () => this.kr(e, r, s, o) };
1335
1375
  }
1336
- ui(t, e, s, i) {
1337
- if (!t || !t.fe) return "";
1338
- const { fe: r, de: o, ue: n, flags: l } = t;
1339
- if (!(r && o && n && l)) return "";
1376
+ kr(t, e, r, s) {
1377
+ if (!t || !t.xs) return "";
1378
+ const { xs: i, ys: o, endPts: n, flags: l } = t;
1379
+ if (!(i && o && n && l)) return "";
1340
1380
  let c = "", u = 0;
1341
1381
  for (let d = 0; d < n.length; d++) {
1342
1382
  const f = n[d];
1343
1383
  if (!(f < u)) {
1344
1384
  if (f >= u) {
1345
- const p = e + r[u] * i, _ = s - o[u] * i;
1346
- c += `M${p.toFixed(2)},${_.toFixed(2)}`;
1347
- let m = u + 1;
1348
- for (; m <= f; )
1349
- if (1 & l[m]) {
1350
- const x = e + r[m] * i, y = s - o[m] * i;
1351
- c += `L${x.toFixed(2)},${y.toFixed(2)}`, m++;
1385
+ const m = e + i[u] * s, v = r - o[u] * s;
1386
+ c += `M${m.toFixed(2)},${v.toFixed(2)}`;
1387
+ let p = u + 1;
1388
+ for (; p <= f; )
1389
+ if (1 & l[p]) {
1390
+ const x = e + i[p] * s, _ = r - o[p] * s;
1391
+ c += `L${x.toFixed(2)},${_.toFixed(2)}`, p++;
1352
1392
  } else {
1353
- const x = e + r[m] * i, y = s - o[m] * i;
1354
- let b = m + 1 > f ? u : m + 1;
1355
- if (1 & l[b]) {
1356
- const R = e + r[b] * i, E = s - o[b] * i;
1357
- c += `Q${x.toFixed(2)},${y.toFixed(2)} ${R.toFixed(2)},${E.toFixed(2)}`, m = b + 1;
1393
+ const x = e + i[p] * s, _ = r - o[p] * s;
1394
+ let w = p + 1 > f ? u : p + 1;
1395
+ if (1 & l[w]) {
1396
+ const T = e + i[w] * s, E = r - o[w] * s;
1397
+ c += `Q${x.toFixed(2)},${_.toFixed(2)} ${T.toFixed(2)},${E.toFixed(2)}`, p = w + 1;
1358
1398
  } else {
1359
- const R = (x + (e + r[b] * i)) / 2, E = (y + (s - o[b] * i)) / 2;
1360
- c += `Q${x.toFixed(2)},${y.toFixed(2)} ${R.toFixed(2)},${E.toFixed(2)}`, m = b;
1399
+ const T = (x + (e + i[w] * s)) / 2, E = (_ + (r - o[w] * s)) / 2;
1400
+ c += `Q${x.toFixed(2)},${_.toFixed(2)} ${T.toFixed(2)},${E.toFixed(2)}`, p = w;
1361
1401
  }
1362
1402
  }
1363
1403
  c += "Z";
@@ -1367,22 +1407,22 @@ class pt {
1367
1407
  }
1368
1408
  return c;
1369
1409
  }
1370
- fi(t, e, s, i, r) {
1371
- const o = t.codePointAt(0) || 0, n = this.hi(e, o);
1410
+ zr(t, e, r, s, i) {
1411
+ const o = t.codePointAt(0) || 0, n = this.ie(e, o);
1372
1412
  let l = null;
1373
- return e.glyf && e.glyf[n] !== null ? l = e.glyf[n] : g && g.T && g.T.glyf && g.T.glyf.le && (l = g.T.glyf.le(e, n), e.glyf && l && (e.glyf[n] = l)), this.ai(e, l, s, i, r);
1413
+ return e.glyf && e.glyf[n] !== null ? l = e.glyf[n] : g && g.T && g.T.glyf && g.T.glyf.jt && (l = g.T.glyf.jt(e, n), e.glyf && l && (e.glyf[n] = l)), this.Vr(e, l, r, s, i);
1374
1414
  }
1375
- di(t, e, s, i, r, o, n, l) {
1376
- const c = s + (r - l * (n / e.head.unitsPerEm)) / 2, u = i + (o + 0.7 * n) / 2;
1377
- return this.fi(t, e, c, u, n).ci() || null;
1415
+ Ir(t, e, r, s, i, o, n, l) {
1416
+ const c = r + (i - l * (n / e.head.unitsPerEm)) / 2, u = s + (o + 0.7 * n) / 2;
1417
+ return this.zr(t, e, c, u, n).toSVG() || null;
1378
1418
  }
1379
1419
  }
1380
- class _t {
1420
+ class vt {
1381
1421
  constructor() {
1382
- a(this, "mi");
1383
- this.mi = new pt();
1422
+ h(this, "Pr");
1423
+ this.Pr = new mt();
1384
1424
  }
1385
- gi(t) {
1425
+ Ur(t) {
1386
1426
  return `<?xml version="1.0" encoding="UTF-8" standalone="no"?>
1387
1427
  <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
1388
1428
  <svg width="${t.width}" height="${t.height}" viewBox="0 0 ${t.width} ${t.height}"
@@ -1390,175 +1430,175 @@ class _t {
1390
1430
  <title>textmode art generated via textmode.js</title>
1391
1431
  <desc>textmode art visualization generated by textmode.js library</desc>`;
1392
1432
  }
1393
- pi() {
1433
+ Ar() {
1394
1434
  return `
1395
1435
  </g>
1396
1436
  </svg>`;
1397
1437
  }
1398
- _i(t, e) {
1399
- if (!e.xi) return "";
1400
- const s = e.backgroundColor, i = `rgba(${s[0]},${s[1]},${s[2]},${s[3] / 255})`;
1438
+ Gr(t, e) {
1439
+ if (!e.includeBackgroundRectangles) return "";
1440
+ const r = e.backgroundColor, s = `rgba(${r[0]},${r[1]},${r[2]},${r[3] / 255})`;
1401
1441
  return `
1402
- <rect width="${t.width}" height="${t.height}" fill="${i}" />`;
1442
+ <rect width="${t.width}" height="${t.height}" fill="${s}" />`;
1403
1443
  }
1404
- bi(t) {
1444
+ Er(t) {
1405
1445
  return `rgba(${t.r},${t.g},${t.b},${t.a / 255})`;
1406
1446
  }
1407
- wi(t, e) {
1408
- const { transform: s, position: i } = t, r = i.si + e.$s / 2, o = i.ri + e.Ds / 2, n = [];
1409
- if (s.Kr || s.ti) {
1410
- const l = s.Kr ? -1 : 1, c = s.ti ? -1 : 1;
1411
- n.push(`translate(${r} ${o})`), n.push(`scale(${l} ${c})`), n.push(`translate(${-r} ${-o})`);
1447
+ Lr(t, e) {
1448
+ const { transform: r, position: s } = t, i = s.cellX + e.cellWidth / 2, o = s.cellY + e.cellHeight / 2, n = [];
1449
+ if (r.flipHorizontal || r.flipVertical) {
1450
+ const l = r.flipHorizontal ? -1 : 1, c = r.flipVertical ? -1 : 1;
1451
+ n.push(`translate(${i} ${o})`), n.push(`scale(${l} ${c})`), n.push(`translate(${-i} ${-o})`);
1412
1452
  }
1413
- return s.rotation && n.push(`rotate(${s.rotation} ${r} ${o})`), n.length ? ` transform="${n.join(" ")}"` : "";
1414
- }
1415
- Ci(t, e, s) {
1416
- if (!s.xi || t.ni.a === 0) return "";
1417
- const { position: i } = t, r = this.bi(t.ni);
1418
- return s.yi === "stroke" ? `
1419
- <rect x="${i.si}" y="${i.ri}" width="${e.$s}" height="${e.Ds}" stroke="${r}" fill="none" stroke-width="${s.strokeWidth}" />` : `
1420
- <rect x="${i.si}" y="${i.ri}" width="${e.$s}" height="${e.Ds}" fill="${r}" />`;
1421
- }
1422
- fi(t, e, s, i) {
1423
- const r = s.hs[t.charIndex];
1424
- if (!r) return "";
1425
- const o = this.mi.di(r.Se, s.font, t.position.si, t.position.ri, e.$s, e.Ds, s.fontSize, r.Ae);
1453
+ return r.rotation && n.push(`rotate(${r.rotation} ${i} ${o})`), n.length ? ` transform="${n.join(" ")}"` : "";
1454
+ }
1455
+ Br(t, e, r) {
1456
+ if (!r.includeBackgroundRectangles || t.secondaryColor.a === 0) return "";
1457
+ const { position: s } = t, i = this.Er(t.secondaryColor);
1458
+ return r.drawMode === "stroke" ? `
1459
+ <rect x="${s.cellX}" y="${s.cellY}" width="${e.cellWidth}" height="${e.cellHeight}" stroke="${i}" fill="none" stroke-width="${r.strokeWidth}" />` : `
1460
+ <rect x="${s.cellX}" y="${s.cellY}" width="${e.cellWidth}" height="${e.cellHeight}" fill="${i}" />`;
1461
+ }
1462
+ zr(t, e, r, s) {
1463
+ const i = r.characters[t.charIndex];
1464
+ if (!i) return "";
1465
+ const o = this.Pr.Ir(i.character, r.font, t.position.cellX, t.position.cellY, e.cellWidth, e.cellHeight, r.fontSize, i.advanceWidth);
1426
1466
  if (!o) return "";
1427
- const n = this.bi(t.oi);
1428
- return i.yi === "stroke" ? `
1429
- <path id="${`path-${t.charIndex}-${t.position.si}-${t.position.ri}`.replace(/\./g, "-")}" d="${o}" stroke="${n}" stroke-width="${i.strokeWidth}" fill="none" />` : `
1467
+ const n = this.Er(t.primaryColor);
1468
+ return s.drawMode === "stroke" ? `
1469
+ <path id="${`path-${t.charIndex}-${t.position.cellX}-${t.position.cellY}`.replace(/\./g, "-")}" d="${o}" stroke="${n}" stroke-width="${s.strokeWidth}" fill="none" />` : `
1430
1470
  <path d="${o}" fill="${n}" />`;
1431
1471
  }
1432
- Fi(t, e, s, i) {
1433
- let r = "";
1434
- r += this.Ci(t, e, i);
1435
- const o = this.wi(t, e), n = this.fi(t, e, s, i);
1436
- return n && (o ? (r += `
1437
- <g${o}>`, r += n, r += `
1438
- </g>`) : r += n), r;
1439
- }
1440
- Ti(t, e, s, i) {
1441
- let r = this.gi(e);
1442
- r += this._i(e, i), r += `
1472
+ Hr(t, e, r, s) {
1473
+ let i = "";
1474
+ i += this.Br(t, e, s);
1475
+ const o = this.Lr(t, e), n = this.zr(t, e, r, s);
1476
+ return n && (o ? (i += `
1477
+ <g${o}>`, i += n, i += `
1478
+ </g>`) : i += n), i;
1479
+ }
1480
+ Or(t, e, r, s) {
1481
+ let i = this.Ur(e);
1482
+ i += this.Gr(e, s), i += `
1443
1483
  <g id="ascii-cells">`;
1444
- for (const o of t) r += this.Fi(o, e, s, i);
1445
- return r += this.pi(), r;
1484
+ for (const o of t) i += this.Hr(o, e, r, s);
1485
+ return i += this.Ar(), i;
1446
1486
  }
1447
- $i(t) {
1487
+ jr(t) {
1448
1488
  return t.replace(/<path[^>]*d=""[^>]*\/>/g, "").replace(/\n\s*\n/g, `
1449
1489
  `).replace(/[ \t]+$/gm, "");
1450
1490
  }
1451
1491
  }
1452
- class xt extends z {
1453
- Di(t) {
1454
- return this.jr(t, "image/svg+xml;charset=utf-8");
1492
+ class xt extends L {
1493
+ Wr(t) {
1494
+ return this.Cr(t, "image/svg+xml;charset=utf-8");
1455
1495
  }
1456
- Mi(t, e) {
1457
- this.Wr(t, this.qr(e) + ".svg", "image/svg+xml;charset=utf-8");
1496
+ Nr(t, e) {
1497
+ this.yr(t, this.Tr(e) + ".svg", "image/svg+xml;charset=utf-8");
1458
1498
  }
1459
- Si(t, e) {
1460
- this.Mi(t, e || this.Qr());
1499
+ Xr(t, e) {
1500
+ this.Nr(t, e || this.Dr());
1461
1501
  }
1462
1502
  }
1463
1503
  class V {
1464
1504
  constructor() {
1465
- a(this, "Vi");
1466
- a(this, "Ri");
1467
- a(this, "ki");
1468
- this.Vi = new mt(), this.Ri = new _t(), this.ki = new xt();
1505
+ h(this, "qr");
1506
+ h(this, "Yr");
1507
+ h(this, "Qr");
1508
+ this.qr = new pt(), this.Yr = new vt(), this.Qr = new xt();
1469
1509
  }
1470
- zi(t) {
1471
- return { xi: t.xi ?? !0, yi: t.yi ?? "fill", strokeWidth: t.strokeWidth ?? 1, backgroundColor: t.backgroundColor ?? [0, 0, 0, 0] };
1510
+ Zr(t) {
1511
+ return { includeBackgroundRectangles: t.includeBackgroundRectangles ?? !0, drawMode: t.drawMode ?? "fill", strokeWidth: t.strokeWidth ?? 1, backgroundColor: t.backgroundColor ?? [0, 0, 0, 0] };
1472
1512
  }
1473
- Ii(t, e = {}) {
1474
- const s = this.zi(e), i = this.Vi.Ar(t.Pi), r = this.Vi.ii(i, t.grid), o = this.Ri.Ti(r, t.grid, t.font, s);
1475
- return this.Ri.$i(o);
1513
+ Jr(t, e = {}) {
1514
+ const r = this.Zr(e), s = this.qr.vr(t.pipeline), i = this.qr.Rr(s, t.grid), o = this.Yr.Or(i, t.grid, t.font, r);
1515
+ return this.Yr.jr(o);
1476
1516
  }
1477
- Si(t, e = {}) {
1478
- const s = this.Ii(t, e), i = e.filename || this.ki.Qr();
1479
- this.ki.Si(s, i);
1517
+ Xr(t, e = {}) {
1518
+ const r = this.Jr(t, e), s = e.filename || this.Qr.Dr();
1519
+ this.Qr.Xr(r, s);
1480
1520
  }
1481
1521
  }
1482
- class vt extends I {
1483
- Ai(t, e, s, i = " ") {
1522
+ class bt extends j {
1523
+ Kr(t, e, r, s = " ") {
1484
1524
  var n;
1485
- const r = [];
1525
+ const i = [];
1486
1526
  let o = 0;
1487
1527
  for (let l = 0; l < e.rows; l++) {
1488
1528
  const c = [];
1489
1529
  for (let u = 0; u < e.cols; u++) {
1490
- const d = 4 * o, f = this.Hr(t.Ur, d), p = ((n = s.hs[f]) == null ? void 0 : n.Se) || i;
1491
- c.push(p), o++;
1530
+ const d = 4 * o, f = this.br(t.characterPixels, d), m = ((n = r.characters[f]) == null ? void 0 : n.character) || s;
1531
+ c.push(m), o++;
1492
1532
  }
1493
- r.push(c);
1533
+ i.push(c);
1494
1534
  }
1495
- return r;
1535
+ return i;
1496
1536
  }
1497
1537
  }
1498
- class wt {
1499
- Ui(t, e) {
1500
- const s = [];
1501
- for (const r of t) {
1502
- let o = r.join("");
1503
- e.Gi || (o = o.replace(/\s+$/, "")), s.push(o);
1538
+ class Ct {
1539
+ ts(t, e) {
1540
+ const r = [];
1541
+ for (const i of t) {
1542
+ let o = i.join("");
1543
+ e.preserveTrailingSpaces || (o = o.replace(/\s+$/, "")), r.push(o);
1504
1544
  }
1505
- const i = e.Ei === "crlf" ? `\r
1545
+ const s = e.lineEnding === "crlf" ? `\r
1506
1546
  ` : `
1507
1547
  `;
1508
- return s.join(i);
1548
+ return r.join(s);
1509
1549
  }
1510
1550
  }
1511
- class bt extends z {
1512
- Li(t, e) {
1513
- const s = this.Bi(e);
1514
- this.Wr(t, s, "text/plain;charset=utf-8");
1551
+ class wt extends L {
1552
+ es(t, e) {
1553
+ const r = this.rs(e);
1554
+ this.yr(t, r, "text/plain;charset=utf-8");
1515
1555
  }
1516
- Bi(t) {
1517
- let e = this.qr(t);
1518
- return e === ".txt" || e.length <= 4 ? this.Qr() : e;
1556
+ rs(t) {
1557
+ let e = this.Tr(t);
1558
+ return e === ".txt" || e.length <= 4 ? this.Dr() : e;
1519
1559
  }
1520
1560
  }
1521
- class G {
1561
+ class Y {
1522
1562
  constructor() {
1523
- a(this, "Vi");
1524
- a(this, "Ri");
1525
- a(this, "ki");
1526
- this.Vi = new vt(), this.Ri = new wt(), this.ki = new bt();
1563
+ h(this, "qr");
1564
+ h(this, "Yr");
1565
+ h(this, "Qr");
1566
+ this.qr = new bt(), this.Yr = new Ct(), this.Qr = new wt();
1527
1567
  }
1528
- zi(t) {
1529
- return { Gi: t.Gi ?? !1, Ei: t.Ei ?? "lf", Hi: t.Hi ?? " " };
1568
+ Zr(t) {
1569
+ return { preserveTrailingSpaces: t.preserveTrailingSpaces ?? !1, lineEnding: t.lineEnding ?? "lf", emptyCharacter: t.emptyCharacter ?? " " };
1530
1570
  }
1531
- Oi(t, e = {}) {
1532
- const s = this.zi(e), i = this.Vi.Ar(t.Pi), r = this.Vi.Ai(i, t.grid, t.font, s.Hi);
1533
- return this.Ri.Ui(r, s);
1571
+ ss(t, e = {}) {
1572
+ const r = this.Zr(e), s = this.qr.vr(t.pipeline), i = this.qr.Kr(s, t.grid, t.font, r.emptyCharacter);
1573
+ return this.Yr.ts(i, r);
1534
1574
  }
1535
- Li(t, e = {}) {
1536
- const s = this.Oi(t, e), i = e.filename || this.ki.Qr();
1537
- this.ki.Li(s, i);
1575
+ es(t, e = {}) {
1576
+ const r = this.ss(t, e), s = e.filename || this.Qr.Dr();
1577
+ this.Qr.es(r, s);
1538
1578
  }
1539
1579
  }
1540
- class yt extends I {
1541
- ji(t, e = 1, s = "transparent") {
1542
- const i = t.canvas;
1543
- if (e === 1 && s === "transparent") return i;
1544
- const r = document.createElement("canvas"), o = r.getContext("2d"), n = Math.round(i.width * e), l = Math.round(i.height * e);
1545
- return r.width = n, r.height = l, s !== "transparent" && (o.fillStyle = s, o.fillRect(0, 0, n, l)), o.imageSmoothingEnabled = !1, o.drawImage(i, 0, 0, i.width, i.height, 0, 0, n, l), r;
1580
+ class _t extends j {
1581
+ ns(t, e = 1, r = "transparent") {
1582
+ const s = t.canvas;
1583
+ if (e === 1 && r === "transparent") return s;
1584
+ const i = document.createElement("canvas"), o = i.getContext("2d"), n = Math.round(s.width * e), l = Math.round(s.height * e);
1585
+ return i.width = n, i.height = l, r !== "transparent" && (o.fillStyle = r, o.fillRect(0, 0, n, l)), o.imageSmoothingEnabled = !1, o.drawImage(s, 0, 0, s.width, s.height, 0, 0, n, l), i;
1546
1586
  }
1547
1587
  }
1548
- class Tt {
1549
- Wi(t, e) {
1550
- const s = this.Ni(e.format);
1551
- return e.format === "png" ? t.toDataURL(s) : t.toDataURL(s, e.Xi);
1552
- }
1553
- async Yi(t, e) {
1554
- return new Promise((s, i) => {
1555
- const r = this.Ni(e.format), o = (n) => {
1556
- n ? s(n) : i(Error(`Failed to generate ${e.format.toUpperCase()} blob`));
1588
+ class yt {
1589
+ hs(t, e) {
1590
+ const r = this.ls(e.format);
1591
+ return e.format === "png" ? t.toDataURL(r) : t.toDataURL(r, e.quality);
1592
+ }
1593
+ async cs(t, e) {
1594
+ return new Promise((r, s) => {
1595
+ const i = this.ls(e.format), o = (n) => {
1596
+ n ? r(n) : s(Error(`Failed to generate ${e.format.toUpperCase()} blob`));
1557
1597
  };
1558
- e.format === "png" ? t.toBlob(o, r) : t.toBlob(o, r, e.Xi);
1598
+ e.format === "png" ? t.toBlob(o, i) : t.toBlob(o, i, e.quality);
1559
1599
  });
1560
1600
  }
1561
- Ni(t) {
1601
+ ls(t) {
1562
1602
  switch (t) {
1563
1603
  case "png":
1564
1604
  return "image/png";
@@ -1571,274 +1611,263 @@ class Tt {
1571
1611
  }
1572
1612
  }
1573
1613
  }
1574
- const j = { qi: "image/png", Qi: "image/jpeg", Zi: "image/webp" }, B = { qi: ".png", Qi: ".jpg", Zi: ".webp" };
1575
- class Ct extends z {
1576
- Ji(t, e, s) {
1577
- this.Ki(t, this.qr(e) + B[s]);
1614
+ const Tt = { png: "image/png", jpg: "image/jpeg", webp: "image/webp" }, G = { png: ".png", jpg: ".jpg", webp: ".webp" };
1615
+ class Et extends L {
1616
+ us(t, e, r) {
1617
+ this.fs(t, this.Tr(e) + G[r]);
1578
1618
  }
1579
- Ki(t, e) {
1580
- const s = URL.createObjectURL(t);
1619
+ fs(t, e) {
1620
+ const r = URL.createObjectURL(t);
1581
1621
  try {
1582
- const i = document.createElement("a");
1583
- i.href = s, i.download = e, i.style.display = "none", i.rel = "noopener", document.body.appendChild(i), i.click(), document.body.removeChild(i);
1622
+ const s = document.createElement("a");
1623
+ s.href = r, s.download = e, s.style.display = "none", s.rel = "noopener", document.body.appendChild(s), s.click(), document.body.removeChild(s);
1584
1624
  } finally {
1585
- URL.revokeObjectURL(s);
1625
+ URL.revokeObjectURL(r);
1586
1626
  }
1587
1627
  }
1588
- eo(t) {
1589
- return t in j && t in B;
1590
- }
1591
- Ni(t) {
1592
- return j[t];
1593
- }
1594
- so(t) {
1595
- return B[t];
1628
+ ds(t) {
1629
+ return t in Tt && t in G;
1596
1630
  }
1597
1631
  }
1598
- class Rt {
1632
+ class Pt {
1599
1633
  constructor() {
1600
- a(this, "Vi");
1601
- a(this, "Ri");
1602
- a(this, "ki");
1603
- this.Vi = new yt(), this.Ri = new Tt(), this.ki = new Ct();
1634
+ h(this, "qr");
1635
+ h(this, "Yr");
1636
+ h(this, "Qr");
1637
+ this.qr = new _t(), this.Yr = new yt(), this.Qr = new Et();
1604
1638
  }
1605
- zi(t) {
1606
- return { format: t.format ?? "png", Xi: t.Xi ?? 1, scale: t.scale ?? 1, backgroundColor: t.backgroundColor ?? "transparent" };
1639
+ Zr(t) {
1640
+ return { format: t.format ?? "png", quality: t.quality ?? 1, scale: t.scale ?? 1, backgroundColor: t.backgroundColor ?? "transparent" };
1607
1641
  }
1608
- ro(t) {
1609
- if (console.log("Validating image export options:", t), !this.ki.eo(t.format)) throw Error(`Saving '${t.format}' files is not supported`);
1610
- if (t.Xi < 0 || t.Xi > 1) throw Error("Image quality must be between 0.0 and 1.0");
1642
+ gs(t) {
1643
+ if (console.log("Validating image export options:", t), !this.Qr.ds(t.format)) throw Error(`Saving '${t.format}' files is not supported`);
1644
+ if (t.quality < 0 || t.quality > 1) throw Error("Image quality must be between 0.0 and 1.0");
1611
1645
  if (t.scale <= 0) throw Error("Scale factor must be greater than 0");
1612
1646
  t.scale > 10 && console.warn("Large scale factors may result in very large files and slow performance"), t.format === "jpg" && t.backgroundColor === "transparent" && (t.backgroundColor = "black");
1613
1647
  }
1614
- io(t, e = {}) {
1615
- const s = this.zi(e);
1616
- if (this.ro(s), s.scale === 1 && s.backgroundColor === "transparent") return this.Ri.Wi(t.canvas, s);
1617
- const i = this.Vi.ji(t, s.scale, s.backgroundColor);
1618
- return this.Ri.Wi(i, s);
1648
+ ps(t, e = {}) {
1649
+ const r = this.Zr(e);
1650
+ if (this.gs(r), r.scale === 1 && r.backgroundColor === "transparent") return this.Yr.hs(t.canvas, r);
1651
+ const s = this.qr.ns(t, r.scale, r.backgroundColor);
1652
+ return this.Yr.hs(s, r);
1619
1653
  }
1620
- async Yi(t, e = {}) {
1621
- const s = this.zi(e);
1622
- if (this.ro(s), s.scale === 1 && s.backgroundColor === "transparent") return await this.Ri.Yi(t.canvas, s);
1623
- const i = this.Vi.ji(t, s.scale, s.backgroundColor);
1624
- return await this.Ri.Yi(i, s);
1654
+ async cs(t, e = {}) {
1655
+ const r = this.Zr(e);
1656
+ if (this.gs(r), r.scale === 1 && r.backgroundColor === "transparent") return await this.Yr.cs(t.canvas, r);
1657
+ const s = this.qr.ns(t, r.scale, r.backgroundColor);
1658
+ return await this.Yr.cs(s, r);
1625
1659
  }
1626
- async Ji(t, e = {}) {
1627
- const s = await this.Yi(t, e), i = e.format ?? "png", r = e.filename || this.ki.Qr();
1628
- this.ki.Ji(s, r, i);
1660
+ async us(t, e = {}) {
1661
+ const r = await this.cs(t, e), s = e.format ?? "png", i = e.filename || this.Qr.Dr();
1662
+ this.Qr.us(r, i, s);
1629
1663
  }
1630
1664
  }
1631
- const Et = (h) => class extends h {
1665
+ const Rt = (a) => class extends a {
1632
1666
  toString(t = {}) {
1633
- return new G().Oi(this, t);
1667
+ return new Y().ss(this, t);
1634
1668
  }
1635
- oo(t = {}) {
1636
- new G().Li(this, t);
1669
+ saveStrings(t = {}) {
1670
+ new Y().es(this, t);
1637
1671
  }
1638
- ci(t = {}) {
1639
- return new V().Ii(this, t);
1672
+ toSVG(t = {}) {
1673
+ return new V().Jr(this, t);
1640
1674
  }
1641
- Si(t = {}) {
1642
- new V().Si(this, t);
1675
+ saveSVG(t = {}) {
1676
+ new V().Xr(this, t);
1643
1677
  }
1644
- async no(t, e = "png", s = {}) {
1645
- await new Rt().Ji(this.ho, { ...s, filename: t, format: e });
1678
+ async saveCanvas(t, e = "png", r = {}) {
1679
+ await new Pt().us(this.Me, { ...r, filename: t, format: e });
1646
1680
  }
1647
- }, Ft = (h) => class extends h {
1648
- async ss(t) {
1649
- return this.Le.ss(t).then(() => {
1650
- const e = this.Le.us;
1651
- this.ao.Cs(e.width, e.height), this.lo.resize();
1681
+ }, Ft = (a) => class extends a {
1682
+ async loadFont(t) {
1683
+ return this.oe.Ce(t).then(() => {
1684
+ const e = this.oe.maxGlyphDimensions;
1685
+ this.je.ke(e.width, e.height), this._s.Pe();
1652
1686
  });
1653
1687
  }
1654
1688
  fontSize(t) {
1655
- if (!w.validate(typeof t == "number" && t > 0, "Font size must be a positive number greater than 0.", { method: "fontSize", Ge: t }) || this.Le.fontSize === t) return;
1656
- this.Le.es(t);
1657
- const e = this.Le.us;
1658
- this.ao.Cs(e.width, e.height), this.lo.resize(), this.ye.Bt();
1689
+ if (!C.p(typeof t == "number" && t > 0, "Font size must be a positive number greater than 0.", { method: "fontSize", providedValue: t }) || this.oe.fontSize === t) return;
1690
+ this.oe.we(t);
1691
+ const e = this.oe.maxGlyphDimensions;
1692
+ this.je.ke(e.width, e.height), this._s.Pe(), this.Zt.Ht();
1659
1693
  }
1660
- }, Mt = (h) => class extends h {
1661
- co(t) {
1662
- return this.lo.add(t);
1694
+ }, Mt = (a) => class extends a {
1695
+ addConverter(t) {
1696
+ return this._s.add(t);
1663
1697
  }
1664
- uo(t) {
1665
- this.lo.remove(t);
1698
+ removeConverter(t) {
1699
+ this._s.remove(t);
1666
1700
  }
1667
1701
  };
1668
- class Lt {
1702
+ class At {
1669
1703
  constructor() {
1670
- a(this, "ye");
1671
- a(this, "Le");
1672
- a(this, "lo");
1673
- a(this, "ho");
1674
- a(this, "ao");
1704
+ h(this, "Zt");
1705
+ h(this, "oe");
1706
+ h(this, "_s");
1707
+ h(this, "Me");
1708
+ h(this, "je");
1675
1709
  }
1676
1710
  }
1677
- class H extends function(e, ...s) {
1678
- return s.reduce((i, r) => r(i), e);
1679
- }(Lt, gt, Et, Ft, Mt) {
1680
- constructor(e = null, s = {}) {
1711
+ class O extends function(e, ...r) {
1712
+ return r.reduce((s, i) => i(s), e);
1713
+ }(At, gt, Rt, Ft, Mt) {
1714
+ constructor(e = null, r = {}) {
1681
1715
  super();
1682
- a(this, "Ms");
1683
- a(this, "fo");
1684
- a(this, "Vs");
1685
- a(this, "do");
1686
- a(this, "mo");
1687
- a(this, "po", null);
1688
- a(this, "vo", 0);
1689
- a(this, "_o");
1690
- a(this, "xo", !0);
1691
- a(this, "bo", 0);
1692
- a(this, "wo", 0);
1693
- a(this, "Co", 0);
1694
- a(this, "yo", []);
1695
- a(this, "Fo", 10);
1696
- a(this, "To", !1);
1697
- a(this, "$o", !1);
1698
- a(this, "Do", () => {
1716
+ h(this, "Ae");
1717
+ h(this, "vs");
1718
+ h(this, "Ee");
1719
+ h(this, "bs");
1720
+ h(this, "ws");
1721
+ h(this, "Cs", null);
1722
+ h(this, "$s", 0);
1723
+ h(this, "Fs");
1724
+ h(this, "Ts", !0);
1725
+ h(this, "Ds", 0);
1726
+ h(this, "Ms", 0);
1727
+ h(this, "Ss", 0);
1728
+ h(this, "Rs", []);
1729
+ h(this, "Vs", 10);
1730
+ h(this, "ks", !1);
1731
+ h(this, "zs", !1);
1732
+ h(this, "Is", () => {
1699
1733
  });
1700
- a(this, "Mo", () => {
1734
+ h(this, "Ps", () => {
1701
1735
  });
1702
- a(this, "So");
1703
- a(this, "Vo", !1);
1704
- this.Ms = e, this.$o = e === null, this.do = s.Ro ?? "auto", this.mo = s.ko ?? 60, this._o = 1e3 / this.mo;
1736
+ h(this, "Us");
1737
+ this.Ae = e, this.zs = e === null, this.bs = r.renderMode ?? "auto", this.ws = r.frameRate ?? 60, this.Fs = 1e3 / this.ws;
1705
1738
  }
1706
- static async create(e = null, s = {}) {
1707
- const i = new this(e, s), r = i.$o ? s : void 0;
1739
+ static async create(e = null, r = {}) {
1740
+ const s = new this(e, r), i = s.zs ? r : void 0;
1708
1741
  let o, n;
1709
- i.ho = new ct(i.Ms, i.$o, r), i.ye = new it(i.ho.Ps()), i.$o ? (o = s.width || 800, n = s.height || 600) : (o = i.ho.width || 800, n = i.ho.height || 600), i.fo = i.ye.createFramebuffer(o, n), i.Le = new at(i.ye, s.fontSize ?? 16), await i.Le.initialize(s.zo);
1710
- const l = i.Le.us;
1711
- return i.ao = new lt(i.ho.canvas, l.width, l.height), i.lo = new ft(i.ye, i.Le, i.ao), i.Io(), i.Po(), i;
1712
- }
1713
- Io() {
1714
- this.So = () => {
1715
- this.$o ? this.Mo() : this.resize();
1716
- }, window.addEventListener("resize", this.So), window.ResizeObserver && this.Ms && !this.$o && (this.Vs = new ResizeObserver(() => {
1717
- this.resize();
1718
- }), this.Vs.observe(this.Ms));
1719
- }
1720
- zr() {
1721
- if (this.Ao(), this.Co++, this.To) console.warn("Cannot render: Required resources have been disposed");
1722
- else if (this.$o ? (this.fo.P(), this.Do(), this.fo.end()) : this.fo.update(this.Ms), this.lo.Pr() ? (this.lo.zr(this.fo), this.ye.background(0), this.ye.image(this.lo.texture, this.ao.offsetX, this.ao.offsetY, this.lo.texture.width, this.lo.texture.height)) : (this.ye.clear(), this.ye.image(this.fo, this.ao.offsetX, this.ao.offsetY, this.fo.width, this.fo.height)), this.Vo) {
1723
- let e = 0;
1724
- this.ye.image(this.lo.Xs, e, 0, this.lo.Xs.width, this.lo.Xs.height), e += this.lo.Xs.width, this.ye.image(this.lo.Ys, e, 0, this.lo.Ys.width, this.lo.Ys.height), e += this.lo.Ys.width, this.ye.image(this.lo.qs, e, 0, this.lo.qs.width, this.lo.qs.height), e += this.lo.qs.width, this.ye.image(this.lo.Zs, e, 0, this.lo.Zs.width, this.lo.Zs.height), e += this.lo.Zs.width, this.ye.image(this.lo.Qs, e, 0, this.lo.Qs.width, this.lo.Qs.height);
1725
- }
1726
- }
1727
- resize() {
1728
- this.ho.resize(), this.fo.resize(this.ho.width, this.ho.height), this.ao.resize(), this.lo.resize(), this.ye.Bt(), this.do !== "manual" && this.zr();
1729
- }
1730
- Po() {
1731
- if (this.do !== "auto" || !this.xo) return;
1732
- this.vo = performance.now();
1733
- const e = (s) => {
1734
- if (!this.xo) return void (this.po = null);
1735
- const i = s - this.vo;
1736
- i >= this._o && (this.zr(), this.vo = s - i % this._o), this.xo && (this.po = requestAnimationFrame(e));
1742
+ s.Me = new ct(s.captureSource, s.zs, i), s.Zt = new st(s.Me.He()), s.zs ? (o = r.width || 800, n = r.height || 600) : (o = s.Me.width || 800, n = s.Me.height || 600), s.vs = s.Zt.Et(o, n), s.oe = new ht(s.Zt, r.fontSize ?? 16), await s.oe.ve(r.fontSource);
1743
+ const l = s.oe.maxGlyphDimensions;
1744
+ return s.je = new lt(s.Me.canvas, l.width, l.height), s._s = new ft(s.Zt, s.oe, s.je), s.As(), s.Gs(), s;
1745
+ }
1746
+ As() {
1747
+ this.Us = () => {
1748
+ this.zs ? this.Ps() : this.Es();
1749
+ }, window.addEventListener("resize", this.Us), window.ResizeObserver && this.Ae && !this.zs && (this.Ee = new ResizeObserver(() => {
1750
+ this.Es();
1751
+ }), this.Ee.observe(this.Ae));
1752
+ }
1753
+ render() {
1754
+ this.Ls(), this.Ss++, this.ks ? console.warn("Cannot render: Required resources have been disposed") : (this.zs ? (this.vs.begin(), this.Is(), this.vs.end()) : this.vs.update(this.Ae), this._s.hasEnabledConverters() ? (this._s._r(this.vs), this.Zt.Lt(0), this.Zt.Ot(this._s.texture, this.je.offsetX, this.je.offsetY, this._s.texture.width, this._s.texture.height)) : (this.Zt.Bt(), this.Zt.Ot(this.vs, this.je.offsetX, this.je.offsetY, this.vs.width, this.vs.height)));
1755
+ }
1756
+ Es() {
1757
+ this.Me.Pe(), this.vs.resize(this.Me.width, this.Me.height), this.je.Pe(), this._s.Pe(), this.Zt.Ht(), this.bs !== "manual" && this.render();
1758
+ }
1759
+ Gs() {
1760
+ if (this.bs !== "auto" || !this.Ts) return;
1761
+ this.$s = performance.now();
1762
+ const e = (r) => {
1763
+ if (!this.Ts) return void (this.Cs = null);
1764
+ const s = r - this.$s;
1765
+ s >= this.Fs && (this.render(), this.$s = r - s % this.Fs), this.Ts && (this.Cs = requestAnimationFrame(e));
1737
1766
  };
1738
- this.po = requestAnimationFrame(e);
1767
+ this.Cs = requestAnimationFrame(e);
1739
1768
  }
1740
- Ao() {
1769
+ Ls() {
1741
1770
  const e = performance.now();
1742
- if (this.wo > 0) {
1743
- const s = e - this.wo;
1744
- this.yo.push(s), this.yo.length > this.Fo && this.yo.shift();
1745
- const i = this.yo.reduce((r, o) => r + o, 0) / this.yo.length;
1746
- this.bo = 1e3 / i;
1771
+ if (this.Ms > 0) {
1772
+ const r = e - this.Ms;
1773
+ this.Rs.push(r), this.Rs.length > this.Vs && this.Rs.shift();
1774
+ const s = this.Rs.reduce((i, o) => i + o, 0) / this.Rs.length;
1775
+ this.Ds = 1e3 / s;
1747
1776
  }
1748
- this.wo = e;
1777
+ this.Ms = e;
1749
1778
  }
1750
- Uo() {
1751
- this.po && (cancelAnimationFrame(this.po), this.po = null);
1779
+ Bs() {
1780
+ this.Cs && (cancelAnimationFrame(this.Cs), this.Cs = null);
1752
1781
  }
1753
- Ro(e) {
1754
- this.do !== e && (this.Uo(), this.do = e, e === "auto" && this.xo && this.Po());
1782
+ renderMode(e) {
1783
+ this.bs !== e && (this.Bs(), this.bs = e, e === "auto" && this.Ts && this.Gs());
1755
1784
  }
1756
- ko(e) {
1757
- if (e === void 0) return this.bo;
1758
- this.mo = e, this._o = 1e3 / e, this.do === "auto" && this.xo && (this.Uo(), this.Po());
1785
+ frameRate(e) {
1786
+ if (e === void 0) return this.Ds;
1787
+ this.ws = e, this.Fs = 1e3 / e, this.bs === "auto" && this.Ts && (this.Bs(), this.Gs());
1759
1788
  }
1760
- Go() {
1761
- this.xo && (this.xo = !1, this.po && (cancelAnimationFrame(this.po), this.po = null));
1789
+ noLoop() {
1790
+ this.Ts && (this.Ts = !1, this.Cs && (cancelAnimationFrame(this.Cs), this.Cs = null));
1762
1791
  }
1763
1792
  loop() {
1764
- this.xo || (this.xo = !0, this.do === "auto" && this.Po());
1793
+ this.Ts || (this.Ts = !0, this.bs === "auto" && this.Gs());
1765
1794
  }
1766
- Eo(e = 1) {
1767
- if (w.validate(typeof e == "number" && e > 0 && Number.isInteger(e), "Redraw count must be a positive integer.", { method: "redraw", Ge: e })) for (let s = 0; s < e; s++) this.zr();
1795
+ redraw(e = 1) {
1796
+ if (C.p(typeof e == "number" && e > 0 && Number.isInteger(e), "Redraw count must be a positive integer.", { method: "redraw", providedValue: e })) for (let r = 0; r < e; r++) this.render();
1768
1797
  }
1769
- Lo() {
1770
- return this.do === "auto" && this.xo;
1798
+ isLooping() {
1799
+ return this.bs === "auto" && this.Ts;
1771
1800
  }
1772
1801
  draw(e) {
1773
- this.Do = e;
1802
+ this.Is = e;
1774
1803
  }
1775
- Bo(e) {
1776
- this.Mo = e;
1804
+ windowResized(e) {
1805
+ this.Ps = e;
1777
1806
  }
1778
- Ho(e, s) {
1779
- this.ho.resize(e, s), this.fo.resize(this.ho.width, this.ho.height), this.ao.resize(), this.lo.resize(), this.ye.Bt(), this.do !== "manual" && this.zr();
1807
+ resizeCanvas(e, r) {
1808
+ this.Me.Pe(e, r), this.vs.resize(this.Me.width, this.Me.height), this.je.Pe(), this._s.Pe(), this.Zt.Ht(), this.bs !== "manual" && this.render();
1780
1809
  }
1781
1810
  destroy() {
1782
- this.To || (this.Uo(), window.removeEventListener("resize", this.So), this.Vs && this.Vs.disconnect(), this.lo.dispose(), this.Le.dispose(), this.fo.dispose(), this.ye.dispose(), this.To = !0);
1783
- }
1784
- debug(e) {
1785
- this.Vo = e;
1811
+ this.ks || (this.Bs(), window.removeEventListener("resize", this.Us), this.Ee && this.Ee.disconnect(), this._s.P(), this.oe.P(), this.vs.P(), this.Zt.P(), this.ks = !0);
1786
1812
  }
1787
1813
  get grid() {
1788
- return this.ao;
1814
+ return this.je;
1789
1815
  }
1790
1816
  get font() {
1791
- return this.Le;
1817
+ return this.oe;
1792
1818
  }
1793
1819
  get mode() {
1794
- return this.do;
1820
+ return this.bs;
1795
1821
  }
1796
- get Pi() {
1797
- return this.lo;
1822
+ get pipeline() {
1823
+ return this._s;
1798
1824
  }
1799
1825
  get frameCount() {
1800
- return this.Co;
1826
+ return this.Ss;
1801
1827
  }
1802
1828
  set frameCount(e) {
1803
- this.Co = e;
1829
+ this.Ss = e;
1804
1830
  }
1805
1831
  get width() {
1806
- return this.ho.width;
1832
+ return this.Me.width;
1807
1833
  }
1808
1834
  get height() {
1809
- return this.ho.height;
1835
+ return this.Me.height;
1836
+ }
1837
+ get canvas() {
1838
+ return this.Me;
1810
1839
  }
1811
- get Oo() {
1812
- return this.To;
1840
+ get isDisposed() {
1841
+ return this.ks;
1813
1842
  }
1814
1843
  }
1815
- class O {
1844
+ class N {
1816
1845
  static async create(t, e = {}) {
1817
- if (t instanceof HTMLCanvasElement || t instanceof HTMLVideoElement) return H.create(t, e);
1846
+ if (t instanceof HTMLCanvasElement || t instanceof HTMLVideoElement) return O.create(t, e);
1818
1847
  {
1819
- const s = t || {};
1820
- return H.create(null, s);
1848
+ const r = t || {};
1849
+ return O.create(null, r);
1821
1850
  }
1822
1851
  }
1823
- static jo(t) {
1824
- w.v(t);
1852
+ static setErrorLevel(t) {
1853
+ C._(t);
1825
1854
  }
1826
1855
  static get version() {
1827
- return "0.1.6-beta.6";
1856
+ return "0.1.7";
1828
1857
  }
1829
1858
  }
1830
- const $t = Object.freeze(Object.defineProperty({ __proto__: null }, Symbol.toStringTag, { value: "Module" })), St = O.create, Ut = O.jo, Bt = O.version;
1859
+ const St = Object.freeze(Object.defineProperty({ __proto__: null }, Symbol.toStringTag, { value: "Module" })), Zt = N.create, $t = N.setErrorLevel, Bt = N.version;
1831
1860
  export {
1832
1861
  ct as TextmodeCanvas,
1833
1862
  ft as TextmodeConversionPipeline,
1834
1863
  tt as TextmodeErrorLevel,
1835
- at as TextmodeFont,
1864
+ ht as TextmodeFont,
1836
1865
  lt as TextmodeGrid,
1837
- H as Textmodifier,
1838
- At as converters,
1839
- St as create,
1840
- $t as export,
1841
- Ut as setErrorLevel,
1842
- O as textmode,
1866
+ O as Textmodifier,
1867
+ Ut as converters,
1868
+ Zt as create,
1869
+ St as export,
1870
+ $t as setErrorLevel,
1871
+ N as textmode,
1843
1872
  Bt as version
1844
1873
  };