@cornerstonejs/tools 1.23.4 → 1.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (225) hide show
  1. package/dist/cjs/utilities/getVOIMultipliers.d.ts +5 -0
  2. package/dist/cjs/utilities/getVOIMultipliers.js +23 -0
  3. package/dist/cjs/utilities/getVOIMultipliers.js.map +1 -0
  4. package/dist/cjs/utilities/index.d.ts +2 -1
  5. package/dist/cjs/utilities/index.js +3 -1
  6. package/dist/cjs/utilities/index.js.map +1 -1
  7. package/dist/cjs/utilities/math/vec3/interpolateVec3.d.ts +2 -0
  8. package/dist/cjs/utilities/math/vec3/interpolateVec3.js +13 -0
  9. package/dist/cjs/utilities/math/vec3/interpolateVec3.js.map +1 -0
  10. package/dist/cjs/utilities/viewport/isViewportPreScaled.js +2 -1
  11. package/dist/cjs/utilities/viewport/isViewportPreScaled.js.map +1 -1
  12. package/dist/cjs/utilities/voi/colorbar/Colorbar.d.ts +44 -0
  13. package/dist/cjs/utilities/voi/colorbar/Colorbar.js +249 -0
  14. package/dist/cjs/utilities/voi/colorbar/Colorbar.js.map +1 -0
  15. package/dist/cjs/utilities/voi/colorbar/ColorbarCanvas.d.ts +29 -0
  16. package/dist/cjs/utilities/voi/colorbar/ColorbarCanvas.js +184 -0
  17. package/dist/cjs/utilities/voi/colorbar/ColorbarCanvas.js.map +1 -0
  18. package/dist/cjs/utilities/voi/colorbar/ColorbarTicks.d.ts +46 -0
  19. package/dist/cjs/utilities/voi/colorbar/ColorbarTicks.js +286 -0
  20. package/dist/cjs/utilities/voi/colorbar/ColorbarTicks.js.map +1 -0
  21. package/dist/cjs/utilities/voi/colorbar/ViewportColorbar.d.ts +23 -0
  22. package/dist/cjs/utilities/voi/colorbar/ViewportColorbar.js +126 -0
  23. package/dist/cjs/utilities/voi/colorbar/ViewportColorbar.js.map +1 -0
  24. package/dist/cjs/utilities/voi/colorbar/common/areColorbarRangesEqual.d.ts +3 -0
  25. package/dist/cjs/utilities/voi/colorbar/common/areColorbarRangesEqual.js +9 -0
  26. package/dist/cjs/utilities/voi/colorbar/common/areColorbarRangesEqual.js.map +1 -0
  27. package/dist/cjs/utilities/voi/colorbar/common/areColorbarSizesEqual.d.ts +3 -0
  28. package/dist/cjs/utilities/voi/colorbar/common/areColorbarSizesEqual.js +9 -0
  29. package/dist/cjs/utilities/voi/colorbar/common/areColorbarSizesEqual.js.map +1 -0
  30. package/dist/cjs/utilities/voi/colorbar/common/index.d.ts +4 -0
  31. package/dist/cjs/utilities/voi/colorbar/common/index.js +12 -0
  32. package/dist/cjs/utilities/voi/colorbar/common/index.js.map +1 -0
  33. package/dist/cjs/utilities/voi/colorbar/common/isColorbarSizeValid.d.ts +3 -0
  34. package/dist/cjs/utilities/voi/colorbar/common/isColorbarSizeValid.js +9 -0
  35. package/dist/cjs/utilities/voi/colorbar/common/isColorbarSizeValid.js.map +1 -0
  36. package/dist/cjs/utilities/voi/colorbar/common/isRangeTextPositionValid.d.ts +3 -0
  37. package/dist/cjs/utilities/voi/colorbar/common/isRangeTextPositionValid.js +14 -0
  38. package/dist/cjs/utilities/voi/colorbar/common/isRangeTextPositionValid.js.map +1 -0
  39. package/dist/cjs/utilities/voi/colorbar/common/isRangeValid.d.ts +3 -0
  40. package/dist/cjs/utilities/voi/colorbar/common/isRangeValid.js +9 -0
  41. package/dist/cjs/utilities/voi/colorbar/common/isRangeValid.js.map +1 -0
  42. package/dist/cjs/utilities/voi/colorbar/enums/ColorbarRangeTextPosition.d.ts +6 -0
  43. package/dist/cjs/utilities/voi/colorbar/enums/ColorbarRangeTextPosition.js +11 -0
  44. package/dist/cjs/utilities/voi/colorbar/enums/ColorbarRangeTextPosition.js.map +1 -0
  45. package/dist/cjs/utilities/voi/colorbar/enums/index.d.ts +1 -0
  46. package/dist/cjs/utilities/voi/colorbar/enums/index.js +6 -0
  47. package/dist/cjs/utilities/voi/colorbar/enums/index.js.map +1 -0
  48. package/dist/cjs/utilities/voi/colorbar/index.d.ts +6 -0
  49. package/dist/cjs/utilities/voi/colorbar/index.js +33 -0
  50. package/dist/cjs/utilities/voi/colorbar/index.js.map +1 -0
  51. package/dist/cjs/utilities/voi/colorbar/types/ColorbarCanvasProps.d.ts +12 -0
  52. package/dist/cjs/utilities/voi/colorbar/types/ColorbarCanvasProps.js +3 -0
  53. package/dist/cjs/utilities/voi/colorbar/types/ColorbarCanvasProps.js.map +1 -0
  54. package/dist/cjs/utilities/voi/colorbar/types/ColorbarCommonProps.d.ts +11 -0
  55. package/dist/cjs/utilities/voi/colorbar/types/ColorbarCommonProps.js +3 -0
  56. package/dist/cjs/utilities/voi/colorbar/types/ColorbarCommonProps.js.map +1 -0
  57. package/dist/cjs/utilities/voi/colorbar/types/ColorbarImageRange.d.ts +4 -0
  58. package/dist/cjs/utilities/voi/colorbar/types/ColorbarImageRange.js +3 -0
  59. package/dist/cjs/utilities/voi/colorbar/types/ColorbarImageRange.js.map +1 -0
  60. package/dist/cjs/utilities/voi/colorbar/types/ColorbarProps.d.ts +7 -0
  61. package/dist/cjs/utilities/voi/colorbar/types/ColorbarProps.js +3 -0
  62. package/dist/cjs/utilities/voi/colorbar/types/ColorbarProps.js.map +1 -0
  63. package/dist/cjs/utilities/voi/colorbar/types/ColorbarSize.d.ts +4 -0
  64. package/dist/cjs/utilities/voi/colorbar/types/ColorbarSize.js +3 -0
  65. package/dist/cjs/utilities/voi/colorbar/types/ColorbarSize.js.map +1 -0
  66. package/dist/cjs/utilities/voi/colorbar/types/ColorbarTicksProps.d.ts +7 -0
  67. package/dist/cjs/utilities/voi/colorbar/types/ColorbarTicksProps.js +3 -0
  68. package/dist/cjs/utilities/voi/colorbar/types/ColorbarTicksProps.js.map +1 -0
  69. package/dist/cjs/utilities/voi/colorbar/types/ColorbarTicksStyle.d.ts +8 -0
  70. package/dist/cjs/utilities/voi/colorbar/types/ColorbarTicksStyle.js +3 -0
  71. package/dist/cjs/utilities/voi/colorbar/types/ColorbarTicksStyle.js.map +1 -0
  72. package/dist/cjs/utilities/voi/colorbar/types/ColorbarVOIRange.d.ts +2 -0
  73. package/dist/cjs/utilities/voi/colorbar/types/ColorbarVOIRange.js +3 -0
  74. package/dist/cjs/utilities/voi/colorbar/types/ColorbarVOIRange.js.map +1 -0
  75. package/dist/cjs/utilities/voi/colorbar/types/ViewportColorbarProps.d.ts +5 -0
  76. package/dist/cjs/utilities/voi/colorbar/types/ViewportColorbarProps.js +3 -0
  77. package/dist/cjs/utilities/voi/colorbar/types/ViewportColorbarProps.js.map +1 -0
  78. package/dist/cjs/utilities/voi/colorbar/types/index.d.ts +8 -0
  79. package/dist/cjs/utilities/voi/colorbar/types/index.js +3 -0
  80. package/dist/cjs/utilities/voi/colorbar/types/index.js.map +1 -0
  81. package/dist/cjs/utilities/voi/index.d.ts +2 -0
  82. package/dist/cjs/utilities/voi/index.js +29 -0
  83. package/dist/cjs/utilities/voi/index.js.map +1 -0
  84. package/dist/cjs/widgets/Widget.d.ts +17 -0
  85. package/dist/cjs/widgets/Widget.js +71 -0
  86. package/dist/cjs/widgets/Widget.js.map +1 -0
  87. package/dist/cjs/widgets/types/WidgetProps.d.ts +4 -0
  88. package/dist/cjs/widgets/types/WidgetProps.js +3 -0
  89. package/dist/cjs/widgets/types/WidgetProps.js.map +1 -0
  90. package/dist/cjs/widgets/types/WidgetSize.d.ts +4 -0
  91. package/dist/cjs/widgets/types/WidgetSize.js +3 -0
  92. package/dist/cjs/widgets/types/WidgetSize.js.map +1 -0
  93. package/dist/cjs/widgets/types/index.d.ts +2 -0
  94. package/dist/cjs/widgets/types/index.js +3 -0
  95. package/dist/cjs/widgets/types/index.js.map +1 -0
  96. package/dist/esm/utilities/getVOIMultipliers.d.ts +5 -0
  97. package/dist/esm/utilities/getVOIMultipliers.js +19 -0
  98. package/dist/esm/utilities/getVOIMultipliers.js.map +1 -0
  99. package/dist/esm/utilities/index.d.ts +2 -1
  100. package/dist/esm/utilities/index.js +2 -1
  101. package/dist/esm/utilities/index.js.map +1 -1
  102. package/dist/esm/utilities/math/vec3/interpolateVec3.d.ts +2 -0
  103. package/dist/esm/utilities/math/vec3/interpolateVec3.js +9 -0
  104. package/dist/esm/utilities/math/vec3/interpolateVec3.js.map +1 -0
  105. package/dist/esm/utilities/viewport/isViewportPreScaled.js +2 -1
  106. package/dist/esm/utilities/viewport/isViewportPreScaled.js.map +1 -1
  107. package/dist/esm/utilities/voi/colorbar/Colorbar.d.ts +44 -0
  108. package/dist/esm/utilities/voi/colorbar/Colorbar.js +241 -0
  109. package/dist/esm/utilities/voi/colorbar/Colorbar.js.map +1 -0
  110. package/dist/esm/utilities/voi/colorbar/ColorbarCanvas.d.ts +29 -0
  111. package/dist/esm/utilities/voi/colorbar/ColorbarCanvas.js +177 -0
  112. package/dist/esm/utilities/voi/colorbar/ColorbarCanvas.js.map +1 -0
  113. package/dist/esm/utilities/voi/colorbar/ColorbarTicks.d.ts +46 -0
  114. package/dist/esm/utilities/voi/colorbar/ColorbarTicks.js +281 -0
  115. package/dist/esm/utilities/voi/colorbar/ColorbarTicks.js.map +1 -0
  116. package/dist/esm/utilities/voi/colorbar/ViewportColorbar.d.ts +23 -0
  117. package/dist/esm/utilities/voi/colorbar/ViewportColorbar.js +122 -0
  118. package/dist/esm/utilities/voi/colorbar/ViewportColorbar.js.map +1 -0
  119. package/dist/esm/utilities/voi/colorbar/common/areColorbarRangesEqual.d.ts +3 -0
  120. package/dist/esm/utilities/voi/colorbar/common/areColorbarRangesEqual.js +5 -0
  121. package/dist/esm/utilities/voi/colorbar/common/areColorbarRangesEqual.js.map +1 -0
  122. package/dist/esm/utilities/voi/colorbar/common/areColorbarSizesEqual.d.ts +3 -0
  123. package/dist/esm/utilities/voi/colorbar/common/areColorbarSizesEqual.js +5 -0
  124. package/dist/esm/utilities/voi/colorbar/common/areColorbarSizesEqual.js.map +1 -0
  125. package/dist/esm/utilities/voi/colorbar/common/index.d.ts +4 -0
  126. package/dist/esm/utilities/voi/colorbar/common/index.js +5 -0
  127. package/dist/esm/utilities/voi/colorbar/common/index.js.map +1 -0
  128. package/dist/esm/utilities/voi/colorbar/common/isColorbarSizeValid.d.ts +3 -0
  129. package/dist/esm/utilities/voi/colorbar/common/isColorbarSizeValid.js +5 -0
  130. package/dist/esm/utilities/voi/colorbar/common/isColorbarSizeValid.js.map +1 -0
  131. package/dist/esm/utilities/voi/colorbar/common/isRangeTextPositionValid.d.ts +3 -0
  132. package/dist/esm/utilities/voi/colorbar/common/isRangeTextPositionValid.js +10 -0
  133. package/dist/esm/utilities/voi/colorbar/common/isRangeTextPositionValid.js.map +1 -0
  134. package/dist/esm/utilities/voi/colorbar/common/isRangeValid.d.ts +3 -0
  135. package/dist/esm/utilities/voi/colorbar/common/isRangeValid.js +5 -0
  136. package/dist/esm/utilities/voi/colorbar/common/isRangeValid.js.map +1 -0
  137. package/dist/esm/utilities/voi/colorbar/enums/ColorbarRangeTextPosition.d.ts +6 -0
  138. package/dist/esm/utilities/voi/colorbar/enums/ColorbarRangeTextPosition.js +8 -0
  139. package/dist/esm/utilities/voi/colorbar/enums/ColorbarRangeTextPosition.js.map +1 -0
  140. package/dist/esm/utilities/voi/colorbar/enums/index.d.ts +1 -0
  141. package/dist/esm/utilities/voi/colorbar/enums/index.js +2 -0
  142. package/dist/esm/utilities/voi/colorbar/enums/index.js.map +1 -0
  143. package/dist/esm/utilities/voi/colorbar/index.d.ts +6 -0
  144. package/dist/esm/utilities/voi/colorbar/index.js +5 -0
  145. package/dist/esm/utilities/voi/colorbar/index.js.map +1 -0
  146. package/dist/esm/utilities/voi/colorbar/types/ColorbarCanvasProps.d.ts +12 -0
  147. package/dist/esm/utilities/voi/colorbar/types/ColorbarCanvasProps.js +2 -0
  148. package/dist/esm/utilities/voi/colorbar/types/ColorbarCanvasProps.js.map +1 -0
  149. package/dist/esm/utilities/voi/colorbar/types/ColorbarCommonProps.d.ts +11 -0
  150. package/dist/esm/utilities/voi/colorbar/types/ColorbarCommonProps.js +2 -0
  151. package/dist/esm/utilities/voi/colorbar/types/ColorbarCommonProps.js.map +1 -0
  152. package/dist/esm/utilities/voi/colorbar/types/ColorbarImageRange.d.ts +4 -0
  153. package/dist/esm/utilities/voi/colorbar/types/ColorbarImageRange.js +2 -0
  154. package/dist/esm/utilities/voi/colorbar/types/ColorbarImageRange.js.map +1 -0
  155. package/dist/esm/utilities/voi/colorbar/types/ColorbarProps.d.ts +7 -0
  156. package/dist/esm/utilities/voi/colorbar/types/ColorbarProps.js +2 -0
  157. package/dist/esm/utilities/voi/colorbar/types/ColorbarProps.js.map +1 -0
  158. package/dist/esm/utilities/voi/colorbar/types/ColorbarSize.d.ts +4 -0
  159. package/dist/esm/utilities/voi/colorbar/types/ColorbarSize.js +2 -0
  160. package/dist/esm/utilities/voi/colorbar/types/ColorbarSize.js.map +1 -0
  161. package/dist/esm/utilities/voi/colorbar/types/ColorbarTicksProps.d.ts +7 -0
  162. package/dist/esm/utilities/voi/colorbar/types/ColorbarTicksProps.js +2 -0
  163. package/dist/esm/utilities/voi/colorbar/types/ColorbarTicksProps.js.map +1 -0
  164. package/dist/esm/utilities/voi/colorbar/types/ColorbarTicksStyle.d.ts +8 -0
  165. package/dist/esm/utilities/voi/colorbar/types/ColorbarTicksStyle.js +2 -0
  166. package/dist/esm/utilities/voi/colorbar/types/ColorbarTicksStyle.js.map +1 -0
  167. package/dist/esm/utilities/voi/colorbar/types/ColorbarVOIRange.d.ts +2 -0
  168. package/dist/esm/utilities/voi/colorbar/types/ColorbarVOIRange.js +2 -0
  169. package/dist/esm/utilities/voi/colorbar/types/ColorbarVOIRange.js.map +1 -0
  170. package/dist/esm/utilities/voi/colorbar/types/ViewportColorbarProps.d.ts +5 -0
  171. package/dist/esm/utilities/voi/colorbar/types/ViewportColorbarProps.js +2 -0
  172. package/dist/esm/utilities/voi/colorbar/types/ViewportColorbarProps.js.map +1 -0
  173. package/dist/esm/utilities/voi/colorbar/types/index.d.ts +8 -0
  174. package/dist/esm/utilities/voi/colorbar/types/index.js +2 -0
  175. package/dist/esm/utilities/voi/colorbar/types/index.js.map +1 -0
  176. package/dist/esm/utilities/voi/index.d.ts +2 -0
  177. package/dist/esm/utilities/voi/index.js +3 -0
  178. package/dist/esm/utilities/voi/index.js.map +1 -0
  179. package/dist/esm/widgets/Widget.d.ts +17 -0
  180. package/dist/esm/widgets/Widget.js +67 -0
  181. package/dist/esm/widgets/Widget.js.map +1 -0
  182. package/dist/esm/widgets/types/WidgetProps.d.ts +4 -0
  183. package/dist/esm/widgets/types/WidgetProps.js +2 -0
  184. package/dist/esm/widgets/types/WidgetProps.js.map +1 -0
  185. package/dist/esm/widgets/types/WidgetSize.d.ts +4 -0
  186. package/dist/esm/widgets/types/WidgetSize.js +2 -0
  187. package/dist/esm/widgets/types/WidgetSize.js.map +1 -0
  188. package/dist/esm/widgets/types/index.d.ts +2 -0
  189. package/dist/esm/widgets/types/index.js +2 -0
  190. package/dist/esm/widgets/types/index.js.map +1 -0
  191. package/dist/umd/index.js +1 -1
  192. package/dist/umd/index.js.map +1 -1
  193. package/package.json +3 -3
  194. package/src/utilities/getVOIMultipliers.ts +33 -0
  195. package/src/utilities/index.ts +2 -0
  196. package/src/utilities/math/vec3/interpolateVec3.ts +20 -0
  197. package/src/utilities/viewport/isViewportPreScaled.ts +3 -1
  198. package/src/utilities/voi/colorbar/Colorbar.ts +367 -0
  199. package/src/utilities/voi/colorbar/ColorbarCanvas.ts +287 -0
  200. package/src/utilities/voi/colorbar/ColorbarTicks.ts +500 -0
  201. package/src/utilities/voi/colorbar/ViewportColorbar.ts +194 -0
  202. package/src/utilities/voi/colorbar/common/areColorbarRangesEqual.ts +10 -0
  203. package/src/utilities/voi/colorbar/common/areColorbarSizesEqual.ts +7 -0
  204. package/src/utilities/voi/colorbar/common/index.ts +4 -0
  205. package/src/utilities/voi/colorbar/common/isColorbarSizeValid.ts +7 -0
  206. package/src/utilities/voi/colorbar/common/isRangeTextPositionValid.ts +16 -0
  207. package/src/utilities/voi/colorbar/common/isRangeValid.ts +7 -0
  208. package/src/utilities/voi/colorbar/enums/ColorbarRangeTextPosition.ts +11 -0
  209. package/src/utilities/voi/colorbar/enums/index.ts +1 -0
  210. package/src/utilities/voi/colorbar/index.ts +8 -0
  211. package/src/utilities/voi/colorbar/types/ColorbarCanvasProps.ts +14 -0
  212. package/src/utilities/voi/colorbar/types/ColorbarCommonProps.ts +23 -0
  213. package/src/utilities/voi/colorbar/types/ColorbarImageRange.ts +4 -0
  214. package/src/utilities/voi/colorbar/types/ColorbarProps.ts +8 -0
  215. package/src/utilities/voi/colorbar/types/ColorbarSize.ts +4 -0
  216. package/src/utilities/voi/colorbar/types/ColorbarTicksProps.ts +8 -0
  217. package/src/utilities/voi/colorbar/types/ColorbarTicksStyle.ts +8 -0
  218. package/src/utilities/voi/colorbar/types/ColorbarVOIRange.ts +3 -0
  219. package/src/utilities/voi/colorbar/types/ViewportColorbarProps.ts +6 -0
  220. package/src/utilities/voi/colorbar/types/index.ts +8 -0
  221. package/src/utilities/voi/index.ts +3 -0
  222. package/src/widgets/Widget.ts +169 -0
  223. package/src/widgets/types/WidgetProps.ts +4 -0
  224. package/src/widgets/types/WidgetSize.ts +4 -0
  225. package/src/widgets/types/index.ts +2 -0
@@ -0,0 +1,287 @@
1
+ import { IColorMapPreset } from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction/ColorMaps';
2
+ import { utilities } from '@cornerstonejs/core';
3
+ import interpolateVec3 from '../../math/vec3/interpolateVec3';
4
+ import { ColorbarCanvasProps } from './types/ColorbarCanvasProps';
5
+ import type { ColorbarImageRange, ColorbarVOIRange } from './types';
6
+ import type { ColorbarSize } from './types/ColorbarSize';
7
+ import {
8
+ isRangeValid,
9
+ areColorbarRangesEqual,
10
+ isColorbarSizeValid,
11
+ areColorbarSizesEqual,
12
+ } from './common';
13
+
14
+ const { clamp } = utilities;
15
+
16
+ /**
17
+ * Canvas referenced by the color bar where the colormap is rendered. It may
18
+ * show the full image range or only the VOI range.
19
+ */
20
+ class ColorbarCanvas {
21
+ private _canvas: HTMLCanvasElement;
22
+ private _imageRange: ColorbarImageRange;
23
+ private _voiRange: ColorbarVOIRange;
24
+ private _colormap: IColorMapPreset;
25
+ private _showFullImageRange: boolean;
26
+
27
+ constructor(props: ColorbarCanvasProps) {
28
+ ColorbarCanvas.validateProps(props);
29
+
30
+ const {
31
+ colormap,
32
+ size = { width: 20, height: 100 },
33
+ imageRange = { lower: 0, upper: 1 },
34
+ voiRange = { lower: 0, upper: 1 },
35
+ container,
36
+ showFullPixelValueRange = false,
37
+ } = props;
38
+
39
+ this._colormap = colormap;
40
+ this._imageRange = imageRange;
41
+ this._voiRange = voiRange;
42
+ this._showFullImageRange = showFullPixelValueRange;
43
+ this._canvas = this._createRootElement(size);
44
+
45
+ if (container) {
46
+ this.appendTo(container);
47
+ }
48
+ }
49
+
50
+ public get colormap(): IColorMapPreset {
51
+ return this._colormap;
52
+ }
53
+
54
+ public set colormap(colormap: IColorMapPreset) {
55
+ this._colormap = colormap;
56
+ this.render();
57
+ }
58
+
59
+ public get size(): ColorbarSize {
60
+ const { width, height } = this._canvas;
61
+ return { width, height };
62
+ }
63
+
64
+ public set size(size: ColorbarSize) {
65
+ const { _canvas: canvas } = this;
66
+
67
+ if (!isColorbarSizeValid(size) || areColorbarSizesEqual(canvas, size)) {
68
+ return;
69
+ }
70
+
71
+ this._setCanvasSize(canvas, size);
72
+ this.render();
73
+ }
74
+
75
+ public get imageRange(): ColorbarImageRange {
76
+ return { ...this._imageRange };
77
+ }
78
+
79
+ public set imageRange(imageRange: ColorbarImageRange) {
80
+ if (
81
+ !isRangeValid(imageRange) ||
82
+ areColorbarRangesEqual(imageRange, this._imageRange)
83
+ ) {
84
+ return;
85
+ }
86
+
87
+ this._imageRange = imageRange;
88
+ this.render();
89
+ }
90
+
91
+ public get voiRange(): ColorbarVOIRange {
92
+ return { ...this._voiRange };
93
+ }
94
+
95
+ public set voiRange(voiRange: ColorbarVOIRange) {
96
+ if (
97
+ !isRangeValid(voiRange) ||
98
+ areColorbarRangesEqual(voiRange, this._voiRange)
99
+ ) {
100
+ return;
101
+ }
102
+
103
+ this._voiRange = voiRange;
104
+ this.render();
105
+ }
106
+
107
+ public get showFullImageRange(): boolean {
108
+ return this._showFullImageRange;
109
+ }
110
+
111
+ public set showFullImageRange(showFullImageRange: boolean) {
112
+ if (showFullImageRange === this._showFullImageRange) {
113
+ return;
114
+ }
115
+
116
+ this._showFullImageRange = showFullImageRange;
117
+ this.render();
118
+ }
119
+
120
+ public appendTo(container: HTMLElement) {
121
+ container.appendChild(this._canvas);
122
+ this.render();
123
+ }
124
+
125
+ public dispose() {
126
+ const { _canvas: canvas } = this;
127
+ const { parentElement } = canvas;
128
+
129
+ parentElement?.removeChild(canvas);
130
+ }
131
+
132
+ private static validateProps(props: ColorbarCanvasProps) {
133
+ const { size, imageRange, voiRange } = props;
134
+
135
+ if (size && !isColorbarSizeValid(size)) {
136
+ throw new Error('Invalid "size"');
137
+ }
138
+
139
+ if (imageRange && !isRangeValid(imageRange)) {
140
+ throw new Error('Invalid "imageRange"');
141
+ }
142
+
143
+ if (voiRange && !isRangeValid(voiRange)) {
144
+ throw new Error('Invalid "voiRange"');
145
+ }
146
+ }
147
+
148
+ private _setCanvasSize(canvas: HTMLCanvasElement, size: ColorbarSize) {
149
+ const { width, height } = size;
150
+
151
+ canvas.width = width;
152
+ canvas.height = height;
153
+
154
+ Object.assign(canvas.style, {
155
+ width: `${width}px`,
156
+ height: `${height}px`,
157
+ });
158
+ }
159
+
160
+ private _createRootElement(size: ColorbarSize) {
161
+ const canvas = document.createElement('canvas');
162
+
163
+ Object.assign(canvas.style, {
164
+ pointerEvents: 'none',
165
+ boxSizing: 'border-box',
166
+ });
167
+
168
+ this._setCanvasSize(canvas, size);
169
+
170
+ return canvas;
171
+ }
172
+
173
+ private render(): void {
174
+ if (!this._canvas.isConnected) {
175
+ return;
176
+ }
177
+
178
+ const { _colormap: colormap } = this;
179
+ const { RGBPoints: rgbPoints } = colormap;
180
+ const colorsCount = rgbPoints.length / 4;
181
+
182
+ // Returns a color point from rgbPoints. Each point has position, red,
183
+ // green and blue components which means each point has an offset equal
184
+ // to `4 * index`
185
+ const getColorPoint = (index) => {
186
+ const offset = 4 * index;
187
+
188
+ // It can get out of bounds when `voiRange.upper` is smaller than
189
+ // `imageRange.upper`. It's also checking if is smaller than zero
190
+ // for safety only because that should never happens.
191
+ if (index < 0 || index >= colorsCount) {
192
+ return;
193
+ }
194
+
195
+ return {
196
+ index,
197
+ position: rgbPoints[offset],
198
+ color: [
199
+ rgbPoints[offset + 1],
200
+ rgbPoints[offset + 2],
201
+ rgbPoints[offset + 3],
202
+ ],
203
+ };
204
+ };
205
+
206
+ const { width, height } = this._canvas;
207
+ const canvasContext = this._canvas.getContext('2d');
208
+ const isHorizontal = width > height;
209
+ const maxValue = isHorizontal ? width : height;
210
+ const { _voiRange: voiRange } = this;
211
+ const range = this._showFullImageRange ? this._imageRange : { ...voiRange };
212
+
213
+ const { windowWidth } = utilities.windowLevel.toWindowLevel(
214
+ voiRange.lower,
215
+ voiRange.upper
216
+ );
217
+
218
+ let previousColorPoint = undefined;
219
+ let currentColorPoint = getColorPoint(0);
220
+
221
+ // Starts from `range.lower` incrementing by incRawPixelValue on each iteration
222
+ const incRawPixelValue = (range.upper - range.lower) / (maxValue - 1);
223
+ let rawPixelValue = range.lower;
224
+
225
+ for (let i = 0; i < maxValue; i++) {
226
+ const tVoiRange = (rawPixelValue - voiRange.lower) / windowWidth;
227
+
228
+ // Find the color in a linear way (O(n) complexity).
229
+ // currentColorPoint shall move to the next color until tVoiRange is smaller
230
+ // than or equal to next color position.
231
+ if (currentColorPoint) {
232
+ for (let i = currentColorPoint.index; i < colorsCount; i++) {
233
+ if (tVoiRange <= currentColorPoint.position) {
234
+ break;
235
+ }
236
+
237
+ previousColorPoint = currentColorPoint;
238
+ currentColorPoint = getColorPoint(i + 1);
239
+ }
240
+ }
241
+
242
+ let normColor;
243
+
244
+ // For:
245
+ // - firstColorPoint = getColorPoint(0)
246
+ // - secondColorPoint = getColorPoint(1)
247
+ // - lastColorPoint = getColorPoint(colorsCount - 1)
248
+ // Then
249
+ // - previousColorPoint shall be undefined when tVoiRange < firstColorPoint.position
250
+ // - currentColorPoint shall be undefined when tVoiRange > lastColorPoint.position
251
+ // - previousColorPoint and currentColorPoint will be defined when
252
+ // currentColorPoint.position is between secondColorPoint.position and
253
+ // lastColorPoint.position.
254
+ if (!previousColorPoint) {
255
+ normColor = [...currentColorPoint.color];
256
+ } else if (!currentColorPoint) {
257
+ normColor = [...previousColorPoint.color];
258
+ } else {
259
+ const tColorRange =
260
+ (tVoiRange - previousColorPoint.position) /
261
+ (currentColorPoint.position - previousColorPoint.position);
262
+
263
+ normColor = interpolateVec3(
264
+ previousColorPoint.color,
265
+ currentColorPoint.color,
266
+ tColorRange
267
+ );
268
+ }
269
+
270
+ const color = normColor.map((color) =>
271
+ clamp(Math.round(color * 255), 0, 255)
272
+ );
273
+
274
+ canvasContext.fillStyle = `rgb(${color[0]}, ${color[1]}, ${color[2]})`;
275
+
276
+ if (isHorizontal) {
277
+ canvasContext.fillRect(i, 0, 1, height);
278
+ } else {
279
+ canvasContext.fillRect(0, height - i - 1, width, 1);
280
+ }
281
+
282
+ rawPixelValue += incRawPixelValue;
283
+ }
284
+ }
285
+ }
286
+
287
+ export { ColorbarCanvas as default, ColorbarCanvas };