copper3d 2.2.3 → 3.0.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 (111) hide show
  1. package/README.md +1056 -5
  2. package/dist/Scene/copperScene.d.ts +3 -0
  3. package/dist/Scene/copperScene.js +13 -0
  4. package/dist/Scene/copperScene.js.map +1 -1
  5. package/dist/Utils/segmentation/CommToolsData.d.ts +109 -6
  6. package/dist/Utils/segmentation/CommToolsData.js +314 -50
  7. package/dist/Utils/segmentation/CommToolsData.js.map +1 -1
  8. package/dist/Utils/segmentation/DragOperator.d.ts +13 -7
  9. package/dist/Utils/segmentation/DragOperator.js +51 -165
  10. package/dist/Utils/segmentation/DragOperator.js.map +1 -1
  11. package/dist/Utils/segmentation/DrawToolCore.d.ts +57 -76
  12. package/dist/Utils/segmentation/DrawToolCore.js +368 -878
  13. package/dist/Utils/segmentation/DrawToolCore.js.map +1 -1
  14. package/dist/Utils/segmentation/NrrdTools.d.ts +277 -15
  15. package/dist/Utils/segmentation/NrrdTools.js +594 -232
  16. package/dist/Utils/segmentation/NrrdTools.js.map +1 -1
  17. package/dist/Utils/segmentation/core/MaskVolume.d.ts +477 -0
  18. package/dist/Utils/segmentation/core/MaskVolume.js +1238 -0
  19. package/dist/Utils/segmentation/core/MaskVolume.js.map +1 -0
  20. package/dist/Utils/segmentation/core/MigrationUtils.d.ts +97 -0
  21. package/dist/Utils/segmentation/core/MigrationUtils.js +163 -0
  22. package/dist/Utils/segmentation/core/MigrationUtils.js.map +1 -0
  23. package/dist/Utils/segmentation/core/UndoManager.d.ts +47 -0
  24. package/dist/Utils/segmentation/core/UndoManager.js +86 -0
  25. package/dist/Utils/segmentation/core/UndoManager.js.map +1 -0
  26. package/dist/Utils/segmentation/core/index.d.ts +76 -0
  27. package/dist/Utils/segmentation/core/index.js +75 -0
  28. package/dist/Utils/segmentation/core/index.js.map +1 -0
  29. package/dist/Utils/segmentation/core/types.d.ts +106 -0
  30. package/dist/Utils/segmentation/core/types.js +98 -0
  31. package/dist/Utils/segmentation/core/types.js.map +1 -0
  32. package/dist/Utils/segmentation/coreTools/coreType.d.ts +55 -36
  33. package/dist/Utils/segmentation/coreTools/coreType.js.map +1 -1
  34. package/dist/Utils/segmentation/coreTools/gui.d.ts +6 -16
  35. package/dist/Utils/segmentation/coreTools/gui.js +23 -27
  36. package/dist/Utils/segmentation/coreTools/gui.js.map +1 -1
  37. package/dist/Utils/segmentation/eventRouter/EventRouter.d.ts +144 -0
  38. package/dist/Utils/segmentation/eventRouter/EventRouter.js +369 -0
  39. package/dist/Utils/segmentation/eventRouter/EventRouter.js.map +1 -0
  40. package/dist/Utils/segmentation/eventRouter/index.d.ts +7 -0
  41. package/dist/Utils/segmentation/eventRouter/index.js +7 -0
  42. package/dist/Utils/segmentation/eventRouter/index.js.map +1 -0
  43. package/dist/Utils/segmentation/eventRouter/types.d.ts +70 -0
  44. package/dist/Utils/segmentation/eventRouter/types.js +7 -0
  45. package/dist/Utils/segmentation/eventRouter/types.js.map +1 -0
  46. package/dist/Utils/segmentation/tools/BaseTool.d.ts +25 -0
  47. package/dist/Utils/segmentation/tools/BaseTool.js +18 -0
  48. package/dist/Utils/segmentation/tools/BaseTool.js.map +1 -0
  49. package/dist/Utils/segmentation/tools/ContrastTool.d.ts +26 -0
  50. package/dist/Utils/segmentation/tools/ContrastTool.js +118 -0
  51. package/dist/Utils/segmentation/tools/ContrastTool.js.map +1 -0
  52. package/dist/Utils/segmentation/tools/CrosshairTool.d.ts +30 -0
  53. package/dist/Utils/segmentation/tools/CrosshairTool.js +157 -0
  54. package/dist/Utils/segmentation/tools/CrosshairTool.js.map +1 -0
  55. package/dist/Utils/segmentation/tools/DragSliceTool.d.ts +44 -0
  56. package/dist/Utils/segmentation/tools/DragSliceTool.js +170 -0
  57. package/dist/Utils/segmentation/tools/DragSliceTool.js.map +1 -0
  58. package/dist/Utils/segmentation/tools/EraserTool.d.ts +16 -0
  59. package/dist/Utils/segmentation/tools/EraserTool.js +92 -0
  60. package/dist/Utils/segmentation/tools/EraserTool.js.map +1 -0
  61. package/dist/Utils/segmentation/tools/ImageStoreHelper.d.ts +65 -0
  62. package/dist/Utils/segmentation/tools/ImageStoreHelper.js +174 -0
  63. package/dist/Utils/segmentation/tools/ImageStoreHelper.js.map +1 -0
  64. package/dist/Utils/segmentation/tools/SphereTool.d.ts +38 -0
  65. package/dist/Utils/segmentation/tools/SphereTool.js +193 -0
  66. package/dist/Utils/segmentation/tools/SphereTool.js.map +1 -0
  67. package/dist/Utils/segmentation/tools/ZoomTool.d.ts +20 -0
  68. package/dist/Utils/segmentation/tools/ZoomTool.js +59 -0
  69. package/dist/Utils/segmentation/tools/ZoomTool.js.map +1 -0
  70. package/dist/Utils/segmentation/tools/index.d.ts +22 -0
  71. package/dist/Utils/segmentation/tools/index.js +23 -0
  72. package/dist/Utils/segmentation/tools/index.js.map +1 -0
  73. package/dist/bundle.esm.js +4740 -1979
  74. package/dist/bundle.umd.js +4743 -1978
  75. package/dist/index.d.ts +5 -3
  76. package/dist/index.js +4 -2
  77. package/dist/index.js.map +1 -1
  78. package/dist/types/Renderer/copperRenderer.d.ts +1 -1
  79. package/dist/types/Renderer/copperRendererOnDemond.d.ts +1 -1
  80. package/dist/types/Scene/copperScene.d.ts +3 -0
  81. package/dist/types/Utils/segmentation/CommToolsData.d.ts +109 -6
  82. package/dist/types/Utils/segmentation/DragOperator.d.ts +13 -7
  83. package/dist/types/Utils/segmentation/DrawToolCore.d.ts +57 -76
  84. package/dist/types/Utils/segmentation/NrrdTools.d.ts +277 -15
  85. package/dist/types/Utils/segmentation/core/MaskVolume.d.ts +477 -0
  86. package/dist/types/Utils/segmentation/core/MigrationUtils.d.ts +97 -0
  87. package/dist/types/Utils/segmentation/core/UndoManager.d.ts +47 -0
  88. package/dist/types/Utils/segmentation/core/index.d.ts +76 -0
  89. package/dist/types/Utils/segmentation/core/types.d.ts +106 -0
  90. package/dist/types/Utils/segmentation/coreTools/coreType.d.ts +55 -36
  91. package/dist/types/Utils/segmentation/coreTools/gui.d.ts +6 -16
  92. package/dist/types/Utils/segmentation/eventRouter/EventRouter.d.ts +144 -0
  93. package/dist/types/Utils/segmentation/eventRouter/index.d.ts +7 -0
  94. package/dist/types/Utils/segmentation/eventRouter/types.d.ts +70 -0
  95. package/dist/types/Utils/segmentation/tools/BaseTool.d.ts +25 -0
  96. package/dist/types/Utils/segmentation/tools/ContrastTool.d.ts +26 -0
  97. package/dist/types/Utils/segmentation/tools/CrosshairTool.d.ts +30 -0
  98. package/dist/types/Utils/segmentation/tools/DragSliceTool.d.ts +44 -0
  99. package/dist/types/Utils/segmentation/tools/EraserTool.d.ts +16 -0
  100. package/dist/types/Utils/segmentation/tools/ImageStoreHelper.d.ts +65 -0
  101. package/dist/types/Utils/segmentation/tools/SphereTool.d.ts +38 -0
  102. package/dist/types/Utils/segmentation/tools/ZoomTool.d.ts +20 -0
  103. package/dist/types/Utils/segmentation/tools/index.d.ts +22 -0
  104. package/dist/types/index.d.ts +5 -3
  105. package/dist/types/types/types.d.ts +3 -3
  106. package/dist/types/types.d.ts +3 -3
  107. package/package.json +1 -1
  108. package/dist/Utils/segmentation/coreTools/archive.d.ts +0 -1
  109. package/dist/Utils/segmentation/coreTools/archive.js +0 -23
  110. package/dist/Utils/segmentation/coreTools/archive.js.map +0 -1
  111. package/dist/types/Utils/segmentation/coreTools/archive.d.ts +0 -1
@@ -1,8 +1,25 @@
1
+ import { MaskVolume } from "./core/index";
1
2
  import { switchPencilIcon } from "../utils";
2
3
  import { enableDownload } from "./coreTools/divControlTools";
3
4
  export class CommToolsData {
4
- constructor(container, mainAreaContainer) {
5
+ constructor(container, mainAreaContainer, options) {
6
+ var _a;
5
7
  this.baseCanvasesSize = 1;
8
+ // Reusable ImageData buffer for zero-allocation slice rendering
9
+ this._reusableSliceBuffer = null;
10
+ this._reusableBufferWidth = 0;
11
+ this._reusableBufferHeight = 0;
12
+ /** Whether the keyboard-config dialog is open (suppresses all shortcuts). */
13
+ this._configKeyBoard = false;
14
+ /** Active keyboard shortcut bindings. */
15
+ this._keyboardSettings = {
16
+ draw: "Shift",
17
+ undo: "z",
18
+ redo: "y",
19
+ contrast: ["Control", "Meta"],
20
+ crosshair: "s",
21
+ mouseWheel: "Scroll:Zoom",
22
+ };
6
23
  this.nrrd_states = {
7
24
  originWidth: 0,
8
25
  originHeight: 0,
@@ -24,7 +41,6 @@ export class CommToolsData {
24
41
  dimensions: [],
25
42
  loadMaskJson: false,
26
43
  ratios: { x: 1, y: 1, z: 1 },
27
- sharedPlace: { x: [-1], y: [-1], z: [-1] },
28
44
  contrastNum: 0,
29
45
  showContrast: false,
30
46
  enableCursorChoose: false,
@@ -51,16 +67,10 @@ export class CommToolsData {
51
67
  previousPanelL: -99999,
52
68
  previousPanelT: -99999,
53
69
  switchSliceFlag: false,
54
- labels: ["label1", "label2", "label3"],
55
- configKeyBoard: false,
56
- keyboardSettings: {
57
- draw: "Shift",
58
- undo: "z",
59
- contrast: ["Control", "Meta"],
60
- crosshair: "s",
61
- mouseWheel: "Scroll:Zoom",
62
- },
63
- getMask: (mask, sliceId, label, width, height, clearAllFlag) => { },
70
+ layers: ["layer1", "layer2", "layer3"],
71
+ getMask: (sliceData, layerId, channelId, sliceIndex, axis, width, height, clearFlag) => { },
72
+ onClearLayerVolume: (layerId) => { },
73
+ onChannelColorChanged: () => { },
64
74
  getSphere: (sphereOrigin, sphereRadius) => { },
65
75
  getCalculateSpherePositions: (tumourSphereOrigin, skinSphereOrigin, ribSphereOrigin, nippleSphereOrigin, aixs) => { },
66
76
  drawStartPos: { x: 1, y: 1 },
@@ -89,15 +99,15 @@ export class CommToolsData {
89
99
  mainAreaSize: 3,
90
100
  dragSensitivity: 75,
91
101
  Eraser: false,
92
- globalAlpha: 0.7,
102
+ globalAlpha: 0.6,
93
103
  lineWidth: 2,
94
104
  color: "#f50a33",
95
- segmentation: true,
105
+ pencil: true,
96
106
  fillColor: "#00ff00",
97
107
  brushColor: "#00ff00",
98
- brushAndEraserSize: 15,
108
+ brushAndEraserSize: 10,
99
109
  cursor: "dot",
100
- label: "label1",
110
+ layer: "layer1",
101
111
  cal_distance: "tumour",
102
112
  sphere: false,
103
113
  calculator: false,
@@ -120,6 +130,9 @@ export class CommToolsData {
120
130
  undo: () => {
121
131
  this.undoLastPainting();
122
132
  },
133
+ redo: () => {
134
+ this.redoLastPainting();
135
+ },
123
136
  downloadCurrentMask: () => {
124
137
  const config = {
125
138
  axis: this.protectedData.axis,
@@ -136,8 +149,31 @@ export class CommToolsData {
136
149
  this.resizePaintArea(this.nrrd_states.sizeFoctor);
137
150
  this.resetPaintAreaUIPosition();
138
151
  },
152
+ activeChannel: 1,
153
+ layerVisibility: { layer1: true, layer2: true, layer3: true },
154
+ channelVisibility: {
155
+ layer1: { 1: true, 2: true, 3: true, 4: true, 5: true, 6: true, 7: true, 8: true },
156
+ layer2: { 1: true, 2: true, 3: true, 4: true, 5: true, 6: true, 7: true, 8: true },
157
+ layer3: { 1: true, 2: true, 3: true, 4: true, 5: true, 6: true, 7: true, 8: true },
158
+ },
139
159
  };
140
- const canvases = this.generateCanvases();
160
+ const layers = (_a = options === null || options === void 0 ? void 0 : options.layers) !== null && _a !== void 0 ? _a : ["layer1", "layer2", "layer3"];
161
+ if (layers.length > 10) {
162
+ console.warn(`CommToolsData: ${layers.length} layers requested; recommended maximum is 10.`);
163
+ }
164
+ // Override the default states with the actual layer list
165
+ this.nrrd_states.layers = layers;
166
+ this.gui_states.layerVisibility = Object.fromEntries(layers.map((id) => [id, true]));
167
+ this.gui_states.channelVisibility = Object.fromEntries(layers.map((id) => [
168
+ id,
169
+ { 1: true, 2: true, 3: true, 4: true, 5: true, 6: true, 7: true, 8: true },
170
+ ]));
171
+ const systemCanvases = this.generateSystemCanvases();
172
+ const layerTargets = this.generateLayerTargets(layers);
173
+ // Get NRRD dimensions (will be set later when NRRD loads)
174
+ // Default to 1x1x1 for now, will be re-initialized in NrrdTools when dimensions are known
175
+ const dims = this.nrrd_states.dimensions;
176
+ const [width, height, depth] = dims.length === 3 ? dims : [1, 1, 1];
141
177
  this.protectedData = {
142
178
  container,
143
179
  mainAreaContainer,
@@ -152,45 +188,127 @@ export class CommToolsData {
152
188
  Is_Draw: false,
153
189
  axis: "z",
154
190
  maskData: {
155
- // used to store one label all marks
156
- paintImagesLabel1: { x: [], y: [], z: [] },
157
- paintImagesLabel2: { x: [], y: [], z: [] },
158
- paintImagesLabel3: { x: [], y: [], z: [] },
159
- // used to store display marks with multiple labels
160
- paintImages: { x: [], y: [], z: [] },
191
+ // Volumetric storage (Phase 3 only storage mechanism)
192
+ volumes: layers.reduce((acc, id) => {
193
+ acc[id] = new MaskVolume(width, height, depth, 1);
194
+ return acc;
195
+ }, {}),
161
196
  },
197
+ layerTargets,
162
198
  canvases: {
199
+ /**
200
+ * Caches raw image data from the current slice.
201
+ * Used as a source for zoom/pan operations to avoid repeated decoding.
202
+ * Initialized as null, set in NrrdTools.ts.
203
+ */
163
204
  originCanvas: null,
164
- drawingCanvas: canvases[0],
165
- displayCanvas: canvases[1],
166
- drawingCanvasLayerMaster: canvases[2],
167
- drawingCanvasLayerOne: canvases[3],
168
- drawingCanvasLayerTwo: canvases[4],
169
- drawingCanvasLayerThree: canvases[5],
170
- drawingSphereCanvas: canvases[6],
171
- emptyCanvas: canvases[7],
205
+ /**
206
+ * Top-most interaction layer.
207
+ * Captures mouse/pen events and displays real-time drawing strokes
208
+ * before they are committed to a specific layer.
209
+ */
210
+ drawingCanvas: systemCanvases.drawingCanvas,
211
+ /**
212
+ * Background layer displaying the actual medical image slice (CT/MRI).
213
+ * This is the "base" image the user sees.
214
+ */
215
+ displayCanvas: systemCanvases.displayCanvas,
216
+ /**
217
+ * Composite display layer.
218
+ * Merges all segmentation layers for unified visualization
219
+ * on top of the medical image.
220
+ */
221
+ drawingCanvasLayerMaster: systemCanvases.drawingCanvasLayerMaster,
222
+ /**
223
+ * Dedicated layer for 3D Sphere tool visualization.
224
+ * Kept separate to allow independent rendering of sphere UI elements.
225
+ */
226
+ drawingSphereCanvas: systemCanvases.drawingSphereCanvas,
227
+ /**
228
+ * Off-screen scratchpad canvas.
229
+ * Used for internal image processing, scaling, and format conversion.
230
+ */
231
+ emptyCanvas: systemCanvases.emptyCanvas,
172
232
  },
173
233
  ctxes: {
174
- drawingCtx: canvases[0].getContext("2d"),
175
- displayCtx: canvases[1].getContext("2d"),
176
- drawingLayerMasterCtx: canvases[2].getContext("2d"),
177
- drawingLayerOneCtx: canvases[3].getContext("2d"),
178
- drawingLayerTwoCtx: canvases[4].getContext("2d"),
179
- drawingLayerThreeCtx: canvases[5].getContext("2d"),
180
- drawingSphereCtx: canvases[6].getContext("2d"),
181
- emptyCtx: canvases[7].getContext("2d", {
234
+ drawingCtx: systemCanvases.drawingCanvas.getContext("2d"),
235
+ displayCtx: systemCanvases.displayCanvas.getContext("2d"),
236
+ drawingLayerMasterCtx: systemCanvases.drawingCanvasLayerMaster.getContext("2d"),
237
+ drawingSphereCtx: systemCanvases.drawingSphereCanvas.getContext("2d"),
238
+ emptyCtx: systemCanvases.emptyCanvas.getContext("2d", {
182
239
  willReadFrequently: true,
183
240
  }),
184
241
  },
185
242
  };
186
243
  }
187
- generateCanvases() {
188
- const canvasArr = [];
189
- for (let i = 0; i < 8; i++) {
244
+ // ── Volume Accessor Helpers (Phase 2) ──────────────────────────────────
245
+ /**
246
+ * Get MaskVolume for a specific layer
247
+ *
248
+ * @param layer - Layer name: "layer1", "layer2", or "layer3"
249
+ * @returns MaskVolume instance for the specified layer
250
+ *
251
+ * @example
252
+ * ```ts
253
+ * const volume = this.getVolumeForLayer("layer1");
254
+ * volume.setVoxel(x, y, z, 255);
255
+ * ```
256
+ */
257
+ getVolumeForLayer(layer) {
258
+ const { volumes } = this.protectedData.maskData;
259
+ const vol = volumes[layer];
260
+ if (vol)
261
+ return vol;
262
+ const firstLayerId = this.nrrd_states.layers[0];
263
+ console.warn(`CommToolsData: unknown layer "${layer}", falling back to "${firstLayerId}"`);
264
+ return volumes[firstLayerId];
265
+ }
266
+ /**
267
+ * Get MaskVolume for the currently active layer
268
+ *
269
+ * @returns MaskVolume instance for the current layer
270
+ *
271
+ * @example
272
+ * ```ts
273
+ * const volume = this.getCurrentVolume();
274
+ * const slice = volume.getSliceImageData(50, 'z');
275
+ * ```
276
+ */
277
+ getCurrentVolume() {
278
+ return this.getVolumeForLayer(this.gui_states.layer);
279
+ }
280
+ /**
281
+ * Get all three MaskVolume instances
282
+ *
283
+ * @returns Object containing all three layer volumes
284
+ *
285
+ * @example
286
+ * ```ts
287
+ * const { layer1, layer2, layer3 } = this.getAllVolumes();
288
+ * layer1.clear();
289
+ * ```
290
+ */
291
+ getAllVolumes() {
292
+ return this.protectedData.maskData.volumes;
293
+ }
294
+ // ───────────────────────────────────────────────────────────────────────
295
+ generateSystemCanvases() {
296
+ return {
297
+ drawingCanvas: document.createElement("canvas"),
298
+ displayCanvas: document.createElement("canvas"),
299
+ drawingCanvasLayerMaster: document.createElement("canvas"),
300
+ drawingSphereCanvas: document.createElement("canvas"),
301
+ emptyCanvas: document.createElement("canvas"),
302
+ };
303
+ }
304
+ generateLayerTargets(layerIds) {
305
+ const map = new Map();
306
+ for (const id of layerIds) {
190
307
  const canvas = document.createElement("canvas");
191
- canvasArr.push(canvas);
308
+ const ctx = canvas.getContext("2d");
309
+ map.set(id, { canvas, ctx });
192
310
  }
193
- return canvasArr;
311
+ return map;
194
312
  }
195
313
  /**
196
314
  * Rewrite this {clearPaint} function under DrawToolCore
@@ -204,6 +322,12 @@ export class CommToolsData {
204
322
  undoLastPainting() {
205
323
  throw new Error("Child class must implement abstract undoLastPainting, currently you can find it in DrawToolCore.");
206
324
  }
325
+ /**
326
+ * Rewrite this {redoLastPainting} function under DrawToolCore
327
+ */
328
+ redoLastPainting() {
329
+ throw new Error("Child class must implement abstract redoLastPainting, currently you can find it in DrawToolCore.");
330
+ }
207
331
  /**
208
332
  * Rewrite this {clearStoreImages} function under NrrdTools
209
333
  */
@@ -279,15 +403,155 @@ export class CommToolsData {
279
403
  /**
280
404
  * Get a painted mask image (IPaintImage) based on current axis and input slice index.
281
405
  *
406
+ * Phase 3: Reads directly from MaskVolume (no caching needed — reads are fast).
407
+ *
282
408
  * @param axis "x" | "y" | "z"
283
409
  * @param sliceIndex number
284
- * @param paintedImages IPaintImages, All painted mask images.
285
- * @returns
410
+ * @returns IPaintImage with the mask for the given slice, or undefined if not found
286
411
  */
287
- filterDrawedImage(axis, sliceIndex, paintedImages) {
288
- return paintedImages[axis].filter((item) => {
289
- return item.index === sliceIndex;
290
- })[0];
412
+ filterDrawedImage(axis, sliceIndex) {
413
+ try {
414
+ const volume = this.getCurrentVolume();
415
+ if (volume) {
416
+ const dims = volume.getDimensions();
417
+ const [w, h] = axis === 'z' ? [dims.width, dims.height]
418
+ : axis === 'y' ? [dims.width, dims.depth]
419
+ // Sagittal: width = depth (Z), height = height (Y)
420
+ : [dims.depth, dims.height];
421
+ const imageData = new ImageData(w, h);
422
+ const channelVis = this.gui_states.channelVisibility[this.gui_states.layer];
423
+ volume.renderLabelSliceInto(sliceIndex, axis, imageData, channelVis);
424
+ return { index: sliceIndex, image: imageData };
425
+ }
426
+ }
427
+ catch (err) {
428
+ // Volume not ready or slice out of bounds
429
+ }
430
+ return undefined;
431
+ }
432
+ /**
433
+ * Get or create a reusable ImageData buffer for the given axis.
434
+ *
435
+ * Reuses the same buffer across multiple slice renders to avoid
436
+ * allocating a new ImageData per layer per slice switch.
437
+ * The buffer is only reallocated when slice dimensions change (axis switch).
438
+ *
439
+ * @param axis - Axis: "x", "y", or "z"
440
+ * @returns Reusable ImageData buffer with correct dimensions
441
+ */
442
+ getOrCreateSliceBuffer(axis) {
443
+ try {
444
+ const vol = this.getVolumeForLayer(this.nrrd_states.layers[0]);
445
+ const dims = vol.getDimensions();
446
+ const [w, h] = axis === "z" ? [dims.width, dims.height] :
447
+ axis === "y" ? [dims.width, dims.depth] :
448
+ // Sagittal: width = depth (Z), height = height (Y)
449
+ // Matches setEmptyCanvasSize('x') and MaskVolume.getSliceDimensions('x')
450
+ [dims.depth, dims.height];
451
+ if (!this._reusableSliceBuffer ||
452
+ this._reusableBufferWidth !== w ||
453
+ this._reusableBufferHeight !== h) {
454
+ this._reusableSliceBuffer = new ImageData(w, h);
455
+ this._reusableBufferWidth = w;
456
+ this._reusableBufferHeight = h;
457
+ }
458
+ return this._reusableSliceBuffer;
459
+ }
460
+ catch (_a) {
461
+ return null; // Volume not ready
462
+ }
463
+ }
464
+ /**
465
+ * Render a layer's slice into a reusable buffer and draw to the target canvas.
466
+ *
467
+ * Uses MaskVolume.getSliceRawImageDataInto() for zero-allocation rendering.
468
+ * The caller should obtain the buffer via getOrCreateSliceBuffer() and reuse
469
+ * it across multiple layer renders.
470
+ *
471
+ * @param layer - Layer name: "layer1", "layer2", or "layer3"
472
+ * @param axis - Axis: "x", "y", or "z"
473
+ * @param sliceIndex - Slice index
474
+ * @param buffer - Reusable ImageData buffer (from getOrCreateSliceBuffer)
475
+ * @param targetCtx - Canvas context to draw the result onto
476
+ * @param scaledWidth - Target display width
477
+ * @param scaledHeight - Target display height
478
+ */
479
+ renderSliceToCanvas(layer, axis, sliceIndex, buffer, targetCtx, scaledWidth, scaledHeight) {
480
+ try {
481
+ const volume = this.getVolumeForLayer(layer);
482
+ if (!volume)
483
+ return;
484
+ // Get channel visibility for this layer
485
+ const channelVis = this.gui_states.channelVisibility[layer];
486
+ // Render label slice at full alpha — globalAlpha applied during compositeAllLayers
487
+ volume.renderLabelSliceInto(sliceIndex, axis, buffer, channelVis, 1.0);
488
+ this.setEmptyCanvasSize(axis);
489
+ this.protectedData.ctxes.emptyCtx.putImageData(buffer, 0, 0);
490
+ // No flip: MaskVolume stores in source coordinates matching the Three.js
491
+ // slice convention. Applying a display flip here would invert cross-axis
492
+ // slice indices (e.g. coronal 220 → 228 for a 448-slice volume).
493
+ targetCtx.imageSmoothingEnabled = false;
494
+ targetCtx.drawImage(this.protectedData.canvases.emptyCanvas, 0, 0, scaledWidth, scaledHeight);
495
+ }
496
+ catch (err) {
497
+ // Slice out of bounds or volume not ready — skip silently
498
+ }
499
+ }
500
+ /**
501
+ * Invalidate the reusable buffer (e.g. when switching datasets).
502
+ * The buffer will be lazily recreated on next use.
503
+ */
504
+ invalidateSliceBuffer() {
505
+ this._reusableSliceBuffer = null;
506
+ this._reusableBufferWidth = 0;
507
+ this._reusableBufferHeight = 0;
508
+ }
509
+ /**
510
+ * Apply the same flip transform used by flipDisplayImageByAxis() to any
511
+ * canvas context. This ensures mask overlays align with the flipped CT image.
512
+ *
513
+ * The flip is its own inverse (applying twice = identity), so it works for
514
+ * both directions: volume→display (rendering) and display→volume (storing).
515
+ *
516
+ * @param ctx Target 2D context (must be wrapped in save/restore by caller).
517
+ * @param width Canvas width in pixels.
518
+ * @param height Canvas height in pixels.
519
+ * @param axis Current viewing axis.
520
+ */
521
+ applyMaskFlipForAxis(ctx, width, height, axis) {
522
+ switch (axis) {
523
+ case "x": // sagittal: flip both axes
524
+ ctx.scale(-1, -1);
525
+ ctx.translate(-width, -height);
526
+ break;
527
+ case "y": // coronal: flip vertically
528
+ ctx.scale(1, -1);
529
+ ctx.translate(0, -height);
530
+ break;
531
+ case "z": // axial: flip vertically
532
+ ctx.scale(1, -1);
533
+ ctx.translate(0, -height);
534
+ break;
535
+ }
536
+ }
537
+ /**
538
+ * Composite all layer canvases to the master display canvas.
539
+ * Only draws layers whose visibility is enabled.
540
+ */
541
+ compositeAllLayers() {
542
+ const masterCtx = this.protectedData.ctxes.drawingLayerMasterCtx;
543
+ const width = this.nrrd_states.changedWidth;
544
+ const height = this.nrrd_states.changedHeight;
545
+ masterCtx.clearRect(0, 0, width, height);
546
+ // Master stores full-alpha composite; globalAlpha is applied once in
547
+ // start() when drawing master to drawingCtx (single point of control).
548
+ for (const layerId of this.nrrd_states.layers) {
549
+ if (!this.gui_states.layerVisibility[layerId])
550
+ continue;
551
+ const target = this.protectedData.layerTargets.get(layerId);
552
+ if (target)
553
+ masterCtx.drawImage(target.canvas, 0, 0, width, height);
554
+ }
291
555
  }
292
556
  }
293
557
  //# sourceMappingURL=CommToolsData.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CommToolsData.js","sourceRoot":"","sources":["../../../src/Utils/segmentation/CommToolsData.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"CommToolsData.js","sourceRoot":"","sources":["../../../src/Utils/segmentation/CommToolsData.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
- import { IDragOpts, IDrawingEvents, IProtected, IGUIStates, INrrdStates, IPaintImage, IPaintImages } from "./coreTools/coreType";
1
+ import { IDragOpts, IDrawingEvents, IProtected, IGUIStates, INrrdStates } from "./coreTools/coreType";
2
+ import type { EventRouter } from "./eventRouter";
2
3
  export declare class DragOperator {
3
4
  container: HTMLElement;
4
5
  private dragPrameters;
@@ -8,20 +9,25 @@ export declare class DragOperator {
8
9
  private nrrd_states;
9
10
  private gui_states;
10
11
  private protectedData;
11
- private dragEffectCanvases;
12
+ private dragSliceTool;
12
13
  private setSyncsliceNum;
13
14
  private setIsDrawFalse;
14
15
  private flipDisplayImageByAxis;
15
16
  private setEmptyCanvasSize;
16
- private filterDrawedImage;
17
- constructor(container: HTMLElement, nrrd_sates: INrrdStates, gui_states: IGUIStates, protectedData: IProtected, drawingPrameters: IDrawingEvents, setSyncsliceNum: () => void, setIsDrawFalse: (target: number) => void, flipDisplayImageByAxis: () => void, setEmptyCanvasSize: (axis?: "x" | "y" | "z") => void, filterDrawedImage: (axis: "x" | "y" | "z", sliceIndex: number, paintedImages: IPaintImages) => IPaintImage);
17
+ private getOrCreateSliceBuffer;
18
+ private renderSliceToCanvas;
19
+ private eventRouter;
20
+ constructor(container: HTMLElement, nrrd_sates: INrrdStates, gui_states: IGUIStates, protectedData: IProtected, drawingPrameters: IDrawingEvents, setSyncsliceNum: () => void, setIsDrawFalse: (target: number) => void, flipDisplayImageByAxis: () => void, setEmptyCanvasSize: (axis?: "x" | "y" | "z") => void, getOrCreateSliceBuffer: (axis: "x" | "y" | "z") => ImageData | null, renderSliceToCanvas: (layer: string, axis: "x" | "y" | "z", sliceIndex: number, buffer: ImageData, targetCtx: CanvasRenderingContext2D, scaledWidth: number, scaledHeight: number) => void);
18
21
  private init;
19
22
  setShowDragNumberDiv(sliceIndexContainer: HTMLDivElement): void;
23
+ /**
24
+ * Set the EventRouter reference for centralized event handling.
25
+ * Called by NrrdTools/DrawToolCore after EventRouter is initialized.
26
+ * Subscribes to mode changes to control drag mode.
27
+ */
28
+ setEventRouter(eventRouter: EventRouter): void;
20
29
  drag(opts?: IDragOpts): void;
21
30
  updateIndex(move: number): void;
22
- private drawDragSlice;
23
- private drawMaskToLabelCtx;
24
- private cleanCanvases;
25
31
  updateShowNumDiv(contrastNum: number): void;
26
32
  updateCurrentContrastSlice(): any;
27
33
  configDragMode: () => void;