@reearth/ezu 0.2.0 → 0.4.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/README.md CHANGED
@@ -1,9 +1,10 @@
1
- # ezu
1
+ # @reearth/ezu
2
2
 
3
3
  Painterly map renderer compiled to WebAssembly. The JS side owns all I/O
4
4
  (HTTP, PMTiles, asset fetching); this package exposes a stateful
5
- `Renderer` that holds a parsed style document, its built graph, and an
6
- in-memory brush bank — it renders one tile at a time from raw MVT bytes.
5
+ `Renderer` that holds a parsed style document, its built graph, an
6
+ in-memory brush bank, and a per-tile binding buffer that mirrors the
7
+ style's `sources` block.
7
8
 
8
9
  ## Install
9
10
 
@@ -29,7 +30,9 @@ The package ships three builds and picks one automatically via the
29
30
  import { Renderer } from "@reearth/ezu";
30
31
 
31
32
  const renderer = new Renderer(styleJson);
32
- const png = renderer.render(mvtBytes, z, x, y);
33
+ renderer.bindSource("basemap", mvtBytes);
34
+ const png = renderer.renderTile(z, x, y);
35
+ renderer.clearSources();
33
36
  ```
34
37
 
35
38
  ### Browser (native ESM, no bundler)
@@ -54,34 +57,81 @@ function simdEnabled(): boolean;
54
57
  class Renderer {
55
58
  constructor(styleJson: string);
56
59
 
57
- setStyle(styleJson: string): number;
58
- registerBrush(name: string, mybJson: string): void;
59
- unregisterBrush(name: string): boolean;
60
- clearBrushes(): void;
61
- brushCount(): number;
60
+ setStyle(styleJson: string): number; // → new node count
62
61
  readonly tileSize: number;
63
62
 
64
- render(mvtBytes: Uint8Array | null, z: number, x: number, y: number): Uint8Array; // PNG
65
- renderWebp(mvtBytes: Uint8Array | null, z: number, x: number, y: number): Uint8Array; // lossless WebP
66
- renderRgba(mvtBytes: Uint8Array | null, z: number, x: number, y: number): Uint8Array; // straight RGBA
67
-
68
- renderAt(mvtBytes: Uint8Array | null, z: number, x: number, y: number,
69
- tileSize: number, pad: number): Uint8Array;
70
- renderWebpAt(mvtBytes: Uint8Array | null, z: number, x: number, y: number,
71
- tileSize: number, pad: number): Uint8Array;
72
- renderRgbaAt(mvtBytes: Uint8Array | null, z: number, x: number, y: number,
73
- tileSize: number, pad: number): Uint8Array;
63
+ // Bind tile bytes under a `sources.<name>` entry from the style.
64
+ // The renderer dispatches on the source's declared `type`:
65
+ // - brush → parse `.myb` JSON, persistent
66
+ // - image → decode PNG/WebP, persistent
67
+ // - mvt/pmtiles → decode at render time, cleared by `clearSources`
68
+ // - dem → decode + stitch at render time. Pass each neighbour
69
+ // tile with `{ coord: [dx, dy] }` (dx, dy ∈ {-1, 0, 1}).
70
+ bindSource(name: string, bytes: Uint8Array,
71
+ opts?: { coord?: [number, number] }): void;
72
+ clearSources(): void;
73
+ boundSources(): string[]; // names with at least one pending tile-scoped binding
74
+
75
+ // Single unified render. `opts.format` picks the encoder; `tileSize`
76
+ // / `pad` override the canvas for hi-DPI / preview.
77
+ renderTile(z: number, x: number, y: number, opts?: {
78
+ format?: "png" | "webp" | "rgba"; // default "png"
79
+ tileSize?: number;
80
+ pad?: number;
81
+ png?: { compression?: "fast" | "default" | "best" };
82
+ }): Uint8Array;
74
83
 
75
84
  free(): void;
76
85
  }
77
86
  ```
78
87
 
79
- Pass `null` for `mvtBytes` to render the style's paper background only
80
- (out-of-range tiles, archive misses, etc.).
88
+ ## Output formats
89
+
90
+ - **`format: "png"`** (default) returns PNG bytes — feed to `<img>`
91
+ via `URL.createObjectURL(new Blob([buf], { type: "image/png" }))`.
92
+ - **`format: "webp"`** returns lossless WebP bytes (~15 % smaller
93
+ than PNG on painterly tiles). Pure-Rust encoder, no native deps.
94
+ - **`format: "rgba"`** returns straight (un-premultiplied) 8-bit
95
+ RGBA bytes (`tile_size * tile_size * 4`) — feed directly to
96
+ `ctx.putImageData(new ImageData(new Uint8ClampedArray(buf.buffer), w, h), 0, 0)`
97
+ and skip the PNG decode round trip.
98
+
99
+ WebP is lossless via `image-webp` and has no quality knob — for
100
+ lossy WebP without C deps, render as `"rgba"` then call
101
+ `OffscreenCanvas.convertToBlob({ type: "image/webp", quality })`.
102
+
103
+ ## Missing tiles
104
+
105
+ Don't bind any MVT source for that tile — `renderTile` returns the
106
+ style's paper background. `features` source nodes see no
107
+ `tile.<layer>` binding and emit an empty layer, so downstream paint
108
+ nodes short-circuit.
109
+
110
+ ## Errors
81
111
 
82
- Errors are thrown as JavaScript `Error` instances whose `.name`
83
- discriminates the kind: `InvalidStyle`, `BrushParse`, `MvtDecode`,
84
- `RenderFailed`, `PngEncode`, `WebpEncode`.
112
+ Every fallible method throws a JavaScript `Error` whose `.name`
113
+ discriminates the kind:
114
+
115
+ | `.name` | When |
116
+ |---|---|
117
+ | `InvalidStyle` | `new Renderer(...)` / `setStyle(...)` rejected the JSON |
118
+ | `BrushParse` | `registerBrush(...)` or `bindSource` on a brush source couldn't parse the `.myb` JSON |
119
+ | `MvtDecode` | `bindSource` (mvt/pmtiles) or render couldn't decode the MVT bytes |
120
+ | `DemDecode` | `bindSource` (dem) couldn't decode the raster-DEM tile |
121
+ | `UnknownSource`| `bindSource` was given a name not in the style's `sources` block, or `coord` was malformed |
122
+ | `RenderFailed` | A node `eval` failed (e.g. missing brush, downcast mismatch) |
123
+ | `PngEncode` | PNG encoding failed |
124
+ | `WebpEncode` | WebP encoding failed |
125
+
126
+ ```js
127
+ try {
128
+ await loadAndRender();
129
+ } catch (e) {
130
+ if (e.name === "InvalidStyle") showStyleError(e.message);
131
+ else if (e.name === "MvtDecode") showFetchError(e.message);
132
+ else throw e;
133
+ }
134
+ ```
85
135
 
86
136
  ## License
87
137
 
package/bundler/ezu.d.ts CHANGED
@@ -38,6 +38,10 @@ export class LogSink {
38
38
  /**
39
39
  * Set (or clear with `null` / `undefined`) the per-event JS
40
40
  * callback. The callback receives a structured record object.
41
+ *
42
+ * No-op in multithreaded (`threads`) builds — events can originate
43
+ * on rayon worker threads, so live forwarding to a main-thread JS
44
+ * callback isn't available. Use `drain` / `drainLines` instead.
41
45
  */
42
46
  onEvent(callback?: Function | null): void;
43
47
  /**
@@ -58,64 +62,61 @@ export class Renderer {
58
62
  free(): void;
59
63
  [Symbol.dispose](): void;
60
64
  /**
61
- * Number of brushes currently registered.
62
- */
63
- brushCount(): number;
64
- /**
65
- * Drop every registered brush.
66
- */
67
- clearBrushes(): void;
68
- /**
69
- * Build a renderer from a style JSON document.
70
- */
71
- constructor(style_json: string);
72
- /**
73
- * Register a `.myb` brush under `name` so a `brush-file` node with
74
- * `src: "@name"` (via the style's `assets` map) resolves to it.
75
- * Re-registering the same name replaces the previous entry.
76
- */
77
- registerBrush(name: string, myb_json: string): void;
78
- /**
79
- * Render a single tile to PNG bytes using the style's `tile-size` / `pad`.
80
- * Pass `null` for `mvtBytes` to get a paper-only tile.
65
+ * Bind raw tile bytes under a `sources.<name>` entry from the style.
66
+ * The renderer dispatches on the source's declared `type`:
81
67
  *
82
- * Optional `options`: `{ png: { compression: 'fast' | 'default' | 'best' } }`.
83
- */
84
- render(mvt_bytes: Uint8Array | null | undefined, z: number, x: number, y: number, options?: object | null): Uint8Array;
85
- /**
86
- * Like `render` but with `tile_size` / `pad` overridden — useful for
87
- * hi-DPI / preview rendering without mutating the style.
68
+ * - `mvt` / `pmtiles` → store raw MVT bytes per `(dx, dy)` neighbour
69
+ * offset (centre `coord: [0, 0]`, the default). Layers are bound as
70
+ * `<source>.<layer>` (centre) or `<source>.<layer>@dx,dy`
71
+ * (neighbours) when [`render_tile`] runs. Binding only the centre
72
+ * degrades cross-tile label collision to centre-only at borders.
73
+ * - `dem` / `raster` → store the raw bytes per `(dx, dy)` neighbour
74
+ * offset. The centre tile is `coord: [0, 0]` (default). Decoding
75
+ * and 3×3 stitching happen at render time once the tile id is known.
76
+ * - `geojson` (remote) → store raw bytes per `(dx, dy)` offset;
77
+ * projected per tile (and neighbour) at render time.
78
+ *
79
+ * `opts` is a JS object: `{ coord?: [dx, dy] }`. Throws
80
+ * `UnknownSource` if `name` doesn't match any entry in the style's
81
+ * `sources` block, `MvtDecode` if MVT bytes don't parse, and
82
+ * `DemDecode` for non-image DEM bytes (the decode itself runs at
83
+ * render time, but obvious cases are caught here).
88
84
  */
89
- renderAt(mvt_bytes: Uint8Array | null | undefined, z: number, x: number, y: number, tile_size: number, pad: number, options?: object | null): Uint8Array;
85
+ bindSource(name: string, bytes: Uint8Array, opts?: object | null): void;
90
86
  /**
91
- * Render a single tile to straight RGBA8 bytes (`tile_w * tile_h * 4`).
87
+ * Names of every source with at least one pending binding.
88
+ * Order matches the style's `sources` declaration order.
92
89
  */
93
- renderRgba(mvt_bytes: Uint8Array | null | undefined, z: number, x: number, y: number): Uint8Array;
90
+ boundSources(): string[];
94
91
  /**
95
- * Like `renderRgba` but with `tile_size` / `pad` overridden.
92
+ * Drop every pending source binding. Call between tile renders.
96
93
  */
97
- renderRgbaAt(mvt_bytes: Uint8Array | null | undefined, z: number, x: number, y: number, tile_size: number, pad: number): Uint8Array;
94
+ clearSources(): void;
98
95
  /**
99
- * Render a single tile to lossless WebP bytes. Smaller than PNG
100
- * for the same painterly content and decoded natively by every
101
- * modern browser. WebP is lossless-only via the pure-Rust
102
- * `image-webp` codec; for lossy WebP, see the
103
- * `OffscreenCanvas.convertToBlob` recipe in the crate README.
96
+ * Build a renderer from a style JSON document.
104
97
  */
105
- renderWebp(mvt_bytes: Uint8Array | null | undefined, z: number, x: number, y: number, options?: object | null): Uint8Array;
98
+ constructor(style_json: string);
106
99
  /**
107
- * Like `renderWebp` but with `tile_size` / `pad` overridden.
100
+ * Render a single tile using whatever sources are currently bound.
101
+ *
102
+ * `opts` (JS object, all fields optional):
103
+ * - `format`: `"png"` (default) / `"webp"` / `"rgba"`
104
+ * - `tileSize`, `pad`: override the style's canvas size for this
105
+ * call (hi-DPI / preview)
106
+ * - `png`: `{ compression?: "fast" | "default" | "best" }`
108
107
  */
109
- renderWebpAt(mvt_bytes: Uint8Array | null | undefined, z: number, x: number, y: number, tile_size: number, pad: number, options?: object | null): Uint8Array;
108
+ renderTile(z: number, x: number, y: number, opts?: object | null): Uint8Array;
110
109
  /**
111
110
  * Replace the active style. Returns the new node count. Invalidates
112
- * the intermediate cache.
111
+ * the intermediate cache and drops any pending source bindings.
113
112
  */
114
113
  setStyle(style_json: string): number;
115
114
  /**
116
- * Remove a brush by name. Returns `true` if the brush existed.
115
+ * Effective attribution declared by the style (document +
116
+ * sources), joined with ` | `. Upstream TileJSON / PMTiles
117
+ * metadata is the JS host's concern — merge it on that side.
117
118
  */
118
- unregisterBrush(name: string): boolean;
119
+ readonly attribution: string | undefined;
119
120
  /**
120
121
  * `tile-size` declared by the current style.
121
122
  */
@@ -127,3 +128,11 @@ export class Renderer {
127
128
  * page label the renderer build accurately.
128
129
  */
129
130
  export function simdEnabled(): boolean;
131
+
132
+ /**
133
+ * Whether this build supports multithreaded rendering (compiled with
134
+ * the `threads` feature). When `false`, `initThreadPool` is absent and
135
+ * `renderTile`'s `parallel` option is a no-op. Mirrors `simdEnabled` so
136
+ * the host can label the build.
137
+ */
138
+ export function threadsEnabled(): boolean;
package/bundler/ezu.js CHANGED
@@ -5,5 +5,5 @@ import { __wbg_set_wasm } from "./ezu_bg.js";
5
5
  __wbg_set_wasm(wasm);
6
6
  wasm.__wbindgen_start();
7
7
  export {
8
- LogSink, Renderer, simdEnabled
8
+ LogSink, Renderer, simdEnabled, threadsEnabled
9
9
  } from "./ezu_bg.js";
package/bundler/ezu_bg.js CHANGED
@@ -78,6 +78,10 @@ export class LogSink {
78
78
  /**
79
79
  * Set (or clear with `null` / `undefined`) the per-event JS
80
80
  * callback. The callback receives a structured record object.
81
+ *
82
+ * No-op in multithreaded (`threads`) builds — events can originate
83
+ * on rayon worker threads, so live forwarding to a main-thread JS
84
+ * callback isn't available. Use `drain` / `drainLines` instead.
81
85
  * @param {Function | null} [callback]
82
86
  */
83
87
  onEvent(callback) {
@@ -109,186 +113,112 @@ export class Renderer {
109
113
  wasm.__wbg_renderer_free(ptr, 0);
110
114
  }
111
115
  /**
112
- * Number of brushes currently registered.
113
- * @returns {number}
114
- */
115
- brushCount() {
116
- const ret = wasm.renderer_brushCount(this.__wbg_ptr);
117
- return ret >>> 0;
118
- }
119
- /**
120
- * Drop every registered brush.
116
+ * Effective attribution declared by the style (document +
117
+ * sources), joined with ` | `. Upstream TileJSON / PMTiles
118
+ * metadata is the JS host's concern — merge it on that side.
119
+ * @returns {string | undefined}
121
120
  */
122
- clearBrushes() {
123
- wasm.renderer_clearBrushes(this.__wbg_ptr);
124
- }
125
- /**
126
- * Build a renderer from a style JSON document.
127
- * @param {string} style_json
128
- */
129
- constructor(style_json) {
130
- const ptr0 = passStringToWasm0(style_json, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);
131
- const len0 = WASM_VECTOR_LEN;
132
- const ret = wasm.renderer_new(ptr0, len0);
133
- if (ret[2]) {
134
- throw takeFromExternrefTable0(ret[1]);
121
+ get attribution() {
122
+ const ret = wasm.renderer_attribution(this.__wbg_ptr);
123
+ let v1;
124
+ if (ret[0] !== 0) {
125
+ v1 = getStringFromWasm0(ret[0], ret[1]).slice();
126
+ wasm.__wbindgen_free_command_export(ret[0], ret[1] * 1, 1);
135
127
  }
136
- this.__wbg_ptr = ret[0];
137
- RendererFinalization.register(this, this.__wbg_ptr, this);
138
- return this;
128
+ return v1;
139
129
  }
140
130
  /**
141
- * Register a `.myb` brush under `name` so a `brush-file` node with
142
- * `src: "@name"` (via the style's `assets` map) resolves to it.
143
- * Re-registering the same name replaces the previous entry.
131
+ * Bind raw tile bytes under a `sources.<name>` entry from the style.
132
+ * The renderer dispatches on the source's declared `type`:
133
+ *
134
+ * - `mvt` / `pmtiles` → store raw MVT bytes per `(dx, dy)` neighbour
135
+ * offset (centre `coord: [0, 0]`, the default). Layers are bound as
136
+ * `<source>.<layer>` (centre) or `<source>.<layer>@dx,dy`
137
+ * (neighbours) when [`render_tile`] runs. Binding only the centre
138
+ * degrades cross-tile label collision to centre-only at borders.
139
+ * - `dem` / `raster` → store the raw bytes per `(dx, dy)` neighbour
140
+ * offset. The centre tile is `coord: [0, 0]` (default). Decoding
141
+ * and 3×3 stitching happen at render time once the tile id is known.
142
+ * - `geojson` (remote) → store raw bytes per `(dx, dy)` offset;
143
+ * projected per tile (and neighbour) at render time.
144
+ *
145
+ * `opts` is a JS object: `{ coord?: [dx, dy] }`. Throws
146
+ * `UnknownSource` if `name` doesn't match any entry in the style's
147
+ * `sources` block, `MvtDecode` if MVT bytes don't parse, and
148
+ * `DemDecode` for non-image DEM bytes (the decode itself runs at
149
+ * render time, but obvious cases are caught here).
144
150
  * @param {string} name
145
- * @param {string} myb_json
151
+ * @param {Uint8Array} bytes
152
+ * @param {object | null} [opts]
146
153
  */
147
- registerBrush(name, myb_json) {
154
+ bindSource(name, bytes, opts) {
148
155
  const ptr0 = passStringToWasm0(name, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);
149
156
  const len0 = WASM_VECTOR_LEN;
150
- const ptr1 = passStringToWasm0(myb_json, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);
157
+ const ptr1 = passArray8ToWasm0(bytes, wasm.__wbindgen_malloc_command_export);
151
158
  const len1 = WASM_VECTOR_LEN;
152
- const ret = wasm.renderer_registerBrush(this.__wbg_ptr, ptr0, len0, ptr1, len1);
159
+ const ret = wasm.renderer_bindSource(this.__wbg_ptr, ptr0, len0, ptr1, len1, isLikeNone(opts) ? 0 : addToExternrefTable0(opts));
153
160
  if (ret[1]) {
154
161
  throw takeFromExternrefTable0(ret[0]);
155
162
  }
156
163
  }
157
164
  /**
158
- * Render a single tile to PNG bytes using the style's `tile-size` / `pad`.
159
- * Pass `null` for `mvtBytes` to get a paper-only tile.
160
- *
161
- * Optional `options`: `{ png: { compression: 'fast' | 'default' | 'best' } }`.
162
- * @param {Uint8Array | null | undefined} mvt_bytes
163
- * @param {number} z
164
- * @param {number} x
165
- * @param {number} y
166
- * @param {object | null} [options]
167
- * @returns {Uint8Array}
168
- */
169
- render(mvt_bytes, z, x, y, options) {
170
- var ptr0 = isLikeNone(mvt_bytes) ? 0 : passArray8ToWasm0(mvt_bytes, wasm.__wbindgen_malloc_command_export);
171
- var len0 = WASM_VECTOR_LEN;
172
- const ret = wasm.renderer_render(this.__wbg_ptr, ptr0, len0, z, x, y, isLikeNone(options) ? 0 : addToExternrefTable0(options));
173
- if (ret[3]) {
174
- throw takeFromExternrefTable0(ret[2]);
175
- }
176
- var v2 = getArrayU8FromWasm0(ret[0], ret[1]).slice();
177
- wasm.__wbindgen_free_command_export(ret[0], ret[1] * 1, 1);
178
- return v2;
179
- }
180
- /**
181
- * Like `render` but with `tile_size` / `pad` overridden — useful for
182
- * hi-DPI / preview rendering without mutating the style.
183
- * @param {Uint8Array | null | undefined} mvt_bytes
184
- * @param {number} z
185
- * @param {number} x
186
- * @param {number} y
187
- * @param {number} tile_size
188
- * @param {number} pad
189
- * @param {object | null} [options]
190
- * @returns {Uint8Array}
191
- */
192
- renderAt(mvt_bytes, z, x, y, tile_size, pad, options) {
193
- var ptr0 = isLikeNone(mvt_bytes) ? 0 : passArray8ToWasm0(mvt_bytes, wasm.__wbindgen_malloc_command_export);
194
- var len0 = WASM_VECTOR_LEN;
195
- const ret = wasm.renderer_renderAt(this.__wbg_ptr, ptr0, len0, z, x, y, tile_size, pad, isLikeNone(options) ? 0 : addToExternrefTable0(options));
196
- if (ret[3]) {
197
- throw takeFromExternrefTable0(ret[2]);
198
- }
199
- var v2 = getArrayU8FromWasm0(ret[0], ret[1]).slice();
200
- wasm.__wbindgen_free_command_export(ret[0], ret[1] * 1, 1);
201
- return v2;
202
- }
203
- /**
204
- * Render a single tile to straight RGBA8 bytes (`tile_w * tile_h * 4`).
205
- * @param {Uint8Array | null | undefined} mvt_bytes
206
- * @param {number} z
207
- * @param {number} x
208
- * @param {number} y
209
- * @returns {Uint8Array}
165
+ * Names of every source with at least one pending binding.
166
+ * Order matches the style's `sources` declaration order.
167
+ * @returns {string[]}
210
168
  */
211
- renderRgba(mvt_bytes, z, x, y) {
212
- var ptr0 = isLikeNone(mvt_bytes) ? 0 : passArray8ToWasm0(mvt_bytes, wasm.__wbindgen_malloc_command_export);
213
- var len0 = WASM_VECTOR_LEN;
214
- const ret = wasm.renderer_renderRgba(this.__wbg_ptr, ptr0, len0, z, x, y);
215
- if (ret[3]) {
216
- throw takeFromExternrefTable0(ret[2]);
217
- }
218
- var v2 = getArrayU8FromWasm0(ret[0], ret[1]).slice();
219
- wasm.__wbindgen_free_command_export(ret[0], ret[1] * 1, 1);
220
- return v2;
169
+ boundSources() {
170
+ const ret = wasm.renderer_boundSources(this.__wbg_ptr);
171
+ var v1 = getArrayJsValueFromWasm0(ret[0], ret[1]).slice();
172
+ wasm.__wbindgen_free_command_export(ret[0], ret[1] * 4, 4);
173
+ return v1;
221
174
  }
222
175
  /**
223
- * Like `renderRgba` but with `tile_size` / `pad` overridden.
224
- * @param {Uint8Array | null | undefined} mvt_bytes
225
- * @param {number} z
226
- * @param {number} x
227
- * @param {number} y
228
- * @param {number} tile_size
229
- * @param {number} pad
230
- * @returns {Uint8Array}
176
+ * Drop every pending source binding. Call between tile renders.
231
177
  */
232
- renderRgbaAt(mvt_bytes, z, x, y, tile_size, pad) {
233
- var ptr0 = isLikeNone(mvt_bytes) ? 0 : passArray8ToWasm0(mvt_bytes, wasm.__wbindgen_malloc_command_export);
234
- var len0 = WASM_VECTOR_LEN;
235
- const ret = wasm.renderer_renderRgbaAt(this.__wbg_ptr, ptr0, len0, z, x, y, tile_size, pad);
236
- if (ret[3]) {
237
- throw takeFromExternrefTable0(ret[2]);
238
- }
239
- var v2 = getArrayU8FromWasm0(ret[0], ret[1]).slice();
240
- wasm.__wbindgen_free_command_export(ret[0], ret[1] * 1, 1);
241
- return v2;
178
+ clearSources() {
179
+ wasm.renderer_clearSources(this.__wbg_ptr);
242
180
  }
243
181
  /**
244
- * Render a single tile to lossless WebP bytes. Smaller than PNG
245
- * for the same painterly content and decoded natively by every
246
- * modern browser. WebP is lossless-only via the pure-Rust
247
- * `image-webp` codec; for lossy WebP, see the
248
- * `OffscreenCanvas.convertToBlob` recipe in the crate README.
249
- * @param {Uint8Array | null | undefined} mvt_bytes
250
- * @param {number} z
251
- * @param {number} x
252
- * @param {number} y
253
- * @param {object | null} [options]
254
- * @returns {Uint8Array}
182
+ * Build a renderer from a style JSON document.
183
+ * @param {string} style_json
255
184
  */
256
- renderWebp(mvt_bytes, z, x, y, options) {
257
- var ptr0 = isLikeNone(mvt_bytes) ? 0 : passArray8ToWasm0(mvt_bytes, wasm.__wbindgen_malloc_command_export);
258
- var len0 = WASM_VECTOR_LEN;
259
- const ret = wasm.renderer_renderWebp(this.__wbg_ptr, ptr0, len0, z, x, y, isLikeNone(options) ? 0 : addToExternrefTable0(options));
260
- if (ret[3]) {
261
- throw takeFromExternrefTable0(ret[2]);
185
+ constructor(style_json) {
186
+ const ptr0 = passStringToWasm0(style_json, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);
187
+ const len0 = WASM_VECTOR_LEN;
188
+ const ret = wasm.renderer_new(ptr0, len0);
189
+ if (ret[2]) {
190
+ throw takeFromExternrefTable0(ret[1]);
262
191
  }
263
- var v2 = getArrayU8FromWasm0(ret[0], ret[1]).slice();
264
- wasm.__wbindgen_free_command_export(ret[0], ret[1] * 1, 1);
265
- return v2;
192
+ this.__wbg_ptr = ret[0];
193
+ RendererFinalization.register(this, this.__wbg_ptr, this);
194
+ return this;
266
195
  }
267
196
  /**
268
- * Like `renderWebp` but with `tile_size` / `pad` overridden.
269
- * @param {Uint8Array | null | undefined} mvt_bytes
197
+ * Render a single tile using whatever sources are currently bound.
198
+ *
199
+ * `opts` (JS object, all fields optional):
200
+ * - `format`: `"png"` (default) / `"webp"` / `"rgba"`
201
+ * - `tileSize`, `pad`: override the style's canvas size for this
202
+ * call (hi-DPI / preview)
203
+ * - `png`: `{ compression?: "fast" | "default" | "best" }`
270
204
  * @param {number} z
271
205
  * @param {number} x
272
206
  * @param {number} y
273
- * @param {number} tile_size
274
- * @param {number} pad
275
- * @param {object | null} [options]
207
+ * @param {object | null} [opts]
276
208
  * @returns {Uint8Array}
277
209
  */
278
- renderWebpAt(mvt_bytes, z, x, y, tile_size, pad, options) {
279
- var ptr0 = isLikeNone(mvt_bytes) ? 0 : passArray8ToWasm0(mvt_bytes, wasm.__wbindgen_malloc_command_export);
280
- var len0 = WASM_VECTOR_LEN;
281
- const ret = wasm.renderer_renderWebpAt(this.__wbg_ptr, ptr0, len0, z, x, y, tile_size, pad, isLikeNone(options) ? 0 : addToExternrefTable0(options));
210
+ renderTile(z, x, y, opts) {
211
+ const ret = wasm.renderer_renderTile(this.__wbg_ptr, z, x, y, isLikeNone(opts) ? 0 : addToExternrefTable0(opts));
282
212
  if (ret[3]) {
283
213
  throw takeFromExternrefTable0(ret[2]);
284
214
  }
285
- var v2 = getArrayU8FromWasm0(ret[0], ret[1]).slice();
215
+ var v1 = getArrayU8FromWasm0(ret[0], ret[1]).slice();
286
216
  wasm.__wbindgen_free_command_export(ret[0], ret[1] * 1, 1);
287
- return v2;
217
+ return v1;
288
218
  }
289
219
  /**
290
220
  * Replace the active style. Returns the new node count. Invalidates
291
- * the intermediate cache.
221
+ * the intermediate cache and drops any pending source bindings.
292
222
  * @param {string} style_json
293
223
  * @returns {number}
294
224
  */
@@ -309,17 +239,6 @@ export class Renderer {
309
239
  const ret = wasm.renderer_tileSize(this.__wbg_ptr);
310
240
  return ret >>> 0;
311
241
  }
312
- /**
313
- * Remove a brush by name. Returns `true` if the brush existed.
314
- * @param {string} name
315
- * @returns {boolean}
316
- */
317
- unregisterBrush(name) {
318
- const ptr0 = passStringToWasm0(name, wasm.__wbindgen_malloc_command_export, wasm.__wbindgen_realloc_command_export);
319
- const len0 = WASM_VECTOR_LEN;
320
- const ret = wasm.renderer_unregisterBrush(this.__wbg_ptr, ptr0, len0);
321
- return ret !== 0;
322
- }
323
242
  }
324
243
  if (Symbol.dispose) Renderer.prototype[Symbol.dispose] = Renderer.prototype.free;
325
244
 
@@ -332,6 +251,37 @@ export function simdEnabled() {
332
251
  const ret = wasm.simdEnabled();
333
252
  return ret !== 0;
334
253
  }
254
+
255
+ /**
256
+ * Whether this build supports multithreaded rendering (compiled with
257
+ * the `threads` feature). When `false`, `initThreadPool` is absent and
258
+ * `renderTile`'s `parallel` option is a no-op. Mirrors `simdEnabled` so
259
+ * the host can label the build.
260
+ * @returns {boolean}
261
+ */
262
+ export function threadsEnabled() {
263
+ const ret = wasm.threadsEnabled();
264
+ return ret !== 0;
265
+ }
266
+ export function __wbg___wbindgen_boolean_get_2304fb8c853028c8(arg0) {
267
+ const v = arg0;
268
+ const ret = typeof(v) === 'boolean' ? v : undefined;
269
+ return isLikeNone(ret) ? 0xFFFFFF : ret ? 1 : 0;
270
+ }
271
+ export function __wbg___wbindgen_is_null_2042690d351e14f0(arg0) {
272
+ const ret = arg0 === null;
273
+ return ret;
274
+ }
275
+ export function __wbg___wbindgen_is_undefined_35bb9f4c7fd651d5(arg0) {
276
+ const ret = arg0 === undefined;
277
+ return ret;
278
+ }
279
+ export function __wbg___wbindgen_number_get_f73a1244370fcc2c(arg0, arg1) {
280
+ const obj = arg1;
281
+ const ret = typeof(obj) === 'number' ? obj : undefined;
282
+ getDataViewMemory0().setFloat64(arg0 + 8 * 1, isLikeNone(ret) ? 0 : ret, true);
283
+ getDataViewMemory0().setInt32(arg0 + 4 * 0, !isLikeNone(ret), true);
284
+ }
335
285
  export function __wbg___wbindgen_string_get_d109740c0d18f4d7(arg0, arg1) {
336
286
  const obj = arg1;
337
287
  const ret = typeof(obj) === 'string' ? obj : undefined;
@@ -358,6 +308,10 @@ export function __wbg_error_a6fa202b58aa1cd3(arg0, arg1) {
358
308
  wasm.__wbindgen_free_command_export(deferred0_0, deferred0_1, 1);
359
309
  }
360
310
  }
311
+ export function __wbg_get_98fdf51d029a75eb(arg0, arg1) {
312
+ const ret = arg0[arg1 >>> 0];
313
+ return ret;
314
+ }
361
315
  export function __wbg_get_dcf82ab8aad1a593() { return handleError(function (arg0, arg1) {
362
316
  const ret = Reflect.get(arg0, arg1);
363
317
  return ret;
@@ -372,6 +326,14 @@ export function __wbg_instanceof_Object_03924e0dbda74bd8(arg0) {
372
326
  const ret = result;
373
327
  return ret;
374
328
  }
329
+ export function __wbg_isArray_94898ed3aad6947b(arg0) {
330
+ const ret = Array.isArray(arg0);
331
+ return ret;
332
+ }
333
+ export function __wbg_length_2591a0f4f659a55c(arg0) {
334
+ const ret = arg0.length;
335
+ return ret;
336
+ }
375
337
  export function __wbg_new_02d162bc6cf02f60() {
376
338
  const ret = new Object();
377
339
  return ret;
Binary file
@@ -11,20 +11,16 @@ export const logsink_len: (a: number) => number;
11
11
  export const logsink_new: (a: number, b: number) => [number, number, number];
12
12
  export const logsink_onEvent: (a: number, b: number) => void;
13
13
  export const logsink_setCapacity: (a: number, b: number) => void;
14
- export const renderer_brushCount: (a: number) => number;
15
- export const renderer_clearBrushes: (a: number) => void;
14
+ export const renderer_attribution: (a: number) => [number, number];
15
+ export const renderer_bindSource: (a: number, b: number, c: number, d: number, e: number, f: number) => [number, number];
16
+ export const renderer_boundSources: (a: number) => [number, number];
17
+ export const renderer_clearSources: (a: number) => void;
16
18
  export const renderer_new: (a: number, b: number) => [number, number, number];
17
- export const renderer_registerBrush: (a: number, b: number, c: number, d: number, e: number) => [number, number];
18
- export const renderer_render: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => [number, number, number, number];
19
- export const renderer_renderAt: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number) => [number, number, number, number];
20
- export const renderer_renderRgba: (a: number, b: number, c: number, d: number, e: number, f: number) => [number, number, number, number];
21
- export const renderer_renderRgbaAt: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number) => [number, number, number, number];
22
- export const renderer_renderWebp: (a: number, b: number, c: number, d: number, e: number, f: number, g: number) => [number, number, number, number];
23
- export const renderer_renderWebpAt: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number, i: number) => [number, number, number, number];
19
+ export const renderer_renderTile: (a: number, b: number, c: number, d: number, e: number) => [number, number, number, number];
24
20
  export const renderer_setStyle: (a: number, b: number, c: number) => [number, number, number];
25
21
  export const renderer_tileSize: (a: number) => number;
26
- export const renderer_unregisterBrush: (a: number, b: number, c: number) => number;
27
22
  export const simdEnabled: () => number;
23
+ export const threadsEnabled: () => number;
28
24
  export const __wbindgen_malloc_command_export: (a: number, b: number) => number;
29
25
  export const __wbindgen_realloc_command_export: (a: number, b: number, c: number, d: number) => number;
30
26
  export const __wbindgen_exn_store_command_export: (a: number) => void;