@cornerstonejs/core 4.0.3 → 4.1.1

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.canvas, offScreenCanvasContainer, offscreenMultiRenderWindow);
203
+ this._resizeOffScreenCanvasForViewport(viewport, offScreenCanvasContainer, offscreenMultiRenderWindow);
199
204
  const renderer = offscreenMultiRenderWindow.getRenderer(viewport.id);
200
- renderer.setViewport(0, 0, 1, 1);
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(viewportCanvas, offScreenCanvasContainer, offscreenMultiRenderWindow) {
224
- const offScreenCanvasWidth = viewportCanvas.width;
225
- const offScreenCanvasHeight = viewportCanvas.height;
226
- if (offScreenCanvasContainer.height === offScreenCanvasHeight &&
227
- offScreenCanvasContainer.width === offScreenCanvasWidth) {
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 = offScreenCanvasWidth;
231
- offScreenCanvasContainer.height = offScreenCanvasHeight;
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
- onScreenContext.drawImage(offScreenCanvas, 0, 0, dWidth, dHeight, 0, 0, dWidth, dHeight);
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
- renderer.setViewport(0, 0, 1, 1);
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;
@@ -1 +1 @@
1
- export declare const version = "4.0.3";
1
+ export declare const version = "4.1.1";
@@ -1 +1 @@
1
- export const version = '4.0.3';
1
+ export const version = '4.1.1';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cornerstonejs/core",
3
- "version": "4.0.3",
3
+ "version": "4.1.1",
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": "7ca9f53565f6bbcda2b5f2e45dca1a6c3bef78dd"
100
+ "gitHead": "89a35cd7bf546ea6271bbae09469884c6d4b6242"
101
101
  }