@cornerstonejs/core 1.75.1 → 1.76.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 (60) hide show
  1. package/dist/cjs/RenderingEngine/helpers/addImageSlicesToViewports.d.ts +1 -1
  2. package/dist/cjs/RenderingEngine/helpers/addImageSlicesToViewports.js +2 -2
  3. package/dist/cjs/RenderingEngine/helpers/addImageSlicesToViewports.js.map +1 -1
  4. package/dist/cjs/loaders/imageLoader.js +6 -1
  5. package/dist/cjs/loaders/imageLoader.js.map +1 -1
  6. package/dist/cjs/types/IStackViewport.d.ts +2 -49
  7. package/dist/cjs/types/IStackViewport.js +1 -0
  8. package/dist/cjs/types/IStackViewport.js.map +1 -1
  9. package/dist/cjs/utilities/convertStackToVolumeViewport.js +3 -1
  10. package/dist/cjs/utilities/convertStackToVolumeViewport.js.map +1 -1
  11. package/dist/cjs/utilities/getScalingParameters.js +3 -2
  12. package/dist/cjs/utilities/getScalingParameters.js.map +1 -1
  13. package/dist/cjs/utilities/loadImageToCanvas.d.ts +21 -5
  14. package/dist/cjs/utilities/loadImageToCanvas.js +32 -17
  15. package/dist/cjs/utilities/loadImageToCanvas.js.map +1 -1
  16. package/dist/cjs/utilities/renderToCanvasCPU.d.ts +3 -2
  17. package/dist/cjs/utilities/renderToCanvasCPU.js +7 -2
  18. package/dist/cjs/utilities/renderToCanvasCPU.js.map +1 -1
  19. package/dist/cjs/utilities/renderToCanvasGPU.d.ts +5 -2
  20. package/dist/cjs/utilities/renderToCanvasGPU.js +45 -12
  21. package/dist/cjs/utilities/renderToCanvasGPU.js.map +1 -1
  22. package/dist/esm/RenderingEngine/helpers/addImageSlicesToViewports.js +2 -2
  23. package/dist/esm/RenderingEngine/helpers/addImageSlicesToViewports.js.map +1 -1
  24. package/dist/esm/loaders/imageLoader.js +13 -1
  25. package/dist/esm/loaders/imageLoader.js.map +1 -1
  26. package/dist/esm/types/IStackViewport.js +1 -1
  27. package/dist/esm/types/IStackViewport.js.map +1 -1
  28. package/dist/esm/utilities/convertStackToVolumeViewport.js +5 -3
  29. package/dist/esm/utilities/convertStackToVolumeViewport.js.map +1 -1
  30. package/dist/esm/utilities/getScalingParameters.js +2 -2
  31. package/dist/esm/utilities/getScalingParameters.js.map +1 -1
  32. package/dist/esm/utilities/loadImageToCanvas.js +33 -17
  33. package/dist/esm/utilities/loadImageToCanvas.js.map +1 -1
  34. package/dist/esm/utilities/renderToCanvasCPU.js +7 -2
  35. package/dist/esm/utilities/renderToCanvasCPU.js.map +1 -1
  36. package/dist/esm/utilities/renderToCanvasGPU.js +45 -12
  37. package/dist/esm/utilities/renderToCanvasGPU.js.map +1 -1
  38. package/dist/types/RenderingEngine/helpers/addImageSlicesToViewports.d.ts +1 -1
  39. package/dist/types/RenderingEngine/helpers/addImageSlicesToViewports.d.ts.map +1 -1
  40. package/dist/types/loaders/imageLoader.d.ts.map +1 -1
  41. package/dist/types/types/IStackViewport.d.ts +2 -49
  42. package/dist/types/types/IStackViewport.d.ts.map +1 -1
  43. package/dist/types/utilities/convertStackToVolumeViewport.d.ts.map +1 -1
  44. package/dist/types/utilities/loadImageToCanvas.d.ts +21 -5
  45. package/dist/types/utilities/loadImageToCanvas.d.ts.map +1 -1
  46. package/dist/types/utilities/renderToCanvasCPU.d.ts +3 -2
  47. package/dist/types/utilities/renderToCanvasCPU.d.ts.map +1 -1
  48. package/dist/types/utilities/renderToCanvasGPU.d.ts +5 -2
  49. package/dist/types/utilities/renderToCanvasGPU.d.ts.map +1 -1
  50. package/dist/umd/index.js +1 -1
  51. package/dist/umd/index.js.map +1 -1
  52. package/package.json +2 -2
  53. package/src/RenderingEngine/helpers/addImageSlicesToViewports.ts +2 -5
  54. package/src/loaders/imageLoader.ts +20 -8
  55. package/src/types/IStackViewport.ts +2 -178
  56. package/src/utilities/convertStackToVolumeViewport.ts +5 -3
  57. package/src/utilities/getScalingParameters.ts +2 -2
  58. package/src/utilities/loadImageToCanvas.ts +93 -32
  59. package/src/utilities/renderToCanvasCPU.ts +10 -3
  60. package/src/utilities/renderToCanvasGPU.ts +61 -24
@@ -2,11 +2,18 @@ import getOrCreateCanvas, {
2
2
  EPSILON,
3
3
  } from '../RenderingEngine/helpers/getOrCreateCanvas';
4
4
  import { ViewportType, Events } from '../enums';
5
- import StackViewport from '../RenderingEngine/StackViewport';
6
- import { IImage, ViewportInputOptions } from '../types';
5
+ import {
6
+ IImage,
7
+ IStackViewport,
8
+ IVolume,
9
+ ViewportInputOptions,
10
+ IVolumeViewport,
11
+ ViewReference,
12
+ } from '../types';
7
13
  import { getRenderingEngine } from '../RenderingEngine/getRenderingEngine';
8
14
  import RenderingEngine from '../RenderingEngine';
9
15
  import isPTPrescaledWithSUV from './isPTPrescaledWithSUV';
16
+ import { CanvasLoadPosition } from './loadImageToCanvas';
10
17
 
11
18
  /**
12
19
  * Renders an cornerstone image to a Canvas. This method will handle creation
@@ -23,26 +30,33 @@ import isPTPrescaledWithSUV from './isPTPrescaledWithSUV';
23
30
  * renderToCanvasGPU(canvas, image)
24
31
  * ```
25
32
  * @param canvas - Canvas element to render to
26
- * @param image - The image to render
33
+ * @param imageOrVolume - The image to render
27
34
  * @param modality - [Default = undefined] The modality of the image
28
35
  * @returns - A promise that resolves when the image has been rendered with the imageId
29
36
  */
30
37
  export default function renderToCanvasGPU(
31
38
  canvas: HTMLCanvasElement,
32
- image: IImage,
39
+ imageOrVolume: IImage | IVolume,
33
40
  modality = undefined,
34
41
  renderingEngineId = '_thumbnails',
35
- viewportOptions: ViewportInputOptions = { displayArea: { imageArea: [1, 1] } }
36
- ): Promise<string> {
42
+ viewportOptions: ViewportInputOptions & { viewReference?: ViewReference } = {
43
+ displayArea: { imageArea: [1, 1] },
44
+ }
45
+ ): Promise<CanvasLoadPosition> {
37
46
  if (!canvas || !(canvas instanceof HTMLCanvasElement)) {
38
47
  throw new Error('canvas element is required');
39
48
  }
40
49
 
41
- const imageIdToPrint = image.imageId;
50
+ const isVolume = !(imageOrVolume as IImage).imageId;
51
+ const image = !isVolume && (imageOrVolume as IImage);
52
+ const volume = isVolume && (imageOrVolume as IVolume);
53
+ const imageIdToPrint = image?.imageId || volume?.volumeId;
42
54
  const viewportId = `renderGPUViewport-${imageIdToPrint}`;
43
- const imageId = image.imageId;
44
55
  const element = document.createElement('div');
45
56
  const devicePixelRatio = window.devicePixelRatio || 1;
57
+ if (!viewportOptions.displayArea) {
58
+ viewportOptions.displayArea = { imageArea: [1, 1] };
59
+ }
46
60
  const originalWidth = canvas.width;
47
61
  const originalHeight = canvas.height;
48
62
  // The canvas width/height are set by flooring the CSS size converted
@@ -50,17 +64,12 @@ export default function renderToCanvasGPU(
50
64
  // isn't exact, and using the exact value sometimes leads to an off by 1
51
65
  // in the actual size, so adding EPSILON to the size resolves
52
66
  // the problem.
53
- element.style.width = `${originalWidth + EPSILON}px`;
54
- element.style.height = `${originalHeight + EPSILON}px`;
67
+ // Don't touch the canvas size here as what we get out is a canvas at the right size
68
+ element.style.width = `${originalWidth / devicePixelRatio + EPSILON}px`;
69
+ element.style.height = `${originalHeight / devicePixelRatio + EPSILON}px`;
55
70
  element.style.visibility = 'hidden';
56
71
  element.style.position = 'absolute';
57
72
 
58
- // Up-sampling the provided canvas to match the device pixel ratio
59
- // since we use device pixel ratio to determine the size of the canvas
60
- // inside the rendering engine.
61
- canvas.width = originalWidth * devicePixelRatio;
62
- canvas.height = originalHeight * devicePixelRatio;
63
-
64
73
  document.body.appendChild(element);
65
74
 
66
75
  // add id to the element so we can find it later, and fix the : which is not allowed in css
@@ -73,20 +82,20 @@ export default function renderToCanvasGPU(
73
82
  (getRenderingEngine(renderingEngineId) as RenderingEngine) ||
74
83
  new RenderingEngine(renderingEngineId);
75
84
 
76
- let viewport = renderingEngine.getViewport(viewportId) as StackViewport;
85
+ let viewport = renderingEngine.getViewport(viewportId);
77
86
 
78
87
  if (!viewport) {
79
- const stackViewportInput = {
88
+ const viewportInput = {
80
89
  viewportId,
81
- type: ViewportType.STACK,
90
+ type: isVolume ? ViewportType.ORTHOGRAPHIC : ViewportType.STACK,
82
91
  element,
83
92
  defaultOptions: {
84
93
  ...viewportOptions,
85
94
  suppressEvents: true,
86
95
  },
87
96
  };
88
- renderingEngine.enableElement(stackViewportInput);
89
- viewport = renderingEngine.getViewport(viewportId) as StackViewport;
97
+ renderingEngine.enableElement(viewportInput);
98
+ viewport = renderingEngine.getViewport(viewportId);
90
99
  }
91
100
 
92
101
  return new Promise((resolve) => {
@@ -94,11 +103,20 @@ export default function renderToCanvasGPU(
94
103
  // enable it and later disable it without losing the canvas context
95
104
  let elementRendered = false;
96
105
 
106
+ let { viewReference } = viewportOptions;
107
+
97
108
  // Create a named function to handle the event
98
109
  const onImageRendered = (eventDetail) => {
99
110
  if (elementRendered) {
100
111
  return;
101
112
  }
113
+ if (viewReference) {
114
+ const useViewRef = viewReference;
115
+ viewReference = null;
116
+ viewport.setViewReference(useViewRef);
117
+ viewport.render();
118
+ return;
119
+ }
102
120
 
103
121
  // Copy the temporary canvas to the given canvas
104
122
  const context = canvas.getContext('2d');
@@ -114,6 +132,16 @@ export default function renderToCanvasGPU(
114
132
  canvas.height // destination dimensions
115
133
  );
116
134
 
135
+ const origin = viewport.canvasToWorld([0, 0]);
136
+ const topRight = viewport.canvasToWorld([
137
+ temporaryCanvas.width / devicePixelRatio,
138
+ 0,
139
+ ]);
140
+ const bottomLeft = viewport.canvasToWorld([
141
+ 0,
142
+ temporaryCanvas.height / devicePixelRatio,
143
+ ]);
144
+ const thicknessMm = 1;
117
145
  elementRendered = true;
118
146
 
119
147
  // remove based on id
@@ -135,17 +163,26 @@ export default function renderToCanvasGPU(
135
163
  element.remove();
136
164
  });
137
165
  }, 0);
138
- resolve(imageId);
166
+ resolve({
167
+ origin,
168
+ bottomLeft,
169
+ topRight,
170
+ thicknessMm,
171
+ });
139
172
  };
140
173
 
141
174
  element.addEventListener(Events.IMAGE_RENDERED, onImageRendered);
142
- viewport.renderImageObject(image);
175
+ if (isVolume) {
176
+ (viewport as IVolumeViewport).setVolumes([volume], false, true);
177
+ } else {
178
+ (viewport as IStackViewport).renderImageObject(imageOrVolume);
179
+ }
143
180
 
144
181
  // force a reset camera to center the image and undo the small scaling
145
182
  viewport.resetCamera();
146
183
 
147
184
  if (modality === 'PT' && !isPTPrescaledWithSUV(image)) {
148
- viewport.setProperties({
185
+ (viewport as IStackViewport).setProperties({
149
186
  voiRange: {
150
187
  lower: image.minPixelValue,
151
188
  upper: image.maxPixelValue,