@swf2es/native 0.1.18 → 0.1.20

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.
@@ -26,6 +26,17 @@ const RANGE = 5;
26
26
  */
27
27
  export class Tessellator {
28
28
  instance = null;
29
+ /**
30
+ * The instance's whole memory as each kind a layer reads and writes, made again once growth
31
+ * detaches them (their length 0) or the instance is another: a view made for each array of each
32
+ * call cost a drawing made again every frame as much as the copies.
33
+ */
34
+ f64 = new Float64Array(0);
35
+ i32 = new Int32Array(0);
36
+ u32 = new Uint32Array(0);
37
+ u16 = new Uint16Array(0);
38
+ u8 = new Uint8Array(0);
39
+ viewed = null;
29
40
  limit;
30
41
  keep;
31
42
  bands;
@@ -58,7 +69,7 @@ export class Tessellator {
58
69
  return (this.instance?.memory.buffer.byteLength ?? 0) + this.lines.capacity;
59
70
  }
60
71
  dispose() {
61
- this.instance = null;
72
+ this.release();
62
73
  this.lines.dispose();
63
74
  }
64
75
  /** The instance, made on first use, its arena reset; filling by the bands alone where `bands`. */
@@ -72,16 +83,38 @@ export class Tessellator {
72
83
  x.bandsOnly(Number(bands));
73
84
  return x;
74
85
  }
86
+ /** `x`'s memory viewed as it is now (f64 and the rest). */
87
+ view(x) {
88
+ if (this.viewed !== x || this.u8.length === 0) {
89
+ const buffer = x.memory.buffer;
90
+ this.f64 = new Float64Array(buffer, 0, buffer.byteLength >> 3);
91
+ this.i32 = new Int32Array(buffer);
92
+ this.u32 = new Uint32Array(buffer);
93
+ this.u16 = new Uint16Array(buffer);
94
+ this.u8 = new Uint8Array(buffer);
95
+ this.viewed = x;
96
+ }
97
+ }
75
98
  /** A call that threw: a trapped instance is never used again. */
76
99
  failed() {
77
100
  // In particular, longjmp unwinds through a throwing import: never resume that C instance. The
78
101
  // line builder's instance is its own.
102
+ this.release();
103
+ }
104
+ /** The instance let go of, and the views that would keep its memory. */
105
+ release() {
79
106
  this.instance = null;
107
+ this.viewed = null;
108
+ this.f64 = new Float64Array(0);
109
+ this.i32 = new Int32Array(0);
110
+ this.u32 = new Uint32Array(0);
111
+ this.u16 = new Uint16Array(0);
112
+ this.u8 = new Uint8Array(0);
80
113
  }
81
114
  /** An instance grown past what is kept, let go. */
82
115
  trim() {
83
116
  if ((this.instance?.memory.buffer.byteLength ?? 0) > this.keep) {
84
- this.instance = null;
117
+ this.release();
85
118
  }
86
119
  }
87
120
  /** One fill. The module checks the coordinates; only the arrays' lengths are looked at here. */
@@ -138,23 +171,19 @@ export class Tessellator {
138
171
  }
139
172
  }
140
173
  /** Each fill flattened and tessellated, as `fill` would make its polygons, in one call and one copy out. */
141
- layer = (fills, nonZero) => this.layerBy(fills, nonZero, this.bands);
174
+ layer = (fills, nonZero, borrowed = false) => this.layerBy(fills, nonZero, this.bands, borrowed);
142
175
  /** The layer, by the bands alone where `bands`; again so in a new instance where libtess2 trapped. */
143
- layerBy(fills, nonZero, bands) {
176
+ layerBy(fills, nonZero, bands, borrowed = false) {
144
177
  let length = 0;
145
178
  let contours = 0;
146
- const rules = new Uint8Array(fills.length);
147
179
  for (let i = 0; i < fills.length; i++) {
148
180
  const fill = fills[i];
149
- if (fill.length > MOST_CONTOURS) {
150
- rules[i] = REJECTED;
151
- continue;
152
- }
153
- for (let j = 0; j < fill.length; j++) {
154
- length += fill[j].length;
181
+ if (fill.length <= MOST_CONTOURS) {
182
+ for (let j = 0; j < fill.length; j++) {
183
+ length += fill[j].length;
184
+ }
185
+ contours += fill.length;
155
186
  }
156
- rules[i] = Number(nonZero[i]);
157
- contours += fill.length;
158
187
  }
159
188
  let ranges;
160
189
  let vertices;
@@ -169,22 +198,27 @@ export class Tessellator {
169
198
  const endsAt = commandAt + length * 8;
170
199
  const fillsAt = endsAt + contours * 4;
171
200
  const rulesAt = fillsAt + fills.length * 4;
172
- const commands = new Float64Array(x.memory.buffer, commandAt, length);
173
- const ends = new Uint32Array(x.memory.buffer, endsAt, contours);
174
- const lasts = new Uint32Array(x.memory.buffer, fillsAt, fills.length);
175
- new Uint8Array(x.memory.buffer, rulesAt, fills.length).set(rules);
201
+ this.view(x);
202
+ const commands = this.f64;
203
+ const ends = this.u32;
204
+ const rules = this.u8;
205
+ const command = commandAt >> 3;
176
206
  let at = 0;
177
207
  let contour = 0;
178
208
  for (let i = 0; i < fills.length; i++) {
179
- if (rules[i] !== REJECTED) {
180
- const fill = fills[i];
209
+ const fill = fills[i];
210
+ if (fill.length <= MOST_CONTOURS) {
181
211
  for (let j = 0; j < fill.length; j++) {
182
- commands.set(fill[j], at);
212
+ commands.set(fill[j], command + at);
183
213
  at += fill[j].length;
184
- ends[contour++] = at;
214
+ ends[(endsAt >> 2) + contour++] = at;
185
215
  }
216
+ rules[rulesAt + i] = Number(nonZero[i]);
217
+ }
218
+ else {
219
+ rules[rulesAt + i] = REJECTED;
186
220
  }
187
- lasts[i] = contour;
221
+ ends[(fillsAt >> 2) + i] = contour;
188
222
  }
189
223
  const head = x.layer(commandAt, length, endsAt, contours, fillsAt, rulesAt, fills.length);
190
224
  if (head === 0) {
@@ -194,13 +228,31 @@ export class Tessellator {
194
228
  : fills.map((fill, i) => this.alone(fill, nonZero[i], bands));
195
229
  }
196
230
  // The one copy out, its ranges read before a retry resets the arena.
197
- const buffer = x.memory.buffer;
198
- ranges = new Int32Array(buffer, head, LAYER + fills.length * RANGE).slice();
199
- vertices = new Float64Array(buffer, ranges[0], ranges[2] * 2).slice();
200
- indices =
201
- ranges[4] === 2
202
- ? new Uint16Array(buffer, ranges[1], ranges[3]).slice()
203
- : new Uint32Array(buffer, ranges[1], ranges[3]).slice();
231
+ this.view(x);
232
+ const count = LAYER + fills.length * RANGE;
233
+ ranges = this.i32.subarray(head >> 2, (head >> 2) + count);
234
+ // A fill that ran out is tried alone, which resets the arena under what is borrowed.
235
+ let lent = borrowed;
236
+ for (let i = 0; lent && i < fills.length; i++) {
237
+ lent = ranges[LAYER + i * RANGE] !== -1;
238
+ }
239
+ const vertexAt = ranges[0] >> 3;
240
+ const indexAt = ranges[1];
241
+ if (lent) {
242
+ vertices = this.f64.subarray(vertexAt, vertexAt + ranges[2] * 2);
243
+ indices =
244
+ ranges[4] === 2
245
+ ? this.u16.subarray(indexAt >> 1, (indexAt >> 1) + ranges[3])
246
+ : this.u32.subarray(indexAt >> 2, (indexAt >> 2) + ranges[3]);
247
+ }
248
+ else {
249
+ ranges = ranges.slice();
250
+ vertices = this.f64.slice(vertexAt, vertexAt + ranges[2] * 2);
251
+ indices =
252
+ ranges[4] === 2
253
+ ? this.u16.slice(indexAt >> 1, (indexAt >> 1) + ranges[3])
254
+ : this.u32.slice(indexAt >> 2, (indexAt >> 2) + ranges[3]);
255
+ }
204
256
  }
205
257
  catch {
206
258
  this.failed();
@@ -210,7 +262,7 @@ export class Tessellator {
210
262
  // libtess2 trapped: each fill in a fresh instance, and one that traps alone again by the
211
263
  // bands, which never trap.
212
264
  return fills.length === 1
213
- ? this.layerBy(fills, nonZero, true)
265
+ ? this.layerBy(fills, nonZero, true, borrowed)
214
266
  : fills.map((fill, i) => this.alone(fill, nonZero[i], false));
215
267
  }
216
268
  finally {
@@ -1 +1 @@
1
- {"version":3,"file":"tessellator.js","sourceRoot":"","sources":["../../src/render/tessellator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tessellator.js","sourceRoot":"","sources":["../../src/render/tessellator.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@swf2es/native",
3
- "version": "0.1.18",
3
+ "version": "0.1.20",
4
4
  "description": "swf2es's WebAssembly modules: bitmap kernels, MP3, ADPCM and Nellymoser decoding, zlib and LZMA, fill and line tessellation, and ATF textures",
5
5
  "keywords": [
6
6
  "swf",
@@ -9,9 +9,11 @@ import {
9
9
  type Progress,
10
10
  perlinRows,
11
11
  transformRows,
12
+ wordRuns,
12
13
  } from "./pixel-ops.js";
13
14
 
14
15
  export type { CopyOp, PerlinSetup, PixelRegion } from "./pixel-ops.js";
16
+ export { WORDS_PLAIN, WORDS_PREMULTIPLY, WORDS_SOLID, WORDS_UNMULTIPLY } from "./pixel-ops.js";
15
17
 
16
18
  export interface BitmapSource {
17
19
  width: number;
@@ -805,6 +807,24 @@ export class BitmapKernel {
805
807
  );
806
808
  }
807
809
 
810
+ /**
811
+ * The words of `from`, four bytes each, made into `into`, as long and
812
+ * maybe the same, the pixels of values or the values of pixels (`kind`,
813
+ * one of WORDS_*), reversed where `swap` (pixel-ops.ts): setPixels',
814
+ * setVector's, getPixels' and getVector's runs. How many bytes were
815
+ * made, from the first: all of them, or fewer where the module refused
816
+ * the rest, which are as they were.
817
+ */
818
+ words(into: Uint8Array, from: Uint8Array, kind: number, swap: boolean): number {
819
+ if (from.length % 4 !== 0 || into.length !== from.length) {
820
+ return 0;
821
+ }
822
+
823
+ const progress: Progress = { row: 0, state: 0 };
824
+ this.call((wasm) => (wordRuns(wasm, into, from, kind, swap, progress) ? true : null), true);
825
+ return Math.min(progress.row, from.length);
826
+ }
827
+
808
828
  /** perlinNoise over every pixel of a `width`-wide store: false where the module refused it. */
809
829
  perlin(pixels: Uint32Array, width: number, setup: PerlinSetup): boolean {
810
830
  if (!(width > 0) || pixels.length % width !== 0 || pixels.length === 0) {
@@ -13,6 +13,10 @@ export {
13
13
  type LayerFilter,
14
14
  type PerlinSetup,
15
15
  type PixelRegion,
16
+ WORDS_PLAIN,
17
+ WORDS_PREMULTIPLY,
18
+ WORDS_SOLID,
19
+ WORDS_UNMULTIPLY,
16
20
  } from "./bitmap-kernel.js";
17
21
  export {
18
22
  DRAW_OPAQUE,
@@ -20,6 +20,7 @@ export interface PixelExports {
20
20
  transformPixels(params: number): number;
21
21
  noisePixels(params: number): number;
22
22
  perlinPixels(params: number): number;
23
+ wordsPixels(params: number): number;
23
24
  }
24
25
 
25
26
  /** The rows of a band's work: about this much of the pixels it copies in. */
@@ -290,6 +291,54 @@ export function noiseRows(
290
291
  return true;
291
292
  }
292
293
 
294
+ /** What `wordRuns` makes of each word: pixels.zig's WordKind. */
295
+ export const WORDS_SOLID = 0;
296
+ export const WORDS_PREMULTIPLY = 1;
297
+ export const WORDS_UNMULTIPLY = 2;
298
+ export const WORDS_PLAIN = 3;
299
+
300
+ /**
301
+ * The words of `from`, four bytes each in the module's order, made the
302
+ * pixels of values or the values of pixels (`kind`) into `into`, as long,
303
+ * which may be `from`: bytes reversed, where `swap`, as the values' order
304
+ * asks. Band by band, which nothing but their size bounds: a word is made
305
+ * of itself alone. False where the module refused a band.
306
+ */
307
+ export function wordRuns(
308
+ wasm: PixelExports,
309
+ into: Uint8Array,
310
+ from: Uint8Array,
311
+ kind: number,
312
+ swap: boolean,
313
+ progress: Progress,
314
+ ): boolean {
315
+ for (; progress.row < from.length; progress.row += BAND_BYTES) {
316
+ const bytes = Math.min(BAND_BYTES, from.length - progress.row);
317
+ const at = wasm.resetArena(HEAD + bytes);
318
+ if (!at) {
319
+ return false;
320
+ }
321
+
322
+ const block = at + HEAD;
323
+ new Uint8Array(wasm.memory.buffer).set(
324
+ from.subarray(progress.row, progress.row + bytes),
325
+ block,
326
+ );
327
+ const params = new DataView(wasm.memory.buffer, at, HEAD);
328
+ params.setUint32(0, bytes >> 2, true);
329
+ params.setUint32(4, block, true);
330
+ params.setUint32(8, kind, true);
331
+ params.setUint32(12, Number(swap), true);
332
+ if (!wasm.wordsPixels(at)) {
333
+ return false;
334
+ }
335
+
336
+ into.set(new Uint8Array(wasm.memory.buffer, block, bytes), progress.row);
337
+ }
338
+
339
+ return true;
340
+ }
341
+
293
342
  /** perlinNoise's set-up, as turbulence.ts makes it of the seed and the call's arguments. */
294
343
  export interface PerlinSetup {
295
344
  lattice: Int32Array;
@@ -1,7 +1,10 @@
1
1
  import { LineBuilder } from "./lines.js";
2
2
  import { renderInstance, renderModule } from "./module.js";
3
3
 
4
- /** Buffers are owned by the caller; subsequent calls and disposal cannot change them. */
4
+ /**
5
+ * Buffers are owned by the caller; subsequent calls and disposal cannot change them, but for a
6
+ * layer asked for `borrowed` (FillTessellate.layer).
7
+ */
5
8
  export interface FillGeometry {
6
9
  vertices: Float64Array;
7
10
  indices: Uint16Array | Uint32Array;
@@ -21,10 +24,17 @@ export interface FillTessellate {
21
24
  * flattens itself: each fill's geometry, or null for one it refused, all
22
25
  * fills' positions and indices in one buffer each. Its output needs no checking: the module has checked
23
26
  * every coordinate finite and every index in range.
27
+ *
28
+ * Where `borrowed`, the geometries may be views of the module's memory,
29
+ * which the tessellator's next call of any kind overwrites: for a caller
30
+ * that reads them at once, as the player does for a drawing made again
31
+ * every frame, which the two buffers a layer otherwise takes cost more
32
+ * than the copy does.
24
33
  */
25
34
  layer(
26
35
  fills: readonly (readonly (readonly number[])[])[],
27
36
  nonZero: readonly boolean[],
37
+ borrowed?: boolean,
28
38
  ): (FillGeometry | null)[] | null;
29
39
  /** A layer's lines in one call, their outlines filled by the same libtess2 (LineBuilder). */
30
40
  lines: LineBuilder;
@@ -94,6 +104,17 @@ const RANGE = 5;
94
104
  */
95
105
  export class Tessellator {
96
106
  private instance: NativeExports | null = null;
107
+ /**
108
+ * The instance's whole memory as each kind a layer reads and writes, made again once growth
109
+ * detaches them (their length 0) or the instance is another: a view made for each array of each
110
+ * call cost a drawing made again every frame as much as the copies.
111
+ */
112
+ private f64 = new Float64Array(0);
113
+ private i32 = new Int32Array(0);
114
+ private u32 = new Uint32Array(0);
115
+ private u16 = new Uint16Array(0);
116
+ private u8 = new Uint8Array(0);
117
+ private viewed: NativeExports | null = null;
97
118
  private readonly limit: number;
98
119
  private readonly keep: number;
99
120
  private readonly bands: boolean;
@@ -132,7 +153,7 @@ export class Tessellator {
132
153
  }
133
154
 
134
155
  dispose(): void {
135
- this.instance = null;
156
+ this.release();
136
157
  this.lines.dispose();
137
158
  }
138
159
 
@@ -148,17 +169,41 @@ export class Tessellator {
148
169
  return x;
149
170
  }
150
171
 
172
+ /** `x`'s memory viewed as it is now (f64 and the rest). */
173
+ private view(x: NativeExports): void {
174
+ if (this.viewed !== x || this.u8.length === 0) {
175
+ const buffer = x.memory.buffer;
176
+ this.f64 = new Float64Array(buffer, 0, buffer.byteLength >> 3);
177
+ this.i32 = new Int32Array(buffer);
178
+ this.u32 = new Uint32Array(buffer);
179
+ this.u16 = new Uint16Array(buffer);
180
+ this.u8 = new Uint8Array(buffer);
181
+ this.viewed = x;
182
+ }
183
+ }
184
+
151
185
  /** A call that threw: a trapped instance is never used again. */
152
186
  private failed(): void {
153
187
  // In particular, longjmp unwinds through a throwing import: never resume that C instance. The
154
188
  // line builder's instance is its own.
189
+ this.release();
190
+ }
191
+
192
+ /** The instance let go of, and the views that would keep its memory. */
193
+ private release(): void {
155
194
  this.instance = null;
195
+ this.viewed = null;
196
+ this.f64 = new Float64Array(0);
197
+ this.i32 = new Int32Array(0);
198
+ this.u32 = new Uint32Array(0);
199
+ this.u16 = new Uint16Array(0);
200
+ this.u8 = new Uint8Array(0);
156
201
  }
157
202
 
158
203
  /** An instance grown past what is kept, let go. */
159
204
  private trim(): void {
160
205
  if ((this.instance?.memory.buffer.byteLength ?? 0) > this.keep) {
161
- this.instance = null;
206
+ this.release();
162
207
  }
163
208
  }
164
209
 
@@ -236,30 +281,27 @@ export class Tessellator {
236
281
  private readonly layer = (
237
282
  fills: readonly (readonly (readonly number[])[])[],
238
283
  nonZero: readonly boolean[],
239
- ): (FillGeometry | null)[] | null => this.layerBy(fills, nonZero, this.bands);
284
+ borrowed = false,
285
+ ): (FillGeometry | null)[] | null => this.layerBy(fills, nonZero, this.bands, borrowed);
240
286
 
241
287
  /** The layer, by the bands alone where `bands`; again so in a new instance where libtess2 trapped. */
242
288
  private layerBy(
243
289
  fills: readonly (readonly (readonly number[])[])[],
244
290
  nonZero: readonly boolean[],
245
291
  bands: boolean,
292
+ borrowed = false,
246
293
  ): (FillGeometry | null)[] | null {
247
294
  let length = 0;
248
295
  let contours = 0;
249
- const rules = new Uint8Array(fills.length);
250
296
  for (let i = 0; i < fills.length; i++) {
251
297
  const fill = fills[i];
252
- if (fill.length > MOST_CONTOURS) {
253
- rules[i] = REJECTED;
254
- continue;
255
- }
298
+ if (fill.length <= MOST_CONTOURS) {
299
+ for (let j = 0; j < fill.length; j++) {
300
+ length += fill[j].length;
301
+ }
256
302
 
257
- for (let j = 0; j < fill.length; j++) {
258
- length += fill[j].length;
303
+ contours += fill.length;
259
304
  }
260
-
261
- rules[i] = Number(nonZero[i]);
262
- contours += fill.length;
263
305
  }
264
306
 
265
307
  let ranges: Int32Array;
@@ -277,23 +319,28 @@ export class Tessellator {
277
319
  const fillsAt = endsAt + contours * 4;
278
320
  const rulesAt = fillsAt + fills.length * 4;
279
321
 
280
- const commands = new Float64Array(x.memory.buffer, commandAt, length);
281
- const ends = new Uint32Array(x.memory.buffer, endsAt, contours);
282
- const lasts = new Uint32Array(x.memory.buffer, fillsAt, fills.length);
283
- new Uint8Array(x.memory.buffer, rulesAt, fills.length).set(rules);
322
+ this.view(x);
323
+ const commands = this.f64;
324
+ const ends = this.u32;
325
+ const rules = this.u8;
326
+ const command = commandAt >> 3;
284
327
  let at = 0;
285
328
  let contour = 0;
286
329
  for (let i = 0; i < fills.length; i++) {
287
- if (rules[i] !== REJECTED) {
288
- const fill = fills[i];
330
+ const fill = fills[i];
331
+ if (fill.length <= MOST_CONTOURS) {
289
332
  for (let j = 0; j < fill.length; j++) {
290
- commands.set(fill[j], at);
333
+ commands.set(fill[j], command + at);
291
334
  at += fill[j].length;
292
- ends[contour++] = at;
335
+ ends[(endsAt >> 2) + contour++] = at;
293
336
  }
337
+
338
+ rules[rulesAt + i] = Number(nonZero[i]);
339
+ } else {
340
+ rules[rulesAt + i] = REJECTED;
294
341
  }
295
342
 
296
- lasts[i] = contour;
343
+ ends[(fillsAt >> 2) + i] = contour;
297
344
  }
298
345
 
299
346
  const head = x.layer(commandAt, length, endsAt, contours, fillsAt, rulesAt, fills.length);
@@ -305,13 +352,31 @@ export class Tessellator {
305
352
  }
306
353
 
307
354
  // The one copy out, its ranges read before a retry resets the arena.
308
- const buffer = x.memory.buffer;
309
- ranges = new Int32Array(buffer, head, LAYER + fills.length * RANGE).slice();
310
- vertices = new Float64Array(buffer, ranges[0], ranges[2] * 2).slice();
311
- indices =
312
- ranges[4] === 2
313
- ? new Uint16Array(buffer, ranges[1], ranges[3]).slice()
314
- : new Uint32Array(buffer, ranges[1], ranges[3]).slice();
355
+ this.view(x);
356
+ const count = LAYER + fills.length * RANGE;
357
+ ranges = this.i32.subarray(head >> 2, (head >> 2) + count);
358
+ // A fill that ran out is tried alone, which resets the arena under what is borrowed.
359
+ let lent = borrowed;
360
+ for (let i = 0; lent && i < fills.length; i++) {
361
+ lent = ranges[LAYER + i * RANGE] !== -1;
362
+ }
363
+
364
+ const vertexAt = ranges[0] >> 3;
365
+ const indexAt = ranges[1];
366
+ if (lent) {
367
+ vertices = this.f64.subarray(vertexAt, vertexAt + ranges[2] * 2);
368
+ indices =
369
+ ranges[4] === 2
370
+ ? this.u16.subarray(indexAt >> 1, (indexAt >> 1) + ranges[3])
371
+ : this.u32.subarray(indexAt >> 2, (indexAt >> 2) + ranges[3]);
372
+ } else {
373
+ ranges = ranges.slice();
374
+ vertices = this.f64.slice(vertexAt, vertexAt + ranges[2] * 2);
375
+ indices =
376
+ ranges[4] === 2
377
+ ? this.u16.slice(indexAt >> 1, (indexAt >> 1) + ranges[3])
378
+ : this.u32.slice(indexAt >> 2, (indexAt >> 2) + ranges[3]);
379
+ }
315
380
  } catch {
316
381
  this.failed();
317
382
  if (bands) {
@@ -321,7 +386,7 @@ export class Tessellator {
321
386
  // libtess2 trapped: each fill in a fresh instance, and one that traps alone again by the
322
387
  // bands, which never trap.
323
388
  return fills.length === 1
324
- ? this.layerBy(fills, nonZero, true)
389
+ ? this.layerBy(fills, nonZero, true, borrowed)
325
390
  : fills.map((fill, i) => this.alone(fill, nonZero[i], false));
326
391
  } finally {
327
392
  this.trim();