@cornerstonejs/core 4.0.3 → 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.
|
@@ -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,22 +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
|
-
|
|
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) {
|
|
228
246
|
return;
|
|
229
247
|
}
|
|
230
|
-
offScreenCanvasContainer.width =
|
|
231
|
-
offScreenCanvasContainer.height =
|
|
248
|
+
offScreenCanvasContainer.width = maxSize.width;
|
|
249
|
+
offScreenCanvasContainer.height = maxSize.height;
|
|
232
250
|
offscreenMultiRenderWindow.resize();
|
|
233
251
|
}
|
|
234
252
|
_copyToOnscreenCanvas(viewport, offScreenCanvas) {
|
|
235
253
|
const { element, canvas, id: viewportId, renderingEngineId, suppressEvents, } = viewport;
|
|
236
254
|
const { width: dWidth, height: dHeight } = canvas;
|
|
237
255
|
const onScreenContext = canvas.getContext('2d');
|
|
238
|
-
|
|
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);
|
|
239
260
|
return {
|
|
240
261
|
element,
|
|
241
262
|
suppressEvents,
|
|
@@ -245,17 +266,35 @@ class ContextPoolRenderingEngine extends BaseRenderingEngine {
|
|
|
245
266
|
};
|
|
246
267
|
}
|
|
247
268
|
_resize(viewportsDrivenByVtkJs) {
|
|
269
|
+
const contextsToResize = new Set();
|
|
248
270
|
for (const viewport of viewportsDrivenByVtkJs) {
|
|
249
271
|
viewport.sx = 0;
|
|
250
272
|
viewport.sy = 0;
|
|
251
273
|
viewport.sWidth = viewport.canvas.width;
|
|
252
274
|
viewport.sHeight = viewport.canvas.height;
|
|
253
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
|
+
}
|
|
254
280
|
const contextData = this.contextPool.getContextByIndex(contextIndex);
|
|
255
281
|
const { context: offscreenMultiRenderWindow } = contextData;
|
|
256
282
|
const renderer = offscreenMultiRenderWindow.getRenderer(viewport.id);
|
|
257
|
-
|
|
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);
|
|
258
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
|
+
});
|
|
259
298
|
}
|
|
260
299
|
getWidgetRenderers() {
|
|
261
300
|
const allViewports = this._getViewportsAsArray();
|
|
@@ -293,6 +332,7 @@ class ContextPoolRenderingEngine extends BaseRenderingEngine {
|
|
|
293
332
|
offscreenMultiRenderWindow.removeRenderer(viewportId);
|
|
294
333
|
}
|
|
295
334
|
}
|
|
335
|
+
this.contextPool.removeViewport(viewportId);
|
|
296
336
|
}
|
|
297
337
|
}
|
|
298
338
|
destroy() {
|
|
@@ -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/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
|
}
|