@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.
Files changed (50) hide show
  1. package/dist/esm/RenderingEngine/ContextPoolRenderingEngine.d.ts +1 -0
  2. package/dist/esm/RenderingEngine/ContextPoolRenderingEngine.js +16 -6
  3. package/dist/esm/RenderingEngine/GenericViewport/GenericViewport.d.ts +6 -1
  4. package/dist/esm/RenderingEngine/GenericViewport/GenericViewport.js +20 -0
  5. package/dist/esm/RenderingEngine/GenericViewport/Planar/CpuImageSliceRenderPath.js +12 -3
  6. package/dist/esm/RenderingEngine/GenericViewport/Planar/CpuVolumeSliceRenderPath.js +3 -1
  7. package/dist/esm/RenderingEngine/GenericViewport/Planar/DefaultPlanarDataProvider.js +5 -2
  8. package/dist/esm/RenderingEngine/GenericViewport/Planar/PlanarRenderPathDecisionService.d.ts +1 -0
  9. package/dist/esm/RenderingEngine/GenericViewport/Planar/PlanarRenderPathDecisionService.js +26 -9
  10. package/dist/esm/RenderingEngine/GenericViewport/Planar/PlanarViewport.d.ts +15 -2
  11. package/dist/esm/RenderingEngine/GenericViewport/Planar/PlanarViewport.js +174 -10
  12. package/dist/esm/RenderingEngine/GenericViewport/Planar/PlanarViewportTypes.d.ts +4 -2
  13. package/dist/esm/RenderingEngine/GenericViewport/Planar/VtkImageMapperRenderPath.js +42 -9
  14. package/dist/esm/RenderingEngine/GenericViewport/Planar/VtkVolumeSliceRenderPath.js +3 -1
  15. package/dist/esm/RenderingEngine/GenericViewport/Planar/planarImageEvents.d.ts +1 -0
  16. package/dist/esm/RenderingEngine/GenericViewport/Planar/planarImageEvents.js +11 -2
  17. package/dist/esm/RenderingEngine/GenericViewport/Planar/planarVolumePresentation.js +30 -3
  18. package/dist/esm/RenderingEngine/GenericViewport/Video/VideoViewport.d.ts +1 -0
  19. package/dist/esm/RenderingEngine/GenericViewport/Video/VideoViewport.js +3 -0
  20. package/dist/esm/RenderingEngine/GenericViewport/Volume3D/viewport3D.d.ts +5 -1
  21. package/dist/esm/RenderingEngine/GenericViewport/Volume3D/viewport3D.js +15 -1
  22. package/dist/esm/RenderingEngine/GenericViewport/genericViewportReferenceCompatibility.js +26 -4
  23. package/dist/esm/RenderingEngine/helpers/planarImageRendering.d.ts +5 -1
  24. package/dist/esm/RenderingEngine/helpers/planarImageRendering.js +19 -5
  25. package/dist/esm/RenderingEngine/helpers/stats/RenderModesPanel.d.ts +4 -0
  26. package/dist/esm/RenderingEngine/helpers/stats/RenderModesPanel.js +48 -1
  27. package/dist/esm/RenderingEngine/helpers/stats/StatsOverlay.js +66 -9
  28. package/dist/esm/init.js +1 -1
  29. package/dist/esm/types/IGenericViewport.d.ts +24 -0
  30. package/dist/esm/types/IGenericViewport.js +0 -0
  31. package/dist/esm/types/ScalingDescriptor.d.ts +5 -0
  32. package/dist/esm/types/ScalingDescriptor.js +0 -0
  33. package/dist/esm/types/index.d.ts +4 -1
  34. package/dist/esm/utilities/VoxelManager.d.ts +2 -0
  35. package/dist/esm/utilities/VoxelManager.js +12 -1
  36. package/dist/esm/utilities/getScalingDescriptor.d.ts +10 -0
  37. package/dist/esm/utilities/getScalingDescriptor.js +41 -0
  38. package/dist/esm/utilities/getTargetVolumeAndSpacingInNormalDir.js +4 -5
  39. package/dist/esm/utilities/getViewportModality.js +5 -14
  40. package/dist/esm/utilities/index.d.ts +4 -2
  41. package/dist/esm/utilities/index.js +5 -2
  42. package/dist/esm/utilities/isPTPrescaledWithSUV.d.ts +1 -1
  43. package/dist/esm/utilities/isPTPrescaledWithSUV.js +1 -1
  44. package/dist/esm/utilities/resolveGenericViewportVolumeId.d.ts +2 -0
  45. package/dist/esm/utilities/resolveGenericViewportVolumeId.js +12 -0
  46. package/dist/esm/utilities/viewportCapabilities.d.ts +10 -1
  47. package/dist/esm/utilities/viewportCapabilities.js +22 -0
  48. package/dist/esm/version.d.ts +1 -1
  49. package/dist/esm/version.js +1 -1
  50. package/package.json +6 -6
@@ -2,7 +2,7 @@ import vtkImageData from '@kitware/vtk.js/Common/DataModel/ImageData';
2
2
  import type vtkImageSlice from '@kitware/vtk.js/Rendering/Core/ImageSlice';
3
3
  import vtkColorTransferFunction from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction';
4
4
  import type vtkRenderer from '@kitware/vtk.js/Rendering/Core/Renderer';
5
- import { InterpolationType } from '../../enums';
5
+ import { InterpolationType, VOILUTFunctionType } from '../../enums';
6
6
  import type { ColormapPublic, IImage, Point3, VOIRange } from '../../types';
7
7
  export interface PlanarCameraState {
8
8
  focalPoint: Point3;
@@ -17,6 +17,7 @@ export interface PlanarImagePresentation {
17
17
  interpolationType?: InterpolationType;
18
18
  colormap?: ColormapPublic;
19
19
  voiRange?: VOIRange;
20
+ voiLUTFunction?: VOILUTFunctionType;
20
21
  invert?: boolean;
21
22
  }
22
23
  export interface PlanarImageViewState {
@@ -32,17 +33,20 @@ export declare function createEmptyVTKImageData(args: {
32
33
  spacing: Point3;
33
34
  }): vtkImageData;
34
35
  export declare function createVTKImageDataFromImage(image: IImage): vtkImageData;
36
+ export declare function updateVTKImageDataGeometryFromImage(imageData: vtkImageData, image: IImage): void;
35
37
  export declare function getDefaultImageVOIRange(image: IImage): VOIRange | undefined;
36
38
  export declare function getPlanarCameraState(renderer: vtkRenderer): PlanarCameraState;
37
39
  export declare function applyPlanarImagePresentation(args: {
38
40
  actor: vtkImageSlice;
39
41
  defaultVOIRange?: VOIRange;
42
+ defaultVOILUTFunction?: VOILUTFunctionType;
40
43
  props?: PlanarImagePresentation;
41
44
  }): void;
42
45
  export declare function createPlanarRGBTransferFunction(args: {
43
46
  colormap?: ColormapPublic;
44
47
  invert?: boolean;
45
48
  voiRange: VOIRange;
49
+ voiLUTFunction?: VOILUTFunctionType;
46
50
  }): vtkColorTransferFunction;
47
51
  export declare function applyPlanarCameraViewState(args: {
48
52
  initialCamera: PlanarCameraState;
@@ -1,9 +1,11 @@
1
1
  import vtkDataArray from '@kitware/vtk.js/Common/Core/DataArray';
2
2
  import vtkImageData from '@kitware/vtk.js/Common/DataModel/ImageData';
3
3
  import vtkColorTransferFunction from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction';
4
- import { InterpolationType } from '../../enums';
4
+ import { InterpolationType, VOILUTFunctionType } from '../../enums';
5
5
  import createLinearRGBTransferFunction from '../../utilities/createLinearRGBTransferFunction';
6
+ import createSigmoidRGBTransferFunction from '../../utilities/createSigmoidRGBTransferFunction';
6
7
  import getVOIRangeFromWindowLevel from '../../utilities/getVOIRangeFromWindowLevel';
8
+ import isPTPrescaledWithSUV from '../../utilities/isPTPrescaledWithSUV';
7
9
  import { getImageDataMetadata } from '../../utilities/getImageDataMetadata';
8
10
  import invertRgbTransferFunction from '../../utilities/invertRgbTransferFunction';
9
11
  import { resolveColormap } from '../../utilities/colormap';
@@ -32,7 +34,7 @@ export function createEmptyVTKImageData(args) {
32
34
  }
33
35
  export function createVTKImageDataFromImage(image) {
34
36
  const { dimensions, direction, numberOfComponents, origin, spacing } = getImageDataMetadata(image);
35
- const pixelArray = image.voxelManager.getScalarData();
37
+ const pixelArray = image.voxelManager.getScalarData().slice();
36
38
  const imageData = createEmptyVTKImageData({
37
39
  dimensions,
38
40
  direction: Array.from(direction),
@@ -44,7 +46,16 @@ export function createVTKImageDataFromImage(image) {
44
46
  updateVTKImageDataWithCornerstoneImage(imageData, image);
45
47
  return imageData;
46
48
  }
49
+ export function updateVTKImageDataGeometryFromImage(imageData, image) {
50
+ const { direction, origin, spacing } = getImageDataMetadata(image);
51
+ imageData.setOrigin(origin);
52
+ imageData.setDirection(new Float32Array(Array.from(direction)));
53
+ imageData.setSpacing(spacing);
54
+ }
47
55
  export function getDefaultImageVOIRange(image) {
56
+ if (isPTPrescaledWithSUV(image)) {
57
+ return { lower: 0, upper: 5 };
58
+ }
48
59
  return getVOIRangeFromWindowLevel(image.windowWidth, image.windowCenter, image.voiLUTFunction);
49
60
  }
50
61
  export function getPlanarCameraState(renderer) {
@@ -58,7 +69,7 @@ export function getPlanarCameraState(renderer) {
58
69
  };
59
70
  }
60
71
  export function applyPlanarImagePresentation(args) {
61
- const { actor, defaultVOIRange, props } = args;
72
+ const { actor, defaultVOIRange, defaultVOILUTFunction, props } = args;
62
73
  const property = actor.getProperty();
63
74
  const voiRange = props?.voiRange ?? defaultVOIRange;
64
75
  if (props?.visible !== undefined) {
@@ -77,15 +88,18 @@ export function applyPlanarImagePresentation(args) {
77
88
  colormap: props?.colormap,
78
89
  invert: props?.invert,
79
90
  voiRange,
91
+ voiLUTFunction: props?.voiLUTFunction ?? defaultVOILUTFunction,
80
92
  });
81
93
  property.setUseLookupTableScalarRange(true);
82
94
  property.setRGBTransferFunction(0, transferFunction);
83
95
  }
84
96
  export function createPlanarRGBTransferFunction(args) {
85
- const { colormap, invert, voiRange } = args;
97
+ const { colormap, invert, voiRange, voiLUTFunction } = args;
86
98
  const transferFunction = colormap?.name !== undefined
87
99
  ? createColormapTransferFunction(colormap, voiRange)
88
- : createLinearRGBTransferFunction(voiRange);
100
+ : voiLUTFunction === VOILUTFunctionType.SAMPLED_SIGMOID
101
+ ? createSigmoidRGBTransferFunction(voiRange)
102
+ : createLinearRGBTransferFunction(voiRange);
89
103
  if (invert) {
90
104
  invertRgbTransferFunction(transferFunction);
91
105
  }
@@ -7,6 +7,7 @@ export declare class RenderModesPanel implements Panel {
7
7
  setContent(entries: Array<{
8
8
  renderingEngineId: string;
9
9
  viewportId: string;
10
+ viewportType: string;
10
11
  bindings: RenderModePanelBinding[];
11
12
  }>): void;
12
13
  }
@@ -16,4 +17,7 @@ export type RenderModePanelBinding = {
16
17
  referencedId?: string;
17
18
  renderMode: string;
18
19
  role: 'source' | 'overlay' | 'data';
20
+ scalarType?: string;
21
+ scalarRange?: [number, number];
22
+ numberOfComponents?: number;
19
23
  };
@@ -61,11 +61,19 @@ export class RenderModesPanel {
61
61
  heading.title = viewportId;
62
62
  heading.style.cssText = `
63
63
  display:flex;
64
+ align-items:center;
64
65
  justify-content:space-between;
65
66
  gap:8px;
66
67
  margin-bottom:6px;
67
68
  color:#ffd84d;
68
69
  font-weight:700;
70
+ `;
71
+ const left = document.createElement('div');
72
+ left.style.cssText = `
73
+ display:flex;
74
+ align-items:center;
75
+ gap:6px;
76
+ min-width:0;
69
77
  `;
70
78
  const name = document.createElement('span');
71
79
  name.textContent = truncate(viewportId, 72);
@@ -75,7 +83,25 @@ export class RenderModesPanel {
75
83
  text-overflow:ellipsis;
76
84
  white-space:nowrap;
77
85
  `;
78
- heading.appendChild(name);
86
+ left.appendChild(name);
87
+ if (entry.viewportType) {
88
+ const type = document.createElement('span');
89
+ type.textContent = entry.viewportType;
90
+ type.title = entry.viewportType;
91
+ type.style.cssText = `
92
+ flex:0 0 auto;
93
+ padding:2px 6px;
94
+ background:rgba(255, 204, 0, 0.14);
95
+ border:1px solid rgba(255, 204, 0, 0.4);
96
+ border-radius:3px;
97
+ color:#ffe08a;
98
+ font-size:${PANEL_CONFIG.FONT_SIZE}px;
99
+ font-weight:700;
100
+ letter-spacing:0.03em;
101
+ `;
102
+ left.appendChild(type);
103
+ }
104
+ heading.appendChild(left);
79
105
  const count = document.createElement('span');
80
106
  count.textContent = `${bindings.length} binding${bindings.length === 1 ? '' : 's'}`;
81
107
  count.style.cssText = `
@@ -184,9 +210,30 @@ function createBindingRow(binding) {
184
210
  binding.referencedId !== binding.actorUID) {
185
211
  appendField(fields, 'ref', binding.referencedId, 76);
186
212
  }
213
+ if (binding.scalarType) {
214
+ appendField(fields, 'type', formatScalarType(binding.scalarType, binding.numberOfComponents), 40);
215
+ }
216
+ if (binding.scalarRange) {
217
+ appendField(fields, 'range', formatScalarRange(binding.scalarRange), 56);
218
+ }
187
219
  row.appendChild(fields);
188
220
  return row;
189
221
  }
222
+ function formatScalarType(scalarType, numberOfComponents) {
223
+ const friendly = scalarType.replace(/Array$/, '');
224
+ return numberOfComponents && numberOfComponents > 1
225
+ ? `${friendly} x${numberOfComponents}`
226
+ : friendly;
227
+ }
228
+ function formatScalarRange([min, max]) {
229
+ return `${formatScalarValue(min)} .. ${formatScalarValue(max)}`;
230
+ }
231
+ function formatScalarValue(value) {
232
+ if (Number.isInteger(value)) {
233
+ return String(value);
234
+ }
235
+ return Number(value.toFixed(2)).toString();
236
+ }
190
237
  function appendField(parent, label, value, maxLength) {
191
238
  const field = document.createElement('div');
192
239
  field.style.cssText = `
@@ -161,6 +161,7 @@ export class StatsOverlay {
161
161
  entries.push({
162
162
  renderingEngineId: renderingEngine.id,
163
163
  viewportId: viewport.id,
164
+ viewportType: viewport.type,
164
165
  bindings: this.getViewportBindingDebugEntries(debugViewport, renderModes ?? {}),
165
166
  });
166
167
  }
@@ -170,17 +171,32 @@ export class StatsOverlay {
170
171
  getViewportBindingDebugEntries(viewport, renderModes) {
171
172
  const actors = viewport.getActors?.() ?? [];
172
173
  const sourceDataId = viewport.getSourceDataId?.();
173
- return Object.entries(renderModes).map(([dataId, renderMode]) => {
174
- const role = resolveBindingRole(viewport, dataId, sourceDataId);
175
- const actor = role === 'source'
176
- ? viewport.getDefaultActor?.()
177
- : findActorForDataId(actors, dataId);
174
+ const renderModeEntries = Object.entries(renderModes);
175
+ if (renderModeEntries.length) {
176
+ return renderModeEntries.map(([dataId, renderMode]) => {
177
+ const role = resolveBindingRole(viewport, dataId, sourceDataId);
178
+ const actor = role === 'source'
179
+ ? viewport.getDefaultActor?.()
180
+ : findActorForDataId(actors, dataId);
181
+ return {
182
+ actorUID: actor?.uid,
183
+ dataId,
184
+ referencedId: actor?.referencedId,
185
+ renderMode,
186
+ role,
187
+ ...getActorScalarInfo(actor),
188
+ };
189
+ });
190
+ }
191
+ return actors.map((actor) => {
192
+ const dataId = actor.representationUID ?? actor.uid ?? '';
178
193
  return {
179
- actorUID: actor?.uid,
194
+ actorUID: actor.uid,
180
195
  dataId,
181
- referencedId: actor?.referencedId,
182
- renderMode,
183
- role,
196
+ referencedId: actor.referencedId,
197
+ renderMode: '-',
198
+ role: resolveBindingRole(viewport, dataId, sourceDataId),
199
+ ...getActorScalarInfo(actor),
184
200
  };
185
201
  });
186
202
  }
@@ -309,3 +325,44 @@ function findActorForDataId(actors, dataId) {
309
325
  actor.representationUID === dataId ||
310
326
  actor.referencedId === dataId);
311
327
  }
328
+ function getActorScalarInfo(entry) {
329
+ const inputData = entry?.actor?.getMapper?.()?.getInputData?.();
330
+ if (!inputData) {
331
+ return {};
332
+ }
333
+ try {
334
+ const scalars = inputData.getPointData?.()?.getScalars?.();
335
+ if (scalars?.getDataType) {
336
+ const numberOfComponents = scalars.getNumberOfComponents?.() ?? 1;
337
+ const range = numberOfComponents > 1 ? scalars.getRange?.(0) : scalars.getRange?.();
338
+ return {
339
+ scalarType: scalars.getDataType(),
340
+ scalarRange: normalizeRange(range),
341
+ numberOfComponents,
342
+ };
343
+ }
344
+ const scalarData = inputData.getScalarData?.();
345
+ if (scalarData?.constructor?.name) {
346
+ const range = Number.isFinite(inputData.minPixelValue) &&
347
+ Number.isFinite(inputData.maxPixelValue)
348
+ ? [inputData.minPixelValue, inputData.maxPixelValue]
349
+ : undefined;
350
+ return {
351
+ scalarType: scalarData.constructor.name,
352
+ scalarRange: normalizeRange(range),
353
+ };
354
+ }
355
+ }
356
+ catch {
357
+ }
358
+ return {};
359
+ }
360
+ function normalizeRange(range) {
361
+ if (!range ||
362
+ range.length < 2 ||
363
+ !Number.isFinite(range[0]) ||
364
+ !Number.isFinite(range[1])) {
365
+ return undefined;
366
+ }
367
+ return [range[0], range[1]];
368
+ }
package/dist/esm/init.js CHANGED
@@ -17,7 +17,7 @@ const defaultConfig = {
17
17
  planar: {
18
18
  cpuThresholds: {
19
19
  image: 64 * 1024 * 1024,
20
- volume: 64 * 1024 * 1024,
20
+ volume: Infinity,
21
21
  },
22
22
  cpuVolume: {
23
23
  useViewportSamplingForLinear: true,
@@ -0,0 +1,24 @@
1
+ import type { IViewport, ViewReference } from './IViewport';
2
+ import type ICamera from './ICamera';
3
+ import type ResolvedViewportView from '../RenderingEngine/GenericViewport/ResolvedViewportView';
4
+ export type ViewportContentMode = 'stack' | 'volume' | 'volume3d' | 'video' | 'wholeSlide' | 'ecg' | 'empty' | 'unknown';
5
+ export interface IGenericViewport extends IViewport {
6
+ setDisplaySets(...entries: Array<{
7
+ displaySetId: string;
8
+ options?: unknown;
9
+ }>): Promise<void>;
10
+ addDisplaySet(displaySetId: string, options: unknown): Promise<void>;
11
+ removeData(displaySetId: string): void;
12
+ setDisplaySetPresentation(props: unknown): void;
13
+ setDisplaySetPresentation(dataId: string, props: unknown): void;
14
+ getDisplaySetPresentation(displaySetId: string): unknown;
15
+ setViewState(viewStatePatch: unknown): void;
16
+ getViewState(): unknown;
17
+ updateViewState(updater: unknown): void;
18
+ resetViewState(options?: unknown): boolean;
19
+ getCurrentMode(): ViewportContentMode;
20
+ setViewReference(viewReference: ViewReference): void;
21
+ getResolvedView(): ResolvedViewportView<unknown, ICamera<unknown>> | undefined;
22
+ getCurrentImageId(): string | undefined;
23
+ }
24
+ export type { IGenericViewport as default };
File without changes
@@ -0,0 +1,5 @@
1
+ interface ScalingDescriptor {
2
+ modality?: string;
3
+ isPreScaled: boolean;
4
+ }
5
+ export type { ScalingDescriptor };
File without changes
@@ -15,6 +15,8 @@ import type IStreamingVolumeProperties from './IStreamingVolumeProperties';
15
15
  import type CustomEventType from './CustomEventType';
16
16
  import type { LocalVolumeOptions } from './../loaders/volumeLoader';
17
17
  import type { IViewport, PublicViewportInput, ViewReferenceSpecifier, DataSetOptions, ReferenceCompatibleOptions, ViewReference, ViewPresentation, ViewPresentationSelector, ViewportInput, RenderingEngineResizeOptions } from './IViewport';
18
+ import type IGenericViewport from './IGenericViewport';
19
+ import type { ViewportContentMode } from './IGenericViewport';
18
20
  import type { VolumeActor, Actor, ActorEntry, ActorMapperProxy, ImageActor, ICanvasActor } from './IActor';
19
21
  import { ActorRenderMode } from './IActor';
20
22
  import type { IImageLoadObject, IVolumeLoadObject, IGeometryLoadObject } from './ILoadObject';
@@ -36,6 +38,7 @@ import type CPUIImageData from './CPUIImageData';
36
38
  import type { CPUImageData } from './CPUIImageData';
37
39
  import type IImage from './IImage';
38
40
  import type { PTScaling, Scaling, ScalingParameters } from './ScalingParameters';
41
+ import type { ScalingDescriptor } from './ScalingDescriptor';
39
42
  import type StackViewportProperties from './StackViewportProperties';
40
43
  import type VolumeViewportProperties from './VolumeViewportProperties';
41
44
  import type IViewportId from './IViewportId';
@@ -112,5 +115,5 @@ import type { ResetCameraOptions } from './ICamera';
112
115
  import type { ViewportType, ViewportTypeConstants, ViewportTypeRegistry } from './ViewportTypeRegistry';
113
116
  export type * from './MetadataModuleTypes';
114
117
  export type * from './InstanceTypes';
115
- export type { Cornerstone3DConfig, IBaseStreamingImageVolume, ICamera, ResetCameraOptions, IStackViewport, IVideoViewport, IECGViewport, IWSIViewport, IVolumeViewport, IEnabledElement, ICache, IVolume, IViewportId, IImageVolume, ImageVolumeProps, IDynamicImageVolume, IRenderingEngine, ScalingParameters, PTScaling, IPointsManager, PolyDataPointConfiguration, Scaling, IStreamingImageVolume, IImage, IImageData, IImageCalibration, CPUIImageData, CPUImageData, EventTypes, ImageLoaderFn, VolumeLoaderFn, IRegisterImageLoader, IStreamingVolumeProperties, IViewport, ViewReference, DataSetOptions as ImageSetOptions, ViewPresentation, ViewPresentationSelector, ReferenceCompatibleOptions, ViewReferenceSpecifier, RenderingEngineResizeOptions, StackViewportProperties, VolumeViewportProperties, ViewportProperties, PublicViewportInput, VolumeActor, Actor, ActorEntry, ActorMapperProxy, ImageActor, ICanvasActor, IImageLoadObject, IVolumeLoadObject, IVolumeInput, VolumeInputCallback, IStackInput, StackInputCallback, ViewportPreset, Metadata, OrientationVectors, AABB2, AABB3, Point2, Point3, PointsXYZ, Point4, Mat3, Plane, ViewportInputOptions, VideoViewportProperties, WSIViewportProperties, VOIRange, VOI, DisplayArea, FlipDirection, ICachedImage, ICachedVolume, CPUFallbackEnabledElement, CPUFallbackViewport, CPUFallbackTransform, CPUFallbackColormapData, CPUFallbackViewportDisplayedArea, CPUFallbackColormapsData, CPUFallbackColormap, TransformMatrix2D, CPUFallbackLookupTable, CPUFallbackLUT, CPUFallbackRenderingTools, CustomEventType, ActorSliceRange, ImageSliceData, IGeometry, IGeometryLoadObject, ICachedGeometry, PublicContourSetData, ContourSetData, ContourData, IContourSet, IContour, PublicSurfaceData, SurfaceData, ISurface, PublicMeshData, MeshData, IMesh, RGB, ColormapPublic, ColormapRegistration, PixelDataTypedArray, PixelDataTypedArrayString, ImagePixelModule, ImagePlaneModule, AffineMatrix, ImageLoadListener, InternalVideoCamera, VideoViewportInput, InternalECGCamera, ECGViewportInput, ECGChannel, ECGWaveformData, ECGViewportProperties, BoundsIJK, BoundsLPS, Color, ColorLUT, VolumeProps, IImageFrame, LocalVolumeOptions, IVoxelManager, IRLEVoxelMap, RLERun, ViewportInput, ImageLoadRequests, IBaseVolumeViewport, GeometryLoaderFn, ScrollOptions, JumpToSliceOptions, Memo, HistoryMemo, VoxelManager, RLEVoxelMap, RenderingEngineModeType, VtkOffscreenMultiRenderWindow, ViewportDataReference, ViewportType, ViewportTypeRegistry, ViewportTypeConstants, };
118
+ export type { Cornerstone3DConfig, IBaseStreamingImageVolume, ICamera, ResetCameraOptions, IStackViewport, IVideoViewport, IECGViewport, IWSIViewport, IVolumeViewport, IEnabledElement, ICache, IVolume, IViewportId, IImageVolume, ImageVolumeProps, IDynamicImageVolume, IRenderingEngine, ScalingParameters, ScalingDescriptor, PTScaling, IPointsManager, PolyDataPointConfiguration, Scaling, IStreamingImageVolume, IImage, IImageData, IImageCalibration, CPUIImageData, CPUImageData, EventTypes, ImageLoaderFn, VolumeLoaderFn, IRegisterImageLoader, IStreamingVolumeProperties, IViewport, IGenericViewport, ViewportContentMode, ViewReference, DataSetOptions as ImageSetOptions, ViewPresentation, ViewPresentationSelector, ReferenceCompatibleOptions, ViewReferenceSpecifier, RenderingEngineResizeOptions, StackViewportProperties, VolumeViewportProperties, ViewportProperties, PublicViewportInput, VolumeActor, Actor, ActorEntry, ActorMapperProxy, ImageActor, ICanvasActor, IImageLoadObject, IVolumeLoadObject, IVolumeInput, VolumeInputCallback, IStackInput, StackInputCallback, ViewportPreset, Metadata, OrientationVectors, AABB2, AABB3, Point2, Point3, PointsXYZ, Point4, Mat3, Plane, ViewportInputOptions, VideoViewportProperties, WSIViewportProperties, VOIRange, VOI, DisplayArea, FlipDirection, ICachedImage, ICachedVolume, CPUFallbackEnabledElement, CPUFallbackViewport, CPUFallbackTransform, CPUFallbackColormapData, CPUFallbackViewportDisplayedArea, CPUFallbackColormapsData, CPUFallbackColormap, TransformMatrix2D, CPUFallbackLookupTable, CPUFallbackLUT, CPUFallbackRenderingTools, CustomEventType, ActorSliceRange, ImageSliceData, IGeometry, IGeometryLoadObject, ICachedGeometry, PublicContourSetData, ContourSetData, ContourData, IContourSet, IContour, PublicSurfaceData, SurfaceData, ISurface, PublicMeshData, MeshData, IMesh, RGB, ColormapPublic, ColormapRegistration, PixelDataTypedArray, PixelDataTypedArrayString, ImagePixelModule, ImagePlaneModule, AffineMatrix, ImageLoadListener, InternalVideoCamera, VideoViewportInput, InternalECGCamera, ECGViewportInput, ECGChannel, ECGWaveformData, ECGViewportProperties, BoundsIJK, BoundsLPS, Color, ColorLUT, VolumeProps, IImageFrame, LocalVolumeOptions, IVoxelManager, IRLEVoxelMap, RLERun, ViewportInput, ImageLoadRequests, IBaseVolumeViewport, GeometryLoaderFn, ScrollOptions, JumpToSliceOptions, Memo, HistoryMemo, VoxelManager, RLEVoxelMap, RenderingEngineModeType, VtkOffscreenMultiRenderWindow, ViewportDataReference, ViewportType, ViewportTypeRegistry, ViewportTypeConstants, };
116
119
  export { ActorRenderMode };
@@ -23,6 +23,7 @@ export default class VoxelManager<T> {
23
23
  invalidateCache?: () => void;
24
24
  getRange: () => [number, number];
25
25
  private scalarData;
26
+ private _scalarDataIsCachedExpansion;
26
27
  private _sliceDataCache;
27
28
  readonly _id: string;
28
29
  points: Set<number>;
@@ -59,6 +60,7 @@ export default class VoxelManager<T> {
59
60
  max: any;
60
61
  };
61
62
  setAtIndex: (index: any, v: any) => boolean;
63
+ private invalidateCachedScalarExpansion;
62
64
  toIJK(index: number): Point3;
63
65
  getMiddleSliceData: () => PixelDataTypedArray;
64
66
  toIndex(ijk: Point3): number;
@@ -20,6 +20,7 @@ export default class VoxelManager {
20
20
  [Infinity, -Infinity],
21
21
  ];
22
22
  this.scalarData = null;
23
+ this._scalarDataIsCachedExpansion = false;
23
24
  this._sliceDataCache = null;
24
25
  this.getAtIJK = (i, j, k) => {
25
26
  return this._get(i + j * this.width + k * this.frameSize);
@@ -30,6 +31,7 @@ export default class VoxelManager {
30
31
  if (changed !== false) {
31
32
  this.modifiedSlices.add(k);
32
33
  VoxelManager.addBounds(this.boundsIJK, [i, j, k]);
34
+ this.invalidateCachedScalarExpansion();
33
35
  }
34
36
  return changed;
35
37
  };
@@ -44,6 +46,7 @@ export default class VoxelManager {
44
46
  const pointIJK = this.toIJK(index);
45
47
  this.modifiedSlices.add(pointIJK[2]);
46
48
  VoxelManager.addBounds(this.boundsIJK, pointIJK);
49
+ this.invalidateCachedScalarExpansion();
47
50
  }
48
51
  return changed;
49
52
  };
@@ -209,6 +212,12 @@ export default class VoxelManager {
209
212
  this.forEach(callback, { boundsIJK: this.getDefaultBounds() });
210
213
  return { min, max };
211
214
  }
215
+ invalidateCachedScalarExpansion() {
216
+ if (this._scalarDataIsCachedExpansion) {
217
+ this.scalarData = null;
218
+ this._scalarDataIsCachedExpansion = false;
219
+ }
220
+ }
212
221
  toIJK(index) {
213
222
  return [
214
223
  index % this.width,
@@ -269,7 +278,8 @@ export default class VoxelManager {
269
278
  if (this._getScalarData) {
270
279
  const scalarData = this._getScalarData();
271
280
  if (storeScalarData) {
272
- console.log('Not transient, should store value', scalarData);
281
+ this.scalarData = scalarData;
282
+ this._scalarDataIsCachedExpansion = true;
273
283
  }
274
284
  return scalarData;
275
285
  }
@@ -277,6 +287,7 @@ export default class VoxelManager {
277
287
  }
278
288
  setScalarData(newScalarData) {
279
289
  this.scalarData = newScalarData;
290
+ this._scalarDataIsCachedExpansion = false;
280
291
  }
281
292
  getScalarDataLength() {
282
293
  if (this.scalarData) {
@@ -0,0 +1,10 @@
1
+ import type { IViewport } from '../types/IViewport';
2
+ import type { ScalingDescriptor } from '../types/ScalingDescriptor';
3
+ type VolumeLike = {
4
+ metadata?: {
5
+ Modality?: string;
6
+ };
7
+ scaling?: object;
8
+ } | undefined;
9
+ declare function _getScalingDescriptor(viewport: IViewport, targetId?: string, getVolume?: (volumeId: string) => VolumeLike): ScalingDescriptor | undefined;
10
+ export { _getScalingDescriptor };
@@ -0,0 +1,41 @@
1
+ import { isGenericViewport } from './viewportCapabilities';
2
+ import { getVolumeId } from './getVolumeId';
3
+ import { resolveGenericViewportVolumeId } from './resolveGenericViewportVolumeId';
4
+ function _getScalingDescriptor(viewport, targetId, getVolume) {
5
+ if (!getVolume) {
6
+ throw new Error('getVolume is required, use the utilities export instead');
7
+ }
8
+ if (isGenericViewport(viewport)) {
9
+ const resolvedVolumeId = resolveGenericViewportVolumeId(viewport, targetId);
10
+ const volume = resolvedVolumeId ? getVolume(resolvedVolumeId) : undefined;
11
+ const imageData = viewport.getImageData?.();
12
+ return {
13
+ modality: volume?.metadata?.Modality ?? imageData?.metadata?.Modality,
14
+ isPreScaled: isScalingPresent(volume?.scaling),
15
+ };
16
+ }
17
+ if (typeof viewport.setVolumes === 'function') {
18
+ const volumeViewport = viewport;
19
+ const volumeId = targetId
20
+ ? getVolumeId(targetId)
21
+ : volumeViewport.getVolumeId();
22
+ const volume = volumeId ? getVolume(volumeId) : undefined;
23
+ return {
24
+ modality: volume?.metadata?.Modality,
25
+ isPreScaled: isScalingPresent(volume?.scaling),
26
+ };
27
+ }
28
+ if (typeof viewport.setStack === 'function') {
29
+ const stackViewport = viewport;
30
+ const { preScale } = stackViewport.getImageData() || {};
31
+ return {
32
+ modality: stackViewport.modality,
33
+ isPreScaled: !!preScale?.scaled,
34
+ };
35
+ }
36
+ return undefined;
37
+ }
38
+ function isScalingPresent(scaling) {
39
+ return !!scaling && Object.keys(scaling).length > 0;
40
+ }
41
+ export { _getScalingDescriptor };
@@ -59,10 +59,9 @@ export default function getTargetVolumeAndSpacingInNormalDir(viewport, camera, t
59
59
  return smallest;
60
60
  }
61
61
  function getSpacingInNormal(imageVolume, viewPlaneNormal, viewport, useSlabThickness = false) {
62
- const { slabThickness } = viewport.getProperties();
63
- let spacingInNormalDirection = slabThickness;
64
- if (!slabThickness || !useSlabThickness) {
65
- spacingInNormalDirection = getSpacingInNormalDirection(imageVolume, viewPlaneNormal);
62
+ const slabThickness = viewport.getProperties?.()?.slabThickness;
63
+ if (slabThickness && useSlabThickness) {
64
+ return slabThickness;
66
65
  }
67
- return spacingInNormalDirection;
66
+ return getSpacingInNormalDirection(imageVolume, viewPlaneNormal);
68
67
  }
@@ -1,18 +1,9 @@
1
+ import { _getScalingDescriptor } from './getScalingDescriptor';
1
2
  function _getViewportModality(viewport, volumeId, getVolume) {
2
- if (!getVolume) {
3
- throw new Error('getVolume is required, use the utilities export instead ');
3
+ const descriptor = _getScalingDescriptor(viewport, volumeId, getVolume);
4
+ if (!descriptor) {
5
+ throw new Error('Invalid viewport type');
4
6
  }
5
- if (viewport.modality) {
6
- return viewport.modality;
7
- }
8
- if (viewport.setVolumes) {
9
- volumeId = volumeId ?? viewport.getVolumeId();
10
- if (!volumeId || !getVolume) {
11
- return;
12
- }
13
- const volume = getVolume(volumeId);
14
- return volume.metadata.Modality;
15
- }
16
- throw new Error('Invalid viewport type');
7
+ return descriptor.modality;
17
8
  }
18
9
  export { _getViewportModality };
@@ -87,6 +87,7 @@ import FrameRange from './FrameRange';
87
87
  import fnv1aHash from './fnv1aHash';
88
88
  import { getImageDataMetadata } from './getImageDataMetadata';
89
89
  import { buildMetadata } from './buildMetadata';
90
+ import { resolveGenericViewportVolumeId } from './resolveGenericViewportVolumeId';
90
91
  import getDynamicVolumeInfo from './getDynamicVolumeInfo';
91
92
  import autoLoad from './autoLoad';
92
93
  import scaleArray from './scaleArray';
@@ -106,9 +107,10 @@ export * from './getPixelSpacingInformation';
106
107
  export * from './getPlaneCubeIntersectionDimensions';
107
108
  export * from './rotateToViewCoordinates';
108
109
  import { asArray } from './asArray';
109
- import { viewportSupportsImageSlices, viewportSupportsStackCalibration, viewportSupportsStackCompatibility, viewportSupportsVolumeActors, viewportSupportsVolumeCompatibility, viewportSupportsVolumeId, viewportSupportsVolumeURI } from './viewportCapabilities';
110
+ import { viewportSupportsImageSlices, viewportSupportsStackCalibration, viewportSupportsStackCompatibility, viewportSupportsVolumeActors, viewportSupportsVolumeCompatibility, viewportSupportsVolumeId, viewportSupportsVolumeURI, isGenericViewport, viewportSupportsDisplaySetPresentation, getViewportContentMode, viewportIsInVolumeMode, viewportIsInStackMode } from './viewportCapabilities';
110
111
  import { getNormalizedAspectRatio } from './getNormalizedAspectRatio';
111
112
  export { updatePlaneRestriction } from './updatePlaneRestriction';
112
113
  declare const getViewportModality: (viewport: IViewport, volumeId?: string) => string;
114
+ declare const getScalingDescriptor: (viewport: IViewport, targetId?: string) => import("../types").ScalingDescriptor;
113
115
  export * from './isEqual';
114
- export { FrameRange, eventListener, csUtils as invertRgbTransferFunction, createSigmoidRGBTransferFunction, getVoiFromSigmoidRGBTransferFunction, createLinearRGBTransferFunction, scaleRgbTransferFunction, triggerEvent, imageIdToURI, fnv1aHash, calibratedPixelSpacingMetadataProvider, clamp, uuidv4, getMinMax, clonePoint3, hasOwn, getRuntimeId, getVOIRangeFromWindowLevel, isOpposite, getViewportModality, windowLevel, convertToGrayscale, convertColorArrayToRgbString, getClosestImageId, getSpacingInNormalDirection, getTargetVolumeAndSpacingInNormalDir, getVolumeActorCorners, indexWithinDimensions, getVolumeViewportsContainingSameVolumes, getViewportsWithVolumeId, transformWorldToIndex, transformIndexToWorld, loadImageToCanvas, renderToCanvasCPU, renderToCanvasGPU, worldToImageCoords, imageToWorldCoords, getVolumeSliceRangeInfo, getVolumeViewportScrollInfo, getSliceRange, snapFocalPointToSlice, getImageSliceDataForVolumeViewport, isImageActor, isPTPrescaledWithSUV, actorIsA, getViewportsWithImageURI, getClosestStackImageIndexForPoint, getCurrentVolumeViewportSlice, calculateViewportsSpatialRegistration, spatialRegistrationMetadataProvider, getViewportImageCornersInWorld, hasNaNValues, applyPreset, deepMerge, PointsManager, getScalingParameters, colormap, getImageLegacy, ProgressiveIterator, decimate, imageRetrieveMetadataProvider, genericViewportDisplaySetMetadataProvider, transferFunctionUtils, updateVTKImageDataWithCornerstoneImage, sortImageIdsAndGetSpacing, makeVolumeMetadata, isValidVolume, genericMetadataProvider, isVideoTransferSyntax, HistoryMemo, generateVolumePropsFromImageIds, getBufferConfiguration, VoxelManager, RLEVoxelMap, convertStackToVolumeViewport, convertVolumeToStackViewport, roundNumber, roundToPrecision, getViewportImageIds, getRandomSampleFromArray, getVolumeId, color, hasFloatScalingParameters, getDynamicVolumeInfo, autoLoad, scaleArray, deepClone, splitImageIdsBy4DTags, handleMultiframe4D, generateFrameImageId, pointInShapeCallback, ECGUtilities, VideoUtilities, WSIUtilities, deepEqual, jumpToSlice, scroll, clip, transformWorldToIndexContinuous, createSubVolume, getAcquisitionPlaneOrientation, getVolumeDirectionVectors, getVolumeViewReferenceId, calculateSpacingBetweenImageIds, getImageDataMetadata, buildMetadata, calculateNeighborhoodStats, asArray, viewportSupportsImageSlices, viewportSupportsStackCalibration, viewportSupportsStackCompatibility, viewportSupportsVolumeActors, viewportSupportsVolumeCompatibility, viewportSupportsVolumeId, viewportSupportsVolumeURI, getNormalizedAspectRatio, };
116
+ export { FrameRange, eventListener, csUtils as invertRgbTransferFunction, createSigmoidRGBTransferFunction, getVoiFromSigmoidRGBTransferFunction, createLinearRGBTransferFunction, scaleRgbTransferFunction, triggerEvent, imageIdToURI, fnv1aHash, calibratedPixelSpacingMetadataProvider, clamp, uuidv4, getMinMax, clonePoint3, hasOwn, getRuntimeId, getVOIRangeFromWindowLevel, isOpposite, getViewportModality, getScalingDescriptor, resolveGenericViewportVolumeId, windowLevel, convertToGrayscale, convertColorArrayToRgbString, getClosestImageId, getSpacingInNormalDirection, getTargetVolumeAndSpacingInNormalDir, getVolumeActorCorners, indexWithinDimensions, getVolumeViewportsContainingSameVolumes, getViewportsWithVolumeId, transformWorldToIndex, transformIndexToWorld, loadImageToCanvas, renderToCanvasCPU, renderToCanvasGPU, worldToImageCoords, imageToWorldCoords, getVolumeSliceRangeInfo, getVolumeViewportScrollInfo, getSliceRange, snapFocalPointToSlice, getImageSliceDataForVolumeViewport, isImageActor, isPTPrescaledWithSUV, actorIsA, getViewportsWithImageURI, getClosestStackImageIndexForPoint, getCurrentVolumeViewportSlice, calculateViewportsSpatialRegistration, spatialRegistrationMetadataProvider, getViewportImageCornersInWorld, hasNaNValues, applyPreset, deepMerge, PointsManager, getScalingParameters, colormap, getImageLegacy, ProgressiveIterator, decimate, imageRetrieveMetadataProvider, genericViewportDisplaySetMetadataProvider, transferFunctionUtils, updateVTKImageDataWithCornerstoneImage, sortImageIdsAndGetSpacing, makeVolumeMetadata, isValidVolume, genericMetadataProvider, isVideoTransferSyntax, HistoryMemo, generateVolumePropsFromImageIds, getBufferConfiguration, VoxelManager, RLEVoxelMap, convertStackToVolumeViewport, convertVolumeToStackViewport, roundNumber, roundToPrecision, getViewportImageIds, getRandomSampleFromArray, getVolumeId, color, hasFloatScalingParameters, getDynamicVolumeInfo, autoLoad, scaleArray, deepClone, splitImageIdsBy4DTags, handleMultiframe4D, generateFrameImageId, pointInShapeCallback, ECGUtilities, VideoUtilities, WSIUtilities, deepEqual, jumpToSlice, scroll, clip, transformWorldToIndexContinuous, createSubVolume, getAcquisitionPlaneOrientation, getVolumeDirectionVectors, getVolumeViewReferenceId, calculateSpacingBetweenImageIds, getImageDataMetadata, buildMetadata, calculateNeighborhoodStats, asArray, viewportSupportsImageSlices, viewportSupportsStackCalibration, viewportSupportsStackCompatibility, viewportSupportsVolumeActors, viewportSupportsVolumeCompatibility, viewportSupportsVolumeId, viewportSupportsVolumeURI, isGenericViewport, viewportSupportsDisplaySetPresentation, getViewportContentMode, viewportIsInVolumeMode, viewportIsInStackMode, getNormalizedAspectRatio, };
@@ -87,6 +87,8 @@ import fnv1aHash from './fnv1aHash';
87
87
  import { getImageDataMetadata } from './getImageDataMetadata';
88
88
  import { buildMetadata } from './buildMetadata';
89
89
  import { _getViewportModality } from './getViewportModality';
90
+ import { _getScalingDescriptor } from './getScalingDescriptor';
91
+ import { resolveGenericViewportVolumeId } from './resolveGenericViewportVolumeId';
90
92
  import cache from '../cache/cache';
91
93
  import getDynamicVolumeInfo from './getDynamicVolumeInfo';
92
94
  import autoLoad from './autoLoad';
@@ -107,9 +109,10 @@ export * from './getPixelSpacingInformation';
107
109
  export * from './getPlaneCubeIntersectionDimensions';
108
110
  export * from './rotateToViewCoordinates';
109
111
  import { asArray } from './asArray';
110
- import { viewportSupportsImageSlices, viewportSupportsStackCalibration, viewportSupportsStackCompatibility, viewportSupportsVolumeActors, viewportSupportsVolumeCompatibility, viewportSupportsVolumeId, viewportSupportsVolumeURI, } from './viewportCapabilities';
112
+ import { viewportSupportsImageSlices, viewportSupportsStackCalibration, viewportSupportsStackCompatibility, viewportSupportsVolumeActors, viewportSupportsVolumeCompatibility, viewportSupportsVolumeId, viewportSupportsVolumeURI, isGenericViewport, viewportSupportsDisplaySetPresentation, getViewportContentMode, viewportIsInVolumeMode, viewportIsInStackMode, } from './viewportCapabilities';
111
113
  import { getNormalizedAspectRatio } from './getNormalizedAspectRatio';
112
114
  export { updatePlaneRestriction } from './updatePlaneRestriction';
113
115
  const getViewportModality = (viewport, volumeId) => _getViewportModality(viewport, volumeId, cache.getVolume);
116
+ const getScalingDescriptor = (viewport, targetId) => _getScalingDescriptor(viewport, targetId, cache.getVolume);
114
117
  export * from './isEqual';
115
- export { FrameRange, eventListener, csUtils as invertRgbTransferFunction, createSigmoidRGBTransferFunction, getVoiFromSigmoidRGBTransferFunction, createLinearRGBTransferFunction, scaleRgbTransferFunction, triggerEvent, imageIdToURI, fnv1aHash, calibratedPixelSpacingMetadataProvider, clamp, uuidv4, getMinMax, clonePoint3, hasOwn, getRuntimeId, getVOIRangeFromWindowLevel, isOpposite, getViewportModality, windowLevel, convertToGrayscale, convertColorArrayToRgbString, getClosestImageId, getSpacingInNormalDirection, getTargetVolumeAndSpacingInNormalDir, getVolumeActorCorners, indexWithinDimensions, getVolumeViewportsContainingSameVolumes, getViewportsWithVolumeId, transformWorldToIndex, transformIndexToWorld, loadImageToCanvas, renderToCanvasCPU, renderToCanvasGPU, worldToImageCoords, imageToWorldCoords, getVolumeSliceRangeInfo, getVolumeViewportScrollInfo, getSliceRange, snapFocalPointToSlice, getImageSliceDataForVolumeViewport, isImageActor, isPTPrescaledWithSUV, actorIsA, getViewportsWithImageURI, getClosestStackImageIndexForPoint, getCurrentVolumeViewportSlice, calculateViewportsSpatialRegistration, spatialRegistrationMetadataProvider, getViewportImageCornersInWorld, hasNaNValues, applyPreset, deepMerge, PointsManager, getScalingParameters, colormap, getImageLegacy, ProgressiveIterator, decimate, imageRetrieveMetadataProvider, genericViewportDisplaySetMetadataProvider, transferFunctionUtils, updateVTKImageDataWithCornerstoneImage, sortImageIdsAndGetSpacing, makeVolumeMetadata, isValidVolume, genericMetadataProvider, isVideoTransferSyntax, HistoryMemo, generateVolumePropsFromImageIds, getBufferConfiguration, VoxelManager, RLEVoxelMap, convertStackToVolumeViewport, convertVolumeToStackViewport, roundNumber, roundToPrecision, getViewportImageIds, getRandomSampleFromArray, getVolumeId, color, hasFloatScalingParameters, getDynamicVolumeInfo, autoLoad, scaleArray, deepClone, splitImageIdsBy4DTags, handleMultiframe4D, generateFrameImageId, pointInShapeCallback, ECGUtilities, VideoUtilities, WSIUtilities, deepEqual, jumpToSlice, scroll, clip, transformWorldToIndexContinuous, createSubVolume, getAcquisitionPlaneOrientation, getVolumeDirectionVectors, getVolumeViewReferenceId, calculateSpacingBetweenImageIds, getImageDataMetadata, buildMetadata, calculateNeighborhoodStats, asArray, viewportSupportsImageSlices, viewportSupportsStackCalibration, viewportSupportsStackCompatibility, viewportSupportsVolumeActors, viewportSupportsVolumeCompatibility, viewportSupportsVolumeId, viewportSupportsVolumeURI, getNormalizedAspectRatio, };
118
+ export { FrameRange, eventListener, csUtils as invertRgbTransferFunction, createSigmoidRGBTransferFunction, getVoiFromSigmoidRGBTransferFunction, createLinearRGBTransferFunction, scaleRgbTransferFunction, triggerEvent, imageIdToURI, fnv1aHash, calibratedPixelSpacingMetadataProvider, clamp, uuidv4, getMinMax, clonePoint3, hasOwn, getRuntimeId, getVOIRangeFromWindowLevel, isOpposite, getViewportModality, getScalingDescriptor, resolveGenericViewportVolumeId, windowLevel, convertToGrayscale, convertColorArrayToRgbString, getClosestImageId, getSpacingInNormalDirection, getTargetVolumeAndSpacingInNormalDir, getVolumeActorCorners, indexWithinDimensions, getVolumeViewportsContainingSameVolumes, getViewportsWithVolumeId, transformWorldToIndex, transformIndexToWorld, loadImageToCanvas, renderToCanvasCPU, renderToCanvasGPU, worldToImageCoords, imageToWorldCoords, getVolumeSliceRangeInfo, getVolumeViewportScrollInfo, getSliceRange, snapFocalPointToSlice, getImageSliceDataForVolumeViewport, isImageActor, isPTPrescaledWithSUV, actorIsA, getViewportsWithImageURI, getClosestStackImageIndexForPoint, getCurrentVolumeViewportSlice, calculateViewportsSpatialRegistration, spatialRegistrationMetadataProvider, getViewportImageCornersInWorld, hasNaNValues, applyPreset, deepMerge, PointsManager, getScalingParameters, colormap, getImageLegacy, ProgressiveIterator, decimate, imageRetrieveMetadataProvider, genericViewportDisplaySetMetadataProvider, transferFunctionUtils, updateVTKImageDataWithCornerstoneImage, sortImageIdsAndGetSpacing, makeVolumeMetadata, isValidVolume, genericMetadataProvider, isVideoTransferSyntax, HistoryMemo, generateVolumePropsFromImageIds, getBufferConfiguration, VoxelManager, RLEVoxelMap, convertStackToVolumeViewport, convertVolumeToStackViewport, roundNumber, roundToPrecision, getViewportImageIds, getRandomSampleFromArray, getVolumeId, color, hasFloatScalingParameters, getDynamicVolumeInfo, autoLoad, scaleArray, deepClone, splitImageIdsBy4DTags, handleMultiframe4D, generateFrameImageId, pointInShapeCallback, ECGUtilities, VideoUtilities, WSIUtilities, deepEqual, jumpToSlice, scroll, clip, transformWorldToIndexContinuous, createSubVolume, getAcquisitionPlaneOrientation, getVolumeDirectionVectors, getVolumeViewReferenceId, calculateSpacingBetweenImageIds, getImageDataMetadata, buildMetadata, calculateNeighborhoodStats, asArray, viewportSupportsImageSlices, viewportSupportsStackCalibration, viewportSupportsStackCompatibility, viewportSupportsVolumeActors, viewportSupportsVolumeCompatibility, viewportSupportsVolumeId, viewportSupportsVolumeURI, isGenericViewport, viewportSupportsDisplaySetPresentation, getViewportContentMode, viewportIsInVolumeMode, viewportIsInStackMode, getNormalizedAspectRatio, };
@@ -1,3 +1,3 @@
1
1
  import type { IImage } from '../types';
2
- declare const isPTPrescaledWithSUV: (image: IImage) => number;
2
+ declare const isPTPrescaledWithSUV: (image: IImage) => boolean;
3
3
  export default isPTPrescaledWithSUV;
@@ -1,4 +1,4 @@
1
1
  const isPTPrescaledWithSUV = (image) => {
2
- return image.preScale.scaled && image.preScale.scalingParameters.suvbw;
2
+ return Boolean(image.preScale?.scaled && image.preScale?.scalingParameters?.suvbw);
3
3
  };
4
4
  export default isPTPrescaledWithSUV;
@@ -0,0 +1,2 @@
1
+ import type { IViewport } from '../types/IViewport';
2
+ export declare function resolveGenericViewportVolumeId(viewport: IViewport, targetId?: string): string | undefined;
@@ -0,0 +1,12 @@
1
+ import { getVolumeId } from './getVolumeId';
2
+ export function resolveGenericViewportVolumeId(viewport, targetId) {
3
+ const genericViewport = viewport;
4
+ const actors = genericViewport.getActors?.() ?? [];
5
+ const matchedActor = targetId
6
+ ? (actors.find((actor) => actor.referencedId === targetId) ??
7
+ actors.find((actor) => actor.referencedId?.endsWith(`:${targetId}`)))
8
+ : undefined;
9
+ return (matchedActor?.referencedId ??
10
+ (targetId ? getVolumeId(targetId) : undefined) ??
11
+ genericViewport.getDefaultActor?.()?.referencedId);
12
+ }