@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.
Files changed (223) hide show
  1. package/dist/cjs/utilities/getSliceRange.js +2 -1
  2. package/dist/cjs/utilities/getSliceRange.js.map +1 -1
  3. package/dist/esm/utilities/getSliceRange.js +2 -1
  4. package/dist/esm/utilities/getSliceRange.js.map +1 -1
  5. package/dist/umd/index.js +1 -1
  6. package/dist/umd/index.js.map +1 -1
  7. package/package.json +4 -3
  8. package/src/RenderingEngine/BaseVolumeViewport.ts +847 -0
  9. package/src/RenderingEngine/RenderingEngine.ts +1364 -0
  10. package/src/RenderingEngine/StackViewport.ts +2690 -0
  11. package/src/RenderingEngine/Viewport.ts +1244 -0
  12. package/src/RenderingEngine/VolumeViewport.ts +420 -0
  13. package/src/RenderingEngine/VolumeViewport3D.ts +42 -0
  14. package/src/RenderingEngine/getRenderingEngine.ts +34 -0
  15. package/src/RenderingEngine/helpers/addVolumesToViewports.ts +52 -0
  16. package/src/RenderingEngine/helpers/cpuFallback/colors/colormap.ts +343 -0
  17. package/src/RenderingEngine/helpers/cpuFallback/colors/index.ts +4 -0
  18. package/src/RenderingEngine/helpers/cpuFallback/colors/lookupTable.ts +469 -0
  19. package/src/RenderingEngine/helpers/cpuFallback/drawImageSync.ts +58 -0
  20. package/src/RenderingEngine/helpers/cpuFallback/rendering/calculateTransform.ts +136 -0
  21. package/src/RenderingEngine/helpers/cpuFallback/rendering/canvasToPixel.ts +25 -0
  22. package/src/RenderingEngine/helpers/cpuFallback/rendering/computeAutoVoi.ts +47 -0
  23. package/src/RenderingEngine/helpers/cpuFallback/rendering/correctShift.ts +38 -0
  24. package/src/RenderingEngine/helpers/cpuFallback/rendering/createViewport.ts +64 -0
  25. package/src/RenderingEngine/helpers/cpuFallback/rendering/doesImageNeedToBeRendered.ts +36 -0
  26. package/src/RenderingEngine/helpers/cpuFallback/rendering/fitToWindow.ts +22 -0
  27. package/src/RenderingEngine/helpers/cpuFallback/rendering/generateColorLUT.ts +60 -0
  28. package/src/RenderingEngine/helpers/cpuFallback/rendering/generateLut.ts +83 -0
  29. package/src/RenderingEngine/helpers/cpuFallback/rendering/getDefaultViewport.ts +88 -0
  30. package/src/RenderingEngine/helpers/cpuFallback/rendering/getImageFitScale.ts +52 -0
  31. package/src/RenderingEngine/helpers/cpuFallback/rendering/getImageSize.ts +55 -0
  32. package/src/RenderingEngine/helpers/cpuFallback/rendering/getLut.ts +53 -0
  33. package/src/RenderingEngine/helpers/cpuFallback/rendering/getModalityLut.ts +55 -0
  34. package/src/RenderingEngine/helpers/cpuFallback/rendering/getTransform.ts +17 -0
  35. package/src/RenderingEngine/helpers/cpuFallback/rendering/getVOILut.ts +74 -0
  36. package/src/RenderingEngine/helpers/cpuFallback/rendering/initializeRenderCanvas.ts +37 -0
  37. package/src/RenderingEngine/helpers/cpuFallback/rendering/lutMatches.ts +21 -0
  38. package/src/RenderingEngine/helpers/cpuFallback/rendering/now.ts +13 -0
  39. package/src/RenderingEngine/helpers/cpuFallback/rendering/pixelToCanvas.ts +22 -0
  40. package/src/RenderingEngine/helpers/cpuFallback/rendering/renderColorImage.ts +193 -0
  41. package/src/RenderingEngine/helpers/cpuFallback/rendering/renderGrayscaleImage.ts +166 -0
  42. package/src/RenderingEngine/helpers/cpuFallback/rendering/renderPseudoColorImage.ts +203 -0
  43. package/src/RenderingEngine/helpers/cpuFallback/rendering/resetCamera.ts +32 -0
  44. package/src/RenderingEngine/helpers/cpuFallback/rendering/resize.ts +109 -0
  45. package/src/RenderingEngine/helpers/cpuFallback/rendering/saveLastRendered.ts +36 -0
  46. package/src/RenderingEngine/helpers/cpuFallback/rendering/setDefaultViewport.ts +17 -0
  47. package/src/RenderingEngine/helpers/cpuFallback/rendering/setToPixelCoordinateSystem.ts +32 -0
  48. package/src/RenderingEngine/helpers/cpuFallback/rendering/storedColorPixelDataToCanvasImageData.ts +58 -0
  49. package/src/RenderingEngine/helpers/cpuFallback/rendering/storedPixelDataToCanvasImageData.ts +76 -0
  50. package/src/RenderingEngine/helpers/cpuFallback/rendering/storedPixelDataToCanvasImageDataColorLUT.ts +60 -0
  51. package/src/RenderingEngine/helpers/cpuFallback/rendering/storedPixelDataToCanvasImageDataPET.ts +50 -0
  52. package/src/RenderingEngine/helpers/cpuFallback/rendering/storedPixelDataToCanvasImageDataPseudocolorLUT.ts +66 -0
  53. package/src/RenderingEngine/helpers/cpuFallback/rendering/storedPixelDataToCanvasImageDataPseudocolorLUTPET.ts +68 -0
  54. package/src/RenderingEngine/helpers/cpuFallback/rendering/storedPixelDataToCanvasImageDataRGBA.ts +81 -0
  55. package/src/RenderingEngine/helpers/cpuFallback/rendering/storedRGBAPixelDataToCanvasImageData.ts +56 -0
  56. package/src/RenderingEngine/helpers/cpuFallback/rendering/transform.ts +126 -0
  57. package/src/RenderingEngine/helpers/cpuFallback/rendering/validator.ts +31 -0
  58. package/src/RenderingEngine/helpers/createVolumeActor.ts +103 -0
  59. package/src/RenderingEngine/helpers/createVolumeMapper.ts +37 -0
  60. package/src/RenderingEngine/helpers/getOrCreateCanvas.ts +58 -0
  61. package/src/RenderingEngine/helpers/index.ts +15 -0
  62. package/src/RenderingEngine/helpers/isRgbaSourceRgbDest.ts +1 -0
  63. package/src/RenderingEngine/helpers/setDefaultVolumeVOI.ts +227 -0
  64. package/src/RenderingEngine/helpers/setVolumesForViewports.ts +52 -0
  65. package/src/RenderingEngine/helpers/viewportTypeToViewportClass.ts +14 -0
  66. package/src/RenderingEngine/helpers/viewportTypeUsesCustomRenderingPipeline.ts +7 -0
  67. package/src/RenderingEngine/helpers/volumeNewImageEventDispatcher.ts +75 -0
  68. package/src/RenderingEngine/index.ts +23 -0
  69. package/src/RenderingEngine/renderingEngineCache.ts +43 -0
  70. package/src/RenderingEngine/vtkClasses/index.js +11 -0
  71. package/src/RenderingEngine/vtkClasses/vtkOffscreenMultiRenderWindow.js +149 -0
  72. package/src/RenderingEngine/vtkClasses/vtkSharedVolumeMapper.js +52 -0
  73. package/src/RenderingEngine/vtkClasses/vtkSlabCamera.d.ts +781 -0
  74. package/src/RenderingEngine/vtkClasses/vtkSlabCamera.js +155 -0
  75. package/src/RenderingEngine/vtkClasses/vtkStreamingOpenGLRenderWindow.js +47 -0
  76. package/src/RenderingEngine/vtkClasses/vtkStreamingOpenGLTexture.js +272 -0
  77. package/src/RenderingEngine/vtkClasses/vtkStreamingOpenGLViewNodeFactory.js +159 -0
  78. package/src/RenderingEngine/vtkClasses/vtkStreamingOpenGLVolumeMapper.js +319 -0
  79. package/src/Settings.ts +294 -0
  80. package/src/cache/cache.ts +854 -0
  81. package/src/cache/classes/Contour.ts +70 -0
  82. package/src/cache/classes/ContourSet.ts +151 -0
  83. package/src/cache/classes/ImageVolume.ts +155 -0
  84. package/src/cache/index.ts +5 -0
  85. package/src/constants/cpuColormaps.ts +1537 -0
  86. package/src/constants/epsilon.ts +3 -0
  87. package/src/constants/index.ts +13 -0
  88. package/src/constants/mprCameraValues.ts +20 -0
  89. package/src/constants/rendering.ts +8 -0
  90. package/src/constants/viewportPresets.ts +357 -0
  91. package/src/enums/BlendModes.ts +23 -0
  92. package/src/enums/ContourType.ts +6 -0
  93. package/src/enums/Events.ts +196 -0
  94. package/src/enums/GeometryType.ts +5 -0
  95. package/src/enums/InterpolationType.ts +13 -0
  96. package/src/enums/OrientationAxis.ts +8 -0
  97. package/src/enums/RequestType.ts +13 -0
  98. package/src/enums/SharedArrayBufferModes.ts +11 -0
  99. package/src/enums/VOILUTFunctionType.ts +10 -0
  100. package/src/enums/ViewportType.ts +21 -0
  101. package/src/enums/index.ts +23 -0
  102. package/src/eventTarget.ts +67 -0
  103. package/src/getEnabledElement.ts +105 -0
  104. package/src/global.ts +8 -0
  105. package/src/index.ts +123 -0
  106. package/src/init.ts +247 -0
  107. package/src/loaders/geometryLoader.ts +108 -0
  108. package/src/loaders/imageLoader.ts +298 -0
  109. package/src/loaders/volumeLoader.ts +477 -0
  110. package/src/metaData.ts +84 -0
  111. package/src/requestPool/imageLoadPoolManager.ts +43 -0
  112. package/src/requestPool/imageRetrievalPoolManager.ts +25 -0
  113. package/src/requestPool/requestPoolManager.ts +329 -0
  114. package/src/types/ActorSliceRange.ts +17 -0
  115. package/src/types/CPUFallbackColormap.ts +23 -0
  116. package/src/types/CPUFallbackColormapData.ts +12 -0
  117. package/src/types/CPUFallbackColormapsData.ts +7 -0
  118. package/src/types/CPUFallbackEnabledElement.ts +71 -0
  119. package/src/types/CPUFallbackLUT.ts +5 -0
  120. package/src/types/CPUFallbackLookupTable.ts +17 -0
  121. package/src/types/CPUFallbackRenderingTools.ts +25 -0
  122. package/src/types/CPUFallbackTransform.ts +16 -0
  123. package/src/types/CPUFallbackViewport.ts +29 -0
  124. package/src/types/CPUFallbackViewportDisplayedArea.ts +15 -0
  125. package/src/types/CPUIImageData.ts +47 -0
  126. package/src/types/ContourData.ts +19 -0
  127. package/src/types/Cornerstone3DConfig.ts +31 -0
  128. package/src/types/CustomEventType.ts +14 -0
  129. package/src/types/EventTypes.ts +403 -0
  130. package/src/types/FlipDirection.ts +9 -0
  131. package/src/types/IActor.ts +23 -0
  132. package/src/types/ICache.ts +28 -0
  133. package/src/types/ICachedGeometry.ts +13 -0
  134. package/src/types/ICachedImage.ts +13 -0
  135. package/src/types/ICachedVolume.ts +12 -0
  136. package/src/types/ICamera.ts +36 -0
  137. package/src/types/IContour.ts +18 -0
  138. package/src/types/IContourSet.ts +56 -0
  139. package/src/types/IDynamicImageVolume.ts +18 -0
  140. package/src/types/IEnabledElement.ts +21 -0
  141. package/src/types/IGeometry.ts +12 -0
  142. package/src/types/IImage.ts +113 -0
  143. package/src/types/IImageData.ts +45 -0
  144. package/src/types/IImageVolume.ts +78 -0
  145. package/src/types/ILoadObject.ts +36 -0
  146. package/src/types/IRegisterImageLoader.ts +10 -0
  147. package/src/types/IRenderingEngine.ts +28 -0
  148. package/src/types/IStackViewport.ts +138 -0
  149. package/src/types/IStreamingImageVolume.ts +13 -0
  150. package/src/types/IStreamingVolumeProperties.ts +14 -0
  151. package/src/types/IViewport.ts +149 -0
  152. package/src/types/IViewportId.ts +9 -0
  153. package/src/types/IVolume.ts +45 -0
  154. package/src/types/IVolumeInput.ts +36 -0
  155. package/src/types/IVolumeViewport.ts +141 -0
  156. package/src/types/ImageLoaderFn.ts +16 -0
  157. package/src/types/ImageSliceData.ts +6 -0
  158. package/src/types/Mat3.ts +16 -0
  159. package/src/types/Metadata.ts +39 -0
  160. package/src/types/OrientationVectors.ts +36 -0
  161. package/src/types/Plane.ts +6 -0
  162. package/src/types/Point2.ts +6 -0
  163. package/src/types/Point3.ts +6 -0
  164. package/src/types/Point4.ts +6 -0
  165. package/src/types/ScalingParameters.ts +27 -0
  166. package/src/types/StackViewportProperties.ts +25 -0
  167. package/src/types/TransformMatrix2D.ts +4 -0
  168. package/src/types/ViewportInputOptions.ts +21 -0
  169. package/src/types/ViewportPreset.ts +14 -0
  170. package/src/types/VolumeLoaderFn.ts +18 -0
  171. package/src/types/VolumeViewportProperties.ts +14 -0
  172. package/src/types/index.ts +157 -0
  173. package/src/types/voi.ts +15 -0
  174. package/src/utilities/actorCheck.ts +24 -0
  175. package/src/utilities/applyPreset.ts +132 -0
  176. package/src/utilities/calculateViewportsSpatialRegistration.ts +74 -0
  177. package/src/utilities/calibratedPixelSpacingMetadataProvider.ts +38 -0
  178. package/src/utilities/createFloat32SharedArray.ts +45 -0
  179. package/src/utilities/createInt16SharedArray.ts +43 -0
  180. package/src/utilities/createLinearRGBTransferFunction.ts +22 -0
  181. package/src/utilities/createSigmoidRGBTransferFunction.ts +63 -0
  182. package/src/utilities/createUInt16SharedArray.ts +43 -0
  183. package/src/utilities/createUint8SharedArray.ts +45 -0
  184. package/src/utilities/deepFreeze.ts +19 -0
  185. package/src/utilities/deepMerge.ts +81 -0
  186. package/src/utilities/getClosestImageId.ts +80 -0
  187. package/src/utilities/getClosestStackImageIndexForPoint.ts +116 -0
  188. package/src/utilities/getImageSliceDataForVolumeViewport.ts +61 -0
  189. package/src/utilities/getMinMax.ts +31 -0
  190. package/src/utilities/getRuntimeId.ts +54 -0
  191. package/src/utilities/getScalarDataType.ts +31 -0
  192. package/src/utilities/getScalingParameters.ts +35 -0
  193. package/src/utilities/getSliceRange.ts +86 -0
  194. package/src/utilities/getSpacingInNormalDirection.ts +44 -0
  195. package/src/utilities/getTargetVolumeAndSpacingInNormalDir.ts +126 -0
  196. package/src/utilities/getViewportImageCornersInWorld.ts +102 -0
  197. package/src/utilities/getViewportsWithImageURI.ts +46 -0
  198. package/src/utilities/getViewportsWithVolumeId.ts +38 -0
  199. package/src/utilities/getVoiFromSigmoidRGBTransferFunction.ts +23 -0
  200. package/src/utilities/getVolumeActorCorners.ts +24 -0
  201. package/src/utilities/getVolumeSliceRangeInfo.ts +52 -0
  202. package/src/utilities/getVolumeViewportScrollInfo.ts +32 -0
  203. package/src/utilities/getVolumeViewportsContainingSameVolumes.ts +58 -0
  204. package/src/utilities/hasNaNValues.ts +12 -0
  205. package/src/utilities/imageIdToURI.ts +10 -0
  206. package/src/utilities/imageToWorldCoords.ts +54 -0
  207. package/src/utilities/index.ts +100 -0
  208. package/src/utilities/indexWithinDimensions.ts +27 -0
  209. package/src/utilities/invertRgbTransferFunction.ts +36 -0
  210. package/src/utilities/isEqual.ts +27 -0
  211. package/src/utilities/isOpposite.ts +23 -0
  212. package/src/utilities/isTypedArray.ts +20 -0
  213. package/src/utilities/loadImageToCanvas.ts +80 -0
  214. package/src/utilities/planar.ts +91 -0
  215. package/src/utilities/renderToCanvas.ts +32 -0
  216. package/src/utilities/scaleRgbTransferFunction.ts +37 -0
  217. package/src/utilities/snapFocalPointToSlice.ts +78 -0
  218. package/src/utilities/spatialRegistrationMetadataProvider.ts +50 -0
  219. package/src/utilities/transformWorldToIndex.ts +16 -0
  220. package/src/utilities/triggerEvent.ts +38 -0
  221. package/src/utilities/uuidv4.ts +13 -0
  222. package/src/utilities/windowLevel.ts +39 -0
  223. 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
+ }