@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
@@ -0,0 +1,161 @@
1
+ import type * as OpenSeadragon from 'openseadragon';
2
+ import { DisplayPipeline } from './display-pipeline';
3
+ import { HistogramSampler } from './histogram-sampler';
4
+ import { TileDescriptor } from '../tile-server';
5
+ import { IImageInfo } from '../../contracts/image.contract';
6
+ import { IChannelState } from '../../contracts/channel-histogram-api.contract';
7
+ import { SimpleSliceAccessService } from '../simple-slice-access.service';
8
+ /** One decoded single-band channel plane (serverless multichannel). */
9
+ export interface SimplePlane {
10
+ data: Uint8ClampedArray;
11
+ width: number;
12
+ height: number;
13
+ }
14
+ /** What `load()` hands to `plot()`. `load()` only computes it: the image on
15
+ * screen keeps its own state until `plot()` commits this payload. */
16
+ export interface OsdLoaded {
17
+ descriptor: TileDescriptor | null;
18
+ infoB64: string;
19
+ z: number;
20
+ /** Mirrors the loaded image's filename — the diagram's render pipeline
21
+ * guards on `loaded.filename === phaseInfo.fileName` before calling plot(). */
22
+ filename: string | undefined;
23
+ /** Simple (non-tiled) image: `plot()` opens {@link url} directly via OSD's
24
+ * single-image source — no tile pyramid, no server. Set when the image
25
+ * carries `tiled === false` (see {@link IImageInfo.tiled}). */
26
+ simple?: boolean;
27
+ /** The directly-loadable image URL (`blob:`/`data:`/`http`) for simple mode. */
28
+ url?: string;
29
+ /** Serverless multichannel only: every slice's per-channel plane URLs, and
30
+ * the loaded slice's decoded planes ({@link url} is their composite). */
31
+ channelUrls?: string[][];
32
+ channelPlanes?: SimplePlane[];
33
+ }
34
+ /** The service state the simple source reads and drives. */
35
+ export interface SimpleSourceHost {
36
+ viewer(): OpenSeadragon.Viewer | null;
37
+ descriptor(): TileDescriptor | null;
38
+ isGrayscale(): boolean;
39
+ currentZ(): number;
40
+ /** Show slice `z`: the service records it and drops its slice-specific readback. */
41
+ setCurrentZ(z: number): void;
42
+ sampler(): HistogramSampler;
43
+ display(): DisplayPipeline;
44
+ channelStates(): IChannelState[];
45
+ /** Whether display round `token` is still the current one (see OsdTileRecolorer). */
46
+ isCurrentDisplay(token: number): boolean;
47
+ /** Queue a coalesced display round (for the serverless multichannel recomposite). */
48
+ scheduleInvalidate(): void;
49
+ }
50
+ /**
51
+ * The "simple" (`tiled: false`) image source: self-contained per-slice URLs and
52
+ * no tile server — e.g. a numbered image series assembled client-side into a
53
+ * stack, or the processing-pipeline preview. Each slice is resampled to the
54
+ * full-resolution size so regions align and opened as OSD's single-image source;
55
+ * a SERVERLESS multichannel image is composited client-side from its per-channel
56
+ * planes (kept OFF the tiled per-channel path).
57
+ *
58
+ * Owns every piece of simple-mode state and is the single place that resets it,
59
+ * so none of it can outlive the simple image (OSD-PLOTLY-1).
60
+ */
61
+ export declare class OsdSimpleSource {
62
+ private readonly host;
63
+ private readonly simpleStack;
64
+ /** True while the mounted image is simple: setZIndex re-opens the viewer on
65
+ * the new slice's URL instead of toggling a tiled slice. */
66
+ active: boolean;
67
+ /** urls[] of the mounted simple image, for the slice being scrubbed to. */
68
+ urls: string[];
69
+ /** preview blob URL → full-res resampled blob URL (see toFullResUrl), so
70
+ * re-visiting a slice doesn't re-resample. Revoked on file change. */
71
+ private readonly fullResUrls;
72
+ /** SERVERLESS multichannel (tiled:false + channelCount>1): the stack's
73
+ * per-slice per-channel plane URLs, the current slice's decoded planes, and
74
+ * the displayed composite blob URL. */
75
+ multichannel: boolean;
76
+ channelUrls: string[][];
77
+ channelPlanes: SimplePlane[];
78
+ compositeUrl: string | null;
79
+ constructor(host: SimpleSourceHost, simpleStack: SimpleSliceAccessService);
80
+ /** Forget the simple image's state: mode, slice URLs and the serverless-
81
+ * multichannel flag, URLs and decoded planes. Called when a tiled image is
82
+ * mounted and on teardown; {@link commit} sets it from an {@link OsdLoaded}. */
83
+ reset(): void;
84
+ /** Revoke every blob URL this source created (a different file was selected). */
85
+ revokeUrls(): void;
86
+ /** Build the `plot()` payload for a simple (tiled:false) image: a single-level
87
+ * descriptor sized from `trueImageSize`, plus the directly-loadable URL —
88
+ * resolved and fetched via {@link SimpleSliceAccessService} (shared with
89
+ * napari-js; see its docs for why this can't be a raw `fetch()`/`<img>`).
90
+ * Those fetches take no signal, so an abort is honoured once they settle. */
91
+ load(imageInfo: IImageInfo, zIndex: number, signal?: AbortSignal): Promise<OsdLoaded>;
92
+ /** Commit a mounted image's simple-mode state from its {@link OsdLoaded}
93
+ * payload (cleared for a tiled one). */
94
+ commit(loaded: OsdLoaded, imageInfo: IImageInfo): void;
95
+ /** The simple image's new viewer is about to open `loaded.url` (the old viewer
96
+ * is gone): take ownership of its composite and bin its histograms — after
97
+ * the service's destroyViewer, whose last act is clearing the sampler. */
98
+ mount(loaded: OsdLoaded): void;
99
+ /**
100
+ * The in-place (large-tier) pass for a mounted simple image. Simple mode has
101
+ * no pyramid to fall back on: it displays literally whatever URL was last
102
+ * opened, so without this swap the small tier's 128px placeholder would stay
103
+ * on screen forever (pixelated, never "sharpening" like the tiled path).
104
+ */
105
+ refreshInPlace(loaded: OsdLoaded, imageInfo: IImageInfo): void;
106
+ /**
107
+ * Show slice `z` of the mounted simple image. Each slice is its own complete
108
+ * image (no pyramid to toggle opacity on), so this re-opens the viewer on the
109
+ * new slice's URL; the viewer's preserveViewport keeps the current zoom/pan.
110
+ * Scrubs can resolve out of order: only the current slice may land.
111
+ */
112
+ setZIndex(z: number): void;
113
+ /**
114
+ * OSD's `{type:'image'}` source sizes its coordinate world to the image's
115
+ * NATURAL pixels. A folder-stack slice is a server `/preview` whose pixel size
116
+ * needn't match the full-resolution image — it may be downscaled (large
117
+ * images) OR larger than the dimensions `/metadata` reports. Either way OSD's
118
+ * world would differ from the full-res ROI coordinate space (QuPath geojson,
119
+ * in level-0 pixels): a smaller preview renders ROIs oversized, a larger one
120
+ * renders them undersized/offset. Resample the preview to EXACTLY the
121
+ * full-resolution dimensions (blurry but positionally exact — scaling up or
122
+ * down as needed) so OSD's world matches the ROI coordinate space, while still
123
+ * using OSD's reliable single-image renderer. Cached per preview URL (revoked
124
+ * on file change); a no-op when the preview is already exactly full-res (small
125
+ * images, in-memory pipeline blobs), when the dims are unknown, or when
126
+ * they're implausibly large (guards against an enormous canvas). (jit-ui#93)
127
+ */
128
+ toFullResUrl(previewUrl: string, width: number, height: number): Promise<string>;
129
+ /** Sample a slice's own decoded pixels into the histogram — the serverless
130
+ * analog of the tiled samplers (no tile server). Fire-and-forget; a decode
131
+ * failure just leaves the pane empty rather than throwing. */
132
+ private sampleHistogram;
133
+ /** Fetch + decode a slice's per-channel planes (single-band grayscale) into
134
+ * pixel buffers, for the serverless multichannel compositor. Auth-safe: goes
135
+ * through SimpleSliceAccessService (blob:/data: as-is; http via HttpClient).
136
+ * The channels are fetched in parallel; plane c stays at index c, and a
137
+ * plane that fails to load is empty (the compositor skips it). */
138
+ loadChannelPlanes(urls: string[] | undefined): Promise<SimplePlane[]>;
139
+ /** Composite per-channel planes into ONE RGBA image using the current channel
140
+ * states (colour/window/gamma/visibility) — the client-side analog of the
141
+ * tiled per-channel 'lighter' compositor (same display.channelRgbLut math as
142
+ * the channel-tile recolor, applied per-plane). Returns a new blob: URL of the
143
+ * composite PNG, owned by the caller (see {@link openComposite}). */
144
+ composite(planes: SimplePlane[]): Promise<string | undefined>;
145
+ /** Re-composite the current slice from its cached planes (new channel states)
146
+ * and re-open — the serverless analog of the tiled invalidate-on-channel-change.
147
+ * Runs from the recolorer's invalidateDisplay, so it is coalesced per frame,
148
+ * and drops its composite once a newer display round (`token`) has started. */
149
+ recompositeAndOpen(token: number): Promise<void>;
150
+ /** Open a serverless-multichannel composite and take ownership of its URL. The
151
+ * previously displayed composite is revoked only once this open settles: an
152
+ * `open()` still decoding a revoked blob: URL fails. */
153
+ private openComposite;
154
+ /** Commit the serverless-multichannel part of an {@link OsdLoaded} payload. */
155
+ private commitMultichannel;
156
+ /** Decode an image URL to RGBA pixels (null for an empty image or no 2d
157
+ * context). Throws when the URL can't be decoded. */
158
+ decodeUrlToRgba(url: string): Promise<ImageData | null>;
159
+ /** Load a URL into an HTMLImageElement (resolves once decoded). */
160
+ loadImageEl(url: string): Promise<HTMLImageElement>;
161
+ }
@@ -1,3 +1,4 @@
1
+ import { OsdTiledImageLike, OsdViewerLike } from './osd-viewer-like';
1
2
  /**
2
3
  * Stack-slice cache for the OpenSeadragon backend (refactoring plan, Step 3 —
3
4
  * a pure move of the cache cluster out of the visualizer service).
@@ -17,7 +18,7 @@
17
18
  * viewer/descriptor/z — matching the field reads it replaced. */
18
19
  export interface SliceCacheHost {
19
20
  /** The mounted viewer, or null. */
20
- viewer(): any | null;
21
+ viewer(): OsdViewerLike | null;
21
22
  /** True when a viewer, descriptor and infoB64 are all present. */
22
23
  hasImage(): boolean;
23
24
  /** Stack depth (descriptor.z, 1 for single images). */
@@ -31,7 +32,7 @@ export interface SliceCacheHost {
31
32
  /** Channel visibility (drives group reveal opacity). */
32
33
  channelVisible(c: number): boolean;
33
34
  /** Tile source for slice z (optionally one channel). */
34
- buildTileSource(z: number, channel?: number): any;
35
+ buildTileSource(z: number, channel?: number): string | object;
35
36
  /** A composite slice landed in the world — the service samples its window. */
36
37
  onCompositeSliceAdded(z: number): void;
37
38
  }
@@ -84,9 +85,17 @@ export declare class SliceCache {
84
85
  maxSlices(): number;
85
86
  /** Drop the per-channel groups (on a fresh plot). */
86
87
  clearChannelGroups(): void;
88
+ /**
89
+ * Take over the slice the viewer just opened (world item 0). Composite: seed
90
+ * the cache with it, so scrubbing back to it later is an instant opacity
91
+ * toggle, not a re-open. Multichannel: drop that single (channel-0) image and
92
+ * add the slice's channel group instead; the background loader / LRU then
93
+ * pre-fills the other slices' groups so z-scrub is flicker-free.
94
+ */
95
+ adoptOpenedSlice(z: number): void;
87
96
  /** Seed the cache with the just-opened composite slice (world item 0), so
88
97
  * scrubbing back to it later is an instant opacity toggle, not a re-open. */
89
- seedComposite(z: number, item: any): void;
98
+ seedComposite(z: number, item: OsdTiledImageLike): void;
90
99
  /** Show slice z: reveal it instantly when cached (re-tinting a stale
91
100
  * multichannel group), otherwise add it once. The current slice stays
92
101
  * visible until the new one is in — no white-flicker. */
@@ -3,26 +3,19 @@ import { HttpClient } from '@angular/common/http';
3
3
  * Single source of truth for jit-service `/tile` access from the OSD backend
4
4
  * (refactoring plan, Step 2). Before this module the tile URL was string-built
5
5
  * in four places and the fetch→decode pipeline copy-pasted in three — every
6
- * query-param change had to be repeated per site.
6
+ * query-param change had to be repeated per site. The URL itself now lives in
7
+ * the shared `tile-server/` client.
7
8
  *
8
9
  * Error handling is deliberately left to the CALL SITES: these helpers
9
10
  * propagate failures so each caller keeps its own tagged catch
10
11
  * (`[viz:histogram]`, `[viz:window]`, `[viz:export]`) and its own
11
12
  * skip/fallback semantics.
12
13
  */
13
- /** Tile coordinates for one `/tile` request. `channel == null` (or omitted)
14
- * requests the server-composited tile; an index (including 0) requests that
15
- * single channel as grayscale. */
16
- export interface TileCoords {
17
- res: number;
18
- col: number;
19
- row: number;
20
- z: number;
21
- tileSize: number;
22
- channel?: number | null;
23
- }
24
- /** Build the `/tile` request URL — the one place its query shape lives. */
25
- export declare function buildTileUrl(api: string, infoB64: string, c: TileCoords): string;
14
+ /** The `/tile` URL shape moved to the backend-neutral jit-service client
15
+ * (`implementations/tile-server/`), shared with napari-js; re-exported so the OSD
16
+ * modules keep importing it from here. */
17
+ export { buildTileUrl } from '../tile-server/tile-protocol';
18
+ export type { TileCoords } from '../tile-server/tile-protocol';
26
19
  /** Fetch a tile PNG and decode it to an ImageBitmap. The caller owns the
27
20
  * bitmap (call `close()` when done). Throws on network/decode failure. */
28
21
  export declare function fetchTileBitmap(http: HttpClient, url: string, timeoutMs: number): Promise<ImageBitmap>;
@@ -30,3 +23,7 @@ export declare function fetchTileBitmap(http: HttpClient, url: string, timeoutMs
30
23
  * canvas). Returns null only when a 2d context can't be created; throws on
31
24
  * network/decode failure (the caller's tagged catch handles it). */
32
25
  export declare function fetchTileRgba(http: HttpClient, url: string, timeoutMs: number): Promise<ImageData | null>;
26
+ /** Draw a decoded image (bitmap, `<img>`, canvas) onto a scratch canvas and
27
+ * read its pixels back as RGBA ImageData. Null when a 2d context can't be
28
+ * created. */
29
+ export declare function readRgba(src: CanvasImageSource, width: number, height: number): ImageData | null;
@@ -0,0 +1,141 @@
1
+ import type * as OpenSeadragon from 'openseadragon';
2
+ import { DisplayPipeline } from './display-pipeline';
3
+ import { VisualizerStore } from '../../store/visualizer-store.service';
4
+ import { Rgb } from '../../contracts/colormap-lut';
5
+ import { IChannelState } from '../../contracts/channel-histogram-api.contract';
6
+ /** The service state the recolorer reads — live, so it follows a viewer rebuild. */
7
+ export interface TileRecolorHost {
8
+ viewer(): OpenSeadragon.Viewer | null;
9
+ isGrayscale(): boolean;
10
+ isMultiChannel(): boolean;
11
+ /** Serverless multichannel: recolor by re-compositing the cached planes. */
12
+ isSimpleMultichannel(): boolean;
13
+ currentZ(): number;
14
+ /** Re-apply the current slice's per-channel visibility (multichannel). */
15
+ revealChannelSlice(z: number): void;
16
+ /** Invalidate only the visible slice's channel images (multichannel). */
17
+ invalidateChannelDisplay(z: number): void;
18
+ /** Re-composite the serverless-multichannel planes for display round `token`. */
19
+ recomposite(token: number): void;
20
+ }
21
+ /** The tile-invalidated event's pixel accessors (OSD 5+/6), as used here. */
22
+ interface TileEvent {
23
+ tile?: {
24
+ getUrl?: () => string;
25
+ url?: string;
26
+ };
27
+ getData(type: string): Promise<unknown>;
28
+ setData(data: unknown, type: string): Promise<unknown>;
29
+ }
30
+ /**
31
+ * Client-side display for OpenSeadragon tiles: window/gamma/colormap/invert and
32
+ * per-channel tints, applied through OSD's `tile-invalidated` pixel pipeline.
33
+ *
34
+ * Owns the display state mirrored from the shared {@link VisualizerStore} (the
35
+ * LUT, the channel states, invert) and the recolor invariant: invalidations are
36
+ * coalesced to one per animation frame, and every round captures
37
+ * {@link displayToken} — a round that a newer one has superseded must not write
38
+ * its pixels back.
39
+ */
40
+ export declare class OsdTileRecolorer {
41
+ private readonly host;
42
+ private readonly store;
43
+ /** Pixel display pipeline (window/gamma/invert/colormap + additive tint) —
44
+ * shared by tile recoloring, the serverless compositor and the composite
45
+ * export so they stay identical (see DisplayPipeline). */
46
+ readonly display: DisplayPipeline;
47
+ /** 256-entry RGB LUT for the active colormap, applied to grayscale tiles
48
+ * (mirrors Plotly's heatmap colorscale). Null while options resolve;
49
+ * recoloring is skipped until it's built. */
50
+ colorLut: Rgb[] | null;
51
+ /** Latest per-channel display state (window/gamma/visibility) from the store,
52
+ * read synchronously by recolorTile. Channel 0 drives grayscale windowing;
53
+ * R/G/B (indices 0-2) drive RGB per-channel windowing. */
54
+ channelStates: IChannelState[];
55
+ /** Inverted background (white = zero): inverts the windowed value before the
56
+ * gamma and the LUT (grayscale) / per channel before the additive merge (RGB
57
+ * and multichannel), as napari-js does. */
58
+ invertBg: boolean;
59
+ /** Bumped by every display invalidation. A recolor round captures it and, after
60
+ * each `await`, abandons the tile once a newer round has started. Writing a
61
+ * superseded context back is not merely wasted work: OSD's conversion sees a
62
+ * canvas the newer round already replaced, throws `DOMException`, and
63
+ * `_handleConversionError` DESTROYS the cache record and unloads the tile
64
+ * (unlike the drawer's rasterBlob path, it does not re-prepare). Enough of
65
+ * those and the viewer goes white mid-drag. */
66
+ displayToken: number;
67
+ /** Pending coalesced invalidation (see {@link scheduleInvalidate}). */
68
+ private invalidateHandle;
69
+ private sub;
70
+ constructor(host: TileRecolorHost, store: VisualizerStore);
71
+ /** Whether display round `token` is still the current one. */
72
+ isCurrent(token: number): boolean;
73
+ /**
74
+ * Subscribe to the shared VisualizerStore colormap/reverse so OSD recolors in
75
+ * lock-step with Plotly. Idempotent and self-healing: the service is a root
76
+ * singleton, but `unsubscribe()` (called on VisualizerComponent destroy)
77
+ * tears the subscription down — and the constructor never runs again. So
78
+ * `plot()` calls this to re-establish it after a component teardown/recreate
79
+ * (e.g. switching images), otherwise colormap changes would be silently
80
+ * dropped on every image after the first switch.
81
+ */
82
+ ensureSubscription(): void;
83
+ /** Tear the store subscription down and drop a queued invalidation, so it
84
+ * can't fire against a torn-down viewer. */
85
+ unsubscribe(): void;
86
+ /** Seed the Intensity channel with a measured auto-window while it's still
87
+ * at full range (never clobber the user's manual window); if the user
88
+ * already windowed, just re-invalidate so painted tiles pick the LUT up. */
89
+ seedGrayWindow(min: number, max: number): void;
90
+ /**
91
+ * Hook a freshly opened viewer (and its navigator, a separate mini-viewer with
92
+ * its own tiles that doesn't receive the main viewer's events) into the pixel
93
+ * pipeline, and paint what is already loaded when there is anything to apply.
94
+ */
95
+ attach(viewer: OpenSeadragon.Viewer): void;
96
+ /** Collapse a burst of display-state changes into ONE invalidation on the next
97
+ * frame. Dragging a window slider emits per pixel of travel, and each round
98
+ * restores and re-processes every tile of every channel — so the burst is both
99
+ * wasted work and the race that breaks cache records (see {@link displayToken}).
100
+ * The store write stays live, so the pane itself remains responsive. */
101
+ scheduleInvalidate(): void;
102
+ /** Re-apply the display pipeline (window/gamma/colour/invert) after a state change.
103
+ * Multichannel invalidates ONLY the visible slice's channel images — invalidating
104
+ * the whole world would re-process every hidden/preloaded slice's tiles (hundreds),
105
+ * flooding OSD with "[CacheRecord] … InvalidStateError" and wasting work on tiles
106
+ * that aren't on screen. The other cached slices are marked stale and re-tinted
107
+ * lazily when revealed. Composite/grayscale invalidate the world; serverless
108
+ * multichannel re-composites its cached planes. */
109
+ invalidateDisplay(): void;
110
+ /** Restore and re-recolor every tile of the main viewer and the navigator. */
111
+ invalidateWorld(): void;
112
+ /**
113
+ * Recolor a grayscale tile through the active colormap LUT, using OSD's
114
+ * tile-invalidated pixel pipeline (OSD 5+/6). Maps each pixel's grayscale
115
+ * value (r==g==b) to the LUT's RGB. No-op for RGB images or until the LUT is
116
+ * built. Handler is async — OSD awaits it (raiseEventAwaiting).
117
+ */
118
+ recolorTile(event: TileEvent): Promise<void>;
119
+ /**
120
+ * Tint a single channel's tile in place. Each channel is its own OpenSeadragon
121
+ * TiledImage (a single-band grayscale tile); OSD composites the N images
122
+ * additively ('lighter') in its drawer — so this just maps the tile's intensity
123
+ * through the channel's window/gamma and its pseudo-colour. Synchronous (no
124
+ * cross-tile fetch) → no race, no seams. Channel is parsed from the tile URL.
125
+ */
126
+ recolorChannelTile(event: TileEvent): Promise<void>;
127
+ /**
128
+ * Read a tile's pixels for recoloring. Prefers the tile's rendering context,
129
+ * but some tile caches (ajax PNG blobs) convert to an *empty* context2d —
130
+ * recoloring that would blank the tile (white canvas). So if the context has
131
+ * no opaque pixels, the tile's own bitmap/image is drawn to a scratch canvas
132
+ * and read instead. Null when no pixels can be read: leave the tile untouched.
133
+ */
134
+ private readTilePixels;
135
+ /** Write recolored pixels back to the tile — unless a newer display round
136
+ * (`token`, see {@link displayToken}) has already restored it: writing a
137
+ * superseded context back makes OSD's conversion throw DOMException, which
138
+ * destroys the cache record and unloads the tile. */
139
+ private writeTilePixels;
140
+ }
141
+ export {};
@@ -18,6 +18,12 @@ export interface OmicsGrouping {
18
18
  /** `#rrggbb` per category, index-aligned — the same colours the map uses. */
19
19
  colors: string[];
20
20
  }
21
+ /**
22
+ * What {@link buildOmicsTraces} / {@link omicsLayout} chart: one value per
23
+ * observation (cell/spot), with the optional grouping and selection
24
+ * index-aligned to it. Non-finite values (NaN for a missing measurement) are
25
+ * left out of every chart.
26
+ */
21
27
  export interface OmicsTraceInput {
22
28
  /** The values being charted (an annotation column or a gene vector). */
23
29
  values: Float32Array;
@@ -34,7 +40,7 @@ export interface OmicsTraceInput {
34
40
  /**
35
41
  * Traces for one chart kind.
36
42
  *
37
- * - **histogram** — the full distribution, plus an overlaid *Selected* trace
43
+ * - **histogram** — the full distribution as pre-binned bars, plus an overlaid *Selected* trace
38
44
  * when a selection exists, so the two are directly comparable. That
39
45
  * comparison is the whole point of linking the chart to the map.
40
46
  * - **violin / box** — one per category when grouped, otherwise a single trace.
@@ -55,13 +61,15 @@ export interface OmicsCountInput {
55
61
  /** Bars before the tail is aggregated. */
56
62
  max?: number;
57
63
  }
58
- /** Per-category counts, biggest first, with the tail folded into one bar. */
59
- export declare function countByCategory(input: OmicsCountInput): {
64
+ /** What {@link countByCategory} returns. */
65
+ export interface CategoryCounts {
60
66
  labels: string[];
61
67
  colors: string[];
62
68
  totals: number[];
63
69
  selected: number[];
64
- };
70
+ }
71
+ /** Per-category counts, biggest first, with the tail folded into one bar. */
72
+ export declare function countByCategory(input: OmicsCountInput): CategoryCounts;
65
73
  /**
66
74
  * Bars of per-category cell counts — the distribution a CATEGORICAL colour
67
75
  * source has.
@@ -71,24 +79,14 @@ export declare function countByCategory(input: OmicsCountInput): {
71
79
  * the legend implies without answering. Horizontal, because taxonomy labels are
72
80
  * long, and sorted, because rank is what the chart is read for.
73
81
  */
74
- export declare function buildCountTraces(input: OmicsCountInput): unknown[];
75
- export declare function countsLayout(input: OmicsCountInput & {
76
- name: string;
77
- }): unknown;
82
+ export declare function buildCountTraces(input: OmicsCountInput, counts?: CategoryCounts): unknown[];
78
83
  /**
79
- * Genes × groups mean expression, as a Plotly heatmap.
80
- *
81
- * The matrix itself is computed by the pure `heatmapMatrix` in
82
- * `spatial/spatial-heatmap.ts`; this only shapes it for Plotly. Kept in the
83
- * matrix's own row-major order and flipped once here, because Plotly draws
84
- * `z[0]` at the BOTTOM of the y axis while the caller lists genes top-down.
85
- *
86
- * The colour scale is its own, NOT the map's `continuousColormap`. This is a
87
- * different quantity — a z-scored mean per group, not a per-cell value — so
88
- * sharing one scale would invite reading a heatmap cell as if it were a marker
89
- * colour. Diverging and centred on zero, because after z-scoring the sign is
90
- * the reading: above or below this gene's average across the groups.
84
+ * Layout for {@link buildCountTraces}. Pass the same `counts` to both rather than letting
85
+ * each run its own full pass over the codes.
91
86
  */
87
+ export declare function countsLayout(input: OmicsCountInput & {
88
+ name: string;
89
+ }, counts?: CategoryCounts): unknown;
92
90
  /**
93
91
  * An embedding scatter — a UMAP, t-SNE or PCA plane over the same observations.
94
92
  *
@@ -189,5 +187,19 @@ export interface OmicsHeatmapInput {
189
187
  /** Column axis title — the grouping column's name, or "cell". */
190
188
  groupLabel?: string;
191
189
  }
190
+ /**
191
+ * Genes × groups mean expression, as a Plotly heatmap.
192
+ *
193
+ * The matrix itself is computed by the pure `heatmapMatrix` in
194
+ * `spatial/spatial-heatmap.ts`; this only shapes it for Plotly. Kept in the
195
+ * matrix's own row-major order and flipped once here, because Plotly draws
196
+ * `z[0]` at the BOTTOM of the y axis while the caller lists genes top-down.
197
+ *
198
+ * The colour scale is its own, NOT the map's `continuousColormap`. This is a
199
+ * different quantity — a z-scored mean per group, not a per-cell value — so
200
+ * sharing one scale would invite reading a heatmap cell as if it were a marker
201
+ * colour. Diverging and centred on zero, because after z-scoring the sign is
202
+ * the reading: above or below this gene's average across the groups.
203
+ */
192
204
  export declare function buildHeatmapTraces(input: OmicsHeatmapInput): unknown[];
193
205
  export declare function heatmapLayout(input: OmicsHeatmapInput): unknown;
@@ -0,0 +1,49 @@
1
+ import { HttpClient } from '@angular/common/http';
2
+ import { BehaviorSubject } from 'rxjs';
3
+ import { Image } from 'image-js';
4
+ import { IImageInfo } from '../../contracts/image.contract';
5
+ /** What Plotly's `load()` hands to `plot()`: per-slice pixel matrices. */
6
+ export interface PlotlyLoaded {
7
+ /** One row-major matrix per slice: grayscale numbers or `[r, g, b]` cells. */
8
+ data: any[];
9
+ /** [xRatio, yRatio]: image units per decoded pixel. */
10
+ ratios: number[];
11
+ /** [width, height] of a decoded slice. */
12
+ sizes: number[];
13
+ filename: string | undefined;
14
+ /** A serverless multichannel stack's raw channel planes (one byte per pixel), per loaded
15
+ * slice (aligned with `data`) and channel — what its `image` trace is composited from. */
16
+ channelPlanes?: Uint8Array[][];
17
+ }
18
+ /**
19
+ * Plotly's image source: fetches slices through HttpClient (so the auth
20
+ * interceptors apply — a raw fetch() fails behind an OAuth2 proxy), decodes
21
+ * them with image-js into pixel matrices, and loads a stack through a small
22
+ * worker pool, reporting progress. Owns the stack-loading flag and progress.
23
+ */
24
+ export declare class PlotlyImageLoader {
25
+ private readonly http;
26
+ /** Whether the whole stack is (to be) loaded; switching it off stops a stack load. */
27
+ readonly stackLoading$: BehaviorSubject<boolean>;
28
+ /** Stack load progress, 0–100 (0 when idle). */
29
+ readonly stackLoadingProgress$: BehaviorSubject<number>;
30
+ private readonly utils;
31
+ constructor(http: HttpClient);
32
+ /** Fetch one image via HttpClient and decode it. */
33
+ loadImage(url: string, signal?: AbortSignal): Promise<Image>;
34
+ /**
35
+ * Load slice `zIndex` — or, for a shown stack, every slice (in parallel,
36
+ * keeping slice order). `onProbe` runs once the displayed slice has decoded;
37
+ * the stack load stops early when `stillWanted()` turns false (another file),
38
+ * stack loading is switched off, or `signal` aborts (it then rejects with an
39
+ * `AbortError`). A stopped load keeps the contiguous run of slices from the start.
40
+ */
41
+ load(imageInfo: IImageInfo, zIndex: number, signal: AbortSignal | undefined, onProbe: () => void, stillWanted: () => boolean): Promise<PlotlyLoaded>;
42
+ /** A slice's channel planes (`channelUrls[z]`), fetched in parallel and decoded to one byte per
43
+ * pixel (a 16-bit plane to its high byte, as a canvas decodes it for OSD). */
44
+ private loadChannelPlanes;
45
+ /** Grayscale: the scalar matrix. Colour: `[r, g, b]` cells in 0..255, the only range an
46
+ * `image` trace draws — a 16-bit image keeps each sample's high byte, as the browser decodes
47
+ * it for OSD and napari-js (its full values saturated every cell). */
48
+ private toMatrix;
49
+ }
@@ -0,0 +1,75 @@
1
+ import { IChannelState } from '../../contracts/channel-histogram-api.contract';
2
+ import { IImageInfo } from '../../contracts/image.contract';
3
+ import { PixelData } from '../../contracts/visualizer.contract';
4
+ /** How the Plotly `image` trace of an image follows the Channels & Histogram dialog. */
5
+ export type RecolorKind = 'rgb' | 'multichannel';
6
+ /** RGBA8 pixels → an `image` trace's `source` (a `data:image/…;base64,` URI). */
7
+ export type ImageEncoder = (rgba: Uint8ClampedArray, width: number, height: number) => Promise<string>;
8
+ /** A serverless multichannel stack's per-channel plane URLs (`channelUrls[z][c]`), or null: the
9
+ * criterion OSD's simple source and napari-js's stitch path use. */
10
+ export declare function channelPlaneUrls(info: IImageInfo | undefined): string[][] | null;
11
+ /**
12
+ * Which channel display the `image` trace of `info` gets: `multichannel` when the slices'
13
+ * channel planes were loaded, `rgb` for an RGB image (its channels are R, G and B — the store's
14
+ * channel model for `rgbChannels ≥ 3`), else none. A tiled multichannel image is plotted from
15
+ * the server's flat composite preview, with no per-channel pixels to recolour: none.
16
+ */
17
+ export declare function recolorKind(info: IImageInfo | undefined, hasPlanes: boolean): RecolorKind | null;
18
+ /** A Plotly `image` frame (rows of `[r, g, b(, a)]` cells) as opaque RGBA8 pixels. */
19
+ export declare function matrixToRgba(frame: number[][][], width: number, height: number): Uint8ClampedArray;
20
+ /** The browser's PNG encoder, off the main thread where it can be (`convertToBlob`/`toBlob`
21
+ * encode asynchronously), read back as a data URI. */
22
+ export declare const encodePng: ImageEncoder;
23
+ /**
24
+ * The channel display of Plotly's colour `image` trace (#46 browser testing): what OSD's
25
+ * {@link DisplayPipeline} does to its tiles, run on the CPU over the frames Plotly plots, so one
26
+ * channel state draws the same picture on both (window → invert → gamma → tint, additive merge).
27
+ * - multichannel (a serverless stack's `channelUrls`): the slice's raw channel planes merged by
28
+ * `compositeChannels`;
29
+ * - RGB: the raw frame's R, G and B through their channels (`applyToRgba`) — the raw frame as it
30
+ * is while the channel states leave it so ({@link rgbNeedsRecolor}).
31
+ *
32
+ * Always from the RAW pixels the plot was built from, never from a recoloured frame, so repeated
33
+ * edits never compound. The raw frames stay what the pixel tools, the profiles and the histogram
34
+ * read; only the trace's picture changes.
35
+ *
36
+ * The trace draws a PNG `source`, not a `z` matrix: Plotly paints a `z` image one `fillRect` per
37
+ * pixel (~0.7 s for a 1-megapixel slice, on every edit), while a `source` is drawn by the browser
38
+ * and encoded off the main thread. A stack recolours the slice on screen, and each other slice
39
+ * when it is shown ({@link frame} reports a stale one).
40
+ */
41
+ export declare class PlotlyImageRecolor {
42
+ private readonly host;
43
+ private readonly encode;
44
+ private kind;
45
+ private frames;
46
+ private planes;
47
+ /** Per frame: the display key of the latest picture asked for it. */
48
+ private shown;
49
+ /** Bumped by every plot/clear: a picture encoded for an older plot is dropped. */
50
+ private generation;
51
+ private readonly pipeline;
52
+ constructor(host: {
53
+ channelStates(): IChannelState[];
54
+ invert(): boolean;
55
+ }, encode?: ImageEncoder);
56
+ /** Whether the traces on screen follow the channel states. */
57
+ get active(): boolean;
58
+ /**
59
+ * Start following the channel states for the `image` traces about to be plotted from `frames`
60
+ * (raw, one per slice) and, for `multichannel`, each slice's raw channel `planes`. Resolves to
61
+ * each slice's `source` in the current display; null for `kind` null (the traces draw `z`), or
62
+ * when a newer plot superseded this one.
63
+ */
64
+ plot(kind: RecolorKind | null, frames: number[][][][], planes?: Array<Uint8Array[] | undefined>): Promise<string[] | null>;
65
+ /** Stop following (the plot was replaced by a non-image one, or purged). */
66
+ clear(): void;
67
+ /** Slice `index`'s `source` in the current channel display, or null when the picture asked for
68
+ * last already shows it, or a newer picture or plot superseded this one. */
69
+ frame(index: number): Promise<string | null>;
70
+ /** Slice `index`'s displayed pixels (`getDisplayedPixelData` of a trace drawn from its `source`),
71
+ * as `[r, g, b]` like a `z` trace's; null when no trace follows the channel states. */
72
+ displayedPixels(index: number): PixelData | null;
73
+ /** Slice `index` in the current channel display, as RGBA8, from its raw pixels. */
74
+ private pixels;
75
+ }
@@ -0,0 +1,8 @@
1
+ import { IntensityProfile } from '../../contracts/visualizer.contract';
2
+ /**
3
+ * Render the floating intensity-profile inset chart into `divId` — one line
4
+ * trace per profile line, each drawn in its line's colour. The x axis is in
5
+ * microns when the sampler tagged the profiles so (the image carries a pixel
6
+ * size), otherwise in pixels. A no-op when the element is missing.
7
+ */
8
+ export declare function renderIntensityInset(divId: string, profiles: IntensityProfile[]): void;
@@ -0,0 +1,38 @@
1
+ import { IIsosurfaceControls } from '../../contracts/visualizer.contract';
2
+ /** Min/max intensity over every voxel of the frames (RGB → luminance), or null
3
+ * for empty or flat input. */
4
+ export declare function measureIntensityRange(frames: any[], isGrayscale: boolean): [number, number] | null;
5
+ /**
6
+ * The ISOSURFACE intensity band. The slider is a fixed 0–255, but a stack often
7
+ * occupies only a narrow sub-range (e.g. an EDOF volume at ~2–50 with structure
8
+ * near 6–10), so the band is mapped onto the volume's measured range: every
9
+ * intensity is easy to reach and the band always lands inside the data — a
10
+ * small inset keeps the extreme surfaces off the exact data edges, which are
11
+ * degenerate and draw nothing.
12
+ */
13
+ export declare class PlotlyIsosurfaceControls implements IIsosurfaceControls {
14
+ private readonly isLive;
15
+ private readonly restyle;
16
+ /** The band as 0–255 slider positions. Defaults to the full range so the
17
+ * first render shows the whole structure. */
18
+ private isoMin;
19
+ private isoMax;
20
+ /** The measured [min, max] of the volume on screen; null until measured. */
21
+ private dataRange;
22
+ /**
23
+ * @param isLive whether an isosurface is on screen now
24
+ * @param restyle restyles the live isosurface's `isomin`/`isomax`
25
+ */
26
+ constructor(isLive: () => boolean, restyle: (update: {
27
+ isomin: number[];
28
+ isomax: number[];
29
+ }) => void);
30
+ /** Measure the volume about to be rendered, so the band maps onto its range. */
31
+ measure(frames: any[], isGrayscale: boolean): void;
32
+ /** The current band in data units, for the next render. */
33
+ band(): [number, number];
34
+ /** Update the band; a live isosurface is restyled in place (no volume rebuild). */
35
+ setIsoRange(isoMin: number, isoMax: number): void;
36
+ /** Slider band → data units, through the measured range (as-is before one). */
37
+ private mapBand;
38
+ }