@cornerstonejs/core 3.17.0 → 3.18.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.
- package/dist/esm/RenderingEngine/VideoViewport.d.ts +0 -1
- package/dist/esm/RenderingEngine/VideoViewport.js +8 -27
- package/dist/esm/RenderingEngine/Viewport.d.ts +1 -0
- package/dist/esm/RenderingEngine/Viewport.js +24 -0
- package/dist/esm/RenderingEngine/WSIViewport.d.ts +5 -1
- package/dist/esm/RenderingEngine/WSIViewport.js +26 -12
- package/dist/esm/utilities/index.d.ts +2 -2
- package/dist/esm/utilities/index.js +2 -2
- package/dist/esm/utilities/isEqual.d.ts +2 -1
- package/dist/esm/utilities/isEqual.js +7 -1
- package/dist/esm/version.d.ts +1 -1
- package/dist/esm/version.js +1 -1
- package/package.json +2 -2
|
@@ -87,7 +87,6 @@ declare class VideoViewport extends Viewport {
|
|
|
87
87
|
setVOI(voiRange: VOIRange): void;
|
|
88
88
|
setWindowLevel(windowWidth?: number, windowCenter?: number): void;
|
|
89
89
|
setAverageWhite(averageWhite: [number, number, number]): void;
|
|
90
|
-
protected setColorTransform(): void;
|
|
91
90
|
setCamera(camera: ICamera): void;
|
|
92
91
|
getCurrentImageId(index?: number): string;
|
|
93
92
|
getViewReferenceId(specifier?: ViewReferenceSpecifier): string;
|
|
@@ -438,6 +438,10 @@ class VideoViewport extends Viewport {
|
|
|
438
438
|
this.setProperties({
|
|
439
439
|
loop: false,
|
|
440
440
|
muted: true,
|
|
441
|
+
voiRange: {
|
|
442
|
+
lower: 0,
|
|
443
|
+
upper: 255,
|
|
444
|
+
},
|
|
441
445
|
});
|
|
442
446
|
}
|
|
443
447
|
getScalarData() {
|
|
@@ -527,41 +531,18 @@ class VideoViewport extends Viewport {
|
|
|
527
531
|
}
|
|
528
532
|
setVOI(voiRange) {
|
|
529
533
|
this.voiRange = voiRange;
|
|
530
|
-
this.setColorTransform();
|
|
534
|
+
const feFilter = this.setColorTransform(voiRange, this.averageWhite);
|
|
535
|
+
this.canvas.style.filter = feFilter;
|
|
531
536
|
}
|
|
532
537
|
setWindowLevel(windowWidth = 256, windowCenter = 128) {
|
|
533
538
|
const lower = windowCenter - windowWidth / 2;
|
|
534
539
|
const upper = windowCenter + windowWidth / 2 - 1;
|
|
535
540
|
this.setVOI({ lower, upper });
|
|
536
|
-
this.setColorTransform();
|
|
541
|
+
this.setColorTransform({ lower, upper }, this.averageWhite);
|
|
537
542
|
}
|
|
538
543
|
setAverageWhite(averageWhite) {
|
|
539
544
|
this.averageWhite = averageWhite;
|
|
540
|
-
this.setColorTransform();
|
|
541
|
-
}
|
|
542
|
-
setColorTransform() {
|
|
543
|
-
if (!this.voiRange && !this.averageWhite) {
|
|
544
|
-
this.feFilter = null;
|
|
545
|
-
return;
|
|
546
|
-
}
|
|
547
|
-
const white = this.averageWhite || [255, 255, 255];
|
|
548
|
-
const maxWhite = Math.max(...white);
|
|
549
|
-
const scaleWhite = white.map((c) => maxWhite / c);
|
|
550
|
-
const { lower = 0, upper = 255 } = this.voiRange || {};
|
|
551
|
-
const wlScale = (upper - lower + 1) / 255;
|
|
552
|
-
const wlDelta = lower / 255;
|
|
553
|
-
this.feFilter = `url('data:image/svg+xml,\
|
|
554
|
-
<svg xmlns="http://www.w3.org/2000/svg">\
|
|
555
|
-
<filter id="colour" color-interpolation-filters="linearRGB">\
|
|
556
|
-
<feColorMatrix type="matrix" \
|
|
557
|
-
values="\
|
|
558
|
-
${scaleWhite[0] * wlScale} 0 0 0 ${wlDelta} \
|
|
559
|
-
0 ${scaleWhite[1] * wlScale} 0 0 ${wlDelta} \
|
|
560
|
-
0 0 ${scaleWhite[2] * wlScale} 0 ${wlDelta} \
|
|
561
|
-
0 0 0 1 0" />\
|
|
562
|
-
</filter>\
|
|
563
|
-
</svg>#colour')`;
|
|
564
|
-
this.canvas.style.filter = this.feFilter;
|
|
545
|
+
this.setColorTransform(this.voiRange, averageWhite);
|
|
565
546
|
}
|
|
566
547
|
setCamera(camera) {
|
|
567
548
|
const { parallelScale, focalPoint } = camera;
|
|
@@ -53,6 +53,7 @@ declare class Viewport {
|
|
|
53
53
|
getWidgets: () => any[];
|
|
54
54
|
removeWidgets: () => void;
|
|
55
55
|
setRendered(): void;
|
|
56
|
+
protected setColorTransform(voiRange: any, averageWhite: any): any;
|
|
56
57
|
getRenderingEngine(): IRenderingEngine;
|
|
57
58
|
getRenderer(): vtkRenderer;
|
|
58
59
|
render(): void;
|
|
@@ -89,6 +89,30 @@ class Viewport {
|
|
|
89
89
|
}
|
|
90
90
|
this.viewportStatus = ViewportStatus.RENDERED;
|
|
91
91
|
}
|
|
92
|
+
setColorTransform(voiRange, averageWhite) {
|
|
93
|
+
let feFilter = null;
|
|
94
|
+
if (!voiRange && !averageWhite) {
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
const white = averageWhite || [255, 255, 255];
|
|
98
|
+
const maxWhite = Math.max(...white);
|
|
99
|
+
const scaleWhite = white.map((c) => maxWhite / c);
|
|
100
|
+
const { lower = 0, upper = 255 } = voiRange || {};
|
|
101
|
+
const wlScale = (upper - lower + 1) / 255;
|
|
102
|
+
const wlDelta = lower / 255;
|
|
103
|
+
feFilter = `url('data:image/svg+xml,\
|
|
104
|
+
<svg xmlns="http://www.w3.org/2000/svg">\
|
|
105
|
+
<filter id="colour" color-interpolation-filters="linearRGB">\
|
|
106
|
+
<feColorMatrix type="matrix" \
|
|
107
|
+
values="\
|
|
108
|
+
${scaleWhite[0] * wlScale} 0 0 0 ${wlDelta} \
|
|
109
|
+
0 ${scaleWhite[1] * wlScale} 0 0 ${wlDelta} \
|
|
110
|
+
0 0 ${scaleWhite[2] * wlScale} 0 ${wlDelta} \
|
|
111
|
+
0 0 0 1 0" />\
|
|
112
|
+
</filter>\
|
|
113
|
+
</svg>#colour')`;
|
|
114
|
+
return feFilter;
|
|
115
|
+
}
|
|
92
116
|
getRenderingEngine() {
|
|
93
117
|
return renderingEngineCache.get(this.renderingEngineId);
|
|
94
118
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { mat4 } from 'gl-matrix';
|
|
2
|
-
import type { WSIViewportProperties, Point3, Point2, ICamera, CPUIImageData, ViewportInput } from '../types';
|
|
2
|
+
import type { WSIViewportProperties, Point3, Point2, ICamera, VOIRange, CPUIImageData, ViewportInput } from '../types';
|
|
3
3
|
import { Transform } from './helpers/cpuFallback/rendering/transform';
|
|
4
4
|
import Viewport from './Viewport';
|
|
5
5
|
import type { DataSetOptions } from '../types/IViewport';
|
|
@@ -16,6 +16,8 @@ declare class WSIViewport extends Viewport {
|
|
|
16
16
|
private internalCamera;
|
|
17
17
|
private viewer;
|
|
18
18
|
private voiRange;
|
|
19
|
+
private feFilter;
|
|
20
|
+
private averageWhite;
|
|
19
21
|
constructor(props: ViewportInput);
|
|
20
22
|
static get useCustomRenderingPipeline(): boolean;
|
|
21
23
|
private addEventListeners;
|
|
@@ -26,6 +28,8 @@ declare class WSIViewport extends Viewport {
|
|
|
26
28
|
setProperties(props: WSIViewportProperties): void;
|
|
27
29
|
getProperties: () => WSIViewportProperties;
|
|
28
30
|
resetProperties(): void;
|
|
31
|
+
setVOI(voiRange: VOIRange): void;
|
|
32
|
+
setAverageWhite(averageWhite: [number, number, number]): void;
|
|
29
33
|
protected getScalarData(): any;
|
|
30
34
|
computeTransforms(): {
|
|
31
35
|
indexToWorld: mat4;
|
|
@@ -34,7 +34,9 @@ class WSIViewport extends Viewport {
|
|
|
34
34
|
upper: 255,
|
|
35
35
|
};
|
|
36
36
|
this.getProperties = () => {
|
|
37
|
-
return {
|
|
37
|
+
return {
|
|
38
|
+
voiRange: { ...this.voiRange },
|
|
39
|
+
};
|
|
38
40
|
};
|
|
39
41
|
this.resetCamera = () => {
|
|
40
42
|
return true;
|
|
@@ -184,9 +186,31 @@ class WSIViewport extends Viewport {
|
|
|
184
186
|
async setFrameNumber(frame) {
|
|
185
187
|
}
|
|
186
188
|
setProperties(props) {
|
|
189
|
+
if (props.voiRange) {
|
|
190
|
+
this.setVOI(props.voiRange);
|
|
191
|
+
}
|
|
187
192
|
}
|
|
188
193
|
resetProperties() {
|
|
189
|
-
this.setProperties({
|
|
194
|
+
this.setProperties({
|
|
195
|
+
voiRange: {
|
|
196
|
+
lower: 0,
|
|
197
|
+
upper: 255,
|
|
198
|
+
},
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
setVOI(voiRange) {
|
|
202
|
+
this.voiRange = voiRange;
|
|
203
|
+
const feFilter = this.setColorTransform(voiRange, this.averageWhite);
|
|
204
|
+
const olCanvases = this.map
|
|
205
|
+
.getViewport()
|
|
206
|
+
.querySelectorAll('.ol-layers canvas');
|
|
207
|
+
olCanvases.forEach((canvas) => {
|
|
208
|
+
canvas.style.filter = feFilter;
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
setAverageWhite(averageWhite) {
|
|
212
|
+
this.averageWhite = averageWhite;
|
|
213
|
+
this.setColorTransform(this.voiRange, averageWhite);
|
|
190
214
|
}
|
|
191
215
|
getScalarData() {
|
|
192
216
|
return null;
|
|
@@ -244,16 +268,6 @@ class WSIViewport extends Viewport {
|
|
|
244
268
|
},
|
|
245
269
|
scalarData: this.getScalarData(),
|
|
246
270
|
imageData,
|
|
247
|
-
voxelManager: {
|
|
248
|
-
forEach: (callback, options) => {
|
|
249
|
-
return pointInShapeCallback(options.imageData, {
|
|
250
|
-
pointInShapeFn: options.isInObject ?? (() => true),
|
|
251
|
-
callback: callback,
|
|
252
|
-
boundsIJK: options.boundsIJK,
|
|
253
|
-
returnPoints: options.returnPoints ?? false,
|
|
254
|
-
});
|
|
255
|
-
},
|
|
256
|
-
},
|
|
257
271
|
};
|
|
258
272
|
return imageDataReturn;
|
|
259
273
|
}
|
|
@@ -11,7 +11,6 @@ import getRuntimeId from './getRuntimeId';
|
|
|
11
11
|
import imageIdToURI from './imageIdToURI';
|
|
12
12
|
import calibratedPixelSpacingMetadataProvider from './calibratedPixelSpacingMetadataProvider';
|
|
13
13
|
import clamp from './clamp';
|
|
14
|
-
import { isEqual, isEqualAbs, isEqualNegative } from './isEqual';
|
|
15
14
|
import isOpposite from './isOpposite';
|
|
16
15
|
import getClosestImageId from './getClosestImageId';
|
|
17
16
|
import getSpacingInNormalDirection from './getSpacingInNormalDirection';
|
|
@@ -95,4 +94,5 @@ export * as logger from './logger';
|
|
|
95
94
|
import { calculateNeighborhoodStats } from './calculateNeighborhoodStats';
|
|
96
95
|
import getPixelSpacingInformation from './getPixelSpacingInformation';
|
|
97
96
|
declare const getViewportModality: (viewport: IViewport, volumeId?: string) => string;
|
|
98
|
-
export
|
|
97
|
+
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, };
|
|
@@ -11,7 +11,6 @@ import getRuntimeId from './getRuntimeId';
|
|
|
11
11
|
import imageIdToURI from './imageIdToURI';
|
|
12
12
|
import calibratedPixelSpacingMetadataProvider from './calibratedPixelSpacingMetadataProvider';
|
|
13
13
|
import clamp from './clamp';
|
|
14
|
-
import { isEqual, isEqualAbs, isEqualNegative } from './isEqual';
|
|
15
14
|
import isOpposite from './isOpposite';
|
|
16
15
|
import getClosestImageId from './getClosestImageId';
|
|
17
16
|
import getSpacingInNormalDirection from './getSpacingInNormalDirection';
|
|
@@ -96,4 +95,5 @@ export * as logger from './logger';
|
|
|
96
95
|
import { calculateNeighborhoodStats } from './calculateNeighborhoodStats';
|
|
97
96
|
import getPixelSpacingInformation from './getPixelSpacingInformation';
|
|
98
97
|
const getViewportModality = (viewport, volumeId) => _getViewportModality(viewport, volumeId, cache.getVolume);
|
|
99
|
-
export
|
|
98
|
+
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, };
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export default function isEqual<ValueType>(v1: ValueType, v2: ValueType, tolerance?: number): boolean;
|
|
2
2
|
declare const isEqualNegative: <ValueType>(v1: ValueType, v2: ValueType, tolerance?: any) => boolean;
|
|
3
3
|
declare const isEqualAbs: <ValueType>(v1: ValueType, v2: ValueType, tolerance?: any) => boolean;
|
|
4
|
-
|
|
4
|
+
declare function isNumber(n: number[] | number): boolean;
|
|
5
|
+
export { isEqualNegative, isEqual, isEqualAbs, isNumber };
|
|
@@ -39,4 +39,10 @@ const negative = (v) => typeof v === 'number' ? -v : v?.map ? v.map(negative) :
|
|
|
39
39
|
const abs = (v) => typeof v === 'number' ? Math.abs(v) : v?.map ? v.map(abs) : v;
|
|
40
40
|
const isEqualNegative = (v1, v2, tolerance = undefined) => isEqual(v1, negative(v2), tolerance);
|
|
41
41
|
const isEqualAbs = (v1, v2, tolerance = undefined) => isEqual(abs(v1), abs(v2), tolerance);
|
|
42
|
-
|
|
42
|
+
function isNumber(n) {
|
|
43
|
+
if (Array.isArray(n)) {
|
|
44
|
+
return isNumber(n[0]);
|
|
45
|
+
}
|
|
46
|
+
return isFinite(n) && !isNaN(n);
|
|
47
|
+
}
|
|
48
|
+
export { isEqualNegative, isEqual, isEqualAbs, isNumber };
|
package/dist/esm/version.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const version = "3.
|
|
1
|
+
export declare const version = "3.18.0";
|
package/dist/esm/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const version = '3.
|
|
1
|
+
export const version = '3.18.0';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cornerstonejs/core",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.18.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": "
|
|
100
|
+
"gitHead": "409f2bb8fe3755f4451f884c85ddf29c7a03749c"
|
|
101
101
|
}
|