@cornerstonejs/core 0.12.1 → 0.13.2

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 (75) hide show
  1. package/dist/cjs/RenderingEngine/RenderingEngine.js +21 -11
  2. package/dist/cjs/RenderingEngine/RenderingEngine.js.map +1 -1
  3. package/dist/cjs/RenderingEngine/StackViewport.d.ts +2 -1
  4. package/dist/cjs/RenderingEngine/StackViewport.js +167 -68
  5. package/dist/cjs/RenderingEngine/StackViewport.js.map +1 -1
  6. package/dist/cjs/RenderingEngine/Viewport.d.ts +1 -0
  7. package/dist/cjs/RenderingEngine/Viewport.js +12 -3
  8. package/dist/cjs/RenderingEngine/Viewport.js.map +1 -1
  9. package/dist/cjs/RenderingEngine/VolumeViewport.js +16 -2
  10. package/dist/cjs/RenderingEngine/VolumeViewport.js.map +1 -1
  11. package/dist/cjs/RenderingEngine/helpers/cpuFallback/drawImageSync.js +0 -1
  12. package/dist/cjs/RenderingEngine/helpers/cpuFallback/drawImageSync.js.map +1 -1
  13. package/dist/cjs/RenderingEngine/helpers/cpuFallback/rendering/correctShift.d.ts +7 -0
  14. package/dist/cjs/RenderingEngine/helpers/cpuFallback/rendering/correctShift.js +19 -0
  15. package/dist/cjs/RenderingEngine/helpers/cpuFallback/rendering/correctShift.js.map +1 -0
  16. package/dist/cjs/RenderingEngine/helpers/createVolumeActor.d.ts +1 -1
  17. package/dist/cjs/RenderingEngine/vtkClasses/vtkOffscreenMultiRenderWindow.js +1 -2
  18. package/dist/cjs/RenderingEngine/vtkClasses/vtkOffscreenMultiRenderWindow.js.map +1 -1
  19. package/dist/cjs/cache/classes/ImageVolume.d.ts +1 -0
  20. package/dist/cjs/cache/classes/ImageVolume.js.map +1 -1
  21. package/dist/cjs/enums/BlendModes.d.ts +4 -4
  22. package/dist/cjs/enums/BlendModes.js +4 -4
  23. package/dist/cjs/enums/BlendModes.js.map +1 -1
  24. package/dist/cjs/types/CPUFallbackViewport.d.ts +2 -0
  25. package/dist/cjs/types/CPUIImageData.d.ts +1 -0
  26. package/dist/cjs/types/IActor.d.ts +3 -1
  27. package/dist/cjs/types/ICamera.d.ts +1 -0
  28. package/dist/cjs/types/IImageData.d.ts +1 -0
  29. package/dist/cjs/types/IImageVolume.d.ts +1 -0
  30. package/dist/cjs/types/StackViewportProperties.d.ts +1 -0
  31. package/dist/cjs/utilities/index.d.ts +2 -1
  32. package/dist/cjs/utilities/index.js +3 -1
  33. package/dist/cjs/utilities/index.js.map +1 -1
  34. package/dist/cjs/utilities/isImageActor.d.ts +4 -0
  35. package/dist/cjs/utilities/isImageActor.js +13 -0
  36. package/dist/cjs/utilities/isImageActor.js.map +1 -0
  37. package/dist/esm/RenderingEngine/RenderingEngine.js +21 -11
  38. package/dist/esm/RenderingEngine/RenderingEngine.js.map +1 -1
  39. package/dist/esm/RenderingEngine/StackViewport.d.ts +2 -1
  40. package/dist/esm/RenderingEngine/StackViewport.js +171 -68
  41. package/dist/esm/RenderingEngine/StackViewport.js.map +1 -1
  42. package/dist/esm/RenderingEngine/Viewport.d.ts +1 -0
  43. package/dist/esm/RenderingEngine/Viewport.js +12 -4
  44. package/dist/esm/RenderingEngine/Viewport.js.map +1 -1
  45. package/dist/esm/RenderingEngine/VolumeViewport.js +16 -2
  46. package/dist/esm/RenderingEngine/VolumeViewport.js.map +1 -1
  47. package/dist/esm/RenderingEngine/helpers/cpuFallback/drawImageSync.js +0 -1
  48. package/dist/esm/RenderingEngine/helpers/cpuFallback/drawImageSync.js.map +1 -1
  49. package/dist/esm/RenderingEngine/helpers/cpuFallback/rendering/correctShift.d.ts +7 -0
  50. package/dist/esm/RenderingEngine/helpers/cpuFallback/rendering/correctShift.js +16 -0
  51. package/dist/esm/RenderingEngine/helpers/cpuFallback/rendering/correctShift.js.map +1 -0
  52. package/dist/esm/RenderingEngine/helpers/createVolumeActor.d.ts +1 -1
  53. package/dist/esm/RenderingEngine/vtkClasses/vtkOffscreenMultiRenderWindow.js +1 -2
  54. package/dist/esm/RenderingEngine/vtkClasses/vtkOffscreenMultiRenderWindow.js.map +1 -1
  55. package/dist/esm/cache/classes/ImageVolume.d.ts +1 -0
  56. package/dist/esm/cache/classes/ImageVolume.js.map +1 -1
  57. package/dist/esm/enums/BlendModes.d.ts +4 -4
  58. package/dist/esm/enums/BlendModes.js +4 -4
  59. package/dist/esm/enums/BlendModes.js.map +1 -1
  60. package/dist/esm/types/CPUFallbackViewport.d.ts +2 -0
  61. package/dist/esm/types/CPUIImageData.d.ts +1 -0
  62. package/dist/esm/types/IActor.d.ts +3 -1
  63. package/dist/esm/types/ICamera.d.ts +1 -0
  64. package/dist/esm/types/IImageData.d.ts +1 -0
  65. package/dist/esm/types/IImageVolume.d.ts +1 -0
  66. package/dist/esm/types/StackViewportProperties.d.ts +1 -0
  67. package/dist/esm/utilities/index.d.ts +2 -1
  68. package/dist/esm/utilities/index.js +2 -1
  69. package/dist/esm/utilities/index.js.map +1 -1
  70. package/dist/esm/utilities/isImageActor.d.ts +4 -0
  71. package/dist/esm/utilities/isImageActor.js +10 -0
  72. package/dist/esm/utilities/isImageActor.js.map +1 -0
  73. package/dist/umd/index.js +1 -1
  74. package/dist/umd/index.js.map +1 -1
  75. package/package.json +4 -4
@@ -1,15 +1,16 @@
1
1
  import vtkDataArray from '@kitware/vtk.js/Common/Core/DataArray';
2
2
  import vtkImageData from '@kitware/vtk.js/Common/DataModel/ImageData';
3
- import vtkVolume from '@kitware/vtk.js/Rendering/Core/Volume';
4
- import vtkVolumeMapper from '@kitware/vtk.js/Rendering/Core/VolumeMapper';
5
3
  import _cloneDeep from 'lodash.clonedeep';
6
4
  import vtkCamera from '@kitware/vtk.js/Rendering/Core/Camera';
7
5
  import { vec2, vec3, mat4 } from 'gl-matrix';
6
+ import vtkImageMapper from '@kitware/vtk.js/Rendering/Core/ImageMapper';
7
+ import vtkImageSlice from '@kitware/vtk.js/Rendering/Core/ImageSlice';
8
+ import vtkColorTransferFunction from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction';
8
9
  import * as metaData from '../metaData';
9
10
  import Viewport from './Viewport';
10
11
  import eventTarget from '../eventTarget';
11
12
  import Events from '../enums/Events';
12
- import { triggerEvent, isEqual, invertRgbTransferFunction, windowLevel as windowLevelUtil, imageIdToURI, } from '../utilities';
13
+ import { triggerEvent, isEqual, invertRgbTransferFunction, windowLevel as windowLevelUtil, imageIdToURI, isImageActor, } from '../utilities';
13
14
  import drawImageSync from './helpers/cpuFallback/drawImageSync';
14
15
  import { getColormap } from './helpers/cpuFallback/colors/index';
15
16
  import { loadAndCacheImage } from '../imageLoader';
@@ -26,6 +27,7 @@ import { getShouldUseCPURendering } from '../init';
26
27
  import RequestType from '../enums/RequestType';
27
28
  import getScalingParameters from '../utilities/getScalingParameters';
28
29
  import cache from '../cache';
30
+ import correctShift from './helpers/cpuFallback/rendering/correctShift';
29
31
  const EPSILON = 1;
30
32
  class StackViewport extends Viewport {
31
33
  constructor(props) {
@@ -58,18 +60,10 @@ class StackViewport extends Viewport {
58
60
  return imagePlaneModule.frameOfReferenceUID;
59
61
  };
60
62
  this.createActorMapper = (imageData) => {
61
- const mapper = vtkVolumeMapper.newInstance();
63
+ const mapper = vtkImageMapper.newInstance();
62
64
  mapper.setInputData(imageData);
63
- const actor = vtkVolume.newInstance();
65
+ const actor = vtkImageSlice.newInstance();
64
66
  actor.setMapper(mapper);
65
- const [xSize, ySize, zSize] = imageData.getDimensions();
66
- const [xSpacing, ySpacing, zSpacing] = imageData.getSpacing();
67
- const vSize = vec3.length([
68
- xSize * xSpacing,
69
- ySize * ySpacing,
70
- zSize * zSpacing,
71
- ]);
72
- mapper.setSampleDistance(vSize / mapper.getMaximumSamplesPerRay());
73
67
  if (imageData.getPointData().getNumberOfComponents() > 1) {
74
68
  actor.getProperty().setIndependentComponents(false);
75
69
  }
@@ -122,17 +116,34 @@ class StackViewport extends Viewport {
122
116
  };
123
117
  this.canvasToWorldGPU = (canvasPos) => {
124
118
  const renderer = this.getRenderer();
119
+ const vtkCamera = this.getVtkActiveCamera();
120
+ const crange = vtkCamera.getClippingRange();
121
+ const distance = vtkCamera.getDistance();
122
+ vtkCamera.setClippingRange(distance, distance + 0.1);
125
123
  const offscreenMultiRenderWindow = this.getRenderingEngine().offscreenMultiRenderWindow;
126
124
  const openGLRenderWindow = offscreenMultiRenderWindow.getOpenGLRenderWindow();
127
125
  const size = openGLRenderWindow.getSize();
128
- const displayCoord = [canvasPos[0] + this.sx, canvasPos[1] + this.sy];
126
+ const devicePixelRatio = window.devicePixelRatio || 1;
127
+ const canvasPosWithDPR = [
128
+ canvasPos[0] * devicePixelRatio,
129
+ canvasPos[1] * devicePixelRatio,
130
+ ];
131
+ const displayCoord = [
132
+ canvasPosWithDPR[0] + this.sx,
133
+ canvasPosWithDPR[1] + this.sy,
134
+ ];
129
135
  displayCoord[1] = size[1] - displayCoord[1];
130
136
  let worldCoord = openGLRenderWindow.displayToWorld(displayCoord[0], displayCoord[1], 0, renderer);
137
+ vtkCamera.setClippingRange(crange[0], crange[1]);
131
138
  worldCoord = this.applyFlipTx(worldCoord);
132
139
  return worldCoord;
133
140
  };
134
141
  this.worldToCanvasGPU = (worldPos) => {
135
142
  const renderer = this.getRenderer();
143
+ const vtkCamera = this.getVtkActiveCamera();
144
+ const crange = vtkCamera.getClippingRange();
145
+ const distance = vtkCamera.getDistance();
146
+ vtkCamera.setClippingRange(distance, distance + 0.1);
136
147
  const offscreenMultiRenderWindow = this.getRenderingEngine().offscreenMultiRenderWindow;
137
148
  const openGLRenderWindow = offscreenMultiRenderWindow.getOpenGLRenderWindow();
138
149
  const size = openGLRenderWindow.getSize();
@@ -142,7 +153,13 @@ class StackViewport extends Viewport {
142
153
  displayCoord[0] - this.sx,
143
154
  displayCoord[1] - this.sy,
144
155
  ];
145
- return canvasCoord;
156
+ vtkCamera.setClippingRange(crange[0], crange[1]);
157
+ const devicePixelRatio = window.devicePixelRatio || 1;
158
+ const canvasCoordWithDPR = [
159
+ canvasCoord[0] / devicePixelRatio,
160
+ canvasCoord[1] / devicePixelRatio,
161
+ ];
162
+ return canvasCoordWithDPR;
146
163
  };
147
164
  this.getCurrentImageIdIndex = () => {
148
165
  return this.currentImageIdIndex;
@@ -239,7 +256,7 @@ class StackViewport extends Viewport {
239
256
  return;
240
257
  }
241
258
  const { actor } = defaultActor;
242
- if (!actor.isA('vtkVolume')) {
259
+ if (!isImageActor(actor)) {
243
260
  return;
244
261
  }
245
262
  const vtkImageData = actor.getMapper().getInputData();
@@ -252,6 +269,7 @@ class StackViewport extends Viewport {
252
269
  imageData: actor.getMapper().getInputData(),
253
270
  metadata: { Modality: this.modality },
254
271
  scaling: this.scaling,
272
+ hasPixelSpacing: this.hasPixelSpacing,
255
273
  };
256
274
  }
257
275
  getImageDataCPU() {
@@ -283,6 +301,7 @@ class StackViewport extends Viewport {
283
301
  },
284
302
  },
285
303
  scalarData: this.cpuImagePixelData,
304
+ hasPixelSpacing: this.hasPixelSpacing,
286
305
  };
287
306
  }
288
307
  buildMetadata(imageId) {
@@ -305,6 +324,7 @@ class StackViewport extends Viewport {
305
324
  }
306
325
  this.modality = modality;
307
326
  let imagePlaneModule = metaData.get('imagePlaneModule', imageId);
327
+ imagePlaneModule = this._getImagePlaneModule(imagePlaneModule);
308
328
  if (!this.useCPURendering) {
309
329
  imagePlaneModule = this.calibrateIfNecessary(imageId, imagePlaneModule);
310
330
  }
@@ -366,9 +386,9 @@ class StackViewport extends Viewport {
366
386
  };
367
387
  return imagePlaneModule;
368
388
  }
369
- setProperties({ voiRange, invert, interpolationType, rotation, } = {}) {
389
+ setProperties({ voiRange, invert, interpolationType, rotation, } = {}, suppressEvents = false) {
370
390
  if (typeof voiRange !== 'undefined' || !this.voiApplied) {
371
- this.setVOI(voiRange);
391
+ this.setVOI(voiRange, suppressEvents);
372
392
  }
373
393
  if (typeof invert !== 'undefined') {
374
394
  this.setInvertColor(invert);
@@ -417,12 +437,13 @@ class StackViewport extends Viewport {
417
437
  });
418
438
  }
419
439
  _setPropertiesFromCache() {
440
+ const suppressEvents = true;
420
441
  this.setProperties({
421
442
  voiRange: this.voiRange,
422
443
  rotation: this.rotation,
423
444
  interpolationType: this.interpolationType,
424
445
  invert: this.invert,
425
- });
446
+ }, suppressEvents);
426
447
  }
427
448
  getCameraCPU() {
428
449
  const { metadata, viewport } = this._cpuFallbackEnabledElement;
@@ -433,45 +454,69 @@ class StackViewport extends Viewport {
433
454
  const rotationMatrix = mat4.fromRotation(mat4.create(), (this.rotation * Math.PI) / 180, viewPlaneNormal);
434
455
  viewUp = vec3.transformMat4(vec3.create(), viewUp, rotationMatrix);
435
456
  }
457
+ const canvasCenter = [
458
+ this.element.clientWidth / 2,
459
+ this.element.clientHeight / 2,
460
+ ];
461
+ const canvasCenterWorld = this.canvasToWorld(canvasCenter);
462
+ const topLeftWorld = this.canvasToWorld([0, 0]);
463
+ const bottomLeftWorld = this.canvasToWorld([0, this.element.clientHeight]);
464
+ const parallelScale = vec3.distance(topLeftWorld, bottomLeftWorld) / 2;
436
465
  return {
437
466
  parallelProjection: true,
438
- focalPoint: [0, 0, 0],
467
+ focalPoint: canvasCenterWorld,
439
468
  position: [0, 0, 0],
440
- parallelScale: viewport.scale,
469
+ parallelScale,
470
+ scale: viewport.scale,
441
471
  viewPlaneNormal: [
442
472
  viewPlaneNormal[0],
443
473
  viewPlaneNormal[1],
444
474
  viewPlaneNormal[2],
445
475
  ],
446
476
  viewUp: [viewUp[0], viewUp[1], viewUp[2]],
477
+ flipHorizontal: this.flipHorizontal,
478
+ flipVertical: this.flipVertical,
447
479
  };
448
480
  }
449
481
  setCameraCPU(cameraInterface) {
450
- const { viewport } = this._cpuFallbackEnabledElement;
482
+ const { viewport, image } = this._cpuFallbackEnabledElement;
451
483
  const previousCamera = this.getCameraCPU();
452
- const { focalPoint, viewUp, parallelScale, flipHorizontal, flipVertical } = cameraInterface;
484
+ const { focalPoint, viewUp, parallelScale, scale, flipHorizontal, flipVertical, } = cameraInterface;
485
+ const { clientHeight } = this.element;
453
486
  if (focalPoint) {
454
- const focalPointCanvas = this.worldToCanvasCPU(cameraInterface.focalPoint);
455
- const previousFocalPointCanvas = this.worldToCanvasCPU(previousCamera.focalPoint);
456
- const deltaCanvas = vec2.create();
457
- vec2.subtract(deltaCanvas, vec2.fromValues(previousFocalPointCanvas[0], previousFocalPointCanvas[1]), vec2.fromValues(focalPointCanvas[0], focalPointCanvas[1]));
458
- viewport.translation.x += deltaCanvas[0] / previousCamera.parallelScale;
459
- viewport.translation.y += deltaCanvas[1] / previousCamera.parallelScale;
460
- }
461
- if (parallelScale && previousCamera.parallelScale !== parallelScale) {
462
- const diff = previousCamera.parallelScale - parallelScale;
463
- viewport.scale += diff;
464
- }
465
- if (flipHorizontal || flipVertical) {
487
+ const focalPointCanvas = this.worldToCanvasCPU(focalPoint);
488
+ const focalPointPixel = canvasToPixel(this._cpuFallbackEnabledElement, focalPointCanvas);
489
+ const prevFocalPointCanvas = this.worldToCanvasCPU(previousCamera.focalPoint);
490
+ const prevFocalPointPixel = canvasToPixel(this._cpuFallbackEnabledElement, prevFocalPointCanvas);
491
+ const deltaPixel = vec2.create();
492
+ vec2.subtract(deltaPixel, vec2.fromValues(focalPointPixel[0], focalPointPixel[1]), vec2.fromValues(prevFocalPointPixel[0], prevFocalPointPixel[1]));
493
+ const shift = correctShift({ x: deltaPixel[0], y: deltaPixel[1] }, viewport);
494
+ viewport.translation.x -= shift.x;
495
+ viewport.translation.y -= shift.y;
496
+ }
497
+ if (parallelScale) {
498
+ const { rowPixelSpacing } = image;
499
+ const scale = (clientHeight * rowPixelSpacing * 0.5) / parallelScale;
500
+ viewport.scale = scale;
501
+ viewport.parallelScale = parallelScale;
502
+ }
503
+ if (scale) {
504
+ const { rowPixelSpacing } = image;
505
+ viewport.scale = scale;
506
+ viewport.parallelScale = (clientHeight * rowPixelSpacing * 0.5) / scale;
507
+ }
508
+ if (flipHorizontal !== undefined || flipVertical !== undefined) {
466
509
  this.setFlipCPU({ flipHorizontal, flipVertical });
467
510
  }
511
+ this._cpuFallbackEnabledElement.transform = calculateTransform(this._cpuFallbackEnabledElement);
468
512
  const updatedCamera = {
469
513
  ...previousCamera,
470
514
  focalPoint,
471
515
  viewUp,
472
- parallelScale,
473
516
  flipHorizontal,
474
517
  flipVertical,
518
+ parallelScale: viewport.parallelScale,
519
+ scale: viewport.scale,
475
520
  };
476
521
  const eventDetail = {
477
522
  previousCamera,
@@ -490,12 +535,12 @@ class StackViewport extends Viewport {
490
535
  viewport.vflip = flipVertical;
491
536
  this.flipVertical = viewport.vflip;
492
537
  }
493
- setVOI(voiRange) {
538
+ setVOI(voiRange, suppressEvents) {
494
539
  if (this.useCPURendering) {
495
- this.setVOICPU(voiRange);
540
+ this.setVOICPU(voiRange, suppressEvents);
496
541
  return;
497
542
  }
498
- this.setVOIGPU(voiRange);
543
+ this.setVOIGPU(voiRange, suppressEvents);
499
544
  }
500
545
  setRotation(rotationCache, rotation) {
501
546
  const previousCamera = this.getCamera();
@@ -548,7 +593,7 @@ class StackViewport extends Viewport {
548
593
  return;
549
594
  }
550
595
  const { actor } = defaultActor;
551
- if (!actor.isA('vtkVolume')) {
596
+ if (!isImageActor(actor)) {
552
597
  return;
553
598
  }
554
599
  const volumeProperty = actor.getProperty();
@@ -579,17 +624,27 @@ class StackViewport extends Viewport {
579
624
  return;
580
625
  }
581
626
  const { actor } = defaultActor;
582
- if (!actor.isA('vtkVolume')) {
627
+ if (!isImageActor(actor)) {
583
628
  return;
584
629
  }
585
- const volumeActor = actor;
586
- const tfunc = volumeActor.getProperty().getRGBTransferFunction(0);
587
- if ((!this.invert && invert) || (this.invert && !invert)) {
588
- invertRgbTransferFunction(tfunc);
630
+ if (actor.isA('vtkVolume')) {
631
+ const volumeActor = actor;
632
+ const tfunc = volumeActor.getProperty().getRGBTransferFunction(0);
633
+ if ((!this.invert && invert) || (this.invert && !invert)) {
634
+ invertRgbTransferFunction(tfunc);
635
+ }
636
+ this.invert = invert;
637
+ }
638
+ else if (actor.isA('vtkImageSlice')) {
639
+ const imageSliceActor = actor;
640
+ const tfunc = imageSliceActor.getProperty().getRGBTransferFunction(0);
641
+ if ((!this.invert && invert) || (this.invert && !invert)) {
642
+ invertRgbTransferFunction(tfunc);
643
+ }
644
+ this.invert = invert;
589
645
  }
590
- this.invert = invert;
591
646
  }
592
- setVOICPU(voiRange) {
647
+ setVOICPU(voiRange, suppressEvents) {
593
648
  const { viewport, image } = this._cpuFallbackEnabledElement;
594
649
  if (!viewport || !image) {
595
650
  return;
@@ -623,36 +678,38 @@ class StackViewport extends Viewport {
623
678
  viewportId: this.id,
624
679
  range: voiRange,
625
680
  };
626
- triggerEvent(this.element, Events.VOI_MODIFIED, eventDetail);
681
+ if (!suppressEvents) {
682
+ triggerEvent(this.element, Events.VOI_MODIFIED, eventDetail);
683
+ }
627
684
  }
628
- setVOIGPU(voiRange) {
685
+ setVOIGPU(voiRange, suppressEvents) {
629
686
  const defaultActor = this.getDefaultActor();
630
687
  if (!defaultActor) {
631
688
  return;
632
689
  }
633
690
  const { actor } = defaultActor;
634
- if (!actor.isA('vtkVolume')) {
691
+ if (!isImageActor(actor)) {
635
692
  return;
636
693
  }
637
- const volumeActor = actor;
638
- const tfunc = volumeActor.getProperty().getRGBTransferFunction(0);
639
- if (typeof voiRange === 'undefined') {
640
- const imageData = volumeActor.getMapper().getInputData();
694
+ const imageActor = actor;
695
+ let voiRangeToUse = voiRange;
696
+ if (typeof voiRangeToUse === 'undefined') {
697
+ const imageData = imageActor.getMapper().getInputData();
641
698
  const range = imageData.getPointData().getScalars().getRange();
642
- tfunc.setRange(range[0], range[1]);
643
- voiRange = { lower: range[0], upper: range[1] };
644
- }
645
- else {
646
- const { lower, upper } = voiRange;
647
- tfunc.setRange(lower, upper);
699
+ voiRangeToUse = { lower: range[0], upper: range[1] };
648
700
  }
701
+ const { windowWidth, windowCenter } = windowLevelUtil.toWindowLevel(voiRangeToUse.lower, voiRangeToUse.upper);
702
+ imageActor.getProperty().setColorWindow(windowWidth);
703
+ imageActor.getProperty().setColorLevel(windowCenter);
649
704
  this.voiApplied = true;
650
- this.voiRange = voiRange;
705
+ this.voiRange = voiRangeToUse;
651
706
  const eventDetail = {
652
707
  viewportId: this.id,
653
- range: voiRange,
708
+ range: voiRangeToUse,
654
709
  };
655
- triggerEvent(this.element, Events.VOI_MODIFIED, eventDetail);
710
+ if (!suppressEvents) {
711
+ triggerEvent(this.element, Events.VOI_MODIFIED, eventDetail);
712
+ }
656
713
  }
657
714
  _addScalingToViewport(imageIdScalingFactor) {
658
715
  if (!this.scaling.PET) {
@@ -784,8 +841,8 @@ class StackViewport extends Viewport {
784
841
  if (!imageData) {
785
842
  return false;
786
843
  }
787
- const [xSpacing, ySpacing, zSpacing] = imageData.getSpacing();
788
- const [xVoxels, yVoxels, zVoxels] = imageData.getDimensions();
844
+ const [xSpacing, ySpacing] = imageData.getSpacing();
845
+ const [xVoxels, yVoxels] = imageData.getDimensions();
789
846
  const imagePlaneModule = metaData.get('imagePlaneModule', image.imageId);
790
847
  const direction = imageData.getDirection();
791
848
  const rowCosines = direction.slice(0, 3);
@@ -988,9 +1045,6 @@ class StackViewport extends Viewport {
988
1045
  const previousCameraProps = _cloneDeep(this.getCamera());
989
1046
  if (sameImageData && !this.stackInvalidated) {
990
1047
  this._updateVTKImageDataFromCornerstoneImage(image);
991
- const direction = this._imageData.getDirection();
992
- const { viewPlaneNormal, viewUp } = this._getCameraOrientation(direction);
993
- this.setCameraNoEvent({ viewUp, viewPlaneNormal });
994
1048
  const cameraProps = this.getCamera();
995
1049
  this.panCache[0] = this.cameraPosOnRender[0] - cameraProps.position[0];
996
1050
  this.panCache[1] = this.cameraPosOnRender[1] - cameraProps.position[1];
@@ -1034,6 +1088,18 @@ class StackViewport extends Viewport {
1034
1088
  }
1035
1089
  this.initialVOIRange = voiRange;
1036
1090
  this.setProperties({ voiRange });
1091
+ const cfun = vtkColorTransferFunction.newInstance();
1092
+ let lower = 0;
1093
+ let upper = 1024;
1094
+ if (voiRange &&
1095
+ voiRange.lower !== undefined &&
1096
+ voiRange.upper !== undefined) {
1097
+ lower = voiRange.lower;
1098
+ upper = voiRange.upper;
1099
+ }
1100
+ cfun.addRGBPoint(lower, 0.0, 0.0, 0.0);
1101
+ cfun.addRGBPoint(upper, 1.0, 1.0, 1.0);
1102
+ actor.getProperty().setRGBTransferFunction(0, cfun);
1037
1103
  const { position } = this.getCamera();
1038
1104
  this.cameraPosOnRender = position;
1039
1105
  this.stackInvalidated = false;
@@ -1046,6 +1112,7 @@ class StackViewport extends Viewport {
1046
1112
  throw new Error(`ImageIdIndex provided ${imageIdIndex} is invalid, the stack only has ${this.imageIds.length} elements`);
1047
1113
  }
1048
1114
  this.currentImageIdIndex = imageIdIndex;
1115
+ this.hasPixelSpacing = true;
1049
1116
  const imageId = await this._loadAndDisplayImage(this.imageIds[imageIdIndex], imageIdIndex);
1050
1117
  return imageId;
1051
1118
  }
@@ -1066,6 +1133,14 @@ class StackViewport extends Viewport {
1066
1133
  return;
1067
1134
  }
1068
1135
  resetCamera(this._cpuFallbackEnabledElement, resetPan, resetZoom);
1136
+ const { scale } = this._cpuFallbackEnabledElement.viewport;
1137
+ const { clientWidth, clientHeight } = this.element;
1138
+ const center = [clientWidth / 2, clientHeight / 2];
1139
+ const centerWorld = this.canvasToWorldCPU(center);
1140
+ this.setCameraCPU({
1141
+ focalPoint: centerWorld,
1142
+ scale,
1143
+ });
1069
1144
  }
1070
1145
  resetCameraGPU(resetPan, resetZoom) {
1071
1146
  return super.resetCamera(resetPan, resetZoom);
@@ -1263,6 +1338,34 @@ class StackViewport extends Viewport {
1263
1338
  unsetColormapGPU() {
1264
1339
  throw new Error('unsetColormapGPU not implemented.');
1265
1340
  }
1341
+ _getImagePlaneModule(imagePlaneModule) {
1342
+ const newImagePlaneModule = {
1343
+ ...imagePlaneModule,
1344
+ };
1345
+ if (!newImagePlaneModule.columnPixelSpacing) {
1346
+ newImagePlaneModule.columnPixelSpacing = 1;
1347
+ this.hasPixelSpacing = false;
1348
+ }
1349
+ if (!newImagePlaneModule.rowPixelSpacing) {
1350
+ newImagePlaneModule.rowPixelSpacing = 1;
1351
+ this.hasPixelSpacing = false;
1352
+ }
1353
+ if (!newImagePlaneModule.columnCosines) {
1354
+ newImagePlaneModule.columnCosines = [0, 1, 0];
1355
+ }
1356
+ if (!newImagePlaneModule.rowCosines) {
1357
+ newImagePlaneModule.rowCosines = [1, 0, 0];
1358
+ }
1359
+ if (!newImagePlaneModule.imagePositionPatient) {
1360
+ newImagePlaneModule.imagePositionPatient = [0, 0, 0];
1361
+ }
1362
+ if (!newImagePlaneModule.imageOrientationPatient) {
1363
+ newImagePlaneModule.imageOrientationPatient = new Float32Array([
1364
+ 1, 0, 0, 0, 1, 0,
1365
+ ]);
1366
+ }
1367
+ return newImagePlaneModule;
1368
+ }
1266
1369
  }
1267
1370
  export default StackViewport;
1268
1371
  //# sourceMappingURL=StackViewport.js.map