@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.
Files changed (525) hide show
  1. package/README.md +201 -460
  2. package/esm2022/index.mjs +28 -15
  3. package/esm2022/lib/channel-histogram/channel-histogram.component.mjs +163 -91
  4. package/esm2022/lib/contracts/capabilities.contract.mjs +4 -3
  5. package/esm2022/lib/contracts/cell-segmenter.contract.mjs +1 -1
  6. package/esm2022/lib/contracts/channel-histogram-api.contract.mjs +5 -1
  7. package/esm2022/lib/contracts/color.mjs +60 -0
  8. package/esm2022/lib/contracts/colormap-lut.mjs +213 -57
  9. package/esm2022/lib/contracts/coordinate-transform.contract.mjs +1 -1
  10. package/esm2022/lib/contracts/display-types.mjs +11 -1
  11. package/esm2022/lib/contracts/instance-segmenter.contract.mjs +1 -1
  12. package/esm2022/lib/contracts/intensity.mjs +48 -5
  13. package/esm2022/lib/contracts/plot-type-contribution.contract.mjs +1 -1
  14. package/esm2022/lib/contracts/plot-type.mjs +134 -17
  15. package/esm2022/lib/contracts/ports/image-state.port.mjs +4 -1
  16. package/esm2022/lib/contracts/ports/preferences.port.mjs +5 -1
  17. package/esm2022/lib/contracts/ports/region-io.port.mjs +2 -1
  18. package/esm2022/lib/contracts/ports/spatial-data.port.mjs +5 -1
  19. package/esm2022/lib/contracts/ports/tile-access.port.mjs +2 -1
  20. package/esm2022/lib/contracts/region-editor-api.contract.mjs +1 -1
  21. package/esm2022/lib/contracts/region-overlay.contract.mjs +1 -1
  22. package/esm2022/lib/contracts/sam.contract.mjs +1 -1
  23. package/esm2022/lib/contracts/semantic-segmenter.contract.mjs +1 -1
  24. package/esm2022/lib/contracts/spatial-dataset.contract.mjs +3 -1
  25. package/esm2022/lib/contracts/toolbar-tool.contract.mjs +6 -4
  26. package/esm2022/lib/contracts/visualizer.contract.mjs +1 -1
  27. package/esm2022/lib/contracts/viz-config.mjs +2 -1
  28. package/esm2022/lib/geometry/contour.mjs +63 -0
  29. package/esm2022/lib/geometry/raster.mjs +98 -0
  30. package/esm2022/lib/geometry/ring.mjs +201 -0
  31. package/esm2022/lib/hex-color-picker/hex-color-picker.component.mjs +202 -102
  32. package/esm2022/lib/implementations/base-store-visualizer.mjs +201 -48
  33. package/esm2022/lib/implementations/napari-js/napari-axes-gizmo.mjs +65 -0
  34. package/esm2022/lib/implementations/napari-js/napari-display-state.mjs +136 -0
  35. package/esm2022/lib/implementations/napari-js/napari-helpers.mjs +199 -0
  36. package/esm2022/lib/implementations/napari-js/napari-image-2d-scene.mjs +602 -0
  37. package/esm2022/lib/implementations/napari-js/napari-loading-badge.mjs +3 -4
  38. package/esm2022/lib/implementations/napari-js/napari-loading-state.mjs +66 -0
  39. package/esm2022/lib/implementations/napari-js/napari-region-overlay.mjs +157 -591
  40. package/esm2022/lib/implementations/napari-js/napari-scene.mjs +2 -0
  41. package/esm2022/lib/implementations/napari-js/napari-spatial-2d-scene.mjs +614 -0
  42. package/esm2022/lib/implementations/napari-js/napari-spatial-3d-scene.mjs +769 -0
  43. package/esm2022/lib/implementations/napari-js/napari-spatial-encoding.mjs +199 -0
  44. package/esm2022/lib/implementations/napari-js/napari-spatial-hover.mjs +263 -0
  45. package/esm2022/lib/implementations/napari-js/napari-spatial-scene.mjs +159 -0
  46. package/esm2022/lib/implementations/napari-js/napari-spatial-tiles.mjs +106 -1408
  47. package/esm2022/lib/implementations/napari-js/napari-spatial-tooltip.mjs +2 -2
  48. package/esm2022/lib/implementations/napari-js/napari-surface-scene.mjs +271 -0
  49. package/esm2022/lib/implementations/napari-js/napari-tile-client.mjs +562 -0
  50. package/esm2022/lib/implementations/napari-js/napari-tool-bridge.mjs +344 -0
  51. package/esm2022/lib/implementations/napari-js/napari-visualizer.service.mjs +358 -4218
  52. package/esm2022/lib/implementations/napari-js/napari-volume-scene.mjs +439 -0
  53. package/esm2022/lib/implementations/napari-js/napari-volume-z-handle.mjs +6 -6
  54. package/esm2022/lib/implementations/napari-js/region-overlay/overlay-projection.mjs +96 -0
  55. package/esm2022/lib/implementations/napari-js/region-overlay/region-edit.mjs +35 -0
  56. package/esm2022/lib/implementations/napari-js/region-overlay/region-svg-renderer.mjs +182 -0
  57. package/esm2022/lib/implementations/napari-js/spatial-tiles/categorical-lookup.mjs +30 -0
  58. package/esm2022/lib/implementations/napari-js/spatial-tiles/cell-layers.mjs +274 -0
  59. package/esm2022/lib/implementations/napari-js/spatial-tiles/density-layer.mjs +144 -0
  60. package/esm2022/lib/implementations/napari-js/spatial-tiles/layer-groups.mjs +165 -0
  61. package/esm2022/lib/implementations/napari-js/spatial-tiles/plan-context.mjs +78 -0
  62. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-hover.mjs +182 -0
  63. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-jobs.mjs +369 -0
  64. package/esm2022/lib/implementations/napari-js/spatial-tiles/transcript-layers.mjs +306 -0
  65. package/esm2022/lib/implementations/osd/display-pipeline.mjs +102 -40
  66. package/esm2022/lib/implementations/osd/histogram-sampler.mjs +56 -31
  67. package/esm2022/lib/implementations/osd/openseadragon-viewer-options.mjs +128 -0
  68. package/esm2022/lib/implementations/osd/openseadragon-visualizer.service.mjs +333 -1685
  69. package/esm2022/lib/implementations/osd/osd-coordinate-transform.mjs +1 -1
  70. package/esm2022/lib/implementations/osd/osd-coords.mjs +5 -6
  71. package/esm2022/lib/implementations/osd/osd-export.mjs +122 -0
  72. package/esm2022/lib/implementations/osd/osd-lib.mjs +15 -1
  73. package/esm2022/lib/implementations/osd/osd-navigator-chrome.mjs +205 -0
  74. package/esm2022/lib/implementations/osd/osd-pixel-readback.mjs +68 -0
  75. package/esm2022/lib/implementations/osd/osd-region-overlay-draw.mjs +153 -0
  76. package/esm2022/lib/implementations/osd/osd-region-overlay.mjs +185 -718
  77. package/esm2022/lib/implementations/osd/osd-scale-bar.mjs +52 -60
  78. package/esm2022/lib/implementations/osd/osd-tile-source.mjs +105 -0
  79. package/esm2022/lib/implementations/osd/osd-viewer-like.mjs +2 -0
  80. package/esm2022/lib/implementations/osd/osd-viewer-mount.mjs +44 -0
  81. package/esm2022/lib/implementations/osd/osd-viewport.mjs +184 -0
  82. package/esm2022/lib/implementations/osd/osd-zoom.mjs +7 -1
  83. package/esm2022/lib/implementations/osd/simple-source.mjs +395 -0
  84. package/esm2022/lib/implementations/osd/slice-cache.mjs +53 -48
  85. package/esm2022/lib/implementations/osd/tile-client.mjs +32 -11
  86. package/esm2022/lib/implementations/osd/tile-recolor.mjs +330 -0
  87. package/esm2022/lib/implementations/plotly/omics-trace-builders.mjs +161 -73
  88. package/esm2022/lib/implementations/plotly/plotly-coordinate-transform.mjs +1 -1
  89. package/esm2022/lib/implementations/plotly/plotly-image-loader.mjs +112 -0
  90. package/esm2022/lib/implementations/plotly/plotly-image-recolor.mjs +178 -0
  91. package/esm2022/lib/implementations/plotly/plotly-intensity-inset.mjs +33 -0
  92. package/esm2022/lib/implementations/plotly/plotly-isosurface-controls.mjs +83 -0
  93. package/esm2022/lib/implementations/plotly/plotly-layouts.mjs +121 -0
  94. package/esm2022/lib/implementations/plotly/plotly-readback.mjs +117 -0
  95. package/esm2022/lib/implementations/plotly/plotly-region-overlay.mjs +19 -10
  96. package/esm2022/lib/implementations/plotly/plotly-shape-projection.mjs +223 -0
  97. package/esm2022/lib/implementations/plotly/plotly-trace-builders.mjs +79 -19
  98. package/esm2022/lib/implementations/plotly/plotly-zoom-controller.mjs +223 -0
  99. package/esm2022/lib/implementations/plotly/plotly.service.mjs +439 -1655
  100. package/esm2022/lib/implementations/region-centroids.mjs +47 -0
  101. package/esm2022/lib/implementations/simple-slice-access.service.mjs +22 -12
  102. package/esm2022/lib/implementations/spatial-data-http/spatial-data-http.service.mjs +172 -92
  103. package/esm2022/lib/implementations/spatial-data-http/spatial-wire.mjs +103 -22
  104. package/esm2022/lib/implementations/tile-server/index.mjs +6 -0
  105. package/esm2022/lib/implementations/tile-server/native-histogram.mjs +30 -0
  106. package/esm2022/lib/implementations/tile-server/poll-descriptor.mjs +65 -0
  107. package/esm2022/lib/implementations/tile-server/tile-protocol.mjs +42 -0
  108. package/esm2022/lib/implementations/tile-server/transport.mjs +135 -0
  109. package/esm2022/lib/intensity/intensity-profile.mjs +107 -0
  110. package/esm2022/lib/intensity/intensity-profile.service.mjs +223 -0
  111. package/esm2022/lib/intensity-inset/intensity-inset.component.mjs +133 -0
  112. package/esm2022/lib/models/bezier.mjs +1 -11
  113. package/esm2022/lib/models/class-preset.mjs +41 -3
  114. package/esm2022/lib/models/geometry.mjs +27 -164
  115. package/esm2022/lib/models/polygon-edit.mjs +254 -0
  116. package/esm2022/lib/models/polygon-factory.mjs +118 -0
  117. package/esm2022/lib/models/region-clone.mjs +68 -0
  118. package/esm2022/lib/models/region-geojson.mjs +373 -0
  119. package/esm2022/lib/models/region.mjs +34 -33
  120. package/esm2022/lib/models/shape.mjs +18 -16
  121. package/esm2022/lib/plot-mode/contribution-host.mjs +297 -0
  122. package/esm2022/lib/plot-mode/plot-mode-controller.mjs +9 -6
  123. package/esm2022/lib/plot-mode/plot-type-menu.mjs +85 -0
  124. package/esm2022/lib/plot-mode/tool-params-model.mjs +87 -0
  125. package/esm2022/lib/plot.utilities.mjs +296 -473
  126. package/esm2022/lib/processing/image-crop.mjs +1 -1
  127. package/esm2022/lib/processing/processing-image.mjs +28 -15
  128. package/esm2022/lib/provide-visualization.mjs +40 -14
  129. package/esm2022/lib/region-editor/classes-panel/classes-panel.component.mjs +99 -0
  130. package/esm2022/lib/region-editor/file-stem.mjs +13 -0
  131. package/esm2022/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.mjs +118 -0
  132. package/esm2022/lib/region-editor/mask-export.service.mjs +98 -0
  133. package/esm2022/lib/region-editor/mask-raster.mjs +11 -5
  134. package/esm2022/lib/region-editor/region-color-dialog/region-color-dialog.component.mjs +56 -0
  135. package/esm2022/lib/region-editor/region-editor-help/region-editor-help.component.mjs +28 -0
  136. package/esm2022/lib/region-editor/region-editor.component.mjs +402 -651
  137. package/esm2022/lib/region-editor/region-metrics.mjs +68 -0
  138. package/esm2022/lib/region-editor/region-persistence.service.mjs +134 -0
  139. package/esm2022/lib/region-editor/region-table/region-table.component.mjs +153 -0
  140. package/esm2022/lib/region-editor/save-mask-dialog/save-mask-dialog.component.mjs +91 -0
  141. package/esm2022/lib/region-editor/save-regions-dialog/save-regions-dialog.component.mjs +92 -0
  142. package/esm2022/lib/region-ops.service.mjs +28 -70
  143. package/esm2022/lib/region-overlay/region-geometry.mjs +360 -0
  144. package/esm2022/lib/region-overlay/region-hit-test.mjs +103 -0
  145. package/esm2022/lib/region-overlay/svg-region-renderer.mjs +228 -0
  146. package/esm2022/lib/render-orchestrator.mjs +14 -11
  147. package/esm2022/lib/render-session.mjs +207 -0
  148. package/esm2022/lib/routing-visualizer.service.mjs +459 -411
  149. package/esm2022/lib/spatial/density-raster.mjs +14 -0
  150. package/esm2022/lib/spatial/embedding-compute-coordinator.mjs +239 -0
  151. package/esm2022/lib/spatial/embedding-compute.mjs +43 -10
  152. package/esm2022/lib/spatial/gene-search.mjs +1 -1
  153. package/esm2022/lib/spatial/glyphs.mjs +97 -0
  154. package/esm2022/lib/spatial/lod.mjs +187 -0
  155. package/esm2022/lib/spatial/spatial-controls.facade.mjs +200 -0
  156. package/esm2022/lib/spatial/spatial-density.mjs +25 -16
  157. package/esm2022/lib/spatial/spatial-encoding.mjs +26 -82
  158. package/esm2022/lib/spatial/spatial-expression.mjs +43 -42
  159. package/esm2022/lib/spatial/spatial-framing.mjs +1 -1
  160. package/esm2022/lib/spatial/spatial-heatmap.mjs +6 -3
  161. package/esm2022/lib/spatial/spatial-hover.mjs +5 -33
  162. package/esm2022/lib/spatial/spatial-panel-model.mjs +282 -0
  163. package/esm2022/lib/spatial/spatial-sections.mjs +1 -1
  164. package/esm2022/lib/spatial/spatial-selection.mjs +33 -46
  165. package/esm2022/lib/spatial/spatial-tile-merge.mjs +219 -0
  166. package/esm2022/lib/spatial/spatial-tiles.mjs +12 -648
  167. package/esm2022/lib/spatial/spatial-volume-image.mjs +2 -4
  168. package/esm2022/lib/spatial/stats.mjs +71 -0
  169. package/esm2022/lib/spatial/transcript-grouping.mjs +307 -0
  170. package/esm2022/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.mjs +150 -0
  171. package/esm2022/lib/spatial-controls/spatial-charts/chart-data-model.mjs +309 -0
  172. package/esm2022/lib/spatial-controls/spatial-charts/chart-help.mjs +145 -0
  173. package/esm2022/lib/spatial-controls/spatial-charts/plotly-chart-host.mjs +158 -0
  174. package/esm2022/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.mjs +47 -0
  175. package/esm2022/lib/spatial-controls/spatial-charts/spatial-charts.component.mjs +297 -802
  176. package/esm2022/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.mjs +89 -0
  177. package/esm2022/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.mjs +52 -0
  178. package/esm2022/lib/spatial-controls/spatial-controls.component.mjs +143 -1238
  179. package/esm2022/lib/spatial-controls/spatial-gene-picker.mjs +153 -0
  180. package/esm2022/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.mjs +241 -0
  181. package/esm2022/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.mjs +193 -0
  182. package/esm2022/lib/spatial-controls/spatial-key/spatial-key.component.mjs +132 -0
  183. package/esm2022/lib/spatial-controls/spatial-key/spatial-key.model.mjs +67 -0
  184. package/esm2022/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.mjs +147 -0
  185. package/esm2022/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.mjs +300 -0
  186. package/esm2022/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.mjs +370 -0
  187. package/esm2022/lib/store/class-color.util.mjs +46 -3
  188. package/esm2022/lib/store/region-history.mjs +146 -0
  189. package/esm2022/lib/store/region-scope-cache.mjs +140 -0
  190. package/esm2022/lib/store/region-selection.mjs +82 -0
  191. package/esm2022/lib/store/region-store.service.mjs +279 -675
  192. package/esm2022/lib/store/spatial-selection.service.mjs +2 -2
  193. package/esm2022/lib/store/visualizer-store.service.mjs +49 -71
  194. package/esm2022/lib/toast-outlets.mjs +5 -4
  195. package/esm2022/lib/toolbar/brush/brush-tool.service.mjs +92 -434
  196. package/esm2022/lib/toolbar/canvas-tools.mjs +20 -0
  197. package/esm2022/lib/toolbar/crop/slide-crop.mjs +26 -42
  198. package/esm2022/lib/toolbar/plot-type-selector/plot-type-selector.component.mjs +85 -0
  199. package/esm2022/lib/toolbar/region-tools/region-tool-buttons.mjs +74 -0
  200. package/esm2022/lib/toolbar/region-tools/region-tools.component.mjs +114 -0
  201. package/esm2022/lib/toolbar/segmentation/cell-segment-tool.service.mjs +74 -78
  202. package/esm2022/lib/toolbar/segmentation/cellpose-segmenter.service.mjs +50 -8
  203. package/esm2022/lib/toolbar/segmentation/onnx-sam-session.mjs +61 -42
  204. package/esm2022/lib/toolbar/segmentation/pending-calls.mjs +47 -0
  205. package/esm2022/lib/toolbar/segmentation/sam-model-registry.mjs +12 -4
  206. package/esm2022/lib/toolbar/segmentation/sam-onnx-core.mjs +70 -14
  207. package/esm2022/lib/toolbar/segmentation/sam-point-tool.service.mjs +135 -172
  208. package/esm2022/lib/toolbar/segmentation/sam-prompt.mjs +9 -90
  209. package/esm2022/lib/toolbar/segmentation/sam-session.service.mjs +183 -0
  210. package/esm2022/lib/toolbar/segmentation/sam-tool.service.mjs +95 -150
  211. package/esm2022/lib/toolbar/segmentation/segmentation-commit.mjs +12 -0
  212. package/esm2022/lib/toolbar/segmentation/segmentation-runner.mjs +108 -0
  213. package/esm2022/lib/toolbar/segmentation-tools/segmentation-tools.component.mjs +155 -0
  214. package/esm2022/lib/toolbar/stack-controls/stack-controls.component.mjs +81 -0
  215. package/esm2022/lib/toolbar/tool-kit/async-tool-status.mjs +37 -0
  216. package/esm2022/lib/toolbar/tool-kit/canvas-tool-manager.mjs +63 -0
  217. package/esm2022/lib/toolbar/tool-kit/canvas-tool.mjs +2 -0
  218. package/esm2022/lib/toolbar/tool-kit/frame-pixels.mjs +108 -0
  219. package/esm2022/lib/toolbar/tool-kit/mask-stroke-editor.mjs +306 -0
  220. package/esm2022/lib/toolbar/tool-kit/matrix-frame.mjs +61 -0
  221. package/esm2022/lib/toolbar/tool-kit/tool-overlay.mjs +140 -0
  222. package/esm2022/lib/toolbar/tool-kit/undo-gesture.mjs +24 -0
  223. package/esm2022/lib/toolbar/tool-slider/tool-slider.component.mjs +63 -0
  224. package/esm2022/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.mjs +50 -0
  225. package/esm2022/lib/toolbar/toolbar.component.mjs +68 -117
  226. package/esm2022/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.mjs +93 -115
  227. package/esm2022/lib/toolbar/view-controls/view-controls.component.mjs +107 -0
  228. package/esm2022/lib/toolbar/wand/wand-region-grow.mjs +321 -0
  229. package/esm2022/lib/toolbar/wand/wand-tool.service.mjs +121 -416
  230. package/esm2022/lib/toolbar/wand/wand.service.mjs +30 -894
  231. package/esm2022/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.mjs +48 -90
  232. package/esm2022/lib/util/mark-for-check.mjs +17 -0
  233. package/esm2022/lib/util/supersede.mjs +56 -0
  234. package/esm2022/lib/visualization.module.mjs +39 -141
  235. package/esm2022/lib/visualizer/floating-drag.directive.mjs +58 -0
  236. package/esm2022/lib/visualizer/region-actions.mjs +149 -0
  237. package/esm2022/lib/visualizer/region-load.mjs +60 -0
  238. package/esm2022/lib/visualizer/spatial-dataset-binder.mjs +163 -0
  239. package/esm2022/lib/visualizer/tool-modes.mjs +113 -0
  240. package/esm2022/lib/visualizer/viewer-shortcuts.mjs +167 -0
  241. package/esm2022/lib/visualizer/visualizer-context-menu.mjs +119 -0
  242. package/esm2022/lib/visualizer.component.mjs +480 -1902
  243. package/esm2022/lib/workers/spatial-math-ops.mjs +43 -0
  244. package/esm2022/lib/workers/spatial-math-worker.mjs +10 -0
  245. package/esm2022/lib/workers/spatial-math.mjs +190 -0
  246. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-Csxlnq7I.mjs +41083 -0
  247. package/fesm2022/jax-data-science-sci-image-visualizer-jax-data-science-sci-image-visualizer-Csxlnq7I.mjs.map +1 -0
  248. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-Bkujqg7m.mjs +238 -0
  249. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-Bkujqg7m.mjs.map +1 -0
  250. package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs +12 -0
  251. package/fesm2022/jax-data-science-sci-image-visualizer-spatial-math-worker-BzVFFqGS.mjs.map +1 -0
  252. package/fesm2022/jax-data-science-sci-image-visualizer.mjs +41 -34467
  253. package/fesm2022/jax-data-science-sci-image-visualizer.mjs.map +1 -1
  254. package/fesm2022/mask.worker.js +36 -917
  255. package/fesm2022/onnx-sam.worker.js +52 -16
  256. package/fesm2022/spatial-math.worker.js +471 -0
  257. package/fesm2022/tsne.worker.js +32 -15
  258. package/index.d.ts +13 -10
  259. package/lib/channel-histogram/channel-histogram.component.d.ts +53 -43
  260. package/lib/contracts/capabilities.contract.d.ts +4 -2
  261. package/lib/contracts/cell-segmenter.contract.d.ts +1 -0
  262. package/lib/contracts/channel-histogram-api.contract.d.ts +4 -0
  263. package/lib/contracts/color.d.ts +27 -0
  264. package/lib/contracts/colormap-lut.d.ts +19 -4
  265. package/lib/contracts/coordinate-transform.contract.d.ts +3 -3
  266. package/lib/contracts/display-types.d.ts +21 -0
  267. package/lib/contracts/instance-segmenter.contract.d.ts +5 -0
  268. package/lib/contracts/intensity.d.ts +13 -2
  269. package/lib/contracts/plot-type.d.ts +3 -1
  270. package/lib/contracts/ports/image-state.port.d.ts +6 -2
  271. package/lib/contracts/ports/preferences.port.d.ts +4 -0
  272. package/lib/contracts/ports/region-io.port.d.ts +1 -0
  273. package/lib/contracts/ports/spatial-data.port.d.ts +4 -10
  274. package/lib/contracts/ports/tile-access.port.d.ts +1 -0
  275. package/lib/contracts/region-editor-api.contract.d.ts +1 -1
  276. package/lib/contracts/region-overlay.contract.d.ts +5 -0
  277. package/lib/contracts/sam.contract.d.ts +7 -0
  278. package/lib/contracts/semantic-segmenter.contract.d.ts +6 -0
  279. package/lib/contracts/spatial-dataset.contract.d.ts +19 -6
  280. package/lib/contracts/toolbar-tool.contract.d.ts +1 -0
  281. package/lib/contracts/visualizer.contract.d.ts +221 -54
  282. package/lib/contracts/viz-config.d.ts +1 -0
  283. package/lib/geometry/contour.d.ts +24 -0
  284. package/lib/geometry/raster.d.ts +42 -0
  285. package/lib/geometry/ring.d.ts +67 -0
  286. package/lib/hex-color-picker/hex-color-picker.component.d.ts +61 -27
  287. package/lib/implementations/base-store-visualizer.d.ts +61 -15
  288. package/lib/implementations/napari-js/napari-axes-gizmo.d.ts +36 -0
  289. package/lib/implementations/napari-js/napari-display-state.d.ts +76 -0
  290. package/lib/implementations/napari-js/napari-helpers.d.ts +129 -0
  291. package/lib/implementations/napari-js/napari-image-2d-scene.d.ts +162 -0
  292. package/lib/implementations/napari-js/napari-loading-badge.d.ts +0 -1
  293. package/lib/implementations/napari-js/napari-loading-state.d.ts +30 -0
  294. package/lib/implementations/napari-js/napari-region-overlay.d.ts +62 -70
  295. package/lib/implementations/napari-js/napari-scene.d.ts +93 -0
  296. package/lib/implementations/napari-js/napari-spatial-2d-scene.d.ts +163 -0
  297. package/lib/implementations/napari-js/napari-spatial-3d-scene.d.ts +212 -0
  298. package/lib/implementations/napari-js/napari-spatial-encoding.d.ts +114 -0
  299. package/lib/implementations/napari-js/napari-spatial-hover.d.ts +89 -0
  300. package/lib/implementations/napari-js/napari-spatial-scene.d.ts +118 -0
  301. package/lib/implementations/napari-js/napari-spatial-tiles.d.ts +56 -263
  302. package/lib/implementations/napari-js/napari-spatial-tooltip.d.ts +1 -1
  303. package/lib/implementations/napari-js/napari-surface-scene.d.ts +76 -0
  304. package/lib/implementations/napari-js/napari-tile-client.d.ts +214 -0
  305. package/lib/implementations/napari-js/napari-tool-bridge.d.ts +179 -0
  306. package/lib/implementations/napari-js/napari-visualizer.service.d.ts +121 -883
  307. package/lib/implementations/napari-js/napari-volume-scene.d.ts +104 -0
  308. package/lib/implementations/napari-js/napari-volume-z-handle.d.ts +8 -12
  309. package/lib/implementations/napari-js/region-overlay/overlay-projection.d.ts +59 -0
  310. package/lib/implementations/napari-js/region-overlay/region-edit.d.ts +15 -0
  311. package/lib/implementations/napari-js/region-overlay/region-svg-renderer.d.ts +54 -0
  312. package/lib/implementations/napari-js/spatial-tiles/categorical-lookup.d.ts +26 -0
  313. package/lib/implementations/napari-js/spatial-tiles/cell-layers.d.ts +70 -0
  314. package/lib/implementations/napari-js/spatial-tiles/density-layer.d.ts +61 -0
  315. package/lib/implementations/napari-js/spatial-tiles/layer-groups.d.ts +67 -0
  316. package/lib/implementations/napari-js/spatial-tiles/plan-context.d.ts +38 -0
  317. package/lib/implementations/napari-js/spatial-tiles/transcript-hover.d.ts +71 -0
  318. package/lib/implementations/napari-js/spatial-tiles/transcript-jobs.d.ts +105 -0
  319. package/lib/implementations/napari-js/spatial-tiles/transcript-layers.d.ts +56 -0
  320. package/lib/implementations/osd/display-pipeline.d.ts +38 -9
  321. package/lib/implementations/osd/histogram-sampler.d.ts +22 -12
  322. package/lib/implementations/osd/openseadragon-viewer-options.d.ts +35 -0
  323. package/lib/implementations/osd/openseadragon-visualizer.service.d.ts +78 -354
  324. package/lib/implementations/osd/osd-coordinate-transform.d.ts +2 -1
  325. package/lib/implementations/osd/osd-coords.d.ts +6 -4
  326. package/lib/implementations/osd/osd-export.d.ts +36 -0
  327. package/lib/implementations/osd/osd-lib.d.ts +7 -0
  328. package/lib/implementations/osd/osd-navigator-chrome.d.ts +69 -0
  329. package/lib/implementations/osd/osd-pixel-readback.d.ts +22 -0
  330. package/lib/implementations/osd/osd-region-overlay-draw.d.ts +37 -0
  331. package/lib/implementations/osd/osd-region-overlay.d.ts +36 -48
  332. package/lib/implementations/osd/osd-scale-bar.d.ts +8 -6
  333. package/lib/implementations/osd/osd-tile-source.d.ts +49 -0
  334. package/lib/implementations/osd/osd-viewer-like.d.ts +100 -0
  335. package/lib/implementations/osd/osd-viewer-mount.d.ts +14 -0
  336. package/lib/implementations/osd/osd-viewport.d.ts +77 -0
  337. package/lib/implementations/osd/osd-zoom.d.ts +6 -0
  338. package/lib/implementations/osd/simple-source.d.ts +161 -0
  339. package/lib/implementations/osd/slice-cache.d.ts +12 -3
  340. package/lib/implementations/osd/tile-client.d.ts +11 -14
  341. package/lib/implementations/osd/tile-recolor.d.ts +141 -0
  342. package/lib/implementations/plotly/omics-trace-builders.d.ts +32 -20
  343. package/lib/implementations/plotly/plotly-image-loader.d.ts +49 -0
  344. package/lib/implementations/plotly/plotly-image-recolor.d.ts +75 -0
  345. package/lib/implementations/plotly/plotly-intensity-inset.d.ts +8 -0
  346. package/lib/implementations/plotly/plotly-isosurface-controls.d.ts +38 -0
  347. package/lib/implementations/plotly/plotly-layouts.d.ts +188 -0
  348. package/lib/implementations/plotly/plotly-readback.d.ts +41 -0
  349. package/lib/implementations/plotly/plotly-region-overlay.d.ts +2 -2
  350. package/lib/implementations/plotly/plotly-shape-projection.d.ts +92 -0
  351. package/lib/implementations/plotly/plotly-trace-builders.d.ts +23 -12
  352. package/lib/implementations/plotly/plotly-zoom-controller.d.ts +86 -0
  353. package/lib/implementations/plotly/plotly.service.d.ts +136 -401
  354. package/lib/implementations/region-centroids.d.ts +14 -0
  355. package/lib/implementations/simple-slice-access.service.d.ts +7 -4
  356. package/lib/implementations/spatial-data-http/spatial-data-http.service.d.ts +42 -18
  357. package/lib/implementations/spatial-data-http/spatial-wire.d.ts +34 -9
  358. package/lib/implementations/tile-server/index.d.ts +5 -0
  359. package/lib/implementations/tile-server/native-histogram.d.ts +25 -0
  360. package/lib/implementations/tile-server/poll-descriptor.d.ts +39 -0
  361. package/lib/implementations/tile-server/tile-protocol.d.ts +80 -0
  362. package/lib/implementations/tile-server/transport.d.ts +62 -0
  363. package/lib/intensity/intensity-profile.d.ts +66 -0
  364. package/lib/intensity/intensity-profile.service.d.ts +108 -0
  365. package/lib/intensity-inset/intensity-inset.component.d.ts +58 -0
  366. package/lib/models/bezier.d.ts +0 -5
  367. package/lib/models/class-preset.d.ts +18 -0
  368. package/lib/models/geometry.d.ts +14 -48
  369. package/lib/models/polygon-edit.d.ts +72 -0
  370. package/lib/models/polygon-factory.d.ts +40 -0
  371. package/lib/models/region-clone.d.ts +20 -0
  372. package/lib/models/region-geojson.d.ts +17 -0
  373. package/lib/models/region.d.ts +40 -4
  374. package/lib/models/shape.d.ts +8 -0
  375. package/lib/plot-mode/contribution-host.d.ts +125 -0
  376. package/lib/plot-mode/plot-type-menu.d.ts +60 -0
  377. package/lib/plot-mode/tool-params-model.d.ts +49 -0
  378. package/lib/plot.utilities.d.ts +19 -30
  379. package/lib/processing/processing-image.d.ts +5 -2
  380. package/lib/provide-visualization.d.ts +19 -2
  381. package/lib/region-editor/classes-panel/classes-panel.component.d.ts +56 -0
  382. package/lib/region-editor/file-stem.d.ts +7 -0
  383. package/lib/region-editor/manage-classes-dialog/manage-classes-dialog.component.d.ts +45 -0
  384. package/lib/region-editor/mask-export.service.d.ts +54 -0
  385. package/lib/region-editor/mask-raster.d.ts +2 -8
  386. package/lib/region-editor/region-color-dialog/region-color-dialog.component.d.ts +29 -0
  387. package/lib/region-editor/region-editor-help/region-editor-help.component.d.ts +11 -0
  388. package/lib/region-editor/region-editor.component.d.ts +166 -199
  389. package/lib/region-editor/region-metrics.d.ts +26 -0
  390. package/lib/region-editor/region-persistence.service.d.ts +69 -0
  391. package/lib/region-editor/region-table/region-table.component.d.ts +83 -0
  392. package/lib/region-editor/save-mask-dialog/save-mask-dialog.component.d.ts +36 -0
  393. package/lib/region-editor/save-regions-dialog/save-regions-dialog.component.d.ts +37 -0
  394. package/lib/region-ops.service.d.ts +1 -7
  395. package/lib/region-overlay/region-geometry.d.ts +157 -0
  396. package/lib/region-overlay/region-hit-test.d.ts +38 -0
  397. package/lib/region-overlay/svg-region-renderer.d.ts +110 -0
  398. package/lib/render-orchestrator.d.ts +6 -2
  399. package/lib/render-session.d.ts +75 -0
  400. package/lib/routing-visualizer.service.d.ts +110 -58
  401. package/lib/spatial/density-raster.d.ts +6 -0
  402. package/lib/spatial/embedding-compute-coordinator.d.ts +123 -0
  403. package/lib/spatial/embedding-compute.d.ts +21 -2
  404. package/lib/spatial/glyphs.d.ts +16 -0
  405. package/lib/spatial/lod.d.ts +94 -0
  406. package/lib/spatial/spatial-controls.facade.d.ts +64 -0
  407. package/lib/spatial/spatial-density.d.ts +15 -5
  408. package/lib/spatial/spatial-encoding.d.ts +11 -44
  409. package/lib/spatial/spatial-expression.d.ts +40 -22
  410. package/lib/spatial/spatial-framing.d.ts +1 -0
  411. package/lib/spatial/spatial-heatmap.d.ts +2 -0
  412. package/lib/spatial/spatial-hover.d.ts +4 -16
  413. package/lib/spatial/spatial-panel-model.d.ts +135 -0
  414. package/lib/spatial/spatial-selection.d.ts +21 -26
  415. package/lib/spatial/spatial-tile-merge.d.ts +41 -0
  416. package/lib/spatial/spatial-tiles.d.ts +9 -256
  417. package/lib/spatial/stats.d.ts +38 -0
  418. package/lib/spatial/transcript-grouping.d.ts +119 -0
  419. package/lib/spatial-controls/spatial-cells-panel/spatial-cells-panel.component.d.ts +64 -0
  420. package/lib/spatial-controls/spatial-charts/chart-data-model.d.ts +153 -0
  421. package/lib/spatial-controls/spatial-charts/chart-help.d.ts +69 -0
  422. package/lib/spatial-controls/spatial-charts/plotly-chart-host.d.ts +98 -0
  423. package/lib/spatial-controls/spatial-charts/spatial-chart-window/spatial-chart-window.component.d.ts +26 -0
  424. package/lib/spatial-controls/spatial-charts/spatial-charts.component.d.ts +101 -260
  425. package/lib/spatial-controls/spatial-charts/spatial-embedding-controls/spatial-embedding-controls.component.d.ts +43 -0
  426. package/lib/spatial-controls/spatial-charts/spatial-heatmap-controls/spatial-heatmap-controls.component.d.ts +27 -0
  427. package/lib/spatial-controls/spatial-controls.component.d.ts +68 -448
  428. package/lib/spatial-controls/spatial-gene-picker.d.ts +86 -0
  429. package/lib/spatial-controls/spatial-gene-tree/spatial-gene-tree.component.d.ts +102 -0
  430. package/lib/spatial-controls/spatial-groups-panel/spatial-groups-panel.component.d.ts +72 -0
  431. package/lib/spatial-controls/spatial-key/spatial-key.component.d.ts +66 -0
  432. package/lib/spatial-controls/spatial-key/spatial-key.model.d.ts +33 -0
  433. package/lib/spatial-controls/spatial-marker-genes-form/spatial-marker-genes-form.component.d.ts +64 -0
  434. package/lib/spatial-controls/spatial-observations-panel/spatial-observations-panel.component.d.ts +117 -0
  435. package/lib/spatial-controls/spatial-transcripts-panel/spatial-transcripts-panel.component.d.ts +142 -0
  436. package/lib/store/class-color.util.d.ts +35 -1
  437. package/lib/store/region-history.d.ts +66 -0
  438. package/lib/store/region-scope-cache.d.ts +63 -0
  439. package/lib/store/region-selection.d.ts +36 -0
  440. package/lib/store/region-store.service.d.ts +104 -112
  441. package/lib/store/visualizer-store.service.d.ts +22 -33
  442. package/lib/toast-outlets.d.ts +4 -3
  443. package/lib/toolbar/brush/brush-tool.service.d.ts +31 -98
  444. package/lib/toolbar/canvas-tools.d.ts +20 -0
  445. package/lib/toolbar/crop/slide-crop.d.ts +10 -4
  446. package/lib/toolbar/plot-type-selector/plot-type-selector.component.d.ts +38 -0
  447. package/lib/toolbar/region-tools/region-tool-buttons.d.ts +21 -0
  448. package/lib/toolbar/region-tools/region-tools.component.d.ts +60 -0
  449. package/lib/toolbar/segmentation/cell-segment-tool.service.d.ts +10 -14
  450. package/lib/toolbar/segmentation/cellpose-segmenter.service.d.ts +12 -2
  451. package/lib/toolbar/segmentation/onnx-sam-session.d.ts +22 -3
  452. package/lib/toolbar/segmentation/pending-calls.d.ts +31 -0
  453. package/lib/toolbar/segmentation/sam-model-registry.d.ts +9 -3
  454. package/lib/toolbar/segmentation/sam-onnx-core.d.ts +18 -5
  455. package/lib/toolbar/segmentation/sam-point-tool.service.d.ts +46 -32
  456. package/lib/toolbar/segmentation/sam-prompt.d.ts +7 -31
  457. package/lib/toolbar/segmentation/sam-session.service.d.ts +74 -0
  458. package/lib/toolbar/segmentation/sam-tool.service.d.ts +23 -30
  459. package/lib/toolbar/segmentation/segmentation-commit.d.ts +8 -0
  460. package/lib/toolbar/segmentation/segmentation-runner.d.ts +52 -0
  461. package/lib/toolbar/segmentation-tools/segmentation-tools.component.d.ts +87 -0
  462. package/lib/toolbar/stack-controls/stack-controls.component.d.ts +40 -0
  463. package/lib/toolbar/tool-kit/async-tool-status.d.ts +21 -0
  464. package/lib/toolbar/tool-kit/canvas-tool-manager.d.ts +36 -0
  465. package/lib/toolbar/tool-kit/canvas-tool.d.ts +86 -0
  466. package/lib/toolbar/tool-kit/frame-pixels.d.ts +45 -0
  467. package/lib/toolbar/tool-kit/mask-stroke-editor.d.ts +125 -0
  468. package/lib/toolbar/tool-kit/matrix-frame.d.ts +40 -0
  469. package/lib/toolbar/tool-kit/tool-overlay.d.ts +60 -0
  470. package/lib/toolbar/tool-kit/undo-gesture.d.ts +17 -0
  471. package/lib/toolbar/tool-slider/tool-slider.component.d.ts +33 -0
  472. package/lib/toolbar/toolbar-help-dialog/toolbar-help-dialog.component.d.ts +24 -0
  473. package/lib/toolbar/toolbar.component.d.ts +47 -83
  474. package/lib/toolbar/vertex-eraser/vertex-eraser-tool.service.d.ts +33 -40
  475. package/lib/toolbar/view-controls/view-controls.component.d.ts +54 -0
  476. package/lib/toolbar/wand/wand-region-grow.d.ts +49 -0
  477. package/lib/toolbar/wand/wand-tool.service.d.ts +39 -124
  478. package/lib/toolbar/wand/wand.service.d.ts +22 -116
  479. package/lib/toolbar/zoom-to-box/zoom-to-box-tool.service.d.ts +17 -37
  480. package/lib/util/mark-for-check.d.ts +11 -0
  481. package/lib/util/supersede.d.ts +53 -0
  482. package/lib/visualization.module.d.ts +18 -39
  483. package/lib/visualizer/floating-drag.directive.d.ts +30 -0
  484. package/lib/visualizer/region-actions.d.ts +54 -0
  485. package/lib/visualizer/region-load.d.ts +27 -0
  486. package/lib/visualizer/spatial-dataset-binder.d.ts +74 -0
  487. package/lib/visualizer/tool-modes.d.ts +49 -0
  488. package/lib/visualizer/viewer-shortcuts.d.ts +71 -0
  489. package/lib/visualizer/visualizer-context-menu.d.ts +55 -0
  490. package/lib/visualizer.component.d.ts +201 -447
  491. package/lib/workers/spatial-math-ops.d.ts +65 -0
  492. package/lib/workers/spatial-math-worker.d.ts +7 -0
  493. package/lib/workers/spatial-math.d.ts +74 -0
  494. package/package.json +12 -3
  495. package/src/lib/styles/_viz-icons-rules.scss +73 -0
  496. package/src/lib/styles/viz-icons.scss +14 -0
  497. package/esm2022/lib/implementations/napari-js/napari-axes-labels.mjs +0 -97
  498. package/esm2022/lib/implementations/napari-js/napari-navigator.mjs +0 -195
  499. package/esm2022/lib/implementations/napari-js/napari-scale-bar.mjs +0 -92
  500. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs +0 -329
  501. package/fesm2022/jax-data-science-sci-image-visualizer-onnx-sam-session-BwP-A11m.mjs.map +0 -1
  502. package/lib/implementations/napari-js/napari-axes-labels.d.ts +0 -49
  503. package/lib/implementations/napari-js/napari-navigator.d.ts +0 -72
  504. package/lib/implementations/napari-js/napari-scale-bar.d.ts +0 -35
  505. package/src/lib/assets/cell-detection.svg +0 -37
  506. package/src/lib/assets/click.svg +0 -1
  507. package/src/lib/assets/colormap-luts.json +0 -1
  508. package/src/lib/assets/edit-selection-white.svg +0 -47
  509. package/src/lib/assets/icons/colormap-earth.png +0 -0
  510. package/src/lib/assets/icons/colormap-placeholder.png +0 -0
  511. package/src/lib/assets/icons/colormap-pubu.png +0 -0
  512. package/src/lib/assets/interactive-segmentation-cursor.svg +0 -1
  513. package/src/lib/assets/picture-segmentation.svg +0 -43
  514. package/src/lib/assets/test/download-379.svg +0 -1
  515. package/src/lib/assets/test/download-98.svg +0 -1
  516. package/src/lib/assets/test/json-1.svg +0 -1
  517. package/src/lib/assets/test/load-53.svg +0 -1
  518. package/src/lib/assets/test/mask-44.svg +0 -1
  519. package/src/lib/assets/test/mask-download-44.svg +0 -15
  520. package/src/lib/assets/test/mask-save-44.svg +0 -11
  521. package/src/lib/assets/test/overlay-1.svg +0 -1
  522. package/src/lib/assets/test/overlay-4.svg +0 -1
  523. package/src/lib/assets/test/region-26.svg +0 -1
  524. package/src/lib/assets/test/save-56.svg +0 -1
  525. package/src/lib/assets/test/upload-43.svg +0 -1
@@ -1,8 +1,32 @@
1
- import { BehaviorSubject } from 'rxjs';
2
- import { WandService } from '../wand/wand.service';
3
- import { WandToolHost } from '../wand/wand-tool.service';
1
+ import { SamSessionService } from './sam-session.service';
4
2
  import { ISamSession } from '../../contracts/sam.contract';
3
+ import { AsyncToolStatus } from '../tool-kit/async-tool-status';
4
+ import { CanvasToolHost, ICanvasTool } from '../tool-kit/canvas-tool';
5
5
  import * as i0 from "@angular/core";
6
+ /**
7
+ * The SAM point prompts of one viewer chain: the status feeds the toolbar shows
8
+ * and the model session. Every backend's `CanvasToolManager` gets its own
9
+ * {@link SamPointTool} from {@link createTool}, so in-progress points never
10
+ * cross backends, while all of them report through these feeds and share one
11
+ * busy guard and one {@link SamSessionService}.
12
+ */
13
+ export declare class SamPointToolService {
14
+ private readonly sessions;
15
+ private readonly state;
16
+ readonly status$: import("rxjs").BehaviorSubject<string>;
17
+ readonly busy$: import("rxjs").BehaviorSubject<boolean>;
18
+ /** Encoder-download progress (0..1) on the first click; -1 when not downloading. */
19
+ readonly progress$: import("rxjs").BehaviorSubject<number>;
20
+ constructor(sessions?: SamSessionService);
21
+ /** Choose the registered model to use (shared with the box tool). */
22
+ setModel(id: string): void;
23
+ /** Test seam: inject a fake/alternate session. */
24
+ useSession(session: ISamSession): void;
25
+ /** A point tool for one backend, reporting through this service. */
26
+ createTool(): SamPointTool;
27
+ static ɵfac: i0.ɵɵFactoryDeclaration<SamPointToolService, never>;
28
+ static ɵprov: i0.ɵɵInjectableDeclaration<SamPointToolService>;
29
+ }
6
30
  /** Interactive SAM point-prompt tool (jit-ui#90, P1).
7
31
  *
8
32
  * Each plain (positive) click segments the clicked object as its OWN new region
@@ -11,36 +35,28 @@ import * as i0 from "@angular/core";
11
35
  * the decoder against the (cached) image embedding and updating its live region.
12
36
  * `commit()` (Enter) finalises early; `clear()` (Esc) discards the current
13
37
  * prompt + its preview region. Mirrors the wand/brush on-canvas tool pattern and
14
- * reuses WandService.maskToPolygons + the shared region store.
38
+ * reuses the contour tracer + the shared region store.
15
39
  *
16
- * Inference is behind {@link ISamSession} (lazy onnxruntime-web in production,
17
- * a fake in tests).
40
+ * Inference goes through the shared {@link SamSessionService} (one session and
41
+ * embedding for both SAM tools; lazy onnxruntime-web in production, a fake in
42
+ * tests). Created by {@link SamPointToolService.createTool}.
18
43
  */
19
- export declare class SamPointToolService {
20
- private wandService;
44
+ export declare class SamPointTool implements ICanvasTool<void> {
45
+ private readonly state;
46
+ private readonly sessions;
47
+ readonly id = "samPoint";
21
48
  private host;
22
- private overlay;
23
- private session;
24
- /** In-flight session load — dedupes a warm-up preload against the first click. */
25
- private sessionLoad;
26
- private model;
27
- private embedding;
28
- private embeddingKey;
49
+ private readonly overlay;
29
50
  /** Accumulated point prompts, in image (matrix) coords. */
30
51
  private points;
31
52
  /** Id of the in-progress (preview) region being refined, if committed to store. */
32
53
  private regionId;
33
- readonly status$: BehaviorSubject<string>;
34
- readonly busy$: BehaviorSubject<boolean>;
35
- /** Encoder-download progress (0..1) on the first click; -1 when not downloading. */
36
- readonly progress$: BehaviorSubject<number>;
37
- private readonly boundMouseDown;
38
- constructor(wandService: WandService);
39
- bindHost(host: WandToolHost): void;
40
- setModel(id: string): void;
41
- /** Test seam: inject a fake/alternate session. */
42
- useSession(session: ISamSession): void;
43
- setMode(active: boolean): void;
54
+ constructor(state: AsyncToolStatus, sessions: SamSessionService);
55
+ private get status$();
56
+ activate(host: CanvasToolHost): void;
57
+ deactivate(): void;
58
+ /** Forget the current prompt (its preview region stays). */
59
+ reset(): void;
44
60
  /** Eagerly load the model in the background (fire-and-forget). Safe to call
45
61
  * repeatedly — it dedupes against an in-flight load and an existing session. */
46
62
  preload(): void;
@@ -49,11 +65,9 @@ export declare class SamPointToolService {
49
65
  /** Discard the in-progress prompt + its preview region. */
50
66
  clear(): void;
51
67
  private createOverlay;
52
- private destroyOverlay;
53
- private onMouseDown;
54
- /** Replace (or insert) the in-progress preview region in the shared store. */
68
+ /** Primary button only (the overlay filters the others). */
69
+ private onPointerDown;
70
+ /** Replace (or insert) the in-progress preview region in the shared store,
71
+ * against the regions as they are now (the run may have taken a while). */
55
72
  private upsertPreview;
56
- private ensureSession;
57
- static ɵfac: i0.ɵɵFactoryDeclaration<SamPointToolService, never>;
58
- static ɵprov: i0.ɵɵInjectableDeclaration<SamPointToolService>;
59
73
  }
@@ -1,34 +1,10 @@
1
- import { CachedImageData } from '../wand/wand-tool.service';
2
- import { SamPrompt } from '../../contracts/sam.contract';
1
+ import type { CachedImageData } from '../wand/wand-tool.service';
3
2
  /**
4
- * Pure helpers for SAM inference — no DOM, no ORT, no `this` — so they're unit
5
- * testable. The session uses these to assemble decoder inputs and to convert
6
- * the cached image frame into the RGBA buffer the encoder preprocesses.
7
- */
8
- /**
9
- * Build an RGBA buffer (the encoder's input image) from a cached image frame.
10
- * Grayscale frames are replicated across R/G/B; RGB tuples are copied through.
11
- * Out-of-range/missing pixels become opaque black.
12
- */
13
- export declare function frameToRgba(cached: CachedImageData, frameIndex: number): Uint8ClampedArray;
14
- /**
15
- * Assemble the SAM decoder's `point_coords` / `point_labels` from a prompt.
3
+ * Build an RGBA buffer (the SAM encoder's input image) from a cached image
4
+ * frame: the full-frame case of {@link frameRegionToRgba}. Grayscale frames are
5
+ * replicated across R/G/B; missing pixels become opaque black.
16
6
  *
17
- * Coordinates are scaled into the encoder's resized space (`scale =
18
- * inputSize / max(imageW, imageH)`). A box is encoded as two points labelled
19
- * `2` (top-left) and `3` (bottom-right); positive/negative points use `1`/`0`.
20
- * When there are points but no box, a padding point `[0,0]` labelled `-1` is
21
- * appended (the decoder expects the box slots padded when absent).
22
- */
23
- export declare function buildDecoderPrompt(prompt: SamPrompt, scale: number): {
24
- pointCoords: Float32Array;
25
- pointLabels: Float32Array;
26
- numPoints: number;
27
- };
28
- /**
29
- * Binarize SAM mask logits (`> threshold`, default 0 per SAM's mask_threshold)
30
- * into a 0/1 mask the contour tracer (WandService.maskToPolygons) consumes.
7
+ * The decoder-prompt helpers (`buildDecoderPrompt`, `binarizeMask`,
8
+ * `bestMaskIndex`) live in `sam-onnx-core`, which both inference paths use.
31
9
  */
32
- export declare function binarizeMask(logits: Float32Array | number[], threshold?: number): Uint8Array;
33
- /** Index of the highest-scoring mask in a multimask decoder output. */
34
- export declare function bestMaskIndex(iouPredictions: Float32Array | number[]): number;
10
+ export declare function frameToRgba(cached: CachedImageData, frameIndex: number): Uint8ClampedArray;
@@ -0,0 +1,74 @@
1
+ import { OnDestroy } from '@angular/core';
2
+ import type { CachedImageData } from '../wand/wand-tool.service';
3
+ import { ISamSession, SamEmbedding, SamModelDef } from '../../contracts/sam.contract';
4
+ import * as i0 from "@angular/core";
5
+ /** Creates an unloaded inference session. */
6
+ export type SamSessionFactory = () => Promise<ISamSession>;
7
+ /**
8
+ * The one SAM inference session for the active model, shared by the box- and
9
+ * point-prompt tools (RT-10): one download, one Worker/GPU session and one
10
+ * cached image embedding instead of one per tool.
11
+ *
12
+ * - Concurrent {@link ensureSession} calls share a single load, and each caller
13
+ * receives its download progress.
14
+ * - A load that fails disposes its half-built session (and Worker) and is not
15
+ * cached; the next call retries (RT-7).
16
+ * - {@link setModel} during a load discards that load's session, and the
17
+ * waiting callers get the newly picked model instead (RT-9).
18
+ *
19
+ * Scope: root, on purpose, and deliberately NOT in `provideVisualization()`. The
20
+ * chain-scoped SAM tools of a second viewer (jit-ui's pipeline preview) resolve
21
+ * this root instance, so the model (14–172 MB) is downloaded and its Worker/GPU
22
+ * session built once per app, not once per viewer, and the embedding cache is
23
+ * keyed by image + model so viewers don't confuse each other's images. The cost
24
+ * is that a model picked in one viewer is the model of all of them. A host that
25
+ * wants a session per viewer can provide this service at the viewer's component:
26
+ * {@link ngOnDestroy} then disposes that viewer's session (and Worker) with it.
27
+ */
28
+ export declare class SamSessionService implements OnDestroy {
29
+ private model;
30
+ private session;
31
+ private loading;
32
+ /** Bumped on every model switch; a load started under an older value is stale. */
33
+ private generation;
34
+ private readonly progressListeners;
35
+ private createSession;
36
+ /** Set by {@link ngOnDestroy}: no session is loaded any more. */
37
+ private destroyed;
38
+ /** Cached encoder embedding + the key (image identity + model) it was computed for. */
39
+ private embedding;
40
+ private embeddingKey;
41
+ /** The model the next run uses. */
42
+ getModel(): SamModelDef;
43
+ /** True when a session is loaded (or injected) for the current model. */
44
+ hasSession(): boolean;
45
+ /** Choose the registered model; drops the loaded session and cached embedding. */
46
+ setModel(id: string): void;
47
+ /** Drop the cached embedding (e.g. after the image/slice changes). */
48
+ invalidateEmbedding(): void;
49
+ /** Test seam: use this session (already loaded) for the current model. */
50
+ useSession(session: ISamSession): void;
51
+ /** Test seam: how sessions are created (default: lazy onnxruntime-web). */
52
+ useSessionFactory(factory: SamSessionFactory): void;
53
+ /**
54
+ * The loaded session for the current model, loading it if needed.
55
+ * `onProgress` receives the download fraction while this call waits.
56
+ */
57
+ ensureSession(onProgress?: (fraction: number) => void): Promise<ISamSession>;
58
+ /**
59
+ * The encoder embedding of a cached frame, reused while `key` (the image's
60
+ * identity: file, frame, readback frame) and the model are unchanged.
61
+ * `onEncode` is called only when the encoder actually runs.
62
+ */
63
+ embed(session: ISamSession, cached: CachedImageData, frameIndex: number, key: string, onEncode?: () => void): Promise<SamEmbedding>;
64
+ /**
65
+ * Dispose the session (and its Worker), drop the embedding and discard an
66
+ * in-flight load. Angular calls this when the injector providing the service
67
+ * is destroyed: the app for the root instance, or a viewer component that
68
+ * provides its own.
69
+ */
70
+ ngOnDestroy(): void;
71
+ private load;
72
+ static ɵfac: i0.ɵɵFactoryDeclaration<SamSessionService, never>;
73
+ static ɵprov: i0.ɵɵInjectableDeclaration<SamSessionService>;
74
+ }
@@ -1,50 +1,43 @@
1
- import { BehaviorSubject } from 'rxjs';
2
- import { WandService } from '../wand/wand.service';
3
- import { WandToolHost } from '../wand/wand-tool.service';
1
+ import { CanvasToolHost } from '../tool-kit/canvas-tool';
2
+ import { SamSessionService } from './sam-session.service';
4
3
  import { ISamSession } from '../../contracts/sam.contract';
5
4
  import * as i0 from "@angular/core";
6
- /** The SAM tool binds to the same host the wand/brush use, so each backend
7
- * reuses its existing pixel readback + coordinate transform + region store. */
8
- export type SamToolHost = WandToolHost;
5
+ /** @deprecated The SAM tool runs against the backend's canvas-tool host:
6
+ * use {@link CanvasToolHost}. */
7
+ export type SamToolHost = CanvasToolHost;
9
8
  /**
10
9
  * Box-prompted SAM segmentation tool (jit-ui#90, P0). On `segmentBoxes()` it
11
10
  * reads every rectangle region, runs the (cached) encoder once for the image,
12
- * then runs the decoder per box, traces each mask to a polygon (reusing
13
- * WandService.maskToPolygons) and commits them as regions.
11
+ * then runs the decoder per box, traces each mask to a polygon and replaces
12
+ * the prompt rectangles with the masks.
14
13
  *
15
- * Inference is abstracted behind {@link ISamSession}: production uses the
16
- * onnxruntime-web session (lazy-imported so ORT never loads in unit tests);
17
- * tests inject a fake via {@link useSession}.
14
+ * Inference goes through the shared {@link SamSessionService} (one session and
15
+ * embedding for both SAM tools); tests inject a fake session via
16
+ * {@link useSession}.
18
17
  */
19
18
  export declare class SamToolService {
20
- private wandService;
21
- private host;
22
- private session;
23
- private model;
24
- /** Cached encoder embedding + the key (image identity) it was computed for. */
25
- private embedding;
26
- private embeddingKey;
19
+ private readonly sessions;
20
+ private readonly state;
27
21
  /** Status text + busy flag for a spinner / toast in the host. */
28
- readonly status$: BehaviorSubject<string>;
29
- readonly busy$: BehaviorSubject<boolean>;
22
+ readonly status$: import("rxjs").BehaviorSubject<string>;
23
+ readonly busy$: import("rxjs").BehaviorSubject<boolean>;
30
24
  /** Encoder-download progress: -1 = not downloading, 0..1 = downloading. */
31
- readonly progress$: BehaviorSubject<number>;
32
- constructor(wandService: WandService);
33
- /** Bind to the active backend's host (called by the backend, like the wand). */
34
- bindHost(host: SamToolHost): void;
35
- /** Choose the registered model to use; invalidates any cached embedding. */
25
+ readonly progress$: import("rxjs").BehaviorSubject<number>;
26
+ constructor(sessions?: SamSessionService);
27
+ /** Choose the registered model to use (shared with the point tool). */
36
28
  setModel(id: string): void;
37
29
  /** Drop the cached embedding (e.g. after the image/slice changes). */
38
30
  invalidateEmbedding(): void;
39
31
  /** Test seam: inject a fake/alternate inference session. */
40
32
  useSession(session: ISamSession): void;
41
33
  /**
42
- * Segment every rectangle region with a box prompt and append the resulting
43
- * masks as new polygon regions. Returns how many regions were added.
34
+ * Segment every rectangle region of the backend behind `host` with a box
35
+ * prompt and replace each prompt that produced a mask with the mask's polygon
36
+ * region. Returns how many regions were added; 0 (ignored) while a previous
37
+ * run is still going. The host is passed per run, so no backend's host
38
+ * outlives its call.
44
39
  */
45
- segmentBoxes(): Promise<number>;
46
- private makeRegion;
47
- private ensureSession;
40
+ segmentBoxes(host: CanvasToolHost): Promise<number>;
48
41
  static ɵfac: i0.ɵɵFactoryDeclaration<SamToolService, never>;
49
42
  static ɵprov: i0.ɵɵInjectableDeclaration<SamToolService>;
50
43
  }
@@ -0,0 +1,8 @@
1
+ import { Region } from '../../models/region';
2
+ /**
3
+ * `regions` minus `remove`, matched by id (identity for a region without one).
4
+ * Async tools use it to drop their consumed prompts from the *current* region
5
+ * list at commit time, instead of overwriting the list they read before a long
6
+ * download or inference (RT-6).
7
+ */
8
+ export declare function withoutRegions(regions: Region[], remove: Region[]): Region[];
@@ -0,0 +1,52 @@
1
+ import { Observable } from 'rxjs';
2
+ import { MessageService } from 'primeng/api';
3
+ /** A segmentation tool's live feeds: status line and encoder-download progress (0..1, <0 = none).
4
+ * Observables, not subjects, so a contributed tool need not expose its internals. */
5
+ export interface SegmentationProgress {
6
+ status$: Observable<string>;
7
+ progress$: Observable<number>;
8
+ }
9
+ /**
10
+ * One viewer's segmentation runs and their sticky progress toast (jit-ui#90): the
11
+ * box-prompt SAM and Cellpose tools, contributed whole-view tools, and the
12
+ * interactive SAM point tool whose feeds it bridges.
13
+ *
14
+ * The toast is keyed per viewer (`toastKey`), so a run in a pipeline preview does not
15
+ * show in the main view; results and failures go to the viewer's `resultKey` outlet,
16
+ * which the sticky toast's teardown does not clear. The toast template binds
17
+ * {@link status}, {@link progress}, {@link downloading} and {@link busy}.
18
+ */
19
+ export declare class SegmentationRunner {
20
+ private readonly messages;
21
+ readonly toastKey: string;
22
+ readonly resultKey: string;
23
+ /** Re-render the toast (its feeds may fire outside the zone). */
24
+ private readonly changed;
25
+ status: string;
26
+ /** Encoder download, 0..100. */
27
+ progress: number;
28
+ downloading: boolean;
29
+ /** Any segmentation work in flight (the indeterminate spinner). */
30
+ busy: boolean;
31
+ /** Whether the sticky toast is up — re-adding it would stack one per point click. */
32
+ private shown;
33
+ constructor(messages: Pick<MessageService, 'add' | 'clear'>, toastKey: string, resultKey: string,
34
+ /** Re-render the toast (its feeds may fire outside the zone). */
35
+ changed: () => void);
36
+ /** Surface the interactive SAM point tool's status and download progress, which runs
37
+ * inside the renderer on each click (the first click pulls the encoder). */
38
+ bindPointTool(tool: SegmentationProgress & {
39
+ busy$: Observable<boolean>;
40
+ }, until$: Observable<unknown>): void;
41
+ /**
42
+ * Run `op` with the tool's status and download progress in the sticky toast, then
43
+ * report the outcome: the region count (or the tool's last status line) on success,
44
+ * the error on failure. The toast stays until the run settles.
45
+ */
46
+ run(label: string, tool: SegmentationProgress, op: () => Promise<number>): Promise<void>;
47
+ /** Show the sticky toast once (idempotent). */
48
+ show(summary: string): void;
49
+ /** Dismiss the sticky toast and reset its progress/spinner state. */
50
+ hide(): void;
51
+ private onProgress;
52
+ }
@@ -0,0 +1,87 @@
1
+ import { EventEmitter, OnChanges, SimpleChanges } from '@angular/core';
2
+ import { MenuItem } from 'primeng/api';
3
+ import { ToolbarToolContribution } from '../../contracts/toolbar-tool.contract';
4
+ import * as i0 from "@angular/core";
5
+ /**
6
+ * The toolbar's segmentation group: SAM box prompt, SAM point prompts and the
7
+ * shared SAM model picker, cellpose, and the contributed no-prompt tools (run,
8
+ * pick checkpoint, parameters). Presentational: the host runs every action.
9
+ */
10
+ export declare class SegmentationToolsComponent implements OnChanges {
11
+ /** The armed tool's mode (`samPoint` highlights the point-prompt button), or null. */
12
+ activeDragMode: string | null;
13
+ /** SAM model picker options + current selection (jit-ui#90 P1). */
14
+ samModels: {
15
+ id: string;
16
+ label: string;
17
+ }[];
18
+ /** The selected SAM model id. */
19
+ samModelId: string;
20
+ /** Contributed no-prompt tools, already filtered and sorted by the host. */
21
+ contributedTools: ToolbarToolContribution[];
22
+ /** Active checkpoint per contributed tool, keyed by tool id. */
23
+ toolModelIds: Record<string, string>;
24
+ /** Run box-prompted SAM segmentation on the drawn rectangles (jit-ui#90). */
25
+ segmentRegions: EventEmitter<void>;
26
+ /** Run cellpose-SAM (auto) inside each drawn rectangle's crop (jit-ui#90). */
27
+ segmentCellpose: EventEmitter<void>;
28
+ /** The SAM point tool's toggle ('samPoint'). */
29
+ toggleDragMode: EventEmitter<string>;
30
+ /** A SAM model was picked from the model menu (its id). */
31
+ samModelChange: EventEmitter<string>;
32
+ /** Run a contributed tool over the current view (its id). */
33
+ runTool: EventEmitter<string>;
34
+ /** A contributed tool's checkpoint was picked. */
35
+ toolModelChange: EventEmitter<{
36
+ toolId: string;
37
+ modelId: string;
38
+ }>;
39
+ /** Open a contributed tool's parameter dialog (its id). */
40
+ openToolParams: EventEmitter<string>;
41
+ /** Model picker for the Segment button's dropdown menu. The active model
42
+ * (`samModelId`) is marked with a check; selecting an item emits
43
+ * `samModelChange` (jit-ui#90 P1).
44
+ *
45
+ * Held as a stable array (rebuilt only when `samModels`/`samModelId` change),
46
+ * NOT a getter: a getter returns a fresh array with new `command` closures on
47
+ * every change-detection tick, which makes the bound `p-menu` overlay rebuild
48
+ * its DOM mid-interaction and swallow the click on a menu item.
49
+ *
50
+ * `tooltip` carries the model's description from {@link MODEL_INFO}; the
51
+ * menus' shared item template turns it into the hover info icon. p-menu's own
52
+ * rendering ignores the field (it reads `item.title`), so it is free to use. */
53
+ protected samMenuItems: MenuItem[];
54
+ /**
55
+ * Model menus for the contributed tools, keyed by tool id. Same stable-array
56
+ * reasoning as {@link samMenuItems} — and it is why this is a map rebuilt in
57
+ * `ngOnChanges` rather than a method called from the template, which would
58
+ * hand `p-menu` a new array every tick.
59
+ *
60
+ * A contributed tool supplies its own per-model description, so unlike the
61
+ * SAM menu these do not consult {@link MODEL_INFO}: this library has no
62
+ * copy for checkpoints it does not know about.
63
+ */
64
+ protected toolMenuItems: Record<string, MenuItem[]>;
65
+ ngOnChanges(changes: SimpleChanges): void;
66
+ /**
67
+ * Strip markup from a model description so it can be read aloud.
68
+ *
69
+ * The copy in MODEL_INFO and in a contribution's `ToolModelOption.info` is
70
+ * written for a visual tooltip rendered with `[escape]="false"`, so it carries
71
+ * `<b>` and `<br>`. Passed to `aria-label` verbatim a screen reader announces
72
+ * the tags, so they are removed and `<br>` becomes a sentence break. Entities
73
+ * used in that copy (`&nbsp;`, `&times;`, `&amp;`) are decoded for the same
74
+ * reason.
75
+ */
76
+ protected plainText(html: string): string;
77
+ /** The info button's `aria-label` (`infoLabel` on a menu item), built once with the
78
+ * menu rather than by a template call on every check; none without a description. */
79
+ private infoLabel;
80
+ /** Keeps each contributed tool's `p-menu` overlay alive across CD ticks —
81
+ * re-creating it mid-interaction swallows the click on a menu item. */
82
+ protected trackToolById(_index: number, tool: {
83
+ id: string;
84
+ }): string;
85
+ static ɵfac: i0.ɵɵFactoryDeclaration<SegmentationToolsComponent, never>;
86
+ static ɵcmp: i0.ɵɵComponentDeclaration<SegmentationToolsComponent, "toolbar-segmentation-tools", never, { "activeDragMode": { "alias": "activeDragMode"; "required": false; }; "samModels": { "alias": "samModels"; "required": false; }; "samModelId": { "alias": "samModelId"; "required": false; }; "contributedTools": { "alias": "contributedTools"; "required": false; }; "toolModelIds": { "alias": "toolModelIds"; "required": false; }; }, { "segmentRegions": "segmentRegions"; "segmentCellpose": "segmentCellpose"; "toggleDragMode": "toggleDragMode"; "samModelChange": "samModelChange"; "runTool": "runTool"; "toolModelChange": "toolModelChange"; "openToolParams": "openToolParams"; }, never, never, true, never>;
87
+ }
@@ -0,0 +1,40 @@
1
+ import { EventEmitter } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ /** A stack-mode choice (`val` 'false' = single image, 'true' = stack). */
4
+ export interface StackOption {
5
+ name: string;
6
+ val: string;
7
+ }
8
+ /**
9
+ * The toolbar's z-stack group: a live slice scrubber for the views that swap
10
+ * slices in place, or (Plotly heatmap) the single-image / stack toggle with a
11
+ * slice-number field. Presentational: the host owns `zIndex`.
12
+ */
13
+ export declare class StackControlsComponent {
14
+ /** Show the live slice scrubber. */
15
+ liveScrubber: boolean;
16
+ /** Show the single-image / stack toggle (Plotly heatmap). */
17
+ stackToggle: boolean;
18
+ /** Stack mode is on (the toggle's state). */
19
+ showStack: boolean;
20
+ /** The two stack-mode choices of the toggle. */
21
+ stackOptions: StackOption[];
22
+ /** The current slice (0-based). */
23
+ zIndex: number;
24
+ /** The last slice index. */
25
+ maxIndex: number;
26
+ /** The live scrubber moved (fires while dragging). */
27
+ zScrub: EventEmitter<number | undefined>;
28
+ /** The live scrubber was released on a slice. */
29
+ zSlide: EventEmitter<number | undefined>;
30
+ /** A stack-mode choice was picked. */
31
+ selectStackOption: EventEmitter<StackOption>;
32
+ /** A slice number was typed (blank reports the current slice). */
33
+ zIndexInput: EventEmitter<number>;
34
+ /** Enter in the slice field / the reload button: re-plot at the typed slice. */
35
+ reloadAndPlot: EventEmitter<void>;
36
+ /** The slice field reports what was typed (blank keeps the current slice). */
37
+ protected onSliceInput(value: string | number | null): void;
38
+ static ɵfac: i0.ɵɵFactoryDeclaration<StackControlsComponent, never>;
39
+ static ɵcmp: i0.ɵɵComponentDeclaration<StackControlsComponent, "toolbar-stack-controls", never, { "liveScrubber": { "alias": "liveScrubber"; "required": false; }; "stackToggle": { "alias": "stackToggle"; "required": false; }; "showStack": { "alias": "showStack"; "required": false; }; "stackOptions": { "alias": "stackOptions"; "required": false; }; "zIndex": { "alias": "zIndex"; "required": false; }; "maxIndex": { "alias": "maxIndex"; "required": false; }; }, { "zScrub": "zScrub"; "zSlide": "zSlide"; "selectStackOption": "selectStackOption"; "zIndexInput": "zIndexInput"; "reloadAndPlot": "reloadAndPlot"; }, never, never, true, never>;
40
+ }
@@ -0,0 +1,21 @@
1
+ import { BehaviorSubject } from 'rxjs';
2
+ /**
3
+ * Status, busy flag and progress of a long-running (download / inference) tool,
4
+ * plus the re-entrancy guard that goes with them.
5
+ */
6
+ export declare class AsyncToolStatus {
7
+ /** Status text for a toast / spinner label. */
8
+ readonly status$: BehaviorSubject<string>;
9
+ /** True from the start of a run until it settles. */
10
+ readonly busy$: BehaviorSubject<boolean>;
11
+ /** Download progress: -1 = not downloading, 0..1 = downloading. */
12
+ readonly progress$: BehaviorSubject<number>;
13
+ get busy(): boolean;
14
+ /**
15
+ * Run `job` unless a run is already in flight (then resolve `undefined` at
16
+ * once). Busy is set *before* the first await — a model download is exactly
17
+ * the window a second press must not start another run in — and busy and
18
+ * progress are reset however the job ends.
19
+ */
20
+ run<T>(job: () => Promise<T>): Promise<T | undefined>;
21
+ }
@@ -0,0 +1,36 @@
1
+ import type { CanvasToolId } from '../../contracts/display-types';
2
+ import { CanvasToolHost, ICanvasTool } from './canvas-tool';
3
+ /**
4
+ * One backend's canvas tools. Each backend (Plotly, OpenSeadragon, napari-js)
5
+ * creates its own manager with its own {@link CanvasToolHost} and its own tool
6
+ * instances, so arming a tool never re-binds a tool another backend is using,
7
+ * and a backend switch never carries a stroke or SAM points across (RT-21).
8
+ * At most one tool is armed at a time.
9
+ */
10
+ export declare class CanvasToolManager {
11
+ private readonly host;
12
+ private readonly tools;
13
+ private active;
14
+ constructor(host: CanvasToolHost, tools: ReadonlyArray<ICanvasTool<never>>);
15
+ /** The armed tool's id, or null. */
16
+ get activeId(): CanvasToolId | null;
17
+ /** Whether this manager has a tool for `id`. */
18
+ has(id: string | null | undefined): id is CanvasToolId;
19
+ /** The tool with this id, typed by the caller. */
20
+ get<T extends ICanvasTool<never>>(id: CanvasToolId): T | undefined;
21
+ /**
22
+ * Arm `id` with `options`, disarming the armed tool first. null — or an id
23
+ * this manager has no tool for, such as a region draw mode — disarms only.
24
+ * Arming the armed tool again forwards `options` and keeps its work in progress.
25
+ */
26
+ activate(id: string | null, options?: unknown): void;
27
+ /** Disarm the armed tool, if any. */
28
+ deactivate(): void;
29
+ /** Forward live options to a tool, armed or not. */
30
+ setOptions(id: CanvasToolId, options: unknown): void;
31
+ /** Drop one tool's work in progress (it stays armed). */
32
+ reset(id: CanvasToolId): void;
33
+ /** Drop every tool's work in progress — after undo/redo or an image switch,
34
+ * where a stroke or prompt no longer matches the regions on screen. */
35
+ resetAll(): void;
36
+ }
@@ -0,0 +1,86 @@
1
+ import { IViewportHost, IRegionDataHost } from '../../contracts/coordinate-transform.contract';
2
+ import type { CanvasToolId } from '../../contracts/display-types';
3
+ import type { CachedFrame } from './frame-pixels';
4
+ /**
5
+ * The pixel readback a backend (Plotly, OpenSeadragon or napari-js) hands the
6
+ * canvas tools for sampling. Returned by {@link CanvasToolHost.getCachedImageData}.
7
+ */
8
+ export interface CachedImageData {
9
+ /**
10
+ * One frame per stack slice (length 1 for non-stack images): a nested `[y][x]`
11
+ * matrix (Plotly) or a packed RGBA readback (OpenSeadragon, napari-js). Read
12
+ * them through `framePixels()` (`tool-kit/frame-pixels`).
13
+ */
14
+ frames: CachedFrame[];
15
+ /** Image-pixel width of each frame matrix. */
16
+ width: number;
17
+ /** Image-pixel height of each frame matrix. */
18
+ height: number;
19
+ /**
20
+ * Data coords per matrix pixel: `[x, y]`. OSD and napari report distinct
21
+ * ratios for a non-square viewport; a single entry applies to both axes
22
+ * (see `MatrixFrame`).
23
+ */
24
+ ratios: number[];
25
+ /** Whether each nested frame is a 2-D scalar matrix (true) or 3-channel RGB
26
+ * (false). Packed frames always read as RGB. */
27
+ isGrayscale: boolean;
28
+ /**
29
+ * Data-coords of matrix pixel (0,0)'s top-left corner. Lets the matrix be a
30
+ * *crop* of the data space rather than starting at the origin — e.g. the OSD
31
+ * backend samples the currently rendered viewport, so when zoomed in the matrix
32
+ * covers only the visible sub-region at screen resolution. Defaults to 0.
33
+ * matrix = (data - origin) / ratio, and matrix pixel (i, j) covers
34
+ * `[i, i + 1) × [j, j + 1)` on every backend: a click floors to its pixel, and
35
+ * traced outlines run along pixel edges.
36
+ */
37
+ originX?: number;
38
+ originY?: number;
39
+ }
40
+ /**
41
+ * Everything a canvas tool needs from the backend it runs on — one interface
42
+ * for every tool (it replaces the wand's, the vertex eraser's and the
43
+ * zoom-to-box's own host types). Keeping it explicit keeps the dependency
44
+ * one-way: the tools never import a backend.
45
+ */
46
+ export interface CanvasToolHost extends IViewportHost, IRegionDataHost {
47
+ /** Pixel data for sampling, and the data↔matrix frame. null when no image is loaded yet. */
48
+ getCachedImageData(): CachedImageData | null;
49
+ /** Index of the currently visible frame in a stack (0 for non-stack). */
50
+ getActiveFrameIndex(): number;
51
+ /** Current image's filename — stamped onto new shapes for filtering. */
52
+ getFileName(): string | undefined;
53
+ /** Default stroke colour for new shapes. */
54
+ getShapeColor(): string;
55
+ /**
56
+ * Zoom-to-box: an overlay-pixel point (relative to the overlay container's
57
+ * top-left) in the backend's data coordinates.
58
+ */
59
+ pixelToData?(px: number, py: number): {
60
+ x: number;
61
+ y: number;
62
+ };
63
+ /**
64
+ * Zoom-to-box: apply the selected rectangle, ordered `[xMin, xMax, yMax, yMin]`.
65
+ * Plotly re-fetches or relayouts its axes; OpenSeadragon and napari-js fit the
66
+ * view to the image rectangle.
67
+ */
68
+ applyZoomToBox?(dataBox: number[]): void;
69
+ }
70
+ /**
71
+ * An on-canvas tool (wand, brush, vertex eraser, zoom-to-box, SAM point). One
72
+ * instance per backend, owned by that backend's `CanvasToolManager`, so no
73
+ * in-progress state (a stroke, SAM points) is shared between backends.
74
+ */
75
+ export interface ICanvasTool<O = unknown> {
76
+ readonly id: CanvasToolId;
77
+ /** Arm the tool on `host` (lay its overlay over the plot). Arming the armed
78
+ * tool again only applies `options`; it keeps the work in progress. */
79
+ activate(host: CanvasToolHost, options?: O): void;
80
+ /** Remove the overlay and drop the work in progress. */
81
+ deactivate(): void;
82
+ /** Live option updates (also while disarmed: they apply to the next arming). */
83
+ setOptions?(options: O): void;
84
+ /** Drop the work in progress but stay armed (undo/redo, image switch). */
85
+ reset?(): void;
86
+ }