@reearth/ezu 0.4.1 → 0.4.2
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 +39 -0
- package/bundler/ezu_bg.wasm +0 -0
- package/nodejs/ezu_bg.wasm +0 -0
- package/package.json +45 -2
- package/simd/bundler/ezu.d.ts +176 -0
- package/simd/bundler/ezu.js +9 -0
- package/simd/bundler/ezu_bg.js +597 -0
- package/simd/bundler/ezu_bg.wasm +0 -0
- package/simd/bundler/ezu_bg.wasm.d.ts +34 -0
- package/simd/nodejs/ezu.d.ts +176 -0
- package/simd/nodejs/ezu.js +606 -0
- package/simd/nodejs/ezu_bg.wasm +0 -0
- package/simd/nodejs/ezu_bg.wasm.d.ts +34 -0
- package/simd/nodejs/package.json +1 -0
- package/simd/web/ezu.d.ts +235 -0
- package/simd/web/ezu.js +697 -0
- package/simd/web/ezu_bg.wasm +0 -0
- package/simd/web/ezu_bg.wasm.d.ts +34 -0
- package/simd/workerd/ezu.d.ts +3 -0
- package/simd/workerd/ezu.js +13 -0
- package/web/ezu_bg.wasm +0 -0
package/README.md
CHANGED
|
@@ -24,6 +24,9 @@ The package ships four builds and picks one automatically via the
|
|
|
24
24
|
| Node.js | `nodejs` |
|
|
25
25
|
| Cloudflare Workers | `workerd` (via the `workerd` condition) |
|
|
26
26
|
|
|
27
|
+
Every build also exists in a wasm SIMD128 flavor under
|
|
28
|
+
`@reearth/ezu/simd` — see [SIMD](#simd).
|
|
29
|
+
|
|
27
30
|
### Bundler / Cloudflare Workers / Node.js
|
|
28
31
|
|
|
29
32
|
```js
|
|
@@ -60,6 +63,42 @@ The raw artifacts are exported too, for hosts that need to wire up
|
|
|
60
63
|
instantiation themselves: `@reearth/ezu/bundler/ezu_bg.js`,
|
|
61
64
|
`@reearth/ezu/bundler/ezu_bg.wasm`, and `@reearth/ezu/web/ezu_bg.wasm`.
|
|
62
65
|
|
|
66
|
+
## SIMD
|
|
67
|
+
|
|
68
|
+
The same four builds are shipped a second time compiled with
|
|
69
|
+
`-C target-feature=+simd128`, under the `simd` subpath. It resolves by
|
|
70
|
+
the same conditions as the default entry, so one import covers every
|
|
71
|
+
runtime:
|
|
72
|
+
|
|
73
|
+
```js
|
|
74
|
+
import { Renderer } from "@reearth/ezu/simd";
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
The default entry (`.`) stays **non-SIMD** on purpose. Safari gained
|
|
78
|
+
wasm SIMD128 only in 16.4, and a module that uses SIMD instructions
|
|
79
|
+
fails to *compile* on older engines rather than degrading — so making
|
|
80
|
+
SIMD the package default would hard-break those browsers. Opt in where
|
|
81
|
+
you know the engine supports it: Cloudflare Workers (workerd), Node 16+,
|
|
82
|
+
and Chrome/Firefox/Safari 16.4+.
|
|
83
|
+
|
|
84
|
+
`simdEnabled()` reports which flavor is loaded — `true` only in the
|
|
85
|
+
`simd` builds:
|
|
86
|
+
|
|
87
|
+
```js
|
|
88
|
+
import { simdEnabled } from "@reearth/ezu/simd";
|
|
89
|
+
simdEnabled(); // true
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Individual builds and raw artifacts mirror the default layout:
|
|
93
|
+
`@reearth/ezu/simd/web`, `/simd/bundler`, `/simd/nodejs`,
|
|
94
|
+
`/simd/workerd`, `@reearth/ezu/simd/bundler/ezu_bg.js`,
|
|
95
|
+
`@reearth/ezu/simd/bundler/ezu_bg.wasm`, and
|
|
96
|
+
`@reearth/ezu/simd/web/ezu_bg.wasm`.
|
|
97
|
+
|
|
98
|
+
A future version could ship a single entry that feature-detects SIMD at
|
|
99
|
+
load time and instantiates the matching wasm; that would double the
|
|
100
|
+
bytes a browser may download, so for now the choice is explicit.
|
|
101
|
+
|
|
63
102
|
## API
|
|
64
103
|
|
|
65
104
|
```ts
|
package/bundler/ezu_bg.wasm
CHANGED
|
Binary file
|
package/nodejs/ezu_bg.wasm
CHANGED
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@reearth/ezu",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.2",
|
|
4
4
|
"description": "Painterly map renderer — WebAssembly bindings",
|
|
5
5
|
"license": "MIT OR Apache-2.0",
|
|
6
6
|
"repository": {
|
|
@@ -60,6 +60,44 @@
|
|
|
60
60
|
"./bundler/ezu_bg.js": "./bundler/ezu_bg.js",
|
|
61
61
|
"./bundler/ezu_bg.wasm": "./bundler/ezu_bg.wasm",
|
|
62
62
|
"./web/ezu_bg.wasm": "./web/ezu_bg.wasm",
|
|
63
|
+
"./simd": {
|
|
64
|
+
"workerd": {
|
|
65
|
+
"types": "./simd/workerd/ezu.d.ts",
|
|
66
|
+
"default": "./simd/workerd/ezu.js"
|
|
67
|
+
},
|
|
68
|
+
"browser": {
|
|
69
|
+
"types": "./simd/web/ezu.d.ts",
|
|
70
|
+
"default": "./simd/web/ezu.js"
|
|
71
|
+
},
|
|
72
|
+
"node": {
|
|
73
|
+
"types": "./simd/nodejs/ezu.d.ts",
|
|
74
|
+
"default": "./simd/nodejs/ezu.js"
|
|
75
|
+
},
|
|
76
|
+
"import": {
|
|
77
|
+
"types": "./simd/bundler/ezu.d.ts",
|
|
78
|
+
"default": "./simd/bundler/ezu.js"
|
|
79
|
+
}
|
|
80
|
+
},
|
|
81
|
+
"./simd/web": {
|
|
82
|
+
"types": "./simd/web/ezu.d.ts",
|
|
83
|
+
"default": "./simd/web/ezu.js"
|
|
84
|
+
},
|
|
85
|
+
"./simd/bundler": {
|
|
86
|
+
"types": "./simd/bundler/ezu.d.ts",
|
|
87
|
+
"default": "./simd/bundler/ezu.js"
|
|
88
|
+
},
|
|
89
|
+
"./simd/nodejs": {
|
|
90
|
+
"types": "./simd/nodejs/ezu.d.ts",
|
|
91
|
+
"default": "./simd/nodejs/ezu.js"
|
|
92
|
+
},
|
|
93
|
+
"./simd/workerd": {
|
|
94
|
+
"types": "./simd/workerd/ezu.d.ts",
|
|
95
|
+
"default": "./simd/workerd/ezu.js"
|
|
96
|
+
},
|
|
97
|
+
"./simd/workerd/ezu.js": "./simd/workerd/ezu.js",
|
|
98
|
+
"./simd/bundler/ezu_bg.js": "./simd/bundler/ezu_bg.js",
|
|
99
|
+
"./simd/bundler/ezu_bg.wasm": "./simd/bundler/ezu_bg.wasm",
|
|
100
|
+
"./simd/web/ezu_bg.wasm": "./simd/web/ezu_bg.wasm",
|
|
63
101
|
"./package.json": "./package.json"
|
|
64
102
|
},
|
|
65
103
|
"files": [
|
|
@@ -67,6 +105,7 @@
|
|
|
67
105
|
"bundler",
|
|
68
106
|
"nodejs",
|
|
69
107
|
"workerd",
|
|
108
|
+
"simd",
|
|
70
109
|
"README.md",
|
|
71
110
|
"LICENSE-MIT",
|
|
72
111
|
"LICENSE-APACHE"
|
|
@@ -76,6 +115,10 @@
|
|
|
76
115
|
"./web/ezu.js",
|
|
77
116
|
"./bundler/ezu.js",
|
|
78
117
|
"./nodejs/ezu.js",
|
|
79
|
-
"./workerd/ezu.js"
|
|
118
|
+
"./workerd/ezu.js",
|
|
119
|
+
"./simd/web/ezu.js",
|
|
120
|
+
"./simd/bundler/ezu.js",
|
|
121
|
+
"./simd/nodejs/ezu.js",
|
|
122
|
+
"./simd/workerd/ezu.js"
|
|
80
123
|
]
|
|
81
124
|
}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/* tslint:disable */
|
|
2
|
+
/* eslint-disable */
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Buffered log sink that captures `tracing` events from the renderer.
|
|
6
|
+
*
|
|
7
|
+
* Construct once near the top of your bootstrap, then either set a
|
|
8
|
+
* callback for live forwarding (`onEvent(e => console.log(e))`) or
|
|
9
|
+
* `drainLines()` periodically to flush into a UI panel.
|
|
10
|
+
*/
|
|
11
|
+
export class LogSink {
|
|
12
|
+
free(): void;
|
|
13
|
+
[Symbol.dispose](): void;
|
|
14
|
+
/**
|
|
15
|
+
* Drop all buffered records without returning them.
|
|
16
|
+
*/
|
|
17
|
+
clear(): void;
|
|
18
|
+
/**
|
|
19
|
+
* Drain every buffered record. Returns a JS array of structured
|
|
20
|
+
* objects `{ level, target, message, fields, timestampMs }`.
|
|
21
|
+
*/
|
|
22
|
+
drain(): Array<any>;
|
|
23
|
+
/**
|
|
24
|
+
* Drain buffered records and return pre-formatted strings — the
|
|
25
|
+
* same shape the CLI prints. Convenient for `console.log(lines.join('\n'))`.
|
|
26
|
+
*/
|
|
27
|
+
drainLines(): string[];
|
|
28
|
+
/**
|
|
29
|
+
* `true` if no records are buffered.
|
|
30
|
+
*/
|
|
31
|
+
isEmpty(): boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Install (idempotently) the global tracing subscriber. `level` is
|
|
34
|
+
* an `EnvFilter` string — e.g. `"info"`, `"debug"`,
|
|
35
|
+
* `"info,ezu_graph::eval=debug"`. Honoured on first call only.
|
|
36
|
+
*/
|
|
37
|
+
constructor(level: string);
|
|
38
|
+
/**
|
|
39
|
+
* Set (or clear with `null` / `undefined`) the per-event JS
|
|
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.
|
|
45
|
+
*/
|
|
46
|
+
onEvent(callback?: Function | null): void;
|
|
47
|
+
/**
|
|
48
|
+
* Resize the ring-buffer cap. Older entries are evicted FIFO once
|
|
49
|
+
* the buffer reaches the new cap. Default is 4096.
|
|
50
|
+
*/
|
|
51
|
+
setCapacity(cap: number): void;
|
|
52
|
+
/**
|
|
53
|
+
* Number of records currently buffered.
|
|
54
|
+
*/
|
|
55
|
+
readonly len: number;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Stateful WASM renderer.
|
|
60
|
+
*/
|
|
61
|
+
export class Renderer {
|
|
62
|
+
free(): void;
|
|
63
|
+
[Symbol.dispose](): void;
|
|
64
|
+
/**
|
|
65
|
+
* Bind raw tile bytes under a `sources.<name>` entry from the style.
|
|
66
|
+
* The renderer dispatches on the source's declared `type`:
|
|
67
|
+
*
|
|
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).
|
|
84
|
+
*/
|
|
85
|
+
bindSource(name: string, bytes: Uint8Array, opts?: object | null): void;
|
|
86
|
+
/**
|
|
87
|
+
* Names of every source with at least one pending binding.
|
|
88
|
+
* Order matches the style's `sources` declaration order.
|
|
89
|
+
*/
|
|
90
|
+
boundSources(): string[];
|
|
91
|
+
/**
|
|
92
|
+
* Drop every pending source binding. Call between tile renders.
|
|
93
|
+
*/
|
|
94
|
+
clearSources(): void;
|
|
95
|
+
/**
|
|
96
|
+
* Glyph ranges the currently bound features can require, as
|
|
97
|
+
* `{ [glyphsSourceName]: number[] }` where each number is a range
|
|
98
|
+
* start (`0`, `256`, `512`, …) — i.e. the `{range}` in a
|
|
99
|
+
* `…/{fontstack}/{range}.pbf` URL is `<start>-<start + 255>`.
|
|
100
|
+
*
|
|
101
|
+
* This host cannot fetch glyph ranges lazily, so every range a
|
|
102
|
+
* tile's labels touch must be bound before `renderTile`. Rather than
|
|
103
|
+
* scraping every string in the MVT, call this after binding the
|
|
104
|
+
* vector sources and bind exactly the listed ranges.
|
|
105
|
+
*
|
|
106
|
+
* It is an over-approximation, deliberately: a range is listed if
|
|
107
|
+
* *any* feature in a text layer carries the codepoint in a property
|
|
108
|
+
* the layer's `text` expression reads, without evaluating filters,
|
|
109
|
+
* zoom ranges, or the expression itself, and it is listed for every
|
|
110
|
+
* fontstack in that layer's fallback chain. So it never omits a
|
|
111
|
+
* range a label needs, and it may name a few that go unused. Text
|
|
112
|
+
* layers that build their string from something other than a `get`
|
|
113
|
+
* of a feature property (a literal, a `concat` of formatted values)
|
|
114
|
+
* contribute their literal text where it is a plain string.
|
|
115
|
+
*/
|
|
116
|
+
neededGlyphRanges(): object;
|
|
117
|
+
/**
|
|
118
|
+
* Build a renderer from a style JSON document.
|
|
119
|
+
*/
|
|
120
|
+
constructor(style_json: string);
|
|
121
|
+
/**
|
|
122
|
+
* Render a single tile using whatever sources are currently bound.
|
|
123
|
+
*
|
|
124
|
+
* `opts` (JS object, all fields optional):
|
|
125
|
+
* - `format`: `"png"` (default) / `"webp"` / `"rgba"`
|
|
126
|
+
* - `tileSize`, `pad`: override the style's canvas size for this
|
|
127
|
+
* call (hi-DPI / preview)
|
|
128
|
+
* - `png`: `{ compression?: "fast" | "default" | "best" }`
|
|
129
|
+
*/
|
|
130
|
+
renderTile(z: number, x: number, y: number, opts?: object | null): Uint8Array;
|
|
131
|
+
/**
|
|
132
|
+
* Neighbour tile offsets the active style actually asks for from
|
|
133
|
+
* `source`, as an array of `[dx, dy]` pairs (never including the
|
|
134
|
+
* centre `[0, 0]`).
|
|
135
|
+
*
|
|
136
|
+
* Cross-tile label collision and edge-continuous DEM shading are the
|
|
137
|
+
* only things that read neighbours, and only for the sources they
|
|
138
|
+
* name. A host that fetches the full 3×3 window unconditionally
|
|
139
|
+
* therefore pays for up to eight tiles it will not look at; passing
|
|
140
|
+
* each offset from this list to `bindSource(name, bytes, { coord })`
|
|
141
|
+
* fetches exactly what the recipe needs. An empty array means the
|
|
142
|
+
* centre tile is enough.
|
|
143
|
+
*
|
|
144
|
+
* Throws `UnknownSource` if `name` is not declared in the style.
|
|
145
|
+
*/
|
|
146
|
+
requestedNeighborOffsets(name: string): Array<any>;
|
|
147
|
+
/**
|
|
148
|
+
* Replace the active style. Returns the new node count. Invalidates
|
|
149
|
+
* the intermediate cache and drops any pending source bindings.
|
|
150
|
+
*/
|
|
151
|
+
setStyle(style_json: string): number;
|
|
152
|
+
/**
|
|
153
|
+
* Effective attribution declared by the style (document +
|
|
154
|
+
* sources), joined with ` | `. Upstream TileJSON / PMTiles
|
|
155
|
+
* metadata is the JS host's concern — merge it on that side.
|
|
156
|
+
*/
|
|
157
|
+
readonly attribution: string | undefined;
|
|
158
|
+
/**
|
|
159
|
+
* `tile-size` declared by the current style.
|
|
160
|
+
*/
|
|
161
|
+
readonly tileSize: number;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Whether the wasm binary was compiled with `+simd128`. Lets the demo
|
|
166
|
+
* page label the renderer build accurately.
|
|
167
|
+
*/
|
|
168
|
+
export function simdEnabled(): boolean;
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Whether this build supports multithreaded rendering (compiled with
|
|
172
|
+
* the `threads` feature). When `false`, `initThreadPool` is absent and
|
|
173
|
+
* `renderTile`'s `parallel` option is a no-op. Mirrors `simdEnabled` so
|
|
174
|
+
* the host can label the build.
|
|
175
|
+
*/
|
|
176
|
+
export function threadsEnabled(): boolean;
|