@sakuzu/maplibre-gl-draw 1.0.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/CHANGELOG.md +43 -0
- package/LICENSE +661 -0
- package/README.ja.md +248 -0
- package/README.md +255 -0
- package/THIRD_PARTY_NOTICES.md +275 -0
- package/dist/api/api.d.ts +1259 -0
- package/dist/api/api.js +86 -0
- package/dist/api/context.d.ts +173 -0
- package/dist/api/context.js +193 -0
- package/dist/api/display-api.d.ts +1 -0
- package/dist/api/display-api.js +23 -0
- package/dist/api/event-api.d.ts +13 -0
- package/dist/api/event-api.js +17 -0
- package/dist/api/extension-api.d.ts +46 -0
- package/dist/api/extension-api.js +85 -0
- package/dist/api/feature-api.d.ts +11 -0
- package/dist/api/feature-api.js +101 -0
- package/dist/api/geometry/apply.d.ts +51 -0
- package/dist/api/geometry/apply.js +114 -0
- package/dist/api/geometry/boolean.d.ts +28 -0
- package/dist/api/geometry/boolean.js +65 -0
- package/dist/api/geometry/buffer.d.ts +11 -0
- package/dist/api/geometry/buffer.js +105 -0
- package/dist/api/geometry/split.d.ts +16 -0
- package/dist/api/geometry/split.js +75 -0
- package/dist/api/geometry/targets.d.ts +76 -0
- package/dist/api/geometry/targets.js +158 -0
- package/dist/api/geometry/types.d.ts +31 -0
- package/dist/api/geometry/types.js +3 -0
- package/dist/api/geometry-operations.d.ts +162 -0
- package/dist/api/geometry-operations.js +94 -0
- package/dist/api/group-api.d.ts +10 -0
- package/dist/api/group-api.js +78 -0
- package/dist/api/import-export/constants.d.ts +29 -0
- package/dist/api/import-export/constants.js +40 -0
- package/dist/api/import-export/embedded-file.d.ts +13 -0
- package/dist/api/import-export/embedded-file.js +31 -0
- package/dist/api/import-export/file-name.d.ts +10 -0
- package/dist/api/import-export/file-name.js +20 -0
- package/dist/api/import-export/format-detection.d.ts +12 -0
- package/dist/api/import-export/format-detection.js +29 -0
- package/dist/api/import-export/geojson-export.d.ts +19 -0
- package/dist/api/import-export/geojson-export.js +262 -0
- package/dist/api/import-export/geojson-import.d.ts +34 -0
- package/dist/api/import-export/geojson-import.js +538 -0
- package/dist/api/import-export/geometry-validation.d.ts +20 -0
- package/dist/api/import-export/geometry-validation.js +107 -0
- package/dist/api/import-export/image-import.d.ts +12 -0
- package/dist/api/import-export/image-import.js +53 -0
- package/dist/api/import-export/index.d.ts +9 -0
- package/dist/api/import-export/index.js +107 -0
- package/dist/api/import-export/native-format.d.ts +15 -0
- package/dist/api/import-export/native-format.js +126 -0
- package/dist/api/import-export/native-validation.d.ts +28 -0
- package/dist/api/import-export/native-validation.js +212 -0
- package/dist/api/import-export/own-property.d.ts +10 -0
- package/dist/api/import-export/own-property.js +19 -0
- package/dist/api/import-export/style-validation.d.ts +27 -0
- package/dist/api/import-export/style-validation.js +49 -0
- package/dist/api/import-export/types.d.ts +26 -0
- package/dist/api/import-export/types.js +3 -0
- package/dist/api/index.d.ts +15 -0
- package/dist/api/index.js +3 -0
- package/dist/api/input-api.d.ts +158 -0
- package/dist/api/input-api.js +144 -0
- package/dist/api/instance-api.d.ts +38 -0
- package/dist/api/instance-api.js +136 -0
- package/dist/api/layer-api.d.ts +12 -0
- package/dist/api/layer-api.js +62 -0
- package/dist/api/selection-api.d.ts +7 -0
- package/dist/api/selection-api.js +78 -0
- package/dist/api/snapping-api.d.ts +125 -0
- package/dist/api/snapping-api.js +50 -0
- package/dist/api/topology-api.d.ts +30 -0
- package/dist/api/topology-api.js +16 -0
- package/dist/api/tracing-api.d.ts +31 -0
- package/dist/api/tracing-api.js +16 -0
- package/dist/dispatcher/hit-test/box-strategies.d.ts +19 -0
- package/dist/dispatcher/hit-test/box-strategies.js +275 -0
- package/dist/dispatcher/hit-test/box-strategy.d.ts +59 -0
- package/dist/dispatcher/hit-test/box-strategy.js +37 -0
- package/dist/dispatcher/hit-test/globe-shape.d.ts +46 -0
- package/dist/dispatcher/hit-test/globe-shape.js +70 -0
- package/dist/dispatcher/hit-test/index.d.ts +14 -0
- package/dist/dispatcher/hit-test/index.js +9 -0
- package/dist/dispatcher/hit-test/local-frame.d.ts +77 -0
- package/dist/dispatcher/hit-test/local-frame.js +112 -0
- package/dist/dispatcher/hit-test/segment-grid.d.ts +32 -0
- package/dist/dispatcher/hit-test/segment-grid.js +79 -0
- package/dist/dispatcher/hit-test/service.d.ts +120 -0
- package/dist/dispatcher/hit-test/service.js +333 -0
- package/dist/dispatcher/hit-test/strategies/base.d.ts +136 -0
- package/dist/dispatcher/hit-test/strategies/base.js +66 -0
- package/dist/dispatcher/hit-test/strategies/circle.d.ts +10 -0
- package/dist/dispatcher/hit-test/strategies/circle.js +56 -0
- package/dist/dispatcher/hit-test/strategies/image.d.ts +22 -0
- package/dist/dispatcher/hit-test/strategies/image.js +115 -0
- package/dist/dispatcher/hit-test/strategies/index.d.ts +11 -0
- package/dist/dispatcher/hit-test/strategies/index.js +10 -0
- package/dist/dispatcher/hit-test/strategies/line.d.ts +17 -0
- package/dist/dispatcher/hit-test/strategies/line.js +30 -0
- package/dist/dispatcher/hit-test/strategies/multi.d.ts +44 -0
- package/dist/dispatcher/hit-test/strategies/multi.js +141 -0
- package/dist/dispatcher/hit-test/strategies/point.d.ts +20 -0
- package/dist/dispatcher/hit-test/strategies/point.js +29 -0
- package/dist/dispatcher/hit-test/strategies/polygon.d.ts +52 -0
- package/dist/dispatcher/hit-test/strategies/polygon.js +138 -0
- package/dist/dispatcher/hit-test/topmost.d.ts +48 -0
- package/dist/dispatcher/hit-test/topmost.js +157 -0
- package/dist/dispatcher/hit-test/visibility-lookup.d.ts +23 -0
- package/dist/dispatcher/hit-test/visibility-lookup.js +40 -0
- package/dist/dispatcher/index.d.ts +15 -0
- package/dist/dispatcher/index.js +3 -0
- package/dist/dispatcher/input-router.d.ts +1 -0
- package/dist/dispatcher/input-router.js +288 -0
- package/dist/dispatcher/normalizer.d.ts +1 -0
- package/dist/dispatcher/normalizer.js +513 -0
- package/dist/dispatcher/types.d.ts +144 -0
- package/dist/dispatcher/types.js +15 -0
- package/dist/display/chunk-set.d.ts +24 -0
- package/dist/display/chunk-set.js +533 -0
- package/dist/display/chunk.d.ts +1 -0
- package/dist/display/chunk.js +104 -0
- package/dist/display/columnar/index.d.ts +12 -0
- package/dist/display/columnar/index.js +13 -0
- package/dist/display/columnar/prepare.d.ts +42 -0
- package/dist/display/columnar/prepare.js +116 -0
- package/dist/display/columnar/source.d.ts +1 -0
- package/dist/display/columnar/source.js +531 -0
- package/dist/display/columnar/table.d.ts +1 -0
- package/dist/display/columnar/table.js +471 -0
- package/dist/display/columnar/types.d.ts +223 -0
- package/dist/display/columnar/types.js +3 -0
- package/dist/display/dataset.d.ts +2 -0
- package/dist/display/dataset.js +891 -0
- package/dist/display/index.d.ts +13 -0
- package/dist/display/index.js +3 -0
- package/dist/display/interaction.d.ts +1 -0
- package/dist/display/interaction.js +90 -0
- package/dist/display/manager.d.ts +1 -0
- package/dist/display/manager.js +440 -0
- package/dist/display/packed-rtree.d.ts +1 -0
- package/dist/display/packed-rtree.js +244 -0
- package/dist/display/partition.d.ts +1 -0
- package/dist/display/partition.js +226 -0
- package/dist/display/provider.d.ts +1 -0
- package/dist/display/provider.js +342 -0
- package/dist/display/retained.d.ts +40 -0
- package/dist/display/retained.js +898 -0
- package/dist/display/selection.d.ts +13 -0
- package/dist/display/selection.js +226 -0
- package/dist/display/source.d.ts +1 -0
- package/dist/display/source.js +119 -0
- package/dist/display/spatial.d.ts +1 -0
- package/dist/display/spatial.js +71 -0
- package/dist/display/style.d.ts +1 -0
- package/dist/display/style.js +126 -0
- package/dist/display/thinning.d.ts +65 -0
- package/dist/display/thinning.js +910 -0
- package/dist/display/triangulation.d.ts +1 -0
- package/dist/display/triangulation.js +0 -0
- package/dist/display/types.d.ts +561 -0
- package/dist/display/types.js +43 -0
- package/dist/extension/feature-handler.d.ts +182 -0
- package/dist/extension/feature-handler.js +3 -0
- package/dist/extension/index.d.ts +9 -0
- package/dist/extension/index.js +3 -0
- package/dist/extension/renderers.d.ts +208 -0
- package/dist/extension/renderers.js +3 -0
- package/dist/geometry/angle.d.ts +47 -0
- package/dist/geometry/angle.js +44 -0
- package/dist/geometry/bbox.d.ts +48 -0
- package/dist/geometry/bbox.js +83 -0
- package/dist/geometry/boolean.d.ts +162 -0
- package/dist/geometry/boolean.js +331 -0
- package/dist/geometry/buffer.d.ts +72 -0
- package/dist/geometry/buffer.js +218 -0
- package/dist/geometry/circle.d.ts +55 -0
- package/dist/geometry/circle.js +107 -0
- package/dist/geometry/coords.d.ts +97 -0
- package/dist/geometry/coords.js +149 -0
- package/dist/geometry/distance.d.ts +79 -0
- package/dist/geometry/distance.js +111 -0
- package/dist/geometry/errors.d.ts +74 -0
- package/dist/geometry/errors.js +104 -0
- package/dist/geometry/index.d.ts +28 -0
- package/dist/geometry/index.js +38 -0
- package/dist/geometry/measure.d.ts +81 -0
- package/dist/geometry/measure.js +236 -0
- package/dist/geometry/predicates.d.ts +62 -0
- package/dist/geometry/predicates.js +132 -0
- package/dist/geometry/simplify.d.ts +74 -0
- package/dist/geometry/simplify.js +159 -0
- package/dist/geometry/split.d.ts +68 -0
- package/dist/geometry/split.js +430 -0
- package/dist/geometry/types.d.ts +95 -0
- package/dist/geometry/types.js +3 -0
- package/dist/geometry/units.d.ts +35 -0
- package/dist/geometry/units.js +41 -0
- package/dist/index.d.ts +72 -0
- package/dist/index.js +20 -0
- package/dist/maplibre-gl-draw.d.ts +47 -0
- package/dist/maplibre-gl-draw.js +407 -0
- package/dist/messages.d.ts +64 -0
- package/dist/messages.js +36 -0
- package/dist/modes/cursor.d.ts +1 -0
- package/dist/modes/cursor.js +72 -0
- package/dist/modes/draw/circle.d.ts +1 -0
- package/dist/modes/draw/circle.js +222 -0
- package/dist/modes/draw/commit-layer.d.ts +26 -0
- package/dist/modes/draw/commit-layer.js +31 -0
- package/dist/modes/draw/freehand.d.ts +1 -0
- package/dist/modes/draw/freehand.js +264 -0
- package/dist/modes/draw/image.d.ts +1 -0
- package/dist/modes/draw/image.js +60 -0
- package/dist/modes/draw/index.d.ts +9 -0
- package/dist/modes/draw/index.js +11 -0
- package/dist/modes/draw/line.d.ts +1 -0
- package/dist/modes/draw/line.js +363 -0
- package/dist/modes/draw/point.d.ts +1 -0
- package/dist/modes/draw/point.js +87 -0
- package/dist/modes/draw/polygon.d.ts +1 -0
- package/dist/modes/draw/polygon.js +378 -0
- package/dist/modes/draw/trace-support.d.ts +79 -0
- package/dist/modes/draw/trace-support.js +161 -0
- package/dist/modes/handler.d.ts +285 -0
- package/dist/modes/handler.js +3 -0
- package/dist/modes/index.d.ts +7 -0
- package/dist/modes/index.js +3 -0
- package/dist/modes/manager.d.ts +15 -0
- package/dist/modes/manager.js +196 -0
- package/dist/modes/select/box-selection.d.ts +52 -0
- package/dist/modes/select/box-selection.js +140 -0
- package/dist/modes/select/click-handler.d.ts +32 -0
- package/dist/modes/select/click-handler.js +166 -0
- package/dist/modes/select/cursor-handler.d.ts +15 -0
- package/dist/modes/select/cursor-handler.js +59 -0
- package/dist/modes/select/drag/auxiliary.d.ts +26 -0
- package/dist/modes/select/drag/auxiliary.js +56 -0
- package/dist/modes/select/drag/intermediate-writes.d.ts +1 -0
- package/dist/modes/select/drag/intermediate-writes.js +171 -0
- package/dist/modes/select/drag/move.d.ts +24 -0
- package/dist/modes/select/drag/move.js +59 -0
- package/dist/modes/select/drag/operation.d.ts +30 -0
- package/dist/modes/select/drag/operation.js +18 -0
- package/dist/modes/select/drag/radius.d.ts +15 -0
- package/dist/modes/select/drag/radius.js +49 -0
- package/dist/modes/select/drag/transform.d.ts +17 -0
- package/dist/modes/select/drag/transform.js +155 -0
- package/dist/modes/select/drag/vertex.d.ts +17 -0
- package/dist/modes/select/drag/vertex.js +163 -0
- package/dist/modes/select/drag-handler.d.ts +1 -0
- package/dist/modes/select/drag-handler.js +254 -0
- package/dist/modes/select/hit-helpers.d.ts +40 -0
- package/dist/modes/select/hit-helpers.js +51 -0
- package/dist/modes/select/mode.d.ts +1 -0
- package/dist/modes/select/mode.js +397 -0
- package/dist/modes/select/shortcut-handler.d.ts +40 -0
- package/dist/modes/select/shortcut-handler.js +128 -0
- package/dist/operations/index.d.ts +9 -0
- package/dist/operations/index.js +3 -0
- package/dist/operations/layer-operations.d.ts +1 -0
- package/dist/operations/layer-operations.js +350 -0
- package/dist/operations/resize.d.ts +71 -0
- package/dist/operations/resize.js +252 -0
- package/dist/operations/rotate.d.ts +17 -0
- package/dist/operations/rotate.js +166 -0
- package/dist/operations/selection-operations.d.ts +20 -0
- package/dist/operations/selection-operations.js +159 -0
- package/dist/operations/shared-vertex.d.ts +1 -0
- package/dist/operations/shared-vertex.js +210 -0
- package/dist/operations/trace-graph.d.ts +96 -0
- package/dist/operations/trace-graph.js +283 -0
- package/dist/operations/vertex.d.ts +1 -0
- package/dist/operations/vertex.js +538 -0
- package/dist/plugins/index.d.ts +10 -0
- package/dist/plugins/index.js +3 -0
- package/dist/plugins/mutation-hooks.d.ts +28 -0
- package/dist/plugins/mutation-hooks.js +84 -0
- package/dist/plugins/plugin-context.d.ts +1 -0
- package/dist/plugins/plugin-context.js +367 -0
- package/dist/plugins/plugin-manager.d.ts +103 -0
- package/dist/plugins/plugin-manager.js +316 -0
- package/dist/plugins/plugin.d.ts +529 -0
- package/dist/plugins/plugin.js +3 -0
- package/dist/shared/config/constants.d.ts +66 -0
- package/dist/shared/config/constants.js +60 -0
- package/dist/shared/config/feature-style.d.ts +155 -0
- package/dist/shared/config/feature-style.js +154 -0
- package/dist/shared/config/index.d.ts +17 -0
- package/dist/shared/config/index.js +8 -0
- package/dist/shared/config/rendering.d.ts +107 -0
- package/dist/shared/config/rendering.js +33 -0
- package/dist/shared/config/selection-highlight.d.ts +29 -0
- package/dist/shared/config/selection-highlight.js +35 -0
- package/dist/shared/config/selection.d.ts +273 -0
- package/dist/shared/config/selection.js +266 -0
- package/dist/shared/config/topology.d.ts +33 -0
- package/dist/shared/config/topology.js +17 -0
- package/dist/shared/config/trace.d.ts +40 -0
- package/dist/shared/config/trace.js +17 -0
- package/dist/shared/math/angle.d.ts +21 -0
- package/dist/shared/math/angle.js +34 -0
- package/dist/shared/math/circle.d.ts +6 -0
- package/dist/shared/math/circle.js +10 -0
- package/dist/shared/math/constants.d.ts +48 -0
- package/dist/shared/math/constants.js +59 -0
- package/dist/shared/math/distance.d.ts +78 -0
- package/dist/shared/math/distance.js +147 -0
- package/dist/shared/math/globe-subdivision.d.ts +62 -0
- package/dist/shared/math/globe-subdivision.js +99 -0
- package/dist/shared/math/index.d.ts +17 -0
- package/dist/shared/math/index.js +21 -0
- package/dist/shared/math/intersection.d.ts +63 -0
- package/dist/shared/math/intersection.js +236 -0
- package/dist/shared/math/longitude.d.ts +20 -0
- package/dist/shared/math/longitude.js +31 -0
- package/dist/shared/math/mercator-plane.d.ts +27 -0
- package/dist/shared/math/mercator-plane.js +26 -0
- package/dist/shared/math/obb.d.ts +65 -0
- package/dist/shared/math/obb.js +107 -0
- package/dist/shared/math/rotation.d.ts +93 -0
- package/dist/shared/math/rotation.js +186 -0
- package/dist/shared/math/segment-grid.d.ts +69 -0
- package/dist/shared/math/segment-grid.js +159 -0
- package/dist/shared/math/transform.d.ts +140 -0
- package/dist/shared/math/transform.js +189 -0
- package/dist/shared/types/events.d.ts +128 -0
- package/dist/shared/types/events.js +3 -0
- package/dist/shared/types/model.d.ts +950 -0
- package/dist/shared/types/model.js +3 -0
- package/dist/shared/types/selection-box.d.ts +23 -0
- package/dist/shared/types/selection-box.js +3 -0
- package/dist/shared/types/style.d.ts +68 -0
- package/dist/shared/types/style.js +3 -0
- package/dist/shared/utils/color.d.ts +49 -0
- package/dist/shared/utils/color.js +180 -0
- package/dist/shared/utils/coordinates.d.ts +52 -0
- package/dist/shared/utils/coordinates.js +75 -0
- package/dist/shared/utils/embedded-image.d.ts +34 -0
- package/dist/shared/utils/embedded-image.js +161 -0
- package/dist/shared/utils/event-emitter.d.ts +262 -0
- package/dist/shared/utils/event-emitter.js +44 -0
- package/dist/shared/utils/feature-bbox.d.ts +8 -0
- package/dist/shared/utils/feature-bbox.js +207 -0
- package/dist/shared/utils/feature-segments.d.ts +23 -0
- package/dist/shared/utils/feature-segments.js +179 -0
- package/dist/shared/utils/id.d.ts +1 -0
- package/dist/shared/utils/id.js +35 -0
- package/dist/shared/utils/image.d.ts +34 -0
- package/dist/shared/utils/image.js +106 -0
- package/dist/shared/utils/index.d.ts +15 -0
- package/dist/shared/utils/index.js +24 -0
- package/dist/shared/utils/map.d.ts +26 -0
- package/dist/shared/utils/map.js +35 -0
- package/dist/shared/utils/name-generator.d.ts +197 -0
- package/dist/shared/utils/name-generator.js +337 -0
- package/dist/shared/utils/pixel-ratio.d.ts +111 -0
- package/dist/shared/utils/pixel-ratio.js +85 -0
- package/dist/shared/utils/property.d.ts +88 -0
- package/dist/shared/utils/property.js +140 -0
- package/dist/shared/utils/vertex-ref.d.ts +23 -0
- package/dist/shared/utils/vertex-ref.js +20 -0
- package/dist/snapping/custom-targets.d.ts +1 -0
- package/dist/snapping/custom-targets.js +21 -0
- package/dist/snapping/geometry.d.ts +1 -0
- package/dist/snapping/geometry.js +61 -0
- package/dist/snapping/index.d.ts +14 -0
- package/dist/snapping/index.js +4 -0
- package/dist/snapping/indicator.d.ts +19 -0
- package/dist/snapping/indicator.js +145 -0
- package/dist/snapping/providers/display.d.ts +72 -0
- package/dist/snapping/providers/display.js +268 -0
- package/dist/snapping/providers/guide.d.ts +69 -0
- package/dist/snapping/providers/guide.js +187 -0
- package/dist/snapping/providers/intersection.d.ts +1 -0
- package/dist/snapping/providers/intersection.js +92 -0
- package/dist/snapping/providers/shared.d.ts +39 -0
- package/dist/snapping/providers/shared.js +146 -0
- package/dist/snapping/providers/store.d.ts +1 -0
- package/dist/snapping/providers/store.js +132 -0
- package/dist/snapping/service.d.ts +1 -0
- package/dist/snapping/service.js +272 -0
- package/dist/snapping/types.d.ts +267 -0
- package/dist/snapping/types.js +66 -0
- package/dist/store/change-merger.d.ts +1 -0
- package/dist/store/change-merger.js +102 -0
- package/dist/store/draw-store.d.ts +1 -0
- package/dist/store/draw-store.js +396 -0
- package/dist/store/event-bridge.d.ts +1 -0
- package/dist/store/event-bridge.js +161 -0
- package/dist/store/index.d.ts +12 -0
- package/dist/store/index.js +4 -0
- package/dist/store/local-visibility.d.ts +21 -0
- package/dist/store/local-visibility.js +27 -0
- package/dist/store/lock.d.ts +67 -0
- package/dist/store/lock.js +54 -0
- package/dist/store/memory/change-bus.d.ts +60 -0
- package/dist/store/memory/change-bus.js +232 -0
- package/dist/store/memory/file-store.d.ts +15 -0
- package/dist/store/memory/file-store.js +33 -0
- package/dist/store/memory/frozen.d.ts +21 -0
- package/dist/store/memory/frozen.js +51 -0
- package/dist/store/memory/ui-state.d.ts +51 -0
- package/dist/store/memory/ui-state.js +223 -0
- package/dist/store/memory.d.ts +26 -0
- package/dist/store/memory.js +708 -0
- package/dist/store/spatial/index.d.ts +6 -0
- package/dist/store/spatial/index.js +4 -0
- package/dist/store/spatial/spatial-index.d.ts +90 -0
- package/dist/store/spatial/spatial-index.js +148 -0
- package/dist/store/spatial/store-spatial-index.d.ts +60 -0
- package/dist/store/spatial/store-spatial-index.js +125 -0
- package/dist/store/store.d.ts +417 -0
- package/dist/store/store.js +3 -0
- package/dist/store/types.d.ts +8 -0
- package/dist/store/types.js +3 -0
- package/dist/store/writable-layer.d.ts +35 -0
- package/dist/store/writable-layer.js +20 -0
- package/dist/view/cache/buffer.d.ts +28 -0
- package/dist/view/cache/buffer.js +176 -0
- package/dist/view/cache/earcut.d.ts +1 -0
- package/dist/view/cache/earcut.js +122 -0
- package/dist/view/cache/style-rule.d.ts +1 -0
- package/dist/view/cache/style-rule.js +97 -0
- package/dist/view/cache/terrain-fill.d.ts +30 -0
- package/dist/view/cache/terrain-fill.js +60 -0
- package/dist/view/cache/texture.d.ts +14 -0
- package/dist/view/cache/texture.js +292 -0
- package/dist/view/coordinator.d.ts +27 -0
- package/dist/view/coordinator.js +72 -0
- package/dist/view/feature-companion.d.ts +173 -0
- package/dist/view/feature-companion.js +108 -0
- package/dist/view/globe-subdivision.d.ts +78 -0
- package/dist/view/globe-subdivision.js +128 -0
- package/dist/view/index.d.ts +47 -0
- package/dist/view/index.js +20 -0
- package/dist/view/layer/attach.d.ts +20 -0
- package/dist/view/layer/attach.js +47 -0
- package/dist/view/layer/blend.d.ts +57 -0
- package/dist/view/layer/blend.js +14 -0
- package/dist/view/layer/custom-layer.d.ts +1 -0
- package/dist/view/layer/custom-layer.js +509 -0
- package/dist/view/layer/depth-state.d.ts +14 -0
- package/dist/view/layer/depth-state.js +44 -0
- package/dist/view/layer/display-list.d.ts +1 -0
- package/dist/view/layer/display-list.js +111 -0
- package/dist/view/layer/drape-planner.d.ts +139 -0
- package/dist/view/layer/drape-planner.js +726 -0
- package/dist/view/layer/frame-render.d.ts +57 -0
- package/dist/view/layer/frame-render.js +209 -0
- package/dist/view/layer/frame-state.d.ts +147 -0
- package/dist/view/layer/frame-state.js +484 -0
- package/dist/view/layer/gl-state.d.ts +77 -0
- package/dist/view/layer/gl-state.js +132 -0
- package/dist/view/layer/index.d.ts +6 -0
- package/dist/view/layer/index.js +5 -0
- package/dist/view/layer/render-scope.d.ts +30 -0
- package/dist/view/layer/render-scope.js +28 -0
- package/dist/view/layer/render.d.ts +87 -0
- package/dist/view/layer/render.js +187 -0
- package/dist/view/layer/renderers.d.ts +81 -0
- package/dist/view/layer/renderers.js +142 -0
- package/dist/view/layer/slot-manager.d.ts +26 -0
- package/dist/view/layer/slot-manager.js +133 -0
- package/dist/view/layer/slots.d.ts +33 -0
- package/dist/view/layer/slots.js +50 -0
- package/dist/view/layer/store-retained-bbox.d.ts +36 -0
- package/dist/view/layer/store-retained-bbox.js +188 -0
- package/dist/view/layer/store-retained-chunk.d.ts +97 -0
- package/dist/view/layer/store-retained-chunk.js +94 -0
- package/dist/view/layer/store-retained-classify.d.ts +34 -0
- package/dist/view/layer/store-retained-classify.js +88 -0
- package/dist/view/layer/store-retained-collect.d.ts +24 -0
- package/dist/view/layer/store-retained-collect.js +121 -0
- package/dist/view/layer/store-retained-coord-patch.d.ts +119 -0
- package/dist/view/layer/store-retained-coord-patch.js +168 -0
- package/dist/view/layer/store-retained-immediate.d.ts +63 -0
- package/dist/view/layer/store-retained-immediate.js +49 -0
- package/dist/view/layer/store-retained-invalidation.d.ts +96 -0
- package/dist/view/layer/store-retained-invalidation.js +192 -0
- package/dist/view/layer/store-retained.d.ts +198 -0
- package/dist/view/layer/store-retained.js +430 -0
- package/dist/view/layer/terrain-resolver.d.ts +1 -0
- package/dist/view/layer/terrain-resolver.js +174 -0
- package/dist/view/renderers/batch-manager.d.ts +61 -0
- package/dist/view/renderers/batch-manager.js +718 -0
- package/dist/view/renderers/draw-factors.d.ts +60 -0
- package/dist/view/renderers/draw-factors.js +35 -0
- package/dist/view/renderers/drawer.d.ts +1 -0
- package/dist/view/renderers/drawer.js +346 -0
- package/dist/view/renderers/image.d.ts +1 -0
- package/dist/view/renderers/image.js +255 -0
- package/dist/view/renderers/line/dash.d.ts +31 -0
- package/dist/view/renderers/line/dash.js +152 -0
- package/dist/view/renderers/line/line-geometry.d.ts +39 -0
- package/dist/view/renderers/line/line-geometry.js +460 -0
- package/dist/view/renderers/line/line-gl.d.ts +1 -0
- package/dist/view/renderers/line/line-gl.js +236 -0
- package/dist/view/renderers/line/line-shader.d.ts +1 -0
- package/dist/view/renderers/line/line-shader.js +364 -0
- package/dist/view/renderers/line/line-types.d.ts +43 -0
- package/dist/view/renderers/line/line-types.js +3 -0
- package/dist/view/renderers/line/line-uniforms.d.ts +1 -0
- package/dist/view/renderers/line/line-uniforms.js +390 -0
- package/dist/view/renderers/line/sdf-line.d.ts +92 -0
- package/dist/view/renderers/line/sdf-line.js +567 -0
- package/dist/view/renderers/point/billboard-depth.d.ts +10 -0
- package/dist/view/renderers/point/billboard-depth.js +56 -0
- package/dist/view/renderers/point/point-instance.d.ts +124 -0
- package/dist/view/renderers/point/point-instance.js +738 -0
- package/dist/view/renderers/point/point-sdf.d.ts +58 -0
- package/dist/view/renderers/point/point-sdf.js +170 -0
- package/dist/view/renderers/point/point-shape.d.ts +99 -0
- package/dist/view/renderers/point/point-shape.js +504 -0
- package/dist/view/renderers/point/point-style.d.ts +1 -0
- package/dist/view/renderers/point/point-style.js +46 -0
- package/dist/view/renderers/polygon/batch.d.ts +26 -0
- package/dist/view/renderers/polygon/batch.js +336 -0
- package/dist/view/renderers/polygon/earcut-input.d.ts +37 -0
- package/dist/view/renderers/polygon/earcut-input.js +55 -0
- package/dist/view/renderers/polygon/earcut-sliced.d.ts +69 -0
- package/dist/view/renderers/polygon/earcut-sliced.js +960 -0
- package/dist/view/renderers/polygon/fill.d.ts +74 -0
- package/dist/view/renderers/polygon/fill.js +251 -0
- package/dist/view/renderers/polygon/sdf-polygon.d.ts +62 -0
- package/dist/view/renderers/polygon/sdf-polygon.js +919 -0
- package/dist/view/renderers/polygon/terrain-cull.d.ts +3 -0
- package/dist/view/renderers/polygon/terrain-cull.js +14 -0
- package/dist/view/renderers/polygon/triangulator.d.ts +41 -0
- package/dist/view/renderers/polygon/triangulator.js +3 -0
- package/dist/view/renderers/retained.d.ts +43 -0
- package/dist/view/renderers/retained.js +3 -0
- package/dist/view/renderers/stroke.d.ts +121 -0
- package/dist/view/renderers/stroke.js +621 -0
- package/dist/view/shaders/frame.d.ts +8 -0
- package/dist/view/shaders/frame.js +37 -0
- package/dist/view/shaders/helpers.d.ts +238 -0
- package/dist/view/shaders/helpers.js +611 -0
- package/dist/view/shaders/initializer.d.ts +27 -0
- package/dist/view/shaders/initializer.js +125 -0
- package/dist/view/shaders/projection.d.ts +123 -0
- package/dist/view/shaders/projection.js +299 -0
- package/dist/view/shaders/quad-grid.d.ts +77 -0
- package/dist/view/shaders/quad-grid.js +128 -0
- package/dist/view/shaders/quad.d.ts +189 -0
- package/dist/view/shaders/quad.js +582 -0
- package/dist/view/shaders/retained-origin.d.ts +50 -0
- package/dist/view/shaders/retained-origin.js +67 -0
- package/dist/view/shaders/terrain-shade.d.ts +23 -0
- package/dist/view/shaders/terrain-shade.js +93 -0
- package/dist/view/style-rule.d.ts +166 -0
- package/dist/view/style-rule.js +300 -0
- package/dist/view/terrain/anchor.d.ts +135 -0
- package/dist/view/terrain/anchor.js +226 -0
- package/dist/view/terrain/context.d.ts +132 -0
- package/dist/view/terrain/context.js +437 -0
- package/dist/view/terrain/dem-atlas.d.ts +97 -0
- package/dist/view/terrain/dem-atlas.js +534 -0
- package/dist/view/terrain/detect.d.ts +126 -0
- package/dist/view/terrain/detect.js +198 -0
- package/dist/view/terrain/drape/bin-store.d.ts +179 -0
- package/dist/view/terrain/drape/bin-store.js +529 -0
- package/dist/view/terrain/drape/binning.d.ts +259 -0
- package/dist/view/terrain/drape/binning.js +604 -0
- package/dist/view/terrain/drape/edge-constrain.d.ts +37 -0
- package/dist/view/terrain/drape/edge-constrain.js +175 -0
- package/dist/view/terrain/drape/geometry.d.ts +95 -0
- package/dist/view/terrain/drape/geometry.js +260 -0
- package/dist/view/terrain/drape/mesh.d.ts +50 -0
- package/dist/view/terrain/drape/mesh.js +86 -0
- package/dist/view/terrain/drape/pass.d.ts +122 -0
- package/dist/view/terrain/drape/pass.js +379 -0
- package/dist/view/terrain/drape/quad-glyphs.d.ts +64 -0
- package/dist/view/terrain/drape/quad-glyphs.js +117 -0
- package/dist/view/terrain/drape/quad.d.ts +249 -0
- package/dist/view/terrain/drape/quad.js +835 -0
- package/dist/view/terrain/drape/renderer.d.ts +184 -0
- package/dist/view/terrain/drape/renderer.js +706 -0
- package/dist/view/terrain/drape/shared.d.ts +80 -0
- package/dist/view/terrain/drape/shared.js +173 -0
- package/dist/view/terrain/drape/stitch.d.ts +155 -0
- package/dist/view/terrain/drape/stitch.js +228 -0
- package/dist/view/terrain/ground.d.ts +72 -0
- package/dist/view/terrain/ground.js +151 -0
- package/dist/view/terrain/metrics.d.ts +180 -0
- package/dist/view/terrain/metrics.js +231 -0
- package/dist/view/terrain/occlusion.d.ts +11 -0
- package/dist/view/terrain/occlusion.js +129 -0
- package/dist/view/terrain/polygon.d.ts +86 -0
- package/dist/view/terrain/polygon.js +301 -0
- package/dist/view/terrain/shade.d.ts +48 -0
- package/dist/view/terrain/shade.js +45 -0
- package/dist/view/terrain/state.d.ts +99 -0
- package/dist/view/terrain/state.js +186 -0
- package/dist/view/terrain/tessellation.d.ts +265 -0
- package/dist/view/terrain/tessellation.js +924 -0
- package/dist/view/terrain/tiling.d.ts +56 -0
- package/dist/view/terrain/tiling.js +155 -0
- package/dist/view/terrain/upstream-terrain.d.ts +82 -0
- package/dist/view/terrain/upstream-terrain.js +116 -0
- package/dist/view/ui/auxiliary-handles.d.ts +151 -0
- package/dist/view/ui/auxiliary-handles.js +22 -0
- package/dist/view/ui/bounds.d.ts +53 -0
- package/dist/view/ui/bounds.js +149 -0
- package/dist/view/ui/box-selection.d.ts +1 -0
- package/dist/view/ui/box-selection.js +83 -0
- package/dist/view/ui/handle-test.d.ts +1 -0
- package/dist/view/ui/handle-test.js +437 -0
- package/dist/view/ui/handle-thinning.d.ts +122 -0
- package/dist/view/ui/handle-thinning.js +430 -0
- package/dist/view/ui/handles.d.ts +25 -0
- package/dist/view/ui/handles.js +673 -0
- package/dist/view/ui/helper.d.ts +19 -0
- package/dist/view/ui/helper.js +76 -0
- package/dist/view/ui/index.d.ts +15 -0
- package/dist/view/ui/index.js +15 -0
- package/dist/view/ui/selection-scope.d.ts +25 -0
- package/dist/view/ui/selection-scope.js +34 -0
- package/dist/view/ui/selection-ui/bounding-box.d.ts +44 -0
- package/dist/view/ui/selection-ui/bounding-box.js +240 -0
- package/dist/view/ui/selection-ui/extension-registry.d.ts +76 -0
- package/dist/view/ui/selection-ui/extension-registry.js +78 -0
- package/dist/view/ui/selection-ui/index.d.ts +12 -0
- package/dist/view/ui/selection-ui/index.js +12 -0
- package/dist/view/ui/selection-ui/renderer.d.ts +29 -0
- package/dist/view/ui/selection-ui/renderer.js +227 -0
- package/dist/view/ui/selection-ui/types.d.ts +55 -0
- package/dist/view/ui/selection-ui/types.js +3 -0
- package/dist/view/ui/selection-ui-drawer.d.ts +52 -0
- package/dist/view/ui/selection-ui-drawer.js +329 -0
- package/dist/view/ui/tentative.d.ts +1 -0
- package/dist/view/ui/tentative.js +320 -0
- package/dist/view/viewport.d.ts +119 -0
- package/dist/view/viewport.js +254 -0
- package/package.json +113 -0
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
/**
|
|
4
|
+
* TextureCache
|
|
5
|
+
*
|
|
6
|
+
* Manages the images of Image features as cached WebGL textures.
|
|
7
|
+
*
|
|
8
|
+
* Every texture is uploaded while the engine is rendering (inside the custom layer's render),
|
|
9
|
+
* never from a callback such as `img.onload`: the GL context is shared with maplibre, and
|
|
10
|
+
* outside a render call its state belongs to maplibre. An image is decoded asynchronously and
|
|
11
|
+
* kept as a decoded image; the next frame that asks for it uploads it.
|
|
12
|
+
*/
|
|
13
|
+
import { isEmbeddedImageDataUrl } from '../../shared/utils/embedded-image.js';
|
|
14
|
+
/**
|
|
15
|
+
* TextureCache
|
|
16
|
+
*
|
|
17
|
+
* @internal
|
|
18
|
+
*/
|
|
19
|
+
export class TextureCache {
|
|
20
|
+
constructor(gl, maxCacheSize = 500) {
|
|
21
|
+
Object.defineProperty(this, "gl", {
|
|
22
|
+
enumerable: true,
|
|
23
|
+
configurable: true,
|
|
24
|
+
writable: true,
|
|
25
|
+
value: void 0
|
|
26
|
+
});
|
|
27
|
+
Object.defineProperty(this, "imageCache", {
|
|
28
|
+
enumerable: true,
|
|
29
|
+
configurable: true,
|
|
30
|
+
writable: true,
|
|
31
|
+
value: new Map()
|
|
32
|
+
});
|
|
33
|
+
Object.defineProperty(this, "maxCacheSize", {
|
|
34
|
+
enumerable: true,
|
|
35
|
+
configurable: true,
|
|
36
|
+
writable: true,
|
|
37
|
+
value: void 0
|
|
38
|
+
});
|
|
39
|
+
/** Images decoded and waiting for their upload, by src */
|
|
40
|
+
Object.defineProperty(this, "decodedImages", {
|
|
41
|
+
enumerable: true,
|
|
42
|
+
configurable: true,
|
|
43
|
+
writable: true,
|
|
44
|
+
value: new Map()
|
|
45
|
+
});
|
|
46
|
+
/** Decodes in progress, by src (one decode per src, shared by every caller) */
|
|
47
|
+
Object.defineProperty(this, "loadingImages", {
|
|
48
|
+
enumerable: true,
|
|
49
|
+
configurable: true,
|
|
50
|
+
writable: true,
|
|
51
|
+
value: new Map()
|
|
52
|
+
});
|
|
53
|
+
/**
|
|
54
|
+
* srcs whose decode failed, with the error (not retried every frame; invalidateImage
|
|
55
|
+
* forgets them)
|
|
56
|
+
*/
|
|
57
|
+
Object.defineProperty(this, "failedImages", {
|
|
58
|
+
enumerable: true,
|
|
59
|
+
configurable: true,
|
|
60
|
+
writable: true,
|
|
61
|
+
value: new Map()
|
|
62
|
+
});
|
|
63
|
+
/** Set by dispose(); a decode that finishes afterwards is dropped */
|
|
64
|
+
Object.defineProperty(this, "disposed", {
|
|
65
|
+
enumerable: true,
|
|
66
|
+
configurable: true,
|
|
67
|
+
writable: true,
|
|
68
|
+
value: false
|
|
69
|
+
});
|
|
70
|
+
/** MAX_TEXTURE_SIZE of the context (read once, 0 = not read yet) */
|
|
71
|
+
Object.defineProperty(this, "maxTextureSize", {
|
|
72
|
+
enumerable: true,
|
|
73
|
+
configurable: true,
|
|
74
|
+
writable: true,
|
|
75
|
+
value: 0
|
|
76
|
+
});
|
|
77
|
+
this.gl = gl;
|
|
78
|
+
this.maxCacheSize = maxCacheSize;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* The texture of an image, uploaded in this call if its decode has finished
|
|
82
|
+
*
|
|
83
|
+
* Call it while rendering. It returns null while the image is not decoded yet; the decode is
|
|
84
|
+
* started once per src (every caller shares it), and `onReady` is called when it finishes so
|
|
85
|
+
* that a frame can be requested. A decode that finishes after dispose() is dropped.
|
|
86
|
+
*
|
|
87
|
+
* @param src An embedded PNG/JPEG/WebP/GIF data URL
|
|
88
|
+
* @param onReady Called when the decode has finished (not called on failure)
|
|
89
|
+
* @param onError Called when the decode fails or the src is refused. Only the call that
|
|
90
|
+
* starts the decode is told; a later caller reads the failure with `getImageError`
|
|
91
|
+
*/
|
|
92
|
+
acquireImageTexture(src, onReady, onError) {
|
|
93
|
+
const cached = this.getImageTextureSync(src);
|
|
94
|
+
if (cached)
|
|
95
|
+
return cached;
|
|
96
|
+
const decoded = this.decodedImages.get(src);
|
|
97
|
+
if (decoded) {
|
|
98
|
+
this.decodedImages.delete(src);
|
|
99
|
+
return this.uploadImage(src, decoded);
|
|
100
|
+
}
|
|
101
|
+
if (this.failedImages.has(src) || this.loadingImages.has(src))
|
|
102
|
+
return null;
|
|
103
|
+
this.decodeImage(src).then(() => onReady?.(), (error) => {
|
|
104
|
+
this.failedImages.set(src, error);
|
|
105
|
+
onError?.(error);
|
|
106
|
+
});
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* The error of a src whose decode failed, or null (not failed, or not tried yet)
|
|
111
|
+
*/
|
|
112
|
+
getImageError(src) {
|
|
113
|
+
return this.failedImages.get(src) ?? null;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Decodes an image (the shared decode of a src while one is in progress)
|
|
117
|
+
*/
|
|
118
|
+
decodeImage(src) {
|
|
119
|
+
const loading = this.loadingImages.get(src);
|
|
120
|
+
if (loading)
|
|
121
|
+
return loading;
|
|
122
|
+
// Only embedded raster images are decoded. Any other URL would make every viewer of the
|
|
123
|
+
// data send a request to an outside host (the data may come from another participant).
|
|
124
|
+
if (!isEmbeddedImageDataUrl(src)) {
|
|
125
|
+
return Promise.reject(new Error('Refused to load an image that is not an embedded PNG/JPEG/WebP/GIF data URL'));
|
|
126
|
+
}
|
|
127
|
+
const promise = new Promise((resolve, reject) => {
|
|
128
|
+
const img = new Image();
|
|
129
|
+
img.crossOrigin = 'anonymous';
|
|
130
|
+
img.onload = () => {
|
|
131
|
+
this.loadingImages.delete(src);
|
|
132
|
+
// Only the decoded image is kept here; the upload happens in the next render
|
|
133
|
+
if (!this.disposed)
|
|
134
|
+
this.decodedImages.set(src, img);
|
|
135
|
+
resolve();
|
|
136
|
+
};
|
|
137
|
+
img.onerror = () => {
|
|
138
|
+
this.loadingImages.delete(src);
|
|
139
|
+
reject(new Error(`Failed to load image: ${src.slice(0, 64)}`));
|
|
140
|
+
};
|
|
141
|
+
img.src = src;
|
|
142
|
+
});
|
|
143
|
+
this.loadingImages.set(src, promise);
|
|
144
|
+
return promise;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Uploads a decoded image and caches its texture
|
|
148
|
+
*
|
|
149
|
+
* An image larger than MAX_TEXTURE_SIZE is scaled down to fit (texImage2D would fail and the
|
|
150
|
+
* image would silently be missing). The info keeps the size of the image itself, which is what
|
|
151
|
+
* its display size is derived from.
|
|
152
|
+
*/
|
|
153
|
+
uploadImage(src, img) {
|
|
154
|
+
if (this.imageCache.size >= this.maxCacheSize) {
|
|
155
|
+
this.evictOldestImage();
|
|
156
|
+
}
|
|
157
|
+
const texture = uploadRgbaTexture(this.gl, this.fitToTextureSize(img), true);
|
|
158
|
+
if (!texture)
|
|
159
|
+
return null;
|
|
160
|
+
const entry = {
|
|
161
|
+
texture,
|
|
162
|
+
width: img.width,
|
|
163
|
+
height: img.height,
|
|
164
|
+
lastUsed: Date.now(),
|
|
165
|
+
};
|
|
166
|
+
this.imageCache.set(src, entry);
|
|
167
|
+
return { texture, width: img.width, height: img.height };
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* The image itself, or a copy scaled down to MAX_TEXTURE_SIZE when it is larger
|
|
171
|
+
*/
|
|
172
|
+
fitToTextureSize(img) {
|
|
173
|
+
if (this.maxTextureSize === 0) {
|
|
174
|
+
const max = Number(this.gl.getParameter(this.gl.MAX_TEXTURE_SIZE));
|
|
175
|
+
this.maxTextureSize = Number.isFinite(max) && max > 0 ? max : 4096;
|
|
176
|
+
}
|
|
177
|
+
const max = this.maxTextureSize;
|
|
178
|
+
if (img.width <= max && img.height <= max)
|
|
179
|
+
return img;
|
|
180
|
+
const scale = max / Math.max(img.width, img.height);
|
|
181
|
+
const canvas = document.createElement('canvas');
|
|
182
|
+
canvas.width = Math.max(1, Math.floor(img.width * scale));
|
|
183
|
+
canvas.height = Math.max(1, Math.floor(img.height * scale));
|
|
184
|
+
canvas.getContext('2d')?.drawImage(img, 0, 0, canvas.width, canvas.height);
|
|
185
|
+
return canvas;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Gets an image texture synchronously (only when it is already cached)
|
|
189
|
+
*/
|
|
190
|
+
getImageTextureSync(src) {
|
|
191
|
+
const cached = this.imageCache.get(src);
|
|
192
|
+
if (cached) {
|
|
193
|
+
cached.lastUsed = Date.now();
|
|
194
|
+
return {
|
|
195
|
+
texture: cached.texture,
|
|
196
|
+
width: cached.width,
|
|
197
|
+
height: cached.height,
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
return null;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Deletes the oldest image entry
|
|
204
|
+
*/
|
|
205
|
+
evictOldestImage() {
|
|
206
|
+
let oldestKey = null;
|
|
207
|
+
let oldestTime = Infinity;
|
|
208
|
+
for (const [key, entry] of this.imageCache) {
|
|
209
|
+
if (entry.lastUsed < oldestTime) {
|
|
210
|
+
oldestTime = entry.lastUsed;
|
|
211
|
+
oldestKey = key;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
if (oldestKey) {
|
|
215
|
+
const entry = this.imageCache.get(oldestKey);
|
|
216
|
+
if (entry) {
|
|
217
|
+
this.gl.deleteTexture(entry.texture);
|
|
218
|
+
}
|
|
219
|
+
this.imageCache.delete(oldestKey);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Invalidates a specific image cache entry
|
|
224
|
+
*/
|
|
225
|
+
invalidateImage(src) {
|
|
226
|
+
this.decodedImages.delete(src);
|
|
227
|
+
this.failedImages.delete(src);
|
|
228
|
+
const entry = this.imageCache.get(src);
|
|
229
|
+
if (entry) {
|
|
230
|
+
this.gl.deleteTexture(entry.texture);
|
|
231
|
+
this.imageCache.delete(src);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Clears the whole cache
|
|
236
|
+
*/
|
|
237
|
+
clear() {
|
|
238
|
+
for (const entry of this.imageCache.values()) {
|
|
239
|
+
this.gl.deleteTexture(entry.texture);
|
|
240
|
+
}
|
|
241
|
+
this.imageCache.clear();
|
|
242
|
+
this.decodedImages.clear();
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Disposes of the resources
|
|
246
|
+
*
|
|
247
|
+
* A decode still in progress is dropped when it finishes (it never reaches the GL context).
|
|
248
|
+
*/
|
|
249
|
+
dispose() {
|
|
250
|
+
this.disposed = true;
|
|
251
|
+
this.clear();
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Uploads an image to a new RGBA texture with the unpack state the engine's shaders expect
|
|
256
|
+
*
|
|
257
|
+
* The shaders output colors that are not premultiplied and read the image with its first row at
|
|
258
|
+
* the top, so the upload sets `UNPACK_PREMULTIPLY_ALPHA_WEBGL` and `UNPACK_FLIP_Y_WEBGL` to
|
|
259
|
+
* false explicitly instead of inheriting whatever maplibre left in the context. The pixel store
|
|
260
|
+
* and the texture binding are borrowed and given back (maplibre-coupling.md): the values found
|
|
261
|
+
* are restored after the upload.
|
|
262
|
+
*
|
|
263
|
+
* @param mipmap Whether to build mipmaps (for images, which are often drawn smaller than their
|
|
264
|
+
* size)
|
|
265
|
+
* @returns The texture, or null when it cannot be created (a lost context)
|
|
266
|
+
*/
|
|
267
|
+
export function uploadRgbaTexture(gl, source, mipmap) {
|
|
268
|
+
const texture = gl.createTexture();
|
|
269
|
+
if (!texture)
|
|
270
|
+
return null;
|
|
271
|
+
const previousTexture = gl.getParameter(gl.TEXTURE_BINDING_2D);
|
|
272
|
+
const previousFlipY = gl.getParameter(gl.UNPACK_FLIP_Y_WEBGL) === true;
|
|
273
|
+
const previousPremultiply = gl.getParameter(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL) === true;
|
|
274
|
+
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, false);
|
|
275
|
+
gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, false);
|
|
276
|
+
gl.bindTexture(gl.TEXTURE_2D, texture);
|
|
277
|
+
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, source);
|
|
278
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
|
|
279
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
|
|
280
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
|
|
281
|
+
if (mipmap) {
|
|
282
|
+
gl.generateMipmap(gl.TEXTURE_2D);
|
|
283
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR);
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
|
|
287
|
+
}
|
|
288
|
+
gl.bindTexture(gl.TEXTURE_2D, previousTexture);
|
|
289
|
+
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, previousFlipY);
|
|
290
|
+
gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, previousPremultiply);
|
|
291
|
+
return texture;
|
|
292
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RenderCoordinator
|
|
3
|
+
*
|
|
4
|
+
* Subscribes to the Store and automatically triggers a repaint when the state changes.
|
|
5
|
+
* This removes the need for each mode to call requestRepaint() explicitly.
|
|
6
|
+
*/
|
|
7
|
+
import type { Map as MapLibreMap } from 'maplibre-gl';
|
|
8
|
+
import type { Store } from '../store/store.js';
|
|
9
|
+
/**
|
|
10
|
+
* Dependencies of RenderCoordinator
|
|
11
|
+
*/
|
|
12
|
+
export interface RenderCoordinatorDeps {
|
|
13
|
+
map: MapLibreMap;
|
|
14
|
+
store: Store;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* RenderCoordinator implementation
|
|
18
|
+
*/
|
|
19
|
+
export declare class RenderCoordinatorImpl implements RenderCoordinator {
|
|
20
|
+
private map;
|
|
21
|
+
private store;
|
|
22
|
+
private unsubscribe;
|
|
23
|
+
constructor(deps: RenderCoordinatorDeps);
|
|
24
|
+
start(): void;
|
|
25
|
+
stop(): void;
|
|
26
|
+
requestRender(): void;
|
|
27
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
/**
|
|
4
|
+
* Determines whether a change requires a repaint
|
|
5
|
+
*/
|
|
6
|
+
function shouldRepaint(changes) {
|
|
7
|
+
// A repaint is required if any of the following changed
|
|
8
|
+
return !!((changes.features || // creation, update or deletion of features
|
|
9
|
+
changes.layers || // layer changes
|
|
10
|
+
changes.groups || // group changes (reordering, show/hide)
|
|
11
|
+
changes.layerReorder || // reordering of items within a layer
|
|
12
|
+
changes.groupReorder || // reordering of features within a group
|
|
13
|
+
changes.selection || // selection state changes
|
|
14
|
+
changes.tentative || // changes to the transient state while drawing
|
|
15
|
+
changes.uiStateChanged) // changes to the UI state (dragState, boxSelection)
|
|
16
|
+
);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* RenderCoordinator implementation
|
|
20
|
+
*/
|
|
21
|
+
export class RenderCoordinatorImpl {
|
|
22
|
+
constructor(deps) {
|
|
23
|
+
Object.defineProperty(this, "map", {
|
|
24
|
+
enumerable: true,
|
|
25
|
+
configurable: true,
|
|
26
|
+
writable: true,
|
|
27
|
+
value: void 0
|
|
28
|
+
});
|
|
29
|
+
Object.defineProperty(this, "store", {
|
|
30
|
+
enumerable: true,
|
|
31
|
+
configurable: true,
|
|
32
|
+
writable: true,
|
|
33
|
+
value: void 0
|
|
34
|
+
});
|
|
35
|
+
Object.defineProperty(this, "unsubscribe", {
|
|
36
|
+
enumerable: true,
|
|
37
|
+
configurable: true,
|
|
38
|
+
writable: true,
|
|
39
|
+
value: null
|
|
40
|
+
});
|
|
41
|
+
this.map = deps.map;
|
|
42
|
+
this.store = deps.store;
|
|
43
|
+
}
|
|
44
|
+
start() {
|
|
45
|
+
// Do nothing if already subscribed
|
|
46
|
+
if (this.unsubscribe) {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
this.unsubscribe = this.store.subscribe((changes) => {
|
|
50
|
+
if (shouldRepaint(changes)) {
|
|
51
|
+
this.map.triggerRepaint();
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
stop() {
|
|
56
|
+
if (this.unsubscribe) {
|
|
57
|
+
this.unsubscribe();
|
|
58
|
+
this.unsubscribe = null;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
requestRender() {
|
|
62
|
+
this.map.triggerRepaint();
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Creates a RenderCoordinator
|
|
67
|
+
*
|
|
68
|
+
* @internal
|
|
69
|
+
*/
|
|
70
|
+
export function createRenderCoordinator(deps) {
|
|
71
|
+
return new RenderCoordinatorImpl(deps);
|
|
72
|
+
}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The extension point for companion rendering and companion hits (feature companion)
|
|
3
|
+
*
|
|
4
|
+
* A hook for the extension implementation to add "things that are not the feature itself,
|
|
5
|
+
* but that accompany the feature, are drawn at the same z position, and are grabbable in
|
|
6
|
+
* that same z order". core knows nothing at all about what a companion means (it only asks
|
|
7
|
+
* where they are with has, lets them draw with draw, asks for hits with hitTest, and hands
|
|
8
|
+
* a click that hit back to the provider).
|
|
9
|
+
*
|
|
10
|
+
* Rendering and hit testing are given to the same provider so that what is visible and
|
|
11
|
+
* what is grabbable agree (they are resolved at the same position in the z scan).
|
|
12
|
+
*
|
|
13
|
+
* Where they are called:
|
|
14
|
+
* - Rendering: immediately before the feature itself is drawn (= one step lower in the
|
|
15
|
+
* z order). core flushes the batch in progress before and after the call to keep z
|
|
16
|
+
* consistency
|
|
17
|
+
* - Hits: in the front-to-back scan of a click, immediately after the test of the feature
|
|
18
|
+
* itself misses and before moving on to the next (one step further back) feature
|
|
19
|
+
*
|
|
20
|
+
* `has` is called for every feature inside the per-frame z scan and the hit scan, so it
|
|
21
|
+
* must be O(1) (an index, or an O(1) derivation from the feature). As long as it returns
|
|
22
|
+
* false, no batch flush, no draw and no hitTest happen at all, and the conventional
|
|
23
|
+
* rendering efficiency and hit testing path are kept as they were.
|
|
24
|
+
*
|
|
25
|
+
* Unlike the extension points of auxiliary handles and the selection UI, there is one
|
|
26
|
+
* registry per draw instance (createFeatureCompanionRegistry). When several instances
|
|
27
|
+
* (the hidden renderers of printing and thumbnails) hold different Stores that have the
|
|
28
|
+
* same feature ids, the provider has no way to tell "is this a feature of my own Store?"
|
|
29
|
+
* (a replaced DocumentStore may return a new object from getFeature every time, so identity
|
|
30
|
+
* cannot be used), so ownership is expressed by separating the registries.
|
|
31
|
+
*/
|
|
32
|
+
import type { ProjectionData } from 'maplibre-gl';
|
|
33
|
+
import type { CustomRendererDrawContext } from '../extension/index.js';
|
|
34
|
+
import type { LngLat, ScreenPoint } from '../shared/math/index.js';
|
|
35
|
+
import type { Coordinate, Feature } from '../store/types.js';
|
|
36
|
+
/**
|
|
37
|
+
* A hit on a companion, as returned by {@link FeatureCompanionProvider.hitTest}.
|
|
38
|
+
*
|
|
39
|
+
* core does not interpret the contents. The provider puts its own identifier in and
|
|
40
|
+
* receives it back through `onCompanionClick`.
|
|
41
|
+
*/
|
|
42
|
+
export interface CompanionHit {
|
|
43
|
+
/** The identifier inside the provider */
|
|
44
|
+
id: string;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* The context passed to {@link FeatureCompanionProvider.hitTest}.
|
|
48
|
+
*
|
|
49
|
+
* A minimal structure holding the point being tested (screen px) plus the coordinate
|
|
50
|
+
* transform, the zoom and the click tolerance. The coordinate transform follows the same
|
|
51
|
+
* style as the context of auxiliary handles (AuxiliaryHandleContext)
|
|
52
|
+
* (geographic coordinates [lng, lat] <-> screen px).
|
|
53
|
+
*/
|
|
54
|
+
export interface CompanionHitContext {
|
|
55
|
+
/** The point being tested (screen px) */
|
|
56
|
+
point: ScreenPoint;
|
|
57
|
+
/** Geographic coordinates -> screen px */
|
|
58
|
+
project(lngLat: Coordinate): ScreenPoint;
|
|
59
|
+
/** Screen px -> geographic coordinates */
|
|
60
|
+
unproject(point: ScreenPoint): LngLat;
|
|
61
|
+
/** The current zoom level */
|
|
62
|
+
zoom: number;
|
|
63
|
+
/** The click tolerance (screen px; the same value as core's hit testing setting) */
|
|
64
|
+
tolerancePx: number;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Draws something that accompanies a feature (a label, a callout) right below it in the
|
|
68
|
+
* draw order, and makes it clickable in the same order.
|
|
69
|
+
*
|
|
70
|
+
* Register one with `draw.registerFeatureCompanionProvider(provider)`. What is drawn and what
|
|
71
|
+
* is hit are resolved at the same position of the z order, so what is visible is what can be
|
|
72
|
+
* grabbed. A click on a companion does not change the selection; it is handed to
|
|
73
|
+
* `onCompanionClick`.
|
|
74
|
+
*/
|
|
75
|
+
export interface FeatureCompanionProvider {
|
|
76
|
+
/** An identifier unique within the registry (re-registering with the same id overwrites) */
|
|
77
|
+
id: string;
|
|
78
|
+
/**
|
|
79
|
+
* Whether this feature has companions.
|
|
80
|
+
*
|
|
81
|
+
* It is called for every feature in the per-frame z scan and the hit scan, so it must
|
|
82
|
+
* be O(1).
|
|
83
|
+
*/
|
|
84
|
+
has(feature: Feature): boolean;
|
|
85
|
+
/**
|
|
86
|
+
* Called immediately before the feature itself (= one z step lower).
|
|
87
|
+
*
|
|
88
|
+
* core flushes the batch in progress before and after the call, so what is drawn always
|
|
89
|
+
* comes below this feature and above the feature one step further back.
|
|
90
|
+
*/
|
|
91
|
+
draw(feature: Feature, projectionData: ProjectionData, zoom: number, context: CustomRendererDrawContext): void;
|
|
92
|
+
/**
|
|
93
|
+
* Called in the z scan of click resolution, after the feature itself misses and before
|
|
94
|
+
* the next feature.
|
|
95
|
+
*
|
|
96
|
+
* If it returns a hit, core consumes that click (it does not change the selection state,
|
|
97
|
+
* nor does it clear the selection as an empty click would) and calls
|
|
98
|
+
* `onCompanionClick`.
|
|
99
|
+
*/
|
|
100
|
+
hitTest(feature: Feature, point: ScreenPoint, context: CompanionHitContext): CompanionHit | null;
|
|
101
|
+
/**
|
|
102
|
+
* The notification of a consumed click.
|
|
103
|
+
*
|
|
104
|
+
* @param featureId The ID of the feature that owns the companion
|
|
105
|
+
* @param hit The hit returned by hitTest
|
|
106
|
+
*/
|
|
107
|
+
onCompanionClick(featureId: string, hit: CompanionHit): void;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* A companion hit resolved in the z scan, with the provider and the feature it belongs to.
|
|
111
|
+
*/
|
|
112
|
+
export interface FeatureCompanionHitResult {
|
|
113
|
+
/** The id of the provider that returned the hit */
|
|
114
|
+
providerId: string;
|
|
115
|
+
/** The id of the feature that owns the companion */
|
|
116
|
+
featureId: string;
|
|
117
|
+
/** The hit as the provider returned it */
|
|
118
|
+
hit: CompanionHit;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* The registered {@link FeatureCompanionProvider}s of one draw instance.
|
|
122
|
+
*
|
|
123
|
+
* One is held per draw instance. It has the same scope as the renderers of custom type
|
|
124
|
+
* features (customLayer.registerFeatureRenderer), so the providers of other instances
|
|
125
|
+
* (the hidden renderers of printing, thumbnails and previews) do not get mixed in.
|
|
126
|
+
*
|
|
127
|
+
* It must not be made a module-level singleton. A provider closes over its own Store, and
|
|
128
|
+
* feature IDs agree across several instances when the document is the same, so sharing it
|
|
129
|
+
* would draw things twice with the geometry of another instance's Store. The provider
|
|
130
|
+
* cannot tell "is this my own feature?" (depending on the Store implementation, getFeature
|
|
131
|
+
* builds a different object every time, so object identity cannot be used). Ownership is
|
|
132
|
+
* expressed by separating the registries.
|
|
133
|
+
*/
|
|
134
|
+
export interface FeatureCompanionRegistry {
|
|
135
|
+
/**
|
|
136
|
+
* Registers a provider
|
|
137
|
+
*
|
|
138
|
+
* @returns The function that cancels the registration (calling it after a re-registration
|
|
139
|
+
* with the same id does not remove the provider that came in later)
|
|
140
|
+
*/
|
|
141
|
+
register(provider: FeatureCompanionProvider): () => void;
|
|
142
|
+
/** Gets a registered provider by id */
|
|
143
|
+
get(id: string): FeatureCompanionProvider | undefined;
|
|
144
|
+
/** Enumerates the registered providers (in registration order) */
|
|
145
|
+
list(): FeatureCompanionProvider[];
|
|
146
|
+
/**
|
|
147
|
+
* Whether even one provider is registered
|
|
148
|
+
*
|
|
149
|
+
* An O(1) early exit looked at once at the entrance of a scan. If false, the path is the
|
|
150
|
+
* conventional one.
|
|
151
|
+
*/
|
|
152
|
+
any(): boolean;
|
|
153
|
+
/**
|
|
154
|
+
* The generation number (for deciding cache invalidation)
|
|
155
|
+
*
|
|
156
|
+
* It increases on every registration and cancellation. The cache of retained mode
|
|
157
|
+
* (view/layer/store-retained) caches the classification that "cuts features having
|
|
158
|
+
* companions out into the immediate rendering run", and that classification can change
|
|
159
|
+
* as registrations come and go. Watch the generation number change and discard the cache.
|
|
160
|
+
*/
|
|
161
|
+
generation(): number;
|
|
162
|
+
/** Cancels all registrations */
|
|
163
|
+
clear(): void;
|
|
164
|
+
/** Whether there is a provider that has companions for this feature */
|
|
165
|
+
has(feature: Feature): boolean;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Creates an empty {@link FeatureCompanionRegistry}, for testing a provider in isolation.
|
|
169
|
+
* Each draw instance holds its own; do not share one between instances.
|
|
170
|
+
*
|
|
171
|
+
* @returns A new registry with no provider
|
|
172
|
+
*/
|
|
173
|
+
export declare function createFeatureCompanionRegistry(): FeatureCompanionRegistry;
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 SAKAIDA Atsushi
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
/**
|
|
4
|
+
* Creates an empty {@link FeatureCompanionRegistry}, for testing a provider in isolation.
|
|
5
|
+
* Each draw instance holds its own; do not share one between instances.
|
|
6
|
+
*
|
|
7
|
+
* @returns A new registry with no provider
|
|
8
|
+
*/
|
|
9
|
+
export function createFeatureCompanionRegistry() {
|
|
10
|
+
const providers = new Map();
|
|
11
|
+
let generation = 0;
|
|
12
|
+
return {
|
|
13
|
+
register(provider) {
|
|
14
|
+
providers.set(provider.id, provider);
|
|
15
|
+
generation++;
|
|
16
|
+
return () => {
|
|
17
|
+
if (providers.get(provider.id) === provider) {
|
|
18
|
+
providers.delete(provider.id);
|
|
19
|
+
generation++;
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
},
|
|
23
|
+
get: (id) => providers.get(id),
|
|
24
|
+
list: () => [...providers.values()],
|
|
25
|
+
any: () => providers.size > 0,
|
|
26
|
+
generation: () => generation,
|
|
27
|
+
clear() {
|
|
28
|
+
if (providers.size === 0)
|
|
29
|
+
return;
|
|
30
|
+
providers.clear();
|
|
31
|
+
generation++;
|
|
32
|
+
},
|
|
33
|
+
has(feature) {
|
|
34
|
+
if (providers.size === 0)
|
|
35
|
+
return false;
|
|
36
|
+
for (const provider of providers.values()) {
|
|
37
|
+
if (provider.has(feature))
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
return false;
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Draws the things accompanying a feature after closing the batch frame (registration order)
|
|
46
|
+
*
|
|
47
|
+
* A batch is not painted until endFrame, so without a flush here the companions would be
|
|
48
|
+
* drawn before the features further back within the same layer (the same reason as the
|
|
49
|
+
* immediate rendering of custom type features). Once drawing is done, the frame is opened
|
|
50
|
+
* again for the features that follow.
|
|
51
|
+
*
|
|
52
|
+
* For features without companions, neither endFrame nor beginFrame is called. As long as
|
|
53
|
+
* has is false, the conventional batching efficiency is not harmed at all.
|
|
54
|
+
*
|
|
55
|
+
* @param restoreBlendState Restores the blend state that an external renderer may have
|
|
56
|
+
* rewritten (if omitted, nothing is restored)
|
|
57
|
+
* @returns Whether even one thing was drawn
|
|
58
|
+
*
|
|
59
|
+
* @internal
|
|
60
|
+
*/
|
|
61
|
+
export function drawFeatureCompanionsInFrame(registry, feature, batch, projectionData, zoom, layer, context, restoreBlendState) {
|
|
62
|
+
if (!registry.any())
|
|
63
|
+
return false;
|
|
64
|
+
let drawn = false;
|
|
65
|
+
for (const provider of registry.list()) {
|
|
66
|
+
if (!provider.has(feature))
|
|
67
|
+
continue;
|
|
68
|
+
if (!drawn) {
|
|
69
|
+
batch.endFrame();
|
|
70
|
+
drawn = true;
|
|
71
|
+
}
|
|
72
|
+
provider.draw(feature, projectionData, zoom, context);
|
|
73
|
+
}
|
|
74
|
+
if (drawn) {
|
|
75
|
+
restoreBlendState?.();
|
|
76
|
+
batch.beginFrame(projectionData, zoom, layer);
|
|
77
|
+
}
|
|
78
|
+
return drawn;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Asks for hits on the things accompanying a feature (registration order; returns the
|
|
82
|
+
* first one that hits)
|
|
83
|
+
*
|
|
84
|
+
* @internal
|
|
85
|
+
*/
|
|
86
|
+
export function hitTestFeatureCompanions(registry, feature, context) {
|
|
87
|
+
if (!registry.any())
|
|
88
|
+
return null;
|
|
89
|
+
for (const provider of registry.list()) {
|
|
90
|
+
if (!provider.has(feature))
|
|
91
|
+
continue;
|
|
92
|
+
const hit = provider.hitTest(feature, context.point, context);
|
|
93
|
+
if (hit)
|
|
94
|
+
return { providerId: provider.id, featureId: feature.id, hit };
|
|
95
|
+
}
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Hands a consumed click back to the provider
|
|
100
|
+
*
|
|
101
|
+
* If the provider has already been unregistered, nothing happens (the click stays
|
|
102
|
+
* consumed and the selection state does not change).
|
|
103
|
+
*
|
|
104
|
+
* @internal
|
|
105
|
+
*/
|
|
106
|
+
export function notifyFeatureCompanionClick(registry, result) {
|
|
107
|
+
registry.get(result.providerId)?.onCompanionClick(result.featureId, result.hit);
|
|
108
|
+
}
|