@react-x11/components 0.9.0 → 0.11.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 +10 -4
- package/dist/charts/node.d.ts +11 -1
- package/dist/charts/node.d.ts.map +1 -1
- package/dist/charts/node.js +44 -14
- package/dist/charts/node.js.map +1 -1
- package/dist/charts/render.d.ts +12 -3
- package/dist/charts/render.d.ts.map +1 -1
- package/dist/charts/render.js +94 -25
- package/dist/charts/render.js.map +1 -1
- package/dist/code/index.d.ts.map +1 -1
- package/dist/code/index.js +27 -24
- package/dist/code/index.js.map +1 -1
- package/dist/code-editor/completion.d.ts.map +1 -1
- package/dist/code-editor/completion.js +3 -2
- package/dist/code-editor/completion.js.map +1 -1
- package/dist/code-editor/index.d.ts.map +1 -1
- package/dist/code-editor/index.js +19 -0
- package/dist/code-editor/index.js.map +1 -1
- package/dist/code-editor/node.d.ts +177 -7
- package/dist/code-editor/node.d.ts.map +1 -1
- package/dist/code-editor/node.js +1329 -164
- package/dist/code-editor/node.js.map +1 -1
- package/dist/code-language/index.d.ts +1 -1
- package/dist/code-language/index.d.ts.map +1 -1
- package/dist/code-language/index.js +1 -1
- package/dist/code-language/index.js.map +1 -1
- package/dist/code-language/languages/glsl.d.ts.map +1 -1
- package/dist/code-language/languages/glsl.js +10 -2
- package/dist/code-language/languages/glsl.js.map +1 -1
- package/dist/code-language/languages/javascript.d.ts.map +1 -1
- package/dist/code-language/languages/javascript.js +18 -3
- package/dist/code-language/languages/javascript.js.map +1 -1
- package/dist/code-language/languages/json.d.ts.map +1 -1
- package/dist/code-language/languages/json.js +10 -2
- package/dist/code-language/languages/json.js.map +1 -1
- package/dist/code-language/languages/shell.d.ts.map +1 -1
- package/dist/code-language/languages/shell.js +10 -2
- package/dist/code-language/languages/shell.js.map +1 -1
- package/dist/code-language/languages/sql.d.ts.map +1 -1
- package/dist/code-language/languages/sql.js +20 -2
- package/dist/code-language/languages/sql.js.map +1 -1
- package/dist/code-language/runs.d.ts +31 -0
- package/dist/code-language/runs.d.ts.map +1 -1
- package/dist/code-language/runs.js +105 -0
- package/dist/code-language/runs.js.map +1 -1
- package/dist/code-language/stream.d.ts +22 -0
- package/dist/code-language/stream.d.ts.map +1 -1
- package/dist/code-language/stream.js +259 -9
- package/dist/code-language/stream.js.map +1 -1
- package/dist/code-language/types.d.ts +5 -4
- package/dist/code-language/types.d.ts.map +1 -1
- package/dist/codeblock/index.d.ts +26 -2
- package/dist/codeblock/index.d.ts.map +1 -1
- package/dist/codeblock/index.js +57 -4
- package/dist/codeblock/index.js.map +1 -1
- package/dist/flow/draw.d.ts +50 -0
- package/dist/flow/draw.d.ts.map +1 -1
- package/dist/flow/draw.js +132 -33
- package/dist/flow/draw.js.map +1 -1
- package/dist/flow/gl/color.d.ts +13 -0
- package/dist/flow/gl/color.d.ts.map +1 -0
- package/dist/flow/gl/color.js +82 -0
- package/dist/flow/gl/color.js.map +1 -0
- package/dist/flow/gl/index.d.ts +60 -0
- package/dist/flow/gl/index.d.ts.map +1 -0
- package/dist/flow/gl/index.js +283 -0
- package/dist/flow/gl/index.js.map +1 -0
- package/dist/flow/gl/pack.d.ts +133 -0
- package/dist/flow/gl/pack.d.ts.map +1 -0
- package/dist/flow/gl/pack.js +408 -0
- package/dist/flow/gl/pack.js.map +1 -0
- package/dist/flow/gl/renderer.d.ts +95 -0
- package/dist/flow/gl/renderer.d.ts.map +1 -0
- package/dist/flow/gl/renderer.js +459 -0
- package/dist/flow/gl/renderer.js.map +1 -0
- package/dist/flow/gl/shaders.d.ts +79 -0
- package/dist/flow/gl/shaders.d.ts.map +1 -0
- package/dist/flow/gl/shaders.js +346 -0
- package/dist/flow/gl/shaders.js.map +1 -0
- package/dist/flow/gl/text.d.ts +318 -0
- package/dist/flow/gl/text.d.ts.map +1 -0
- package/dist/flow/gl/text.js +1103 -0
- package/dist/flow/gl/text.js.map +1 -0
- package/dist/flow/index.d.ts +1 -1
- package/dist/flow/index.d.ts.map +1 -1
- package/dist/flow/index.js +619 -64
- package/dist/flow/index.js.map +1 -1
- package/dist/flow/node.d.ts +621 -72
- package/dist/flow/node.d.ts.map +1 -1
- package/dist/flow/node.js +2253 -1018
- package/dist/flow/node.js.map +1 -1
- package/dist/flow/paint.d.ts +35 -0
- package/dist/flow/paint.d.ts.map +1 -0
- package/dist/flow/paint.js +393 -0
- package/dist/flow/paint.js.map +1 -0
- package/dist/flow/paths.d.ts +14 -0
- package/dist/flow/paths.d.ts.map +1 -1
- package/dist/flow/paths.js +45 -19
- package/dist/flow/paths.js.map +1 -1
- package/dist/flow/scene.d.ts +584 -0
- package/dist/flow/scene.d.ts.map +1 -0
- package/dist/flow/scene.js +1453 -0
- package/dist/flow/scene.js.map +1 -0
- package/dist/flow/types.d.ts +111 -1
- package/dist/flow/types.d.ts.map +1 -1
- package/dist/html/controls.d.ts +28 -0
- package/dist/html/controls.d.ts.map +1 -1
- package/dist/html/controls.js +52 -2
- package/dist/html/controls.js.map +1 -1
- package/dist/html/css/calc.d.ts +14 -0
- package/dist/html/css/calc.d.ts.map +1 -0
- package/dist/html/css/calc.js +344 -0
- package/dist/html/css/calc.js.map +1 -0
- package/dist/html/css/cascade.d.ts +262 -6
- package/dist/html/css/cascade.d.ts.map +1 -1
- package/dist/html/css/cascade.js +1373 -67
- package/dist/html/css/cascade.js.map +1 -1
- package/dist/html/css/color.d.ts +23 -0
- package/dist/html/css/color.d.ts.map +1 -0
- package/dist/html/css/color.js +740 -0
- package/dist/html/css/color.js.map +1 -0
- package/dist/html/css/content.d.ts +92 -0
- package/dist/html/css/content.d.ts.map +1 -0
- package/dist/html/css/content.js +388 -0
- package/dist/html/css/content.js.map +1 -0
- package/dist/html/css/counter-styles.d.ts +76 -0
- package/dist/html/css/counter-styles.d.ts.map +1 -0
- package/dist/html/css/counter-styles.js +893 -0
- package/dist/html/css/counter-styles.js.map +1 -0
- package/dist/html/css/decode.d.ts +12 -0
- package/dist/html/css/decode.d.ts.map +1 -0
- package/dist/html/css/decode.js +116 -0
- package/dist/html/css/decode.js.map +1 -0
- package/dist/html/css/parse.d.ts +110 -10
- package/dist/html/css/parse.d.ts.map +1 -1
- package/dist/html/css/parse.js +1473 -180
- package/dist/html/css/parse.js.map +1 -1
- package/dist/html/css/style.d.ts +501 -15
- package/dist/html/css/style.d.ts.map +1 -1
- package/dist/html/css/style.js +3729 -206
- package/dist/html/css/style.js.map +1 -1
- package/dist/html/css/ua.d.ts.map +1 -1
- package/dist/html/css/ua.js +65 -16
- package/dist/html/css/ua.js.map +1 -1
- package/dist/html/css/values.d.ts +37 -3
- package/dist/html/css/values.d.ts.map +1 -1
- package/dist/html/css/values.js +122 -48
- package/dist/html/css/values.js.map +1 -1
- package/dist/html/css/vars.d.ts +52 -0
- package/dist/html/css/vars.d.ts.map +1 -0
- package/dist/html/css/vars.js +358 -0
- package/dist/html/css/vars.js.map +1 -0
- package/dist/html/dom.d.ts +30 -4
- package/dist/html/dom.d.ts.map +1 -1
- package/dist/html/dom.js +278 -17
- package/dist/html/dom.js.map +1 -1
- package/dist/html/fonts.d.ts +106 -0
- package/dist/html/fonts.d.ts.map +1 -0
- package/dist/html/fonts.js +565 -0
- package/dist/html/fonts.js.map +1 -0
- package/dist/html/gif.d.ts +15 -0
- package/dist/html/gif.d.ts.map +1 -0
- package/dist/html/gif.js +229 -0
- package/dist/html/gif.js.map +1 -0
- package/dist/html/index.d.ts +50 -11
- package/dist/html/index.d.ts.map +1 -1
- package/dist/html/index.js +115 -9
- package/dist/html/index.js.map +1 -1
- package/dist/html/layout/block.d.ts +226 -3
- package/dist/html/layout/block.d.ts.map +1 -1
- package/dist/html/layout/block.js +3077 -219
- package/dist/html/layout/block.js.map +1 -1
- package/dist/html/layout/boxes.d.ts +367 -17
- package/dist/html/layout/boxes.d.ts.map +1 -1
- package/dist/html/layout/boxes.js +1742 -182
- package/dist/html/layout/boxes.js.map +1 -1
- package/dist/html/layout/cache.d.ts +58 -0
- package/dist/html/layout/cache.d.ts.map +1 -0
- package/dist/html/layout/cache.js +224 -0
- package/dist/html/layout/cache.js.map +1 -0
- package/dist/html/layout/collapse.d.ts +45 -0
- package/dist/html/layout/collapse.d.ts.map +1 -0
- package/dist/html/layout/collapse.js +246 -0
- package/dist/html/layout/collapse.js.map +1 -0
- package/dist/html/layout/css-grid.d.ts +7 -0
- package/dist/html/layout/css-grid.d.ts.map +1 -0
- package/dist/html/layout/css-grid.js +900 -0
- package/dist/html/layout/css-grid.js.map +1 -0
- package/dist/html/layout/flex.d.ts.map +1 -1
- package/dist/html/layout/flex.js +1025 -89
- package/dist/html/layout/flex.js.map +1 -1
- package/dist/html/layout/floats.d.ts +45 -6
- package/dist/html/layout/floats.d.ts.map +1 -1
- package/dist/html/layout/floats.js +113 -14
- package/dist/html/layout/floats.js.map +1 -1
- package/dist/html/layout/grid-lines.d.ts +39 -0
- package/dist/html/layout/grid-lines.d.ts.map +1 -0
- package/dist/html/layout/grid-lines.js +119 -0
- package/dist/html/layout/grid-lines.js.map +1 -0
- package/dist/html/layout/grid.d.ts +53 -0
- package/dist/html/layout/grid.d.ts.map +1 -0
- package/dist/html/layout/grid.js +153 -0
- package/dist/html/layout/grid.js.map +1 -0
- package/dist/html/layout/inline.d.ts +154 -1
- package/dist/html/layout/inline.d.ts.map +1 -1
- package/dist/html/layout/inline.js +3598 -175
- package/dist/html/layout/inline.js.map +1 -1
- package/dist/html/layout/shaping.d.ts +6 -0
- package/dist/html/layout/shaping.d.ts.map +1 -0
- package/dist/html/layout/shaping.js +100 -0
- package/dist/html/layout/shaping.js.map +1 -0
- package/dist/html/layout/table.d.ts +3 -0
- package/dist/html/layout/table.d.ts.map +1 -1
- package/dist/html/layout/table.js +681 -175
- package/dist/html/layout/table.js.map +1 -1
- package/dist/html/layout/tracks.d.ts +44 -0
- package/dist/html/layout/tracks.d.ts.map +1 -0
- package/dist/html/layout/tracks.js +349 -0
- package/dist/html/layout/tracks.js.map +1 -0
- package/dist/html/node.d.ts +169 -4
- package/dist/html/node.d.ts.map +1 -1
- package/dist/html/node.js +1429 -137
- package/dist/html/node.js.map +1 -1
- package/dist/html/paint.d.ts +92 -3
- package/dist/html/paint.d.ts.map +1 -1
- package/dist/html/paint.js +3635 -107
- package/dist/html/paint.js.map +1 -1
- package/dist/html/resources.d.ts +60 -14
- package/dist/html/resources.d.ts.map +1 -1
- package/dist/html/resources.js +122 -36
- package/dist/html/resources.js.map +1 -1
- package/dist/html/surfaces.d.ts +23 -0
- package/dist/html/surfaces.d.ts.map +1 -0
- package/dist/html/surfaces.js +68 -0
- package/dist/html/surfaces.js.map +1 -0
- package/dist/html/svg.d.ts +80 -0
- package/dist/html/svg.d.ts.map +1 -0
- package/dist/html/svg.js +442 -0
- package/dist/html/svg.js.map +1 -0
- package/dist/html/url.d.ts +23 -0
- package/dist/html/url.d.ts.map +1 -0
- package/dist/html/url.js +80 -0
- package/dist/html/url.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/internal/codelines.d.ts +42 -0
- package/dist/internal/codelines.d.ts.map +1 -0
- package/dist/internal/codelines.js +170 -0
- package/dist/internal/codelines.js.map +1 -0
- package/dist/internal/collate.d.ts +3 -0
- package/dist/internal/collate.d.ts.map +1 -0
- package/dist/internal/collate.js +11 -0
- package/dist/internal/collate.js.map +1 -0
- package/dist/internal/markdown/ast.d.ts +11 -0
- package/dist/internal/markdown/ast.d.ts.map +1 -1
- package/dist/internal/markdown/parse.d.ts.map +1 -1
- package/dist/internal/markdown/parse.js +109 -8
- package/dist/internal/markdown/parse.js.map +1 -1
- package/dist/internal/prewarm.d.ts +18 -0
- package/dist/internal/prewarm.d.ts.map +1 -0
- package/dist/internal/prewarm.js +42 -0
- package/dist/internal/prewarm.js.map +1 -0
- package/dist/internal/sdf.d.ts +20 -0
- package/dist/internal/sdf.d.ts.map +1 -0
- package/dist/internal/sdf.js +216 -0
- package/dist/internal/sdf.js.map +1 -0
- package/dist/internal/splice.d.ts +12 -0
- package/dist/internal/splice.d.ts.map +1 -0
- package/dist/internal/splice.js +23 -0
- package/dist/internal/splice.js.map +1 -0
- package/dist/internal/window.d.ts +12 -0
- package/dist/internal/window.d.ts.map +1 -1
- package/dist/internal/window.js +23 -6
- package/dist/internal/window.js.map +1 -1
- package/dist/maps/anchors.d.ts +6 -1
- package/dist/maps/anchors.d.ts.map +1 -1
- package/dist/maps/anchors.js +260 -1
- package/dist/maps/anchors.js.map +1 -1
- package/dist/maps/controller.d.ts +57 -0
- package/dist/maps/controller.d.ts.map +1 -1
- package/dist/maps/controller.js +97 -18
- package/dist/maps/controller.js.map +1 -1
- package/dist/maps/gl/buckets.d.ts +5 -1
- package/dist/maps/gl/buckets.d.ts.map +1 -1
- package/dist/maps/gl/buckets.js +5 -2
- package/dist/maps/gl/buckets.js.map +1 -1
- package/dist/maps/gl/build-worker.d.ts +2 -0
- package/dist/maps/gl/build-worker.d.ts.map +1 -1
- package/dist/maps/gl/build-worker.js +1 -1
- package/dist/maps/gl/build-worker.js.map +1 -1
- package/dist/maps/gl/cover.d.ts +23 -4
- package/dist/maps/gl/cover.d.ts.map +1 -1
- package/dist/maps/gl/cover.js +61 -48
- package/dist/maps/gl/cover.js.map +1 -1
- package/dist/maps/gl/placement.d.ts +21 -8
- package/dist/maps/gl/placement.d.ts.map +1 -1
- package/dist/maps/gl/placement.js +133 -58
- package/dist/maps/gl/placement.js.map +1 -1
- package/dist/maps/gl/renderer.d.ts +36 -4
- package/dist/maps/gl/renderer.d.ts.map +1 -1
- package/dist/maps/gl/renderer.js +81 -24
- package/dist/maps/gl/renderer.js.map +1 -1
- package/dist/maps/gl/shaders.d.ts +18 -17
- package/dist/maps/gl/shaders.d.ts.map +1 -1
- package/dist/maps/gl/shaders.js +34 -32
- package/dist/maps/gl/shaders.js.map +1 -1
- package/dist/maps/gl/store.d.ts +10 -0
- package/dist/maps/gl/store.d.ts.map +1 -1
- package/dist/maps/gl/store.js +47 -4
- package/dist/maps/gl/store.js.map +1 -1
- package/dist/maps/gl/text.d.ts +153 -24
- package/dist/maps/gl/text.d.ts.map +1 -1
- package/dist/maps/gl/text.js +379 -63
- package/dist/maps/gl/text.js.map +1 -1
- package/dist/maps/gl/view.d.ts +293 -2
- package/dist/maps/gl/view.d.ts.map +1 -1
- package/dist/maps/gl/view.js +317 -82
- package/dist/maps/gl/view.js.map +1 -1
- package/dist/maps/icons.d.ts +32 -0
- package/dist/maps/icons.d.ts.map +1 -0
- package/dist/maps/icons.js +151 -0
- package/dist/maps/icons.js.map +1 -0
- package/dist/maps/index.d.ts +2 -0
- package/dist/maps/index.d.ts.map +1 -1
- package/dist/maps/index.js +2 -0
- package/dist/maps/index.js.map +1 -1
- package/dist/maps/labels.d.ts +56 -4
- package/dist/maps/labels.d.ts.map +1 -1
- package/dist/maps/labels.js +213 -46
- package/dist/maps/labels.js.map +1 -1
- package/dist/maps/node.d.ts +17 -0
- package/dist/maps/node.d.ts.map +1 -1
- package/dist/maps/node.js +64 -30
- package/dist/maps/node.js.map +1 -1
- package/dist/maps/proj.d.ts +48 -0
- package/dist/maps/proj.d.ts.map +1 -1
- package/dist/maps/proj.js +73 -0
- package/dist/maps/proj.js.map +1 -1
- package/dist/maps/sources.d.ts +5 -3
- package/dist/maps/sources.d.ts.map +1 -1
- package/dist/maps/sources.js +5 -3
- package/dist/maps/sources.js.map +1 -1
- package/dist/maps/style.d.ts +35 -0
- package/dist/maps/style.d.ts.map +1 -1
- package/dist/maps/style.js.map +1 -1
- package/dist/maps/styles.d.ts +12 -0
- package/dist/maps/styles.d.ts.map +1 -1
- package/dist/maps/styles.js +120 -6
- package/dist/maps/styles.js.map +1 -1
- package/dist/maps/tiles.d.ts +31 -11
- package/dist/maps/tiles.d.ts.map +1 -1
- package/dist/maps/tiles.js +61 -27
- package/dist/maps/tiles.js.map +1 -1
- package/dist/maps/types.d.ts +28 -4
- package/dist/maps/types.d.ts.map +1 -1
- package/dist/markdown/index.d.ts.map +1 -1
- package/dist/markdown/index.js +209 -68
- package/dist/markdown/index.js.map +1 -1
- package/dist/markdown/spans.d.ts.map +1 -1
- package/dist/markdown/spans.js +6 -0
- package/dist/markdown/spans.js.map +1 -1
- package/dist/qml/containers.d.ts.map +1 -1
- package/dist/qml/containers.js +6 -1
- package/dist/qml/containers.js.map +1 -1
- package/dist/qml/interaction.d.ts.map +1 -1
- package/dist/qml/interaction.js +38 -5
- package/dist/qml/interaction.js.map +1 -1
- package/dist/qml/layouts.d.ts.map +1 -1
- package/dist/qml/layouts.js +21 -6
- package/dist/qml/layouts.js.map +1 -1
- package/dist/qml/qtquick.d.ts.map +1 -1
- package/dist/qml/qtquick.js +9 -2
- package/dist/qml/qtquick.js.map +1 -1
- package/dist/qml/react.d.ts.map +1 -1
- package/dist/qml/react.js +9 -7
- package/dist/qml/react.js.map +1 -1
- package/dist/reorder/clock.d.ts +7 -0
- package/dist/reorder/clock.d.ts.map +1 -0
- package/dist/reorder/clock.js +26 -0
- package/dist/reorder/clock.js.map +1 -0
- package/dist/reorder/index.d.ts +25 -3
- package/dist/reorder/index.d.ts.map +1 -1
- package/dist/reorder/index.js +64 -19
- package/dist/reorder/index.js.map +1 -1
- package/dist/rich-text-editor/index.d.ts +0 -11
- package/dist/rich-text-editor/index.d.ts.map +1 -1
- package/dist/rich-text-editor/index.js +38 -9
- package/dist/rich-text-editor/index.js.map +1 -1
- package/dist/rich-text-editor/keymap.d.ts.map +1 -1
- package/dist/rich-text-editor/keymap.js +2 -1
- package/dist/rich-text-editor/keymap.js.map +1 -1
- package/dist/rich-text-editor/keys.d.ts +17 -6
- package/dist/rich-text-editor/keys.d.ts.map +1 -1
- package/dist/rich-text-editor/keys.js +135 -26
- package/dist/rich-text-editor/keys.js.map +1 -1
- package/dist/rich-text-editor/markdown.d.ts.map +1 -1
- package/dist/rich-text-editor/markdown.js +30 -1
- package/dist/rich-text-editor/markdown.js.map +1 -1
- package/dist/rich-text-editor/marks.d.ts +9 -0
- package/dist/rich-text-editor/marks.d.ts.map +1 -0
- package/dist/rich-text-editor/marks.js +83 -0
- package/dist/rich-text-editor/marks.js.map +1 -0
- package/dist/rich-text-editor/render.d.ts.map +1 -1
- package/dist/rich-text-editor/render.js +28 -10
- package/dist/rich-text-editor/render.js.map +1 -1
- package/dist/rich-text-editor/replace.d.ts +13 -0
- package/dist/rich-text-editor/replace.d.ts.map +1 -0
- package/dist/rich-text-editor/replace.js +64 -0
- package/dist/rich-text-editor/replace.js.map +1 -0
- package/dist/rich-text-editor/toolbar.d.ts.map +1 -1
- package/dist/rich-text-editor/toolbar.js +1 -1
- package/dist/rich-text-editor/toolbar.js.map +1 -1
- package/dist/rich-text-editor/virtual.d.ts.map +1 -1
- package/dist/rich-text-editor/virtual.js +17 -0
- package/dist/rich-text-editor/virtual.js.map +1 -1
- package/dist/richtext/node.d.ts +46 -2
- package/dist/richtext/node.d.ts.map +1 -1
- package/dist/richtext/node.js +187 -4
- package/dist/richtext/node.js.map +1 -1
- package/dist/richtext/runs.d.ts +13 -8
- package/dist/richtext/runs.d.ts.map +1 -1
- package/dist/richtext/runs.js +18 -8
- package/dist/richtext/runs.js.map +1 -1
- package/dist/table/index.d.ts.map +1 -1
- package/dist/table/index.js +23 -0
- package/dist/table/index.js.map +1 -1
- package/dist/table/rows.d.ts +3 -2
- package/dist/table/rows.d.ts.map +1 -1
- package/dist/table/rows.js +20 -6
- package/dist/table/rows.js.map +1 -1
- package/dist/terminal/index.d.ts.map +1 -1
- package/dist/terminal/index.js +4 -0
- package/dist/terminal/index.js.map +1 -1
- package/dist/terminal/vt/pty.d.ts +13 -2
- package/dist/terminal/vt/pty.d.ts.map +1 -1
- package/dist/terminal/vt/pty.js +18 -3
- package/dist/terminal/vt/pty.js.map +1 -1
- package/dist/terminal-output/index.d.ts.map +1 -1
- package/dist/terminal-output/index.js +103 -23
- package/dist/terminal-output/index.js.map +1 -1
- package/dist/terminal-output/runs.d.ts +4 -1
- package/dist/terminal-output/runs.d.ts.map +1 -1
- package/dist/terminal-output/runs.js +5 -1
- package/dist/terminal-output/runs.js.map +1 -1
- package/dist/three/canvas.d.ts.map +1 -1
- package/dist/three/canvas.js +85 -7
- package/dist/three/canvas.js.map +1 -1
- package/dist/three/events.d.ts +22 -4
- package/dist/three/events.d.ts.map +1 -1
- package/dist/three/events.js +34 -4
- package/dist/three/events.js.map +1 -1
- package/dist/tree/index.d.ts.map +1 -1
- package/dist/tree/index.js +17 -0
- package/dist/tree/index.js.map +1 -1
- package/package.json +42 -33
- package/src/charts/node.ts +62 -26
- package/src/charts/render.ts +120 -30
- package/src/code/index.ts +36 -32
- package/src/code-editor/completion.ts +3 -2
- package/src/code-editor/index.ts +19 -0
- package/src/code-editor/node.ts +1574 -184
- package/src/code-language/index.ts +1 -1
- package/src/code-language/languages/glsl.ts +12 -2
- package/src/code-language/languages/javascript.ts +21 -4
- package/src/code-language/languages/json.ts +12 -2
- package/src/code-language/languages/shell.ts +12 -2
- package/src/code-language/languages/sql.ts +22 -2
- package/src/code-language/runs.ts +111 -1
- package/src/code-language/stream.ts +257 -17
- package/src/code-language/types.ts +5 -4
- package/src/codeblock/index.ts +68 -4
- package/src/flow/draw.ts +167 -41
- package/src/flow/gl/color.ts +85 -0
- package/src/flow/gl/index.ts +342 -0
- package/src/flow/gl/pack.ts +585 -0
- package/src/flow/gl/renderer.ts +679 -0
- package/src/flow/gl/shaders.ts +371 -0
- package/src/flow/gl/text.ts +1295 -0
- package/src/flow/index.ts +794 -67
- package/src/flow/node.ts +2496 -1256
- package/src/flow/paint.ts +511 -0
- package/src/flow/paths.ts +80 -15
- package/src/flow/scene.ts +2199 -0
- package/src/flow/types.ts +113 -1
- package/src/html/controls.ts +73 -2
- package/src/html/css/calc.ts +385 -0
- package/src/html/css/cascade.ts +1481 -62
- package/src/html/css/color.ts +755 -0
- package/src/html/css/content.ts +417 -0
- package/src/html/css/counter-styles.ts +973 -0
- package/src/html/css/decode.ts +130 -0
- package/src/html/css/parse.ts +1514 -160
- package/src/html/css/style.ts +4131 -223
- package/src/html/css/ua.ts +66 -17
- package/src/html/css/values.ts +150 -50
- package/src/html/css/vars.ts +348 -0
- package/src/html/dom.ts +284 -17
- package/src/html/fonts.ts +641 -0
- package/src/html/gif.ts +233 -0
- package/src/html/index.ts +180 -20
- package/src/html/layout/block.ts +3560 -208
- package/src/html/layout/boxes.ts +2141 -190
- package/src/html/layout/cache.ts +289 -0
- package/src/html/layout/collapse.ts +317 -0
- package/src/html/layout/css-grid.ts +1063 -0
- package/src/html/layout/flex.ts +1115 -106
- package/src/html/layout/floats.ts +128 -14
- package/src/html/layout/grid-lines.ts +141 -0
- package/src/html/layout/grid.ts +181 -0
- package/src/html/layout/inline.ts +4187 -192
- package/src/html/layout/shaping.ts +140 -0
- package/src/html/layout/table.ts +696 -186
- package/src/html/layout/tracks.ts +437 -0
- package/src/html/node.ts +1585 -156
- package/src/html/paint.ts +4582 -267
- package/src/html/resources.ts +161 -50
- package/src/html/surfaces.ts +81 -0
- package/src/html/svg.ts +504 -0
- package/src/html/url.ts +86 -0
- package/src/index.ts +2 -0
- package/src/internal/codelines.ts +200 -0
- package/src/internal/collate.ts +12 -0
- package/src/internal/markdown/ast.ts +11 -0
- package/src/internal/markdown/parse.ts +154 -11
- package/src/internal/prewarm.ts +45 -0
- package/src/internal/sdf.ts +227 -0
- package/src/internal/splice.ts +25 -0
- package/src/internal/window.ts +36 -5
- package/src/maps/anchors.ts +307 -1
- package/src/maps/controller.ts +116 -31
- package/src/maps/gl/buckets.ts +5 -1
- package/src/maps/gl/build-worker.ts +13 -2
- package/src/maps/gl/cover.ts +79 -44
- package/src/maps/gl/placement.ts +221 -69
- package/src/maps/gl/renderer.ts +104 -20
- package/src/maps/gl/shaders.ts +35 -32
- package/src/maps/gl/store.ts +66 -17
- package/src/maps/gl/text.ts +444 -71
- package/src/maps/gl/view.ts +361 -96
- package/src/maps/icons.ts +183 -0
- package/src/maps/index.ts +4 -0
- package/src/maps/labels.ts +269 -49
- package/src/maps/node.ts +82 -49
- package/src/maps/proj.ts +87 -0
- package/src/maps/sources.ts +5 -3
- package/src/maps/style.ts +32 -0
- package/src/maps/styles.ts +215 -4
- package/src/maps/tiles.ts +64 -31
- package/src/maps/types.ts +28 -4
- package/src/markdown/index.ts +293 -92
- package/src/markdown/spans.ts +5 -0
- package/src/qml/containers.tsx +6 -1
- package/src/qml/interaction.tsx +42 -5
- package/src/qml/layouts.tsx +21 -6
- package/src/qml/qtquick.tsx +9 -2
- package/src/qml/react.tsx +7 -5
- package/src/reorder/clock.ts +27 -0
- package/src/reorder/index.ts +100 -27
- package/src/rich-text-editor/index.ts +37 -12
- package/src/rich-text-editor/keymap.ts +1 -1
- package/src/rich-text-editor/keys.ts +135 -26
- package/src/rich-text-editor/markdown.ts +36 -1
- package/src/rich-text-editor/marks.ts +101 -0
- package/src/rich-text-editor/render.ts +49 -12
- package/src/rich-text-editor/replace.ts +85 -0
- package/src/rich-text-editor/toolbar.ts +1 -1
- package/src/rich-text-editor/virtual.ts +25 -0
- package/src/richtext/node.ts +235 -14
- package/src/richtext/runs.ts +23 -12
- package/src/table/index.ts +29 -0
- package/src/table/rows.ts +18 -8
- package/src/terminal/index.ts +4 -0
- package/src/terminal/vt/pty.ts +16 -2
- package/src/terminal-output/index.ts +129 -31
- package/src/terminal-output/runs.ts +16 -2
- package/src/three/canvas.ts +102 -8
- package/src/three/events.ts +49 -9
- package/src/tree/index.ts +19 -0
package/dist/maps/gl/text.js
CHANGED
|
@@ -13,11 +13,31 @@
|
|
|
13
13
|
// A label is rasterized **whole**, not glyph by glyph: placement sets every
|
|
14
14
|
// line label on a straight stretch, so a label is one rigid piece of type —
|
|
15
15
|
// one textured quad, rotated as a unit — and shaping, kerning and scripts
|
|
16
|
-
// stay the text engine's business.
|
|
17
|
-
//
|
|
18
|
-
//
|
|
19
|
-
//
|
|
16
|
+
// stay the text engine's business.
|
|
17
|
+
//
|
|
18
|
+
// **One raster per string, at every size.** The engine sets a string once,
|
|
19
|
+
// at the atlas's `base` size, as coverage; what is stored is its signed
|
|
20
|
+
// distance field (`src/internal/sdf.ts`), one byte a texel. A name drawn at 11 pixels
|
|
21
|
+
// and the same name at 20 are one raster scaled, so a zoom ramp that grows
|
|
22
|
+
// the type asks for nothing new, and a halo of any width is a threshold on
|
|
23
|
+
// the same distances. Colour and halo are the shader's (see `./shaders.ts`),
|
|
24
|
+
// so one raster serves every palette and a light-to-dark switch
|
|
25
|
+
// re-rasterizes nothing. What it costs is the engine's hinting — the text
|
|
26
|
+
// is its outline, scaled — which at map-label sizes is the right trade:
|
|
27
|
+
// one shaping and one readback per name for the life of the atlas.
|
|
28
|
+
//
|
|
29
|
+
// An icon's two pieces (`../icons.ts`) are fields here too, drawn as
|
|
30
|
+
// coverage from the same paths the retained renderer fills, at the same
|
|
31
|
+
// base size, and coloured by the same shader.
|
|
20
32
|
import { Surface } from 'react-x11/ntk';
|
|
33
|
+
import { traceGlyph, tracePlate } from '../icons.js';
|
|
34
|
+
import { SDF_EDGE, distanceField } from '../../internal/sdf.js';
|
|
35
|
+
/** Whether a context can fill a path — what an icon is drawn with. */
|
|
36
|
+
function fills(ctx) {
|
|
37
|
+
return (typeof ctx.beginPath === 'function' &&
|
|
38
|
+
typeof ctx.arc === 'function' &&
|
|
39
|
+
typeof ctx.fill === 'function');
|
|
40
|
+
}
|
|
21
41
|
/** The offscreen surface a batch is set on, in device pixels. A readback
|
|
22
42
|
* has to stay inside it — X answers a GetImage past a pixmap's edge with
|
|
23
43
|
* BadMatch — so a batch is whatever fits. */
|
|
@@ -34,6 +54,9 @@ export class SurfaceTextEngine {
|
|
|
34
54
|
_layouts = new Map();
|
|
35
55
|
_surface = null;
|
|
36
56
|
_ctx = null;
|
|
57
|
+
/** Whether the layouts answer their own coverage: unknown until a string
|
|
58
|
+
* asks, and false for good once one does not. */
|
|
59
|
+
_coverage = null;
|
|
37
60
|
constructor(app, fonts, family) {
|
|
38
61
|
this._app = app;
|
|
39
62
|
this._fonts = fonts;
|
|
@@ -70,13 +93,65 @@ export class SurfaceTextEngine {
|
|
|
70
93
|
const layout = this._layout(text, size);
|
|
71
94
|
return { width: Math.ceil(layout.width), height: Math.ceil(layout.height) };
|
|
72
95
|
}
|
|
96
|
+
/**
|
|
97
|
+
* Strings the layouts set themselves, where the engine answers a layout's
|
|
98
|
+
* coverage (react-x11#673): no staging surface and no readback. The rest —
|
|
99
|
+
* icons, which are paths, and every string on an engine that cannot — go
|
|
100
|
+
* through the surface.
|
|
101
|
+
*/
|
|
102
|
+
/**
|
|
103
|
+
* A string the layout sets itself, synchronously, where the engine
|
|
104
|
+
* answers a layout's coverage — no surface, no readback, nothing to wait
|
|
105
|
+
* for. `undefined` for an icon, and for every string once the engine has
|
|
106
|
+
* shown it cannot.
|
|
107
|
+
*/
|
|
108
|
+
rasterizeNow(item, pad) {
|
|
109
|
+
if (item.icon || this._coverage === false)
|
|
110
|
+
return undefined;
|
|
111
|
+
const coverage = this._layout(item.text, item.size).coverage?.({ pad }) ?? null;
|
|
112
|
+
if (!coverage) {
|
|
113
|
+
if (this._coverage === null)
|
|
114
|
+
this._coverage = false;
|
|
115
|
+
return undefined;
|
|
116
|
+
}
|
|
117
|
+
this._coverage = true;
|
|
118
|
+
return coverage.width > STAGING_WIDTH || coverage.height > STAGING_HEIGHT
|
|
119
|
+
? null // wider than the surface could set: never drawn, as there
|
|
120
|
+
: {
|
|
121
|
+
width: coverage.width,
|
|
122
|
+
height: coverage.height,
|
|
123
|
+
pixels: coverage.data,
|
|
124
|
+
stride: 1,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
73
127
|
async rasterize(items, pad) {
|
|
128
|
+
if (this._coverage === false)
|
|
129
|
+
return this._stage(items, pad);
|
|
130
|
+
const out = new Array(items.length);
|
|
131
|
+
const rest = [];
|
|
132
|
+
items.forEach((item, i) => {
|
|
133
|
+
const raster = this.rasterizeNow(item, pad);
|
|
134
|
+
if (raster === undefined) {
|
|
135
|
+
rest.push(i);
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
out[i] = raster;
|
|
139
|
+
});
|
|
140
|
+
if (rest.length === 0)
|
|
141
|
+
return out;
|
|
142
|
+
const staged = await this._stage(rest.map((i) => items[i]), pad);
|
|
143
|
+
rest.forEach((i, k) => (out[i] = staged[k]));
|
|
144
|
+
return out;
|
|
145
|
+
}
|
|
146
|
+
async _stage(items, pad) {
|
|
74
147
|
const places = [];
|
|
75
148
|
let x = 0;
|
|
76
149
|
let y = 0;
|
|
77
150
|
let row = 0;
|
|
78
151
|
for (const item of items) {
|
|
79
|
-
const box =
|
|
152
|
+
const box = item.icon
|
|
153
|
+
? { width: Math.ceil(item.size), height: Math.ceil(item.size) }
|
|
154
|
+
: this.measure(item.text, item.size);
|
|
80
155
|
const w = box.width + pad * 2;
|
|
81
156
|
const h = box.height + pad * 2;
|
|
82
157
|
if (w > STAGING_WIDTH || h > STAGING_HEIGHT) {
|
|
@@ -112,19 +187,48 @@ export class SurfaceTextEngine {
|
|
|
112
187
|
const started = now();
|
|
113
188
|
// The rows drawn into: what is read back, and no more.
|
|
114
189
|
let used = 0;
|
|
190
|
+
let drawn = 0;
|
|
115
191
|
items.forEach((item, i) => {
|
|
116
192
|
const place = places[i];
|
|
117
193
|
if (!place)
|
|
118
194
|
return;
|
|
119
195
|
// Drawing is this thread's time; past the budget the rest wait for
|
|
120
|
-
// the next batch.
|
|
121
|
-
|
|
196
|
+
// the next batch — all but the first. A pause before it, a collection
|
|
197
|
+
// or a slow runner, deferred every string: nothing drawn, a readback of
|
|
198
|
+
// no rows, and a throw out of the frame; and a machine that slow would
|
|
199
|
+
// never have set one.
|
|
200
|
+
if (drawn > 0 && now() - started > DRAW_BUDGET_MS) {
|
|
122
201
|
places[i] = undefined;
|
|
123
202
|
return;
|
|
124
203
|
}
|
|
125
|
-
|
|
204
|
+
if (item.icon) {
|
|
205
|
+
// White, like the strings: coverage, coloured by the shader.
|
|
206
|
+
if (!fills(ctx)) {
|
|
207
|
+
places[i] = null;
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
const half = item.size / 2;
|
|
211
|
+
const cx = place.x + pad + half;
|
|
212
|
+
const cy = place.y + pad + half;
|
|
213
|
+
ctx.fillStyle = '#ffffff';
|
|
214
|
+
ctx.beginPath();
|
|
215
|
+
if (item.icon.part === 'plate')
|
|
216
|
+
tracePlate(ctx, cx, cy, item.size);
|
|
217
|
+
else
|
|
218
|
+
traceGlyph(ctx, item.icon.name, cx, cy, item.size);
|
|
219
|
+
ctx.fill();
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
this._layout(item.text, item.size).draw(ctx, place.x + pad, place.y + pad);
|
|
223
|
+
}
|
|
126
224
|
used = Math.max(used, place.y + place.h);
|
|
225
|
+
drawn += 1;
|
|
127
226
|
});
|
|
227
|
+
// nothing drawn — every icon here had nothing to fill with — is nothing
|
|
228
|
+
// to read back
|
|
229
|
+
if (drawn === 0) {
|
|
230
|
+
return places.map((p) => (p === null ? null : undefined));
|
|
231
|
+
}
|
|
128
232
|
const image = await ctx.getImageData(0, 0, STAGING_WIDTH, used);
|
|
129
233
|
return places.map((place) => {
|
|
130
234
|
if (!place)
|
|
@@ -148,15 +252,31 @@ export class SurfaceTextEngine {
|
|
|
148
252
|
this._layouts.clear();
|
|
149
253
|
}
|
|
150
254
|
}
|
|
151
|
-
|
|
255
|
+
/** A string's key: the text alone, because one field serves every size. */
|
|
256
|
+
const keyOf = (text) => `|${text}`;
|
|
257
|
+
/** An icon piece's key: `#` where a string's has `|`, so no string can
|
|
258
|
+
* be taken for one. */
|
|
259
|
+
const iconKey = (name, part) => `#${part}:${name}`;
|
|
260
|
+
/**
|
|
261
|
+
* Texels the drawn quad leaves off each side of a field: bilinear samples
|
|
262
|
+
* at its edge then stay inside the field's own margin, never reaching the
|
|
263
|
+
* shelf's unwritten rows or a neighbour.
|
|
264
|
+
*/
|
|
265
|
+
export const QUAD_INSET = 1;
|
|
152
266
|
/**
|
|
153
|
-
*
|
|
154
|
-
*
|
|
155
|
-
*
|
|
156
|
-
*
|
|
267
|
+
* How far past the glyphs' edge a field can see, in its own texels — the
|
|
268
|
+
* widest halo it holds, and the reach of its distances before they
|
|
269
|
+
* saturate — for a field set with `pad` texels of margin and `pad` of
|
|
270
|
+
* spread. Scale by the drawn size over the base for screen pixels.
|
|
157
271
|
*/
|
|
158
|
-
export const
|
|
159
|
-
|
|
272
|
+
export const fieldReach = (pad) => Math.max(0, Math.min(pad * SDF_EDGE, pad - QUAD_INSET) - 0.5);
|
|
273
|
+
/** The base size a display scale sets fields at, in device pixels: 16 at
|
|
274
|
+
* 1x, 32 at 2x — the size most map labels are drawn at or just under, so
|
|
275
|
+
* a field is mostly sampled down, where it is sharpest. */
|
|
276
|
+
export const fieldBase = (scale) => Math.round(16 * Math.min(2, Math.max(1, scale)));
|
|
277
|
+
/** A field's margin and spread at a base size: room for a halo of a
|
|
278
|
+
* quarter of the type's height. */
|
|
279
|
+
export const fieldPad = (base) => Math.ceil(base * 0.375);
|
|
160
280
|
/** Strings a frame measures however little budget it has left, so a frame
|
|
161
281
|
* that starts late still makes progress. One: on X11 a string's first
|
|
162
282
|
* measurement can cost milliseconds, and a floor of several put a pan
|
|
@@ -189,8 +309,11 @@ const KEEP_FRAMES = 120;
|
|
|
189
309
|
*/
|
|
190
310
|
export class LabelAtlas {
|
|
191
311
|
size;
|
|
192
|
-
/**
|
|
193
|
-
*
|
|
312
|
+
/** The device-pixel size every string and icon is set at: a label drawn
|
|
313
|
+
* at `size` scales its field by `size / base`. */
|
|
314
|
+
base;
|
|
315
|
+
/** The margin set around every field, in its texels, which is also the
|
|
316
|
+
* distance its values span — what a halo grows into. */
|
|
194
317
|
pad;
|
|
195
318
|
/** A frame's measuring ran out of budget: there is more to place. */
|
|
196
319
|
starved = false;
|
|
@@ -199,8 +322,15 @@ export class LabelAtlas {
|
|
|
199
322
|
_entries = new Map();
|
|
200
323
|
/** Entries the texture does not have where they are, oldest first. */
|
|
201
324
|
_uploads = [];
|
|
325
|
+
/** Drawable entries a compaction moved: all of them go up in the next
|
|
326
|
+
* frame, ahead of any cap, before it draws. */
|
|
327
|
+
_moved = [];
|
|
202
328
|
_wanted = new Map();
|
|
203
329
|
_failed = new Set();
|
|
330
|
+
/** Rasters read back and waiting for their fields, oldest first — asked
|
|
331
|
+
* for as much as anything in `_wanted`, so a frame never asks again. */
|
|
332
|
+
_fieldQueue = [];
|
|
333
|
+
_queued = new Set();
|
|
204
334
|
_measured = new Map();
|
|
205
335
|
_busy = false;
|
|
206
336
|
_shelves = [];
|
|
@@ -208,14 +338,16 @@ export class LabelAtlas {
|
|
|
208
338
|
_frame = 0;
|
|
209
339
|
_deadline = Infinity;
|
|
210
340
|
_measures = 0;
|
|
211
|
-
constructor(engine, options) {
|
|
341
|
+
constructor(engine, options = {}) {
|
|
212
342
|
this._engine = engine;
|
|
213
343
|
this.size = options.size ?? 2048;
|
|
214
|
-
this.
|
|
344
|
+
this.base = options.base ?? fieldBase(1);
|
|
345
|
+
this.pad = options.pad ?? fieldPad(this.base);
|
|
215
346
|
}
|
|
216
|
-
/** Strings asked for and not yet
|
|
347
|
+
/** Strings asked for and not yet set: waiting, being read back, or
|
|
348
|
+
* waiting for their fields. */
|
|
217
349
|
get pending() {
|
|
218
|
-
return this._busy || this._wanted.size > 0;
|
|
350
|
+
return this._busy || this._wanted.size > 0 || this._fieldQueue.length > 0;
|
|
219
351
|
}
|
|
220
352
|
/** Rasters waiting for the texture. */
|
|
221
353
|
get uploading() {
|
|
@@ -231,47 +363,68 @@ export class LabelAtlas {
|
|
|
231
363
|
this._measures = 0;
|
|
232
364
|
this.starved = false;
|
|
233
365
|
}
|
|
234
|
-
/** The box a string sets in
|
|
366
|
+
/** The box a string sets in at `size`, or null when this frame's budget
|
|
367
|
+
* is spent. Measured once, at the base size, and scaled — the same
|
|
368
|
+
* arithmetic that scales its field, so the box placement collides and
|
|
369
|
+
* the quad the frame draws are one size. */
|
|
235
370
|
measure(text, size) {
|
|
236
|
-
const key = keyOf(text
|
|
237
|
-
|
|
238
|
-
if (
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
371
|
+
const key = keyOf(text);
|
|
372
|
+
let box = this._measured.get(key);
|
|
373
|
+
if (!box) {
|
|
374
|
+
const engine = this._engine;
|
|
375
|
+
if (!engine)
|
|
376
|
+
return null;
|
|
377
|
+
if (this._measures >= MIN_MEASURES && now() > this._deadline) {
|
|
378
|
+
this.starved = true;
|
|
379
|
+
return null;
|
|
380
|
+
}
|
|
381
|
+
this._measures++;
|
|
382
|
+
box = engine.measure(text, this.base);
|
|
383
|
+
if (this._measured.size > 20000)
|
|
384
|
+
this._measured.clear();
|
|
385
|
+
this._measured.set(key, box);
|
|
246
386
|
}
|
|
247
|
-
this.
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
387
|
+
const k = size / this.base;
|
|
388
|
+
return { width: box.width * k, height: box.height * k };
|
|
389
|
+
}
|
|
390
|
+
/** The string's field, once the texture has it; null until then —
|
|
391
|
+
* asking is what gets it set. One field whatever size it is drawn at. */
|
|
392
|
+
entry(text) {
|
|
393
|
+
return this._lookup(keyOf(text), text, null, 'plate');
|
|
253
394
|
}
|
|
254
|
-
/**
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
395
|
+
/** One piece of an icon, as {@link entry} answers for a string. */
|
|
396
|
+
icon(name, part) {
|
|
397
|
+
return this._lookup(iconKey(name, part), '', name, part);
|
|
398
|
+
}
|
|
399
|
+
_lookup(key, text, icon, part) {
|
|
258
400
|
const entry = this._entries.get(key);
|
|
259
401
|
if (entry) {
|
|
260
402
|
entry.used = this._frame;
|
|
261
403
|
return entry.ready ? entry : null;
|
|
262
404
|
}
|
|
263
|
-
if (!this._failed.has(key) &&
|
|
264
|
-
this._wanted.
|
|
405
|
+
if (!this._failed.has(key) &&
|
|
406
|
+
!this._wanted.has(key) &&
|
|
407
|
+
!this._queued.has(key)) {
|
|
408
|
+
const size = this.base;
|
|
409
|
+
this._wanted.set(key, icon ? { text, size, icon: { name: icon, part } } : { text, size });
|
|
265
410
|
}
|
|
266
411
|
return null;
|
|
267
412
|
}
|
|
413
|
+
/** Whether an icon can never be drawn — the engine has no path to fill
|
|
414
|
+
* it with. A name set beside it is then set alone. */
|
|
415
|
+
iconFailed(name) {
|
|
416
|
+
return (this._failed.has(iconKey(name, 'plate')) ||
|
|
417
|
+
this._failed.has(iconKey(name, 'glyph')));
|
|
418
|
+
}
|
|
268
419
|
/** Start rasterizing what has been asked for, unless a batch is out. */
|
|
269
420
|
pump() {
|
|
270
421
|
const engine = this._engine;
|
|
271
422
|
if (!engine || this._busy || this._wanted.size === 0)
|
|
272
423
|
return;
|
|
424
|
+
const keys = [];
|
|
273
425
|
const batch = [];
|
|
274
|
-
for (const item of this._wanted
|
|
426
|
+
for (const [key, item] of this._wanted) {
|
|
427
|
+
keys.push(key);
|
|
275
428
|
batch.push(item);
|
|
276
429
|
if (batch.length >= BATCH)
|
|
277
430
|
break;
|
|
@@ -282,11 +435,23 @@ export class LabelAtlas {
|
|
|
282
435
|
rasters.forEach((raster, i) => {
|
|
283
436
|
if (raster === undefined)
|
|
284
437
|
return;
|
|
285
|
-
const key =
|
|
438
|
+
const key = keys[i];
|
|
286
439
|
this._wanted.delete(key);
|
|
287
|
-
|
|
440
|
+
// A string with no raster never will have one; a raster with no
|
|
441
|
+
// room is a fact about this moment, and the string is asked for
|
|
442
|
+
// again by the next frame that still shows it.
|
|
443
|
+
if (raster === null) {
|
|
288
444
|
this._failed.add(key);
|
|
445
|
+
}
|
|
446
|
+
else {
|
|
447
|
+
this._fieldQueue.push({ key, raster });
|
|
448
|
+
this._queued.add(key);
|
|
449
|
+
}
|
|
289
450
|
});
|
|
451
|
+
// The staging surface is free again as soon as the pixels are
|
|
452
|
+
// copied out, so the next batch is read back while this one waits
|
|
453
|
+
// for its fields; and a frame is asked for, to make them.
|
|
454
|
+
this.pump();
|
|
290
455
|
this.onChange?.();
|
|
291
456
|
}, () => {
|
|
292
457
|
// A readback that fails once fails every time (no surface, a
|
|
@@ -297,26 +462,108 @@ export class LabelAtlas {
|
|
|
297
462
|
this.onChange?.();
|
|
298
463
|
});
|
|
299
464
|
}
|
|
300
|
-
/**
|
|
301
|
-
* each `ready` once it
|
|
465
|
+
/** Rasters for the texture: every one a compaction moved, then up to
|
|
466
|
+
* `max` new ones, oldest first. The renderer marks each `ready` once it
|
|
467
|
+
* is uploaded — a moved one already is, because the frame that takes it
|
|
468
|
+
* draws after taking it. */
|
|
302
469
|
takeUploads(max) {
|
|
303
|
-
|
|
470
|
+
const moved = this._moved;
|
|
471
|
+
this._moved = [];
|
|
472
|
+
return moved.length > 0
|
|
473
|
+
? moved.concat(this._uploads.splice(0, max))
|
|
474
|
+
: this._uploads.splice(0, max);
|
|
304
475
|
}
|
|
305
476
|
/** The texture is new, and has none of it: everything goes up again. */
|
|
306
477
|
restart() {
|
|
307
478
|
for (const entry of this._entries.values())
|
|
308
479
|
entry.ready = false;
|
|
309
480
|
this._uploads = [...this._entries.values()];
|
|
481
|
+
this._moved = [];
|
|
310
482
|
}
|
|
311
483
|
dispose() {
|
|
312
484
|
this._engine?.dispose();
|
|
313
485
|
this._engine = null;
|
|
486
|
+
this._fieldQueue = [];
|
|
487
|
+
this._queued.clear();
|
|
488
|
+
}
|
|
489
|
+
/** Read back and waiting for their fields: another frame is worth
|
|
490
|
+
* drawing, to make them. */
|
|
491
|
+
get fielding() {
|
|
492
|
+
return this._fieldQueue.length > 0;
|
|
493
|
+
}
|
|
494
|
+
/**
|
|
495
|
+
* Make fields for what has been read back until `deadline` — at least
|
|
496
|
+
* one — in the frame, whose own draw then takes them into the texture.
|
|
497
|
+
*
|
|
498
|
+
* A field is about 0.2 ms. A batch of them made as it landed was 4-9 ms
|
|
499
|
+
* beside the frames, measured as event-loop stalls on a jump to a view
|
|
500
|
+
* whose every name was new; slices on timers of their own each waited
|
|
501
|
+
* behind a frame, and names arrived late. In the frame, on a budget,
|
|
502
|
+
* they are made at a known cost and drawn the frame after.
|
|
503
|
+
*/
|
|
504
|
+
/**
|
|
505
|
+
* Set what placement asked for, in the frame, until `deadline` (at least
|
|
506
|
+
* one): what was read back already, then every string the engine can set
|
|
507
|
+
* synchronously. What is set here is drawable in this frame — it goes
|
|
508
|
+
* into the texture ahead of any cap, before this frame draws (the
|
|
509
|
+
* `labelsWhileMoving` path, `view.ts`). Icons, and an engine with no
|
|
510
|
+
* synchronous path, still go through {@link pump}.
|
|
511
|
+
*/
|
|
512
|
+
setNow(deadline) {
|
|
513
|
+
const engine = this._engine;
|
|
514
|
+
if (!engine)
|
|
515
|
+
return;
|
|
516
|
+
let made = 0;
|
|
517
|
+
while (this._fieldQueue.length > 0 && (made === 0 || now() < deadline)) {
|
|
518
|
+
const { key, raster } = this._fieldQueue.shift();
|
|
519
|
+
this._queued.delete(key);
|
|
520
|
+
this._add(key, raster.width, raster.height, this._field(raster), true);
|
|
521
|
+
made++;
|
|
522
|
+
}
|
|
523
|
+
if (!engine.rasterizeNow)
|
|
524
|
+
return;
|
|
525
|
+
for (const [key, item] of this._wanted) {
|
|
526
|
+
if (made > 0 && now() >= deadline) {
|
|
527
|
+
this.starved = true;
|
|
528
|
+
break;
|
|
529
|
+
}
|
|
530
|
+
const raster = engine.rasterizeNow(item, this.pad);
|
|
531
|
+
if (raster === undefined)
|
|
532
|
+
continue;
|
|
533
|
+
this._wanted.delete(key);
|
|
534
|
+
if (raster === null) {
|
|
535
|
+
this._failed.add(key);
|
|
536
|
+
continue;
|
|
537
|
+
}
|
|
538
|
+
this._add(key, raster.width, raster.height, this._field(raster), true);
|
|
539
|
+
made++;
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
makeFields(deadline) {
|
|
543
|
+
if (!this._engine)
|
|
544
|
+
return;
|
|
545
|
+
let made = 0;
|
|
546
|
+
while (this._fieldQueue.length > 0 && (made === 0 || now() < deadline)) {
|
|
547
|
+
const { key, raster } = this._fieldQueue.shift();
|
|
548
|
+
this._queued.delete(key);
|
|
549
|
+
this._add(key, raster.width, raster.height, this._field(raster));
|
|
550
|
+
made++;
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
/** A raster's coverage as its distance field. The coverage is the
|
|
554
|
+
* readback's alpha; the field spans `pad` texels either side of the
|
|
555
|
+
* edge, which is the margin the engine set it with. */
|
|
556
|
+
_field(raster) {
|
|
557
|
+
const stride = raster.stride ?? 4;
|
|
558
|
+
return distanceField(raster.pixels, raster.width, raster.height, this.pad, stride, stride === 4 ? 3 : 0);
|
|
314
559
|
}
|
|
315
|
-
_add(key,
|
|
316
|
-
|
|
317
|
-
|
|
560
|
+
_add(key, width, height, pixels,
|
|
561
|
+
/** Drawable in this frame: uploaded ahead of any cap before it draws. */
|
|
562
|
+
immediate = false) {
|
|
563
|
+
let place = this._allocate(width, height) ?? this._reuseShelf(width, height);
|
|
564
|
+
if (!place && this._compactable()) {
|
|
318
565
|
this._compact();
|
|
319
|
-
place = this._allocate(
|
|
566
|
+
place = this._allocate(width, height);
|
|
320
567
|
}
|
|
321
568
|
if (!place)
|
|
322
569
|
return false;
|
|
@@ -324,14 +571,17 @@ export class LabelAtlas {
|
|
|
324
571
|
key,
|
|
325
572
|
x: place.x,
|
|
326
573
|
y: place.y,
|
|
327
|
-
width
|
|
328
|
-
height
|
|
329
|
-
pixels
|
|
330
|
-
ready:
|
|
574
|
+
width,
|
|
575
|
+
height,
|
|
576
|
+
pixels,
|
|
577
|
+
ready: immediate,
|
|
331
578
|
used: this._frame,
|
|
332
579
|
};
|
|
333
580
|
this._entries.set(key, entry);
|
|
334
|
-
|
|
581
|
+
if (immediate)
|
|
582
|
+
this._moved.push(entry);
|
|
583
|
+
else
|
|
584
|
+
this._uploads.push(entry);
|
|
335
585
|
return true;
|
|
336
586
|
}
|
|
337
587
|
/** A shelf packer: rows of one height class (rounded up to 8 pixels),
|
|
@@ -354,9 +604,72 @@ export class LabelAtlas {
|
|
|
354
604
|
this._top += height;
|
|
355
605
|
return { x: 0, y: shelf.y };
|
|
356
606
|
}
|
|
607
|
+
/**
|
|
608
|
+
* Room made in place: the shelf of this height whose rasters were drawn
|
|
609
|
+
* longest ago, emptied and filled again from its left.
|
|
610
|
+
*
|
|
611
|
+
* **Nothing that stays moves.** A compaction moves every raster it keeps,
|
|
612
|
+
* and a moved raster is not drawn until it is in the texture again — at
|
|
613
|
+
* {@link takeUploads}' pace, so every label on screen went out together
|
|
614
|
+
* and came back over the next few frames, at full opacity. A full atlas
|
|
615
|
+
* is the ordinary state of a session (a thousand strings at 1x, a quarter
|
|
616
|
+
* of that at 2x), so that was a flash of the whole label layer at the end
|
|
617
|
+
* of most settles. A shelf any label of the last two frames stands on is not
|
|
618
|
+
* taken: what is dropped is off screen, and asked for again if it
|
|
619
|
+
* returns.
|
|
620
|
+
*/
|
|
621
|
+
_reuseShelf(w, h) {
|
|
622
|
+
if (w > this.size)
|
|
623
|
+
return null;
|
|
624
|
+
const height = Math.ceil(h / 8) * 8;
|
|
625
|
+
const newest = new Map();
|
|
626
|
+
for (const entry of this._entries.values()) {
|
|
627
|
+
const seen = newest.get(entry.y);
|
|
628
|
+
if (seen === undefined || entry.used > seen)
|
|
629
|
+
newest.set(entry.y, entry.used);
|
|
630
|
+
}
|
|
631
|
+
let shelf = null;
|
|
632
|
+
// Not a shelf any label of this frame or the last stands on: fields can
|
|
633
|
+
// be made before a frame's labels are batched (`setNow`), when a label
|
|
634
|
+
// still fading out has not been asked for yet.
|
|
635
|
+
let oldest = this._frame - 1;
|
|
636
|
+
for (const candidate of this._shelves) {
|
|
637
|
+
if (candidate.height !== height)
|
|
638
|
+
continue;
|
|
639
|
+
const used = newest.get(candidate.y) ?? -Infinity;
|
|
640
|
+
if (used < oldest) {
|
|
641
|
+
oldest = used;
|
|
642
|
+
shelf = candidate;
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
if (!shelf)
|
|
646
|
+
return null;
|
|
647
|
+
const y = shelf.y;
|
|
648
|
+
for (const [key, entry] of this._entries) {
|
|
649
|
+
if (entry.y === y)
|
|
650
|
+
this._entries.delete(key);
|
|
651
|
+
}
|
|
652
|
+
this._uploads = this._uploads.filter((entry) => entry.y !== y);
|
|
653
|
+
this._moved = this._moved.filter((entry) => entry.y !== y);
|
|
654
|
+
shelf.x = w;
|
|
655
|
+
return { x: 0, y };
|
|
656
|
+
}
|
|
657
|
+
/** Whether a compaction would free anything: something kept past its
|
|
658
|
+
* last use. One that keeps everything only moves it — every label on
|
|
659
|
+
* screen out of the texture for the frames its upload takes, for no
|
|
660
|
+
* room at all. */
|
|
661
|
+
_compactable() {
|
|
662
|
+
for (const entry of this._entries.values()) {
|
|
663
|
+
if (entry.used < this._frame - KEEP_FRAMES)
|
|
664
|
+
return true;
|
|
665
|
+
}
|
|
666
|
+
return false;
|
|
667
|
+
}
|
|
357
668
|
/** Drop what has not been drawn for a while and pack the rest again,
|
|
358
|
-
* tallest first
|
|
359
|
-
*
|
|
669
|
+
* tallest first — the last resort, when no shelf of the height wanted
|
|
670
|
+
* can be taken in place. What was drawable stays drawable: it is
|
|
671
|
+
* uploaded where it now is, all of it, by the next frame before that
|
|
672
|
+
* frame draws ({@link takeUploads}); what was waiting still waits. */
|
|
360
673
|
_compact() {
|
|
361
674
|
const keep = [...this._entries.values()]
|
|
362
675
|
.filter((e) => e.used >= this._frame - KEEP_FRAMES)
|
|
@@ -365,15 +678,18 @@ export class LabelAtlas {
|
|
|
365
678
|
this._shelves = [];
|
|
366
679
|
this._top = 0;
|
|
367
680
|
this._uploads = [];
|
|
681
|
+
this._moved = [];
|
|
368
682
|
for (const entry of keep) {
|
|
369
683
|
const place = this._allocate(entry.width, entry.height);
|
|
370
684
|
if (!place)
|
|
371
685
|
continue;
|
|
372
686
|
entry.x = place.x;
|
|
373
687
|
entry.y = place.y;
|
|
374
|
-
entry.ready = false;
|
|
375
688
|
this._entries.set(entry.key, entry);
|
|
376
|
-
|
|
689
|
+
if (entry.ready)
|
|
690
|
+
this._moved.push(entry);
|
|
691
|
+
else
|
|
692
|
+
this._uploads.push(entry);
|
|
377
693
|
}
|
|
378
694
|
}
|
|
379
695
|
}
|