@cornerstonejs/tools 0.56.1 → 0.56.3

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 (360) hide show
  1. package/dist/cjs/tools/CrosshairsTool.d.ts +1 -0
  2. package/dist/cjs/tools/CrosshairsTool.js +4 -1
  3. package/dist/cjs/tools/CrosshairsTool.js.map +1 -1
  4. package/dist/esm/tools/CrosshairsTool.d.ts +1 -0
  5. package/dist/esm/tools/CrosshairsTool.js +4 -1
  6. package/dist/esm/tools/CrosshairsTool.js.map +1 -1
  7. package/dist/umd/index.js +1 -1
  8. package/dist/umd/index.js.map +1 -1
  9. package/package.json +5 -4
  10. package/src/constants/COLOR_LUT.ts +262 -0
  11. package/src/constants/index.ts +3 -0
  12. package/src/cursors/ImageMouseCursor.ts +39 -0
  13. package/src/cursors/MouseCursor.ts +114 -0
  14. package/src/cursors/SVGCursorDescriptor.ts +462 -0
  15. package/src/cursors/SVGMouseCursor.ts +145 -0
  16. package/src/cursors/elementCursor.ts +69 -0
  17. package/src/cursors/index.ts +24 -0
  18. package/src/cursors/setCursorForElement.ts +33 -0
  19. package/src/drawingSvg/_getHash.ts +9 -0
  20. package/src/drawingSvg/_setAttributesIfNecessary.ts +13 -0
  21. package/src/drawingSvg/_setNewAttributesIfValid.ts +10 -0
  22. package/src/drawingSvg/clearByToolType.ts +26 -0
  23. package/src/drawingSvg/draw.ts +16 -0
  24. package/src/drawingSvg/drawArrow.ts +82 -0
  25. package/src/drawingSvg/drawCircle.ts +62 -0
  26. package/src/drawingSvg/drawEllipse.ts +71 -0
  27. package/src/drawingSvg/drawHandles.ts +87 -0
  28. package/src/drawingSvg/drawLine.ts +70 -0
  29. package/src/drawingSvg/drawLink.ts +76 -0
  30. package/src/drawingSvg/drawLinkedTextBox.ts +64 -0
  31. package/src/drawingSvg/drawPolyline.ts +80 -0
  32. package/src/drawingSvg/drawRect.ts +70 -0
  33. package/src/drawingSvg/drawTextBox.ts +213 -0
  34. package/src/drawingSvg/getSvgDrawingHelper.ts +98 -0
  35. package/src/drawingSvg/index.ts +23 -0
  36. package/src/enums/AnnotationStyleStates.ts +22 -0
  37. package/src/enums/Events.ts +242 -0
  38. package/src/enums/SegmentationRepresentations.ts +12 -0
  39. package/src/enums/ToolBindings.ts +37 -0
  40. package/src/enums/ToolModes.ts +31 -0
  41. package/src/enums/Touch.ts +8 -0
  42. package/src/enums/index.js +16 -0
  43. package/src/eventDispatchers/annotationModifiedEventDispatcher.ts +41 -0
  44. package/src/eventDispatchers/cameraModifiedEventDispatcher.ts +41 -0
  45. package/src/eventDispatchers/imageRenderedEventDispatcher.ts +37 -0
  46. package/src/eventDispatchers/imageSpacingCalibratedEventDispatcher.ts +50 -0
  47. package/src/eventDispatchers/index.js +15 -0
  48. package/src/eventDispatchers/keyboardEventHandlers/index.js +4 -0
  49. package/src/eventDispatchers/keyboardEventHandlers/keyDown.ts +29 -0
  50. package/src/eventDispatchers/keyboardEventHandlers/keyUp.ts +33 -0
  51. package/src/eventDispatchers/keyboardToolEventDispatcher.ts +28 -0
  52. package/src/eventDispatchers/mouseEventHandlers/index.js +19 -0
  53. package/src/eventDispatchers/mouseEventHandlers/mouseClick.ts +13 -0
  54. package/src/eventDispatchers/mouseEventHandlers/mouseDoubleClick.ts +13 -0
  55. package/src/eventDispatchers/mouseEventHandlers/mouseDown.ts +196 -0
  56. package/src/eventDispatchers/mouseEventHandlers/mouseDownActivate.ts +35 -0
  57. package/src/eventDispatchers/mouseEventHandlers/mouseDrag.ts +25 -0
  58. package/src/eventDispatchers/mouseEventHandlers/mouseMove.ts +70 -0
  59. package/src/eventDispatchers/mouseEventHandlers/mouseUp.ts +9 -0
  60. package/src/eventDispatchers/mouseEventHandlers/mouseWheel.ts +13 -0
  61. package/src/eventDispatchers/mouseToolEventDispatcher.ts +64 -0
  62. package/src/eventDispatchers/shared/customCallbackHandler.ts +73 -0
  63. package/src/eventDispatchers/shared/getActiveToolForKeyboardEvent.ts +58 -0
  64. package/src/eventDispatchers/shared/getActiveToolForMouseEvent.ts +61 -0
  65. package/src/eventDispatchers/shared/getActiveToolForTouchEvent.ts +64 -0
  66. package/src/eventDispatchers/shared/getMouseModifier.ts +30 -0
  67. package/src/eventDispatchers/shared/getToolsWithModesForMouseEvent.ts +56 -0
  68. package/src/eventDispatchers/shared/getToolsWithModesForTouchEvent.ts +54 -0
  69. package/src/eventDispatchers/touchEventHandlers/index.js +15 -0
  70. package/src/eventDispatchers/touchEventHandlers/touchDrag.ts +23 -0
  71. package/src/eventDispatchers/touchEventHandlers/touchEnd.ts +9 -0
  72. package/src/eventDispatchers/touchEventHandlers/touchPress.ts +13 -0
  73. package/src/eventDispatchers/touchEventHandlers/touchStart.ts +174 -0
  74. package/src/eventDispatchers/touchEventHandlers/touchStartActivate.ts +36 -0
  75. package/src/eventDispatchers/touchEventHandlers/touchTap.ts +9 -0
  76. package/src/eventDispatchers/touchToolEventDispatcher.ts +51 -0
  77. package/src/eventListeners/annotations/annotationModifiedListener.ts +22 -0
  78. package/src/eventListeners/annotations/annotationSelectionListener.ts +29 -0
  79. package/src/eventListeners/annotations/index.ts +4 -0
  80. package/src/eventListeners/index.ts +28 -0
  81. package/src/eventListeners/keyboard/index.ts +16 -0
  82. package/src/eventListeners/keyboard/keyDownListener.ts +99 -0
  83. package/src/eventListeners/mouse/getMouseEventPoints.ts +66 -0
  84. package/src/eventListeners/mouse/index.ts +55 -0
  85. package/src/eventListeners/mouse/mouseDoubleClickListener.ts +55 -0
  86. package/src/eventListeners/mouse/mouseDownListener.ts +519 -0
  87. package/src/eventListeners/mouse/mouseMoveListener.ts +33 -0
  88. package/src/eventListeners/segmentation/index.ts +11 -0
  89. package/src/eventListeners/segmentation/segmentationDataModifiedEventListener.ts +61 -0
  90. package/src/eventListeners/segmentation/segmentationModifiedEventListener.ts +32 -0
  91. package/src/eventListeners/segmentation/segmentationRepresentationModifiedEventListener.ts +15 -0
  92. package/src/eventListeners/segmentation/segmentationRepresentationRemovedEventListener.ts +16 -0
  93. package/src/eventListeners/touch/getTouchEventPoints.ts +75 -0
  94. package/src/eventListeners/touch/index.ts +37 -0
  95. package/src/eventListeners/touch/preventGhostClick.js +72 -0
  96. package/src/eventListeners/touch/touchStartListener.ts +499 -0
  97. package/src/eventListeners/wheel/index.ts +27 -0
  98. package/src/eventListeners/wheel/normalizeWheel.ts +69 -0
  99. package/src/eventListeners/wheel/wheelListener.ts +51 -0
  100. package/src/index.ts +133 -0
  101. package/src/init.ts +187 -0
  102. package/src/stateManagement/annotation/FrameOfReferenceSpecificAnnotationManager.ts +399 -0
  103. package/src/stateManagement/annotation/annotationLocking.ts +178 -0
  104. package/src/stateManagement/annotation/annotationSelection.ts +163 -0
  105. package/src/stateManagement/annotation/annotationState.ts +180 -0
  106. package/src/stateManagement/annotation/annotationVisibility.ts +156 -0
  107. package/src/stateManagement/annotation/config/ToolStyle.ts +265 -0
  108. package/src/stateManagement/annotation/config/getFont.ts +36 -0
  109. package/src/stateManagement/annotation/config/getState.ts +26 -0
  110. package/src/stateManagement/annotation/config/helpers.ts +55 -0
  111. package/src/stateManagement/annotation/config/index.ts +5 -0
  112. package/src/stateManagement/annotation/helpers/state.ts +83 -0
  113. package/src/stateManagement/annotation/index.ts +15 -0
  114. package/src/stateManagement/index.js +40 -0
  115. package/src/stateManagement/segmentation/SegmentationStateManager.ts +491 -0
  116. package/src/stateManagement/segmentation/activeSegmentation.ts +60 -0
  117. package/src/stateManagement/segmentation/addSegmentationRepresentations.ts +77 -0
  118. package/src/stateManagement/segmentation/addSegmentations.ts +27 -0
  119. package/src/stateManagement/segmentation/config/index.ts +29 -0
  120. package/src/stateManagement/segmentation/config/segmentationColor.ts +132 -0
  121. package/src/stateManagement/segmentation/config/segmentationConfig.ts +195 -0
  122. package/src/stateManagement/segmentation/config/segmentationVisibility.ts +171 -0
  123. package/src/stateManagement/segmentation/helpers/index.ts +3 -0
  124. package/src/stateManagement/segmentation/helpers/normalizeSegmentationInput.ts +35 -0
  125. package/src/stateManagement/segmentation/helpers/validateSegmentationInput.ts +41 -0
  126. package/src/stateManagement/segmentation/index.ts +22 -0
  127. package/src/stateManagement/segmentation/removeSegmentationsFromToolGroup.ts +85 -0
  128. package/src/stateManagement/segmentation/segmentIndex.ts +38 -0
  129. package/src/stateManagement/segmentation/segmentLocking.ts +72 -0
  130. package/src/stateManagement/segmentation/segmentationState.ts +429 -0
  131. package/src/stateManagement/segmentation/triggerSegmentationEvents.ts +157 -0
  132. package/src/store/SynchronizerManager/Synchronizer.ts +344 -0
  133. package/src/store/SynchronizerManager/createSynchronizer.ts +41 -0
  134. package/src/store/SynchronizerManager/destroy.ts +14 -0
  135. package/src/store/SynchronizerManager/destroySynchronizer.ts +25 -0
  136. package/src/store/SynchronizerManager/getAllSynchronizers.ts +12 -0
  137. package/src/store/SynchronizerManager/getSynchronizer.ts +13 -0
  138. package/src/store/SynchronizerManager/getSynchronizersForViewport.ts +44 -0
  139. package/src/store/SynchronizerManager/index.js +15 -0
  140. package/src/store/ToolGroupManager/ToolGroup.ts +679 -0
  141. package/src/store/ToolGroupManager/createToolGroup.ts +33 -0
  142. package/src/store/ToolGroupManager/destroy.ts +24 -0
  143. package/src/store/ToolGroupManager/destroyToolGroup.ts +26 -0
  144. package/src/store/ToolGroupManager/getAllToolGroups.ts +12 -0
  145. package/src/store/ToolGroupManager/getToolGroup.ts +14 -0
  146. package/src/store/ToolGroupManager/getToolGroupForViewport.ts +44 -0
  147. package/src/store/ToolGroupManager/getToolGroupsWithToolName.ts +33 -0
  148. package/src/store/ToolGroupManager/index.ts +17 -0
  149. package/src/store/addEnabledElement.ts +137 -0
  150. package/src/store/addTool.ts +56 -0
  151. package/src/store/cancelActiveManipulations.ts +30 -0
  152. package/src/store/filterMoveableAnnotationTools.ts +61 -0
  153. package/src/store/filterToolsWithAnnotationsForElement.ts +51 -0
  154. package/src/store/filterToolsWithMoveableHandles.ts +51 -0
  155. package/src/store/index.ts +29 -0
  156. package/src/store/removeEnabledElement.ts +132 -0
  157. package/src/store/state.ts +57 -0
  158. package/src/store/svgNodeCache.ts +7 -0
  159. package/src/synchronizers/callbacks/areViewportsCoplanar .ts +12 -0
  160. package/src/synchronizers/callbacks/cameraSyncCallback.ts +33 -0
  161. package/src/synchronizers/callbacks/stackImageSyncCallback.ts +157 -0
  162. package/src/synchronizers/callbacks/voiSyncCallback.ts +51 -0
  163. package/src/synchronizers/callbacks/zoomPanSyncCallback.ts +43 -0
  164. package/src/synchronizers/index.ts +11 -0
  165. package/src/synchronizers/synchronizers/createCameraPositionSynchronizer.ts +25 -0
  166. package/src/synchronizers/synchronizers/createStackImageSynchronizer.ts +25 -0
  167. package/src/synchronizers/synchronizers/createVOISynchronizer.ts +24 -0
  168. package/src/synchronizers/synchronizers/createZoomPanSynchronizer.ts +25 -0
  169. package/src/synchronizers/synchronizers/index.ts +11 -0
  170. package/src/tools/CrosshairsTool.ts +2693 -0
  171. package/src/tools/MIPJumpToClickTool.ts +99 -0
  172. package/src/tools/MagnifyTool.ts +319 -0
  173. package/src/tools/PanTool.ts +58 -0
  174. package/src/tools/PlanarRotateTool.ts +77 -0
  175. package/src/tools/ReferenceCursors.ts +466 -0
  176. package/src/tools/ReferenceLinesTool.ts +279 -0
  177. package/src/tools/ScaleOverlayTool.ts +685 -0
  178. package/src/tools/StackScrollTool.ts +97 -0
  179. package/src/tools/StackScrollToolMouseWheelTool.ts +58 -0
  180. package/src/tools/TrackballRotateTool.ts +141 -0
  181. package/src/tools/VolumeRotateMouseWheelTool.ts +86 -0
  182. package/src/tools/WindowLevelTool.ts +260 -0
  183. package/src/tools/ZoomTool.ts +293 -0
  184. package/src/tools/annotation/AngleTool.ts +835 -0
  185. package/src/tools/annotation/ArrowAnnotateTool.ts +820 -0
  186. package/src/tools/annotation/BidirectionalTool.ts +1350 -0
  187. package/src/tools/annotation/CircleROITool.ts +1070 -0
  188. package/src/tools/annotation/CobbAngleTool.ts +815 -0
  189. package/src/tools/annotation/DragProbeTool.ts +213 -0
  190. package/src/tools/annotation/EllipticalROITool.ts +1223 -0
  191. package/src/tools/annotation/LengthTool.ts +861 -0
  192. package/src/tools/annotation/PlanarFreehandROITool.ts +636 -0
  193. package/src/tools/annotation/ProbeTool.ts +681 -0
  194. package/src/tools/annotation/RectangleROITool.ts +1028 -0
  195. package/src/tools/annotation/planarFreehandROITool/closedContourEditLoop.ts +488 -0
  196. package/src/tools/annotation/planarFreehandROITool/drawLoop.ts +462 -0
  197. package/src/tools/annotation/planarFreehandROITool/editLoopCommon.ts +331 -0
  198. package/src/tools/annotation/planarFreehandROITool/findOpenUShapedContourVectorToPeak.ts +74 -0
  199. package/src/tools/annotation/planarFreehandROITool/openContourEditLoop.ts +612 -0
  200. package/src/tools/annotation/planarFreehandROITool/openContourEndEditLoop.ts +74 -0
  201. package/src/tools/annotation/planarFreehandROITool/renderMethods.ts +407 -0
  202. package/src/tools/base/AnnotationDisplayTool.ts +228 -0
  203. package/src/tools/base/AnnotationTool.ts +307 -0
  204. package/src/tools/base/BaseTool.ts +215 -0
  205. package/src/tools/base/index.ts +4 -0
  206. package/src/tools/displayTools/Contour/addContourToElement.ts +135 -0
  207. package/src/tools/displayTools/Contour/contourDisplay.ts +252 -0
  208. package/src/tools/displayTools/Contour/index.ts +3 -0
  209. package/src/tools/displayTools/Contour/removeContourFromElement.ts +35 -0
  210. package/src/tools/displayTools/Labelmap/addLabelmapToElement.ts +57 -0
  211. package/src/tools/displayTools/Labelmap/index.ts +4 -0
  212. package/src/tools/displayTools/Labelmap/labelmapConfig.ts +37 -0
  213. package/src/tools/displayTools/Labelmap/labelmapDisplay.ts +461 -0
  214. package/src/tools/displayTools/Labelmap/removeLabelmapFromElement.ts +27 -0
  215. package/src/tools/displayTools/Labelmap/validateRepresentationData.ts +30 -0
  216. package/src/tools/displayTools/SegmentationDisplayTool.ts +198 -0
  217. package/src/tools/index.ts +84 -0
  218. package/src/tools/segmentation/BrushTool.ts +474 -0
  219. package/src/tools/segmentation/CircleScissorsTool.ts +365 -0
  220. package/src/tools/segmentation/PaintFillTool.ts +370 -0
  221. package/src/tools/segmentation/RectangleROIStartEndThresholdTool.ts +471 -0
  222. package/src/tools/segmentation/RectangleROIThresholdTool.ts +281 -0
  223. package/src/tools/segmentation/RectangleScissorsTool.ts +382 -0
  224. package/src/tools/segmentation/SphereScissorsTool.ts +368 -0
  225. package/src/tools/segmentation/strategies/eraseCircle.ts +30 -0
  226. package/src/tools/segmentation/strategies/eraseRectangle.ts +81 -0
  227. package/src/tools/segmentation/strategies/eraseSphere.ts +27 -0
  228. package/src/tools/segmentation/strategies/fillCircle.ts +185 -0
  229. package/src/tools/segmentation/strategies/fillRectangle.ts +110 -0
  230. package/src/tools/segmentation/strategies/fillSphere.ts +88 -0
  231. package/src/tools/segmentation/strategies/index.ts +9 -0
  232. package/src/types/AnnotationGroupSelector.ts +7 -0
  233. package/src/types/AnnotationStyle.ts +42 -0
  234. package/src/types/AnnotationTypes.ts +109 -0
  235. package/src/types/BoundsIJK.ts +5 -0
  236. package/src/types/CINETypes.ts +32 -0
  237. package/src/types/ContourTypes.ts +26 -0
  238. package/src/types/CursorTypes.ts +12 -0
  239. package/src/types/EventTypes.ts +657 -0
  240. package/src/types/FloodFillTypes.ts +19 -0
  241. package/src/types/IAnnotationManager.ts +89 -0
  242. package/src/types/IDistance.ts +16 -0
  243. package/src/types/IPoints.ts +18 -0
  244. package/src/types/ISetToolModeOptions.ts +29 -0
  245. package/src/types/ISynchronizerEventHandler.ts +11 -0
  246. package/src/types/IToolClassReference.ts +5 -0
  247. package/src/types/IToolGroup.ts +72 -0
  248. package/src/types/ITouchPoints.ts +14 -0
  249. package/src/types/InteractionTypes.ts +6 -0
  250. package/src/types/InternalToolTypes.ts +19 -0
  251. package/src/types/JumpToSliceOptions.ts +7 -0
  252. package/src/types/LabelmapTypes.ts +41 -0
  253. package/src/types/PlanarBoundingBox.ts +8 -0
  254. package/src/types/SVGDrawingHelper.ts +10 -0
  255. package/src/types/ScrollOptions.ts +9 -0
  256. package/src/types/SegmentationStateTypes.ts +248 -0
  257. package/src/types/ToolHandle.ts +26 -0
  258. package/src/types/ToolProps.ts +16 -0
  259. package/src/types/ToolSpecificAnnotationTypes.ts +311 -0
  260. package/src/types/index.ts +115 -0
  261. package/src/utilities/boundingBox/extend2DBoundingBoxInViewAxis.ts +29 -0
  262. package/src/utilities/boundingBox/getBoundingBoxAroundShape.ts +57 -0
  263. package/src/utilities/boundingBox/index.ts +4 -0
  264. package/src/utilities/calibrateImageSpacing.ts +46 -0
  265. package/src/utilities/cine/events.ts +9 -0
  266. package/src/utilities/cine/index.ts +5 -0
  267. package/src/utilities/cine/playClip.ts +435 -0
  268. package/src/utilities/cine/state.ts +18 -0
  269. package/src/utilities/clip.js +30 -0
  270. package/src/utilities/debounce.js +217 -0
  271. package/src/utilities/drawing/getTextBoxCoordsCanvas.ts +45 -0
  272. package/src/utilities/drawing/index.ts +3 -0
  273. package/src/utilities/dynamicVolume/getDataInTime.ts +110 -0
  274. package/src/utilities/dynamicVolume/index.ts +2 -0
  275. package/src/utilities/getAnnotationNearPoint.ts +130 -0
  276. package/src/utilities/getModalityUnit.ts +11 -0
  277. package/src/utilities/getToolsWithModesForElement.ts +52 -0
  278. package/src/utilities/index.ts +68 -0
  279. package/src/utilities/isObject.js +29 -0
  280. package/src/utilities/math/angle/angleBetweenLines.ts +29 -0
  281. package/src/utilities/math/circle/_types.ts +6 -0
  282. package/src/utilities/math/circle/getCanvasCircleCorners.ts +23 -0
  283. package/src/utilities/math/circle/getCanvasCircleRadius.ts +16 -0
  284. package/src/utilities/math/circle/index.ts +4 -0
  285. package/src/utilities/math/ellipse/getCanvasEllipseCorners.ts +26 -0
  286. package/src/utilities/math/ellipse/index.ts +4 -0
  287. package/src/utilities/math/ellipse/pointInEllipse.ts +38 -0
  288. package/src/utilities/math/ellipse/pointInEllipsoidWithConstraint.ts +35 -0
  289. package/src/utilities/math/index.ts +8 -0
  290. package/src/utilities/math/line/distanceToPoint.ts +24 -0
  291. package/src/utilities/math/line/distanceToPointSquared.ts +44 -0
  292. package/src/utilities/math/line/index.ts +5 -0
  293. package/src/utilities/math/line/intersectLine.ts +92 -0
  294. package/src/utilities/math/midPoint.ts +24 -0
  295. package/src/utilities/math/point/distanceToPoint.ts +22 -0
  296. package/src/utilities/math/point/index.ts +3 -0
  297. package/src/utilities/math/polyline/addCanvasPointsToArray.ts +62 -0
  298. package/src/utilities/math/polyline/calculateAreaOfPoints.ts +23 -0
  299. package/src/utilities/math/polyline/getIntersectionWithPolyline.ts +182 -0
  300. package/src/utilities/math/polyline/getSubPixelSpacingAndXYDirections.ts +99 -0
  301. package/src/utilities/math/polyline/index.ts +19 -0
  302. package/src/utilities/math/polyline/planarFreehandROIInternalTypes.ts +36 -0
  303. package/src/utilities/math/polyline/pointCanProjectOnLine.ts +57 -0
  304. package/src/utilities/math/polyline/pointsAreWithinCloseContourProximity.ts +15 -0
  305. package/src/utilities/math/rectangle/distanceToPoint.ts +82 -0
  306. package/src/utilities/math/rectangle/index.ts +3 -0
  307. package/src/utilities/math/sphere/index.ts +3 -0
  308. package/src/utilities/math/sphere/pointInSphere.ts +31 -0
  309. package/src/utilities/math/vec2/findClosestPoint.ts +40 -0
  310. package/src/utilities/math/vec2/index.ts +4 -0
  311. package/src/utilities/math/vec2/liangBarksyClip.ts +84 -0
  312. package/src/utilities/orientation/getOrientationStringLPS.ts +52 -0
  313. package/src/utilities/orientation/index.ts +4 -0
  314. package/src/utilities/orientation/invertOrientationStringLPS.ts +21 -0
  315. package/src/utilities/planar/filterAnnotationsForDisplay.ts +68 -0
  316. package/src/utilities/planar/filterAnnotationsWithinSlice.ts +85 -0
  317. package/src/utilities/planar/getPointInLineOfSightWithCriteria.ts +104 -0
  318. package/src/utilities/planar/getWorldWidthAndHeightFromCorners.ts +51 -0
  319. package/src/utilities/planar/getWorldWidthAndHeightFromTwoPoints.ts +51 -0
  320. package/src/utilities/planar/index.ts +18 -0
  321. package/src/utilities/planarFreehandROITool/index.ts +7 -0
  322. package/src/utilities/planarFreehandROITool/interpolateAnnotation.ts +87 -0
  323. package/src/utilities/planarFreehandROITool/interpolatePoints.ts +214 -0
  324. package/src/utilities/planarFreehandROITool/interpolation/algorithms/bspline.ts +55 -0
  325. package/src/utilities/planarFreehandROITool/interpolation/interpolateSegmentPoints.ts +90 -0
  326. package/src/utilities/pointInShapeCallback.ts +138 -0
  327. package/src/utilities/pointInSurroundingSphereCallback.ts +188 -0
  328. package/src/utilities/rectangleROITool/getBoundsIJKFromRectangleAnnotations.ts +76 -0
  329. package/src/utilities/rectangleROITool/index.ts +3 -0
  330. package/src/utilities/scroll.ts +62 -0
  331. package/src/utilities/segmentation/brushSizeForToolGroup.ts +72 -0
  332. package/src/utilities/segmentation/brushThresholdForToolGroup.ts +65 -0
  333. package/src/utilities/segmentation/createLabelmapVolumeForViewport.ts +74 -0
  334. package/src/utilities/segmentation/createMergedLabelmapForIndex.ts +65 -0
  335. package/src/utilities/segmentation/floodFill.ts +194 -0
  336. package/src/utilities/segmentation/getDefaultRepresentationConfig.ts +20 -0
  337. package/src/utilities/segmentation/index.ts +33 -0
  338. package/src/utilities/segmentation/isValidRepresentationConfig.ts +22 -0
  339. package/src/utilities/segmentation/rectangleROIThresholdVolumeByRange.ts +91 -0
  340. package/src/utilities/segmentation/thresholdSegmentationByRange.ts +129 -0
  341. package/src/utilities/segmentation/thresholdVolumeByRange.ts +150 -0
  342. package/src/utilities/segmentation/triggerSegmentationRender.ts +206 -0
  343. package/src/utilities/segmentation/utilities.ts +116 -0
  344. package/src/utilities/stackPrefetch/index.ts +8 -0
  345. package/src/utilities/stackPrefetch/stackPrefetch.ts +405 -0
  346. package/src/utilities/stackPrefetch/state.ts +17 -0
  347. package/src/utilities/throttle.js +69 -0
  348. package/src/utilities/touch/index.ts +246 -0
  349. package/src/utilities/triggerAnnotationRender.ts +237 -0
  350. package/src/utilities/triggerAnnotationRenderForViewportIds.ts +18 -0
  351. package/src/utilities/viewport/index.ts +5 -0
  352. package/src/utilities/viewport/isViewportPreScaled.ts +24 -0
  353. package/src/utilities/viewport/jumpToSlice.ts +73 -0
  354. package/src/utilities/viewport/jumpToWorld.ts +58 -0
  355. package/src/utilities/viewportFilters/filterViewportsWithFrameOfReferenceUID.ts +28 -0
  356. package/src/utilities/viewportFilters/filterViewportsWithParallelNormals.ts +26 -0
  357. package/src/utilities/viewportFilters/filterViewportsWithSameOrientation.ts +15 -0
  358. package/src/utilities/viewportFilters/filterViewportsWithToolEnabled.ts +72 -0
  359. package/src/utilities/viewportFilters/getViewportIdsWithToolToRender.ts +45 -0
  360. package/src/utilities/viewportFilters/index.ts +11 -0
@@ -0,0 +1,99 @@
1
+ import { BaseTool } from './base';
2
+ import { getEnabledElement, VolumeViewport } from '@cornerstonejs/core';
3
+ import type { Types } from '@cornerstonejs/core';
4
+ import { getPointInLineOfSightWithCriteria } from '../utilities/planar';
5
+ import jumpToWorld from '../utilities/viewport/jumpToWorld';
6
+ import { PublicToolProps, ToolProps } from '../types';
7
+
8
+ /**
9
+ * On a Maximum Intensity Projection (MIP) viewport, MIPJumpToClickTool allows the
10
+ * user to click on a point in the MIP and the targetViewportIdS (provided in the
11
+ * tool configuration) will be scrolled (jumped) to the location of the point with
12
+ * the highest intensity value in the MIP.
13
+ */
14
+ class MIPJumpToClickTool extends BaseTool {
15
+ static toolName;
16
+
17
+ _bounds: any;
18
+
19
+ constructor(
20
+ toolProps: PublicToolProps = {},
21
+ defaultToolProps: ToolProps = {
22
+ supportedInteractionTypes: ['Mouse', 'Touch'],
23
+ configuration: {
24
+ targetViewportIds: [],
25
+ },
26
+ }
27
+ ) {
28
+ super(toolProps, defaultToolProps);
29
+ }
30
+
31
+ /**
32
+ * Handles the click event, and move the camera's focal point the brightest
33
+ * point that is in the line of sight of camera. This function 1) search for the
34
+ * brightest point in the line of sight, 2) move the camera to that point,
35
+ * this triggers a cameraModified event which then 4) moves all other synced
36
+ * viewports and their crosshairs.
37
+ *
38
+ * @param evt - click event
39
+ */
40
+ mouseClickCallback(evt): void {
41
+ const { element, currentPoints } = evt.detail;
42
+
43
+ // 1. Getting the enabled element
44
+ const enabledElement = getEnabledElement(element);
45
+ const { viewport, renderingEngine } = enabledElement;
46
+
47
+ // 2. Getting the target volume that is clicked on
48
+ const targetId = this.getTargetId(viewport as Types.IVolumeViewport);
49
+
50
+ if (!targetId.startsWith('volumeId')) {
51
+ throw new Error(
52
+ `MIPJumpToClickTool: targetId is not a volumeId, you should only use MIPJumpToClickTool with a volumeId as the targetId`
53
+ );
54
+ }
55
+
56
+ const volumeId = targetId.split('volumeId:')[1];
57
+
58
+ // 3. Criteria function to search for the point (maximum intensity)
59
+ let maxIntensity = -Infinity;
60
+ const maxFn = (intensity, point) => {
61
+ if (intensity > maxIntensity) {
62
+ maxIntensity = intensity;
63
+ return point;
64
+ }
65
+ };
66
+
67
+ // 4. Search for the brightest point location in the line of sight
68
+ const brightestPoint = getPointInLineOfSightWithCriteria(
69
+ viewport as Types.IVolumeViewport,
70
+ currentPoints.world,
71
+ volumeId,
72
+ maxFn
73
+ );
74
+
75
+ if (!brightestPoint || !brightestPoint.length) {
76
+ return;
77
+ }
78
+
79
+ const { targetViewportIds } = this.configuration;
80
+
81
+ // 6. Update all the targetedViewports to jump
82
+ targetViewportIds.forEach((viewportId) => {
83
+ // Todo: current limitation is that we cannot jump in viewports
84
+ // that don't belong to the renderingEngine of the source clicked viewport
85
+ const viewport = renderingEngine.getViewport(viewportId);
86
+
87
+ if (viewport instanceof VolumeViewport) {
88
+ jumpToWorld(viewport, brightestPoint);
89
+ } else {
90
+ console.warn(
91
+ 'Cannot jump to specified world coordinates for a viewport that is not a VolumeViewport'
92
+ );
93
+ }
94
+ });
95
+ }
96
+ }
97
+
98
+ MIPJumpToClickTool.toolName = 'MIPJumpToClickTool';
99
+ export default MIPJumpToClickTool;
@@ -0,0 +1,319 @@
1
+ import { BaseTool } from './base';
2
+ import { Events } from '../enums';
3
+
4
+ import { getEnabledElement, StackViewport } from '@cornerstonejs/core';
5
+ import type { Types } from '@cornerstonejs/core';
6
+ import { EventTypes, PublicToolProps, ToolProps } from '../types';
7
+ import { getViewportIdsWithToolToRender } from '../utilities/viewportFilters';
8
+ import triggerAnnotationRenderForViewportIds from '../utilities/triggerAnnotationRenderForViewportIds';
9
+ import { state } from '../store';
10
+ import { Enums } from '@cornerstonejs/core';
11
+
12
+ import {
13
+ hideElementCursor,
14
+ resetElementCursor,
15
+ } from '../cursors/elementCursor';
16
+ import { IPoints } from '../types';
17
+
18
+ const MAGNIFY_VIEWPORT_ID = 'magnify-viewport';
19
+
20
+ class MagnifyTool extends BaseTool {
21
+ static toolName;
22
+ _bounds: any;
23
+ editData: {
24
+ referencedImageId: string;
25
+ viewportIdsToRender: string[];
26
+ enabledElement: Types.IEnabledElement;
27
+ renderingEngine: Types.IRenderingEngine;
28
+ currentPoints: IPoints;
29
+ } | null;
30
+
31
+ constructor(
32
+ toolProps: PublicToolProps = {},
33
+ defaultToolProps: ToolProps = {
34
+ supportedInteractionTypes: ['Mouse', 'Touch'],
35
+ configuration: {
36
+ magnifySize: 10, // parallel scale , higher more zoom
37
+ magnifyWidth: 250, //px
38
+ magnifyHeight: 250, //px
39
+ },
40
+ }
41
+ ) {
42
+ super(toolProps, defaultToolProps);
43
+ }
44
+
45
+ _getReferencedImageId(
46
+ viewport: Types.IStackViewport | Types.IVolumeViewport
47
+ ): string {
48
+ const targetId = this.getTargetId(viewport);
49
+
50
+ let referencedImageId;
51
+
52
+ if (viewport instanceof StackViewport) {
53
+ referencedImageId = targetId.split('imageId:')[1];
54
+ }
55
+
56
+ return referencedImageId;
57
+ }
58
+
59
+ preMouseDownCallback = (evt: EventTypes.InteractionEventType) => {
60
+ const eventDetail = evt.detail;
61
+ const { element, currentPoints } = eventDetail;
62
+ const enabledElement = getEnabledElement(element);
63
+ const { viewport, renderingEngine } = enabledElement;
64
+
65
+ if (!(viewport instanceof StackViewport)) {
66
+ throw new Error('MagnifyTool only works on StackViewports');
67
+ }
68
+
69
+ const referencedImageId = this._getReferencedImageId(viewport);
70
+
71
+ if (!referencedImageId) {
72
+ throw new Error(
73
+ 'MagnifyTool: No referenced image id found, reconstructed planes not supported yet'
74
+ );
75
+ }
76
+
77
+ const viewportIdsToRender = getViewportIdsWithToolToRender(
78
+ element,
79
+ this.getToolName()
80
+ );
81
+
82
+ this.editData = {
83
+ referencedImageId,
84
+ viewportIdsToRender,
85
+ enabledElement,
86
+ renderingEngine,
87
+ currentPoints,
88
+ };
89
+
90
+ this._createMagnificationViewport();
91
+ this._activateDraw(element);
92
+
93
+ hideElementCursor(element);
94
+
95
+ evt.preventDefault();
96
+
97
+ triggerAnnotationRenderForViewportIds(renderingEngine, viewportIdsToRender);
98
+
99
+ return true;
100
+ };
101
+
102
+ preTouchStartCallback = (evt: EventTypes.InteractionEventType) => {
103
+ this.preMouseDownCallback(evt);
104
+ };
105
+
106
+ _createMagnificationViewport = () => {
107
+ const {
108
+ enabledElement,
109
+ referencedImageId,
110
+ viewportIdsToRender,
111
+ renderingEngine,
112
+ currentPoints,
113
+ } = this.editData;
114
+ const { viewport } = enabledElement;
115
+ const { element } = viewport;
116
+ const { voiRange } = viewport.getProperties();
117
+
118
+ const { canvas: canvasPos, world: worldPos } = currentPoints;
119
+
120
+ let magnifyToolElement: HTMLDivElement;
121
+
122
+ magnifyToolElement = element.querySelector('.magnifyTool');
123
+ if (magnifyToolElement === null) {
124
+ const magnifyElement = document.createElement('div');
125
+
126
+ magnifyElement.classList.add('magnifyTool');
127
+
128
+ magnifyElement.style.display = 'block';
129
+ magnifyElement.style.width = `${this.configuration.magnifyWidth}px`;
130
+ magnifyElement.style.height = `${this.configuration.magnifyHeight}px`;
131
+ magnifyElement.style.position = 'absolute';
132
+
133
+ magnifyToolElement = magnifyElement;
134
+
135
+ const viewportElement = element.querySelector('.viewport-element');
136
+ viewportElement.appendChild(magnifyElement);
137
+
138
+ const viewportInput = {
139
+ viewportId: MAGNIFY_VIEWPORT_ID,
140
+ type: Enums.ViewportType.STACK,
141
+ element: magnifyToolElement as HTMLDivElement,
142
+ };
143
+
144
+ renderingEngine.enableElement(viewportInput);
145
+ }
146
+
147
+ // Todo: use CSS transform instead of setting top and left for better performance
148
+ magnifyToolElement.style.top = `${
149
+ canvasPos[1] - this.configuration.magnifyHeight / 2
150
+ }px`;
151
+ magnifyToolElement.style.left = `${
152
+ canvasPos[0] - this.configuration.magnifyWidth / 2
153
+ }px`;
154
+
155
+ const magnifyViewport = renderingEngine.getViewport(
156
+ MAGNIFY_VIEWPORT_ID
157
+ ) as Types.IStackViewport;
158
+
159
+ magnifyViewport.setStack([referencedImageId]).then(() => {
160
+ // match the original viewport voi range
161
+ magnifyViewport.setProperties({ voiRange });
162
+
163
+ // Use the original viewport for the base for parallelScale
164
+ const { parallelScale } = viewport.getCamera();
165
+
166
+ const { focalPoint, position, viewPlaneNormal } =
167
+ magnifyViewport.getCamera();
168
+
169
+ const distance = Math.sqrt(
170
+ Math.pow(focalPoint[0] - position[0], 2) +
171
+ Math.pow(focalPoint[1] - position[1], 2) +
172
+ Math.pow(focalPoint[2] - position[2], 2)
173
+ );
174
+
175
+ const updatedFocalPoint = <Types.Point3>[
176
+ worldPos[0],
177
+ worldPos[1],
178
+ worldPos[2],
179
+ ];
180
+
181
+ const updatedPosition = <Types.Point3>[
182
+ updatedFocalPoint[0] + distance * viewPlaneNormal[0],
183
+ updatedFocalPoint[1] + distance * viewPlaneNormal[1],
184
+ updatedFocalPoint[2] + distance * viewPlaneNormal[2],
185
+ ];
186
+
187
+ magnifyViewport.setCamera({
188
+ parallelScale: parallelScale * (1 / this.configuration.magnifySize),
189
+ focalPoint: updatedFocalPoint,
190
+ position: updatedPosition,
191
+ });
192
+ magnifyViewport.render();
193
+ });
194
+
195
+ magnifyToolElement.style.display = 'block';
196
+ triggerAnnotationRenderForViewportIds(renderingEngine, viewportIdsToRender);
197
+ };
198
+
199
+ _dragCallback = (evt: EventTypes.InteractionEventType) => {
200
+ const eventDetail = evt.detail;
201
+
202
+ const { deltaPoints, element, currentPoints } = eventDetail;
203
+ const deltaPointsWorld = deltaPoints.world;
204
+ const canvasPos = currentPoints.canvas;
205
+ const enabledElement = getEnabledElement(element);
206
+ const { renderingEngine } = enabledElement;
207
+
208
+ const magnifyViewport = renderingEngine.getViewport(MAGNIFY_VIEWPORT_ID);
209
+
210
+ const magnifyElement = element.querySelector(
211
+ '.magnifyTool'
212
+ ) as HTMLDivElement;
213
+
214
+ if (!magnifyElement) {
215
+ return;
216
+ }
217
+
218
+ magnifyElement.style.top = `${
219
+ canvasPos[1] - this.configuration.magnifyHeight / 2
220
+ }px`;
221
+ magnifyElement.style.left = `${
222
+ canvasPos[0] - this.configuration.magnifyWidth / 2
223
+ }px`;
224
+
225
+ const { focalPoint, position } = magnifyViewport.getCamera();
226
+
227
+ const updatedPosition = <Types.Point3>[
228
+ position[0] + deltaPointsWorld[0],
229
+ position[1] + deltaPointsWorld[1],
230
+ position[2] + deltaPointsWorld[2],
231
+ ];
232
+
233
+ const updatedFocalPoint = <Types.Point3>[
234
+ focalPoint[0] + deltaPointsWorld[0],
235
+ focalPoint[1] + deltaPointsWorld[1],
236
+ focalPoint[2] + deltaPointsWorld[2],
237
+ ];
238
+
239
+ magnifyViewport.setCamera({
240
+ focalPoint: updatedFocalPoint,
241
+ position: updatedPosition,
242
+ });
243
+
244
+ magnifyViewport.render();
245
+ };
246
+
247
+ _dragEndCallback = (evt: EventTypes.InteractionEventType) => {
248
+ const { element } = evt.detail;
249
+ const enabledElement = getEnabledElement(element);
250
+ const { renderingEngine } = enabledElement;
251
+
252
+ renderingEngine.disableElement(MAGNIFY_VIEWPORT_ID);
253
+
254
+ const viewportElement = element.querySelector('.viewport-element');
255
+
256
+ const magnifyToolElement = viewportElement.querySelector(
257
+ '.magnifyTool'
258
+ ) as HTMLDivElement;
259
+
260
+ viewportElement.removeChild(magnifyToolElement);
261
+
262
+ this._deactivateDraw(element);
263
+ resetElementCursor(element);
264
+ };
265
+
266
+ _activateDraw = (element: HTMLDivElement) => {
267
+ state.isInteractingWithTool = true;
268
+
269
+ element.addEventListener(
270
+ Events.MOUSE_UP,
271
+ this._dragEndCallback as EventListener
272
+ );
273
+ element.addEventListener(
274
+ Events.MOUSE_DRAG,
275
+ this._dragCallback as EventListener
276
+ );
277
+ element.addEventListener(
278
+ Events.MOUSE_CLICK,
279
+ this._dragEndCallback as EventListener
280
+ );
281
+
282
+ element.addEventListener(
283
+ Events.TOUCH_END,
284
+ this._dragEndCallback as EventListener
285
+ );
286
+ element.addEventListener(
287
+ Events.TOUCH_DRAG,
288
+ this._dragCallback as EventListener
289
+ );
290
+ };
291
+
292
+ _deactivateDraw = (element: HTMLDivElement) => {
293
+ state.isInteractingWithTool = false;
294
+
295
+ element.removeEventListener(
296
+ Events.MOUSE_UP,
297
+ this._dragEndCallback as EventListener
298
+ );
299
+ element.removeEventListener(
300
+ Events.MOUSE_DRAG,
301
+ this._dragCallback as EventListener
302
+ );
303
+ element.removeEventListener(
304
+ Events.MOUSE_CLICK,
305
+ this._dragEndCallback as EventListener
306
+ );
307
+ element.removeEventListener(
308
+ Events.TOUCH_END,
309
+ this._dragEndCallback as EventListener
310
+ );
311
+ element.removeEventListener(
312
+ Events.TOUCH_DRAG,
313
+ this._dragCallback as EventListener
314
+ );
315
+ };
316
+ }
317
+
318
+ MagnifyTool.toolName = 'Magnify';
319
+ export default MagnifyTool;
@@ -0,0 +1,58 @@
1
+ import { BaseTool } from './base';
2
+ import { getEnabledElement } from '@cornerstonejs/core';
3
+ import type { Types } from '@cornerstonejs/core';
4
+
5
+ import { EventTypes, PublicToolProps, ToolProps } from '../types';
6
+
7
+ /**
8
+ * Tool that pans the camera in the plane defined by the viewPlaneNormal and the viewUp.
9
+ */
10
+ class PanTool extends BaseTool {
11
+ static toolName;
12
+ constructor(
13
+ toolProps: PublicToolProps = {},
14
+ defaultToolProps: ToolProps = {
15
+ supportedInteractionTypes: ['Mouse', 'Touch'],
16
+ }
17
+ ) {
18
+ super(toolProps, defaultToolProps);
19
+ }
20
+
21
+ touchDragCallback(evt: EventTypes.InteractionEventType) {
22
+ this._dragCallback(evt);
23
+ }
24
+
25
+ mouseDragCallback(evt: EventTypes.InteractionEventType) {
26
+ this._dragCallback(evt);
27
+ }
28
+
29
+ _dragCallback(evt: EventTypes.InteractionEventType) {
30
+ const { element, deltaPoints } = evt.detail;
31
+ const enabledElement = getEnabledElement(element);
32
+
33
+ const deltaPointsWorld = deltaPoints.world;
34
+ const camera = enabledElement.viewport.getCamera();
35
+ const { focalPoint, position } = camera;
36
+
37
+ const updatedPosition = <Types.Point3>[
38
+ position[0] - deltaPointsWorld[0],
39
+ position[1] - deltaPointsWorld[1],
40
+ position[2] - deltaPointsWorld[2],
41
+ ];
42
+
43
+ const updatedFocalPoint = <Types.Point3>[
44
+ focalPoint[0] - deltaPointsWorld[0],
45
+ focalPoint[1] - deltaPointsWorld[1],
46
+ focalPoint[2] - deltaPointsWorld[2],
47
+ ];
48
+
49
+ enabledElement.viewport.setCamera({
50
+ focalPoint: updatedFocalPoint,
51
+ position: updatedPosition,
52
+ });
53
+ enabledElement.viewport.render();
54
+ }
55
+ }
56
+
57
+ PanTool.toolName = 'Pan';
58
+ export default PanTool;
@@ -0,0 +1,77 @@
1
+ import {
2
+ BaseVolumeViewport,
3
+ getEnabledElement,
4
+ Types,
5
+ } from '@cornerstonejs/core';
6
+ import { mat4, vec3 } from 'gl-matrix';
7
+ import { BaseTool } from './base';
8
+ import angleBetweenLines from '../utilities/math/angle/angleBetweenLines';
9
+ import { PublicToolProps, ToolProps, EventTypes } from '../types';
10
+
11
+ /**
12
+ * The PlanarRotateTool is a tool that allows the user to rotate
13
+ * the image by pressing the mouse click and dragging
14
+ */
15
+ class PlanarRotateTool extends BaseTool {
16
+ static toolName;
17
+ touchDragCallback: (evt: EventTypes.MouseDragEventType) => void;
18
+ mouseDragCallback: (evt: EventTypes.MouseDragEventType) => void;
19
+
20
+ constructor(
21
+ toolProps: PublicToolProps = {},
22
+ defaultToolProps: ToolProps = {
23
+ supportedInteractionTypes: ['Mouse', 'Touch'],
24
+ }
25
+ ) {
26
+ super(toolProps, defaultToolProps);
27
+
28
+ this.touchDragCallback = this._dragCallback.bind(this);
29
+ this.mouseDragCallback = this._dragCallback.bind(this);
30
+ }
31
+
32
+ _dragCallback(evt: EventTypes.MouseDragEventType) {
33
+ const { element, currentPoints, startPoints } = evt.detail;
34
+ const currentPointWorld = currentPoints.world;
35
+ const startPointWorld = startPoints.world;
36
+ const enabledElement = getEnabledElement(element);
37
+ const { viewport } = enabledElement;
38
+ const camera = viewport.getCamera();
39
+ const width = element.clientWidth;
40
+ const height = element.clientHeight;
41
+
42
+ const centerCanvas: Types.Point2 = [width * 0.5, height * 0.5];
43
+ const centerWorld = viewport.canvasToWorld(centerCanvas);
44
+
45
+ let angle = angleBetweenLines(
46
+ [startPointWorld, centerWorld],
47
+ [centerWorld, currentPointWorld]
48
+ );
49
+
50
+ const { viewPlaneNormal, viewUp } = camera;
51
+
52
+ const v1 = vec3.sub(vec3.create(), centerWorld, startPointWorld);
53
+ const v2 = vec3.sub(vec3.create(), centerWorld, currentPointWorld);
54
+ const cross = vec3.cross(vec3.create(), v1, v2);
55
+ if (vec3.dot(viewPlaneNormal, cross) > 0) {
56
+ angle = -angle;
57
+ }
58
+
59
+ if (Number.isNaN(angle)) return;
60
+
61
+ if (viewport instanceof BaseVolumeViewport) {
62
+ const rotAngle = (angle * Math.PI) / 180;
63
+ const rotMat = mat4.identity(new Float32Array(16));
64
+ mat4.rotate(rotMat, rotMat, rotAngle, viewPlaneNormal);
65
+ const rotatedViewUp = vec3.transformMat4(vec3.create(), viewUp, rotMat);
66
+ viewport.setCamera({ viewUp: rotatedViewUp as Types.Point3 });
67
+ } else {
68
+ const { rotation } = (viewport as Types.IStackViewport).getProperties();
69
+ viewport.setProperties({ rotation: rotation + angle });
70
+ }
71
+
72
+ viewport.render();
73
+ }
74
+ }
75
+
76
+ PlanarRotateTool.toolName = 'PlanarRotate';
77
+ export default PlanarRotateTool;