@oh-just-another/renderer-canvas 0.58.1 → 0.60.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.
- package/CHANGELOG.md +78 -0
- package/README.md +63 -15
- package/dist/.tsbuildinfo +1 -1
- package/dist/canvas-target.d.ts +6 -1
- package/dist/canvas-target.d.ts.map +1 -1
- package/dist/canvas-target.js +18 -5
- package/dist/canvas-target.js.map +1 -1
- package/dist/constants.d.ts +81 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +81 -0
- package/dist/constants.js.map +1 -1
- package/dist/hi-dpi.d.ts +21 -13
- package/dist/hi-dpi.d.ts.map +1 -1
- package/dist/hi-dpi.js +28 -33
- package/dist/hi-dpi.js.map +1 -1
- package/dist/image-source.d.ts +11 -0
- package/dist/image-source.d.ts.map +1 -1
- package/dist/image-source.js +20 -0
- package/dist/image-source.js.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -12
- package/dist/index.js.map +1 -1
- package/dist/layered-canvas.d.ts +7 -1
- package/dist/layered-canvas.d.ts.map +1 -1
- package/dist/layered-canvas.js +6 -3
- package/dist/layered-canvas.js.map +1 -1
- package/dist/layered-surface.d.ts +16 -0
- package/dist/layered-surface.d.ts.map +1 -1
- package/dist/layered-surface.js +53 -15
- package/dist/layered-surface.js.map +1 -1
- package/dist/recording-target.d.ts +85 -25
- package/dist/recording-target.d.ts.map +1 -1
- package/dist/recording-target.js +250 -50
- package/dist/recording-target.js.map +1 -1
- package/dist/render-worker.js +16 -3
- package/dist/render-worker.js.map +1 -1
- package/dist/tile-compositor.d.ts +43 -1
- package/dist/tile-compositor.d.ts.map +1 -1
- package/dist/tile-compositor.js +48 -5
- package/dist/tile-compositor.js.map +1 -1
- package/dist/webgl-helpers.d.ts +7 -0
- package/dist/webgl-helpers.d.ts.map +1 -0
- package/dist/webgl-helpers.js +32 -0
- package/dist/webgl-helpers.js.map +1 -0
- package/dist/webgl2-curve.d.ts +11 -0
- package/dist/webgl2-curve.d.ts.map +1 -1
- package/dist/webgl2-curve.js +151 -68
- package/dist/webgl2-curve.js.map +1 -1
- package/dist/webgl2-ellipse.d.ts +0 -27
- package/dist/webgl2-ellipse.d.ts.map +1 -1
- package/dist/webgl2-ellipse.js +21 -47
- package/dist/webgl2-ellipse.js.map +1 -1
- package/dist/webgl2-msdf-text.d.ts +14 -0
- package/dist/webgl2-msdf-text.d.ts.map +1 -1
- package/dist/webgl2-msdf-text.js +84 -36
- package/dist/webgl2-msdf-text.js.map +1 -1
- package/dist/webgl2-rect-batch.d.ts +81 -0
- package/dist/webgl2-rect-batch.d.ts.map +1 -0
- package/dist/webgl2-rect-batch.js +201 -0
- package/dist/webgl2-rect-batch.js.map +1 -0
- package/dist/webgl2-stroke.d.ts +6 -30
- package/dist/webgl2-stroke.d.ts.map +1 -1
- package/dist/webgl2-stroke.js +17 -30
- package/dist/webgl2-stroke.js.map +1 -1
- package/dist/webgl2-target.d.ts +74 -8
- package/dist/webgl2-target.d.ts.map +1 -1
- package/dist/webgl2-target.js +356 -257
- package/dist/webgl2-target.js.map +1 -1
- package/package.json +10 -8
package/dist/recording-target.js
CHANGED
|
@@ -1,15 +1,53 @@
|
|
|
1
|
+
import { LruCache, } from "@oh-just-another/renderer-core";
|
|
2
|
+
import { resolveBundledFamily } from "@oh-just-another/fonts";
|
|
3
|
+
import { OFFSCREEN_IMAGE_CACHE_CAP } from "./constants.js";
|
|
1
4
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* back to main-thread compositing for image-heavy scenes).
|
|
5
|
+
* Backend-agnostic RenderTarget that captures every method call as a
|
|
6
|
+
* structured command. Powers the "offscreen" pipeline: the main thread
|
|
7
|
+
* renders into a RecordingTarget, the resulting buffer is shipped to a
|
|
8
|
+
* worker via postMessage, and the worker replays the commands onto its
|
|
9
|
+
* OffscreenCanvas.
|
|
8
10
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
11
|
+
* Commands are a tagged union of primitive payloads (no class
|
|
12
|
+
* instances) so they survive `structuredClone` cleanly across the
|
|
13
|
+
* worker boundary. `flush()` returns the buffered commands and resets
|
|
14
|
+
* the internal log.
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* Seed / mixing constants for {@link RecordingTarget}'s rolling content
|
|
18
|
+
* signature. Two 32-bit halves give a ~64-bit hash: the offscreen surface
|
|
19
|
+
* compares it to skip re-posting a layer whose command stream is identical
|
|
20
|
+
* to the frame it last shipped. Collision odds (~2⁻⁶⁴) are far below any
|
|
21
|
+
* frame budget — a miss would only defer one layer's repaint to the next
|
|
22
|
+
* genuine change. The exact values are arbitrary large odd words.
|
|
23
|
+
*/
|
|
24
|
+
const SIG_SEED_A = 0x811c9dc5 | 0;
|
|
25
|
+
const SIG_SEED_B = (0x811c9dc5 ^ 0x9e3779b9) | 0;
|
|
26
|
+
const SIG_PRIME_A = 0x01000193;
|
|
27
|
+
const SIG_PRIME_B = 0x85ebca6b;
|
|
28
|
+
const SIG_ROT = 0x9e3779b9 | 0;
|
|
29
|
+
const SIG_NIL = 0x7fff_ffff;
|
|
30
|
+
const SIG_ARR = 0x5555_5555;
|
|
31
|
+
/** Shared scratch view to read a float's exact IEEE-754 bits. */
|
|
32
|
+
const SIG_F64 = new Float64Array(1);
|
|
33
|
+
const SIG_I32 = new Int32Array(SIG_F64.buffer);
|
|
34
|
+
/**
|
|
35
|
+
* `drawImage` records `ImageBitmap` sources — they survive the
|
|
36
|
+
* postMessage boundary and are replayed onto the worker's canvas. Other
|
|
37
|
+
* source types (HTMLImageElement, HTMLCanvasElement) are skipped and
|
|
38
|
+
* counted in `skippedImageDraws` so the host UI can warn (or fall back
|
|
39
|
+
* to main-thread compositing for image-heavy scenes).
|
|
40
|
+
*
|
|
41
|
+
* To avoid re-shipping the same bitmap every frame (the offscreen path
|
|
42
|
+
* re-renders each frame so GIF / video advance), bitmaps are interned by
|
|
43
|
+
* identity to a stable numeric id: the first draw emits a `defineImage`
|
|
44
|
+
* carrying the bitmap, later draws of the same bitmap emit only a tiny
|
|
45
|
+
* `drawImage` referencing the id. An LRU bounds the live set; the worker
|
|
46
|
+
* mirrors the same-capacity LRU, so both evict the same id in lockstep.
|
|
47
|
+
*
|
|
48
|
+
* `measureText` measures on a hidden 2D context with the active font, so
|
|
49
|
+
* caret / selection geometry lines up with the text the worker draws —
|
|
50
|
+
* without routing each call across the worker boundary.
|
|
13
51
|
*/
|
|
14
52
|
export class RecordingTarget {
|
|
15
53
|
commands = [];
|
|
@@ -17,6 +55,32 @@ export class RecordingTarget {
|
|
|
17
55
|
_height;
|
|
18
56
|
/** Counter so hosts can warn when images are silently skipped. */
|
|
19
57
|
skippedImageDraws = 0;
|
|
58
|
+
/** Current font as a CSS shorthand, mirrored from `setFont` for `measureText`. */
|
|
59
|
+
fontSpec = "10px sans-serif";
|
|
60
|
+
/** Hidden 2D context used to measure text with the active font. */
|
|
61
|
+
measureCtx = null;
|
|
62
|
+
/**
|
|
63
|
+
* Identity → id intern table for shipped bitmaps. Persists across
|
|
64
|
+
* `flush()` (the worker keeps its mirror across replays); bounded by an
|
|
65
|
+
* LRU of {@link OFFSCREEN_IMAGE_CACHE_CAP} so a long animation can't grow
|
|
66
|
+
* it without bound. Ids are monotonic and never reused, so an evicted
|
|
67
|
+
* bitmap that reappears is simply re-defined under a fresh id.
|
|
68
|
+
*/
|
|
69
|
+
imageIds = new LruCache(OFFSCREEN_IMAGE_CACHE_CAP);
|
|
70
|
+
nextImageId = 0;
|
|
71
|
+
/**
|
|
72
|
+
* Rolling 64-bit content signature (two 32-bit halves) of the commands
|
|
73
|
+
* accumulated since the last {@link flush}. Every {@link emit} folds the
|
|
74
|
+
* command's tag and primitive fields in, so two frames that record a
|
|
75
|
+
* byte-identical stream produce the same signature — letting the
|
|
76
|
+
* offscreen surface skip re-posting a layer whose replay would reproduce
|
|
77
|
+
* the pixels the worker already shows. Reset to the seeds on `flush`.
|
|
78
|
+
*/
|
|
79
|
+
sigA = SIG_SEED_A;
|
|
80
|
+
sigB = SIG_SEED_B;
|
|
81
|
+
cmdCount = 0;
|
|
82
|
+
/** Signature of the buffer returned by the most recent {@link flush}. */
|
|
83
|
+
_lastSignature = "";
|
|
20
84
|
constructor(width, height) {
|
|
21
85
|
this._width = width;
|
|
22
86
|
this._height = height;
|
|
@@ -27,12 +91,95 @@ export class RecordingTarget {
|
|
|
27
91
|
resize(width, height) {
|
|
28
92
|
this._width = width;
|
|
29
93
|
this._height = height;
|
|
30
|
-
this.
|
|
94
|
+
this.emit({ k: "resize", w: width, h: height });
|
|
95
|
+
}
|
|
96
|
+
/** Buffer one command and fold it into the rolling content signature. */
|
|
97
|
+
emit(cmd) {
|
|
98
|
+
this.commands.push(cmd);
|
|
99
|
+
this.cmdCount++;
|
|
100
|
+
this.mixString(cmd.k);
|
|
101
|
+
for (const key in cmd) {
|
|
102
|
+
if (key === "k")
|
|
103
|
+
continue;
|
|
104
|
+
this.mixValue(cmd[key]);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/** Fold one 32-bit word into both signature halves (Murmur-style mix). */
|
|
108
|
+
mix32(x) {
|
|
109
|
+
const w = x | 0;
|
|
110
|
+
this.sigA = (Math.imul(this.sigA ^ w, SIG_PRIME_A) | 0) ^ SIG_ROT;
|
|
111
|
+
this.sigB = Math.imul(this.sigB ^ (w + SIG_ROT), SIG_PRIME_B) | 0;
|
|
112
|
+
}
|
|
113
|
+
/** Fold a number by its exact 64-bit IEEE-754 bit pattern. */
|
|
114
|
+
mixNumber(n) {
|
|
115
|
+
SIG_F64[0] = n;
|
|
116
|
+
this.mix32(SIG_I32[0] ?? 0);
|
|
117
|
+
this.mix32(SIG_I32[1] ?? 0);
|
|
118
|
+
}
|
|
119
|
+
mixString(s) {
|
|
120
|
+
for (let i = 0; i < s.length; i++)
|
|
121
|
+
this.mix32(s.charCodeAt(i));
|
|
122
|
+
// Length terminator so "ab"+"c" and "a"+"bc" don't collide.
|
|
123
|
+
this.mix32(s.length ^ 0x1_0000);
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Fold an arbitrary command-field value: numbers by bits, strings by
|
|
127
|
+
* chars, nested `Transform` / bounds / options objects field-by-field,
|
|
128
|
+
* dash arrays element-by-element. `ImageBitmap` pixels are NOT hashed —
|
|
129
|
+
* a bitmap only ever appears in a `defineImage`, whose presence (and the
|
|
130
|
+
* accompanying numeric `id`) already differentiates the stream, so the
|
|
131
|
+
* per-frame `drawImage`-by-id path stays exact without touching pixels.
|
|
132
|
+
*/
|
|
133
|
+
mixValue(v) {
|
|
134
|
+
if (v === null || v === undefined) {
|
|
135
|
+
this.mix32(SIG_NIL);
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
switch (typeof v) {
|
|
139
|
+
case "number":
|
|
140
|
+
this.mixNumber(v);
|
|
141
|
+
return;
|
|
142
|
+
case "boolean":
|
|
143
|
+
this.mix32(v ? 1 : 2);
|
|
144
|
+
return;
|
|
145
|
+
case "string":
|
|
146
|
+
this.mixString(v);
|
|
147
|
+
return;
|
|
148
|
+
case "object": {
|
|
149
|
+
if (Array.isArray(v)) {
|
|
150
|
+
for (const e of v)
|
|
151
|
+
this.mixValue(e);
|
|
152
|
+
this.mix32(v.length ^ SIG_ARR);
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
if (typeof ImageBitmap !== "undefined" && v instanceof ImageBitmap)
|
|
156
|
+
return;
|
|
157
|
+
for (const k in v) {
|
|
158
|
+
this.mixValue(v[k]);
|
|
159
|
+
}
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
default:
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Content signature of the buffer returned by the most recent
|
|
168
|
+
* {@link flush}. Stable across frames that record an identical command
|
|
169
|
+
* stream; used by the offscreen surface to skip re-posting unchanged
|
|
170
|
+
* layers. Empty string before the first flush.
|
|
171
|
+
*/
|
|
172
|
+
get lastSignature() {
|
|
173
|
+
return this._lastSignature;
|
|
31
174
|
}
|
|
32
175
|
/** Pop the buffered commands and clear the internal log. */
|
|
33
176
|
flush() {
|
|
34
177
|
const out = this.commands;
|
|
178
|
+
this._lastSignature = `${this.cmdCount}:${(this.sigA >>> 0).toString(36)}:${(this.sigB >>> 0).toString(36)}`;
|
|
35
179
|
this.commands = [];
|
|
180
|
+
this.sigA = SIG_SEED_A;
|
|
181
|
+
this.sigB = SIG_SEED_B;
|
|
182
|
+
this.cmdCount = 0;
|
|
36
183
|
return out;
|
|
37
184
|
}
|
|
38
185
|
/** Snapshot of the buffered commands without clearing. */
|
|
@@ -40,114 +187,155 @@ export class RecordingTarget {
|
|
|
40
187
|
return this.commands;
|
|
41
188
|
}
|
|
42
189
|
setFill(color) {
|
|
43
|
-
this.
|
|
190
|
+
this.emit({ k: "setFill", color });
|
|
44
191
|
}
|
|
45
192
|
setStroke(color) {
|
|
46
|
-
this.
|
|
193
|
+
this.emit({ k: "setStroke", color });
|
|
47
194
|
}
|
|
48
195
|
setStrokeWidth(w) {
|
|
49
|
-
this.
|
|
196
|
+
this.emit({ k: "setStrokeWidth", w });
|
|
50
197
|
}
|
|
51
198
|
setOpacity(a) {
|
|
52
|
-
this.
|
|
199
|
+
this.emit({ k: "setOpacity", a });
|
|
53
200
|
}
|
|
54
201
|
setLineCap(cap) {
|
|
55
|
-
this.
|
|
202
|
+
this.emit({ k: "setLineCap", cap });
|
|
56
203
|
}
|
|
57
204
|
setLineJoin(join) {
|
|
58
|
-
this.
|
|
205
|
+
this.emit({ k: "setLineJoin", join });
|
|
59
206
|
}
|
|
60
207
|
setDashArray(dash) {
|
|
61
|
-
this.
|
|
208
|
+
this.emit({ k: "setDashArray", dash });
|
|
62
209
|
}
|
|
63
210
|
setFont(family, size, options) {
|
|
64
|
-
this.
|
|
211
|
+
this.emit({ k: "setFont", family, size, ...(options ? { options } : {}) });
|
|
212
|
+
// CSS font shorthand order: `<style> <weight> <size> <family>` — same as
|
|
213
|
+
// the worker's Canvas2D target (bundled face first), so `measureText`
|
|
214
|
+
// matches what it draws.
|
|
215
|
+
const style = options?.style === "italic" ? "italic " : "";
|
|
216
|
+
const weight = options?.weight === "bold" ? "bold " : "";
|
|
217
|
+
this.fontSpec = `${style}${weight}${size}px "${resolveBundledFamily(family)}", ${family}`;
|
|
65
218
|
}
|
|
66
219
|
setTextAlign(align) {
|
|
67
|
-
this.
|
|
220
|
+
this.emit({ k: "setTextAlign", align });
|
|
68
221
|
}
|
|
69
222
|
setTextBaseline(baseline) {
|
|
70
|
-
this.
|
|
223
|
+
this.emit({ k: "setTextBaseline", baseline });
|
|
71
224
|
}
|
|
72
225
|
save() {
|
|
73
|
-
this.
|
|
226
|
+
this.emit({ k: "save" });
|
|
74
227
|
}
|
|
75
228
|
restore() {
|
|
76
|
-
this.
|
|
229
|
+
this.emit({ k: "restore" });
|
|
77
230
|
}
|
|
78
231
|
translate(x, y) {
|
|
79
|
-
this.
|
|
232
|
+
this.emit({ k: "translate", x, y });
|
|
80
233
|
}
|
|
81
234
|
rotate(r) {
|
|
82
|
-
this.
|
|
235
|
+
this.emit({ k: "rotate", r });
|
|
83
236
|
}
|
|
84
237
|
scale(sx, sy) {
|
|
85
|
-
this.
|
|
238
|
+
this.emit({ k: "scale", sx, sy });
|
|
86
239
|
}
|
|
87
240
|
setTransform(t) {
|
|
88
|
-
this.
|
|
241
|
+
this.emit({ k: "setTransform", t });
|
|
89
242
|
}
|
|
90
243
|
resetTransform() {
|
|
91
|
-
this.
|
|
244
|
+
this.emit({ k: "resetTransform" });
|
|
92
245
|
}
|
|
93
246
|
beginPath() {
|
|
94
|
-
this.
|
|
247
|
+
this.emit({ k: "beginPath" });
|
|
95
248
|
}
|
|
96
249
|
closePath() {
|
|
97
|
-
this.
|
|
250
|
+
this.emit({ k: "closePath" });
|
|
98
251
|
}
|
|
99
252
|
moveTo(x, y) {
|
|
100
|
-
this.
|
|
253
|
+
this.emit({ k: "moveTo", x, y });
|
|
101
254
|
}
|
|
102
255
|
lineTo(x, y) {
|
|
103
|
-
this.
|
|
256
|
+
this.emit({ k: "lineTo", x, y });
|
|
104
257
|
}
|
|
105
258
|
quadraticCurveTo(cx, cy, x, y) {
|
|
106
|
-
this.
|
|
259
|
+
this.emit({ k: "quadraticCurveTo", cx, cy, x, y });
|
|
107
260
|
}
|
|
108
261
|
bezierCurveTo(c1x, c1y, c2x, c2y, x, y) {
|
|
109
|
-
this.
|
|
262
|
+
this.emit({ k: "bezierCurveTo", c1x, c1y, c2x, c2y, x, y });
|
|
110
263
|
}
|
|
111
264
|
rect(x, y, w, h) {
|
|
112
|
-
this.
|
|
265
|
+
this.emit({ k: "rect", x, y, w, h });
|
|
113
266
|
}
|
|
114
267
|
ellipse(cx, cy, rx, ry) {
|
|
115
|
-
this.
|
|
268
|
+
this.emit({ k: "ellipse", cx, cy, rx, ry });
|
|
116
269
|
}
|
|
117
270
|
fill(rule) {
|
|
118
|
-
this.
|
|
271
|
+
this.emit(rule !== undefined ? { k: "fill", rule } : { k: "fill" });
|
|
119
272
|
}
|
|
120
273
|
stroke() {
|
|
121
|
-
this.
|
|
274
|
+
this.emit({ k: "stroke" });
|
|
122
275
|
}
|
|
123
276
|
fillText(text, x, y, maxWidth) {
|
|
124
|
-
this.
|
|
277
|
+
this.emit(maxWidth !== undefined
|
|
125
278
|
? { k: "fillText", text, x, y, maxWidth }
|
|
126
279
|
: { k: "fillText", text, x, y });
|
|
127
280
|
}
|
|
128
281
|
measureText(text) {
|
|
129
|
-
//
|
|
130
|
-
//
|
|
131
|
-
//
|
|
132
|
-
//
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
this.
|
|
282
|
+
// Measure on a hidden 2D context with the active font, matching the
|
|
283
|
+
// worker's Canvas2D target — so caret / selection geometry on the
|
|
284
|
+
// offscreen backend lines up with the drawn glyphs. Falls back to a
|
|
285
|
+
// proportional estimate where `OffscreenCanvas` is unavailable.
|
|
286
|
+
const ctx = this.ensureMeasureCtx();
|
|
287
|
+
if (!ctx)
|
|
288
|
+
return { width: text.length * (Number.parseFloat(this.fontSpec) || 8) * 0.5 };
|
|
289
|
+
ctx.font = this.fontSpec;
|
|
290
|
+
return { width: ctx.measureText(text).width };
|
|
291
|
+
}
|
|
292
|
+
ensureMeasureCtx() {
|
|
293
|
+
if (this.measureCtx)
|
|
294
|
+
return this.measureCtx;
|
|
295
|
+
if (typeof OffscreenCanvas === "undefined")
|
|
296
|
+
return null;
|
|
297
|
+
const ctx = new OffscreenCanvas(1, 1).getContext("2d");
|
|
298
|
+
// OffscreenCanvasRenderingContext2D is structurally compatible with the
|
|
299
|
+
// `font` / `measureText` members used here.
|
|
300
|
+
this.measureCtx = ctx ?? null;
|
|
301
|
+
return this.measureCtx;
|
|
302
|
+
}
|
|
303
|
+
drawImage(image, dx, dy, dw, dh, _dynamic) {
|
|
304
|
+
void _dynamic;
|
|
305
|
+
if (typeof ImageBitmap !== "undefined" && image instanceof ImageBitmap) {
|
|
306
|
+
let id = this.imageIds.get(image);
|
|
307
|
+
if (id === undefined) {
|
|
308
|
+
// First sight of this bitmap (or it was evicted): assign a fresh
|
|
309
|
+
// id and ship the pixels once via `defineImage`.
|
|
310
|
+
id = this.nextImageId++;
|
|
311
|
+
this.imageIds.set(image, id);
|
|
312
|
+
this.emit({ k: "defineImage", id, bitmap: image });
|
|
313
|
+
}
|
|
314
|
+
this.emit({ k: "drawImage", id, dx, dy, dw, dh });
|
|
315
|
+
}
|
|
316
|
+
else {
|
|
317
|
+
this.skippedImageDraws++;
|
|
318
|
+
}
|
|
137
319
|
}
|
|
138
320
|
clear(bounds) {
|
|
139
|
-
this.
|
|
321
|
+
this.emit(bounds !== undefined ? { k: "clear", bounds } : { k: "clear" });
|
|
140
322
|
}
|
|
141
323
|
markDirty(bounds) {
|
|
142
|
-
this.
|
|
324
|
+
this.emit({ k: "markDirty", bounds });
|
|
143
325
|
}
|
|
144
326
|
}
|
|
145
327
|
/**
|
|
146
328
|
* Replay a previously-flushed command buffer onto a real RenderTarget.
|
|
147
329
|
* Used by the worker entry point to apply commands shipped from the
|
|
148
330
|
* main thread.
|
|
331
|
+
*
|
|
332
|
+
* `images` holds the bitmaps interned by {@link RecordingTarget}: a
|
|
333
|
+
* `defineImage` stores one under its id, a `drawImage` looks it up. The
|
|
334
|
+
* caller (worker) owns this cache so it survives across replays and
|
|
335
|
+
* mirrors the recorder's same-capacity LRU. When omitted (callers with
|
|
336
|
+
* no image commands) a throwaway cache is used.
|
|
149
337
|
*/
|
|
150
|
-
export const replayCommands = (target, commands) => {
|
|
338
|
+
export const replayCommands = (target, commands, images = new LruCache(OFFSCREEN_IMAGE_CACHE_CAP)) => {
|
|
151
339
|
for (const cmd of commands) {
|
|
152
340
|
switch (cmd.k) {
|
|
153
341
|
case "setFill":
|
|
@@ -254,6 +442,18 @@ export const replayCommands = (target, commands) => {
|
|
|
254
442
|
// resizes via its own `resize` message, not via the command
|
|
255
443
|
// stream.
|
|
256
444
|
break;
|
|
445
|
+
case "defineImage":
|
|
446
|
+
images.set(cmd.id, cmd.bitmap);
|
|
447
|
+
break;
|
|
448
|
+
case "drawImage": {
|
|
449
|
+
// `get` bumps recency so the worker LRU evicts in lockstep with
|
|
450
|
+
// the recorder's. A miss means an out-of-sync stream — skip
|
|
451
|
+
// rather than throw (matches the non-drawable skip on record).
|
|
452
|
+
const bitmap = images.get(cmd.id);
|
|
453
|
+
if (bitmap)
|
|
454
|
+
target.drawImage(bitmap, cmd.dx, cmd.dy, cmd.dw, cmd.dh);
|
|
455
|
+
break;
|
|
456
|
+
}
|
|
257
457
|
}
|
|
258
458
|
}
|
|
259
459
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recording-target.js","sourceRoot":"","sources":["../src/recording-target.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"recording-target.js","sourceRoot":"","sources":["../src/recording-target.ts"],"names":[],"mappings":"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"}
|
package/dist/render-worker.js
CHANGED
|
@@ -1,8 +1,17 @@
|
|
|
1
1
|
/// <reference lib="webworker" />
|
|
2
|
-
import { installBuiltinRenderers, renderScene } from "@oh-just-another/renderer-core";
|
|
2
|
+
import { LruCache, installBuiltinRenderers, renderScene } from "@oh-just-another/renderer-core";
|
|
3
|
+
import { registerBundledFonts } from "@oh-just-another/fonts";
|
|
3
4
|
import { Canvas2DTarget } from "./canvas-target.js";
|
|
4
5
|
import { replayCommands } from "./recording-target.js";
|
|
5
|
-
|
|
6
|
+
import { OFFSCREEN_IMAGE_CACHE_CAP } from "./constants.js";
|
|
7
|
+
const state = {
|
|
8
|
+
canvas: null,
|
|
9
|
+
target: null,
|
|
10
|
+
dpr: 1,
|
|
11
|
+
images: new LruCache(OFFSCREEN_IMAGE_CACHE_CAP, (_id, bitmap) => {
|
|
12
|
+
bitmap.close();
|
|
13
|
+
}),
|
|
14
|
+
};
|
|
6
15
|
let renderersInstalled = false;
|
|
7
16
|
const ensureRenderers = () => {
|
|
8
17
|
if (renderersInstalled)
|
|
@@ -19,6 +28,10 @@ const post = (msg, transfer) => {
|
|
|
19
28
|
}
|
|
20
29
|
};
|
|
21
30
|
const init = (canvas, width, height, dpr) => {
|
|
31
|
+
// Load the bundled fonts into the worker's font set so its Canvas2D target
|
|
32
|
+
// draws the same faces as the main thread. Fire-and-forget — replays after
|
|
33
|
+
// it resolves pick up the loaded fonts.
|
|
34
|
+
void registerBundledFonts(self);
|
|
22
35
|
state.canvas = canvas;
|
|
23
36
|
state.dpr = dpr;
|
|
24
37
|
// Resize the bitmap to dpr-scaled pixels — the host's CSS size is
|
|
@@ -74,7 +87,7 @@ const replay = (commands) => {
|
|
|
74
87
|
post({ type: "error", message: "Worker not initialised" });
|
|
75
88
|
return;
|
|
76
89
|
}
|
|
77
|
-
replayCommands(state.target, commands);
|
|
90
|
+
replayCommands(state.target, commands, state.images);
|
|
78
91
|
};
|
|
79
92
|
self.addEventListener("message", (ev) => {
|
|
80
93
|
const msg = ev.data;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render-worker.js","sourceRoot":"","sources":["../src/render-worker.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,OAAO,EAAE,uBAAuB,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"render-worker.js","sourceRoot":"","sources":["../src/render-worker.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type TileCache } from "@oh-just-another/renderer-core";
|
|
2
2
|
import type { Bounds, ElementId } from "@oh-just-another/types";
|
|
3
|
-
import { type Scene } from "@oh-just-another/scene";
|
|
3
|
+
import { type SpatialGrid, type Scene, type Element } from "@oh-just-another/scene";
|
|
4
4
|
import type { Canvas2DTarget } from "./canvas-target.js";
|
|
5
5
|
/**
|
|
6
6
|
* Main-thread Canvas2D tile compositor.
|
|
@@ -39,6 +39,48 @@ export interface RenderViaTilesOptions {
|
|
|
39
39
|
readonly changedElements?: ReadonlyMap<ElementId, ChangedElementRecord>;
|
|
40
40
|
/** Current zoom (used to pick the cache bucket). */
|
|
41
41
|
readonly zoomBucket: number;
|
|
42
|
+
/**
|
|
43
|
+
* Optional spatial index over the scene's current element world-AABBs,
|
|
44
|
+
* keyed by element id. When supplied, per-tile element selection queries
|
|
45
|
+
* the index (`query(tileBounds)`) instead of scanning every shape in
|
|
46
|
+
* every layer — O(shapes + Σtiles·candidates) vs O(tiles×shapes). The
|
|
47
|
+
* index must hold the same bounds `getElementWorldBounds` returns for the
|
|
48
|
+
* current frame (a stale index rasterises wrong tiles). Omit it to fall
|
|
49
|
+
* back to the full scan, which is always correct — callers without a
|
|
50
|
+
* persistent index pay nothing and behave exactly as before.
|
|
51
|
+
*/
|
|
52
|
+
readonly index?: SpatialGrid;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Precomputed draw-order lookup used by the indexed tile-query path.
|
|
56
|
+
*
|
|
57
|
+
* The spatial index returns candidate ids in arbitrary order, but tiles
|
|
58
|
+
* must rasterise shapes in global z-order (layer order, then in-layer
|
|
59
|
+
* order) or overlapping fills composite wrong. Building this once per
|
|
60
|
+
* frame — a single O(shapes) walk over the ordered layers — lets each
|
|
61
|
+
* tile map its (few) candidate ids back to elements and re-sort them by
|
|
62
|
+
* draw order without re-walking the whole scene per tile.
|
|
63
|
+
*/
|
|
64
|
+
interface DrawOrderIndex {
|
|
65
|
+
/** Element id → element reference (visible layers only). */
|
|
66
|
+
readonly byId: ReadonlyMap<ElementId, Element>;
|
|
67
|
+
/** Element id → global draw-order rank (ascending = drawn first). */
|
|
68
|
+
readonly order: ReadonlyMap<ElementId, number>;
|
|
42
69
|
}
|
|
70
|
+
/** @internal Exported for unit tests; not part of the package API. */
|
|
71
|
+
export declare const buildDrawOrderIndex: (scene: Scene) => DrawOrderIndex;
|
|
43
72
|
export declare const renderViaTiles: (scene: Scene, mainTarget: Canvas2DTarget, options: RenderViaTilesOptions) => void;
|
|
73
|
+
/** @internal Exported for unit tests; not part of the package API. */
|
|
74
|
+
export declare const elementsIntersectingTile: (scene: Scene, tileBounds: Bounds) => readonly Element[];
|
|
75
|
+
/**
|
|
76
|
+
* Index-backed equivalent of {@link elementsIntersectingTile}. Queries the
|
|
77
|
+
* spatial index for candidate ids overlapping the tile, filters them
|
|
78
|
+
* against the precise world-AABB (same predicate the full scan uses), then
|
|
79
|
+
* restores global draw order via `drawOrder.order`. Returns the identical
|
|
80
|
+
* set and ordering as the full scan for a correctly-populated index — only
|
|
81
|
+
* the work is O(candidates) instead of O(shapes).
|
|
82
|
+
*/
|
|
83
|
+
/** @internal Exported for unit tests; not part of the package API. */
|
|
84
|
+
export declare const elementsIntersectingTileIndexed: (index: SpatialGrid, drawOrder: DrawOrderIndex, tileBounds: Bounds) => readonly Element[];
|
|
85
|
+
export {};
|
|
44
86
|
//# sourceMappingURL=tile-compositor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tile-compositor.d.ts","sourceRoot":"","sources":["../src/tile-compositor.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,SAAS,EAGf,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAIL,KAAK,KAAK,
|
|
1
|
+
{"version":3,"file":"tile-compositor.d.ts","sourceRoot":"","sources":["../src/tile-compositor.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,SAAS,EAGf,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAChE,OAAO,EAIL,KAAK,WAAW,EAChB,KAAK,KAAK,EACV,KAAK,OAAO,EACb,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGzD;;;;;;;;;;;;;GAaG;AAEH,MAAM,WAAW,oBAAoB;IACnC,mFAAmF;IACnF,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,oFAAoF;IACpF,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,qBAAqB;IACpC,qEAAqE;IACrE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,2DAA2D;IAC3D,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,eAAe,CAAC,CAAC;IAC3C;;;;;;;;OAQG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,WAAW,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC;IACxE,oDAAoD;IACpD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B;;;;;;;;;OASG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC;CAC9B;AAED;;;;;;;;;GASG;AACH,UAAU,cAAc;IACtB,4DAA4D;IAC5D,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC/C,qEAAqE;IACrE,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;CAChD;AAED,sEAAsE;AACtE,eAAO,MAAM,mBAAmB,GAAI,OAAO,KAAK,KAAG,cAYlD,CAAC;AAEF,eAAO,MAAM,cAAc,GACzB,OAAO,KAAK,EACZ,YAAY,cAAc,EAC1B,SAAS,qBAAqB,KAC7B,IA8CF,CAAC;AAiEF,sEAAsE;AACtE,eAAO,MAAM,wBAAwB,GAAI,OAAO,KAAK,EAAE,YAAY,MAAM,KAAG,SAAS,OAAO,EAU3F,CAAC;AAEF;;;;;;;GAOG;AACH,sEAAsE;AACtE,eAAO,MAAM,+BAA+B,GAC1C,OAAO,WAAW,EAClB,WAAW,cAAc,EACzB,YAAY,MAAM,KACjB,SAAS,OAAO,EAUlB,CAAC"}
|