@cornerstonejs/core 1.70.5 → 1.70.7

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 (71) hide show
  1. package/dist/cjs/RenderingEngine/BaseVolumeViewport.js +12 -11
  2. package/dist/cjs/RenderingEngine/BaseVolumeViewport.js.map +1 -1
  3. package/dist/cjs/RenderingEngine/RenderingEngine.js +1 -0
  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 +3 -1
  7. package/dist/cjs/RenderingEngine/StackViewport.js.map +1 -1
  8. package/dist/cjs/RenderingEngine/Viewport.d.ts +5 -0
  9. package/dist/cjs/RenderingEngine/Viewport.js +25 -0
  10. package/dist/cjs/RenderingEngine/Viewport.js.map +1 -1
  11. package/dist/cjs/RenderingEngine/helpers/setDefaultVolumeVOI.js +1 -1
  12. package/dist/cjs/RenderingEngine/helpers/setDefaultVolumeVOI.js.map +1 -1
  13. package/dist/cjs/enums/Events.d.ts +1 -0
  14. package/dist/cjs/enums/Events.js +1 -0
  15. package/dist/cjs/enums/Events.js.map +1 -1
  16. package/dist/cjs/loaders/imageLoader.d.ts +1 -0
  17. package/dist/cjs/loaders/imageLoader.js +3 -0
  18. package/dist/cjs/loaders/imageLoader.js.map +1 -1
  19. package/dist/cjs/types/IImage.d.ts +1 -0
  20. package/dist/cjs/types/IStackViewport.d.ts +1 -0
  21. package/dist/cjs/types/IViewport.d.ts +4 -0
  22. package/dist/cjs/utilities/getViewportImageCornersInWorld.js +7 -3
  23. package/dist/cjs/utilities/getViewportImageCornersInWorld.js.map +1 -1
  24. package/dist/esm/RenderingEngine/BaseVolumeViewport.js +11 -11
  25. package/dist/esm/RenderingEngine/BaseVolumeViewport.js.map +1 -1
  26. package/dist/esm/RenderingEngine/RenderingEngine.js +1 -0
  27. package/dist/esm/RenderingEngine/RenderingEngine.js.map +1 -1
  28. package/dist/esm/RenderingEngine/StackViewport.js +3 -1
  29. package/dist/esm/RenderingEngine/StackViewport.js.map +1 -1
  30. package/dist/esm/RenderingEngine/Viewport.js +25 -0
  31. package/dist/esm/RenderingEngine/Viewport.js.map +1 -1
  32. package/dist/esm/RenderingEngine/helpers/setDefaultVolumeVOI.js +1 -1
  33. package/dist/esm/RenderingEngine/helpers/setDefaultVolumeVOI.js.map +1 -1
  34. package/dist/esm/enums/Events.js +1 -0
  35. package/dist/esm/enums/Events.js.map +1 -1
  36. package/dist/esm/loaders/imageLoader.js +3 -0
  37. package/dist/esm/loaders/imageLoader.js.map +1 -1
  38. package/dist/esm/utilities/getViewportImageCornersInWorld.js +7 -3
  39. package/dist/esm/utilities/getViewportImageCornersInWorld.js.map +1 -1
  40. package/dist/types/RenderingEngine/BaseVolumeViewport.d.ts.map +1 -1
  41. package/dist/types/RenderingEngine/RenderingEngine.d.ts.map +1 -1
  42. package/dist/types/RenderingEngine/StackViewport.d.ts +1 -0
  43. package/dist/types/RenderingEngine/StackViewport.d.ts.map +1 -1
  44. package/dist/types/RenderingEngine/Viewport.d.ts +5 -0
  45. package/dist/types/RenderingEngine/Viewport.d.ts.map +1 -1
  46. package/dist/types/RenderingEngine/helpers/setDefaultVolumeVOI.d.ts.map +1 -1
  47. package/dist/types/enums/Events.d.ts +1 -0
  48. package/dist/types/enums/Events.d.ts.map +1 -1
  49. package/dist/types/loaders/imageLoader.d.ts +1 -0
  50. package/dist/types/loaders/imageLoader.d.ts.map +1 -1
  51. package/dist/types/types/IImage.d.ts +1 -0
  52. package/dist/types/types/IImage.d.ts.map +1 -1
  53. package/dist/types/types/IStackViewport.d.ts +1 -0
  54. package/dist/types/types/IStackViewport.d.ts.map +1 -1
  55. package/dist/types/types/IViewport.d.ts +4 -0
  56. package/dist/types/types/IViewport.d.ts.map +1 -1
  57. package/dist/types/utilities/getViewportImageCornersInWorld.d.ts.map +1 -1
  58. package/dist/umd/index.js +1 -1
  59. package/dist/umd/index.js.map +1 -1
  60. package/package.json +3 -3
  61. package/src/RenderingEngine/BaseVolumeViewport.ts +14 -10
  62. package/src/RenderingEngine/RenderingEngine.ts +2 -0
  63. package/src/RenderingEngine/StackViewport.ts +9 -1
  64. package/src/RenderingEngine/Viewport.ts +30 -0
  65. package/src/RenderingEngine/helpers/setDefaultVolumeVOI.ts +4 -1
  66. package/src/enums/Events.ts +2 -1
  67. package/src/loaders/imageLoader.ts +5 -0
  68. package/src/types/IImage.ts +1 -0
  69. package/src/types/IStackViewport.ts +2 -0
  70. package/src/types/IViewport.ts +9 -0
  71. package/src/utilities/getViewportImageCornersInWorld.ts +10 -3
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cornerstonejs/core",
3
- "version": "1.70.5",
3
+ "version": "1.70.7",
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": "30.3.1",
33
+ "@kitware/vtk.js": "30.3.3",
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": "bf3d33986d1cdad6ab4abf9e4004dcb16a1a83c9"
50
+ "gitHead": "4b6774d20ea66e2fa2815edc042b57565b816959"
51
51
  }
@@ -257,9 +257,6 @@ abstract class BaseVolumeViewport extends Viewport implements IVolumeViewport {
257
257
 
258
258
  const { volumeActor } = applicableVolumeActorInfo;
259
259
 
260
- const mapper = volumeActor.getMapper();
261
- mapper.setSampleDistance(1.0);
262
-
263
260
  const cfun = vtkColorTransferFunction.newInstance();
264
261
  let colormapObj = colormapUtils.getColormap(colormap.name);
265
262
 
@@ -328,6 +325,10 @@ abstract class BaseVolumeViewport extends Viewport implements IVolumeViewport {
328
325
  }
329
326
  volumeActor.getProperty().setScalarOpacity(0, ofun);
330
327
 
328
+ if (!this.viewportProperties.colormap) {
329
+ this.viewportProperties.colormap = {};
330
+ }
331
+
331
332
  this.viewportProperties.colormap.opacity = colormap.opacity;
332
333
  }
333
334
 
@@ -771,6 +772,9 @@ abstract class BaseVolumeViewport extends Viewport implements IVolumeViewport {
771
772
 
772
773
  applyPreset(volumeActor, preset);
773
774
 
775
+ this.viewportProperties.preset = preset;
776
+ this.render();
777
+
774
778
  if (!suppressEvents) {
775
779
  triggerEvent(this.element, Events.PRESET_MODIFIED, {
776
780
  viewportId: this.id,
@@ -822,6 +826,7 @@ abstract class BaseVolumeViewport extends Viewport implements IVolumeViewport {
822
826
  invert,
823
827
  slabThickness,
824
828
  rotation,
829
+ preset,
825
830
  } = this.viewportProperties;
826
831
 
827
832
  const voiRanges = this.getActors()
@@ -841,16 +846,14 @@ abstract class BaseVolumeViewport extends Viewport implements IVolumeViewport {
841
846
  })
842
847
  .filter(Boolean);
843
848
 
844
- const voiRange = voiRanges.length ? voiRanges[0].voiRange : null;
849
+ const voiRange = volumeId
850
+ ? voiRanges.find((range) => range.volumeId === volumeId)?.voiRange
851
+ : voiRanges[0]?.voiRange;
845
852
 
846
853
  const volumeColormap = this.getColormap(applicableVolumeActorInfo);
847
854
 
848
- let colormap;
849
- if (volumeId && volumeColormap) {
850
- colormap = volumeColormap;
851
- } else {
852
- colormap = latestColormap;
853
- }
855
+ const colormap =
856
+ volumeId && volumeColormap ? volumeColormap : latestColormap;
854
857
 
855
858
  return {
856
859
  colormap: colormap,
@@ -860,6 +863,7 @@ abstract class BaseVolumeViewport extends Viewport implements IVolumeViewport {
860
863
  invert: invert,
861
864
  slabThickness: slabThickness,
862
865
  rotation: rotation,
866
+ preset,
863
867
  };
864
868
  };
865
869
 
@@ -1295,6 +1295,8 @@ class RenderingEngine implements IRenderingEngine {
1295
1295
  renderingEngineId,
1296
1296
  };
1297
1297
 
1298
+ viewport.removeWidgets();
1299
+
1298
1300
  // Trigger first before removing the data attributes, as we need the enabled
1299
1301
  // element to remove tools associated with the viewport
1300
1302
  triggerEvent(eventTarget, Events.ELEMENT_DISABLED, eventDetail);
@@ -190,6 +190,11 @@ class StackViewport extends Viewport implements IStackViewport, IImagesLoader {
190
190
  // Camera properties
191
191
  private initialViewUp: Point3;
192
192
 
193
+ // this flag is used to check
194
+ // if the viewport used the same actor/mapper to render the image
195
+ // or because of the new image inconsistency, a new actor/mapper was created
196
+ public stackActorReInitialized: boolean;
197
+
193
198
  /**
194
199
  * Constructor for the StackViewport class
195
200
  * @param props - ViewportInput
@@ -2012,8 +2017,8 @@ class StackViewport extends Viewport implements IStackViewport, IImagesLoader {
2012
2017
  renderingEngineId: this.renderingEngineId,
2013
2018
  };
2014
2019
 
2015
- triggerEvent(this.element, Events.STACK_NEW_IMAGE, eventDetail);
2016
2020
  this._updateActorToDisplayImageId(image);
2021
+ triggerEvent(this.element, Events.STACK_NEW_IMAGE, eventDetail);
2017
2022
 
2018
2023
  // Trigger the image to be drawn on the next animation frame
2019
2024
  this.render();
@@ -2299,6 +2304,7 @@ class StackViewport extends Viewport implements IStackViewport, IImagesLoader {
2299
2304
  );
2300
2305
 
2301
2306
  this._setPropertiesFromCache();
2307
+ this.stackActorReInitialized = false;
2302
2308
 
2303
2309
  return;
2304
2310
  }
@@ -2378,6 +2384,8 @@ class StackViewport extends Viewport implements IStackViewport, IImagesLoader {
2378
2384
  this.cameraFocalPointOnRender = this.getCamera().focalPoint;
2379
2385
  this.stackInvalidated = false;
2380
2386
 
2387
+ this.stackActorReInitialized = true;
2388
+
2381
2389
  if (this._publishCalibratedEvent) {
2382
2390
  this.triggerCalibrationEvent();
2383
2391
  }
@@ -175,6 +175,36 @@ class Viewport implements IViewport {
175
175
  return false;
176
176
  }
177
177
 
178
+ private viewportWidgets = new Map() as Map<string, any>;
179
+
180
+ public addWidget = (widgetId, widget) => {
181
+ this.viewportWidgets.set(widgetId, widget);
182
+ };
183
+
184
+ public getWidget = (id) => {
185
+ return this.viewportWidgets.get(id);
186
+ };
187
+
188
+ public getWidgets = () => {
189
+ return Array.from(this.viewportWidgets.values());
190
+ };
191
+
192
+ public removeWidgets = () => {
193
+ const widgets = this.getWidgets();
194
+ widgets.forEach((widget) => {
195
+ if (widget.getEnabled()) {
196
+ widget.setEnabled(false);
197
+ }
198
+ if (widget.getActor && widget.getRenderer) {
199
+ const actor = widget.getActor();
200
+ const renderer = widget.getRenderer();
201
+ if (renderer && actor) {
202
+ renderer.removeActor(actor);
203
+ }
204
+ }
205
+ });
206
+ };
207
+
178
208
  /**
179
209
  * Indicate that the image has been rendered.
180
210
  * This will set the viewportStatus to RENDERED if there is image data
@@ -186,7 +186,10 @@ async function getVOIFromMinMax(
186
186
  let image = cache.getImage(imageId);
187
187
 
188
188
  if (!imageVolume.referencedImageIds?.length) {
189
- image = await loadAndCacheImage(imageId, options);
189
+ // we should ignore the cache here,
190
+ // since we want to load the image from with the most
191
+ // recent prescale settings
192
+ image = await loadAndCacheImage(imageId, { ...options, ignoreCache: true });
190
193
  }
191
194
 
192
195
  const imageScalarData = image
@@ -5,6 +5,7 @@ enum Events {
5
5
  /**
6
6
  * ERROR CODES
7
7
  */
8
+ ERROR_EVENT = 'CORNERSTONE_ERROR',
8
9
 
9
10
  /**
10
11
  * Error that is thrown when the ImageCache exceeds its max cache size.
@@ -243,7 +244,7 @@ enum Events {
243
244
  * Make use of {@link EventTypes.ColormapModifiedEvent | ColormapModified Event Type } for typing your event listeners for COLORMAP_MODIFIED event,
244
245
  * and see what event detail is included in {@link EventTypes.ColormapModifiedEventDetail | ColormapModified Event Detail }
245
246
  */
246
- COLORMAP_MODIFIED = "CORNERSTONE_COLORMAP_MODIFIED"
247
+ COLORMAP_MODIFIED = 'CORNERSTONE_COLORMAP_MODIFIED',
247
248
  }
248
249
 
249
250
  export default Events;
@@ -26,6 +26,7 @@ export interface ImageLoaderOptions {
26
26
  priority: number;
27
27
  requestType: string;
28
28
  additionalDetails?: Record<string, unknown>;
29
+ ignoreCache?: boolean;
29
30
  }
30
31
 
31
32
  interface DerivedImages {
@@ -126,6 +127,10 @@ function loadImageFromCacheOrVolume(
126
127
  imageId: string,
127
128
  options: ImageLoaderOptions
128
129
  ): IImageLoadObject {
130
+ if (options.ignoreCache) {
131
+ return loadImageFromImageLoader(imageId, options);
132
+ }
133
+
129
134
  // 1. Check inside the image cache for imageId
130
135
  let imageLoadObject = cache.getImageLoadObject(imageId);
131
136
  if (imageLoadObject !== undefined) {
@@ -20,6 +20,7 @@ interface IImage {
20
20
  isPreScaled?: boolean;
21
21
  /** preScale object */
22
22
  preScale?: {
23
+ enabled: boolean;
23
24
  /** boolean flag to indicate whether the image has been scaled */
24
25
  scaled?: boolean;
25
26
  /** scaling parameters */
@@ -15,6 +15,8 @@ export default interface IStackViewport extends IViewport {
15
15
  modality: string;
16
16
  /** Scaling parameters */
17
17
  scaling: Scaling;
18
+
19
+ stackActorReInitialized: boolean;
18
20
  /**
19
21
  * Resizes the viewport - only used in CPU fallback for StackViewport. The
20
22
  * GPU resizing happens inside the RenderingEngine.
@@ -191,6 +191,15 @@ export type ViewPresentationSelector = {
191
191
  interface IViewport {
192
192
  /** unique identifier of the viewport */
193
193
  id: string;
194
+
195
+ getWidget: (id: string) => any;
196
+
197
+ addWidget: (id: string, widget: any) => void;
198
+
199
+ getWidgets: () => any;
200
+
201
+ removeWidgets: () => void;
202
+
194
203
  /** renderingEngineId the viewport belongs to */
195
204
  renderingEngineId: string;
196
205
  /** viewport type, can be ORTHOGRAPHIC or STACK for now */
@@ -21,10 +21,17 @@ export default function getViewportImageCornersInWorld(
21
21
  const { imageData, dimensions } = viewport.getImageData() as IImageData;
22
22
  const { canvas } = viewport;
23
23
 
24
+ // we should consider the device pixel ratio since we are
25
+ // working with canvas coordinates
26
+ const ratio = window.devicePixelRatio;
27
+
24
28
  const topLeftCanvas: Point2 = [0, 0];
25
- const topRightCanvas: Point2 = [canvas.width, 0];
26
- const bottomRightCanvas: Point2 = [canvas.width, canvas.height];
27
- const bottomLeftCanvas: Point2 = [0, canvas.height];
29
+ const topRightCanvas: Point2 = [canvas.width / ratio, 0];
30
+ const bottomRightCanvas: Point2 = [
31
+ canvas.width / ratio,
32
+ canvas.height / ratio,
33
+ ];
34
+ const bottomLeftCanvas: Point2 = [0, canvas.height / ratio];
28
35
 
29
36
  const topLeftWorld = viewport.canvasToWorld(topLeftCanvas);
30
37
  const topRightWorld = viewport.canvasToWorld(topRightCanvas);