@cornerstonejs/core 4.0.2 → 4.1.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/esm/RenderingEngine/ContextPoolRenderingEngine.js +52 -14
- package/dist/esm/RenderingEngine/Viewport.js +7 -2
- package/dist/esm/RenderingEngine/WebGLContextPool.d.ts +9 -0
- package/dist/esm/RenderingEngine/WebGLContextPool.js +46 -0
- package/dist/esm/metaData.js +3 -8
- package/dist/esm/version.d.ts +1 -1
- package/dist/esm/version.js +1 -1
- package/package.json +2 -2
|
@@ -60,8 +60,13 @@ class ContextPoolRenderingEngine extends BaseRenderingEngine {
|
|
|
60
60
|
contextIndex = this._viewports.size % contexts.length;
|
|
61
61
|
}
|
|
62
62
|
this.contextPool.assignViewportToContext(viewportId, contextIndex);
|
|
63
|
+
this.contextPool.updateViewportSize(viewportId, canvas.width, canvas.height);
|
|
63
64
|
const contextData = this.contextPool.getContextByIndex(contextIndex);
|
|
64
|
-
const { context: offscreenMultiRenderWindow } = contextData;
|
|
65
|
+
const { context: offscreenMultiRenderWindow, container } = contextData;
|
|
66
|
+
const maxSize = this.contextPool.getMaxSizeForContext(contextIndex);
|
|
67
|
+
container.width = maxSize.width;
|
|
68
|
+
container.height = maxSize.height;
|
|
69
|
+
offscreenMultiRenderWindow.resize();
|
|
65
70
|
offscreenMultiRenderWindow.addRenderer({
|
|
66
71
|
viewport: [0, 0, 1, 1],
|
|
67
72
|
id: viewportId,
|
|
@@ -195,9 +200,15 @@ class ContextPoolRenderingEngine extends BaseRenderingEngine {
|
|
|
195
200
|
});
|
|
196
201
|
}
|
|
197
202
|
const renderWindow = offscreenMultiRenderWindow.getRenderWindow();
|
|
198
|
-
this._resizeOffScreenCanvasForViewport(viewport
|
|
203
|
+
this._resizeOffScreenCanvasForViewport(viewport, offScreenCanvasContainer, offscreenMultiRenderWindow);
|
|
199
204
|
const renderer = offscreenMultiRenderWindow.getRenderer(viewport.id);
|
|
200
|
-
|
|
205
|
+
const contextIndex = this.contextPool.getContextIndexForViewport(viewport.id);
|
|
206
|
+
const maxSize = this.contextPool.getMaxSizeForContext(contextIndex);
|
|
207
|
+
const viewportWidth = viewport.canvas.width;
|
|
208
|
+
const viewportHeight = viewport.canvas.height;
|
|
209
|
+
const xEnd = Math.min(1, viewportWidth / maxSize.width);
|
|
210
|
+
const yEnd = Math.min(1, viewportHeight / maxSize.height);
|
|
211
|
+
renderer.setViewport(0, 0, xEnd, yEnd);
|
|
201
212
|
const allRenderers = offscreenMultiRenderWindow.getRenderers();
|
|
202
213
|
allRenderers.forEach(({ renderer: r, id }) => {
|
|
203
214
|
r.setDraw(id === viewport.id);
|
|
@@ -220,24 +231,32 @@ class ContextPoolRenderingEngine extends BaseRenderingEngine {
|
|
|
220
231
|
_renderViewportFromVtkCanvasToOnscreenCanvas(viewport, offScreenCanvas) {
|
|
221
232
|
return this._copyToOnscreenCanvas(viewport, offScreenCanvas);
|
|
222
233
|
}
|
|
223
|
-
_resizeOffScreenCanvasForViewport(
|
|
224
|
-
const
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
const
|
|
229
|
-
if (
|
|
234
|
+
_resizeOffScreenCanvasForViewport(viewport, offScreenCanvasContainer, offscreenMultiRenderWindow) {
|
|
235
|
+
const contextIndex = this.contextPool.getContextIndexForViewport(viewport.id);
|
|
236
|
+
if (contextIndex === undefined) {
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
const maxSizeChanged = this.contextPool.updateViewportSize(viewport.id, viewport.canvas.width, viewport.canvas.height);
|
|
240
|
+
if (!maxSizeChanged) {
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
const maxSize = this.contextPool.getMaxSizeForContext(contextIndex);
|
|
244
|
+
if (offScreenCanvasContainer.width === maxSize.width &&
|
|
245
|
+
offScreenCanvasContainer.height === maxSize.height) {
|
|
230
246
|
return;
|
|
231
247
|
}
|
|
232
|
-
offScreenCanvasContainer.width =
|
|
233
|
-
offScreenCanvasContainer.height =
|
|
248
|
+
offScreenCanvasContainer.width = maxSize.width;
|
|
249
|
+
offScreenCanvasContainer.height = maxSize.height;
|
|
234
250
|
offscreenMultiRenderWindow.resize();
|
|
235
251
|
}
|
|
236
252
|
_copyToOnscreenCanvas(viewport, offScreenCanvas) {
|
|
237
253
|
const { element, canvas, id: viewportId, renderingEngineId, suppressEvents, } = viewport;
|
|
238
254
|
const { width: dWidth, height: dHeight } = canvas;
|
|
239
255
|
const onScreenContext = canvas.getContext('2d');
|
|
240
|
-
|
|
256
|
+
const contextIndex = this.contextPool.getContextIndexForViewport(viewportId);
|
|
257
|
+
const maxSize = this.contextPool.getMaxSizeForContext(contextIndex);
|
|
258
|
+
const sourceY = maxSize.height - dHeight;
|
|
259
|
+
onScreenContext.drawImage(offScreenCanvas, 0, sourceY, dWidth, dHeight, 0, 0, dWidth, dHeight);
|
|
241
260
|
return {
|
|
242
261
|
element,
|
|
243
262
|
suppressEvents,
|
|
@@ -247,17 +266,35 @@ class ContextPoolRenderingEngine extends BaseRenderingEngine {
|
|
|
247
266
|
};
|
|
248
267
|
}
|
|
249
268
|
_resize(viewportsDrivenByVtkJs) {
|
|
269
|
+
const contextsToResize = new Set();
|
|
250
270
|
for (const viewport of viewportsDrivenByVtkJs) {
|
|
251
271
|
viewport.sx = 0;
|
|
252
272
|
viewport.sy = 0;
|
|
253
273
|
viewport.sWidth = viewport.canvas.width;
|
|
254
274
|
viewport.sHeight = viewport.canvas.height;
|
|
255
275
|
const contextIndex = this.contextPool.getContextIndexForViewport(viewport.id);
|
|
276
|
+
const maxSizeChanged = this.contextPool.updateViewportSize(viewport.id, viewport.canvas.width, viewport.canvas.height);
|
|
277
|
+
if (maxSizeChanged) {
|
|
278
|
+
contextsToResize.add(contextIndex);
|
|
279
|
+
}
|
|
256
280
|
const contextData = this.contextPool.getContextByIndex(contextIndex);
|
|
257
281
|
const { context: offscreenMultiRenderWindow } = contextData;
|
|
258
282
|
const renderer = offscreenMultiRenderWindow.getRenderer(viewport.id);
|
|
259
|
-
|
|
283
|
+
const maxSize = this.contextPool.getMaxSizeForContext(contextIndex);
|
|
284
|
+
const xEnd = Math.min(1, viewport.canvas.width / maxSize.width);
|
|
285
|
+
const yEnd = Math.min(1, viewport.canvas.height / maxSize.height);
|
|
286
|
+
renderer.setViewport(0, 0, xEnd, yEnd);
|
|
260
287
|
}
|
|
288
|
+
contextsToResize.forEach((contextIndex) => {
|
|
289
|
+
const contextData = this.contextPool.getContextByIndex(contextIndex);
|
|
290
|
+
if (contextData) {
|
|
291
|
+
const { context: offscreenMultiRenderWindow, container } = contextData;
|
|
292
|
+
const maxSize = this.contextPool.getMaxSizeForContext(contextIndex);
|
|
293
|
+
container.width = maxSize.width;
|
|
294
|
+
container.height = maxSize.height;
|
|
295
|
+
offscreenMultiRenderWindow.resize();
|
|
296
|
+
}
|
|
297
|
+
});
|
|
261
298
|
}
|
|
262
299
|
getWidgetRenderers() {
|
|
263
300
|
const allViewports = this._getViewportsAsArray();
|
|
@@ -295,6 +332,7 @@ class ContextPoolRenderingEngine extends BaseRenderingEngine {
|
|
|
295
332
|
offscreenMultiRenderWindow.removeRenderer(viewportId);
|
|
296
333
|
}
|
|
297
334
|
}
|
|
335
|
+
this.contextPool.removeViewport(viewportId);
|
|
298
336
|
}
|
|
299
337
|
}
|
|
300
338
|
destroy() {
|
|
@@ -28,7 +28,10 @@ class Viewport {
|
|
|
28
28
|
paletteLut: true,
|
|
29
29
|
}; }
|
|
30
30
|
constructor(props) {
|
|
31
|
-
this.insetImageMultiplier =
|
|
31
|
+
this.insetImageMultiplier = getConfiguration().rendering
|
|
32
|
+
?.useLegacyCameraFOV
|
|
33
|
+
? 1.1
|
|
34
|
+
: 1;
|
|
32
35
|
this.flipHorizontal = false;
|
|
33
36
|
this.flipVertical = false;
|
|
34
37
|
this.viewportStatus = ViewportStatus.NO_DATA;
|
|
@@ -528,7 +531,9 @@ class Viewport {
|
|
|
528
531
|
}
|
|
529
532
|
let widthWorld;
|
|
530
533
|
let heightWorld;
|
|
531
|
-
|
|
534
|
+
const config = getConfiguration();
|
|
535
|
+
const useLegacyMethod = config.rendering?.useLegacyCameraFOV ?? false;
|
|
536
|
+
if (imageData && !useLegacyMethod) {
|
|
532
537
|
const extent = imageData.getExtent();
|
|
533
538
|
const spacing = imageData.getSpacing();
|
|
534
539
|
widthWorld = (extent[1] - extent[0]) * spacing[0];
|
|
@@ -3,6 +3,8 @@ declare class WebGLContextPool {
|
|
|
3
3
|
private contexts;
|
|
4
4
|
private offScreenCanvasContainers;
|
|
5
5
|
private viewportToContext;
|
|
6
|
+
private viewportSizes;
|
|
7
|
+
private contextMaxSizes;
|
|
6
8
|
constructor(count: number);
|
|
7
9
|
getContextByIndex(index: number): {
|
|
8
10
|
context: VtkOffscreenMultiRenderWindow;
|
|
@@ -12,6 +14,13 @@ declare class WebGLContextPool {
|
|
|
12
14
|
getContextIndexForViewport(viewportId: string): number | undefined;
|
|
13
15
|
getAllContexts(): VtkOffscreenMultiRenderWindow[];
|
|
14
16
|
getContextCount(): number;
|
|
17
|
+
updateViewportSize(viewportId: string, width: number, height: number): boolean;
|
|
18
|
+
getMaxSizeForContext(contextIndex: number): {
|
|
19
|
+
width: number;
|
|
20
|
+
height: number;
|
|
21
|
+
};
|
|
22
|
+
private calculateMaxSizeForContext;
|
|
23
|
+
removeViewport(viewportId: string): void;
|
|
15
24
|
destroy(): void;
|
|
16
25
|
}
|
|
17
26
|
export default WebGLContextPool;
|
|
@@ -4,6 +4,8 @@ class WebGLContextPool {
|
|
|
4
4
|
this.contexts = [];
|
|
5
5
|
this.offScreenCanvasContainers = [];
|
|
6
6
|
this.viewportToContext = new Map();
|
|
7
|
+
this.viewportSizes = new Map();
|
|
8
|
+
this.contextMaxSizes = new Map();
|
|
7
9
|
for (let i = 0; i < count; i++) {
|
|
8
10
|
const offscreenMultiRenderWindow = vtkOffscreenMultiRenderWindow.newInstance();
|
|
9
11
|
const container = document.createElement('div');
|
|
@@ -33,6 +35,48 @@ class WebGLContextPool {
|
|
|
33
35
|
getContextCount() {
|
|
34
36
|
return this.contexts.length;
|
|
35
37
|
}
|
|
38
|
+
updateViewportSize(viewportId, width, height) {
|
|
39
|
+
const contextIndex = this.viewportToContext.get(viewportId);
|
|
40
|
+
if (contextIndex === undefined) {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
this.viewportSizes.set(viewportId, { width, height });
|
|
44
|
+
const previousMax = this.contextMaxSizes.get(contextIndex);
|
|
45
|
+
const newMax = this.calculateMaxSizeForContext(contextIndex);
|
|
46
|
+
this.contextMaxSizes.set(contextIndex, newMax);
|
|
47
|
+
return (!previousMax ||
|
|
48
|
+
previousMax.width !== newMax.width ||
|
|
49
|
+
previousMax.height !== newMax.height);
|
|
50
|
+
}
|
|
51
|
+
getMaxSizeForContext(contextIndex) {
|
|
52
|
+
return this.contextMaxSizes.get(contextIndex);
|
|
53
|
+
}
|
|
54
|
+
calculateMaxSizeForContext(contextIndex) {
|
|
55
|
+
let maxWidth = 0;
|
|
56
|
+
let maxHeight = 0;
|
|
57
|
+
this.viewportToContext.forEach((assignedContext, viewportId) => {
|
|
58
|
+
if (assignedContext === contextIndex) {
|
|
59
|
+
const size = this.viewportSizes.get(viewportId);
|
|
60
|
+
if (size) {
|
|
61
|
+
maxWidth = Math.max(maxWidth, size.width);
|
|
62
|
+
maxHeight = Math.max(maxHeight, size.height);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
return {
|
|
67
|
+
width: maxWidth,
|
|
68
|
+
height: maxHeight,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
removeViewport(viewportId) {
|
|
72
|
+
const contextIndex = this.viewportToContext.get(viewportId);
|
|
73
|
+
this.viewportToContext.delete(viewportId);
|
|
74
|
+
this.viewportSizes.delete(viewportId);
|
|
75
|
+
if (contextIndex !== undefined) {
|
|
76
|
+
const newMax = this.calculateMaxSizeForContext(contextIndex);
|
|
77
|
+
this.contextMaxSizes.set(contextIndex, newMax);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
36
80
|
destroy() {
|
|
37
81
|
this.contexts.forEach((context) => {
|
|
38
82
|
context.delete();
|
|
@@ -40,6 +84,8 @@ class WebGLContextPool {
|
|
|
40
84
|
this.contexts = [];
|
|
41
85
|
this.offScreenCanvasContainers = [];
|
|
42
86
|
this.viewportToContext.clear();
|
|
87
|
+
this.viewportSizes.clear();
|
|
88
|
+
this.contextMaxSizes.clear();
|
|
43
89
|
}
|
|
44
90
|
}
|
|
45
91
|
export default WebGLContextPool;
|
package/dist/esm/metaData.js
CHANGED
|
@@ -26,14 +26,9 @@ export function removeAllProviders() {
|
|
|
26
26
|
}
|
|
27
27
|
function getMetaData(type, ...queries) {
|
|
28
28
|
for (let i = 0; i < providers.length; i++) {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
return result;
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
catch (error) {
|
|
36
|
-
console.warn(`Error occurred in provider ${i}:`, error);
|
|
29
|
+
const result = providers[i].provider(type, ...queries);
|
|
30
|
+
if (result !== undefined) {
|
|
31
|
+
return result;
|
|
37
32
|
}
|
|
38
33
|
}
|
|
39
34
|
}
|
package/dist/esm/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const version = "4.0
|
|
1
|
+
export declare const version = "4.1.0";
|
package/dist/esm/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const version = '4.0
|
|
1
|
+
export const version = '4.1.0';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cornerstonejs/core",
|
|
3
|
-
"version": "4.0
|
|
3
|
+
"version": "4.1.0",
|
|
4
4
|
"description": "Cornerstone3D Core",
|
|
5
5
|
"module": "./dist/esm/index.js",
|
|
6
6
|
"types": "./dist/esm/index.d.ts",
|
|
@@ -97,5 +97,5 @@
|
|
|
97
97
|
"type": "individual",
|
|
98
98
|
"url": "https://ohif.org/donate"
|
|
99
99
|
},
|
|
100
|
-
"gitHead": "
|
|
100
|
+
"gitHead": "4e968a54ceabef12c2649ff9857067c73acbbc07"
|
|
101
101
|
}
|