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