@cornerstonejs/core 4.6.3 → 4.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -10,6 +10,7 @@ declare abstract class BaseVolumeViewport extends Viewport {
10
10
  useCPURendering: boolean;
11
11
  private _FrameOfReferenceUID;
12
12
  private sharpening;
13
+ private smoothing;
13
14
  protected initialTransferFunctionNodes: TransferFunctionNodes;
14
15
  private globalDefaultProperties;
15
16
  private perVolumeIdDefaultProperties;
@@ -48,8 +49,9 @@ declare abstract class BaseVolumeViewport extends Viewport {
48
49
  setViewPlane(planeRestriction: PlaneRestriction): void;
49
50
  setViewReference(viewRef: ViewReference): void;
50
51
  private setThreshold;
51
- setProperties({ voiRange, VOILUTFunction, invert, colormap, preset, interpolationType, slabThickness, sampleDistanceMultiplier, sharpening, }?: VolumeViewportProperties, volumeId?: string, suppressEvents?: boolean): void;
52
+ setProperties({ voiRange, VOILUTFunction, invert, colormap, preset, interpolationType, slabThickness, sampleDistanceMultiplier, sharpening, smoothing, }?: VolumeViewportProperties, volumeId?: string, suppressEvents?: boolean): void;
52
53
  private setSharpening;
54
+ private setSmoothing;
53
55
  protected shouldUseCustomRenderPass(): boolean;
54
56
  getRenderPasses: () => any[];
55
57
  resetToDefaultProperties(volumeId: string): void;
@@ -31,12 +31,13 @@ import { getCameraVectors } from './helpers/getCameraVectors';
31
31
  import { isContextPoolRenderingEngine } from './helpers/isContextPoolRenderingEngine';
32
32
  import mprCameraValues from '../constants/mprCameraValues';
33
33
  import { isInvalidNumber } from './helpers/isInvalidNumber';
34
- import { createSharpeningRenderPass } from './renderPasses';
34
+ import { createSharpeningRenderPass, createSmoothingRenderPass, } from './renderPasses';
35
35
  class BaseVolumeViewport extends Viewport {
36
36
  constructor(props) {
37
37
  super(props);
38
38
  this.useCPURendering = false;
39
39
  this.sharpening = 0;
40
+ this.smoothing = 0;
40
41
  this.perVolumeIdDefaultProperties = new Map();
41
42
  this.viewportProperties = {};
42
43
  this.volumeIds = new Set();
@@ -76,15 +77,26 @@ class BaseVolumeViewport extends Viewport {
76
77
  this.sharpening = sharpening;
77
78
  this.render();
78
79
  };
80
+ this.setSmoothing = (smoothing) => {
81
+ this.smoothing = smoothing;
82
+ this.render();
83
+ };
79
84
  this.getRenderPasses = () => {
80
85
  if (!this.shouldUseCustomRenderPass()) {
81
86
  return null;
82
87
  }
88
+ const renderPasses = [];
83
89
  try {
84
- return [createSharpeningRenderPass(this.sharpening)];
90
+ if (this.smoothing > 0) {
91
+ renderPasses.push(createSmoothingRenderPass(this.smoothing));
92
+ }
93
+ if (this.sharpening > 0) {
94
+ renderPasses.push(createSharpeningRenderPass(this.sharpening));
95
+ }
96
+ return renderPasses.length ? renderPasses : null;
85
97
  }
86
98
  catch (e) {
87
- console.warn('Failed to create sharpening render passes:', e);
99
+ console.warn('Failed to create custom render passes:', e);
88
100
  return null;
89
101
  }
90
102
  };
@@ -134,6 +146,7 @@ class BaseVolumeViewport extends Viewport {
134
146
  slabThickness: slabThickness,
135
147
  preset,
136
148
  sharpening: this.sharpening,
149
+ smoothing: this.smoothing,
137
150
  };
138
151
  };
139
152
  this.getColormap = (volumeId) => {
@@ -721,7 +734,7 @@ class BaseVolumeViewport extends Viewport {
721
734
  const newPosition = vec3.add(vec3.create(), position, focalShift);
722
735
  this.setCamera({
723
736
  focalPoint: newImagePositionPatient,
724
- position: newPosition
737
+ position: newPosition,
725
738
  });
726
739
  this.render();
727
740
  return;
@@ -761,7 +774,7 @@ class BaseVolumeViewport extends Viewport {
761
774
  };
762
775
  triggerEvent(this.element, Events.COLORMAP_MODIFIED, eventDetail);
763
776
  }
764
- setProperties({ voiRange, VOILUTFunction, invert, colormap, preset, interpolationType, slabThickness, sampleDistanceMultiplier, sharpening, } = {}, volumeId, suppressEvents = false) {
777
+ setProperties({ voiRange, VOILUTFunction, invert, colormap, preset, interpolationType, slabThickness, sampleDistanceMultiplier, sharpening, smoothing, } = {}, volumeId, suppressEvents = false) {
765
778
  if (this.globalDefaultProperties == null) {
766
779
  this.setDefaultProperties({
767
780
  voiRange,
@@ -805,9 +818,12 @@ class BaseVolumeViewport extends Viewport {
805
818
  if (typeof sharpening !== 'undefined') {
806
819
  this.setSharpening(sharpening);
807
820
  }
821
+ if (typeof smoothing !== 'undefined') {
822
+ this.setSmoothing(smoothing);
823
+ }
808
824
  }
809
825
  shouldUseCustomRenderPass() {
810
- return this.sharpening > 0 && !this.useCPURendering;
826
+ return !this.useCPURendering;
811
827
  }
812
828
  resetToDefaultProperties(volumeId) {
813
829
  const properties = this.globalDefaultProperties;
@@ -28,6 +28,7 @@ declare class StackViewport extends Viewport {
28
28
  private voiRange;
29
29
  private voiUpdatedWithSetProperties;
30
30
  private sharpening;
31
+ private smoothing;
31
32
  private VOILUTFunction;
32
33
  private invert;
33
34
  private initialInvert;
@@ -78,6 +79,7 @@ declare class StackViewport extends Viewport {
78
79
  private setInvertColor;
79
80
  private setColormap;
80
81
  private setSharpening;
82
+ private setSmoothing;
81
83
  protected shouldUseCustomRenderPass(): boolean;
82
84
  getRenderPasses: () => any[];
83
85
  private initializeElementDisabledHandler;
@@ -92,7 +94,7 @@ declare class StackViewport extends Viewport {
92
94
  private calibrateIfNecessary;
93
95
  setDefaultProperties(ViewportProperties: StackViewportProperties, imageId?: string): void;
94
96
  clearDefaultProperties(imageId?: string): void;
95
- setProperties({ colormap, voiRange, VOILUTFunction, invert, interpolationType, sharpening, }?: StackViewportProperties, suppressEvents?: boolean): void;
97
+ setProperties({ colormap, voiRange, VOILUTFunction, invert, interpolationType, sharpening, smoothing, }?: StackViewportProperties, suppressEvents?: boolean): void;
96
98
  getDefaultProperties: (imageId?: string) => StackViewportProperties;
97
99
  getProperties: () => StackViewportProperties;
98
100
  resetCameraForResize: () => boolean;
@@ -44,7 +44,7 @@ import getSpacingInNormalDirection from '../utilities/getSpacingInNormalDirectio
44
44
  import getClosestImageId from '../utilities/getClosestImageId';
45
45
  import { adjustInitialViewUp } from '../utilities/adjustInitialViewUp';
46
46
  import { isContextPoolRenderingEngine } from './helpers/isContextPoolRenderingEngine';
47
- import { createSharpeningRenderPass } from './renderPasses';
47
+ import { createSharpeningRenderPass, createSmoothingRenderPass, } from './renderPasses';
48
48
  const log = coreLog.getLogger('RenderingEngine', 'StackViewport');
49
49
  class StackViewport extends Viewport {
50
50
  constructor(props) {
@@ -58,6 +58,7 @@ class StackViewport extends Viewport {
58
58
  this.perImageIdDefaultProperties = new Map();
59
59
  this.voiUpdatedWithSetProperties = false;
60
60
  this.sharpening = 0;
61
+ this.smoothing = 0;
61
62
  this.invert = false;
62
63
  this.initialInvert = false;
63
64
  this.initialTransferFunctionNodes = null;
@@ -70,15 +71,26 @@ class StackViewport extends Viewport {
70
71
  this.sharpening = sharpening;
71
72
  this.render();
72
73
  };
74
+ this.setSmoothing = (smoothing) => {
75
+ this.smoothing = smoothing;
76
+ this.render();
77
+ };
73
78
  this.getRenderPasses = () => {
74
79
  if (!this.shouldUseCustomRenderPass()) {
75
80
  return null;
76
81
  }
82
+ const renderPasses = [];
77
83
  try {
78
- return [createSharpeningRenderPass(this.sharpening)];
84
+ if (this.smoothing > 0) {
85
+ renderPasses.push(createSmoothingRenderPass(this.smoothing));
86
+ }
87
+ if (this.sharpening > 0) {
88
+ renderPasses.push(createSharpeningRenderPass(this.sharpening));
89
+ }
90
+ return renderPasses.length ? renderPasses : null;
79
91
  }
80
92
  catch (e) {
81
- console.warn('Failed to create sharpening render passes:', e);
93
+ console.warn('Failed to create custom render passes:', e);
82
94
  return null;
83
95
  }
84
96
  };
@@ -133,6 +145,7 @@ class StackViewport extends Viewport {
133
145
  invert,
134
146
  isComputedVOI: !voiUpdatedWithSetProperties,
135
147
  sharpening: this.sharpening,
148
+ smoothing: this.smoothing,
136
149
  };
137
150
  };
138
151
  this.resetCameraForResize = () => {
@@ -535,7 +548,7 @@ class StackViewport extends Viewport {
535
548
  camera.setFreezeFocalPoint(true);
536
549
  }
537
550
  shouldUseCustomRenderPass() {
538
- return this.sharpening > 0 && !this.useCPURendering;
551
+ return !this.useCPURendering;
539
552
  }
540
553
  initializeElementDisabledHandler() {
541
554
  eventTarget.addEventListener(Events.ELEMENT_DISABLED, function elementDisabledHandler() {
@@ -658,7 +671,7 @@ class StackViewport extends Viewport {
658
671
  this.resetToDefaultProperties();
659
672
  }
660
673
  }
661
- setProperties({ colormap, voiRange, VOILUTFunction, invert, interpolationType, sharpening, } = {}, suppressEvents = false) {
674
+ setProperties({ colormap, voiRange, VOILUTFunction, invert, interpolationType, sharpening, smoothing, } = {}, suppressEvents = false) {
662
675
  this.viewportStatus = this.csImage
663
676
  ? ViewportStatus.PRE_RENDER
664
677
  : ViewportStatus.LOADING;
@@ -669,6 +682,7 @@ class StackViewport extends Viewport {
669
682
  invert: this.globalDefaultProperties.invert ?? invert,
670
683
  interpolationType: this.globalDefaultProperties.interpolationType ?? interpolationType,
671
684
  sharpening: this.globalDefaultProperties.sharpening ?? sharpening,
685
+ smoothing: this.globalDefaultProperties.smoothing ?? smoothing,
672
686
  };
673
687
  if (typeof colormap !== 'undefined') {
674
688
  this.setColormap(colormap);
@@ -689,6 +703,9 @@ class StackViewport extends Viewport {
689
703
  if (typeof sharpening !== 'undefined') {
690
704
  this.setSharpening(sharpening);
691
705
  }
706
+ if (typeof smoothing !== 'undefined') {
707
+ this.setSmoothing(smoothing);
708
+ }
692
709
  }
693
710
  resetProperties() {
694
711
  this.cpuRenderingInvalidated = true;
@@ -1,2 +1,3 @@
1
1
  import { createSharpeningRenderPass } from './sharpeningRenderPass';
2
- export { createSharpeningRenderPass };
2
+ import { createSmoothingRenderPass } from './smoothingRenderPass';
3
+ export { createSharpeningRenderPass, createSmoothingRenderPass };
@@ -1,2 +1,3 @@
1
1
  import { createSharpeningRenderPass } from './sharpeningRenderPass';
2
- export { createSharpeningRenderPass };
2
+ import { createSmoothingRenderPass } from './smoothingRenderPass';
3
+ export { createSharpeningRenderPass, createSmoothingRenderPass };
@@ -0,0 +1,2 @@
1
+ declare function createSmoothingRenderPass(intensity: number): any;
2
+ export { createSmoothingRenderPass };
@@ -0,0 +1,39 @@
1
+ import vtkConvolution2DPass from '@kitware/vtk.js/Rendering/OpenGL/Convolution2DPass';
2
+ import vtkForwardPass from '@kitware/vtk.js/Rendering/OpenGL/ForwardPass';
3
+ function createSmoothingRenderPass(intensity) {
4
+ let renderPass = vtkForwardPass.newInstance();
5
+ if (intensity > 0) {
6
+ const convolutionPass = vtkConvolution2DPass.newInstance();
7
+ convolutionPass.setDelegates([renderPass]);
8
+ const smoothStrength = Math.min(intensity, 1000);
9
+ const kernelSize = 15;
10
+ const sigma = 5.0;
11
+ const gaussianKernel = createGaussianKernel(kernelSize, sigma);
12
+ const totalElements = kernelSize * kernelSize;
13
+ const centerIndex = Math.floor(totalElements / 2);
14
+ const identityKernel = Array(totalElements).fill(0);
15
+ identityKernel[centerIndex] = 1;
16
+ const alpha = Math.min(smoothStrength / 10, 1.0);
17
+ const kernel = gaussianKernel.map((g, i) => (1 - alpha) * identityKernel[i] + alpha * g);
18
+ convolutionPass.setKernelDimension(15);
19
+ convolutionPass.setKernel(kernel);
20
+ renderPass = convolutionPass;
21
+ }
22
+ return renderPass;
23
+ }
24
+ function createGaussianKernel(size, sigma) {
25
+ const kernel = [];
26
+ const mean = (size - 1) / 2;
27
+ let sum = 0;
28
+ for (let y = 0; y < size; y++) {
29
+ for (let x = 0; x < size; x++) {
30
+ const dx = x - mean;
31
+ const dy = y - mean;
32
+ const value = Math.exp(-(dx * dx + dy * dy) / (2 * Math.pow(sigma, 2)));
33
+ kernel.push(value);
34
+ sum += value;
35
+ }
36
+ }
37
+ return kernel.map((v) => v / sum);
38
+ }
39
+ export { createSmoothingRenderPass };
@@ -10,4 +10,5 @@ export interface ViewportProperties {
10
10
  preset?: string;
11
11
  sampleDistanceMultiplier?: number;
12
12
  sharpening?: number;
13
+ smoothing?: number;
13
14
  }
@@ -1 +1 @@
1
- export declare const version = "4.6.3";
1
+ export declare const version = "4.7.0";
@@ -1 +1 @@
1
- export const version = '4.6.3';
1
+ export const version = '4.7.0';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cornerstonejs/core",
3
- "version": "4.6.3",
3
+ "version": "4.7.0",
4
4
  "description": "Cornerstone3D Core",
5
5
  "module": "./dist/esm/index.js",
6
6
  "types": "./dist/esm/index.d.ts",
@@ -97,5 +97,5 @@
97
97
  "type": "individual",
98
98
  "url": "https://ohif.org/donate"
99
99
  },
100
- "gitHead": "70ff2626164aa31aae20c7dc792c52ac053d74b1"
100
+ "gitHead": "ed855a5de3ae8111017b8498c4c829d6597c2af7"
101
101
  }