@cornerstonejs/core 0.36.2 → 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/loaders/volumeLoader.d.ts +1 -0
- package/dist/cjs/loaders/volumeLoader.js +5 -1
- package/dist/cjs/loaders/volumeLoader.js.map +1 -1
- package/dist/cjs/utilities/getSliceRange.js +3 -1
- package/dist/cjs/utilities/getSliceRange.js.map +1 -1
- package/dist/cjs/utilities/getTargetVolumeAndSpacingInNormalDir.js +7 -0
- package/dist/cjs/utilities/getTargetVolumeAndSpacingInNormalDir.js.map +1 -1
- package/dist/esm/loaders/volumeLoader.d.ts +1 -0
- package/dist/esm/loaders/volumeLoader.js +3 -0
- package/dist/esm/loaders/volumeLoader.js.map +1 -1
- package/dist/esm/utilities/getSliceRange.js +3 -1
- package/dist/esm/utilities/getSliceRange.js.map +1 -1
- package/dist/esm/utilities/getTargetVolumeAndSpacingInNormalDir.js +7 -0
- package/dist/esm/utilities/getTargetVolumeAndSpacingInNormalDir.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,74 @@
|
|
|
1
|
+
/* eslint no-bitwise: 0 */
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Volume of Interest Lookup Table Function
|
|
5
|
+
*
|
|
6
|
+
* @typedef {Function} VOILUTFunction
|
|
7
|
+
*
|
|
8
|
+
* @param {Number} modalityLutValue
|
|
9
|
+
* @returns {Number} transformed value
|
|
10
|
+
* @memberof Objects
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* @module: VOILUT
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
*
|
|
19
|
+
* @param {Number} windowWidth Window Width
|
|
20
|
+
* @param {Number} windowCenter Window Center
|
|
21
|
+
* @returns {VOILUTFunction} VOI LUT mapping function
|
|
22
|
+
* @memberof VOILUT
|
|
23
|
+
*/
|
|
24
|
+
function generateLinearVOILUT(windowWidth: number, windowCenter: number) {
|
|
25
|
+
return function (modalityLutValue) {
|
|
26
|
+
return ((modalityLutValue - windowCenter) / windowWidth + 0.5) * 255.0;
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Generate a non-linear volume of interest lookup table
|
|
32
|
+
*
|
|
33
|
+
* @param {LUT} voiLUT Volume of Interest Lookup Table Object
|
|
34
|
+
*
|
|
35
|
+
* @returns {VOILUTFunction} VOI LUT mapping function
|
|
36
|
+
* @memberof VOILUT
|
|
37
|
+
*/
|
|
38
|
+
function generateNonLinearVOILUT(voiLUT) {
|
|
39
|
+
// We don't trust the voiLUT.numBitsPerEntry, mainly thanks to Agfa!
|
|
40
|
+
const bitsPerEntry = Math.max(...voiLUT.lut).toString(2).length;
|
|
41
|
+
const shift = bitsPerEntry - 8;
|
|
42
|
+
const minValue = voiLUT.lut[0] >> shift;
|
|
43
|
+
const maxValue = voiLUT.lut[voiLUT.lut.length - 1] >> shift;
|
|
44
|
+
const maxValueMapped = voiLUT.firstValueMapped + voiLUT.lut.length - 1;
|
|
45
|
+
|
|
46
|
+
return function (modalityLutValue) {
|
|
47
|
+
if (modalityLutValue < voiLUT.firstValueMapped) {
|
|
48
|
+
return minValue;
|
|
49
|
+
} else if (modalityLutValue >= maxValueMapped) {
|
|
50
|
+
return maxValue;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return voiLUT.lut[modalityLutValue - voiLUT.firstValueMapped] >> shift;
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Retrieve a VOI LUT mapping function given the current windowing settings
|
|
59
|
+
* and the VOI LUT for the image
|
|
60
|
+
*
|
|
61
|
+
* @param {Number} windowWidth Window Width
|
|
62
|
+
* @param {Number} windowCenter Window Center
|
|
63
|
+
* @param {LUT} [voiLUT] Volume of Interest Lookup Table Object
|
|
64
|
+
*
|
|
65
|
+
* @return {VOILUTFunction} VOI LUT mapping function
|
|
66
|
+
* @memberof VOILUT
|
|
67
|
+
*/
|
|
68
|
+
export default function (windowWidth: number, windowCenter: number, voiLUT) {
|
|
69
|
+
if (voiLUT) {
|
|
70
|
+
return generateNonLinearVOILUT(voiLUT);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return generateLinearVOILUT(windowWidth, windowCenter);
|
|
74
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { CPUFallbackEnabledElement, IImage } from '../../../../types';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Sets size and clears canvas
|
|
5
|
+
*
|
|
6
|
+
* @param {Object} enabledElement Cornerstone Enabled Element
|
|
7
|
+
* @param {Object} image Image to be rendered
|
|
8
|
+
* @returns {void}
|
|
9
|
+
* @memberof rendering
|
|
10
|
+
*/
|
|
11
|
+
export default function (
|
|
12
|
+
enabledElement: CPUFallbackEnabledElement,
|
|
13
|
+
image: IImage
|
|
14
|
+
): void {
|
|
15
|
+
const renderCanvas = enabledElement.renderingTools.renderCanvas;
|
|
16
|
+
|
|
17
|
+
// Resize the canvas
|
|
18
|
+
renderCanvas.width = image.width;
|
|
19
|
+
renderCanvas.height = image.height;
|
|
20
|
+
|
|
21
|
+
const canvasContext = renderCanvas.getContext('2d');
|
|
22
|
+
|
|
23
|
+
// NOTE - we need to fill the render canvas with white pixels since we
|
|
24
|
+
// control the luminance using the alpha channel to improve rendering performance.
|
|
25
|
+
canvasContext.fillStyle = 'white';
|
|
26
|
+
canvasContext.fillRect(0, 0, renderCanvas.width, renderCanvas.height);
|
|
27
|
+
|
|
28
|
+
const renderCanvasData = canvasContext.getImageData(
|
|
29
|
+
0,
|
|
30
|
+
0,
|
|
31
|
+
image.width,
|
|
32
|
+
image.height
|
|
33
|
+
);
|
|
34
|
+
|
|
35
|
+
enabledElement.renderingTools.renderCanvasContext = canvasContext;
|
|
36
|
+
enabledElement.renderingTools.renderCanvasData = renderCanvasData;
|
|
37
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check if two lookup tables match
|
|
3
|
+
*
|
|
4
|
+
* @param {LUT} a A lookup table function
|
|
5
|
+
* @param {LUT} b Another lookup table function
|
|
6
|
+
* @return {boolean} Whether or not they match
|
|
7
|
+
* @memberof rendering
|
|
8
|
+
*/
|
|
9
|
+
export default function (a: any, b: any) {
|
|
10
|
+
// If undefined, they are equal
|
|
11
|
+
if (!a && !b) {
|
|
12
|
+
return true;
|
|
13
|
+
}
|
|
14
|
+
// If one is undefined, not equal
|
|
15
|
+
if (!a || !b) {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// Check the unique ids
|
|
20
|
+
return a.id === b.id;
|
|
21
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Use the performance.now() method if possible, and if not, use Date.now()
|
|
3
|
+
*
|
|
4
|
+
* @return {number} Time elapsed since the time origin
|
|
5
|
+
* @memberof Polyfills
|
|
6
|
+
*/
|
|
7
|
+
export default function (): number {
|
|
8
|
+
if (window.performance) {
|
|
9
|
+
return performance.now();
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
return Date.now();
|
|
13
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import getTransform from './getTransform';
|
|
2
|
+
import { CPUFallbackEnabledElement, Point2 } from '../../../../types';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Converts a point in the pixel coordinate system to the canvas coordinate system
|
|
6
|
+
* system. This can be used to render using canvas context without having the weird
|
|
7
|
+
* side effects that come from scaling and non square pixels
|
|
8
|
+
*
|
|
9
|
+
* @param {HTMLDivElement} element An HTML Element enabled for Cornerstone
|
|
10
|
+
* @param {{x: Number, y: Number}} pt The transformed point in the pixel coordinate system
|
|
11
|
+
*
|
|
12
|
+
* @returns {{x: Number, y: Number}} The input point in the canvas coordinate system
|
|
13
|
+
* @memberof PixelCoordinateSystem
|
|
14
|
+
*/
|
|
15
|
+
export default function (
|
|
16
|
+
enabledElement: CPUFallbackEnabledElement,
|
|
17
|
+
pt: Point2
|
|
18
|
+
): Point2 {
|
|
19
|
+
const transform = getTransform(enabledElement);
|
|
20
|
+
|
|
21
|
+
return transform.transformPoint(pt);
|
|
22
|
+
}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import now from './now';
|
|
2
|
+
import generateColorLUT from './generateColorLUT';
|
|
3
|
+
import storedColorPixelDataToCanvasImageData from './storedColorPixelDataToCanvasImageData';
|
|
4
|
+
import storedRGBAPixelDataToCanvasImageData from './storedRGBAPixelDataToCanvasImageData';
|
|
5
|
+
import setToPixelCoordinateSystem from './setToPixelCoordinateSystem';
|
|
6
|
+
import doesImageNeedToBeRendered from './doesImageNeedToBeRendered';
|
|
7
|
+
import initializeRenderCanvas from './initializeRenderCanvas';
|
|
8
|
+
import saveLastRendered from './saveLastRendered';
|
|
9
|
+
import {
|
|
10
|
+
IImage,
|
|
11
|
+
CPUFallbackViewport,
|
|
12
|
+
CPUFallbackEnabledElement,
|
|
13
|
+
} from '../../../../types';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Generates an appropriate Look Up Table to render the given image with the given window width and level (specified in the viewport)
|
|
17
|
+
* Uses an internal cache for performance
|
|
18
|
+
*
|
|
19
|
+
* @param {Object} image The image to be rendered
|
|
20
|
+
* @param {Object} viewport The viewport values used for rendering
|
|
21
|
+
* @returns {Uint8ClampedArray} Look Up Table array.
|
|
22
|
+
* @memberof rendering
|
|
23
|
+
*/
|
|
24
|
+
function getLut(image: IImage, viewport: CPUFallbackViewport) {
|
|
25
|
+
// If we have a cached lut and it has the right values, return it immediately
|
|
26
|
+
if (
|
|
27
|
+
image.cachedLut !== undefined &&
|
|
28
|
+
image.cachedLut.windowCenter === viewport.voi.windowCenter &&
|
|
29
|
+
image.cachedLut.windowWidth === viewport.voi.windowWidth &&
|
|
30
|
+
image.cachedLut.invert === viewport.invert
|
|
31
|
+
) {
|
|
32
|
+
return image.cachedLut.lutArray;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Lut is invalid or not present, regenerate it and cache it
|
|
36
|
+
generateColorLUT(
|
|
37
|
+
image,
|
|
38
|
+
viewport.voi.windowWidth,
|
|
39
|
+
viewport.voi.windowCenter,
|
|
40
|
+
viewport.invert
|
|
41
|
+
);
|
|
42
|
+
image.cachedLut.windowWidth = viewport.voi.windowWidth;
|
|
43
|
+
image.cachedLut.windowCenter = viewport.voi.windowCenter;
|
|
44
|
+
image.cachedLut.invert = viewport.invert;
|
|
45
|
+
|
|
46
|
+
return image.cachedLut.lutArray;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Returns an appropriate canvas to render the Image. If the canvas available in the cache is appropriate
|
|
51
|
+
* it is returned, otherwise adjustments are made. It also sets the color transfer functions.
|
|
52
|
+
*
|
|
53
|
+
* @param enabledElement - The cornerstone enabled element
|
|
54
|
+
* @param image - The image to be rendered
|
|
55
|
+
* @param invalidated - Is pixel data valid
|
|
56
|
+
* @returns An appropriate canvas for rendering the image
|
|
57
|
+
* @memberof rendering
|
|
58
|
+
*/
|
|
59
|
+
function getRenderCanvas(
|
|
60
|
+
enabledElement: CPUFallbackEnabledElement,
|
|
61
|
+
image: IImage,
|
|
62
|
+
invalidated: boolean
|
|
63
|
+
): HTMLCanvasElement {
|
|
64
|
+
const canvasWasColor =
|
|
65
|
+
enabledElement.renderingTools.lastRenderedIsColor === true;
|
|
66
|
+
|
|
67
|
+
if (!enabledElement.renderingTools.renderCanvas || !canvasWasColor) {
|
|
68
|
+
enabledElement.renderingTools.renderCanvas =
|
|
69
|
+
document.createElement('canvas');
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const renderCanvas = enabledElement.renderingTools.renderCanvas;
|
|
73
|
+
|
|
74
|
+
// The ww/wc is identity and not inverted - get a canvas with the image rendered into it for
|
|
75
|
+
// Fast drawing
|
|
76
|
+
if (
|
|
77
|
+
enabledElement.viewport.voi.windowWidth === 255 &&
|
|
78
|
+
enabledElement.viewport.voi.windowCenter === 128 &&
|
|
79
|
+
enabledElement.viewport.invert === false &&
|
|
80
|
+
image.getCanvas &&
|
|
81
|
+
image.getCanvas()
|
|
82
|
+
) {
|
|
83
|
+
return image.getCanvas();
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// Apply the lut to the stored pixel data onto the render canvas
|
|
87
|
+
if (
|
|
88
|
+
doesImageNeedToBeRendered(enabledElement, image) === false &&
|
|
89
|
+
invalidated !== true
|
|
90
|
+
) {
|
|
91
|
+
return renderCanvas;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// If our render canvas does not match the size of this image reset it
|
|
95
|
+
// NOTE: This might be inefficient if we are updating multiple images of different
|
|
96
|
+
// Sizes frequently.
|
|
97
|
+
if (
|
|
98
|
+
renderCanvas.width !== image.width ||
|
|
99
|
+
renderCanvas.height !== image.height
|
|
100
|
+
) {
|
|
101
|
+
initializeRenderCanvas(enabledElement, image);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// Get the lut to use
|
|
105
|
+
let start = now();
|
|
106
|
+
const colorLUT = getLut(image, enabledElement.viewport);
|
|
107
|
+
|
|
108
|
+
image.stats = image.stats || {};
|
|
109
|
+
image.stats.lastLutGenerateTime = now() - start;
|
|
110
|
+
|
|
111
|
+
const renderCanvasData = enabledElement.renderingTools.renderCanvasData;
|
|
112
|
+
const renderCanvasContext = enabledElement.renderingTools.renderCanvasContext;
|
|
113
|
+
|
|
114
|
+
// The color image voi/invert has been modified - apply the lut to the underlying
|
|
115
|
+
// Pixel data and put it into the renderCanvas
|
|
116
|
+
if (image.rgba) {
|
|
117
|
+
storedRGBAPixelDataToCanvasImageData(
|
|
118
|
+
image,
|
|
119
|
+
colorLUT,
|
|
120
|
+
renderCanvasData.data
|
|
121
|
+
);
|
|
122
|
+
} else {
|
|
123
|
+
storedColorPixelDataToCanvasImageData(
|
|
124
|
+
image,
|
|
125
|
+
colorLUT,
|
|
126
|
+
renderCanvasData.data
|
|
127
|
+
);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
start = now();
|
|
131
|
+
renderCanvasContext.putImageData(renderCanvasData, 0, 0);
|
|
132
|
+
image.stats.lastPutImageDataTime = now() - start;
|
|
133
|
+
|
|
134
|
+
return renderCanvas;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* API function to render a color image to an enabled element
|
|
139
|
+
*
|
|
140
|
+
* @param {EnabledElement} enabledElement The Cornerstone Enabled Element to redraw
|
|
141
|
+
* @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used
|
|
142
|
+
* @returns {void}
|
|
143
|
+
* @memberof rendering
|
|
144
|
+
*/
|
|
145
|
+
export function renderColorImage(
|
|
146
|
+
enabledElement: CPUFallbackEnabledElement,
|
|
147
|
+
invalidated: boolean
|
|
148
|
+
): void {
|
|
149
|
+
if (enabledElement === undefined) {
|
|
150
|
+
throw new Error(
|
|
151
|
+
'renderColorImage: enabledElement parameter must not be undefined'
|
|
152
|
+
);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
const image = enabledElement.image;
|
|
156
|
+
|
|
157
|
+
if (image === undefined) {
|
|
158
|
+
throw new Error(
|
|
159
|
+
'renderColorImage: image must be loaded before it can be drawn'
|
|
160
|
+
);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// Get the canvas context and reset the transform
|
|
164
|
+
const context = enabledElement.canvas.getContext('2d');
|
|
165
|
+
|
|
166
|
+
context.setTransform(1, 0, 0, 1, 0, 0);
|
|
167
|
+
|
|
168
|
+
// Clear the canvas
|
|
169
|
+
context.fillStyle = 'black';
|
|
170
|
+
context.fillRect(
|
|
171
|
+
0,
|
|
172
|
+
0,
|
|
173
|
+
enabledElement.canvas.width,
|
|
174
|
+
enabledElement.canvas.height
|
|
175
|
+
);
|
|
176
|
+
|
|
177
|
+
// Turn off image smooth/interpolation if pixelReplication is set in the viewport
|
|
178
|
+
context.imageSmoothingEnabled = !enabledElement.viewport.pixelReplication;
|
|
179
|
+
|
|
180
|
+
// Save the canvas context state and apply the viewport properties
|
|
181
|
+
setToPixelCoordinateSystem(enabledElement, context);
|
|
182
|
+
|
|
183
|
+
const renderCanvas = getRenderCanvas(enabledElement, image, invalidated);
|
|
184
|
+
|
|
185
|
+
const sx = enabledElement.viewport.displayedArea.tlhc.x - 1;
|
|
186
|
+
const sy = enabledElement.viewport.displayedArea.tlhc.y - 1;
|
|
187
|
+
const width = enabledElement.viewport.displayedArea.brhc.x - sx;
|
|
188
|
+
const height = enabledElement.viewport.displayedArea.brhc.y - sy;
|
|
189
|
+
|
|
190
|
+
context.drawImage(renderCanvas, sx, sy, width, height, 0, 0, width, height);
|
|
191
|
+
|
|
192
|
+
enabledElement.renderingTools = saveLastRendered(enabledElement);
|
|
193
|
+
}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import storedPixelDataToCanvasImageData from './storedPixelDataToCanvasImageData';
|
|
2
|
+
import storedPixelDataToCanvasImageDataPET from './storedPixelDataToCanvasImageDataPET';
|
|
3
|
+
import storedPixelDataToCanvasImageDataRGBA from './storedPixelDataToCanvasImageDataRGBA';
|
|
4
|
+
import setToPixelCoordinateSystem from './setToPixelCoordinateSystem';
|
|
5
|
+
import now from './now';
|
|
6
|
+
import getLut from './getLut';
|
|
7
|
+
import doesImageNeedToBeRendered from './doesImageNeedToBeRendered';
|
|
8
|
+
import initializeRenderCanvas from './initializeRenderCanvas';
|
|
9
|
+
import saveLastRendered from './saveLastRendered';
|
|
10
|
+
import { IImage, CPUFallbackEnabledElement } from '../../../../types';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Returns an appropriate canvas to render the Image. If the canvas available in the cache is appropriate
|
|
14
|
+
* it is returned, otherwise adjustments are made. It also sets the color transfer functions.
|
|
15
|
+
*
|
|
16
|
+
* @param {Object} enabledElement The cornerstone enabled element
|
|
17
|
+
* @param {Object} image The image to be rendered
|
|
18
|
+
* @param {Boolean} invalidated Is pixel data valid
|
|
19
|
+
* @param {Boolean} [useAlphaChannel = true] Will an alpha channel be used
|
|
20
|
+
* @returns {HTMLCanvasElement} An appropriate canvas for rendering the image
|
|
21
|
+
* @memberof rendering
|
|
22
|
+
*/
|
|
23
|
+
function getRenderCanvas(
|
|
24
|
+
enabledElement: CPUFallbackEnabledElement,
|
|
25
|
+
image: IImage,
|
|
26
|
+
invalidated: boolean,
|
|
27
|
+
useAlphaChannel = true
|
|
28
|
+
): HTMLCanvasElement {
|
|
29
|
+
const canvasWasColor =
|
|
30
|
+
enabledElement.renderingTools.lastRenderedIsColor === true;
|
|
31
|
+
|
|
32
|
+
if (!enabledElement.renderingTools.renderCanvas || canvasWasColor) {
|
|
33
|
+
enabledElement.renderingTools.renderCanvas =
|
|
34
|
+
document.createElement('canvas');
|
|
35
|
+
initializeRenderCanvas(enabledElement, image);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const renderCanvas = enabledElement.renderingTools.renderCanvas;
|
|
39
|
+
|
|
40
|
+
if (
|
|
41
|
+
doesImageNeedToBeRendered(enabledElement, image) === false &&
|
|
42
|
+
invalidated !== true
|
|
43
|
+
) {
|
|
44
|
+
return renderCanvas;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// If our render canvas does not match the size of this image reset it
|
|
48
|
+
// NOTE: This might be inefficient if we are updating multiple images of different
|
|
49
|
+
// Sizes frequently.
|
|
50
|
+
if (
|
|
51
|
+
renderCanvas.width !== image.width ||
|
|
52
|
+
renderCanvas.height !== image.height
|
|
53
|
+
) {
|
|
54
|
+
initializeRenderCanvas(enabledElement, image);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
image.stats = image.stats || {};
|
|
58
|
+
|
|
59
|
+
const renderCanvasData = enabledElement.renderingTools.renderCanvasData;
|
|
60
|
+
const renderCanvasContext = enabledElement.renderingTools.renderCanvasContext;
|
|
61
|
+
|
|
62
|
+
let start = now();
|
|
63
|
+
image.stats.lastLutGenerateTime = now() - start;
|
|
64
|
+
|
|
65
|
+
const { viewport } = enabledElement;
|
|
66
|
+
|
|
67
|
+
// If modality is 'PT' and the image is scaled then the results are floating points,
|
|
68
|
+
// and we cannot create a lut for it (cannot have float indices). Therefore,
|
|
69
|
+
// we use a mapping function to get the voiLUT from the values by applying
|
|
70
|
+
// the windowLevel and windowWidth.
|
|
71
|
+
if (viewport.modality === 'PT' && image.isPreScaled) {
|
|
72
|
+
const { windowWidth, windowCenter } = viewport.voi;
|
|
73
|
+
const minimum = windowCenter - windowWidth / 2;
|
|
74
|
+
const maximum = windowCenter + windowWidth / 2;
|
|
75
|
+
const range = maximum - minimum;
|
|
76
|
+
const collectedMultiplierTerms = 255.0 / range;
|
|
77
|
+
|
|
78
|
+
let petVOILutFunction;
|
|
79
|
+
|
|
80
|
+
if (viewport.invert) {
|
|
81
|
+
petVOILutFunction = (value) =>
|
|
82
|
+
255 - (value - minimum) * collectedMultiplierTerms;
|
|
83
|
+
} else {
|
|
84
|
+
// Note, don't need to math.floor, that is dealt with by setting the value in the Uint8Array.
|
|
85
|
+
petVOILutFunction = (value) =>
|
|
86
|
+
(value - minimum) * collectedMultiplierTerms;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
storedPixelDataToCanvasImageDataPET(
|
|
90
|
+
image,
|
|
91
|
+
petVOILutFunction,
|
|
92
|
+
renderCanvasData.data
|
|
93
|
+
);
|
|
94
|
+
} else {
|
|
95
|
+
// Get the lut to use
|
|
96
|
+
const lut = getLut(image, viewport, invalidated);
|
|
97
|
+
|
|
98
|
+
if (useAlphaChannel) {
|
|
99
|
+
storedPixelDataToCanvasImageData(image, lut, renderCanvasData.data);
|
|
100
|
+
} else {
|
|
101
|
+
storedPixelDataToCanvasImageDataRGBA(image, lut, renderCanvasData.data);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
start = now();
|
|
106
|
+
renderCanvasContext.putImageData(renderCanvasData, 0, 0);
|
|
107
|
+
image.stats.lastPutImageDataTime = now() - start;
|
|
108
|
+
|
|
109
|
+
return renderCanvas;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* API function to draw a grayscale image to a given enabledElement
|
|
114
|
+
*
|
|
115
|
+
* @param {EnabledElement} enabledElement The Cornerstone Enabled Element to redraw
|
|
116
|
+
* @param {Boolean} invalidated - true if pixel data has been invalidated and cached rendering should not be used
|
|
117
|
+
* @returns {void}
|
|
118
|
+
* @memberof rendering
|
|
119
|
+
*/
|
|
120
|
+
export function renderGrayscaleImage(
|
|
121
|
+
enabledElement: CPUFallbackEnabledElement,
|
|
122
|
+
invalidated: boolean
|
|
123
|
+
): void {
|
|
124
|
+
if (enabledElement === undefined) {
|
|
125
|
+
throw new Error(
|
|
126
|
+
'drawImage: enabledElement parameter must not be undefined'
|
|
127
|
+
);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
const image = enabledElement.image;
|
|
131
|
+
|
|
132
|
+
if (image === undefined) {
|
|
133
|
+
throw new Error('drawImage: image must be loaded before it can be drawn');
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Get the canvas context and reset the transform
|
|
137
|
+
const context = enabledElement.canvas.getContext('2d');
|
|
138
|
+
|
|
139
|
+
context.setTransform(1, 0, 0, 1, 0, 0);
|
|
140
|
+
|
|
141
|
+
// Clear the canvas
|
|
142
|
+
context.fillStyle = 'black';
|
|
143
|
+
context.fillRect(
|
|
144
|
+
0,
|
|
145
|
+
0,
|
|
146
|
+
enabledElement.canvas.width,
|
|
147
|
+
enabledElement.canvas.height
|
|
148
|
+
);
|
|
149
|
+
|
|
150
|
+
// Turn off image smooth/interpolation if pixelReplication is set in the viewport
|
|
151
|
+
context.imageSmoothingEnabled = !enabledElement.viewport.pixelReplication;
|
|
152
|
+
|
|
153
|
+
// Save the canvas context state and apply the viewport properties
|
|
154
|
+
setToPixelCoordinateSystem(enabledElement, context);
|
|
155
|
+
|
|
156
|
+
const renderCanvas = getRenderCanvas(enabledElement, image, invalidated);
|
|
157
|
+
|
|
158
|
+
const sx = enabledElement.viewport.displayedArea.tlhc.x - 1;
|
|
159
|
+
const sy = enabledElement.viewport.displayedArea.tlhc.y - 1;
|
|
160
|
+
const width = enabledElement.viewport.displayedArea.brhc.x - sx;
|
|
161
|
+
const height = enabledElement.viewport.displayedArea.brhc.y - sy;
|
|
162
|
+
|
|
163
|
+
context.drawImage(renderCanvas, sx, sy, width, height, 0, 0, width, height);
|
|
164
|
+
|
|
165
|
+
enabledElement.renderingTools = saveLastRendered(enabledElement);
|
|
166
|
+
}
|