@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,77 @@
|
|
|
1
|
+
import { Observable } from 'rxjs';
|
|
2
|
+
import { Region } from '../models/region';
|
|
3
|
+
import { IRegionEditorApi } from '../contracts/region-editor-api.contract';
|
|
4
|
+
import { RegionIoPort } from '../contracts/ports/region-io.port';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
/** One slice-file's serialized regions (folder stack, jit-ui#93). */
|
|
7
|
+
export interface SliceGeoJson {
|
|
8
|
+
z: number;
|
|
9
|
+
geoJsonStr: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Region file I/O for the Region Editor: default file names, GeoJSON download
|
|
13
|
+
* (export), save to the host through {@link RegionIoPort} (with a debounced
|
|
14
|
+
* "file exists" check), per-slice saves for folder stacks, and reading an
|
|
15
|
+
* imported file. Provided by the editor; it holds no state — the editor owns
|
|
16
|
+
* the dialogs, the toasts and the running jobs.
|
|
17
|
+
*/
|
|
18
|
+
export declare class RegionPersistenceService {
|
|
19
|
+
private readonly api;
|
|
20
|
+
private readonly io;
|
|
21
|
+
constructor(api: IRegionEditorApi, io: RegionIoPort);
|
|
22
|
+
/** The selected image's file name, if any. */
|
|
23
|
+
selectedFileName(): string | undefined;
|
|
24
|
+
/** `<image-stem>.geojson` for a server save; undefined with no image selected. */
|
|
25
|
+
defaultSaveName(): string | undefined;
|
|
26
|
+
/** `<image-stem>.geojson` (or `rois.geojson`) for a download. */
|
|
27
|
+
defaultExportName(): string;
|
|
28
|
+
/** `<image-stem>_mask.png` (or `regions_mask.png`) for a mask download. */
|
|
29
|
+
defaultMaskName(): string;
|
|
30
|
+
/** True when a save writes one geojson per slice-file (folder stack, jit-ui#93). */
|
|
31
|
+
savesPerSlice(): boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Regions to serialize on save/export. For a single-file z-stack the store
|
|
34
|
+
* keeps only the current slice live, so take EVERY slice's annotations (each
|
|
35
|
+
* tagged with its zero-based Region.z) for one combined z-indexed geojson
|
|
36
|
+
* (jit-ui#93); otherwise `live` (single plane, or a folder stack whose slices
|
|
37
|
+
* save to their own files).
|
|
38
|
+
*/
|
|
39
|
+
regionsForSave(live: Region[]): Region[];
|
|
40
|
+
/**
|
|
41
|
+
* Whether each file name in `names` already exists on the host, debounced
|
|
42
|
+
* 400 ms; a newer name supersedes an in-flight check. A failed check reads as
|
|
43
|
+
* "does not exist" and later checks keep working.
|
|
44
|
+
*/
|
|
45
|
+
fileExists(names: Observable<string>): Observable<boolean>;
|
|
46
|
+
/**
|
|
47
|
+
* `regions` as GeoJSON, merged with the image's region source when it has one (the source's
|
|
48
|
+
* features that were not taken or deleted, then `regions`); `slice` names a folder stack's
|
|
49
|
+
* slice.
|
|
50
|
+
*/
|
|
51
|
+
serialize(regions: Region[], slice?: number): Promise<string>;
|
|
52
|
+
/** Download `regions` (with the region source behind them) as a GeoJSON file named `filename`. */
|
|
53
|
+
download(regions: Region[], filename: string): Promise<void>;
|
|
54
|
+
/**
|
|
55
|
+
* Save `regions()` to the host as `filename`. Serializing is deferred one
|
|
56
|
+
* tick (so a progress indicator paints before a large synchronous
|
|
57
|
+
* serialize); unsubscribing before then cancels the save entirely, and after
|
|
58
|
+
* it cancels the upload. A serialize failure is an error, like an upload one.
|
|
59
|
+
*/
|
|
60
|
+
save(regions: () => Region[], filename: string): Observable<void>;
|
|
61
|
+
/**
|
|
62
|
+
* A folder stack's regions as one geojson per slice-file (jit-ui#93), each
|
|
63
|
+
* serialized on the default plane (z=0): every slice-file is one plane, and
|
|
64
|
+
* the loader re-derives the slice index from the file's position. Slices
|
|
65
|
+
* cleared since load are included (empty) so their file is overwritten, and so are slices
|
|
66
|
+
* whose region source lost features; a slice with a region source keeps the features still
|
|
67
|
+
* in it.
|
|
68
|
+
*/
|
|
69
|
+
sliceGeoJsons(): Promise<SliceGeoJson[]>;
|
|
70
|
+
/** Write per-slice geojsons through the host port. */
|
|
71
|
+
saveSlices(slices: SliceGeoJson[]): Observable<void>;
|
|
72
|
+
/** Read the file chosen in a file input's change event as text, then call
|
|
73
|
+
* `onText`. No-op when no file was chosen. */
|
|
74
|
+
readChosenFile(event: Event, onText: (text: string) => void): void;
|
|
75
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<RegionPersistenceService, never>;
|
|
76
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<RegionPersistenceService>;
|
|
77
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
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
|
+
/**
|
|
44
|
+
* In a volume view, each class's volume over the whole stack (px² × slices; null while it is
|
|
45
|
+
* computed): the column shows the row's class volume instead of its area. Null: areas.
|
|
46
|
+
*/
|
|
47
|
+
volumes: ReadonlyMap<string, number | null> | null;
|
|
48
|
+
/** Rows whose label is being edited → the typed draft. A new map per start/stop. */
|
|
49
|
+
labelDrafts: Map<Region, string>;
|
|
50
|
+
/** A row's pencil: start editing its label. */
|
|
51
|
+
labelEditStart: EventEmitter<Region>;
|
|
52
|
+
/** The inline label editor's text changed. */
|
|
53
|
+
labelDraftChange: EventEmitter<{
|
|
54
|
+
region: Region;
|
|
55
|
+
value: string;
|
|
56
|
+
}>;
|
|
57
|
+
/** The inline label editor closed: Enter commits, Escape / close cancels. */
|
|
58
|
+
labelEditStop: EventEmitter<{
|
|
59
|
+
region: Region;
|
|
60
|
+
commit: boolean;
|
|
61
|
+
}>;
|
|
62
|
+
/** A class was picked in a row's dropdown. */
|
|
63
|
+
classPick: EventEmitter<{
|
|
64
|
+
region: Region;
|
|
65
|
+
name: string;
|
|
66
|
+
}>;
|
|
67
|
+
/** A row's trash button: the row's index across all pages. */
|
|
68
|
+
deleteRow: EventEmitter<number>;
|
|
69
|
+
/** The paginator moved or changed its page size. */
|
|
70
|
+
pageChange: EventEmitter<RegionPage>;
|
|
71
|
+
/** Per row of {@link page}: its class swatch colour and formatted area (or class volume),
|
|
72
|
+
* derived when an input changes instead of per check (the area walks the region's geometry). */
|
|
73
|
+
protected rowView: Map<Region, {
|
|
74
|
+
color: string;
|
|
75
|
+
measure: string;
|
|
76
|
+
}>;
|
|
77
|
+
ngOnChanges(): void;
|
|
78
|
+
private measure;
|
|
79
|
+
private classColor;
|
|
80
|
+
private area;
|
|
81
|
+
protected startEdit(region: Region, event: Event): void;
|
|
82
|
+
protected stopEdit(region: Region, commit: boolean, event: Event): void;
|
|
83
|
+
protected onPage(event: {
|
|
84
|
+
first?: number;
|
|
85
|
+
rows?: number;
|
|
86
|
+
}): void;
|
|
87
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<RegionTableComponent, never>;
|
|
88
|
+
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; }; "volumes": { "alias": "volumes"; "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>;
|
|
89
|
+
}
|
|
@@ -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,158 @@
|
|
|
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<R extends Pick<Region, 'bounds'>>(regions: ReadonlyArray<R>, x: number, y: number, opts?: ContainsOptions & {
|
|
74
|
+
skip?: (r: R) => 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, `skip` any other region.
|
|
80
|
+
*/
|
|
81
|
+
export declare function regionsInRect(regions: ReadonlyArray<Region>, x0: number, y0: number, x1: number, y1: number, opts?: {
|
|
82
|
+
skipProfiles?: boolean;
|
|
83
|
+
skip?: (r: Region) => boolean;
|
|
84
|
+
}): number[];
|
|
85
|
+
/** The handle offsets a bézier ring is drawn with; absent arrays fall back to the default. */
|
|
86
|
+
export interface RingHandleOffsets {
|
|
87
|
+
in?: number[][];
|
|
88
|
+
out?: number[][];
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* SVG path `d` for one ring or polyline, projected through `toScreen`.
|
|
92
|
+
* Straight edges without `handles`; with `handles`, cubic segments through the
|
|
93
|
+
* stored offsets, or the Catmull-Rom default when they are missing or do not
|
|
94
|
+
* match the ring (via `resolveHandles`). Closed rings end in `Z`. '' for fewer
|
|
95
|
+
* than two vertices.
|
|
96
|
+
*/
|
|
97
|
+
export declare function ringPathD(xs: number[], ys: number[], closed: boolean, toScreen: ToScreen, handles?: RingHandleOffsets): string;
|
|
98
|
+
/**
|
|
99
|
+
* SVG path `d` for a whole region: a rectangle's four corners; a polygon's
|
|
100
|
+
* exterior (curved for a bézier region) followed by one subpath per hole
|
|
101
|
+
* (curved too for a bézier donut); a multi-polygon's parts with their holes.
|
|
102
|
+
* Holes need `fill-rule: evenodd` (see {@link regionHasHoles}).
|
|
103
|
+
*/
|
|
104
|
+
export declare function regionPathD(region: Pick<Region, 'bounds'>, toScreen?: ToScreen): string;
|
|
105
|
+
/** True when the region draws as several subpaths that need `fill-rule: evenodd`. */
|
|
106
|
+
export declare function regionHasHoles(region: Pick<Region, 'bounds'>): boolean;
|
|
107
|
+
/** What a pointer grabbed on the selected region (see {@link hitHandle}). */
|
|
108
|
+
export type HandleHit =
|
|
109
|
+
/** A rectangle corner; `anchor` is the opposite (fixed) corner for a resize. */
|
|
110
|
+
{
|
|
111
|
+
kind: 'corner';
|
|
112
|
+
index: number;
|
|
113
|
+
anchor: [number, number];
|
|
114
|
+
}
|
|
115
|
+
/** A polygon vertex: `ring` -1 for the exterior, else the hole index. */
|
|
116
|
+
| {
|
|
117
|
+
kind: 'vertex';
|
|
118
|
+
ring: number;
|
|
119
|
+
index: number;
|
|
120
|
+
}
|
|
121
|
+
/** A bézier control point of vertex `index` on `ring`. */
|
|
122
|
+
| {
|
|
123
|
+
kind: 'bezier';
|
|
124
|
+
ring: number;
|
|
125
|
+
index: number;
|
|
126
|
+
side: 'in' | 'out';
|
|
127
|
+
};
|
|
128
|
+
/**
|
|
129
|
+
* The handle of `region` under screen point (sx, sy) within `radius` screen
|
|
130
|
+
* pixels, or null. Rectangles have four corners. Polygons: every bézier
|
|
131
|
+
* control point first (exterior, then each hole; they sit off the anchors, so
|
|
132
|
+
* they must win), then the vertices (exterior, then each hole). Pass
|
|
133
|
+
* `{ bezier: false }` to test vertices only.
|
|
134
|
+
*/
|
|
135
|
+
export declare function hitHandle(region: Pick<Region, 'bounds'>, sx: number, sy: number, toScreen: ToScreen, radius: number, opts?: {
|
|
136
|
+
bezier?: boolean;
|
|
137
|
+
}): HandleHit | null;
|
|
138
|
+
/**
|
|
139
|
+
* The polygon edge nearest screen point (sx, sy), across the exterior and every
|
|
140
|
+
* hole: its ring (-1 = exterior), the index of its start vertex, and the
|
|
141
|
+
* distance in screen pixels. Null when the region is not a polygon.
|
|
142
|
+
*/
|
|
143
|
+
export declare function nearestEdge(region: Pick<Region, 'bounds'>, sx: number, sy: number, toScreen: ToScreen): {
|
|
144
|
+
ring: number;
|
|
145
|
+
segIndex: number;
|
|
146
|
+
dist: number;
|
|
147
|
+
} | null;
|
|
148
|
+
/**
|
|
149
|
+
* The polygon vertex nearest world point (x, y), across the exterior and every
|
|
150
|
+
* hole, with its distance in world units. Null when the region is not a
|
|
151
|
+
* polygon or has no vertices.
|
|
152
|
+
*/
|
|
153
|
+
export declare function nearestVertex(region: Pick<Region, 'bounds'>, x: number, y: number): {
|
|
154
|
+
ring: number;
|
|
155
|
+
index: number;
|
|
156
|
+
dist: number;
|
|
157
|
+
} | null;
|
|
158
|
+
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,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Draws a region source (see `region-source`) under the editable regions, at the level of detail
|
|
3
|
+
* the zoom calls for, from the tiles in view only — the way the spatial views draw cell outlines.
|
|
4
|
+
* Shared by the OpenSeadragon and napari overlays: both hand it their svg and their world → svg
|
|
5
|
+
* camera affine, as they do their {@link SvgRegionRenderer}.
|
|
6
|
+
*
|
|
7
|
+
* One `<path>` per colour (every ring of every feature of that colour, even-odd), in world
|
|
8
|
+
* coordinates inside one transformed group, so a camera move rewrites one attribute. The tiles in
|
|
9
|
+
* view are re-planned once the camera settles; while a finer tile loads its coarser parent is
|
|
10
|
+
* drawn instead, so zooming in sharpens the outlines rather than blanking them. Features taken
|
|
11
|
+
* into the working set (selected, edited) or deleted are not drawn: the region renderer draws the
|
|
12
|
+
* taken ones as ordinary regions.
|
|
13
|
+
*
|
|
14
|
+
* It also answers what is under a point, from the features drawn, for the overlays' selection.
|
|
15
|
+
*/
|
|
16
|
+
import type { Observable } from 'rxjs';
|
|
17
|
+
import { RegionSourceView } from '../region-source/region-source';
|
|
18
|
+
import { TileFeature } from '../region-source/region-tiles';
|
|
19
|
+
import { Affine } from './svg-region-renderer';
|
|
20
|
+
/** Wait this long after the last camera change before planning tiles (ms). */
|
|
21
|
+
export declare const SOURCE_REPLAN_MS = 90;
|
|
22
|
+
/** The view is padded by this fraction on each side, so a short pan finds its tiles loaded. */
|
|
23
|
+
export declare const SOURCE_VIEW_MARGIN = 0.25;
|
|
24
|
+
/** At most this many tiles in view. */
|
|
25
|
+
export declare const SOURCE_MAX_TILES = 256;
|
|
26
|
+
/** A rubber band takes at most this many source features into the working set. */
|
|
27
|
+
export declare const SOURCE_MARQUEE_LIMIT = 2000;
|
|
28
|
+
/** The svg size (local px), for the part of the world in view. */
|
|
29
|
+
export type SvgSize = () => {
|
|
30
|
+
width: number;
|
|
31
|
+
height: number;
|
|
32
|
+
};
|
|
33
|
+
export declare class RegionSourceLayer {
|
|
34
|
+
private readonly svg;
|
|
35
|
+
private readonly size;
|
|
36
|
+
private readonly group;
|
|
37
|
+
private camera;
|
|
38
|
+
/** Class labels inside the features, in screen space over the outlines. */
|
|
39
|
+
private readonly labelLayer;
|
|
40
|
+
/** Class name → depth in the source's class hierarchy (parents draw under their children). */
|
|
41
|
+
private depthOf;
|
|
42
|
+
/** Class name → its parent class in the source's class hierarchy. */
|
|
43
|
+
private parentOf;
|
|
44
|
+
private view;
|
|
45
|
+
private visible;
|
|
46
|
+
private readonly sub;
|
|
47
|
+
/** Loaded tiles of the current source and plane, by id, least recently used first. */
|
|
48
|
+
private readonly tiles;
|
|
49
|
+
/** The tiles the view wants now. */
|
|
50
|
+
private wanted;
|
|
51
|
+
/** The features drawn, by id (each at the finest level loaded). */
|
|
52
|
+
private drawn;
|
|
53
|
+
private loading;
|
|
54
|
+
private replanTimer;
|
|
55
|
+
private drawFrame;
|
|
56
|
+
constructor(svg: SVGSVGElement, view$: Observable<RegionSourceView | null>, size?: SvgSize);
|
|
57
|
+
/** Follow the camera: rewrite the transform now, re-plan the tiles once it settles. */
|
|
58
|
+
setCamera(affine: Affine): void;
|
|
59
|
+
/** Show or hide the source with the regions. */
|
|
60
|
+
setVisible(visible: boolean): void;
|
|
61
|
+
/**
|
|
62
|
+
* The source feature under world point (x, y) — inside an area, or within `tolerancePx`
|
|
63
|
+
* screen pixels of a polyline — from the features drawn; the innermost of nested ones.
|
|
64
|
+
*/
|
|
65
|
+
featureAt(x: number, y: number, tolerancePx?: number): TileFeature | null;
|
|
66
|
+
/** The drawn source features whose box meets the world box (the rubber band's rule). */
|
|
67
|
+
featuresInRect(x0: number, y0: number, x1: number, y1: number): TileFeature[];
|
|
68
|
+
destroy(): void;
|
|
69
|
+
private setView;
|
|
70
|
+
/** The layer is the svg's first child (under the regions) while it shows a source. */
|
|
71
|
+
private attach;
|
|
72
|
+
private applyCamera;
|
|
73
|
+
/** Screen px per world unit. */
|
|
74
|
+
private scale;
|
|
75
|
+
/** The world box in view, padded by the margin; null when the svg has no size yet. */
|
|
76
|
+
private viewRect;
|
|
77
|
+
/** Work out the tiles the view needs, draw what is loaded, and load the rest. */
|
|
78
|
+
private replan;
|
|
79
|
+
private keep;
|
|
80
|
+
private scheduleDraw;
|
|
81
|
+
/**
|
|
82
|
+
* Rebuild the paths from the wanted tiles that are loaded, a missing tile's nearest loaded
|
|
83
|
+
* ancestor standing in for it; each feature once, at the finest level loaded.
|
|
84
|
+
*/
|
|
85
|
+
private draw;
|
|
86
|
+
/**
|
|
87
|
+
* The drawn features as paths: one per colour when outlined; filled, in paint order — parents
|
|
88
|
+
* (by the class hierarchy) and then larger features first, so what lies inside paints over
|
|
89
|
+
* them — one path per run of a colour.
|
|
90
|
+
*/
|
|
91
|
+
private runs;
|
|
92
|
+
/** Class labels inside the drawn features (each part where it fits), when labels are on. */
|
|
93
|
+
private drawLabels;
|
|
94
|
+
/** The loaded tile for `key`, else its nearest loaded coarser ancestor. */
|
|
95
|
+
private loadedOrAncestor;
|
|
96
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How regions are drawn, shared by the OpenSeadragon and napari overlays and the region-source
|
|
3
|
+
* layer, so a feature looks the same before and after it is taken into the regions.
|
|
4
|
+
*
|
|
5
|
+
* Two looks: **outlines** (the default — each region stroked in its colour, filled only while
|
|
6
|
+
* selected) and **filled**, an atlas's look (each region filled in its colour, with thin outlines,
|
|
7
|
+
* the selection in a highlight colour, labels centred inside each part).
|
|
8
|
+
*/
|
|
9
|
+
import { Region } from '../models/region';
|
|
10
|
+
import type { Project, ScreenLayer } from './svg-region-renderer';
|
|
11
|
+
/** The region look (see the module doc). */
|
|
12
|
+
export interface RegionStyle {
|
|
13
|
+
/** Fill each region at this opacity; 0 draws outlines only. */
|
|
14
|
+
fillOpacity: number;
|
|
15
|
+
/** Outline colour of a filled region; null: its own colour. */
|
|
16
|
+
stroke: string | null;
|
|
17
|
+
/** Outline width of a filled region, screen px; null: 1. */
|
|
18
|
+
strokeWidth: number | null;
|
|
19
|
+
/** Fill colour of a selected filled region; null: {@link DEFAULT_HIGHLIGHT}. */
|
|
20
|
+
highlight: string | null;
|
|
21
|
+
}
|
|
22
|
+
export declare const DEFAULT_REGION_STYLE: RegionStyle;
|
|
23
|
+
/** A selected region's fill in the filled look, unless the style names one (the Allen atlas's). */
|
|
24
|
+
export declare const DEFAULT_HIGHLIGHT = "#a020f0";
|
|
25
|
+
/** Whether `style` is the filled look. */
|
|
26
|
+
export declare function isFilled(style: RegionStyle): boolean;
|
|
27
|
+
/** The paint of one region shape. */
|
|
28
|
+
export interface ShapePaint {
|
|
29
|
+
fill: string;
|
|
30
|
+
fillOpacity: number;
|
|
31
|
+
stroke: string;
|
|
32
|
+
strokeWidth: number;
|
|
33
|
+
}
|
|
34
|
+
/** The paint of a region of colour `color`, selected or not, in `style`. */
|
|
35
|
+
export declare function shapePaint(color: string, selected: boolean, style?: RegionStyle): ShapePaint;
|
|
36
|
+
/** Set `paint` on an SVG shape. */
|
|
37
|
+
export declare function applyPaint(el: SVGElement, paint: ShapePaint): void;
|
|
38
|
+
/** A point to label a part at, and the room around it (image px). */
|
|
39
|
+
export interface LabelSpot {
|
|
40
|
+
x: number;
|
|
41
|
+
y: number;
|
|
42
|
+
room: number;
|
|
43
|
+
}
|
|
44
|
+
/** Where to label `region`: each part's pole of inaccessibility (a rectangle's centre). */
|
|
45
|
+
export declare function regionLabelSpots(region: Region): LabelSpot[];
|
|
46
|
+
/**
|
|
47
|
+
* A class label centred at `spot`, shown only while it fits: the room around the spot, on screen,
|
|
48
|
+
* at least half the text's width (and a few pixels). Re-checked on every camera move.
|
|
49
|
+
*/
|
|
50
|
+
export declare function placeInsideLabel(layer: ScreenLayer, text: string, spot: LabelSpot, color?: string): SVGTextElement;
|
|
51
|
+
/** Whether a label `halfWidth` px wide fits around `spot` through `project`. */
|
|
52
|
+
export declare function labelFits(project: Project, spot: LabelSpot, halfWidth: number): boolean;
|