@cornerstonejs/core 1.42.0 → 1.42.1

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 (157) hide show
  1. package/dist/cjs/RenderingEngine/BaseVolumeViewport.js.map +1 -1
  2. package/dist/cjs/RenderingEngine/StackViewport.js +2 -1
  3. package/dist/cjs/RenderingEngine/StackViewport.js.map +1 -1
  4. package/dist/cjs/RenderingEngine/helpers/createVolumeActor.js +2 -1
  5. package/dist/cjs/RenderingEngine/helpers/createVolumeActor.js.map +1 -1
  6. package/dist/cjs/cache/cache.d.ts +6 -3
  7. package/dist/cjs/cache/cache.js +43 -6
  8. package/dist/cjs/cache/cache.js.map +1 -1
  9. package/dist/cjs/cache/classes/ImageVolume.d.ts +25 -5
  10. package/dist/cjs/cache/classes/ImageVolume.js +302 -13
  11. package/dist/cjs/cache/classes/ImageVolume.js.map +1 -1
  12. package/dist/cjs/eventTarget.d.ts +1 -0
  13. package/dist/cjs/eventTarget.js +13 -1
  14. package/dist/cjs/eventTarget.js.map +1 -1
  15. package/dist/cjs/init.js +2 -0
  16. package/dist/cjs/init.js.map +1 -1
  17. package/dist/cjs/loaders/imageLoader.js +6 -2
  18. package/dist/cjs/loaders/imageLoader.js.map +1 -1
  19. package/dist/cjs/loaders/volumeLoader.d.ts +12 -9
  20. package/dist/cjs/loaders/volumeLoader.js +50 -5
  21. package/dist/cjs/loaders/volumeLoader.js.map +1 -1
  22. package/dist/cjs/types/Cornerstone3DConfig.d.ts +1 -0
  23. package/dist/cjs/types/IDynamicImageVolume.d.ts +2 -2
  24. package/dist/cjs/types/IImage.d.ts +5 -0
  25. package/dist/cjs/types/IImageVolume.d.ts +7 -2
  26. package/dist/cjs/types/ILoadObject.d.ts +2 -2
  27. package/dist/cjs/types/IVolume.d.ts +3 -26
  28. package/dist/cjs/types/ImageVolumeProps.d.ts +6 -0
  29. package/dist/cjs/types/ImageVolumeProps.js +3 -0
  30. package/dist/cjs/types/ImageVolumeProps.js.map +1 -0
  31. package/dist/cjs/types/VolumeProps.d.ts +27 -0
  32. package/dist/cjs/types/VolumeProps.js +3 -0
  33. package/dist/cjs/types/VolumeProps.js.map +1 -0
  34. package/dist/cjs/types/index.d.ts +4 -2
  35. package/dist/cjs/utilities/VoxelManager.d.ts +2 -2
  36. package/dist/cjs/utilities/cacheUtils.d.ts +2 -0
  37. package/dist/cjs/utilities/cacheUtils.js +96 -0
  38. package/dist/cjs/utilities/cacheUtils.js.map +1 -0
  39. package/dist/cjs/utilities/convertStackToVolumeViewport.d.ts +12 -0
  40. package/dist/cjs/utilities/convertStackToVolumeViewport.js +61 -0
  41. package/dist/cjs/utilities/convertStackToVolumeViewport.js.map +1 -0
  42. package/dist/cjs/utilities/convertVolumeToStackViewport.d.ts +9 -0
  43. package/dist/cjs/utilities/convertVolumeToStackViewport.js +95 -0
  44. package/dist/cjs/utilities/convertVolumeToStackViewport.js.map +1 -0
  45. package/dist/cjs/utilities/generateVolumePropsFromImageIds.d.ts +3 -0
  46. package/dist/cjs/utilities/generateVolumePropsFromImageIds.js +124 -0
  47. package/dist/cjs/utilities/generateVolumePropsFromImageIds.js.map +1 -0
  48. package/dist/cjs/utilities/index.d.ts +6 -1
  49. package/dist/cjs/utilities/index.js +12 -1
  50. package/dist/cjs/utilities/index.js.map +1 -1
  51. package/dist/cjs/utilities/roundNumber.d.ts +4 -0
  52. package/dist/cjs/utilities/roundNumber.js +36 -0
  53. package/dist/cjs/utilities/roundNumber.js.map +1 -0
  54. package/dist/esm/RenderingEngine/BaseVolumeViewport.js.map +1 -1
  55. package/dist/esm/RenderingEngine/StackViewport.js +2 -1
  56. package/dist/esm/RenderingEngine/StackViewport.js.map +1 -1
  57. package/dist/esm/RenderingEngine/helpers/createVolumeActor.js +1 -1
  58. package/dist/esm/RenderingEngine/helpers/createVolumeActor.js.map +1 -1
  59. package/dist/esm/cache/cache.js +43 -6
  60. package/dist/esm/cache/cache.js.map +1 -1
  61. package/dist/esm/cache/classes/ImageVolume.js +279 -14
  62. package/dist/esm/cache/classes/ImageVolume.js.map +1 -1
  63. package/dist/esm/eventTarget.js +13 -1
  64. package/dist/esm/eventTarget.js.map +1 -1
  65. package/dist/esm/init.js +2 -0
  66. package/dist/esm/init.js.map +1 -1
  67. package/dist/esm/loaders/imageLoader.js +5 -2
  68. package/dist/esm/loaders/imageLoader.js.map +1 -1
  69. package/dist/esm/loaders/volumeLoader.js +50 -5
  70. package/dist/esm/loaders/volumeLoader.js.map +1 -1
  71. package/dist/esm/types/ImageVolumeProps.js +2 -0
  72. package/dist/esm/types/ImageVolumeProps.js.map +1 -0
  73. package/dist/esm/types/VolumeProps.js +2 -0
  74. package/dist/esm/types/VolumeProps.js.map +1 -0
  75. package/dist/esm/utilities/cacheUtils.js +65 -0
  76. package/dist/esm/utilities/cacheUtils.js.map +1 -0
  77. package/dist/esm/utilities/convertStackToVolumeViewport.js +49 -0
  78. package/dist/esm/utilities/convertStackToVolumeViewport.js.map +1 -0
  79. package/dist/esm/utilities/convertVolumeToStackViewport.js +58 -0
  80. package/dist/esm/utilities/convertVolumeToStackViewport.js.map +1 -0
  81. package/dist/esm/utilities/generateVolumePropsFromImageIds.js +118 -0
  82. package/dist/esm/utilities/generateVolumePropsFromImageIds.js.map +1 -0
  83. package/dist/esm/utilities/index.js +6 -1
  84. package/dist/esm/utilities/index.js.map +1 -1
  85. package/dist/esm/utilities/roundNumber.js +33 -0
  86. package/dist/esm/utilities/roundNumber.js.map +1 -0
  87. package/dist/types/RenderingEngine/BaseVolumeViewport.d.ts.map +1 -1
  88. package/dist/types/RenderingEngine/StackViewport.d.ts.map +1 -1
  89. package/dist/types/cache/cache.d.ts +6 -3
  90. package/dist/types/cache/cache.d.ts.map +1 -1
  91. package/dist/types/cache/classes/ImageVolume.d.ts +25 -5
  92. package/dist/types/cache/classes/ImageVolume.d.ts.map +1 -1
  93. package/dist/types/eventTarget.d.ts +1 -0
  94. package/dist/types/eventTarget.d.ts.map +1 -1
  95. package/dist/types/loaders/imageLoader.d.ts.map +1 -1
  96. package/dist/types/loaders/volumeLoader.d.ts +12 -9
  97. package/dist/types/loaders/volumeLoader.d.ts.map +1 -1
  98. package/dist/types/types/Cornerstone3DConfig.d.ts +1 -0
  99. package/dist/types/types/Cornerstone3DConfig.d.ts.map +1 -1
  100. package/dist/types/types/IDynamicImageVolume.d.ts +2 -2
  101. package/dist/types/types/IDynamicImageVolume.d.ts.map +1 -1
  102. package/dist/types/types/IImage.d.ts +5 -0
  103. package/dist/types/types/IImage.d.ts.map +1 -1
  104. package/dist/types/types/IImageVolume.d.ts +7 -2
  105. package/dist/types/types/IImageVolume.d.ts.map +1 -1
  106. package/dist/types/types/ILoadObject.d.ts +2 -2
  107. package/dist/types/types/ILoadObject.d.ts.map +1 -1
  108. package/dist/types/types/IVolume.d.ts +3 -26
  109. package/dist/types/types/IVolume.d.ts.map +1 -1
  110. package/dist/types/types/ImageVolumeProps.d.ts +7 -0
  111. package/dist/types/types/ImageVolumeProps.d.ts.map +1 -0
  112. package/dist/types/types/VolumeProps.d.ts +28 -0
  113. package/dist/types/types/VolumeProps.d.ts.map +1 -0
  114. package/dist/types/types/index.d.ts +4 -2
  115. package/dist/types/types/index.d.ts.map +1 -1
  116. package/dist/types/utilities/VoxelManager.d.ts +2 -2
  117. package/dist/types/utilities/VoxelManager.d.ts.map +1 -1
  118. package/dist/types/utilities/cacheUtils.d.ts +3 -0
  119. package/dist/types/utilities/cacheUtils.d.ts.map +1 -0
  120. package/dist/types/utilities/convertStackToVolumeViewport.d.ts +13 -0
  121. package/dist/types/utilities/convertStackToVolumeViewport.d.ts.map +1 -0
  122. package/dist/types/utilities/convertVolumeToStackViewport.d.ts +10 -0
  123. package/dist/types/utilities/convertVolumeToStackViewport.d.ts.map +1 -0
  124. package/dist/types/utilities/generateVolumePropsFromImageIds.d.ts +4 -0
  125. package/dist/types/utilities/generateVolumePropsFromImageIds.d.ts.map +1 -0
  126. package/dist/types/utilities/index.d.ts +6 -1
  127. package/dist/types/utilities/index.d.ts.map +1 -1
  128. package/dist/types/utilities/roundNumber.d.ts +5 -0
  129. package/dist/types/utilities/roundNumber.d.ts.map +1 -0
  130. package/dist/umd/index.js +1 -1
  131. package/dist/umd/index.js.map +1 -1
  132. package/package.json +2 -2
  133. package/src/RenderingEngine/BaseVolumeViewport.ts +0 -1
  134. package/src/RenderingEngine/StackViewport.ts +3 -1
  135. package/src/RenderingEngine/helpers/createVolumeActor.ts +1 -1
  136. package/src/cache/cache.ts +91 -7
  137. package/src/cache/classes/ImageVolume.ts +535 -21
  138. package/src/eventTarget.ts +19 -1
  139. package/src/init.ts +2 -2
  140. package/src/loaders/imageLoader.ts +6 -2
  141. package/src/loaders/volumeLoader.ts +118 -23
  142. package/src/types/Cornerstone3DConfig.ts +12 -0
  143. package/src/types/IDynamicImageVolume.ts +2 -2
  144. package/src/types/IImage.ts +6 -0
  145. package/src/types/IImageVolume.ts +14 -2
  146. package/src/types/ILoadObject.ts +2 -2
  147. package/src/types/IVolume.ts +4 -41
  148. package/src/types/ImageVolumeProps.ts +15 -0
  149. package/src/types/VolumeProps.ts +57 -0
  150. package/src/types/index.ts +5 -2
  151. package/src/utilities/VoxelManager.ts +2 -2
  152. package/src/utilities/cacheUtils.ts +121 -0
  153. package/src/utilities/convertStackToVolumeViewport.ts +115 -0
  154. package/src/utilities/convertVolumeToStackViewport.ts +125 -0
  155. package/src/utilities/generateVolumePropsFromImageIds.ts +183 -0
  156. package/src/utilities/index.ts +11 -0
  157. package/src/utilities/roundNumber.ts +56 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cornerstonejs/core",
3
- "version": "1.42.0",
3
+ "version": "1.42.1",
4
4
  "description": "",
5
5
  "main": "src/index.ts",
6
6
  "types": "dist/types/index.d.ts",
@@ -47,5 +47,5 @@
47
47
  "type": "individual",
48
48
  "url": "https://ohif.org/donate"
49
49
  },
50
- "gitHead": "75102c80b6bc3714f00590b92ccd8d4d52bf1ca2"
50
+ "gitHead": "14a1bff3ba983b6664529e8e829a655cc4ffda89"
51
51
  }
@@ -35,7 +35,6 @@ import type {
35
35
  VOIRange,
36
36
  EventTypes,
37
37
  VolumeViewportProperties,
38
- ICamera,
39
38
  } from '../types';
40
39
  import { VoiModifiedEventDetail } from '../types/EventTypes';
41
40
  import type { ViewportInput } from '../types/IViewport';
@@ -2279,13 +2279,15 @@ class StackViewport extends Viewport implements IStackViewport, IImagesLoader {
2279
2279
 
2280
2280
  // 3b. If we cannot reuse the vtkImageData object (either the first render
2281
2281
  // or the size has changed), create a new one
2282
+
2283
+ const pixelArray = image.getPixelData();
2282
2284
  this._createVTKImageData({
2283
2285
  origin,
2284
2286
  direction,
2285
2287
  dimensions,
2286
2288
  spacing,
2287
2289
  numComps,
2288
- pixelArray: image.getPixelData(),
2290
+ pixelArray,
2289
2291
  });
2290
2292
 
2291
2293
  // Set the scalar data of the vtkImageData object from the Cornerstone
@@ -70,7 +70,7 @@ async function createVolumeActor(
70
70
  // on either the metadata or the min/max of the middle slice. Example of other
71
71
  // types of volumes which might not be composed of imageIds would be e.g., nrrd, nifti
72
72
  // format volumes
73
- if (imageVolume.imageIds) {
73
+ if (imageVolume.imageIds?.length) {
74
74
  await setDefaultVolumeVOI(volumeActor, imageVolume, useNativeDataType);
75
75
  }
76
76
 
@@ -1,7 +1,6 @@
1
1
  import {
2
2
  ICache,
3
3
  IImage,
4
- IImageVolume,
5
4
  IGeometry,
6
5
  IImageLoadObject,
7
6
  IVolumeLoadObject,
@@ -10,10 +9,12 @@ import {
10
9
  ICachedVolume,
11
10
  ICachedGeometry,
12
11
  EventTypes,
12
+ IImageVolume,
13
13
  } from '../types';
14
14
  import { triggerEvent, imageIdToURI } from '../utilities';
15
15
  import eventTarget from '../eventTarget';
16
16
  import Events from '../enums/Events';
17
+ import { ImageVolume } from './classes/ImageVolume';
17
18
 
18
19
  const ONE_GB = 1073741824;
19
20
 
@@ -152,6 +153,10 @@ class Cache implements ICache {
152
153
  volume.imageData.delete();
153
154
  }
154
155
 
156
+ // if we had views for the images of the volume, we need to restore them
157
+ // to avoid memory leaks
158
+ this._restoreImagesFromBuffer(volume);
159
+
155
160
  if (volumeLoadObject.cancelFn) {
156
161
  // Cancel any in-progress loading
157
162
  volumeLoadObject.cancelFn();
@@ -402,7 +407,7 @@ class Cache implements ICache {
402
407
  cachedImage.loaded = true;
403
408
  cachedImage.image = image;
404
409
  cachedImage.sizeInBytes = image.sizeInBytes;
405
- this._incrementImageCacheSize(cachedImage.sizeInBytes);
410
+ this.incrementImageCacheSize(cachedImage.sizeInBytes);
406
411
  const eventDetails: EventTypes.ImageCacheImageAddedEventDetail = {
407
412
  image: cachedImage,
408
413
  };
@@ -598,7 +603,7 @@ class Cache implements ICache {
598
603
  // cachedVolume.loaded = true
599
604
  cachedVolume.volume = volume;
600
605
  cachedVolume.sizeInBytes = volume.sizeInBytes;
601
- this._incrementVolumeCacheSize(cachedVolume.sizeInBytes);
606
+ this.incrementVolumeCacheSize(cachedVolume.sizeInBytes);
602
607
 
603
608
  const eventDetails: EventTypes.VolumeCacheVolumeAddedEventDetail = {
604
609
  volume: cachedVolume,
@@ -720,7 +725,7 @@ class Cache implements ICache {
720
725
  );
721
726
  }
722
727
 
723
- this._incrementImageCacheSize(-cachedImage.sizeInBytes);
728
+ this.incrementImageCacheSize(-cachedImage.sizeInBytes);
724
729
 
725
730
  const eventDetails = {
726
731
  imageId,
@@ -751,7 +756,7 @@ class Cache implements ICache {
751
756
  );
752
757
  }
753
758
 
754
- this._incrementVolumeCacheSize(-cachedVolume.sizeInBytes);
759
+ this.incrementVolumeCacheSize(-cachedVolume.sizeInBytes);
755
760
 
756
761
  const eventDetails = {
757
762
  volume: cachedVolume,
@@ -835,7 +840,7 @@ class Cache implements ICache {
835
840
  *
836
841
  * @param increment - bytes length
837
842
  */
838
- private _incrementImageCacheSize = (increment: number) => {
843
+ public incrementImageCacheSize = (increment: number) => {
839
844
  this._imageCacheSize += increment;
840
845
  };
841
846
 
@@ -844,9 +849,88 @@ class Cache implements ICache {
844
849
  *
845
850
  * @param increment - bytes length
846
851
  */
847
- private _incrementVolumeCacheSize = (increment: number) => {
852
+ public incrementVolumeCacheSize = (increment: number) => {
848
853
  this._volumeCacheSize += increment;
849
854
  };
855
+
856
+ /**
857
+ * Decreases the image cache size with the provided decrement
858
+ *
859
+ * @param decrement - bytes length
860
+ */
861
+ public decrementImageCacheSize = (decrement: number) => {
862
+ this._imageCacheSize -= decrement;
863
+ };
864
+
865
+ /**
866
+ * Decreases the cache size with the provided decrement
867
+ *
868
+ * @param decrement - bytes length
869
+ */
870
+ public decrementVolumeCacheSize = (decrement: number) => {
871
+ this._volumeCacheSize -= decrement;
872
+ };
873
+
874
+ /**
875
+ * This function will restore the images' pixel data from the shared array buffer
876
+ * back to the individual images when the volume is purged from cache. It ensures
877
+ * that each image retrieves its correct portion of data from the buffer based on
878
+ * the previously stored offset and length information.
879
+ *
880
+ * @param volumeId - The volumeId whose images need to be restored.
881
+ */
882
+ private _restoreImagesFromBuffer(volume: IImageVolume) {
883
+ if (!(volume instanceof ImageVolume)) {
884
+ console.warn(
885
+ 'Volume is not an ImageVolume. Cannot restore images from buffer.'
886
+ );
887
+ return;
888
+ }
889
+
890
+ // Retrieve the scalar data and the offset map from the volume
891
+ const scalarData = volume.getScalarData();
892
+ const imageCacheOffsetMap = volume.imageCacheOffsetMap;
893
+
894
+ if (imageCacheOffsetMap.size === 0) {
895
+ console.warn('No cached images to restore for this volume.');
896
+ return;
897
+ }
898
+
899
+ // Iterate over each image and restore its pixel data from the shared buffer
900
+ for (const [imageId, { offset }] of imageCacheOffsetMap) {
901
+ const image = this.getImage(imageId);
902
+
903
+ if (!image) {
904
+ console.warn(`Image with id ${imageId} not found in cache.`);
905
+ continue;
906
+ }
907
+
908
+ const viewPixelData = image.getPixelData();
909
+ const length = viewPixelData.length;
910
+
911
+ // Create a new view of the buffer for this specific image
912
+ // @ts-ignore
913
+ const pixelData = new viewPixelData.constructor(
914
+ scalarData.buffer,
915
+ offset,
916
+ length
917
+ );
918
+
919
+ // Restore the original getPixelData function and pixelData
920
+ image.getPixelData = () => pixelData;
921
+
922
+ if (image.imageFrame) {
923
+ image.imageFrame.pixelData = pixelData;
924
+ }
925
+
926
+ delete image.bufferView;
927
+
928
+ // Optionally, increment the image cache size again if needed
929
+ this.incrementImageCacheSize(image.sizeInBytes);
930
+ }
931
+
932
+ console.log(`Images restored from buffer for volume ${volume.volumeId}.`);
933
+ }
850
934
  }
851
935
 
852
936
  /**