@cornerstonejs/core 5.1.0 → 5.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.
- package/dist/esm/RenderingEngine/ContextPoolRenderingEngine.d.ts +1 -0
- package/dist/esm/RenderingEngine/ContextPoolRenderingEngine.js +16 -6
- package/dist/esm/RenderingEngine/GenericViewport/GenericViewport.d.ts +6 -1
- package/dist/esm/RenderingEngine/GenericViewport/GenericViewport.js +20 -0
- package/dist/esm/RenderingEngine/GenericViewport/Planar/CpuImageSliceRenderPath.js +12 -3
- package/dist/esm/RenderingEngine/GenericViewport/Planar/CpuVolumeSliceRenderPath.js +3 -1
- package/dist/esm/RenderingEngine/GenericViewport/Planar/DefaultPlanarDataProvider.js +5 -2
- package/dist/esm/RenderingEngine/GenericViewport/Planar/PlanarRenderPathDecisionService.d.ts +1 -0
- package/dist/esm/RenderingEngine/GenericViewport/Planar/PlanarRenderPathDecisionService.js +26 -9
- package/dist/esm/RenderingEngine/GenericViewport/Planar/PlanarViewport.d.ts +15 -2
- package/dist/esm/RenderingEngine/GenericViewport/Planar/PlanarViewport.js +174 -10
- package/dist/esm/RenderingEngine/GenericViewport/Planar/PlanarViewportTypes.d.ts +4 -2
- package/dist/esm/RenderingEngine/GenericViewport/Planar/VtkImageMapperRenderPath.js +42 -9
- package/dist/esm/RenderingEngine/GenericViewport/Planar/VtkVolumeSliceRenderPath.js +3 -1
- package/dist/esm/RenderingEngine/GenericViewport/Planar/planarImageEvents.d.ts +1 -0
- package/dist/esm/RenderingEngine/GenericViewport/Planar/planarImageEvents.js +11 -2
- package/dist/esm/RenderingEngine/GenericViewport/Planar/planarVolumePresentation.js +30 -3
- package/dist/esm/RenderingEngine/GenericViewport/Video/VideoViewport.d.ts +1 -0
- package/dist/esm/RenderingEngine/GenericViewport/Video/VideoViewport.js +3 -0
- package/dist/esm/RenderingEngine/GenericViewport/Volume3D/viewport3D.d.ts +5 -1
- package/dist/esm/RenderingEngine/GenericViewport/Volume3D/viewport3D.js +15 -1
- package/dist/esm/RenderingEngine/GenericViewport/genericViewportReferenceCompatibility.js +26 -4
- package/dist/esm/RenderingEngine/helpers/planarImageRendering.d.ts +5 -1
- package/dist/esm/RenderingEngine/helpers/planarImageRendering.js +19 -5
- package/dist/esm/RenderingEngine/helpers/stats/RenderModesPanel.d.ts +4 -0
- package/dist/esm/RenderingEngine/helpers/stats/RenderModesPanel.js +48 -1
- package/dist/esm/RenderingEngine/helpers/stats/StatsOverlay.js +66 -9
- package/dist/esm/init.js +1 -1
- package/dist/esm/types/IGenericViewport.d.ts +24 -0
- package/dist/esm/types/IGenericViewport.js +0 -0
- package/dist/esm/types/ScalingDescriptor.d.ts +5 -0
- package/dist/esm/types/ScalingDescriptor.js +0 -0
- package/dist/esm/types/index.d.ts +4 -1
- package/dist/esm/utilities/VoxelManager.d.ts +2 -0
- package/dist/esm/utilities/VoxelManager.js +12 -1
- package/dist/esm/utilities/getScalingDescriptor.d.ts +10 -0
- package/dist/esm/utilities/getScalingDescriptor.js +41 -0
- package/dist/esm/utilities/getTargetVolumeAndSpacingInNormalDir.js +4 -5
- package/dist/esm/utilities/getViewportModality.js +5 -14
- package/dist/esm/utilities/index.d.ts +4 -2
- package/dist/esm/utilities/index.js +5 -2
- package/dist/esm/utilities/isPTPrescaledWithSUV.d.ts +1 -1
- package/dist/esm/utilities/isPTPrescaledWithSUV.js +1 -1
- package/dist/esm/utilities/resolveGenericViewportVolumeId.d.ts +2 -0
- package/dist/esm/utilities/resolveGenericViewportVolumeId.js +12 -0
- package/dist/esm/utilities/viewportCapabilities.d.ts +10 -1
- package/dist/esm/utilities/viewportCapabilities.js +22 -0
- package/dist/esm/version.d.ts +1 -1
- package/dist/esm/version.js +1 -1
- package/package.json +6 -6
|
@@ -10,6 +10,7 @@ declare class ContextPoolRenderingEngine extends BaseRenderingEngine {
|
|
|
10
10
|
protected enableVTKjsDrivenViewport(viewportInputEntry: NormalizedViewportInput): void;
|
|
11
11
|
protected addVtkjsDrivenViewport(viewportInputEntry: InternalViewportInput): void;
|
|
12
12
|
protected setVtkjsDrivenViewports(viewportInputEntries: NormalizedViewportInput[]): void;
|
|
13
|
+
private _getDisplayedSize;
|
|
13
14
|
protected _resizeVTKViewports(vtkDrivenViewports: IViewport[], keepCamera?: boolean, immediate?: boolean): void;
|
|
14
15
|
protected _renderFlaggedViewports: () => void;
|
|
15
16
|
private renderViewportUsingCustomOrVtkPipeline;
|
|
@@ -8,6 +8,7 @@ import ViewportType from '../enums/ViewportType';
|
|
|
8
8
|
import viewportTypeUsesCustomRenderingPipeline, { viewportUsesCustomRenderingPipeline, } from './helpers/viewportTypeUsesCustomRenderingPipeline';
|
|
9
9
|
import getOrCreateCanvas, { updateCanvasSizeAndAspectRatio, } from './helpers/getOrCreateCanvas';
|
|
10
10
|
import { getViewportClassForInput } from './helpers/viewportTypeToViewportClass';
|
|
11
|
+
import { isGenericViewport } from '../utilities/viewportCapabilities';
|
|
11
12
|
class ContextPoolRenderingEngine extends BaseRenderingEngine {
|
|
12
13
|
constructor(id) {
|
|
13
14
|
super(id);
|
|
@@ -124,13 +125,21 @@ class ContextPoolRenderingEngine extends BaseRenderingEngine {
|
|
|
124
125
|
}
|
|
125
126
|
}
|
|
126
127
|
}
|
|
127
|
-
|
|
128
|
+
_getDisplayedSize(vp) {
|
|
128
129
|
const devicePixelRatio = window.devicePixelRatio || 1;
|
|
130
|
+
const sizeSource = isGenericViewport(vp)
|
|
131
|
+
? vp.element
|
|
132
|
+
: getOrCreateCanvas(vp.element);
|
|
133
|
+
return {
|
|
134
|
+
displayedWidth: Math.round(sizeSource.clientWidth * devicePixelRatio),
|
|
135
|
+
displayedHeight: Math.round(sizeSource.clientHeight * devicePixelRatio),
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
_resizeVTKViewports(vtkDrivenViewports, keepCamera = true, immediate = true) {
|
|
129
139
|
const viewportsNeedingResize = [];
|
|
130
140
|
for (const vp of vtkDrivenViewports) {
|
|
131
141
|
const canvas = getOrCreateCanvas(vp.element);
|
|
132
|
-
const displayedWidth =
|
|
133
|
-
const displayedHeight = Math.round(canvas.clientHeight * devicePixelRatio);
|
|
142
|
+
const { displayedWidth, displayedHeight } = this._getDisplayedSize(vp);
|
|
134
143
|
if (displayedWidth === 0 || displayedHeight === 0) {
|
|
135
144
|
continue;
|
|
136
145
|
}
|
|
@@ -146,9 +155,7 @@ class ContextPoolRenderingEngine extends BaseRenderingEngine {
|
|
|
146
155
|
return;
|
|
147
156
|
}
|
|
148
157
|
for (const vp of viewportsNeedingResize) {
|
|
149
|
-
const
|
|
150
|
-
const displayedWidth = Math.round(canvas.clientWidth * devicePixelRatio);
|
|
151
|
-
const displayedHeight = Math.round(canvas.clientHeight * devicePixelRatio);
|
|
158
|
+
const { displayedWidth, displayedHeight } = this._getDisplayedSize(vp);
|
|
152
159
|
const targetWidth = Math.max(VIEWPORT_MIN_SIZE, displayedWidth);
|
|
153
160
|
const targetHeight = Math.max(VIEWPORT_MIN_SIZE, displayedHeight);
|
|
154
161
|
vp.sWidth = targetWidth;
|
|
@@ -162,6 +169,9 @@ class ContextPoolRenderingEngine extends BaseRenderingEngine {
|
|
|
162
169
|
}
|
|
163
170
|
vtkDrivenViewports.forEach((vp) => {
|
|
164
171
|
vp.resize?.();
|
|
172
|
+
if (isGenericViewport(vp)) {
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
165
175
|
const prevCamera = vp.getCamera();
|
|
166
176
|
const rotation = vp.getRotation?.() ?? 0;
|
|
167
177
|
const { flipHorizontal } = prevCamera;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type ICamera from '../../types/ICamera';
|
|
2
|
-
import type { Point2, Point3 } from '../../types';
|
|
2
|
+
import type { Point2, Point3, ViewportContentMode } from '../../types';
|
|
3
3
|
import ViewportStatus from '../../enums/ViewportStatus';
|
|
4
|
+
import type { IRenderingEngine } from '../../types';
|
|
4
5
|
import type { BaseViewportRenderContext, BindingRole, DataAddOptions, DisplaySetId, DataProvider, LoadedData, ViewportDataBinding, RenderPathResolver, ViewportController, ViewportId } from './ViewportArchitectureTypes';
|
|
5
6
|
import type ViewportType from '../../enums/ViewportType';
|
|
6
7
|
import type ResolvedViewportView from './ResolvedViewportView';
|
|
@@ -39,11 +40,13 @@ declare abstract class GenericViewport<TViewState extends object, TDataPresentat
|
|
|
39
40
|
setDisplaySetPresentation(props: Partial<TDataPresentation>): void;
|
|
40
41
|
setDisplaySetPresentation(displaySetId: DisplaySetId, props: Partial<TDataPresentation>): void;
|
|
41
42
|
getDisplaySetPresentation(displaySetId: DisplaySetId): TDataPresentation | undefined;
|
|
43
|
+
getCurrentMode(): ViewportContentMode;
|
|
42
44
|
getViewReference(_specifier?: ViewReferenceSpecifier): ViewReference;
|
|
43
45
|
getViewReferenceId(_specifier?: ViewReferenceSpecifier): string;
|
|
44
46
|
setViewReference(_viewReference: ViewReference): void;
|
|
45
47
|
isReferenceViewable(viewReference: ViewReference, options?: ReferenceCompatibleOptions): boolean;
|
|
46
48
|
getFrameOfReferenceUID(): string;
|
|
49
|
+
getRenderingEngine(): IRenderingEngine;
|
|
47
50
|
abstract getResolvedView(): ResolvedViewportView<unknown, ICamera<unknown>> | undefined;
|
|
48
51
|
canvasToWorld(canvasPos: Point2): Point3;
|
|
49
52
|
worldToCanvas(worldPos: Point3): Point2;
|
|
@@ -66,6 +69,7 @@ declare abstract class GenericViewport<TViewState extends object, TDataPresentat
|
|
|
66
69
|
protected getDataPresentationState(displaySetId: DisplaySetId): TDataPresentation | undefined;
|
|
67
70
|
protected setDefaultDataPresentation(displaySetId: DisplaySetId, defaults: TDataPresentation): TDataPresentation;
|
|
68
71
|
protected mergeDataPresentation(displaySetId: DisplaySetId, props: Partial<TDataPresentation>): TDataPresentation;
|
|
72
|
+
protected notifyDataPresentationModified(_displaySetId: DisplaySetId, _props: Partial<TDataPresentation>): void;
|
|
69
73
|
protected normalizeViewState(viewState: TViewState): TViewState;
|
|
70
74
|
protected modified(previousCamera?: ICamera): void;
|
|
71
75
|
protected getCameraForEvent(): ICamera;
|
|
@@ -75,6 +79,7 @@ declare abstract class GenericViewport<TViewState extends object, TDataPresentat
|
|
|
75
79
|
protected getDisplaySetRenderMode(displaySetId: DisplaySetId): string | undefined;
|
|
76
80
|
protected getDisplaySetRole(displaySetId: DisplaySetId): BindingRole | undefined;
|
|
77
81
|
protected getFirstBinding(): ViewportDataBinding<TDataPresentation> | undefined;
|
|
82
|
+
protected getSourceBinding(): ViewportDataBinding<TDataPresentation> | undefined;
|
|
78
83
|
protected getCurrentBinding(): ViewportDataBinding<TDataPresentation> | undefined;
|
|
79
84
|
protected forEachBinding(visitor: (binding: ViewportDataBinding<TDataPresentation>) => void): void;
|
|
80
85
|
protected getReferenceViewContexts(_viewReference?: ViewReference): GenericViewportReferenceContext[];
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import Events from '../../enums/Events';
|
|
2
2
|
import ViewportStatus from '../../enums/ViewportStatus';
|
|
3
3
|
import triggerEvent from '../../utilities/triggerEvent';
|
|
4
|
+
import renderingEngineCache from '../renderingEngineCache';
|
|
4
5
|
import { isGenericViewportReferenceViewable, } from './genericViewportReferenceCompatibility';
|
|
5
6
|
class GenericViewport {
|
|
6
7
|
constructor(args) {
|
|
@@ -67,6 +68,9 @@ class GenericViewport {
|
|
|
67
68
|
getDisplaySetPresentation(displaySetId) {
|
|
68
69
|
return this.getDataPresentationState(displaySetId);
|
|
69
70
|
}
|
|
71
|
+
getCurrentMode() {
|
|
72
|
+
return this.getSourceBinding() ? 'unknown' : 'empty';
|
|
73
|
+
}
|
|
70
74
|
getViewReference(_specifier = {}) {
|
|
71
75
|
return {
|
|
72
76
|
FrameOfReferenceUID: this.getFrameOfReferenceUID(),
|
|
@@ -85,6 +89,9 @@ class GenericViewport {
|
|
|
85
89
|
return (this.getResolvedView()?.getFrameOfReferenceUID() ??
|
|
86
90
|
`${this.type}-viewport-${this.id}`);
|
|
87
91
|
}
|
|
92
|
+
getRenderingEngine() {
|
|
93
|
+
return renderingEngineCache.get(this.renderingEngineId);
|
|
94
|
+
}
|
|
88
95
|
canvasToWorld(canvasPos) {
|
|
89
96
|
const cc = this.getResolvedView();
|
|
90
97
|
if (!cc) {
|
|
@@ -261,8 +268,13 @@ class GenericViewport {
|
|
|
261
268
|
...props,
|
|
262
269
|
};
|
|
263
270
|
this.setDataPresentationState(displaySetId, nextPresentation);
|
|
271
|
+
if (this.bindings.has(displaySetId)) {
|
|
272
|
+
this.notifyDataPresentationModified(displaySetId, props);
|
|
273
|
+
}
|
|
264
274
|
return nextPresentation;
|
|
265
275
|
}
|
|
276
|
+
notifyDataPresentationModified(_displaySetId, _props) {
|
|
277
|
+
}
|
|
266
278
|
normalizeViewState(viewState) {
|
|
267
279
|
return viewState;
|
|
268
280
|
}
|
|
@@ -313,6 +325,14 @@ class GenericViewport {
|
|
|
313
325
|
getFirstBinding() {
|
|
314
326
|
return this.bindings.values().next().value;
|
|
315
327
|
}
|
|
328
|
+
getSourceBinding() {
|
|
329
|
+
for (const binding of this.bindings.values()) {
|
|
330
|
+
if (binding.role === 'source') {
|
|
331
|
+
return binding;
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
return this.getFirstBinding();
|
|
335
|
+
}
|
|
316
336
|
getCurrentBinding() {
|
|
317
337
|
return this.getFirstBinding();
|
|
318
338
|
}
|
|
@@ -28,6 +28,7 @@ export class CpuImageSliceRenderPath {
|
|
|
28
28
|
}
|
|
29
29
|
ctx.display.activateRenderMode(ActorRenderMode.CPU_IMAGE);
|
|
30
30
|
let rendering;
|
|
31
|
+
markCpuImagePreScaled(payload.image);
|
|
31
32
|
const compatibilityActor = new CanvasActor({
|
|
32
33
|
getImageData: () => this.getImageData(rendering),
|
|
33
34
|
}, payload.image);
|
|
@@ -47,7 +48,7 @@ export class CpuImageSliceRenderPath {
|
|
|
47
48
|
actorEntryUID: uuidv4(),
|
|
48
49
|
enabledElement,
|
|
49
50
|
compatibilityActor,
|
|
50
|
-
currentImageIdIndex: payload.initialImageIdIndex,
|
|
51
|
+
currentImageIdIndex: payload.initialImageIdIndex ?? 0,
|
|
51
52
|
defaultVOIRange: getDefaultImageVOIRange(payload.image),
|
|
52
53
|
dataPresentation: undefined,
|
|
53
54
|
fitScale: getCPUFallbackScalarScale(enabledElement.viewport.scale),
|
|
@@ -56,7 +57,7 @@ export class CpuImageSliceRenderPath {
|
|
|
56
57
|
};
|
|
57
58
|
triggerPlanarNewImage(ctx, {
|
|
58
59
|
image: payload.image,
|
|
59
|
-
imageIdIndex: payload.initialImageIdIndex,
|
|
60
|
+
imageIdIndex: payload.initialImageIdIndex ?? 0,
|
|
60
61
|
});
|
|
61
62
|
return {
|
|
62
63
|
rendering,
|
|
@@ -355,9 +356,16 @@ function worldToCPUImageDrawPoint(enabledElement, worldPos) {
|
|
|
355
356
|
sourceY,
|
|
356
357
|
];
|
|
357
358
|
}
|
|
359
|
+
function markCpuImagePreScaled(image) {
|
|
360
|
+
image.isPreScaled = image.preScale?.scaled;
|
|
361
|
+
}
|
|
358
362
|
export function buildPlanarImageData(image, frameOfReferenceUID) {
|
|
359
363
|
const metadata = getImageDataMetadata(image);
|
|
360
|
-
const {
|
|
364
|
+
const { dimensions, direction, modality, origin, spacing } = metadata;
|
|
365
|
+
const userCalibration = metaData.get('calibratedPixelSpacing', image.imageId);
|
|
366
|
+
const calibration = userCalibration
|
|
367
|
+
? { ...metadata.calibration, ...userCalibration }
|
|
368
|
+
: metadata.calibration;
|
|
361
369
|
const rowVector = direction.slice(0, 3);
|
|
362
370
|
const columnVector = direction.slice(3, 6);
|
|
363
371
|
const scalarData = image.voxelManager?.getScalarData() || image.getPixelData?.();
|
|
@@ -418,6 +426,7 @@ function renderCompatibilityOverlayActors(ctx) {
|
|
|
418
426
|
async function updateRenderedImage(args) {
|
|
419
427
|
const { ctx, dataId, image, imageIdIndex, props, rendering } = args;
|
|
420
428
|
const enabledElement = rendering.enabledElement;
|
|
429
|
+
markCpuImagePreScaled(image);
|
|
421
430
|
const camera = ctx.viewport.getViewState();
|
|
422
431
|
const defaultViewport = getDefaultViewport(ctx.cpu.canvas, image);
|
|
423
432
|
const previousViewport = enabledElement.viewport;
|
|
@@ -40,7 +40,7 @@ export class CpuVolumeSliceRenderPath {
|
|
|
40
40
|
imageIds: payload.imageIds,
|
|
41
41
|
acquisitionOrientation: payload.acquisitionOrientation,
|
|
42
42
|
layerCanvas: createCanvas(null, ctx.cpu.canvas.width, ctx.cpu.canvas.height),
|
|
43
|
-
currentImageIdIndex: payload.initialImageIdIndex,
|
|
43
|
+
currentImageIdIndex: payload.initialImageIdIndex ?? 0,
|
|
44
44
|
maxImageIdIndex: payload.imageIds.length - 1,
|
|
45
45
|
defaultVOIRange,
|
|
46
46
|
renderingInvalidated: true,
|
|
@@ -145,6 +145,7 @@ export class CpuVolumeSliceRenderPath {
|
|
|
145
145
|
acquisitionOrientation: rendering.acquisitionOrientation,
|
|
146
146
|
imageIds: rendering.imageIds,
|
|
147
147
|
imageIdIndex: rendering.currentImageIdIndex,
|
|
148
|
+
maxImageIdIndex: rendering.maxImageIdIndex,
|
|
148
149
|
});
|
|
149
150
|
return {
|
|
150
151
|
rendering,
|
|
@@ -361,6 +362,7 @@ export class CpuVolumeSliceRenderPath {
|
|
|
361
362
|
acquisitionOrientation: rendering.acquisitionOrientation,
|
|
362
363
|
imageIds: rendering.imageIds,
|
|
363
364
|
imageIdIndex: rendering.currentImageIdIndex,
|
|
365
|
+
maxImageIdIndex: rendering.maxImageIdIndex,
|
|
364
366
|
});
|
|
365
367
|
}
|
|
366
368
|
}
|
|
@@ -16,6 +16,9 @@ export class DefaultPlanarDataProvider {
|
|
|
16
16
|
throw new Error('[PlanarViewport] Cannot load an empty planar dataset');
|
|
17
17
|
}
|
|
18
18
|
const clampedImageIdIndex = Math.min(Math.max(0, dataSet.initialImageIdIndex ?? 0), dataSet.imageIds.length - 1);
|
|
19
|
+
const initialImageIdIndex = dataSet.initialImageIdIndex === undefined
|
|
20
|
+
? undefined
|
|
21
|
+
: clampedImageIdIndex;
|
|
19
22
|
if (options.renderMode === ActorRenderMode.VTK_VOLUME_SLICE ||
|
|
20
23
|
options.renderMode === ActorRenderMode.CPU_VOLUME) {
|
|
21
24
|
const volumeId = resolveViewportVolumeId(options.volumeId);
|
|
@@ -30,7 +33,7 @@ export class DefaultPlanarDataProvider {
|
|
|
30
33
|
id: dataId,
|
|
31
34
|
type: 'image',
|
|
32
35
|
imageIds,
|
|
33
|
-
initialImageIdIndex
|
|
36
|
+
initialImageIdIndex,
|
|
34
37
|
acquisitionOrientation: options.acquisitionOrientation,
|
|
35
38
|
imageData: dataSet.imageData,
|
|
36
39
|
imageVolume,
|
|
@@ -50,7 +53,7 @@ export class DefaultPlanarDataProvider {
|
|
|
50
53
|
imageIds: dataSet.imageIds,
|
|
51
54
|
image,
|
|
52
55
|
imageData: dataSet.imageData,
|
|
53
|
-
initialImageIdIndex
|
|
56
|
+
initialImageIdIndex,
|
|
54
57
|
acquisitionOrientation: options.acquisitionOrientation,
|
|
55
58
|
reference: dataSet.reference,
|
|
56
59
|
renderMode: options.renderMode,
|
package/dist/esm/RenderingEngine/GenericViewport/Planar/PlanarRenderPathDecisionService.d.ts
CHANGED
|
@@ -17,6 +17,7 @@ export interface PlanarRenderPathDecisionOptions {
|
|
|
17
17
|
}
|
|
18
18
|
export declare class PlanarRenderPathDecisionService {
|
|
19
19
|
select(dataSet: PlanarRegisteredDataSet, options?: PlanarRenderPathDecisionOptions): SelectedPlanarRenderPath;
|
|
20
|
+
canRender(dataSet: PlanarRegisteredDataSet, options?: PlanarRenderPathDecisionOptions): boolean;
|
|
20
21
|
private selectImageRenderMode;
|
|
21
22
|
private selectVolumeRenderMode;
|
|
22
23
|
private shouldUseCPUForImage;
|
|
@@ -7,7 +7,7 @@ import { ActorRenderMode } from '../../../types';
|
|
|
7
7
|
import { isValidVolume } from '../../../utilities/isValidVolume';
|
|
8
8
|
import { getOrientationFromScanAxisNormal } from '../../helpers/getCameraVectors';
|
|
9
9
|
export const DEFAULT_PLANAR_CPU_IMAGE_THRESHOLD = 64 * 1024 * 1024;
|
|
10
|
-
export const DEFAULT_PLANAR_CPU_VOLUME_THRESHOLD =
|
|
10
|
+
export const DEFAULT_PLANAR_CPU_VOLUME_THRESHOLD = Number.POSITIVE_INFINITY;
|
|
11
11
|
export class PlanarRenderPathDecisionService {
|
|
12
12
|
select(dataSet, options = {}) {
|
|
13
13
|
if (!dataSet.imageIds.length) {
|
|
@@ -32,12 +32,32 @@ export class PlanarRenderPathDecisionService {
|
|
|
32
32
|
acquisitionOrientation,
|
|
33
33
|
renderMode: useVolumePath
|
|
34
34
|
? this.selectVolumeRenderMode(dataSet, options)
|
|
35
|
-
: this.selectImageRenderMode(
|
|
35
|
+
: this.selectImageRenderMode(options),
|
|
36
36
|
volumeId,
|
|
37
37
|
};
|
|
38
38
|
}
|
|
39
|
-
|
|
40
|
-
|
|
39
|
+
canRender(dataSet, options = {}) {
|
|
40
|
+
if (!dataSet.imageIds.length) {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
const orientation = options.orientation || OrientationAxis.ACQUISITION;
|
|
44
|
+
const acquisitionOrientation = getPlanarAcquisitionOrientation(dataSet.imageIds);
|
|
45
|
+
const isAcquisitionPath = orientation === OrientationAxis.ACQUISITION ||
|
|
46
|
+
(acquisitionOrientation !== undefined &&
|
|
47
|
+
orientation === acquisitionOrientation);
|
|
48
|
+
const useVolumePath = isVolumeBackedDataSet(dataSet, isAcquisitionPath);
|
|
49
|
+
if (!isAcquisitionPath &&
|
|
50
|
+
!useVolumePath &&
|
|
51
|
+
!dataSet.useWorldCoordinateImageData) {
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
if (useVolumePath && !supportsVolumeRendering(dataSet)) {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
selectImageRenderMode(options) {
|
|
60
|
+
return this.shouldUseCPUForImage(options)
|
|
41
61
|
? ActorRenderMode.CPU_IMAGE
|
|
42
62
|
: ActorRenderMode.VTK_IMAGE;
|
|
43
63
|
}
|
|
@@ -46,14 +66,11 @@ export class PlanarRenderPathDecisionService {
|
|
|
46
66
|
? ActorRenderMode.CPU_VOLUME
|
|
47
67
|
: ActorRenderMode.VTK_VOLUME_SLICE;
|
|
48
68
|
}
|
|
49
|
-
shouldUseCPUForImage(
|
|
69
|
+
shouldUseCPUForImage(options) {
|
|
50
70
|
if (options.webGLAvailable === false) {
|
|
51
71
|
return true;
|
|
52
72
|
}
|
|
53
|
-
|
|
54
|
-
return shouldUseCPU(dataSet.imageIds, options.cpuThresholds?.image ??
|
|
55
|
-
configuredCpuThresholds?.image ??
|
|
56
|
-
DEFAULT_PLANAR_CPU_IMAGE_THRESHOLD);
|
|
73
|
+
return getShouldUseCPURendering();
|
|
57
74
|
}
|
|
58
75
|
shouldUseCPUForVolume(dataSet, options) {
|
|
59
76
|
if (options.webGLAvailable === false) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { OrientationAxis, ViewportType, VOILUTFunctionType } from '../../../enums';
|
|
2
|
-
import type { ActorEntry, ICamera, IImage, IStackInput, OrientationVectors, Point2, Point3, ReferenceCompatibleOptions, VOIRange, ViewReference, ViewReferenceSpecifier } from '../../../types';
|
|
2
|
+
import type { ActorEntry, ICamera, IImage, IStackInput, ImageActor, OrientationVectors, Point2, Point3, ReferenceCompatibleOptions, VOIRange, ViewReference, ViewReferenceSpecifier, ViewportContentMode } from '../../../types';
|
|
3
3
|
import type { PlaneRestriction } from '../../../types/IViewport';
|
|
4
4
|
import type ViewportInputOptions from '../../../types/ViewportInputOptions';
|
|
5
5
|
import GenericViewport from '../GenericViewport';
|
|
@@ -33,6 +33,7 @@ declare class PlanarViewport extends GenericViewport<PlanarViewState, PlanarData
|
|
|
33
33
|
private renderImageObjectDataId?;
|
|
34
34
|
private resolvedViewCache?;
|
|
35
35
|
private resolvedViewCacheRevision;
|
|
36
|
+
private cachedCanvasDimensions?;
|
|
36
37
|
private setDataRequestId;
|
|
37
38
|
static get useCustomRenderingPipeline(): boolean;
|
|
38
39
|
constructor(args: PlanarViewportInput);
|
|
@@ -45,6 +46,8 @@ declare class PlanarViewport extends GenericViewport<PlanarViewState, PlanarData
|
|
|
45
46
|
removeData(dataId: string): void;
|
|
46
47
|
getActors(): ActorEntry[];
|
|
47
48
|
getDefaultActor(): ActorEntry | undefined;
|
|
49
|
+
getImageActor(volumeId?: string): ImageActor | null;
|
|
50
|
+
getDefaultImageData(): any;
|
|
48
51
|
renderImageObject(image: IImage): Promise<void>;
|
|
49
52
|
getCanvas(): HTMLCanvasElement;
|
|
50
53
|
addImages(stackInputs: IStackInput[]): Promise<void>;
|
|
@@ -67,10 +70,14 @@ declare class PlanarViewport extends GenericViewport<PlanarViewState, PlanarData
|
|
|
67
70
|
getImageIds(): string[];
|
|
68
71
|
getVolumeId(viewRefSpecifier?: ViewReferenceSpecifier): string | undefined;
|
|
69
72
|
getSourceDataId(): string | undefined;
|
|
73
|
+
getCurrentMode(): ViewportContentMode;
|
|
74
|
+
protected notifyDataPresentationModified(displaySetId: string, props: Partial<PlanarDataPresentation>): void;
|
|
70
75
|
getDefaultVOIRange(dataId?: string): VOIRange | undefined;
|
|
71
76
|
getCurrentImageIdIndex(): number;
|
|
72
77
|
getCurrentImageId(viewRefSpecifier?: ViewReferenceSpecifier): string | undefined;
|
|
73
78
|
getSliceIndex(): number;
|
|
79
|
+
getNumberOfSlices(): number;
|
|
80
|
+
calibrateSpacing(imageId: string): void;
|
|
74
81
|
protected normalizeViewState(viewState: PlanarViewState): PlanarViewState;
|
|
75
82
|
setViewState(viewStatePatch: Partial<PlanarViewState>): void;
|
|
76
83
|
setDisplaySetPresentation(props: Partial<PlanarDataPresentation>): void;
|
|
@@ -112,8 +119,10 @@ declare class PlanarViewport extends GenericViewport<PlanarViewState, PlanarData
|
|
|
112
119
|
setImageIdIndex(imageIdIndex: number): Promise<string>;
|
|
113
120
|
scroll(delta: number): Promise<string>;
|
|
114
121
|
setOrientation(orientation: PlanarSetOrientationInput): void;
|
|
122
|
+
canRenderOrientation(orientation: PlanarSetOrientationInput, dataId?: string): boolean;
|
|
115
123
|
resetViewState(options?: PlanarResetViewStateOptions): boolean;
|
|
116
124
|
resetViewStateForResize(): boolean;
|
|
125
|
+
resetDisplaySetPresentation(dataId?: string): void;
|
|
117
126
|
getUseCustomRenderingPipeline(): boolean;
|
|
118
127
|
setRendered(): void;
|
|
119
128
|
resize(): void;
|
|
@@ -154,6 +163,9 @@ declare class PlanarViewport extends GenericViewport<PlanarViewState, PlanarData
|
|
|
154
163
|
private getVolumeSliceWorldPointForImageIdIndex;
|
|
155
164
|
private getPlanarData;
|
|
156
165
|
protected getCurrentBinding(): import("./PlanarMountedData").PlanarDataBinding;
|
|
166
|
+
private removeReplaceableData;
|
|
167
|
+
private resolveNextSourceId;
|
|
168
|
+
private isSegmentationOverlayBinding;
|
|
157
169
|
private getDataSet;
|
|
158
170
|
private loadPlanarData;
|
|
159
171
|
private applyLoadedPlanarViewState;
|
|
@@ -165,10 +177,11 @@ declare class PlanarViewport extends GenericViewport<PlanarViewState, PlanarData
|
|
|
165
177
|
private resolveOverlayReference;
|
|
166
178
|
private resolveOverlayDataId;
|
|
167
179
|
protected findBindingDataIdByActorEntryUID(actorEntryUID: string): string | undefined;
|
|
168
|
-
|
|
180
|
+
findDataIdByVolumeId(volumeId: string): string | undefined;
|
|
169
181
|
protected getCurrentPlanarRendering(): PlanarRendering | undefined;
|
|
170
182
|
private resolveViewState;
|
|
171
183
|
private getProjectionSnapshot;
|
|
184
|
+
private getCachedPlanarCanvasDimensions;
|
|
172
185
|
private resolveCachedViewState;
|
|
173
186
|
private clearResolvedViewCache;
|
|
174
187
|
private resolveFrameOfReferenceUID;
|