@cornerstonejs/core 2.0.0-beta.1 → 2.0.0-beta.3

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 (124) hide show
  1. package/dist/cjs/RenderingEngine/BaseVolumeViewport.d.ts +4 -1
  2. package/dist/cjs/RenderingEngine/BaseVolumeViewport.js +28 -2
  3. package/dist/cjs/RenderingEngine/BaseVolumeViewport.js.map +1 -1
  4. package/dist/cjs/RenderingEngine/RenderingEngine.js.map +1 -1
  5. package/dist/cjs/RenderingEngine/StackViewport.d.ts +1 -0
  6. package/dist/cjs/RenderingEngine/StackViewport.js +17 -8
  7. package/dist/cjs/RenderingEngine/StackViewport.js.map +1 -1
  8. package/dist/cjs/RenderingEngine/VolumeViewport.d.ts +2 -0
  9. package/dist/cjs/RenderingEngine/VolumeViewport.js +30 -0
  10. package/dist/cjs/RenderingEngine/VolumeViewport.js.map +1 -1
  11. package/dist/cjs/RenderingEngine/VolumeViewport3D.d.ts +1 -0
  12. package/dist/cjs/RenderingEngine/VolumeViewport3D.js +3 -0
  13. package/dist/cjs/RenderingEngine/VolumeViewport3D.js.map +1 -1
  14. package/dist/cjs/RenderingEngine/helpers/cpuFallback/rendering/getVOILut.js +3 -1
  15. package/dist/cjs/RenderingEngine/helpers/cpuFallback/rendering/getVOILut.js.map +1 -1
  16. package/dist/cjs/RenderingEngine/helpers/cpuFallback/rendering/renderColorImage.js +3 -2
  17. package/dist/cjs/RenderingEngine/helpers/cpuFallback/rendering/renderColorImage.js.map +1 -1
  18. package/dist/cjs/RenderingEngine/helpers/setVolumesForViewports.js.map +1 -1
  19. package/dist/cjs/Settings.js +4 -2
  20. package/dist/cjs/Settings.js.map +1 -1
  21. package/dist/cjs/cache/cache.d.ts +3 -1
  22. package/dist/cjs/cache/cache.js +12 -7
  23. package/dist/cjs/cache/cache.js.map +1 -1
  24. package/dist/cjs/cache/classes/ImageVolume.js +2 -3
  25. package/dist/cjs/cache/classes/ImageVolume.js.map +1 -1
  26. package/dist/cjs/init.d.ts +1 -1
  27. package/dist/cjs/init.js +1 -1
  28. package/dist/cjs/init.js.map +1 -1
  29. package/dist/cjs/loaders/volumeLoader.d.ts +1 -1
  30. package/dist/cjs/loaders/volumeLoader.js.map +1 -1
  31. package/dist/cjs/requestPool/requestPoolManager.js +1 -1
  32. package/dist/cjs/requestPool/requestPoolManager.js.map +1 -1
  33. package/dist/cjs/types/AffineMatrix.d.ts +27 -0
  34. package/dist/cjs/types/AffineMatrix.js +3 -0
  35. package/dist/cjs/types/AffineMatrix.js.map +1 -0
  36. package/dist/cjs/types/IImage.d.ts +3 -0
  37. package/dist/cjs/types/IVolumeViewport.d.ts +2 -0
  38. package/dist/cjs/types/Mat3.d.ts +1 -11
  39. package/dist/cjs/types/ViewportProperties.d.ts +2 -1
  40. package/dist/cjs/types/index.d.ts +2 -1
  41. package/dist/cjs/utilities/calculateViewportsSpatialRegistration.js +9 -14
  42. package/dist/cjs/utilities/calculateViewportsSpatialRegistration.js.map +1 -1
  43. package/dist/cjs/utilities/getClosestStackImageIndexForPoint.js +12 -6
  44. package/dist/cjs/utilities/getClosestStackImageIndexForPoint.js.map +1 -1
  45. package/dist/cjs/utilities/getRuntimeId.js +2 -1
  46. package/dist/cjs/utilities/getRuntimeId.js.map +1 -1
  47. package/dist/cjs/utilities/windowLevel.js +4 -4
  48. package/dist/cjs/utilities/windowLevel.js.map +1 -1
  49. package/dist/esm/RenderingEngine/BaseVolumeViewport.d.ts +4 -1
  50. package/dist/esm/RenderingEngine/BaseVolumeViewport.js +28 -2
  51. package/dist/esm/RenderingEngine/BaseVolumeViewport.js.map +1 -1
  52. package/dist/esm/RenderingEngine/RenderingEngine.js.map +1 -1
  53. package/dist/esm/RenderingEngine/StackViewport.d.ts +1 -0
  54. package/dist/esm/RenderingEngine/StackViewport.js +17 -8
  55. package/dist/esm/RenderingEngine/StackViewport.js.map +1 -1
  56. package/dist/esm/RenderingEngine/VolumeViewport.d.ts +2 -0
  57. package/dist/esm/RenderingEngine/VolumeViewport.js +32 -2
  58. package/dist/esm/RenderingEngine/VolumeViewport.js.map +1 -1
  59. package/dist/esm/RenderingEngine/VolumeViewport3D.d.ts +1 -0
  60. package/dist/esm/RenderingEngine/VolumeViewport3D.js +3 -0
  61. package/dist/esm/RenderingEngine/VolumeViewport3D.js.map +1 -1
  62. package/dist/esm/RenderingEngine/helpers/cpuFallback/rendering/getVOILut.js +3 -1
  63. package/dist/esm/RenderingEngine/helpers/cpuFallback/rendering/getVOILut.js.map +1 -1
  64. package/dist/esm/RenderingEngine/helpers/cpuFallback/rendering/renderColorImage.js +3 -2
  65. package/dist/esm/RenderingEngine/helpers/cpuFallback/rendering/renderColorImage.js.map +1 -1
  66. package/dist/esm/RenderingEngine/helpers/setVolumesForViewports.js.map +1 -1
  67. package/dist/esm/Settings.js +4 -2
  68. package/dist/esm/Settings.js.map +1 -1
  69. package/dist/esm/cache/cache.d.ts +3 -1
  70. package/dist/esm/cache/cache.js +12 -7
  71. package/dist/esm/cache/cache.js.map +1 -1
  72. package/dist/esm/cache/classes/ImageVolume.js +2 -3
  73. package/dist/esm/cache/classes/ImageVolume.js.map +1 -1
  74. package/dist/esm/init.d.ts +1 -1
  75. package/dist/esm/init.js +1 -1
  76. package/dist/esm/init.js.map +1 -1
  77. package/dist/esm/loaders/volumeLoader.d.ts +1 -1
  78. package/dist/esm/loaders/volumeLoader.js.map +1 -1
  79. package/dist/esm/requestPool/requestPoolManager.js +1 -1
  80. package/dist/esm/requestPool/requestPoolManager.js.map +1 -1
  81. package/dist/esm/types/AffineMatrix.d.ts +27 -0
  82. package/dist/esm/types/AffineMatrix.js +2 -0
  83. package/dist/esm/types/AffineMatrix.js.map +1 -0
  84. package/dist/esm/types/IImage.d.ts +3 -0
  85. package/dist/esm/types/IVolumeViewport.d.ts +2 -0
  86. package/dist/esm/types/Mat3.d.ts +1 -11
  87. package/dist/esm/types/ViewportProperties.d.ts +2 -1
  88. package/dist/esm/types/index.d.ts +2 -1
  89. package/dist/esm/utilities/calculateViewportsSpatialRegistration.js +9 -14
  90. package/dist/esm/utilities/calculateViewportsSpatialRegistration.js.map +1 -1
  91. package/dist/esm/utilities/getClosestStackImageIndexForPoint.js +12 -6
  92. package/dist/esm/utilities/getClosestStackImageIndexForPoint.js.map +1 -1
  93. package/dist/esm/utilities/getRuntimeId.js +2 -1
  94. package/dist/esm/utilities/getRuntimeId.js.map +1 -1
  95. package/dist/esm/utilities/windowLevel.js +4 -4
  96. package/dist/esm/utilities/windowLevel.js.map +1 -1
  97. package/dist/umd/index.js +1 -1
  98. package/dist/umd/index.js.map +1 -1
  99. package/package.json +2 -2
  100. package/src/RenderingEngine/BaseVolumeViewport.ts +55 -1
  101. package/src/RenderingEngine/RenderingEngine.ts +1 -0
  102. package/src/RenderingEngine/StackViewport.ts +25 -9
  103. package/src/RenderingEngine/Viewport.ts +1 -1
  104. package/src/RenderingEngine/VolumeViewport.ts +53 -2
  105. package/src/RenderingEngine/VolumeViewport3D.ts +4 -0
  106. package/src/RenderingEngine/helpers/cpuFallback/rendering/getVOILut.ts +9 -1
  107. package/src/RenderingEngine/helpers/cpuFallback/rendering/renderColorImage.ts +5 -3
  108. package/src/RenderingEngine/helpers/setVolumesForViewports.ts +3 -1
  109. package/src/Settings.ts +6 -2
  110. package/src/cache/cache.ts +33 -18
  111. package/src/cache/classes/ImageVolume.ts +3 -3
  112. package/src/init.ts +1 -1
  113. package/src/loaders/volumeLoader.ts +2 -2
  114. package/src/requestPool/requestPoolManager.ts +1 -1
  115. package/src/types/AffineMatrix.ts +8 -0
  116. package/src/types/IImage.ts +4 -0
  117. package/src/types/IVolumeViewport.ts +8 -0
  118. package/src/types/Mat3.ts +3 -11
  119. package/src/types/ViewportProperties.ts +3 -1
  120. package/src/types/index.ts +2 -0
  121. package/src/utilities/calculateViewportsSpatialRegistration.ts +21 -28
  122. package/src/utilities/getClosestStackImageIndexForPoint.ts +18 -6
  123. package/src/utilities/getRuntimeId.ts +3 -1
  124. package/src/utilities/windowLevel.ts +13 -4
@@ -1,9 +1,15 @@
1
1
  import { vec3, mat4 } from 'gl-matrix';
2
2
  import { IStackViewport } from '../types';
3
- import { StackViewport } from '../RenderingEngine';
4
3
  import spatialRegistrationMetadataProvider from './spatialRegistrationMetadataProvider';
5
4
  import { metaData } from '..';
6
- import isEqual from './isEqual';
5
+
6
+ /**
7
+ * Defines the allowed difference as a percent between the unit normals before
8
+ * two planes are considered not coplanar. Since this value is small compared
9
+ * to the unit lenght, this value is approximately the angular difference, measured
10
+ * in radians. That is, allow about a 3 degrees variation.
11
+ */
12
+ const ALLOWED_DELTA = 0.05;
7
13
 
8
14
  /**
9
15
  * It calculates the registration matrix between two viewports (currently only
@@ -21,40 +27,28 @@ function calculateViewportsSpatialRegistration(
21
27
  viewport1: IStackViewport,
22
28
  viewport2: IStackViewport
23
29
  ): void {
24
- if (
25
- !(viewport1 instanceof StackViewport) ||
26
- !(viewport2 instanceof StackViewport)
27
- ) {
28
- throw new Error(
29
- 'calculateViewportsSpatialRegistration: Both viewports must be StackViewports, volume viewports are not supported yet'
30
- );
31
- }
32
-
33
- const isSameFrameOfReference =
34
- viewport1.getFrameOfReferenceUID() === viewport2.getFrameOfReferenceUID();
35
-
36
- if (isSameFrameOfReference) {
37
- return;
38
- }
39
-
40
30
  const imageId1 = viewport1.getCurrentImageId();
41
31
  const imageId2 = viewport2.getCurrentImageId();
42
32
 
43
33
  const imagePlaneModule1 = metaData.get('imagePlaneModule', imageId1);
44
34
  const imagePlaneModule2 = metaData.get('imagePlaneModule', imageId2);
45
35
 
46
- const isSameImagePlane =
47
- imagePlaneModule1 &&
48
- imagePlaneModule2 &&
49
- isEqual(
50
- imagePlaneModule1.imageOrientationPatient,
51
- imagePlaneModule2.imageOrientationPatient
52
- );
36
+ if (!imagePlaneModule1 || !imagePlaneModule2) {
37
+ console.log('Viewport spatial registration requires image plane module');
38
+ return;
39
+ }
40
+ const { imageOrientationPatient: iop2 } = imagePlaneModule2;
41
+ const isSameImagePlane = imagePlaneModule1.imageOrientationPatient.every(
42
+ (v, i) => Math.abs(v - iop2[i]) < ALLOWED_DELTA
43
+ );
53
44
 
54
45
  if (!isSameImagePlane) {
55
- throw new Error(
56
- 'Viewport spatial registration only supported for same orientation (hence translation only) for now'
46
+ console.log(
47
+ 'Viewport spatial registration only supported for same orientation (hence translation only) for now',
48
+ imagePlaneModule1?.imageOrientationPatient,
49
+ imagePlaneModule2?.imageOrientationPatient
57
50
  );
51
+ return;
58
52
  }
59
53
 
60
54
  const imagePositionPatient1 = imagePlaneModule1.imagePositionPatient;
@@ -67,7 +61,6 @@ function calculateViewportsSpatialRegistration(
67
61
  );
68
62
 
69
63
  const mat = mat4.fromTranslation(mat4.create(), translation);
70
-
71
64
  spatialRegistrationMetadataProvider.add([viewport1.id, viewport2.id], mat);
72
65
  }
73
66
 
@@ -29,11 +29,15 @@ export function calculateMinimalDistanceForStackViewport(
29
29
  const imageIds = viewport.getImageIds();
30
30
  const currentImageIdIndex = viewport.getCurrentImageIdIndex();
31
31
 
32
- if (imageIds.length === 0) return null;
32
+ if (imageIds.length === 0) {
33
+ return null;
34
+ }
33
35
 
34
36
  const getDistance = (imageId: string): null | number => {
35
37
  const planeMetadata = getPlaneMetadata(imageId);
36
- if (!planeMetadata) return null;
38
+ if (!planeMetadata) {
39
+ return null;
40
+ }
37
41
  const plane = planar.planeEquation(
38
42
  planeMetadata.planeNormal,
39
43
  planeMetadata.imagePositionPatient
@@ -53,22 +57,30 @@ export function calculateMinimalDistanceForStackViewport(
53
57
  for (let i = 0; i < higherImageIds.length; i++) {
54
58
  const id = higherImageIds[i];
55
59
  const distance = getDistance(id);
56
- if (distance === null) continue;
60
+ if (distance === null) {
61
+ continue;
62
+ }
57
63
  if (distance <= closestStack.distance) {
58
64
  closestStack.distance = distance;
59
65
  closestStack.index = i + currentImageIdIndex + 1;
60
- } else break;
66
+ } else {
67
+ break;
68
+ }
61
69
  }
62
70
  //check lower indices
63
71
  const lowerImageIds = imageIds.slice(0, currentImageIdIndex);
64
72
  for (let i = lowerImageIds.length - 1; i >= 0; i--) {
65
73
  const id = lowerImageIds[i];
66
74
  const distance = getDistance(id);
67
- if (distance === null || distance === closestStack.distance) continue;
75
+ if (distance === null || distance === closestStack.distance) {
76
+ continue;
77
+ }
68
78
  if (distance < closestStack.distance) {
69
79
  closestStack.distance = distance;
70
80
  closestStack.index = i;
71
- } else break;
81
+ } else {
82
+ break;
83
+ }
72
84
  }
73
85
  return closestStack.distance === Infinity ? null : closestStack;
74
86
  }
@@ -46,7 +46,9 @@ function getNextRuntimeId(
46
46
  n = n + 1;
47
47
  } else {
48
48
  n = 0;
49
- if (i + 1 === idComponents.length) idComponents.push(0);
49
+ if (i + 1 === idComponents.length) {
50
+ idComponents.push(0);
51
+ }
50
52
  }
51
53
  idComponents[i] = n;
52
54
  }
@@ -1,5 +1,8 @@
1
1
  /**
2
2
  * Given a low and high window level, return the window width and window center
3
+ * Formulas from note 4 in
4
+ * https://dicom.nema.org/medical/dicom/current/output/html/part03.html#sect_C.11.2.1.2.1
5
+ * extended to allow for low/high swapping
3
6
  * @param low - The low window level.
4
7
  * @param high - The high window level.
5
8
  * @returns a JavaScript object with two properties: windowWidth and windowCenter.
@@ -11,14 +14,20 @@ function toWindowLevel(
11
14
  windowWidth: number;
12
15
  windowCenter: number;
13
16
  } {
14
- const windowWidth = Math.abs(low - high);
15
- const windowCenter = low + windowWidth / 2;
17
+ // Allow for swapping high/low
18
+ const windowWidth = Math.abs(high - low) + 1;
19
+ const windowCenter = (low + high + 1) / 2;
16
20
 
17
21
  return { windowWidth, windowCenter };
18
22
  }
19
23
 
20
24
  /**
21
25
  * Given a window width and center, return the lower and upper bounds of the window
26
+ * The formulas for the calculation are specified in
27
+ * https://dicom.nema.org/medical/dicom/current/output/html/part03.html#sect_C.11.2.1.2.1
28
+ * if (x <= c - 0.5 - (w-1) /2), then y = ymin
29
+ * else if (x > c - 0.5 + (w-1) /2), then y = ymax
30
+ * else y = ((x - (c - 0.5)) / (w-1) + 0.5) * (ymax- ymin) + ymin
22
31
  * @param windowWidth - the width of the window in HU
23
32
  * @param windowCenter - The center of the window.
24
33
  * @returns a JavaScript object with two properties: lower and upper.
@@ -30,8 +39,8 @@ function toLowHighRange(
30
39
  lower: number;
31
40
  upper: number;
32
41
  } {
33
- const lower = windowCenter - windowWidth / 2.0;
34
- const upper = windowCenter + windowWidth / 2.0;
42
+ const lower = windowCenter - 0.5 - (windowWidth - 1) / 2;
43
+ const upper = windowCenter - 0.5 + (windowWidth - 1) / 2;
35
44
 
36
45
  return { lower, upper };
37
46
  }