@cornerstonejs/core 0.36.3 → 0.36.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.
- package/dist/cjs/utilities/getSliceRange.js +2 -1
- package/dist/cjs/utilities/getSliceRange.js.map +1 -1
- package/dist/esm/utilities/getSliceRange.js +2 -1
- package/dist/esm/utilities/getSliceRange.js.map +1 -1
- package/dist/umd/index.js +1 -1
- package/dist/umd/index.js.map +1 -1
- package/package.json +4 -3
- package/src/RenderingEngine/BaseVolumeViewport.ts +847 -0
- package/src/RenderingEngine/RenderingEngine.ts +1364 -0
- package/src/RenderingEngine/StackViewport.ts +2690 -0
- package/src/RenderingEngine/Viewport.ts +1244 -0
- package/src/RenderingEngine/VolumeViewport.ts +420 -0
- package/src/RenderingEngine/VolumeViewport3D.ts +42 -0
- package/src/RenderingEngine/getRenderingEngine.ts +34 -0
- package/src/RenderingEngine/helpers/addVolumesToViewports.ts +52 -0
- package/src/RenderingEngine/helpers/cpuFallback/colors/colormap.ts +343 -0
- package/src/RenderingEngine/helpers/cpuFallback/colors/index.ts +4 -0
- package/src/RenderingEngine/helpers/cpuFallback/colors/lookupTable.ts +469 -0
- package/src/RenderingEngine/helpers/cpuFallback/drawImageSync.ts +58 -0
- package/src/RenderingEngine/helpers/cpuFallback/rendering/calculateTransform.ts +136 -0
- package/src/RenderingEngine/helpers/cpuFallback/rendering/canvasToPixel.ts +25 -0
- package/src/RenderingEngine/helpers/cpuFallback/rendering/computeAutoVoi.ts +47 -0
- package/src/RenderingEngine/helpers/cpuFallback/rendering/correctShift.ts +38 -0
- package/src/RenderingEngine/helpers/cpuFallback/rendering/createViewport.ts +64 -0
- package/src/RenderingEngine/helpers/cpuFallback/rendering/doesImageNeedToBeRendered.ts +36 -0
- package/src/RenderingEngine/helpers/cpuFallback/rendering/fitToWindow.ts +22 -0
- package/src/RenderingEngine/helpers/cpuFallback/rendering/generateColorLUT.ts +60 -0
- package/src/RenderingEngine/helpers/cpuFallback/rendering/generateLut.ts +83 -0
- package/src/RenderingEngine/helpers/cpuFallback/rendering/getDefaultViewport.ts +88 -0
- package/src/RenderingEngine/helpers/cpuFallback/rendering/getImageFitScale.ts +52 -0
- package/src/RenderingEngine/helpers/cpuFallback/rendering/getImageSize.ts +55 -0
- package/src/RenderingEngine/helpers/cpuFallback/rendering/getLut.ts +53 -0
- package/src/RenderingEngine/helpers/cpuFallback/rendering/getModalityLut.ts +55 -0
- package/src/RenderingEngine/helpers/cpuFallback/rendering/getTransform.ts +17 -0
- package/src/RenderingEngine/helpers/cpuFallback/rendering/getVOILut.ts +74 -0
- package/src/RenderingEngine/helpers/cpuFallback/rendering/initializeRenderCanvas.ts +37 -0
- package/src/RenderingEngine/helpers/cpuFallback/rendering/lutMatches.ts +21 -0
- package/src/RenderingEngine/helpers/cpuFallback/rendering/now.ts +13 -0
- package/src/RenderingEngine/helpers/cpuFallback/rendering/pixelToCanvas.ts +22 -0
- package/src/RenderingEngine/helpers/cpuFallback/rendering/renderColorImage.ts +193 -0
- package/src/RenderingEngine/helpers/cpuFallback/rendering/renderGrayscaleImage.ts +166 -0
- package/src/RenderingEngine/helpers/cpuFallback/rendering/renderPseudoColorImage.ts +203 -0
- package/src/RenderingEngine/helpers/cpuFallback/rendering/resetCamera.ts +32 -0
- package/src/RenderingEngine/helpers/cpuFallback/rendering/resize.ts +109 -0
- package/src/RenderingEngine/helpers/cpuFallback/rendering/saveLastRendered.ts +36 -0
- package/src/RenderingEngine/helpers/cpuFallback/rendering/setDefaultViewport.ts +17 -0
- package/src/RenderingEngine/helpers/cpuFallback/rendering/setToPixelCoordinateSystem.ts +32 -0
- package/src/RenderingEngine/helpers/cpuFallback/rendering/storedColorPixelDataToCanvasImageData.ts +58 -0
- package/src/RenderingEngine/helpers/cpuFallback/rendering/storedPixelDataToCanvasImageData.ts +76 -0
- package/src/RenderingEngine/helpers/cpuFallback/rendering/storedPixelDataToCanvasImageDataColorLUT.ts +60 -0
- package/src/RenderingEngine/helpers/cpuFallback/rendering/storedPixelDataToCanvasImageDataPET.ts +50 -0
- package/src/RenderingEngine/helpers/cpuFallback/rendering/storedPixelDataToCanvasImageDataPseudocolorLUT.ts +66 -0
- package/src/RenderingEngine/helpers/cpuFallback/rendering/storedPixelDataToCanvasImageDataPseudocolorLUTPET.ts +68 -0
- package/src/RenderingEngine/helpers/cpuFallback/rendering/storedPixelDataToCanvasImageDataRGBA.ts +81 -0
- package/src/RenderingEngine/helpers/cpuFallback/rendering/storedRGBAPixelDataToCanvasImageData.ts +56 -0
- package/src/RenderingEngine/helpers/cpuFallback/rendering/transform.ts +126 -0
- package/src/RenderingEngine/helpers/cpuFallback/rendering/validator.ts +31 -0
- package/src/RenderingEngine/helpers/createVolumeActor.ts +103 -0
- package/src/RenderingEngine/helpers/createVolumeMapper.ts +37 -0
- package/src/RenderingEngine/helpers/getOrCreateCanvas.ts +58 -0
- package/src/RenderingEngine/helpers/index.ts +15 -0
- package/src/RenderingEngine/helpers/isRgbaSourceRgbDest.ts +1 -0
- package/src/RenderingEngine/helpers/setDefaultVolumeVOI.ts +227 -0
- package/src/RenderingEngine/helpers/setVolumesForViewports.ts +52 -0
- package/src/RenderingEngine/helpers/viewportTypeToViewportClass.ts +14 -0
- package/src/RenderingEngine/helpers/viewportTypeUsesCustomRenderingPipeline.ts +7 -0
- package/src/RenderingEngine/helpers/volumeNewImageEventDispatcher.ts +75 -0
- package/src/RenderingEngine/index.ts +23 -0
- package/src/RenderingEngine/renderingEngineCache.ts +43 -0
- package/src/RenderingEngine/vtkClasses/index.js +11 -0
- package/src/RenderingEngine/vtkClasses/vtkOffscreenMultiRenderWindow.js +149 -0
- package/src/RenderingEngine/vtkClasses/vtkSharedVolumeMapper.js +52 -0
- package/src/RenderingEngine/vtkClasses/vtkSlabCamera.d.ts +781 -0
- package/src/RenderingEngine/vtkClasses/vtkSlabCamera.js +155 -0
- package/src/RenderingEngine/vtkClasses/vtkStreamingOpenGLRenderWindow.js +47 -0
- package/src/RenderingEngine/vtkClasses/vtkStreamingOpenGLTexture.js +272 -0
- package/src/RenderingEngine/vtkClasses/vtkStreamingOpenGLViewNodeFactory.js +159 -0
- package/src/RenderingEngine/vtkClasses/vtkStreamingOpenGLVolumeMapper.js +319 -0
- package/src/Settings.ts +294 -0
- package/src/cache/cache.ts +854 -0
- package/src/cache/classes/Contour.ts +70 -0
- package/src/cache/classes/ContourSet.ts +151 -0
- package/src/cache/classes/ImageVolume.ts +155 -0
- package/src/cache/index.ts +5 -0
- package/src/constants/cpuColormaps.ts +1537 -0
- package/src/constants/epsilon.ts +3 -0
- package/src/constants/index.ts +13 -0
- package/src/constants/mprCameraValues.ts +20 -0
- package/src/constants/rendering.ts +8 -0
- package/src/constants/viewportPresets.ts +357 -0
- package/src/enums/BlendModes.ts +23 -0
- package/src/enums/ContourType.ts +6 -0
- package/src/enums/Events.ts +196 -0
- package/src/enums/GeometryType.ts +5 -0
- package/src/enums/InterpolationType.ts +13 -0
- package/src/enums/OrientationAxis.ts +8 -0
- package/src/enums/RequestType.ts +13 -0
- package/src/enums/SharedArrayBufferModes.ts +11 -0
- package/src/enums/VOILUTFunctionType.ts +10 -0
- package/src/enums/ViewportType.ts +21 -0
- package/src/enums/index.ts +23 -0
- package/src/eventTarget.ts +67 -0
- package/src/getEnabledElement.ts +105 -0
- package/src/global.ts +8 -0
- package/src/index.ts +123 -0
- package/src/init.ts +247 -0
- package/src/loaders/geometryLoader.ts +108 -0
- package/src/loaders/imageLoader.ts +298 -0
- package/src/loaders/volumeLoader.ts +477 -0
- package/src/metaData.ts +84 -0
- package/src/requestPool/imageLoadPoolManager.ts +43 -0
- package/src/requestPool/imageRetrievalPoolManager.ts +25 -0
- package/src/requestPool/requestPoolManager.ts +329 -0
- package/src/types/ActorSliceRange.ts +17 -0
- package/src/types/CPUFallbackColormap.ts +23 -0
- package/src/types/CPUFallbackColormapData.ts +12 -0
- package/src/types/CPUFallbackColormapsData.ts +7 -0
- package/src/types/CPUFallbackEnabledElement.ts +71 -0
- package/src/types/CPUFallbackLUT.ts +5 -0
- package/src/types/CPUFallbackLookupTable.ts +17 -0
- package/src/types/CPUFallbackRenderingTools.ts +25 -0
- package/src/types/CPUFallbackTransform.ts +16 -0
- package/src/types/CPUFallbackViewport.ts +29 -0
- package/src/types/CPUFallbackViewportDisplayedArea.ts +15 -0
- package/src/types/CPUIImageData.ts +47 -0
- package/src/types/ContourData.ts +19 -0
- package/src/types/Cornerstone3DConfig.ts +31 -0
- package/src/types/CustomEventType.ts +14 -0
- package/src/types/EventTypes.ts +403 -0
- package/src/types/FlipDirection.ts +9 -0
- package/src/types/IActor.ts +23 -0
- package/src/types/ICache.ts +28 -0
- package/src/types/ICachedGeometry.ts +13 -0
- package/src/types/ICachedImage.ts +13 -0
- package/src/types/ICachedVolume.ts +12 -0
- package/src/types/ICamera.ts +36 -0
- package/src/types/IContour.ts +18 -0
- package/src/types/IContourSet.ts +56 -0
- package/src/types/IDynamicImageVolume.ts +18 -0
- package/src/types/IEnabledElement.ts +21 -0
- package/src/types/IGeometry.ts +12 -0
- package/src/types/IImage.ts +113 -0
- package/src/types/IImageData.ts +45 -0
- package/src/types/IImageVolume.ts +78 -0
- package/src/types/ILoadObject.ts +36 -0
- package/src/types/IRegisterImageLoader.ts +10 -0
- package/src/types/IRenderingEngine.ts +28 -0
- package/src/types/IStackViewport.ts +138 -0
- package/src/types/IStreamingImageVolume.ts +13 -0
- package/src/types/IStreamingVolumeProperties.ts +14 -0
- package/src/types/IViewport.ts +149 -0
- package/src/types/IViewportId.ts +9 -0
- package/src/types/IVolume.ts +45 -0
- package/src/types/IVolumeInput.ts +36 -0
- package/src/types/IVolumeViewport.ts +141 -0
- package/src/types/ImageLoaderFn.ts +16 -0
- package/src/types/ImageSliceData.ts +6 -0
- package/src/types/Mat3.ts +16 -0
- package/src/types/Metadata.ts +39 -0
- package/src/types/OrientationVectors.ts +36 -0
- package/src/types/Plane.ts +6 -0
- package/src/types/Point2.ts +6 -0
- package/src/types/Point3.ts +6 -0
- package/src/types/Point4.ts +6 -0
- package/src/types/ScalingParameters.ts +27 -0
- package/src/types/StackViewportProperties.ts +25 -0
- package/src/types/TransformMatrix2D.ts +4 -0
- package/src/types/ViewportInputOptions.ts +21 -0
- package/src/types/ViewportPreset.ts +14 -0
- package/src/types/VolumeLoaderFn.ts +18 -0
- package/src/types/VolumeViewportProperties.ts +14 -0
- package/src/types/index.ts +157 -0
- package/src/types/voi.ts +15 -0
- package/src/utilities/actorCheck.ts +24 -0
- package/src/utilities/applyPreset.ts +132 -0
- package/src/utilities/calculateViewportsSpatialRegistration.ts +74 -0
- package/src/utilities/calibratedPixelSpacingMetadataProvider.ts +38 -0
- package/src/utilities/createFloat32SharedArray.ts +45 -0
- package/src/utilities/createInt16SharedArray.ts +43 -0
- package/src/utilities/createLinearRGBTransferFunction.ts +22 -0
- package/src/utilities/createSigmoidRGBTransferFunction.ts +63 -0
- package/src/utilities/createUInt16SharedArray.ts +43 -0
- package/src/utilities/createUint8SharedArray.ts +45 -0
- package/src/utilities/deepFreeze.ts +19 -0
- package/src/utilities/deepMerge.ts +81 -0
- package/src/utilities/getClosestImageId.ts +80 -0
- package/src/utilities/getClosestStackImageIndexForPoint.ts +116 -0
- package/src/utilities/getImageSliceDataForVolumeViewport.ts +61 -0
- package/src/utilities/getMinMax.ts +31 -0
- package/src/utilities/getRuntimeId.ts +54 -0
- package/src/utilities/getScalarDataType.ts +31 -0
- package/src/utilities/getScalingParameters.ts +35 -0
- package/src/utilities/getSliceRange.ts +86 -0
- package/src/utilities/getSpacingInNormalDirection.ts +44 -0
- package/src/utilities/getTargetVolumeAndSpacingInNormalDir.ts +126 -0
- package/src/utilities/getViewportImageCornersInWorld.ts +102 -0
- package/src/utilities/getViewportsWithImageURI.ts +46 -0
- package/src/utilities/getViewportsWithVolumeId.ts +38 -0
- package/src/utilities/getVoiFromSigmoidRGBTransferFunction.ts +23 -0
- package/src/utilities/getVolumeActorCorners.ts +24 -0
- package/src/utilities/getVolumeSliceRangeInfo.ts +52 -0
- package/src/utilities/getVolumeViewportScrollInfo.ts +32 -0
- package/src/utilities/getVolumeViewportsContainingSameVolumes.ts +58 -0
- package/src/utilities/hasNaNValues.ts +12 -0
- package/src/utilities/imageIdToURI.ts +10 -0
- package/src/utilities/imageToWorldCoords.ts +54 -0
- package/src/utilities/index.ts +100 -0
- package/src/utilities/indexWithinDimensions.ts +27 -0
- package/src/utilities/invertRgbTransferFunction.ts +36 -0
- package/src/utilities/isEqual.ts +27 -0
- package/src/utilities/isOpposite.ts +23 -0
- package/src/utilities/isTypedArray.ts +20 -0
- package/src/utilities/loadImageToCanvas.ts +80 -0
- package/src/utilities/planar.ts +91 -0
- package/src/utilities/renderToCanvas.ts +32 -0
- package/src/utilities/scaleRgbTransferFunction.ts +37 -0
- package/src/utilities/snapFocalPointToSlice.ts +78 -0
- package/src/utilities/spatialRegistrationMetadataProvider.ts +50 -0
- package/src/utilities/transformWorldToIndex.ts +16 -0
- package/src/utilities/triggerEvent.ts +38 -0
- package/src/utilities/uuidv4.ts +13 -0
- package/src/utilities/windowLevel.ts +39 -0
- package/src/utilities/worldToImageCoords.ts +64 -0
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { IImage, CPUFallbackViewport } from '../../../../types';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Computes the VOI to display all the pixels if no VOI LUT data (Window Width/Window Center or voiLUT) exists on the viewport object.
|
|
5
|
+
*
|
|
6
|
+
* @param viewport - Object containing the viewport properties
|
|
7
|
+
* @param image - An Image loaded by a Cornerstone Image Loader
|
|
8
|
+
*/
|
|
9
|
+
export default function computeAutoVoi(
|
|
10
|
+
viewport: CPUFallbackViewport,
|
|
11
|
+
image: IImage
|
|
12
|
+
): void {
|
|
13
|
+
if (hasVoi(viewport)) {
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const maxVoi = image.maxPixelValue * image.slope + image.intercept;
|
|
18
|
+
const minVoi = image.minPixelValue * image.slope + image.intercept;
|
|
19
|
+
const ww = maxVoi - minVoi;
|
|
20
|
+
const wc = (maxVoi + minVoi) / 2;
|
|
21
|
+
|
|
22
|
+
if (viewport.voi === undefined) {
|
|
23
|
+
viewport.voi = {
|
|
24
|
+
windowWidth: ww,
|
|
25
|
+
windowCenter: wc,
|
|
26
|
+
};
|
|
27
|
+
} else {
|
|
28
|
+
viewport.voi.windowWidth = ww;
|
|
29
|
+
viewport.voi.windowCenter = wc;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Check if viewport has voi LUT data
|
|
35
|
+
* @param viewport - The viewport to check for voi LUT data
|
|
36
|
+
* @returns true viewport has LUT data (Window Width/Window Center or voiLUT). Otherwise, false.
|
|
37
|
+
*/
|
|
38
|
+
function hasVoi(viewport: CPUFallbackViewport): boolean {
|
|
39
|
+
const hasLut =
|
|
40
|
+
viewport.voiLUT && viewport.voiLUT.lut && viewport.voiLUT.lut.length > 0;
|
|
41
|
+
|
|
42
|
+
return (
|
|
43
|
+
hasLut ||
|
|
44
|
+
(viewport.voi.windowWidth !== undefined &&
|
|
45
|
+
viewport.voi.windowCenter !== undefined)
|
|
46
|
+
);
|
|
47
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { CPUFallbackViewport, Point2 } from '../../../../types';
|
|
2
|
+
|
|
3
|
+
type Shift = {
|
|
4
|
+
x: number;
|
|
5
|
+
y: number;
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Corrects the shift by accounting for viewport rotation and flips.
|
|
9
|
+
*
|
|
10
|
+
* @param shift - The shift to correct.
|
|
11
|
+
* @param viewportOrientation - Object containing information on the viewport orientation.
|
|
12
|
+
*/
|
|
13
|
+
export default function (
|
|
14
|
+
shift: Shift,
|
|
15
|
+
viewportOrientation: CPUFallbackViewport
|
|
16
|
+
): Shift {
|
|
17
|
+
const { hflip, vflip, rotation } = viewportOrientation;
|
|
18
|
+
|
|
19
|
+
// Apply Flips
|
|
20
|
+
shift.x *= hflip ? -1 : 1;
|
|
21
|
+
shift.y *= vflip ? -1 : 1;
|
|
22
|
+
|
|
23
|
+
// Apply rotations
|
|
24
|
+
if (rotation !== 0) {
|
|
25
|
+
const angle = (rotation * Math.PI) / 180;
|
|
26
|
+
|
|
27
|
+
const cosA = Math.cos(angle);
|
|
28
|
+
const sinA = Math.sin(angle);
|
|
29
|
+
|
|
30
|
+
const newX = shift.x * cosA - shift.y * sinA;
|
|
31
|
+
const newY = shift.x * sinA + shift.y * cosA;
|
|
32
|
+
|
|
33
|
+
shift.x = newX;
|
|
34
|
+
shift.y = newY;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return shift;
|
|
38
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { state } from './setDefaultViewport';
|
|
2
|
+
import {
|
|
3
|
+
CPUFallbackViewportDisplayedArea,
|
|
4
|
+
CPUFallbackViewport,
|
|
5
|
+
} from '../../../../types';
|
|
6
|
+
|
|
7
|
+
// eslint-disable-next-line valid-jsdoc
|
|
8
|
+
/**
|
|
9
|
+
* Creates the default displayed area.
|
|
10
|
+
* C.10.4 Displayed Area Module: This Module describes Attributes required to define a Specified Displayed Area space.
|
|
11
|
+
*
|
|
12
|
+
* @returns {tlhc: {x,y}, brhc: {x, y},rowPixelSpacing: Number, columnPixelSpacing: Number, presentationSizeMode: Number} displayedArea object
|
|
13
|
+
* @memberof Internal
|
|
14
|
+
*/
|
|
15
|
+
function createDefaultDisplayedArea(): CPUFallbackViewportDisplayedArea {
|
|
16
|
+
return {
|
|
17
|
+
// Top Left Hand Corner
|
|
18
|
+
tlhc: {
|
|
19
|
+
x: 1,
|
|
20
|
+
y: 1,
|
|
21
|
+
},
|
|
22
|
+
// Bottom Right Hand Corner
|
|
23
|
+
brhc: {
|
|
24
|
+
x: 1,
|
|
25
|
+
y: 1,
|
|
26
|
+
},
|
|
27
|
+
rowPixelSpacing: 1,
|
|
28
|
+
columnPixelSpacing: 1,
|
|
29
|
+
presentationSizeMode: 'NONE',
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Creates a new viewport object containing default values
|
|
35
|
+
*
|
|
36
|
+
* @returns {Viewport} viewport object
|
|
37
|
+
* @memberof Internal
|
|
38
|
+
*/
|
|
39
|
+
export default function createViewport(): CPUFallbackViewport {
|
|
40
|
+
const displayedArea = createDefaultDisplayedArea();
|
|
41
|
+
const initialDefaultViewport = {
|
|
42
|
+
scale: 1,
|
|
43
|
+
translation: {
|
|
44
|
+
x: 0,
|
|
45
|
+
y: 0,
|
|
46
|
+
},
|
|
47
|
+
voi: {
|
|
48
|
+
windowWidth: undefined,
|
|
49
|
+
windowCenter: undefined,
|
|
50
|
+
},
|
|
51
|
+
invert: false,
|
|
52
|
+
pixelReplication: false,
|
|
53
|
+
rotation: 0,
|
|
54
|
+
hflip: false,
|
|
55
|
+
vflip: false,
|
|
56
|
+
modalityLUT: undefined,
|
|
57
|
+
voiLUT: undefined,
|
|
58
|
+
colormap: undefined,
|
|
59
|
+
labelmap: false,
|
|
60
|
+
displayedArea,
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
return Object.assign({}, initialDefaultViewport, state.viewport);
|
|
64
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { CPUFallbackEnabledElement, IImage } from '../../../../types';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Determine whether or not an Enabled Element needs to be re-rendered.
|
|
5
|
+
*
|
|
6
|
+
* If the imageId has changed, or if any of the last rendered viewport
|
|
7
|
+
* parameters have changed, this function will return true.
|
|
8
|
+
*
|
|
9
|
+
* @param enabledElement - An Enabled Element
|
|
10
|
+
* @param image - An Image
|
|
11
|
+
* @returns Whether - or not the Enabled Element needs to re-render its image
|
|
12
|
+
*/
|
|
13
|
+
export default function doesImageNeedToBeRendered(
|
|
14
|
+
enabledElement: CPUFallbackEnabledElement,
|
|
15
|
+
image: IImage
|
|
16
|
+
): boolean {
|
|
17
|
+
const lastRenderedImageId = enabledElement.renderingTools.lastRenderedImageId;
|
|
18
|
+
const lastRenderedViewport =
|
|
19
|
+
enabledElement.renderingTools.lastRenderedViewport;
|
|
20
|
+
|
|
21
|
+
return (
|
|
22
|
+
image.imageId !== lastRenderedImageId ||
|
|
23
|
+
!lastRenderedViewport ||
|
|
24
|
+
lastRenderedViewport.windowCenter !==
|
|
25
|
+
enabledElement.viewport.voi.windowCenter ||
|
|
26
|
+
lastRenderedViewport.windowWidth !==
|
|
27
|
+
enabledElement.viewport.voi.windowWidth ||
|
|
28
|
+
lastRenderedViewport.invert !== enabledElement.viewport.invert ||
|
|
29
|
+
lastRenderedViewport.rotation !== enabledElement.viewport.rotation ||
|
|
30
|
+
lastRenderedViewport.hflip !== enabledElement.viewport.hflip ||
|
|
31
|
+
lastRenderedViewport.vflip !== enabledElement.viewport.vflip ||
|
|
32
|
+
lastRenderedViewport.modalityLUT !== enabledElement.viewport.modalityLUT ||
|
|
33
|
+
lastRenderedViewport.voiLUT !== enabledElement.viewport.voiLUT ||
|
|
34
|
+
lastRenderedViewport.colormap !== enabledElement.viewport.colormap
|
|
35
|
+
);
|
|
36
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import getImageFitScale from './getImageFitScale';
|
|
2
|
+
import { CPUFallbackEnabledElement } from '../../../../types';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Adjusts an image's scale and translation so the image is centered and all pixels
|
|
6
|
+
* in the image are viewable.
|
|
7
|
+
*
|
|
8
|
+
* @param element - The Cornerstone element to update
|
|
9
|
+
*/
|
|
10
|
+
export default function (enabledElement: CPUFallbackEnabledElement): void {
|
|
11
|
+
const { image } = enabledElement;
|
|
12
|
+
|
|
13
|
+
// The new scale is the minimum of the horizontal and vertical scale values
|
|
14
|
+
enabledElement.viewport.scale = getImageFitScale(
|
|
15
|
+
enabledElement.canvas,
|
|
16
|
+
image,
|
|
17
|
+
enabledElement.viewport.rotation
|
|
18
|
+
).scaleFactor;
|
|
19
|
+
|
|
20
|
+
enabledElement.viewport.translation.x = 0;
|
|
21
|
+
enabledElement.viewport.translation.y = 0;
|
|
22
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import getVOILUT from './getVOILut';
|
|
2
|
+
import { IImage, CPUFallbackLUT } from '../../../../types';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Creates a LUT used while rendering to convert stored pixel values to
|
|
6
|
+
* display pixels
|
|
7
|
+
*
|
|
8
|
+
* @param image - A Cornerstone Image Object
|
|
9
|
+
* @param windowWidth - The Window Width
|
|
10
|
+
* @param windowCenter - The Window Center
|
|
11
|
+
* @param invert - A boolean describing whether or not the image has been inverted
|
|
12
|
+
* @param voiLUT- A Volume of Interest Lookup Table
|
|
13
|
+
*
|
|
14
|
+
* @returns A lookup table to apply to the image
|
|
15
|
+
*/
|
|
16
|
+
export default function generateColorLUT(
|
|
17
|
+
image: IImage,
|
|
18
|
+
windowWidth: number | number[],
|
|
19
|
+
windowCenter: number | number[],
|
|
20
|
+
invert: boolean,
|
|
21
|
+
voiLUT?: CPUFallbackLUT
|
|
22
|
+
) {
|
|
23
|
+
const maxPixelValue = image.maxPixelValue;
|
|
24
|
+
const minPixelValue = image.minPixelValue;
|
|
25
|
+
const offset = Math.min(minPixelValue, 0);
|
|
26
|
+
|
|
27
|
+
if (image.cachedLut === undefined) {
|
|
28
|
+
const length = maxPixelValue - offset + 1;
|
|
29
|
+
|
|
30
|
+
image.cachedLut = {};
|
|
31
|
+
image.cachedLut.lutArray = new Uint8ClampedArray(length);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const lut = image.cachedLut.lutArray;
|
|
35
|
+
const vlutfn = getVOILUT(
|
|
36
|
+
Array.isArray(windowWidth) ? windowWidth[0] : windowWidth,
|
|
37
|
+
Array.isArray(windowCenter) ? windowCenter[0] : windowCenter,
|
|
38
|
+
voiLUT
|
|
39
|
+
);
|
|
40
|
+
|
|
41
|
+
if (invert === true) {
|
|
42
|
+
for (
|
|
43
|
+
let storedValue = minPixelValue;
|
|
44
|
+
storedValue <= maxPixelValue;
|
|
45
|
+
storedValue++
|
|
46
|
+
) {
|
|
47
|
+
lut[storedValue + -offset] = 255 - vlutfn(storedValue);
|
|
48
|
+
}
|
|
49
|
+
} else {
|
|
50
|
+
for (
|
|
51
|
+
let storedValue = minPixelValue;
|
|
52
|
+
storedValue <= maxPixelValue;
|
|
53
|
+
storedValue++
|
|
54
|
+
) {
|
|
55
|
+
lut[storedValue + -offset] = vlutfn(storedValue);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
return lut;
|
|
60
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import getModalityLut from './getModalityLut';
|
|
2
|
+
import getVOILUT from './getVOILut';
|
|
3
|
+
import { IImage, CPUFallbackLUT } from '../../../../types';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Creates a LUT used while rendering to convert stored pixel values to
|
|
7
|
+
* display pixels
|
|
8
|
+
*
|
|
9
|
+
* @param image - A Cornerstone Image Object
|
|
10
|
+
* @param windowWidth - The Window Width
|
|
11
|
+
* @param windowCenter - The Window Center
|
|
12
|
+
* @param invert - A boolean describing whether or not the image has been inverted
|
|
13
|
+
* @param modalityLUT - A modality Lookup Table
|
|
14
|
+
* @param voiLUT - A Volume of Interest Lookup Table
|
|
15
|
+
*
|
|
16
|
+
* @returns A lookup table to apply to the image
|
|
17
|
+
*/
|
|
18
|
+
export default function (
|
|
19
|
+
image: IImage,
|
|
20
|
+
windowWidth: number,
|
|
21
|
+
windowCenter: number,
|
|
22
|
+
invert: boolean,
|
|
23
|
+
modalityLUT: CPUFallbackLUT,
|
|
24
|
+
voiLUT: CPUFallbackLUT
|
|
25
|
+
): Uint8ClampedArray {
|
|
26
|
+
const maxPixelValue = image.maxPixelValue;
|
|
27
|
+
const minPixelValue = image.minPixelValue;
|
|
28
|
+
const offset = Math.min(minPixelValue, 0);
|
|
29
|
+
|
|
30
|
+
if (image.cachedLut === undefined) {
|
|
31
|
+
const length = maxPixelValue - offset + 1;
|
|
32
|
+
|
|
33
|
+
image.cachedLut = {};
|
|
34
|
+
image.cachedLut.lutArray = new Uint8ClampedArray(length);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const lut = image.cachedLut.lutArray;
|
|
38
|
+
|
|
39
|
+
const mlutfn = getModalityLut(image.slope, image.intercept, modalityLUT);
|
|
40
|
+
const vlutfn = getVOILUT(windowWidth, windowCenter, voiLUT);
|
|
41
|
+
|
|
42
|
+
if (image.isPreScaled) {
|
|
43
|
+
// if the image is already preScaled, it means that the slop and the intercept
|
|
44
|
+
// are applied and there is no need for a modalityLut
|
|
45
|
+
if (invert === true) {
|
|
46
|
+
for (
|
|
47
|
+
let storedValue = minPixelValue;
|
|
48
|
+
storedValue <= maxPixelValue;
|
|
49
|
+
storedValue++
|
|
50
|
+
) {
|
|
51
|
+
lut[storedValue + -offset] = 255 - vlutfn(storedValue);
|
|
52
|
+
}
|
|
53
|
+
} else {
|
|
54
|
+
for (
|
|
55
|
+
let storedValue = minPixelValue;
|
|
56
|
+
storedValue <= maxPixelValue;
|
|
57
|
+
storedValue++
|
|
58
|
+
) {
|
|
59
|
+
lut[storedValue + -offset] = vlutfn(storedValue);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
} else {
|
|
63
|
+
if (invert === true) {
|
|
64
|
+
for (
|
|
65
|
+
let storedValue = minPixelValue;
|
|
66
|
+
storedValue <= maxPixelValue;
|
|
67
|
+
storedValue++
|
|
68
|
+
) {
|
|
69
|
+
lut[storedValue + -offset] = 255 - vlutfn(mlutfn(storedValue));
|
|
70
|
+
}
|
|
71
|
+
} else {
|
|
72
|
+
for (
|
|
73
|
+
let storedValue = minPixelValue;
|
|
74
|
+
storedValue <= maxPixelValue;
|
|
75
|
+
storedValue++
|
|
76
|
+
) {
|
|
77
|
+
lut[storedValue + -offset] = vlutfn(mlutfn(storedValue));
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
return lut;
|
|
83
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import createViewport from './createViewport';
|
|
2
|
+
import getImageFitScale from './getImageFitScale';
|
|
3
|
+
import {
|
|
4
|
+
IImage,
|
|
5
|
+
CPUFallbackColormap,
|
|
6
|
+
CPUFallbackViewport,
|
|
7
|
+
} from '../../../../types';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Creates a new viewport object containing default values for the image and canvas
|
|
11
|
+
*
|
|
12
|
+
* @param canvas - A Canvas DOM element
|
|
13
|
+
* @param image - A Cornerstone Image Object
|
|
14
|
+
* @returns viewport - object
|
|
15
|
+
*/
|
|
16
|
+
export default function (
|
|
17
|
+
canvas: HTMLCanvasElement,
|
|
18
|
+
image: IImage,
|
|
19
|
+
modality?: string,
|
|
20
|
+
colormap?: CPUFallbackColormap
|
|
21
|
+
): CPUFallbackViewport {
|
|
22
|
+
if (canvas === undefined) {
|
|
23
|
+
throw new Error(
|
|
24
|
+
'getDefaultViewport: parameter canvas must not be undefined'
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
if (image === undefined) {
|
|
29
|
+
return createViewport();
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Fit image to window
|
|
33
|
+
const scale = getImageFitScale(canvas, image, 0).scaleFactor;
|
|
34
|
+
|
|
35
|
+
let voi;
|
|
36
|
+
|
|
37
|
+
if (modality === 'PT' && image.isPreScaled) {
|
|
38
|
+
voi = {
|
|
39
|
+
windowWidth: 5,
|
|
40
|
+
windowCenter: 2.5,
|
|
41
|
+
};
|
|
42
|
+
} else if (
|
|
43
|
+
image.windowWidth !== undefined &&
|
|
44
|
+
image.windowCenter !== undefined
|
|
45
|
+
) {
|
|
46
|
+
voi = {
|
|
47
|
+
windowWidth: Array.isArray(image.windowWidth)
|
|
48
|
+
? image.windowWidth[0]
|
|
49
|
+
: image.windowWidth,
|
|
50
|
+
windowCenter: Array.isArray(image.windowCenter)
|
|
51
|
+
? image.windowCenter[0]
|
|
52
|
+
: image.windowCenter,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return {
|
|
57
|
+
scale,
|
|
58
|
+
translation: {
|
|
59
|
+
x: 0,
|
|
60
|
+
y: 0,
|
|
61
|
+
},
|
|
62
|
+
voi,
|
|
63
|
+
invert: image.invert,
|
|
64
|
+
pixelReplication: false,
|
|
65
|
+
rotation: 0,
|
|
66
|
+
hflip: false,
|
|
67
|
+
vflip: false,
|
|
68
|
+
modalityLUT: image.modalityLUT,
|
|
69
|
+
modality,
|
|
70
|
+
voiLUT: image.voiLUT,
|
|
71
|
+
colormap: colormap !== undefined ? colormap : image.colormap,
|
|
72
|
+
displayedArea: {
|
|
73
|
+
tlhc: {
|
|
74
|
+
x: 1,
|
|
75
|
+
y: 1,
|
|
76
|
+
},
|
|
77
|
+
brhc: {
|
|
78
|
+
x: image.columns,
|
|
79
|
+
y: image.rows,
|
|
80
|
+
},
|
|
81
|
+
rowPixelSpacing:
|
|
82
|
+
image.rowPixelSpacing === undefined ? 1 : image.rowPixelSpacing,
|
|
83
|
+
columnPixelSpacing:
|
|
84
|
+
image.columnPixelSpacing === undefined ? 1 : image.columnPixelSpacing,
|
|
85
|
+
presentationSizeMode: 'NONE',
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { validateParameterUndefinedOrNull } from './validator';
|
|
2
|
+
import getImageSize from './getImageSize';
|
|
3
|
+
import { IImage } from '../../../../types';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Calculates the horizontal, vertical and minimum scale factor for an image
|
|
7
|
+
@param canvas - The window size where the image is displayed. This can be any HTML element or structure with a width, height fields (e.g. canvas).
|
|
8
|
+
* @param image - The cornerstone image object
|
|
9
|
+
* @param rotation - The rotation angle of the image.
|
|
10
|
+
* @returns The calculated horizontal, vertical and minimum scale factor
|
|
11
|
+
*/
|
|
12
|
+
export default function (
|
|
13
|
+
canvas: HTMLCanvasElement,
|
|
14
|
+
image: IImage,
|
|
15
|
+
rotation: number | null = null
|
|
16
|
+
): {
|
|
17
|
+
verticalScale: number;
|
|
18
|
+
horizontalScale: number;
|
|
19
|
+
scaleFactor: number;
|
|
20
|
+
} {
|
|
21
|
+
validateParameterUndefinedOrNull(
|
|
22
|
+
canvas,
|
|
23
|
+
'getImageScale: parameter canvas must not be undefined'
|
|
24
|
+
);
|
|
25
|
+
validateParameterUndefinedOrNull(
|
|
26
|
+
image,
|
|
27
|
+
'getImageScale: parameter image must not be undefined'
|
|
28
|
+
);
|
|
29
|
+
|
|
30
|
+
const imageSize = getImageSize(image, rotation);
|
|
31
|
+
const rowPixelSpacing = image.rowPixelSpacing || 1;
|
|
32
|
+
const columnPixelSpacing = image.columnPixelSpacing || 1;
|
|
33
|
+
let verticalRatio = 1;
|
|
34
|
+
let horizontalRatio = 1;
|
|
35
|
+
|
|
36
|
+
if (rowPixelSpacing < columnPixelSpacing) {
|
|
37
|
+
horizontalRatio = columnPixelSpacing / rowPixelSpacing;
|
|
38
|
+
} else {
|
|
39
|
+
// even if they are equal we want to calculate this ratio (the ration might be 0.5)
|
|
40
|
+
verticalRatio = rowPixelSpacing / columnPixelSpacing;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const verticalScale = canvas.height / imageSize.height / verticalRatio;
|
|
44
|
+
const horizontalScale = canvas.width / imageSize.width / horizontalRatio;
|
|
45
|
+
|
|
46
|
+
// Fit image to window
|
|
47
|
+
return {
|
|
48
|
+
verticalScale,
|
|
49
|
+
horizontalScale,
|
|
50
|
+
scaleFactor: Math.min(horizontalScale, verticalScale),
|
|
51
|
+
};
|
|
52
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { validateParameterUndefinedOrNull } from './validator';
|
|
2
|
+
import { IImage } from '../../../../types';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Check if the angle is rotated
|
|
6
|
+
* @param {Number} rotation the rotation angle
|
|
7
|
+
* @returns {Boolean} true if the angle is rotated; Otherwise, false.
|
|
8
|
+
* @memberof Internal
|
|
9
|
+
*/
|
|
10
|
+
function isRotated(rotation?: number | null): boolean {
|
|
11
|
+
return !(
|
|
12
|
+
rotation === null ||
|
|
13
|
+
rotation === undefined ||
|
|
14
|
+
rotation === 0 ||
|
|
15
|
+
rotation === 180
|
|
16
|
+
);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Retrieves the current image dimensions given an enabled element
|
|
21
|
+
*
|
|
22
|
+
* @param {any} image The Cornerstone image.
|
|
23
|
+
* @param {Number} rotation Optional. The rotation angle of the image.
|
|
24
|
+
* @return {{width:Number, height:Number}} The Image dimensions
|
|
25
|
+
* @memberof Internal
|
|
26
|
+
*/
|
|
27
|
+
export default function (
|
|
28
|
+
image: IImage,
|
|
29
|
+
rotation = null
|
|
30
|
+
): { height: number; width: number } {
|
|
31
|
+
validateParameterUndefinedOrNull(
|
|
32
|
+
image,
|
|
33
|
+
'getImageSize: parameter image must not be undefined'
|
|
34
|
+
);
|
|
35
|
+
validateParameterUndefinedOrNull(
|
|
36
|
+
image.width,
|
|
37
|
+
'getImageSize: parameter image must have width'
|
|
38
|
+
);
|
|
39
|
+
validateParameterUndefinedOrNull(
|
|
40
|
+
image.height,
|
|
41
|
+
'getImageSize: parameter image must have height'
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
if (isRotated(rotation)) {
|
|
45
|
+
return {
|
|
46
|
+
height: image.width,
|
|
47
|
+
width: image.height,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
return {
|
|
52
|
+
width: image.width,
|
|
53
|
+
height: image.height,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import computeAutoVoi from './computeAutoVoi';
|
|
2
|
+
import lutMatches from './lutMatches';
|
|
3
|
+
import generateLut from './generateLut';
|
|
4
|
+
import { IImage, CPUFallbackViewport } from '../../../../types';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Retrieve or generate a LUT Array for an Image and Viewport
|
|
8
|
+
*
|
|
9
|
+
* @param {Image} image An Image Object
|
|
10
|
+
* @param {Viewport} viewport An Viewport Object
|
|
11
|
+
* @param {Boolean} invalidated Whether or not the LUT data has been invalidated
|
|
12
|
+
* (e.g. by a change to the windowWidth, windowCenter, or invert viewport parameters).
|
|
13
|
+
* @return {Uint8ClampedArray} LUT Array
|
|
14
|
+
* @memberof rendering
|
|
15
|
+
*/
|
|
16
|
+
export default function (
|
|
17
|
+
image: IImage,
|
|
18
|
+
viewport: CPUFallbackViewport,
|
|
19
|
+
invalidated: boolean
|
|
20
|
+
): Uint8ClampedArray {
|
|
21
|
+
// If we have a cached lut and it has the right values, return it immediately
|
|
22
|
+
if (
|
|
23
|
+
image.cachedLut !== undefined &&
|
|
24
|
+
image.cachedLut.windowCenter === viewport.voi.windowCenter &&
|
|
25
|
+
image.cachedLut.windowWidth === viewport.voi.windowWidth &&
|
|
26
|
+
lutMatches(image.cachedLut.modalityLUT, viewport.modalityLUT) &&
|
|
27
|
+
lutMatches(image.cachedLut.voiLUT, viewport.voiLUT) &&
|
|
28
|
+
image.cachedLut.invert === viewport.invert &&
|
|
29
|
+
invalidated !== true
|
|
30
|
+
) {
|
|
31
|
+
return image.cachedLut.lutArray;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
computeAutoVoi(viewport, image);
|
|
35
|
+
|
|
36
|
+
// Lut is invalid or not present, regenerate it and cache it
|
|
37
|
+
generateLut(
|
|
38
|
+
image,
|
|
39
|
+
viewport.voi.windowWidth,
|
|
40
|
+
viewport.voi.windowCenter,
|
|
41
|
+
viewport.invert,
|
|
42
|
+
viewport.modalityLUT,
|
|
43
|
+
viewport.voiLUT
|
|
44
|
+
);
|
|
45
|
+
|
|
46
|
+
image.cachedLut.windowWidth = viewport.voi.windowWidth;
|
|
47
|
+
image.cachedLut.windowCenter = viewport.voi.windowCenter;
|
|
48
|
+
image.cachedLut.invert = viewport.invert;
|
|
49
|
+
image.cachedLut.voiLUT = viewport.voiLUT;
|
|
50
|
+
image.cachedLut.modalityLUT = viewport.modalityLUT;
|
|
51
|
+
|
|
52
|
+
return image.cachedLut.lutArray;
|
|
53
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generates a linear modality transformation function
|
|
3
|
+
*
|
|
4
|
+
* See DICOM PS3.3 C.11.1 Modality LUT Module
|
|
5
|
+
*
|
|
6
|
+
* http://dicom.nema.org/medical/Dicom/current/output/chtml/part03/sect_C.11.html
|
|
7
|
+
*
|
|
8
|
+
* @param {Number} slope m in the equation specified by Rescale Intercept (0028,1052).
|
|
9
|
+
* @param {Number} intercept The value b in relationship between stored values (SV) and the output units specified in Rescale Type (0028,1054).
|
|
10
|
+
|
|
11
|
+
Output units = m*SV + b.
|
|
12
|
+
* @return {function(*): *} A linear modality LUT function. Given a stored pixel it returns the modality pixel value
|
|
13
|
+
* @memberof Internal
|
|
14
|
+
*/
|
|
15
|
+
function generateLinearModalityLUT(slope, intercept) {
|
|
16
|
+
return (storedPixelValue) => storedPixelValue * slope + intercept;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function generateNonLinearModalityLUT(modalityLUT) {
|
|
20
|
+
const minValue = modalityLUT.lut[0];
|
|
21
|
+
const maxValue = modalityLUT.lut[modalityLUT.lut.length - 1];
|
|
22
|
+
const maxValueMapped = modalityLUT.firstValueMapped + modalityLUT.lut.length;
|
|
23
|
+
|
|
24
|
+
return (storedPixelValue) => {
|
|
25
|
+
if (storedPixelValue < modalityLUT.firstValueMapped) {
|
|
26
|
+
return minValue;
|
|
27
|
+
} else if (storedPixelValue >= maxValueMapped) {
|
|
28
|
+
return maxValue;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return modalityLUT.lut[storedPixelValue];
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Get the appropriate Modality LUT for the current situation.
|
|
37
|
+
*
|
|
38
|
+
* @param {Number} [slope] m in the equation specified by Rescale Intercept (0028,1052).
|
|
39
|
+
* @param {Number} [intercept] The value b in relationship between stored values (SV) and the output units specified in Rescale Type (0028,1054).
|
|
40
|
+
* @param {Function} [modalityLUT] A modality LUT function. Given a stored pixel it returns the modality pixel value.
|
|
41
|
+
*
|
|
42
|
+
* @return {function(*): *} A modality LUT function. Given a stored pixel it returns the modality pixel value.
|
|
43
|
+
* @memberof Internal
|
|
44
|
+
*/
|
|
45
|
+
export default function (
|
|
46
|
+
slope: number,
|
|
47
|
+
intercept: number,
|
|
48
|
+
modalityLUT: unknown
|
|
49
|
+
) {
|
|
50
|
+
if (modalityLUT) {
|
|
51
|
+
return generateNonLinearModalityLUT(modalityLUT);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
return generateLinearModalityLUT(slope, intercept);
|
|
55
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import calculateTransform from './calculateTransform';
|
|
2
|
+
import {
|
|
3
|
+
CPUFallbackEnabledElement,
|
|
4
|
+
CPUFallbackTransform,
|
|
5
|
+
} from '../../../../types';
|
|
6
|
+
|
|
7
|
+
export default function (
|
|
8
|
+
enabledElement: CPUFallbackEnabledElement
|
|
9
|
+
): CPUFallbackTransform {
|
|
10
|
+
// Todo: for some reason using the cached transfer after the first call
|
|
11
|
+
// does not give correct transform.
|
|
12
|
+
// if (enabledElement.transform) {
|
|
13
|
+
// return enabledElement.transform;
|
|
14
|
+
// }
|
|
15
|
+
|
|
16
|
+
return calculateTransform(enabledElement);
|
|
17
|
+
}
|