@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.
- package/dist/cjs/RenderingEngine/helpers/addImageSlicesToViewports.d.ts +1 -1
- package/dist/cjs/RenderingEngine/helpers/addImageSlicesToViewports.js +2 -2
- package/dist/cjs/RenderingEngine/helpers/addImageSlicesToViewports.js.map +1 -1
- package/dist/cjs/loaders/imageLoader.js +6 -1
- package/dist/cjs/loaders/imageLoader.js.map +1 -1
- package/dist/cjs/types/IStackViewport.d.ts +2 -49
- package/dist/cjs/types/IStackViewport.js +1 -0
- package/dist/cjs/types/IStackViewport.js.map +1 -1
- package/dist/cjs/utilities/convertStackToVolumeViewport.js +3 -1
- package/dist/cjs/utilities/convertStackToVolumeViewport.js.map +1 -1
- package/dist/cjs/utilities/getScalingParameters.js +3 -2
- package/dist/cjs/utilities/getScalingParameters.js.map +1 -1
- package/dist/cjs/utilities/loadImageToCanvas.d.ts +21 -5
- package/dist/cjs/utilities/loadImageToCanvas.js +32 -17
- package/dist/cjs/utilities/loadImageToCanvas.js.map +1 -1
- package/dist/cjs/utilities/renderToCanvasCPU.d.ts +3 -2
- package/dist/cjs/utilities/renderToCanvasCPU.js +7 -2
- package/dist/cjs/utilities/renderToCanvasCPU.js.map +1 -1
- package/dist/cjs/utilities/renderToCanvasGPU.d.ts +5 -2
- package/dist/cjs/utilities/renderToCanvasGPU.js +45 -12
- package/dist/cjs/utilities/renderToCanvasGPU.js.map +1 -1
- package/dist/esm/RenderingEngine/helpers/addImageSlicesToViewports.js +2 -2
- package/dist/esm/RenderingEngine/helpers/addImageSlicesToViewports.js.map +1 -1
- package/dist/esm/loaders/imageLoader.js +13 -1
- package/dist/esm/loaders/imageLoader.js.map +1 -1
- package/dist/esm/types/IStackViewport.js +1 -1
- package/dist/esm/types/IStackViewport.js.map +1 -1
- package/dist/esm/utilities/convertStackToVolumeViewport.js +5 -3
- package/dist/esm/utilities/convertStackToVolumeViewport.js.map +1 -1
- package/dist/esm/utilities/getScalingParameters.js +2 -2
- package/dist/esm/utilities/getScalingParameters.js.map +1 -1
- package/dist/esm/utilities/loadImageToCanvas.js +33 -17
- package/dist/esm/utilities/loadImageToCanvas.js.map +1 -1
- package/dist/esm/utilities/renderToCanvasCPU.js +7 -2
- package/dist/esm/utilities/renderToCanvasCPU.js.map +1 -1
- package/dist/esm/utilities/renderToCanvasGPU.js +45 -12
- package/dist/esm/utilities/renderToCanvasGPU.js.map +1 -1
- package/dist/types/RenderingEngine/helpers/addImageSlicesToViewports.d.ts +1 -1
- package/dist/types/RenderingEngine/helpers/addImageSlicesToViewports.d.ts.map +1 -1
- package/dist/types/loaders/imageLoader.d.ts.map +1 -1
- package/dist/types/types/IStackViewport.d.ts +2 -49
- package/dist/types/types/IStackViewport.d.ts.map +1 -1
- package/dist/types/utilities/convertStackToVolumeViewport.d.ts.map +1 -1
- package/dist/types/utilities/loadImageToCanvas.d.ts +21 -5
- package/dist/types/utilities/loadImageToCanvas.d.ts.map +1 -1
- package/dist/types/utilities/renderToCanvasCPU.d.ts +3 -2
- package/dist/types/utilities/renderToCanvasCPU.d.ts.map +1 -1
- package/dist/types/utilities/renderToCanvasGPU.d.ts +5 -2
- package/dist/types/utilities/renderToCanvasGPU.d.ts.map +1 -1
- package/dist/umd/index.js +1 -1
- package/dist/umd/index.js.map +1 -1
- package/package.json +2 -2
- package/src/RenderingEngine/helpers/addImageSlicesToViewports.ts +2 -5
- package/src/loaders/imageLoader.ts +20 -8
- package/src/types/IStackViewport.ts +2 -178
- package/src/utilities/convertStackToVolumeViewport.ts +5 -3
- package/src/utilities/getScalingParameters.ts +2 -2
- package/src/utilities/loadImageToCanvas.ts +93 -32
- package/src/utilities/renderToCanvasCPU.ts +10 -3
- 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
|
|
6
|
-
|
|
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
|
|
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
|
-
|
|
39
|
+
imageOrVolume: IImage | IVolume,
|
|
33
40
|
modality = undefined,
|
|
34
41
|
renderingEngineId = '_thumbnails',
|
|
35
|
-
viewportOptions: ViewportInputOptions
|
|
36
|
-
|
|
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
|
|
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
|
-
|
|
54
|
-
element.style.
|
|
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)
|
|
85
|
+
let viewport = renderingEngine.getViewport(viewportId);
|
|
77
86
|
|
|
78
87
|
if (!viewport) {
|
|
79
|
-
const
|
|
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(
|
|
89
|
-
viewport = renderingEngine.getViewport(viewportId)
|
|
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(
|
|
166
|
+
resolve({
|
|
167
|
+
origin,
|
|
168
|
+
bottomLeft,
|
|
169
|
+
topRight,
|
|
170
|
+
thicknessMm,
|
|
171
|
+
});
|
|
139
172
|
};
|
|
140
173
|
|
|
141
174
|
element.addEventListener(Events.IMAGE_RENDERED, onImageRendered);
|
|
142
|
-
|
|
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,
|