@cornerstonejs/core 0.44.2 → 0.45.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/RenderingEngine.js +6 -2
- package/dist/cjs/RenderingEngine/RenderingEngine.js.map +1 -1
- package/dist/cjs/RenderingEngine/StackViewport.d.ts +2 -0
- package/dist/cjs/RenderingEngine/StackViewport.js +20 -7
- package/dist/cjs/RenderingEngine/StackViewport.js.map +1 -1
- package/dist/cjs/RenderingEngine/renderingEngineCache.js +11 -0
- package/dist/cjs/RenderingEngine/renderingEngineCache.js.map +1 -1
- package/dist/cjs/types/RGB.d.ts +2 -0
- package/dist/cjs/types/RGB.js +3 -0
- package/dist/cjs/types/RGB.js.map +1 -0
- package/dist/cjs/types/ViewportInputOptions.d.ts +2 -1
- package/dist/cjs/types/index.d.ts +2 -1
- package/dist/cjs/utilities/index.d.ts +3 -2
- package/dist/cjs/utilities/index.js +5 -3
- package/dist/cjs/utilities/index.js.map +1 -1
- package/dist/cjs/utilities/invertRgbTransferFunction.js +3 -0
- package/dist/cjs/utilities/invertRgbTransferFunction.js.map +1 -1
- package/dist/cjs/utilities/loadImageToCanvas.d.ts +10 -1
- package/dist/cjs/utilities/loadImageToCanvas.js +9 -5
- package/dist/cjs/utilities/loadImageToCanvas.js.map +1 -1
- package/dist/cjs/utilities/renderToCanvasCPU.d.ts +2 -0
- package/dist/cjs/utilities/{renderToCanvas.js → renderToCanvasCPU.js} +7 -4
- package/dist/cjs/utilities/renderToCanvasCPU.js.map +1 -0
- package/dist/cjs/utilities/renderToCanvasGPU.d.ts +2 -0
- package/dist/cjs/utilities/renderToCanvasGPU.js +77 -0
- package/dist/cjs/utilities/renderToCanvasGPU.js.map +1 -0
- package/dist/esm/RenderingEngine/RenderingEngine.js +6 -2
- package/dist/esm/RenderingEngine/RenderingEngine.js.map +1 -1
- package/dist/esm/RenderingEngine/StackViewport.d.ts +2 -0
- package/dist/esm/RenderingEngine/StackViewport.js +18 -5
- package/dist/esm/RenderingEngine/StackViewport.js.map +1 -1
- package/dist/esm/RenderingEngine/renderingEngineCache.js +11 -0
- package/dist/esm/RenderingEngine/renderingEngineCache.js.map +1 -1
- package/dist/esm/types/RGB.d.ts +2 -0
- package/dist/esm/types/RGB.js +2 -0
- package/dist/esm/types/RGB.js.map +1 -0
- package/dist/esm/types/ViewportInputOptions.d.ts +2 -1
- package/dist/esm/types/index.d.ts +2 -1
- package/dist/esm/utilities/index.d.ts +3 -2
- package/dist/esm/utilities/index.js +3 -2
- package/dist/esm/utilities/index.js.map +1 -1
- package/dist/esm/utilities/invertRgbTransferFunction.js +3 -0
- package/dist/esm/utilities/invertRgbTransferFunction.js.map +1 -1
- package/dist/esm/utilities/loadImageToCanvas.d.ts +10 -1
- package/dist/esm/utilities/loadImageToCanvas.js +9 -5
- package/dist/esm/utilities/loadImageToCanvas.js.map +1 -1
- package/dist/esm/utilities/renderToCanvasCPU.d.ts +2 -0
- package/dist/esm/utilities/{renderToCanvas.js → renderToCanvasCPU.js} +6 -3
- package/dist/esm/utilities/renderToCanvasCPU.js.map +1 -0
- package/dist/esm/utilities/renderToCanvasGPU.d.ts +2 -0
- package/dist/esm/utilities/renderToCanvasGPU.js +71 -0
- package/dist/esm/utilities/renderToCanvasGPU.js.map +1 -0
- package/dist/umd/index.js +1 -1
- package/dist/umd/index.js.map +1 -1
- package/package.json +2 -2
- package/src/RenderingEngine/RenderingEngine.ts +10 -6
- package/src/RenderingEngine/StackViewport.ts +40 -6
- package/src/RenderingEngine/renderingEngineCache.ts +15 -0
- package/src/types/RGB.ts +6 -0
- package/src/types/ViewportInputOptions.ts +3 -1
- package/src/types/index.ts +3 -0
- package/src/utilities/index.ts +4 -2
- package/src/utilities/invertRgbTransferFunction.ts +5 -0
- package/src/utilities/loadImageToCanvas.ts +33 -11
- package/src/utilities/{renderToCanvas.ts → renderToCanvasCPU.ts} +8 -4
- package/src/utilities/renderToCanvasGPU.ts +130 -0
- package/dist/cjs/utilities/renderToCanvas.d.ts +0 -2
- package/dist/cjs/utilities/renderToCanvas.js.map +0 -1
- package/dist/esm/utilities/renderToCanvas.d.ts +0 -2
- package/dist/esm/utilities/renderToCanvas.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cornerstonejs/core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.45.0",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "dist/umd/index.js",
|
|
6
6
|
"types": "dist/esm/index.d.ts",
|
|
@@ -43,5 +43,5 @@
|
|
|
43
43
|
"type": "individual",
|
|
44
44
|
"url": "https://ohif.org/donate"
|
|
45
45
|
},
|
|
46
|
-
"gitHead": "
|
|
46
|
+
"gitHead": "94f27769ff36b2d414e730c9eb8ce462a8957816"
|
|
47
47
|
}
|
|
@@ -327,13 +327,17 @@ class RenderingEngine implements IRenderingEngine {
|
|
|
327
327
|
}
|
|
328
328
|
});
|
|
329
329
|
|
|
330
|
-
|
|
330
|
+
if (vtkDrivenViewports.length) {
|
|
331
|
+
this._resizeVTKViewports(vtkDrivenViewports, keepCamera, immediate);
|
|
332
|
+
}
|
|
331
333
|
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
334
|
+
if (customRenderingViewports.length) {
|
|
335
|
+
this._resizeUsingCustomResizeHandler(
|
|
336
|
+
customRenderingViewports,
|
|
337
|
+
keepCamera,
|
|
338
|
+
immediate
|
|
339
|
+
);
|
|
340
|
+
}
|
|
337
341
|
}
|
|
338
342
|
|
|
339
343
|
/**
|
|
@@ -1665,7 +1665,14 @@ class StackViewport extends Viewport implements IStackViewport {
|
|
|
1665
1665
|
// handle the case where the pixelData is a Float32Array
|
|
1666
1666
|
// CPU path cannot handle it, it should be converted to Uint16Array
|
|
1667
1667
|
// and via the Modality LUT we can display it properly
|
|
1668
|
-
|
|
1668
|
+
const preScale = image.preScale;
|
|
1669
|
+
const scalingParams = preScale?.scalingParameters;
|
|
1670
|
+
|
|
1671
|
+
const scaledWithNonIntegers =
|
|
1672
|
+
(preScale?.scaled && scalingParams?.rescaleIntercept % 1 !== 0) ||
|
|
1673
|
+
scalingParams?.rescaleSlope % 1 !== 0;
|
|
1674
|
+
|
|
1675
|
+
if (pixelData instanceof Float32Array && scaledWithNonIntegers) {
|
|
1669
1676
|
const floatMinMax = {
|
|
1670
1677
|
min: image.maxPixelValue,
|
|
1671
1678
|
max: image.minPixelValue,
|
|
@@ -1704,8 +1711,7 @@ class StackViewport extends Viewport implements IStackViewport {
|
|
|
1704
1711
|
};
|
|
1705
1712
|
}
|
|
1706
1713
|
|
|
1707
|
-
|
|
1708
|
-
this.csImage = image;
|
|
1714
|
+
this._setCSImage(image);
|
|
1709
1715
|
|
|
1710
1716
|
const eventDetail: EventTypes.StackNewImageEventDetail = {
|
|
1711
1717
|
image,
|
|
@@ -1842,9 +1848,7 @@ class StackViewport extends Viewport implements IStackViewport {
|
|
|
1842
1848
|
return;
|
|
1843
1849
|
}
|
|
1844
1850
|
|
|
1845
|
-
|
|
1846
|
-
image.isPreScaled = image.preScale?.scaled;
|
|
1847
|
-
this.csImage = image;
|
|
1851
|
+
this._setCSImage(image);
|
|
1848
1852
|
|
|
1849
1853
|
const eventDetail: EventTypes.StackNewImageEventDetail = {
|
|
1850
1854
|
image,
|
|
@@ -1926,6 +1930,32 @@ class StackViewport extends Viewport implements IStackViewport {
|
|
|
1926
1930
|
});
|
|
1927
1931
|
}
|
|
1928
1932
|
|
|
1933
|
+
/**
|
|
1934
|
+
* Renders the given Cornerstone image object in the viewport.
|
|
1935
|
+
* This method is intended to be used by utilities to render
|
|
1936
|
+
* an individual image, rather than by applications that want to display
|
|
1937
|
+
* a complete image stack. If you want to load and display a complete
|
|
1938
|
+
* image stack, use the setStack method instead of this one.
|
|
1939
|
+
*
|
|
1940
|
+
* The rendered image will appear in the viewport's element.
|
|
1941
|
+
* Use this method if you have other means of loading and the
|
|
1942
|
+
* cornerstone image object is already available.
|
|
1943
|
+
*
|
|
1944
|
+
* If you don't understand the difference between this method and
|
|
1945
|
+
* setStack, you probably want to use setStack.
|
|
1946
|
+
*
|
|
1947
|
+
* @param image - The Cornerstone image object to render.
|
|
1948
|
+
*/
|
|
1949
|
+
public renderImageObject = (image) => {
|
|
1950
|
+
this._setCSImage(image);
|
|
1951
|
+
this._updateActorToDisplayImageId(image);
|
|
1952
|
+
};
|
|
1953
|
+
|
|
1954
|
+
private _setCSImage = (image) => {
|
|
1955
|
+
image.isPreScaled = image.preScale?.scaled;
|
|
1956
|
+
this.csImage = image;
|
|
1957
|
+
};
|
|
1958
|
+
|
|
1929
1959
|
/**
|
|
1930
1960
|
* It updates the volume actor with the retrieved cornerstone image.
|
|
1931
1961
|
* It first checks if the new image has the same dimensions, spacings, and
|
|
@@ -2096,6 +2126,10 @@ class StackViewport extends Viewport implements IStackViewport {
|
|
|
2096
2126
|
return false;
|
|
2097
2127
|
}
|
|
2098
2128
|
|
|
2129
|
+
if (!this.csImage.preScale?.scalingParameters?.suvbw) {
|
|
2130
|
+
return false;
|
|
2131
|
+
}
|
|
2132
|
+
|
|
2099
2133
|
return true;
|
|
2100
2134
|
}
|
|
2101
2135
|
|
|
@@ -36,6 +36,21 @@ const renderingEngineCache = {
|
|
|
36
36
|
const renderingEngineIds = Object.keys(cache);
|
|
37
37
|
const renderingEngines = renderingEngineIds.map((id) => cache[id]);
|
|
38
38
|
|
|
39
|
+
// sort the rendering engines so that the ones that start with _
|
|
40
|
+
// are at the end of the array. The reason is for not breaking
|
|
41
|
+
// the code that used getRenderingEngines(), but since we moved
|
|
42
|
+
// the renderToCanvas utility to use GPU hence it needs a
|
|
43
|
+
// rendering engine and we don't want to use the default one.
|
|
44
|
+
renderingEngines.sort((a, b) => {
|
|
45
|
+
if (a.id[0] === '_' && b.id[0] !== '_') {
|
|
46
|
+
return 1;
|
|
47
|
+
} else if (a.id[0] !== '_' && b.id[0] === '_') {
|
|
48
|
+
return -1;
|
|
49
|
+
} else {
|
|
50
|
+
return 0;
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
|
|
39
54
|
return renderingEngines;
|
|
40
55
|
},
|
|
41
56
|
};
|
package/src/types/RGB.ts
ADDED
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import { OrientationAxis } from '../enums';
|
|
2
2
|
import OrientationVectors from './OrientationVectors';
|
|
3
3
|
import DisplayArea from './displayArea';
|
|
4
|
+
import RGB from './RGB';
|
|
5
|
+
|
|
4
6
|
/**
|
|
5
7
|
* This type defines the shape of viewport input options, so we can throw when it is incorrect.
|
|
6
8
|
*/
|
|
7
9
|
type ViewportInputOptions = {
|
|
8
10
|
/** background color */
|
|
9
|
-
background?:
|
|
11
|
+
background?: RGB;
|
|
10
12
|
/** orientation of the viewport which can be either an Enum for axis Enums.OrientationAxis.[AXIAL|SAGITTAL|CORONAL|DEFAULT] or an object with viewPlaneNormal and viewUp */
|
|
11
13
|
orientation?: OrientationAxis | OrientationVectors;
|
|
12
14
|
/** displayArea of interest */
|
package/src/types/index.ts
CHANGED
|
@@ -74,6 +74,7 @@ import type {
|
|
|
74
74
|
import type ICachedGeometry from './ICachedGeometry';
|
|
75
75
|
import type { IContourSet } from './IContourSet';
|
|
76
76
|
import type { IContour } from './IContour';
|
|
77
|
+
import type RGB from './RGB';
|
|
77
78
|
|
|
78
79
|
export type {
|
|
79
80
|
// config
|
|
@@ -156,4 +157,6 @@ export type {
|
|
|
156
157
|
ContourData,
|
|
157
158
|
IContourSet,
|
|
158
159
|
IContour,
|
|
160
|
+
// Color
|
|
161
|
+
RGB,
|
|
159
162
|
};
|
package/src/utilities/index.ts
CHANGED
|
@@ -24,7 +24,8 @@ import getVolumeViewportsContainingSameVolumes from './getVolumeViewportsContain
|
|
|
24
24
|
import getViewportsWithVolumeId from './getViewportsWithVolumeId';
|
|
25
25
|
import transformWorldToIndex from './transformWorldToIndex';
|
|
26
26
|
import loadImageToCanvas from './loadImageToCanvas';
|
|
27
|
-
import
|
|
27
|
+
import renderToCanvasCPU from './renderToCanvasCPU';
|
|
28
|
+
import renderToCanvasGPU from './renderToCanvasGPU';
|
|
28
29
|
import worldToImageCoords from './worldToImageCoords';
|
|
29
30
|
import imageToWorldCoords from './imageToWorldCoords';
|
|
30
31
|
import getVolumeSliceRangeInfo from './getVolumeSliceRangeInfo';
|
|
@@ -77,7 +78,8 @@ export {
|
|
|
77
78
|
getViewportsWithVolumeId,
|
|
78
79
|
transformWorldToIndex,
|
|
79
80
|
loadImageToCanvas,
|
|
80
|
-
|
|
81
|
+
renderToCanvasCPU,
|
|
82
|
+
renderToCanvasGPU,
|
|
81
83
|
worldToImageCoords,
|
|
82
84
|
imageToWorldCoords,
|
|
83
85
|
getVolumeSliceRangeInfo,
|
|
@@ -20,6 +20,11 @@
|
|
|
20
20
|
export default function invertRgbTransferFunction(
|
|
21
21
|
rgbTransferFunction: any
|
|
22
22
|
): void {
|
|
23
|
+
// cut in case there is no function at all
|
|
24
|
+
if (!rgbTransferFunction) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
|
|
23
28
|
const size = rgbTransferFunction.getSize();
|
|
24
29
|
|
|
25
30
|
for (let index = 0; index < size; index++) {
|
|
@@ -4,12 +4,23 @@ import { loadAndCacheImage } from '../loaders/imageLoader';
|
|
|
4
4
|
import * as metaData from '../metaData';
|
|
5
5
|
import { RequestType } from '../enums';
|
|
6
6
|
import imageLoadPoolManager from '../requestPool/imageLoadPoolManager';
|
|
7
|
-
import
|
|
7
|
+
import renderToCanvasGPU from './renderToCanvasGPU';
|
|
8
|
+
import renderToCanvasCPU from './renderToCanvasCPU';
|
|
8
9
|
import { getConfiguration } from '../init';
|
|
9
10
|
|
|
11
|
+
interface LoadImageOptions {
|
|
12
|
+
canvas: HTMLCanvasElement;
|
|
13
|
+
imageId: string;
|
|
14
|
+
requestType?: RequestType;
|
|
15
|
+
priority?: number;
|
|
16
|
+
renderingEngineId?: string;
|
|
17
|
+
useCPURendering?: boolean;
|
|
18
|
+
}
|
|
19
|
+
|
|
10
20
|
/**
|
|
11
|
-
* Loads and renders an imageId to a Canvas. It will use the
|
|
12
|
-
* for image
|
|
21
|
+
* Loads and renders an imageId to a Canvas. It will use the GPU rendering pipeline
|
|
22
|
+
* for image by default but you can force the CPU rendering pipeline by setting the
|
|
23
|
+
* useCPURendering parameter to true.
|
|
13
24
|
*
|
|
14
25
|
* @example
|
|
15
26
|
* ```
|
|
@@ -18,26 +29,37 @@ import { getConfiguration } from '../init';
|
|
|
18
29
|
*
|
|
19
30
|
* loadImageToCanvas(canvas, imageId)
|
|
20
31
|
* ```
|
|
21
|
-
* @param imageId - The imageId to render
|
|
22
32
|
* @param canvas - Canvas element to render to
|
|
33
|
+
* @param imageId - The imageId to render
|
|
23
34
|
* @param requestType - The type of request (default to interaction), can be 'interaction' or 'prefetch' or 'thumbnail'
|
|
24
35
|
* the order of loading for the pool manager is interaction, thumbnail, prefetch
|
|
25
36
|
* @param priority - The priority of the request within the request type (lower is higher priority)
|
|
37
|
+
* @param useCPURendering - Force the use of the CPU rendering pipeline (default to false)
|
|
26
38
|
* @returns - A promise that resolves when the image has been rendered with the imageId
|
|
27
39
|
*/
|
|
28
40
|
export default function loadImageToCanvas(
|
|
29
|
-
|
|
30
|
-
imageId: string,
|
|
31
|
-
requestType = RequestType.Thumbnail,
|
|
32
|
-
priority = -5
|
|
41
|
+
options: LoadImageOptions
|
|
33
42
|
): Promise<string> {
|
|
43
|
+
const {
|
|
44
|
+
canvas,
|
|
45
|
+
imageId,
|
|
46
|
+
requestType = RequestType.Thumbnail,
|
|
47
|
+
priority = -5,
|
|
48
|
+
renderingEngineId = '_thumbnails',
|
|
49
|
+
useCPURendering = false,
|
|
50
|
+
} = options;
|
|
51
|
+
|
|
52
|
+
const renderFn = useCPURendering ? renderToCanvasCPU : renderToCanvasGPU;
|
|
53
|
+
|
|
34
54
|
return new Promise((resolve, reject) => {
|
|
35
55
|
function successCallback(image: IImage, imageId: string) {
|
|
36
56
|
const { modality } = metaData.get('generalSeriesModule', imageId) || {};
|
|
37
57
|
|
|
38
58
|
image.isPreScaled = image.isPreScaled || image.preScale?.scaled;
|
|
39
|
-
|
|
40
|
-
|
|
59
|
+
|
|
60
|
+
renderFn(canvas, image, modality, renderingEngineId).then(() => {
|
|
61
|
+
resolve(imageId);
|
|
62
|
+
});
|
|
41
63
|
}
|
|
42
64
|
|
|
43
65
|
function errorCallback(error: Error, imageId: string) {
|
|
@@ -64,10 +86,10 @@ export default function loadImageToCanvas(
|
|
|
64
86
|
targetBuffer: {
|
|
65
87
|
type: useNorm16Texture ? undefined : 'Float32Array',
|
|
66
88
|
},
|
|
67
|
-
useRGBA: true,
|
|
68
89
|
preScale: {
|
|
69
90
|
enabled: true,
|
|
70
91
|
},
|
|
92
|
+
useRGBA: !!useCPURendering,
|
|
71
93
|
requestType,
|
|
72
94
|
};
|
|
73
95
|
|
|
@@ -11,11 +11,12 @@ import drawImageSync from '../RenderingEngine/helpers/cpuFallback/drawImageSync'
|
|
|
11
11
|
* @param image - Cornerstone image object
|
|
12
12
|
* @param canvas - Canvas element to render to
|
|
13
13
|
*/
|
|
14
|
-
export default function
|
|
14
|
+
export default function renderToCanvasCPU(
|
|
15
15
|
canvas: HTMLCanvasElement,
|
|
16
16
|
image: IImage,
|
|
17
|
-
modality?: string
|
|
18
|
-
|
|
17
|
+
modality?: string,
|
|
18
|
+
renderingEngineId?: string
|
|
19
|
+
): Promise<string> {
|
|
19
20
|
const viewport = getDefaultViewport(canvas, image, modality);
|
|
20
21
|
|
|
21
22
|
const enabledElement: CPUFallbackEnabledElement = {
|
|
@@ -28,5 +29,8 @@ export default function renderToCanvas(
|
|
|
28
29
|
enabledElement.transform = calculateTransform(enabledElement);
|
|
29
30
|
|
|
30
31
|
const invalidated = true;
|
|
31
|
-
|
|
32
|
+
return new Promise((resolve, reject) => {
|
|
33
|
+
drawImageSync(enabledElement, invalidated);
|
|
34
|
+
resolve(image.imageId);
|
|
35
|
+
});
|
|
32
36
|
}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import getOrCreateCanvas from '../RenderingEngine/helpers/getOrCreateCanvas';
|
|
2
|
+
import { ViewportType, Events } from '../enums';
|
|
3
|
+
import StackViewport from '../RenderingEngine/StackViewport';
|
|
4
|
+
import { IImage } from '../types';
|
|
5
|
+
import { getRenderingEngine } from '../RenderingEngine/getRenderingEngine';
|
|
6
|
+
import RenderingEngine from '../RenderingEngine';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Renders an cornerstone image to a Canvas. This method will handle creation
|
|
10
|
+
* of a temporary enabledElement, setting the imageId, and rendering the image via
|
|
11
|
+
* a StackViewport, copying the canvas drawing to the given canvas Element, and
|
|
12
|
+
* disabling the created temporary element. SuppressEvents argument is used to
|
|
13
|
+
* prevent events from firing during the render process (e.g. during a series
|
|
14
|
+
* of renders to a thumbnail image).
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```
|
|
18
|
+
* const canvas = document.getElementById('myCanvas')
|
|
19
|
+
*
|
|
20
|
+
* renderToCanvasGPU(canvas, image)
|
|
21
|
+
* ```
|
|
22
|
+
* @param canvas - Canvas element to render to
|
|
23
|
+
* @param image - The image to render
|
|
24
|
+
* @param modality - [Default = undefined] The modality of the image
|
|
25
|
+
* @returns - A promise that resolves when the image has been rendered with the imageId
|
|
26
|
+
*/
|
|
27
|
+
export default function renderToCanvasGPU(
|
|
28
|
+
canvas: HTMLCanvasElement,
|
|
29
|
+
image: IImage,
|
|
30
|
+
modality = undefined,
|
|
31
|
+
renderingEngineId = '_thumbnails'
|
|
32
|
+
): Promise<string> {
|
|
33
|
+
if (!canvas || !(canvas instanceof HTMLCanvasElement)) {
|
|
34
|
+
throw new Error('canvas element is required');
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const imageIdToPrint = image.imageId;
|
|
38
|
+
const viewportId = `renderGPUViewport-${imageIdToPrint}`;
|
|
39
|
+
const imageId = image.imageId;
|
|
40
|
+
const element = document.createElement('div');
|
|
41
|
+
element.style.width = `${canvas.width}px`;
|
|
42
|
+
element.style.height = `${canvas.height}px`;
|
|
43
|
+
element.style.visibility = 'hidden';
|
|
44
|
+
element.style.position = 'absolute';
|
|
45
|
+
|
|
46
|
+
document.body.appendChild(element);
|
|
47
|
+
|
|
48
|
+
// add id to the element so we can find it later, and fix the : which is not allowed in css
|
|
49
|
+
const uniqueId = viewportId.split(':').join('-');
|
|
50
|
+
element.setAttribute('viewport-id-for-remove', uniqueId);
|
|
51
|
+
|
|
52
|
+
const renderingEngine =
|
|
53
|
+
(getRenderingEngine(renderingEngineId) as RenderingEngine) ||
|
|
54
|
+
new RenderingEngine(renderingEngineId);
|
|
55
|
+
|
|
56
|
+
let viewport = renderingEngine.getViewport(viewportId) as StackViewport;
|
|
57
|
+
|
|
58
|
+
if (!viewport) {
|
|
59
|
+
const stackViewportInput = {
|
|
60
|
+
viewportId,
|
|
61
|
+
type: ViewportType.STACK,
|
|
62
|
+
element,
|
|
63
|
+
defaultOptions: {
|
|
64
|
+
suppressEvents: true,
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
renderingEngine.enableElement(stackViewportInput);
|
|
68
|
+
viewport = renderingEngine.getViewport(viewportId) as StackViewport;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
return new Promise((resolve) => {
|
|
72
|
+
// Creating a temporary HTML element so that we can
|
|
73
|
+
// enable it and later disable it without losing the canvas context
|
|
74
|
+
let elementRendered = false;
|
|
75
|
+
|
|
76
|
+
// Create a named function to handle the event
|
|
77
|
+
const onImageRendered = (eventDetail) => {
|
|
78
|
+
if (elementRendered) {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// get the canvas element that is the child of the div
|
|
83
|
+
const temporaryCanvas = getOrCreateCanvas(element);
|
|
84
|
+
|
|
85
|
+
// Copy the temporary canvas to the given canvas
|
|
86
|
+
const context = canvas.getContext('2d');
|
|
87
|
+
context.drawImage(temporaryCanvas, 0, 0);
|
|
88
|
+
elementRendered = true;
|
|
89
|
+
|
|
90
|
+
// remove based on id
|
|
91
|
+
element.removeEventListener(Events.IMAGE_RENDERED, onImageRendered);
|
|
92
|
+
|
|
93
|
+
// Ensure pending previous resize calls are done which might have been
|
|
94
|
+
// triggered by the same disableElement call. This is to avoid potential
|
|
95
|
+
// grab of the wrong canvas coordinate from the offscreen renderer since
|
|
96
|
+
// disable might have not finished resizing yet and it will cause weird
|
|
97
|
+
// copy to on screen from an incorrect location in the offscreen renderer.
|
|
98
|
+
setTimeout(() => {
|
|
99
|
+
renderingEngine.disableElement(viewportId);
|
|
100
|
+
|
|
101
|
+
// remove all the elements that has the same id
|
|
102
|
+
const elements = document.querySelectorAll(
|
|
103
|
+
`[viewport-id-for-remove="${uniqueId}"]`
|
|
104
|
+
);
|
|
105
|
+
elements.forEach((element) => {
|
|
106
|
+
element.remove();
|
|
107
|
+
});
|
|
108
|
+
}, 0);
|
|
109
|
+
resolve(imageId);
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
element.addEventListener(Events.IMAGE_RENDERED, onImageRendered);
|
|
113
|
+
viewport.renderImageObject(image);
|
|
114
|
+
|
|
115
|
+
if (modality === 'PT' && !_isPTImagePreScaledWithSUV(image)) {
|
|
116
|
+
viewport.setProperties({
|
|
117
|
+
voiRange: {
|
|
118
|
+
lower: image.minPixelValue,
|
|
119
|
+
upper: image.maxPixelValue,
|
|
120
|
+
},
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
viewport.render();
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
const _isPTImagePreScaledWithSUV = (image: IImage) => {
|
|
129
|
+
return image.preScale.scaled && image.preScale.scalingParameters.suvbw;
|
|
130
|
+
};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"renderToCanvas.js","sourceRoot":"","sources":["../../../src/utilities/renderToCanvas.ts"],"names":[],"mappings":";;;;;AAEA,6HAAqG;AACrG,6HAAqG;AACrG,yGAAiF;AASjF,SAAwB,cAAc,CACpC,MAAyB,EACzB,KAAa,EACb,QAAiB;IAEjB,MAAM,QAAQ,GAAG,IAAA,4BAAkB,EAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IAE7D,MAAM,cAAc,GAA8B;QAChD,MAAM;QACN,QAAQ;QACR,KAAK;QACL,cAAc,EAAE,EAAE;KACnB,CAAC;IAEF,cAAc,CAAC,SAAS,GAAG,IAAA,4BAAkB,EAAC,cAAc,CAAC,CAAC;IAE9D,MAAM,WAAW,GAAG,IAAI,CAAC;IACzB,IAAA,uBAAa,EAAC,cAAc,EAAE,WAAW,CAAC,CAAC;AAC7C,CAAC;AAlBD,iCAkBC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"renderToCanvas.js","sourceRoot":"","sources":["../../../src/utilities/renderToCanvas.ts"],"names":[],"mappings":"AAEA,OAAO,kBAAkB,MAAM,qEAAqE,CAAC;AACrG,OAAO,kBAAkB,MAAM,qEAAqE,CAAC;AACrG,OAAO,aAAa,MAAM,sDAAsD,CAAC;AASjF,MAAM,CAAC,OAAO,UAAU,cAAc,CACpC,MAAyB,EACzB,KAAa,EACb,QAAiB;IAEjB,MAAM,QAAQ,GAAG,kBAAkB,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IAE7D,MAAM,cAAc,GAA8B;QAChD,MAAM;QACN,QAAQ;QACR,KAAK;QACL,cAAc,EAAE,EAAE;KACnB,CAAC;IAEF,cAAc,CAAC,SAAS,GAAG,kBAAkB,CAAC,cAAc,CAAC,CAAC;IAE9D,MAAM,WAAW,GAAG,IAAI,CAAC;IACzB,aAAa,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;AAC7C,CAAC"}
|