spryte 0.0.0-stage → 0.1.0

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 (47) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +71 -2
  3. package/dist/backend.d.ts +69 -0
  4. package/dist/backend.d.ts.map +1 -0
  5. package/dist/backend.js +2 -0
  6. package/dist/backend.js.map +1 -0
  7. package/dist/bitmap-font.d.ts +55 -0
  8. package/dist/bitmap-font.d.ts.map +1 -0
  9. package/dist/bitmap-font.js +103 -0
  10. package/dist/bitmap-font.js.map +1 -0
  11. package/dist/canvas2d.d.ts +45 -0
  12. package/dist/canvas2d.d.ts.map +1 -0
  13. package/dist/canvas2d.js +210 -0
  14. package/dist/canvas2d.js.map +1 -0
  15. package/dist/color.d.ts +7 -0
  16. package/dist/color.d.ts.map +1 -0
  17. package/dist/color.js +49 -0
  18. package/dist/color.js.map +1 -0
  19. package/dist/copies.d.ts +45 -0
  20. package/dist/copies.d.ts.map +1 -0
  21. package/dist/copies.js +43 -0
  22. package/dist/copies.js.map +1 -0
  23. package/dist/draw.d.ts +188 -0
  24. package/dist/draw.d.ts.map +1 -0
  25. package/dist/draw.js +603 -0
  26. package/dist/draw.js.map +1 -0
  27. package/dist/index.d.ts +9 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +7 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/renderer.d.ts +17 -0
  32. package/dist/renderer.d.ts.map +1 -0
  33. package/dist/renderer.js +61 -0
  34. package/dist/renderer.js.map +1 -0
  35. package/dist/shader.d.ts +34 -0
  36. package/dist/shader.d.ts.map +1 -0
  37. package/dist/shader.js +40 -0
  38. package/dist/shader.js.map +1 -0
  39. package/dist/target.d.ts +13 -0
  40. package/dist/target.d.ts.map +1 -0
  41. package/dist/target.js +18 -0
  42. package/dist/target.js.map +1 -0
  43. package/dist/webgl2.d.ts +90 -0
  44. package/dist/webgl2.d.ts.map +1 -0
  45. package/dist/webgl2.js +868 -0
  46. package/dist/webgl2.js.map +1 -0
  47. package/package.json +54 -4
package/dist/draw.js ADDED
@@ -0,0 +1,603 @@
1
+ import { toRGBA } from "./color.js";
2
+ import { Shader } from "./shader.js";
3
+ import { RenderTarget } from "./target.js";
4
+ const NO_OPTIONS = Object.freeze({});
5
+ const WHITE = 0xffffffff;
6
+ /**
7
+ * Immediate-mode drawing in logical units, the same API on WebGL2 and Canvas 2D (ADR 0007).
8
+ * Everything batches automatically; call order is draw order.
9
+ */
10
+ export class Draw {
11
+ backend;
12
+ smooth;
13
+ /** Global alpha multiplier for subsequent draws. */
14
+ alpha = 1;
15
+ /**
16
+ * Font for `text()` and `measure()` when none is given: a CSS font, a `BitmapFont`, or a function returning
17
+ * one (called on first use, so a font built from a canvas costs nothing until text is drawn).
18
+ */
19
+ font = "16px sans-serif";
20
+ /** Quads (sprites, rects, glyph runs…) submitted this frame. Reset each frame; for diagnostics. */
21
+ quads = 0;
22
+ /** Preallocated transform stack: push/pop copy six numbers and never allocate. */
23
+ stack = [];
24
+ depth = 0;
25
+ m = [1, 0, 0, 1, 0, 0];
26
+ frames = new WeakMap();
27
+ lastImage = null;
28
+ lastFrame;
29
+ clips = [];
30
+ shader = null;
31
+ /** The render target being drawn into, or null for the canvas. */
32
+ target = null;
33
+ /** The canvas's logical size this frame, to switch back to after `into()`. */
34
+ viewW = 1;
35
+ viewH = 1;
36
+ tmp = [1, 0, 0, 1, 0, 0];
37
+ textCache = new TextCache();
38
+ circleTexture;
39
+ backingW = 0;
40
+ backingH = 0;
41
+ /** @internal */
42
+ constructor(backend,
43
+ /** Default filtering for images (false for pixel art). */
44
+ smooth) {
45
+ this.backend = backend;
46
+ this.smooth = smooth;
47
+ }
48
+ /** Which backend is active. */
49
+ get kind() {
50
+ return this.backend.kind;
51
+ }
52
+ /** Draw calls this frame: batched GPU calls on WebGL2, one per quad on Canvas 2D. */
53
+ get drawCalls() {
54
+ return this.backend.drawCalls ?? this.quads;
55
+ }
56
+ /**
57
+ * Resolves once the backend can draw. Immediate on WebGL2; on the Canvas 2D fallback, once its chunk has
58
+ * loaded (frames before that draw nothing). Rejects if the fallback fails to load.
59
+ */
60
+ ready = Promise.resolve();
61
+ /** Raw `WebGL2RenderingContext` or `CanvasRenderingContext2D`. Mixing raw calls with `draw` calls requires care. */
62
+ get raw() {
63
+ return this.backend.raw;
64
+ }
65
+ // ---- transform stack -------------------------------------------------------------------
66
+ push() {
67
+ let slot = this.stack[this.depth];
68
+ if (!slot) {
69
+ slot = [1, 0, 0, 1, 0, 0];
70
+ this.stack[this.depth] = slot;
71
+ }
72
+ copy(this.m, slot);
73
+ this.depth++;
74
+ }
75
+ pop() {
76
+ if (this.depth === 0)
77
+ throw new Error("draw.pop() without a matching push()");
78
+ this.depth--;
79
+ copy(this.stack[this.depth], this.m);
80
+ }
81
+ translate(x, y) {
82
+ const m = this.m;
83
+ m[4] += m[0] * x + m[2] * y;
84
+ m[5] += m[1] * x + m[3] * y;
85
+ }
86
+ scale(x, y = x) {
87
+ const m = this.m;
88
+ m[0] *= x;
89
+ m[1] *= x;
90
+ m[2] *= y;
91
+ m[3] *= y;
92
+ }
93
+ rotate(radians) {
94
+ const c = Math.cos(radians);
95
+ const s = Math.sin(radians);
96
+ const [a, b, cc, d] = this.m;
97
+ this.m[0] = a * c + cc * s;
98
+ this.m[1] = b * c + d * s;
99
+ this.m[2] = cc * c - a * s;
100
+ this.m[3] = d * c - b * s;
101
+ }
102
+ /**
103
+ * Run `fn` with drawing restricted to a rectangle (in current units), then restore. Nested clips
104
+ * intersect. Clips are axis-aligned on screen: under rotation the rectangle's screen bounds are used.
105
+ */
106
+ clip(x, y, w, h, fn) {
107
+ const m = this.m;
108
+ const s = this.renderScale;
109
+ let x0 = Number.POSITIVE_INFINITY;
110
+ let y0 = Number.POSITIVE_INFINITY;
111
+ let x1 = Number.NEGATIVE_INFINITY;
112
+ let y1 = Number.NEGATIVE_INFINITY;
113
+ for (const [px, py] of [
114
+ [x, y],
115
+ [x + w, y],
116
+ [x, y + h],
117
+ [x + w, y + h],
118
+ ]) {
119
+ const sx = (m[0] * px + m[2] * py + m[4]) * s;
120
+ const sy = (m[1] * px + m[3] * py + m[5]) * s;
121
+ x0 = Math.min(x0, sx);
122
+ y0 = Math.min(y0, sy);
123
+ x1 = Math.max(x1, sx);
124
+ y1 = Math.max(y1, sy);
125
+ }
126
+ let rect = {
127
+ x: Math.round(x0),
128
+ y: Math.round(y0),
129
+ w: Math.max(0, Math.round(x1) - Math.round(x0)),
130
+ h: Math.max(0, Math.round(y1) - Math.round(y0)),
131
+ };
132
+ const outer = this.clips.at(-1);
133
+ if (outer)
134
+ rect = intersect(rect, outer);
135
+ this.clips.push(rect);
136
+ this.backend.setClip(rect);
137
+ try {
138
+ fn();
139
+ }
140
+ finally {
141
+ this.clips.pop();
142
+ this.backend.setClip(this.clips.at(-1) ?? null);
143
+ }
144
+ }
145
+ /** Run `fn` with the camera's view applied, then restore. */
146
+ withCamera(camera, fn) {
147
+ this.push();
148
+ const [a, b, c, d, e, f] = camera.view();
149
+ const m = this.m;
150
+ const [ma, mb, mc, md, me, mf] = m;
151
+ m[0] = ma * a + mc * b;
152
+ m[1] = mb * a + md * b;
153
+ m[2] = ma * c + mc * d;
154
+ m[3] = mb * c + md * d;
155
+ m[4] = ma * e + mc * f + me;
156
+ m[5] = mb * e + md * f + mf;
157
+ try {
158
+ fn();
159
+ }
160
+ finally {
161
+ this.pop();
162
+ }
163
+ }
164
+ // ---- drawing ---------------------------------------------------------------------------
165
+ blend(mode) {
166
+ this.backend.setBlend(mode);
167
+ }
168
+ rect(x, y, w, h, color) {
169
+ this.local(x, y, w, h);
170
+ this.quads++;
171
+ this.backend.quad(this.tmp, null, 0, 0, 1, 1, this.withAlpha(toRGBA(color), 1), 0, false);
172
+ }
173
+ /** Filled circle (antialiased). */
174
+ circle(x, y, radius, color) {
175
+ this.local(x - radius, y - radius, radius * 2, radius * 2);
176
+ const tex = this.circle64();
177
+ this.quads++;
178
+ this.backend.quad(this.tmp, tex, 0, 0, 64, 64, this.withAlpha(toRGBA(color), 1), 0, true);
179
+ }
180
+ line(x1, y1, x2, y2, width, color) {
181
+ const dx = x2 - x1;
182
+ const dy = y2 - y1;
183
+ const len = Math.hypot(dx, dy);
184
+ if (len === 0)
185
+ return;
186
+ this.push();
187
+ this.translate(x1, y1);
188
+ this.rotate(Math.atan2(dy, dx));
189
+ this.rect(0, -width / 2, len, width, color);
190
+ this.pop();
191
+ }
192
+ /** Draw an image frame (or a whole image) at `x, y`, anchored by `origin`. Allocation-free hot path. */
193
+ sprite(frame, x, y, o = NO_OPTIONS) {
194
+ const f = this.place(frame, x, y, o);
195
+ const t = this.tmp;
196
+ const smooth = o.smooth ?? this.smooth;
197
+ if (!smooth && t[1] === 0 && t[2] === 0) {
198
+ // Pixel art: put unrotated sprites on whole pixels. Nearest sampling at fractional positions
199
+ // makes edges gain and lose a pixel from frame to frame, which reads as flicker.
200
+ t[4] = Math.round(t[4]);
201
+ t[5] = Math.round(t[5]);
202
+ }
203
+ this.quads++;
204
+ this.backend.quad(t, f.image, f.x, f.y, f.w, f.h, this.spriteColor(o), o.flash ?? 0, smooth);
205
+ }
206
+ /**
207
+ * Draw one image frame at many positions in a single call: particles, bullets, swarms, starfields.
208
+ * `positions` holds x, y pairs (a `Float32Array` you reuse is ideal); `count` defaults to all of them.
209
+ * Every copy shares `options` (rotation, scale, tint, alpha…), so per-copy work is just the position.
210
+ * Much faster than calling `sprite()` in a loop, and allocation-free.
211
+ *
212
+ * ```ts
213
+ * const pos = new Float32Array(2 * MAX);
214
+ * // ...update pos...
215
+ * draw.sprites(spark, pos, live, { tint: "#ffd36b", alpha: 0.8 });
216
+ * ```
217
+ */
218
+ sprites(frame, positions, count = positions.length >> 1, o = NO_OPTIONS, each) {
219
+ if (count <= 0)
220
+ return;
221
+ if (each && (each.scale || each.rotation || each.color)) {
222
+ this.spritesEach(frame, positions, count, o, each);
223
+ return;
224
+ }
225
+ const f = this.place(frame, 0, 0, o);
226
+ const t = this.tmp;
227
+ const smooth = o.smooth ?? this.smooth;
228
+ // Snapped per copy, like sprite().
229
+ const snap = !smooth && t[1] === 0 && t[2] === 0;
230
+ this.quads += count;
231
+ this.backend.quads(t, this.m, positions, count, f.image, f.x, f.y, f.w, f.h, this.spriteColor(o), o.flash ?? 0, smooth, snap);
232
+ }
233
+ spritesEach(frame, positions, count, o, each) {
234
+ const f = frame === this.lastImage && this.lastFrame ? this.lastFrame : "image" in frame ? frame : this.wholeImage(frame);
235
+ const origin = o.origin;
236
+ const rotation = o.rotation ?? 0;
237
+ const smooth = o.smooth ?? this.smooth;
238
+ const m = this.m;
239
+ this.quads += count;
240
+ this.backend.copies({
241
+ m,
242
+ positions,
243
+ count,
244
+ src: f.image,
245
+ sx: f.x,
246
+ sy: f.y,
247
+ sw: f.w,
248
+ sh: f.h,
249
+ ox: -(origin ? origin[0] : 0.5) * f.w,
250
+ oy: -(origin ? origin[1] : 0.5) * f.h,
251
+ scaleX: (o.scaleX ?? 1) * (o.flipX ? -1 : 1),
252
+ scaleY: (o.scaleY ?? 1) * (o.flipY ? -1 : 1),
253
+ rotation,
254
+ color: this.spriteColor(o),
255
+ flash: o.flash ?? 0,
256
+ smooth,
257
+ // Like sprite(): per copy, whole pixels when that copy doesn't rotate.
258
+ snap: !smooth && m[1] === 0 && m[2] === 0,
259
+ each,
260
+ });
261
+ }
262
+ /** tmp = M · T(x, y) · R(rotation) · S(sx, sy) · T(ox, oy) · S(w, h), expanded by hand. Returns the frame. */
263
+ place(frame, x, y, o) {
264
+ // Check the repeat-image cache before `in`: on a DOM image, `in` walks a long prototype chain per call.
265
+ const f = frame === this.lastImage && this.lastFrame ? this.lastFrame : "image" in frame ? frame : this.wholeImage(frame);
266
+ const origin = o.origin;
267
+ const ox = -(origin ? origin[0] : 0.5) * f.w;
268
+ const oy = -(origin ? origin[1] : 0.5) * f.h;
269
+ const sx = (o.scaleX ?? 1) * (o.flipX ? -1 : 1);
270
+ const sy = (o.scaleY ?? 1) * (o.flipY ? -1 : 1);
271
+ const m = this.m;
272
+ let a = sx;
273
+ let b = 0;
274
+ let c = 0;
275
+ let d = sy;
276
+ const r = o.rotation;
277
+ if (r) {
278
+ const cos = Math.cos(r);
279
+ const sin = Math.sin(r);
280
+ a = cos * sx;
281
+ b = sin * sx;
282
+ c = -sin * sy;
283
+ d = cos * sy;
284
+ }
285
+ const lx = a * ox + c * oy + x;
286
+ const ly = b * ox + d * oy + y;
287
+ const t = this.tmp;
288
+ t[0] = (m[0] * a + m[2] * b) * f.w;
289
+ t[1] = (m[1] * a + m[3] * b) * f.w;
290
+ t[2] = (m[0] * c + m[2] * d) * f.h;
291
+ t[3] = (m[1] * c + m[3] * d) * f.h;
292
+ t[4] = m[0] * lx + m[2] * ly + m[4];
293
+ t[5] = m[1] * lx + m[3] * ly + m[5];
294
+ return f;
295
+ }
296
+ spriteColor(o) {
297
+ const tint = o.tint === undefined ? WHITE : toRGBA(o.tint);
298
+ const alpha = o.alpha ?? 1;
299
+ return alpha === 1 && this.alpha === 1 ? tint : this.withAlpha(tint, alpha);
300
+ }
301
+ /** Text, rasterised once and cached as a texture (crisp at the current render scale). */
302
+ text(text, x, y, o = {}) {
303
+ if (!text)
304
+ return;
305
+ const font = o.font ?? this.defaultFont();
306
+ if (typeof font !== "string") {
307
+ this.bitmapText(text, x, y, font, o);
308
+ return;
309
+ }
310
+ const entry = this.textCache.get(text, font, this.renderScale, (src) => this.backend.invalidate(src));
311
+ const ax = o.align === "center" ? 0.5 : o.align === "right" ? 1 : 0;
312
+ const ay = o.baseline === "middle" ? 0.5 : o.baseline === "bottom" ? 1 : 0;
313
+ this.local(x - ax * entry.w, y - ay * entry.h, entry.w, entry.h);
314
+ const color = this.withAlpha(toRGBA(o.color ?? "#ffffff"), o.alpha ?? 1);
315
+ this.quads++;
316
+ this.backend.quad(this.tmp, entry.canvas, 0, 0, entry.canvas.width, entry.canvas.height, color, 0, true);
317
+ }
318
+ /**
319
+ * The logical box `text()` fills for this string and font, so layouts can align and centre without
320
+ * guessing. Same cache as `text()`, so measuring then drawing rasterises once.
321
+ */
322
+ measure(text, font = this.defaultFont()) {
323
+ if (!text)
324
+ return { w: 0, h: 0 };
325
+ if (typeof font !== "string")
326
+ return font.measure(text);
327
+ const entry = this.textCache.get(text, font, this.renderScale, (src) => this.backend.invalidate(src));
328
+ return { w: entry.w, h: entry.h };
329
+ }
330
+ bitmapText(text, x, y, font, o) {
331
+ const size = font.measure(text);
332
+ const ay = o.baseline === "middle" ? 0.5 : o.baseline === "bottom" ? 1 : 0;
333
+ const color = this.withAlpha(toRGBA(o.color ?? "#ffffff"), o.alpha ?? 1);
334
+ // Whole-pixel origin: a glyph straddling a pixel boundary would blur or drop a column.
335
+ let ly = Math.round(y - ay * size.h);
336
+ for (const line of text.split("\n")) {
337
+ const w = font.lineWidth(line);
338
+ let lx = Math.round(x - (o.align === "center" ? Math.floor(w / 2) : o.align === "right" ? w : 0));
339
+ for (const ch of line) {
340
+ const g = font.glyph(ch);
341
+ if (!g)
342
+ continue;
343
+ const f = g.frame;
344
+ this.local(lx, ly, f.w, f.h);
345
+ this.quads++;
346
+ this.backend.quad(this.tmp, f.image, f.x, f.y, f.w, f.h, color, 0, false);
347
+ lx += g.advance + font.spacing;
348
+ }
349
+ ly += font.lineHeight;
350
+ }
351
+ }
352
+ // ---- render targets ----------------------------------------------------------------------
353
+ /** An offscreen image of `width × height` pixels to draw into with `into()`, then draw like any image. */
354
+ createTarget(width, height) {
355
+ return new RenderTarget(width, height);
356
+ }
357
+ /**
358
+ * Run `fn` with drawing going into `target` instead of the canvas, then switch back. Inside, units are the
359
+ * target's pixels from its top-left; the transform, clips and global alpha start fresh and are restored
360
+ * afterwards. `clear` fills the target first (default transparent); pass `null` to draw over what's there,
361
+ * for trails and accumulation. Nests.
362
+ *
363
+ * ```ts
364
+ * const glow = draw.createTarget(160, 90);
365
+ * draw.into(glow, () => draw.sprites(spark, sparks, n, { tint: "#ffd36b" }));
366
+ * draw.blend("add");
367
+ * draw.sprite(glow, 160, 90, { scaleX: 2, scaleY: 2, smooth: true });
368
+ * ```
369
+ */
370
+ into(target, fn, clear = 0) {
371
+ const outer = this.target;
372
+ const outerW = outer ? outer.width : this.viewW;
373
+ const outerH = outer ? outer.height : this.viewH;
374
+ const outerScale = this.renderScale;
375
+ const outerAlpha = this.alpha;
376
+ const outerClips = this.clips.splice(0);
377
+ if (outerClips.length)
378
+ this.backend.setClip(null);
379
+ const depth = this.depth;
380
+ this.push();
381
+ copy(IDENTITY, this.m);
382
+ this.alpha = 1;
383
+ this.renderScale = 1;
384
+ this.target = target;
385
+ this.backend.setTarget(target, clear === null ? null : toRGBA(clear), target.width, target.height);
386
+ try {
387
+ fn();
388
+ }
389
+ finally {
390
+ if (this.clips.length) {
391
+ this.clips.length = 0;
392
+ this.backend.setClip(null);
393
+ }
394
+ this.target = outer;
395
+ this.backend.setTarget(outer, null, outerW, outerH);
396
+ this.clips.push(...outerClips);
397
+ const clip = outerClips.at(-1);
398
+ if (clip)
399
+ this.backend.setClip(clip);
400
+ // Unbalanced push() calls inside fn don't leak out.
401
+ this.depth = depth + 1;
402
+ this.pop();
403
+ this.alpha = outerAlpha;
404
+ this.renderScale = outerScale;
405
+ }
406
+ }
407
+ // ---- shaders ------------------------------------------------------------------------------
408
+ /** A custom fragment effect: see `Shader`. Compiled on first use, so errors surface at the first `withShader` draw. */
409
+ createShader(source) {
410
+ return new Shader(source);
411
+ }
412
+ /** Run `fn` with everything drawn through `shader`, then restore the previous one. Nests. WebGL2 only (see `Shader`). */
413
+ withShader(shader, fn) {
414
+ const outer = this.shader;
415
+ this.shader = shader;
416
+ this.backend.setShader(shader);
417
+ try {
418
+ fn();
419
+ }
420
+ finally {
421
+ this.shader = outer;
422
+ this.backend.setShader(outer);
423
+ }
424
+ }
425
+ /** Free a target's GPU memory. Drawing it afterwards recreates it, blank. */
426
+ disposeTarget(target) {
427
+ this.backend.disposeTarget(target);
428
+ }
429
+ /** True while the WebGL context is lost (e.g. a backgrounded mobile tab): frames draw nothing until it's restored. */
430
+ get contextLost() {
431
+ return this.backend.contextLost ?? false;
432
+ }
433
+ /** Re-upload a source whose pixels changed (e.g. a canvas you draw into). */
434
+ invalidate(src) {
435
+ this.backend.invalidate(src);
436
+ }
437
+ // ---- frame lifecycle (called by Game) ----------------------------------------------------
438
+ /** @internal */
439
+ renderScale = 1;
440
+ /** @internal */
441
+ begin(clear, width, height, scale) {
442
+ this.renderScale = scale;
443
+ this.viewW = width;
444
+ this.viewH = height;
445
+ this.target = null;
446
+ this.shader = null;
447
+ this.quads = 0;
448
+ this.depth = 0;
449
+ this.clips.length = 0;
450
+ copy(IDENTITY, this.m);
451
+ this.alpha = 1;
452
+ this.backend.setBlend("normal");
453
+ this.backend.begin(toRGBA(clear), width, height, scale);
454
+ }
455
+ /** @internal Reset transform and blend between scene and afterRender hooks. */
456
+ reset() {
457
+ this.depth = 0;
458
+ if (this.clips.length) {
459
+ this.clips.length = 0;
460
+ this.backend.setClip(null);
461
+ }
462
+ copy(IDENTITY, this.m);
463
+ this.alpha = 1;
464
+ this.backend.setBlend("normal");
465
+ }
466
+ /** @internal */
467
+ end() {
468
+ this.backend.end();
469
+ }
470
+ /** @internal Release GPU resources and listeners. */
471
+ dispose() {
472
+ this.backend.dispose();
473
+ }
474
+ /** @internal */
475
+ resize(w, h) {
476
+ this.backingW = w;
477
+ this.backingH = h;
478
+ this.backend.resize(w, h);
479
+ }
480
+ /** @internal Switch to a backend that finished loading (the Canvas 2D fallback), at the current size. */
481
+ setBackend(backend) {
482
+ this.backend.dispose();
483
+ this.backend = backend;
484
+ if (this.backingW)
485
+ backend.resize(this.backingW, this.backingH);
486
+ }
487
+ // ---- internals ---------------------------------------------------------------------------
488
+ /** tmp = current matrix × (translate(x, y) · scale(w, h)): maps the unit square to the rect. */
489
+ local(x, y, w, h) {
490
+ const m = this.m;
491
+ const t = this.tmp;
492
+ t[0] = m[0] * w;
493
+ t[1] = m[1] * w;
494
+ t[2] = m[2] * h;
495
+ t[3] = m[3] * h;
496
+ t[4] = m[0] * x + m[2] * y + m[4];
497
+ t[5] = m[1] * x + m[3] * y + m[5];
498
+ }
499
+ wholeImage(image) {
500
+ // Loops usually draw one image many times in a row; skip the WeakMap for repeats.
501
+ if (image === this.lastImage && this.lastFrame)
502
+ return this.lastFrame;
503
+ let f = this.frames.get(image);
504
+ if (!f) {
505
+ f = wholeImage(image);
506
+ this.frames.set(image, f);
507
+ }
508
+ this.lastImage = image;
509
+ this.lastFrame = f;
510
+ return f;
511
+ }
512
+ defaultFont() {
513
+ return typeof this.font === "function" ? this.font() : this.font;
514
+ }
515
+ withAlpha(rgba, alpha) {
516
+ const a = Math.round((rgba & 0xff) * alpha * this.alpha);
517
+ return ((rgba & 0xffffff00) | Math.max(0, Math.min(255, a))) >>> 0;
518
+ }
519
+ circle64() {
520
+ if (!this.circleTexture) {
521
+ const c = makeCanvas(64, 64);
522
+ const ctx = c.getContext("2d");
523
+ if (ctx) {
524
+ ctx.fillStyle = "#fff";
525
+ ctx.beginPath();
526
+ ctx.arc(32, 32, 31.5, 0, Math.PI * 2);
527
+ ctx.fill();
528
+ }
529
+ this.circleTexture = c;
530
+ }
531
+ return this.circleTexture;
532
+ }
533
+ }
534
+ const IDENTITY = [1, 0, 0, 1, 0, 0];
535
+ function intersect(a, b) {
536
+ const x = Math.max(a.x, b.x);
537
+ const y = Math.max(a.y, b.y);
538
+ return { x, y, w: Math.max(0, Math.min(a.x + a.w, b.x + b.w) - x), h: Math.max(0, Math.min(a.y + a.h, b.y + b.h) - y) };
539
+ }
540
+ function copy(from, to) {
541
+ to[0] = from[0];
542
+ to[1] = from[1];
543
+ to[2] = from[2];
544
+ to[3] = from[3];
545
+ to[4] = from[4];
546
+ to[5] = from[5];
547
+ }
548
+ function wholeImage(image) {
549
+ const w = "naturalWidth" in image ? image.naturalWidth : image.width;
550
+ const h = "naturalHeight" in image ? image.naturalHeight : image.height;
551
+ return { image, x: 0, y: 0, w, h };
552
+ }
553
+ function makeCanvas(w, h) {
554
+ if (typeof OffscreenCanvas !== "undefined")
555
+ return new OffscreenCanvas(w, h);
556
+ const c = document.createElement("canvas");
557
+ c.width = w;
558
+ c.height = h;
559
+ return c;
560
+ }
561
+ /** LRU cache of rasterised text (white; tinted at draw time). */
562
+ class TextCache {
563
+ entries = new Map();
564
+ clock = 0;
565
+ get(text, font, scale, evict) {
566
+ const key = `${scale}|${font}|${text}`;
567
+ const hit = this.entries.get(key);
568
+ if (hit) {
569
+ hit.used = ++this.clock;
570
+ return hit;
571
+ }
572
+ const measureCtx = makeCanvas(1, 1).getContext("2d");
573
+ if (!measureCtx)
574
+ throw new Error("draw.text needs a 2D canvas for rasterising text");
575
+ measureCtx.font = font;
576
+ const metrics = measureCtx.measureText(text);
577
+ const ascent = metrics.fontBoundingBoxAscent ?? metrics.actualBoundingBoxAscent;
578
+ const descent = metrics.fontBoundingBoxDescent ?? metrics.actualBoundingBoxDescent;
579
+ const w = Math.ceil(metrics.width) + 2;
580
+ const h = Math.ceil(ascent + descent) + 2;
581
+ const canvas = makeCanvas(Math.ceil(w * scale), Math.ceil(h * scale));
582
+ const ctx = canvas.getContext("2d");
583
+ if (ctx) {
584
+ ctx.scale(scale, scale);
585
+ ctx.font = font;
586
+ ctx.fillStyle = "#fff";
587
+ ctx.textBaseline = "alphabetic";
588
+ ctx.fillText(text, 1, 1 + ascent);
589
+ }
590
+ const entry = { canvas, w, h, used: ++this.clock };
591
+ this.entries.set(key, entry);
592
+ if (this.entries.size > 256) {
593
+ // Evict the least recently used quarter.
594
+ const old = [...this.entries].sort((a, b) => a[1].used - b[1].used).slice(0, 64);
595
+ for (const [k, e] of old) {
596
+ this.entries.delete(k);
597
+ evict(e.canvas);
598
+ }
599
+ }
600
+ return entry;
601
+ }
602
+ }
603
+ //# sourceMappingURL=draw.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"draw.js","sourceRoot":"","sources":["../src/draw.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export type { BlendMode, ClipRect, Matrix, RawContext, TextureSource } from "./backend.js";
2
+ export { BitmapFont, type BitmapFontOptions, type Glyph } from "./bitmap-font.js";
3
+ export { type Color, rgbaToCss, toRGBA } from "./color.js";
4
+ export type { SpritesEach } from "./copies.js";
5
+ export { Draw, type Frame, type SpriteDrawOptions, type TextDrawOptions } from "./draw.js";
6
+ export { createRenderer, type RendererOptions } from "./renderer.js";
7
+ export { Shader, type UniformValue } from "./shader.js";
8
+ export { RenderTarget } from "./target.js";
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC3F,OAAO,EAAE,UAAU,EAAE,KAAK,iBAAiB,EAAE,KAAK,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAClF,OAAO,EAAE,KAAK,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAC3D,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,KAAK,KAAK,EAAE,KAAK,iBAAiB,EAAE,KAAK,eAAe,EAAE,MAAM,WAAW,CAAC;AAC3F,OAAO,EAAE,cAAc,EAAE,KAAK,eAAe,EAAE,MAAM,eAAe,CAAC;AACrE,OAAO,EAAE,MAAM,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,7 @@
1
+ export { BitmapFont } from "./bitmap-font.js";
2
+ export { rgbaToCss, toRGBA } from "./color.js";
3
+ export { Draw } from "./draw.js";
4
+ export { createRenderer } from "./renderer.js";
5
+ export { Shader } from "./shader.js";
6
+ export { RenderTarget } from "./target.js";
7
+ //# sourceMappingURL=index.js.map