@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,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure binary-mask helpers: polygon rasterization (napari-js's `rasterizePolygon`)
|
|
3
|
+
* and bbox-relative mask set operations. No DOM, no Angular — the mask-export
|
|
4
|
+
* worker imports this.
|
|
5
|
+
*/
|
|
6
|
+
/** A bbox-relative binary mask (1 = filled, 0 = empty) whose pixel (0,0) sits
|
|
7
|
+
* at (bx, by) in the frame it was rasterized in. */
|
|
8
|
+
export interface BBoxMask {
|
|
9
|
+
bx: number;
|
|
10
|
+
by: number;
|
|
11
|
+
bw: number;
|
|
12
|
+
bh: number;
|
|
13
|
+
mask: Uint8Array;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* The largest bbox (in pixels) {@link rasterizePolygon} allocates before it
|
|
17
|
+
* falls back to clipping at the window. Also the cap the wand/brush use to
|
|
18
|
+
* decide whether a region can be edited at the current zoom.
|
|
19
|
+
*/
|
|
20
|
+
export declare const MAX_RASTER_PIXELS: number;
|
|
21
|
+
/**
|
|
22
|
+
* Rasterize a closed polygon (minus its holes) into a bbox-relative mask, e.g.
|
|
23
|
+
* as the starting point for a wand/brush stroke accumulator.
|
|
24
|
+
*
|
|
25
|
+
* Pixel (px, py) covers `[px, px + 1) × [py, py + 1)` and is set when its centre
|
|
26
|
+
* is inside — the rule under which the pixel-edge outlines `geometry/contour`
|
|
27
|
+
* traces come back as exactly the pixels they were traced from.
|
|
28
|
+
*
|
|
29
|
+
* Returns the bbox origin plus the filled mask, or null if the polygon is
|
|
30
|
+
* degenerate (covers no pixel centre). The polygon's full extent is kept even
|
|
31
|
+
* where it is negative or exceeds `imageWidth`×`imageHeight` (jit-ui#102); only
|
|
32
|
+
* a bbox larger than {@link MAX_RASTER_PIXELS} is clipped to that window (rare:
|
|
33
|
+
* a region enormous at the current zoom; accepts the clip).
|
|
34
|
+
*/
|
|
35
|
+
export declare function rasterizePolygon(xpoints: number[], ypoints: number[], imageWidth: number, imageHeight: number, holes?: number[][][]): BBoxMask | null;
|
|
36
|
+
/** Returns true if the two bbox-relative masks share at least one set pixel. */
|
|
37
|
+
export declare function masksOverlap(a: BBoxMask, b: BBoxMask): boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Allocate a fresh accumulator covering both masks and OR them in. The
|
|
40
|
+
* resulting mask's bbox is the smallest rectangle containing both inputs.
|
|
41
|
+
*/
|
|
42
|
+
export declare function unionMasks(a: BBoxMask, b: BBoxMask): BBoxMask;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { Mesh } from 'napari-js/geometry';
|
|
2
|
+
/**
|
|
3
|
+
* A region's outlines on one slice: rings as interleaved `x, y` image pixels (holes included), and
|
|
4
|
+
* open polylines (a layer boundary), likewise.
|
|
5
|
+
*/
|
|
6
|
+
export interface SliceOutlines {
|
|
7
|
+
z: number;
|
|
8
|
+
rings: ArrayLike<number>[];
|
|
9
|
+
/**
|
|
10
|
+
* The feature each ring is part of (equal ids, one feature): a feature's rings fill even-odd (its
|
|
11
|
+
* holes), the features as their union, so one inside or over another cuts no hole in it. Absent:
|
|
12
|
+
* the rings are one feature.
|
|
13
|
+
*/
|
|
14
|
+
ringGroups?: ArrayLike<number>;
|
|
15
|
+
lines?: ArrayLike<number>[];
|
|
16
|
+
}
|
|
17
|
+
export interface ReconstructOptions {
|
|
18
|
+
/** In-plane voxel edge, image px (default 1). Raised to keep the mask within `maxVoxels`. */
|
|
19
|
+
pixelStep?: number;
|
|
20
|
+
/** At most this many voxels (default 32 M). */
|
|
21
|
+
maxVoxels?: number;
|
|
22
|
+
/** Laplacian smoothing passes (default 2). */
|
|
23
|
+
smooth?: number;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* The mesh of the region outlined by `slices`, in image pixels (x, y) and slice indices (z: slice
|
|
27
|
+
* k's plane at z = k): the filled outlines' surface, and the sheet through the lines (see
|
|
28
|
+
* {@link loftLines}). Empty when no slice has an area and no two slices have lines.
|
|
29
|
+
*/
|
|
30
|
+
export declare function reconstruct(slices: readonly SliceOutlines[], opts?: ReconstructOptions): Mesh;
|
|
31
|
+
/**
|
|
32
|
+
* The area inside `rings` (interleaved `x, y`), even-odd: a ring inside an odd number of others is
|
|
33
|
+
* a hole. Exact for rings that do not cross (a polygon set's exteriors and holes).
|
|
34
|
+
*/
|
|
35
|
+
export declare function ringsArea(rings: readonly ArrayLike<number>[]): number;
|
|
36
|
+
/**
|
|
37
|
+
* The rings of each feature (see {@link SliceOutlines.ringGroups}), in the order first met; one
|
|
38
|
+
* feature of every ring without `groups`.
|
|
39
|
+
*/
|
|
40
|
+
export declare function featureRings(rings: readonly ArrayLike<number>[], groups?: ArrayLike<number>): ArrayLike<number>[][];
|
|
41
|
+
/**
|
|
42
|
+
* The area of a slice's outlines (px²): each feature's (even-odd, see {@link ringsArea}), the
|
|
43
|
+
* features as their union, so a feature inside or over another of the slice adds only what it
|
|
44
|
+
* covers beyond it. Features whose extents overlap are measured together, by the length of their
|
|
45
|
+
* union along each row, exact between the rows through their vertices where no outline crosses
|
|
46
|
+
* another (and refined where one does).
|
|
47
|
+
*/
|
|
48
|
+
export declare function outlinesArea(rings: readonly ArrayLike<number>[], groups?: ArrayLike<number>): number;
|
|
49
|
+
/**
|
|
50
|
+
* The volume of the region outlined by `slices`, in px² × slices (one slice thick per outline):
|
|
51
|
+
* the sum of each slice's area (see {@link outlinesArea}; Cavalieri's estimator). Times µm per px²
|
|
52
|
+
* and per slice, µm³.
|
|
53
|
+
*/
|
|
54
|
+
export declare function outlinedVolume(slices: readonly SliceOutlines[]): number;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { Colormap } from 'napari-js';
|
|
2
|
+
import type { SectionAxis } from './section';
|
|
3
|
+
/** One channel of a volume as it is displayed. */
|
|
4
|
+
export interface VolumeChannelVoxels {
|
|
5
|
+
/** uint8 voxels, x fastest, then y, then z. */
|
|
6
|
+
data: Uint8Array;
|
|
7
|
+
/** The colormap the 3D view draws the channel with (a tint, or the display colormap). */
|
|
8
|
+
colormap: Colormap;
|
|
9
|
+
/** Display window over 0..255. */
|
|
10
|
+
min: number;
|
|
11
|
+
max: number;
|
|
12
|
+
/** napari-js gamma (see `toNapariGamma`): the windowed value t shows as t^γ. */
|
|
13
|
+
gamma: number;
|
|
14
|
+
visible: boolean;
|
|
15
|
+
}
|
|
16
|
+
export interface VolumeVoxels {
|
|
17
|
+
width: number;
|
|
18
|
+
height: number;
|
|
19
|
+
depth: number;
|
|
20
|
+
channels: readonly VolumeChannelVoxels[];
|
|
21
|
+
invert: boolean;
|
|
22
|
+
}
|
|
23
|
+
/** An RGBA image, row by row. */
|
|
24
|
+
export interface RgbaImage {
|
|
25
|
+
width: number;
|
|
26
|
+
height: number;
|
|
27
|
+
data: Uint8ClampedArray;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* The image of the plane `axis = index` (a voxel index): through x, slices across and y down;
|
|
31
|
+
* through y, x across and slices down — the section coordinates of `geometry/section`.
|
|
32
|
+
*/
|
|
33
|
+
export declare function resliceImage(vol: VolumeVoxels, axis: SectionAxis, index: number): RgbaImage;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure ring (closed polyline) helpers: bounds, containment, vertex dropping and
|
|
3
|
+
* simplification. No DOM, no Angular, no `this` — usable from workers.
|
|
4
|
+
*
|
|
5
|
+
* A ring is a pair of parallel `xs`/`ys` arrays without a repeated closing
|
|
6
|
+
* vertex; hole rings use the `[[x, y], …]` convention of {@link Polygon.holes}.
|
|
7
|
+
*/
|
|
8
|
+
/** Axis-aligned bounds of a ring. Infinite (min > max) for an empty ring. */
|
|
9
|
+
export interface RingBounds {
|
|
10
|
+
minX: number;
|
|
11
|
+
minY: number;
|
|
12
|
+
maxX: number;
|
|
13
|
+
maxY: number;
|
|
14
|
+
}
|
|
15
|
+
/** The axis-aligned bounds of a ring's vertices. */
|
|
16
|
+
export declare function ringBounds(xs: ArrayLike<number>, ys: ArrayLike<number>): RingBounds;
|
|
17
|
+
/**
|
|
18
|
+
* Standard ray-cast (even-odd) point-in-ring test. (px, py) and the ring
|
|
19
|
+
* vertices must be in the same coordinate system. Rings with fewer than three
|
|
20
|
+
* vertices contain nothing.
|
|
21
|
+
*/
|
|
22
|
+
export declare function pointInRing(px: number, py: number, xs: ArrayLike<number>, ys: ArrayLike<number>): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Point-in-region test that honours interior rings (holes): inside the
|
|
25
|
+
* exterior AND outside every hole. Coordinates must share the polygon's frame.
|
|
26
|
+
* With no holes this is exactly {@link pointInRing}.
|
|
27
|
+
*/
|
|
28
|
+
export declare function pointInPolygonWithHoles(px: number, py: number, xs: ArrayLike<number>, ys: ArrayLike<number>, holes?: number[][][]): boolean;
|
|
29
|
+
/** {@link pointInRing} over a `[[x, y], …]` ring (the hole convention), without splitting it. */
|
|
30
|
+
export declare function pointInPairRing(px: number, py: number, ring: ReadonlyArray<ArrayLike<number>>): boolean;
|
|
31
|
+
/**
|
|
32
|
+
* Drop every vertex whose Euclidean distance to (cx, cy) is less than
|
|
33
|
+
* `radius`. Returns trimmed parallel arrays plus how many vertices were
|
|
34
|
+
* removed (so the caller can detect a no-op tick and skip the relayout).
|
|
35
|
+
*/
|
|
36
|
+
export declare function dropVerticesWithinRadius(xpoints: number[], ypoints: number[], cx: number, cy: number, radius: number): {
|
|
37
|
+
xpoints: number[];
|
|
38
|
+
ypoints: number[];
|
|
39
|
+
removed: number;
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Erase the part of a ring that lies within `radius` of (cx, cy): every vertex
|
|
43
|
+
* inside the disc goes (as {@link dropVerticesWithinRadius}), and the outline is
|
|
44
|
+
* rejoined where it crosses the disc's edge rather than at the next vertex left
|
|
45
|
+
* standing. On a densely sampled outline the two agree; on a sparse one (a
|
|
46
|
+
* traced box is four corners) dropping a corner would otherwise cut straight to
|
|
47
|
+
* the neighbouring corners. A `closed` ring wraps; an open one (a polyline) has
|
|
48
|
+
* no edge from its last vertex back to its first. Returns the trimmed parallel
|
|
49
|
+
* arrays plus how many of the ring's own vertices were removed (0: unchanged).
|
|
50
|
+
*/
|
|
51
|
+
export declare function eraseRingWithinRadius(xpoints: number[], ypoints: number[], cx: number, cy: number, radius: number, closed?: boolean): {
|
|
52
|
+
xpoints: number[];
|
|
53
|
+
ypoints: number[];
|
|
54
|
+
removed: number;
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* Simplify a closed ring with the Douglas–Peucker algorithm (jit-ui#85):
|
|
58
|
+
* drop every vertex that lies within `epsilon` pixels (the "altitude
|
|
59
|
+
* threshold") of the line between its kept neighbours. Anchored at vertex 0
|
|
60
|
+
* (the ring is closed by appending it). Rings of ≤ 3 vertices, or a
|
|
61
|
+
* non-positive epsilon, are returned unchanged. Output keeps the closed-ring
|
|
62
|
+
* convention (no repeated closing point).
|
|
63
|
+
*/
|
|
64
|
+
export declare function simplifyRing(xs: number[], ys: number[], epsilon: number): {
|
|
65
|
+
xs: number[];
|
|
66
|
+
ys: number[];
|
|
67
|
+
};
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { SliceOutlines } from './reconstruct';
|
|
2
|
+
/** The plane: x = const (a section along y and the slices) or y = const (along x and the slices). */
|
|
3
|
+
export type SectionAxis = 'x' | 'y';
|
|
4
|
+
/** A class's outlines in a section, as interleaved `u, v`. */
|
|
5
|
+
export interface ClassSection {
|
|
6
|
+
/** Closed outlines, holes included (even-odd). */
|
|
7
|
+
rings: Float64Array[];
|
|
8
|
+
/** Open lines; a line of one point is where the class crosses on one slice only. */
|
|
9
|
+
lines: Float64Array[];
|
|
10
|
+
}
|
|
11
|
+
export interface SectionOptions {
|
|
12
|
+
/** Slices in the stack. */
|
|
13
|
+
depth: number;
|
|
14
|
+
/** Image px across the section's in-plane axis: the image height through x, its width through y. */
|
|
15
|
+
extent: number;
|
|
16
|
+
/** In-plane cell size of the closed shapes' cut, image px (default 1). */
|
|
17
|
+
step?: number;
|
|
18
|
+
/** Farthest a line moves between neighbouring slices and is still joined, image px (default extent / 10). */
|
|
19
|
+
maxJump?: number;
|
|
20
|
+
}
|
|
21
|
+
/** `[x0, y0, x1, y1]`, image px. */
|
|
22
|
+
type Box = [number, number, number, number];
|
|
23
|
+
/** A ring or line with its extent. */
|
|
24
|
+
interface Indexed {
|
|
25
|
+
points: ArrayLike<number>;
|
|
26
|
+
box: Box;
|
|
27
|
+
}
|
|
28
|
+
interface IndexedSlice {
|
|
29
|
+
z: number;
|
|
30
|
+
rings: Indexed[];
|
|
31
|
+
/** Each ring's feature (see SliceOutlines.ringGroups); absent: one feature. */
|
|
32
|
+
ringGroups?: ArrayLike<number>;
|
|
33
|
+
lines: Indexed[];
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Every class's outlines with each ring's and line's extent (and the class's): made once, it cuts
|
|
37
|
+
* any number of sections visiting only the outlines a plane crosses.
|
|
38
|
+
*/
|
|
39
|
+
export interface SectionIndex {
|
|
40
|
+
readonly classes: ReadonlyMap<string, {
|
|
41
|
+
box: Box;
|
|
42
|
+
slices: readonly IndexedSlice[];
|
|
43
|
+
}>;
|
|
44
|
+
}
|
|
45
|
+
/** Index every class's outlines for cutting (see {@link SectionIndex}). */
|
|
46
|
+
export declare function indexOutlines(byClass: ReadonlyMap<string, readonly SliceOutlines[]>): SectionIndex;
|
|
47
|
+
/**
|
|
48
|
+
* Each class's cut by the plane `axis = at`; classes the plane misses are left out. Pass an
|
|
49
|
+
* {@link indexOutlines} index to cut many sections of the same outlines.
|
|
50
|
+
*/
|
|
51
|
+
export declare function sectionOutlines(outlines: SectionIndex | ReadonlyMap<string, readonly SliceOutlines[]>, axis: SectionAxis, at: number, opts: SectionOptions): Map<string, ClassSection>;
|
|
52
|
+
export {};
|
|
@@ -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
|
+
}
|