@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.
@@ -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,24 +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
- const tolerance = 2;
227
- const widthDiff = Math.abs(offScreenCanvasContainer.width - offScreenCanvasWidth);
228
- const heightDiff = Math.abs(offScreenCanvasContainer.height - offScreenCanvasHeight);
229
- if (widthDiff <= tolerance && heightDiff <= tolerance) {
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 = offScreenCanvasWidth;
233
- offScreenCanvasContainer.height = offScreenCanvasHeight;
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
- 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);
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
- 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);
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 = 1;
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
- if (imageData) {
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;
@@ -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
- try {
30
- const result = providers[i].provider(type, ...queries);
31
- if (result !== undefined) {
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
  }
@@ -1 +1 @@
1
- export declare const version = "4.0.2";
1
+ export declare const version = "4.1.0";
@@ -1 +1 @@
1
- export const version = '4.0.2';
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.2",
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": "bee7eedbfc5ac6c208d03f87574c1ffea0c36d10"
100
+ "gitHead": "4e968a54ceabef12c2649ff9857067c73acbbc07"
101
101
  }