@react-x11/components 0.8.0 → 0.10.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 +105 -38
- package/dist/charts/node.d.ts +12 -2
- package/dist/charts/node.d.ts.map +1 -1
- package/dist/charts/node.js +50 -16
- 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 +3 -1
- 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/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/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 +13 -2
- package/dist/codeblock/index.d.ts.map +1 -1
- package/dist/codeblock/index.js +20 -3
- package/dist/codeblock/index.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/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 +240 -6
- package/dist/html/css/cascade.d.ts.map +1 -1
- package/dist/html/css/cascade.js +1327 -66
- 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 +498 -15
- package/dist/html/css/style.d.ts.map +1 -1
- package/dist/html/css/style.js +3698 -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 +57 -11
- 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 +2937 -197
- package/dist/html/layout/block.js.map +1 -1
- package/dist/html/layout/boxes.d.ts +340 -17
- package/dist/html/layout/boxes.d.ts.map +1 -1
- package/dist/html/layout/boxes.js +1714 -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 +151 -1
- package/dist/html/layout/inline.d.ts.map +1 -1
- package/dist/html/layout/inline.js +3375 -174
- 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 +172 -5
- package/dist/html/node.d.ts.map +1 -1
- package/dist/html/node.js +1336 -103
- 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 +3503 -141
- 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 +435 -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 +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- 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/{markdown → internal/markdown}/ast.d.ts +23 -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 +221 -30
- 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/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/scroll.d.ts +3 -2
- package/dist/internal/scroll.d.ts.map +1 -1
- package/dist/internal/scroll.js +1 -0
- package/dist/internal/scroll.js.map +1 -1
- 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 +103 -0
- package/dist/maps/anchors.d.ts.map +1 -0
- package/dist/maps/anchors.js +790 -0
- package/dist/maps/anchors.js.map +1 -0
- package/dist/maps/controller.d.ts +340 -0
- package/dist/maps/controller.d.ts.map +1 -0
- package/dist/maps/controller.js +822 -0
- package/dist/maps/controller.js.map +1 -0
- package/dist/maps/gl/buckets.d.ts +99 -0
- package/dist/maps/gl/buckets.d.ts.map +1 -0
- package/dist/maps/gl/buckets.js +365 -0
- package/dist/maps/gl/buckets.js.map +1 -0
- package/dist/maps/gl/build-worker.d.ts +15 -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 +70 -0
- package/dist/maps/gl/cover.d.ts.map +1 -0
- package/dist/maps/gl/cover.js +137 -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 +124 -0
- package/dist/maps/gl/placement.d.ts.map +1 -0
- package/dist/maps/gl/placement.js +642 -0
- package/dist/maps/gl/placement.js.map +1 -0
- package/dist/maps/gl/renderer.d.ts +384 -0
- package/dist/maps/gl/renderer.d.ts.map +1 -0
- package/dist/maps/gl/renderer.js +1184 -0
- package/dist/maps/gl/renderer.js.map +1 -0
- package/dist/maps/gl/shaders.d.ts +121 -0
- package/dist/maps/gl/shaders.d.ts.map +1 -0
- package/dist/maps/gl/shaders.js +453 -0
- package/dist/maps/gl/shaders.js.map +1 -0
- package/dist/maps/gl/store.d.ts +125 -0
- package/dist/maps/gl/store.d.ts.map +1 -0
- package/dist/maps/gl/store.js +512 -0
- package/dist/maps/gl/store.js.map +1 -0
- package/dist/maps/gl/text.d.ts +283 -0
- package/dist/maps/gl/text.d.ts.map +1 -0
- package/dist/maps/gl/text.js +698 -0
- package/dist/maps/gl/text.js.map +1 -0
- package/dist/maps/gl/view.d.ts +345 -0
- package/dist/maps/gl/view.d.ts.map +1 -0
- package/dist/maps/gl/view.js +1209 -0
- package/dist/maps/gl/view.js.map +1 -0
- 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 +3 -1
- package/dist/maps/index.d.ts.map +1 -1
- package/dist/maps/index.js +218 -52
- package/dist/maps/index.js.map +1 -1
- package/dist/maps/labels.d.ts +91 -18
- package/dist/maps/labels.d.ts.map +1 -1
- package/dist/maps/labels.js +376 -140
- package/dist/maps/labels.js.map +1 -1
- package/dist/maps/node.d.ts +179 -56
- package/dist/maps/node.d.ts.map +1 -1
- package/dist/maps/node.js +663 -537
- 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 +62 -0
- package/dist/maps/proj.d.ts.map +1 -1
- package/dist/maps/proj.js +101 -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 +30 -6
- package/dist/maps/sources.d.ts.map +1 -1
- package/dist/maps/sources.js +22 -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/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 +147 -27
- package/dist/maps/tiles.d.ts.map +1 -1
- package/dist/maps/tiles.js +221 -54
- package/dist/maps/tiles.js.map +1 -1
- package/dist/maps/types.d.ts +213 -21
- 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 +121 -50
- 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/markdown/spans.js +6 -0
- package/dist/markdown/spans.js.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/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/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 +252 -0
- package/dist/rich-text-editor/index.d.ts.map +1 -0
- package/dist/rich-text-editor/index.js +856 -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 +394 -0
- package/dist/rich-text-editor/keymap.js.map +1 -0
- package/dist/rich-text-editor/keys.d.ts +40 -0
- package/dist/rich-text-editor/keys.d.ts.map +1 -0
- package/dist/rich-text-editor/keys.js +202 -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/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/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 +518 -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 +279 -0
- package/dist/rich-text-editor/virtual.js.map +1 -0
- package/dist/richtext/node.d.ts +71 -4
- package/dist/richtext/node.d.ts.map +1 -1
- package/dist/richtext/node.js +233 -28
- 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/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 +32 -11
- 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 +6 -1
- package/dist/terminal-output/index.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 +59 -31
- package/src/charts/node.ts +68 -28
- package/src/charts/render.ts +120 -30
- package/src/code/index.ts +3 -1
- 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/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/stream.ts +257 -17
- package/src/code-language/types.ts +5 -4
- package/src/codeblock/index.ts +20 -3
- package/src/embed/client.ts +102 -8
- package/src/embed/index.ts +2 -0
- 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 +1403 -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 +4102 -222
- package/src/html/css/ua.ts +58 -12
- 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 +3456 -230
- package/src/html/layout/boxes.ts +2100 -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 +3943 -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 +1486 -121
- package/src/html/paint.ts +4293 -169
- package/src/html/resources.ts +161 -50
- package/src/html/surfaces.ts +81 -0
- package/src/html/svg.ts +493 -0
- package/src/html/url.ts +86 -0
- package/src/index.ts +4 -0
- package/src/internal/collate.ts +12 -0
- package/src/{markdown → internal/markdown}/ast.ts +35 -7
- package/src/{markdown → internal/markdown}/parse.ts +288 -35
- package/src/internal/markdown/stringify.ts +772 -0
- package/src/internal/prewarm.ts +45 -0
- package/src/internal/scroll.ts +5 -3
- 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 +913 -0
- package/src/maps/controller.ts +1084 -0
- package/src/maps/gl/buckets.ts +461 -0
- package/src/maps/gl/build-worker.ts +66 -0
- package/src/maps/gl/color.ts +62 -0
- package/src/maps/gl/cover.ts +205 -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 +968 -0
- package/src/maps/gl/renderer.ts +1660 -0
- package/src/maps/gl/shaders.ts +489 -0
- package/src/maps/gl/store.ts +615 -0
- package/src/maps/gl/text.ts +868 -0
- package/src/maps/gl/view.ts +1489 -0
- package/src/maps/icons.ts +183 -0
- package/src/maps/index.ts +274 -81
- package/src/maps/labels.ts +457 -144
- package/src/maps/node.ts +832 -665
- package/src/maps/overlay.ts +148 -43
- package/src/maps/paint.ts +3 -0
- package/src/maps/proj.ts +118 -0
- package/src/maps/renderer.ts +155 -0
- package/src/maps/sources.ts +43 -6
- package/src/maps/style.ts +32 -0
- package/src/maps/styles.ts +215 -4
- package/src/maps/theme.ts +51 -0
- package/src/maps/tiles.ts +253 -62
- package/src/maps/types.ts +213 -21
- package/src/markdown/expressions.ts +5 -1
- package/src/markdown/index.ts +163 -78
- package/src/markdown/spans.ts +6 -1
- package/src/media-player/index.ts +18 -4
- 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/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 +1364 -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 +228 -0
- package/src/rich-text-editor/look.ts +427 -0
- package/src/rich-text-editor/markdown.ts +653 -0
- package/src/rich-text-editor/marks.ts +101 -0
- package/src/rich-text-editor/nodes.ts +497 -0
- package/src/rich-text-editor/render.ts +837 -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 +372 -0
- package/src/richtext/node.ts +294 -44
- package/src/richtext/runs.ts +23 -12
- package/src/table/index.ts +29 -0
- package/src/table/rows.ts +18 -8
- package/src/terminal/backends.ts +4 -1
- package/src/terminal/index.ts +47 -15
- package/src/terminal/vt/pty.ts +16 -2
- package/src/terminal-output/index.ts +6 -1
- package/src/three/canvas.ts +102 -8
- package/src/three/events.ts +49 -9
- package/src/tree/index.ts +19 -0
- 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
package/dist/maps/labels.js
CHANGED
|
@@ -1,117 +1,204 @@
|
|
|
1
|
-
|
|
1
|
+
// Labels: collected from the symbol layers, placed against each other, and
|
|
2
|
+
// drawn into the frame.
|
|
3
|
+
//
|
|
4
|
+
// Not into the tile surfaces, and the three reasons are each a visible bug
|
|
5
|
+
// if it is done the other way. **Collision is global**: two labels in
|
|
6
|
+
// different tiles overlap exactly as readily as two in one, so a per-tile
|
|
7
|
+
// placement produces clutter at every seam. **Text must not be scaled**: a
|
|
8
|
+
// tile surface is composited at up to 2× during a fractional zoom, and text
|
|
9
|
+
// is the one thing on a map nobody accepts blurred. And a tile's labels
|
|
10
|
+
// would be **clipped at its edge**, which is where half of them sit.
|
|
11
|
+
//
|
|
12
|
+
// **Where a label can go is the GL renderer's answer too**: both renderers
|
|
13
|
+
// take their anchors from `./anchors.ts` — a place name at its point, a
|
|
14
|
+
// street's name on a straight stretch of the street, its pieces merged
|
|
15
|
+
// first — so a map switched from one renderer to the other names the same
|
|
16
|
+
// streets in the same places, at the same angles.
|
|
17
|
+
//
|
|
18
|
+
// The placement itself is done in **world pixels** rather than screen
|
|
19
|
+
// pixels, and that is the load-bearing decision in this file. A placement
|
|
20
|
+
// computed against the viewport changes whenever the viewport does, so a
|
|
21
|
+
// pan would have to repaint the whole pane rather than blit it — and a
|
|
22
|
+
// label that was suppressed by a neighbour would pop in as that neighbour
|
|
23
|
+
// scrolled away. Placed in world pixels, whether a label wins depends only
|
|
24
|
+
// on the labels near it and the zoom, so a pan is a translation of a
|
|
25
|
+
// placement that is already correct, and the blit stands.
|
|
26
|
+
import { LABEL_STRIDE, LEVEL_SNAP, LINE_MARGIN, LabelField, STRAIGHT_FRACTION, buildTileLabels, estimateWidth, } from './anchors.js';
|
|
27
|
+
import { DEFAULT_ICON_COLOR, DEFAULT_ICON_GLYPH_COLOR, DEFAULT_ICON_SIZE, ICON_GAP, isMapIcon, traceGlyph, tracePlate, } from './icons.js';
|
|
2
28
|
import { resolveZoomed } from './style.js';
|
|
3
29
|
import { tileCountAt, tileKey } from './proj.js';
|
|
4
30
|
function num(value, zoom, fallback) {
|
|
5
31
|
return value === undefined ? fallback : resolveZoomed(value, zoom);
|
|
6
32
|
}
|
|
33
|
+
/** The tile units anchors are worked out in: the GL buckets', so the two
|
|
34
|
+
* renderers' anchors are the same numbers. */
|
|
35
|
+
const EXTENT = 4096;
|
|
7
36
|
/**
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
37
|
+
* Anchors, per tile and style. They depend on neither the zoom nor the
|
|
38
|
+
* camera, and merging a tile's street pieces is the one costly step, so a
|
|
39
|
+
* zoom that collects a tile's candidates again does not work them out
|
|
40
|
+
* again.
|
|
41
|
+
*/
|
|
42
|
+
const anchorCache = new WeakMap();
|
|
43
|
+
function anchorsOf(tile, prepared, id) {
|
|
44
|
+
const hit = anchorCache.get(tile);
|
|
45
|
+
if (hit && hit.prepared === prepared)
|
|
46
|
+
return hit.data;
|
|
47
|
+
const data = buildTileLabels(tile, prepared, EXTENT, id);
|
|
48
|
+
anchorCache.set(tile, { prepared, data });
|
|
49
|
+
return data;
|
|
50
|
+
}
|
|
51
|
+
function paintAt(layer, zoom) {
|
|
52
|
+
if (!layer || layer.type !== 'symbol' || layer.visible === false) {
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
if (layer.minZoom !== undefined && zoom < layer.minZoom)
|
|
56
|
+
return null;
|
|
57
|
+
if (layer.maxZoom !== undefined && zoom >= layer.maxZoom)
|
|
58
|
+
return null;
|
|
59
|
+
const symbol = layer;
|
|
60
|
+
return {
|
|
61
|
+
id: layer.id,
|
|
62
|
+
size: num(symbol.textSize, zoom, 12),
|
|
63
|
+
color: symbol.textColor ? resolveZoomed(symbol.textColor, zoom) : '#000000',
|
|
64
|
+
halo: symbol.textHaloColor
|
|
65
|
+
? resolveZoomed(symbol.textHaloColor, zoom)
|
|
66
|
+
: undefined,
|
|
67
|
+
haloWidth: num(symbol.textHaloWidth, zoom, 1),
|
|
68
|
+
rank: symbol.rank ?? 0,
|
|
69
|
+
repeat: symbol.repeatDistance ?? 250,
|
|
70
|
+
icon: isMapIcon(symbol.icon)
|
|
71
|
+
? {
|
|
72
|
+
name: symbol.icon,
|
|
73
|
+
size: num(symbol.iconSize, zoom, DEFAULT_ICON_SIZE),
|
|
74
|
+
color: symbol.iconColor
|
|
75
|
+
? resolveZoomed(symbol.iconColor, zoom)
|
|
76
|
+
: DEFAULT_ICON_COLOR,
|
|
77
|
+
glyph: symbol.iconGlyphColor
|
|
78
|
+
? resolveZoomed(symbol.iconGlyphColor, zoom)
|
|
79
|
+
: DEFAULT_ICON_GLYPH_COLOR,
|
|
80
|
+
}
|
|
81
|
+
: null,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* The label candidates one tile contributes: its anchors (`./anchors.ts`),
|
|
86
|
+
* with this zoom's size and colours. A point label anchors at its point,
|
|
87
|
+
* an area's at the middle of its largest ring, and a street's name at the
|
|
88
|
+
* middle of a straight stretch of the street — or of a block of it —
|
|
89
|
+
* turned to lie along it.
|
|
16
90
|
*/
|
|
17
|
-
export function collectLabels(tile, id, prepared, zoom
|
|
91
|
+
export function collectLabels(tile, id, prepared, zoom) {
|
|
18
92
|
const out = [];
|
|
93
|
+
const data = anchorsOf(tile, prepared, id);
|
|
19
94
|
const n = tileCountAt(id.z);
|
|
20
95
|
const key = tileKey(id);
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
const symbol = layer;
|
|
33
|
-
const size = num(symbol.textSize, zoom, 12);
|
|
34
|
-
const color = symbol.textColor
|
|
35
|
-
? resolveZoomed(symbol.textColor, zoom)
|
|
36
|
-
: '#000000';
|
|
37
|
-
const halo = symbol.textHaloColor
|
|
38
|
-
? resolveZoomed(symbol.textHaloColor, zoom)
|
|
39
|
-
: undefined;
|
|
40
|
-
const haloWidth = num(symbol.textHaloWidth, zoom, 1);
|
|
41
|
-
const rank = symbol.rank ?? 0;
|
|
42
|
-
const repeat = symbol.repeatDistance ?? 250;
|
|
43
|
-
const extent = source.extent;
|
|
44
|
-
const cursor = source.feature(0);
|
|
45
|
-
for (let f = 0; f < source.length; f++) {
|
|
46
|
-
source.seek(f, cursor);
|
|
47
|
-
if (!filter(cursor))
|
|
48
|
-
continue;
|
|
49
|
-
const raw = cursor.get(symbol.textField);
|
|
50
|
-
// The schema's fallback: a translated name field is absent for most
|
|
51
|
-
// features, and the local `name` is what a map without a translation
|
|
52
|
-
// shows rather than nothing.
|
|
53
|
-
const text = typeof raw === 'string' && raw.length > 0
|
|
54
|
-
? raw
|
|
55
|
-
: symbol.textField !== 'name'
|
|
56
|
-
? typeof cursor.get('name') === 'string'
|
|
57
|
-
? String(cursor.get('name'))
|
|
58
|
-
: ''
|
|
59
|
-
: '';
|
|
60
|
-
if (text.length === 0)
|
|
61
|
-
continue;
|
|
62
|
-
cursor.readGeometry(buffer);
|
|
63
|
-
const anchor = anchorOf(buffer, cursor.type);
|
|
64
|
-
if (!anchor)
|
|
65
|
-
continue;
|
|
66
|
-
out.push({
|
|
67
|
-
id: `${key}:${layer.id}:${f}`,
|
|
68
|
-
key: `${layer.id}|${text}`,
|
|
69
|
-
text,
|
|
70
|
-
// Tile-local to normalized mercator, the same arithmetic the
|
|
71
|
-
// rasterizer's transform does and for the same precision reason.
|
|
72
|
-
mx: (id.x + anchor.x / extent) / n,
|
|
73
|
-
my: (id.y + anchor.y / extent) / n,
|
|
74
|
-
rank,
|
|
75
|
-
size,
|
|
76
|
-
color,
|
|
77
|
-
halo,
|
|
78
|
-
haloWidth,
|
|
79
|
-
repeat,
|
|
80
|
-
});
|
|
96
|
+
// Tile units to normalized mercator.
|
|
97
|
+
const unit = 1 / (EXTENT * n);
|
|
98
|
+
const paints = new Map();
|
|
99
|
+
const a = data.anchors;
|
|
100
|
+
for (let r = 0; r < data.count; r++) {
|
|
101
|
+
const at = r * LABEL_STRIDE;
|
|
102
|
+
const index = a[at + LabelField.layer];
|
|
103
|
+
let paint = paints.get(index);
|
|
104
|
+
if (paint === undefined) {
|
|
105
|
+
paint = paintAt(prepared.layers[index]?.layer, zoom);
|
|
106
|
+
paints.set(index, paint);
|
|
81
107
|
}
|
|
108
|
+
if (!paint)
|
|
109
|
+
continue;
|
|
110
|
+
const text = data.texts[a[at + LabelField.text]];
|
|
111
|
+
const point = a[at + LabelField.avail] < 0;
|
|
112
|
+
out.push({
|
|
113
|
+
id: `${key}:${paint.id}:${r}`,
|
|
114
|
+
key: `${paint.id}|${text}`,
|
|
115
|
+
text,
|
|
116
|
+
// Tile-local to normalized mercator, the same arithmetic the
|
|
117
|
+
// rasterizer's transform does and for the same precision reason.
|
|
118
|
+
mx: (id.x + a[at + LabelField.x] / EXTENT) / n,
|
|
119
|
+
my: (id.y + a[at + LabelField.y] / EXTENT) / n,
|
|
120
|
+
angle: point ? 0 : a[at + LabelField.angle],
|
|
121
|
+
avail: point ? Infinity : a[at + LabelField.avail] * unit,
|
|
122
|
+
clear: point ? Infinity : a[at + LabelField.clear] * unit,
|
|
123
|
+
length: a[at + LabelField.length] * unit,
|
|
124
|
+
dev: a[at + LabelField.dev] * unit,
|
|
125
|
+
rank: paint.rank,
|
|
126
|
+
priority: a[at + LabelField.priority],
|
|
127
|
+
size: paint.size,
|
|
128
|
+
color: paint.color,
|
|
129
|
+
halo: paint.halo,
|
|
130
|
+
haloWidth: paint.haloWidth,
|
|
131
|
+
repeat: paint.repeat,
|
|
132
|
+
icon: point ? paint.icon : null,
|
|
133
|
+
});
|
|
82
134
|
}
|
|
83
135
|
return out;
|
|
84
136
|
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
137
|
+
/**
|
|
138
|
+
* A cache bounded in **two generations** rather than by clearing: what was
|
|
139
|
+
* stored since the last turn is the young one, a lookup that finds an entry
|
|
140
|
+
* in the old one brings it back, and a full young generation becomes the
|
|
141
|
+
* old one as the old one is dropped. So what is in use survives the turn,
|
|
142
|
+
* and the bound is twice a generation.
|
|
143
|
+
*/
|
|
144
|
+
class Generations {
|
|
145
|
+
_size;
|
|
146
|
+
_young = new Map();
|
|
147
|
+
_old = new Map();
|
|
148
|
+
constructor(_size) {
|
|
149
|
+
this._size = _size;
|
|
150
|
+
}
|
|
151
|
+
get(key) {
|
|
152
|
+
const hit = this._young.get(key);
|
|
153
|
+
if (hit !== undefined)
|
|
154
|
+
return hit;
|
|
155
|
+
const kept = this._old.get(key);
|
|
156
|
+
if (kept !== undefined)
|
|
157
|
+
this.set(key, kept);
|
|
158
|
+
return kept;
|
|
90
159
|
}
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
for (let part = 0; part < buffer.parts; part++) {
|
|
96
|
-
const at = part * 4;
|
|
97
|
-
const span = buffer.partBounds[at + 2] -
|
|
98
|
-
buffer.partBounds[at] +
|
|
99
|
-
(buffer.partBounds[at + 3] - buffer.partBounds[at + 1]);
|
|
100
|
-
if (span > bestSpan) {
|
|
101
|
-
bestSpan = span;
|
|
102
|
-
best = part;
|
|
160
|
+
set(key, value) {
|
|
161
|
+
if (this._young.size >= this._size) {
|
|
162
|
+
this._old = this._young;
|
|
163
|
+
this._young = new Map();
|
|
103
164
|
}
|
|
165
|
+
this._young.set(key, value);
|
|
166
|
+
}
|
|
167
|
+
clear() {
|
|
168
|
+
this._young = new Map();
|
|
169
|
+
this._old = new Map();
|
|
104
170
|
}
|
|
105
|
-
const from = buffer.starts[best];
|
|
106
|
-
const to = buffer.starts[best + 1];
|
|
107
|
-
if (to <= from)
|
|
108
|
-
return null;
|
|
109
|
-
const mid = from + ((to - from) >> 1);
|
|
110
|
-
return { x: buffer.coords[mid * 2], y: buffer.coords[mid * 2 + 1] };
|
|
111
171
|
}
|
|
112
|
-
/**
|
|
172
|
+
/** Shaped strings a generation holds. Each is a layout the text engine
|
|
173
|
+
* keeps — a native one under CoreText — so this is the bound that
|
|
174
|
+
* matters, and it is the one the cache always had. */
|
|
175
|
+
const SHAPED_GENERATION = 2000;
|
|
176
|
+
/** Measurements a generation holds: two numbers each, so many more of
|
|
177
|
+
* them, enough for every label of a zoom across the levels. */
|
|
178
|
+
const MEASURED_GENERATION = 8000;
|
|
179
|
+
/**
|
|
180
|
+
* Cache of shaped strings, owned by the element — and of what they
|
|
181
|
+
* measure, which is kept apart and far longer.
|
|
182
|
+
*
|
|
183
|
+
* Placement asks the size of every candidate on the map, most of which
|
|
184
|
+
* are never drawn, and it asks again at every step of a zoom; drawing
|
|
185
|
+
* needs the layouts of the few hundred that won their place. With one
|
|
186
|
+
* cache for both, bounded by clearing it, a wheel zoom through six levels —
|
|
187
|
+
* some 8,000 strings, every label of every level at its own size and in
|
|
188
|
+
* its halo's colour — crossed the bound every few hundred milliseconds and
|
|
189
|
+
* threw away what the next placement needed: 43,000 strings shaped in four
|
|
190
|
+
* seconds, the worst frames of the zoom spent on text it had shaped
|
|
191
|
+
* already. Measurements now outlive the layouts they were read from, and
|
|
192
|
+
* both caches turn over in generations (`Generations`).
|
|
193
|
+
*/
|
|
113
194
|
export class LabelShaper {
|
|
114
|
-
|
|
195
|
+
_shaped = new Generations(SHAPED_GENERATION);
|
|
196
|
+
_measured = new Generations(MEASURED_GENERATION);
|
|
197
|
+
/** What each placed label was drawn with, text and halo: kept with the
|
|
198
|
+
* placement, so a pan's frames, which draw one placement over and over,
|
|
199
|
+
* look nothing up. */
|
|
200
|
+
_drawn = new WeakMap();
|
|
201
|
+
_haloed = new WeakMap();
|
|
115
202
|
_fonts;
|
|
116
203
|
_family;
|
|
117
204
|
/** Device pixels per logical pixel. Text is shaped at the device size the
|
|
@@ -134,7 +221,44 @@ export class LabelShaper {
|
|
|
134
221
|
this._fonts = fonts;
|
|
135
222
|
this._family = family;
|
|
136
223
|
this._scale = scale;
|
|
137
|
-
this.
|
|
224
|
+
this._shaped.clear();
|
|
225
|
+
this._measured.clear();
|
|
226
|
+
this._drawn = new WeakMap();
|
|
227
|
+
this._haloed = new WeakMap();
|
|
228
|
+
}
|
|
229
|
+
/** The layout a placed label's text is drawn with — or, with `halo`, its
|
|
230
|
+
* halo's — or null on a backend with no font manager. */
|
|
231
|
+
drawn(label, halo = false) {
|
|
232
|
+
const kept = halo ? this._haloed : this._drawn;
|
|
233
|
+
const hit = kept.get(label);
|
|
234
|
+
if (hit)
|
|
235
|
+
return hit;
|
|
236
|
+
const color = halo ? label.halo : label.color;
|
|
237
|
+
if (color === undefined)
|
|
238
|
+
return null;
|
|
239
|
+
const shaped = this.shape(label.text, label.size, color);
|
|
240
|
+
if (shaped)
|
|
241
|
+
kept.set(label, shaped);
|
|
242
|
+
return shaped;
|
|
243
|
+
}
|
|
244
|
+
/** What one label measures, logical pixels, or null on a backend with no
|
|
245
|
+
* font manager — shaped only when it has never been measured. A string
|
|
246
|
+
* measures the same in any colour, so a name and its halo share it.
|
|
247
|
+
*
|
|
248
|
+
* The layout it was measured from is not kept: most candidates never
|
|
249
|
+
* win a place, and theirs would push the layouts of the ones that did
|
|
250
|
+
* out of the cache drawing reads from. */
|
|
251
|
+
measure(text, size, color) {
|
|
252
|
+
const key = `${this._family}|${size}|${text}`;
|
|
253
|
+
const hit = this._measured.get(key);
|
|
254
|
+
if (hit)
|
|
255
|
+
return hit;
|
|
256
|
+
const shaped = this._shapeNow(text, size, color);
|
|
257
|
+
if (!shaped)
|
|
258
|
+
return null;
|
|
259
|
+
const metrics = { width: shaped.width, height: shaped.height };
|
|
260
|
+
this._measured.set(key, metrics);
|
|
261
|
+
return metrics;
|
|
138
262
|
}
|
|
139
263
|
/** Shape one label, or null on a backend with no font manager. Widths
|
|
140
264
|
* come back in **logical** pixels, which is what placement is in. */
|
|
@@ -143,15 +267,18 @@ export class LabelShaper {
|
|
|
143
267
|
if (!fonts)
|
|
144
268
|
return null;
|
|
145
269
|
const key = `${this._family}|${size}|${color}|${text}`;
|
|
146
|
-
const hit = this.
|
|
270
|
+
const hit = this._shaped.get(key);
|
|
147
271
|
if (hit)
|
|
148
272
|
return hit;
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
273
|
+
const shaped = this._shapeNow(text, size, color);
|
|
274
|
+
if (shaped)
|
|
275
|
+
this._shaped.set(key, shaped);
|
|
276
|
+
return shaped;
|
|
277
|
+
}
|
|
278
|
+
_shapeNow(text, size, color) {
|
|
279
|
+
const fonts = this._fonts;
|
|
280
|
+
if (!fonts)
|
|
281
|
+
return null;
|
|
155
282
|
const layout = fonts.layout(text, {
|
|
156
283
|
family: this._family,
|
|
157
284
|
size: size * this._scale,
|
|
@@ -159,26 +286,43 @@ export class LabelShaper {
|
|
|
159
286
|
style: 'normal',
|
|
160
287
|
color,
|
|
161
288
|
});
|
|
162
|
-
|
|
289
|
+
return {
|
|
163
290
|
width: layout.width / this._scale,
|
|
164
291
|
height: layout.height / this._scale,
|
|
165
292
|
layout,
|
|
166
293
|
};
|
|
167
|
-
this._cache.set(key, shaped);
|
|
168
|
-
return shaped;
|
|
169
294
|
}
|
|
170
295
|
}
|
|
296
|
+
/** A street name is set level — on whole pixels, which is sharper — when
|
|
297
|
+
* its street is this close to level. */
|
|
298
|
+
function levelled(angle) {
|
|
299
|
+
return Math.abs(angle) < LEVEL_SNAP ? 0 : angle;
|
|
300
|
+
}
|
|
171
301
|
/**
|
|
172
302
|
* Place candidates against each other, in world pixels.
|
|
173
303
|
*
|
|
174
|
-
* Greedy
|
|
175
|
-
* nothing already taken overlaps it. The order
|
|
176
|
-
*
|
|
177
|
-
*
|
|
304
|
+
* Greedy, which is what every map does: sort, and take a label if it fits
|
|
305
|
+
* where it is and nothing already taken overlaps it. The order is the GL
|
|
306
|
+
* renderer's, less what depends on the view: rank, then importance within
|
|
307
|
+
* the layer, then a street name that clears its junctions over one that
|
|
308
|
+
* would cover a crossing street, then the longer straight run. It has to be
|
|
309
|
+
* **total and stable** — the candidate's id last — because a tie broken by
|
|
310
|
+
* array order would flicker as tiles arrived in a different order.
|
|
311
|
+
*
|
|
312
|
+
* A street name fits where the GL renderer says one does: on a stretch
|
|
313
|
+
* straight enough for its size, and long enough for all of it.
|
|
178
314
|
*/
|
|
179
315
|
export function placeLabels(candidates, worldSize, shaper, options) {
|
|
180
316
|
const padding = options?.padding ?? 2;
|
|
181
|
-
const
|
|
317
|
+
const clean = (c) => c.clear * worldSize >= estimateWidth(c.text, c.size) / 2 ? 1 : 0;
|
|
318
|
+
const sorted = [...candidates]
|
|
319
|
+
.map((c) => ({ c, clean: clean(c) }))
|
|
320
|
+
.sort((a, b) => b.c.rank - a.c.rank ||
|
|
321
|
+
b.c.priority - a.c.priority ||
|
|
322
|
+
b.clean - a.clean ||
|
|
323
|
+
b.c.length - a.c.length ||
|
|
324
|
+
(a.c.id < b.c.id ? -1 : a.c.id > b.c.id ? 1 : 0))
|
|
325
|
+
.map((entry) => entry.c);
|
|
182
326
|
const placed = [];
|
|
183
327
|
// A sparse grid over world pixels. The cell is sized for the labels
|
|
184
328
|
// themselves, so a box touches one or two cells and a collision test is a
|
|
@@ -190,15 +334,18 @@ export function placeLabels(candidates, worldSize, shaper, options) {
|
|
|
190
334
|
* repeat-distance rule. */
|
|
191
335
|
const byText = new Map();
|
|
192
336
|
for (const candidate of sorted) {
|
|
193
|
-
|
|
194
|
-
if (
|
|
195
|
-
|
|
337
|
+
// Bent under its size at this zoom: not a stretch to set a name on.
|
|
338
|
+
if (candidate.dev * worldSize > candidate.size * STRAIGHT_FRACTION) {
|
|
339
|
+
continue;
|
|
340
|
+
}
|
|
196
341
|
const wx = candidate.mx * worldSize;
|
|
197
342
|
const wy = candidate.my * worldSize;
|
|
198
|
-
// The repeat test
|
|
199
|
-
//
|
|
200
|
-
//
|
|
201
|
-
//
|
|
343
|
+
// The repeat test first, because it is the cheapest one and because it
|
|
344
|
+
// is what rejects most of a street layer: a long street offers its name
|
|
345
|
+
// every block, none of them overlapping. Ahead of the shaping, which it
|
|
346
|
+
// does not need — a street's every block shaped its name, and a wheel
|
|
347
|
+
// zoom re-places at every step, so that was thousands of strings a
|
|
348
|
+
// frame asked of the cache.
|
|
202
349
|
if (candidate.repeat > 0) {
|
|
203
350
|
const already = byText.get(candidate.key);
|
|
204
351
|
if (already) {
|
|
@@ -216,9 +363,35 @@ export function placeLabels(candidates, worldSize, shaper, options) {
|
|
|
216
363
|
continue;
|
|
217
364
|
}
|
|
218
365
|
}
|
|
219
|
-
const
|
|
220
|
-
|
|
221
|
-
|
|
366
|
+
const measured = shaper.measure(candidate.text, candidate.size, candidate.color);
|
|
367
|
+
if (!measured)
|
|
368
|
+
return placed; // no font manager: nothing can be measured
|
|
369
|
+
// Longer than the straight stretch it would sit on, with a margin past
|
|
370
|
+
// each end: it would hang off the street, over whatever the street
|
|
371
|
+
// turns into.
|
|
372
|
+
const need = measured.width / 2 + measured.height * LINE_MARGIN;
|
|
373
|
+
if (candidate.avail * worldSize < need)
|
|
374
|
+
continue;
|
|
375
|
+
// The turned text's bounding box: what it covers, as far as another
|
|
376
|
+
// label can tell. With an icon, the box around the icon on the point
|
|
377
|
+
// and the text beside it — the two give way as one, or a stop's name
|
|
378
|
+
// would be set with nothing to say it is a stop.
|
|
379
|
+
const angle = levelled(candidate.angle);
|
|
380
|
+
const icon = candidate.icon ?? null;
|
|
381
|
+
let w = measured.width + padding * 2;
|
|
382
|
+
let h = measured.height + padding * 2;
|
|
383
|
+
let ox = 0;
|
|
384
|
+
if (icon) {
|
|
385
|
+
const full = icon.size + ICON_GAP + measured.width;
|
|
386
|
+
ox = (full - icon.size) / 2;
|
|
387
|
+
w = full + padding * 2;
|
|
388
|
+
h = Math.max(icon.size, measured.height) + padding * 2;
|
|
389
|
+
}
|
|
390
|
+
const cos = Math.abs(Math.cos(angle));
|
|
391
|
+
const sin = Math.abs(Math.sin(angle));
|
|
392
|
+
const width = w * cos + h * sin;
|
|
393
|
+
const height = w * sin + h * cos;
|
|
394
|
+
const left = wx + ox - width / 2;
|
|
222
395
|
const top = wy - height / 2;
|
|
223
396
|
const x0 = Math.floor(left / CELL);
|
|
224
397
|
const x1 = Math.floor((left + width) / CELL);
|
|
@@ -231,10 +404,12 @@ export function placeLabels(candidates, worldSize, shaper, options) {
|
|
|
231
404
|
if (!bucket)
|
|
232
405
|
continue;
|
|
233
406
|
for (const other of bucket) {
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
407
|
+
const otherLeft = other.wx + (other.ox ?? 0) - other.width / 2;
|
|
408
|
+
const otherTop = other.wy - other.height / 2;
|
|
409
|
+
if (left < otherLeft + other.width &&
|
|
410
|
+
left + width > otherLeft &&
|
|
411
|
+
top < otherTop + other.height &&
|
|
412
|
+
top + height > otherTop) {
|
|
238
413
|
free = false;
|
|
239
414
|
break;
|
|
240
415
|
}
|
|
@@ -245,11 +420,12 @@ export function placeLabels(candidates, worldSize, shaper, options) {
|
|
|
245
420
|
continue;
|
|
246
421
|
const entry = {
|
|
247
422
|
...candidate,
|
|
423
|
+
angle,
|
|
248
424
|
wx,
|
|
249
425
|
wy,
|
|
426
|
+
ox,
|
|
250
427
|
width,
|
|
251
428
|
height,
|
|
252
|
-
shaped,
|
|
253
429
|
};
|
|
254
430
|
placed.push(entry);
|
|
255
431
|
if (candidate.repeat > 0) {
|
|
@@ -281,32 +457,67 @@ export function placeLabels(candidates, worldSize, shaper, options) {
|
|
|
281
457
|
* composites of two shaped runs. That is cheap for the few dozen labels a
|
|
282
458
|
* pane holds and it is the difference between a place name that is
|
|
283
459
|
* readable over a motorway and one that is not.
|
|
460
|
+
*
|
|
461
|
+
* A level label is drawn on whole device pixels. A street name along its
|
|
462
|
+
* street is drawn turned about its centre, where the context can turn —
|
|
463
|
+
* and level where it cannot, on a context with no transform.
|
|
284
464
|
*/
|
|
285
465
|
export function drawLabels(ctx, placed, transform, pane, scale, clip, shaper) {
|
|
286
466
|
let drawn = 0;
|
|
287
467
|
const world = transform.world;
|
|
288
468
|
const originX = pane.x + transform.paneX - transform.centerX * world;
|
|
289
469
|
const originY = pane.y + transform.paneY - transform.centerY * world;
|
|
470
|
+
const turns = typeof ctx.rotate === 'function' && !!ctx.translate;
|
|
290
471
|
for (const label of placed) {
|
|
291
|
-
const
|
|
292
|
-
const
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
472
|
+
const cx = originX + label.wx;
|
|
473
|
+
const cy = originY + label.wy;
|
|
474
|
+
// The box's centre, which is right of the point where an icon is on it.
|
|
475
|
+
const bx = cx + (label.ox ?? 0);
|
|
476
|
+
const halfW = label.width / 2;
|
|
477
|
+
const halfH = label.height / 2;
|
|
478
|
+
if (bx + halfW < pane.x ||
|
|
479
|
+
cy + halfH < pane.y ||
|
|
480
|
+
bx - halfW > pane.x + pane.width ||
|
|
481
|
+
cy - halfH > pane.y + pane.height) {
|
|
297
482
|
continue;
|
|
298
483
|
}
|
|
299
484
|
if (clip &&
|
|
300
|
-
(
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
485
|
+
(bx + halfW < clip.x ||
|
|
486
|
+
cy + halfH < clip.y ||
|
|
487
|
+
bx - halfW > clip.x + clip.width ||
|
|
488
|
+
cy - halfH > clip.y + clip.height)) {
|
|
304
489
|
continue;
|
|
305
490
|
}
|
|
306
|
-
|
|
307
|
-
|
|
491
|
+
// Shaped here, for the labels in the pane: the few hundred a frame
|
|
492
|
+
// draws, where the placement holds every name on the tiles loaded.
|
|
493
|
+
const shaped = shaper.drawn(label);
|
|
494
|
+
if (!shaped)
|
|
495
|
+
continue;
|
|
496
|
+
const { width, height } = shaped;
|
|
497
|
+
const icon = label.icon ?? null;
|
|
498
|
+
const turned = !icon && label.angle !== 0 && turns;
|
|
499
|
+
const haloed = label.halo !== undefined && label.haloWidth > 0;
|
|
500
|
+
let dx;
|
|
501
|
+
let dy;
|
|
502
|
+
if (icon) {
|
|
503
|
+
// The icon on the point, and the name level beside it.
|
|
504
|
+
drawIcon(ctx, icon, Math.round(cx * scale), Math.round(cy * scale), icon.size * scale, haloed ? label.halo : undefined, Math.max(1, Math.round(label.haloWidth * scale)));
|
|
505
|
+
dx = Math.round((cx + icon.size / 2 + ICON_GAP) * scale);
|
|
506
|
+
dy = Math.round((cy - height / 2) * scale);
|
|
507
|
+
}
|
|
508
|
+
else if (turned) {
|
|
509
|
+
ctx.save();
|
|
510
|
+
ctx.translate(cx * scale, cy * scale);
|
|
511
|
+
ctx.rotate(label.angle);
|
|
512
|
+
dx = (-width * scale) / 2;
|
|
513
|
+
dy = (-height * scale) / 2;
|
|
514
|
+
}
|
|
515
|
+
else {
|
|
516
|
+
dx = Math.round((cx - width / 2) * scale);
|
|
517
|
+
dy = Math.round((cy - height / 2) * scale);
|
|
518
|
+
}
|
|
308
519
|
if (label.halo !== undefined && label.haloWidth > 0) {
|
|
309
|
-
const halo = shaper.
|
|
520
|
+
const halo = shaper.drawn(label, true);
|
|
310
521
|
if (halo) {
|
|
311
522
|
const offset = Math.max(1, Math.round(label.haloWidth * scale));
|
|
312
523
|
halo.layout.draw(ctx, dx - offset, dy);
|
|
@@ -315,9 +526,34 @@ export function drawLabels(ctx, placed, transform, pane, scale, clip, shaper) {
|
|
|
315
526
|
halo.layout.draw(ctx, dx, dy + offset);
|
|
316
527
|
}
|
|
317
528
|
}
|
|
318
|
-
|
|
529
|
+
shaped.layout.draw(ctx, dx, dy);
|
|
530
|
+
if (turned)
|
|
531
|
+
ctx.restore();
|
|
319
532
|
drawn++;
|
|
320
533
|
}
|
|
321
534
|
return drawn;
|
|
322
535
|
}
|
|
536
|
+
/**
|
|
537
|
+
* An icon on its point, in device pixels: the plate, over a plate of the
|
|
538
|
+
* halo's colour a halo wider where the layer has one — the same ground a
|
|
539
|
+
* name's halo gives it over a road — and the glyph on the plate.
|
|
540
|
+
*/
|
|
541
|
+
function drawIcon(ctx, icon, x, y, size, halo, reach) {
|
|
542
|
+
ctx.save();
|
|
543
|
+
if (halo !== undefined) {
|
|
544
|
+
ctx.fillStyle = halo;
|
|
545
|
+
ctx.beginPath();
|
|
546
|
+
tracePlate(ctx, x, y, size + reach * 2);
|
|
547
|
+
ctx.fill();
|
|
548
|
+
}
|
|
549
|
+
ctx.fillStyle = icon.color;
|
|
550
|
+
ctx.beginPath();
|
|
551
|
+
tracePlate(ctx, x, y, size);
|
|
552
|
+
ctx.fill();
|
|
553
|
+
ctx.fillStyle = icon.glyph;
|
|
554
|
+
ctx.beginPath();
|
|
555
|
+
traceGlyph(ctx, icon.name, x, y, size);
|
|
556
|
+
ctx.fill();
|
|
557
|
+
ctx.restore();
|
|
558
|
+
}
|
|
323
559
|
//# sourceMappingURL=labels.js.map
|