@cornerstonejs/core 4.0.0-beta.2 → 4.0.0-beta.4

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 (76) hide show
  1. package/LICENSE +21 -0
  2. package/dist/esm/RenderingEngine/BaseRenderingEngine.d.ts +55 -0
  3. package/dist/esm/RenderingEngine/BaseRenderingEngine.js +355 -0
  4. package/dist/esm/RenderingEngine/BaseVolumeViewport.d.ts +34 -5
  5. package/dist/esm/RenderingEngine/BaseVolumeViewport.js +179 -17
  6. package/dist/esm/RenderingEngine/ContextPoolRenderingEngine.d.ts +28 -0
  7. package/dist/esm/RenderingEngine/ContextPoolRenderingEngine.js +313 -0
  8. package/dist/esm/RenderingEngine/RenderingEngine.d.ts +7 -39
  9. package/dist/esm/RenderingEngine/RenderingEngine.js +42 -613
  10. package/dist/esm/RenderingEngine/StackViewport.d.ts +6 -3
  11. package/dist/esm/RenderingEngine/StackViewport.js +92 -8
  12. package/dist/esm/RenderingEngine/TiledRenderingEngine.d.ts +24 -0
  13. package/dist/esm/RenderingEngine/TiledRenderingEngine.js +287 -0
  14. package/dist/esm/RenderingEngine/VideoViewport.js +1 -1
  15. package/dist/esm/RenderingEngine/Viewport.d.ts +2 -1
  16. package/dist/esm/RenderingEngine/Viewport.js +38 -1
  17. package/dist/esm/RenderingEngine/VolumeViewport3D.d.ts +1 -0
  18. package/dist/esm/RenderingEngine/VolumeViewport3D.js +24 -1
  19. package/dist/esm/RenderingEngine/WSIViewport.js +4 -7
  20. package/dist/esm/RenderingEngine/WebGLContextPool.d.ts +17 -0
  21. package/dist/esm/RenderingEngine/WebGLContextPool.js +45 -0
  22. package/dist/esm/RenderingEngine/helpers/createVolumeMapper.js +3 -1
  23. package/dist/esm/RenderingEngine/helpers/isContextPoolRenderingEngine.d.ts +1 -0
  24. package/dist/esm/RenderingEngine/helpers/isContextPoolRenderingEngine.js +7 -0
  25. package/dist/esm/RenderingEngine/helpers/stats/StatsOverlay.d.ts +28 -0
  26. package/dist/esm/RenderingEngine/helpers/stats/StatsOverlay.js +137 -0
  27. package/dist/esm/RenderingEngine/helpers/stats/StatsPanel.d.ts +24 -0
  28. package/dist/esm/RenderingEngine/helpers/stats/StatsPanel.js +101 -0
  29. package/dist/esm/RenderingEngine/helpers/stats/constants.d.ts +44 -0
  30. package/dist/esm/RenderingEngine/helpers/stats/constants.js +36 -0
  31. package/dist/esm/RenderingEngine/helpers/stats/enums.d.ts +6 -0
  32. package/dist/esm/RenderingEngine/helpers/stats/enums.js +7 -0
  33. package/dist/esm/RenderingEngine/helpers/stats/index.d.ts +2 -0
  34. package/dist/esm/RenderingEngine/helpers/stats/index.js +2 -0
  35. package/dist/esm/RenderingEngine/helpers/stats/types.d.ts +22 -0
  36. package/dist/esm/RenderingEngine/helpers/stats/types.js +0 -0
  37. package/dist/esm/RenderingEngine/index.d.ts +4 -1
  38. package/dist/esm/RenderingEngine/index.js +4 -1
  39. package/dist/esm/cache/cache.js +0 -1
  40. package/dist/esm/cache/classes/BaseStreamingImageVolume.d.ts +2 -0
  41. package/dist/esm/cache/classes/BaseStreamingImageVolume.js +8 -0
  42. package/dist/esm/cache/classes/StreamingDynamicImageVolume.d.ts +1 -0
  43. package/dist/esm/enums/RenderingEngineModeEnum.d.ts +5 -0
  44. package/dist/esm/enums/RenderingEngineModeEnum.js +6 -0
  45. package/dist/esm/enums/index.d.ts +2 -1
  46. package/dist/esm/enums/index.js +2 -1
  47. package/dist/esm/index.d.ts +2 -2
  48. package/dist/esm/index.js +2 -2
  49. package/dist/esm/init.js +12 -0
  50. package/dist/esm/loaders/volumeLoader.js +2 -2
  51. package/dist/esm/types/Cornerstone3DConfig.d.ts +16 -7
  52. package/dist/esm/types/IRenderingEngine.d.ts +1 -1
  53. package/dist/esm/types/IViewport.d.ts +9 -2
  54. package/dist/esm/types/OrientationVectors.d.ts +1 -1
  55. package/dist/esm/types/RenderingEngineMode.d.ts +2 -0
  56. package/dist/esm/types/RenderingEngineMode.js +0 -0
  57. package/dist/esm/types/ViewportProperties.d.ts +1 -0
  58. package/dist/esm/types/VtkOffscreenMultiRenderWindow.d.ts +37 -0
  59. package/dist/esm/types/VtkOffscreenMultiRenderWindow.js +5 -0
  60. package/dist/esm/types/index.d.ts +3 -1
  61. package/dist/esm/utilities/asArray.d.ts +1 -0
  62. package/dist/esm/utilities/asArray.js +6 -0
  63. package/dist/esm/utilities/colormap.js +4 -2
  64. package/dist/esm/utilities/getPixelSpacingInformation.js +4 -1
  65. package/dist/esm/utilities/historyMemo/index.d.ts +10 -1
  66. package/dist/esm/utilities/historyMemo/index.js +62 -20
  67. package/dist/esm/utilities/index.d.ts +3 -1
  68. package/dist/esm/utilities/index.js +3 -1
  69. package/dist/esm/utilities/isEqual.d.ts +5 -5
  70. package/dist/esm/utilities/isEqual.js +5 -5
  71. package/dist/esm/utilities/renderToCanvasGPU.js +2 -2
  72. package/dist/esm/utilities/updatePlaneRestriction.d.ts +2 -0
  73. package/dist/esm/utilities/updatePlaneRestriction.js +41 -0
  74. package/dist/esm/version.d.ts +1 -1
  75. package/dist/esm/version.js +1 -1
  76. package/package.json +4 -3
@@ -16,4 +16,5 @@ import * as VideoEnums from './VideoEnums';
16
16
  import MetadataModules from './MetadataModules';
17
17
  import { GenerateImageType } from './GenerateImageType';
18
18
  import VoxelManagerEnum from './VoxelManagerEnum';
19
- export { Events, BlendModes, CalibrationTypes, InterpolationType, RequestType, ViewportType, OrientationAxis, GeometryType, ContourType, MeshType, VOILUTFunctionType, DynamicOperatorType, ViewportStatus, VideoEnums, MetadataModules, ImageQualityStatus, VoxelManagerEnum, GenerateImageType, };
19
+ import RenderingEngineModeEnum from './RenderingEngineModeEnum';
20
+ export { Events, BlendModes, CalibrationTypes, InterpolationType, RequestType, ViewportType, OrientationAxis, GeometryType, ContourType, MeshType, VOILUTFunctionType, DynamicOperatorType, ViewportStatus, VideoEnums, MetadataModules, ImageQualityStatus, VoxelManagerEnum, GenerateImageType, RenderingEngineModeEnum, };
@@ -1,7 +1,7 @@
1
1
  import * as Enums from './enums';
2
2
  import * as CONSTANTS from './constants';
3
3
  import { Events } from './enums';
4
- import RenderingEngine from './RenderingEngine';
4
+ import RenderingEngine, { BaseRenderingEngine, TiledRenderingEngine, ContextPoolRenderingEngine } from './RenderingEngine';
5
5
  import createVolumeActor from './RenderingEngine/helpers/createVolumeActor';
6
6
  import createVolumeMapper, { convertMapperToNotSharedMapper } from './RenderingEngine/helpers/createVolumeMapper';
7
7
  export * from './RenderingEngine/helpers/getOrCreateCanvas';
@@ -37,4 +37,4 @@ import { cornerstoneStreamingDynamicImageVolumeLoader } from './loaders/cornerst
37
37
  import { cornerstoneMeshLoader } from './loaders/cornerstoneMeshLoader';
38
38
  import { setVolumesForViewports, addVolumesToViewports, addImageSlicesToViewports } from './RenderingEngine/helpers';
39
39
  export type { Types, IRetrieveConfiguration, RetrieveOptions, RetrieveStage, ImageLoadListener, IImagesLoader, };
40
- export { init, isCornerstoneInitialized, peerImport, resetInitialization, getConfiguration, setConfiguration, getWebWorkerManager, canRenderFloatTextures, Enums, CONSTANTS, Events as EVENTS, Settings, BaseVolumeViewport, VolumeViewport, VolumeViewport3D, Viewport, StackViewport, VideoViewport, WSIViewport, RenderingEngine, ImageVolume, Surface, getRenderingEngine, getRenderingEngines, getEnabledElement, getEnabledElementByIds, getEnabledElements, getEnabledElementByViewportId, createVolumeActor, createVolumeMapper, cache, eventTarget, triggerEvent, imageLoader, registerImageLoader, volumeLoader, metaData, utilities, setVolumesForViewports, addVolumesToViewports, addImageSlicesToViewports, imageLoadPoolManager as requestPoolManager, imageRetrievalPoolManager, imageLoadPoolManager, getShouldUseCPURendering, setUseCPURendering, setPreferSizeOverAccuracy, resetUseCPURendering, geometryLoader, cornerstoneMeshLoader, ProgressiveRetrieveImages, cornerstoneStreamingImageVolumeLoader, cornerstoneStreamingDynamicImageVolumeLoader, StreamingDynamicImageVolume, StreamingImageVolume, convertMapperToNotSharedMapper, version, };
40
+ export { init, isCornerstoneInitialized, peerImport, resetInitialization, getConfiguration, setConfiguration, getWebWorkerManager, canRenderFloatTextures, Enums, CONSTANTS, Events as EVENTS, Settings, BaseVolumeViewport, VolumeViewport, VolumeViewport3D, Viewport, StackViewport, VideoViewport, WSIViewport, RenderingEngine, BaseRenderingEngine, TiledRenderingEngine, ContextPoolRenderingEngine, ImageVolume, Surface, getRenderingEngine, getRenderingEngines, getEnabledElement, getEnabledElementByIds, getEnabledElements, getEnabledElementByViewportId, createVolumeActor, createVolumeMapper, cache, eventTarget, triggerEvent, imageLoader, registerImageLoader, volumeLoader, metaData, utilities, setVolumesForViewports, addVolumesToViewports, addImageSlicesToViewports, imageLoadPoolManager as requestPoolManager, imageRetrievalPoolManager, imageLoadPoolManager, getShouldUseCPURendering, setUseCPURendering, setPreferSizeOverAccuracy, resetUseCPURendering, geometryLoader, cornerstoneMeshLoader, ProgressiveRetrieveImages, cornerstoneStreamingImageVolumeLoader, cornerstoneStreamingDynamicImageVolumeLoader, StreamingDynamicImageVolume, StreamingImageVolume, convertMapperToNotSharedMapper, version, };
package/dist/esm/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import * as Enums from './enums';
2
2
  import * as CONSTANTS from './constants';
3
3
  import { Events } from './enums';
4
- import RenderingEngine from './RenderingEngine';
4
+ import RenderingEngine, { BaseRenderingEngine, TiledRenderingEngine, ContextPoolRenderingEngine, } from './RenderingEngine';
5
5
  import createVolumeActor from './RenderingEngine/helpers/createVolumeActor';
6
6
  import createVolumeMapper, { convertMapperToNotSharedMapper, } from './RenderingEngine/helpers/createVolumeMapper';
7
7
  export * from './RenderingEngine/helpers/getOrCreateCanvas';
@@ -34,4 +34,4 @@ import { cornerstoneStreamingImageVolumeLoader } from './loaders/cornerstoneStre
34
34
  import { cornerstoneStreamingDynamicImageVolumeLoader } from './loaders/cornerstoneStreamingDynamicImageVolumeLoader';
35
35
  import { cornerstoneMeshLoader } from './loaders/cornerstoneMeshLoader';
36
36
  import { setVolumesForViewports, addVolumesToViewports, addImageSlicesToViewports, } from './RenderingEngine/helpers';
37
- export { init, isCornerstoneInitialized, peerImport, resetInitialization, getConfiguration, setConfiguration, getWebWorkerManager, canRenderFloatTextures, Enums, CONSTANTS, Events as EVENTS, Settings, BaseVolumeViewport, VolumeViewport, VolumeViewport3D, Viewport, StackViewport, VideoViewport, WSIViewport, RenderingEngine, ImageVolume, Surface, getRenderingEngine, getRenderingEngines, getEnabledElement, getEnabledElementByIds, getEnabledElements, getEnabledElementByViewportId, createVolumeActor, createVolumeMapper, cache, eventTarget, triggerEvent, imageLoader, registerImageLoader, volumeLoader, metaData, utilities, setVolumesForViewports, addVolumesToViewports, addImageSlicesToViewports, imageLoadPoolManager as requestPoolManager, imageRetrievalPoolManager, imageLoadPoolManager, getShouldUseCPURendering, setUseCPURendering, setPreferSizeOverAccuracy, resetUseCPURendering, geometryLoader, cornerstoneMeshLoader, ProgressiveRetrieveImages, cornerstoneStreamingImageVolumeLoader, cornerstoneStreamingDynamicImageVolumeLoader, StreamingDynamicImageVolume, StreamingImageVolume, convertMapperToNotSharedMapper, version, };
37
+ export { init, isCornerstoneInitialized, peerImport, resetInitialization, getConfiguration, setConfiguration, getWebWorkerManager, canRenderFloatTextures, Enums, CONSTANTS, Events as EVENTS, Settings, BaseVolumeViewport, VolumeViewport, VolumeViewport3D, Viewport, StackViewport, VideoViewport, WSIViewport, RenderingEngine, BaseRenderingEngine, TiledRenderingEngine, ContextPoolRenderingEngine, ImageVolume, Surface, getRenderingEngine, getRenderingEngines, getEnabledElement, getEnabledElementByIds, getEnabledElements, getEnabledElementByViewportId, createVolumeActor, createVolumeMapper, cache, eventTarget, triggerEvent, imageLoader, registerImageLoader, volumeLoader, metaData, utilities, setVolumesForViewports, addVolumesToViewports, addImageSlicesToViewports, imageLoadPoolManager as requestPoolManager, imageRetrievalPoolManager, imageLoadPoolManager, getShouldUseCPURendering, setUseCPURendering, setPreferSizeOverAccuracy, resetUseCPURendering, geometryLoader, cornerstoneMeshLoader, ProgressiveRetrieveImages, cornerstoneStreamingImageVolumeLoader, cornerstoneStreamingDynamicImageVolumeLoader, StreamingDynamicImageVolume, StreamingImageVolume, convertMapperToNotSharedMapper, version, };
package/dist/esm/init.js CHANGED
@@ -3,6 +3,7 @@ let csRenderInitialized = false;
3
3
  import deepMerge from './utilities/deepMerge';
4
4
  import CentralizedWebWorkerManager from './webWorkerManager/webWorkerManager';
5
5
  import { getSupportedTextureFormats } from './utilities/textureSupport';
6
+ import { RenderingEngineModeEnum } from './enums';
6
7
  const defaultConfig = {
7
8
  gpuTier: { tier: 2 },
8
9
  isMobile: false,
@@ -10,6 +11,14 @@ const defaultConfig = {
10
11
  useCPURendering: false,
11
12
  preferSizeOverAccuracy: false,
12
13
  strictZSpacingForVolumeViewport: true,
14
+ renderingEngineMode: RenderingEngineModeEnum.ContextPool,
15
+ webGlContextCount: 7,
16
+ volumeRendering: {
17
+ sampleDistanceMultiplier: 1,
18
+ },
19
+ },
20
+ debug: {
21
+ statsOverlay: false,
13
22
  },
14
23
  peerImport: (moduleId) => null,
15
24
  };
@@ -50,6 +59,9 @@ function init(configuration = config) {
50
59
  }
51
60
  canUseNorm16Texture = _hasNorm16TextureSupport();
52
61
  config = deepMerge(defaultConfig, configuration);
62
+ if (config.isMobile) {
63
+ config.rendering.webGlContextCount = 1;
64
+ }
53
65
  if (isIOS()) {
54
66
  if (configuration.rendering?.preferSizeOverAccuracy) {
55
67
  config.rendering.preferSizeOverAccuracy = true;
@@ -72,7 +72,7 @@ export function createAndCacheDerivedVolume(referencedVolumeId, options) {
72
72
  const { metadata, dimensions, spacing, origin, direction } = referencedVolume;
73
73
  const referencedImageIds = referencedVolume.isDynamicVolume()
74
74
  ? referencedVolume.getCurrentDimensionGroupImageIds()
75
- : referencedVolume.imageIds ?? [];
75
+ : (referencedVolume.imageIds ?? []);
76
76
  const derivedImages = createAndCacheDerivedImages(referencedImageIds, {
77
77
  targetBuffer: options.targetBuffer,
78
78
  voxelRepresentation,
@@ -150,7 +150,7 @@ export function createLocalVolume(volumeId, options = {}) {
150
150
  const sliceLength = dimensions[0] * dimensions[1];
151
151
  const dataType = scalarData
152
152
  ? scalarData.constructor.name
153
- : targetBuffer?.type ?? 'Float32Array';
153
+ : (targetBuffer?.type ?? 'Float32Array');
154
154
  const totalNumberOfVoxels = sliceLength * dimensions[2];
155
155
  let byteLength;
156
156
  switch (dataType) {
@@ -1,12 +1,21 @@
1
+ import type { RenderingEngineModeType } from '../types';
1
2
  interface Cornerstone3DConfig {
2
- gpuTier: {
3
- tier: number;
3
+ gpuTier?: {
4
+ tier?: number;
4
5
  };
5
- isMobile: boolean;
6
- rendering: {
7
- preferSizeOverAccuracy: boolean;
8
- useCPURendering: boolean;
9
- strictZSpacingForVolumeViewport: boolean;
6
+ isMobile?: boolean;
7
+ rendering?: {
8
+ preferSizeOverAccuracy?: boolean;
9
+ useCPURendering?: boolean;
10
+ strictZSpacingForVolumeViewport?: boolean;
11
+ renderingEngineMode?: RenderingEngineModeType;
12
+ webGlContextCount?: number;
13
+ volumeRendering?: {
14
+ sampleDistanceMultiplier?: number;
15
+ };
16
+ };
17
+ debug: {
18
+ statsOverlay?: boolean;
10
19
  };
11
20
  peerImport?: (moduleId: string) => Promise<any>;
12
21
  }
@@ -1,3 +1,3 @@
1
- import type RenderingEngine from '../RenderingEngine/RenderingEngine';
1
+ import type { RenderingEngine } from '../RenderingEngine';
2
2
  type IRenderingEngine = RenderingEngine;
3
3
  export type { IRenderingEngine as default };
@@ -24,8 +24,15 @@ export interface ReferenceCompatibleOptions {
24
24
  export type ReferencedImageRange = ViewReference & {
25
25
  referencedImageId: string;
26
26
  };
27
- export type ViewReference = {
27
+ export type PlaneRestriction = {
28
+ FrameOfReferenceUID: string;
29
+ point: Point3;
30
+ inPlaneVector1?: Point3;
31
+ inPlaneVector2?: Point3;
32
+ };
33
+ export interface ViewReference {
28
34
  FrameOfReferenceUID?: string;
35
+ planeRestriction?: PlaneRestriction;
29
36
  referencedImageId?: string;
30
37
  referencedImageURI?: string;
31
38
  multiSliceReference?: ReferencedImageRange;
@@ -35,7 +42,7 @@ export type ViewReference = {
35
42
  sliceIndex?: number;
36
43
  volumeId?: string;
37
44
  bounds?: BoundsLPS;
38
- };
45
+ }
39
46
  export interface ViewPresentation {
40
47
  slabThickness?: number;
41
48
  rotation?: number;
@@ -1,6 +1,6 @@
1
1
  import type { Point3 } from './Point3';
2
2
  interface OrientationVectors {
3
3
  viewPlaneNormal: Point3;
4
- viewUp: Point3;
4
+ viewUp?: Point3;
5
5
  }
6
6
  export type { OrientationVectors as default };
@@ -0,0 +1,2 @@
1
+ type RenderingEngineModeType = 'tiled' | 'contextPool';
2
+ export type { RenderingEngineModeType };
File without changes
@@ -8,4 +8,5 @@ export interface ViewportProperties {
8
8
  colormap?: ColormapPublic;
9
9
  interpolationType?: InterpolationType;
10
10
  preset?: string;
11
+ sampleDistanceMultiplier?: number;
11
12
  }
@@ -0,0 +1,37 @@
1
+ import type { vtkObject } from '@kitware/vtk.js/interfaces';
2
+ import type vtkStreamingOpenGLRenderWindow from '../RenderingEngine/vtkClasses/vtkStreamingOpenGLRenderWindow';
3
+ import type vtkRenderer from '@kitware/vtk.js/Rendering/Core/Renderer';
4
+ import type vtkRenderWindow from '@kitware/vtk.js/Rendering/Core/RenderWindow';
5
+ import type vtkRenderWindowInteractor from '@kitware/vtk.js/Rendering/Core/RenderWindowInteractor';
6
+ import '@kitware/vtk.js/Common/Core/Points';
7
+ import '@kitware/vtk.js/Common/Core/DataArray';
8
+ import '@kitware/vtk.js/Common/DataModel/PolyData';
9
+ import '@kitware/vtk.js/Rendering/Core/Actor';
10
+ import '@kitware/vtk.js/Rendering/Core/Mapper';
11
+ type Viewport = [number, number, number, number];
12
+ interface RendererConfig {
13
+ id: string;
14
+ viewport: Viewport;
15
+ background?: [number, number, number];
16
+ }
17
+ export interface VtkOffscreenMultiRenderWindow extends vtkObject {
18
+ renderWindow: vtkRenderWindow;
19
+ getRenderWindow: () => vtkRenderWindow;
20
+ openGLRenderWindow: ReturnType<typeof vtkStreamingOpenGLRenderWindow.newInstance>;
21
+ getOpenGLRenderWindow: () => ReturnType<typeof vtkStreamingOpenGLRenderWindow.newInstance>;
22
+ interactor: vtkRenderWindowInteractor;
23
+ getInteractor: () => vtkRenderWindowInteractor;
24
+ container: HTMLDivElement | null;
25
+ getContainer: () => HTMLDivElement | null;
26
+ addRenderer: (config: RendererConfig) => void;
27
+ removeRenderer: (id: string) => void;
28
+ getRenderer: (id: string) => vtkRenderer;
29
+ getRenderers: () => Array<{
30
+ id: string;
31
+ renderer: vtkRenderer;
32
+ }>;
33
+ resize: () => void;
34
+ setContainer: (el: HTMLDivElement) => void;
35
+ destroy: () => void;
36
+ }
37
+ export {};
@@ -0,0 +1,5 @@
1
+ import '@kitware/vtk.js/Common/Core/Points';
2
+ import '@kitware/vtk.js/Common/Core/DataArray';
3
+ import '@kitware/vtk.js/Common/DataModel/PolyData';
4
+ import '@kitware/vtk.js/Rendering/Core/Actor';
5
+ import '@kitware/vtk.js/Rendering/Core/Mapper';
@@ -101,4 +101,6 @@ import type { IBaseVolumeViewport } from './IBaseVolumeViewport';
101
101
  import type ScrollOptions from './ScrollOptions';
102
102
  import type JumpToSliceOptions from './JumpToSliceOptions';
103
103
  import type GeometryLoaderFn from './GeometryLoaderFn';
104
- export type { Cornerstone3DConfig, ICamera, IStackViewport, IVideoViewport, 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, StackViewportProperties, VolumeViewportProperties, ViewportProperties, PublicViewportInput, VolumeActor, Actor, ActorEntry, 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, BoundsIJK, BoundsLPS, Color, ColorLUT, VolumeProps, IImageFrame, DicomDateObject, DicomTimeObject, GeneralSeriesModuleMetadata, ImagePlaneModuleMetadata, SopCommonModuleMetadata, ImagePixelModuleMetadata, PatientStudyModuleMetadata, TransferSyntaxMetadata, LocalVolumeOptions, IVoxelManager, IRLEVoxelMap, RLERun, ViewportInput, ImageLoadRequests, IBaseVolumeViewport, GeometryLoaderFn, ScrollOptions, JumpToSliceOptions, Memo, HistoryMemo, VoxelManager, RLEVoxelMap, };
104
+ import type { RenderingEngineModeType } from './RenderingEngineMode';
105
+ import type { VtkOffscreenMultiRenderWindow } from './VtkOffscreenMultiRenderWindow';
106
+ export type { Cornerstone3DConfig, ICamera, IStackViewport, IVideoViewport, 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, StackViewportProperties, VolumeViewportProperties, ViewportProperties, PublicViewportInput, VolumeActor, Actor, ActorEntry, 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, BoundsIJK, BoundsLPS, Color, ColorLUT, VolumeProps, IImageFrame, DicomDateObject, DicomTimeObject, GeneralSeriesModuleMetadata, ImagePlaneModuleMetadata, SopCommonModuleMetadata, ImagePixelModuleMetadata, PatientStudyModuleMetadata, TransferSyntaxMetadata, LocalVolumeOptions, IVoxelManager, IRLEVoxelMap, RLERun, ViewportInput, ImageLoadRequests, IBaseVolumeViewport, GeometryLoaderFn, ScrollOptions, JumpToSliceOptions, Memo, HistoryMemo, VoxelManager, RLEVoxelMap, RenderingEngineModeType, VtkOffscreenMultiRenderWindow, };
@@ -0,0 +1 @@
1
+ export declare function asArray<T>(item: T | T[]): T[];
@@ -0,0 +1,6 @@
1
+ export function asArray(item) {
2
+ if (Array.isArray(item)) {
3
+ return item;
4
+ }
5
+ return [item];
6
+ }
@@ -51,10 +51,12 @@ function findMatchingColormap(rgbPoints, actor) {
51
51
  });
52
52
  }
53
53
  }
54
- return {
54
+ const result = {
55
55
  name: matchedColormap.Name,
56
- opacity,
56
+ ...(Array.isArray(opacity) && opacity.length > 0 && { opacity }),
57
+ ...(typeof opacity === 'number' && { opacity }),
57
58
  };
59
+ return result;
58
60
  }
59
61
  export function setColorMapTransferFunctionForVolumeActor(volumeInfo) {
60
62
  const { volumeActor, preset, opacity = 0.9, threshold = null, colorRange = [0, 5], } = volumeInfo;
@@ -72,7 +72,10 @@ function calculateUSPixelSpacing(instance) {
72
72
  const { PhysicalDeltaX, PhysicalDeltaY } = isArrayOfSequences
73
73
  ? SequenceOfUltrasoundRegions[0]
74
74
  : SequenceOfUltrasoundRegions;
75
- const USPixelSpacing = [PhysicalDeltaX * 10, PhysicalDeltaY * 10];
75
+ const USPixelSpacing = [
76
+ Math.abs(PhysicalDeltaX) * 10,
77
+ Math.abs(PhysicalDeltaY) * 10,
78
+ ];
76
79
  return {
77
80
  PixelSpacing: USPixelSpacing,
78
81
  };
@@ -14,12 +14,21 @@ export declare class HistoryMemo {
14
14
  private redoAvailable;
15
15
  private undoAvailable;
16
16
  private ring;
17
+ private isRecordingGrouped;
17
18
  constructor(label?: string, size?: number);
18
19
  get size(): number;
19
20
  set size(newSize: number);
21
+ get canUndo(): boolean;
22
+ get canRedo(): boolean;
20
23
  undo(items?: number): void;
21
- undoIf(condition: (item: Memo) => boolean): boolean;
24
+ undoIf(condition: (item: Memo | Memo[]) => boolean): boolean;
25
+ private dispatchHistoryEvent;
22
26
  redo(items?: number): void;
27
+ private initializeGroupItem;
28
+ startGroupRecording(): void;
29
+ private rollbackUnusedGroupItem;
30
+ endGroupRecording(): void;
31
+ private pushGrouped;
23
32
  push(item: Memo | Memoable): Memo;
24
33
  }
25
34
  declare const DefaultHistoryMemo: HistoryMemo;
@@ -1,4 +1,5 @@
1
1
  import eventTarget from '../../eventTarget';
2
+ import { asArray } from '../asArray';
2
3
  const Events = {
3
4
  HISTORY_UNDO: 'CORNERSTONE_TOOLS_HISTORY_UNDO',
4
5
  HISTORY_REDO: 'CORNERSTONE_TOOLS_HISTORY_REDO',
@@ -9,6 +10,7 @@ export class HistoryMemo {
9
10
  this.redoAvailable = 0;
10
11
  this.undoAvailable = 0;
11
12
  this.ring = new Array();
13
+ this.isRecordingGrouped = false;
12
14
  this.label = label;
13
15
  this._size = size;
14
16
  }
@@ -22,19 +24,18 @@ export class HistoryMemo {
22
24
  this.redoAvailable = 0;
23
25
  this.undoAvailable = 0;
24
26
  }
27
+ get canUndo() {
28
+ return this.undoAvailable > 0;
29
+ }
30
+ get canRedo() {
31
+ return this.redoAvailable > 0;
32
+ }
25
33
  undo(items = 1) {
26
34
  while (items > 0 && this.undoAvailable > 0) {
27
35
  const item = this.ring[this.position];
28
- item.restoreMemo(true);
29
- if (item.id) {
30
- eventTarget.dispatchEvent(new CustomEvent(Events.HISTORY_UNDO, {
31
- detail: {
32
- isUndo: true,
33
- id: item.id,
34
- operationType: item.operationType || 'annotation',
35
- memo: item,
36
- },
37
- }));
36
+ for (const subitem of asArray(item).reverse()) {
37
+ subitem.restoreMemo(true);
38
+ this.dispatchHistoryEvent({ item: subitem, isUndo: true });
38
39
  }
39
40
  items--;
40
41
  this.redoAvailable++;
@@ -49,20 +50,25 @@ export class HistoryMemo {
49
50
  }
50
51
  return false;
51
52
  }
53
+ dispatchHistoryEvent({ item, isUndo }) {
54
+ if (item.id) {
55
+ eventTarget.dispatchEvent(new CustomEvent(isUndo ? Events.HISTORY_UNDO : Events.HISTORY_REDO, {
56
+ detail: {
57
+ isUndo,
58
+ id: item.id,
59
+ operationType: item.operationType || 'annotation',
60
+ memo: item,
61
+ },
62
+ }));
63
+ }
64
+ }
52
65
  redo(items = 1) {
53
66
  while (items > 0 && this.redoAvailable > 0) {
54
67
  const newPosition = (this.position + 1) % this.size;
55
68
  const item = this.ring[newPosition];
56
- item.restoreMemo(false);
57
- if (item.id) {
58
- eventTarget.dispatchEvent(new CustomEvent(Events.HISTORY_REDO, {
59
- detail: {
60
- isUndo: false,
61
- id: item.id,
62
- operationType: item.operationType || 'annotation',
63
- memo: item,
64
- },
65
- }));
69
+ for (const subitem of asArray(item).reverse()) {
70
+ subitem.restoreMemo(false);
71
+ this.dispatchHistoryEvent({ item: subitem, isUndo: false });
66
72
  }
67
73
  items--;
68
74
  this.position = newPosition;
@@ -70,6 +76,39 @@ export class HistoryMemo {
70
76
  this.redoAvailable--;
71
77
  }
72
78
  }
79
+ initializeGroupItem() {
80
+ this.redoAvailable = 0;
81
+ if (this.undoAvailable < this._size) {
82
+ this.undoAvailable++;
83
+ }
84
+ this.position = (this.position + 1) % this._size;
85
+ this.ring[this.position] = [];
86
+ }
87
+ startGroupRecording() {
88
+ this.isRecordingGrouped = true;
89
+ this.initializeGroupItem();
90
+ }
91
+ rollbackUnusedGroupItem() {
92
+ this.ring[this.position] = undefined;
93
+ this.position = (this.position - 1) % this._size;
94
+ this.undoAvailable--;
95
+ }
96
+ endGroupRecording() {
97
+ this.isRecordingGrouped = false;
98
+ const lastItem = this.ring[this.position];
99
+ const lastItemIsEmpty = Array.isArray(lastItem) && lastItem.length === 0;
100
+ if (lastItemIsEmpty) {
101
+ this.rollbackUnusedGroupItem();
102
+ }
103
+ }
104
+ pushGrouped(memo) {
105
+ const lastMemo = this.ring[this.position];
106
+ if (Array.isArray(lastMemo)) {
107
+ lastMemo.push(memo);
108
+ return memo;
109
+ }
110
+ throw new Error('Last item should be an array for grouped memos.');
111
+ }
73
112
  push(item) {
74
113
  if (!item) {
75
114
  return;
@@ -80,6 +119,9 @@ export class HistoryMemo {
80
119
  if (!memo) {
81
120
  return;
82
121
  }
122
+ if (this.isRecordingGrouped) {
123
+ return this.pushGrouped(memo);
124
+ }
83
125
  this.redoAvailable = 0;
84
126
  if (this.undoAvailable < this._size) {
85
127
  this.undoAvailable++;
@@ -93,6 +93,8 @@ import calculateSpacingBetweenImageIds from './calculateSpacingBetweenImageIds';
93
93
  export * as logger from './logger';
94
94
  import { calculateNeighborhoodStats } from './calculateNeighborhoodStats';
95
95
  import getPixelSpacingInformation from './getPixelSpacingInformation';
96
+ import { asArray } from './asArray';
97
+ export { updatePlaneRestriction } from './updatePlaneRestriction';
96
98
  declare const getViewportModality: (viewport: IViewport, volumeId?: string) => string;
97
99
  export * from './isEqual';
98
- export { FrameRange, eventListener, csUtils as invertRgbTransferFunction, createSigmoidRGBTransferFunction, getVoiFromSigmoidRGBTransferFunction, createLinearRGBTransferFunction, scaleRgbTransferFunction, triggerEvent, imageIdToURI, fnv1aHash, calibratedPixelSpacingMetadataProvider, clamp, uuidv4, getMinMax, getRuntimeId, isOpposite, getViewportModality, windowLevel, convertToGrayscale, 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, 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, pointInShapeCallback, deepEqual, jumpToSlice, scroll, clip, transformWorldToIndexContinuous, createSubVolume, getVolumeDirectionVectors, calculateSpacingBetweenImageIds, getImageDataMetadata, buildMetadata, calculateNeighborhoodStats, getPixelSpacingInformation, };
100
+ export { FrameRange, eventListener, csUtils as invertRgbTransferFunction, createSigmoidRGBTransferFunction, getVoiFromSigmoidRGBTransferFunction, createLinearRGBTransferFunction, scaleRgbTransferFunction, triggerEvent, imageIdToURI, fnv1aHash, calibratedPixelSpacingMetadataProvider, clamp, uuidv4, getMinMax, getRuntimeId, isOpposite, getViewportModality, windowLevel, convertToGrayscale, 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, 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, pointInShapeCallback, deepEqual, jumpToSlice, scroll, clip, transformWorldToIndexContinuous, createSubVolume, getVolumeDirectionVectors, calculateSpacingBetweenImageIds, getImageDataMetadata, buildMetadata, calculateNeighborhoodStats, getPixelSpacingInformation, asArray, };
@@ -94,6 +94,8 @@ import calculateSpacingBetweenImageIds from './calculateSpacingBetweenImageIds';
94
94
  export * as logger from './logger';
95
95
  import { calculateNeighborhoodStats } from './calculateNeighborhoodStats';
96
96
  import getPixelSpacingInformation from './getPixelSpacingInformation';
97
+ import { asArray } from './asArray';
98
+ export { updatePlaneRestriction } from './updatePlaneRestriction';
97
99
  const getViewportModality = (viewport, volumeId) => _getViewportModality(viewport, volumeId, cache.getVolume);
98
100
  export * from './isEqual';
99
- export { FrameRange, eventListener, csUtils as invertRgbTransferFunction, createSigmoidRGBTransferFunction, getVoiFromSigmoidRGBTransferFunction, createLinearRGBTransferFunction, scaleRgbTransferFunction, triggerEvent, imageIdToURI, fnv1aHash, calibratedPixelSpacingMetadataProvider, clamp, uuidv4, getMinMax, getRuntimeId, isOpposite, getViewportModality, windowLevel, convertToGrayscale, 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, 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, pointInShapeCallback, deepEqual, jumpToSlice, scroll, clip, transformWorldToIndexContinuous, createSubVolume, getVolumeDirectionVectors, calculateSpacingBetweenImageIds, getImageDataMetadata, buildMetadata, calculateNeighborhoodStats, getPixelSpacingInformation, };
101
+ export { FrameRange, eventListener, csUtils as invertRgbTransferFunction, createSigmoidRGBTransferFunction, getVoiFromSigmoidRGBTransferFunction, createLinearRGBTransferFunction, scaleRgbTransferFunction, triggerEvent, imageIdToURI, fnv1aHash, calibratedPixelSpacingMetadataProvider, clamp, uuidv4, getMinMax, getRuntimeId, isOpposite, getViewportModality, windowLevel, convertToGrayscale, 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, 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, pointInShapeCallback, deepEqual, jumpToSlice, scroll, clip, transformWorldToIndexContinuous, createSubVolume, getVolumeDirectionVectors, calculateSpacingBetweenImageIds, getImageDataMetadata, buildMetadata, calculateNeighborhoodStats, getPixelSpacingInformation, asArray, };
@@ -1,5 +1,5 @@
1
- export default function isEqual<ValueType>(v1: ValueType, v2: ValueType, tolerance?: number): boolean;
2
- declare const isEqualNegative: <ValueType>(v1: ValueType, v2: ValueType, tolerance?: any) => boolean;
3
- declare const isEqualAbs: <ValueType>(v1: ValueType, v2: ValueType, tolerance?: any) => boolean;
4
- declare function isNumber(n: number[] | number): boolean;
5
- export { isEqualNegative, isEqual, isEqualAbs, isNumber };
1
+ export declare function isEqual<ValueType>(v1: ValueType, v2: ValueType, tolerance?: number): boolean;
2
+ export declare const isEqualNegative: <ValueType>(v1: ValueType, v2: ValueType, tolerance?: any) => boolean;
3
+ export declare const isEqualAbs: <ValueType>(v1: ValueType, v2: ValueType, tolerance?: any) => boolean;
4
+ export declare function isNumber(n: number[] | number): boolean;
5
+ export default isEqual;
@@ -23,7 +23,7 @@ function isNumberArrayLike(value) {
23
23
  value.length > 0 &&
24
24
  typeof value[0] === 'number');
25
25
  }
26
- export default function isEqual(v1, v2, tolerance = 1e-5) {
26
+ export function isEqual(v1, v2, tolerance = 1e-5) {
27
27
  if (typeof v1 !== typeof v2 || v1 === null || v2 === null) {
28
28
  return false;
29
29
  }
@@ -37,12 +37,12 @@ export default function isEqual(v1, v2, tolerance = 1e-5) {
37
37
  }
38
38
  const negative = (v) => typeof v === 'number' ? -v : v?.map ? v.map(negative) : !v;
39
39
  const abs = (v) => typeof v === 'number' ? Math.abs(v) : v?.map ? v.map(abs) : v;
40
- const isEqualNegative = (v1, v2, tolerance = undefined) => isEqual(v1, negative(v2), tolerance);
41
- const isEqualAbs = (v1, v2, tolerance = undefined) => isEqual(abs(v1), abs(v2), tolerance);
42
- function isNumber(n) {
40
+ export const isEqualNegative = (v1, v2, tolerance = undefined) => isEqual(v1, negative(v2), tolerance);
41
+ export const isEqualAbs = (v1, v2, tolerance = undefined) => isEqual(abs(v1), abs(v2), tolerance);
42
+ export function isNumber(n) {
43
43
  if (Array.isArray(n)) {
44
44
  return isNumber(n[0]);
45
45
  }
46
46
  return isFinite(n) && !isNaN(n);
47
47
  }
48
- export { isEqualNegative, isEqual, isEqualAbs, isNumber };
48
+ export default isEqual;
@@ -2,7 +2,7 @@ import { vec3 } from 'gl-matrix';
2
2
  import getOrCreateCanvas, { EPSILON, } from '../RenderingEngine/helpers/getOrCreateCanvas';
3
3
  import { ViewportType, Events } from '../enums';
4
4
  import { getRenderingEngine } from '../RenderingEngine/getRenderingEngine';
5
- import RenderingEngine from '../RenderingEngine';
5
+ import TiledRenderingEngine from '../RenderingEngine/TiledRenderingEngine';
6
6
  import isPTPrescaledWithSUV from './isPTPrescaledWithSUV';
7
7
  export default function renderToCanvasGPU(canvas, imageOrVolume, modality = undefined, renderingEngineId = '_thumbnails', viewportOptions = {
8
8
  displayArea: { imageArea: [1, 1] },
@@ -31,7 +31,7 @@ export default function renderToCanvasGPU(canvas, imageOrVolume, modality = unde
31
31
  element.setAttribute('viewport-id-for-remove', uniqueId);
32
32
  const temporaryCanvas = getOrCreateCanvas(element);
33
33
  const renderingEngine = getRenderingEngine(renderingEngineId) ||
34
- new RenderingEngine(renderingEngineId);
34
+ new TiledRenderingEngine(renderingEngineId);
35
35
  let viewport = renderingEngine.getViewport(viewportId);
36
36
  if (!viewport) {
37
37
  const viewportInput = {
@@ -0,0 +1,2 @@
1
+ import type { Point3, ViewReference } from '../types';
2
+ export declare function updatePlaneRestriction(points: Point3[], reference: ViewReference): import("../types/IViewport").PlaneRestriction;
@@ -0,0 +1,41 @@
1
+ import { isEqual } from '../utilities/isEqual';
2
+ import { vec3 } from 'gl-matrix';
3
+ const ORTHOGONAL_TEST_VALUE = 0.95;
4
+ export function updatePlaneRestriction(points, reference) {
5
+ if (!points?.length || !reference.FrameOfReferenceUID) {
6
+ return;
7
+ }
8
+ reference.planeRestriction ||= {
9
+ FrameOfReferenceUID: reference.FrameOfReferenceUID,
10
+ point: points[0],
11
+ inPlaneVector1: null,
12
+ inPlaneVector2: null,
13
+ };
14
+ const { planeRestriction } = reference;
15
+ if (points.length === 1) {
16
+ planeRestriction.inPlaneVector1 = null;
17
+ planeRestriction.inPlaneVector2 = null;
18
+ return planeRestriction;
19
+ }
20
+ const v1 = vec3.sub(vec3.create(), points[0], points[Math.floor(points.length / 2)]);
21
+ vec3.normalize(v1, v1);
22
+ planeRestriction.inPlaneVector1 = v1;
23
+ planeRestriction.inPlaneVector2 = null;
24
+ const n = points.length;
25
+ if (n > 2) {
26
+ for (let i = Math.floor(n / 3); i < n; i++) {
27
+ const testVector = vec3.sub(vec3.create(), points[i], points[0]);
28
+ const length = vec3.length(testVector);
29
+ if (isEqual(length, 0)) {
30
+ continue;
31
+ }
32
+ if (vec3.dot(testVector, planeRestriction.inPlaneVector1) <
33
+ length * ORTHOGONAL_TEST_VALUE) {
34
+ vec3.normalize(testVector, testVector);
35
+ planeRestriction.inPlaneVector2 = testVector;
36
+ return planeRestriction;
37
+ }
38
+ }
39
+ }
40
+ return planeRestriction;
41
+ }
@@ -1 +1 @@
1
- export declare const version = "3.26.2";
1
+ export declare const version = "4.0.0-beta.4";
@@ -1 +1 @@
1
- export const version = '3.26.2';
1
+ export const version = '4.0.0-beta.4';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cornerstonejs/core",
3
- "version": "4.0.0-beta.2",
3
+ "version": "4.0.0-beta.4",
4
4
  "description": "Cornerstone3D Core",
5
5
  "module": "./dist/esm/index.js",
6
6
  "types": "./dist/esm/index.d.ts",
@@ -76,8 +76,8 @@
76
76
  "build": "yarn run build:esm",
77
77
  "build:all": "yarn run build:esm",
78
78
  "dev": "tsc --project ./tsconfig.json --watch",
79
- "format-check": "npx eslint ./src --quiet",
80
79
  "api-check": "api-extractor --debug run ",
80
+ "lint": "oxlint .",
81
81
  "prepublishOnly": "yarn run build"
82
82
  },
83
83
  "dependencies": {
@@ -96,5 +96,6 @@
96
96
  "funding": {
97
97
  "type": "individual",
98
98
  "url": "https://ohif.org/donate"
99
- }
99
+ },
100
+ "gitHead": "bd2215216a08cc0c953c6523b16892b3aee6f9be"
100
101
  }