@cornerstonejs/core 1.42.0 → 1.43.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 (199) hide show
  1. package/dist/cjs/RenderingEngine/BaseVolumeViewport.js +3 -0
  2. package/dist/cjs/RenderingEngine/BaseVolumeViewport.js.map +1 -1
  3. package/dist/cjs/RenderingEngine/StackViewport.js +2 -1
  4. package/dist/cjs/RenderingEngine/StackViewport.js.map +1 -1
  5. package/dist/cjs/RenderingEngine/Viewport.d.ts +1 -0
  6. package/dist/cjs/RenderingEngine/Viewport.js +3 -0
  7. package/dist/cjs/RenderingEngine/Viewport.js.map +1 -1
  8. package/dist/cjs/RenderingEngine/helpers/createVolumeActor.js +2 -1
  9. package/dist/cjs/RenderingEngine/helpers/createVolumeActor.js.map +1 -1
  10. package/dist/cjs/RenderingEngine/vtkClasses/vtkStreamingOpenGLVolumeMapper.js +1 -1
  11. package/dist/cjs/RenderingEngine/vtkClasses/vtkStreamingOpenGLVolumeMapper.js.map +1 -1
  12. package/dist/cjs/cache/cache.d.ts +6 -3
  13. package/dist/cjs/cache/cache.js +43 -6
  14. package/dist/cjs/cache/cache.js.map +1 -1
  15. package/dist/cjs/cache/classes/ImageVolume.d.ts +25 -5
  16. package/dist/cjs/cache/classes/ImageVolume.js +302 -13
  17. package/dist/cjs/cache/classes/ImageVolume.js.map +1 -1
  18. package/dist/cjs/eventTarget.d.ts +1 -0
  19. package/dist/cjs/eventTarget.js +13 -1
  20. package/dist/cjs/eventTarget.js.map +1 -1
  21. package/dist/cjs/init.js +2 -0
  22. package/dist/cjs/init.js.map +1 -1
  23. package/dist/cjs/loaders/imageLoader.d.ts +6 -1
  24. package/dist/cjs/loaders/imageLoader.js +26 -12
  25. package/dist/cjs/loaders/imageLoader.js.map +1 -1
  26. package/dist/cjs/loaders/volumeLoader.d.ts +13 -9
  27. package/dist/cjs/loaders/volumeLoader.js +58 -5
  28. package/dist/cjs/loaders/volumeLoader.js.map +1 -1
  29. package/dist/cjs/types/BoundsLPS.d.ts +3 -0
  30. package/dist/cjs/types/BoundsLPS.js +3 -0
  31. package/dist/cjs/types/BoundsLPS.js.map +1 -0
  32. package/dist/cjs/types/Cornerstone3DConfig.d.ts +1 -0
  33. package/dist/cjs/types/IDynamicImageVolume.d.ts +2 -2
  34. package/dist/cjs/types/IImage.d.ts +5 -0
  35. package/dist/cjs/types/IImageVolume.d.ts +7 -2
  36. package/dist/cjs/types/ILoadObject.d.ts +2 -2
  37. package/dist/cjs/types/IViewport.d.ts +1 -0
  38. package/dist/cjs/types/IVolume.d.ts +3 -26
  39. package/dist/cjs/types/ImageVolumeProps.d.ts +6 -0
  40. package/dist/cjs/types/ImageVolumeProps.js +3 -0
  41. package/dist/cjs/types/ImageVolumeProps.js.map +1 -0
  42. package/dist/cjs/types/VolumeProps.d.ts +27 -0
  43. package/dist/cjs/types/VolumeProps.js +3 -0
  44. package/dist/cjs/types/VolumeProps.js.map +1 -0
  45. package/dist/cjs/types/index.d.ts +5 -2
  46. package/dist/cjs/utilities/VoxelManager.d.ts +2 -2
  47. package/dist/cjs/utilities/VoxelManager.js +13 -4
  48. package/dist/cjs/utilities/VoxelManager.js.map +1 -1
  49. package/dist/cjs/utilities/cacheUtils.d.ts +2 -0
  50. package/dist/cjs/utilities/cacheUtils.js +96 -0
  51. package/dist/cjs/utilities/cacheUtils.js.map +1 -0
  52. package/dist/cjs/utilities/convertStackToVolumeViewport.d.ts +12 -0
  53. package/dist/cjs/utilities/convertStackToVolumeViewport.js +61 -0
  54. package/dist/cjs/utilities/convertStackToVolumeViewport.js.map +1 -0
  55. package/dist/cjs/utilities/convertVolumeToStackViewport.d.ts +9 -0
  56. package/dist/cjs/utilities/convertVolumeToStackViewport.js +95 -0
  57. package/dist/cjs/utilities/convertVolumeToStackViewport.js.map +1 -0
  58. package/dist/cjs/utilities/generateVolumePropsFromImageIds.d.ts +3 -0
  59. package/dist/cjs/utilities/generateVolumePropsFromImageIds.js +124 -0
  60. package/dist/cjs/utilities/generateVolumePropsFromImageIds.js.map +1 -0
  61. package/dist/cjs/utilities/index.d.ts +6 -1
  62. package/dist/cjs/utilities/index.js +12 -1
  63. package/dist/cjs/utilities/index.js.map +1 -1
  64. package/dist/cjs/utilities/planar.d.ts +1 -1
  65. package/dist/cjs/utilities/planar.js +5 -1
  66. package/dist/cjs/utilities/planar.js.map +1 -1
  67. package/dist/cjs/utilities/roundNumber.d.ts +4 -0
  68. package/dist/cjs/utilities/roundNumber.js +36 -0
  69. package/dist/cjs/utilities/roundNumber.js.map +1 -0
  70. package/dist/esm/RenderingEngine/BaseVolumeViewport.js +3 -0
  71. package/dist/esm/RenderingEngine/BaseVolumeViewport.js.map +1 -1
  72. package/dist/esm/RenderingEngine/StackViewport.js +2 -1
  73. package/dist/esm/RenderingEngine/StackViewport.js.map +1 -1
  74. package/dist/esm/RenderingEngine/Viewport.js +3 -0
  75. package/dist/esm/RenderingEngine/Viewport.js.map +1 -1
  76. package/dist/esm/RenderingEngine/helpers/createVolumeActor.js +1 -1
  77. package/dist/esm/RenderingEngine/helpers/createVolumeActor.js.map +1 -1
  78. package/dist/esm/RenderingEngine/vtkClasses/vtkStreamingOpenGLVolumeMapper.js +1 -1
  79. package/dist/esm/RenderingEngine/vtkClasses/vtkStreamingOpenGLVolumeMapper.js.map +1 -1
  80. package/dist/esm/cache/cache.js +43 -6
  81. package/dist/esm/cache/cache.js.map +1 -1
  82. package/dist/esm/cache/classes/ImageVolume.js +279 -14
  83. package/dist/esm/cache/classes/ImageVolume.js.map +1 -1
  84. package/dist/esm/eventTarget.js +13 -1
  85. package/dist/esm/eventTarget.js.map +1 -1
  86. package/dist/esm/init.js +2 -0
  87. package/dist/esm/init.js.map +1 -1
  88. package/dist/esm/loaders/imageLoader.js +23 -9
  89. package/dist/esm/loaders/imageLoader.js.map +1 -1
  90. package/dist/esm/loaders/volumeLoader.js +58 -5
  91. package/dist/esm/loaders/volumeLoader.js.map +1 -1
  92. package/dist/esm/types/BoundsLPS.js +2 -0
  93. package/dist/esm/types/BoundsLPS.js.map +1 -0
  94. package/dist/esm/types/ImageVolumeProps.js +2 -0
  95. package/dist/esm/types/ImageVolumeProps.js.map +1 -0
  96. package/dist/esm/types/VolumeProps.js +2 -0
  97. package/dist/esm/types/VolumeProps.js.map +1 -0
  98. package/dist/esm/utilities/VoxelManager.js +13 -4
  99. package/dist/esm/utilities/VoxelManager.js.map +1 -1
  100. package/dist/esm/utilities/cacheUtils.js +65 -0
  101. package/dist/esm/utilities/cacheUtils.js.map +1 -0
  102. package/dist/esm/utilities/convertStackToVolumeViewport.js +49 -0
  103. package/dist/esm/utilities/convertStackToVolumeViewport.js.map +1 -0
  104. package/dist/esm/utilities/convertVolumeToStackViewport.js +58 -0
  105. package/dist/esm/utilities/convertVolumeToStackViewport.js.map +1 -0
  106. package/dist/esm/utilities/generateVolumePropsFromImageIds.js +118 -0
  107. package/dist/esm/utilities/generateVolumePropsFromImageIds.js.map +1 -0
  108. package/dist/esm/utilities/index.js +6 -1
  109. package/dist/esm/utilities/index.js.map +1 -1
  110. package/dist/esm/utilities/planar.js +5 -1
  111. package/dist/esm/utilities/planar.js.map +1 -1
  112. package/dist/esm/utilities/roundNumber.js +33 -0
  113. package/dist/esm/utilities/roundNumber.js.map +1 -0
  114. package/dist/types/RenderingEngine/BaseVolumeViewport.d.ts.map +1 -1
  115. package/dist/types/RenderingEngine/StackViewport.d.ts.map +1 -1
  116. package/dist/types/RenderingEngine/Viewport.d.ts +1 -0
  117. package/dist/types/RenderingEngine/Viewport.d.ts.map +1 -1
  118. package/dist/types/RenderingEngine/vtkClasses/vtkStreamingOpenGLVolumeMapper.d.ts.map +1 -1
  119. package/dist/types/cache/cache.d.ts +6 -3
  120. package/dist/types/cache/cache.d.ts.map +1 -1
  121. package/dist/types/cache/classes/ImageVolume.d.ts +25 -5
  122. package/dist/types/cache/classes/ImageVolume.d.ts.map +1 -1
  123. package/dist/types/eventTarget.d.ts +1 -0
  124. package/dist/types/eventTarget.d.ts.map +1 -1
  125. package/dist/types/loaders/imageLoader.d.ts +6 -1
  126. package/dist/types/loaders/imageLoader.d.ts.map +1 -1
  127. package/dist/types/loaders/volumeLoader.d.ts +13 -9
  128. package/dist/types/loaders/volumeLoader.d.ts.map +1 -1
  129. package/dist/types/types/BoundsLPS.d.ts +4 -0
  130. package/dist/types/types/BoundsLPS.d.ts.map +1 -0
  131. package/dist/types/types/Cornerstone3DConfig.d.ts +1 -0
  132. package/dist/types/types/Cornerstone3DConfig.d.ts.map +1 -1
  133. package/dist/types/types/IDynamicImageVolume.d.ts +2 -2
  134. package/dist/types/types/IDynamicImageVolume.d.ts.map +1 -1
  135. package/dist/types/types/IImage.d.ts +5 -0
  136. package/dist/types/types/IImage.d.ts.map +1 -1
  137. package/dist/types/types/IImageVolume.d.ts +7 -2
  138. package/dist/types/types/IImageVolume.d.ts.map +1 -1
  139. package/dist/types/types/ILoadObject.d.ts +2 -2
  140. package/dist/types/types/ILoadObject.d.ts.map +1 -1
  141. package/dist/types/types/IViewport.d.ts +1 -0
  142. package/dist/types/types/IViewport.d.ts.map +1 -1
  143. package/dist/types/types/IVolume.d.ts +3 -26
  144. package/dist/types/types/IVolume.d.ts.map +1 -1
  145. package/dist/types/types/ImageVolumeProps.d.ts +7 -0
  146. package/dist/types/types/ImageVolumeProps.d.ts.map +1 -0
  147. package/dist/types/types/VolumeProps.d.ts +28 -0
  148. package/dist/types/types/VolumeProps.d.ts.map +1 -0
  149. package/dist/types/types/index.d.ts +5 -2
  150. package/dist/types/types/index.d.ts.map +1 -1
  151. package/dist/types/utilities/VoxelManager.d.ts +2 -2
  152. package/dist/types/utilities/VoxelManager.d.ts.map +1 -1
  153. package/dist/types/utilities/cacheUtils.d.ts +3 -0
  154. package/dist/types/utilities/cacheUtils.d.ts.map +1 -0
  155. package/dist/types/utilities/convertStackToVolumeViewport.d.ts +13 -0
  156. package/dist/types/utilities/convertStackToVolumeViewport.d.ts.map +1 -0
  157. package/dist/types/utilities/convertVolumeToStackViewport.d.ts +10 -0
  158. package/dist/types/utilities/convertVolumeToStackViewport.d.ts.map +1 -0
  159. package/dist/types/utilities/generateVolumePropsFromImageIds.d.ts +4 -0
  160. package/dist/types/utilities/generateVolumePropsFromImageIds.d.ts.map +1 -0
  161. package/dist/types/utilities/index.d.ts +6 -1
  162. package/dist/types/utilities/index.d.ts.map +1 -1
  163. package/dist/types/utilities/planar.d.ts +1 -1
  164. package/dist/types/utilities/planar.d.ts.map +1 -1
  165. package/dist/types/utilities/roundNumber.d.ts +5 -0
  166. package/dist/types/utilities/roundNumber.d.ts.map +1 -0
  167. package/dist/umd/index.js +1 -1
  168. package/dist/umd/index.js.map +1 -1
  169. package/package.json +3 -3
  170. package/src/RenderingEngine/BaseVolumeViewport.ts +4 -1
  171. package/src/RenderingEngine/StackViewport.ts +3 -1
  172. package/src/RenderingEngine/Viewport.ts +9 -1
  173. package/src/RenderingEngine/helpers/createVolumeActor.ts +1 -1
  174. package/src/RenderingEngine/vtkClasses/vtkStreamingOpenGLVolumeMapper.js +3 -26
  175. package/src/cache/cache.ts +91 -7
  176. package/src/cache/classes/ImageVolume.ts +535 -21
  177. package/src/eventTarget.ts +19 -1
  178. package/src/init.ts +2 -2
  179. package/src/loaders/imageLoader.ts +58 -10
  180. package/src/loaders/volumeLoader.ts +139 -23
  181. package/src/types/BoundsLPS.ts +5 -0
  182. package/src/types/Cornerstone3DConfig.ts +12 -0
  183. package/src/types/IDynamicImageVolume.ts +2 -2
  184. package/src/types/IImage.ts +6 -0
  185. package/src/types/IImageVolume.ts +14 -2
  186. package/src/types/ILoadObject.ts +2 -2
  187. package/src/types/IViewport.ts +2 -1
  188. package/src/types/IVolume.ts +4 -41
  189. package/src/types/ImageVolumeProps.ts +15 -0
  190. package/src/types/VolumeProps.ts +57 -0
  191. package/src/types/index.ts +7 -2
  192. package/src/utilities/VoxelManager.ts +17 -6
  193. package/src/utilities/cacheUtils.ts +121 -0
  194. package/src/utilities/convertStackToVolumeViewport.ts +115 -0
  195. package/src/utilities/convertVolumeToStackViewport.ts +125 -0
  196. package/src/utilities/generateVolumePropsFromImageIds.ts +183 -0
  197. package/src/utilities/index.ts +11 -0
  198. package/src/utilities/planar.ts +12 -1
  199. 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.43.0",
4
4
  "description": "",
5
5
  "main": "src/index.ts",
6
6
  "types": "dist/types/index.d.ts",
@@ -30,7 +30,7 @@
30
30
  "webpack:watch": "webpack --mode development --progress --watch --config ./.webpack/webpack.dev.js"
31
31
  },
32
32
  "dependencies": {
33
- "@kitware/vtk.js": "27.3.1",
33
+ "@kitware/vtk.js": "29.3.0",
34
34
  "comlink": "^4.4.1",
35
35
  "detect-gpu": "^5.0.22",
36
36
  "gl-matrix": "^3.4.3",
@@ -47,5 +47,5 @@
47
47
  "type": "individual",
48
48
  "url": "https://ohif.org/donate"
49
49
  },
50
- "gitHead": "75102c80b6bc3714f00590b92ccd8d4d52bf1ca2"
50
+ "gitHead": "1681f72fb2df75001f844a2e1728f2e9b79b6985"
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';
@@ -1001,6 +1000,10 @@ abstract class BaseVolumeViewport extends Viewport implements IVolumeViewport {
1001
1000
  ? vec3.negate(vec3.create(), this.initialViewUp)
1002
1001
  : this.initialViewUp;
1003
1002
 
1003
+ if (!initialViewUp) {
1004
+ return 0;
1005
+ }
1006
+
1004
1007
  // The angle between the initial and current view up vectors.
1005
1008
  // TODO: check with VTK about rounding errors here.
1006
1009
  const initialToCurrentViewUpAngle =
@@ -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
@@ -63,7 +63,7 @@ class Viewport implements IViewport {
63
63
  protected flipHorizontal = false;
64
64
  protected flipVertical = false;
65
65
  public isDisabled: boolean;
66
- /** Record the renddering status, mostly for testing purposes, but can also
66
+ /** Record the rendering status, mostly for testing purposes, but can also
67
67
  * be useful for knowing things like whether the viewport is initialized
68
68
  */
69
69
  public viewportStatus: ViewportStatus = ViewportStatus.NO_DATA;
@@ -373,6 +373,14 @@ class Viewport implements IViewport {
373
373
  return Array.from(this._actors.values());
374
374
  }
375
375
 
376
+ /**
377
+ * Returns an array of unique identifiers for all the actors in the viewport.
378
+ * @returns An array of strings
379
+ */
380
+ public getActorUIDs(): Array<string> {
381
+ return Array.from(this._actors.keys());
382
+ }
383
+
376
384
  /**
377
385
  * Get an actor by its UID
378
386
  * @param actorUID - The unique ID of the actor.
@@ -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,4 +1,3 @@
1
- import { mat3, mat4, vec3 } from 'gl-matrix';
2
1
  import macro from '@kitware/vtk.js/macros';
3
2
  import vtkOpenGLVolumeMapper from '@kitware/vtk.js/Rendering/OpenGL/VolumeMapper';
4
3
  import { Filter } from '@kitware/vtk.js/Rendering/OpenGL/Texture/Constants';
@@ -6,9 +5,8 @@ import { VtkDataTypes } from '@kitware/vtk.js/Common/Core/DataArray/Constants';
6
5
  import vtkDataArray from '@kitware/vtk.js/Common/Core/DataArray';
7
6
  import { Representation } from '@kitware/vtk.js/Rendering/Core/Property/Constants';
8
7
 
9
- const { vtkWarningMacro } = macro;
10
8
  /**
11
- * vtkStreamingOpenGLVolumeMapper - A dervied class of the core vtkOpenGLVolumeMapper class.
9
+ * vtkStreamingOpenGLVolumeMapper - A derived class of the core vtkOpenGLVolumeMapper class.
12
10
  * This class replaces the buildBufferObjects function so that we progressively upload our textures
13
11
  * into GPU memory using the new methods on vtkStreamingOpenGLTexture.
14
12
  *
@@ -155,6 +153,8 @@ function vtkStreamingOpenGLVolumeMapper(publicAPI, model) {
155
153
  model.colorTextureString = toString;
156
154
  }
157
155
 
156
+ publicAPI.updateLabelOutlineThicknessTexture(actor);
157
+
158
158
  // rebuild the scalarTexture if the data has changed
159
159
  toString = `${image.getMTime()}`;
160
160
 
@@ -246,29 +246,6 @@ function vtkStreamingOpenGLVolumeMapper(publicAPI, model) {
246
246
  model.VBOBuildTime.modified();
247
247
  };
248
248
 
249
- // publicAPI.getRenderTargetSize = () => {
250
- // // https://github.com/Kitware/vtk-js/blob/master/Sources/Rendering/OpenGL/VolumeMapper/index.js#L952
251
- // if (model.lastXYF > 1.43) {
252
- // const sz = model.framebuffer.getSize()
253
- // return [model.fvp[0] * sz[0], model.fvp[1] * sz[1]]
254
- // }
255
-
256
- // // This seems wrong, it assumes the renderWindow only has one renderer
257
- // // but I don't know if this stuff is correct...
258
-
259
- // const { usize, vsize } = model.openGLRenderer.getTiledSizeAndOrigin()
260
-
261
- // return [usize, vsize]
262
- // }
263
-
264
- // publicAPI.getRenderTargetSize = () => {
265
- // if (model._useSmallViewport) {
266
- // return [model._smallViewportWidth, model._smallViewportHeight]
267
- // }
268
-
269
- // return model._openGLRenderWindow.getFramebufferSize()
270
- // }
271
-
272
249
  publicAPI.getRenderTargetSize = () => {
273
250
  if (model._useSmallViewport) {
274
251
  return [model._smallViewportWidth, model._smallViewportHeight];
@@ -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
  /**