@cornerstonejs/core 4.2.4 → 4.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/RenderingEngine/BaseVolumeViewport.d.ts +5 -1
- package/dist/esm/RenderingEngine/BaseVolumeViewport.js +26 -1
- package/dist/esm/RenderingEngine/ContextPoolRenderingEngine.d.ts +1 -0
- package/dist/esm/RenderingEngine/ContextPoolRenderingEngine.js +13 -0
- package/dist/esm/RenderingEngine/StackViewport.d.ts +5 -1
- package/dist/esm/RenderingEngine/StackViewport.js +30 -5
- package/dist/esm/RenderingEngine/Viewport.d.ts +1 -0
- package/dist/esm/RenderingEngine/Viewport.js +3 -0
- package/dist/esm/RenderingEngine/helpers/setDefaultVolumeVOI.js +3 -0
- package/dist/esm/RenderingEngine/renderPasses/index.d.ts +2 -0
- package/dist/esm/RenderingEngine/renderPasses/index.js +2 -0
- package/dist/esm/RenderingEngine/renderPasses/sharpeningRenderPass.d.ts +2 -0
- package/dist/esm/RenderingEngine/renderPasses/sharpeningRenderPass.js +15 -0
- package/dist/esm/types/ViewportProperties.d.ts +1 -0
- package/dist/esm/version.d.ts +1 -1
- package/dist/esm/version.js +1 -1
- package/package.json +2 -2
|
@@ -9,6 +9,7 @@ import type vtkRenderer from '@kitware/vtk.js/Rendering/Core/Renderer';
|
|
|
9
9
|
declare abstract class BaseVolumeViewport extends Viewport {
|
|
10
10
|
useCPURendering: boolean;
|
|
11
11
|
private _FrameOfReferenceUID;
|
|
12
|
+
private sharpening;
|
|
12
13
|
protected initialTransferFunctionNodes: TransferFunctionNodes;
|
|
13
14
|
private globalDefaultProperties;
|
|
14
15
|
private perVolumeIdDefaultProperties;
|
|
@@ -47,7 +48,10 @@ declare abstract class BaseVolumeViewport extends Viewport {
|
|
|
47
48
|
setViewPlane(planeRestriction: PlaneRestriction): void;
|
|
48
49
|
setViewReference(viewRef: ViewReference): void;
|
|
49
50
|
private setThreshold;
|
|
50
|
-
setProperties({ voiRange, VOILUTFunction, invert, colormap, preset, interpolationType, slabThickness, sampleDistanceMultiplier, }?: VolumeViewportProperties, volumeId?: string, suppressEvents?: boolean): void;
|
|
51
|
+
setProperties({ voiRange, VOILUTFunction, invert, colormap, preset, interpolationType, slabThickness, sampleDistanceMultiplier, sharpening, }?: VolumeViewportProperties, volumeId?: string, suppressEvents?: boolean): void;
|
|
52
|
+
private setSharpening;
|
|
53
|
+
protected shouldUseCustomRenderPass(): boolean;
|
|
54
|
+
getRenderPasses: () => any[];
|
|
51
55
|
resetToDefaultProperties(volumeId: string): void;
|
|
52
56
|
private setPreset;
|
|
53
57
|
setSampleDistanceMultiplier(multiplier: number): void;
|
|
@@ -30,10 +30,12 @@ import * as metaData from '../metaData';
|
|
|
30
30
|
import { getCameraVectors } from './helpers/getCameraVectors';
|
|
31
31
|
import { isContextPoolRenderingEngine } from './helpers/isContextPoolRenderingEngine';
|
|
32
32
|
import mprCameraValues from '../constants/mprCameraValues';
|
|
33
|
+
import { createSharpeningRenderPass } from './renderPasses';
|
|
33
34
|
class BaseVolumeViewport extends Viewport {
|
|
34
35
|
constructor(props) {
|
|
35
36
|
super(props);
|
|
36
37
|
this.useCPURendering = false;
|
|
38
|
+
this.sharpening = 0;
|
|
37
39
|
this.perVolumeIdDefaultProperties = new Map();
|
|
38
40
|
this.viewportProperties = {};
|
|
39
41
|
this.volumeIds = new Set();
|
|
@@ -69,6 +71,22 @@ class BaseVolumeViewport extends Viewport {
|
|
|
69
71
|
};
|
|
70
72
|
triggerEvent(this.element, Events.CAMERA_MODIFIED, eventDetail);
|
|
71
73
|
};
|
|
74
|
+
this.setSharpening = (sharpening) => {
|
|
75
|
+
this.sharpening = sharpening;
|
|
76
|
+
this.render();
|
|
77
|
+
};
|
|
78
|
+
this.getRenderPasses = () => {
|
|
79
|
+
if (!this.shouldUseCustomRenderPass()) {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
try {
|
|
83
|
+
return [createSharpeningRenderPass(this.sharpening)];
|
|
84
|
+
}
|
|
85
|
+
catch (e) {
|
|
86
|
+
console.warn('Failed to create sharpening render passes:', e);
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
};
|
|
72
90
|
this.getDefaultProperties = (volumeId) => {
|
|
73
91
|
let volumeProperties;
|
|
74
92
|
if (volumeId !== undefined) {
|
|
@@ -114,6 +132,7 @@ class BaseVolumeViewport extends Viewport {
|
|
|
114
132
|
invert: invert,
|
|
115
133
|
slabThickness: slabThickness,
|
|
116
134
|
preset,
|
|
135
|
+
sharpening: this.sharpening,
|
|
117
136
|
};
|
|
118
137
|
};
|
|
119
138
|
this.getColormap = (volumeId) => {
|
|
@@ -734,7 +753,7 @@ class BaseVolumeViewport extends Viewport {
|
|
|
734
753
|
};
|
|
735
754
|
triggerEvent(this.element, Events.COLORMAP_MODIFIED, eventDetail);
|
|
736
755
|
}
|
|
737
|
-
setProperties({ voiRange, VOILUTFunction, invert, colormap, preset, interpolationType, slabThickness, sampleDistanceMultiplier, } = {}, volumeId, suppressEvents = false) {
|
|
756
|
+
setProperties({ voiRange, VOILUTFunction, invert, colormap, preset, interpolationType, slabThickness, sampleDistanceMultiplier, sharpening, } = {}, volumeId, suppressEvents = false) {
|
|
738
757
|
if (this.globalDefaultProperties == null) {
|
|
739
758
|
this.setDefaultProperties({
|
|
740
759
|
voiRange,
|
|
@@ -775,6 +794,12 @@ class BaseVolumeViewport extends Viewport {
|
|
|
775
794
|
if (sampleDistanceMultiplier !== undefined) {
|
|
776
795
|
this.setSampleDistanceMultiplier(sampleDistanceMultiplier);
|
|
777
796
|
}
|
|
797
|
+
if (typeof sharpening !== 'undefined') {
|
|
798
|
+
this.setSharpening(sharpening);
|
|
799
|
+
}
|
|
800
|
+
}
|
|
801
|
+
shouldUseCustomRenderPass() {
|
|
802
|
+
return this.sharpening > 0 && !this.useCPURendering;
|
|
778
803
|
}
|
|
779
804
|
resetToDefaultProperties(volumeId) {
|
|
780
805
|
const properties = this.globalDefaultProperties;
|
|
@@ -20,6 +20,7 @@ declare class ContextPoolRenderingEngine extends BaseRenderingEngine {
|
|
|
20
20
|
private _copyToOnscreenCanvas;
|
|
21
21
|
private _resize;
|
|
22
22
|
private getWidgetRenderers;
|
|
23
|
+
private getViewportRenderPasses;
|
|
23
24
|
getRenderer(viewportId: string): vtkRenderer | undefined;
|
|
24
25
|
disableElement(viewportId: string): void;
|
|
25
26
|
destroy(): void;
|
|
@@ -200,6 +200,12 @@ class ContextPoolRenderingEngine extends BaseRenderingEngine {
|
|
|
200
200
|
});
|
|
201
201
|
}
|
|
202
202
|
const renderWindow = offscreenMultiRenderWindow.getRenderWindow();
|
|
203
|
+
const view = renderWindow.getViews()[0];
|
|
204
|
+
const originalRenderPasses = view.getRenderPasses();
|
|
205
|
+
const viewportRenderPasses = this.getViewportRenderPasses(viewport.id);
|
|
206
|
+
if (viewportRenderPasses) {
|
|
207
|
+
view.setRenderPasses(viewportRenderPasses);
|
|
208
|
+
}
|
|
203
209
|
this._resizeOffScreenCanvasForViewport(viewport, offScreenCanvasContainer, offscreenMultiRenderWindow);
|
|
204
210
|
const renderer = offscreenMultiRenderWindow.getRenderer(viewport.id);
|
|
205
211
|
const contextIndex = this.contextPool.getContextIndexForViewport(viewport.id);
|
|
@@ -222,6 +228,9 @@ class ContextPoolRenderingEngine extends BaseRenderingEngine {
|
|
|
222
228
|
widgetRenderers.forEach((_, renderer) => {
|
|
223
229
|
renderer.setDraw(false);
|
|
224
230
|
});
|
|
231
|
+
if (originalRenderPasses) {
|
|
232
|
+
view.setRenderPasses(originalRenderPasses);
|
|
233
|
+
}
|
|
225
234
|
const openGLRenderWindow = offscreenMultiRenderWindow.getOpenGLRenderWindow();
|
|
226
235
|
const context = openGLRenderWindow.get3DContext();
|
|
227
236
|
const offScreenCanvas = context.canvas;
|
|
@@ -310,6 +319,10 @@ class ContextPoolRenderingEngine extends BaseRenderingEngine {
|
|
|
310
319
|
});
|
|
311
320
|
return widgetRenderers;
|
|
312
321
|
}
|
|
322
|
+
getViewportRenderPasses(viewportId) {
|
|
323
|
+
const viewport = this.getViewport(viewportId);
|
|
324
|
+
return viewport?.getRenderPasses ? viewport.getRenderPasses() : null;
|
|
325
|
+
}
|
|
313
326
|
getRenderer(viewportId) {
|
|
314
327
|
const contextIndex = this.contextPool?.getContextIndexForViewport(viewportId);
|
|
315
328
|
const contextData = this.contextPool.getContextByIndex(contextIndex);
|
|
@@ -27,6 +27,7 @@ declare class StackViewport extends Viewport {
|
|
|
27
27
|
private colormap;
|
|
28
28
|
private voiRange;
|
|
29
29
|
private voiUpdatedWithSetProperties;
|
|
30
|
+
private sharpening;
|
|
30
31
|
private VOILUTFunction;
|
|
31
32
|
private invert;
|
|
32
33
|
private initialInvert;
|
|
@@ -76,6 +77,9 @@ declare class StackViewport extends Viewport {
|
|
|
76
77
|
protected setInterpolationType: (interpolationType: InterpolationType) => void;
|
|
77
78
|
private setInvertColor;
|
|
78
79
|
private setColormap;
|
|
80
|
+
private setSharpening;
|
|
81
|
+
protected shouldUseCustomRenderPass(): boolean;
|
|
82
|
+
getRenderPasses: () => any[];
|
|
79
83
|
private initializeElementDisabledHandler;
|
|
80
84
|
resize: () => void;
|
|
81
85
|
private _resizeCPU;
|
|
@@ -88,7 +92,7 @@ declare class StackViewport extends Viewport {
|
|
|
88
92
|
private calibrateIfNecessary;
|
|
89
93
|
setDefaultProperties(ViewportProperties: StackViewportProperties, imageId?: string): void;
|
|
90
94
|
clearDefaultProperties(imageId?: string): void;
|
|
91
|
-
setProperties({ colormap, voiRange, VOILUTFunction, invert, interpolationType, }?: StackViewportProperties, suppressEvents?: boolean): void;
|
|
95
|
+
setProperties({ colormap, voiRange, VOILUTFunction, invert, interpolationType, sharpening, }?: StackViewportProperties, suppressEvents?: boolean): void;
|
|
92
96
|
getDefaultProperties: (imageId?: string) => StackViewportProperties;
|
|
93
97
|
getProperties: () => StackViewportProperties;
|
|
94
98
|
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
|
-
|
|
47
|
+
import { createSharpeningRenderPass } from './renderPasses';
|
|
48
48
|
const log = coreLog.getLogger('RenderingEngine', 'StackViewport');
|
|
49
49
|
class StackViewport extends Viewport {
|
|
50
50
|
constructor(props) {
|
|
@@ -57,6 +57,7 @@ class StackViewport extends Viewport {
|
|
|
57
57
|
this.globalDefaultProperties = {};
|
|
58
58
|
this.perImageIdDefaultProperties = new Map();
|
|
59
59
|
this.voiUpdatedWithSetProperties = false;
|
|
60
|
+
this.sharpening = 0;
|
|
60
61
|
this.invert = false;
|
|
61
62
|
this.initialInvert = false;
|
|
62
63
|
this.initialTransferFunctionNodes = null;
|
|
@@ -65,6 +66,22 @@ class StackViewport extends Viewport {
|
|
|
65
66
|
this.updateRenderingPipeline = () => {
|
|
66
67
|
this._configureRenderingPipeline();
|
|
67
68
|
};
|
|
69
|
+
this.setSharpening = (sharpening) => {
|
|
70
|
+
this.sharpening = sharpening;
|
|
71
|
+
this.render();
|
|
72
|
+
};
|
|
73
|
+
this.getRenderPasses = () => {
|
|
74
|
+
if (!this.shouldUseCustomRenderPass()) {
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
try {
|
|
78
|
+
return [createSharpeningRenderPass(this.sharpening)];
|
|
79
|
+
}
|
|
80
|
+
catch (e) {
|
|
81
|
+
console.warn('Failed to create sharpening render passes:', e);
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
};
|
|
68
85
|
this.resize = () => {
|
|
69
86
|
if (this.useCPURendering) {
|
|
70
87
|
this._resizeCPU();
|
|
@@ -115,6 +132,7 @@ class StackViewport extends Viewport {
|
|
|
115
132
|
interpolationType,
|
|
116
133
|
invert,
|
|
117
134
|
isComputedVOI: !voiUpdatedWithSetProperties,
|
|
135
|
+
sharpening: this.sharpening,
|
|
118
136
|
};
|
|
119
137
|
};
|
|
120
138
|
this.resetCameraForResize = () => {
|
|
@@ -516,6 +534,9 @@ class StackViewport extends Viewport {
|
|
|
516
534
|
camera.setThicknessFromFocalPoint(0.1);
|
|
517
535
|
camera.setFreezeFocalPoint(true);
|
|
518
536
|
}
|
|
537
|
+
shouldUseCustomRenderPass() {
|
|
538
|
+
return this.sharpening > 0 && !this.useCPURendering;
|
|
539
|
+
}
|
|
519
540
|
initializeElementDisabledHandler() {
|
|
520
541
|
eventTarget.addEventListener(Events.ELEMENT_DISABLED, function elementDisabledHandler() {
|
|
521
542
|
clearTimeout(this.debouncedTimeout);
|
|
@@ -637,7 +658,7 @@ class StackViewport extends Viewport {
|
|
|
637
658
|
this.resetToDefaultProperties();
|
|
638
659
|
}
|
|
639
660
|
}
|
|
640
|
-
setProperties({ colormap, voiRange, VOILUTFunction, invert, interpolationType, } = {}, suppressEvents = false) {
|
|
661
|
+
setProperties({ colormap, voiRange, VOILUTFunction, invert, interpolationType, sharpening, } = {}, suppressEvents = false) {
|
|
641
662
|
this.viewportStatus = this.csImage
|
|
642
663
|
? ViewportStatus.PRE_RENDER
|
|
643
664
|
: ViewportStatus.LOADING;
|
|
@@ -647,6 +668,7 @@ class StackViewport extends Viewport {
|
|
|
647
668
|
VOILUTFunction: this.globalDefaultProperties.VOILUTFunction ?? VOILUTFunction,
|
|
648
669
|
invert: this.globalDefaultProperties.invert ?? invert,
|
|
649
670
|
interpolationType: this.globalDefaultProperties.interpolationType ?? interpolationType,
|
|
671
|
+
sharpening: this.globalDefaultProperties.sharpening ?? sharpening,
|
|
650
672
|
};
|
|
651
673
|
if (typeof colormap !== 'undefined') {
|
|
652
674
|
this.setColormap(colormap);
|
|
@@ -664,6 +686,9 @@ class StackViewport extends Viewport {
|
|
|
664
686
|
if (typeof interpolationType !== 'undefined') {
|
|
665
687
|
this.setInterpolationType(interpolationType);
|
|
666
688
|
}
|
|
689
|
+
if (typeof sharpening !== 'undefined') {
|
|
690
|
+
this.setSharpening(sharpening);
|
|
691
|
+
}
|
|
667
692
|
}
|
|
668
693
|
resetProperties() {
|
|
669
694
|
this.cpuRenderingInvalidated = true;
|
|
@@ -1460,7 +1485,7 @@ class StackViewport extends Viewport {
|
|
|
1460
1485
|
renderingEngineId: this.renderingEngineId,
|
|
1461
1486
|
};
|
|
1462
1487
|
triggerEvent(this.element, Events.PRE_STACK_NEW_IMAGE, eventDetail);
|
|
1463
|
-
return this.imagesLoader.loadImages([imageId], this).then((
|
|
1488
|
+
return this.imagesLoader.loadImages([imageId], this).then(() => {
|
|
1464
1489
|
return imageId;
|
|
1465
1490
|
});
|
|
1466
1491
|
}
|
|
@@ -1784,7 +1809,7 @@ class StackViewport extends Viewport {
|
|
|
1784
1809
|
return true;
|
|
1785
1810
|
}
|
|
1786
1811
|
viewRef.referencedImageURI ||= imageIdToURI(referencedImageId);
|
|
1787
|
-
const { referencedImageURI
|
|
1812
|
+
const { referencedImageURI } = viewRef;
|
|
1788
1813
|
const foundSliceIndex = this.imageKeyToIndexMap.get(referencedImageURI);
|
|
1789
1814
|
if (options.asOverlay) {
|
|
1790
1815
|
const matchedImageId = this.matchImagesForOverlay(currentImageId, referencedImageId);
|
|
@@ -1851,7 +1876,7 @@ class StackViewport extends Viewport {
|
|
|
1851
1876
|
}
|
|
1852
1877
|
const { referencedImageId } = viewRef;
|
|
1853
1878
|
viewRef.referencedImageURI ||= imageIdToURI(referencedImageId);
|
|
1854
|
-
const { referencedImageURI
|
|
1879
|
+
const { referencedImageURI } = viewRef;
|
|
1855
1880
|
const sliceIndex = this.imageKeyToIndexMap.get(referencedImageURI);
|
|
1856
1881
|
if (sliceIndex === undefined) {
|
|
1857
1882
|
log.error(`No image URI found for ${referencedImageURI}`);
|
|
@@ -51,6 +51,7 @@ declare class Viewport {
|
|
|
51
51
|
addWidget: (widgetId: any, widget: any) => void;
|
|
52
52
|
getWidget: (id: any) => any;
|
|
53
53
|
getWidgets: () => any[];
|
|
54
|
+
getRenderPasses: () => any;
|
|
54
55
|
removeWidgets: () => void;
|
|
55
56
|
setRendered(): void;
|
|
56
57
|
protected setColorTransform(voiRange: any, averageWhite: any): any;
|
|
@@ -50,6 +50,9 @@ class Viewport {
|
|
|
50
50
|
this.getWidgets = () => {
|
|
51
51
|
return Array.from(this.viewportWidgets.values());
|
|
52
52
|
};
|
|
53
|
+
this.getRenderPasses = () => {
|
|
54
|
+
return null;
|
|
55
|
+
};
|
|
53
56
|
this.removeWidgets = () => {
|
|
54
57
|
const widgets = this.getWidgets();
|
|
55
58
|
widgets.forEach((widget) => {
|
|
@@ -61,6 +61,9 @@ function getVOIFromMetadata(imageVolume) {
|
|
|
61
61
|
}
|
|
62
62
|
if (voi && (voi.windowWidth !== 0 || voi.windowCenter !== 0)) {
|
|
63
63
|
const { lower, upper } = windowLevel.toLowHighRange(Number(voi.windowWidth), Number(voi.windowCenter), voi.voiLUTFunction);
|
|
64
|
+
if (isNaN(lower) || isNaN(upper)) {
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
64
67
|
return { lower, upper };
|
|
65
68
|
}
|
|
66
69
|
return undefined;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import vtkConvolution2DPass from '@kitware/vtk.js/Rendering/OpenGL/Convolution2DPass';
|
|
2
|
+
import vtkForwardPass from '@kitware/vtk.js/Rendering/OpenGL/ForwardPass';
|
|
3
|
+
function createSharpeningRenderPass(intensity) {
|
|
4
|
+
let renderPass = vtkForwardPass.newInstance();
|
|
5
|
+
if (intensity > 0) {
|
|
6
|
+
const convolutionPass = vtkConvolution2DPass.newInstance();
|
|
7
|
+
convolutionPass.setDelegates([renderPass]);
|
|
8
|
+
const k = Math.max(0, intensity);
|
|
9
|
+
convolutionPass.setKernelDimension(3);
|
|
10
|
+
convolutionPass.setKernel([-k, -k, -k, -k, 1 + 8 * k, -k, -k, -k, -k]);
|
|
11
|
+
renderPass = convolutionPass;
|
|
12
|
+
}
|
|
13
|
+
return renderPass;
|
|
14
|
+
}
|
|
15
|
+
export { createSharpeningRenderPass };
|
package/dist/esm/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const version = "4.
|
|
1
|
+
export declare const version = "4.3.1";
|
package/dist/esm/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const version = '4.
|
|
1
|
+
export const version = '4.3.1';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cornerstonejs/core",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.3.1",
|
|
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": "
|
|
100
|
+
"gitHead": "226edf69370e349c570fc609811c3721258bcf44"
|
|
101
101
|
}
|