@jax-data-science/sci-image-visualizer 0.8.2 → 0.9.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 +28 -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/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/sam.contract.mjs +1 -1
- 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/raster.mjs +98 -0
- package/esm2022/lib/geometry/ring.mjs +201 -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 +3 -4
- package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +66 -0
- package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +157 -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 +263 -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 +344 -0
- package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +361 -4184
- package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +439 -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 +182 -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 +153 -0
- package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +185 -718
- 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 +118 -0
- package/esm2022/lib/models/region-clone.mjs +68 -0
- package/esm2022/lib/models/region-geojson.mjs +373 -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/classes-panel/classes-panel.component.mjs +99 -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 +402 -651
- package/esm2022/lib/region-editor/region-metrics.mjs +68 -0
- package/esm2022/lib/region-editor/region-persistence.service.mjs +134 -0
- package/esm2022/lib/region-editor/region-table/region-table.component.mjs +153 -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/svg-region-renderer.mjs +228 -0
- package/esm2022/lib/render-orchestrator.mjs +14 -11
- package/esm2022/lib/render-session.mjs +207 -0
- package/esm2022/lib/routing-visualizer.service.mjs +459 -411
- 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 +46 -3
- package/esm2022/lib/store/region-history.mjs +146 -0
- package/esm2022/lib/store/region-scope-cache.mjs +140 -0
- package/esm2022/lib/store/region-selection.mjs +82 -0
- package/esm2022/lib/store/region-store.service.mjs +279 -675
- package/esm2022/lib/store/spatial-selection.service.mjs +2 -2
- package/esm2022/lib/store/visualizer-store.service.mjs +49 -71
- 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 +114 -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 +81 -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 +68 -117
- 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 +60 -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.component.mjs +480 -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-Csxlnq7I.mjs +41083 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-Csxlnq7I.mjs.map +1 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-Bkujqg7m.mjs +238 -0
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-Bkujqg7m.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 -34430
- 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/spatial-math.worker.js +471 -0
- package/fesm2022/tsne.worker.js +32 -15
- package/index.d.ts +13 -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/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 +1 -1
- package/lib/contracts/region-overlay.contract.d.ts +5 -0
- package/lib/contracts/sam.contract.d.ts +7 -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 +221 -54
- package/lib/contracts/viz-config.d.ts +1 -0
- package/lib/geometry/contour.d.ts +24 -0
- package/lib/geometry/raster.d.ts +42 -0
- package/lib/geometry/ring.d.ts +67 -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 +0 -1
- package/lib/implementations/napari-js/napari-loading-state.d.ts +30 -0
- package/lib/implementations/napari-js/napari-region-overlay.d.ts +62 -70
- package/lib/implementations/napari-js/napari-scene.d.ts +93 -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 +89 -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 +121 -878
- package/lib/implementations/napari-js/napari-volume-scene.d.ts +104 -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 +37 -0
- package/lib/implementations/osd/osd-region-overlay.d.ts +36 -48
- 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 +80 -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 +18 -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 +40 -0
- package/lib/models/region-clone.d.ts +20 -0
- package/lib/models/region-geojson.d.ts +17 -0
- package/lib/models/region.d.ts +40 -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/classes-panel/classes-panel.component.d.ts +56 -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 +166 -199
- package/lib/region-editor/region-metrics.d.ts +26 -0
- package/lib/region-editor/region-persistence.service.d.ts +69 -0
- package/lib/region-editor/region-table/region-table.component.d.ts +83 -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 +157 -0
- package/lib/region-overlay/region-hit-test.d.ts +38 -0
- package/lib/region-overlay/svg-region-renderer.d.ts +110 -0
- package/lib/render-orchestrator.d.ts +6 -2
- package/lib/render-session.d.ts +75 -0
- package/lib/routing-visualizer.service.d.ts +110 -58
- 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 +35 -1
- package/lib/store/region-history.d.ts +66 -0
- package/lib/store/region-scope-cache.d.ts +63 -0
- package/lib/store/region-selection.d.ts +36 -0
- package/lib/store/region-store.service.d.ts +104 -112
- package/lib/store/visualizer-store.service.d.ts +22 -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 +60 -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 +40 -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 +47 -83
- 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 +27 -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.component.d.ts +201 -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/styles/_viz-icons-rules.scss +73 -0
- package/src/lib/styles/viz-icons.scss +14 -0
- package/esm2022/lib/implementations/napari-js/napari-axes-labels.mjs +0 -97
- package/esm2022/lib/implementations/napari-js/napari-navigator.mjs +0 -195
- package/esm2022/lib/implementations/napari-js/napari-scale-bar.mjs +0 -92
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs +0 -329
- package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs.map +0 -1
- package/lib/implementations/napari-js/napari-axes-labels.d.ts +0 -49
- package/lib/implementations/napari-js/napari-navigator.d.ts +0 -72
- package/lib/implementations/napari-js/napari-scale-bar.d.ts +0 -35
- package/src/lib/assets/cell-detection.svg +0 -37
- package/src/lib/assets/click.svg +0 -1
- package/src/lib/assets/colormap-luts.json +0 -1
- package/src/lib/assets/edit-selection-white.svg +0 -47
- package/src/lib/assets/icons/colormap-earth.png +0 -0
- package/src/lib/assets/icons/colormap-placeholder.png +0 -0
- package/src/lib/assets/icons/colormap-pubu.png +0 -0
- package/src/lib/assets/interactive-segmentation-cursor.svg +0 -1
- package/src/lib/assets/picture-segmentation.svg +0 -43
- package/src/lib/assets/test/download-379.svg +0 -1
- package/src/lib/assets/test/download-98.svg +0 -1
- package/src/lib/assets/test/json-1.svg +0 -1
- package/src/lib/assets/test/load-53.svg +0 -1
- package/src/lib/assets/test/mask-44.svg +0 -1
- package/src/lib/assets/test/mask-download-44.svg +0 -15
- package/src/lib/assets/test/mask-save-44.svg +0 -11
- package/src/lib/assets/test/overlay-1.svg +0 -1
- package/src/lib/assets/test/overlay-4.svg +0 -1
- package/src/lib/assets/test/region-26.svg +0 -1
- package/src/lib/assets/test/save-56.svg +0 -1
- package/src/lib/assets/test/upload-43.svg +0 -1
|
@@ -1,47 +1,81 @@
|
|
|
1
|
-
import { ChangeDetectorRef, ElementRef, EventEmitter, OnDestroy, Renderer2 } from '@angular/core';
|
|
1
|
+
import { ChangeDetectorRef, ElementRef, EventEmitter, NgZone, OnDestroy, Renderer2 } from '@angular/core';
|
|
2
2
|
import * as i0 from "@angular/core";
|
|
3
|
+
/**
|
|
4
|
+
* A compact colour picker: a swatch button that opens a honeycomb palette with a
|
|
5
|
+
* hex field, the system colour picker, HSL sliders and RGB fields. Bind `[color]`
|
|
6
|
+
* and listen to `(colorChange)` (committed picks) and, for a live preview,
|
|
7
|
+
* `(colorInput)` (every intermediate colour while dragging).
|
|
8
|
+
*/
|
|
3
9
|
export declare class HexColorPickerComponent implements OnDestroy {
|
|
4
10
|
private elRef;
|
|
5
11
|
private renderer;
|
|
6
12
|
private cdr;
|
|
13
|
+
private ngZone;
|
|
7
14
|
private static readonly DROPDOWN_WIDTH;
|
|
8
|
-
|
|
15
|
+
/** The colour shown (the swatch, the hex field, the selected cell). */
|
|
16
|
+
private readonly current;
|
|
17
|
+
/** The committed colour: a swatch/hex pick, or a slider/field/system-picker
|
|
18
|
+
* edit once it is released. Hosts commit their state on this. */
|
|
9
19
|
colorChange: EventEmitter<string>;
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
readonly
|
|
20
|
+
/** Every intermediate colour while a slider, number field or the system picker
|
|
21
|
+
* is being dragged — for a live preview; {@link colorChange} follows on release. */
|
|
22
|
+
colorInput: EventEmitter<string>;
|
|
23
|
+
/** The last colour emitted on (or received through) `color`, so a release
|
|
24
|
+
* without a change doesn't commit again. */
|
|
25
|
+
private committed;
|
|
26
|
+
/** Removes the document click listener; set only while the dropdown is open. */
|
|
27
|
+
private unlistenDocumentClick;
|
|
28
|
+
/** The palette dropdown is open. */
|
|
29
|
+
protected readonly open: import("@angular/core").WritableSignal<boolean>;
|
|
30
|
+
private swatchBtn;
|
|
31
|
+
private dropdownRef;
|
|
32
|
+
protected readonly hue: import("@angular/core").WritableSignal<number>;
|
|
33
|
+
protected readonly saturation: import("@angular/core").WritableSignal<number>;
|
|
34
|
+
protected readonly lightness: import("@angular/core").WritableSignal<number>;
|
|
35
|
+
protected readonly red: import("@angular/core").WritableSignal<number>;
|
|
36
|
+
protected readonly green: import("@angular/core").WritableSignal<number>;
|
|
37
|
+
protected readonly blue: import("@angular/core").WritableSignal<number>;
|
|
38
|
+
/** Slider tracks: hue is fixed; saturation and lightness follow the other two. */
|
|
39
|
+
protected readonly hueGradient: string;
|
|
40
|
+
protected readonly satGradient: import("@angular/core").Signal<string>;
|
|
41
|
+
protected readonly lightGradient: import("@angular/core").Signal<string>;
|
|
42
|
+
protected readonly colorRows: string[][];
|
|
20
43
|
private normalizeHexColor;
|
|
44
|
+
/** The colour (`#RRGGBB`) to show; upper-cased on the way in. */
|
|
21
45
|
get color(): string;
|
|
22
46
|
set color(val: string);
|
|
23
|
-
constructor(elRef: ElementRef, renderer: Renderer2, cdr: ChangeDetectorRef);
|
|
47
|
+
constructor(elRef: ElementRef, renderer: Renderer2, cdr: ChangeDetectorRef, ngZone: NgZone);
|
|
24
48
|
ngOnDestroy(): void;
|
|
25
|
-
toggle(): void;
|
|
49
|
+
protected toggle(): void;
|
|
50
|
+
/**
|
|
51
|
+
* Close on a click outside the swatch and dropdown. Registered only while
|
|
52
|
+
* open and outside the Angular zone, so the many pickers on a page (one per
|
|
53
|
+
* class row and channel) don't each run app-wide change detection on every
|
|
54
|
+
* click anywhere (RT-22).
|
|
55
|
+
*/
|
|
56
|
+
private listenForOutsideClicks;
|
|
57
|
+
private stopListeningForOutsideClicks;
|
|
26
58
|
private appendDropdownToBody;
|
|
27
59
|
private removeDropdownFromBody;
|
|
28
|
-
selectColor(hex: string): void;
|
|
29
|
-
|
|
60
|
+
protected selectColor(hex: string): void;
|
|
61
|
+
/** Live preview from the system colour picker while it is open. */
|
|
62
|
+
protected previewColor(hex: string): void;
|
|
63
|
+
/** Commit the current colour (`colorChange`) unless it was already committed. */
|
|
64
|
+
protected commitColor(): void;
|
|
65
|
+
protected selectAndClose(hex: string): void;
|
|
66
|
+
/** Close the palette dropdown (no-op when closed). */
|
|
30
67
|
close(): void;
|
|
31
|
-
onHexInput(value: string): void;
|
|
32
|
-
onHslChange(): void;
|
|
33
|
-
onRgbChange(): void;
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
onDocumentClick(event: Event): void;
|
|
68
|
+
protected onHexInput(value: string): void;
|
|
69
|
+
protected onHslChange(): void;
|
|
70
|
+
protected onRgbChange(): void;
|
|
71
|
+
/** Close the dropdown when `event` is a click outside the picker. */
|
|
72
|
+
protected onDocumentClick(event: Event): void;
|
|
73
|
+
private isOutside;
|
|
38
74
|
private syncFromHex;
|
|
39
75
|
private syncRgbFromHex;
|
|
76
|
+
private setRgb;
|
|
40
77
|
private syncHslFromRgb;
|
|
41
|
-
private hexToRgb;
|
|
42
|
-
private rgbToHex;
|
|
43
78
|
private rgbToHsl;
|
|
44
|
-
private hslToHex;
|
|
45
79
|
static ɵfac: i0.ɵɵFactoryDeclaration<HexColorPickerComponent, never>;
|
|
46
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<HexColorPickerComponent, "hex-color-picker", never, { "color": { "alias": "color"; "required": false; }; }, { "colorChange": "colorChange"; }, never, never,
|
|
80
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<HexColorPickerComponent, "hex-color-picker", never, { "color": { "alias": "color"; "required": false; }; }, { "colorChange": "colorChange"; "colorInput": "colorInput"; }, never, never, true, never>;
|
|
47
81
|
}
|
|
@@ -1,28 +1,35 @@
|
|
|
1
1
|
import { Observable } from 'rxjs';
|
|
2
2
|
import { IDisplayOptions, IRegionStore } from '../contracts/visualizer.contract';
|
|
3
3
|
import { Region } from '../models/region';
|
|
4
|
-
import { ColormapNode } from '../contracts/display-types';
|
|
4
|
+
import { CanvasToolId, CanvasToolOptions, ColormapNode, IBrushOptions, IWandOptions } from '../contracts/display-types';
|
|
5
|
+
import type { CanvasToolManager } from '../toolbar/tool-kit/canvas-tool-manager';
|
|
5
6
|
import { IImageMetadata } from '../contracts/image.contract';
|
|
6
7
|
import { RegionStore } from '../store/region-store.service';
|
|
7
8
|
import { VisualizerStore } from '../store/visualizer-store.service';
|
|
8
9
|
/**
|
|
9
|
-
* Shared store-delegation base for the OpenSeadragon
|
|
10
|
+
* Shared store-delegation base for the OpenSeadragon, napari-js and Plotly
|
|
10
11
|
* `IVisualizer` backends. The entire `IRegionStore` and `IDisplayOptions`
|
|
11
12
|
* surfaces (plus the two classification-colour members) are pure forwarders to
|
|
12
|
-
* the shared `RegionStore` / `VisualizerStore`
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
13
|
+
* the shared `RegionStore` / `VisualizerStore` — so they live here once, as a
|
|
14
|
+
* single source of truth, rather than being copied per backend. (This is the
|
|
15
|
+
* "cross-backend behaviour that isn't rendering belongs in a shared
|
|
16
|
+
* abstraction" convention from CLAUDE.md; see
|
|
17
|
+
* docs/history/2026-07-shared-backend-refactor.md.)
|
|
18
|
+
*
|
|
19
|
+
* The on-canvas tool controls (`setActiveTool` and the per-tool setters) live
|
|
20
|
+
* here too: each subclass creates its own {@link CanvasToolManager} over its own
|
|
21
|
+
* tool host and gates pointer/readback in {@link beforeToolChange}.
|
|
17
22
|
*
|
|
18
23
|
* Backend-specific members — `load`/`plot`/`reset`/zoom/`setZIndex`/readback,
|
|
19
|
-
* the region OVERLAY, tool
|
|
20
|
-
* application — deliberately stay in each subclass.
|
|
24
|
+
* the region OVERLAY, the tool host, SAM/Cellpose runs, histograms, scale bar,
|
|
25
|
+
* tiling, colormap LUT application — deliberately stay in each subclass. Plotly keeps a Plotly-shape
|
|
26
|
+
* working-set beside the store and redraws it from the store's update events
|
|
27
|
+
* (like the OSD/napari overlays), so it overrides only the colormap and reverse
|
|
28
|
+
* scale (a live restyle) and `exportRegions` (the file name).
|
|
21
29
|
*
|
|
22
30
|
* NOT `@Injectable`: an abstract base doesn't participate in Angular DI. Each
|
|
23
31
|
* subclass stays `@Injectable`, declares its own injected dependencies
|
|
24
|
-
* (including the two stores), and passes them to `super(...)`.
|
|
25
|
-
* intentionally not a subclass — it has its own region model.
|
|
32
|
+
* (including the two stores), and passes them to `super(...)`.
|
|
26
33
|
*/
|
|
27
34
|
export declare abstract class BaseStoreVisualizer implements IRegionStore, IDisplayOptions {
|
|
28
35
|
protected readonly regionStore: RegionStore;
|
|
@@ -39,9 +46,6 @@ export declare abstract class BaseStoreVisualizer implements IRegionStore, IDisp
|
|
|
39
46
|
getShowShapeLabel(): boolean;
|
|
40
47
|
getShapeColor(): string;
|
|
41
48
|
getFillColor(): string;
|
|
42
|
-
plotPreviousShapes(): void;
|
|
43
|
-
setPreviousShapes(shapes: any[]): void;
|
|
44
|
-
getPreviousShapes(): any[];
|
|
45
49
|
undo(): void;
|
|
46
50
|
redo(): void;
|
|
47
51
|
canUndo(): boolean;
|
|
@@ -59,13 +63,55 @@ export declare abstract class BaseStoreVisualizer implements IRegionStore, IDisp
|
|
|
59
63
|
setDisplaySlice(z: number): void;
|
|
60
64
|
getSliceRegions(): Region[];
|
|
61
65
|
getStackSaveSlices(): Map<number, Region[]>;
|
|
66
|
+
/** This backend's canvas tools, created by the subclass over its own host. */
|
|
67
|
+
protected abstract readonly canvasTools: CanvasToolManager;
|
|
68
|
+
/**
|
|
69
|
+
* Runs before every tool change, for the backend's pointer and readback
|
|
70
|
+
* gating (pan/zoom off while a tool holds the pointer, a fresh pixel
|
|
71
|
+
* readback). Return false to arm nothing; the armed tool is disarmed anyway.
|
|
72
|
+
*/
|
|
73
|
+
protected beforeToolChange(_next: CanvasToolId | null): boolean;
|
|
74
|
+
/**
|
|
75
|
+
* Arm one on-canvas tool, disarming the armed one; null — or any id that is
|
|
76
|
+
* not a canvas tool (a region draw mode, pan) — disarms only. Re-arming the
|
|
77
|
+
* armed tool applies `options` and keeps its work in progress.
|
|
78
|
+
*/
|
|
79
|
+
setActiveTool(id: string | null, options?: CanvasToolOptions): void;
|
|
80
|
+
/** @deprecated Use {@link setActiveTool}(`'wand'`, options) / (null). */
|
|
81
|
+
setWandMode(active: boolean, options?: IWandOptions): void;
|
|
82
|
+
setWandOptions(options: IWandOptions): void;
|
|
83
|
+
clearActiveWandRegion(): void;
|
|
84
|
+
/** @deprecated Use {@link setActiveTool}(`'brush'`, options) / (null). */
|
|
85
|
+
setBrushMode(active: boolean, options?: IBrushOptions): void;
|
|
86
|
+
setBrushOptions(options: IBrushOptions): void;
|
|
87
|
+
/** @deprecated Use {@link setActiveTool}(`'eraseVertex'`, { radius }) / (null). */
|
|
88
|
+
setVertexEraserMode(active: boolean): void;
|
|
89
|
+
setVertexEraserRadius(radius: number): void;
|
|
90
|
+
/** @deprecated Use {@link setActiveTool}(`'zoomToBox'`) / (null). */
|
|
91
|
+
setZoomToBoxMode(active: boolean): void;
|
|
92
|
+
/** @deprecated Use {@link setActiveTool}(`'samPoint'`) / (null). */
|
|
93
|
+
setSamPointMode(active: boolean): void;
|
|
94
|
+
commitSamPoints(): void;
|
|
95
|
+
clearSamPoints(): void;
|
|
96
|
+
/** A per-tool setter: arm `id`, or disarm it if it is the armed tool. */
|
|
97
|
+
private setToolMode;
|
|
98
|
+
/** Drop what is bound to the view (each backend's own teardown). */
|
|
99
|
+
abstract unsubscribe(): void;
|
|
100
|
+
/** The view is going away: release what is bound to it (`IViewerBackend.detach`) —
|
|
101
|
+
* first the armed tool, whose overlay canvas and ResizeObserver sit on the view's
|
|
102
|
+
* container (the backend outlives the view). */
|
|
103
|
+
detach(): void;
|
|
104
|
+
/** Each backend's own fit (Plotly autorange, OSD home, napari camera fit). */
|
|
105
|
+
abstract autoscale(): void;
|
|
106
|
+
/** Fit the image into the view (`IViewerBackend.fitToView`). */
|
|
107
|
+
fitToView(): void;
|
|
62
108
|
getClassificationColors(): Map<string, string>;
|
|
63
109
|
setClassificationColor(label: string, color: string): void;
|
|
64
110
|
getColormap(): Observable<ColormapNode | null>;
|
|
65
111
|
setColormap(colormap: ColormapNode): void;
|
|
66
112
|
getColormapOptions(): ColormapNode[];
|
|
67
113
|
getReverseScale(): Observable<boolean>;
|
|
68
|
-
setReverseScale(reverscale:
|
|
114
|
+
setReverseScale(reverscale: boolean): void;
|
|
69
115
|
setImageMeta(imageMeta: IImageMetadata[]): void;
|
|
70
116
|
getImageMeta(): Observable<IImageMetadata[]>;
|
|
71
117
|
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { AxesLayer, SurfaceLayer, Viewer } from 'napari-js';
|
|
2
|
+
import type { AxisLabelSpec } from 'napari-js/overlays';
|
|
3
|
+
import { ISurface3dControls } from '../../contracts/visualizer.contract';
|
|
4
|
+
import type { SceneContext } from './napari-scene';
|
|
5
|
+
/** A centred world box. */
|
|
6
|
+
export interface Box3 {
|
|
7
|
+
width: number;
|
|
8
|
+
height: number;
|
|
9
|
+
depth: number;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* The 3D coordinate-axes / scale gizmo (review Appendix B): napari-js's `AxesLayer` plus the DOM
|
|
13
|
+
* X/Y/Z labels that track it (its `AxesLabelsOverlay`) — what the volume and the surface used to
|
|
14
|
+
* build twice.
|
|
15
|
+
*/
|
|
16
|
+
export declare class Axes3dGizmo {
|
|
17
|
+
private readonly viewer;
|
|
18
|
+
readonly layer: AxesLayer;
|
|
19
|
+
private readonly labels;
|
|
20
|
+
constructor(viewer: Viewer, host: HTMLElement, box: Box3, labels: AxisLabelSpec[], opts: {
|
|
21
|
+
visible: boolean;
|
|
22
|
+
voxelSize?: [number, number, number];
|
|
23
|
+
});
|
|
24
|
+
setVisible(visible: boolean): void;
|
|
25
|
+
/** The box's depth changed (the volume's Z-height handle): restretch the axis and its labels. */
|
|
26
|
+
setDepth(depth: number, labels: AxisLabelSpec[]): void;
|
|
27
|
+
destroy(): void;
|
|
28
|
+
}
|
|
29
|
+
/** A Plotly-style 3D drag mode, as napari-js's camera drag mode (orbit/turntable → rotate). */
|
|
30
|
+
export declare function cameraDragMode(mode: string): 'pan' | 'zoom' | 'rotate';
|
|
31
|
+
/**
|
|
32
|
+
* The 3D view controls every 3D image scene offers: camera drag mode and re-framing, the axes
|
|
33
|
+
* gizmo's visibility and the surface's wireframe — both persisted in the viewer settings, so the
|
|
34
|
+
* next mount re-applies them.
|
|
35
|
+
*/
|
|
36
|
+
export declare function surface3dControls(ctx: SceneContext, gizmo: () => Axes3dGizmo | null, surface?: () => SurfaceLayer | null): ISurface3dControls;
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { Subscription } from 'rxjs';
|
|
2
|
+
import type { Colormap } from 'napari-js';
|
|
3
|
+
import { IChannelState } from '../../contracts/channel-histogram-api.contract';
|
|
4
|
+
import { Rgb } from '../../contracts/colormap-lut';
|
|
5
|
+
import { ColormapNode, SpatialViewState } from '../../contracts/display-types';
|
|
6
|
+
import { VisualizerStore } from '../../store/visualizer-store.service';
|
|
7
|
+
/** The display settings every napari layer's colours are derived from. */
|
|
8
|
+
export interface DisplaySnapshot {
|
|
9
|
+
/** The selected display colormap node (a name or inline stops in `data.value`), if any. */
|
|
10
|
+
colormap: ColormapNode | null;
|
|
11
|
+
reverse: boolean;
|
|
12
|
+
invert: boolean;
|
|
13
|
+
}
|
|
14
|
+
/** The grayscale display colormap from the store selection (+reverse), defaulting to gray.
|
|
15
|
+
* Maps the store colormap node to a napari `Colormap` via the library's LUT factory; the
|
|
16
|
+
* multichannel tint ramps are built inside napari-js's `MultiChannelImageView` from each
|
|
17
|
+
* channel's hex colour. */
|
|
18
|
+
export declare function grayscaleColormap(s: DisplaySnapshot): Colormap | string;
|
|
19
|
+
/** A channel's tint colormap (black→colour), flipped for reverse-scale. Invert is not a colormap
|
|
20
|
+
* flip: it goes on the layer (`invert`), before gamma, as on the 2D image. */
|
|
21
|
+
export declare function channelTintColormap(color: string, s: DisplaySnapshot): Colormap | string;
|
|
22
|
+
/**
|
|
23
|
+
* Colour map for the volume/isosurface (and the surface and 3D scatter). A real colormap
|
|
24
|
+
* selection (viridis/magma/…) wins; otherwise the channel's colour tints it (so the channel-dialog
|
|
25
|
+
* colour swatch recolors the 3D render). Reverse-scale flips the ramp; invert is the layer's own
|
|
26
|
+
* `invert` (window → invert → gamma → colormap), not a second flip — the two differ once gamma ≠ 1.
|
|
27
|
+
*/
|
|
28
|
+
export declare function volumeColormap(st: IChannelState | undefined, s: DisplaySnapshot): Colormap | string;
|
|
29
|
+
/** The LUT a continuous spatial layer draws with: the view's own choice, else the display
|
|
30
|
+
* colormap and its reverse flag — one rule for the markers, the cloud and both gene maps. */
|
|
31
|
+
export declare function spatialLut(view: SpatialViewState, s: DisplaySnapshot): Rgb[];
|
|
32
|
+
/**
|
|
33
|
+
* Identity of the colour scale a continuous spatial layer will draw with, for a
|
|
34
|
+
* cache key: the explicit choice, or else the display colormap and its reverse
|
|
35
|
+
* flag, since that is what {@link spatialLut} falls back to.
|
|
36
|
+
*
|
|
37
|
+
* The gene maps cache their coloured output, so without this in the key a change
|
|
38
|
+
* of colour scale left the field on screen in the previous colours — the markers
|
|
39
|
+
* recoloured and the map under them did not.
|
|
40
|
+
*/
|
|
41
|
+
export declare function continuousColormapKey(view: SpatialViewState, s: DisplaySnapshot): string;
|
|
42
|
+
/**
|
|
43
|
+
* The store's display state as the napari layers consume it (review Appendix B, step 3;
|
|
44
|
+
* NAPARI-SVC-21): one subscription to channel states, colormap, reverse, invert and the selected
|
|
45
|
+
* channel, a {@link DisplaySnapshot} of the last values seen, and the colormap/LUT derivations
|
|
46
|
+
* every scene shares.
|
|
47
|
+
*
|
|
48
|
+
* The snapshot outlives a scene, as the scenes' builders read it before their own subscription
|
|
49
|
+
* has emitted; each scene owns the subscription {@link watch} hands it.
|
|
50
|
+
*/
|
|
51
|
+
export declare class NapariDisplayState implements DisplaySnapshot {
|
|
52
|
+
private readonly store;
|
|
53
|
+
colormap: ColormapNode | null;
|
|
54
|
+
reverse: boolean;
|
|
55
|
+
invert: boolean;
|
|
56
|
+
constructor(store: VisualizerStore);
|
|
57
|
+
/**
|
|
58
|
+
* Follow the store: record the colormap/reverse/invert the builders read, then hand `apply`
|
|
59
|
+
* the channel states and the selected channel. Emits at once with the current values.
|
|
60
|
+
*/
|
|
61
|
+
watch(apply: (channels: IChannelState[], selected: number) => void): Subscription;
|
|
62
|
+
/**
|
|
63
|
+
* Follow the invert setting alone: record it for the builders, then hand it to `apply` — for a
|
|
64
|
+
* scene that draws inverted layers without the channel states (the spatial cloud's density
|
|
65
|
+
* volumes). Emits at once with the current value.
|
|
66
|
+
*/
|
|
67
|
+
watchInvert(apply: (invert: boolean) => void): Subscription;
|
|
68
|
+
/** The spatial scenes' share: they follow the colormap and reverse flag (not invert) through
|
|
69
|
+
* their own subscription, because a gene map recolours with them. */
|
|
70
|
+
record(colormap: ColormapNode | null, reverse: boolean): void;
|
|
71
|
+
grayscaleColormap(): Colormap | string;
|
|
72
|
+
channelTintColormap(color: string): Colormap | string;
|
|
73
|
+
volumeColormap(st: IChannelState | undefined): Colormap | string;
|
|
74
|
+
spatialLut(view: SpatialViewState): Rgb[];
|
|
75
|
+
continuousColormapKey(view: SpatialViewState): string;
|
|
76
|
+
}
|
|
@@ -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
|
+
}
|