@jax-data-science/sci-image-visualizer 0.8.2 → 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 +361 -4184
  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 -34430
  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 -878
  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
@@ -88,6 +88,7 @@ export interface SelectParamSpec {
88
88
  }[];
89
89
  tooltip?: string;
90
90
  }
91
+ /** One parameter a dialog tool asks for, discriminated by `type`. */
91
92
  export type ToolParamSpec = NumberParamSpec | BooleanParamSpec | SelectParamSpec;
92
93
  /** One selectable checkpoint. */
93
94
  export interface ToolModelOption {
@@ -2,14 +2,13 @@ import { InjectionToken } from '@angular/core';
2
2
  import { Observable } from 'rxjs';
3
3
  import { Image } from 'image-js';
4
4
  import { IImageInfo, IImageMetadata } from './image.contract';
5
- import { Region } from '../models/region';
5
+ import { Polygon, Region } from '../models/region';
6
6
  import { PlotType, PlotTypeDescriptor } from './plot-type';
7
7
  import { ViewerCapabilities } from './capabilities.contract';
8
8
  import { IRegionOverlay } from './region-overlay.contract';
9
9
  import { IHistogram } from './channel-histogram-api.contract';
10
- import { ColormapNode, IWandOptions, IBrushOptions, SpatialViewState, SpatialColorBy } from './display-types';
11
- import { CategoricalColumnMeta, SpatialDataset, SpatialEmbedding, SpatialMarkerGenes, SpatialTranscriptCounts } from './spatial-dataset.contract';
12
- import { SpatialSelectionMask } from '../spatial/spatial-selection';
10
+ import { CanvasToolOptions, ColormapNode, IWandOptions, IBrushOptions, SpatialViewState, SpatialColorBy } from './display-types';
11
+ import { CategoricalColumnMeta, SpatialDataset, SpatialEmbedding, SpatialMarkerGenes, SpatialSelectionMask, SpatialTranscriptCounts } from './spatial-dataset.contract';
13
12
  import type { PlotModeViewport } from './plot-type-contribution.contract';
14
13
  /**
15
14
  * Backend-neutral visualization contract. Plotly is one implementation;
@@ -19,10 +18,6 @@ import type { PlotModeViewport } from './plot-type-contribution.contract';
19
18
  *
20
19
  * Split into role interfaces so a consumer can depend only on the slice it
21
20
  * uses, then composed into `IVisualizer`.
22
- *
23
- * Types are intentionally permissive (`any` where the current Plotly service
24
- * is untyped) so `PlotlyService` satisfies the contract without a typing
25
- * rewrite — tightening is a follow-up, not part of standing the interface up.
26
21
  */
27
22
  /** Pixel readback shape returned by `getDisplayedPixelData`. */
28
23
  export interface PixelData {
@@ -45,37 +40,51 @@ export interface IntensityProfile {
45
40
  /** Colour of the line ROI — the inset trace is drawn in the same colour. */
46
41
  color?: string;
47
42
  }
43
+ /**
44
+ * What `IDataRenderer.load()` resolves to. Backend-specific beyond `filename`,
45
+ * which names the image the handle was loaded for: the host compares it with the
46
+ * image it asked for, to drop a handle a newer request has overtaken. Pass the
47
+ * handle on to `plot()` unchanged.
48
+ */
49
+ export interface LoadedImage {
50
+ readonly filename: string | undefined;
51
+ }
48
52
  /**
49
53
  * The render/viewport role: load data, render it (image or plot), and handle
50
54
  * zoom, stack navigation, and pixel readback.
51
55
  */
52
56
  export interface IDataRenderer {
53
- load(imageInfo: IImageInfo, zIndex: number): Promise<any>;
54
- /** `imageLoaded` is the backend-specific handle returned by `load()` —
55
- * treat it as opaque and pass it straight through. */
57
+ /** Fetch what {@link plot} needs for this image/slice. `signal` aborts when the
58
+ * host no longer wants the result (a newer image, Cancel, teardown); a backend
59
+ * may stop its network work then. Optional, and ignored by backends that do
60
+ * not support it yet. */
61
+ load(imageInfo: IImageInfo, zIndex: number, signal?: AbortSignal): Promise<LoadedImage>;
62
+ /** `imageLoaded` is the {@link LoadedImage} handle returned by `load()` (or null
63
+ * for a draw with no image) — pass it straight through. Resolves false when the
64
+ * backend could not draw (no plot target, no WebGPU, …). */
56
65
  plot(plotDiv: string, imageLoaded: unknown, imageInfo: IImageInfo, screenHeight: number, plotType: PlotType, inPlace?: boolean): Promise<boolean>;
57
66
  /** @deprecated Plotly-specific re-render; the OSD backend no-ops it. The host
58
67
  * re-drives `plot()` from its image stream instead. */
59
68
  reloadAndPlot(): void;
60
69
  reset(): void;
61
70
  relayout(trueImageSize?: number[]): void;
62
- /** @deprecated Plotly-specific (axis reset); the OSD backend no-ops it. Gate
63
- * on {@link ViewerCapabilities} before calling. */
71
+ /**
72
+ * Fit the whole image (or scene) into the view — every backend does: Plotly
73
+ * autoranges its axes, OpenSeadragon goes home, napari-js fits its camera. The
74
+ * backend then emits on {@link getAutoscaleEvent}.
75
+ */
76
+ fitToView(): void;
77
+ /** Reset the view to the image extent. Same intent as {@link fitToView}; kept for
78
+ * callers of the original name. */
64
79
  resetAxes(): void;
65
- /** @deprecated Plotly-specific (autoscale); the OSD backend no-ops it. Gate
66
- * on {@link ViewerCapabilities} before calling. */
80
+ /** @deprecated Use {@link fitToView} — the same operation under its backend-neutral name. */
67
81
  autoscale(): void;
68
82
  zoomIn(): void;
69
83
  zoomOut(): void;
70
84
  setDragMode(mode: string | false): void;
71
- /** Show/hide the overview navigator (the minimap). OpenSeadragon only — Plotly
72
- * no-ops it (it has no navigator). Applied when the viewer is (re)created, and
73
- * toggled live when one is already mounted. */
85
+ /** @deprecated Use `getOsdViewOptions().setNavigatorVisible()` on `IVisualizer`. */
74
86
  setNavigatorVisible(visible: boolean): void;
75
- /** Image smoothing (bilinear interpolation). `false` = nearest-neighbour, so
76
- * zooming past 1:1 shows crisp pixel blocks (pixel-level inspection).
77
- * OpenSeadragon only — Plotly no-ops it. Applied at viewer creation and live
78
- * (with a redraw) when one is mounted. */
87
+ /** @deprecated Use `getOsdViewOptions().setImageSmoothingEnabled()` on `IVisualizer`. */
79
88
  setImageSmoothingEnabled(enabled: boolean): void;
80
89
  setShowStack(showstack: boolean): void;
81
90
  setZIndex(zIndex: number): void;
@@ -113,17 +122,17 @@ export interface IDataRenderer {
113
122
  } | null;
114
123
  downloadImage(): void;
115
124
  setPlotType(plotType: PlotType): void;
116
- /** Set the napari 3D decimate factor (1 = full … 8 = ⅛). Optional — only the napari-js WebGPU
117
- * backend honors it; changing it re-loads the current 3D plot at the coarser/finer sampling. */
125
+ /** @deprecated Use `getVolumeResolution()?.set()` on `IVisualizer`. */
118
126
  setResolutionScale?(scale: number): void;
119
- /** The current napari 3D decimate factor (to initialize the Resolution control). Optional. */
127
+ /** @deprecated Use `getVolumeResolution()?.get()` on `IVisualizer` (this returns 1 without one). */
120
128
  getResolutionScale?(): number;
121
- /** @deprecated Use `getSurface3dControls()` — 3D scene controls only exist on
122
- * a backend that renders 3D plot types; this method silently no-ops on OSD. */
129
+ /** @deprecated Use `getSurface3dControls()?.setSurfaceDragMode()` — 3D scene controls
130
+ * only exist on a backend that renders 3D plot types; this silently no-ops on OSD. */
123
131
  setSurfaceDragMode(mode: string): void;
124
132
  /** @deprecated Use `getSurface3dControls()` — see {@link setSurfaceDragMode}. */
125
133
  resetSurfaceCamera(): void;
126
- getAutoscaleEvent(): Observable<any>;
134
+ /** Emits whenever the backend fits the view ({@link fitToView}). */
135
+ getAutoscaleEvent(): Observable<unknown>;
127
136
  /** Plot types this backend advertises (drives the UI selector). */
128
137
  getPlotTypeDescriptors(): PlotTypeDescriptor[];
129
138
  /** Intensity along the line ROIs; emits the full set as any line is added,
@@ -139,8 +148,10 @@ export interface IRegionStore {
139
148
  setRegions(regions: Region[], showRegionLabel?: boolean, isRegionSaveOn?: boolean, fillColor?: string, append?: boolean): void;
140
149
  /** Framework-neutral accessor — the canonical way to read current regions. */
141
150
  getRegions(): Region[];
142
- getRegionPolygons(): any[];
143
- getRegionUpdateEvent(): Observable<any[]>;
151
+ /** The current regions as polygons (rectangles expanded), for server requests. */
152
+ getRegionPolygons(): Polygon[];
153
+ /** Emits the region set whenever it changes. */
154
+ getRegionUpdateEvent(): Observable<Region[]>;
144
155
  setSelectedShapeIndices(indices: number[]): void;
145
156
  getSelectedShapeIndices$(): Observable<number[]>;
146
157
  /** Select a specific region (by identity), highlighting it on whichever
@@ -153,9 +164,6 @@ export interface IRegionStore {
153
164
  getFillColor(): string;
154
165
  getClassificationColors(): Map<string, string>;
155
166
  setClassificationColor(label: string, color: string): void;
156
- plotPreviousShapes(): void;
157
- setPreviousShapes(shapes: any[]): void;
158
- getPreviousShapes(): any[];
159
167
  /** Undo the most recent region action (jit-ui#85). Restores the region set to
160
168
  * the state before that action; up to a small fixed depth (10) is retained,
161
169
  * so it can be invoked up to 10 times in a row. No-op when nothing is left to
@@ -203,16 +211,29 @@ export interface IRegionStore {
203
211
  * Keyed by zero-based slice index; regions tagged with their z. */
204
212
  getStackSaveSlices(): Map<number, Region[]>;
205
213
  }
206
- /** On-canvas tool modes (wand, brush, vertex eraser, zoom-to-box). */
214
+ /** On-canvas tool modes (wand, brush, vertex eraser, zoom-to-box, SAM point). */
207
215
  export interface IToolController {
216
+ /**
217
+ * Arm one on-canvas tool (`CanvasToolId`) with its options — the wand's
218
+ * {@link IWandOptions}, the brush's {@link IBrushOptions} (`size` is the
219
+ * matrix-pixel diameter of the painted disc), the eraser's `{ radius }` —
220
+ * and disarm the one that was armed. `null`, or any id that is not a canvas
221
+ * tool (a region draw mode such as `'drawrect'`, `'pan'`), disarms only.
222
+ * Arming the armed tool again applies the options and keeps its work in
223
+ * progress.
224
+ */
225
+ setActiveTool(id: string | null, options?: CanvasToolOptions): void;
226
+ /** @deprecated Use `setActiveTool('wand', options)` / `setActiveTool(null)`. */
208
227
  setWandMode(active: boolean, options?: IWandOptions): void;
209
228
  setWandOptions(options: IWandOptions): void;
210
229
  clearActiveWandRegion(): void;
211
- /** Brush region tool. `size` (matrix-pixel diameter) sizes the painted disc. */
230
+ /** @deprecated Use `setActiveTool('brush', options)` / `setActiveTool(null)`. */
212
231
  setBrushMode(active: boolean, options?: IBrushOptions): void;
213
232
  setBrushOptions(options: IBrushOptions): void;
233
+ /** @deprecated Use `setActiveTool('eraseVertex', { radius })` / `setActiveTool(null)`. */
214
234
  setVertexEraserMode(active: boolean): void;
215
235
  setVertexEraserRadius(radius: number): void;
236
+ /** @deprecated Use `setActiveTool('zoomToBox')` / `setActiveTool(null)`. */
216
237
  setZoomToBoxMode(active: boolean): void;
217
238
  /** Box-prompted SAM segmentation: segment every rectangle region into masks.
218
239
  * Returns the number of mask regions added. (jit-ui#90) */
@@ -222,7 +243,8 @@ export interface IToolController {
222
243
  segmentRectanglesCellpose(): Promise<number>;
223
244
  /** Choose the registered SAM model the segment tools use (jit-ui#90 P1). */
224
245
  setSamModel(id: string): void;
225
- /** Toggle the interactive SAM point-prompt tool (click = +point, Shift = -). */
246
+ /** Toggle the interactive SAM point-prompt tool (click = +point, Shift = -).
247
+ * @deprecated Use `setActiveTool('samPoint')` / `setActiveTool(null)`. */
226
248
  setSamPointMode(active: boolean): void;
227
249
  /** Finalise / discard the in-progress SAM point object. */
228
250
  commitSamPoints(): void;
@@ -398,28 +420,19 @@ export interface IDisplayOptions {
398
420
  setColormap(colormap: ColormapNode): void;
399
421
  getColormapOptions(): ColormapNode[];
400
422
  getReverseScale(): Observable<boolean>;
401
- setReverseScale(reverscale: any): void;
402
- setImageMeta(imageMeta: IImageMetadata[]): void;
423
+ setReverseScale(reverse: boolean): void;
424
+ /** Publish the current image's metadata. `imageKey` (its file name) lets the
425
+ * channel state survive a re-plot of the same image but not a switch to another. */
426
+ setImageMeta(imageMeta: IImageMetadata[], imageKey?: string): void;
403
427
  getImageMeta(): Observable<IImageMetadata[]>;
404
428
  }
405
429
  /**
406
- * Intensity-profile sampling (PlotType.LINE). The sampling *source* lives in the
407
- * Plotly backend (it owns pixel readback); OpenSeadragon contributes only the
408
- * viewport-change signal that drives re-sampling at the current zoom. Each
409
- * backend implements the part it owns and no-ops the rest — mirroring the
410
- * deprecated no-op pattern on {@link IDataRenderer} — so the contract is uniform
411
- * and a consumer can depend on `IVisualizer` alone (no concrete-type reach-in).
430
+ * The part of intensity sampling a rendering backend owns: where its view settled.
431
+ * What `IViewerBackend.getIntensitySampling()` returns.
412
432
  */
413
- export interface IIntensitySampling {
414
- /** Populate the intensity-sampling cache for the current image/slice so the
415
- * line-ROI profiles have pixel data. Real on Plotly; no-op on OSD. */
416
- ensureIntensitySampling(imageInfo: IImageInfo, zIndex: number): Promise<void>;
417
- /** Re-sample the profiles from a fresh crop of the given image-pixel ROI at
418
- * display resolution. Real on Plotly; no-op on OSD. */
419
- refreshIntensitySamplingForRoi(x: number, y: number, width: number, height: number, zIndex: number): void;
433
+ export interface IIntensityViewportSource {
420
434
  /** Visible-region changes (image-pixel coords), emitted when the view settles,
421
- * so the inset can re-sample at the current zoom. Real on OSD; empty on Plotly
422
- * (its high-def zoom updates the sampling cache inline instead). */
435
+ * so the inset can re-sample at the current zoom. */
423
436
  getViewportChange$(): Observable<{
424
437
  x: number;
425
438
  y: number;
@@ -427,7 +440,51 @@ export interface IIntensitySampling {
427
440
  height: number;
428
441
  }>;
429
442
  }
430
- /** Composite contract a visualization backend implements. */
443
+ /**
444
+ * Intensity-profile sampling (the line ROIs' inset), from `IVisualizer.getIntensitySampling()`.
445
+ * The sampling itself is backend-neutral (the library's IntensityProfileService
446
+ * samples whatever image is on screen); the viewport-change signal comes from the
447
+ * backend that draws the image (OpenSeadragon and napari-js report it; Plotly
448
+ * re-samples its high-def zoom crops inline instead).
449
+ */
450
+ export interface IIntensitySampling extends IIntensityViewportSource {
451
+ /** Load the current image/slice's pixels so the line-ROI profiles have data
452
+ * (a backend with no frames of its own: OpenSeadragon, napari-js). */
453
+ ensureIntensitySampling(imageInfo: IImageInfo, zIndex: number): Promise<void>;
454
+ /** Re-sample the profiles from a fresh crop of the given image-pixel ROI at
455
+ * display resolution. */
456
+ refreshIntensitySamplingForRoi(x: number, y: number, width: number, height: number, zIndex: number): void;
457
+ }
458
+ /**
459
+ * The 2D view options of a tiled image viewer: the overview navigator and image
460
+ * smoothing. OpenSeadragon's, mirrored by napari-js's 2D views; Plotly has neither.
461
+ * Capability-gated: `IViewerBackend.getOsdViewOptions()` is null on a backend
462
+ * without them.
463
+ */
464
+ export interface IOsdViewOptions {
465
+ /** Show/hide the overview navigator (the minimap). Applied when the viewer is
466
+ * (re)created, and toggled live when one is already mounted. */
467
+ setNavigatorVisible(visible: boolean): void;
468
+ /** Image smoothing (bilinear interpolation). `false` = nearest-neighbour, so
469
+ * zooming past 1:1 shows crisp pixel blocks (pixel-level inspection). Applied
470
+ * at viewer creation and live (with a redraw) when one is mounted. */
471
+ setImageSmoothingEnabled(enabled: boolean): void;
472
+ }
473
+ /**
474
+ * The 3D decimate factor of a volume renderer (napari-js WebGPU): 1 = full
475
+ * resolution … 8 = ⅛ per axis. Capability-gated: null on a backend without one.
476
+ */
477
+ export interface IVolumeResolution {
478
+ /** The current factor (to initialize the Resolution control). */
479
+ get(): number;
480
+ /** Set the factor (rounded, at least 1). Takes effect on the next (re)load —
481
+ * the host re-plots after calling it, since it changes the fetched data. */
482
+ set(scale: number): void;
483
+ }
484
+ /**
485
+ * The host-facing composite contract, implemented by the router (`VISUALIZER`). A
486
+ * rendering backend implements {@link IViewerBackend} instead.
487
+ */
431
488
  export interface IVisualizer extends IDataRenderer, IRegionStore, IToolController, IDisplayOptions, IIntensitySampling {
432
489
  readonly capabilities: ViewerCapabilities;
433
490
  /** This backend's region renderer. May be null until a plot is mounted
@@ -443,6 +500,26 @@ export interface IVisualizer extends IDataRenderer, IRegionStore, IToolControlle
443
500
  * the capability-gated replacement for the deprecated top-level
444
501
  * `setSurfaceDragMode`/`resetSurfaceCamera`. */
445
502
  getSurface3dControls(): ISurface3dControls | null;
503
+ /** The navigator / image-smoothing options. Never null on the router: a setting
504
+ * applies to every backend that has them (OpenSeadragon, napari-js), so it can
505
+ * be set before the first render and survives a backend switch. */
506
+ getOsdViewOptions(): IOsdViewOptions;
507
+ /** The 3D decimate factor of the backend on screen, or null when it has none
508
+ * (only napari-js renders volumes). */
509
+ getVolumeResolution(): IVolumeResolution | null;
510
+ /** Intensity-profile sampling, whichever backend is on screen. */
511
+ getIntensitySampling(): IIntensitySampling;
512
+ /** @deprecated Use `getIntensitySampling().ensureIntensitySampling()`. */
513
+ ensureIntensitySampling(imageInfo: IImageInfo, zIndex: number): Promise<void>;
514
+ /** @deprecated Use `getIntensitySampling().refreshIntensitySamplingForRoi()`. */
515
+ refreshIntensitySamplingForRoi(x: number, y: number, width: number, height: number, zIndex: number): void;
516
+ /** @deprecated Use `getIntensitySampling().getViewportChange$()`. */
517
+ getViewportChange$(): Observable<{
518
+ x: number;
519
+ y: number;
520
+ width: number;
521
+ height: number;
522
+ }>;
446
523
  /** Spatial-omics controls when a `SPATIAL_DATA_PORT` is bound, else null.
447
524
  * Optional: only the routing service implements it, since the state is shared
448
525
  * rather than owned by any one backend. */
@@ -464,8 +541,98 @@ export interface IVisualizer extends IDataRenderer, IRegionStore, IToolControlle
464
541
  /** Export the underlying image data as a data-preserving multi-band TIFF
465
542
  * (native bit depth). No-op on backends that can't provide it. */
466
543
  exportData(): void;
544
+ /**
545
+ * The view is going away (the `<visualizer>` is destroyed): drop what is bound to
546
+ * it — the on-screen viewer, its render loop and view subscriptions — so nothing
547
+ * outlives the view. Service-lifetime state (stores, the backends' own store
548
+ * subscriptions) is untouched, so a later view on the same chain renders normally.
549
+ */
550
+ detach(): void;
551
+ /** @deprecated Use {@link detach}, which this delegates to. */
467
552
  unsubscribe(): void;
468
553
  }
554
+ /**
555
+ * What a rendering backend implements (Plotly, OpenSeadragon, napari-js): rendering,
556
+ * the viewport, pixel readback, export, loading state and its on-canvas tools, plus
557
+ * capability-gated getters for what only some backends have.
558
+ *
559
+ * It is the backend-facing half of {@link IVisualizer}. Region and display state are
560
+ * not here: they live in the shared `RegionStore` / `VisualizerStore`, which the router
561
+ * serves to hosts directly; a backend draws them by subscribing to the stores' events.
562
+ * Hosts keep depending on `IVisualizer` (the router's composite), never on a backend.
563
+ */
564
+ export interface IViewerBackend extends IToolController {
565
+ readonly capabilities: ViewerCapabilities;
566
+ load(imageInfo: IImageInfo, zIndex: number, signal?: AbortSignal): Promise<LoadedImage>;
567
+ plot(plotDiv: string, imageLoaded: unknown, imageInfo: IImageInfo, screenHeight: number, plotType: PlotType, inPlace?: boolean): Promise<boolean>;
568
+ reset(): void;
569
+ relayout(trueImageSize?: number[]): void;
570
+ /** The view is going away: release what is bound to it. */
571
+ detach(): void;
572
+ /** Stop streaming frames (volume assembly / surface preload). Optional: only
573
+ * backends that stream a z-stack do work here. */
574
+ cancelLoading?(): void;
575
+ zoomIn(): void;
576
+ zoomOut(): void;
577
+ setDragMode(mode: string | false): void;
578
+ fitToView(): void;
579
+ /** @see IDataRenderer.resetAxes */
580
+ resetAxes(): void;
581
+ setZIndex(zIndex: number): void;
582
+ setShowStack(showstack: boolean): void;
583
+ /** Emits whenever the backend fits the view. */
584
+ getAutoscaleEvent(): Observable<unknown>;
585
+ isStackLoading(): Observable<boolean>;
586
+ getStackLoadingProgress(): Observable<number>;
587
+ getTrueImageSize(): {
588
+ width: number;
589
+ height: number;
590
+ } | null;
591
+ getCurrentImage(): Promise<Image | null>;
592
+ getDisplayedPixelData(): PixelData | null;
593
+ getDisplayedSourceRect(): {
594
+ x: number;
595
+ y: number;
596
+ width: number;
597
+ height: number;
598
+ } | null;
599
+ getHistogram(channelIndex: number, bins: number): IHistogram | null;
600
+ getHistogram$(channelIndex: number, bins: number): Observable<IHistogram | null>;
601
+ downloadImage(): void;
602
+ exportComposite(): void;
603
+ exportData(): void;
604
+ getRegionOverlay(): IRegionOverlay | null;
605
+ getIsosurfaceControls(): IIsosurfaceControls | null;
606
+ getSurface3dControls(): ISurface3dControls | null;
607
+ getIntensityControls(): IIntensityControls | null;
608
+ getPlotModeViewport?(): PlotModeViewport | null;
609
+ /** Navigator / image smoothing, or null when the backend has neither (Plotly). */
610
+ getOsdViewOptions(): IOsdViewOptions | null;
611
+ /** The 3D decimate factor, or null when the backend renders no volumes. */
612
+ getVolumeResolution(): IVolumeResolution | null;
613
+ /** Where the view settled, for the intensity inset's re-sampling; null when the
614
+ * backend re-samples on its own (Plotly's high-def zoom). The sampling itself is
615
+ * the router's (IntensityProfileService). */
616
+ getIntensitySampling(): IIntensityViewportSource | null;
617
+ }
618
+ /**
619
+ * What a mounted `<visualizer>` hands its host through
620
+ * `ImageStatePort.setDiagram()` — a small, typed surface rather than the component
621
+ * itself, whose every public member would otherwise be de-facto API. Cleared
622
+ * (`setDiagram(null)`) when the visualizer is destroyed. Hosts that can inject
623
+ * {@link VISUALIZER} / `REGION_EDITOR_API` directly need not use it at all.
624
+ */
625
+ export interface VisualizerHandle {
626
+ /** The visualizer chain this `<visualizer>` renders through. */
627
+ readonly visualizer: IVisualizer;
628
+ /** @deprecated Use {@link visualizer}. Kept for hosts that read the component's
629
+ * former `plotService` field off the registered object. */
630
+ readonly plotService: IVisualizer;
631
+ /** Whether any region (annotation or intensity line) exists on the current image. */
632
+ hasRegions(): boolean;
633
+ /** The current regions as polygons, for a server request (crop / processing). */
634
+ getRegionPolygons(): Polygon[];
635
+ }
469
636
  /**
470
637
  * DI token for the active visualization backend. Bind it (`useExisting`) to the
471
638
  * `RoutingVisualizerService`, which selects Plotly vs OpenSeadragon per plot
@@ -22,4 +22,5 @@ export interface VizConfig {
22
22
  */
23
23
  useNapariRenderer?: boolean;
24
24
  }
25
+ /** DI token for the host's {@link VizConfig}. Required by the router. */
25
26
  export declare const VIZ_CONFIG: InjectionToken<VizConfig>;
@@ -0,0 +1,24 @@
1
+ import { Polygon } from '../models/region';
2
+ /**
3
+ * Trace EVERY 4-connected blob in `mask` (sized w*h) whose area is at least
4
+ * `minSize` pixels, returning one Polygon per blob translated via
5
+ * (originX, originY), ordered largest-first (ties in raster order). A blob's
6
+ * interior rings enclosing at least `minHoleSize` pixels become its
7
+ * {@link Polygon.holes}. An erase that cuts a region in two therefore yields
8
+ * both pieces, and a donut keeps its hole.
9
+ *
10
+ * The mask is labelled once and each blob traced inside its own bounding box
11
+ * (RT-16), so the cost is O(w·h + Σ bbox areas).
12
+ */
13
+ export declare function maskToPolygons(mask: Uint8Array, w: number, h: number, originX: number, originY: number, minSize?: number, minHoleSize?: number): Polygon[];
14
+ /**
15
+ * Trace each instance in an integer label map (0 = background) into polygons —
16
+ * used to turn a cellpose-style segmentation into region outlines. Pieces with
17
+ * area below `minSize` are skipped (and holes below it dropped); a label made of
18
+ * several blobs yields one polygon per blob. Ordered by label, then largest
19
+ * piece first. Coords are translated via originX/originY (not clamped).
20
+ *
21
+ * One labelling pass finds every label's pieces; each is traced inside its own
22
+ * bounding box (RT-16), instead of rescanning the whole map per label.
23
+ */
24
+ export declare function labelsToPolygons(labels: Uint32Array, w: number, h: number, originX: number, originY: number, minSize?: number): Polygon[];
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Pure binary-mask helpers: polygon rasterization (napari-js's `rasterizePolygon`)
3
+ * and bbox-relative mask set operations. No DOM, no Angular — the mask-export
4
+ * worker imports this.
5
+ */
6
+ /** A bbox-relative binary mask (1 = filled, 0 = empty) whose pixel (0,0) sits
7
+ * at (bx, by) in the frame it was rasterized in. */
8
+ export interface BBoxMask {
9
+ bx: number;
10
+ by: number;
11
+ bw: number;
12
+ bh: number;
13
+ mask: Uint8Array;
14
+ }
15
+ /**
16
+ * The largest bbox (in pixels) {@link rasterizePolygon} allocates before it
17
+ * falls back to clipping at the window. Also the cap the wand/brush use to
18
+ * decide whether a region can be edited at the current zoom.
19
+ */
20
+ export declare const MAX_RASTER_PIXELS: number;
21
+ /**
22
+ * Rasterize a closed polygon (minus its holes) into a bbox-relative mask, e.g.
23
+ * as the starting point for a wand/brush stroke accumulator.
24
+ *
25
+ * Pixel (px, py) covers `[px, px + 1) × [py, py + 1)` and is set when its centre
26
+ * is inside — the rule under which the pixel-edge outlines `geometry/contour`
27
+ * traces come back as exactly the pixels they were traced from.
28
+ *
29
+ * Returns the bbox origin plus the filled mask, or null if the polygon is
30
+ * degenerate (covers no pixel centre). The polygon's full extent is kept even
31
+ * where it is negative or exceeds `imageWidth`×`imageHeight` (jit-ui#102); only
32
+ * a bbox larger than {@link MAX_RASTER_PIXELS} is clipped to that window (rare:
33
+ * a region enormous at the current zoom; accepts the clip).
34
+ */
35
+ export declare function rasterizePolygon(xpoints: number[], ypoints: number[], imageWidth: number, imageHeight: number, holes?: number[][][]): BBoxMask | null;
36
+ /** Returns true if the two bbox-relative masks share at least one set pixel. */
37
+ export declare function masksOverlap(a: BBoxMask, b: BBoxMask): boolean;
38
+ /**
39
+ * Allocate a fresh accumulator covering both masks and OR them in. The
40
+ * resulting mask's bbox is the smallest rectangle containing both inputs.
41
+ */
42
+ export declare function unionMasks(a: BBoxMask, b: BBoxMask): BBoxMask;
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Pure ring (closed polyline) helpers: bounds, containment, vertex dropping and
3
+ * simplification. No DOM, no Angular, no `this` — usable from workers.
4
+ *
5
+ * A ring is a pair of parallel `xs`/`ys` arrays without a repeated closing
6
+ * vertex; hole rings use the `[[x, y], …]` convention of {@link Polygon.holes}.
7
+ */
8
+ /** Axis-aligned bounds of a ring. Infinite (min > max) for an empty ring. */
9
+ export interface RingBounds {
10
+ minX: number;
11
+ minY: number;
12
+ maxX: number;
13
+ maxY: number;
14
+ }
15
+ /** The axis-aligned bounds of a ring's vertices. */
16
+ export declare function ringBounds(xs: ArrayLike<number>, ys: ArrayLike<number>): RingBounds;
17
+ /**
18
+ * Standard ray-cast (even-odd) point-in-ring test. (px, py) and the ring
19
+ * vertices must be in the same coordinate system. Rings with fewer than three
20
+ * vertices contain nothing.
21
+ */
22
+ export declare function pointInRing(px: number, py: number, xs: ArrayLike<number>, ys: ArrayLike<number>): boolean;
23
+ /**
24
+ * Point-in-region test that honours interior rings (holes): inside the
25
+ * exterior AND outside every hole. Coordinates must share the polygon's frame.
26
+ * With no holes this is exactly {@link pointInRing}.
27
+ */
28
+ export declare function pointInPolygonWithHoles(px: number, py: number, xs: ArrayLike<number>, ys: ArrayLike<number>, holes?: number[][][]): boolean;
29
+ /** {@link pointInRing} over a `[[x, y], …]` ring (the hole convention), without splitting it. */
30
+ export declare function pointInPairRing(px: number, py: number, ring: ReadonlyArray<ArrayLike<number>>): boolean;
31
+ /**
32
+ * Drop every vertex whose Euclidean distance to (cx, cy) is less than
33
+ * `radius`. Returns trimmed parallel arrays plus how many vertices were
34
+ * removed (so the caller can detect a no-op tick and skip the relayout).
35
+ */
36
+ export declare function dropVerticesWithinRadius(xpoints: number[], ypoints: number[], cx: number, cy: number, radius: number): {
37
+ xpoints: number[];
38
+ ypoints: number[];
39
+ removed: number;
40
+ };
41
+ /**
42
+ * Erase the part of a ring that lies within `radius` of (cx, cy): every vertex
43
+ * inside the disc goes (as {@link dropVerticesWithinRadius}), and the outline is
44
+ * rejoined where it crosses the disc's edge rather than at the next vertex left
45
+ * standing. On a densely sampled outline the two agree; on a sparse one (a
46
+ * traced box is four corners) dropping a corner would otherwise cut straight to
47
+ * the neighbouring corners. A `closed` ring wraps; an open one (a polyline) has
48
+ * no edge from its last vertex back to its first. Returns the trimmed parallel
49
+ * arrays plus how many of the ring's own vertices were removed (0: unchanged).
50
+ */
51
+ export declare function eraseRingWithinRadius(xpoints: number[], ypoints: number[], cx: number, cy: number, radius: number, closed?: boolean): {
52
+ xpoints: number[];
53
+ ypoints: number[];
54
+ removed: number;
55
+ };
56
+ /**
57
+ * Simplify a closed ring with the Douglas–Peucker algorithm (jit-ui#85):
58
+ * drop every vertex that lies within `epsilon` pixels (the "altitude
59
+ * threshold") of the line between its kept neighbours. Anchored at vertex 0
60
+ * (the ring is closed by appending it). Rings of ≤ 3 vertices, or a
61
+ * non-positive epsilon, are returned unchanged. Output keeps the closed-ring
62
+ * convention (no repeated closing point).
63
+ */
64
+ export declare function simplifyRing(xs: number[], ys: number[], epsilon: number): {
65
+ xs: number[];
66
+ ys: number[];
67
+ };