@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,66 @@
|
|
|
1
|
+
import type { Viewer } from 'napari-js';
|
|
2
|
+
/** A region's 3D reconstruction to show in the volume: a mesh in image px (x, y) and slices (z). */
|
|
3
|
+
export interface RegionMesh3D {
|
|
4
|
+
/** Identity (a class name): a mesh with the same key and arrays is kept, not rebuilt. */
|
|
5
|
+
key: string;
|
|
6
|
+
/** `#rrggbb`. */
|
|
7
|
+
color: string;
|
|
8
|
+
/** What hovering it shows ("HPF · Hippocampal formation"); default: the key. */
|
|
9
|
+
label?: string;
|
|
10
|
+
vertices: Float32Array;
|
|
11
|
+
faces: Uint32Array;
|
|
12
|
+
}
|
|
13
|
+
/** Where the stack sits in the volume's world: its full size, and the centred world box it fills. */
|
|
14
|
+
export interface VolumeFrame {
|
|
15
|
+
/** Image width, height (px) and slice count. */
|
|
16
|
+
size: [number, number, number];
|
|
17
|
+
/** The world box (centred on the origin), Z as currently stretched. */
|
|
18
|
+
world: [number, number, number];
|
|
19
|
+
}
|
|
20
|
+
/** Opacity of a region's surface in the volume. */
|
|
21
|
+
export declare const REGION_MESH_OPACITY = 0.55;
|
|
22
|
+
/** While some surfaces are highlighted: theirs (near opaque, so their shape reads) … */
|
|
23
|
+
export declare const REGION_MESH_HIGHLIGHT_OPACITY = 0.9;
|
|
24
|
+
/** … and the others' (ghosted: still there for context, not in the way). */
|
|
25
|
+
export declare const REGION_MESH_DIMMED_OPACITY = 0.12;
|
|
26
|
+
/**
|
|
27
|
+
* The region reconstructions shown in a volume view: one translucent surface per region, in its
|
|
28
|
+
* colour, placed in the volume's world box (pixel x, y and slice z mapped onto it the way the
|
|
29
|
+
* volume maps its voxels) and re-placed when the volume's Z is stretched. A surface is updated in
|
|
30
|
+
* place (`setData`, `color`) rather than added again, and picked by napari-js (`pickSurface`).
|
|
31
|
+
*
|
|
32
|
+
* Highlighting is focus + context: the highlighted surfaces turn near opaque and the others fade
|
|
33
|
+
* to a ghost, so the selection stands out while staying in place among its neighbours.
|
|
34
|
+
*/
|
|
35
|
+
export declare class VolumeRegionMeshes {
|
|
36
|
+
private readonly viewer;
|
|
37
|
+
private readonly layers;
|
|
38
|
+
private highlighted;
|
|
39
|
+
private hidden;
|
|
40
|
+
/** The meshes to show (kept while the volume has no frame yet). */
|
|
41
|
+
private wanted;
|
|
42
|
+
private frame;
|
|
43
|
+
constructor(viewer: Viewer);
|
|
44
|
+
/** Show exactly `meshes` (adding, keeping or removing surfaces). */
|
|
45
|
+
set(meshes: readonly RegionMesh3D[]): void;
|
|
46
|
+
/** Follow the volume's frame (it opened, or its Z was stretched): re-place every surface. */
|
|
47
|
+
setFrame(frame: VolumeFrame): void;
|
|
48
|
+
/** Highlight the surfaces of these keys (none: every surface as usual). */
|
|
49
|
+
setHighlight(keys: Iterable<string>): void;
|
|
50
|
+
/** Hide the surfaces of these keys (they are kept, so showing them again is instant). */
|
|
51
|
+
setHidden(keys: Iterable<string>): void;
|
|
52
|
+
/** The front-most surface under screen point (`x`, `y`) (canvas CSS px), or null. */
|
|
53
|
+
pickAt(x: number, y: number): RegionMesh3D | null;
|
|
54
|
+
/** The meshes shown. */
|
|
55
|
+
get shown(): RegionMesh3D[];
|
|
56
|
+
clear(): void;
|
|
57
|
+
private sync;
|
|
58
|
+
private add;
|
|
59
|
+
private opacityOf;
|
|
60
|
+
private remove;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Image px / slice coordinates → the volume's centred world box: pixel x of a `w`-wide image
|
|
64
|
+
* spans the box's width, slice k sits at the middle of its share of the box's depth.
|
|
65
|
+
*/
|
|
66
|
+
export declare function toWorld(vertices: Float32Array, frame: VolumeFrame): Float32Array;
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { MultiChannelVolumeView } from 'napari-js';
|
|
2
|
+
import type { AxisLabelSpec } from 'napari-js/overlays';
|
|
3
|
+
import { IImageInfo } from '../../contracts/image.contract';
|
|
4
|
+
import { IHistogram } from '../../contracts/channel-histogram-api.contract';
|
|
5
|
+
import { IIsosurfaceControls, ISurface3dControls } from '../../contracts/visualizer.contract';
|
|
6
|
+
import { Axes3dGizmo, Box3 } from './napari-axes-gizmo';
|
|
7
|
+
import type { NapariScene, SceneContext, VolumeVoxelsOnScreen } from './napari-scene';
|
|
8
|
+
import { RegionMesh3D } from './napari-volume-region-meshes';
|
|
9
|
+
import { SlicePlanes } from './napari-volume-slice-planes';
|
|
10
|
+
/**
|
|
11
|
+
* NAPARI_VOLUME / NAPARI_ISOSURFACE (review Appendix B, cluster F): the stack assembled into a
|
|
12
|
+
* decimated volume — one additive, tinted `VolumeLayer` per channel for a multichannel image, a
|
|
13
|
+
* single grayscale volume otherwise — with the axes gizmo and the in-view Z-height handle.
|
|
14
|
+
*/
|
|
15
|
+
export declare class VolumeScene implements NapariScene {
|
|
16
|
+
private readonly ctx;
|
|
17
|
+
private readonly info;
|
|
18
|
+
private readonly rendering;
|
|
19
|
+
/** napari-js high-level view owning the volume layers. */
|
|
20
|
+
view: MultiChannelVolumeView | null;
|
|
21
|
+
/** True when the volume is composited from per-channel layers (vs a single grayscale volume). */
|
|
22
|
+
private multichannel;
|
|
23
|
+
/** Volume world box at Z-scale 1 (base) + the sampled voxel depth — enough to recompute the
|
|
24
|
+
* Z-axis voxel scale, axes depth, and overlay anchors as the handle stretches Z. */
|
|
25
|
+
private worldBase;
|
|
26
|
+
private sampledDepth;
|
|
27
|
+
private dims;
|
|
28
|
+
/** Assembled uint8 volume data per channel (key = channel index), kept for the volume intensity
|
|
29
|
+
* histogram. Key 0 holds the grayscale/composite volume in the single-channel case. */
|
|
30
|
+
private readonly channelData;
|
|
31
|
+
gizmo: Axes3dGizmo | null;
|
|
32
|
+
private zHandle;
|
|
33
|
+
private displaySub;
|
|
34
|
+
/** Regions' 3D reconstructions shown in the volume (see {@link setRegionMeshes}). */
|
|
35
|
+
private readonly regionMeshes;
|
|
36
|
+
/** The planes of the sections shown beside the volume, marked and draggable in it. */
|
|
37
|
+
private readonly slicePlanes;
|
|
38
|
+
/** The image's full size (px, px, slices), which reconstructions are in. */
|
|
39
|
+
private fullSize;
|
|
40
|
+
/** Clicks and hover on the reconstructions (with the selection tool). */
|
|
41
|
+
private meshPointer;
|
|
42
|
+
private toolSub;
|
|
43
|
+
private selecting;
|
|
44
|
+
constructor(ctx: SceneContext, info: IImageInfo | undefined, rendering: 'iso' | 'mip');
|
|
45
|
+
/** Show these region reconstructions in the volume (replacing the ones shown). */
|
|
46
|
+
setRegionMeshes(meshes: readonly RegionMesh3D[]): void;
|
|
47
|
+
setRegionHighlight(keys: readonly string[]): void;
|
|
48
|
+
setRegionHidden(keys: readonly string[]): void;
|
|
49
|
+
/** Whether the volume lets every region through (see {@link setRegionsThroughVolume}). */
|
|
50
|
+
private regionsThrough;
|
|
51
|
+
/**
|
|
52
|
+
* The volume hides the region reconstructions behind what it shows (its brightest sample along
|
|
53
|
+
* each ray, napari-js's `'translucent'` depth) — the perspective of a region behind the
|
|
54
|
+
* cerebellum — or, `through`, hides none (`'translucent_no_depth'`): surfaces traced inside its
|
|
55
|
+
* bright structures, an OCT's layer boundaries in its bright bands, which that depth speckles
|
|
56
|
+
* or hides. A multichannel volume's channels add up and hide nothing either way.
|
|
57
|
+
*/
|
|
58
|
+
setRegionsThroughVolume(through: boolean): void;
|
|
59
|
+
private applyVolumeDepth;
|
|
60
|
+
/** Show the planes of the sections beside the volume where they are (null: hide one). */
|
|
61
|
+
setSlicePlanes(planes: SlicePlanes): void;
|
|
62
|
+
/**
|
|
63
|
+
* The assembled volume's voxels per channel (key 0: the grayscale one), its frame, and whether
|
|
64
|
+
* it is a multichannel composite — what the sections beside it are cut from. Null before it is
|
|
65
|
+
* assembled.
|
|
66
|
+
*/
|
|
67
|
+
volumeVoxels(): VolumeVoxelsOnScreen | null;
|
|
68
|
+
/**
|
|
69
|
+
* Picking the reconstructions: with the selection tool armed, a click on one selects its class
|
|
70
|
+
* (null beside them); resting over one names it, whatever the tool.
|
|
71
|
+
*/
|
|
72
|
+
private listenToRegionMeshes;
|
|
73
|
+
/** Image px per voxel of the assembled volume (in-plane), or null before it is assembled. */
|
|
74
|
+
voxelStep(): number | null;
|
|
75
|
+
/** Place the region reconstructions in the volume's world box as it is now. */
|
|
76
|
+
private frameRegionMeshes;
|
|
77
|
+
/**
|
|
78
|
+
* Assemble and render the volume, then add the axes gizmo + labels and the Z handle and follow
|
|
79
|
+
* the display state.
|
|
80
|
+
*/
|
|
81
|
+
mount(): Promise<void>;
|
|
82
|
+
/**
|
|
83
|
+
* Assemble each channel's volume from the server tiles (or the single grayscale volume) under
|
|
84
|
+
* the stack progress bar, with the display settings it is drawn with. `dims` is null when
|
|
85
|
+
* nothing was assembled (a Cancel, a new plot, or no slices).
|
|
86
|
+
*/
|
|
87
|
+
private assembleChannels;
|
|
88
|
+
/** The volume's world box for the assembled `dims`, independent of the decimate factor. */
|
|
89
|
+
private worldBox;
|
|
90
|
+
/**
|
|
91
|
+
* The whole stack is already on screen: no plane to step. (This used to write `viewer.dims.z`,
|
|
92
|
+
* which only a tiled 2D image reads — a volume raymarches every slice — and schedule a readback
|
|
93
|
+
* of a frame that had not changed. The toolbar shows no slice control in volume / isosurface
|
|
94
|
+
* mode, as Plotly's isosurface ignores the slice too.)
|
|
95
|
+
*/
|
|
96
|
+
setZ(): void;
|
|
97
|
+
/** The intensity histogram of the assembled (downsampled) uint8 volume for the requested
|
|
98
|
+
* channel (multichannel) or the single grayscale volume. */
|
|
99
|
+
histogram(channel: number, bins: number): IHistogram | null;
|
|
100
|
+
isoControls(): IIsosurfaceControls | null;
|
|
101
|
+
surface3dControls(): ISurface3dControls | null;
|
|
102
|
+
dispose(): void;
|
|
103
|
+
/**
|
|
104
|
+
* Restretch the volume's Z height live (driven by the in-view {@link NapariVolumeZHandle}). Only
|
|
105
|
+
* the per-axis `voxelSize` / axes depth change — the voxel textures are untouched — so dragging is
|
|
106
|
+
* smooth. `factor` is relative to the volume's natural proportions (1). Persists across re-mounts
|
|
107
|
+
* (resolution changes) so the chosen height sticks.
|
|
108
|
+
*/
|
|
109
|
+
setZScale(factor: number): void;
|
|
110
|
+
/** The X/Y/Z axis-end label specs for the gizmo. Anchors are in the volume's centred world box
|
|
111
|
+
* (matching the AxesLayer geometry); the scale text reflects the FULL image extent — physical µm
|
|
112
|
+
* when µm/pixel is known, else pixel (X/Y) / slice (Z) counts. */
|
|
113
|
+
axesLabels(vol: Box3): AxisLabelSpec[];
|
|
114
|
+
/**
|
|
115
|
+
* The image's declared extent in pixels/slices, and its physical spacing per
|
|
116
|
+
* axis in µm (0 = undeclared, and then that axis reads in pixels).
|
|
117
|
+
*
|
|
118
|
+
* One place, because the volume world box and the axis labels have to agree
|
|
119
|
+
* about what the image's real dimensions are — the sampled grid is decimated and
|
|
120
|
+
* says nothing about either.
|
|
121
|
+
*/
|
|
122
|
+
private imageExtent;
|
|
123
|
+
/** The store's colormap, reverse, invert and channel windows → the volume's transfer function:
|
|
124
|
+
* colour (channel tint or selected colormap), the intensity window (min/max → contrastLimits)
|
|
125
|
+
* and gamma, mirroring the grayscale image's display controls so the histogram pane drives the
|
|
126
|
+
* 3D render. */
|
|
127
|
+
private followDisplayState;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* NAPARI_SCATTER3D (review Appendix B, cluster H): the downsampled voxel grid as a 3D point cloud
|
|
131
|
+
* coloured by intensity (the napari-js analog of Plotly's voxel scatter3d). Assembles a coarse
|
|
132
|
+
* volume, then emits a flat-strided sample of voxels (capped at `SCATTER3D_MAX_POINTS`).
|
|
133
|
+
*/
|
|
134
|
+
export declare class Scatter3dScene implements NapariScene {
|
|
135
|
+
private readonly ctx;
|
|
136
|
+
private readonly info;
|
|
137
|
+
private layer;
|
|
138
|
+
/** The assembled volume (key 0), for the intensity histogram. */
|
|
139
|
+
private readonly channelData;
|
|
140
|
+
private displaySub;
|
|
141
|
+
constructor(ctx: SceneContext, info: IImageInfo | undefined);
|
|
142
|
+
mount(): Promise<void>;
|
|
143
|
+
/** The whole stack is already on screen: no plane to step. */
|
|
144
|
+
setZ(): void;
|
|
145
|
+
histogram(channel: number, bins: number): IHistogram | null;
|
|
146
|
+
surface3dControls(): ISurface3dControls | null;
|
|
147
|
+
dispose(): void;
|
|
148
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { Viewer } from 'napari-js';
|
|
2
|
+
import type { VolumeFrame } from './napari-volume-region-meshes';
|
|
3
|
+
/** A plane across the volume: x = const, y = const (image px) or z = const (a slice). */
|
|
4
|
+
export type PlaneAxis = 'x' | 'y' | 'z';
|
|
5
|
+
/** Where each plane is (image px for x and y, the slice for z); null: not shown. */
|
|
6
|
+
export type SlicePlanes = Record<PlaneAxis, number | null>;
|
|
7
|
+
/** Each plane's colour: its axis's, as the axes gizmo draws them. */
|
|
8
|
+
export declare const SLICE_PLANE_COLORS: Readonly<Record<PlaneAxis, string>>;
|
|
9
|
+
/** A plane's opacity: enough to read where it is, not to hide the volume behind it … */
|
|
10
|
+
export declare const SLICE_PLANE_OPACITY = 0.22;
|
|
11
|
+
/** … and while it is dragged. */
|
|
12
|
+
export declare const SLICE_PLANE_DRAG_OPACITY = 0.4;
|
|
13
|
+
export interface SlicePlanesOptions {
|
|
14
|
+
/** A plane dragged to `value` along its axis (image px, or a fractional slice). */
|
|
15
|
+
onMove(axis: PlaneAxis, value: number): void;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* The planes of the sections shown beside a volume view: napari-js's {@link SlicePlanesWidget}
|
|
19
|
+
* (translucent quads in their axis's colour, each with a grip that drags it along its axis) over
|
|
20
|
+
* the stack's frame. It works in the frame's image px and slices: the widget's box is the image,
|
|
21
|
+
* one voxel per px, so a px position is the widget's shifted by half a pixel (pixel i spans
|
|
22
|
+
* [i, i + 1) here, is centred on i there); a slice is the same in both.
|
|
23
|
+
*/
|
|
24
|
+
export declare class VolumeSlicePlanes {
|
|
25
|
+
private readonly viewer;
|
|
26
|
+
private readonly host;
|
|
27
|
+
private readonly opts;
|
|
28
|
+
private widget;
|
|
29
|
+
private frame;
|
|
30
|
+
private planes;
|
|
31
|
+
/** Set while the planes are moved from here, so the widget's echo is not reported as a drag. */
|
|
32
|
+
private applying;
|
|
33
|
+
constructor(viewer: Viewer, host: HTMLElement, opts: SlicePlanesOptions);
|
|
34
|
+
/** Follow the volume's frame (it opened, or its Z was stretched). */
|
|
35
|
+
setFrame(frame: VolumeFrame): void;
|
|
36
|
+
/** Show the planes where they are now (null: hide one). */
|
|
37
|
+
set(planes: SlicePlanes): void;
|
|
38
|
+
clear(): void;
|
|
39
|
+
destroy(): void;
|
|
40
|
+
/** The widget over the current frame, made when there is one and a plane to show. */
|
|
41
|
+
private rebuild;
|
|
42
|
+
private apply;
|
|
43
|
+
}
|
|
@@ -1,14 +1,10 @@
|
|
|
1
|
-
/**
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
* Direct-manipulation counterpart of {@link NapariAxesLabels}: both are absolute-positioned overlays
|
|
9
|
-
* updated on every `camera3d.changed`, but this one accepts pointer input.
|
|
10
|
-
*/
|
|
11
|
-
import { AxesLabelCamera3D } from './napari-axes-labels';
|
|
1
|
+
/** The slice of napari's Camera3D the handle reads. `viewProjection` is column-major (gl-matrix). */
|
|
2
|
+
export interface ZHandleCamera3D {
|
|
3
|
+
viewProjection(vw: number, vh: number): ArrayLike<number>;
|
|
4
|
+
readonly changed: {
|
|
5
|
+
connect(listener: () => void): () => void;
|
|
6
|
+
};
|
|
7
|
+
}
|
|
12
8
|
export interface VolumeZHandleOptions {
|
|
13
9
|
/** Current top-face-centre world point (the box is centred at the origin, so `[0, 0, +halfZ]`). */
|
|
14
10
|
topAnchor: () => [number, number, number];
|
|
@@ -33,7 +29,7 @@ export declare class NapariVolumeZHandle {
|
|
|
33
29
|
private dragging;
|
|
34
30
|
private startY;
|
|
35
31
|
private startScale;
|
|
36
|
-
constructor(host: HTMLElement, camera3d:
|
|
32
|
+
constructor(host: HTMLElement, camera3d: ZHandleCamera3D, opts: VolumeZHandleOptions);
|
|
37
33
|
setVisible(visible: boolean): void;
|
|
38
34
|
/** Reproject the handle to the current top-face anchor. Called on camera move, resize, and after
|
|
39
35
|
* the host applies a new scale (so the grip follows the growing/shrinking box). */
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { ToScreen } from '../../../region-overlay/region-geometry';
|
|
2
|
+
import { Affine } from '../../../region-overlay/svg-region-renderer';
|
|
3
|
+
import type { OverlayViewer } from '../napari-region-overlay';
|
|
4
|
+
/**
|
|
5
|
+
* The region overlay's coordinate spaces: pointer CLIENT pixels, svg-LOCAL pixels and WORLD
|
|
6
|
+
* units, through the viewer's own transforms (see {@link OverlayViewer}).
|
|
7
|
+
*
|
|
8
|
+
* World → svg-local is the viewer's camera affine (`canvasTransform`), which reads no layout, so
|
|
9
|
+
* drawing and following the camera read none. Only a pointer, in client pixels, needs the svg's
|
|
10
|
+
* client origin: read once per {@link withOrigin} block (a gesture event), as an uncached read
|
|
11
|
+
* per vertex — interleaved with the elements a redraw appends — forced a synchronous layout per
|
|
12
|
+
* vertex (review NAPARI-BOUNDARY-10).
|
|
13
|
+
*/
|
|
14
|
+
export declare class OverlayProjection {
|
|
15
|
+
private readonly svg;
|
|
16
|
+
private readonly viewer;
|
|
17
|
+
/**
|
|
18
|
+
* How finely a drawn vertex may be placed, in world units.
|
|
19
|
+
*
|
|
20
|
+
* One by default, because for an image the world IS pixels and a region should align to
|
|
21
|
+
* them. A dataset whose coordinates are not pixels sets it finer — seqFISH's whole
|
|
22
|
+
* sample spans about 5 x 7 units, where whole-unit vertices leave roughly six by eight
|
|
23
|
+
* placeable positions and no ROI can be drawn at all.
|
|
24
|
+
*/
|
|
25
|
+
private worldQuantum;
|
|
26
|
+
/** The svg's client origin and the camera affine, cached while a {@link withOrigin} block runs. */
|
|
27
|
+
private origin;
|
|
28
|
+
private camera;
|
|
29
|
+
constructor(svg: SVGSVGElement, viewer: OverlayViewer);
|
|
30
|
+
setWorldQuantum(quantum: number): void;
|
|
31
|
+
/** Pointer client coords → world coords, snapped to the world quantum (for placing vertices). */
|
|
32
|
+
toImage(clientX: number, clientY: number): [number, number];
|
|
33
|
+
/** Pointer client coords → world coords, exact (for picking: snapping is for placing). */
|
|
34
|
+
toWorld(clientX: number, clientY: number): [number, number];
|
|
35
|
+
/**
|
|
36
|
+
* World units spanned by one screen pixel, measured through the viewer's own transform.
|
|
37
|
+
*
|
|
38
|
+
* Read from the transform rather than from the camera, so it holds for both the 2D and
|
|
39
|
+
* the 3D screen-space adapters without either having to expose a zoom. Falls back to 1
|
|
40
|
+
* if the transform gives nothing usable, which keeps the established pixel behaviour
|
|
41
|
+
* rather than collapsing the threshold to zero and recording a point per event.
|
|
42
|
+
*/
|
|
43
|
+
worldPerCanvasPixel(): number;
|
|
44
|
+
/** Run `fn` with the svg's client origin and the camera affine read once (nested calls reuse them). */
|
|
45
|
+
withOrigin<T>(fn: () => T): T;
|
|
46
|
+
/** Client px → SVG-local px. */
|
|
47
|
+
clientToLocal(clientX: number, clientY: number): [number, number];
|
|
48
|
+
/** World coords → SVG-local px, through the camera affine: no layout read. */
|
|
49
|
+
toLocal(imgX: number, imgY: number): [number, number];
|
|
50
|
+
/** {@link toLocal} as the shared region geometry takes it. */
|
|
51
|
+
readonly toScreen: ToScreen;
|
|
52
|
+
/** Screen distance (px) between a client point and a world point. */
|
|
53
|
+
screenDist(clientX: number, clientY: number, imgX: number, imgY: number): number;
|
|
54
|
+
/**
|
|
55
|
+
* The world → svg-local affine for the current camera: the viewer's `canvasTransform`, which
|
|
56
|
+
* reads no layout. The svg and the canvas share an origin (see {@link OverlayViewer}).
|
|
57
|
+
*/
|
|
58
|
+
affine(): Affine;
|
|
59
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { HandleHit } from '../../../region-overlay/region-geometry';
|
|
2
|
+
import type { RegionStore } from '../../../store/region-store.service';
|
|
3
|
+
/**
|
|
4
|
+
* A live drag of the select/move tools: the region's body, or one of its handles as the
|
|
5
|
+
* shared `hitHandle` names it (a rectangle corner with its fixed opposite `anchor`, or a
|
|
6
|
+
* vertex / bézier control point on `ring` -1 for the exterior, else a hole).
|
|
7
|
+
*/
|
|
8
|
+
export type RegionEdit = {
|
|
9
|
+
id: number;
|
|
10
|
+
last: [number, number];
|
|
11
|
+
} & ({
|
|
12
|
+
kind: 'body';
|
|
13
|
+
} | HandleHit);
|
|
14
|
+
/** Apply the drag of `edit` to the pointer at world point `(x, y)`, through the store's edit ops. */
|
|
15
|
+
export declare function applyRegionEdit(store: RegionStore, edit: RegionEdit, x: number, y: number): void;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { Region } from '../../../models/region';
|
|
2
|
+
import type { RegionStore } from '../../../store/region-store.service';
|
|
3
|
+
import { Affine } from '../../../region-overlay/svg-region-renderer';
|
|
4
|
+
/** Rendered handle size (screen px). */
|
|
5
|
+
export declare const HANDLE_SIZE = 7;
|
|
6
|
+
/** An axis-aligned box from a drag's start to its current point (any order). */
|
|
7
|
+
export interface DragBox {
|
|
8
|
+
x0: number;
|
|
9
|
+
y0: number;
|
|
10
|
+
x1: number;
|
|
11
|
+
y1: number;
|
|
12
|
+
}
|
|
13
|
+
/** A region being drawn: a rectangle drag, or a freehand / click-placed path. */
|
|
14
|
+
export interface RegionDraft {
|
|
15
|
+
rect: DragBox | null;
|
|
16
|
+
path: Array<[number, number]> | null;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* What the napari region overlay draws, over the shared {@link SvgRegionRenderer}: the regions
|
|
20
|
+
* in world coordinates (styled from the store's colours, labelled when labels are on), and in
|
|
21
|
+
* screen space the selected regions' grab handles (corners, vertices, bézier control points),
|
|
22
|
+
* the draft being drawn and the rubber-band marquee.
|
|
23
|
+
*/
|
|
24
|
+
export declare class NapariRegionSvgRenderer {
|
|
25
|
+
private readonly svg;
|
|
26
|
+
private readonly store;
|
|
27
|
+
private readonly renderer;
|
|
28
|
+
/** Dedicated marquee rect element, updated directly during the drag (no full region redraw). */
|
|
29
|
+
private marqueeEl;
|
|
30
|
+
constructor(svg: SVGSVGElement, store: RegionStore);
|
|
31
|
+
/** Follow the camera: one transform attribute plus the screen-space elements. */
|
|
32
|
+
setCamera(affine: Affine): void;
|
|
33
|
+
/** Rebuild the regions (world space) and their labels. */
|
|
34
|
+
render(regions: readonly Region[], selected: readonly number[]): void;
|
|
35
|
+
/** Rebuild the screen-space overlay only: the selected regions' handles and the draft. */
|
|
36
|
+
renderOverlay(regions: readonly Region[], selected: readonly number[], draft: RegionDraft): void;
|
|
37
|
+
/** Show the marquee over svg-local corners `(lx, ly)`–`(rx, ry)`, creating it on first use. */
|
|
38
|
+
showMarquee(lx: number, ly: number, rx: number, ry: number): void;
|
|
39
|
+
/** Remove the marquee element from the SVG. */
|
|
40
|
+
clearMarquee(): void;
|
|
41
|
+
/** A region's outline colour. */
|
|
42
|
+
private strokeOf;
|
|
43
|
+
/** Draw a region's classification label at its top-left, when labels are enabled (matches OSD). */
|
|
44
|
+
private drawLabel;
|
|
45
|
+
/** Draw grab handles for a selected region: rectangle corners or polygon vertices. */
|
|
46
|
+
private drawHandles;
|
|
47
|
+
/** Draw one bezier control point as a small circle connected to its anchor by a tangent line.
|
|
48
|
+
* `handle` is the control point's absolute position in image space. */
|
|
49
|
+
private drawBezierHandle;
|
|
50
|
+
private style;
|
|
51
|
+
/** Draw the in-progress rectangle / path preview. */
|
|
52
|
+
private drawDraft;
|
|
53
|
+
private styleDraft;
|
|
54
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { SpatialDataPort } from '../../../contracts/ports/spatial-data.port';
|
|
2
|
+
import type { SpatialViewState } from '../../../contracts/display-types';
|
|
3
|
+
import { SpatialColumn, SpatialDataset } from '../../../contracts/spatial-dataset.contract';
|
|
4
|
+
/** A categorical column's per-observation codes and its metadata (categories, colours). */
|
|
5
|
+
export interface CategoricalCodes {
|
|
6
|
+
codes: Uint16Array;
|
|
7
|
+
meta: SpatialColumn['meta'];
|
|
8
|
+
}
|
|
9
|
+
/** Per-observation group codes, and which codes are switched off (1) in the group list. */
|
|
10
|
+
export interface HiddenCodes {
|
|
11
|
+
codes: Uint16Array;
|
|
12
|
+
hidden: Uint8Array;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* The categorical columns the cells, the transcripts and the hover all read: the cell-type
|
|
16
|
+
* column's codes, and which of its groups the user switched off. A failed request rejects;
|
|
17
|
+
* the caller decides whether that fails its group of the plan or degrades to "no types".
|
|
18
|
+
*/
|
|
19
|
+
export declare class CategoricalLookup {
|
|
20
|
+
private readonly port;
|
|
21
|
+
constructor(port: SpatialDataPort);
|
|
22
|
+
/** Codes of the column `name`, or null when it is not categorical. */
|
|
23
|
+
codes(name: string): Promise<CategoricalCodes | null>;
|
|
24
|
+
/** Codes of the group column that are switched off, or null when none are. */
|
|
25
|
+
hiddenCodes(dataset: SpatialDataset, view: SpatialViewState): Promise<HiddenCodes | null>;
|
|
26
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import type { Rgb } from '../../../contracts/colormap-lut';
|
|
2
|
+
import type { SpatialDataPort } from '../../../contracts/ports/spatial-data.port';
|
|
3
|
+
import type { SpatialViewState } from '../../../contracts/display-types';
|
|
4
|
+
import { SpatialDataset } from '../../../contracts/spatial-dataset.contract';
|
|
5
|
+
import { SpatialSelectionMask } from '../../../spatial/spatial-selection';
|
|
6
|
+
import { DataRect } from '../../../spatial/lod';
|
|
7
|
+
import type { CategoricalLookup } from './categorical-lookup';
|
|
8
|
+
import type { OrderedLayerGroups, TileGroup } from './layer-groups';
|
|
9
|
+
import type { PlanContext } from './plan-context';
|
|
10
|
+
/** What the cell layers need from the service. */
|
|
11
|
+
export interface CellLayersHost {
|
|
12
|
+
/** The continuous LUT the view is using (so cells coloured by a gene match the markers). */
|
|
13
|
+
continuousLut(view: SpatialViewState): Rgb[];
|
|
14
|
+
/** Outlines appeared or disappeared: the markers' visibility follows. */
|
|
15
|
+
polygonsShownChanged(shown: boolean): void;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* The cell outlines of the 2D spatial view, at the polygon level the zoom calls for: a fill,
|
|
19
|
+
* an outline or both (plus nucleus outlines for the "both" cell set), coloured by the view's
|
|
20
|
+
* cell-colour mode, with switched-off groups left out of the geometry.
|
|
21
|
+
*
|
|
22
|
+
* Geometry and style are keyed apart, so a recolour (a new cell-type column, a selection)
|
|
23
|
+
* rewrites the per-shape values of the existing layers and never re-expands the rings.
|
|
24
|
+
*/
|
|
25
|
+
export declare class CellLayers {
|
|
26
|
+
private readonly port;
|
|
27
|
+
private readonly groups;
|
|
28
|
+
private readonly lookup;
|
|
29
|
+
private readonly host;
|
|
30
|
+
private polygonsShown;
|
|
31
|
+
/** Rings currently drawn and the (dataset, set, tiles) they came from. */
|
|
32
|
+
private currentRings;
|
|
33
|
+
private cellGeometryKey;
|
|
34
|
+
private currentNuclei;
|
|
35
|
+
private cellStyleKey;
|
|
36
|
+
/** Selection identity → revision, so a change key can name a selection cheaply. */
|
|
37
|
+
private lastSelection;
|
|
38
|
+
private selectionRevision;
|
|
39
|
+
/** Continuous colourings' windows, per (vector, clip, log): `contrastWindow` sorts every
|
|
40
|
+
* value, and a selection or opacity change recolours with the vector unchanged (SPATIAL-12). */
|
|
41
|
+
private readonly contrastWindows;
|
|
42
|
+
constructor(port: SpatialDataPort, groups: OrderedLayerGroups<TileGroup>, lookup: CategoricalLookup, host: CellLayersHost);
|
|
43
|
+
/** True while outlines are on screen — the service hides its dots then. */
|
|
44
|
+
get outlinesShown(): boolean;
|
|
45
|
+
/** The viewer went away (its layers with it): the outlines are no longer shown. */
|
|
46
|
+
detached(): void;
|
|
47
|
+
/** Draw the cells covering `rect` at the level `pxPerUnit` calls for, or drop them. */
|
|
48
|
+
plan(dataset: SpatialDataset, view: SpatialViewState, selection: SpatialSelectionMask, rect: DataRect, pxPerUnit: number, ctx: PlanContext): Promise<void>;
|
|
49
|
+
/**
|
|
50
|
+
* The cell layers: the fill and the outline the view's draw mode asks for, and with "both" the
|
|
51
|
+
* nucleus outlines over them. A geometry change builds new layers; a style change restyles them.
|
|
52
|
+
*/
|
|
53
|
+
private drawCells;
|
|
54
|
+
private selectionRev;
|
|
55
|
+
/**
|
|
56
|
+
* The rings' colours by their owners, by the view's cell-colour mode (Xenium Explorer's "Cell
|
|
57
|
+
* Color"): one RGBA per shape for a grouping, values + colormap for a measurement, one colour
|
|
58
|
+
* for "single". A selection mutes what it leaves out.
|
|
59
|
+
*/
|
|
60
|
+
private cellColors;
|
|
61
|
+
/**
|
|
62
|
+
* The cell rings (and, for "both", the nucleus rings) covering `rect` at `level`, minus
|
|
63
|
+
* the hidden groups — reused when nothing that decides them changed. Null when the
|
|
64
|
+
* view went stale or the dataset has no set to draw.
|
|
65
|
+
*/
|
|
66
|
+
private cellGeometry;
|
|
67
|
+
/** Remove the cell layers and forget what they showed. */
|
|
68
|
+
drop(): void;
|
|
69
|
+
private setPolygonsShown;
|
|
70
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { Viewer } from 'napari-js';
|
|
2
|
+
import { type SpatialDataPort } from '../../../contracts/ports/spatial-data.port';
|
|
3
|
+
import type { SpatialViewState } from '../../../contracts/display-types';
|
|
4
|
+
import type { SpatialDataset } from '../../../contracts/spatial-dataset.contract';
|
|
5
|
+
import type { OrderedLayerGroups, TileGroup } from './layer-groups';
|
|
6
|
+
import type { PlanContext } from './plan-context';
|
|
7
|
+
/** The density window in use and the densest bin (transcripts per unit area). */
|
|
8
|
+
export interface DensityStats {
|
|
9
|
+
lo: number;
|
|
10
|
+
hi: number;
|
|
11
|
+
max: number;
|
|
12
|
+
}
|
|
13
|
+
/** Xenium Explorer's "Estimated Transcript Points". */
|
|
14
|
+
export interface TranscriptEstimate {
|
|
15
|
+
/** Transcripts of the visible genes estimated to be in view. */
|
|
16
|
+
points: number;
|
|
17
|
+
/** The marker budget. */
|
|
18
|
+
max: number;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* The transcript density image of the 2D spatial view: the visible genes' summed density
|
|
22
|
+
* raster, one scalar layer in the `density` group, windowed and coloured on the GPU.
|
|
23
|
+
*
|
|
24
|
+
* Bins at or below the window's low end are transparent (`transparentBelow`), so a window,
|
|
25
|
+
* colormap or opacity change is a uniform or LUT update of the same layer: only new genes or a
|
|
26
|
+
* new bin size fetch and upload a raster.
|
|
27
|
+
*/
|
|
28
|
+
export declare class DensityLayer {
|
|
29
|
+
private readonly port;
|
|
30
|
+
private readonly groups;
|
|
31
|
+
private readonly changed;
|
|
32
|
+
/** The density window in use and the densest bin, for the panel's threshold control. */
|
|
33
|
+
stats: DensityStats | null;
|
|
34
|
+
/** The drawn raster in transcripts per unit area, its densest bin and its auto window. */
|
|
35
|
+
private raster;
|
|
36
|
+
/** The colormap the layer was given, so an unchanged one does not rebuild its LUT. */
|
|
37
|
+
private colormapKey;
|
|
38
|
+
constructor(port: SpatialDataPort, groups: OrderedLayerGroups<TileGroup>, changed: (stats: DensityStats) => void);
|
|
39
|
+
/** Draw the view's density, or drop it; an unchanged (genes, bin, window, colormap) is a no-op. */
|
|
40
|
+
plan(dataset: SpatialDataset, view: SpatialViewState, ctx: PlanContext): Promise<void>;
|
|
41
|
+
/** Window, colour and opacity onto the drawn layer: uniforms and a LUT, no re-upload. */
|
|
42
|
+
private restyle;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Transcripts in view for the visible genes, against the marker budget — it tells the user
|
|
46
|
+
* whether the budget will force grouping. Caches the per-gene dataset totals for the latest
|
|
47
|
+
* gene set.
|
|
48
|
+
*/
|
|
49
|
+
export declare class TranscriptEstimator {
|
|
50
|
+
private readonly port;
|
|
51
|
+
private readonly changed;
|
|
52
|
+
/** Per-gene dataset totals for the in-view estimate, for the latest gene set. */
|
|
53
|
+
private countsCache;
|
|
54
|
+
constructor(port: SpatialDataPort, changed: (estimate: TranscriptEstimate | null) => void);
|
|
55
|
+
/**
|
|
56
|
+
* Transcripts in view for the visible genes: each gene's dataset total times the share
|
|
57
|
+
* of the tissue on screen. An estimate — expression is not uniform — which is also what
|
|
58
|
+
* Xenium Explorer shows; it tells the user whether the budget will force grouping.
|
|
59
|
+
*/
|
|
60
|
+
plan(dataset: SpatialDataset, view: SpatialViewState, viewer: Viewer, w: number, h: number, ctx: PlanContext): Promise<void>;
|
|
61
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import type { Layer, Viewer } from 'napari-js';
|
|
2
|
+
import type { SpatialPolygons } from '../../../contracts/spatial-dataset.contract';
|
|
3
|
+
/** The layer groups of the 2D spatial tile view. */
|
|
4
|
+
export type TileGroup = 'density' | 'cellFill' | 'cellOutline' | 'nucleusOutline' | 'transcripts';
|
|
5
|
+
/**
|
|
6
|
+
* Bottom to top: cell fill, cell outline, nucleus outline, the transcript density, then the
|
|
7
|
+
* transcripts. The density goes OVER the service's observation markers on purpose: under 10^5
|
|
8
|
+
* dots it would only show in the gaps between cells.
|
|
9
|
+
*/
|
|
10
|
+
export declare const TILE_LAYER_ORDER: readonly TileGroup[];
|
|
11
|
+
/**
|
|
12
|
+
* One napari-js layer per named group, kept in a fixed bottom-to-top order, plus what each
|
|
13
|
+
* group currently shows (its key), so an unchanged plan is a no-op.
|
|
14
|
+
*
|
|
15
|
+
* Order is kept with `LayerList.move`, which restacks a layer without disposing its GPU visual
|
|
16
|
+
* (a remove + re-add would re-upload its whole buffer, review NAPARI-BOUNDARY-11). A plan still
|
|
17
|
+
* restores the order once, after all its groups are in place, and moves only the layers that
|
|
18
|
+
* are out of place ({@link restoreOrder}).
|
|
19
|
+
*/
|
|
20
|
+
export declare class OrderedLayerGroups<G extends string> {
|
|
21
|
+
private readonly order;
|
|
22
|
+
private current;
|
|
23
|
+
private readonly layers;
|
|
24
|
+
/** What each group currently shows, so an unchanged plan is a no-op. */
|
|
25
|
+
private readonly keys;
|
|
26
|
+
constructor(order: readonly G[]);
|
|
27
|
+
/** The viewer the groups are drawn into, while attached. */
|
|
28
|
+
get viewer(): Viewer | null;
|
|
29
|
+
attach(viewer: Viewer): void;
|
|
30
|
+
/** Remove every group's layer from the viewer and forget the layers, keys and viewer. */
|
|
31
|
+
detach(): void;
|
|
32
|
+
/** Whether `group` has a layer (on screen or not). */
|
|
33
|
+
has(group: G): boolean;
|
|
34
|
+
/** `group`'s layer (on screen or not), if it has one. */
|
|
35
|
+
layer(group: G): Layer | undefined;
|
|
36
|
+
/** Whether `group`'s layer is in the viewer now. */
|
|
37
|
+
shown(group: G): boolean;
|
|
38
|
+
/** What `group` currently shows, as its plan keyed it. */
|
|
39
|
+
key(group: G): string | undefined;
|
|
40
|
+
setKey(group: G, key: string): void;
|
|
41
|
+
/** Forget what `group` shows, so the next plan redraws it. */
|
|
42
|
+
forgetKey(group: G): void;
|
|
43
|
+
/** Whether `layer` is one of the groups' layers. */
|
|
44
|
+
owns(layer: Layer): boolean;
|
|
45
|
+
/**
|
|
46
|
+
* Put a shapes layer in place for `group`: a geometry change builds a new layer, a
|
|
47
|
+
* colour-only change mutates the per-shape colours or values/colormap of the existing one.
|
|
48
|
+
*/
|
|
49
|
+
upsertShapes(group: G, wanted: boolean, geometryChanged: boolean, rings: SpatialPolygons, opts: Parameters<Viewer['addShapes']>[2] & object): void;
|
|
50
|
+
/**
|
|
51
|
+
* Install `layer` as `group`'s layer. The layer was just added by the caller, so it is on
|
|
52
|
+
* top: the plan puts the groups that belong above it back in place once it is done
|
|
53
|
+
* ({@link restoreOrder}), rather than after every replaced group.
|
|
54
|
+
*/
|
|
55
|
+
replace(group: G, layer: Layer): void;
|
|
56
|
+
/**
|
|
57
|
+
* Put the groups' layers in order, moving to the top only from the first one out of place
|
|
58
|
+
* (and, with `aboveOthers`, the first one under a layer that is not ours — the service's
|
|
59
|
+
* markers). Everything before that is already where it belongs. A move keeps each layer
|
|
60
|
+
* mounted (no `removed`/`added`), so nothing is re-uploaded.
|
|
61
|
+
*/
|
|
62
|
+
restoreOrder(aboveOthers: boolean): void;
|
|
63
|
+
/** Remove `group`'s layer and forget its key. */
|
|
64
|
+
drop(group: G): void;
|
|
65
|
+
/** Drop every group. */
|
|
66
|
+
dropAll(): void;
|
|
67
|
+
}
|