@cornerstonejs/tools 1.23.4 → 1.25.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 +251 -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 +187 -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 +243 -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 +180 -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 +366 -0
  199. package/src/utilities/voi/colorbar/ColorbarCanvas.ts +290 -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,290 @@
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
+ position: 'absolute',
165
+ top: '0',
166
+ left: '0',
167
+ pointerEvents: 'none',
168
+ boxSizing: 'border-box',
169
+ });
170
+
171
+ this._setCanvasSize(canvas, size);
172
+
173
+ return canvas;
174
+ }
175
+
176
+ private render(): void {
177
+ if (!this._canvas.isConnected) {
178
+ return;
179
+ }
180
+
181
+ const { _colormap: colormap } = this;
182
+ const { RGBPoints: rgbPoints } = colormap;
183
+ const colorsCount = rgbPoints.length / 4;
184
+
185
+ // Returns a color point from rgbPoints. Each point has position, red,
186
+ // green and blue components which means each point has an offset equal
187
+ // to `4 * index`
188
+ const getColorPoint = (index) => {
189
+ const offset = 4 * index;
190
+
191
+ // It can get out of bounds when `voiRange.upper` is smaller than
192
+ // `imageRange.upper`. It's also checking if is smaller than zero
193
+ // for safety only because that should never happens.
194
+ if (index < 0 || index >= colorsCount) {
195
+ return;
196
+ }
197
+
198
+ return {
199
+ index,
200
+ position: rgbPoints[offset],
201
+ color: [
202
+ rgbPoints[offset + 1],
203
+ rgbPoints[offset + 2],
204
+ rgbPoints[offset + 3],
205
+ ],
206
+ };
207
+ };
208
+
209
+ const { width, height } = this._canvas;
210
+ const canvasContext = this._canvas.getContext('2d');
211
+ const isHorizontal = width > height;
212
+ const maxValue = isHorizontal ? width : height;
213
+ const { _voiRange: voiRange } = this;
214
+ const range = this._showFullImageRange ? this._imageRange : { ...voiRange };
215
+
216
+ const { windowWidth } = utilities.windowLevel.toWindowLevel(
217
+ voiRange.lower,
218
+ voiRange.upper
219
+ );
220
+
221
+ let previousColorPoint = undefined;
222
+ let currentColorPoint = getColorPoint(0);
223
+
224
+ // Starts from `range.lower` incrementing by incRawPixelValue on each iteration
225
+ const incRawPixelValue = (range.upper - range.lower) / (maxValue - 1);
226
+ let rawPixelValue = range.lower;
227
+
228
+ for (let i = 0; i < maxValue; i++) {
229
+ const tVoiRange = (rawPixelValue - voiRange.lower) / windowWidth;
230
+
231
+ // Find the color in a linear way (O(n) complexity).
232
+ // currentColorPoint shall move to the next color until tVoiRange is smaller
233
+ // than or equal to next color position.
234
+ if (currentColorPoint) {
235
+ for (let i = currentColorPoint.index; i < colorsCount; i++) {
236
+ if (tVoiRange <= currentColorPoint.position) {
237
+ break;
238
+ }
239
+
240
+ previousColorPoint = currentColorPoint;
241
+ currentColorPoint = getColorPoint(i + 1);
242
+ }
243
+ }
244
+
245
+ let normColor;
246
+
247
+ // For:
248
+ // - firstColorPoint = getColorPoint(0)
249
+ // - secondColorPoint = getColorPoint(1)
250
+ // - lastColorPoint = getColorPoint(colorsCount - 1)
251
+ // Then
252
+ // - previousColorPoint shall be undefined when tVoiRange < firstColorPoint.position
253
+ // - currentColorPoint shall be undefined when tVoiRange > lastColorPoint.position
254
+ // - previousColorPoint and currentColorPoint will be defined when
255
+ // currentColorPoint.position is between secondColorPoint.position and
256
+ // lastColorPoint.position.
257
+ if (!previousColorPoint) {
258
+ normColor = [...currentColorPoint.color];
259
+ } else if (!currentColorPoint) {
260
+ normColor = [...previousColorPoint.color];
261
+ } else {
262
+ const tColorRange =
263
+ (tVoiRange - previousColorPoint.position) /
264
+ (currentColorPoint.position - previousColorPoint.position);
265
+
266
+ normColor = interpolateVec3(
267
+ previousColorPoint.color,
268
+ currentColorPoint.color,
269
+ tColorRange
270
+ );
271
+ }
272
+
273
+ const color = normColor.map((color) =>
274
+ clamp(Math.round(color * 255), 0, 255)
275
+ );
276
+
277
+ canvasContext.fillStyle = `rgb(${color[0]}, ${color[1]}, ${color[2]})`;
278
+
279
+ if (isHorizontal) {
280
+ canvasContext.fillRect(i, 0, 1, height);
281
+ } else {
282
+ canvasContext.fillRect(0, height - i - 1, width, 1);
283
+ }
284
+
285
+ rawPixelValue += incRawPixelValue;
286
+ }
287
+ }
288
+ }
289
+
290
+ export { ColorbarCanvas as default, ColorbarCanvas };