@react-x11/components 0.7.1 → 0.9.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 +295 -51
- package/dist/charts/node.d.ts +1 -1
- package/dist/charts/node.d.ts.map +1 -1
- package/dist/charts/node.js +6 -2
- package/dist/charts/node.js.map +1 -1
- package/dist/color-picker/ColorPicker.d.ts.map +1 -1
- package/dist/color-picker/ColorPicker.js +43 -33
- package/dist/color-picker/ColorPicker.js.map +1 -1
- package/dist/embed/client.d.ts +48 -3
- package/dist/embed/client.d.ts.map +1 -1
- package/dist/embed/client.js +79 -5
- package/dist/embed/client.js.map +1 -1
- package/dist/embed/index.d.ts +1 -1
- package/dist/embed/index.d.ts.map +1 -1
- package/dist/embed/index.js +1 -1
- package/dist/embed/index.js.map +1 -1
- package/dist/html/node.d.ts +3 -1
- package/dist/html/node.d.ts.map +1 -1
- package/dist/html/node.js +7 -5
- package/dist/html/node.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/{markdown → internal/markdown}/ast.d.ts +12 -0
- package/dist/internal/markdown/ast.d.ts.map +1 -0
- package/dist/internal/markdown/ast.js +22 -0
- package/dist/internal/markdown/ast.js.map +1 -0
- package/dist/internal/markdown/parse.d.ts.map +1 -0
- package/dist/{markdown → internal/markdown}/parse.js +112 -22
- package/dist/internal/markdown/parse.js.map +1 -0
- package/dist/internal/markdown/stringify.d.ts +4 -0
- package/dist/internal/markdown/stringify.d.ts.map +1 -0
- package/dist/internal/markdown/stringify.js +684 -0
- package/dist/internal/markdown/stringify.js.map +1 -0
- package/dist/internal/markdown/tags.d.ts.map +1 -0
- package/dist/internal/markdown/tags.js.map +1 -0
- package/dist/internal/scroll.d.ts +3 -2
- package/dist/internal/scroll.d.ts.map +1 -1
- package/dist/internal/scroll.js +33 -15
- package/dist/internal/scroll.js.map +1 -1
- package/dist/internal/units.d.ts +2 -0
- package/dist/internal/units.d.ts.map +1 -0
- package/dist/internal/units.js +35 -0
- package/dist/internal/units.js.map +1 -0
- package/dist/internal/window.d.ts.map +1 -1
- package/dist/internal/window.js +4 -2
- package/dist/internal/window.js.map +1 -1
- package/dist/maps/anchors.d.ts +98 -0
- package/dist/maps/anchors.d.ts.map +1 -0
- package/dist/maps/anchors.js +531 -0
- package/dist/maps/anchors.js.map +1 -0
- package/dist/maps/controller.d.ts +283 -0
- package/dist/maps/controller.d.ts.map +1 -0
- package/dist/maps/controller.js +743 -0
- package/dist/maps/controller.js.map +1 -0
- package/dist/maps/gl/buckets.d.ts +95 -0
- package/dist/maps/gl/buckets.d.ts.map +1 -0
- package/dist/maps/gl/buckets.js +362 -0
- package/dist/maps/gl/buckets.js.map +1 -0
- package/dist/maps/gl/build-worker.d.ts +13 -0
- package/dist/maps/gl/build-worker.d.ts.map +1 -0
- package/dist/maps/gl/build-worker.js +44 -0
- package/dist/maps/gl/build-worker.js.map +1 -0
- package/dist/maps/gl/color.d.ts +8 -0
- package/dist/maps/gl/color.d.ts.map +1 -0
- package/dist/maps/gl/color.js +57 -0
- package/dist/maps/gl/color.js.map +1 -0
- package/dist/maps/gl/cover.d.ts +51 -0
- package/dist/maps/gl/cover.d.ts.map +1 -0
- package/dist/maps/gl/cover.js +124 -0
- package/dist/maps/gl/cover.js.map +1 -0
- package/dist/maps/gl/index.d.ts +3 -0
- package/dist/maps/gl/index.d.ts.map +1 -0
- package/dist/maps/gl/index.js +20 -0
- package/dist/maps/gl/index.js.map +1 -0
- package/dist/maps/gl/markers.d.ts +28 -0
- package/dist/maps/gl/markers.d.ts.map +1 -0
- package/dist/maps/gl/markers.js +60 -0
- package/dist/maps/gl/markers.js.map +1 -0
- package/dist/maps/gl/overlays.d.ts +68 -0
- package/dist/maps/gl/overlays.d.ts.map +1 -0
- package/dist/maps/gl/overlays.js +300 -0
- package/dist/maps/gl/overlays.js.map +1 -0
- package/dist/maps/gl/pane.d.ts +12 -0
- package/dist/maps/gl/pane.d.ts.map +1 -0
- package/dist/maps/gl/pane.js +37 -0
- package/dist/maps/gl/pane.js.map +1 -0
- package/dist/maps/gl/placement.d.ts +111 -0
- package/dist/maps/gl/placement.d.ts.map +1 -0
- package/dist/maps/gl/placement.js +567 -0
- package/dist/maps/gl/placement.js.map +1 -0
- package/dist/maps/gl/renderer.d.ts +352 -0
- package/dist/maps/gl/renderer.d.ts.map +1 -0
- package/dist/maps/gl/renderer.js +1127 -0
- package/dist/maps/gl/renderer.js.map +1 -0
- package/dist/maps/gl/shaders.d.ts +120 -0
- package/dist/maps/gl/shaders.d.ts.map +1 -0
- package/dist/maps/gl/shaders.js +451 -0
- package/dist/maps/gl/shaders.js.map +1 -0
- package/dist/maps/gl/store.d.ts +115 -0
- package/dist/maps/gl/store.d.ts.map +1 -0
- package/dist/maps/gl/store.js +469 -0
- package/dist/maps/gl/store.js.map +1 -0
- package/dist/maps/gl/text.d.ts +154 -0
- package/dist/maps/gl/text.d.ts.map +1 -0
- package/dist/maps/gl/text.js +382 -0
- package/dist/maps/gl/text.js.map +1 -0
- package/dist/maps/gl/view.d.ts +54 -0
- package/dist/maps/gl/view.d.ts.map +1 -0
- package/dist/maps/gl/view.js +974 -0
- package/dist/maps/gl/view.js.map +1 -0
- package/dist/maps/index.d.ts +1 -1
- package/dist/maps/index.d.ts.map +1 -1
- package/dist/maps/index.js +216 -52
- package/dist/maps/index.js.map +1 -1
- package/dist/maps/labels.d.ts +37 -16
- package/dist/maps/labels.d.ts.map +1 -1
- package/dist/maps/labels.js +188 -119
- package/dist/maps/labels.js.map +1 -1
- package/dist/maps/node.d.ts +162 -56
- package/dist/maps/node.d.ts.map +1 -1
- package/dist/maps/node.js +607 -515
- package/dist/maps/node.js.map +1 -1
- package/dist/maps/overlay.d.ts +72 -9
- package/dist/maps/overlay.d.ts.map +1 -1
- package/dist/maps/overlay.js +108 -28
- package/dist/maps/overlay.js.map +1 -1
- package/dist/maps/paint.d.ts +3 -0
- package/dist/maps/paint.d.ts.map +1 -1
- package/dist/maps/paint.js.map +1 -1
- package/dist/maps/proj.d.ts +14 -0
- package/dist/maps/proj.d.ts.map +1 -1
- package/dist/maps/proj.js +28 -0
- package/dist/maps/proj.js.map +1 -1
- package/dist/maps/renderer.d.ts +69 -0
- package/dist/maps/renderer.d.ts.map +1 -0
- package/dist/maps/renderer.js +66 -0
- package/dist/maps/renderer.js.map +1 -0
- package/dist/maps/sources.d.ts +25 -3
- package/dist/maps/sources.d.ts.map +1 -1
- package/dist/maps/sources.js +17 -0
- package/dist/maps/sources.js.map +1 -1
- package/dist/maps/theme.d.ts +19 -0
- package/dist/maps/theme.d.ts.map +1 -0
- package/dist/maps/theme.js +44 -0
- package/dist/maps/theme.js.map +1 -0
- package/dist/maps/tiles.d.ts +117 -17
- package/dist/maps/tiles.d.ts.map +1 -1
- package/dist/maps/tiles.js +163 -30
- package/dist/maps/tiles.js.map +1 -1
- package/dist/maps/types.d.ts +188 -20
- package/dist/maps/types.d.ts.map +1 -1
- package/dist/markdown/expressions.d.ts +1 -1
- package/dist/markdown/expressions.d.ts.map +1 -1
- package/dist/markdown/expressions.js.map +1 -1
- package/dist/markdown/index.d.ts +7 -6
- package/dist/markdown/index.d.ts.map +1 -1
- package/dist/markdown/index.js +9 -7
- package/dist/markdown/index.js.map +1 -1
- package/dist/markdown/spans.d.ts +1 -1
- package/dist/markdown/spans.d.ts.map +1 -1
- package/dist/media-player/index.d.ts +11 -3
- package/dist/media-player/index.d.ts.map +1 -1
- package/dist/media-player/index.js +13 -2
- package/dist/media-player/index.js.map +1 -1
- package/dist/rich-text-editor/clipboard.d.ts +23 -0
- package/dist/rich-text-editor/clipboard.d.ts.map +1 -0
- package/dist/rich-text-editor/clipboard.js +307 -0
- package/dist/rich-text-editor/clipboard.js.map +1 -0
- package/dist/rich-text-editor/collab.d.ts +32 -0
- package/dist/rich-text-editor/collab.d.ts.map +1 -0
- package/dist/rich-text-editor/collab.js +55 -0
- package/dist/rich-text-editor/collab.js.map +1 -0
- package/dist/rich-text-editor/commands.d.ts +50 -0
- package/dist/rich-text-editor/commands.d.ts.map +1 -0
- package/dist/rich-text-editor/commands.js +376 -0
- package/dist/rich-text-editor/commands.js.map +1 -0
- package/dist/rich-text-editor/drag.d.ts +68 -0
- package/dist/rich-text-editor/drag.d.ts.map +1 -0
- package/dist/rich-text-editor/drag.js +148 -0
- package/dist/rich-text-editor/drag.js.map +1 -0
- package/dist/rich-text-editor/html.d.ts +145 -0
- package/dist/rich-text-editor/html.d.ts.map +1 -0
- package/dist/rich-text-editor/html.js +516 -0
- package/dist/rich-text-editor/html.js.map +1 -0
- package/dist/rich-text-editor/index.d.ts +263 -0
- package/dist/rich-text-editor/index.d.ts.map +1 -0
- package/dist/rich-text-editor/index.js +822 -0
- package/dist/rich-text-editor/index.js.map +1 -0
- package/dist/rich-text-editor/inline.d.ts +94 -0
- package/dist/rich-text-editor/inline.d.ts.map +1 -0
- package/dist/rich-text-editor/inline.js +252 -0
- package/dist/rich-text-editor/inline.js.map +1 -0
- package/dist/rich-text-editor/keymap.d.ts +71 -0
- package/dist/rich-text-editor/keymap.d.ts.map +1 -0
- package/dist/rich-text-editor/keymap.js +393 -0
- package/dist/rich-text-editor/keymap.js.map +1 -0
- package/dist/rich-text-editor/keys.d.ts +29 -0
- package/dist/rich-text-editor/keys.d.ts.map +1 -0
- package/dist/rich-text-editor/keys.js +93 -0
- package/dist/rich-text-editor/keys.js.map +1 -0
- package/dist/rich-text-editor/look.d.ts +71 -0
- package/dist/rich-text-editor/look.d.ts.map +1 -0
- package/dist/rich-text-editor/look.js +342 -0
- package/dist/rich-text-editor/look.js.map +1 -0
- package/dist/rich-text-editor/markdown.d.ts +18 -0
- package/dist/rich-text-editor/markdown.d.ts.map +1 -0
- package/dist/rich-text-editor/markdown.js +496 -0
- package/dist/rich-text-editor/markdown.js.map +1 -0
- package/dist/rich-text-editor/nodes.d.ts +135 -0
- package/dist/rich-text-editor/nodes.d.ts.map +1 -0
- package/dist/rich-text-editor/nodes.js +397 -0
- package/dist/rich-text-editor/nodes.js.map +1 -0
- package/dist/rich-text-editor/render.d.ts +68 -0
- package/dist/rich-text-editor/render.d.ts.map +1 -0
- package/dist/rich-text-editor/render.js +500 -0
- package/dist/rich-text-editor/render.js.map +1 -0
- package/dist/rich-text-editor/schema.d.ts +16 -0
- package/dist/rich-text-editor/schema.d.ts.map +1 -0
- package/dist/rich-text-editor/schema.js +386 -0
- package/dist/rich-text-editor/schema.js.map +1 -0
- package/dist/rich-text-editor/store.d.ts +11 -0
- package/dist/rich-text-editor/store.d.ts.map +1 -0
- package/dist/rich-text-editor/store.js +43 -0
- package/dist/rich-text-editor/store.js.map +1 -0
- package/dist/rich-text-editor/suggest.d.ts +127 -0
- package/dist/rich-text-editor/suggest.d.ts.map +1 -0
- package/dist/rich-text-editor/suggest.js +0 -0
- package/dist/rich-text-editor/suggest.js.map +1 -0
- package/dist/rich-text-editor/tables.d.ts +41 -0
- package/dist/rich-text-editor/tables.d.ts.map +1 -0
- package/dist/rich-text-editor/tables.js +204 -0
- package/dist/rich-text-editor/tables.js.map +1 -0
- package/dist/rich-text-editor/toolbar.d.ts +58 -0
- package/dist/rich-text-editor/toolbar.d.ts.map +1 -0
- package/dist/rich-text-editor/toolbar.js +548 -0
- package/dist/rich-text-editor/toolbar.js.map +1 -0
- package/dist/rich-text-editor/view.d.ts +368 -0
- package/dist/rich-text-editor/view.d.ts.map +1 -0
- package/dist/rich-text-editor/view.js +1968 -0
- package/dist/rich-text-editor/view.js.map +1 -0
- package/dist/rich-text-editor/virtual.d.ts +54 -0
- package/dist/rich-text-editor/virtual.d.ts.map +1 -0
- package/dist/rich-text-editor/virtual.js +262 -0
- package/dist/rich-text-editor/virtual.js.map +1 -0
- package/dist/richtext/node.d.ts +25 -2
- package/dist/richtext/node.d.ts.map +1 -1
- package/dist/richtext/node.js +46 -24
- package/dist/richtext/node.js.map +1 -1
- package/dist/table/index.d.ts.map +1 -1
- package/dist/table/index.js +14 -5
- package/dist/table/index.js.map +1 -1
- package/dist/terminal/backends.d.ts +4 -1
- package/dist/terminal/backends.d.ts.map +1 -1
- package/dist/terminal/backends.js.map +1 -1
- package/dist/terminal/index.d.ts +18 -7
- package/dist/terminal/index.d.ts.map +1 -1
- package/dist/terminal/index.js +28 -11
- package/dist/terminal/index.js.map +1 -1
- package/dist/terminal/vt/node.d.ts +56 -3
- package/dist/terminal/vt/node.d.ts.map +1 -1
- package/dist/terminal/vt/node.js +106 -26
- package/dist/terminal/vt/node.js.map +1 -1
- package/dist/terminal/vt/renderer.d.ts +4 -0
- package/dist/terminal/vt/renderer.d.ts.map +1 -1
- package/dist/terminal/vt/renderer.js +14 -5
- package/dist/terminal/vt/renderer.js.map +1 -1
- package/dist/tree/index.d.ts.map +1 -1
- package/dist/tree/index.js +6 -4
- package/dist/tree/index.js.map +1 -1
- package/package.json +23 -4
- package/src/charts/node.ts +6 -2
- package/src/color-picker/ColorPicker.ts +107 -81
- package/src/embed/client.ts +102 -8
- package/src/embed/index.ts +2 -0
- package/src/html/node.ts +7 -5
- package/src/index.ts +2 -0
- package/src/{markdown → internal/markdown}/ast.ts +24 -7
- package/src/{markdown → internal/markdown}/parse.ts +134 -24
- package/src/internal/markdown/stringify.ts +772 -0
- package/src/internal/scroll.ts +39 -18
- package/src/internal/units.ts +34 -0
- package/src/internal/window.ts +4 -2
- package/src/maps/anchors.ts +607 -0
- package/src/maps/controller.ts +999 -0
- package/src/maps/gl/buckets.ts +457 -0
- package/src/maps/gl/build-worker.ts +55 -0
- package/src/maps/gl/color.ts +62 -0
- package/src/maps/gl/cover.ts +170 -0
- package/src/maps/gl/index.ts +23 -0
- package/src/maps/gl/markers.ts +83 -0
- package/src/maps/gl/overlays.ts +379 -0
- package/src/maps/gl/pane.ts +42 -0
- package/src/maps/gl/placement.ts +816 -0
- package/src/maps/gl/renderer.ts +1576 -0
- package/src/maps/gl/shaders.ts +486 -0
- package/src/maps/gl/store.ts +566 -0
- package/src/maps/gl/text.ts +495 -0
- package/src/maps/gl/view.ts +1224 -0
- package/src/maps/index.ts +270 -81
- package/src/maps/labels.ts +214 -121
- package/src/maps/node.ts +763 -629
- package/src/maps/overlay.ts +148 -43
- package/src/maps/paint.ts +3 -0
- package/src/maps/proj.ts +31 -0
- package/src/maps/renderer.ts +155 -0
- package/src/maps/sources.ts +38 -3
- package/src/maps/theme.ts +51 -0
- package/src/maps/tiles.ts +191 -33
- package/src/maps/types.ts +188 -20
- package/src/markdown/expressions.ts +5 -1
- package/src/markdown/index.ts +14 -11
- package/src/markdown/spans.ts +1 -1
- package/src/media-player/index.ts +18 -4
- package/src/rich-text-editor/clipboard.ts +439 -0
- package/src/rich-text-editor/collab.ts +91 -0
- package/src/rich-text-editor/commands.ts +448 -0
- package/src/rich-text-editor/dom-globals.d.ts +23 -0
- package/src/rich-text-editor/drag.ts +211 -0
- package/src/rich-text-editor/html.ts +619 -0
- package/src/rich-text-editor/index.ts +1331 -0
- package/src/rich-text-editor/inline.ts +345 -0
- package/src/rich-text-editor/keymap.ts +510 -0
- package/src/rich-text-editor/keys.ts +119 -0
- package/src/rich-text-editor/look.ts +427 -0
- package/src/rich-text-editor/markdown.ts +653 -0
- package/src/rich-text-editor/nodes.ts +497 -0
- package/src/rich-text-editor/render.ts +800 -0
- package/src/rich-text-editor/schema.ts +431 -0
- package/src/rich-text-editor/store.ts +39 -0
- package/src/rich-text-editor/suggest.ts +597 -0
- package/src/rich-text-editor/tables.ts +272 -0
- package/src/rich-text-editor/toolbar.ts +724 -0
- package/src/rich-text-editor/view.ts +2287 -0
- package/src/rich-text-editor/virtual.ts +347 -0
- package/src/richtext/node.ts +59 -30
- package/src/table/index.ts +14 -5
- package/src/terminal/backends.ts +4 -1
- package/src/terminal/index.ts +43 -15
- package/src/terminal/vt/node.ts +128 -29
- package/src/terminal/vt/renderer.ts +27 -5
- package/src/tree/index.ts +6 -4
- package/dist/markdown/ast.d.ts.map +0 -1
- package/dist/markdown/ast.js +0 -17
- package/dist/markdown/ast.js.map +0 -1
- package/dist/markdown/parse.d.ts.map +0 -1
- package/dist/markdown/parse.js.map +0 -1
- package/dist/markdown/tags.d.ts.map +0 -1
- package/dist/markdown/tags.js.map +0 -1
- /package/dist/{markdown → internal/markdown}/parse.d.ts +0 -0
- /package/dist/{markdown → internal/markdown}/tags.d.ts +0 -0
- /package/dist/{markdown → internal/markdown}/tags.js +0 -0
- /package/src/{markdown → internal/markdown}/tags.ts +0 -0
|
@@ -0,0 +1,469 @@
|
|
|
1
|
+
// Tiles for the GL renderer: loaded, parsed, bucketed, and let go.
|
|
2
|
+
//
|
|
3
|
+
// The retained renderer's cache has three layers (data, surfaces, labels);
|
|
4
|
+
// this one has one, because a tile's buckets are valid for every camera and
|
|
5
|
+
// every palette. What it keeps per tile is the bucket arrays — a few hundred
|
|
6
|
+
// kilobytes where the retained cache keeps two 4 MB surfaces — and the only
|
|
7
|
+
// thing that invalidates them is a style whose *filters* changed, since the
|
|
8
|
+
// filters are what decide which features a layer draws. Colours, widths and
|
|
9
|
+
// zoom ranges are uniforms and gates, read every frame; a light-to-dark
|
|
10
|
+
// switch rebuilds nothing.
|
|
11
|
+
//
|
|
12
|
+
// Building is the one cost a tile has, and there are two places to pay it.
|
|
13
|
+
// On this thread, `pump` builds until the frame's deadline — always at
|
|
14
|
+
// least one tile, the retained renderer's budget rule — and a dense city
|
|
15
|
+
// tile is 5–20 ms of it, which is most of a 50 Hz frame. On **worker
|
|
16
|
+
// threads** (`workers > 0`) this thread only dispatches: the bytes go over
|
|
17
|
+
// by copy, the buckets come back by transfer, and the main thread's whole
|
|
18
|
+
// cost for a tile is its upload. The bucket format is what makes the second
|
|
19
|
+
// one free to have — two ArrayBuffers and a small draw list, nothing that
|
|
20
|
+
// needs a serializer.
|
|
21
|
+
import { parseVectorTile } from '../sources.js';
|
|
22
|
+
import { buildTileBuckets, rasterTileData } from './buckets.js';
|
|
23
|
+
const globals = globalThis;
|
|
24
|
+
const now = () => globals.performance?.now() ?? Date.now();
|
|
25
|
+
const key = (t) => `${t.z}/${t.x}/${t.y}`;
|
|
26
|
+
export class GlTileStore {
|
|
27
|
+
_source;
|
|
28
|
+
_sourceId;
|
|
29
|
+
_onError;
|
|
30
|
+
_prepared;
|
|
31
|
+
_style;
|
|
32
|
+
_onChange;
|
|
33
|
+
_concurrency;
|
|
34
|
+
_capacity;
|
|
35
|
+
_entries = new Map();
|
|
36
|
+
/** Loaded tiles waiting for a build, oldest first. */
|
|
37
|
+
_queue = [];
|
|
38
|
+
_waiting = [];
|
|
39
|
+
_inFlight = 0;
|
|
40
|
+
_frame = 0;
|
|
41
|
+
_disposed = false;
|
|
42
|
+
_pool;
|
|
43
|
+
/** Bucket builds and their cost on this thread, for a HUD. */
|
|
44
|
+
built = 0;
|
|
45
|
+
buildMs = 0;
|
|
46
|
+
constructor(options) {
|
|
47
|
+
this._source = options.source;
|
|
48
|
+
this._sourceId = options.sourceId ?? options.source.id ?? 'source-0';
|
|
49
|
+
this._onError = options.onError;
|
|
50
|
+
this._prepared = options.prepared;
|
|
51
|
+
this._style = {
|
|
52
|
+
id: 1,
|
|
53
|
+
layers: options.prepared.layers.map((l) => l.layer),
|
|
54
|
+
};
|
|
55
|
+
this._onChange = options.onChange;
|
|
56
|
+
this._concurrency = options.concurrency ?? 8;
|
|
57
|
+
this._capacity = options.capacity ?? 256;
|
|
58
|
+
const workers = options.workers ?? 0;
|
|
59
|
+
this._pool =
|
|
60
|
+
workers > 0 ? new BuildPool(workers, () => this._onChange()) : null;
|
|
61
|
+
}
|
|
62
|
+
get source() {
|
|
63
|
+
return this._source;
|
|
64
|
+
}
|
|
65
|
+
/** Tiles loaded and waiting for (or in) a build. */
|
|
66
|
+
get building() {
|
|
67
|
+
let n = this._queue.length;
|
|
68
|
+
for (const entry of this._entries.values())
|
|
69
|
+
if (entry.state === 'building')
|
|
70
|
+
n++;
|
|
71
|
+
return n;
|
|
72
|
+
}
|
|
73
|
+
/** Tiles asked for and not yet answered. */
|
|
74
|
+
get loading() {
|
|
75
|
+
return this._inFlight + this._waiting.length;
|
|
76
|
+
}
|
|
77
|
+
/** Whether builds happen off this thread. */
|
|
78
|
+
get threaded() {
|
|
79
|
+
return this._pool?.ready === true;
|
|
80
|
+
}
|
|
81
|
+
get(tile) {
|
|
82
|
+
const entry = this._entries.get(key(tile));
|
|
83
|
+
if (!entry)
|
|
84
|
+
return undefined;
|
|
85
|
+
entry.used = this._frame;
|
|
86
|
+
if (entry.state === 'ready')
|
|
87
|
+
return entry.data;
|
|
88
|
+
if (entry.state === 'empty')
|
|
89
|
+
return null;
|
|
90
|
+
// A tile being rebuilt for a new style keeps drawing its old buckets
|
|
91
|
+
// until the new ones exist, so a restyle never opens a hole.
|
|
92
|
+
return entry.data ?? undefined;
|
|
93
|
+
}
|
|
94
|
+
/** A new frame: what the cover asks for from here on is this frame's. */
|
|
95
|
+
tick() {
|
|
96
|
+
this._frame++;
|
|
97
|
+
}
|
|
98
|
+
/** Ask for tiles, centre-out. Already-known tiles cost a lookup. */
|
|
99
|
+
want(tiles) {
|
|
100
|
+
const at = now();
|
|
101
|
+
for (const tile of tiles) {
|
|
102
|
+
const k = key(tile);
|
|
103
|
+
let entry = this._entries.get(k);
|
|
104
|
+
if (entry && !(entry.state === 'failed' && at >= entry.retryAt))
|
|
105
|
+
continue;
|
|
106
|
+
if (!entry) {
|
|
107
|
+
entry = {
|
|
108
|
+
tile,
|
|
109
|
+
state: 'loading',
|
|
110
|
+
bytes: null,
|
|
111
|
+
data: null,
|
|
112
|
+
used: this._frame,
|
|
113
|
+
retryAt: 0,
|
|
114
|
+
failures: 0,
|
|
115
|
+
job: 0,
|
|
116
|
+
abort: null,
|
|
117
|
+
};
|
|
118
|
+
this._entries.set(k, entry);
|
|
119
|
+
}
|
|
120
|
+
entry.state = 'loading';
|
|
121
|
+
this._waiting.push(entry);
|
|
122
|
+
}
|
|
123
|
+
this._drain();
|
|
124
|
+
}
|
|
125
|
+
_drain() {
|
|
126
|
+
while (this._inFlight < this._concurrency && this._waiting.length > 0) {
|
|
127
|
+
const entry = this._waiting.shift();
|
|
128
|
+
// Asked for, then scrolled away from before a slot came free.
|
|
129
|
+
if (entry.used < this._frame - 2) {
|
|
130
|
+
this._entries.delete(key(entry.tile));
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
this._load(entry);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
_load(entry) {
|
|
137
|
+
this._inFlight++;
|
|
138
|
+
// A real `AbortController` where the runtime has one: `fetch` rejects a
|
|
139
|
+
// signal that is not an instance of `AbortSignal`, so a look-alike would
|
|
140
|
+
// fail every load a source makes the documented way (`../tiles.ts`).
|
|
141
|
+
const controller = globals.AbortController
|
|
142
|
+
? new globals.AbortController()
|
|
143
|
+
: null;
|
|
144
|
+
let aborted = false;
|
|
145
|
+
entry.abort = () => {
|
|
146
|
+
aborted = true;
|
|
147
|
+
controller?.abort();
|
|
148
|
+
};
|
|
149
|
+
const { z, x, y } = entry.tile;
|
|
150
|
+
const sourceId = this._sourceId;
|
|
151
|
+
Promise.resolve()
|
|
152
|
+
.then(() => this._source.load({ z, x, y, sourceId, signal: controller?.signal }))
|
|
153
|
+
.then((data) => {
|
|
154
|
+
if (this._disposed || aborted)
|
|
155
|
+
return;
|
|
156
|
+
entry.failures = 0;
|
|
157
|
+
if (data && data.kind === 'vector' && data.data.length > 0) {
|
|
158
|
+
entry.bytes = data.data;
|
|
159
|
+
entry.state = 'loaded';
|
|
160
|
+
this._queue.push(entry);
|
|
161
|
+
}
|
|
162
|
+
else if (data && data.kind === 'raster' && data.width > 0) {
|
|
163
|
+
// An image needs no building — it is its own texture — and no
|
|
164
|
+
// style: nothing to queue, and nothing a restyle rebuilds.
|
|
165
|
+
entry.data = rasterTileData(data.width, data.height, data.data);
|
|
166
|
+
entry.state = 'ready';
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
entry.state = 'empty';
|
|
170
|
+
}
|
|
171
|
+
}, (error) => {
|
|
172
|
+
// Whatever an aborted load answers — its `AbortError` included —
|
|
173
|
+
// is not news: the map stopped wanting the tile.
|
|
174
|
+
if (this._disposed || aborted)
|
|
175
|
+
return;
|
|
176
|
+
entry.failures++;
|
|
177
|
+
entry.state = 'failed';
|
|
178
|
+
// 0.5 s, 1, 2, 4 … up to 30 s: the retained cache's backoff, so a
|
|
179
|
+
// source that is down costs nothing and a blip repairs itself.
|
|
180
|
+
entry.retryAt =
|
|
181
|
+
now() + Math.min(30_000, 500 * 2 ** (entry.failures - 1));
|
|
182
|
+
// A failed tile draws nothing, so a map whose tiles all fail looks
|
|
183
|
+
// exactly like a map that is still loading: somebody has to be
|
|
184
|
+
// told, once per failure, as the retained cache tells them.
|
|
185
|
+
this._onError?.(error, { z, x, y, sourceId });
|
|
186
|
+
})
|
|
187
|
+
.finally(() => {
|
|
188
|
+
this._inFlight--;
|
|
189
|
+
entry.abort = null;
|
|
190
|
+
if (this._disposed)
|
|
191
|
+
return;
|
|
192
|
+
this._drain();
|
|
193
|
+
if (!aborted)
|
|
194
|
+
this._onChange();
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* How many of `tiles` failed to load and are waiting on a retry — the
|
|
199
|
+
* frame's `errors`.
|
|
200
|
+
*/
|
|
201
|
+
failedAmong(tiles) {
|
|
202
|
+
let n = 0;
|
|
203
|
+
for (const tile of tiles) {
|
|
204
|
+
if (this._entries.get(key(tile))?.state === 'failed')
|
|
205
|
+
n++;
|
|
206
|
+
}
|
|
207
|
+
return n;
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Stop loading: every load in flight is aborted and forgotten, and nothing
|
|
211
|
+
* waiting is started. For a source taken off the map, whose tiles that
|
|
212
|
+
* have arrived stay, so switching back to it is free — the retained
|
|
213
|
+
* cache's rule.
|
|
214
|
+
*/
|
|
215
|
+
abortLoads() {
|
|
216
|
+
for (const [k, entry] of this._entries) {
|
|
217
|
+
if (entry.state !== 'loading')
|
|
218
|
+
continue;
|
|
219
|
+
entry.abort?.();
|
|
220
|
+
this._entries.delete(k);
|
|
221
|
+
}
|
|
222
|
+
this._waiting = [];
|
|
223
|
+
}
|
|
224
|
+
/** Build every tile again from its bytes — `refresh()`, after a style
|
|
225
|
+
* the application edited in place. The old buckets draw until then. */
|
|
226
|
+
rebuild() {
|
|
227
|
+
this._style = { ...this._style, id: this._style.id + 1 };
|
|
228
|
+
this._requeue();
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Work through the loaded tiles. Answers whether more are waiting on this
|
|
232
|
+
* thread, which is the caller's cue for another frame.
|
|
233
|
+
*
|
|
234
|
+
* With workers, everything waiting is dispatched and nothing is built
|
|
235
|
+
* here: a finished build calls `onChange` like a finished load does. On
|
|
236
|
+
* this thread, tiles are built until `deadline` — always at least one, or
|
|
237
|
+
* a budget smaller than one tile would build nothing forever.
|
|
238
|
+
*/
|
|
239
|
+
pump(deadline) {
|
|
240
|
+
const pool = this._pool;
|
|
241
|
+
if (pool && !pool.failed) {
|
|
242
|
+
if (!pool.ready)
|
|
243
|
+
return this._queue.length > 0;
|
|
244
|
+
while (this._queue.length > 0 && pool.hasRoom()) {
|
|
245
|
+
const entry = this._queue.shift();
|
|
246
|
+
if (!entry.bytes)
|
|
247
|
+
continue;
|
|
248
|
+
entry.state = 'building';
|
|
249
|
+
const style = this._style.id;
|
|
250
|
+
entry.job = pool.build(entry.bytes, this._style, (result) => {
|
|
251
|
+
if (this._disposed || entry.job === 0)
|
|
252
|
+
return;
|
|
253
|
+
entry.job = 0;
|
|
254
|
+
if (!this._entries.has(key(entry.tile)))
|
|
255
|
+
return;
|
|
256
|
+
if (result.data && style === this._style.id) {
|
|
257
|
+
entry.data = result.data;
|
|
258
|
+
entry.state = 'ready';
|
|
259
|
+
}
|
|
260
|
+
else if (result.data) {
|
|
261
|
+
// Built for a style that has since been replaced: build again.
|
|
262
|
+
entry.state = 'loaded';
|
|
263
|
+
this._queue.push(entry);
|
|
264
|
+
}
|
|
265
|
+
else {
|
|
266
|
+
entry.state = 'empty';
|
|
267
|
+
}
|
|
268
|
+
this._onChange();
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
return false;
|
|
272
|
+
}
|
|
273
|
+
let first = true;
|
|
274
|
+
while (this._queue.length > 0 && (first || now() < deadline)) {
|
|
275
|
+
first = false;
|
|
276
|
+
const entry = this._queue.shift();
|
|
277
|
+
if (!entry.bytes)
|
|
278
|
+
continue;
|
|
279
|
+
const started = now();
|
|
280
|
+
try {
|
|
281
|
+
entry.data = buildTileBuckets(parseVectorTile(entry.bytes), this._prepared);
|
|
282
|
+
entry.state = 'ready';
|
|
283
|
+
}
|
|
284
|
+
catch {
|
|
285
|
+
entry.state = 'empty';
|
|
286
|
+
}
|
|
287
|
+
this.buildMs += now() - started;
|
|
288
|
+
this.built++;
|
|
289
|
+
}
|
|
290
|
+
return this._queue.length > 0;
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* A new style. Buckets are rebuilt only if the new one would select
|
|
294
|
+
* different features — a different layer list or different filters —
|
|
295
|
+
* and until a tile is rebuilt its old buckets keep drawing.
|
|
296
|
+
*/
|
|
297
|
+
setStyle(prepared) {
|
|
298
|
+
const same = structureOf(prepared) === structureOf(this._prepared);
|
|
299
|
+
this._prepared = prepared;
|
|
300
|
+
if (same)
|
|
301
|
+
return;
|
|
302
|
+
this._style = {
|
|
303
|
+
id: this._style.id + 1,
|
|
304
|
+
layers: prepared.layers.map((l) => l.layer),
|
|
305
|
+
};
|
|
306
|
+
this._requeue();
|
|
307
|
+
}
|
|
308
|
+
/** Every tile with bytes back on the build queue, most recently drawn
|
|
309
|
+
* first; each keeps drawing its old buckets until its new ones exist. */
|
|
310
|
+
_requeue() {
|
|
311
|
+
this._queue = [];
|
|
312
|
+
for (const entry of this._entries.values()) {
|
|
313
|
+
if (entry.bytes &&
|
|
314
|
+
(entry.state === 'ready' ||
|
|
315
|
+
entry.state === 'loaded' ||
|
|
316
|
+
entry.state === 'building')) {
|
|
317
|
+
entry.state = 'loaded';
|
|
318
|
+
entry.job = 0;
|
|
319
|
+
this._queue.push(entry);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
this._queue.sort((a, b) => b.used - a.used);
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* The end of a frame: cancel every load it did not want, and let go of the
|
|
326
|
+
* least recently drawn tiles past capacity.
|
|
327
|
+
*
|
|
328
|
+
* A tile panned or zoomed out of the cover — and the ring around it the
|
|
329
|
+
* cover keeps warm — would otherwise load to the end: a request nobody is
|
|
330
|
+
* waiting for, pointed at somebody else's servers. That is the contract
|
|
331
|
+
* the docs make for `request.signal`, on either renderer. A tile that
|
|
332
|
+
* comes back is asked for again, with a new signal.
|
|
333
|
+
*/
|
|
334
|
+
evict(release) {
|
|
335
|
+
for (const [k, entry] of this._entries) {
|
|
336
|
+
if (entry.abort && entry.used < this._frame) {
|
|
337
|
+
entry.abort();
|
|
338
|
+
this._entries.delete(k);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
if (this._entries.size <= this._capacity)
|
|
342
|
+
return;
|
|
343
|
+
const candidates = [...this._entries.entries()]
|
|
344
|
+
.filter(([, e]) => e.state !== 'loading' &&
|
|
345
|
+
e.state !== 'building' &&
|
|
346
|
+
e.used < this._frame)
|
|
347
|
+
.sort((a, b) => a[1].used - b[1].used);
|
|
348
|
+
let excess = this._entries.size - this._capacity;
|
|
349
|
+
for (const [k, entry] of candidates) {
|
|
350
|
+
if (excess <= 0)
|
|
351
|
+
break;
|
|
352
|
+
if (entry.data)
|
|
353
|
+
release(entry.data);
|
|
354
|
+
this._entries.delete(k);
|
|
355
|
+
excess--;
|
|
356
|
+
}
|
|
357
|
+
this._queue = this._queue.filter((e) => this._entries.has(key(e.tile)));
|
|
358
|
+
}
|
|
359
|
+
dispose(release) {
|
|
360
|
+
this._disposed = true;
|
|
361
|
+
for (const entry of this._entries.values()) {
|
|
362
|
+
if (entry.data)
|
|
363
|
+
release(entry.data);
|
|
364
|
+
}
|
|
365
|
+
this._entries.clear();
|
|
366
|
+
this._queue = [];
|
|
367
|
+
this._waiting = [];
|
|
368
|
+
this._pool?.terminate();
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
/** Jobs a worker may hold at once: enough to never sit idle between two
|
|
372
|
+
* messages, few enough that the store's queue — which is centre-out and
|
|
373
|
+
* reorders every frame — still decides what is built next. */
|
|
374
|
+
const PER_WORKER = 2;
|
|
375
|
+
const WORKER_THREADS = 'node:worker_threads';
|
|
376
|
+
class BuildPool {
|
|
377
|
+
ready = false;
|
|
378
|
+
failed = false;
|
|
379
|
+
_slots = [];
|
|
380
|
+
_jobs = new Map();
|
|
381
|
+
_next = 1;
|
|
382
|
+
constructor(count, onReady) {
|
|
383
|
+
void this._spawn(count).then(onReady);
|
|
384
|
+
}
|
|
385
|
+
async _spawn(count) {
|
|
386
|
+
try {
|
|
387
|
+
// `URL` and `import.meta.url` reached structurally, like everything
|
|
388
|
+
// else runtime-only here: `src/` compiles with `types: []` and no DOM
|
|
389
|
+
// lib, so neither is declared. The entry has to be a URL object, not a
|
|
390
|
+
// string — Node reads a string as a path.
|
|
391
|
+
const here = import.meta.url;
|
|
392
|
+
const Url = globalThis.URL;
|
|
393
|
+
if (!here || !Url)
|
|
394
|
+
throw new Error('no module URL to find the worker by');
|
|
395
|
+
const { Worker } = (await import(WORKER_THREADS));
|
|
396
|
+
for (let i = 0; i < count; i++) {
|
|
397
|
+
const worker = new Worker(new Url('./build-worker.js', here));
|
|
398
|
+
// An idle pool must not keep the process alive.
|
|
399
|
+
worker.unref?.();
|
|
400
|
+
const slot = { worker, busy: 0, style: 0 };
|
|
401
|
+
worker.on('message', (value) => {
|
|
402
|
+
const result = value;
|
|
403
|
+
slot.busy--;
|
|
404
|
+
const done = this._jobs.get(result.job);
|
|
405
|
+
this._jobs.delete(result.job);
|
|
406
|
+
done?.(result);
|
|
407
|
+
});
|
|
408
|
+
worker.on('error', () => {
|
|
409
|
+
this.failed = true;
|
|
410
|
+
});
|
|
411
|
+
this._slots.push(slot);
|
|
412
|
+
}
|
|
413
|
+
this.ready = true;
|
|
414
|
+
}
|
|
415
|
+
catch {
|
|
416
|
+
this.failed = true;
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
hasRoom() {
|
|
420
|
+
return this._slots.some((s) => s.busy < PER_WORKER);
|
|
421
|
+
}
|
|
422
|
+
build(bytes, style, done) {
|
|
423
|
+
let slot = this._slots[0];
|
|
424
|
+
for (const s of this._slots)
|
|
425
|
+
if (s.busy < slot.busy)
|
|
426
|
+
slot = s;
|
|
427
|
+
if (slot.style !== style.id) {
|
|
428
|
+
slot.worker.postMessage({
|
|
429
|
+
type: 'style',
|
|
430
|
+
id: style.id,
|
|
431
|
+
layers: style.layers,
|
|
432
|
+
});
|
|
433
|
+
slot.style = style.id;
|
|
434
|
+
}
|
|
435
|
+
const job = this._next++;
|
|
436
|
+
this._jobs.set(job, done);
|
|
437
|
+
// A copy of just this tile's bytes, transferred: the store keeps its own
|
|
438
|
+
// for a restyle, and a view into a larger buffer would clone all of it.
|
|
439
|
+
const copy = bytes.slice();
|
|
440
|
+
slot.busy++;
|
|
441
|
+
slot.worker.postMessage({ type: 'build', job, style: style.id, bytes: copy }, [copy.buffer]);
|
|
442
|
+
return job;
|
|
443
|
+
}
|
|
444
|
+
terminate() {
|
|
445
|
+
for (const slot of this._slots)
|
|
446
|
+
void slot.worker.terminate();
|
|
447
|
+
this._slots.length = 0;
|
|
448
|
+
this._jobs.clear();
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
const structures = new WeakMap();
|
|
452
|
+
/** What in a style decides a tile's buckets: which layers, over which
|
|
453
|
+
* source layers, with which filters — and for a label layer, which field
|
|
454
|
+
* its text is read from. Everything else is per frame. */
|
|
455
|
+
function structureOf(prepared) {
|
|
456
|
+
let structure = structures.get(prepared);
|
|
457
|
+
if (structure === undefined) {
|
|
458
|
+
structure = JSON.stringify(prepared.layers.map(({ layer }) => [
|
|
459
|
+
layer.type,
|
|
460
|
+
layer.sourceLayer,
|
|
461
|
+
layer.visible === false,
|
|
462
|
+
'filter' in layer ? (layer.filter ?? null) : null,
|
|
463
|
+
layer.type === 'symbol' ? layer.textField : null,
|
|
464
|
+
]));
|
|
465
|
+
structures.set(prepared, structure);
|
|
466
|
+
}
|
|
467
|
+
return structure;
|
|
468
|
+
}
|
|
469
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/maps/gl/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/** A set string's box, in device pixels. */
|
|
2
|
+
export interface TextBox {
|
|
3
|
+
width: number;
|
|
4
|
+
height: number;
|
|
5
|
+
}
|
|
6
|
+
/** One string to set, at `size` device pixels. */
|
|
7
|
+
export interface TextItem {
|
|
8
|
+
text: string;
|
|
9
|
+
size: number;
|
|
10
|
+
}
|
|
11
|
+
/** A rasterized string: RGBA as read back, coverage in alpha, `pad`
|
|
12
|
+
* pixels of clear margin included. */
|
|
13
|
+
export interface TextRaster {
|
|
14
|
+
width: number;
|
|
15
|
+
height: number;
|
|
16
|
+
pixels: Uint8Array;
|
|
17
|
+
}
|
|
18
|
+
/** What the atlas asks of a text engine. */
|
|
19
|
+
export interface TextEngine {
|
|
20
|
+
/** The box `text` sets in, synchronously — placement needs it now. */
|
|
21
|
+
measure(text: string, size: number): TextBox;
|
|
22
|
+
/**
|
|
23
|
+
* Rasterize as many of `items` as fit one batch. Answers per item: a
|
|
24
|
+
* raster; `null` for one that can never be drawn (wider than the engine
|
|
25
|
+
* can set); `undefined` for one left for the next batch.
|
|
26
|
+
*/
|
|
27
|
+
rasterize(items: readonly TextItem[], pad: number): Promise<(TextRaster | null | undefined)[]>;
|
|
28
|
+
dispose(): void;
|
|
29
|
+
}
|
|
30
|
+
/** ntk's font cache, structurally — `../labels.ts`' `FontsLike`. */
|
|
31
|
+
interface FontsLike {
|
|
32
|
+
layout(content: string, style: Record<string, unknown>): {
|
|
33
|
+
width: number;
|
|
34
|
+
height: number;
|
|
35
|
+
draw(ctx: unknown, x: number, y: number): void;
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/** The text engine over an app's fonts and an offscreen surface. */
|
|
39
|
+
export declare class SurfaceTextEngine implements TextEngine {
|
|
40
|
+
private readonly _app;
|
|
41
|
+
private readonly _fonts;
|
|
42
|
+
private readonly _family;
|
|
43
|
+
private readonly _layouts;
|
|
44
|
+
private _surface;
|
|
45
|
+
private _ctx;
|
|
46
|
+
constructor(app: unknown, fonts: FontsLike, family: string);
|
|
47
|
+
/** The engine for the app a node belongs to, or null where there is
|
|
48
|
+
* nothing to set text with. */
|
|
49
|
+
static forApp(app: unknown, family: string): SurfaceTextEngine | null;
|
|
50
|
+
private _layout;
|
|
51
|
+
measure(text: string, size: number): TextBox;
|
|
52
|
+
rasterize(items: readonly TextItem[], pad: number): Promise<(TextRaster | null | undefined)[]>;
|
|
53
|
+
dispose(): void;
|
|
54
|
+
}
|
|
55
|
+
/** A rasterized label's place in the atlas: its whole padded raster. */
|
|
56
|
+
export interface AtlasEntry {
|
|
57
|
+
key: string;
|
|
58
|
+
x: number;
|
|
59
|
+
y: number;
|
|
60
|
+
width: number;
|
|
61
|
+
height: number;
|
|
62
|
+
/** The raster, kept to upload again — after a compaction moves it, or
|
|
63
|
+
* into the texture of a new context. */
|
|
64
|
+
pixels: Uint8Array;
|
|
65
|
+
/** In the texture where it is now; only then is it drawn. Set by the
|
|
66
|
+
* renderer that uploads it. */
|
|
67
|
+
ready: boolean;
|
|
68
|
+
/** The frame it was last asked for — what a compaction keeps. */
|
|
69
|
+
used: number;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* The widest halo a raster's margin holds, in pixels. The drawn quad sits
|
|
73
|
+
* {@link quadInset} inside the margin and a halo samples up to this far
|
|
74
|
+
* past the quad, so its samples stay a texel inside the raster's own clear
|
|
75
|
+
* margin and never reach a neighbour's.
|
|
76
|
+
*/
|
|
77
|
+
export declare const haloReach: (pad: number) => number;
|
|
78
|
+
export declare const quadInset: (pad: number) => number;
|
|
79
|
+
/**
|
|
80
|
+
* Every label raster, packed into one texture's worth of shelves, with the
|
|
81
|
+
* uploads the renderer owes it.
|
|
82
|
+
*
|
|
83
|
+
* The atlas is CPU-side and outlives any one GL context: it keeps each
|
|
84
|
+
* entry's raster, so a renderer that is new — the surface was recreated —
|
|
85
|
+
* uploads it again from here ({@link restart}), and asks nothing of the text
|
|
86
|
+
* engine. What it holds is bounded by the texture it packs into: 16 MB for
|
|
87
|
+
* the default 2048², whatever is panned past.
|
|
88
|
+
*
|
|
89
|
+
* **Measuring is budgeted, drawing is asynchronous, uploading is metered.**
|
|
90
|
+
* Placement needs a label's box the frame it is considered, which is a
|
|
91
|
+
* synchronous shaping call — tens of microseconds on the Cocoa backend, but
|
|
92
|
+
* milliseconds each the first time on X11, where fonts load and glyphs
|
|
93
|
+
* rasterize in JS — so a frame measures until its deadline and leaves the
|
|
94
|
+
* rest for the next. A raster is asked for only once a label has won a
|
|
95
|
+
* place, and arrives a batch at a time, a readback later; the renderer
|
|
96
|
+
* takes a few dozen a frame into the texture, and a label fades in once its
|
|
97
|
+
* raster is there.
|
|
98
|
+
*/
|
|
99
|
+
export declare class LabelAtlas {
|
|
100
|
+
readonly size: number;
|
|
101
|
+
/** Clear margin rasterized around every string, in pixels — what a halo
|
|
102
|
+
* grows into, and what keeps it from sampling a neighbour. */
|
|
103
|
+
readonly pad: number;
|
|
104
|
+
/** A frame's measuring ran out of budget: there is more to place. */
|
|
105
|
+
starved: boolean;
|
|
106
|
+
onChange: (() => void) | null;
|
|
107
|
+
private _engine;
|
|
108
|
+
private readonly _entries;
|
|
109
|
+
/** Entries the texture does not have where they are, oldest first. */
|
|
110
|
+
private _uploads;
|
|
111
|
+
private readonly _wanted;
|
|
112
|
+
private readonly _failed;
|
|
113
|
+
private readonly _measured;
|
|
114
|
+
private _busy;
|
|
115
|
+
private _shelves;
|
|
116
|
+
private _top;
|
|
117
|
+
private _frame;
|
|
118
|
+
private _deadline;
|
|
119
|
+
private _measures;
|
|
120
|
+
constructor(engine: TextEngine | null, options: {
|
|
121
|
+
size?: number;
|
|
122
|
+
pad: number;
|
|
123
|
+
});
|
|
124
|
+
/** Strings asked for and not yet rasterized, or a batch in flight. */
|
|
125
|
+
get pending(): boolean;
|
|
126
|
+
/** Rasters waiting for the texture. */
|
|
127
|
+
get uploading(): boolean;
|
|
128
|
+
get entries(): number;
|
|
129
|
+
/** A new frame, whose measuring stops at `deadline` (after one). */
|
|
130
|
+
beginFrame(deadline: number): void;
|
|
131
|
+
/** The box a string sets in, or null when this frame's budget is spent. */
|
|
132
|
+
measure(text: string, size: number): TextBox | null;
|
|
133
|
+
/** The string's raster, once the texture has it; null until then —
|
|
134
|
+
* asking is what gets it rasterized. */
|
|
135
|
+
entry(text: string, size: number): AtlasEntry | null;
|
|
136
|
+
/** Start rasterizing what has been asked for, unless a batch is out. */
|
|
137
|
+
pump(): void;
|
|
138
|
+
/** Up to `max` rasters for the texture, oldest first. The renderer marks
|
|
139
|
+
* each `ready` once it is uploaded. */
|
|
140
|
+
takeUploads(max: number): AtlasEntry[];
|
|
141
|
+
/** The texture is new, and has none of it: everything goes up again. */
|
|
142
|
+
restart(): void;
|
|
143
|
+
dispose(): void;
|
|
144
|
+
private _add;
|
|
145
|
+
/** A shelf packer: rows of one height class (rounded up to 8 pixels),
|
|
146
|
+
* filled left to right, a new row below the last when none has room. */
|
|
147
|
+
private _allocate;
|
|
148
|
+
/** Drop what has not been drawn for a while and pack the rest again,
|
|
149
|
+
* tallest first. Everything kept has moved, so none of it is drawn
|
|
150
|
+
* until the renderer has uploaded it where it now is. */
|
|
151
|
+
private _compact;
|
|
152
|
+
}
|
|
153
|
+
export {};
|
|
154
|
+
//# sourceMappingURL=text.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text.d.ts","sourceRoot":"","sources":["../../../src/maps/gl/text.ts"],"names":[],"mappings":"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"}
|