@jax-data-science/sci-image-visualizer 0.8.3 → 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 +201 -460
- package/esm2022/index.mjs +34 -15
- package/esm2022/lib/channel-histogram/channel-histogram.component.mjs +163 -91
- package/esm2022/lib/contracts/capabilities.contract.mjs +4 -3
- package/esm2022/lib/contracts/cell-segmenter.contract.mjs +1 -1
- package/esm2022/lib/contracts/channel-histogram-api.contract.mjs +5 -1
- package/esm2022/lib/contracts/color.mjs +60 -0
- package/esm2022/lib/contracts/colormap-lut.mjs +213 -57
- package/esm2022/lib/contracts/coordinate-transform.contract.mjs +1 -1
- package/esm2022/lib/contracts/display-types.mjs +11 -1
- package/esm2022/lib/contracts/image.contract.mjs +1 -1
- package/esm2022/lib/contracts/instance-segmenter.contract.mjs +1 -1
- package/esm2022/lib/contracts/intensity.mjs +48 -5
- package/esm2022/lib/contracts/plot-type-contribution.contract.mjs +1 -1
- package/esm2022/lib/contracts/plot-type.mjs +134 -17
- package/esm2022/lib/contracts/ports/image-state.port.mjs +4 -1
- package/esm2022/lib/contracts/ports/preferences.port.mjs +5 -1
- package/esm2022/lib/contracts/ports/region-io.port.mjs +2 -1
- package/esm2022/lib/contracts/ports/spatial-data.port.mjs +5 -1
- package/esm2022/lib/contracts/ports/tile-access.port.mjs +2 -1
- package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
- package/esm2022/lib/contracts/region-overlay.contract.mjs +1 -1
- package/esm2022/lib/contracts/region-store.contract.mjs +1 -1
- package/esm2022/lib/contracts/sam.contract.mjs +1 -1
- package/esm2022/lib/contracts/section-view.contract.mjs +2 -0
- package/esm2022/lib/contracts/semantic-segmenter.contract.mjs +1 -1
- package/esm2022/lib/contracts/spatial-dataset.contract.mjs +3 -1
- package/esm2022/lib/contracts/toolbar-tool.contract.mjs +6 -4
- package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
- package/esm2022/lib/contracts/viz-config.mjs +2 -1
- package/esm2022/lib/geometry/contour.mjs +63 -0
- package/esm2022/lib/geometry/loft.mjs +128 -0
- package/esm2022/lib/geometry/polylabel.mjs +156 -0
- package/esm2022/lib/geometry/raster.mjs +98 -0
- package/esm2022/lib/geometry/reconstruct.mjs +315 -0
- package/esm2022/lib/geometry/reslice-image.mjs +57 -0
- package/esm2022/lib/geometry/ring.mjs +201 -0
- package/esm2022/lib/geometry/section.mjs +215 -0
- package/esm2022/lib/hex-color-picker/hex-color-picker.component.mjs +202 -102
- package/esm2022/lib/implementations/base-store-visualizer.mjs +201 -48
- package/esm2022/lib/implementations/napari-js/napari-axes-gizmo.mjs +65 -0
- package/esm2022/lib/implementations/napari-js/napari-display-state.mjs +136 -0
- package/esm2022/lib/implementations/napari-js/napari-helpers.mjs +199 -0
- package/esm2022/lib/implementations/napari-js/napari-image-2d-scene.mjs +602 -0
- package/esm2022/lib/implementations/napari-js/napari-loading-badge.mjs +12 -9
- package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +83 -0
- package/esm2022/lib/implementations/napari-js/napari-region-mesh-pointer.mjs +100 -0
- package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +180 -591
- package/esm2022/lib/implementations/napari-js/napari-scene.mjs +2 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +614 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +769 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-encoding.mjs +199 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-hover.mjs +270 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +159 -0
- package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +106 -1408
- package/esm2022/lib/implementations/napari-js/napari-spatial-tooltip.mjs +2 -2
- package/esm2022/lib/implementations/napari-js/napari-surface-scene.mjs +271 -0
- package/esm2022/lib/implementations/napari-js/napari-tile-client.mjs +562 -0
- package/esm2022/lib/implementations/napari-js/napari-tool-bridge.mjs +347 -0
- package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +427 -4207
- package/esm2022/lib/implementations/napari-js/napari-volume-region-meshes.mjs +129 -0
- package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +550 -0
- package/esm2022/lib/implementations/napari-js/napari-volume-slice-planes.mjs +103 -0
- package/esm2022/lib/implementations/napari-js/napari-volume-z-handle.mjs +6 -6
- package/esm2022/lib/implementations/napari-js/region-overlay/overlay-projection.mjs +96 -0
- package/esm2022/lib/implementations/napari-js/region-overlay/region-edit.mjs +35 -0
- package/esm2022/lib/implementations/napari-js/region-overlay/region-svg-renderer.mjs +194 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/categorical-lookup.mjs +30 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +274 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/density-layer.mjs +144 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/layer-groups.mjs +165 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/plan-context.mjs +78 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-hover.mjs +182 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-jobs.mjs +369 -0
- package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +306 -0
- package/esm2022/lib/implementations/osd/display-pipeline.mjs +102 -40
- package/esm2022/lib/implementations/osd/histogram-sampler.mjs +56 -31
- package/esm2022/lib/implementations/osd/openseadragon-viewer-options.mjs +128 -0
- package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +333 -1685
- package/esm2022/lib/implementations/osd/osd-coordinate-transform.mjs +1 -1
- package/esm2022/lib/implementations/osd/osd-coords.mjs +5 -6
- package/esm2022/lib/implementations/osd/osd-export.mjs +122 -0
- package/esm2022/lib/implementations/osd/osd-lib.mjs +15 -1
- package/esm2022/lib/implementations/osd/osd-navigator-chrome.mjs +205 -0
- package/esm2022/lib/implementations/osd/osd-pixel-readback.mjs +68 -0
- package/esm2022/lib/implementations/osd/osd-region-overlay-draw.mjs +164 -0
- package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +213 -716
- package/esm2022/lib/implementations/osd/osd-scale-bar.mjs +52 -60
- package/esm2022/lib/implementations/osd/osd-tile-source.mjs +105 -0
- package/esm2022/lib/implementations/osd/osd-viewer-like.mjs +2 -0
- package/esm2022/lib/implementations/osd/osd-viewer-mount.mjs +44 -0
- package/esm2022/lib/implementations/osd/osd-viewport.mjs +184 -0
- package/esm2022/lib/implementations/osd/osd-zoom.mjs +7 -1
- package/esm2022/lib/implementations/osd/simple-source.mjs +395 -0
- package/esm2022/lib/implementations/osd/slice-cache.mjs +53 -48
- package/esm2022/lib/implementations/osd/tile-client.mjs +32 -11
- package/esm2022/lib/implementations/osd/tile-recolor.mjs +330 -0
- package/esm2022/lib/implementations/plotly/omics-trace-builders.mjs +161 -73
- package/esm2022/lib/implementations/plotly/plotly-coordinate-transform.mjs +1 -1
- package/esm2022/lib/implementations/plotly/plotly-image-loader.mjs +112 -0
- package/esm2022/lib/implementations/plotly/plotly-image-recolor.mjs +178 -0
- package/esm2022/lib/implementations/plotly/plotly-intensity-inset.mjs +33 -0
- package/esm2022/lib/implementations/plotly/plotly-isosurface-controls.mjs +83 -0
- package/esm2022/lib/implementations/plotly/plotly-layouts.mjs +121 -0
- package/esm2022/lib/implementations/plotly/plotly-readback.mjs +117 -0
- package/esm2022/lib/implementations/plotly/plotly-region-overlay.mjs +19 -10
- package/esm2022/lib/implementations/plotly/plotly-shape-projection.mjs +223 -0
- package/esm2022/lib/implementations/plotly/plotly-trace-builders.mjs +79 -19
- package/esm2022/lib/implementations/plotly/plotly-zoom-controller.mjs +223 -0
- package/esm2022/lib/implementations/plotly/plotly.service.mjs +439 -1655
- package/esm2022/lib/implementations/region-centroids.mjs +47 -0
- package/esm2022/lib/implementations/simple-slice-access.service.mjs +22 -12
- package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +172 -92
- package/esm2022/lib/implementations/spatial-data-http/spatial-wire.mjs +103 -22
- package/esm2022/lib/implementations/tile-server/index.mjs +6 -0
- package/esm2022/lib/implementations/tile-server/native-histogram.mjs +30 -0
- package/esm2022/lib/implementations/tile-server/poll-descriptor.mjs +65 -0
- package/esm2022/lib/implementations/tile-server/tile-protocol.mjs +42 -0
- package/esm2022/lib/implementations/tile-server/transport.mjs +135 -0
- package/esm2022/lib/intensity/intensity-profile.mjs +107 -0
- package/esm2022/lib/intensity/intensity-profile.service.mjs +223 -0
- package/esm2022/lib/intensity-inset/intensity-inset.component.mjs +133 -0
- package/esm2022/lib/models/bezier.mjs +1 -11
- package/esm2022/lib/models/class-preset.mjs +41 -3
- package/esm2022/lib/models/geometry.mjs +27 -164
- package/esm2022/lib/models/polygon-edit.mjs +254 -0
- package/esm2022/lib/models/polygon-factory.mjs +134 -0
- package/esm2022/lib/models/region-clone.mjs +68 -0
- package/esm2022/lib/models/region-geojson.mjs +411 -0
- package/esm2022/lib/models/region.mjs +34 -33
- package/esm2022/lib/models/shape.mjs +18 -16
- package/esm2022/lib/plot-mode/contribution-host.mjs +297 -0
- package/esm2022/lib/plot-mode/plot-mode-controller.mjs +9 -6
- package/esm2022/lib/plot-mode/plot-type-menu.mjs +85 -0
- package/esm2022/lib/plot-mode/tool-params-model.mjs +87 -0
- package/esm2022/lib/plot.utilities.mjs +296 -473
- package/esm2022/lib/processing/image-crop.mjs +1 -1
- package/esm2022/lib/processing/processing-image.mjs +28 -15
- package/esm2022/lib/provide-visualization.mjs +40 -14
- package/esm2022/lib/region-editor/class-tree/class-tree.component.mjs +156 -0
- package/esm2022/lib/region-editor/class-tree/class-tree.mjs +108 -0
- package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +163 -0
- package/esm2022/lib/region-editor/file-stem.mjs +13 -0
- package/esm2022/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.mjs +118 -0
- package/esm2022/lib/region-editor/mask-export.service.mjs +98 -0
- package/esm2022/lib/region-editor/mask-raster.mjs +11 -5
- package/esm2022/lib/region-editor/region-color-dialog/region-color-dialog.component.mjs +56 -0
- package/esm2022/lib/region-editor/region-editor-help/region-editor-help.component.mjs +28 -0
- package/esm2022/lib/region-editor/region-editor.component.mjs +896 -660
- package/esm2022/lib/region-editor/region-metrics.mjs +86 -0
- package/esm2022/lib/region-editor/region-persistence.service.mjs +160 -0
- package/esm2022/lib/region-editor/region-table/region-table.component.mjs +169 -0
- package/esm2022/lib/region-editor/save-mask-dialog/save-mask-dialog.component.mjs +91 -0
- package/esm2022/lib/region-editor/save-regions-dialog/save-regions-dialog.component.mjs +92 -0
- package/esm2022/lib/region-ops.service.mjs +28 -70
- package/esm2022/lib/region-overlay/region-geometry.mjs +360 -0
- package/esm2022/lib/region-overlay/region-hit-test.mjs +103 -0
- package/esm2022/lib/region-overlay/region-source-layer.mjs +378 -0
- package/esm2022/lib/region-overlay/region-style.mjs +97 -0
- package/esm2022/lib/region-overlay/svg-region-renderer.mjs +228 -0
- package/esm2022/lib/region-source/http-region-source.mjs +104 -0
- package/esm2022/lib/region-source/region-source-ops.mjs +53 -0
- package/esm2022/lib/region-source/region-source-worker.mjs +10 -0
- package/esm2022/lib/region-source/region-source.mjs +67 -0
- package/esm2022/lib/region-source/region-tiles.mjs +708 -0
- package/esm2022/lib/region-source/worker-region-source.mjs +229 -0
- package/esm2022/lib/render-orchestrator.mjs +14 -11
- package/esm2022/lib/render-session.mjs +207 -0
- package/esm2022/lib/routing-visualizer.service.mjs +858 -414
- package/esm2022/lib/section-pane/section-pane.component.mjs +299 -0
- package/esm2022/lib/spatial/density-raster.mjs +14 -0
- package/esm2022/lib/spatial/embedding-compute-coordinator.mjs +239 -0
- package/esm2022/lib/spatial/embedding-compute.mjs +43 -10
- package/esm2022/lib/spatial/gene-search.mjs +1 -1
- package/esm2022/lib/spatial/glyphs.mjs +97 -0
- package/esm2022/lib/spatial/lod.mjs +187 -0
- package/esm2022/lib/spatial/spatial-controls.facade.mjs +200 -0
- package/esm2022/lib/spatial/spatial-density.mjs +25 -16
- package/esm2022/lib/spatial/spatial-encoding.mjs +26 -82
- package/esm2022/lib/spatial/spatial-expression.mjs +43 -42
- package/esm2022/lib/spatial/spatial-framing.mjs +1 -1
- package/esm2022/lib/spatial/spatial-heatmap.mjs +6 -3
- package/esm2022/lib/spatial/spatial-hover.mjs +5 -33
- package/esm2022/lib/spatial/spatial-panel-model.mjs +282 -0
- package/esm2022/lib/spatial/spatial-sections.mjs +1 -1
- package/esm2022/lib/spatial/spatial-selection.mjs +33 -46
- package/esm2022/lib/spatial/spatial-tile-merge.mjs +219 -0
- package/esm2022/lib/spatial/spatial-tiles.mjs +12 -648
- package/esm2022/lib/spatial/spatial-volume-image.mjs +2 -4
- package/esm2022/lib/spatial/stats.mjs +71 -0
- package/esm2022/lib/spatial/transcript-grouping.mjs +307 -0
- package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +150 -0
- package/esm2022/lib/spatial-controls/spatial-charts/chart-data-model.mjs +309 -0
- package/esm2022/lib/spatial-controls/spatial-charts/chart-help.mjs +145 -0
- package/esm2022/lib/spatial-controls/spatial-charts/plotly-chart-host.mjs +158 -0
- package/esm2022/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.mjs +47 -0
- package/esm2022/lib/spatial-controls/spatial-charts/spatial-charts.component.mjs +297 -802
- package/esm2022/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.mjs +89 -0
- package/esm2022/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.mjs +52 -0
- package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +143 -1238
- package/esm2022/lib/spatial-controls/spatial-gene-picker.mjs +153 -0
- package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +241 -0
- package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +193 -0
- package/esm2022/lib/spatial-controls/spatial-key/spatial-key.component.mjs +132 -0
- package/esm2022/lib/spatial-controls/spatial-key/spatial-key.model.mjs +67 -0
- package/esm2022/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.mjs +147 -0
- package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +300 -0
- package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +370 -0
- package/esm2022/lib/store/class-color.util.mjs +53 -5
- package/esm2022/lib/store/class-signatures.mjs +63 -0
- package/esm2022/lib/store/region-history.mjs +146 -0
- package/esm2022/lib/store/region-scope-cache.mjs +144 -0
- package/esm2022/lib/store/region-selection.mjs +82 -0
- package/esm2022/lib/store/region-source-scope.mjs +171 -0
- package/esm2022/lib/store/region-store.service.mjs +986 -670
- package/esm2022/lib/store/spatial-selection.service.mjs +2 -2
- package/esm2022/lib/store/visualizer-store.service.mjs +81 -76
- package/esm2022/lib/toast-outlets.mjs +5 -4
- package/esm2022/lib/toolbar/brush/brush-tool.service.mjs +92 -434
- package/esm2022/lib/toolbar/canvas-tools.mjs +20 -0
- package/esm2022/lib/toolbar/crop/slide-crop.mjs +26 -42
- package/esm2022/lib/toolbar/plot-type-selector/plot-type-selector.component.mjs +85 -0
- package/esm2022/lib/toolbar/region-tools/region-tool-buttons.mjs +74 -0
- package/esm2022/lib/toolbar/region-tools/region-tools.component.mjs +120 -0
- package/esm2022/lib/toolbar/segmentation/cell-segment-tool.service.mjs +74 -78
- package/esm2022/lib/toolbar/segmentation/cellpose-segmenter.service.mjs +50 -8
- package/esm2022/lib/toolbar/segmentation/onnx-sam-session.mjs +61 -42
- package/esm2022/lib/toolbar/segmentation/pending-calls.mjs +47 -0
- package/esm2022/lib/toolbar/segmentation/sam-model-registry.mjs +12 -4
- package/esm2022/lib/toolbar/segmentation/sam-onnx-core.mjs +70 -14
- package/esm2022/lib/toolbar/segmentation/sam-point-tool.service.mjs +135 -172
- package/esm2022/lib/toolbar/segmentation/sam-prompt.mjs +9 -90
- package/esm2022/lib/toolbar/segmentation/sam-session.service.mjs +183 -0
- package/esm2022/lib/toolbar/segmentation/sam-tool.service.mjs +95 -150
- package/esm2022/lib/toolbar/segmentation/segmentation-commit.mjs +12 -0
- package/esm2022/lib/toolbar/segmentation/segmentation-runner.mjs +108 -0
- package/esm2022/lib/toolbar/segmentation-tools/segmentation-tools.component.mjs +155 -0
- package/esm2022/lib/toolbar/stack-controls/stack-controls.component.mjs +121 -0
- package/esm2022/lib/toolbar/tool-kit/async-tool-status.mjs +37 -0
- package/esm2022/lib/toolbar/tool-kit/canvas-tool-manager.mjs +63 -0
- package/esm2022/lib/toolbar/tool-kit/canvas-tool.mjs +2 -0
- package/esm2022/lib/toolbar/tool-kit/frame-pixels.mjs +108 -0
- package/esm2022/lib/toolbar/tool-kit/mask-stroke-editor.mjs +306 -0
- package/esm2022/lib/toolbar/tool-kit/matrix-frame.mjs +61 -0
- package/esm2022/lib/toolbar/tool-kit/tool-overlay.mjs +140 -0
- package/esm2022/lib/toolbar/tool-kit/undo-gesture.mjs +24 -0
- package/esm2022/lib/toolbar/tool-slider/tool-slider.component.mjs +63 -0
- package/esm2022/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.mjs +50 -0
- package/esm2022/lib/toolbar/toolbar.component.mjs +84 -119
- package/esm2022/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.mjs +93 -115
- package/esm2022/lib/toolbar/view-controls/view-controls.component.mjs +107 -0
- package/esm2022/lib/toolbar/wand/wand-region-grow.mjs +321 -0
- package/esm2022/lib/toolbar/wand/wand-tool.service.mjs +121 -416
- package/esm2022/lib/toolbar/wand/wand.service.mjs +30 -894
- package/esm2022/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.mjs +48 -90
- package/esm2022/lib/util/mark-for-check.mjs +17 -0
- package/esm2022/lib/util/supersede.mjs +56 -0
- package/esm2022/lib/visualization.module.mjs +39 -141
- package/esm2022/lib/visualizer/floating-drag.directive.mjs +58 -0
- package/esm2022/lib/visualizer/region-actions.mjs +149 -0
- package/esm2022/lib/visualizer/region-load.mjs +123 -0
- package/esm2022/lib/visualizer/spatial-dataset-binder.mjs +163 -0
- package/esm2022/lib/visualizer/tool-modes.mjs +113 -0
- package/esm2022/lib/visualizer/viewer-shortcuts.mjs +167 -0
- package/esm2022/lib/visualizer/visualizer-context-menu.mjs +119 -0
- package/esm2022/lib/visualizer/volume-sections.mjs +175 -0
- package/esm2022/lib/visualizer.component.mjs +602 -1902
- package/esm2022/lib/workers/spatial-math-ops.mjs +43 -0
- package/esm2022/lib/workers/spatial-math-worker.mjs +10 -0
- package/esm2022/lib/workers/spatial-math.mjs +190 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BKQhpbHv.mjs +47169 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-BKQhpbHv.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-z1IN-F7w.mjs +238 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-z1IN-F7w.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-region-source-worker-CAqBjM5L.mjs +12 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-region-source-worker-CAqBjM5L.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs +12 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs +41 -34467
- package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -1
- package/fesm2022/mask.worker.js +36 -917
- package/fesm2022/onnx-sam.worker.js +52 -16
- package/fesm2022/region-source.worker.js +1067 -0
- package/fesm2022/spatial-math.worker.js +471 -0
- package/fesm2022/tsne.worker.js +32 -15
- package/index.d.ts +19 -10
- package/lib/channel-histogram/channel-histogram.component.d.ts +53 -43
- package/lib/contracts/capabilities.contract.d.ts +4 -2
- package/lib/contracts/cell-segmenter.contract.d.ts +1 -0
- package/lib/contracts/channel-histogram-api.contract.d.ts +4 -0
- package/lib/contracts/color.d.ts +27 -0
- package/lib/contracts/colormap-lut.d.ts +19 -4
- package/lib/contracts/coordinate-transform.contract.d.ts +3 -3
- package/lib/contracts/display-types.d.ts +21 -0
- package/lib/contracts/image.contract.d.ts +4 -0
- package/lib/contracts/instance-segmenter.contract.d.ts +5 -0
- package/lib/contracts/intensity.d.ts +13 -2
- package/lib/contracts/plot-type.d.ts +3 -1
- package/lib/contracts/ports/image-state.port.d.ts +6 -2
- package/lib/contracts/ports/preferences.port.d.ts +4 -0
- package/lib/contracts/ports/region-io.port.d.ts +1 -0
- package/lib/contracts/ports/spatial-data.port.d.ts +4 -10
- package/lib/contracts/ports/tile-access.port.d.ts +1 -0
- package/lib/contracts/region-editor-api.contract.d.ts +85 -1
- package/lib/contracts/region-overlay.contract.d.ts +5 -0
- package/lib/contracts/region-store.contract.d.ts +22 -0
- package/lib/contracts/sam.contract.d.ts +7 -0
- package/lib/contracts/section-view.contract.d.ts +44 -0
- package/lib/contracts/semantic-segmenter.contract.d.ts +6 -0
- package/lib/contracts/spatial-dataset.contract.d.ts +19 -6
- package/lib/contracts/toolbar-tool.contract.d.ts +1 -0
- package/lib/contracts/visualizer.contract.d.ts +231 -54
- package/lib/contracts/viz-config.d.ts +9 -0
- package/lib/geometry/contour.d.ts +24 -0
- package/lib/geometry/loft.d.ts +22 -0
- package/lib/geometry/polylabel.d.ts +23 -0
- package/lib/geometry/raster.d.ts +42 -0
- package/lib/geometry/reconstruct.d.ts +54 -0
- package/lib/geometry/reslice-image.d.ts +33 -0
- package/lib/geometry/ring.d.ts +67 -0
- package/lib/geometry/section.d.ts +52 -0
- package/lib/hex-color-picker/hex-color-picker.component.d.ts +61 -27
- package/lib/implementations/base-store-visualizer.d.ts +61 -15
- package/lib/implementations/napari-js/napari-axes-gizmo.d.ts +36 -0
- package/lib/implementations/napari-js/napari-display-state.d.ts +76 -0
- package/lib/implementations/napari-js/napari-helpers.d.ts +129 -0
- package/lib/implementations/napari-js/napari-image-2d-scene.d.ts +162 -0
- package/lib/implementations/napari-js/napari-loading-badge.d.ts +4 -3
- package/lib/implementations/napari-js/napari-loading-state.d.ts +37 -0
- package/lib/implementations/napari-js/napari-region-mesh-pointer.d.ts +32 -0
- package/lib/implementations/napari-js/napari-region-overlay.d.ts +68 -71
- package/lib/implementations/napari-js/napari-scene.d.ts +126 -0
- package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +163 -0
- package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +212 -0
- package/lib/implementations/napari-js/napari-spatial-encoding.d.ts +114 -0
- package/lib/implementations/napari-js/napari-spatial-hover.d.ts +91 -0
- package/lib/implementations/napari-js/napari-spatial-scene.d.ts +118 -0
- package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +56 -263
- package/lib/implementations/napari-js/napari-spatial-tooltip.d.ts +1 -1
- package/lib/implementations/napari-js/napari-surface-scene.d.ts +76 -0
- package/lib/implementations/napari-js/napari-tile-client.d.ts +214 -0
- package/lib/implementations/napari-js/napari-tool-bridge.d.ts +179 -0
- package/lib/implementations/napari-js/napari-visualizer.service.d.ts +169 -883
- package/lib/implementations/napari-js/napari-volume-region-meshes.d.ts +66 -0
- package/lib/implementations/napari-js/napari-volume-scene.d.ts +148 -0
- package/lib/implementations/napari-js/napari-volume-slice-planes.d.ts +43 -0
- package/lib/implementations/napari-js/napari-volume-z-handle.d.ts +8 -12
- package/lib/implementations/napari-js/region-overlay/overlay-projection.d.ts +59 -0
- package/lib/implementations/napari-js/region-overlay/region-edit.d.ts +15 -0
- package/lib/implementations/napari-js/region-overlay/region-svg-renderer.d.ts +54 -0
- package/lib/implementations/napari-js/spatial-tiles/categorical-lookup.d.ts +26 -0
- package/lib/implementations/napari-js/spatial-tiles/cell-layers.d.ts +70 -0
- package/lib/implementations/napari-js/spatial-tiles/density-layer.d.ts +61 -0
- package/lib/implementations/napari-js/spatial-tiles/layer-groups.d.ts +67 -0
- package/lib/implementations/napari-js/spatial-tiles/plan-context.d.ts +38 -0
- package/lib/implementations/napari-js/spatial-tiles/transcript-hover.d.ts +71 -0
- package/lib/implementations/napari-js/spatial-tiles/transcript-jobs.d.ts +105 -0
- package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +56 -0
- package/lib/implementations/osd/display-pipeline.d.ts +38 -9
- package/lib/implementations/osd/histogram-sampler.d.ts +22 -12
- package/lib/implementations/osd/openseadragon-viewer-options.d.ts +35 -0
- package/lib/implementations/osd/openseadragon-visualizer.service.d.ts +78 -354
- package/lib/implementations/osd/osd-coordinate-transform.d.ts +2 -1
- package/lib/implementations/osd/osd-coords.d.ts +6 -4
- package/lib/implementations/osd/osd-export.d.ts +36 -0
- package/lib/implementations/osd/osd-lib.d.ts +7 -0
- package/lib/implementations/osd/osd-navigator-chrome.d.ts +69 -0
- package/lib/implementations/osd/osd-pixel-readback.d.ts +22 -0
- package/lib/implementations/osd/osd-region-overlay-draw.d.ts +38 -0
- package/lib/implementations/osd/osd-region-overlay.d.ts +46 -51
- package/lib/implementations/osd/osd-scale-bar.d.ts +8 -6
- package/lib/implementations/osd/osd-tile-source.d.ts +49 -0
- package/lib/implementations/osd/osd-viewer-like.d.ts +100 -0
- package/lib/implementations/osd/osd-viewer-mount.d.ts +14 -0
- package/lib/implementations/osd/osd-viewport.d.ts +77 -0
- package/lib/implementations/osd/osd-zoom.d.ts +6 -0
- package/lib/implementations/osd/simple-source.d.ts +161 -0
- package/lib/implementations/osd/slice-cache.d.ts +12 -3
- package/lib/implementations/osd/tile-client.d.ts +11 -14
- package/lib/implementations/osd/tile-recolor.d.ts +141 -0
- package/lib/implementations/plotly/omics-trace-builders.d.ts +32 -20
- package/lib/implementations/plotly/plotly-image-loader.d.ts +49 -0
- package/lib/implementations/plotly/plotly-image-recolor.d.ts +75 -0
- package/lib/implementations/plotly/plotly-intensity-inset.d.ts +8 -0
- package/lib/implementations/plotly/plotly-isosurface-controls.d.ts +38 -0
- package/lib/implementations/plotly/plotly-layouts.d.ts +188 -0
- package/lib/implementations/plotly/plotly-readback.d.ts +41 -0
- package/lib/implementations/plotly/plotly-region-overlay.d.ts +2 -2
- package/lib/implementations/plotly/plotly-shape-projection.d.ts +92 -0
- package/lib/implementations/plotly/plotly-trace-builders.d.ts +23 -12
- package/lib/implementations/plotly/plotly-zoom-controller.d.ts +86 -0
- package/lib/implementations/plotly/plotly.service.d.ts +136 -401
- package/lib/implementations/region-centroids.d.ts +14 -0
- package/lib/implementations/simple-slice-access.service.d.ts +7 -4
- package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +42 -18
- package/lib/implementations/spatial-data-http/spatial-wire.d.ts +34 -9
- package/lib/implementations/tile-server/index.d.ts +5 -0
- package/lib/implementations/tile-server/native-histogram.d.ts +25 -0
- package/lib/implementations/tile-server/poll-descriptor.d.ts +39 -0
- package/lib/implementations/tile-server/tile-protocol.d.ts +83 -0
- package/lib/implementations/tile-server/transport.d.ts +62 -0
- package/lib/intensity/intensity-profile.d.ts +66 -0
- package/lib/intensity/intensity-profile.service.d.ts +108 -0
- package/lib/intensity-inset/intensity-inset.component.d.ts +58 -0
- package/lib/models/bezier.d.ts +0 -5
- package/lib/models/class-preset.d.ts +25 -0
- package/lib/models/geometry.d.ts +14 -48
- package/lib/models/polygon-edit.d.ts +72 -0
- package/lib/models/polygon-factory.d.ts +45 -0
- package/lib/models/region-clone.d.ts +20 -0
- package/lib/models/region-geojson.d.ts +57 -0
- package/lib/models/region.d.ts +59 -4
- package/lib/models/shape.d.ts +8 -0
- package/lib/plot-mode/contribution-host.d.ts +125 -0
- package/lib/plot-mode/plot-type-menu.d.ts +60 -0
- package/lib/plot-mode/tool-params-model.d.ts +49 -0
- package/lib/plot.utilities.d.ts +19 -30
- package/lib/processing/processing-image.d.ts +5 -2
- package/lib/provide-visualization.d.ts +19 -2
- package/lib/region-editor/class-tree/class-tree.component.d.ts +78 -0
- package/lib/region-editor/class-tree/class-tree.d.ts +31 -0
- package/lib/region-editor/classes-panel/classes-panel.component.d.ts +86 -0
- package/lib/region-editor/file-stem.d.ts +7 -0
- package/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.d.ts +45 -0
- package/lib/region-editor/mask-export.service.d.ts +54 -0
- package/lib/region-editor/mask-raster.d.ts +2 -8
- package/lib/region-editor/region-color-dialog/region-color-dialog.component.d.ts +29 -0
- package/lib/region-editor/region-editor-help/region-editor-help.component.d.ts +11 -0
- package/lib/region-editor/region-editor.component.d.ts +283 -200
- package/lib/region-editor/region-metrics.d.ts +34 -0
- package/lib/region-editor/region-persistence.service.d.ts +77 -0
- package/lib/region-editor/region-table/region-table.component.d.ts +89 -0
- package/lib/region-editor/save-mask-dialog/save-mask-dialog.component.d.ts +36 -0
- package/lib/region-editor/save-regions-dialog/save-regions-dialog.component.d.ts +37 -0
- package/lib/region-ops.service.d.ts +1 -7
- package/lib/region-overlay/region-geometry.d.ts +158 -0
- package/lib/region-overlay/region-hit-test.d.ts +38 -0
- package/lib/region-overlay/region-source-layer.d.ts +96 -0
- package/lib/region-overlay/region-style.d.ts +52 -0
- package/lib/region-overlay/svg-region-renderer.d.ts +110 -0
- package/lib/region-source/http-region-source.d.ts +45 -0
- package/lib/region-source/region-source-ops.d.ts +89 -0
- package/lib/region-source/region-source-worker.d.ts +7 -0
- package/lib/region-source/region-source.d.ts +82 -0
- package/lib/region-source/region-tiles.d.ts +289 -0
- package/lib/region-source/worker-region-source.d.ts +65 -0
- package/lib/render-orchestrator.d.ts +6 -2
- package/lib/render-session.d.ts +75 -0
- package/lib/routing-visualizer.service.d.ts +248 -59
- package/lib/section-pane/section-pane.component.d.ts +47 -0
- package/lib/spatial/density-raster.d.ts +6 -0
- package/lib/spatial/embedding-compute-coordinator.d.ts +123 -0
- package/lib/spatial/embedding-compute.d.ts +21 -2
- package/lib/spatial/glyphs.d.ts +16 -0
- package/lib/spatial/lod.d.ts +94 -0
- package/lib/spatial/spatial-controls.facade.d.ts +64 -0
- package/lib/spatial/spatial-density.d.ts +15 -5
- package/lib/spatial/spatial-encoding.d.ts +11 -44
- package/lib/spatial/spatial-expression.d.ts +40 -22
- package/lib/spatial/spatial-framing.d.ts +1 -0
- package/lib/spatial/spatial-heatmap.d.ts +2 -0
- package/lib/spatial/spatial-hover.d.ts +4 -16
- package/lib/spatial/spatial-panel-model.d.ts +135 -0
- package/lib/spatial/spatial-selection.d.ts +21 -26
- package/lib/spatial/spatial-tile-merge.d.ts +41 -0
- package/lib/spatial/spatial-tiles.d.ts +9 -256
- package/lib/spatial/stats.d.ts +38 -0
- package/lib/spatial/transcript-grouping.d.ts +119 -0
- package/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.d.ts +64 -0
- package/lib/spatial-controls/spatial-charts/chart-data-model.d.ts +153 -0
- package/lib/spatial-controls/spatial-charts/chart-help.d.ts +69 -0
- package/lib/spatial-controls/spatial-charts/plotly-chart-host.d.ts +98 -0
- package/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.d.ts +26 -0
- package/lib/spatial-controls/spatial-charts/spatial-charts.component.d.ts +101 -260
- package/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.d.ts +43 -0
- package/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.d.ts +27 -0
- package/lib/spatial-controls/spatial-controls.component.d.ts +68 -448
- package/lib/spatial-controls/spatial-gene-picker.d.ts +86 -0
- package/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.d.ts +102 -0
- package/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.d.ts +72 -0
- package/lib/spatial-controls/spatial-key/spatial-key.component.d.ts +66 -0
- package/lib/spatial-controls/spatial-key/spatial-key.model.d.ts +33 -0
- package/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.d.ts +64 -0
- package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +117 -0
- package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +142 -0
- package/lib/store/class-color.util.d.ts +39 -2
- package/lib/store/class-signatures.d.ts +11 -0
- package/lib/store/region-history.d.ts +66 -0
- package/lib/store/region-scope-cache.d.ts +65 -0
- package/lib/store/region-selection.d.ts +36 -0
- package/lib/store/region-source-scope.d.ts +68 -0
- package/lib/store/region-store.service.d.ts +312 -116
- package/lib/store/visualizer-store.service.d.ts +32 -33
- package/lib/toast-outlets.d.ts +4 -3
- package/lib/toolbar/brush/brush-tool.service.d.ts +31 -98
- package/lib/toolbar/canvas-tools.d.ts +20 -0
- package/lib/toolbar/crop/slide-crop.d.ts +10 -4
- package/lib/toolbar/plot-type-selector/plot-type-selector.component.d.ts +38 -0
- package/lib/toolbar/region-tools/region-tool-buttons.d.ts +21 -0
- package/lib/toolbar/region-tools/region-tools.component.d.ts +62 -0
- package/lib/toolbar/segmentation/cell-segment-tool.service.d.ts +10 -14
- package/lib/toolbar/segmentation/cellpose-segmenter.service.d.ts +12 -2
- package/lib/toolbar/segmentation/onnx-sam-session.d.ts +22 -3
- package/lib/toolbar/segmentation/pending-calls.d.ts +31 -0
- package/lib/toolbar/segmentation/sam-model-registry.d.ts +9 -3
- package/lib/toolbar/segmentation/sam-onnx-core.d.ts +18 -5
- package/lib/toolbar/segmentation/sam-point-tool.service.d.ts +46 -32
- package/lib/toolbar/segmentation/sam-prompt.d.ts +7 -31
- package/lib/toolbar/segmentation/sam-session.service.d.ts +74 -0
- package/lib/toolbar/segmentation/sam-tool.service.d.ts +23 -30
- package/lib/toolbar/segmentation/segmentation-commit.d.ts +8 -0
- package/lib/toolbar/segmentation/segmentation-runner.d.ts +52 -0
- package/lib/toolbar/segmentation-tools/segmentation-tools.component.d.ts +87 -0
- package/lib/toolbar/stack-controls/stack-controls.component.d.ts +51 -0
- package/lib/toolbar/tool-kit/async-tool-status.d.ts +21 -0
- package/lib/toolbar/tool-kit/canvas-tool-manager.d.ts +36 -0
- package/lib/toolbar/tool-kit/canvas-tool.d.ts +86 -0
- package/lib/toolbar/tool-kit/frame-pixels.d.ts +45 -0
- package/lib/toolbar/tool-kit/mask-stroke-editor.d.ts +125 -0
- package/lib/toolbar/tool-kit/matrix-frame.d.ts +40 -0
- package/lib/toolbar/tool-kit/tool-overlay.d.ts +60 -0
- package/lib/toolbar/tool-kit/undo-gesture.d.ts +17 -0
- package/lib/toolbar/tool-slider/tool-slider.component.d.ts +33 -0
- package/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.d.ts +24 -0
- package/lib/toolbar/toolbar.component.d.ts +55 -84
- package/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.d.ts +33 -40
- package/lib/toolbar/view-controls/view-controls.component.d.ts +54 -0
- package/lib/toolbar/wand/wand-region-grow.d.ts +49 -0
- package/lib/toolbar/wand/wand-tool.service.d.ts +39 -124
- package/lib/toolbar/wand/wand.service.d.ts +22 -116
- package/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.d.ts +17 -37
- package/lib/util/mark-for-check.d.ts +11 -0
- package/lib/util/supersede.d.ts +53 -0
- package/lib/visualization.module.d.ts +18 -39
- package/lib/visualizer/floating-drag.directive.d.ts +30 -0
- package/lib/visualizer/region-actions.d.ts +54 -0
- package/lib/visualizer/region-load.d.ts +46 -0
- package/lib/visualizer/spatial-dataset-binder.d.ts +74 -0
- package/lib/visualizer/tool-modes.d.ts +49 -0
- package/lib/visualizer/viewer-shortcuts.d.ts +71 -0
- package/lib/visualizer/visualizer-context-menu.d.ts +55 -0
- package/lib/visualizer/volume-sections.d.ts +64 -0
- package/lib/visualizer.component.d.ts +232 -447
- package/lib/workers/spatial-math-ops.d.ts +65 -0
- package/lib/workers/spatial-math-worker.d.ts +7 -0
- package/lib/workers/spatial-math.d.ts +74 -0
- package/package.json +12 -3
- package/src/lib/assets/slice.svg +23 -0
- package/src/lib/styles/_viz-icons-rules.scss +73 -0
- package/src/lib/styles/viz-icons.scss +14 -0
- package/esm2022/lib/implementations/napari-js/napari-axes-labels.mjs +0 -97
- package/esm2022/lib/implementations/napari-js/napari-navigator.mjs +0 -195
- package/esm2022/lib/implementations/napari-js/napari-scale-bar.mjs +0 -92
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs +0 -329
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs.map +0 -1
- package/lib/implementations/napari-js/napari-axes-labels.d.ts +0 -49
- package/lib/implementations/napari-js/napari-navigator.d.ts +0 -72
- package/lib/implementations/napari-js/napari-scale-bar.d.ts +0 -35
- package/src/lib/assets/cell-detection.svg +0 -37
- package/src/lib/assets/click.svg +0 -1
- package/src/lib/assets/colormap-luts.json +0 -1
- package/src/lib/assets/edit-selection-white.svg +0 -47
- package/src/lib/assets/icons/colormap-earth.png +0 -0
- package/src/lib/assets/icons/colormap-placeholder.png +0 -0
- package/src/lib/assets/icons/colormap-pubu.png +0 -0
- package/src/lib/assets/interactive-segmentation-cursor.svg +0 -1
- package/src/lib/assets/picture-segmentation.svg +0 -43
- package/src/lib/assets/test/download-379.svg +0 -1
- package/src/lib/assets/test/download-98.svg +0 -1
- package/src/lib/assets/test/json-1.svg +0 -1
- package/src/lib/assets/test/load-53.svg +0 -1
- package/src/lib/assets/test/mask-44.svg +0 -1
- package/src/lib/assets/test/mask-download-44.svg +0 -15
- package/src/lib/assets/test/mask-save-44.svg +0 -11
- package/src/lib/assets/test/overlay-1.svg +0 -1
- package/src/lib/assets/test/overlay-4.svg +0 -1
- package/src/lib/assets/test/region-26.svg +0 -1
- package/src/lib/assets/test/save-56.svg +0 -1
- package/src/lib/assets/test/upload-43.svg +0 -1
|
@@ -1,195 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Overview navigator (minimap) for the napari-js 2D views, mirroring the OSD backend's
|
|
3
|
-
* built-in navigator: a thumbnail of the whole image in the bottom-right corner with the
|
|
4
|
-
* current viewport drawn on it. Clicking re-centres the main view on that point at the
|
|
5
|
-
* same zoom; dragging pans continuously — exactly OSD's behaviour.
|
|
6
|
-
*
|
|
7
|
-
* napari keeps layers at full-resolution pixel scale, so the camera's world units ARE
|
|
8
|
-
* image pixels and the thumbnail maps onto `[0, width) × [0, height)` directly.
|
|
9
|
-
*/
|
|
10
|
-
/** Fraction of the host's width the navigator takes — OSD's `navigatorSizeRatio`. */
|
|
11
|
-
export const NAVIGATOR_SIZE_RATIO = 0.16;
|
|
12
|
-
const NAVIGATOR_MIN_PX = 110;
|
|
13
|
-
const NAVIGATOR_MAX_PX = 300;
|
|
14
|
-
/** Box size and scale for a `worldW × worldH` image in a host `hostW` wide. */
|
|
15
|
-
export function navigatorLayout(hostW, worldW, worldH, ratio = NAVIGATOR_SIZE_RATIO) {
|
|
16
|
-
if (!(worldW > 0) || !(worldH > 0) || !(hostW > 0))
|
|
17
|
-
return null;
|
|
18
|
-
const longest = Math.min(NAVIGATOR_MAX_PX, Math.max(NAVIGATOR_MIN_PX, hostW * ratio));
|
|
19
|
-
const scale = longest / Math.max(worldW, worldH);
|
|
20
|
-
return { width: worldW * scale, height: worldH * scale, scale };
|
|
21
|
-
}
|
|
22
|
-
/** The part of the world the camera shows, as `[x0, y0, x1, y1]`. */
|
|
23
|
-
export function viewportWorldRect(center, zoom, hostW, hostH) {
|
|
24
|
-
const hw = hostW / zoom / 2;
|
|
25
|
-
const hh = hostH / zoom / 2;
|
|
26
|
-
return [center[0] - hw, center[1] - hh, center[0] + hw, center[1] + hh];
|
|
27
|
-
}
|
|
28
|
-
/** A point in the navigator box → world coordinates, clamped to the image. */
|
|
29
|
-
export function navigatorToWorld(px, py, layout, worldW, worldH) {
|
|
30
|
-
const x = Math.min(worldW, Math.max(0, px / layout.scale));
|
|
31
|
-
const y = Math.min(worldH, Math.max(0, py / layout.scale));
|
|
32
|
-
return [x, y];
|
|
33
|
-
}
|
|
34
|
-
export class NapariNavigator {
|
|
35
|
-
constructor(host, camera, worldW, worldH,
|
|
36
|
-
/** Called when the pointer enters the navigator — e.g. to hide a hover tooltip that
|
|
37
|
-
* was describing the canvas underneath. */
|
|
38
|
-
onEnter) {
|
|
39
|
-
this.host = host;
|
|
40
|
-
this.camera = camera;
|
|
41
|
-
this.worldW = worldW;
|
|
42
|
-
this.worldH = worldH;
|
|
43
|
-
this.onEnter = onEnter;
|
|
44
|
-
/** Aborted by destroy() to remove every DOM listener the box holds. */
|
|
45
|
-
this.listeners = new AbortController();
|
|
46
|
-
this.layout = null;
|
|
47
|
-
this.image = null;
|
|
48
|
-
this.dragging = false;
|
|
49
|
-
this.visible = true;
|
|
50
|
-
this.onDown = (e) => {
|
|
51
|
-
stop(e);
|
|
52
|
-
if (e.button !== 0)
|
|
53
|
-
return;
|
|
54
|
-
this.dragging = true;
|
|
55
|
-
this.box.setPointerCapture?.(e.pointerId);
|
|
56
|
-
this.panTo(e);
|
|
57
|
-
};
|
|
58
|
-
this.onMove = (e) => {
|
|
59
|
-
// Always consumed: a hover over the navigator is not a hover over the canvas.
|
|
60
|
-
stop(e);
|
|
61
|
-
if (this.dragging)
|
|
62
|
-
this.panTo(e);
|
|
63
|
-
};
|
|
64
|
-
this.onUp = (e) => {
|
|
65
|
-
if (!this.dragging)
|
|
66
|
-
return;
|
|
67
|
-
stop(e);
|
|
68
|
-
this.dragging = false;
|
|
69
|
-
this.box.releasePointerCapture?.(e.pointerId);
|
|
70
|
-
};
|
|
71
|
-
if (getComputedStyle(host).position === 'static')
|
|
72
|
-
host.style.position = 'relative';
|
|
73
|
-
this.box = document.createElement('div');
|
|
74
|
-
this.box.className = 'napari-navigator';
|
|
75
|
-
Object.assign(this.box.style, {
|
|
76
|
-
position: 'absolute',
|
|
77
|
-
right: '12px',
|
|
78
|
-
bottom: '12px',
|
|
79
|
-
background: 'rgba(0,0,0,0.5)',
|
|
80
|
-
border: '1px solid rgba(255,255,255,0.35)',
|
|
81
|
-
overflow: 'hidden',
|
|
82
|
-
cursor: 'pointer',
|
|
83
|
-
zIndex: '5',
|
|
84
|
-
touchAction: 'none',
|
|
85
|
-
});
|
|
86
|
-
this.canvas = document.createElement('canvas');
|
|
87
|
-
Object.assign(this.canvas.style, { display: 'block', width: '100%', height: '100%' });
|
|
88
|
-
// OSD's default display-region style.
|
|
89
|
-
this.region = document.createElement('div');
|
|
90
|
-
Object.assign(this.region.style, {
|
|
91
|
-
position: 'absolute',
|
|
92
|
-
border: '2px solid #900',
|
|
93
|
-
boxSizing: 'border-box',
|
|
94
|
-
pointerEvents: 'none',
|
|
95
|
-
});
|
|
96
|
-
this.box.append(this.canvas, this.region);
|
|
97
|
-
host.appendChild(this.box);
|
|
98
|
-
// The navigator's own gestures must not also reach the canvas underneath (pan/zoom,
|
|
99
|
-
// region drawing), so every pointer/wheel event is consumed here.
|
|
100
|
-
// One signal for all of them, so destroy() releases every listener at once.
|
|
101
|
-
const signal = this.listeners.signal;
|
|
102
|
-
this.box.addEventListener('pointerdown', this.onDown, { signal });
|
|
103
|
-
this.box.addEventListener('pointermove', this.onMove, { signal });
|
|
104
|
-
this.box.addEventListener('pointerup', this.onUp, { signal });
|
|
105
|
-
this.box.addEventListener('pointercancel', this.onUp, { signal });
|
|
106
|
-
this.box.addEventListener('pointerenter', () => this.onEnter?.(), { signal });
|
|
107
|
-
for (const type of ['wheel', 'click', 'dblclick', 'contextmenu', 'mousedown']) {
|
|
108
|
-
this.box.addEventListener(type, stop, { passive: false, signal });
|
|
109
|
-
}
|
|
110
|
-
this.disconnectCamera = camera.changed.connect(() => this.updateRegion());
|
|
111
|
-
if (typeof ResizeObserver !== 'undefined') {
|
|
112
|
-
this.resizeObserver = new ResizeObserver(() => this.relayout());
|
|
113
|
-
this.resizeObserver.observe(host);
|
|
114
|
-
}
|
|
115
|
-
this.relayout();
|
|
116
|
-
}
|
|
117
|
-
/** The thumbnail to draw: any image of the whole world (a coarse pyramid level). */
|
|
118
|
-
setImage(image) {
|
|
119
|
-
this.image = image;
|
|
120
|
-
this.drawImage();
|
|
121
|
-
}
|
|
122
|
-
/** The image's world size changed (another image was loaded). */
|
|
123
|
-
setWorld(width, height) {
|
|
124
|
-
this.worldW = width;
|
|
125
|
-
this.worldH = height;
|
|
126
|
-
this.relayout();
|
|
127
|
-
}
|
|
128
|
-
setVisible(visible) {
|
|
129
|
-
this.visible = visible;
|
|
130
|
-
this.box.style.display = visible && this.layout ? 'block' : 'none';
|
|
131
|
-
}
|
|
132
|
-
destroy() {
|
|
133
|
-
this.listeners.abort();
|
|
134
|
-
this.disconnectCamera();
|
|
135
|
-
this.resizeObserver?.disconnect();
|
|
136
|
-
this.box.remove();
|
|
137
|
-
}
|
|
138
|
-
relayout() {
|
|
139
|
-
this.layout = navigatorLayout(this.host.clientWidth, this.worldW, this.worldH);
|
|
140
|
-
if (!this.layout) {
|
|
141
|
-
this.box.style.display = 'none';
|
|
142
|
-
return;
|
|
143
|
-
}
|
|
144
|
-
this.box.style.display = this.visible ? 'block' : 'none';
|
|
145
|
-
this.box.style.width = `${this.layout.width}px`;
|
|
146
|
-
this.box.style.height = `${this.layout.height}px`;
|
|
147
|
-
const dpr = typeof devicePixelRatio === 'number' ? devicePixelRatio : 1;
|
|
148
|
-
this.canvas.width = Math.max(1, Math.round(this.layout.width * dpr));
|
|
149
|
-
this.canvas.height = Math.max(1, Math.round(this.layout.height * dpr));
|
|
150
|
-
this.drawImage();
|
|
151
|
-
this.updateRegion();
|
|
152
|
-
}
|
|
153
|
-
drawImage() {
|
|
154
|
-
const ctx = this.canvas.getContext('2d');
|
|
155
|
-
if (!ctx)
|
|
156
|
-
return;
|
|
157
|
-
ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);
|
|
158
|
-
if (this.image) {
|
|
159
|
-
ctx.imageSmoothingEnabled = true;
|
|
160
|
-
ctx.drawImage(this.image, 0, 0, this.canvas.width, this.canvas.height);
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
/** Draw the viewport rectangle, clipped to the box (as OSD does when zoomed out). */
|
|
164
|
-
updateRegion() {
|
|
165
|
-
const l = this.layout;
|
|
166
|
-
if (!l)
|
|
167
|
-
return;
|
|
168
|
-
const [x0, y0, x1, y1] = viewportWorldRect(this.camera.center, this.camera.zoom, this.host.clientWidth, this.host.clientHeight);
|
|
169
|
-
const left = Math.max(0, x0 * l.scale);
|
|
170
|
-
const top = Math.max(0, y0 * l.scale);
|
|
171
|
-
const right = Math.min(l.width, x1 * l.scale);
|
|
172
|
-
const bottom = Math.min(l.height, y1 * l.scale);
|
|
173
|
-
Object.assign(this.region.style, {
|
|
174
|
-
left: `${left}px`,
|
|
175
|
-
top: `${top}px`,
|
|
176
|
-
width: `${Math.max(2, right - left)}px`,
|
|
177
|
-
height: `${Math.max(2, bottom - top)}px`,
|
|
178
|
-
display: right > left && bottom > top ? 'block' : 'none',
|
|
179
|
-
});
|
|
180
|
-
}
|
|
181
|
-
/** Re-centre the main view on the navigator point under the pointer, keeping the zoom. */
|
|
182
|
-
panTo(e) {
|
|
183
|
-
const l = this.layout;
|
|
184
|
-
if (!l)
|
|
185
|
-
return;
|
|
186
|
-
const rect = this.box.getBoundingClientRect();
|
|
187
|
-
this.camera.center = navigatorToWorld(e.clientX - rect.left, e.clientY - rect.top, l, this.worldW, this.worldH);
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
function stop(e) {
|
|
191
|
-
e.stopPropagation();
|
|
192
|
-
if (e.cancelable)
|
|
193
|
-
e.preventDefault();
|
|
194
|
-
}
|
|
195
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFwYXJpLW5hdmlnYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvaW1wbGVtZW50YXRpb25zL25hcGFyaS1qcy9uYXBhcmktbmF2aWdhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBa0JILHFGQUFxRjtBQUNyRixNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUM7QUFDekMsTUFBTSxnQkFBZ0IsR0FBRyxHQUFHLENBQUM7QUFDN0IsTUFBTSxnQkFBZ0IsR0FBRyxHQUFHLENBQUM7QUFFN0IsK0VBQStFO0FBQy9FLE1BQU0sVUFBVSxlQUFlLENBQzdCLEtBQWEsRUFBRSxNQUFjLEVBQUUsTUFBYyxFQUFFLEtBQUssR0FBRyxvQkFBb0I7SUFFM0UsSUFBSSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQztJQUNoRSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDdEYsTUFBTSxLQUFLLEdBQUcsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ2pELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxHQUFHLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxHQUFHLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQztBQUNsRSxDQUFDO0FBRUQscUVBQXFFO0FBQ3JFLE1BQU0sVUFBVSxpQkFBaUIsQ0FDL0IsTUFBaUMsRUFBRSxJQUFZLEVBQUUsS0FBYSxFQUFFLEtBQWE7SUFFN0UsTUFB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Q0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FDekUsQ0FBQztJQUNKLENBQUM7Q0FzQkY7QUFFRCxTQUFTLElBQUksQ0FBQyxDQUFRO0lBQ3BCLENBQUMsQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUNwQixJQUFJLENBQUMsQ0FBQyxVQUFVO1FBQUUsQ0FBQyxDQUFDLGNBQWMsRUFBRSxDQUFDO0FBQ3ZDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE92ZXJ2aWV3IG5hdmlnYXRvciAobWluaW1hcCkgZm9yIHRoZSBuYXBhcmktanMgMkQgdmlld3MsIG1pcnJvcmluZyB0aGUgT1NEIGJhY2tlbmQnc1xuICogYnVpbHQtaW4gbmF2aWdhdG9yOiBhIHRodW1ibmFpbCBvZiB0aGUgd2hvbGUgaW1hZ2UgaW4gdGhlIGJvdHRvbS1yaWdodCBjb3JuZXIgd2l0aCB0aGVcbiAqIGN1cnJlbnQgdmlld3BvcnQgZHJhd24gb24gaXQuIENsaWNraW5nIHJlLWNlbnRyZXMgdGhlIG1haW4gdmlldyBvbiB0aGF0IHBvaW50IGF0IHRoZVxuICogc2FtZSB6b29tOyBkcmFnZ2luZyBwYW5zIGNvbnRpbnVvdXNseSDigJQgZXhhY3RseSBPU0QncyBiZWhhdmlvdXIuXG4gKlxuICogbmFwYXJpIGtlZXBzIGxheWVycyBhdCBmdWxsLXJlc29sdXRpb24gcGl4ZWwgc2NhbGUsIHNvIHRoZSBjYW1lcmEncyB3b3JsZCB1bml0cyBBUkVcbiAqIGltYWdlIHBpeGVscyBhbmQgdGhlIHRodW1ibmFpbCBtYXBzIG9udG8gYFswLCB3aWR0aCkgw5cgWzAsIGhlaWdodClgIGRpcmVjdGx5LlxuICovXG5cbi8qKiBUaGUgc2xpY2Ugb2YgdGhlIG5hcGFyaSAyRCBjYW1lcmEgdGhlIG5hdmlnYXRvciByZWFkcyBhbmQgZHJpdmVzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBOYXZpZ2F0b3JDYW1lcmEge1xuICBjZW50ZXI6IHJlYWRvbmx5IFtudW1iZXIsIG51bWJlcl07XG4gIHJlYWRvbmx5IHpvb206IG51bWJlcjtcbiAgcmVhZG9ubHkgY2hhbmdlZDogeyBjb25uZWN0KGxpc3RlbmVyOiAoKSA9PiB2b2lkKTogKCkgPT4gdm9pZCB9O1xufVxuXG4vKiogV2hlcmUgdGhlIHRodW1ibmFpbCBzaXRzIGluc2lkZSB0aGUgbmF2aWdhdG9yIGJveCwgaW4gQ1NTIHB4LiAqL1xuZXhwb3J0IGludGVyZmFjZSBOYXZpZ2F0b3JMYXlvdXQge1xuICAvKiogQm94IHNpemUuICovXG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xuICAvKiogQ1NTIHB4IHBlciB3b3JsZCB1bml0IChpbWFnZSBwaXhlbCkuICovXG4gIHNjYWxlOiBudW1iZXI7XG59XG5cbi8qKiBGcmFjdGlvbiBvZiB0aGUgaG9zdCdzIHdpZHRoIHRoZSBuYXZpZ2F0b3IgdGFrZXMg4oCUIE9TRCdzIGBuYXZpZ2F0b3JTaXplUmF0aW9gLiAqL1xuZXhwb3J0IGNvbnN0IE5BVklHQVRPUl9TSVpFX1JBVElPID0gMC4xNjtcbmNvbnN0IE5BVklHQVRPUl9NSU5fUFggPSAxMTA7XG5jb25zdCBOQVZJR0FUT1JfTUFYX1BYID0gMzAwO1xuXG4vKiogQm94IHNpemUgYW5kIHNjYWxlIGZvciBhIGB3b3JsZFcgw5cgd29ybGRIYCBpbWFnZSBpbiBhIGhvc3QgYGhvc3RXYCB3aWRlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5hdmlnYXRvckxheW91dChcbiAgaG9zdFc6IG51bWJlciwgd29ybGRXOiBudW1iZXIsIHdvcmxkSDogbnVtYmVyLCByYXRpbyA9IE5BVklHQVRPUl9TSVpFX1JBVElPLFxuKTogTmF2aWdhdG9yTGF5b3V0IHwgbnVsbCB7XG4gIGlmICghKHdvcmxkVyA+IDApIHx8ICEod29ybGRIID4gMCkgfHwgIShob3N0VyA+IDApKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgbG9uZ2VzdCA9IE1hdGgubWluKE5BVklHQVRPUl9NQVhfUFgsIE1hdGgubWF4KE5BVklHQVRPUl9NSU5fUFgsIGhvc3RXICogcmF0aW8pKTtcbiAgY29uc3Qgc2NhbGUgPSBsb25nZXN0IC8gTWF0aC5tYXgod29ybGRXLCB3b3JsZEgpO1xuICByZXR1cm4geyB3aWR0aDogd29ybGRXICogc2NhbGUsIGhlaWdodDogd29ybGRIICogc2NhbGUsIHNjYWxlIH07XG59XG5cbi8qKiBUaGUgcGFydCBvZiB0aGUgd29ybGQgdGhlIGNhbWVyYSBzaG93cywgYXMgYFt4MCwgeTAsIHgxLCB5MV1gLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZpZXdwb3J0V29ybGRSZWN0KFxuICBjZW50ZXI6IHJlYWRvbmx5IFtudW1iZXIsIG51bWJlcl0sIHpvb206IG51bWJlciwgaG9zdFc6IG51bWJlciwgaG9zdEg6IG51bWJlcixcbik6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdIHtcbiAgY29uc3QgaHcgPSBob3N0VyAvIHpvb20gLyAyO1xuICBjb25zdCBoaCA9IGhvc3RIIC8gem9vbSAvIDI7XG4gIHJldHVybiBbY2VudGVyWzBdIC0gaHcsIGNlbnRlclsxXSAtIGhoLCBjZW50ZXJbMF0gKyBodywgY2VudGVyWzFdICsgaGhdO1xufVxuXG4vKiogQSBwb2ludCBpbiB0aGUgbmF2aWdhdG9yIGJveCDihpIgd29ybGQgY29vcmRpbmF0ZXMsIGNsYW1wZWQgdG8gdGhlIGltYWdlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5hdmlnYXRvclRvV29ybGQoXG4gIHB4OiBudW1iZXIsIHB5OiBudW1iZXIsIGxheW91dDogTmF2aWdhdG9yTGF5b3V0LCB3b3JsZFc6IG51bWJlciwgd29ybGRIOiBudW1iZXIsXG4pOiBbbnVtYmVyLCBudW1iZXJdIHtcbiAgY29uc3QgeCA9IE1hdGgubWluKHdvcmxkVywgTWF0aC5tYXgoMCwgcHggLyBsYXlvdXQuc2NhbGUpKTtcbiAgY29uc3QgeSA9IE1hdGgubWluKHdvcmxkSCwgTWF0aC5tYXgoMCwgcHkgLyBsYXlvdXQuc2NhbGUpKTtcbiAgcmV0dXJuIFt4LCB5XTtcbn1cblxuZXhwb3J0IGNsYXNzIE5hcGFyaU5hdmlnYXRvciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYm94OiBIVE1MRGl2RWxlbWVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lvbjogSFRNTERpdkVsZW1lbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGlzY29ubmVjdENhbWVyYTogKCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSByZWFkb25seSByZXNpemVPYnNlcnZlcj86IFJlc2l6ZU9ic2VydmVyO1xuICAvKiogQWJvcnRlZCBieSBkZXN0cm95KCkgdG8gcmVtb3ZlIGV2ZXJ5IERPTSBsaXN0ZW5lciB0aGUgYm94IGhvbGRzLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IGxpc3RlbmVycyA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgcHJpdmF0ZSBsYXlvdXQ6IE5hdmlnYXRvckxheW91dCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGltYWdlOiBDYW52YXNJbWFnZVNvdXJjZSB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGRyYWdnaW5nID0gZmFsc2U7XG4gIHByaXZhdGUgdmlzaWJsZSA9IHRydWU7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBob3N0OiBIVE1MRWxlbWVudCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNhbWVyYTogTmF2aWdhdG9yQ2FtZXJhLFxuICAgIHByaXZhdGUgd29ybGRXOiBudW1iZXIsXG4gICAgcHJpdmF0ZSB3b3JsZEg6IG51bWJlcixcbiAgICAvKiogQ2FsbGVkIHdoZW4gdGhlIHBvaW50ZXIgZW50ZXJzIHRoZSBuYXZpZ2F0b3Ig4oCUIGUuZy4gdG8gaGlkZSBhIGhvdmVyIHRvb2x0aXAgdGhhdFxuICAgICAqICB3YXMgZGVzY3JpYmluZyB0aGUgY2FudmFzIHVuZGVybmVhdGguICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBvbkVudGVyPzogKCkgPT4gdm9pZCxcbiAgKSB7XG4gICAgaWYgKGdldENvbXB1dGVkU3R5bGUoaG9zdCkucG9zaXRpb24gPT09ICdzdGF0aWMnKSBob3N0LnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcblxuICAgIHRoaXMuYm94ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGhpcy5ib3guY2xhc3NOYW1lID0gJ25hcGFyaS1uYXZpZ2F0b3InO1xuICAgIE9iamVjdC5hc3NpZ24odGhpcy5ib3guc3R5bGUsIHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgcmlnaHQ6ICcxMnB4JyxcbiAgICAgIGJvdHRvbTogJzEycHgnLFxuICAgICAgYmFja2dyb3VuZDogJ3JnYmEoMCwwLDAsMC41KScsXG4gICAgICBib3JkZXI6ICcxcHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwwLjM1KScsXG4gICAgICBvdmVyZmxvdzogJ2hpZGRlbicsXG4gICAgICBjdXJzb3I6ICdwb2ludGVyJyxcbiAgICAgIHpJbmRleDogJzUnLFxuICAgICAgdG91Y2hBY3Rpb246ICdub25lJyxcbiAgICB9IHNhdGlzZmllcyBQYXJ0aWFsPENTU1N0eWxlRGVjbGFyYXRpb24+KTtcblxuICAgIHRoaXMuY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgT2JqZWN0LmFzc2lnbih0aGlzLmNhbnZhcy5zdHlsZSwgeyBkaXNwbGF5OiAnYmxvY2snLCB3aWR0aDogJzEwMCUnLCBoZWlnaHQ6ICcxMDAlJyB9KTtcblxuICAgIC8vIE9TRCdzIGRlZmF1bHQgZGlzcGxheS1yZWdpb24gc3R5bGUuXG4gICAgdGhpcy5yZWdpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBPYmplY3QuYXNzaWduKHRoaXMucmVnaW9uLnN0eWxlLCB7XG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgIGJvcmRlcjogJzJweCBzb2xpZCAjOTAwJyxcbiAgICAgIGJveFNpemluZzogJ2JvcmRlci1ib3gnLFxuICAgICAgcG9pbnRlckV2ZW50czogJ25vbmUnLFxuICAgIH0gc2F0aXNmaWVzIFBhcnRpYWw8Q1NTU3R5bGVEZWNsYXJhdGlvbj4pO1xuXG4gICAgdGhpcy5ib3guYXBwZW5kKHRoaXMuY2FudmFzLCB0aGlzLnJlZ2lvbik7XG4gICAgaG9zdC5hcHBlbmRDaGlsZCh0aGlzLmJveCk7XG5cbiAgICAvLyBUaGUgbmF2aWdhdG9yJ3Mgb3duIGdlc3R1cmVzIG11c3Qgbm90IGFsc28gcmVhY2ggdGhlIGNhbnZhcyB1bmRlcm5lYXRoIChwYW4vem9vbSxcbiAgICAvLyByZWdpb24gZHJhd2luZyksIHNvIGV2ZXJ5IHBvaW50ZXIvd2hlZWwgZXZlbnQgaXMgY29uc3VtZWQgaGVyZS5cbiAgICAvLyBPbmUgc2lnbmFsIGZvciBhbGwgb2YgdGhlbSwgc28gZGVzdHJveSgpIHJlbGVhc2VzIGV2ZXJ5IGxpc3RlbmVyIGF0IG9uY2UuXG4gICAgY29uc3Qgc2lnbmFsID0gdGhpcy5saXN0ZW5lcnMuc2lnbmFsO1xuICAgIHRoaXMuYm94LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJkb3duJywgdGhpcy5vbkRvd24sIHsgc2lnbmFsIH0pO1xuICAgIHRoaXMuYm94LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJtb3ZlJywgdGhpcy5vbk1vdmUsIHsgc2lnbmFsIH0pO1xuICAgIHRoaXMuYm94LmFkZEV2ZW50TGlzdGVuZXIoJ3BvaW50ZXJ1cCcsIHRoaXMub25VcCwgeyBzaWduYWwgfSk7XG4gICAgdGhpcy5ib3guYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmNhbmNlbCcsIHRoaXMub25VcCwgeyBzaWduYWwgfSk7XG4gICAgdGhpcy5ib3guYWRkRXZlbnRMaXN0ZW5lcigncG9pbnRlcmVudGVyJywgKCkgPT4gdGhpcy5vbkVudGVyPy4oKSwgeyBzaWduYWwgfSk7XG4gICAgZm9yIChjb25zdCB0eXBlIG9mIFsnd2hlZWwnLCAnY2xpY2snLCAnZGJsY2xpY2snLCAnY29udGV4dG1lbnUnLCAnbW91c2Vkb3duJ10gYXMgY29uc3QpIHtcbiAgICAgIHRoaXMuYm94LmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgc3RvcCwgeyBwYXNzaXZlOiBmYWxzZSwgc2lnbmFsIH0pO1xuICAgIH1cblxuICAgIHRoaXMuZGlzY29ubmVjdENhbWVyYSA9IGNhbWVyYS5jaGFuZ2VkLmNvbm5lY3QoKCkgPT4gdGhpcy51cGRhdGVSZWdpb24oKSk7XG4gICAgaWYgKHR5cGVvZiBSZXNpemVPYnNlcnZlciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4gdGhpcy5yZWxheW91dCgpKTtcbiAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShob3N0KTtcbiAgICB9XG4gICAgdGhpcy5yZWxheW91dCgpO1xuICB9XG5cbiAgLyoqIFRoZSB0aHVtYm5haWwgdG8gZHJhdzogYW55IGltYWdlIG9mIHRoZSB3aG9sZSB3b3JsZCAoYSBjb2Fyc2UgcHlyYW1pZCBsZXZlbCkuICovXG4gIHNldEltYWdlKGltYWdlOiBDYW52YXNJbWFnZVNvdXJjZSB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLmltYWdlID0gaW1hZ2U7XG4gICAgdGhpcy5kcmF3SW1hZ2UoKTtcbiAgfVxuXG4gIC8qKiBUaGUgaW1hZ2UncyB3b3JsZCBzaXplIGNoYW5nZWQgKGFub3RoZXIgaW1hZ2Ugd2FzIGxvYWRlZCkuICovXG4gIHNldFdvcmxkKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy53b3JsZFcgPSB3aWR0aDtcbiAgICB0aGlzLndvcmxkSCA9IGhlaWdodDtcbiAgICB0aGlzLnJlbGF5b3V0KCk7XG4gIH1cblxuICBzZXRWaXNpYmxlKHZpc2libGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLnZpc2libGUgPSB2aXNpYmxlO1xuICAgIHRoaXMuYm94LnN0eWxlLmRpc3BsYXkgPSB2aXNpYmxlICYmIHRoaXMubGF5b3V0ID8gJ2Jsb2NrJyA6ICdub25lJztcbiAgfVxuXG4gIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5saXN0ZW5lcnMuYWJvcnQoKTtcbiAgICB0aGlzLmRpc2Nvbm5lY3RDYW1lcmEoKTtcbiAgICB0aGlzLnJlc2l6ZU9ic2VydmVyPy5kaXNjb25uZWN0KCk7XG4gICAgdGhpcy5ib3gucmVtb3ZlKCk7XG4gIH1cblxuICBwcml2YXRlIHJlbGF5b3V0KCk6IHZvaWQge1xuICAgIHRoaXMubGF5b3V0ID0gbmF2aWdhdG9yTGF5b3V0KHRoaXMuaG9zdC5jbGllbnRXaWR0aCwgdGhpcy53b3JsZFcsIHRoaXMud29ybGRIKTtcbiAgICBpZiAoIXRoaXMubGF5b3V0KSB7XG4gICAgICB0aGlzLmJveC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmJveC5zdHlsZS5kaXNwbGF5ID0gdGhpcy52aXNpYmxlID8gJ2Jsb2NrJyA6ICdub25lJztcbiAgICB0aGlzLmJveC5zdHlsZS53aWR0aCA9IGAke3RoaXMubGF5b3V0LndpZHRofXB4YDtcbiAgICB0aGlzLmJveC5zdHlsZS5oZWlnaHQgPSBgJHt0aGlzLmxheW91dC5oZWlnaHR9cHhgO1xuICAgIGNvbnN0IGRwciA9IHR5cGVvZiBkZXZpY2VQaXhlbFJhdGlvID09PSAnbnVtYmVyJyA/IGRldmljZVBpeGVsUmF0aW8gOiAxO1xuICAgIHRoaXMuY2FudmFzLndpZHRoID0gTWF0aC5tYXgoMSwgTWF0aC5yb3VuZCh0aGlzLmxheW91dC53aWR0aCAqIGRwcikpO1xuICAgIHRoaXMuY2FudmFzLmhlaWdodCA9IE1hdGgubWF4KDEsIE1hdGgucm91bmQodGhpcy5sYXlvdXQuaGVpZ2h0ICogZHByKSk7XG4gICAgdGhpcy5kcmF3SW1hZ2UoKTtcbiAgICB0aGlzLnVwZGF0ZVJlZ2lvbigpO1xuICB9XG5cbiAgcHJpdmF0ZSBkcmF3SW1hZ2UoKTogdm9pZCB7XG4gICAgY29uc3QgY3R4ID0gdGhpcy5jYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICBpZiAoIWN0eCkgcmV0dXJuO1xuICAgIGN0eC5jbGVhclJlY3QoMCwgMCwgdGhpcy5jYW52YXMud2lkdGgsIHRoaXMuY2FudmFzLmhlaWdodCk7XG4gICAgaWYgKHRoaXMuaW1hZ2UpIHtcbiAgICAgIGN0eC5pbWFnZVNtb290aGluZ0VuYWJsZWQgPSB0cnVlO1xuICAgICAgY3R4LmRyYXdJbWFnZSh0aGlzLmltYWdlLCAwLCAwLCB0aGlzLmNhbnZhcy53aWR0aCwgdGhpcy5jYW52YXMuaGVpZ2h0KTtcbiAgICB9XG4gIH1cblxuICAvKiogRHJhdyB0aGUgdmlld3BvcnQgcmVjdGFuZ2xlLCBjbGlwcGVkIHRvIHRoZSBib3ggKGFzIE9TRCBkb2VzIHdoZW4gem9vbWVkIG91dCkuICovXG4gIHByaXZhdGUgdXBkYXRlUmVnaW9uKCk6IHZvaWQge1xuICAgIGNvbnN0IGwgPSB0aGlzLmxheW91dDtcbiAgICBpZiAoIWwpIHJldHVybjtcbiAgICBjb25zdCBbeDAsIHkwLCB4MSwgeTFdID0gdmlld3BvcnRXb3JsZFJlY3QoXG4gICAgICB0aGlzLmNhbWVyYS5jZW50ZXIsIHRoaXMuY2FtZXJhLnpvb20sIHRoaXMuaG9zdC5jbGllbnRXaWR0aCwgdGhpcy5ob3N0LmNsaWVudEhlaWdodCxcbiAgICApO1xuICAgIGNvbnN0IGxlZnQgPSBNYXRoLm1heCgwLCB4MCAqIGwuc2NhbGUpO1xuICAgIGNvbnN0IHRvcCA9IE1hdGgubWF4KDAsIHkwICogbC5zY2FsZSk7XG4gICAgY29uc3QgcmlnaHQgPSBNYXRoLm1pbihsLndpZHRoLCB4MSAqIGwuc2NhbGUpO1xuICAgIGNvbnN0IGJvdHRvbSA9IE1hdGgubWluKGwuaGVpZ2h0LCB5MSAqIGwuc2NhbGUpO1xuICAgIE9iamVjdC5hc3NpZ24odGhpcy5yZWdpb24uc3R5bGUsIHtcbiAgICAgIGxlZnQ6IGAke2xlZnR9cHhgLFxuICAgICAgdG9wOiBgJHt0b3B9cHhgLFxuICAgICAgd2lkdGg6IGAke01hdGgubWF4KDIsIHJpZ2h0IC0gbGVmdCl9cHhgLFxuICAgICAgaGVpZ2h0OiBgJHtNYXRoLm1heCgyLCBib3R0b20gLSB0b3ApfXB4YCxcbiAgICAgIGRpc3BsYXk6IHJpZ2h0ID4gbGVmdCAmJiBib3R0b20gPiB0b3AgPyAnYmxvY2snIDogJ25vbmUnLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFJlLWNlbnRyZSB0aGUgbWFpbiB2aWV3IG9uIHRoZSBuYXZpZ2F0b3IgcG9pbnQgdW5kZXIgdGhlIHBvaW50ZXIsIGtlZXBpbmcgdGhlIHpvb20uICovXG4gIHByaXZhdGUgcGFuVG8oZTogUG9pbnRlckV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgbCA9IHRoaXMubGF5b3V0O1xuICAgIGlmICghbCkgcmV0dXJuO1xuICAgIGNvbnN0IHJlY3QgPSB0aGlzLmJveC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB0aGlzLmNhbWVyYS5jZW50ZXIgPSBuYXZpZ2F0b3JUb1dvcmxkKFxuICAgICAgZS5jbGllbnRYIC0gcmVjdC5sZWZ0LCBlLmNsaWVudFkgLSByZWN0LnRvcCwgbCwgdGhpcy53b3JsZFcsIHRoaXMud29ybGRILFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IG9uRG93biA9IChlOiBQb2ludGVyRXZlbnQpOiB2b2lkID0+IHtcbiAgICBzdG9wKGUpO1xuICAgIGlmIChlLmJ1dHRvbiAhPT0gMCkgcmV0dXJuO1xuICAgIHRoaXMuZHJhZ2dpbmcgPSB0cnVlO1xuICAgIHRoaXMuYm94LnNldFBvaW50ZXJDYXB0dXJlPy4oZS5wb2ludGVySWQpO1xuICAgIHRoaXMucGFuVG8oZSk7XG4gIH07XG5cbiAgcHJpdmF0ZSByZWFkb25seSBvbk1vdmUgPSAoZTogUG9pbnRlckV2ZW50KTogdm9pZCA9PiB7XG4gICAgLy8gQWx3YXlzIGNvbnN1bWVkOiBhIGhvdmVyIG92ZXIgdGhlIG5hdmlnYXRvciBpcyBub3QgYSBob3ZlciBvdmVyIHRoZSBjYW52YXMuXG4gICAgc3RvcChlKTtcbiAgICBpZiAodGhpcy5kcmFnZ2luZykgdGhpcy5wYW5UbyhlKTtcbiAgfTtcblxuICBwcml2YXRlIHJlYWRvbmx5IG9uVXAgPSAoZTogUG9pbnRlckV2ZW50KTogdm9pZCA9PiB7XG4gICAgaWYgKCF0aGlzLmRyYWdnaW5nKSByZXR1cm47XG4gICAgc3RvcChlKTtcbiAgICB0aGlzLmRyYWdnaW5nID0gZmFsc2U7XG4gICAgdGhpcy5ib3gucmVsZWFzZVBvaW50ZXJDYXB0dXJlPy4oZS5wb2ludGVySWQpO1xuICB9O1xufVxuXG5mdW5jdGlvbiBzdG9wKGU6IEV2ZW50KTogdm9pZCB7XG4gIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIGlmIChlLmNhbmNlbGFibGUpIGUucHJldmVudERlZmF1bHQoKTtcbn1cbiJdfQ==
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Physical scale bar for the napari-js WebGPU image view (jit-ui#102), mirroring the OSD
|
|
3
|
-
* backend's {@link OsdScaleBar}. napari keeps layers at pixel scale, so the camera's `zoom`
|
|
4
|
-
* (CSS px per world unit) is exactly screen px per image pixel; combined with the image's
|
|
5
|
-
* µm/pixel (`mppX`, from Bio-Formats `/tiles/info`) that gives a real-world bar length.
|
|
6
|
-
* Recomputes on every camera change and host resize. Hidden when the image has no physical size.
|
|
7
|
-
*/
|
|
8
|
-
/** Round up to a "nice" 1/2/5 × 10ⁿ value for scale-bar lengths. */
|
|
9
|
-
function niceLength(x) {
|
|
10
|
-
if (x <= 0)
|
|
11
|
-
return 1;
|
|
12
|
-
const base = Math.pow(10, Math.floor(Math.log10(x)));
|
|
13
|
-
const f = x / base;
|
|
14
|
-
const nice = f < 1.5 ? 1 : f < 3.5 ? 2 : f < 7.5 ? 5 : 10;
|
|
15
|
-
return nice * base;
|
|
16
|
-
}
|
|
17
|
-
/** Format a length given in micrometres, picking the unit that suits its magnitude (jit-service
|
|
18
|
-
* normalises whatever unit Bio-Formats reports to µm). */
|
|
19
|
-
export function formatUm(um) {
|
|
20
|
-
const trim = (n) => (n % 1 === 0 ? `${n}` : n.toFixed(1));
|
|
21
|
-
if (um >= 1e6)
|
|
22
|
-
return `${trim(um / 1e6)} m`;
|
|
23
|
-
if (um >= 1e4)
|
|
24
|
-
return `${trim(um / 1e4)} cm`;
|
|
25
|
-
if (um >= 1e3)
|
|
26
|
-
return `${trim(um / 1e3)} mm`;
|
|
27
|
-
if (um >= 1)
|
|
28
|
-
return `${trim(um)} µm`;
|
|
29
|
-
return `${trim(um * 1000)} nm`;
|
|
30
|
-
}
|
|
31
|
-
export class NapariScaleBar {
|
|
32
|
-
constructor(host, camera, mppX) {
|
|
33
|
-
this.host = host;
|
|
34
|
-
this.camera = camera;
|
|
35
|
-
this.mppX = mppX;
|
|
36
|
-
// The bar is absolutely positioned within the host, so the host must establish a containing
|
|
37
|
-
// block (the plot host is often statically positioned).
|
|
38
|
-
if (getComputedStyle(host).position === 'static')
|
|
39
|
-
host.style.position = 'relative';
|
|
40
|
-
this.bar = document.createElement('div');
|
|
41
|
-
Object.assign(this.bar.style, {
|
|
42
|
-
position: 'absolute',
|
|
43
|
-
left: '12px',
|
|
44
|
-
bottom: '12px',
|
|
45
|
-
zIndex: '30',
|
|
46
|
-
pointerEvents: 'none',
|
|
47
|
-
color: '#fff',
|
|
48
|
-
font: '11px sans-serif',
|
|
49
|
-
textShadow: '0 0 3px #000',
|
|
50
|
-
textAlign: 'center',
|
|
51
|
-
userSelect: 'none',
|
|
52
|
-
});
|
|
53
|
-
this.label = document.createElement('span');
|
|
54
|
-
this.line = document.createElement('div');
|
|
55
|
-
Object.assign(this.line.style, {
|
|
56
|
-
height: '4px',
|
|
57
|
-
marginTop: '2px',
|
|
58
|
-
background: 'rgba(255,255,255,0.9)',
|
|
59
|
-
borderLeft: '1px solid #fff',
|
|
60
|
-
borderRight: '1px solid #fff',
|
|
61
|
-
boxShadow: '0 0 3px #000',
|
|
62
|
-
});
|
|
63
|
-
this.bar.appendChild(this.label);
|
|
64
|
-
this.bar.appendChild(this.line);
|
|
65
|
-
this.host.appendChild(this.bar);
|
|
66
|
-
this.disconnectCamera = this.camera.changed.connect(() => this.update());
|
|
67
|
-
if (typeof ResizeObserver !== 'undefined') {
|
|
68
|
-
this.resizeObserver = new ResizeObserver(() => this.update());
|
|
69
|
-
this.resizeObserver.observe(this.host);
|
|
70
|
-
}
|
|
71
|
-
this.update();
|
|
72
|
-
}
|
|
73
|
-
update() {
|
|
74
|
-
const pxPerImagePx = this.camera.zoom; // CSS screen px per image pixel
|
|
75
|
-
if (!(this.mppX > 0) || !(pxPerImagePx > 0)) {
|
|
76
|
-
this.bar.style.display = 'none';
|
|
77
|
-
return;
|
|
78
|
-
}
|
|
79
|
-
const umPerScreenPx = this.mppX / pxPerImagePx;
|
|
80
|
-
const niceUm = niceLength(120 * umPerScreenPx); // target ~120px bar
|
|
81
|
-
this.bar.style.display = '';
|
|
82
|
-
this.line.style.width = `${Math.round(niceUm / umPerScreenPx)}px`;
|
|
83
|
-
this.label.textContent = formatUm(niceUm);
|
|
84
|
-
}
|
|
85
|
-
destroy() {
|
|
86
|
-
this.disconnectCamera();
|
|
87
|
-
this.resizeObserver?.disconnect();
|
|
88
|
-
if (this.bar.parentNode)
|
|
89
|
-
this.bar.parentNode.removeChild(this.bar);
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmFwYXJpLXNjYWxlLWJhci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvaW1wbGVtZW50YXRpb25zL25hcGFyaS1qcy9uYXBhcmktc2NhbGUtYmFyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILG9FQUFvRTtBQUNwRSxTQUFTLFVBQVUsQ0FBQyxDQUFTO0lBQzNCLElBQUksQ0FBQyxJQUFJLENBQUM7UUFBRSxPQUFPLENBQUMsQ0FBQztJQUNyQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JELE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7SUFDbkIsTUFBTSxJQUFJLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQzFELE9BQU8sSUFBSSxHQUFHLElBQUksQ0FBQztBQUNyQixDQUFDO0FBRUQ7MkRBQzJEO0FBQzNELE1BQU0sVUFBVSxRQUFRLENBQUMsRUFBVTtJQUNqQyxNQUFNLElBQUksR0FBRyxDQUFDLENBQVMsRUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFFLElBQUksRUFBRSxJQUFJLEdBQUc7UUFBRSxPQUFPLEdBQUcsSUFBSSxDQUFDLEVB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O1FBQ1osTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxnQ0FBZ0M7UUFDdkUsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDNUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztZQUNoQyxPQUFPO1FBQ1QsQ0FBQztRQUNELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsWUFBWSxDQUFDO1FBQy9DLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxHQUFHLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxvQkFBb0I7UUFDcEUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDO1FBQ2xFLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQsT0FBTztRQUNMLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxjQUFjLEVBQUUsVUFBVSxFQUFFLENBQUM7UUFDbEMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVU7WUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUGh5c2ljYWwgc2NhbGUgYmFyIGZvciB0aGUgbmFwYXJpLWpzIFdlYkdQVSBpbWFnZSB2aWV3IChqaXQtdWkjMTAyKSwgbWlycm9yaW5nIHRoZSBPU0RcbiAqIGJhY2tlbmQncyB7QGxpbmsgT3NkU2NhbGVCYXJ9LiBuYXBhcmkga2VlcHMgbGF5ZXJzIGF0IHBpeGVsIHNjYWxlLCBzbyB0aGUgY2FtZXJhJ3MgYHpvb21gXG4gKiAoQ1NTIHB4IHBlciB3b3JsZCB1bml0KSBpcyBleGFjdGx5IHNjcmVlbiBweCBwZXIgaW1hZ2UgcGl4ZWw7IGNvbWJpbmVkIHdpdGggdGhlIGltYWdlJ3NcbiAqIMK1bS9waXhlbCAoYG1wcFhgLCBmcm9tIEJpby1Gb3JtYXRzIGAvdGlsZXMvaW5mb2ApIHRoYXQgZ2l2ZXMgYSByZWFsLXdvcmxkIGJhciBsZW5ndGguXG4gKiBSZWNvbXB1dGVzIG9uIGV2ZXJ5IGNhbWVyYSBjaGFuZ2UgYW5kIGhvc3QgcmVzaXplLiBIaWRkZW4gd2hlbiB0aGUgaW1hZ2UgaGFzIG5vIHBoeXNpY2FsIHNpemUuXG4gKi9cblxuLyoqIFJvdW5kIHVwIHRvIGEgXCJuaWNlXCIgMS8yLzUgw5cgMTDigb8gdmFsdWUgZm9yIHNjYWxlLWJhciBsZW5ndGhzLiAqL1xuZnVuY3Rpb24gbmljZUxlbmd0aCh4OiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAoeCA8PSAwKSByZXR1cm4gMTtcbiAgY29uc3QgYmFzZSA9IE1hdGgucG93KDEwLCBNYXRoLmZsb29yKE1hdGgubG9nMTAoeCkpKTtcbiAgY29uc3QgZiA9IHggLyBiYXNlO1xuICBjb25zdCBuaWNlID0gZiA8IDEuNSA/IDEgOiBmIDwgMy41ID8gMiA6IGYgPCA3LjUgPyA1IDogMTA7XG4gIHJldHVybiBuaWNlICogYmFzZTtcbn1cblxuLyoqIEZvcm1hdCBhIGxlbmd0aCBnaXZlbiBpbiBtaWNyb21ldHJlcywgcGlja2luZyB0aGUgdW5pdCB0aGF0IHN1aXRzIGl0cyBtYWduaXR1ZGUgKGppdC1zZXJ2aWNlXG4gKiAgbm9ybWFsaXNlcyB3aGF0ZXZlciB1bml0IEJpby1Gb3JtYXRzIHJlcG9ydHMgdG8gwrVtKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRVbSh1bTogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgdHJpbSA9IChuOiBudW1iZXIpOiBzdHJpbmcgPT4gKG4gJSAxID09PSAwID8gYCR7bn1gIDogbi50b0ZpeGVkKDEpKTtcbiAgaWYgKHVtID49IDFlNikgcmV0dXJuIGAke3RyaW0odW0gLyAxZTYpfSBtYDtcbiAgaWYgKHVtID49IDFlNCkgcmV0dXJuIGAke3RyaW0odW0gLyAxZTQpfSBjbWA7XG4gIGlmICh1bSA+PSAxZTMpIHJldHVybiBgJHt0cmltKHVtIC8gMWUzKX0gbW1gO1xuICBpZiAodW0gPj0gMSkgcmV0dXJuIGAke3RyaW0odW0pfSDCtW1gO1xuICByZXR1cm4gYCR7dHJpbSh1bSAqIDEwMDApfSBubWA7XG59XG5cbi8qKlxuICogVGhlIHNsaWNlIG9mIHRoZSBuYXBhcmkgQ2FtZXJhIHRoZSBzY2FsZSBiYXIgcmVhZHMgKHpvb20gPSBDU1MgcHggcGVyIHdvcmxkL2ltYWdlIHBpeGVsKS5cbiAqXG4gKiBFeHBvcnRlZCBzbyB0aGUgM0Qgc3BhdGlhbCB2aWV3IGNhbiBzYXRpc2Z5IGl0IHdpdGggYSBzaGltOiBhbiBvcmJpdCBjYW1lcmEgaGFzIG5vIGB6b29tYCwgYnV0XG4gKiBweC1wZXItd29ybGQtdW5pdCBBVCBUSEUgUElWT1QgREVQVEggaXMgd2VsbCBkZWZpbmVkLCBhbmQgdGhhdCBpcyB3aGF0IGEgM0Qgc2NhbGUgYmFyIG1lYW5zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjYWxlQmFyQ2FtZXJhIHtcbiAgcmVhZG9ubHkgem9vbTogbnVtYmVyO1xuICByZWFkb25seSBjaGFuZ2VkOiB7IGNvbm5lY3QobGlzdGVuZXI6ICgpID0+IHZvaWQpOiAoKSA9PiB2b2lkIH07XG59XG5cbmV4cG9ydCBjbGFzcyBOYXBhcmlTY2FsZUJhciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYmFyOiBIVE1MRGl2RWxlbWVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBsaW5lOiBIVE1MRGl2RWxlbWVudDtcbiAgcHJpdmF0ZSByZWFkb25seSBsYWJlbDogSFRNTFNwYW5FbGVtZW50O1xuICBwcml2YXRlIHJlYWRvbmx5IGRpc2Nvbm5lY3RDYW1lcmE6ICgpID0+IHZvaWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzaXplT2JzZXJ2ZXI/OiBSZXNpemVPYnNlcnZlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGhvc3Q6IEhUTUxFbGVtZW50LFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2FtZXJhOiBTY2FsZUJhckNhbWVyYSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1wcFg6IG51bWJlcixcbiAgKSB7XG4gICAgLy8gVGhlIGJhciBpcyBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQgd2l0aGluIHRoZSBob3N0LCBzbyB0aGUgaG9zdCBtdXN0IGVzdGFibGlzaCBhIGNvbnRhaW5pbmdcbiAgICAvLyBibG9jayAodGhlIHBsb3QgaG9zdCBpcyBvZnRlbiBzdGF0aWNhbGx5IHBvc2l0aW9uZWQpLlxuICAgIGlmIChnZXRDb21wdXRlZFN0eWxlKGhvc3QpLnBvc2l0aW9uID09PSAnc3RhdGljJykgaG9zdC5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XG5cbiAgICB0aGlzLmJhciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIE9iamVjdC5hc3NpZ24odGhpcy5iYXIuc3R5bGUsIHtcbiAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgICAgbGVmdDogJzEycHgnLFxuICAgICAgYm90dG9tOiAnMTJweCcsXG4gICAgICB6SW5kZXg6ICczMCcsXG4gICAgICBwb2ludGVyRXZlbnRzOiAnbm9uZScsXG4gICAgICBjb2xvcjogJyNmZmYnLFxuICAgICAgZm9udDogJzExcHggc2Fucy1zZXJpZicsXG4gICAgICB0ZXh0U2hhZG93OiAnMCAwIDNweCAjMDAwJyxcbiAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXG4gICAgICB1c2VyU2VsZWN0OiAnbm9uZScsXG4gICAgfSBhcyBQYXJ0aWFsPENTU1N0eWxlRGVjbGFyYXRpb24+KTtcbiAgICB0aGlzLmxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgIHRoaXMubGluZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIE9iamVjdC5hc3NpZ24odGhpcy5saW5lLnN0eWxlLCB7XG4gICAgICBoZWlnaHQ6ICc0cHgnLFxuICAgICAgbWFyZ2luVG9wOiAnMnB4JyxcbiAgICAgIGJhY2tncm91bmQ6ICdyZ2JhKDI1NSwyNTUsMjU1LDAuOSknLFxuICAgICAgYm9yZGVyTGVmdDogJzFweCBzb2xpZCAjZmZmJyxcbiAgICAgIGJvcmRlclJpZ2h0OiAnMXB4IHNvbGlkICNmZmYnLFxuICAgICAgYm94U2hhZG93OiAnMCAwIDNweCAjMDAwJyxcbiAgICB9IGFzIFBhcnRpYWw8Q1NTU3R5bGVEZWNsYXJhdGlvbj4pO1xuICAgIHRoaXMuYmFyLmFwcGVuZENoaWxkKHRoaXMubGFiZWwpO1xuICAgIHRoaXMuYmFyLmFwcGVuZENoaWxkKHRoaXMubGluZSk7XG4gICAgdGhpcy5ob3N0LmFwcGVuZENoaWxkKHRoaXMuYmFyKTtcblxuICAgIHRoaXMuZGlzY29ubmVjdENhbWVyYSA9IHRoaXMuY2FtZXJhLmNoYW5nZWQuY29ubmVjdCgoKSA9PiB0aGlzLnVwZGF0ZSgpKTtcbiAgICBpZiAodHlwZW9mIFJlc2l6ZU9ic2VydmVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy5yZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB0aGlzLnVwZGF0ZSgpKTtcbiAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLmhvc3QpO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGUoKTogdm9pZCB7XG4gICAgY29uc3QgcHhQZXJJbWFnZVB4ID0gdGhpcy5jYW1lcmEuem9vbTsgLy8gQ1NTIHNjcmVlbiBweCBwZXIgaW1hZ2UgcGl4ZWxcbiAgICBpZiAoISh0aGlzLm1wcFggPiAwKSB8fCAhKHB4UGVySW1hZ2VQeCA+IDApKSB7XG4gICAgICB0aGlzLmJhci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB1bVBlclNjcmVlblB4ID0gdGhpcy5tcHBYIC8gcHhQZXJJbWFnZVB4O1xuICAgIGNvbnN0IG5pY2VVbSA9IG5pY2VMZW5ndGgoMTIwICogdW1QZXJTY3JlZW5QeCk7IC8vIHRhcmdldCB+MTIwcHggYmFyXG4gICAgdGhpcy5iYXIuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgIHRoaXMubGluZS5zdHlsZS53aWR0aCA9IGAke01hdGgucm91bmQobmljZVVtIC8gdW1QZXJTY3JlZW5QeCl9cHhgO1xuICAgIHRoaXMubGFiZWwudGV4dENvbnRlbnQgPSBmb3JtYXRVbShuaWNlVW0pO1xuICB9XG5cbiAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRpc2Nvbm5lY3RDYW1lcmEoKTtcbiAgICB0aGlzLnJlc2l6ZU9ic2VydmVyPy5kaXNjb25uZWN0KCk7XG4gICAgaWYgKHRoaXMuYmFyLnBhcmVudE5vZGUpIHRoaXMuYmFyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5iYXIpO1xuICB9XG59XG4iXX0=
|