@jax-data-science/sci-image-visualizer 0.8.3 → 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 +358 -4218
- 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 -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/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 -883
- 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
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { EventEmitter, OnChanges } from '@angular/core';
|
|
2
|
+
import { Region } from '../../models/region';
|
|
3
|
+
import { PresetSet } from '../../models/class-preset';
|
|
4
|
+
import { PixelSize } from '../region-metrics';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
/** A page change from the paginator. */
|
|
7
|
+
export interface RegionPage {
|
|
8
|
+
first: number;
|
|
9
|
+
rows: number;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* The Region Editor's regions table and paginator: one page of rows with a
|
|
13
|
+
* class dropdown (or an inline label editor), the area, and a delete button.
|
|
14
|
+
* Presentational and OnPush: the editor owns the rows, the selection, the
|
|
15
|
+
* paging and the label drafts, and applies every edit through its one
|
|
16
|
+
* copy-on-write commit path — the table never changes a {@link Region}.
|
|
17
|
+
*/
|
|
18
|
+
export declare class RegionTableComponent implements OnChanges {
|
|
19
|
+
/** The rows on the current page. */
|
|
20
|
+
page: Region[];
|
|
21
|
+
/** Total number of rows (all pages). */
|
|
22
|
+
total: number;
|
|
23
|
+
/** Index of the page's first row across all pages. */
|
|
24
|
+
first: number;
|
|
25
|
+
/** Rows per page. */
|
|
26
|
+
rows: number;
|
|
27
|
+
/** The paginator's rows-per-page choices. */
|
|
28
|
+
rowsPerPageOptions: number[];
|
|
29
|
+
/** Ctrl/Cmd-click toggles a row (PrimeNG metaKeySelection). */
|
|
30
|
+
metaKey: boolean;
|
|
31
|
+
/** The selected rows. */
|
|
32
|
+
selection: Region[];
|
|
33
|
+
/** The table's selection changed (any row click). */
|
|
34
|
+
selectionChange: EventEmitter<Region[]>;
|
|
35
|
+
/** A row was selected or unselected (after {@link selectionChange}). */
|
|
36
|
+
rowSelect: EventEmitter<void>;
|
|
37
|
+
/** Classes for the per-row dropdown, and their colours. */
|
|
38
|
+
presetSet: PresetSet;
|
|
39
|
+
/** Swatch colour of an unlabelled row. */
|
|
40
|
+
defaultColor: string;
|
|
41
|
+
/** Pixel size for the area column. */
|
|
42
|
+
mpp: PixelSize;
|
|
43
|
+
/** Rows whose label is being edited → the typed draft. A new map per start/stop. */
|
|
44
|
+
labelDrafts: Map<Region, string>;
|
|
45
|
+
/** A row's pencil: start editing its label. */
|
|
46
|
+
labelEditStart: EventEmitter<Region>;
|
|
47
|
+
/** The inline label editor's text changed. */
|
|
48
|
+
labelDraftChange: EventEmitter<{
|
|
49
|
+
region: Region;
|
|
50
|
+
value: string;
|
|
51
|
+
}>;
|
|
52
|
+
/** The inline label editor closed: Enter commits, Escape / close cancels. */
|
|
53
|
+
labelEditStop: EventEmitter<{
|
|
54
|
+
region: Region;
|
|
55
|
+
commit: boolean;
|
|
56
|
+
}>;
|
|
57
|
+
/** A class was picked in a row's dropdown. */
|
|
58
|
+
classPick: EventEmitter<{
|
|
59
|
+
region: Region;
|
|
60
|
+
name: string;
|
|
61
|
+
}>;
|
|
62
|
+
/** A row's trash button: the row's index across all pages. */
|
|
63
|
+
deleteRow: EventEmitter<number>;
|
|
64
|
+
/** The paginator moved or changed its page size. */
|
|
65
|
+
pageChange: EventEmitter<RegionPage>;
|
|
66
|
+
/** Per row of {@link page}: its class swatch colour and formatted area, derived when
|
|
67
|
+
* an input changes instead of per check (the area walks the region's geometry). */
|
|
68
|
+
protected rowView: Map<Region, {
|
|
69
|
+
color: string;
|
|
70
|
+
area: string;
|
|
71
|
+
}>;
|
|
72
|
+
ngOnChanges(): void;
|
|
73
|
+
private classColor;
|
|
74
|
+
private area;
|
|
75
|
+
protected startEdit(region: Region, event: Event): void;
|
|
76
|
+
protected stopEdit(region: Region, commit: boolean, event: Event): void;
|
|
77
|
+
protected onPage(event: {
|
|
78
|
+
first?: number;
|
|
79
|
+
rows?: number;
|
|
80
|
+
}): void;
|
|
81
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<RegionTableComponent, never>;
|
|
82
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<RegionTableComponent, "region-table", never, { "page": { "alias": "page"; "required": false; }; "total": { "alias": "total"; "required": false; }; "first": { "alias": "first"; "required": false; }; "rows": { "alias": "rows"; "required": false; }; "rowsPerPageOptions": { "alias": "rowsPerPageOptions"; "required": false; }; "metaKey": { "alias": "metaKey"; "required": false; }; "selection": { "alias": "selection"; "required": false; }; "presetSet": { "alias": "presetSet"; "required": false; }; "defaultColor": { "alias": "defaultColor"; "required": false; }; "mpp": { "alias": "mpp"; "required": false; }; "labelDrafts": { "alias": "labelDrafts"; "required": false; }; }, { "selectionChange": "selectionChange"; "rowSelect": "rowSelect"; "labelEditStart": "labelEditStart"; "labelDraftChange": "labelDraftChange"; "labelEditStop": "labelEditStop"; "classPick": "classPick"; "deleteRow": "deleteRow"; "pageChange": "pageChange"; }, never, never, true, never>;
|
|
83
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { EventEmitter } from '@angular/core';
|
|
2
|
+
import { MaskMode } from '../mask-export.service';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
/**
|
|
5
|
+
* The Region Editor's "Save mask" dialog: filename + mask type while idle, a
|
|
6
|
+
* progress bar (rasterize, then encode) with a Cancel button while the export
|
|
7
|
+
* runs. Presentational — the editor owns the state and the export
|
|
8
|
+
* ({@link MaskExportService}); the dialog only reports edits and clicks.
|
|
9
|
+
*/
|
|
10
|
+
export declare class SaveMaskDialogComponent {
|
|
11
|
+
/** The dialog is open. */
|
|
12
|
+
visible: boolean;
|
|
13
|
+
/** The dialog was closed (`false`); two-way with {@link visible}. */
|
|
14
|
+
visibleChange: EventEmitter<boolean>;
|
|
15
|
+
/** The PNG filename. */
|
|
16
|
+
filename: string;
|
|
17
|
+
/** The filename was edited; two-way with {@link filename}. */
|
|
18
|
+
filenameChange: EventEmitter<string>;
|
|
19
|
+
/** The mask type: binary, or one label value per class. */
|
|
20
|
+
mode: MaskMode;
|
|
21
|
+
/** The mask type was changed; two-way with {@link mode}. */
|
|
22
|
+
modeChange: EventEmitter<MaskMode>;
|
|
23
|
+
/** True while the export runs (the form is replaced by progress). */
|
|
24
|
+
busy: boolean;
|
|
25
|
+
/** 0–100 rasterization progress. */
|
|
26
|
+
progress: number;
|
|
27
|
+
/** True once rasterizing is done and the PNG is being encoded. */
|
|
28
|
+
encoding: boolean;
|
|
29
|
+
/** Download clicked with a non-blank filename. */
|
|
30
|
+
confirm: EventEmitter<void>;
|
|
31
|
+
/** Cancel clicked while the export runs. */
|
|
32
|
+
cancelExport: EventEmitter<void>;
|
|
33
|
+
protected close(): void;
|
|
34
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<SaveMaskDialogComponent, never>;
|
|
35
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<SaveMaskDialogComponent, "region-save-mask-dialog", never, { "visible": { "alias": "visible"; "required": false; }; "filename": { "alias": "filename"; "required": false; }; "mode": { "alias": "mode"; "required": false; }; "busy": { "alias": "busy"; "required": false; }; "progress": { "alias": "progress"; "required": false; }; "encoding": { "alias": "encoding"; "required": false; }; }, { "visibleChange": "visibleChange"; "filenameChange": "filenameChange"; "modeChange": "modeChange"; "confirm": "confirm"; "cancelExport": "cancelExport"; }, never, never, true, never>;
|
|
36
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { EventEmitter } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
/**
|
|
4
|
+
* A GeoJSON filename dialog, used by the Region Editor for both "Save Regions
|
|
5
|
+
* As" (server save: overwrite warning, progress + Cancel while busy) and
|
|
6
|
+
* "Export Regions" (download). Presentational — the editor owns the state and
|
|
7
|
+
* the I/O ({@link RegionPersistenceService}).
|
|
8
|
+
*/
|
|
9
|
+
export declare class SaveRegionsDialogComponent {
|
|
10
|
+
/** The dialog title. */
|
|
11
|
+
header: string;
|
|
12
|
+
/** The confirm button's label. */
|
|
13
|
+
confirmLabel: string;
|
|
14
|
+
/** The confirm button's PrimeIcons class. */
|
|
15
|
+
confirmIcon: string;
|
|
16
|
+
/** id of the filename input (unique per dialog instance). */
|
|
17
|
+
inputId: string;
|
|
18
|
+
/** The dialog is open. */
|
|
19
|
+
visible: boolean;
|
|
20
|
+
/** The dialog was closed (`false`); two-way with {@link visible}. */
|
|
21
|
+
visibleChange: EventEmitter<boolean>;
|
|
22
|
+
/** The GeoJSON filename. */
|
|
23
|
+
filename: string;
|
|
24
|
+
/** The filename was edited; two-way with {@link filename}. */
|
|
25
|
+
filenameChange: EventEmitter<string>;
|
|
26
|
+
/** Shows the "will be overwritten" warning. */
|
|
27
|
+
fileExists: boolean;
|
|
28
|
+
/** True while the save runs (the form is replaced by progress). */
|
|
29
|
+
busy: boolean;
|
|
30
|
+
/** Save/Export clicked with a non-blank filename. */
|
|
31
|
+
confirm: EventEmitter<void>;
|
|
32
|
+
/** Cancel clicked while the save runs. */
|
|
33
|
+
cancelSave: EventEmitter<void>;
|
|
34
|
+
protected close(): void;
|
|
35
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<SaveRegionsDialogComponent, never>;
|
|
36
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<SaveRegionsDialogComponent, "region-save-regions-dialog", never, { "header": { "alias": "header"; "required": false; }; "confirmLabel": { "alias": "confirmLabel"; "required": false; }; "confirmIcon": { "alias": "confirmIcon"; "required": false; }; "inputId": { "alias": "inputId"; "required": false; }; "visible": { "alias": "visible"; "required": false; }; "filename": { "alias": "filename"; "required": false; }; "fileExists": { "alias": "fileExists"; "required": false; }; "busy": { "alias": "busy"; "required": false; }; }, { "visibleChange": "visibleChange"; "filenameChange": "filenameChange"; "confirm": "confirm"; "cancelSave": "cancelSave"; }, never, never, true, never>;
|
|
37
|
+
}
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import { Region } from './models/region';
|
|
2
|
-
import { WandService } from './toolbar/wand/wand.service';
|
|
3
2
|
import * as i0 from "@angular/core";
|
|
4
3
|
/**
|
|
5
4
|
* Pure (DOM-free) region set-operations — merge / inverse / ungroup (jit-ui#85).
|
|
6
5
|
*
|
|
7
6
|
* Raster-based, reusing the wand/brush mask pipeline
|
|
8
|
-
* ({@link
|
|
7
|
+
* ({@link rasterizePolygon} → {@link maskToPolygons}, the pure `geometry/` modules),
|
|
9
8
|
* so "select + merge" yields the same geometry as brushing regions together:
|
|
10
9
|
* one engine, one set of behaviours, holes + multi-part results for free.
|
|
11
10
|
*
|
|
@@ -15,7 +14,6 @@ import * as i0 from "@angular/core";
|
|
|
15
14
|
* image pixels throughout.
|
|
16
15
|
*/
|
|
17
16
|
export declare class RegionOpsService {
|
|
18
|
-
private wand;
|
|
19
17
|
/**
|
|
20
18
|
* Largest raster (in pixels) a region set-op will allocate on the main thread.
|
|
21
19
|
* Selections whose clipped bbox exceeds this are rasterized at a proportional
|
|
@@ -25,7 +23,6 @@ export declare class RegionOpsService {
|
|
|
25
23
|
* large-extent selections (small selections keep full resolution).
|
|
26
24
|
*/
|
|
27
25
|
private static readonly MAX_OP_PIXELS;
|
|
28
|
-
constructor(wand: WandService);
|
|
29
26
|
/**
|
|
30
27
|
* Geometric union of `regions` into a single region: a {@link Polygon} when
|
|
31
28
|
* the union is one connected piece, a {@link MultiPolygon} when it stays
|
|
@@ -51,8 +48,6 @@ export declare class RegionOpsService {
|
|
|
51
48
|
* no full-image buffer is ever allocated.
|
|
52
49
|
*/
|
|
53
50
|
inverse(regions: Region[], imageWidth: number, imageHeight: number): Region | null;
|
|
54
|
-
/** A closed straight-edged Polygon from parallel coord arrays. */
|
|
55
|
-
private ringPolygon;
|
|
56
51
|
/**
|
|
57
52
|
* Split a region into its disjoint parts — one region per {@link MultiPolygon}
|
|
58
53
|
* part. A single connected {@link Polygon}/{@link Rectangle} has nothing to
|
|
@@ -86,7 +81,6 @@ export declare class RegionOpsService {
|
|
|
86
81
|
* inheriting colour/label from `proto`. Null when there are no parts. */
|
|
87
82
|
private regionFromParts;
|
|
88
83
|
private makeRegion;
|
|
89
|
-
private clonePolygon;
|
|
90
84
|
static ɵfac: i0.ɵɵFactoryDeclaration<RegionOpsService, never>;
|
|
91
85
|
static ɵprov: i0.ɵɵInjectableDeclaration<RegionOpsService>;
|
|
92
86
|
}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Region-overlay geometry shared by the OpenSeadragon and napari overlays
|
|
3
|
+
* (review NAPARI-BOUNDARY-13, OSD-PLOTLY-16).
|
|
4
|
+
*
|
|
5
|
+
* Both overlays used to carry their own copy of this code, and the copies had
|
|
6
|
+
* drifted: napari's hit test ignored holes, multi-part regions and open
|
|
7
|
+
* polylines, its bézier path drew straight edges without stored handles, and it
|
|
8
|
+
* rendered nothing for a MultiPolygon. Everything here is pure — no DOM, no
|
|
9
|
+
* viewer — so the overlays are left with gestures and DOM.
|
|
10
|
+
*
|
|
11
|
+
* Coordinates: regions are in WORLD (image-pixel) space. Functions that need a
|
|
12
|
+
* screen-space tolerance (an open polyline's hit width, a handle's grab
|
|
13
|
+
* radius) take a {@link ToScreen} projection and measure in its pixels, so they
|
|
14
|
+
* stay usable at any zoom. Point-in-ring and ring bounds come from
|
|
15
|
+
* `geometry/ring`.
|
|
16
|
+
*/
|
|
17
|
+
import { Polygon, Region } from '../models/region';
|
|
18
|
+
import { AnchorHandle } from '../models/bezier';
|
|
19
|
+
/** World → screen projection, e.g. image → element pixels. */
|
|
20
|
+
export type ToScreen = (x: number, y: number) => readonly [number, number];
|
|
21
|
+
/** The identity projection: path data stays in world coordinates. */
|
|
22
|
+
export declare const WORLD: ToScreen;
|
|
23
|
+
/** An axis-aligned box (inclusive corners). */
|
|
24
|
+
export interface BBox {
|
|
25
|
+
x0: number;
|
|
26
|
+
y0: number;
|
|
27
|
+
x1: number;
|
|
28
|
+
y1: number;
|
|
29
|
+
}
|
|
30
|
+
/** Screen-px distance from an open polyline within which a point is on it. */
|
|
31
|
+
export declare const OPEN_PATH_TOL_PX = 6;
|
|
32
|
+
type AnyBounds = Region['bounds'] | Record<string, unknown>;
|
|
33
|
+
/**
|
|
34
|
+
* Discriminate a region's bounds. Class instances first; plain objects with the
|
|
35
|
+
* right fields too, so a region that skipped the store's hydration (JSON from a
|
|
36
|
+
* host) still draws and hit-tests (jit-ui#124).
|
|
37
|
+
*/
|
|
38
|
+
export declare function boundsKind(b: AnyBounds | null | undefined): 'rect' | 'poly' | 'multi' | null;
|
|
39
|
+
/** A polygon's ring as parallel arrays: the exterior for `ring` -1, else hole `ring`. */
|
|
40
|
+
export declare function ringOf(p: Polygon, ring: number): {
|
|
41
|
+
xs: number[];
|
|
42
|
+
ys: number[];
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* A polygon ring's bézier handles (absolute, world space): the stored offsets
|
|
46
|
+
* when present, else the Catmull-Rom default the curve is drawn with. Holes are
|
|
47
|
+
* always closed.
|
|
48
|
+
*/
|
|
49
|
+
export declare function ringHandles(p: Polygon, ring: number): AnchorHandle[];
|
|
50
|
+
/**
|
|
51
|
+
* A region's axis-aligned bounding box in world coordinates (every part of a
|
|
52
|
+
* multi-polygon), or null for empty geometry. Loops rather than
|
|
53
|
+
* `Math.min(...spread)`, which throws on a large imported annotation.
|
|
54
|
+
*/
|
|
55
|
+
export declare function regionBBox(region: Pick<Region, 'bounds'>): BBox | null;
|
|
56
|
+
/** Shortest distance from (px,py) to the segment (ax,ay)–(bx,by), in the units given. */
|
|
57
|
+
export declare function segmentDistance(px: number, py: number, ax: number, ay: number, bx: number, by: number): number;
|
|
58
|
+
/** Options for {@link regionContains}. */
|
|
59
|
+
export interface ContainsOptions {
|
|
60
|
+
/** Projection the open-polyline tolerance is measured in. Default: world units. */
|
|
61
|
+
toScreen?: ToScreen;
|
|
62
|
+
/** Open-polyline hit width, in `toScreen` pixels. Default {@link OPEN_PATH_TOL_PX}. */
|
|
63
|
+
tolPx?: number;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Whether world point (x, y) lands on `region`: a rectangle by its (inclusive)
|
|
67
|
+
* box; a closed polygon by its exterior minus its holes; a multi-polygon by any
|
|
68
|
+
* part (minus that part's holes); an open polyline — which has no interior —
|
|
69
|
+
* within `tolPx` screen pixels of its line.
|
|
70
|
+
*/
|
|
71
|
+
export declare function regionContains(region: Pick<Region, 'bounds'>, x: number, y: number, opts?: ContainsOptions): boolean;
|
|
72
|
+
/** Index of the topmost (last) region containing (x, y), or -1. */
|
|
73
|
+
export declare function topmostRegionAt(regions: ReadonlyArray<Pick<Region, 'bounds'>>, x: number, y: number, opts?: ContainsOptions & {
|
|
74
|
+
skip?: (r: Pick<Region, 'bounds'>) => boolean;
|
|
75
|
+
}): number;
|
|
76
|
+
/**
|
|
77
|
+
* Indices of every region whose bounding box intersects the world box
|
|
78
|
+
* [x0,y0]–[x1,y1] (rubber-band selection). `skipProfiles` leaves out
|
|
79
|
+
* intensity-profile lines.
|
|
80
|
+
*/
|
|
81
|
+
export declare function regionsInRect(regions: ReadonlyArray<Region>, x0: number, y0: number, x1: number, y1: number, opts?: {
|
|
82
|
+
skipProfiles?: boolean;
|
|
83
|
+
}): number[];
|
|
84
|
+
/** The handle offsets a bézier ring is drawn with; absent arrays fall back to the default. */
|
|
85
|
+
export interface RingHandleOffsets {
|
|
86
|
+
in?: number[][];
|
|
87
|
+
out?: number[][];
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* SVG path `d` for one ring or polyline, projected through `toScreen`.
|
|
91
|
+
* Straight edges without `handles`; with `handles`, cubic segments through the
|
|
92
|
+
* stored offsets, or the Catmull-Rom default when they are missing or do not
|
|
93
|
+
* match the ring (via `resolveHandles`). Closed rings end in `Z`. '' for fewer
|
|
94
|
+
* than two vertices.
|
|
95
|
+
*/
|
|
96
|
+
export declare function ringPathD(xs: number[], ys: number[], closed: boolean, toScreen: ToScreen, handles?: RingHandleOffsets): string;
|
|
97
|
+
/**
|
|
98
|
+
* SVG path `d` for a whole region: a rectangle's four corners; a polygon's
|
|
99
|
+
* exterior (curved for a bézier region) followed by one subpath per hole
|
|
100
|
+
* (curved too for a bézier donut); a multi-polygon's parts with their holes.
|
|
101
|
+
* Holes need `fill-rule: evenodd` (see {@link regionHasHoles}).
|
|
102
|
+
*/
|
|
103
|
+
export declare function regionPathD(region: Pick<Region, 'bounds'>, toScreen?: ToScreen): string;
|
|
104
|
+
/** True when the region draws as several subpaths that need `fill-rule: evenodd`. */
|
|
105
|
+
export declare function regionHasHoles(region: Pick<Region, 'bounds'>): boolean;
|
|
106
|
+
/** What a pointer grabbed on the selected region (see {@link hitHandle}). */
|
|
107
|
+
export type HandleHit =
|
|
108
|
+
/** A rectangle corner; `anchor` is the opposite (fixed) corner for a resize. */
|
|
109
|
+
{
|
|
110
|
+
kind: 'corner';
|
|
111
|
+
index: number;
|
|
112
|
+
anchor: [number, number];
|
|
113
|
+
}
|
|
114
|
+
/** A polygon vertex: `ring` -1 for the exterior, else the hole index. */
|
|
115
|
+
| {
|
|
116
|
+
kind: 'vertex';
|
|
117
|
+
ring: number;
|
|
118
|
+
index: number;
|
|
119
|
+
}
|
|
120
|
+
/** A bézier control point of vertex `index` on `ring`. */
|
|
121
|
+
| {
|
|
122
|
+
kind: 'bezier';
|
|
123
|
+
ring: number;
|
|
124
|
+
index: number;
|
|
125
|
+
side: 'in' | 'out';
|
|
126
|
+
};
|
|
127
|
+
/**
|
|
128
|
+
* The handle of `region` under screen point (sx, sy) within `radius` screen
|
|
129
|
+
* pixels, or null. Rectangles have four corners. Polygons: every bézier
|
|
130
|
+
* control point first (exterior, then each hole; they sit off the anchors, so
|
|
131
|
+
* they must win), then the vertices (exterior, then each hole). Pass
|
|
132
|
+
* `{ bezier: false }` to test vertices only.
|
|
133
|
+
*/
|
|
134
|
+
export declare function hitHandle(region: Pick<Region, 'bounds'>, sx: number, sy: number, toScreen: ToScreen, radius: number, opts?: {
|
|
135
|
+
bezier?: boolean;
|
|
136
|
+
}): HandleHit | null;
|
|
137
|
+
/**
|
|
138
|
+
* The polygon edge nearest screen point (sx, sy), across the exterior and every
|
|
139
|
+
* hole: its ring (-1 = exterior), the index of its start vertex, and the
|
|
140
|
+
* distance in screen pixels. Null when the region is not a polygon.
|
|
141
|
+
*/
|
|
142
|
+
export declare function nearestEdge(region: Pick<Region, 'bounds'>, sx: number, sy: number, toScreen: ToScreen): {
|
|
143
|
+
ring: number;
|
|
144
|
+
segIndex: number;
|
|
145
|
+
dist: number;
|
|
146
|
+
} | null;
|
|
147
|
+
/**
|
|
148
|
+
* The polygon vertex nearest world point (x, y), across the exterior and every
|
|
149
|
+
* hole, with its distance in world units. Null when the region is not a
|
|
150
|
+
* polygon or has no vertices.
|
|
151
|
+
*/
|
|
152
|
+
export declare function nearestVertex(region: Pick<Region, 'bounds'>, x: number, y: number): {
|
|
153
|
+
ring: number;
|
|
154
|
+
index: number;
|
|
155
|
+
dist: number;
|
|
156
|
+
} | null;
|
|
157
|
+
export {};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Screen-space hit testing for a selected rectangle's move/resize zones, and the
|
|
3
|
+
* resize those zones drive. Pure; shared by the SVG region overlays. (Vertex,
|
|
4
|
+
* bezier-handle and edge hits on polygons live in `region-geometry.ts`:
|
|
5
|
+
* `hitHandle` and `nearestEdge`.)
|
|
6
|
+
*/
|
|
7
|
+
/** Move/resize zones on the selected rectangle. */
|
|
8
|
+
export type EditZone = 'move' | 'n' | 's' | 'e' | 'w' | 'ne' | 'nw' | 'se' | 'sw';
|
|
9
|
+
/** The cursor that advertises each zone. */
|
|
10
|
+
export declare const ZONE_CURSOR: Readonly<Record<EditZone, string>>;
|
|
11
|
+
/** Screen-pixel tolerance for grabbing an edge, corner or vertex handle. */
|
|
12
|
+
export declare const EDIT_TOL_PX = 8;
|
|
13
|
+
/** A screen-space box: left, top, right, bottom. */
|
|
14
|
+
export interface ScreenBox {
|
|
15
|
+
x0: number;
|
|
16
|
+
y0: number;
|
|
17
|
+
x1: number;
|
|
18
|
+
y1: number;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Classify a screen point against a screen-space rectangle: a corner, an edge
|
|
22
|
+
* (within `tolPx`), the body, or null when outside (beyond the tolerance).
|
|
23
|
+
*/
|
|
24
|
+
export declare function rectZone(px: number, py: number, box: ScreenBox, tolPx?: number): EditZone | null;
|
|
25
|
+
/** An image-space rectangle. */
|
|
26
|
+
export interface RectBox {
|
|
27
|
+
x: number;
|
|
28
|
+
y: number;
|
|
29
|
+
width: number;
|
|
30
|
+
height: number;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* The rectangle `orig` moved or resized through `zone` by the total drag
|
|
34
|
+
* (`dx`, `dy`), normalised (a drag past the opposite edge flips it) and rounded
|
|
35
|
+
* to whole pixels. Absolute from the gesture-start box, so applying it on every
|
|
36
|
+
* frame is idempotent.
|
|
37
|
+
*/
|
|
38
|
+
export declare function resizeRect(orig: RectBox, zone: EditZone, dx: number, dy: number): RectBox;
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* World-space SVG region renderer shared by the OpenSeadragon and napari
|
|
3
|
+
* overlays (review NAPARI-BOUNDARY-10, OSD-PLOTLY-11).
|
|
4
|
+
*
|
|
5
|
+
* The overlays used to delete and rebuild every region element on every camera
|
|
6
|
+
* frame, projecting every vertex to screen pixels (napari also read the layout
|
|
7
|
+
* once per vertex). Here region geometry is drawn ONCE, in world coordinates,
|
|
8
|
+
* inside a single `<g transform="matrix(a b c d e f)">`, with
|
|
9
|
+
* `vector-effect: non-scaling-stroke` so strokes keep their pixel width. A
|
|
10
|
+
* camera change rewrites that one attribute and re-positions the few
|
|
11
|
+
* screen-sized elements (labels, the selected region's handles, a draft) —
|
|
12
|
+
* nothing is created or removed. Region nodes are rebuilt only when the
|
|
13
|
+
* regions or the selection change ({@link render}).
|
|
14
|
+
*
|
|
15
|
+
* Layers, bottom to top, each attached only while it has content:
|
|
16
|
+
* 1. world — region shapes, in world coordinates (transformed group);
|
|
17
|
+
* 2. labels — screen-space text pinned to world anchors, rebuilt with the regions;
|
|
18
|
+
* 3. overlay — screen-space handles/drafts, rebuilt by the overlay on demand
|
|
19
|
+
* ({@link renderOverlay}).
|
|
20
|
+
*/
|
|
21
|
+
import { Region } from '../models/region';
|
|
22
|
+
/** An SVG affine `matrix(a b c d e f)`: x' = a·x + c·y + e, y' = b·x + d·y + f. */
|
|
23
|
+
export type Affine = readonly [number, number, number, number, number, number];
|
|
24
|
+
/** World → svg-local pixel projection. */
|
|
25
|
+
export type Project = (x: number, y: number) => [number, number];
|
|
26
|
+
export declare const IDENTITY_AFFINE: Affine;
|
|
27
|
+
/**
|
|
28
|
+
* The affine of a projection that is affine (pan/zoom/rotate/flip), read from
|
|
29
|
+
* where it sends (0,0), (1,0) and (0,1) — how the OSD overlay gets its matrix
|
|
30
|
+
* from the viewport transform without depending on viewer internals. (napari-js
|
|
31
|
+
* hands the napari overlay its matrix directly: `Viewer.canvasTransform()`.)
|
|
32
|
+
*/
|
|
33
|
+
export declare function affineFromProjection(project: (x: number, y: number) => readonly [number, number]): Affine;
|
|
34
|
+
/** Apply an affine to a point. */
|
|
35
|
+
export declare function applyAffine(m: Affine, x: number, y: number): [number, number];
|
|
36
|
+
/** How a placed screen element is (re)positioned for the current camera. */
|
|
37
|
+
export type Placement<T extends SVGElement> = (el: T, project: Project) => void;
|
|
38
|
+
/** Options for {@link SvgRegionRenderer}. */
|
|
39
|
+
export interface SvgRegionRendererOptions {
|
|
40
|
+
/** Draw a {@link Rectangle} as a `<rect>` or as a four-point `<polygon>`. Default polygon. */
|
|
41
|
+
rectElement?: 'rect' | 'polygon';
|
|
42
|
+
/** Stroke and fill for one region's shape element. */
|
|
43
|
+
styleShape(el: SVGElement, region: Region, selected: boolean): void;
|
|
44
|
+
/** Add a region's screen-space decorations (its label) — once per {@link render}. */
|
|
45
|
+
decorate?(region: Region, index: number, selected: boolean, layer: ScreenLayer): void;
|
|
46
|
+
/** Leave a region out entirely (it keeps its index). */
|
|
47
|
+
skip?(region: Region): boolean;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* A screen-space layer: elements positioned from world anchors through the
|
|
51
|
+
* current camera, re-positioned (not rebuilt) on every camera change.
|
|
52
|
+
*/
|
|
53
|
+
export declare class ScreenLayer {
|
|
54
|
+
readonly group: SVGGElement;
|
|
55
|
+
private readonly project;
|
|
56
|
+
private readonly placed;
|
|
57
|
+
constructor(group: SVGGElement, project: Project);
|
|
58
|
+
/** Append `el`, positioned by `place` now and after every camera change. */
|
|
59
|
+
place<T extends SVGElement>(el: T, place: Placement<T>): T;
|
|
60
|
+
/** Append `el` with attributes `x`/`y` (e.g. `'cx'`/`'cy'`) at a world point, offset in pixels. */
|
|
61
|
+
at<T extends SVGElement>(el: T, wx: number, wy: number, attrs?: {
|
|
62
|
+
x?: string;
|
|
63
|
+
y?: string;
|
|
64
|
+
dx?: number;
|
|
65
|
+
dy?: number;
|
|
66
|
+
}): T;
|
|
67
|
+
/** A `<line>` between two world points. */
|
|
68
|
+
line(ax: number, ay: number, bx: number, by: number): SVGLineElement;
|
|
69
|
+
/** A `<polygon>` / `<polyline>` through world points. */
|
|
70
|
+
poly(tag: 'polygon' | 'polyline', pts: ReadonlyArray<{
|
|
71
|
+
x: number;
|
|
72
|
+
y: number;
|
|
73
|
+
}>): SVGElement;
|
|
74
|
+
/** Re-position every element for the current camera. */
|
|
75
|
+
reproject(): void;
|
|
76
|
+
get isEmpty(): boolean;
|
|
77
|
+
clear(): void;
|
|
78
|
+
}
|
|
79
|
+
/** Create an SVG element. */
|
|
80
|
+
export declare function svgEl<K extends keyof SVGElementTagNameMap>(tag: K): SVGElementTagNameMap[K];
|
|
81
|
+
export declare class SvgRegionRenderer {
|
|
82
|
+
private readonly svg;
|
|
83
|
+
private readonly opts;
|
|
84
|
+
private camera;
|
|
85
|
+
private readonly world;
|
|
86
|
+
private readonly labels;
|
|
87
|
+
private readonly overlay;
|
|
88
|
+
/** World → svg-local pixels through the current camera. */
|
|
89
|
+
readonly project: Project;
|
|
90
|
+
constructor(svg: SVGSVGElement, opts: SvgRegionRendererOptions);
|
|
91
|
+
/** The current world → svg-local affine. */
|
|
92
|
+
get affine(): Affine;
|
|
93
|
+
/**
|
|
94
|
+
* Move the camera: rewrite the world group's transform and re-position the
|
|
95
|
+
* screen-space elements. No element is created or removed. Returns false
|
|
96
|
+
* (and touches nothing) when the affine did not change.
|
|
97
|
+
*/
|
|
98
|
+
setCamera(affine: Affine): boolean;
|
|
99
|
+
/** Rebuild the region shapes (world space) and their decorations. */
|
|
100
|
+
render(regions: ReadonlyArray<Region>, selected: ReadonlyArray<number>): void;
|
|
101
|
+
/** Rebuild the overlay layer (the selected region's handles, drafts). */
|
|
102
|
+
renderOverlay(build: (layer: ScreenLayer) => void): void;
|
|
103
|
+
/** Remove every layer from the svg. */
|
|
104
|
+
destroy(): void;
|
|
105
|
+
private applyCamera;
|
|
106
|
+
/** Attach the layers that have content (in order) and detach the empty ones. */
|
|
107
|
+
private sync;
|
|
108
|
+
/** The world-space element for a region's geometry, or null when it has none. */
|
|
109
|
+
private shapeOf;
|
|
110
|
+
}
|
|
@@ -16,7 +16,8 @@ import { IImageInfo } from './contracts/image.contract';
|
|
|
16
16
|
export interface TwoPassRenderHost {
|
|
17
17
|
/** Load + plot one phase (the component owns div/screen/plot-type/z and the
|
|
18
18
|
* newer-click filename guard). `inPlace` updates the existing render so the
|
|
19
|
-
* canvas doesn't blank during the small→large swap.
|
|
19
|
+
* canvas doesn't blank during the small→large swap. Rejects when the phase
|
|
20
|
+
* could not be drawn (including a backend's `plot()` resolving false). */
|
|
20
21
|
renderPhase(info: IImageInfo, inPlace: boolean): Promise<unknown>;
|
|
21
22
|
/** The small tier is on screen — drop the full loading overlay so the user
|
|
22
23
|
* sees the blurry preview, and show the sharpening spinner. */
|
|
@@ -26,10 +27,13 @@ export interface TwoPassRenderHost {
|
|
|
26
27
|
/** Rendering finished. `viaSmall` = the overlay was already released by the
|
|
27
28
|
* small tier (so only release the running guard + apply the ROI); otherwise
|
|
28
29
|
* do the full finalize (overlay + running + ROI). */
|
|
29
|
-
finished(viaSmall: boolean
|
|
30
|
+
finished(viaSmall: boolean): void;
|
|
30
31
|
/** Both large-tier attempts failed; the small tier stays on screen as the
|
|
31
32
|
* fallback. Surface it to the user and release the running guard + ROI. */
|
|
32
33
|
sharpenFailed(err: unknown): void;
|
|
34
|
+
/** Nothing could be drawn: the single pass failed, or both tiers did. Called
|
|
35
|
+
* after {@link finished} (which releases the overlay), to tell the user. */
|
|
36
|
+
renderFailed(err: unknown): void;
|
|
33
37
|
}
|
|
34
38
|
export declare class RenderOrchestrator {
|
|
35
39
|
private host;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { IImageInfo } from './contracts/image.contract';
|
|
2
|
+
import { PlotType } from './contracts/plot-type';
|
|
3
|
+
import { SpatialDataset } from './contracts/spatial-dataset.contract';
|
|
4
|
+
import { IVisualizer } from './contracts/visualizer.contract';
|
|
5
|
+
/** A user-facing message for a failure: an HttpErrorResponse's server message, an
|
|
6
|
+
* Error's message, or the status text, else the value itself. */
|
|
7
|
+
export declare function errorMessage(err: unknown): string;
|
|
8
|
+
/** The viewer a render session draws into, and what it tells the viewer. */
|
|
9
|
+
export interface RenderSessionHost {
|
|
10
|
+
readonly plotDivName: string;
|
|
11
|
+
readonly visualizer: IVisualizer;
|
|
12
|
+
/** The slice to load, read when each phase starts. */
|
|
13
|
+
zIndex(): number;
|
|
14
|
+
plotType(): PlotType;
|
|
15
|
+
/** A 2D view: only it renders the small tier first (the in-place sharpen pass does
|
|
16
|
+
* not rebuild a 3D scene, so it blanked one). */
|
|
17
|
+
isHeatmap(): boolean;
|
|
18
|
+
/** A server-side cache fill is in progress (keeps the full overlay up). */
|
|
19
|
+
isCaching(): boolean;
|
|
20
|
+
/** The view is about to be torn down: end what was bound to it (contributed sessions). */
|
|
21
|
+
beforeReset(): void;
|
|
22
|
+
/** Lay the new image out (stack flag, slice bounds, initial slice) once the old view is gone. */
|
|
23
|
+
prepare(info: IImageInfo): void;
|
|
24
|
+
/** Drop the loading overlay the render owns (once per render). */
|
|
25
|
+
releaseOverlay(info: IImageInfo): void;
|
|
26
|
+
/** The render landed, sharp or as a fallback: apply ROIs, start sessions. */
|
|
27
|
+
landed(info: IImageInfo): void;
|
|
28
|
+
setImageLoading(loading: boolean): void;
|
|
29
|
+
alert(severity: 'warn' | 'error', summary: string, detail: string): void;
|
|
30
|
+
detectChanges(): void;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* The viewer's render pipeline: one image (or image-less dataset) at a time, the newest
|
|
34
|
+
* always winning.
|
|
35
|
+
*
|
|
36
|
+
* Every render takes a task from a {@link Supersede}: a newer render, a Cancel or
|
|
37
|
+
* teardown makes the older one stale — its callbacks return early instead of painting,
|
|
38
|
+
* releasing the newer render's overlay or applying its ROIs — and aborts the signal its
|
|
39
|
+
* loads were given, so superseded network work stops at the source. Sequencing of the
|
|
40
|
+
* small→large tiers lives in {@link RenderOrchestrator}; this owns the UI flags it
|
|
41
|
+
* drives ({@link running}, {@link sharpening}).
|
|
42
|
+
*/
|
|
43
|
+
export declare class ImageRenderSession {
|
|
44
|
+
private readonly host;
|
|
45
|
+
/** A render is in flight. */
|
|
46
|
+
running: boolean;
|
|
47
|
+
/** The small tier is on screen and the large one is still loading. */
|
|
48
|
+
sharpening: boolean;
|
|
49
|
+
/** Set once the plot div exists; an image-less draw before then waits for it. */
|
|
50
|
+
private viewReady;
|
|
51
|
+
private pendingDraw;
|
|
52
|
+
private readonly supersede;
|
|
53
|
+
constructor(host: RenderSessionHost);
|
|
54
|
+
/**
|
|
55
|
+
* Render `info` (which has urls), preempting whatever is in flight. A newer image
|
|
56
|
+
* ALWAYS preempts: dropping it while the old one finished reported image B as loaded
|
|
57
|
+
* while image A stayed on screen, and a cold image held the slot for its whole
|
|
58
|
+
* server-side cache fill.
|
|
59
|
+
*/
|
|
60
|
+
render(info: IImageInfo): void;
|
|
61
|
+
/**
|
|
62
|
+
* Draw a spatial mode with no image behind it: the observations alone, framed on their
|
|
63
|
+
* own extent. The image info is a placeholder naming the dataset, so regions drawn here
|
|
64
|
+
* are kept per dataset like any image's. Supersedes (and is superseded by) image renders.
|
|
65
|
+
*/
|
|
66
|
+
plotWithoutImage(dataset: SpatialDataset): Promise<void>;
|
|
67
|
+
/**
|
|
68
|
+
* The plot div exists now: run an image-less draw that arrived before it did — only if
|
|
69
|
+
* its dataset is still the one on offer (by id: the port may re-emit the same dataset
|
|
70
|
+
* as a new object, and the current object is the one to draw) and no image has arrived.
|
|
71
|
+
*/
|
|
72
|
+
viewIsReady(current: SpatialDataset | null, hasImage: boolean): void;
|
|
73
|
+
/** Cancel the render in flight: abort its loads and make its callbacks inert. */
|
|
74
|
+
cancel(): void;
|
|
75
|
+
}
|