@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
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import type { ChannelView } from 'napari-js';
|
|
2
|
+
import { IImageInfo } from '../../contracts/image.contract';
|
|
3
|
+
import { IHistogram } from '../../contracts/channel-histogram-api.contract';
|
|
4
|
+
/**
|
|
5
|
+
* Pure helpers and constants of the napari-js backend: no viewer, no store, no network. Shared by
|
|
6
|
+
* the service and its scenes (review Appendix B, step 1).
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* A short, stable id for a colormap value, for cache keys.
|
|
10
|
+
*
|
|
11
|
+
* Half the library's colormaps are NAMES and half are inline `[stop, colour]`
|
|
12
|
+
* arrays of 256 entries. Stringifying the array kind would put 6 KB in a key that
|
|
13
|
+
* is rebuilt and compared on every view change; hashing it keeps the key small,
|
|
14
|
+
* and it only has to distinguish one colormap from another.
|
|
15
|
+
*/
|
|
16
|
+
export declare function colormapId(value: unknown): string;
|
|
17
|
+
export declare const VOLUME_MAX_SLICE = 1024;
|
|
18
|
+
/** Reference in-plane world size (long side) for the volume/axes box, in arbitrary world units.
|
|
19
|
+
* The box is anchored to this reference regardless of the chosen decimate factor, so changing the
|
|
20
|
+
* resolution changes DETAIL, not the volume's proportions (Z no longer appears to shrink when the
|
|
21
|
+
* in-plane sampling grows). Set to the DEFAULT decimate's in-plane cap so the default view is
|
|
22
|
+
* unchanged; higher/lower resolutions keep that same shape. */
|
|
23
|
+
export declare const VOLUME_WORLD_INPLANE_REF: number;
|
|
24
|
+
/** Max concurrent slice fetches when assembling a volume — keeps the connection pool busy
|
|
25
|
+
* without flooding it (browsers cap ~6/host) on a deep stack. */
|
|
26
|
+
export declare const VOLUME_FETCH_CONCURRENCY = 8;
|
|
27
|
+
/** Volume/isosurface sampling for a decimate factor `scale` (1 = Full 1024, 2 = ½ 512, 4 = ¼ 256
|
|
28
|
+
* default, 8 = ⅛ 128): the in-plane cap halves each step; slices stay un-subsampled until ⅛, then
|
|
29
|
+
* subsample. */
|
|
30
|
+
export declare function volumeResolutionFor(scale: number): {
|
|
31
|
+
maxSlice: number;
|
|
32
|
+
sliceStep: number;
|
|
33
|
+
};
|
|
34
|
+
/** Fully-normalized intensity height as a fraction of the in-plane extent — matches the Plotly
|
|
35
|
+
* SURFACE z-aspect (~0.4) so the relief isn't exaggerated. */
|
|
36
|
+
export declare const SURFACE_Z_ASPECT = 0.4;
|
|
37
|
+
/** "Full" mesh grid cap; the decimate factor divides it (default ¼ → 220, ½ → 440, Full → 880). */
|
|
38
|
+
export declare const SURFACE_MAX_GRID = 880;
|
|
39
|
+
/** Coefficient scaling the pyramid tile budget with the target resolution — a higher target pulls a
|
|
40
|
+
* finer pyramid level (more real detail). Shared by the surface plane fetch + volume assembly. */
|
|
41
|
+
export declare const STITCH_BUDGET_COEFF = 16;
|
|
42
|
+
/** Surface mesh target grid for a decimate factor `scale`: the grid cap shrinks by `scale` (every
|
|
43
|
+
* slice is kept — the z-slider needs them all). The source is fetched at a matching resolution. */
|
|
44
|
+
export declare function surfaceResolutionFor(scale: number): {
|
|
45
|
+
maxGrid: number;
|
|
46
|
+
};
|
|
47
|
+
/** 3D scatter: in-plane cap for the assembled voxel grid, and the max number of points emitted
|
|
48
|
+
* (the grid is flat-strided down to this) — keeps the billboard count interactive. */
|
|
49
|
+
export declare const SCATTER3D_MAX_XY = 64;
|
|
50
|
+
export declare const SCATTER3D_MAX_POINTS = 150000;
|
|
51
|
+
/** How long a pan/zoom must settle before the viewport (and, for pixel tools, the canvas
|
|
52
|
+
* readback) is refreshed — coalesces the camera's per-frame changes. */
|
|
53
|
+
export declare const READBACK_DEBOUNCE_MS = 250;
|
|
54
|
+
export declare const TILE_SIZE = 512;
|
|
55
|
+
/** Max tiles stitched for one displayed slice (512px tiles → up to ~6144² at full res). Beyond
|
|
56
|
+
* this we step to a coarser pyramid level so a large image stays tractable. */
|
|
57
|
+
export declare const MAX_STITCH_TILES = 144;
|
|
58
|
+
/** WebGPU default `maxTextureDimension2D` — a stitched slice's longest side must fit a texture. */
|
|
59
|
+
export declare const MAX_TEXTURE_DIM = 8192;
|
|
60
|
+
/** Concurrent tile requests per stitched slice. Firing a whole grid at once (hundreds of requests
|
|
61
|
+
* for a large level) overwhelmed the tile server (504s); a small pool keeps the pipe full without
|
|
62
|
+
* flooding it — and slice-level workers already run several stitches in parallel on top of this. */
|
|
63
|
+
export declare const TILE_FETCH_CONCURRENCY = 6;
|
|
64
|
+
/** Split RGB tiles kept for a band that asks after the other two (see
|
|
65
|
+
* `NapariTileClient.rgbBandSources`): ~3 × 256 KB per 512px tile. */
|
|
66
|
+
export declare const RGB_BAND_CACHE_TILES = 16;
|
|
67
|
+
/** How long to poll `/tiles/info` (202 while the server caches the source) before falling back to
|
|
68
|
+
* a single tile. Generous like the OSD backend — a cold whole-slide can take minutes to cache. */
|
|
69
|
+
export declare const DESCRIPTOR_TIMEOUT_MS = 120000;
|
|
70
|
+
/** Wait between two `/tiles/info` polls while the server answers 202. */
|
|
71
|
+
export declare const DESCRIPTOR_POLL_INTERVAL_MS = 1200;
|
|
72
|
+
/** A decoded single-channel uint8 plane. */
|
|
73
|
+
export interface LumaPlane {
|
|
74
|
+
data: Uint8Array;
|
|
75
|
+
width: number;
|
|
76
|
+
height: number;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* `IChannelState.gamma` → the `gamma` a napari-js layer or view takes.
|
|
80
|
+
*
|
|
81
|
+
* The shared channel state follows the ImageJ/Fiji convention the OSD backend draws
|
|
82
|
+
* (`osd/display-pipeline.ts`: output = t^(1/γ), so γ > 1 BRIGHTENS the midtones), while
|
|
83
|
+
* napari-js's shaders apply `pow(t, gamma)` (napari's convention: γ > 1 darkens). Every gamma
|
|
84
|
+
* handed to napari-js goes through here, so one slider in the Channels & Histogram dialog moves
|
|
85
|
+
* both backends the same way. Both backends apply window → invert → gamma, per channel before
|
|
86
|
+
* an additive merge (NAPARI-BOUNDARY-2; pinned by `osd/display-pipeline.cross-backend.spec.ts`).
|
|
87
|
+
*/
|
|
88
|
+
export declare function toNapariGamma(gamma: number | undefined): number;
|
|
89
|
+
/** A 2D canvas (an `OffscreenCanvas` where available) and its context; throws, naming `what`,
|
|
90
|
+
* when no 2D context can be had. */
|
|
91
|
+
export declare function create2dCanvas(width: number, height: number, what: string): {
|
|
92
|
+
canvas: HTMLCanvasElement | OffscreenCanvas;
|
|
93
|
+
ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D;
|
|
94
|
+
};
|
|
95
|
+
/**
|
|
96
|
+
* Run `fn` over `items` with at most `concurrency` in flight — keeps the connection pool busy
|
|
97
|
+
* without flooding the server — starting no further item once `stop()` says so.
|
|
98
|
+
*/
|
|
99
|
+
export declare function mapPool<T>(items: readonly T[], concurrency: number, fn: (item: T) => Promise<void>, stop?: () => boolean): Promise<void>;
|
|
100
|
+
/** A serverless multichannel stack (`tiled:false` + `channelUrls`): no tile descriptor, so its
|
|
101
|
+
* channel count comes from `imageMeta`, and each band is fetched from its own plane URLs. */
|
|
102
|
+
export declare function isServerlessMultichannel(simple: boolean, info: IImageInfo | undefined): boolean;
|
|
103
|
+
/** The stack's declared slice count (`imageMeta.z`, else one URL per slice); 0 when unknown. */
|
|
104
|
+
export declare function stackDepth(info: IImageInfo | undefined): number;
|
|
105
|
+
/** The R, G and B bands of RGBA8 pixels as three uint8 planes (alpha dropped). */
|
|
106
|
+
export declare function splitRgbBands(px: {
|
|
107
|
+
data: ArrayLike<number>;
|
|
108
|
+
width: number;
|
|
109
|
+
height: number;
|
|
110
|
+
}): LumaPlane[];
|
|
111
|
+
/** A decoded single-channel uint8 plane as a napari-js typed image source. */
|
|
112
|
+
export declare function typedPlane(d: LumaPlane): ChannelView['source'];
|
|
113
|
+
/** Default tint for a channel index, cycling the Fiji palette. */
|
|
114
|
+
export declare function tintFor(channel: number): string;
|
|
115
|
+
/** Convert a napari-js `Histogram` (bin count + min/max) to the pane's `IHistogram` (bin edges). */
|
|
116
|
+
export declare function toIHistogram(h: {
|
|
117
|
+
counts: Uint32Array;
|
|
118
|
+
bins: number;
|
|
119
|
+
min: number;
|
|
120
|
+
max: number;
|
|
121
|
+
}): IHistogram;
|
|
122
|
+
/**
|
|
123
|
+
* Additively composite grayscale channel images, each tinted with its display colour —
|
|
124
|
+
* the navigator's picture of a multichannel image.
|
|
125
|
+
*/
|
|
126
|
+
export declare function tintedComposite(images: Array<CanvasImageSource & {
|
|
127
|
+
width: number;
|
|
128
|
+
height: number;
|
|
129
|
+
}>, colors: string[]): HTMLCanvasElement;
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import type { TiledSource } from 'napari-js';
|
|
2
|
+
import { IHistogram } from '../../contracts/channel-histogram-api.contract';
|
|
3
|
+
import { TileDescriptor } from '../tile-server';
|
|
4
|
+
import type { NapariScene, SceneContext } from './napari-scene';
|
|
5
|
+
/** What the scenes built over the 2D image add to it. */
|
|
6
|
+
export interface Image2dOptions {
|
|
7
|
+
/** Draw the loaded image (false: an image-less spatial dataset, the observations alone). */
|
|
8
|
+
image?: boolean;
|
|
9
|
+
/** Whether to fit the camera to the image once it is drawn (default: when there is one). */
|
|
10
|
+
fit?: () => boolean;
|
|
11
|
+
/** After a slice change. `rerendered` when the stitched path re-rendered the image — which
|
|
12
|
+
* CLEARS the layer list, taking every other layer with it. */
|
|
13
|
+
onSlice?: (rerendered: boolean) => void;
|
|
14
|
+
/** The pointer entered the navigator (e.g. to hide a hover tooltip over the canvas). */
|
|
15
|
+
onNavigatorInteract?: () => void;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* The 2D image (review Appendix B, cluster E): pyramidal `TiledSource`s against the `/tile`
|
|
19
|
+
* endpoint when `/tiles/info` describes the image, else a single stitched level (`tiled:false`
|
|
20
|
+
* stacks fetch each slice's own URL, a serverless multichannel stack each channel's own plane);
|
|
21
|
+
* multichannel additive tints, grayscale colormap or RGB (recoloured per band, see
|
|
22
|
+
* {@link syncRgbBands}); the coarse histogram samples of the tiled path, the scale bar, the
|
|
23
|
+
* overview navigator and the 2D interaction stack (region overlay + pixel tools). The
|
|
24
|
+
* region-centroid scatter and the spatial 2D scene are built over it.
|
|
25
|
+
*/
|
|
26
|
+
export declare class Image2dScene implements NapariScene {
|
|
27
|
+
private readonly ctx;
|
|
28
|
+
private readonly opts;
|
|
29
|
+
/** How the image is composited (drives the histogram and the display-state updates). */
|
|
30
|
+
imageMode: 'grayscale' | 'multichannel' | 'rgb';
|
|
31
|
+
/** True when the image is rendered via pyramidal TiledSources (descriptor available). */
|
|
32
|
+
tiled: boolean;
|
|
33
|
+
/** napari-js high-level view owning the per-channel layer set for {@link imageMode}. */
|
|
34
|
+
private channelView;
|
|
35
|
+
/** Latest wins for a stitched slice: a slow older slice can't clobber a newer one. */
|
|
36
|
+
private sliceReq;
|
|
37
|
+
/** RGB: the R, G and B bands as layer sources (typed planes, or band `TiledSource`s that share
|
|
38
|
+
* one request per tile) and the stitched level's scale — what {@link syncRgbBands} draws. */
|
|
39
|
+
private rgbBands;
|
|
40
|
+
/** RGB: the three additive band layers while the channel states recolour the image; null while
|
|
41
|
+
* the RGB layer draws it as it is. */
|
|
42
|
+
private bandLayers;
|
|
43
|
+
/** Coarse per-channel luminance sample (keyed by channel index) for the histogram in tiled mode,
|
|
44
|
+
* where the layers have no full in-memory pixels — and an RGB image's raw bands in either mode.
|
|
45
|
+
* Refreshed on mount + slice change. */
|
|
46
|
+
readonly histSamples: Map<number, Uint8Array>;
|
|
47
|
+
/** Latest-wins token for {@link refreshHistogramSamples}. */
|
|
48
|
+
private histGen;
|
|
49
|
+
/** Physical scale bar overlay (null when the image has no µm/pixel). */
|
|
50
|
+
private scaleBar;
|
|
51
|
+
/** Overview minimap (bottom-right), as OSD's navigator. */
|
|
52
|
+
private navigator;
|
|
53
|
+
/** Bumped per thumbnail request, so a slow one cannot overwrite a newer slice's. */
|
|
54
|
+
private navigatorToken;
|
|
55
|
+
/** The current slice's per-channel thumbnail bitmaps (multichannel only), kept so a tint or
|
|
56
|
+
* visibility change recolours the thumbnail without re-fetching it. */
|
|
57
|
+
private navigatorChannels;
|
|
58
|
+
/** The tints/visibility the thumbnail was last composited with — see {@link recolorNavigator}. */
|
|
59
|
+
private navigatorTintKey;
|
|
60
|
+
private displaySub;
|
|
61
|
+
constructor(ctx: SceneContext, opts?: Image2dOptions);
|
|
62
|
+
private get hasImage();
|
|
63
|
+
mount(): Promise<void>;
|
|
64
|
+
setZ(z: number): void;
|
|
65
|
+
histogram(channel: number, bins: number): IHistogram | null;
|
|
66
|
+
setImageSmoothing(enabled: boolean): void;
|
|
67
|
+
setNavigatorVisible(visible: boolean): void;
|
|
68
|
+
/** Show the navigator only for a dataset that brings pixels of its own (and when the user
|
|
69
|
+
* wants it): with no image of its own there is nothing for an overview to show. */
|
|
70
|
+
showNavigatorFor(datasetHasPixels: boolean): void;
|
|
71
|
+
dispose(): void;
|
|
72
|
+
/**
|
|
73
|
+
* Render slice `z`. With a server pyramid descriptor each layer is a pyramidal
|
|
74
|
+
* {@link TiledSource}, so the view refines to higher resolution on zoom (like OSD) and sits
|
|
75
|
+
* naturally in full-resolution coordinates; without one, the single-level stitch. Three display
|
|
76
|
+
* modes either way: multichannel additive tint, grayscale colormap, RGB.
|
|
77
|
+
*/
|
|
78
|
+
render(z: number, token?: number): Promise<void>;
|
|
79
|
+
/** Single-level stitch fallback (no descriptor): the pre-tiling path. */
|
|
80
|
+
private renderStitched;
|
|
81
|
+
/**
|
|
82
|
+
* Render with pyramidal {@link TiledSource}s — the view refines to higher resolution as you
|
|
83
|
+
* zoom in (the visual fetches the level whose texels ≈ screen pixels) and sits in full-res
|
|
84
|
+
* coordinates so regions align. Same three modes as the stitch path. Per-channel layers use the
|
|
85
|
+
* REAL pyramid levels (per-channel tiles only exist there); the composite uses all levels.
|
|
86
|
+
*/
|
|
87
|
+
private renderTiled;
|
|
88
|
+
/** A pyramidal TiledSource whose tiles count on the loading badge while `scene` (the render that
|
|
89
|
+
* asked for it, taken before its awaits) is current. */
|
|
90
|
+
tiledSource(desc: TileDescriptor, channel: number | undefined, channels: 1 | 4, scene: AbortSignal): TiledSource;
|
|
91
|
+
/** Channel `c`'s layer in the additive multichannel composite: tinted by its display colour
|
|
92
|
+
* (store, else descriptor, else the Fiji palette), with its window, gamma and visibility. */
|
|
93
|
+
private tintedChannelView;
|
|
94
|
+
/** The single grayscale layer: the selected colormap, with the channel's window and gamma. */
|
|
95
|
+
private grayscaleChannelView;
|
|
96
|
+
/** (Re)fetch a coarse per-channel luminance sample for the histogram (tiled mode has no full
|
|
97
|
+
* in-memory pixels). One cheap overview tile per channel, fetched together; cached by channel
|
|
98
|
+
* index. Latest wins: a scrub fires one refresh per slice, and an older slice's samples that
|
|
99
|
+
* land after a newer one's are dropped rather than shown as the current distribution. */
|
|
100
|
+
refreshHistogramSamples(z: number, desc: Pick<TileDescriptor, 'channels'>): Promise<void>;
|
|
101
|
+
/** Channel states + grayscale colormap → live-apply to the rendered layers (no re-fetch; only z
|
|
102
|
+
* changes re-fetch), and recolour the navigator thumbnail. */
|
|
103
|
+
private followDisplayState;
|
|
104
|
+
/** Apply the current channel states / colormap to the live layers (no re-fetch), delegating the
|
|
105
|
+
* per-channel layer mutations to the {@link MultiChannelImageView}. */
|
|
106
|
+
private applyDisplayState;
|
|
107
|
+
/**
|
|
108
|
+
* RGB: draw the image as it is while its channel states leave it so (default R/G/B tints, full
|
|
109
|
+
* window, γ 1, all shown, no invert: {@link rgbNeedsRecolor}) — the RGB layer, unchanged, with
|
|
110
|
+
* the coarse underlay a tiled one keeps while it pans. Otherwise draw its R, G and B bands as
|
|
111
|
+
* three additive layers, each with its channel's window, invert, gamma, tint and visibility —
|
|
112
|
+
* what OSD's RGB recolour computes per pixel (the merge order of `osd/display-pipeline`). The
|
|
113
|
+
* band layers sit just above the hidden RGB layer, so whatever is drawn over the image stays
|
|
114
|
+
* over it. A host with no R/G/B channel model (fewer than three states) gets only the invert.
|
|
115
|
+
*/
|
|
116
|
+
private syncRgbBands;
|
|
117
|
+
/** (Re)install the physical scale bar (napari-js's `ScaleBarOverlay` on the 2D camera's zoom),
|
|
118
|
+
* sized from the image's µm/pixel (`/tiles/info` mppX, falling back to the image metadata).
|
|
119
|
+
* No-op without a physical size. */
|
|
120
|
+
installScaleBar(): void;
|
|
121
|
+
/**
|
|
122
|
+
* The overview navigator (napari-js's `NavigatorOverlay`): a coarse thumbnail of the whole
|
|
123
|
+
* image with the viewport on it; click or drag to pan at the current zoom (as OSD).
|
|
124
|
+
*/
|
|
125
|
+
private installNavigator;
|
|
126
|
+
/**
|
|
127
|
+
* Draw the navigator's thumbnail from the coarsest pyramid level. A multichannel image
|
|
128
|
+
* is composited from its channels in their display colours (see {@link recolorNavigator}),
|
|
129
|
+
* so the overview looks like the view rather than like channel 0 in grey.
|
|
130
|
+
*/
|
|
131
|
+
private refreshNavigatorImage;
|
|
132
|
+
/** Replace the per-channel thumbnail bitmaps (closing the previous ones). */
|
|
133
|
+
private setNavigatorChannels;
|
|
134
|
+
/**
|
|
135
|
+
* Composite the multichannel thumbnail in the channels' CURRENT display tints, skipping hidden
|
|
136
|
+
* channels — the store's channel states, as the 2D layers use, not the server's defaults.
|
|
137
|
+
* Re-run on every display-state change; it only redraws (never re-fetches), and only when a
|
|
138
|
+
* tint or a visibility actually changed, so a window/gamma drag costs a string compare.
|
|
139
|
+
*/
|
|
140
|
+
private recolorNavigator;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* NAPARI_SCATTER (review Appendix B, cluster H): the slice image with a points layer at each
|
|
144
|
+
* region's centroid (the napari-js analog of Plotly's region-centroid scatter), rebuilt live as
|
|
145
|
+
* regions change. This mode plots REGION centroids, so the image's region tools come with it —
|
|
146
|
+
* drawing a region adds a point at once.
|
|
147
|
+
*/
|
|
148
|
+
export declare class ScatterRegionsScene implements NapariScene {
|
|
149
|
+
private readonly ctx;
|
|
150
|
+
readonly image: Image2dScene;
|
|
151
|
+
private points;
|
|
152
|
+
private regionSub;
|
|
153
|
+
constructor(ctx: SceneContext);
|
|
154
|
+
mount(): Promise<void>;
|
|
155
|
+
setZ(z: number): void;
|
|
156
|
+
histogram(channel: number, bins: number): IHistogram | null;
|
|
157
|
+
setImageSmoothing(enabled: boolean): void;
|
|
158
|
+
setNavigatorVisible(visible: boolean): void;
|
|
159
|
+
dispose(): void;
|
|
160
|
+
/** (Re)build the point layer at the current region centroids. */
|
|
161
|
+
private rebuildPoints;
|
|
162
|
+
}
|
|
@@ -1,19 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* "Transcripts reloading…" at the bottom of the canvas while a layer's data is in flight: one
|
|
3
3
|
* line naming every layer still loading, on a semi-opaque backing so it reads over any tissue.
|
|
4
|
+
* Longer work names itself ("Building HPF in 3D…") and joins the line.
|
|
4
5
|
*
|
|
5
6
|
* Shown only once something has been loading for {@link SHOW_AFTER_MS}, so a redraw served from
|
|
6
7
|
* cache does not flash it.
|
|
7
8
|
*/
|
|
8
9
|
export declare const SHOW_AFTER_MS = 150;
|
|
9
10
|
export declare class NapariLoadingBadge {
|
|
10
|
-
private readonly host;
|
|
11
11
|
private readonly el;
|
|
12
12
|
private names;
|
|
13
|
+
private tasks;
|
|
13
14
|
private timer;
|
|
14
15
|
constructor(host: HTMLElement);
|
|
15
|
-
/** The layers loading now; empty hides the badge. */
|
|
16
|
-
set(names: readonly string[]): void;
|
|
16
|
+
/** The layers loading now, and the tasks running (their messages); both empty hides the badge. */
|
|
17
|
+
set(names: readonly string[], tasks?: readonly string[]): void;
|
|
17
18
|
/** The text currently set (shown or about to be). */
|
|
18
19
|
get text(): string;
|
|
19
20
|
destroy(): void;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/** What the service itself counts on the badge; the spatial tile layers report their own names. */
|
|
2
|
+
export type LoadingSource = 'Image' | 'Observations';
|
|
3
|
+
/**
|
|
4
|
+
* "x reloading…" at the bottom of the canvas, aggregated over everything that loads into one
|
|
5
|
+
* scene: image tiles (the tile client), observation colourings (the spatial scenes) and the
|
|
6
|
+
* spatial tile layers' own loads (which report a list of layer names).
|
|
7
|
+
*
|
|
8
|
+
* Each load is a {@link begin} that hands back its own `end`. {@link reset} starts a new scene:
|
|
9
|
+
* the counts are dropped, and an `end` from a load that began before it is a no-op, so a load
|
|
10
|
+
* that settles after a re-plot can neither un-count the new scene's work nor drive a count below
|
|
11
|
+
* zero (which hid the next scene's "Observations reloading…" until a second load overlapped it).
|
|
12
|
+
*
|
|
13
|
+
* A {@link beginTask} is work that outlives a scene (a region's 3D reconstruction, built for
|
|
14
|
+
* whichever volume is on screen when it is done): its message stays across a reset.
|
|
15
|
+
*/
|
|
16
|
+
export declare class LoadingBadgeState {
|
|
17
|
+
private host;
|
|
18
|
+
private badge;
|
|
19
|
+
private readonly counts;
|
|
20
|
+
private tileLayers;
|
|
21
|
+
private generation;
|
|
22
|
+
private readonly tasks;
|
|
23
|
+
/** The element the badge is drawn into (the plot host); set per plot. */
|
|
24
|
+
attach(host: HTMLElement): void;
|
|
25
|
+
/** One load of `source` started; call the returned function once it settles. */
|
|
26
|
+
begin(source: LoadingSource): () => void;
|
|
27
|
+
/** A task started, shown by its `message` ("Building HPF in 3D…"); call the returned function
|
|
28
|
+
* once it settles. */
|
|
29
|
+
beginTask(message: string): () => void;
|
|
30
|
+
/** The spatial tile layers still loading (their own names, in their order). */
|
|
31
|
+
setTileLayers(layers: readonly string[]): void;
|
|
32
|
+
/** The text the badge has set (shown, or about to be once the show delay passes). */
|
|
33
|
+
get text(): string;
|
|
34
|
+
/** A new scene: forget every count and remove the badge (tasks show again on the next attach). */
|
|
35
|
+
reset(): void;
|
|
36
|
+
private show;
|
|
37
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { RegionMesh3D } from './napari-volume-region-meshes';
|
|
2
|
+
export interface RegionMeshPointerOptions {
|
|
3
|
+
/** The surface under canvas point (`x`, `y`) (CSS px), or null. */
|
|
4
|
+
pickAt(x: number, y: number): RegionMesh3D | null;
|
|
5
|
+
/** Whether a click picks (the selection tool armed, surfaces shown); otherwise clicks are left alone. */
|
|
6
|
+
active(): boolean;
|
|
7
|
+
/** Whether hovering names the surface under the pointer (surfaces shown, whatever the tool). */
|
|
8
|
+
hoverable(): boolean;
|
|
9
|
+
/** A click on a surface (its key), or on none (null); `additive` with Shift / Ctrl / ⌘. */
|
|
10
|
+
onPick(key: string | null, additive: boolean): void;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Clicks and hover on the region surfaces of a volume view: a click (a press that does not orbit)
|
|
14
|
+
* picks the surface under it, or none; resting over a surface shows its name in a tooltip (and a
|
|
15
|
+
* pointer cursor when a click would pick it). Listens on the canvas without stopping events, so the
|
|
16
|
+
* camera still orbits.
|
|
17
|
+
*/
|
|
18
|
+
export declare class RegionMeshPointer {
|
|
19
|
+
private readonly canvas;
|
|
20
|
+
private readonly opts;
|
|
21
|
+
private readonly tip;
|
|
22
|
+
private down;
|
|
23
|
+
private hoverTimer;
|
|
24
|
+
constructor(canvas: HTMLElement, host: HTMLElement, opts: RegionMeshPointerOptions);
|
|
25
|
+
destroy(): void;
|
|
26
|
+
private local;
|
|
27
|
+
private readonly onDown;
|
|
28
|
+
private readonly onUp;
|
|
29
|
+
private readonly onMove;
|
|
30
|
+
private readonly onLeave;
|
|
31
|
+
private hide;
|
|
32
|
+
}
|
|
@@ -1,16 +1,29 @@
|
|
|
1
1
|
import { IRegionOverlay, RegionToolMode } from '../../contracts/region-overlay.contract';
|
|
2
2
|
import { RegionStore } from '../../store/region-store.service';
|
|
3
|
+
import type { Affine } from '../../region-overlay/svg-region-renderer';
|
|
3
4
|
/**
|
|
4
5
|
* The slice of the napari Viewer the overlay needs (coord transforms + control gating).
|
|
5
6
|
*
|
|
7
|
+
* COORDINATE SPACES: `canvasToWorld` takes CLIENT pixels (viewport coordinates, as a pointer
|
|
8
|
+
* event's `clientX/Y`), exactly as napari-js `Viewer.canvasToWorld` does. `canvasTransform` is
|
|
9
|
+
* the camera's world → CANVAS-LOCAL CSS-pixel affine, napari-js `Viewer.canvasTransform`, which
|
|
10
|
+
* reads no layout: drawing and following the camera use it, so a camera frame costs one
|
|
11
|
+
* `matrix(...)` and no `getBoundingClientRect()` (review NAPARI-BOUNDARY-10). The svg covers the
|
|
12
|
+
* plot host and the canvas is the host's in-flow child at its top-left, so canvas-local and
|
|
13
|
+
* svg-local pixels are the same; a pointer's client pixels are mapped into the svg by the
|
|
14
|
+
* overlay itself.
|
|
15
|
+
*
|
|
6
16
|
* Exported because the 3D spatial mode supplies a SCREEN-SPACE implementation of it: there the
|
|
7
17
|
* drawn shape is a lasso in canvas pixels, not a rectangle in image space, so "world" is the
|
|
8
|
-
* canvas itself
|
|
9
|
-
* overlay — every tool, the handles, the store
|
|
18
|
+
* canvas itself — `canvasToWorld` is the client → canvas offset and `canvasTransform` the
|
|
19
|
+
* identity. That lets the 3D view reuse this whole overlay — every tool, the handles, the store
|
|
20
|
+
* round-trip — with no 3D-specific drawing code.
|
|
10
21
|
*/
|
|
11
22
|
export interface OverlayViewer {
|
|
23
|
+
/** Client px → world. */
|
|
12
24
|
canvasToWorld(clientX: number, clientY: number): [number, number];
|
|
13
|
-
|
|
25
|
+
/** World → canvas-local (= svg-local) CSS px, as an SVG affine `[a, b, c, d, e, f]`. */
|
|
26
|
+
canvasTransform(): Affine;
|
|
14
27
|
setControlsEnabled(enabled: boolean): void;
|
|
15
28
|
readonly camera: {
|
|
16
29
|
readonly changed: {
|
|
@@ -20,22 +33,34 @@ export interface OverlayViewer {
|
|
|
20
33
|
}
|
|
21
34
|
/**
|
|
22
35
|
* SVG region overlay for the napari-js WebGPU image view (jit-ui#102), mirroring the OSD backend's
|
|
23
|
-
* {@link OsdRegionOverlay} but driven by napari's `canvasToWorld`/`
|
|
36
|
+
* {@link OsdRegionOverlay} but driven by napari's `canvasToWorld`/`canvasTransform` transforms
|
|
37
|
+
* (see {@link OverlayViewer} for their coordinate spaces).
|
|
24
38
|
* Vector shapes are drawn in an absolutely-positioned `<svg>` over the canvas (no need to push
|
|
25
|
-
* them through WebGPU)
|
|
26
|
-
*
|
|
27
|
-
*
|
|
39
|
+
* them through WebGPU) by {@link NapariRegionSvgRenderer} over the shared `SvgRegionRenderer`:
|
|
40
|
+
* in world coordinates inside one transformed group, rebuilt on a region or selection change,
|
|
41
|
+
* while a camera move only rewrites the transform (napari-js's `canvasTransform`, the camera
|
|
42
|
+
* centre/zoom) and the few screen-space handles and labels. This class is
|
|
43
|
+
* the gesture controller: pointer handlers, the tool mode, and the edit/draft/marquee state.
|
|
44
|
+
* It writes completed shapes to the shared {@link RegionStore} (so save / undo / export work
|
|
45
|
+
* identically to OSD).
|
|
28
46
|
*
|
|
29
47
|
* Supports (jit-ui#102): rectangle / polygon / freehand path drawing, click-select and rubber-band
|
|
30
48
|
* marquee select, pan/zoom gating via `setControlsEnabled`, body move, vertex move/add/delete,
|
|
31
|
-
* bezier handle editing, and donut holes (including hole vertex + hole-bezier-handle editing)
|
|
32
|
-
*
|
|
49
|
+
* bezier handle editing, and donut holes (including hole vertex + hole-bezier-handle editing).
|
|
50
|
+
* Hit-testing shares `region-overlay/region-geometry` with the OSD overlay, so both follow
|
|
51
|
+
* the same rules (multi-part regions, holes, open polylines, handle-less bezier curves).
|
|
33
52
|
*/
|
|
34
53
|
export declare class NapariRegionOverlay implements IRegionOverlay {
|
|
35
54
|
private readonly host;
|
|
36
55
|
private readonly viewer;
|
|
37
56
|
private readonly store;
|
|
38
57
|
private readonly svg;
|
|
58
|
+
private readonly renderer;
|
|
59
|
+
/** The image's region source, drawn under the regions at the zoom's level of detail; null
|
|
60
|
+
* where world is not the image (the 3D view's screen-space lassos). */
|
|
61
|
+
private readonly sourceLayer;
|
|
62
|
+
/** Client ↔ svg-local ↔ world conversions, with the svg origin read once per gesture/redraw. */
|
|
63
|
+
private readonly projection;
|
|
39
64
|
private readonly subs;
|
|
40
65
|
private readonly disconnectCamera;
|
|
41
66
|
private mode;
|
|
@@ -44,15 +69,15 @@ export declare class NapariRegionOverlay implements IRegionOverlay {
|
|
|
44
69
|
private draftRect;
|
|
45
70
|
/** In-progress rubber-band selection marquee (select mode), image-space. */
|
|
46
71
|
private marquee;
|
|
47
|
-
/** Dedicated marquee rect element, updated directly during the drag (no full region redraw). */
|
|
48
|
-
private marqueeEl;
|
|
49
72
|
private draftPath;
|
|
50
73
|
private drawing;
|
|
51
74
|
private regionsVisible;
|
|
52
75
|
/** In-progress manipulation (select/move modes): dragging a body, a polygon vertex, or a
|
|
53
76
|
* rectangle corner. `anchor` is the fixed opposite corner for a rectangle resize. */
|
|
54
77
|
private edit;
|
|
55
|
-
constructor(host: HTMLElement, viewer: OverlayViewer, store: RegionStore
|
|
78
|
+
constructor(host: HTMLElement, viewer: OverlayViewer, store: RegionStore, opts?: {
|
|
79
|
+
regionSource?: boolean;
|
|
80
|
+
});
|
|
56
81
|
/**
|
|
57
82
|
* Whether a region tool currently owns the pointer.
|
|
58
83
|
*
|
|
@@ -65,88 +90,60 @@ export declare class NapariRegionOverlay implements IRegionOverlay {
|
|
|
65
90
|
setMode(mode: RegionToolMode): void;
|
|
66
91
|
setSelectedBezier(bezier: boolean): void;
|
|
67
92
|
/**
|
|
68
|
-
* How finely a drawn vertex may be placed, in world units
|
|
69
|
-
*
|
|
70
|
-
* One by default, because for an image the world IS pixels and a region should align to
|
|
71
|
-
* them. A dataset whose coordinates are not pixels sets it finer — seqFISH's whole
|
|
72
|
-
* sample spans about 5 x 7 units, where whole-unit vertices leave roughly six by eight
|
|
73
|
-
* placeable positions and no ROI can be drawn at all.
|
|
93
|
+
* How finely a drawn vertex may be placed, in world units: one (an image's pixels) by
|
|
94
|
+
* default, finer for a dataset whose coordinates are not pixels (see OverlayProjection).
|
|
74
95
|
*/
|
|
75
|
-
private worldQuantum;
|
|
76
96
|
setWorldQuantum(quantum: number): void;
|
|
77
97
|
destroy(): void;
|
|
78
|
-
/** Pointer client coords → world coords, snapped to {@link worldQuantum}. */
|
|
79
|
-
private toImage;
|
|
80
|
-
/**
|
|
81
|
-
* World units spanned by one screen pixel, measured through the viewer's own transform.
|
|
82
|
-
*
|
|
83
|
-
* Read from the transform rather than from the camera, so it holds for both the 2D and
|
|
84
|
-
* the 3D screen-space adapters without either having to expose a zoom. Falls back to 1
|
|
85
|
-
* if the transform gives nothing usable, which keeps the established pixel behaviour
|
|
86
|
-
* rather than collapsing the threshold to zero and recording a point per event.
|
|
87
|
-
*/
|
|
88
|
-
private worldPerCanvasPixel;
|
|
89
|
-
/** Image coords → SVG-local px (the svg overlays the canvas at the same client rect). */
|
|
90
|
-
private toLocal;
|
|
91
98
|
private readonly onPointerDown;
|
|
99
|
+
private pointerDown;
|
|
92
100
|
private readonly onPointerMove;
|
|
93
101
|
private readonly onPointerUp;
|
|
102
|
+
/**
|
|
103
|
+
* The pointer gesture ended without a pointerup (the browser cancelled it, or capture was
|
|
104
|
+
* lost): end it without committing. Also fires after every normal release, when nothing
|
|
105
|
+
* is live any more.
|
|
106
|
+
*/
|
|
107
|
+
private readonly onPointerCancel;
|
|
108
|
+
/**
|
|
109
|
+
* End whatever pointer gesture is live without committing it: close the store batch a drag
|
|
110
|
+
* opened (so later edits are emitted again) and forget the drag (so a bare hover no longer
|
|
111
|
+
* moves the region), and drop the marquee and a rectangle/freehand draft. A click-placed
|
|
112
|
+
* polygon is not a pointer gesture and survives.
|
|
113
|
+
*/
|
|
114
|
+
private endGesture;
|
|
94
115
|
/** Click-to-place polygon: add a vertex, or close when clicking near the first one. */
|
|
95
116
|
private handlePolygonClick;
|
|
96
117
|
private readonly onDblClick;
|
|
97
118
|
/** The currently-selected region (single selection), or null. */
|
|
98
119
|
private selectedRegion;
|
|
99
|
-
/** Screen distance (px) between a client point and an image coord. */
|
|
100
|
-
private screenDist;
|
|
101
120
|
/**
|
|
102
121
|
* Start a select/move interaction: grab a handle (rectangle corner) or vertex of the already-
|
|
103
122
|
* selected region first; otherwise select the topmost region under the cursor and drag its body.
|
|
104
123
|
*/
|
|
105
124
|
private beginManipulation;
|
|
106
|
-
/**
|
|
125
|
+
/** Show the marquee where it is now (only the marquee element: no full region redraw). */
|
|
107
126
|
private updateMarqueeEl;
|
|
108
|
-
/**
|
|
109
|
-
|
|
110
|
-
/** Test whether a client point grabs a rectangle corner or a polygon vertex of `region`. */
|
|
111
|
-
private hitHandle;
|
|
112
|
-
/** Apply the live drag for the active manipulation (image coords `ix,iy`). */
|
|
113
|
-
private applyManipulation;
|
|
114
|
-
/** addpoint mode: insert a vertex on the selected polygon's nearest edge at the click. */
|
|
127
|
+
/** addpoint mode: insert a vertex at the click on the selected polygon's nearest edge
|
|
128
|
+
* (exterior or a hole ring). */
|
|
115
129
|
private handleAddPoint;
|
|
116
|
-
/** deletepoint mode: remove the selected polygon's vertex nearest the click
|
|
130
|
+
/** deletepoint mode: remove the selected polygon's vertex nearest the click (exterior or a
|
|
131
|
+
* hole ring). */
|
|
117
132
|
private handleDeletePoint;
|
|
118
|
-
/**
|
|
119
|
-
|
|
120
|
-
/** Finalize a rubber-band marquee: select every region whose bounding box it overlaps (a tiny
|
|
121
|
-
* marquee is treated as a click on empty space → clear the selection). */
|
|
133
|
+
/** Finalize a rubber-band marquee: select every region whose bounding box it overlaps (a
|
|
134
|
+
* marquee under {@link MIN_MARQUEE_PX} is a click on empty space → clear the selection). */
|
|
122
135
|
private finishMarquee;
|
|
123
|
-
/** A region's bounding box in image coords (rectangle, polygon, or multipolygon), or null. */
|
|
124
|
-
private regionBBox;
|
|
125
136
|
private commitRectangle;
|
|
126
137
|
private commitPolygon;
|
|
127
|
-
private hitTest;
|
|
128
138
|
/** Show or hide the drawn regions. A region being drawn stays visible either way. */
|
|
129
139
|
setRegionsVisible(visible: boolean): void;
|
|
140
|
+
/** Follow a camera move: one transform attribute plus the screen-space elements. */
|
|
141
|
+
private updateCamera;
|
|
142
|
+
/**
|
|
143
|
+
* Rebuild every element from the store: the regions in world coordinates (one transformed
|
|
144
|
+
* group), their labels, and the overlay. Reads no layout: the camera affine is the viewer's.
|
|
145
|
+
*/
|
|
130
146
|
redraw(): void;
|
|
131
|
-
/**
|
|
132
|
-
private
|
|
133
|
-
/** Draw grab handles for the selected region: rectangle corners or polygon vertices. */
|
|
134
|
-
private drawHandles;
|
|
135
|
-
/** Draw one bezier control point (anchor + handle offset) as a small circle connected to its
|
|
136
|
-
* anchor by a tangent line. `handle` is the [dx,dy] offset from the anchor in image space. */
|
|
137
|
-
private drawBezierHandle;
|
|
138
|
-
private buildRegionEl;
|
|
139
|
-
/** Path data for a polygon: the exterior ring (bezier or straight) plus any holes (bezier when
|
|
140
|
-
* the donut carries hole handles, else straight) as sub-paths — even-odd fill cuts them out. */
|
|
141
|
-
private polygonPathData;
|
|
142
|
-
/** SVG path data for a straight ring/polyline in image coords (closed appends `Z`). */
|
|
143
|
-
private straightPath;
|
|
144
|
-
/** SVG cubic-bezier path data for any ring (exterior or hole): anchors joined by cubic segments
|
|
145
|
-
* whose control points are `anchor + handleOut` (leaving) and `nextAnchor + handleIn` (arriving),
|
|
146
|
-
* in image space. Used for both the exterior and (donut) hole rings. */
|
|
147
|
-
private ringBezierPath;
|
|
148
|
-
private style;
|
|
149
|
-
/** Draw the in-progress rectangle / path preview. */
|
|
150
|
-
private drawDraft;
|
|
151
|
-
private styleDraft;
|
|
147
|
+
/** Rebuild the screen-space overlay only: the selected regions' handles and the draft. */
|
|
148
|
+
private renderOverlay;
|
|
152
149
|
}
|