@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,64 +1,57 @@
1
- import { WandService } from '../wand/wand.service';
2
- import { IViewportHost, IRegionDataHost } from '../../contracts/coordinate-transform.contract';
3
- import * as i0 from "@angular/core";
1
+ import { IVertexEraserOptions } from '../../contracts/display-types';
2
+ import { UndoGestureTarget } from '../tool-kit/undo-gesture';
3
+ import { CanvasToolHost, ICanvasTool } from '../tool-kit/canvas-tool';
4
4
  /**
5
- * Collaboration interface the vertex eraser needs from its host backend.
6
- *
7
- * Extends {@link IViewportHost} for coordinate conversion + overlay attachment,
8
- * so the eraser is backend-agnostic (Plotly and OpenSeadragon both satisfy it).
5
+ * @deprecated One host serves every canvas tool: use {@link CanvasToolHost}.
6
+ * The eraser converts with its readback's per-axis ratios
7
+ * (`getCachedImageData().ratios`, RT-14); `getCachedImageRatio()` is gone.
9
8
  */
10
- export interface VertexEraserToolHost extends IViewportHost, IRegionDataHost {
11
- /**
12
- * Drop the wand's in-progress stroke. Called after the eraser modifies
13
- * regions — the wand's accumulator may now reference stale vertices.
14
- */
15
- invalidateWandRegion(): void;
16
- /**
17
- * Data-coords-per-image-pixel ratio (== cachedImageRatios[0] || 1). Used to
18
- * convert between matrix coordinates (the eraser's native space) and the
19
- * backend's data coordinates.
20
- */
21
- getCachedImageRatio(): number;
22
- }
9
+ export type VertexEraserToolHost = CanvasToolHost;
23
10
  /**
24
11
  * Vertex eraser. A custom canvas overlay that, on click/drag, removes any
25
12
  * polygon vertex within `radius` matrix-pixels of the cursor from every
26
- * `type: 'path'` shape on the plot. Polygons that fall below 3 vertices
27
- * (or polylines below 2) are removed entirely.
13
+ * annotation polygon/polyline (never an intensity-profile line). The outline is
14
+ * rejoined where it crosses the eraser's edge, so erasing a corner of a sparse
15
+ * outline (a traced box is four vertices) trims that corner instead of cutting
16
+ * to the next corners; a Bezier region's anchors are dropped outright. Polygons
17
+ * that fall below 3 vertices (or polylines below 2) are removed entirely.
28
18
  *
29
19
  * The cursor is rendered as a dashed-red circle on the overlay so the user
30
20
  * can see the active radius while moving.
31
21
  */
32
- export declare class VertexEraserToolService {
33
- private wandService;
22
+ export declare class VertexEraserTool implements ICanvasTool<IVertexEraserOptions> {
23
+ readonly id = "eraseVertex";
34
24
  private host;
35
- private overlay;
25
+ private readonly overlay;
36
26
  private dragging;
37
27
  /** Eraser radius in image-pixel (matrix) coordinates. */
38
28
  private radius;
39
29
  private cursor;
40
- private readonly boundMouseDown;
41
- private readonly boundMouseMove;
42
- private readonly boundMouseUp;
43
- constructor(wandService: WandService);
44
- bindHost(host: VertexEraserToolHost): void;
45
- setMode(active: boolean): void;
30
+ /** Makes each drag one undo step, however long the user pauses (RT-12). */
31
+ private readonly gesture;
32
+ /** @param gestureTarget the region store, so each drag is one undo step. */
33
+ constructor(gestureTarget?: UndoGestureTarget | null);
34
+ /** Arm the eraser on `host`, optionally with a new radius. */
35
+ activate(host: CanvasToolHost, options?: IVertexEraserOptions): void;
36
+ /** Disarm: remove the overlay and its cursor. */
37
+ deactivate(): void;
38
+ setOptions(options: IVertexEraserOptions): void;
46
39
  /** Set eraser radius in matrix-pixel (image pixel) coordinates. */
47
40
  setRadius(radius: number): void;
48
41
  private createOverlay;
49
- private destroyOverlay;
50
- private onMouseDown;
51
- private onMouseMove;
52
- private onMouseUp;
42
+ private onPointerDown;
43
+ private onPointerMove;
44
+ private onPointerUp;
53
45
  private updateCursor;
54
46
  /** Draw the eraser radius circle at the current cursor position. */
55
47
  private drawCursor;
48
+ /** The data↔matrix frame of the host's readback (identity without one). */
49
+ private frame;
56
50
  /**
57
- * Drop every vertex of every path-shape that lies within the eraser's
58
- * radius of the cursor. Polygons reduced below 3 vertices (or polylines
59
- * below 2) are removed entirely.
51
+ * Drop every vertex of every annotation polygon/polyline that lies within the
52
+ * eraser's radius of the cursor, rejoining the outline at the eraser's edge
53
+ * (see {@link eraseRingWithinRadius}). Polygons reduced below 3 vertices (or
54
+ * polylines below 2) are removed entirely. Edited regions keep their metadata.
60
55
  */
61
56
  private applyAtClient;
62
- static ɵfac: i0.ɵɵFactoryDeclaration<VertexEraserToolService, never>;
63
- static ɵprov: i0.ɵɵInjectableDeclaration<VertexEraserToolService>;
64
57
  }
@@ -0,0 +1,54 @@
1
+ import { EventEmitter } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ * The toolbar's view group: 2D zoom / pan tools, or for a 3D view the camera
5
+ * modes and reset, the napari axes and wireframe toggles and the 3D
6
+ * resolution. Presentational: the host owns every value.
7
+ */
8
+ export declare class ViewControlsComponent {
9
+ /** A 2D view (zoom tools) rather than a 3D one (camera controls). */
10
+ isHeatmap: boolean;
11
+ /** The host shows the zoom tools. */
12
+ zoomTools: boolean;
13
+ /** The OSD Image view (pans natively; no Plotly drag-zoom). */
14
+ isImageView: boolean;
15
+ /** The armed zoom/pan tool (`zoom`, `pan`, …), or null. */
16
+ activeDragMode: string | null;
17
+ /** The 3D camera mode (`turntable` / `orbit` / …). */
18
+ activeSurface3dMode: string;
19
+ /** A napari-js WebGPU view (axes toggle, napari camera). */
20
+ isNapariMode: boolean;
21
+ /** The napari-js surface (shows the wireframe toggle). */
22
+ isNapariSurfaceMode: boolean;
23
+ /** A napari-js 3D view (shows the Resolution dropdown). */
24
+ isNapari3dMode: boolean;
25
+ /** The napari 3D axes gizmo is shown. */
26
+ axesVisible: boolean;
27
+ /** The napari surface wireframe is on. */
28
+ wireframeActive: boolean;
29
+ /** Active napari 3D decimate factor (1 = Full … 8 = ⅛). */
30
+ resolutionScale: number;
31
+ /** A zoom/pan tool button was clicked (its mode). */
32
+ toggleDragMode: EventEmitter<string>;
33
+ /** Zoom in one step. */
34
+ zoomIn: EventEmitter<void>;
35
+ /** Zoom out one step. */
36
+ zoomOut: EventEmitter<void>;
37
+ /** A 3D camera mode button was clicked (its mode). */
38
+ toggleSurface3dMode: EventEmitter<string>;
39
+ /** Reset the 3D camera. */
40
+ resetSurfaceCamera: EventEmitter<void>;
41
+ /** Toggle the napari 3D axes gizmo. */
42
+ toggleAxes: EventEmitter<void>;
43
+ /** Toggle the napari surface wireframe. */
44
+ toggleWireframe: EventEmitter<void>;
45
+ /** A napari 3D decimate factor was picked. */
46
+ selectResolution: EventEmitter<number>;
47
+ /** Decimate-factor options for the Resolution dropdown. */
48
+ protected readonly decimateOptions: {
49
+ label: string;
50
+ value: number;
51
+ }[];
52
+ static ɵfac: i0.ɵɵFactoryDeclaration<ViewControlsComponent, never>;
53
+ static ɵcmp: i0.ɵɵComponentDeclaration<ViewControlsComponent, "toolbar-view-controls", never, { "isHeatmap": { "alias": "isHeatmap"; "required": false; }; "zoomTools": { "alias": "zoomTools"; "required": false; }; "isImageView": { "alias": "isImageView"; "required": false; }; "activeDragMode": { "alias": "activeDragMode"; "required": false; }; "activeSurface3dMode": { "alias": "activeSurface3dMode"; "required": false; }; "isNapariMode": { "alias": "isNapariMode"; "required": false; }; "isNapariSurfaceMode": { "alias": "isNapariSurfaceMode"; "required": false; }; "isNapari3dMode": { "alias": "isNapari3dMode"; "required": false; }; "axesVisible": { "alias": "axesVisible"; "required": false; }; "wireframeActive": { "alias": "wireframeActive"; "required": false; }; "resolutionScale": { "alias": "resolutionScale"; "required": false; }; }, { "toggleDragMode": "toggleDragMode"; "zoomIn": "zoomIn"; "zoomOut": "zoomOut"; "toggleSurface3dMode": "toggleSurface3dMode"; "resetSurfaceCamera": "resetSurfaceCamera"; "toggleAxes": "toggleAxes"; "toggleWireframe": "toggleWireframe"; "selectResolution": "selectResolution"; }, never, never, true, never>;
54
+ }
@@ -0,0 +1,49 @@
1
+ import { Polygon } from '../../models/region';
2
+ import { IWandOptions, WandType } from '../../contracts/display-types';
3
+ import { CachedFrame } from '../tool-kit/frame-pixels';
4
+ /**
5
+ * Wand region-grow pipeline (pure, DOM- and DI-free), modelled after QuPath's
6
+ * WandToolEventHandler: extract a square patch around the click, optionally
7
+ * blur it, compute a local threshold (per channel, or a CIELAB distance map),
8
+ * run a fixed-range flood fill from the centre, close the mask, and (for
9
+ * {@link computeWandRegion}) trace it to a polygon in image coordinates.
10
+ *
11
+ * `WandService` delegates here; workers and new code should import these
12
+ * functions directly.
13
+ */
14
+ export type { WandType };
15
+ export type WandOptions = IWandOptions;
16
+ export interface WandImage {
17
+ /**
18
+ * Grayscale: number[][] where data[y][x] is intensity.
19
+ * RGB: [r,g,b][][] where data[y][x] is a 3-tuple.
20
+ * Or a packed RGBA readback, read as RGB (see `tool-kit/frame-pixels`).
21
+ */
22
+ data: CachedFrame;
23
+ width: number;
24
+ height: number;
25
+ isGrayscale: boolean;
26
+ }
27
+ /** A wand patch mask: `size`×`size` 0/1 cells in patch-local coordinates. */
28
+ export interface WandPatchMask {
29
+ mask: Uint8Array;
30
+ size: number;
31
+ }
32
+ /**
33
+ * Grow a region from a click and trace it.
34
+ *
35
+ * @param image full-image pixel matrix (already in memory).
36
+ * @param cx click x in image-pixel coordinates.
37
+ * @param cy click y in image-pixel coordinates.
38
+ * @param options wand parameters; missing fields fall back to defaults.
39
+ * @returns a Polygon in image-pixel coordinates, or null if no region grew.
40
+ */
41
+ export declare function computeWandRegion(image: WandImage, cx: number, cy: number, options?: WandOptions): Polygon | null;
42
+ /**
43
+ * The wand's per-click flood-fill mask in patch-local coordinates: the same
44
+ * pipeline as {@link computeWandRegion}, stopping before contour tracing (the
45
+ * tools accumulate per-tick masks across a brush-style stroke).
46
+ *
47
+ * @throws when `options.patchSize` is even.
48
+ */
49
+ export declare function computeWandPatchMask(image: WandImage, cx: number, cy: number, options?: WandOptions): WandPatchMask | null;
@@ -1,98 +1,49 @@
1
1
  import { WandOptions, WandService } from './wand.service';
2
- import { IViewportHost, IRegionDataHost } from '../../contracts/coordinate-transform.contract';
3
- import * as i0 from "@angular/core";
2
+ import { UndoGestureTarget } from '../tool-kit/undo-gesture';
3
+ import { CanvasToolHost, ICanvasTool } from '../tool-kit/canvas-tool';
4
+ export type { CachedImageData } from '../tool-kit/canvas-tool';
5
+ /** @deprecated One host serves every canvas tool: use {@link CanvasToolHost}. */
6
+ export type WandToolHost = CanvasToolHost;
4
7
  /**
5
- * The pixel data and frame state PlotlyService caches for sampling. Returned
6
- * by `WandToolHost.getCachedImageData()`.
7
- */
8
- export interface CachedImageData {
9
- /** 2-D matrices, one per stack frame (length 1 for non-stack images). */
10
- frames: any[];
11
- /** Image-pixel width of each frame matrix. */
12
- width: number;
13
- /** Image-pixel height of each frame matrix. */
14
- height: number;
15
- /**
16
- * Plot-data-coords-per-image-pixel along x (and y — they're the same
17
- * for heatmap and image traces).
18
- */
19
- ratios: number[];
20
- /** Whether each frame is a 2-D scalar matrix (true) or 3-channel RGB (false). */
21
- isGrayscale: boolean;
22
- /**
23
- * Data-coords of matrix pixel (0,0). Lets the matrix be a *crop* of the data
24
- * space rather than starting at the origin — e.g. the OSD backend samples the
25
- * currently rendered viewport, so when zoomed in the matrix covers only the
26
- * visible sub-region at screen resolution. Defaults to 0 (full-frame matrix,
27
- * as Plotly provides). matrixIndex = (data - origin) / ratio.
28
- */
29
- originX?: number;
30
- originY?: number;
31
- }
32
- /**
33
- * The collaboration interface the wand tool needs from PlotlyService.
8
+ * The wand drawing tool. Owns its pointer overlay and stroke accumulator
9
+ * (shared with the brush, see {@link MaskStrokeEditor}). Reads/writes regions
10
+ * via its {@link CanvasToolHost} so it stays decoupled from the backends.
34
11
  *
35
- * Keeping it explicit makes the dependency one-way: WandToolService never
36
- * imports PlotlyService directly. PlotlyService satisfies this interface
37
- * structurally and binds itself via `bindHost(this)`.
12
+ * A plain class: each backend's `CanvasToolManager` owns one instance and arms
13
+ * it with `activate(host, options)` / `deactivate()`.
38
14
  */
39
- export interface WandToolHost extends IViewportHost, IRegionDataHost {
40
- /** Pixel data for sampling. null when no image is loaded yet. */
41
- getCachedImageData(): CachedImageData | null;
42
- /** Index of the currently visible frame in a stack (0 for non-stack). */
43
- getActiveFrameIndex(): number;
44
- /** Current image's filename — stamped onto new shapes for filtering. */
45
- getFileName(): string | undefined;
46
- /** Default stroke colour for new shapes. */
47
- getShapeColor(): string;
48
- }
49
- /**
50
- * The wand drawing tool. Owns its own canvas overlay, mouse handlers, and
51
- * stroke accumulator. Reads/writes the shape list via the WandToolHost
52
- * interface so it stays decoupled from PlotlyService internals.
53
- *
54
- * Lifecycle: PlotlyService injects this service, calls `bindHost(this)` once
55
- * during its own construction, then calls `setMode(true | false, options)` to
56
- * activate/deactivate the tool.
57
- */
58
- export declare class WandToolService {
59
- private wandService;
15
+ export declare class WandTool implements ICanvasTool<WandOptions> {
16
+ private readonly wandService;
17
+ readonly id = "wand";
60
18
  private host;
61
- private overlay;
62
- private active;
19
+ private readonly overlay;
63
20
  /**
64
- * Accumulated wand region. Every per-tick patch mask is OR'd into `mask`
65
- * over a bbox that grows with the stroke, so the region keeps expanding
66
- * as the user drags. The accumulator persists across mouseup/mousedown so
67
- * that subsequent strokes extend the *same* region — matching QuPath's
68
- * brush behaviour where the active annotation stays editable until the
69
- * user switches tool.
21
+ * Accumulated wand region. Every per-tick patch mask is OR'd into the stroke
22
+ * over a bbox that grows with the stroke, so the region keeps expanding as
23
+ * the user drags. The accumulator persists across mouseup/mousedown so that
24
+ * subsequent strokes extend the *same* region — matching QuPath's brush
25
+ * behaviour where the active annotation stays editable until the user
26
+ * switches tool.
70
27
  */
71
- private stroke;
72
- /** Id of the region this wand stroke is editing (null = a fresh region). */
73
- private strokeRegionId;
74
- /** Readback ratio/origin signature the active stroke's matrix coords are tied to; a change
75
- * (zoom/pan) invalidates the stroke so it isn't re-committed at a different scale (jit-ui#102). */
76
- private strokeRatioSig;
28
+ private readonly editor;
77
29
  private dragging;
78
30
  private options;
79
- private readonly boundMouseDown;
80
- private readonly boundMouseMove;
81
- private readonly boundMouseUp;
82
- constructor(wandService: WandService);
83
- /** Wire the tool to its host. Must be called once before `setMode(true)`. */
84
- bindHost(host: WandToolHost): void;
85
- /** Toggle the wand on/off. */
86
- setMode(active: boolean, options?: WandOptions): void;
31
+ /** Makes each drag one undo step, however long the user pauses (RT-12). */
32
+ private readonly gesture;
33
+ /** @param gestureTarget the region store, so each drag is one undo step. */
34
+ constructor(wandService: WandService, gestureTarget?: UndoGestureTarget | null);
35
+ /** Arm the wand on `host` with `options` (replacing the previous options). */
36
+ activate(host: CanvasToolHost, options?: WandOptions): void;
37
+ /** Disarm: remove the overlay and drop the active region. */
38
+ deactivate(): void;
87
39
  /** Merge new options (e.g. live sensitivity slider updates). */
88
40
  setOptions(options: WandOptions): void;
89
41
  /** Drop the active wand region so the next click starts a new one. */
90
- clearActiveRegion(): void;
42
+ reset(): void;
91
43
  private createOverlay;
92
- private destroyOverlay;
93
- private onMouseDown;
94
- private onMouseMove;
95
- private onMouseUp;
44
+ private onPointerDown;
45
+ private onPointerMove;
46
+ private onPointerUp;
96
47
  private resetStroke;
97
48
  /**
98
49
  * Sample the cached image at the click location, OR (or AND-NOT) the
@@ -102,48 +53,12 @@ export declare class WandToolService {
102
53
  * exact-match flood fill.
103
54
  */
104
55
  private applyAtClient;
105
- /** True if (matrixX, matrixY) lies inside the current stroke accumulator. */
106
- private pointInStroke;
107
- /**
108
- * Remove the region referenced by `strokeRegionId` from the region list and
109
- * reset the active stroke — used when an erase stroke deletes every pixel.
110
- */
111
- private dropActiveShape;
112
- /**
113
- * Whether a region can be faithfully rasterized into the wand stroke at the current view
114
- * resolution (rx/ry = data units per matrix pixel). Editing rasterizes the region to the
115
- * viewport grid and re-traces it, so a region whose matrix-space bbox exceeds the rasterizer's
116
- * cap would be clipped/down-quantized and come back rescaled/corrupted (jit-ui#102) — e.g. a
117
- * whole-slide annotation while zoomed out. Skip adopt/merge for those: leave them untouched and
118
- * only edit them near native zoom.
119
- */
120
- private fitsForEdit;
121
- /** A region's closed-polygon vertices (image/data coords), or null when it
122
- * isn't a fillable closed polygon (rectangles, open polylines). */
123
- private regionVerts;
124
- /** Convert a region's hole rings from image/data coords into matrix coords so
125
- * they line up with the stroke accumulator (jit-ui#85). */
126
- private holesToMatrix;
127
- /**
128
- * If (matrixX, matrixY) falls inside an existing region, rasterize it into
129
- * the wand stroke accumulator so subsequent wand input extends it rather than
130
- * starting a new region.
131
- */
132
- private tryAdoptShapeAt;
133
- /**
134
- * Iterate every region; if its rasterized mask overlaps the wand stroke mask
135
- * by at least one pixel, OR it into the stroke and remove it from the list.
136
- * Called every tick so chained merges resolve. If the wand has no region id
137
- * yet, the merged region's id is adopted so the merged region replaces it.
138
- */
139
- private mergeOverlappingShapes;
56
+ /** The visible frame of the readback, as the region grow reads it. */
57
+ private wandImage;
140
58
  /**
141
- * Commit the in-progress polygon as a region — a new region on the first tick
142
- * of a stroke, or an in-place replacement of the active region on later ticks
143
- * — then ask the host to render. The store mints an id on the first commit,
144
- * which we adopt so subsequent ticks replace the same region.
59
+ * OR (add) or AND-NOT (erase) the patch mask, centred on matrix point
60
+ * (cx, cy), into the stroke, growing the stroke to cover it first when
61
+ * adding. False when a fresh stroke has nothing inside the readback.
145
62
  */
146
- private commitStroke;
147
- static ɵfac: i0.ɵɵFactoryDeclaration<WandToolService, never>;
148
- static ɵprov: i0.ɵɵInjectableDeclaration<WandToolService>;
63
+ private stampPatch;
149
64
  }
@@ -1,133 +1,39 @@
1
1
  import { Polygon } from '../../models/region';
2
- import { IWandOptions, WandType } from '../../contracts/display-types';
2
+ import { BBoxMask } from '../../geometry/raster';
3
+ import { WandImage, WandOptions, WandPatchMask } from './wand-region-grow';
3
4
  import * as i0 from "@angular/core";
4
- export type { WandType };
5
- export type WandOptions = IWandOptions;
6
- export interface WandImage {
7
- /**
8
- * Grayscale: number[][] where data[y][x] is intensity.
9
- * RGB: [r,g,b][][] where data[y][x] is a 3-tuple.
10
- */
11
- data: number[][] | number[][][];
12
- width: number;
13
- height: number;
14
- isGrayscale: boolean;
15
- }
5
+ export type { WandImage, WandOptions, WandPatchMask, WandType } from './wand-region-grow';
16
6
  /**
17
- * Wand region-growing tool, modelled after QuPath's WandToolEventHandler.
7
+ * Thin DI façade over the wand's pure modules, kept for one release so the
8
+ * injected consumers (the canvas tools, the backends) keep compiling.
9
+ *
10
+ * - region grow: `toolbar/wand/wand-region-grow`
11
+ * - rasterizer: `geometry/raster`; ring tests: `geometry/ring`
12
+ * - contour tracing: `geometry/contour`
18
13
  *
19
- * Given an image and a click position, extracts a square patch around the
20
- * click, optionally blurs it, computes a local threshold, runs a fixed-range
21
- * flood fill from the centre, closes the resulting mask, and returns the
22
- * traced contour as a polygon in image coordinates.
14
+ * @deprecated Import the pure functions instead; this service will be removed.
23
15
  */
24
16
  export declare class WandService {
25
- /**
26
- * @param image full-image pixel matrix (already in memory).
27
- * @param cx click x in image-pixel coordinates.
28
- * @param cy click y in image-pixel coordinates.
29
- * @param options wand parameters; missing fields fall back to defaults.
30
- * @returns a Polygon in image-pixel coordinates, or null if no region grew.
31
- */
17
+ /** See {@link computeWandRegion} in `toolbar/wand/wand-region-grow`. */
32
18
  computeRegion(image: WandImage, cx: number, cy: number, options?: WandOptions): Polygon | null;
33
- /**
34
- * Compute the wand's per-click flood-fill mask in patch-local coordinates.
35
- * Same algorithm as `computeRegion` but stops before contour tracing — useful
36
- * for accumulating per-tick masks across a brush-style stroke.
37
- *
38
- * @returns mask of size W*W (0/1) plus W, or null if patchSize is invalid.
39
- */
40
- computePatchMask(image: WandImage, cx: number, cy: number, options?: WandOptions): {
41
- mask: Uint8Array;
42
- size: number;
43
- } | null;
44
- /**
45
- * Standard ray-cast point-in-polygon test. (px, py) and the polygon
46
- * vertices must be in the same coordinate system.
47
- */
19
+ /** See {@link computeWandPatchMask} in `toolbar/wand/wand-region-grow`. */
20
+ computePatchMask(image: WandImage, cx: number, cy: number, options?: WandOptions): WandPatchMask | null;
21
+ /** Ray-cast point-in-ring test; see {@link pointInRing}. */
48
22
  pointInPolygon(px: number, py: number, xpoints: number[], ypoints: number[]): boolean;
49
- /**
50
- * Drop every vertex whose Euclidean distance to (cx, cy) is less than
51
- * `radius`. Returns trimmed parallel arrays plus how many vertices were
52
- * removed (so the caller can detect a no-op tick and skip the relayout).
53
- */
23
+ /** See {@link dropVerticesWithinRadius} in `geometry/ring`. */
54
24
  dropVerticesWithinRadius(xpoints: number[], ypoints: number[], cx: number, cy: number, radius: number): {
55
25
  xpoints: number[];
56
26
  ypoints: number[];
57
27
  removed: number;
58
28
  };
59
- /**
60
- * Rasterize a closed polygon into a bbox-relative mask suitable as a
61
- * starting point for a wand stroke accumulator.
62
- *
63
- * Returns the bbox origin (clamped to the image) plus the filled mask, or
64
- * null if the polygon is degenerate or fully outside the image.
65
- */
66
- rasterizePolygon(xpoints: number[], ypoints: number[], imageWidth: number, imageHeight: number, holes?: number[][][]): {
67
- bx: number;
68
- by: number;
69
- bw: number;
70
- bh: number;
71
- mask: Uint8Array;
72
- } | null;
73
- /**
74
- * Point-in-region test that honours interior rings (holes): inside the
75
- * exterior AND outside every hole (even-odd). Coordinates must share the
76
- * polygon's frame. With no holes this is exactly {@link pointInPolygon}.
77
- */
29
+ /** See {@link rasterizePolygon} in `geometry/raster`. */
30
+ rasterizePolygon(xpoints: number[], ypoints: number[], imageWidth: number, imageHeight: number, holes?: number[][][]): BBoxMask | null;
31
+ /** See {@link pointInPolygonWithHoles} in `geometry/ring`. */
78
32
  pointInPolygonWithHoles(px: number, py: number, xpoints: number[], ypoints: number[], holes?: number[][][]): boolean;
79
- /**
80
- * Trace the largest 4-connected blob in `mask` (sized w*h) and return a
81
- * Polygon translated into image-pixel coordinates via (originX, originY).
82
- * The traced vertices are NOT clamped to the image bounds: a region drawn while
83
- * panned/zoomed keeps its true coordinates even where they fall outside the visible
84
- * window (jit-ui#102). `imageWidth`/`imageHeight` are kept for signature compatibility
85
- * but no longer used.
86
- */
87
- maskToPolygon(mask: Uint8Array, w: number, h: number, _imageWidth: number, _imageHeight: number, originX: number, originY: number): Polygon | null;
88
- /**
89
- * Trace EVERY 4-connected blob in `mask` (sized w*h) whose area is at least
90
- * `minSize` pixels, returning one Polygon per blob in image-pixel coordinates
91
- * (translated via originX/originY, clamped to imageWidth/imageHeight), ordered
92
- * largest-first. Unlike {@link maskToPolygon} (largest blob only), this lets
93
- * the brush eraser split a region in two when a stroke cuts through it rather
94
- * than discarding the smaller piece.
95
- */
96
- maskToPolygons(mask: Uint8Array, w: number, h: number, imageWidth: number, imageHeight: number, originX: number, originY: number, minSize?: number, minHoleSize?: number): Polygon[];
97
- /**
98
- * Find interior rings (holes) of each foreground component in `mask`: a
99
- * 4-connected run of background (0) pixels that is fully enclosed — i.e. not
100
- * reachable from the grid border through background — is a hole, attributed to
101
- * the foreground component that borders it most. Returns `fgLabel → rings`,
102
- * each ring a list of `[x, y]` image-pixel pairs (same convention as a
103
- * polygon's `coordinates`). Holes smaller than `minHoleSize` are dropped.
104
- */
105
- private detectHoles;
106
- /**
107
- * Trace each instance in an integer label map (0 = background) into a Polygon
108
- * — used to turn a cellpose-style segmentation into region outlines. Labels
109
- * with area below `minSize` are skipped. Coords are translated via
110
- * originX/originY and clamped to imageWidth/imageHeight.
111
- */
112
- labelsToPolygons(labels: Uint32Array, w: number, h: number, imageWidth: number, imageHeight: number, originX: number, originY: number, minSize?: number): Polygon[];
113
- private extractPatch;
114
- private gaussianBlur;
115
- private perChannelThreshold;
116
- private labDistanceMap;
117
- /**
118
- * Fixed-range scanline flood fill from the patch centre. A neighbour is
119
- * accepted iff for every channel `|p[c] - seed[c]| <= threshold[c]`.
120
- */
121
- private floodFill;
122
- private morphClose;
123
- private dilate;
124
- private erode;
125
- /**
126
- * Returns the outer boundary of the largest 4-connected blob in the mask
127
- * sized w*h.
128
- */
129
- private traceContour;
130
- private mooreBoundary;
33
+ /** See {@link maskToPolygons} in `geometry/contour`. */
34
+ maskToPolygons(mask: Uint8Array, w: number, h: number, originX: number, originY: number, minSize?: number, minHoleSize?: number): Polygon[];
35
+ /** See {@link labelsToPolygons} in `geometry/contour`. */
36
+ labelsToPolygons(labels: Uint32Array, w: number, h: number, originX: number, originY: number, minSize?: number): Polygon[];
131
37
  static ɵfac: i0.ɵɵFactoryDeclaration<WandService, never>;
132
38
  static ɵprov: i0.ɵɵInjectableDeclaration<WandService>;
133
39
  }
@@ -1,49 +1,29 @@
1
- import * as i0 from "@angular/core";
1
+ import { CanvasToolHost, ICanvasTool } from '../tool-kit/canvas-tool';
2
2
  /**
3
- * Collaboration interface the zoom-to-box tool needs from PlotlyService.
3
+ * @deprecated One host serves every canvas tool: use {@link CanvasToolHost}.
4
+ * The overlay now attaches to `getOverlayContainer()` (formerly the element
5
+ * with id `getPlotDiv()`), and `pixelToData` / `applyZoomToBox` are its
6
+ * optional zoom-to-box members.
4
7
  */
5
- export interface ZoomToBoxToolHost {
6
- /** DOM id of the plot element the overlay canvas attaches to. */
7
- getPlotDiv(): string;
8
- /**
9
- * Convert an overlay-pixel point (relative to the plot element's top-left)
10
- * into the backend's data coordinates — Plotly axis data for Plotly,
11
- * image-pixel coords for OpenSeadragon. Keeps the tool backend-agnostic.
12
- */
13
- pixelToData(px: number, py: number): {
14
- x: number;
15
- y: number;
16
- };
17
- /**
18
- * Apply the user-selected zoom rectangle, ordered `[xMin, xMax, yMax, yMin]`.
19
- * The host decides what that means: Plotly does a high-def re-fetch / axis
20
- * relayout, OpenSeadragon fits the viewport to the image rectangle.
21
- */
22
- applyZoomToBox(coordinates: number[]): void;
23
- }
8
+ export type ZoomToBoxToolHost = CanvasToolHost;
24
9
  /**
25
10
  * Custom canvas overlay for click-and-drag rectangular zoom. Plotly's
26
11
  * built-in `dragmode: 'zoom'` works on heatmap/image traces too, but it
27
12
  * doesn't drive the high-def zoom pipeline — this overlay does, by handing
28
13
  * the selected coordinates back to the host.
29
14
  */
30
- export declare class ZoomToBoxToolService {
15
+ export declare class ZoomToBoxTool implements ICanvasTool<void> {
16
+ readonly id = "zoomToBox";
31
17
  private host;
32
- private overlay;
18
+ private readonly overlay;
33
19
  private startPx;
34
- private readonly boundMouseDown;
35
- private readonly boundMouseMove;
36
- private readonly boundMouseUp;
37
- constructor();
38
- bindHost(host: ZoomToBoxToolHost): void;
39
- setMode(active: boolean): void;
40
- private createOverlay;
41
- private destroyOverlay;
42
- private onMouseDown;
43
- private onMouseMove;
44
- private onMouseUp;
20
+ /** Lay the selection overlay over `host`'s plot. */
21
+ activate(host: CanvasToolHost): void;
22
+ /** Remove the overlay and any half-drawn box. */
23
+ deactivate(): void;
24
+ /** Primary button only (the overlay filters the others). */
25
+ private onPointerDown;
26
+ private onPointerMove;
27
+ private onPointerUp;
45
28
  private drawSelection;
46
- private clearCanvas;
47
- static ɵfac: i0.ɵɵFactoryDeclaration<ZoomToBoxToolService, never>;
48
- static ɵprov: i0.ɵɵInjectableDeclaration<ZoomToBoxToolService>;
49
29
  }
@@ -0,0 +1,11 @@
1
+ import { ChangeDetectorRef, NgZone } from '@angular/core';
2
+ /**
3
+ * Mark an OnPush view for check, from wherever the change came from.
4
+ *
5
+ * `markForCheck()` only flags the view; a change-detection pass runs when the zone next
6
+ * settles. A change that arrives outside the zone — a store emission from an overlay's
7
+ * pointer handler, an OpenSeadragon or napari-js callback, a host stream — settles no
8
+ * zone, so the view would keep showing stale state until some unrelated event runs
9
+ * change detection. Re-entering the zone in that case schedules the pass.
10
+ */
11
+ export declare function markForCheckInZone(cdr: ChangeDetectorRef, zone: NgZone): void;