{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///cornerstoneTools.min.js","webpack:///webpack/bootstrap 07150c22977bb1491743","webpack:///./externalModules.js","webpack:///./events.js","webpack:///./stateManagement/toolState.js","webpack:///./toolOptions.js","webpack:///./util/isMouseButtonEnabled.js","webpack:///./util/triggerEvent.js","webpack:///./stateManagement/toolColors.js","webpack:///./util/drawTextBox.js","webpack:///./stateManagement/toolStyle.js","webpack:///./imageTools/mouseButtonTool.js","webpack:///./manipulators/drawHandles.js","webpack:///./imageTools/touchTool.js","webpack:///./stateManagement/loadHandlerManager.js","webpack:///./stateManagement/textStyle.js","webpack:///./manipulators/anyHandlesOutsideImage.js","webpack:///./imageTools/touchDragTool.js","webpack:///./imageTools/simpleMouseButtonTool.js","webpack:///./util/convertToVector3.js","webpack:///./stateManagement/imageIdSpecificStateManager.js","webpack:///./util/pointInsideBoundingBox.js","webpack:///./util/calculateSUV.js","webpack:///./manipulators/getHandleNearImagePoint.js","webpack:///./util/getMaxSimultaneousRequests.js","webpack:///./manipulators/moveHandle.js","webpack:///./manipulators/moveNewHandle.js","webpack:///./imageTools/mouseWheelTool.js","webpack:///./imageTools/displayTool.js","webpack:///./manipulators/moveNewHandleTouch.js","webpack:///./util/pointProjector.js","webpack:///./requestPool/requestPoolManager.js","webpack:///./util/scroll.js","webpack:///./util/roundToDecimal.js","webpack:///./util/pointInEllipse.js","webpack:///./util/pauseEvent.js","webpack:///./util/getRGBPixels.js","webpack:///./util/copyPoints.js","webpack:///./stateManagement/toolCoordinates.js","webpack:///./manipulators/handleActivator.js","webpack:///./manipulators/moveAllHandles.js","webpack:///./timeSeriesTools/incrementTimePoint.js","webpack:///./imageTools/multiTouchDragTool.js","webpack:///./referenceLines/calculateReferenceLine.js","webpack:///./referenceLines/renderActiveReferenceLine.js","webpack:///./orientation/index.js","webpack:///./util/scrollToIndex.js","webpack:///./util/getLuminance.js","webpack:///./util/drawEllipse.js","webpack:///./util/drawCircle.js","webpack:///./util/drawArrow.js","webpack:///./util/calculateEllipseStatistics.js","webpack:///./imageTools/keyboardTool.js","webpack:///./manipulators/touchMoveAllHandles.js","webpack:///./manipulators/touchMoveHandle.js","webpack:///./inputSources/preventGhostClick.js","webpack:///./imageTools/doubleTapTool.js","webpack:///./imageTools/mouseButtonRectangleTool.js","webpack:///./imageTools/touchPinchTool.js","webpack:///./paintingTools/brushTool.js","webpack:///./paintingTools/getCircle.js","webpack:///./paintingTools/drawBrush.js","webpack:///./index.js","webpack:///./referenceLines/index.js","webpack:///./referenceLines/referenceLinesTool.js","webpack:///./orientation/getOrientationString.js","webpack:///./orientation/invertOrientationString.js","webpack:///./util/setContextToDisplayFontSize.js","webpack:///./timeSeriesTools/probeTool4D.js","webpack:///./measurementManager/measurementManager.js","webpack:///./measurementManager/lineSampleMeasurement.js","webpack:///./timeSeriesTools/timeSeriesPlayer.js","webpack:///./timeSeriesTools/timeSeriesScroll.js","webpack:///./synchronization/wwwcSynchronizer.js","webpack:///./synchronization/updateImageSynchronizer.js","webpack:///./synchronization/Synchronizer.js","webpack:///./synchronization/stackScrollSynchronizer.js","webpack:///./synchronization/stackImagePositionSynchronizer.js","webpack:///./synchronization/stackImagePositionOffsetSynchronizer.js","webpack:///./synchronization/stackImageIndexSynchronizer.js","webpack:///./synchronization/panZoomSynchronizer.js","webpack:///./stateManagement/timeSeriesSpecificStateManager.js","webpack:///./stateManagement/stackSpecificStateManager.js","webpack:///./stateManagement/frameOfReferenceStateManager.js","webpack:///./stateManagement/appState.js","webpack:///./stackTools/stackScrollKeyboard.js","webpack:///./stackTools/stackScroll.js","webpack:///./stackTools/stackPrefetch.js","webpack:///./stackTools/scrollIndicator.js","webpack:///./stackTools/stackRenderers.js","webpack:///./stackTools/fusionRenderer.js","webpack:///./stackTools/playClip.js","webpack:///./inputSources/keyboardInput.js","webpack:///./inputSources/mouseInput.js","webpack:///./inputSources/mouseWheelInput.js","webpack:///./inputSources/touchInput.js","webpack:///./imageTools/angleTool.js","webpack:///./imageTools/arrowAnnotate.js","webpack:///./imageTools/crosshairs.js","webpack:///./imageTools/doubleTapZoom.js","webpack:///./imageTools/dragProbe.js","webpack:///./imageTools/ellipticalRoi.js","webpack:///./imageTools/freehand.js","webpack:///./imageTools/highlight.js","webpack:///./imageTools/imageStats.js","webpack:///./imageTools/length.js","webpack:///./imageTools/magnify.js","webpack:///./imageTools/orientationMarkers.js","webpack:///./imageTools/pan.js","webpack:///./imageTools/panMultiTouch.js","webpack:///./imageTools/probe.js","webpack:///./imageTools/rectangleRoi.js","webpack:///./imageTools/rotate.js","webpack:///./imageTools/rotateTouch.js","webpack:///./imageTools/saveAs.js","webpack:///./imageTools/seedAnnotate.js","webpack:///./imageTools/simpleAngle.js","webpack:///./imageTools/textMarker.js","webpack:///./imageTools/wwwc.js","webpack:///./imageTools/wwwcRegion.js","webpack:///./imageTools/zoom.js","webpack:///./paintingTools/brush.js","webpack:///./paintingTools/adaptiveBrush.js","webpack:///./version.js"],"names":["root","factory","exports","module","define","amd","self","this","modules","__webpack_require__","moduleId","installedModules","i","l","call","m","c","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","n","__esModule","object","property","prototype","hasOwnProperty","p","s","value","cornerstone","window","cornerstoneMath","Hammer","default","cs","cm","EVENTS","IMAGE_RENDERED","NEW_IMAGE","IMAGE_CACHE_PROMISE_REMOVED","ELEMENT_DISABLED","MOUSE_DOWN","MOUSE_UP","MOUSE_DOWN_ACTIVATE","MOUSE_DRAG","MOUSE_MOVE","MOUSE_CLICK","MOUSE_DOUBLE_CLICK","MOUSE_WHEEL","TOUCH_START","TOUCH_START_ACTIVE","TOUCH_END","TOUCH_DRAG","TOUCH_DRAG_END","TOUCH_PINCH","TOUCH_ROTATE","TOUCH_PRESS","TAP","DOUBLE_TAP","MULTI_TOUCH_START","MULTI_TOUCH_START_ACTIVE","MULTI_TOUCH_DRAG","KEY_DOWN","KEY_UP","KEY_PRESS","MEASUREMENT_ADDED","MEASUREMENT_MODIFIED","MEASUREMENT_REMOVED","TOOL_DEACTIVATED","CLIP_STOPPED","STACK_SCROLL","LINE_SAMPLE_UPDATED","_interopRequireDefault","obj","getElementToolStateManager","element","enabledImage","_externalModules2","getEnabledElement","undefined","toolStateManager","_imageIdSpecificStateManager","globalImageIdSpecificToolStateManager","addToolState","toolType","measurementData","add","eventType","_events2","eventData","_triggerEvent2","getToolState","removeToolState","data","toolData","indexOfData","length","splice","clearToolState","setElementToolStateManager","_events","_externalModules","_triggerEvent","getToolOptions","elementToolOptions","toolOptions","optionsObject","find","toolOptionObject","options","setToolOptions","index","findIndex","push","which","mouseButtonMask","triggerEvent","el","type","detail","arguments","event","CustomEvent","cancelable","document","createEvent","initCustomEvent","dispatchEvent","setFillColor","color","fillColor","getFillColor","setToolColor","defaultColor","getToolColor","setActiveColor","activeColor","getActiveColor","getColorIfActive","active","toolColors","context","textLines","x","y","toString","font","_textStyle2","getFont","fontSize","getFontSize","backgroundColor","getBackgroundColor","save","textBaseline","strokeStyle","maxWidth","forEach","text","width","measureText","Math","max","fillStyle","boundingBox","padding","height","centering","left","top","debug","fillRect","fillText","restore","_textStyle","setToolWidth","defaultWidth","getToolWidth","setActiveWidth","activeWidth","getActiveWidth","toolStyle","mouseToolInterface","mouseDownActivateCallback","e","_toolOptions","_isMouseButtonEnabled2","addNewMeasurement","preventDefault","stopPropagation","mouseMoveCallback","_toolCoordinates2","setCoords","_toolState","imageNeedsUpdate","coords","currentPoints","canvas","_handleActivator2","handles","pointNearTool","updateImage","mouseDownCallback","handleDoneMove","invalidated","_anyHandlesOutsideImage2","addEventListener","mouseMove","startPoints","currentTarget","preventHandleOutsideImage","handle","_getHandleNearImagePoint2","removeEventListener","_moveHandle2","stopImmediatePropagation","opt","deleteIfHandleOutsideImage","_moveAllHandles2","mouseEventData","createNewMeasurement","mouseDown","mouseDownActivate","mouseDoubleClick","handleMover","keys","end","disable","onImageRendered","enable","activate","deactivate","statusChangeEventData","getConfiguration","configuration","setConfiguration","config","mouseDoubleClickCallback","toolInterface","_toolCoordinates","_getHandleNearImagePoint","_handleActivator","_moveHandle","_moveNewHandle","_moveNewHandle2","_moveAllHandles","_anyHandlesOutsideImage","_isMouseButtonEnabled","renderData","drawnIndependently","drawHandlesIfActive","beginPath","lineWidth","_toolStyle2","handleCanvasCoords","pixelToCanvas","arc","handleRadius","PI","fill","stroke","_toolStyle","deactivateAllHandles","deactivateAllToolInstances","touchTool","touchToolInterface","touchEventData","highlight","touchDownActivateCallback","tapCallback","touchStartCallback","_moveNewHandleTouch2","doneMovingCallback","_touchMoveHandle2","_touchMoveAllHandles2","lastEvent","lastEventData","pressCallback","doubleTapCallback","_touchMoveHandle","_moveNewHandleTouch","_touchMoveAllHandles","setStartLoadHandler","handler","defaultStartLoadHandler","getStartLoadHandler","setEndLoadHandler","defaultEndLoadHandler","getEndLoadHandler","setErrorLoadingHandler","defaultErrorLoadingHandler","getErrorLoadingHandler","loadHandlerManager","setFont","defaultFont","setFontSize","defaultFontSize","setBackgroundColor","defaultBackgroundColor","textStyle","image","imageRect","handleOutsideImage","allowedOutsideImage","point","insideRect","touchDragCallback","events","fireOnTouchStart","activateCallback","disableCallback","enableCallback","deactivateCallback","Error","convertToVector3","arrayOrVector3","Vector3","newImageIdSpecificToolStateManager","saveImageIdToolState","imageId","toolState","restoreImageIdToolState","imageIdToolState","saveToolState","restoreToolState","savedToolState","addImageIdSpecificToolState","getImageIdSpecificToolState","clearImageIdSpecificToolStateManager","clear","fracToDec","fractionalValue","parseFloat","storedPixelValue","patientStudyModule","metaData","seriesModule","modality","modalityPixelValue","slope","intercept","patientWeight","petSequenceModule","radiopharmaceuticalInfo","startTime","radiopharmaceuticalStartTime","totalDose","radionuclideTotalDose","halfLife","radionuclideHalfLife","seriesAcquisitionTime","seriesTime","acquisitionTimeInSeconds","fractionalSeconds","seconds","minutes","hours","injectionStartTimeInSeconds","durationInSeconds","exp","log","distanceThreshold","nearbyHandle","pointNearHandle","hasBoundingBox","_pointInsideBoundingBox2","handleCanvas","distance","_pointInsideBoundingBox","getBrowserInfo","ua","navigator","userAgent","M","match","tem","test","exec","slice","join","replace","appName","appVersion","setMaxSimultaneousRequests","newMaxSimultaneousRequests","configMaxSimultaneousRequests","getMaxSimultaneousRequests","getDefaultSimultaneousRequests","infoString","info","split","browserName","browserVersion","browserData","maxSimultaneousRequests","isMobileDevice","RegExp","IE","9","10","Firefox","Opera","11","12","Chrome","Safari","mouseDragCallback","hasMoved","distanceFromTool","min","modifiedEventData","mouseUpCallback","moveCallback","whichMovement","moveEndCallback","measurementRemovedCallback","toolDeactivatedCallback","mouseWheelCallback","distanceFromTouch","imageCoords","pageToPixel","page","projectPatientPointToImagePlane","patientPoint","imagePlane","rowCosines","_convertToVector2","columnCosines","imagePositionPatient","clone","sub","dot","columnPixelSpacing","rowPixelSpacing","imagePointToPatientPoint","imagePoint","multiplyScalar","getRectangleFromImagePlane","topLeft","topRight","columns","bottomLeft","rows","bottomRight","Line3","right","bottom","lineRectangleIntersection","line","rect","intersections","side","segment","intersection","intersectLine","planePlaneIntersection","targetImagePlane","referenceImagePlane","targetRowCosines","targetColumnCosines","targetImagePositionPatient","referenceRowCosines","referenceColumnCosines","referenceImagePositionPatient","targetNormal","cross","targetPlane","Plane","setFromNormalAndCoplanarPoint","referenceNormal","referencePlane","originDirection","intersectPlane","origin","direction","distanceTo","start","_convertToVector","addRequest","preventCache","doneCallback","failCallback","requestPool","requestDetails","imageLoadObject","imageCache","getImageLoadObject","promise","then","error","clearRequestStack","startAgain","awake","setTimeout","startGrabbing","grabDelay","sendRequest","numRequests","priority","loader","loadImage","loadAndCacheImage","_getMaxSimultaneousRequests","maxNumRequests","interaction","thumbnail","prefetch","currentRequests","requestsToSend","getNextRequest","shift","getRequestPool","images","loop","stackData","newImageIdIndex","currentImageIdIndex","imageIds","_scrollToIndex2","_scrollToIndex","precision","multiplier","pow","round","ellipse","location","xRadius","yRadius","center","normalized","cancelBubble","returnValue","enabledElement","storedPixelData","pixelData","getPixelData","spIndex","row","column","red","green","blue","alpha","points","copy","client","coordsData","getCoords","toolCoordinates","getActiveHandle","activeHandle","canvasPoint","movesIndependently","deltaPoints","timePoints","wrap","timeSeriesData","currentStack","stacks","currentStackIndex","newStackIndex","viewport","getViewport","newStack","startLoadingHandler","_loadHandlerManager2","endLoadingHandler","errorLoadingHandler","displayImage","_loadHandlerManager","_pointProjector","targetElement","referenceElement","targetImage","referenceImage","frameOfReferenceUID","angleInRadians","angleTo","abs","referenceLine","_calculateReferenceLine2","refLineStartCanvas","refLineEndCanvas","_toolColors2","setTransform","moveTo","lineTo","_calculateReferenceLine","_toolColors","_getOrientationString","_getOrientationString2","_invertOrientationString","_invertOrientationString2","orientation","getOrientationString","invertOrientationString","stackRenderer","render","stackRendererData","newImageId","Boolean","imagePromise","_requestPoolManager2","_requestPoolManager","luminance","w","h","ox","oy","xe","ye","xm","ym","bezierCurveTo","closePath","angle","atan2","cos","sin","sp","sum","sumSquared","count","_pointInEllipse2","mean","variance","stdDev","sqrt","_pointInEllipse","keyDownCallback","touchEndCallback","handlesOutsideImage","animate","lastTime","runAnimation","targetLocation","time","Date","getTime","distanceRemaining","linearDistEachFrame","requestAnimationFrame","aboveFinger","fingerDistance","touchEndEvents","handlePressed","handleTap","now","lastInteractionType","lastInteractionTime","antiGhostDelay","attachEvents","eventList","interactionType","tapHandler","handleTapMouse","handleTapTouch","eventName","removeEvents","mouseEvents","pointerType","mouse","touchEvents","touch","bind","preventGhostClick","pointInsideRect","touchPinchCallback","brushTool","brushToolInterface","onMouseMove","onMouseUp","dragCallback","onDrag","onMouseDown","TOOL_STATE_TOOL_TYPE","Uint8ClampedArray","layer","getLayer","brushLayerId","setPixelData","invalid","_enabledElement$image","colormapId","colormap","colors","getColormap","setNumberOfColors","setColor","labelMapImage","minPixelValue","maxPixelValue","rgba","labelmap","invert","sizeInBytes","pixelReplication","addLayer","_mouseButtonTool2","_mouseButtonTool","getCircle","radius","xCoord","yCoord","x0","y0","circleArray","drawBrushPixels","pointerArray","storedPixels","brushPixelValue","getPixelIndex","drawBrushOnCanvas","canvasContext","canvasPtTL","canvasPtBR","sizeX","sizeY","canvasPt","_index","_index2","_setContextToDisplayFontSize","_scroll","_roundToDecimal","_pauseEvent","_getRGBPixels","_getLuminance","_drawTextBox","_drawEllipse","_drawCircle","_drawArrow","_copyPoints","_calculateSUV","_calculateEllipseStatistics","_probeTool4D","_incrementTimePoint","_timeSeriesPlayer","_timeSeriesScroll","timeSeriesScroll","timeSeriesScrollWheel","timeSeriesScrollTouchDrag","_wwwcSynchronizer","_updateImageSynchronizer","_Synchronizer","_stackScrollSynchronizer","_stackImagePositionSynchronizer","_stackImagePositionOffsetSynchronizer","_stackImageIndexSynchronizer","_panZoomSynchronizer","_timeSeriesSpecificStateManager","addTimeSeriesStateManager","newTimeSeriesSpecificToolStateManager","_stackSpecificStateManager","stackSpecificStateManager","newStackSpecificToolStateManager","addStackStateManager","_frameOfReferenceStateManager","newFrameOfReferenceSpecificToolStateManager","globalFrameOfReferenceSpecificToolStateManager","_appState","_stackScrollKeyboard","_stackScroll","stackScroll","stackScrollWheel","stackScrollTouchDrag","stackScrollMultiTouch","_stackPrefetch","_scrollIndicator","_stackRenderers","_playClip","playClip","stopClip","_drawHandles","_keyboardInput","_mouseInput","_mouseWheelInput","_preventGhostClick","_touchInput","_angleTool","angleTouch","_arrowAnnotate","arrowAnnotate","arrowAnnotateTouch","_crosshairs","crosshairs","crosshairsTouch","_displayTool","_doubleTapTool","_doubleTapZoom","_dragProbe","dragProbe","dragProbeTouch","_ellipticalRoi","ellipticalRoi","ellipticalRoiTouch","_freehand","freehand","_highlight","highlightTouch","_imageStats","_keyboardTool","_length","lengthTouch","_magnify","magnify","magnifyTouchDrag","_mouseButtonRectangleTool","_mouseWheelTool","_multiTouchDragTool","_orientationMarkers","_pan","pan","panTouchDrag","_panMultiTouch","_probe","probe","probeTouch","_rectangleRoi","rectangleRoi","rectangleRoiTouch","_rotate","rotate","rotateTouchDrag","_rotateTouch","_saveAs","_seedAnnotate","seedAnnotate","seedAnnotateTouch","_simpleAngle","simpleAngle","simpleAngleTouch","_simpleMouseButtonTool","_textMarker","textMarker","textMarkerTouch","_touchDragTool","_touchPinchTool","_touchTool","_wwwc","wwwc","wwwcTouchDrag","_wwwcRegion","wwwcRegion","wwwcRegionTouch","_zoom","zoom","zoomWheel","zoomTouchPinch","zoomTouchDrag","_brush","brush","_adaptiveBrush","adaptiveBrush","_version","_referenceLinesTool","_referenceLinesTool2","_renderActiveReferenceLine","_renderActiveReferenceLine2","referenceLines","calculateReferenceLine","tool","renderActiveReferenceLine","syncContext","synchronizationContext","enabledElements","getSourceElements","renderer","getContext","setToPixelCoordinateSystem","referenceEnabledElement","vector","vec3","orientationX","orientationY","orientationZ","z","string","inverted","toUpperCase","scale","lineHeight","fontScale","updateLineSample","samples","timeSeries","stack","imageIdIndex","offset","sample","lineSample","set","timeSeriestoolData","_lineSampleMeasurement2","visible","_measurementManager2","_drawHandles2","textCoords","_drawTextBox2","_measurementManager","_lineSampleMeasurement","probeTool4D","MeasurementManager","that","measurements","measurement","eventDetail","remove","manager","framesPerSecond","timeSeriesToolData","playClipToolData","playClipData","intervalId","lastFrameTimeStamp","frameRate","setInterval","_incrementTimePoint2","clearInterval","timeSeriesPlayer","stop","deltaY","pixelsPerTimeSeries","offsetHeight","timeSeriesScrollSpeed","timeSeriesDelta","timeSeriesDeltaMod","mouseMoveData","originalEvent","_simpleMouseButtonTool2","_touchDragTool2","_mouseWheelTool2","synchronizer","sourceElement","sourceViewport","targetViewport","voi","windowWidth","windowCenter","setViewport","unique","array","filter","indexOf","Synchronizer","fireEvent","sourceElements","targetElements","ignoreFiredEvents","targetIndex","targetImageId","initialData","sourceIndex","sourceImageId","positionDifference","distances","eventHandler","onEvent","disableHandler","setHandler","getHandler","getDistances","sourceEnabledElement","sourceImagePlane","sourceImagePosition","targetEnabledElement","targetImagePosition","addSource","updateDisableHandlers","addTarget","removeSource","removeTarget","getTargetElements","concat","destroy","stackToolDataSource","sourceImage","minDistance","Number","MAX_VALUE","imagePosition","distanceToSquared","finalPosition","sourceStackToolDataSource","sourceStackData","targetStackToolDataSource","targetStackData","translation","toolTypes","oldStateManager","addStackSpecificToolState","getStackSpecificToolState","tools","timeSeriesSpecificStateManager","timeSeriesStateManagers","stackToolState","otherTools","stackTools","stackStateManagers","addFrameOfReferenceSpecificToolState","frameOfReference","frameOfReferenceToolState","getFrameOfReferenceSpecificToolState","removeFrameOfReferenceSpecificToolState","saveApplicationState","elements","appState","elementToolState","elementViewport","id","restoreApplicationState","elementId","getElementById","savedViewport","keyCode","UP","DOWN","_scroll2","_keyboardTool2","stackScrollKeyboard","pixelsPerImage","stackScrollSpeed","imageIdIndexOffset","multiTouchDragCallback","testPointers","_multiTouchDragTool2","numPointers","range","lowEnd","highEnd","arr","nearestIndex","v","low","high","removeFromList","stackPrefetch","indicesToRequest","console","stackPrefetchData","enabled","sort","a","b","requestType","nearest","nextImageIdIndex","lowerIndex","higherIndex","currentIndex","shouldSkipLower","maxImagesToPrefetch","shouldSkipHigher","shouldLoadLower","shouldLoadHigher","getPromiseRemovedHandler","onImageUpdated","clearTimeout","resetPrefetchTimeout","target","resetPrefetchDelay","warn","indexOfCurrentImage","promiseRemovedHandler","Infinity","apply","scrollIndicator","scrollBarHeight","cursorWidth","cursorHeight","xPosition","yPosition","_displayTool2","_fusionRenderer","_fusionRenderer2","stackRenderers","FusionRenderer","_classCallCheck","instance","Constructor","TypeError","_createClass","defineProperties","props","descriptor","writable","key","protoProps","staticProps","layerIds","findImageFn","imageStacks","_this","isInteger","baseImageObject","currentImageId","overlayImageStacks","baseImage","baseLayerId","setLayerImage","imgObj","overlayLayerIndex","layerIndex","currentLayerId","setActiveLayer","getPlayClipTimeouts","speed","delay","limit","timeouts","isTimeVarying","stopClipWithData","usingFrameTimeVector","triggerStopEvent","playClipTimeouts","stackToolData","frameTimeVector","ignoreFrameTimeVector","reverse","playClipAction","imageCount","playClipTimeoutHandler","keyPress","keyPressData","mouseX","mouseY","keyPressEvents","keydown","keypress","keyup","pageX","pageY","keyboardEvents","keyboardInput","getEventWhich","buttons","preventClickHandler","isClickEvent","pageToPoint","clientX","clientY","lastPoints","_copyPoints2","subtract","whichMouseButton","ctrlKey","metaKey","shiftKey","_pauseEvent2","preventClickTimeout","clickDelay","mouseInput","mouseWheel","wheelDeltaY","axis","startingCoords","wheelDelta","mouseWheelData","imageX","imageY","mouseWheelEvents","mouseWheelInput","onTouch","srcEvent","scaleChange","delta","remainingPointers","rotation","pointers","touches","isPress","pressTimeout","isTouchEvent","lastScale","preventNextPinch","touchStartDelay","pageDistanceMoved","pressDelay","changedTouches","deltaX","lastDelta","pressMaxDistance","changedPointers","lastRotation","hammerOptions","inputClass","SUPPORT_POINTER_EVENTS","PointerEventInput","TouchInput","mc","Manager","panOptions","DIRECTION_ALL","threshold","Pan","pinch","Pinch","Rotate","recognizeWith","doubleTap","Tap","taps","interval","posThreshold","on","_preventGhostClick2","hammer","off","touchInput","start2","end2","lineSegment","distanceToPoint","shadow","shadowColor","shadowOffsetX","shadowOffsetY","handleStartCanvas","handleEndCanvas","dx1","ceil","dy1","dx2","dy2","acos","rAngle","_roundToDecimal2","String","fromCharCode","parseInt","textX","textY","_touchTool2","getTextCallback","doneChangingTextCallback","prompt","changeTextCallback","textBox","arrowFirst","_drawArrow2","handleOptions","drawHandlesOnHover","drawHandles","textWidth","textHeight","transform","internal","getTransform","transformPoint","link","midpointCanvas","findClosestPoint","boundingBoxPoints","setLineDash","addNewMeasurementTouch","doubleClickCallback","updatedText","deleteTool","chooseLocation","sourceImagePoint","normal","dragEndCallback","dragStartCallback","enableTouch","disableTouch","fitToWindowStrategy","fitToWindow","doubleTapZoom","strategy","_doubleTapTool2","strategies","defaultStrategy","fontHeight","str","_getRGBPixels2","getStoredPixels","mo","suv","_calculateSUV2","toFixed","minimalStrategy","toolCoords","modalityPixelValueText","imageRenderedCallback","dragEventData","minimal","pointNearEllipse","startCanvas","endCanvas","minorEllipse","majorEllipse","pointInMinorEllipse","pointNearToolTouch","numberWithCommas","parts","leftCanvas","topCanvas","widthCanvas","heightCanvas","_drawEllipse2","area","meanStdDev","meanStdDevSUV","pixels","getPixels","_calculateEllipseStatistics2","isNaN","moSuffix","meanText","stdDevText","suffix","areaText","ellipsePoints","addPoint","currentTool","handleData","lines","currentHandle","toolIndex","mousePoint","pointNearHandleAllTools","handleNearby","mouseLocation","modifying","lastLineIndex","lastLine","startDrawing","endDrawing","nearby","handleStart","j","k","lineCanvas","mouseLocationCanvas","existingToolData","insideBox","clientWidth","clientHeight","strokeRect","_mouseButtonRectangleTool2","stats","imageStats","colPixelSpacing","rowImagePixelSpacing","colImagePixelSpacing","dx","dy","newImageCallback","hideTool","querySelector","style","display","body","cursor","drawMagnificationTool","magnifyCanvas","createMagnificationCanvas","magnifySize","magnificationLevel","zoomCtx","getSize","canvasLocation","clearRect","copyFrom","scaledMagnify","drawImage","createElement","classList","position","appendChild","removeMagnificationCanvas","removeChild","getOrientationMarkers","imagePlaneMetaData","rowString","columnString","oppositeRowString","getOrientationMarkerPositions","markers","textWidths","orientationMarkers","drawAllMarkers","widthScale","heightScale","touchPanCallback","panMultiTouch","calculateMeanStdDev","getBoundingClientRect","pointsFromCenter","rotationRadians","rotationDegrees","horizontalStrategy","verticalStrategy","horizontal","vertical","touchRotateCallback","rotateTouch","saveAs","filename","mimetype","lnk","download","href","toDataURL","initMouseEvent","doneGetTextCallback","realCoords","canvasWidth","_drawCircle2","textPlusCoords","showCoordinates","currentLetter","currentNumber","countUp","middle","handleMiddleCanvas","sideA","sideB","sideC","sideALength","sideBLength","sideCLength","touchMoveCallback","current","ascending","insideBoundingBox","touchPressCallback","maxVOI","minVOI","imageDynamicRange","dragData","calculateMinMaxMean","storedPixelLuminanceData","globalMin","globalMax","numPixels","spv","endPoint","applyWWWCRegion","startPoint","floor","pixelLuminanceData","_getLuminance2","minMaxMean","minWindowWidth","recordStartPoint","startPointCanvas","endPointCanvas","disableTouchDrag","activateTouchDrag","changeViewportScale","ticks","oldFactor","factor","maxScale","minScale","boundPosition","correctShift","hflip","vflip","cosA","sinA","newX","newY","newCoords","translateStrategy","preventZoomOutsideImage","desiredTranslation","distanceToDesired","zoomToCenterStrategy","_touchPinchTool2","translate","zoomToCenter","paint","_layer$image","_eventData$currentPoi","draw","_getCircle2","_drawBrush","lastImageCoords","dragging","_eventData$image","_lastImageCoords","dragColor","hoverColor","_brushTool","_brushTool2","_getCircle","getGreyValues","imageColumns","tolerance","minValue","maxValue","pixelIndex","greyValue","thrMin","thrMax","paintAdaptiveBrush","imagePixelData","brushPixelData","numPixelsOutsideThresholdWindow","minRadius","pixelValue","baseLayer","getLayers","brushData","currentRadius","erase","_layer$image2","_eventData$currentPoi2","_layer$image3"],"mappings":"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","file":"cornerstoneTools.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"cornerstoneTools\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"cornerstoneTools\"] = factory();\n\telse\n\t\troot[\"cornerstoneTools\"] = factory();\n})(typeof self !== 'undefined' ? self : this, function() {\nreturn \n\n\n// WEBPACK FOOTER //\n// webpack/universalModuleDefinition","/*! cornerstone-tools - 2.0.0 - 2017-12-13 | (c) 2017 Chris Hafey | https://github.com/cornerstonejs/cornerstoneTools */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"cornerstoneTools\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"cornerstoneTools\"] = factory();\n\telse\n\t\troot[\"cornerstoneTools\"] = factory();\n})(typeof self !== 'undefined' ? self : this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 60);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar cornerstone = window.cornerstone;\nvar cornerstoneMath = window.cornerstoneMath;\nvar Hammer = window.Hammer;\n\nexports.default = {\n set cornerstone(cs) {\n cornerstone = cs;\n },\n get cornerstone() {\n return cornerstone;\n },\n set cornerstoneMath(cm) {\n cornerstoneMath = cm;\n },\n get cornerstoneMath() {\n return cornerstoneMath;\n },\n set Hammer(module) {\n Hammer = module;\n },\n get Hammer() {\n return Hammer;\n }\n};\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar EVENTS = {\n // Events from Cornerstone Core\n IMAGE_RENDERED: 'cornerstoneimagerendered',\n NEW_IMAGE: 'cornerstonenewimage',\n IMAGE_CACHE_PROMISE_REMOVED: 'cornerstoneimagecachepromiseremoved',\n ELEMENT_DISABLED: 'cornerstoneelementdisabled',\n\n // Mouse events\n MOUSE_DOWN: 'cornerstonetoolsmousedown',\n MOUSE_UP: 'cornerstonetoolsmouseup',\n MOUSE_DOWN_ACTIVATE: 'cornerstonetoolsmousedownactivate',\n MOUSE_DRAG: 'cornerstonetoolsmousedrag',\n MOUSE_MOVE: 'cornerstonetoolsmousemove',\n MOUSE_CLICK: 'cornerstonetoolsmouseclick',\n MOUSE_DOUBLE_CLICK: 'cornerstonetoolsmousedoubleclick',\n MOUSE_WHEEL: 'cornerstonetoolsmousewheel',\n\n // Touch events\n TOUCH_START: 'cornerstonetoolstouchstart',\n TOUCH_START_ACTIVE: 'cornerstonetoolstouchstartactive',\n TOUCH_END: 'cornerstonetoolstouchend',\n TOUCH_DRAG: 'cornerstonetoolstouchdrag',\n TOUCH_DRAG_END: 'cornerstonetoolstouchdragend',\n TOUCH_PINCH: 'cornerstonetoolstouchpinch',\n TOUCH_ROTATE: 'cornerstonetoolstouchrotate',\n TOUCH_PRESS: 'cornerstonetoolstouchpress',\n TAP: 'cornerstonetoolstap',\n DOUBLE_TAP: 'cornerstonetoolsdoubletap',\n MULTI_TOUCH_START: 'cornerstonetoolsmultitouchstart',\n MULTI_TOUCH_START_ACTIVE: 'cornerstonetoolsmultitouchstartactive',\n MULTI_TOUCH_DRAG: 'cornerstonetoolsmultitouchdrag',\n\n // Keyboard events\n KEY_DOWN: 'cornerstonetoolskeydown',\n KEY_UP: 'cornerstonetoolskeyup',\n KEY_PRESS: 'cornerstonetoolskeypress',\n\n // Measurement / tool events\n MEASUREMENT_ADDED: 'cornerstonetoolsmeasurementadded',\n MEASUREMENT_MODIFIED: 'cornerstonetoolsmeasurementmodified',\n MEASUREMENT_REMOVED: 'cornerstonemeasurementremoved',\n TOOL_DEACTIVATED: 'cornerstonetoolstooldeactivated',\n CLIP_STOPPED: 'cornerstonetoolsclipstopped',\n STACK_SCROLL: 'cornerstonestackscroll', // Should be renamed\n\n LINE_SAMPLE_UPDATED: 'cornerstonelinesampleupdated'\n};\n\nexports.default = EVENTS;\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.getElementToolStateManager = exports.setElementToolStateManager = exports.clearToolState = exports.removeToolState = exports.getToolState = exports.addToolState = undefined;\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _imageIdSpecificStateManager = __webpack_require__(18);\n\nvar _triggerEvent = __webpack_require__(5);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction getElementToolStateManager(element) {\n var enabledImage = _externalModules2.default.cornerstone.getEnabledElement(element);\n // If the enabledImage has no toolStateManager, create a default one for it\n // NOTE: This makes state management element specific\n\n if (enabledImage.toolStateManager === undefined) {\n enabledImage.toolStateManager = _imageIdSpecificStateManager.globalImageIdSpecificToolStateManager;\n }\n\n return enabledImage.toolStateManager;\n}\n\n// Here we add tool state, this is done by tools as well\n// As modules that restore saved state\nfunction addToolState(element, toolType, measurementData) {\n var toolStateManager = getElementToolStateManager(element);\n\n toolStateManager.add(element, toolType, measurementData);\n\n var eventType = _events2.default.MEASUREMENT_ADDED;\n var eventData = {\n toolType: toolType,\n element: element,\n measurementData: measurementData\n };\n\n (0, _triggerEvent2.default)(element, eventType, eventData);\n}\n\n// Here you can get state - used by tools as well as modules\n// That save state persistently\nfunction getToolState(element, toolType) {\n var toolStateManager = getElementToolStateManager(element);\n\n return toolStateManager.get(element, toolType);\n}\n\nfunction removeToolState(element, toolType, data) {\n var toolStateManager = getElementToolStateManager(element);\n var toolData = toolStateManager.get(element, toolType);\n // Find this tool data\n var indexOfData = -1;\n\n for (var i = 0; i < toolData.data.length; i++) {\n if (toolData.data[i] === data) {\n indexOfData = i;\n }\n }\n\n if (indexOfData !== -1) {\n toolData.data.splice(indexOfData, 1);\n\n var eventType = _events2.default.MEASUREMENT_REMOVED;\n var eventData = {\n toolType: toolType,\n element: element,\n measurementData: data\n };\n\n (0, _triggerEvent2.default)(element, eventType, eventData);\n }\n}\n\nfunction clearToolState(element, toolType) {\n var toolStateManager = getElementToolStateManager(element);\n var toolData = toolStateManager.get(element, toolType);\n\n // If any toolData actually exists, clear it\n if (toolData !== undefined) {\n toolData.data = [];\n }\n}\n\n// Sets the tool state manager for an element\nfunction setElementToolStateManager(element, toolStateManager) {\n var enabledImage = _externalModules2.default.cornerstone.getEnabledElement(element);\n\n enabledImage.toolStateManager = toolStateManager;\n}\n\nexports.addToolState = addToolState;\nexports.getToolState = getToolState;\nexports.removeToolState = removeToolState;\nexports.clearToolState = clearToolState;\nexports.setElementToolStateManager = setElementToolStateManager;\nexports.getElementToolStateManager = getElementToolStateManager;\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar elementToolOptions = {};\n\nfunction getToolOptions(toolType, element) {\n if (!elementToolOptions[toolType]) {\n return {};\n }\n\n var toolOptions = elementToolOptions[toolType];\n var optionsObject = toolOptions.find(function (toolOptionObject) {\n return toolOptionObject.element === element;\n });\n\n if (!optionsObject) {\n return {};\n }\n\n return optionsObject.options;\n}\n\nfunction setToolOptions(toolType, element, options) {\n if (!elementToolOptions[toolType]) {\n elementToolOptions[toolType] = [{\n element: element,\n options: options\n }];\n\n return;\n }\n\n var toolOptions = elementToolOptions[toolType];\n var index = toolOptions.findIndex(function (toolOptionObject) {\n return toolOptionObject.element === element;\n });\n\n if (index === -1) {\n elementToolOptions[toolType].push({\n element: element,\n options: options\n });\n } else {\n elementToolOptions[toolType][index].options = options;\n }\n}\n\nexports.getToolOptions = getToolOptions;\nexports.setToolOptions = setToolOptions;\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (which, mouseButtonMask) {\n var mouseButton = 1 << which - 1;\n\n return (mouseButtonMask & mouseButton) !== 0;\n};\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = triggerEvent;\n/**\n * Trigger a CustomEvent\n *\n * @param {EventTarget} el The element or EventTarget to trigger the event upon\n * @param {String} type The event type name\n * @param {Object|null} detail=null The event data to be sent\n * @returns {Boolean} The return value is false if at least one event listener called preventDefault(). Otherwise it returns true.\n */\nfunction triggerEvent(el, type) {\n var detail = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n\n var event = void 0;\n\n // This check is needed to polyfill CustomEvent on IE11-\n if (typeof window.CustomEvent === 'function') {\n event = new CustomEvent(type, {\n detail: detail,\n cancelable: true\n });\n } else {\n event = document.createEvent('CustomEvent');\n event.initCustomEvent(type, true, true, detail);\n }\n\n return el.dispatchEvent(event);\n}\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar defaultColor = 'white',\n activeColor = 'greenyellow',\n fillColor = 'transparent';\n\nfunction setFillColor(color) {\n fillColor = color;\n}\n\nfunction getFillColor() {\n return fillColor;\n}\n\nfunction setToolColor(color) {\n defaultColor = color;\n}\n\nfunction getToolColor() {\n return defaultColor;\n}\n\nfunction setActiveColor(color) {\n activeColor = color;\n}\n\nfunction getActiveColor() {\n return activeColor;\n}\n\nfunction getColorIfActive(active) {\n return active ? activeColor : defaultColor;\n}\n\nvar toolColors = {\n setFillColor: setFillColor,\n getFillColor: getFillColor,\n setToolColor: setToolColor,\n getToolColor: getToolColor,\n setActiveColor: setActiveColor,\n getActiveColor: getActiveColor,\n getColorIfActive: getColorIfActive\n};\n\nexports.default = toolColors;\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (context, textLines, x, y, color, options) {\n if (Object.prototype.toString.call(textLines) !== '[object Array]') {\n textLines = [textLines];\n }\n\n var padding = 5;\n var font = _textStyle2.default.getFont();\n var fontSize = _textStyle2.default.getFontSize();\n var backgroundColor = _textStyle2.default.getBackgroundColor();\n\n context.save();\n context.font = font;\n context.textBaseline = 'top';\n context.strokeStyle = color;\n\n // Find the longest text width in the array of text data\n var maxWidth = 0;\n\n textLines.forEach(function (text) {\n // Get the text width in the current font\n var width = context.measureText(text).width;\n\n // Find the maximum with for all the text rows;\n maxWidth = Math.max(maxWidth, width);\n });\n\n // Draw the background box with padding\n context.fillStyle = backgroundColor;\n\n // Calculate the bounding box for this text box\n var boundingBox = {\n width: maxWidth + padding * 2,\n height: padding + textLines.length * (fontSize + padding)\n };\n\n if (options && options.centering && options.centering.x === true) {\n x -= boundingBox.width / 2;\n }\n\n if (options && options.centering && options.centering.y === true) {\n y -= boundingBox.height / 2;\n }\n\n boundingBox.left = x;\n boundingBox.top = y;\n\n if (options && options.debug === true) {\n context.fillStyle = '#FF0000';\n }\n\n context.fillRect(boundingBox.left, boundingBox.top, boundingBox.width, boundingBox.height);\n\n // Draw each of the text lines on top of the background box\n textLines.forEach(function (text, index) {\n context.fillStyle = color;\n\n /* Var ypos;\n if (index === 0) {\n ypos = y + index * (fontSize + padding);\n } else {\n ypos = y + index * (fontSize + padding * 2);\n }*/\n\n context.fillText(text, x + padding, y + padding + index * (fontSize + padding));\n });\n\n context.restore();\n\n // Return the bounding box so it can be used for pointNearHandle\n return boundingBox;\n};\n\nvar _textStyle = __webpack_require__(13);\n\nvar _textStyle2 = _interopRequireDefault(_textStyle);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar defaultWidth = 1,\n activeWidth = 2;\n\nfunction setToolWidth(width) {\n defaultWidth = width;\n}\n\nfunction getToolWidth() {\n return defaultWidth;\n}\n\nfunction setActiveWidth(width) {\n activeWidth = width;\n}\n\nfunction getActiveWidth() {\n return activeWidth;\n}\n\nvar toolStyle = {\n setToolWidth: setToolWidth,\n getToolWidth: getToolWidth,\n setActiveWidth: setActiveWidth,\n getActiveWidth: getActiveWidth\n};\n\nexports.default = toolStyle;\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (mouseToolInterface) {\n var configuration = {};\n var toolType = mouseToolInterface.toolType;\n\n function mouseDownActivateCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n var options = (0, _toolOptions.getToolOptions)(toolType, element);\n\n if (!(0, _isMouseButtonEnabled2.default)(eventData.which, options.mouseButtonMask)) {\n return;\n }\n\n if (mouseToolInterface.addNewMeasurement) {\n mouseToolInterface.addNewMeasurement(eventData);\n } else {\n addNewMeasurement(eventData);\n }\n\n e.preventDefault();\n e.stopPropagation();\n }\n\n // /////// END ACTIVE TOOL ///////\n\n // /////// BEGIN DEACTIVE TOOL ///////\n\n function mouseMoveCallback(e) {\n var eventData = e.detail;\n\n _toolCoordinates2.default.setCoords(eventData);\n\n // If we have no tool data for this element, do nothing\n var toolData = (0, _toolState.getToolState)(eventData.element, toolType);\n\n if (!toolData) {\n return;\n }\n\n // We have tool data, search through all data\n // And see if we can activate a handle\n var imageNeedsUpdate = false;\n\n for (var i = 0; i < toolData.data.length; i++) {\n // Get the cursor position in canvas coordinates\n var coords = eventData.currentPoints.canvas;\n\n var data = toolData.data[i];\n\n if ((0, _handleActivator2.default)(eventData.element, data.handles, coords) === true) {\n imageNeedsUpdate = true;\n }\n\n if (mouseToolInterface.pointNearTool(eventData.element, data, coords) && !data.active || !mouseToolInterface.pointNearTool(eventData.element, data, coords) && data.active) {\n data.active = !data.active;\n imageNeedsUpdate = true;\n }\n }\n\n // Handle activation status changed, redraw the image\n if (imageNeedsUpdate === true) {\n _externalModules2.default.cornerstone.updateImage(eventData.element);\n }\n }\n\n function mouseDownCallback(e) {\n var eventData = e.detail;\n var data = void 0;\n var element = eventData.element;\n var options = (0, _toolOptions.getToolOptions)(toolType, element);\n\n if (!(0, _isMouseButtonEnabled2.default)(eventData.which, options.mouseButtonMask)) {\n return;\n }\n\n function handleDoneMove() {\n data.invalidated = true;\n if ((0, _anyHandlesOutsideImage2.default)(eventData, data.handles)) {\n // Delete the measurement\n (0, _toolState.removeToolState)(element, toolType, data);\n }\n\n _externalModules2.default.cornerstone.updateImage(element);\n element.addEventListener(_events2.default.MOUSE_MOVE, mouseMove);\n }\n\n var coords = eventData.startPoints.canvas;\n var toolData = (0, _toolState.getToolState)(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n var i = void 0;\n\n // Now check to see if there is a handle we can move\n\n var preventHandleOutsideImage = void 0;\n\n if (mouseToolInterface.options && mouseToolInterface.options.preventHandleOutsideImage !== undefined) {\n preventHandleOutsideImage = mouseToolInterface.options.preventHandleOutsideImage;\n } else {\n preventHandleOutsideImage = false;\n }\n\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n var distance = 6;\n var handle = (0, _getHandleNearImagePoint2.default)(element, data.handles, coords, distance);\n\n if (handle) {\n element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMove);\n data.active = true;\n (0, _moveHandle2.default)(eventData, toolType, data, handle, handleDoneMove, preventHandleOutsideImage);\n e.stopImmediatePropagation();\n e.stopPropagation();\n e.preventDefault();\n\n return;\n }\n }\n\n // Now check to see if there is a line we can move\n // Now check to see if we have a tool that we can move\n if (!mouseToolInterface.pointNearTool) {\n return;\n }\n\n var opt = mouseToolInterface.options || {\n deleteIfHandleOutsideImage: true,\n preventHandleOutsideImage: false\n };\n\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n data.active = false;\n if (mouseToolInterface.pointNearTool(element, data, coords)) {\n data.active = true;\n element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMove);\n (0, _moveAllHandles2.default)(e, data, toolData, toolType, opt, handleDoneMove);\n e.stopImmediatePropagation();\n e.stopPropagation();\n e.preventDefault();\n\n return;\n }\n }\n }\n // /////// END DEACTIVE TOOL ///////\n\n\n var mouseMove = mouseToolInterface.mouseMoveCallback || mouseMoveCallback;\n var mouseDown = mouseToolInterface.mouseDownCallback || mouseDownCallback;\n var mouseDownActivate = mouseToolInterface.mouseDownActivateCallback || mouseDownActivateCallback;\n var mouseDoubleClick = mouseToolInterface.mouseDoubleClickCallback;\n\n // /////// BEGIN ACTIVE TOOL ///////\n function addNewMeasurement(mouseEventData) {\n var cornerstone = _externalModules2.default.cornerstone;\n var element = mouseEventData.element;\n\n var measurementData = mouseToolInterface.createNewMeasurement(mouseEventData);\n\n if (!measurementData) {\n return;\n }\n\n // Associate this data with this imageId so we can render it and manipulate it\n (0, _toolState.addToolState)(mouseEventData.element, toolType, measurementData);\n\n // Since we are dragging to another place to drop the end point, we can just activate\n // The end point and let the moveHandle move it for us.\n element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMove);\n element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDown);\n element.removeEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownActivate);\n\n if (mouseDoubleClick) {\n element.removeEventListener(_events2.default.MOUSE_DOUBLE_CLICK, mouseDoubleClick);\n }\n\n cornerstone.updateImage(element);\n\n var handleMover = void 0;\n\n if (Object.keys(measurementData.handles).length === 1) {\n handleMover = _moveHandle2.default;\n } else {\n handleMover = _moveNewHandle2.default;\n }\n\n var preventHandleOutsideImage = void 0;\n\n if (mouseToolInterface.options && mouseToolInterface.options.preventHandleOutsideImage !== undefined) {\n preventHandleOutsideImage = mouseToolInterface.options.preventHandleOutsideImage;\n } else {\n preventHandleOutsideImage = false;\n }\n\n handleMover(mouseEventData, toolType, measurementData, measurementData.handles.end, function () {\n measurementData.active = false;\n measurementData.invalidated = true;\n if ((0, _anyHandlesOutsideImage2.default)(mouseEventData, measurementData.handles)) {\n // Delete the measurement\n (0, _toolState.removeToolState)(element, toolType, measurementData);\n }\n\n element.addEventListener(_events2.default.MOUSE_MOVE, mouseMove);\n element.addEventListener(_events2.default.MOUSE_DOWN, mouseDown);\n element.addEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownActivate);\n\n if (mouseDoubleClick) {\n element.addEventListener(_events2.default.MOUSE_DOUBLE_CLICK, mouseDoubleClick);\n }\n\n cornerstone.updateImage(element);\n }, preventHandleOutsideImage);\n }\n\n // Not visible, not interactive\n function disable(element) {\n element.removeEventListener(_events2.default.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMove);\n element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDown);\n element.removeEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownActivate);\n\n if (mouseDoubleClick) {\n element.removeEventListener(_events2.default.MOUSE_DOUBLE_CLICK, mouseDoubleClick);\n }\n\n _externalModules2.default.cornerstone.updateImage(element);\n }\n\n // Visible but not interactive\n function enable(element) {\n element.removeEventListener(_events2.default.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMove);\n element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDown);\n element.removeEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownActivate);\n\n if (mouseDoubleClick) {\n element.removeEventListener(_events2.default.MOUSE_DOUBLE_CLICK, mouseDoubleClick);\n }\n\n element.addEventListener(_events2.default.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n\n _externalModules2.default.cornerstone.updateImage(element);\n }\n\n // Visible, interactive and can create\n function activate(element, mouseButtonMask) {\n (0, _toolOptions.setToolOptions)(toolType, element, { mouseButtonMask: mouseButtonMask });\n\n element.removeEventListener(_events2.default.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMove);\n element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDown);\n element.removeEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownActivate);\n\n element.addEventListener(_events2.default.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n element.addEventListener(_events2.default.MOUSE_MOVE, mouseMove);\n element.addEventListener(_events2.default.MOUSE_DOWN, mouseDown);\n element.addEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownActivate);\n\n if (mouseDoubleClick) {\n element.removeEventListener(_events2.default.MOUSE_DOUBLE_CLICK, mouseDoubleClick);\n element.addEventListener(_events2.default.MOUSE_DOUBLE_CLICK, mouseDoubleClick);\n }\n\n _externalModules2.default.cornerstone.updateImage(element);\n }\n\n // Visible, interactive\n function deactivate(element, mouseButtonMask) {\n (0, _toolOptions.setToolOptions)(toolType, element, { mouseButtonMask: mouseButtonMask });\n\n var eventType = _events2.default.TOOL_DEACTIVATED;\n var statusChangeEventData = {\n mouseButtonMask: mouseButtonMask,\n toolType: toolType,\n type: eventType\n };\n\n (0, _triggerEvent2.default)(element, eventType, statusChangeEventData);\n\n element.removeEventListener(_events2.default.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMove);\n element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDown);\n element.removeEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownActivate);\n\n element.addEventListener(_events2.default.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n element.addEventListener(_events2.default.MOUSE_MOVE, mouseMove);\n element.addEventListener(_events2.default.MOUSE_DOWN, mouseDown);\n\n if (mouseDoubleClick) {\n element.removeEventListener(_events2.default.MOUSE_DOUBLE_CLICK, mouseDoubleClick);\n element.addEventListener(_events2.default.MOUSE_DOUBLE_CLICK, mouseDoubleClick);\n }\n\n if (mouseToolInterface.deactivate) {\n mouseToolInterface.deactivate(element, mouseButtonMask);\n }\n\n _externalModules2.default.cornerstone.updateImage(element);\n }\n\n function getConfiguration() {\n return configuration;\n }\n\n function setConfiguration(config) {\n configuration = config;\n }\n\n var toolInterface = {\n enable: enable,\n disable: disable,\n activate: activate,\n deactivate: deactivate,\n getConfiguration: getConfiguration,\n setConfiguration: setConfiguration,\n mouseDownCallback: mouseDownCallback,\n mouseMoveCallback: mouseMoveCallback,\n mouseDownActivateCallback: mouseDownActivateCallback\n };\n\n // Expose pointNearTool if available\n if (mouseToolInterface.pointNearTool) {\n toolInterface.pointNearTool = mouseToolInterface.pointNearTool;\n }\n\n if (mouseDoubleClick) {\n toolInterface.mouseDoubleClickCallback = mouseDoubleClick;\n }\n\n if (mouseToolInterface.addNewMeasurement) {\n toolInterface.addNewMeasurement = mouseToolInterface.addNewMeasurement;\n }\n\n return toolInterface;\n};\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _toolCoordinates = __webpack_require__(36);\n\nvar _toolCoordinates2 = _interopRequireDefault(_toolCoordinates);\n\nvar _getHandleNearImagePoint = __webpack_require__(21);\n\nvar _getHandleNearImagePoint2 = _interopRequireDefault(_getHandleNearImagePoint);\n\nvar _handleActivator = __webpack_require__(37);\n\nvar _handleActivator2 = _interopRequireDefault(_handleActivator);\n\nvar _moveHandle = __webpack_require__(23);\n\nvar _moveHandle2 = _interopRequireDefault(_moveHandle);\n\nvar _moveNewHandle = __webpack_require__(24);\n\nvar _moveNewHandle2 = _interopRequireDefault(_moveNewHandle);\n\nvar _moveAllHandles = __webpack_require__(38);\n\nvar _moveAllHandles2 = _interopRequireDefault(_moveAllHandles);\n\nvar _anyHandlesOutsideImage = __webpack_require__(14);\n\nvar _anyHandlesOutsideImage2 = _interopRequireDefault(_anyHandlesOutsideImage);\n\nvar _isMouseButtonEnabled = __webpack_require__(4);\n\nvar _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled);\n\nvar _toolState = __webpack_require__(2);\n\nvar _triggerEvent = __webpack_require__(5);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nvar _toolOptions = __webpack_require__(3);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (context, renderData, handles, color, options) {\n context.strokeStyle = color;\n\n Object.keys(handles).forEach(function (name) {\n var handle = handles[name];\n\n if (handle.drawnIndependently === true) {\n return;\n }\n\n if (options && options.drawHandlesIfActive === true && !handle.active) {\n return;\n }\n\n context.beginPath();\n\n if (handle.active) {\n context.lineWidth = _toolStyle2.default.getActiveWidth();\n } else {\n context.lineWidth = _toolStyle2.default.getToolWidth();\n }\n\n var handleCanvasCoords = _externalModules2.default.cornerstone.pixelToCanvas(renderData.element, handle);\n\n context.arc(handleCanvasCoords.x, handleCanvasCoords.y, handleRadius, 0, 2 * Math.PI);\n\n if (options && options.fill) {\n context.fillStyle = options.fill;\n context.fill();\n }\n\n context.stroke();\n });\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _toolStyle = __webpack_require__(8);\n\nvar _toolStyle2 = _interopRequireDefault(_toolStyle);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar handleRadius = 6;\n\n/***/ }),\n/* 11 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _anyHandlesOutsideImage = __webpack_require__(14);\n\nvar _anyHandlesOutsideImage2 = _interopRequireDefault(_anyHandlesOutsideImage);\n\nvar _getHandleNearImagePoint = __webpack_require__(21);\n\nvar _getHandleNearImagePoint2 = _interopRequireDefault(_getHandleNearImagePoint);\n\nvar _touchMoveHandle = __webpack_require__(52);\n\nvar _touchMoveHandle2 = _interopRequireDefault(_touchMoveHandle);\n\nvar _moveNewHandleTouch = __webpack_require__(27);\n\nvar _moveNewHandleTouch2 = _interopRequireDefault(_moveNewHandleTouch);\n\nvar _touchMoveAllHandles = __webpack_require__(51);\n\nvar _touchMoveAllHandles2 = _interopRequireDefault(_touchMoveAllHandles);\n\nvar _toolState = __webpack_require__(2);\n\nvar _triggerEvent = __webpack_require__(5);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction deactivateAllHandles(handles) {\n Object.keys(handles).forEach(function (name) {\n var handle = handles[name];\n\n handle.active = false;\n });\n}\n\nfunction deactivateAllToolInstances(toolData) {\n if (!toolData) {\n return;\n }\n\n for (var i = 0; i < toolData.data.length; i++) {\n var data = toolData.data[i];\n\n data.active = false;\n if (!data.handles) {\n continue;\n }\n\n deactivateAllHandles(data.handles);\n }\n}\n\nfunction touchTool(touchToolInterface) {\n // /////// BEGIN ACTIVE TOOL ///////\n function addNewMeasurement(touchEventData) {\n // Console.log('touchTool addNewMeasurement');\n var cornerstone = _externalModules2.default.cornerstone;\n var element = touchEventData.element;\n\n var measurementData = touchToolInterface.createNewMeasurement(touchEventData);\n\n if (!measurementData) {\n return;\n }\n\n (0, _toolState.addToolState)(element, touchToolInterface.toolType, measurementData);\n\n if (Object.keys(measurementData.handles).length === 1 && touchEventData.type === _events2.default.TAP) {\n measurementData.active = false;\n measurementData.handles.end.active = false;\n measurementData.handles.end.highlight = false;\n measurementData.invalidated = true;\n if ((0, _anyHandlesOutsideImage2.default)(touchEventData, measurementData.handles)) {\n // Delete the measurement\n (0, _toolState.removeToolState)(element, touchToolInterface.toolType, measurementData);\n }\n\n cornerstone.updateImage(element);\n\n return;\n }\n\n element.removeEventListener(_events2.default.TOUCH_START_ACTIVE, touchToolInterface.touchDownActivateCallback || touchDownActivateCallback);\n element.removeEventListener(_events2.default.TAP, touchToolInterface.tapCallback || tapCallback);\n element.removeEventListener(_events2.default.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n\n cornerstone.updateImage(element);\n (0, _moveNewHandleTouch2.default)(touchEventData, touchToolInterface.toolType, measurementData, measurementData.handles.end, function () {\n measurementData.active = false;\n measurementData.invalidated = true;\n if ((0, _anyHandlesOutsideImage2.default)(touchEventData, measurementData.handles)) {\n // Delete the measurement\n (0, _toolState.removeToolState)(element, touchToolInterface.toolType, measurementData);\n }\n\n element.addEventListener(_events2.default.TOUCH_START_ACTIVE, touchToolInterface.touchDownActivateCallback || touchDownActivateCallback);\n element.addEventListener(_events2.default.TAP, touchToolInterface.tapCallback || tapCallback);\n element.addEventListener(_events2.default.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n cornerstone.updateImage(element);\n });\n }\n\n function touchDownActivateCallback(e) {\n var eventData = e.detail;\n\n // Console.log('touchTool touchDownActivateCallback');\n if (touchToolInterface.addNewMeasurement) {\n touchToolInterface.addNewMeasurement(eventData);\n } else {\n addNewMeasurement(eventData);\n }\n\n e.stopImmediatePropagation();\n e.preventDefault();\n }\n // /////// END ACTIVE TOOL ///////\n\n // /////// BEGIN INACTIVE TOOL ///////\n function tapCallback(e) {\n var eventData = e.detail;\n\n // Console.log('touchTool tapCallback');\n var cornerstone = _externalModules2.default.cornerstone;\n var element = eventData.element;\n var coords = eventData.currentPoints.canvas;\n var toolData = (0, _toolState.getToolState)(e.currentTarget, touchToolInterface.toolType);\n var data = void 0;\n var i = void 0;\n\n // Deactivate everything\n deactivateAllToolInstances(toolData);\n\n function doneMovingCallback() {\n // Console.log('touchTool tapCallback doneMovingCallback');\n deactivateAllToolInstances(toolData);\n if ((0, _anyHandlesOutsideImage2.default)(eventData, data.handles)) {\n // Delete the measurement\n (0, _toolState.removeToolState)(element, touchToolInterface.toolType, data);\n }\n\n cornerstone.updateImage(element);\n element.addEventListener(_events2.default.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n element.addEventListener(_events2.default.TAP, touchToolInterface.tapCallback || tapCallback);\n }\n\n // Now check to see if there is a handle we can move\n if (toolData) {\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n var distanceSq = 25; // Should probably make this a settable property later\n var handle = (0, _getHandleNearImagePoint2.default)(element, data.handles, coords, distanceSq);\n\n if (handle) {\n element.removeEventListener(_events2.default.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n element.removeEventListener(_events2.default.TAP, touchToolInterface.tapCallback || tapCallback);\n data.active = true;\n handle.active = true;\n cornerstone.updateImage(element);\n (0, _touchMoveHandle2.default)(e, touchToolInterface.toolType, data, handle, doneMovingCallback);\n e.stopImmediatePropagation();\n e.preventDefault();\n\n return;\n }\n }\n }\n\n // Now check to see if we have a tool that we can move\n if (toolData && touchToolInterface.pointNearTool) {\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (touchToolInterface.pointNearTool(element, data, coords)) {\n element.removeEventListener(_events2.default.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n element.removeEventListener(_events2.default.TAP, touchToolInterface.tapCallback || tapCallback);\n data.active = true;\n cornerstone.updateImage(element);\n (0, _touchMoveAllHandles2.default)(e, data, toolData, touchToolInterface.toolType, true, doneMovingCallback);\n e.stopImmediatePropagation();\n e.preventDefault();\n\n return;\n }\n }\n }\n\n // If there is nothing to move, add a new instance of the tool\n // Need to check here to see if activation is allowed!\n if (touchToolInterface.touchDownActivateCallback) {\n touchToolInterface.touchDownActivateCallback(e);\n } else {\n touchDownActivateCallback(e);\n }\n\n return false;\n }\n\n function touchStartCallback(e) {\n var eventData = e.detail;\n\n // Console.log('touchTool touchStartCallback');\n var cornerstone = _externalModules2.default.cornerstone;\n var element = eventData.element;\n var coords = eventData.startPoints.canvas;\n var data = void 0;\n var toolData = (0, _toolState.getToolState)(e.currentTarget, touchToolInterface.toolType);\n var i = void 0;\n\n function doneMovingCallback(lastEvent, lastEventData) {\n // Console.log('touchTool touchStartCallback doneMovingCallback');\n data.active = false;\n data.invalidated = true;\n if ((0, _anyHandlesOutsideImage2.default)(eventData, data.handles)) {\n // Delete the measurement\n (0, _toolState.removeToolState)(eventData.element, touchToolInterface.toolType, data);\n }\n\n cornerstone.updateImage(eventData.element);\n element.addEventListener(_events2.default.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n element.addEventListener(_events2.default.TAP, touchToolInterface.tapCallback || tapCallback);\n\n if (touchToolInterface.pressCallback) {\n element.addEventListener(_events2.default.TOUCH_PRESS, touchToolInterface.pressCallback);\n }\n\n if (lastEvent && lastEvent.type === _events2.default.TOUCH_PRESS) {\n (0, _triggerEvent2.default)(element, lastEvent.type, lastEventData);\n }\n }\n\n // Now check to see if there is a handle we can move\n\n // Average pixel width of index finger is 45-57 pixels\n // https://www.smashingmagazine.com/2012/02/finger-friendly-design-ideal-mobile-touchscreen-target-sizes/\n var distance = 28;\n\n if (!toolData) {\n return;\n }\n\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n\n var handle = (0, _getHandleNearImagePoint2.default)(eventData.element, data.handles, coords, distance);\n\n if (handle) {\n element.removeEventListener(_events2.default.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n element.removeEventListener(_events2.default.TAP, touchToolInterface.tapCallback || tapCallback);\n if (touchToolInterface.pressCallback) {\n element.removeEventListener(_events2.default.TOUCH_PRESS, touchToolInterface.pressCallback);\n }\n\n data.active = true;\n (0, _touchMoveHandle2.default)(e, touchToolInterface.toolType, data, handle, doneMovingCallback);\n e.stopImmediatePropagation();\n e.preventDefault();\n e.stopPropagation();\n\n return;\n }\n }\n\n // Now check to see if we have a tool that we can move\n if (!touchToolInterface.pointNearTool) {\n return;\n }\n\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n\n if (touchToolInterface.pointNearTool(eventData.element, data, coords)) {\n element.removeEventListener(_events2.default.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n element.removeEventListener(_events2.default.TAP, touchToolInterface.tapCallback || tapCallback);\n if (touchToolInterface.pressCallback) {\n element.removeEventListener(_events2.default.TOUCH_PRESS, touchToolInterface.pressCallback);\n }\n\n (0, _touchMoveAllHandles2.default)(e, data, toolData, touchToolInterface.toolType, true, doneMovingCallback);\n e.stopImmediatePropagation();\n e.preventDefault();\n e.stopPropagation();\n\n return;\n }\n }\n }\n // /////// END INACTIVE TOOL ///////\n\n // Not visible, not interactive\n function disable(element) {\n element.removeEventListener(_events2.default.IMAGE_RENDERED, touchToolInterface.onImageRendered);\n element.removeEventListener(_events2.default.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n element.removeEventListener(_events2.default.TOUCH_START_ACTIVE, touchToolInterface.touchDownActivateCallback || touchDownActivateCallback);\n element.removeEventListener(_events2.default.TAP, touchToolInterface.tapCallback || tapCallback);\n\n if (touchToolInterface.doubleTapCallback) {\n element.removeEventListener(_events2.default.DOUBLE_TAP, touchToolInterface.doubleTapCallback);\n }\n\n if (touchToolInterface.pressCallback) {\n element.removeEventListener(_events2.default.TOUCH_PRESS, touchToolInterface.pressCallback);\n }\n\n _externalModules2.default.cornerstone.updateImage(element);\n }\n\n // Visible but not interactive\n function enable(element) {\n element.removeEventListener(_events2.default.IMAGE_RENDERED, touchToolInterface.onImageRendered);\n element.removeEventListener(_events2.default.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n element.removeEventListener(_events2.default.TOUCH_START_ACTIVE, touchToolInterface.touchDownActivateCallback || touchDownActivateCallback);\n element.removeEventListener(_events2.default.TAP, touchToolInterface.tapCallback || tapCallback);\n\n element.addEventListener(_events2.default.IMAGE_RENDERED, touchToolInterface.onImageRendered);\n\n if (touchToolInterface.doubleTapCallback) {\n element.removeEventListener(_events2.default.DOUBLE_TAP, touchToolInterface.doubleTapCallback);\n }\n\n if (touchToolInterface.pressCallback) {\n element.removeEventListener(_events2.default.TOUCH_PRESS, touchToolInterface.pressCallback);\n }\n\n _externalModules2.default.cornerstone.updateImage(element);\n }\n\n // Visible, interactive and can create\n function activate(element) {\n element.removeEventListener(_events2.default.IMAGE_RENDERED, touchToolInterface.onImageRendered);\n element.removeEventListener(_events2.default.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n element.removeEventListener(_events2.default.TOUCH_START_ACTIVE, touchToolInterface.touchDownActivateCallback || touchDownActivateCallback);\n element.removeEventListener(_events2.default.TAP, touchToolInterface.tapCallback || tapCallback);\n\n element.addEventListener(_events2.default.IMAGE_RENDERED, touchToolInterface.onImageRendered);\n element.addEventListener(_events2.default.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n element.addEventListener(_events2.default.TOUCH_START_ACTIVE, touchToolInterface.touchDownActivateCallback || touchDownActivateCallback);\n element.addEventListener(_events2.default.TAP, touchToolInterface.tapCallback || tapCallback);\n\n if (touchToolInterface.doubleTapCallback) {\n element.removeEventListener(_events2.default.DOUBLE_TAP, touchToolInterface.doubleTapCallback);\n element.addEventListener(_events2.default.DOUBLE_TAP, touchToolInterface.doubleTapCallback);\n }\n\n if (touchToolInterface.pressCallback) {\n element.removeEventListener(_events2.default.TOUCH_PRESS, touchToolInterface.pressCallback);\n element.addEventListener(_events2.default.TOUCH_PRESS, touchToolInterface.pressCallback);\n }\n\n _externalModules2.default.cornerstone.updateImage(element);\n }\n\n // Visible, interactive\n function deactivate(element) {\n var eventType = _events2.default.TOOL_DEACTIVATED;\n var statusChangeEventData = {\n toolType: touchToolInterface.toolType,\n type: eventType\n };\n\n (0, _triggerEvent2.default)(element, eventType, statusChangeEventData);\n\n element.removeEventListener(_events2.default.IMAGE_RENDERED, touchToolInterface.onImageRendered);\n element.removeEventListener(_events2.default.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n element.removeEventListener(_events2.default.TOUCH_START_ACTIVE, touchToolInterface.touchDownActivateCallback || touchDownActivateCallback);\n element.removeEventListener(_events2.default.TAP, touchToolInterface.tapCallback || tapCallback);\n\n element.addEventListener(_events2.default.IMAGE_RENDERED, touchToolInterface.onImageRendered);\n element.addEventListener(_events2.default.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n\n if (touchToolInterface.doubleTapCallback) {\n element.removeEventListener(_events2.default.DOUBLE_TAP, touchToolInterface.doubleTapCallback);\n }\n\n if (touchToolInterface.pressCallback) {\n element.removeEventListener(_events2.default.TOUCH_PRESS, touchToolInterface.pressCallback);\n }\n\n _externalModules2.default.cornerstone.updateImage(element);\n }\n\n var toolInterface = {\n enable: enable,\n disable: disable,\n activate: activate,\n deactivate: deactivate,\n touchStartCallback: touchToolInterface.touchStartCallback || touchStartCallback,\n touchDownActivateCallback: touchToolInterface.touchDownActivateCallback || touchDownActivateCallback,\n tapCallback: touchToolInterface.tapCallback || tapCallback\n };\n\n // Expose pointNearTool if available\n if (touchToolInterface.pointNearTool) {\n toolInterface.pointNearTool = touchToolInterface.pointNearTool;\n }\n\n if (touchToolInterface.doubleTapCallback) {\n toolInterface.doubleTapCallback = touchToolInterface.doubleTapCallback;\n }\n\n if (touchToolInterface.pressCallback) {\n toolInterface.pressCallback = touchToolInterface.pressCallback;\n }\n\n if (touchToolInterface.addNewMeasurement) {\n toolInterface.addNewMeasurement = touchToolInterface.addNewMeasurement;\n }\n\n return toolInterface;\n}\n\nexports.default = touchTool;\n\n/***/ }),\n/* 12 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar defaultStartLoadHandler = void 0;\nvar defaultEndLoadHandler = void 0;\nvar defaultErrorLoadingHandler = void 0;\n\nfunction setStartLoadHandler(handler) {\n defaultStartLoadHandler = handler;\n}\n\nfunction getStartLoadHandler() {\n return defaultStartLoadHandler;\n}\n\nfunction setEndLoadHandler(handler) {\n defaultEndLoadHandler = handler;\n}\n\nfunction getEndLoadHandler() {\n return defaultEndLoadHandler;\n}\n\nfunction setErrorLoadingHandler(handler) {\n defaultErrorLoadingHandler = handler;\n}\n\nfunction getErrorLoadingHandler() {\n return defaultErrorLoadingHandler;\n}\n\nvar loadHandlerManager = {\n setStartLoadHandler: setStartLoadHandler,\n getStartLoadHandler: getStartLoadHandler,\n setEndLoadHandler: setEndLoadHandler,\n getEndLoadHandler: getEndLoadHandler,\n setErrorLoadingHandler: setErrorLoadingHandler,\n getErrorLoadingHandler: getErrorLoadingHandler\n};\n\nexports.default = loadHandlerManager;\n\n/***/ }),\n/* 13 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar defaultFontSize = 15,\n defaultFont = defaultFontSize + 'px Arial',\n defaultBackgroundColor = 'transparent';\n\nfunction setFont(font) {\n defaultFont = font;\n}\n\nfunction getFont() {\n return defaultFont;\n}\n\nfunction setFontSize(fontSize) {\n defaultFontSize = fontSize;\n}\n\nfunction getFontSize() {\n return defaultFontSize;\n}\n\nfunction setBackgroundColor(backgroundColor) {\n defaultBackgroundColor = backgroundColor;\n}\n\nfunction getBackgroundColor() {\n return defaultBackgroundColor;\n}\n\nvar textStyle = {\n setFont: setFont,\n getFont: getFont,\n setFontSize: setFontSize,\n getFontSize: getFontSize,\n setBackgroundColor: setBackgroundColor,\n getBackgroundColor: getBackgroundColor\n};\n\nexports.default = textStyle;\n\n/***/ }),\n/* 14 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (renderData, handles) {\n var image = renderData.image;\n var imageRect = {\n left: 0,\n top: 0,\n width: image.width,\n height: image.height\n };\n\n var handleOutsideImage = false;\n\n Object.keys(handles).forEach(function (name) {\n var handle = handles[name];\n\n if (handle.allowedOutsideImage === true) {\n return;\n }\n\n if (_externalModules2.default.cornerstoneMath.point.insideRect(handle, imageRect) === false) {\n handleOutsideImage = true;\n }\n });\n\n return handleOutsideImage;\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 15 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (touchDragCallback, toolType, options) {\n var events = [_events2.default.TOUCH_DRAG];\n\n if (options && options.fireOnTouchStart === true) {\n events.push(_events2.default.TOUCH_START);\n }\n\n return {\n activate: function activate(element) {\n if (options && options.eventData) {\n (0, _toolOptions.setToolOptions)(toolType, element, options.eventData);\n }\n\n events.forEach(function (eventType) {\n element.removeEventListener(eventType, touchDragCallback);\n element.addEventListener(eventType, touchDragCallback);\n });\n\n if (options && options.activateCallback) {\n options.activateCallback(element);\n }\n },\n disable: function disable(element) {\n events.forEach(function (eventType) {\n element.removeEventListener(eventType, touchDragCallback);\n });\n\n if (options && options.disableCallback) {\n options.disableCallback(element);\n }\n },\n enable: function enable(element) {\n events.forEach(function (eventType) {\n element.removeEventListener(eventType, touchDragCallback);\n });\n\n if (options && options.enableCallback) {\n options.enableCallback(element);\n }\n },\n deactivate: function deactivate(element) {\n events.forEach(function (eventType) {\n element.removeEventListener(eventType, touchDragCallback);\n });\n\n if (options && options.deactivateCallback) {\n options.deactivateCallback(element);\n }\n }\n };\n};\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _toolOptions = __webpack_require__(3);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 16 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (mouseDownCallback, toolType) {\n if (!toolType) {\n throw new Error('simpleMouseButtonTool: toolType is required');\n }\n\n var configuration = {};\n\n return {\n activate: function activate(element, mouseButtonMask) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n options.mouseButtonMask = mouseButtonMask;\n (0, _toolOptions.setToolOptions)(toolType, element, options);\n\n element.removeEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownCallback);\n element.addEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownCallback);\n },\n disable: function disable(element) {\n element.removeEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownCallback);\n },\n enable: function enable(element) {\n element.removeEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownCallback);\n },\n deactivate: function deactivate(element) {\n element.removeEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownCallback);\n },\n getConfiguration: function getConfiguration() {\n return configuration;\n },\n setConfiguration: function setConfiguration(config) {\n configuration = config;\n }\n };\n};\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _toolOptions = __webpack_require__(3);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 17 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = convertToVector3;\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Convert an Array to a cornerstoneMath.Vector3\n *\n * @param {Array|cornerstoneMath.Vector3} arrayOrVector3 Input array or Vector3\n * @return {cornerstoneMath.Vector3}\n */\nfunction convertToVector3(arrayOrVector3) {\n var cornerstoneMath = _externalModules2.default.cornerstoneMath;\n\n if (arrayOrVector3 instanceof cornerstoneMath.Vector3) {\n return arrayOrVector3;\n }\n\n return new cornerstoneMath.Vector3(arrayOrVector3[0], arrayOrVector3[1], arrayOrVector3[2]);\n}\n\n/***/ }),\n/* 18 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.globalImageIdSpecificToolStateManager = exports.newImageIdSpecificToolStateManager = undefined;\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// This implements an imageId specific tool state management strategy. This means that\n// Measurements data is tied to a specific imageId and only visible for enabled elements\n// That are displaying that imageId.\n\nfunction newImageIdSpecificToolStateManager() {\n var toolState = {};\n\n // Here we add tool state, this is done by tools as well\n // As modules that restore saved state\n\n function saveImageIdToolState(imageId) {\n return toolState[imageId];\n }\n\n function restoreImageIdToolState(imageId, imageIdToolState) {\n toolState[imageId] = imageIdToolState;\n }\n\n function saveToolState() {\n return toolState;\n }\n\n function restoreToolState(savedToolState) {\n toolState = savedToolState;\n }\n\n // Here we add tool state, this is done by tools as well\n // As modules that restore saved state\n function addImageIdSpecificToolState(element, toolType, data) {\n var enabledImage = _externalModules2.default.cornerstone.getEnabledElement(element);\n // If we don't have any tool state for this imageId, add an empty object\n\n if (!enabledImage.image || toolState.hasOwnProperty(enabledImage.image.imageId) === false) {\n toolState[enabledImage.image.imageId] = {};\n }\n\n var imageIdToolState = toolState[enabledImage.image.imageId];\n\n // If we don't have tool state for this type of tool, add an empty object\n if (imageIdToolState.hasOwnProperty(toolType) === false) {\n imageIdToolState[toolType] = {\n data: []\n };\n }\n\n var toolData = imageIdToolState[toolType];\n\n // Finally, add this new tool to the state\n toolData.data.push(data);\n }\n\n // Here you can get state - used by tools as well as modules\n // That save state persistently\n function getImageIdSpecificToolState(element, toolType) {\n var enabledImage = _externalModules2.default.cornerstone.getEnabledElement(element);\n // If we don't have any tool state for this imageId, return undefined\n\n if (!enabledImage.image || toolState.hasOwnProperty(enabledImage.image.imageId) === false) {\n return;\n }\n\n var imageIdToolState = toolState[enabledImage.image.imageId];\n\n // If we don't have tool state for this type of tool, return undefined\n if (imageIdToolState.hasOwnProperty(toolType) === false) {\n return;\n }\n\n var toolData = imageIdToolState[toolType];\n\n return toolData;\n }\n\n // Clears all tool data from this toolStateManager.\n function clearImageIdSpecificToolStateManager(element) {\n var enabledImage = _externalModules2.default.cornerstone.getEnabledElement(element);\n\n if (!enabledImage.image || toolState.hasOwnProperty(enabledImage.image.imageId) === false) {\n return;\n }\n\n delete toolState[enabledImage.image.imageId];\n }\n\n return {\n get: getImageIdSpecificToolState,\n add: addImageIdSpecificToolState,\n clear: clearImageIdSpecificToolStateManager,\n saveImageIdToolState: saveImageIdToolState,\n restoreImageIdToolState: restoreImageIdToolState,\n saveToolState: saveToolState,\n restoreToolState: restoreToolState,\n toolState: toolState\n };\n}\n\n// A global imageIdSpecificToolStateManager - the most common case is to share state between all\n// Visible enabled images\nvar globalImageIdSpecificToolStateManager = newImageIdSpecificToolStateManager();\n\nexports.newImageIdSpecificToolStateManager = newImageIdSpecificToolStateManager;\nexports.globalImageIdSpecificToolStateManager = globalImageIdSpecificToolStateManager;\n\n/***/ }),\n/* 19 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (handle, coords) {\n if (!handle.boundingBox) {\n return;\n }\n\n return _externalModules2.default.cornerstoneMath.point.insideRect(coords, handle.boundingBox);\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 20 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (image, storedPixelValue) {\n var cornerstone = _externalModules2.default.cornerstone;\n var patientStudyModule = cornerstone.metaData.get('patientStudyModule', image.imageId);\n var seriesModule = cornerstone.metaData.get('generalSeriesModule', image.imageId);\n\n if (!patientStudyModule || !seriesModule) {\n return;\n }\n\n var modality = seriesModule.modality;\n\n // Image must be PET\n if (modality !== 'PT') {\n return;\n }\n\n var modalityPixelValue = storedPixelValue * image.slope + image.intercept;\n\n var patientWeight = patientStudyModule.patientWeight; // In kg\n\n if (!patientWeight) {\n return;\n }\n\n var petSequenceModule = cornerstone.metaData.get('petIsotopeModule', image.imageId);\n\n if (!petSequenceModule) {\n return;\n }\n\n var radiopharmaceuticalInfo = petSequenceModule.radiopharmaceuticalInfo;\n var startTime = radiopharmaceuticalInfo.radiopharmaceuticalStartTime;\n var totalDose = radiopharmaceuticalInfo.radionuclideTotalDose;\n var halfLife = radiopharmaceuticalInfo.radionuclideHalfLife;\n var seriesAcquisitionTime = seriesModule.seriesTime;\n\n if (!startTime || !totalDose || !halfLife || !seriesAcquisitionTime) {\n return;\n }\n\n var acquisitionTimeInSeconds = fracToDec(seriesAcquisitionTime.fractionalSeconds || 0) + seriesAcquisitionTime.seconds + seriesAcquisitionTime.minutes * 60 + seriesAcquisitionTime.hours * 60 * 60;\n var injectionStartTimeInSeconds = fracToDec(startTime.fractionalSeconds) + startTime.seconds + startTime.minutes * 60 + startTime.hours * 60 * 60;\n var durationInSeconds = acquisitionTimeInSeconds - injectionStartTimeInSeconds;\n var correctedDose = totalDose * Math.exp(-durationInSeconds * Math.log(2) / halfLife);\n var suv = modalityPixelValue * patientWeight / correctedDose * 1000;\n\n return suv;\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Returns a decimal value given a fractional value\nfunction fracToDec(fractionalValue) {\n return parseFloat('.' + fractionalValue);\n}\n\n/***/ }),\n/* 21 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (element, handles, coords, distanceThreshold) {\n var nearbyHandle = void 0;\n\n if (!handles) {\n return;\n }\n\n Object.keys(handles).forEach(function (name) {\n var handle = handles[name];\n\n if (handle.hasOwnProperty('pointNearHandle')) {\n if (handle.pointNearHandle(element, handle, coords)) {\n nearbyHandle = handle;\n\n return;\n }\n } else if (handle.hasBoundingBox === true) {\n if ((0, _pointInsideBoundingBox2.default)(handle, coords)) {\n nearbyHandle = handle;\n\n return;\n }\n } else {\n var handleCanvas = _externalModules2.default.cornerstone.pixelToCanvas(element, handle);\n var distance = _externalModules2.default.cornerstoneMath.point.distance(handleCanvas, coords);\n\n if (distance <= distanceThreshold) {\n nearbyHandle = handle;\n\n return;\n }\n }\n });\n\n return nearbyHandle;\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _pointInsideBoundingBox = __webpack_require__(19);\n\nvar _pointInsideBoundingBox2 = _interopRequireDefault(_pointInsideBoundingBox);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 22 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar configMaxSimultaneousRequests = void 0;\n\n// Maximum concurrent connections to the same server\n// Information from http://sgdev-blog.blogspot.fr/2014/01/maximum-concurrent-connection-to-same.html\nvar maxSimultaneousRequests = {\n default: 6,\n IE: {\n 9: 6,\n 10: 8,\n default: 8\n },\n Firefox: {\n default: 6\n },\n Opera: {\n 10: 8,\n 11: 6,\n 12: 6,\n default: 6\n },\n Chrome: {\n default: 6\n },\n Safari: {\n default: 6\n }\n};\n\n// Browser name / version detection\n// http://stackoverflow.com/questions/2400935/browser-detection-in-javascript\nfunction getBrowserInfo() {\n var ua = navigator.userAgent;\n var M = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\\/))\\/?\\s*(\\d+)/i) || [];\n var tem = void 0;\n\n if (/trident/i.test(M[1])) {\n tem = /\\brv[ :]+(\\d+)/g.exec(ua) || [];\n\n return 'IE ' + (tem[1] || '');\n }\n\n if (M[1] === 'Chrome') {\n tem = ua.match(/\\b(OPR|Edge)\\/(\\d+)/);\n if (tem !== null) {\n return tem.slice(1).join(' ').replace('OPR', 'Opera');\n }\n }\n\n M = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, '-?'];\n if ((tem = ua.match(/version\\/(\\d+)/i)) !== null) {\n M.splice(1, 1, tem[1]);\n }\n\n return M.join(' ');\n}\n\nfunction setMaxSimultaneousRequests(newMaxSimultaneousRequests) {\n configMaxSimultaneousRequests = newMaxSimultaneousRequests;\n}\n\nfunction getMaxSimultaneousRequests() {\n if (configMaxSimultaneousRequests) {\n return configMaxSimultaneousRequests;\n }\n\n return getDefaultSimultaneousRequests();\n}\n\nfunction getDefaultSimultaneousRequests() {\n var infoString = getBrowserInfo();\n var info = infoString.split(' ');\n var browserName = info[0];\n var browserVersion = info[1];\n var browserData = maxSimultaneousRequests[browserName];\n\n if (!browserData) {\n return maxSimultaneousRequests.default;\n }\n\n if (!browserData[browserVersion]) {\n return browserData.default;\n }\n\n return browserData[browserVersion];\n}\n\nfunction isMobileDevice() {\n var pattern = new RegExp('Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini');\n\n return pattern.test(navigator.userAgent);\n}\n\nexports.getDefaultSimultaneousRequests = getDefaultSimultaneousRequests;\nexports.getMaxSimultaneousRequests = getMaxSimultaneousRequests;\nexports.setMaxSimultaneousRequests = setMaxSimultaneousRequests;\nexports.getBrowserInfo = getBrowserInfo;\nexports.isMobileDevice = isMobileDevice;\n\n/***/ }),\n/* 23 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (mouseEventData, toolType, data, handle, doneMovingCallback, preventHandleOutsideImage) {\n var cornerstone = _externalModules2.default.cornerstone;\n var element = mouseEventData.element;\n var distanceFromTool = {\n x: handle.x - mouseEventData.currentPoints.image.x,\n y: handle.y - mouseEventData.currentPoints.image.y\n };\n\n function mouseDragCallback(e) {\n var eventData = e.detail;\n\n if (handle.hasMoved === false) {\n handle.hasMoved = true;\n }\n\n handle.active = true;\n handle.x = eventData.currentPoints.image.x + distanceFromTool.x;\n handle.y = eventData.currentPoints.image.y + distanceFromTool.y;\n\n if (preventHandleOutsideImage) {\n handle.x = Math.max(handle.x, 0);\n handle.x = Math.min(handle.x, eventData.image.width);\n\n handle.y = Math.max(handle.y, 0);\n handle.y = Math.min(handle.y, eventData.image.height);\n }\n\n cornerstone.updateImage(element);\n\n var eventType = _events2.default.MEASUREMENT_MODIFIED;\n var modifiedEventData = {\n toolType: toolType,\n element: element,\n measurementData: data\n };\n\n (0, _triggerEvent2.default)(element, eventType, modifiedEventData);\n }\n\n element.addEventListener(_events2.default.MOUSE_DRAG, mouseDragCallback);\n\n function mouseUpCallback() {\n handle.active = false;\n element.removeEventListener(_events2.default.MOUSE_DRAG, mouseDragCallback);\n element.removeEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback);\n cornerstone.updateImage(element);\n\n if (typeof doneMovingCallback === 'function') {\n doneMovingCallback();\n }\n }\n\n element.addEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n element.addEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback);\n};\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _triggerEvent = __webpack_require__(5);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 24 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (mouseEventData, toolType, data, handle, doneMovingCallback, preventHandleOutsideImage) {\n var cornerstone = _externalModules2.default.cornerstone;\n var element = mouseEventData.element;\n\n function moveCallback(e) {\n var eventData = e.detail;\n\n handle.active = true;\n handle.x = eventData.currentPoints.image.x;\n handle.y = eventData.currentPoints.image.y;\n\n if (preventHandleOutsideImage) {\n handle.x = Math.max(handle.x, 0);\n handle.x = Math.min(handle.x, eventData.image.width);\n\n handle.y = Math.max(handle.y, 0);\n handle.y = Math.min(handle.y, eventData.image.height);\n }\n\n cornerstone.updateImage(element);\n\n var eventType = _events2.default.MEASUREMENT_MODIFIED;\n var modifiedEventData = {\n toolType: toolType,\n element: element,\n measurementData: data\n };\n\n (0, _triggerEvent2.default)(element, eventType, modifiedEventData);\n }\n\n function whichMovement(e) {\n element.removeEventListener(_events2.default.MOUSE_MOVE, whichMovement);\n element.removeEventListener(_events2.default.MOUSE_DRAG, whichMovement);\n\n element.addEventListener(_events2.default.MOUSE_MOVE, moveCallback);\n element.addEventListener(_events2.default.MOUSE_DRAG, moveCallback);\n\n element.addEventListener(_events2.default.MOUSE_CLICK, moveEndCallback);\n if (e.type === _events2.default.MOUSE_DRAG) {\n element.addEventListener(_events2.default.MOUSE_UP, moveEndCallback);\n }\n }\n\n function measurementRemovedCallback(e) {\n var eventData = e.detail;\n\n if (eventData.measurementData === data) {\n moveEndCallback();\n }\n }\n\n function toolDeactivatedCallback(e) {\n var eventData = e.detail;\n\n if (eventData.toolType === toolType) {\n element.removeEventListener(_events2.default.MOUSE_MOVE, moveCallback);\n element.removeEventListener(_events2.default.MOUSE_DRAG, moveCallback);\n element.removeEventListener(_events2.default.MOUSE_CLICK, moveEndCallback);\n element.removeEventListener(_events2.default.MOUSE_UP, moveEndCallback);\n element.removeEventListener(_events2.default.MEASUREMENT_REMOVED, measurementRemovedCallback);\n element.removeEventListener(_events2.default.TOOL_DEACTIVATED, toolDeactivatedCallback);\n\n handle.active = false;\n cornerstone.updateImage(element);\n }\n }\n\n element.addEventListener(_events2.default.MOUSE_DRAG, whichMovement);\n element.addEventListener(_events2.default.MOUSE_MOVE, whichMovement);\n element.addEventListener(_events2.default.MEASUREMENT_REMOVED, measurementRemovedCallback);\n element.addEventListener(_events2.default.TOOL_DEACTIVATED, toolDeactivatedCallback);\n\n function moveEndCallback() {\n element.removeEventListener(_events2.default.MOUSE_MOVE, moveCallback);\n element.removeEventListener(_events2.default.MOUSE_DRAG, moveCallback);\n element.removeEventListener(_events2.default.MOUSE_CLICK, moveEndCallback);\n element.removeEventListener(_events2.default.MOUSE_UP, moveEndCallback);\n element.removeEventListener(_events2.default.MEASUREMENT_REMOVED, measurementRemovedCallback);\n element.removeEventListener(_events2.default.TOOL_DEACTIVATED, toolDeactivatedCallback);\n\n handle.active = false;\n cornerstone.updateImage(element);\n\n if (typeof doneMovingCallback === 'function') {\n doneMovingCallback();\n }\n }\n};\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _triggerEvent = __webpack_require__(5);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 25 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (mouseWheelCallback) {\n return {\n activate: function activate(element) {\n element.removeEventListener(_events2.default.MOUSE_WHEEL, mouseWheelCallback);\n element.addEventListener(_events2.default.MOUSE_WHEEL, mouseWheelCallback);\n },\n disable: function disable(element) {\n element.removeEventListener(_events2.default.MOUSE_WHEEL, mouseWheelCallback);\n },\n enable: function enable(element) {\n element.removeEventListener(_events2.default.MOUSE_WHEEL, mouseWheelCallback);\n },\n deactivate: function deactivate(element) {\n element.removeEventListener(_events2.default.MOUSE_WHEEL, mouseWheelCallback);\n }\n };\n};\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 26 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (onImageRendered) {\n var configuration = {};\n\n return {\n disable: function disable(element) {\n element.removeEventListener(_events2.default.IMAGE_RENDERED, onImageRendered);\n },\n enable: function enable(element) {\n element.removeEventListener(_events2.default.IMAGE_RENDERED, onImageRendered);\n element.addEventListener(_events2.default.IMAGE_RENDERED, onImageRendered);\n _externalModules2.default.cornerstone.updateImage(element);\n },\n getConfiguration: function getConfiguration() {\n return configuration;\n },\n setConfiguration: function setConfiguration(config) {\n configuration = config;\n }\n };\n};\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 27 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (eventData, toolType, data, handle, doneMovingCallback, preventHandleOutsideImage) {\n // Console.log('moveNewHandleTouch');\n var cornerstone = _externalModules2.default.cornerstone;\n var element = eventData.element;\n var imageCoords = cornerstone.pageToPixel(element, eventData.currentPoints.page.x, eventData.currentPoints.page.y + 50);\n var distanceFromTouch = {\n x: handle.x - imageCoords.x,\n y: handle.y - imageCoords.y\n };\n\n handle.active = true;\n data.active = true;\n\n function moveCallback(e) {\n var eventData = e.detail;\n\n handle.x = eventData.currentPoints.image.x + distanceFromTouch.x;\n handle.y = eventData.currentPoints.image.y + distanceFromTouch.y;\n\n if (preventHandleOutsideImage) {\n handle.x = Math.max(handle.x, 0);\n handle.x = Math.min(handle.x, eventData.image.width);\n\n handle.y = Math.max(handle.y, 0);\n handle.y = Math.min(handle.y, eventData.image.height);\n }\n\n cornerstone.updateImage(element);\n\n var eventType = _events2.default.MEASUREMENT_MODIFIED;\n var modifiedEventData = {\n toolType: toolType,\n element: element,\n measurementData: data\n };\n\n (0, _triggerEvent2.default)(element, eventType, modifiedEventData);\n }\n\n function moveEndCallback(e) {\n var eventData = e.detail;\n\n element.removeEventListener(_events2.default.TOUCH_DRAG, moveCallback);\n element.removeEventListener(_events2.default.TOUCH_PINCH, moveEndCallback);\n element.removeEventListener(_events2.default.TOUCH_END, moveEndCallback);\n element.removeEventListener(_events2.default.TAP, moveEndCallback);\n element.removeEventListener(_events2.default.TOUCH_START, stopImmediatePropagation);\n element.removeEventListener(_events2.default.TOOL_DEACTIVATED, toolDeactivatedCallback);\n\n if (e.type === _events2.default.TOUCH_PINCH || e.type === _events2.default.TOUCH_PRESS) {\n handle.active = false;\n cornerstone.updateImage(element);\n doneMovingCallback();\n\n return;\n }\n\n handle.active = false;\n data.active = false;\n handle.x = eventData.currentPoints.image.x + distanceFromTouch.x;\n handle.y = eventData.currentPoints.image.y + distanceFromTouch.y;\n\n if (preventHandleOutsideImage) {\n handle.x = Math.max(handle.x, 0);\n handle.x = Math.min(handle.x, eventData.image.width);\n\n handle.y = Math.max(handle.y, 0);\n handle.y = Math.min(handle.y, eventData.image.height);\n }\n\n cornerstone.updateImage(element);\n\n if (typeof doneMovingCallback === 'function') {\n doneMovingCallback();\n }\n }\n\n function stopImmediatePropagation(e) {\n // Stop the CornerstoneToolsTouchStart event from\n // Become a CornerstoneToolsTouchStartActive event when\n // MoveNewHandleTouch ends\n e.stopImmediatePropagation();\n\n return false;\n }\n\n element.addEventListener(_events2.default.TOUCH_DRAG, moveCallback);\n element.addEventListener(_events2.default.TOUCH_PINCH, moveEndCallback);\n element.addEventListener(_events2.default.TOUCH_END, moveEndCallback);\n element.addEventListener(_events2.default.TAP, moveEndCallback);\n element.addEventListener(_events2.default.TOUCH_START, stopImmediatePropagation);\n\n function toolDeactivatedCallback() {\n element.removeEventListener(_events2.default.TOUCH_DRAG, moveCallback);\n element.removeEventListener(_events2.default.TOUCH_PINCH, moveEndCallback);\n element.removeEventListener(_events2.default.TOUCH_END, moveEndCallback);\n element.removeEventListener(_events2.default.TAP, moveEndCallback);\n element.removeEventListener(_events2.default.TOUCH_START, stopImmediatePropagation);\n element.removeEventListener(_events2.default.TOOL_DEACTIVATED, toolDeactivatedCallback);\n\n handle.active = false;\n data.active = false;\n handle.x = eventData.currentPoints.image.x + distanceFromTouch.x;\n handle.y = eventData.currentPoints.image.y + distanceFromTouch.y;\n\n if (preventHandleOutsideImage) {\n handle.x = Math.max(handle.x, 0);\n handle.x = Math.min(handle.x, eventData.image.width);\n\n handle.y = Math.max(handle.y, 0);\n handle.y = Math.min(handle.y, eventData.image.height);\n }\n\n cornerstone.updateImage(element);\n }\n\n element.addEventListener(_events2.default.TOOL_DEACTIVATED, toolDeactivatedCallback);\n};\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _triggerEvent = __webpack_require__(5);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 28 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.projectPatientPointToImagePlane = projectPatientPointToImagePlane;\nexports.imagePointToPatientPoint = imagePointToPatientPoint;\nexports.planePlaneIntersection = planePlaneIntersection;\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _convertToVector = __webpack_require__(17);\n\nvar _convertToVector2 = _interopRequireDefault(_convertToVector);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// Projects a patient point to an image point\nfunction projectPatientPointToImagePlane(patientPoint, imagePlane) {\n var rowCosines = (0, _convertToVector2.default)(imagePlane.rowCosines);\n var columnCosines = (0, _convertToVector2.default)(imagePlane.columnCosines);\n var imagePositionPatient = (0, _convertToVector2.default)(imagePlane.imagePositionPatient);\n var point = patientPoint.clone().sub(imagePositionPatient);\n var x = rowCosines.dot(point) / imagePlane.columnPixelSpacing;\n var y = columnCosines.dot(point) / imagePlane.rowPixelSpacing;\n\n return {\n x: x,\n y: y\n };\n}\n\n// Projects an image point to a patient point\nfunction imagePointToPatientPoint(imagePoint, imagePlane) {\n var rowCosines = (0, _convertToVector2.default)(imagePlane.rowCosines);\n var columnCosines = (0, _convertToVector2.default)(imagePlane.columnCosines);\n var imagePositionPatient = (0, _convertToVector2.default)(imagePlane.imagePositionPatient);\n\n var x = rowCosines.clone().multiplyScalar(imagePoint.x);\n\n x.multiplyScalar(imagePlane.columnPixelSpacing);\n var y = columnCosines.clone().multiplyScalar(imagePoint.y);\n\n y.multiplyScalar(imagePlane.rowPixelSpacing);\n var patientPoint = x.add(y);\n\n patientPoint.add(imagePositionPatient);\n\n return patientPoint;\n}\n\nfunction getRectangleFromImagePlane(imagePlane) {\n // Get the points\n var topLeft = imagePointToPatientPoint({\n x: 0,\n y: 0\n }, imagePlane);\n var topRight = imagePointToPatientPoint({\n x: imagePlane.columns,\n y: 0\n }, imagePlane);\n var bottomLeft = imagePointToPatientPoint({\n x: 0,\n y: imagePlane.rows\n }, imagePlane);\n var bottomRight = imagePointToPatientPoint({\n x: imagePlane.columns,\n y: imagePlane.rows\n }, imagePlane);\n\n // Get each side as a vector\n var rect = {\n top: new _externalModules2.default.cornerstoneMath.Line3(topLeft, topRight),\n left: new _externalModules2.default.cornerstoneMath.Line3(topLeft, bottomLeft),\n right: new _externalModules2.default.cornerstoneMath.Line3(topRight, bottomRight),\n bottom: new _externalModules2.default.cornerstoneMath.Line3(bottomLeft, bottomRight)\n };\n\n return rect;\n}\n\nfunction lineRectangleIntersection(line, rect) {\n var intersections = [];\n\n Object.keys(rect).forEach(function (side) {\n var segment = rect[side];\n var intersection = line.intersectLine(segment);\n\n if (intersection) {\n intersections.push(intersection);\n }\n });\n\n return intersections;\n}\n\n// Gets the line of intersection between two planes in patient space\nfunction planePlaneIntersection(targetImagePlane, referenceImagePlane) {\n var targetRowCosines = (0, _convertToVector2.default)(targetImagePlane.rowCosines);\n var targetColumnCosines = (0, _convertToVector2.default)(targetImagePlane.columnCosines);\n var targetImagePositionPatient = (0, _convertToVector2.default)(targetImagePlane.imagePositionPatient);\n var referenceRowCosines = (0, _convertToVector2.default)(referenceImagePlane.rowCosines);\n var referenceColumnCosines = (0, _convertToVector2.default)(referenceImagePlane.columnCosines);\n var referenceImagePositionPatient = (0, _convertToVector2.default)(referenceImagePlane.imagePositionPatient);\n\n // First, get the normals of each image plane\n var targetNormal = targetRowCosines.clone().cross(targetColumnCosines);\n var targetPlane = new _externalModules2.default.cornerstoneMath.Plane();\n\n targetPlane.setFromNormalAndCoplanarPoint(targetNormal, targetImagePositionPatient);\n\n var referenceNormal = referenceRowCosines.clone().cross(referenceColumnCosines);\n var referencePlane = new _externalModules2.default.cornerstoneMath.Plane();\n\n referencePlane.setFromNormalAndCoplanarPoint(referenceNormal, referenceImagePositionPatient);\n\n var originDirection = referencePlane.clone().intersectPlane(targetPlane);\n var origin = originDirection.origin;\n var direction = originDirection.direction;\n\n // Calculate the longest possible length in the reference image plane (the length of the diagonal)\n var bottomRight = imagePointToPatientPoint({\n x: referenceImagePlane.columns,\n y: referenceImagePlane.rows\n }, referenceImagePlane);\n var distance = referenceImagePositionPatient.distanceTo(bottomRight);\n\n // Use this distance to bound the ray intersecting the two planes\n var line = new _externalModules2.default.cornerstoneMath.Line3();\n\n line.start = origin;\n line.end = origin.clone().add(direction.multiplyScalar(distance));\n\n // Find the intersections between this line and the reference image plane's four sides\n var rect = getRectangleFromImagePlane(referenceImagePlane);\n var intersections = lineRectangleIntersection(line, rect);\n\n // Return the intersections between this line and the reference image plane's sides\n // In order to draw the reference line from the target image.\n if (intersections.length !== 2) {\n return;\n }\n\n return {\n start: intersections[0],\n end: intersections[1]\n };\n}\n\n/***/ }),\n/* 29 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _getMaxSimultaneousRequests = __webpack_require__(22);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar requestPool = {\n interaction: [],\n thumbnail: [],\n prefetch: []\n};\n\nvar numRequests = {\n interaction: 0,\n thumbnail: 0,\n prefetch: 0\n};\n\nvar maxNumRequests = {\n interaction: 6,\n thumbnail: 6,\n prefetch: 5\n};\n\nvar awake = false;\nvar grabDelay = 20;\n\nfunction addRequest(element, imageId, type, preventCache, doneCallback, failCallback) {\n if (!requestPool.hasOwnProperty(type)) {\n throw new Error('Request type must be one of interaction, thumbnail, or prefetch');\n }\n\n if (!element || !imageId) {\n return;\n }\n\n // Describe the request\n var requestDetails = {\n type: type,\n imageId: imageId,\n preventCache: preventCache,\n doneCallback: doneCallback,\n failCallback: failCallback\n };\n\n // If this imageId is in the cache, resolve it immediately\n var imageLoadObject = _externalModules2.default.cornerstone.imageCache.getImageLoadObject(imageId);\n\n if (imageLoadObject) {\n imageLoadObject.promise.then(function (image) {\n doneCallback(image);\n }, function (error) {\n failCallback(error);\n });\n\n return;\n }\n\n // Add it to the end of the stack\n requestPool[type].push(requestDetails);\n}\n\nfunction clearRequestStack(type) {\n // Console.log('clearRequestStack');\n if (!requestPool.hasOwnProperty(type)) {\n throw new Error('Request type must be one of interaction, thumbnail, or prefetch');\n }\n\n requestPool[type] = [];\n}\n\nfunction startAgain() {\n if (!awake) {\n return;\n }\n\n setTimeout(function () {\n startGrabbing();\n }, grabDelay);\n}\n\nfunction sendRequest(requestDetails) {\n var cornerstone = _externalModules2.default.cornerstone;\n // Increment the number of current requests of this type\n var type = requestDetails.type;\n\n numRequests[type]++;\n\n awake = true;\n var imageId = requestDetails.imageId;\n var doneCallback = requestDetails.doneCallback;\n var failCallback = requestDetails.failCallback;\n\n // Check if we already have this image promise in the cache\n var imageLoadObject = cornerstone.imageCache.getImageLoadObject(imageId);\n\n if (imageLoadObject) {\n // If we do, remove from list (when resolved, as we could have\n // Pending prefetch requests) and stop processing this iteration\n imageLoadObject.promise.then(function (image) {\n numRequests[type]--;\n // Console.log(numRequests);\n\n doneCallback(image);\n startAgain();\n }, function (error) {\n numRequests[type]--;\n // Console.log(numRequests);\n failCallback(error);\n startAgain();\n });\n\n return;\n }\n\n function requestTypeToLoadPriority(requestDetails) {\n if (requestDetails.type === 'prefetch') {\n return -5;\n } else if (requestDetails.type === 'interactive') {\n return 0;\n } else if (requestDetails.type === 'thumbnail') {\n return 5;\n }\n }\n\n var priority = requestTypeToLoadPriority(requestDetails);\n\n var loader = void 0;\n\n if (requestDetails.preventCache === true) {\n loader = cornerstone.loadImage(imageId, {\n priority: priority,\n type: requestDetails.type\n });\n } else {\n loader = cornerstone.loadAndCacheImage(imageId, {\n priority: priority,\n type: requestDetails.type\n });\n }\n\n // Load and cache the image\n loader.then(function (image) {\n numRequests[type]--;\n // Console.log(numRequests);\n doneCallback(image);\n startAgain();\n }, function (error) {\n numRequests[type]--;\n // Console.log(numRequests);\n failCallback(error);\n startAgain();\n });\n}\n\nfunction startGrabbing() {\n // Begin by grabbing X images\n var maxSimultaneousRequests = (0, _getMaxSimultaneousRequests.getMaxSimultaneousRequests)();\n\n maxNumRequests = {\n interaction: Math.max(maxSimultaneousRequests, 1),\n thumbnail: Math.max(maxSimultaneousRequests - 2, 1),\n prefetch: Math.max(maxSimultaneousRequests - 1, 1)\n };\n\n var currentRequests = numRequests.interaction + numRequests.thumbnail + numRequests.prefetch;\n var requestsToSend = maxSimultaneousRequests - currentRequests;\n\n for (var i = 0; i < requestsToSend; i++) {\n var requestDetails = getNextRequest();\n\n if (requestDetails) {\n sendRequest(requestDetails);\n }\n }\n}\n\nfunction getNextRequest() {\n if (requestPool.interaction.length && numRequests.interaction < maxNumRequests.interaction) {\n return requestPool.interaction.shift();\n }\n\n if (requestPool.thumbnail.length && numRequests.thumbnail < maxNumRequests.thumbnail) {\n return requestPool.thumbnail.shift();\n }\n\n if (requestPool.prefetch.length && numRequests.prefetch < maxNumRequests.prefetch) {\n return requestPool.prefetch.shift();\n }\n\n if (!requestPool.interaction.length && !requestPool.thumbnail.length && !requestPool.prefetch.length) {\n awake = false;\n }\n\n return false;\n}\n\nfunction getRequestPool() {\n return requestPool;\n}\n\nexports.default = {\n addRequest: addRequest,\n clearRequestStack: clearRequestStack,\n startGrabbing: startGrabbing,\n getRequestPool: getRequestPool\n};\n\n/***/ }),\n/* 30 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (element, images) {\n var loop = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n var toolData = (0, _toolState.getToolState)(element, 'stack');\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n var stackData = toolData.data[0];\n\n var newImageIdIndex = stackData.currentImageIdIndex + images;\n\n if (loop) {\n var nbImages = stackData.imageIds.length;\n\n newImageIdIndex %= nbImages;\n } else {\n newImageIdIndex = Math.min(stackData.imageIds.length - 1, newImageIdIndex);\n newImageIdIndex = Math.max(0, newImageIdIndex);\n }\n\n (0, _scrollToIndex2.default)(element, newImageIdIndex);\n};\n\nvar _scrollToIndex = __webpack_require__(44);\n\nvar _scrollToIndex2 = _interopRequireDefault(_scrollToIndex);\n\nvar _toolState = __webpack_require__(2);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 31 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (value, precision) {\n var multiplier = Math.pow(10, precision);\n\n return Math.round(value * multiplier) / multiplier;\n};\n\n/***/ }),\n/* 32 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (ellipse, location) {\n var xRadius = ellipse.width / 2;\n var yRadius = ellipse.height / 2;\n\n if (xRadius <= 0.0 || yRadius <= 0.0) {\n return false;\n }\n\n var center = {\n x: ellipse.left + xRadius,\n y: ellipse.top + yRadius\n };\n\n /* This is a more general form of the circle equation\n *\n * X^2/a^2 + Y^2/b^2 <= 1\n */\n\n var normalized = {\n x: location.x - center.x,\n y: location.y - center.y\n };\n\n var inEllipse = normalized.x * normalized.x / (xRadius * xRadius) + normalized.y * normalized.y / (yRadius * yRadius) <= 1.0;\n\n return inEllipse;\n};\n\n/***/ }),\n/* 33 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (e) {\n if (e.stopPropagation) {\n e.stopPropagation();\n }\n\n if (e.preventDefault) {\n e.preventDefault();\n }\n\n e.cancelBubble = true;\n e.returnValue = false;\n\n return false;\n};\n\n/***/ }),\n/* 34 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (element, x, y, width, height) {\n if (!element) {\n throw new Error('getRGBPixels: parameter element must not be undefined');\n }\n\n x = Math.round(x);\n y = Math.round(y);\n var enabledElement = _externalModules2.default.cornerstone.getEnabledElement(element);\n var storedPixelData = [];\n var index = 0;\n var pixelData = enabledElement.image.getPixelData();\n var spIndex = void 0,\n row = void 0,\n column = void 0;\n\n if (enabledElement.image.color) {\n for (row = 0; row < height; row++) {\n for (column = 0; column < width; column++) {\n spIndex = ((row + y) * enabledElement.image.columns + (column + x)) * 4;\n var red = pixelData[spIndex];\n var green = pixelData[spIndex + 1];\n var blue = pixelData[spIndex + 2];\n var alpha = pixelData[spIndex + 3];\n\n storedPixelData[index++] = red;\n storedPixelData[index++] = green;\n storedPixelData[index++] = blue;\n storedPixelData[index++] = alpha;\n }\n }\n }\n\n return storedPixelData;\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 35 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (points) {\n var page = _externalModules2.default.cornerstoneMath.point.copy(points.page);\n var image = _externalModules2.default.cornerstoneMath.point.copy(points.image);\n var client = _externalModules2.default.cornerstoneMath.point.copy(points.client);\n var canvas = _externalModules2.default.cornerstoneMath.point.copy(points.canvas);\n\n return {\n page: page,\n image: image,\n client: client,\n canvas: canvas\n };\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 36 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar coordsData = void 0;\n\nfunction setCoords(eventData) {\n coordsData = eventData.currentPoints.canvas;\n}\n\nfunction getCoords() {\n return coordsData;\n}\n\nvar toolCoordinates = {\n setCoords: setCoords,\n getCoords: getCoords\n};\n\nexports.default = toolCoordinates;\n\n/***/ }),\n/* 37 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (element, handles, canvasPoint, distanceThreshold) {\n if (!distanceThreshold) {\n distanceThreshold = 6;\n }\n\n var activeHandle = getActiveHandle(handles);\n var nearbyHandle = (0, _getHandleNearImagePoint2.default)(element, handles, canvasPoint, distanceThreshold);\n\n if (activeHandle !== nearbyHandle) {\n if (nearbyHandle !== undefined) {\n nearbyHandle.active = true;\n }\n\n if (activeHandle !== undefined) {\n activeHandle.active = false;\n }\n\n return true;\n }\n\n return false;\n};\n\nvar _getHandleNearImagePoint = __webpack_require__(21);\n\nvar _getHandleNearImagePoint2 = _interopRequireDefault(_getHandleNearImagePoint);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction getActiveHandle(handles) {\n var activeHandle = void 0;\n\n Object.keys(handles).forEach(function (name) {\n var handle = handles[name];\n\n if (handle.active === true) {\n activeHandle = handle;\n\n return;\n }\n });\n\n return activeHandle;\n}\n\n/***/ }),\n/* 38 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (e, data, toolData, toolType, options, doneMovingCallback) {\n var cornerstone = _externalModules2.default.cornerstone;\n var mouseEventData = e.detail;\n var element = mouseEventData.element;\n\n function mouseDragCallback(e) {\n var eventData = e.detail;\n\n data.active = true;\n\n Object.keys(data.handles).forEach(function (name) {\n var handle = data.handles[name];\n\n if (handle.movesIndependently === true) {\n return;\n }\n\n handle.x += eventData.deltaPoints.image.x;\n handle.y += eventData.deltaPoints.image.y;\n\n if (options.preventHandleOutsideImage === true) {\n handle.x = Math.max(handle.x, 0);\n handle.x = Math.min(handle.x, eventData.image.width);\n\n handle.y = Math.max(handle.y, 0);\n handle.y = Math.min(handle.y, eventData.image.height);\n }\n });\n\n cornerstone.updateImage(element);\n\n var eventType = _events2.default.MEASUREMENT_MODIFIED;\n var modifiedEventData = {\n toolType: toolType,\n element: element,\n measurementData: data\n };\n\n (0, _triggerEvent2.default)(element, eventType, modifiedEventData);\n\n e.preventDefault();\n e.stopPropagation();\n }\n\n element.addEventListener(_events2.default.MOUSE_DRAG, mouseDragCallback);\n\n function mouseUpCallback(e) {\n var eventData = e.detail;\n\n data.invalidated = true;\n\n element.removeEventListener(_events2.default.MOUSE_DRAG, mouseDragCallback);\n element.removeEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback);\n\n // If any handle is outside the image, delete the tool data\n if (options.deleteIfHandleOutsideImage === true && (0, _anyHandlesOutsideImage2.default)(eventData, data.handles)) {\n (0, _toolState.removeToolState)(element, toolType, data);\n }\n\n cornerstone.updateImage(element);\n\n if (typeof doneMovingCallback === 'function') {\n doneMovingCallback();\n }\n }\n\n element.addEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n element.addEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback);\n\n return true;\n};\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _anyHandlesOutsideImage = __webpack_require__(14);\n\nvar _anyHandlesOutsideImage2 = _interopRequireDefault(_anyHandlesOutsideImage);\n\nvar _toolState = __webpack_require__(2);\n\nvar _triggerEvent = __webpack_require__(5);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 39 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (element, timePoints, wrap) {\n var toolData = (0, _toolState.getToolState)(element, 'timeSeries');\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n var cornerstone = _externalModules2.default.cornerstone;\n var timeSeriesData = toolData.data[0];\n var currentStack = timeSeriesData.stacks[timeSeriesData.currentStackIndex];\n var currentImageIdIndex = currentStack.currentImageIdIndex;\n var newStackIndex = timeSeriesData.currentStackIndex + timePoints;\n\n // Loop around if we go outside the stack\n if (wrap) {\n if (newStackIndex >= timeSeriesData.stacks.length) {\n newStackIndex = 0;\n }\n\n if (newStackIndex < 0) {\n newStackIndex = timeSeriesData.stacks.length - 1;\n }\n } else {\n newStackIndex = Math.min(timeSeriesData.stacks.length - 1, newStackIndex);\n newStackIndex = Math.max(0, newStackIndex);\n }\n\n if (newStackIndex !== timeSeriesData.currentStackIndex) {\n var viewport = cornerstone.getViewport(element);\n var newStack = timeSeriesData.stacks[newStackIndex];\n\n var startLoadingHandler = _loadHandlerManager2.default.getStartLoadHandler();\n var endLoadingHandler = _loadHandlerManager2.default.getEndLoadHandler();\n var errorLoadingHandler = _loadHandlerManager2.default.getErrorLoadingHandler();\n\n if (startLoadingHandler) {\n startLoadingHandler(element);\n }\n\n var loader = void 0;\n\n if (newStack.preventCache === true) {\n loader = cornerstone.loadImage(newStack.imageIds[currentImageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(newStack.imageIds[currentImageIdIndex]);\n }\n\n loader.then(function (image) {\n if (timeSeriesData.currentImageIdIndex !== currentImageIdIndex) {\n newStack.currentImageIdIndex = currentImageIdIndex;\n timeSeriesData.currentStackIndex = newStackIndex;\n cornerstone.displayImage(element, image, viewport);\n if (endLoadingHandler) {\n endLoadingHandler(element, image);\n }\n }\n }, function (error) {\n var imageId = newStack.imageIds[currentImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(element, imageId, error);\n }\n });\n }\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _toolState = __webpack_require__(2);\n\nvar _loadHandlerManager = __webpack_require__(12);\n\nvar _loadHandlerManager2 = _interopRequireDefault(_loadHandlerManager);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 40 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (touchDragCallback, options) {\n var configuration = {};\n var events = [_events2.default.MULTI_TOUCH_DRAG];\n\n if (options && options.fireOnTouchStart === true) {\n events.push(_events2.default.MULTI_TOUCH_START);\n }\n\n return {\n activate: function activate(element) {\n events.forEach(function (eventType) {\n element.removeEventListener(eventType, touchDragCallback);\n element.addEventListener(eventType, touchDragCallback);\n });\n\n if (options && options.activateCallback) {\n options.activateCallback(element);\n }\n },\n disable: function disable(element) {\n events.forEach(function (eventType) {\n element.removeEventListener(eventType, touchDragCallback);\n });\n\n if (options && options.disableCallback) {\n options.disableCallback(element);\n }\n },\n enable: function enable(element) {\n events.forEach(function (eventType) {\n element.removeEventListener(eventType, touchDragCallback);\n });\n\n if (options && options.enableCallback) {\n options.enableCallback(element);\n }\n },\n deactivate: function deactivate(element) {\n events.forEach(function (eventType) {\n element.removeEventListener(eventType, touchDragCallback);\n });\n\n if (options && options.deactivateCallback) {\n options.deactivateCallback(element);\n }\n },\n getConfiguration: function getConfiguration() {\n return configuration;\n },\n setConfiguration: function setConfiguration(config) {\n configuration = config;\n }\n };\n};\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 41 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (targetImagePlane, referenceImagePlane) {\n var points = (0, _pointProjector.planePlaneIntersection)(targetImagePlane, referenceImagePlane);\n\n if (!points) {\n return;\n }\n\n return {\n start: (0, _pointProjector.projectPatientPointToImagePlane)(points.start, targetImagePlane),\n end: (0, _pointProjector.projectPatientPointToImagePlane)(points.end, targetImagePlane)\n };\n};\n\nvar _pointProjector = __webpack_require__(28);\n\n/***/ }),\n/* 42 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (context, eventData, targetElement, referenceElement) {\n var cornerstone = _externalModules2.default.cornerstone;\n var targetImage = cornerstone.getEnabledElement(targetElement).image;\n var referenceImage = cornerstone.getEnabledElement(referenceElement).image;\n\n // Make sure the images are actually loaded for the target and reference\n if (!targetImage || !referenceImage) {\n return;\n }\n\n var targetImagePlane = cornerstone.metaData.get('imagePlaneModule', targetImage.imageId);\n var referenceImagePlane = cornerstone.metaData.get('imagePlaneModule', referenceImage.imageId);\n\n // Make sure the target and reference actually have image plane metadata\n if (!targetImagePlane || !referenceImagePlane || !targetImagePlane.rowCosines || !targetImagePlane.columnCosines || !targetImagePlane.imagePositionPatient || !referenceImagePlane.rowCosines || !referenceImagePlane.columnCosines || !referenceImagePlane.imagePositionPatient) {\n return;\n }\n\n // The image planes must be in the same frame of reference\n if (targetImagePlane.frameOfReferenceUID !== referenceImagePlane.frameOfReferenceUID) {\n return;\n }\n\n targetImagePlane.rowCosines = (0, _convertToVector2.default)(targetImagePlane.rowCosines);\n targetImagePlane.columnCosines = (0, _convertToVector2.default)(targetImagePlane.columnCosines);\n targetImagePlane.imagePositionPatient = (0, _convertToVector2.default)(targetImagePlane.imagePositionPatient);\n referenceImagePlane.rowCosines = (0, _convertToVector2.default)(referenceImagePlane.rowCosines);\n referenceImagePlane.columnCosines = (0, _convertToVector2.default)(referenceImagePlane.columnCosines);\n referenceImagePlane.imagePositionPatient = (0, _convertToVector2.default)(referenceImagePlane.imagePositionPatient);\n\n // The image plane normals must be > 30 degrees apart\n var targetNormal = targetImagePlane.rowCosines.clone().cross(targetImagePlane.columnCosines);\n var referenceNormal = referenceImagePlane.rowCosines.clone().cross(referenceImagePlane.columnCosines);\n var angleInRadians = targetNormal.angleTo(referenceNormal);\n\n angleInRadians = Math.abs(angleInRadians);\n if (angleInRadians < 0.5) {\n // 0.5 radians = ~30 degrees\n return;\n }\n\n var referenceLine = (0, _calculateReferenceLine2.default)(targetImagePlane, referenceImagePlane);\n\n if (!referenceLine) {\n return;\n }\n\n var refLineStartCanvas = cornerstone.pixelToCanvas(eventData.element, referenceLine.start);\n var refLineEndCanvas = cornerstone.pixelToCanvas(eventData.element, referenceLine.end);\n\n var color = _toolColors2.default.getActiveColor();\n var lineWidth = _toolStyle2.default.getToolWidth();\n\n // Draw the referenceLines\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n context.save();\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.moveTo(refLineStartCanvas.x, refLineStartCanvas.y);\n context.lineTo(refLineEndCanvas.x, refLineEndCanvas.y);\n context.stroke();\n context.restore();\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _calculateReferenceLine = __webpack_require__(41);\n\nvar _calculateReferenceLine2 = _interopRequireDefault(_calculateReferenceLine);\n\nvar _toolColors = __webpack_require__(6);\n\nvar _toolColors2 = _interopRequireDefault(_toolColors);\n\nvar _toolStyle = __webpack_require__(8);\n\nvar _toolStyle2 = _interopRequireDefault(_toolStyle);\n\nvar _convertToVector = __webpack_require__(17);\n\nvar _convertToVector2 = _interopRequireDefault(_convertToVector);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 43 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _getOrientationString = __webpack_require__(63);\n\nvar _getOrientationString2 = _interopRequireDefault(_getOrientationString);\n\nvar _invertOrientationString = __webpack_require__(64);\n\nvar _invertOrientationString2 = _interopRequireDefault(_invertOrientationString);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar orientation = {\n getOrientationString: _getOrientationString2.default,\n invertOrientationString: _invertOrientationString2.default\n};\n\nexports.default = orientation;\n\n/***/ }),\n/* 44 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (element, newImageIdIndex) {\n var toolData = (0, _toolState.getToolState)(element, 'stack');\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n var cornerstone = _externalModules2.default.cornerstone;\n // If we have more than one stack, check if we have a stack renderer defined\n var stackRenderer = void 0;\n\n if (toolData.data.length > 1) {\n var stackRendererData = (0, _toolState.getToolState)(element, 'stackRenderer');\n\n if (stackRendererData && stackRendererData.data && stackRendererData.data.length) {\n stackRenderer = stackRendererData.data[0];\n }\n }\n\n var stackData = toolData.data[0];\n\n // Allow for negative indexing\n if (newImageIdIndex < 0) {\n newImageIdIndex += stackData.imageIds.length;\n }\n\n var startLoadingHandler = _loadHandlerManager2.default.getStartLoadHandler();\n var endLoadingHandler = _loadHandlerManager2.default.getEndLoadHandler();\n var errorLoadingHandler = _loadHandlerManager2.default.getErrorLoadingHandler();\n\n function doneCallback(image) {\n if (stackData.currentImageIdIndex !== newImageIdIndex) {\n return;\n }\n\n // Check if the element is still enabled in Cornerstone,\n // If an error is thrown, stop here.\n try {\n // TODO: Add 'isElementEnabled' to Cornerstone?\n cornerstone.getEnabledElement(element);\n } catch (error) {\n return;\n }\n\n if (stackRenderer) {\n stackRenderer.currentImageIdIndex = newImageIdIndex;\n stackRenderer.render(element, toolData.data);\n } else {\n cornerstone.displayImage(element, image);\n }\n\n if (endLoadingHandler) {\n endLoadingHandler(element, image);\n }\n }\n\n function failCallback(error) {\n var imageId = stackData.imageIds[newImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(element, imageId, error);\n }\n }\n\n if (newImageIdIndex === stackData.currentImageIdIndex) {\n return;\n }\n\n if (startLoadingHandler) {\n startLoadingHandler(element);\n }\n\n var eventData = {\n newImageIdIndex: newImageIdIndex,\n direction: newImageIdIndex - stackData.currentImageIdIndex\n };\n\n stackData.currentImageIdIndex = newImageIdIndex;\n var newImageId = stackData.imageIds[newImageIdIndex];\n\n // Retry image loading in cases where previous image promise\n // Was rejected, if the option is set\n /*\n Const config = stackScroll.getConfiguration();\n TODO: Revisit this. It appears that Core's imageCache is not\n keeping rejected promises anywhere, so we have no way to know\n if something was previously rejected.\n if (config && config.retryLoadOnScroll === true) {\n }\n */\n\n // Convert the preventCache value in stack data to a boolean\n var preventCache = Boolean(stackData.preventCache);\n\n var imagePromise = void 0;\n\n if (preventCache) {\n imagePromise = cornerstone.loadImage(newImageId);\n } else {\n imagePromise = cornerstone.loadAndCacheImage(newImageId);\n }\n\n imagePromise.then(doneCallback, failCallback);\n // Make sure we kick off any changed download request pools\n _requestPoolManager2.default.startGrabbing();\n\n (0, _triggerEvent2.default)(element, _events2.default.STACK_SCROLL, eventData);\n};\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _toolState = __webpack_require__(2);\n\nvar _requestPoolManager = __webpack_require__(29);\n\nvar _requestPoolManager2 = _interopRequireDefault(_requestPoolManager);\n\nvar _loadHandlerManager = __webpack_require__(12);\n\nvar _loadHandlerManager2 = _interopRequireDefault(_loadHandlerManager);\n\nvar _triggerEvent = __webpack_require__(5);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 45 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (element, x, y, width, height) {\n if (!element) {\n throw new Error('getLuminance: parameter element must not be undefined');\n }\n\n x = Math.round(x);\n y = Math.round(y);\n var enabledElement = _externalModules2.default.cornerstone.getEnabledElement(element);\n var image = enabledElement.image;\n var luminance = [];\n var index = 0;\n var pixelData = image.getPixelData();\n var spIndex = void 0,\n row = void 0,\n column = void 0;\n\n if (image.color) {\n for (row = 0; row < height; row++) {\n for (column = 0; column < width; column++) {\n spIndex = ((row + y) * image.columns + (column + x)) * 4;\n var red = pixelData[spIndex];\n var green = pixelData[spIndex + 1];\n var blue = pixelData[spIndex + 2];\n\n luminance[index++] = 0.2126 * red + 0.7152 * green + 0.0722 * blue;\n }\n }\n } else {\n for (row = 0; row < height; row++) {\n for (column = 0; column < width; column++) {\n spIndex = (row + y) * image.columns + (column + x);\n luminance[index++] = pixelData[spIndex] * image.slope + image.intercept;\n }\n }\n }\n\n return luminance;\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 46 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (context, x, y, w, h) {\n var kappa = 0.5522848,\n ox = w / 2 * kappa,\n // Control point offset horizontal\n oy = h / 2 * kappa,\n // Control point offset vertical\n xe = x + w,\n // X-end\n ye = y + h,\n // Y-end\n xm = x + w / 2,\n // X-middle\n ym = y + h / 2; // Y-middle\n\n context.beginPath();\n context.moveTo(x, ym);\n context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y);\n context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym);\n context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye);\n context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym);\n context.closePath();\n context.stroke();\n};\n\n/***/ }),\n/* 47 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (context, start, color, lineWidth) {\n var handleRadius = 6;\n\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.arc(start.x, start.y, handleRadius, 0, 2 * Math.PI);\n context.stroke();\n};\n\n/***/ }),\n/* 48 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (context, start, end, color, lineWidth) {\n // Variables to be used when creating the arrow\n var headLength = 10;\n\n var angle = Math.atan2(end.y - start.y, end.x - start.x);\n\n // Starting path of the arrow from the start square to the end square and drawing the stroke\n context.beginPath();\n context.moveTo(start.x, start.y);\n context.lineTo(end.x, end.y);\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.stroke();\n\n // Starting a new path from the head of the arrow to one of the sides of the point\n context.beginPath();\n context.moveTo(end.x, end.y);\n context.lineTo(end.x - headLength * Math.cos(angle - Math.PI / 7), end.y - headLength * Math.sin(angle - Math.PI / 7));\n\n // Path from the side point of the arrow, to the other side point\n context.lineTo(end.x - headLength * Math.cos(angle + Math.PI / 7), end.y - headLength * Math.sin(angle + Math.PI / 7));\n\n // Path from the side point back to the tip of the arrow, and then again to the opposite side point\n context.lineTo(end.x, end.y);\n context.lineTo(end.x - headLength * Math.cos(angle - Math.PI / 7), end.y - headLength * Math.sin(angle - Math.PI / 7));\n\n // Draws the paths created above\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.stroke();\n context.fillStyle = color;\n context.fill();\n};\n\n/***/ }),\n/* 49 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (sp, ellipse) {\n // TODO: Get a real statistics library here that supports large counts\n\n var sum = 0;\n var sumSquared = 0;\n var count = 0;\n var index = 0;\n\n for (var y = ellipse.top; y < ellipse.top + ellipse.height; y++) {\n for (var x = ellipse.left; x < ellipse.left + ellipse.width; x++) {\n var point = {\n x: x,\n y: y\n };\n\n if ((0, _pointInEllipse2.default)(ellipse, point)) {\n sum += sp[index];\n sumSquared += sp[index] * sp[index];\n count++;\n }\n\n index++;\n }\n }\n\n if (count === 0) {\n return {\n count: count,\n mean: 0.0,\n variance: 0.0,\n stdDev: 0.0\n };\n }\n\n var mean = sum / count;\n var variance = sumSquared / count - mean * mean;\n\n return {\n count: count,\n mean: mean,\n variance: variance,\n stdDev: Math.sqrt(variance)\n };\n};\n\nvar _pointInEllipse = __webpack_require__(32);\n\nvar _pointInEllipse2 = _interopRequireDefault(_pointInEllipse);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 50 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (keyDownCallback) {\n var configuration = {};\n\n return {\n activate: function activate(element) {\n element.removeEventListener(_events2.default.KEY_DOWN, keyDownCallback);\n element.addEventListener(_events2.default.KEY_DOWN, keyDownCallback);\n },\n disable: function disable(element) {\n element.removeEventListener(_events2.default.KEY_DOWN, keyDownCallback);\n },\n enable: function enable(element) {\n element.removeEventListener(_events2.default.KEY_DOWN, keyDownCallback);\n },\n deactivate: function deactivate(element) {\n element.removeEventListener(_events2.default.KEY_DOWN, keyDownCallback);\n },\n getConfiguration: function getConfiguration() {\n return configuration;\n },\n setConfiguration: function setConfiguration(config) {\n configuration = config;\n }\n };\n};\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 51 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (event, data, toolData, toolType, deleteIfHandleOutsideImage, doneMovingCallback) {\n var touchEventData = event.detail;\n var element = touchEventData.element;\n var cornerstone = _externalModules2.default.cornerstone;\n\n function touchDragCallback(e) {\n var eventData = e.detail;\n\n data.active = true;\n\n Object.keys(data.handles).forEach(function (name) {\n var handle = data.handles[name];\n\n if (handle.movesIndependently === true) {\n return;\n }\n\n handle.x += eventData.deltaPoints.image.x;\n handle.y += eventData.deltaPoints.image.y;\n });\n cornerstone.updateImage(element);\n\n var eventType = _events2.default.MEASUREMENT_MODIFIED;\n var modifiedEventData = {\n toolType: toolType,\n element: element,\n measurementData: data\n };\n\n (0, _triggerEvent2.default)(element, eventType, modifiedEventData);\n\n e.preventDefault();\n e.stopPropagation();\n }\n\n element.addEventListener(_events2.default.TOUCH_DRAG, touchDragCallback);\n\n function touchEndCallback(e) {\n var eventData = e.detail;\n\n // Console.log('touchMoveAllHandles touchEndCallback: ' + e.type);\n data.active = false;\n data.invalidated = false;\n\n element.removeEventListener(_events2.default.TOUCH_DRAG, touchDragCallback);\n\n element.removeEventListener(_events2.default.TOUCH_PINCH, touchEndCallback);\n element.removeEventListener(_events2.default.TOUCH_PRESS, touchEndCallback);\n element.removeEventListener(_events2.default.TOUCH_END, touchEndCallback);\n element.removeEventListener(_events2.default.TOUCH_DRAG_END, touchEndCallback);\n element.removeEventListener(_events2.default.TAP, touchEndCallback);\n\n // If any handle is outside the image, delete the tool data\n var handlesOutsideImage = (0, _anyHandlesOutsideImage2.default)(eventData, data.handles);\n\n if (deleteIfHandleOutsideImage === true && handlesOutsideImage === true) {\n (0, _toolState.removeToolState)(element, toolType, data);\n }\n\n cornerstone.updateImage(element);\n\n if (typeof doneMovingCallback === 'function') {\n doneMovingCallback(e);\n }\n }\n\n element.addEventListener(_events2.default.TOUCH_PINCH, touchEndCallback);\n element.addEventListener(_events2.default.TOUCH_PRESS, touchEndCallback);\n element.addEventListener(_events2.default.TOUCH_END, touchEndCallback);\n element.addEventListener(_events2.default.TOUCH_DRAG_END, touchEndCallback);\n element.addEventListener(_events2.default.TAP, touchEndCallback);\n\n return true;\n};\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _anyHandlesOutsideImage = __webpack_require__(14);\n\nvar _anyHandlesOutsideImage2 = _interopRequireDefault(_anyHandlesOutsideImage);\n\nvar _toolState = __webpack_require__(2);\n\nvar _triggerEvent = __webpack_require__(5);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 52 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (event, toolType, data, handle, doneMovingCallback) {\n // Console.log('touchMoveHandle');\n runAnimation.value = true;\n\n var touchEventData = event.detail;\n var cornerstone = _externalModules2.default.cornerstone;\n var element = touchEventData.element;\n var enabledElement = cornerstone.getEnabledElement(element);\n\n var time = new Date().getTime();\n\n // Average pixel width of index finger is 45-57 pixels\n // https://www.smashingmagazine.com/2012/02/finger-friendly-design-ideal-mobile-touchscreen-target-sizes/\n var fingerDistance = -57;\n\n var aboveFinger = {\n x: touchEventData.currentPoints.page.x,\n y: touchEventData.currentPoints.page.y + fingerDistance\n };\n\n var targetLocation = cornerstone.pageToPixel(element, aboveFinger.x, aboveFinger.y);\n\n function touchDragCallback(e) {\n var eventData = e.detail;\n\n // Console.log('touchMoveHandle touchDragCallback: ' + e.type);\n runAnimation.value = false;\n\n if (handle.hasMoved === false) {\n handle.hasMoved = true;\n }\n\n handle.active = true;\n\n var currentPoints = eventData.currentPoints;\n var aboveFinger = {\n x: currentPoints.page.x,\n y: currentPoints.page.y + fingerDistance\n };\n\n targetLocation = cornerstone.pageToPixel(element, aboveFinger.x, aboveFinger.y);\n handle.x = targetLocation.x;\n handle.y = targetLocation.y;\n\n cornerstone.updateImage(element);\n\n var eventType = _events2.default.MEASUREMENT_MODIFIED;\n var modifiedEventData = {\n toolType: toolType,\n element: element,\n measurementData: data\n };\n\n (0, _triggerEvent2.default)(element, eventType, modifiedEventData);\n }\n\n element.addEventListener(_events2.default.TOUCH_DRAG, touchDragCallback);\n\n function touchEndCallback(e) {\n var eventData = e.detail;\n // Console.log('touchMoveHandle touchEndCallback: ' + e.type);\n\n runAnimation.value = false;\n\n handle.active = false;\n element.removeEventListener(_events2.default.TOUCH_DRAG, touchDragCallback);\n touchEndEvents.forEach(function (eventType) {\n element.removeEventListener(eventType, touchEndCallback);\n });\n\n cornerstone.updateImage(element);\n\n if (e.type === _events2.default.TOUCH_PRESS) {\n eventData.handlePressed = data;\n\n handle.x = touchEventData.currentPoints.image.x;\n handle.y = touchEventData.currentPoints.image.y;\n }\n\n if (typeof doneMovingCallback === 'function') {\n doneMovingCallback(e);\n }\n }\n\n touchEndEvents.forEach(function (eventType) {\n element.addEventListener(eventType, touchEndCallback);\n });\n\n animate(time, handle, runAnimation, enabledElement, targetLocation);\n};\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _triggerEvent = __webpack_require__(5);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/*\n * Define the runAnimation boolean as an object\n * so that it can be modified by reference\n */\nvar runAnimation = {\n value: false\n};\n\nvar touchEndEvents = [_events2.default.TOUCH_END, _events2.default.TOUCH_DRAG_END, _events2.default.TOUCH_PINCH, _events2.default.TOUCH_PRESS, _events2.default.TAP];\n\nfunction animate(lastTime, handle, runAnimation, enabledElement, targetLocation) {\n // See http://www.html5canvastutorials.com/advanced/html5-canvas-start-and-stop-an-animation/\n if (!runAnimation.value) {\n return;\n }\n\n var cornerstone = _externalModules2.default.cornerstone;\n // Update\n var time = new Date().getTime();\n // Var timeDiff = time - lastTime;\n\n // Pixels / second\n var distanceRemaining = Math.abs(handle.y - targetLocation.y);\n var linearDistEachFrame = distanceRemaining / 10;\n\n if (distanceRemaining < 1) {\n handle.y = targetLocation.y;\n runAnimation.value = false;\n\n return;\n }\n\n if (handle.y > targetLocation.y) {\n handle.y -= linearDistEachFrame;\n } else if (handle.y < targetLocation.y) {\n handle.y += linearDistEachFrame;\n }\n\n // Update the image\n cornerstone.updateImage(enabledElement.element);\n\n // Request a new frame\n cornerstone.requestAnimationFrame(function () {\n animate(time, handle, runAnimation, enabledElement, targetLocation);\n });\n}\n\n/***/ }),\n/* 53 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n// Functions to prevent ghost clicks following a touch\n// All credit to @kosich\n// https://gist.github.com/kosich/23188dd86633b6c2efb7\n\nvar antiGhostDelay = 2000,\n pointerType = {\n mouse: 0,\n touch: 1\n};\n\nvar lastInteractionType = void 0,\n lastInteractionTime = void 0;\n\nfunction handleTap(type, e) {\n var now = Date.now();\n\n if (type !== lastInteractionType) {\n if (now - lastInteractionTime <= antiGhostDelay) {\n e.preventDefault();\n e.stopPropagation();\n e.stopImmediatePropagation();\n\n return false;\n }\n\n lastInteractionType = type;\n }\n\n lastInteractionTime = now;\n}\n\n// Cacheing the function references\n// Necessary because a new function reference is created after .bind() is called\n// http://stackoverflow.com/questions/11565471/removing-event-listener-which-was-added-with-bind\nvar handleTapMouse = handleTap.bind(null, pointerType.mouse);\nvar handleTapTouch = handleTap.bind(null, pointerType.touch);\n\nfunction attachEvents(element, eventList, interactionType) {\n var tapHandler = interactionType ? handleTapMouse : handleTapTouch;\n\n eventList.forEach(function (eventName) {\n element.addEventListener(eventName, tapHandler);\n });\n}\n\nfunction removeEvents(element, eventList, interactionType) {\n var tapHandler = interactionType ? handleTapMouse : handleTapTouch;\n\n eventList.forEach(function (eventName) {\n element.removeEventListener(eventName, tapHandler);\n });\n}\n\nvar mouseEvents = ['mousedown', 'mouseup'];\nvar touchEvents = ['touchstart', 'touchend'];\n\nfunction disable(element) {\n removeEvents(element, mouseEvents, pointerType.mouse);\n removeEvents(element, touchEvents, pointerType.touch);\n}\n\nfunction enable(element) {\n disable(element);\n attachEvents(element, mouseEvents, pointerType.mouse);\n attachEvents(element, touchEvents, pointerType.touch);\n}\n\nvar preventGhostClick = {\n enable: enable,\n disable: disable\n};\n\nexports.default = preventGhostClick;\n\n/***/ }),\n/* 54 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (doubleTapCallback) {\n return {\n activate: function activate(element) {\n element.removeEventListener(_events2.default.DOUBLE_TAP, doubleTapCallback);\n element.addEventListener(_events2.default.DOUBLE_TAP, doubleTapCallback);\n },\n disable: function disable(element) {\n element.removeEventListener(_events2.default.DOUBLE_TAP, doubleTapCallback);\n },\n enable: function enable(element) {\n element.removeEventListener(_events2.default.DOUBLE_TAP, doubleTapCallback);\n },\n deactivate: function deactivate(element) {\n element.removeEventListener(_events2.default.DOUBLE_TAP, doubleTapCallback);\n }\n };\n};\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 55 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (mouseToolInterface, preventHandleOutsideImage) {\n var toolType = mouseToolInterface.toolType;\n\n // /////// BEGIN ACTIVE TOOL ///////\n function addNewMeasurement(mouseEventData) {\n var element = mouseEventData.element;\n var measurementData = mouseToolInterface.createNewMeasurement(mouseEventData);\n\n // Prevent adding new measurement if tool returns nill\n if (!measurementData) {\n return;\n }\n\n // Associate this data with this imageId so we can render it and manipulate it\n (0, _toolState.addToolState)(mouseEventData.element, toolType, measurementData);\n\n // Since we are dragging to another place to drop the end point, we can just activate\n // The end point and let the moveHandle move it for us.\n element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback);\n (0, _moveHandle2.default)(mouseEventData, toolType, measurementData, measurementData.handles.end, function () {\n measurementData.active = false;\n if ((0, _anyHandlesOutsideImage2.default)(mouseEventData, measurementData.handles)) {\n // Delete the measurement\n (0, _toolState.removeToolState)(mouseEventData.element, toolType, measurementData);\n }\n\n element.addEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback);\n }, preventHandleOutsideImage);\n }\n\n function mouseDownActivateCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n var options = (0, _toolOptions.getToolOptions)(toolType, element);\n\n if ((0, _isMouseButtonEnabled2.default)(eventData.which, options.mouseButtonMask)) {\n addNewMeasurement(eventData);\n\n return false;\n }\n }\n // /////// END ACTIVE TOOL ///////\n\n // /////// BEGIN DEACTIVE TOOL ///////\n\n function mouseMoveCallback(e) {\n var eventData = e.detail;\n\n _toolCoordinates2.default.setCoords(eventData);\n\n // If we have no tool data for this element, do nothing\n var toolData = (0, _toolState.getToolState)(eventData.element, toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n // We have tool data, search through all data\n // And see if we can activate a handle\n var imageNeedsUpdate = false;\n var coords = eventData.currentPoints.canvas;\n\n for (var i = 0; i < toolData.data.length; i++) {\n // Get the cursor position in image coordinates\n var data = toolData.data[i];\n\n if ((0, _handleActivator2.default)(eventData.element, data.handles, coords) === true) {\n imageNeedsUpdate = true;\n }\n\n if (mouseToolInterface.pointInsideRect(eventData.element, data, coords) && !data.active || !mouseToolInterface.pointInsideRect(eventData.element, data, coords) && data.active) {\n data.active = !data.active;\n imageNeedsUpdate = true;\n }\n }\n\n // Handle activation status changed, redraw the image\n if (imageNeedsUpdate === true) {\n _externalModules2.default.cornerstone.updateImage(eventData.element);\n }\n }\n\n function mouseDownCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n var cornerstone = _externalModules2.default.cornerstone;\n var data = void 0;\n var options = (0, _toolOptions.getToolOptions)(toolType, element);\n\n if (!(0, _isMouseButtonEnabled2.default)(eventData.which, options.mouseButtonMask)) {\n return;\n }\n\n function handleDoneMove() {\n data.active = false;\n if ((0, _anyHandlesOutsideImage2.default)(eventData, data.handles)) {\n // Delete the measurement\n (0, _toolState.removeToolState)(eventData.element, toolType, data);\n }\n\n cornerstone.updateImage(eventData.element);\n element.addEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback);\n }\n\n var coords = eventData.startPoints.canvas;\n var toolData = (0, _toolState.getToolState)(e.currentTarget, toolType);\n\n var i = void 0;\n\n // Now check to see if there is a handle we can move\n var distanceSq = 25;\n\n if (toolData !== undefined) {\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n var handle = (0, _getHandleNearImagePoint2.default)(eventData.element, data.handles, coords, distanceSq);\n\n if (handle !== undefined) {\n element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback);\n data.active = true;\n (0, _moveHandle2.default)(eventData, toolType, data, handle, handleDoneMove, preventHandleOutsideImage);\n e.stopImmediatePropagation();\n\n return false;\n }\n }\n }\n\n // Now check to see if there is a line we can move\n // Now check to see if we have a tool that we can move\n var opt = {\n deleteIfHandleOutsideImage: true,\n preventHandleOutsideImage: preventHandleOutsideImage\n };\n\n if (toolData !== undefined && mouseToolInterface.pointInsideRect !== undefined) {\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (mouseToolInterface.pointInsideRect(eventData.element, data, coords)) {\n element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback);\n (0, _moveAllHandles2.default)(e, data, toolData, toolType, opt, handleDoneMove);\n element.addEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback);\n e.stopImmediatePropagation();\n\n return false;\n }\n }\n }\n }\n // /////// END DEACTIVE TOOL ///////\n\n // Not visible, not interactive\n function disable(element) {\n element.removeEventListener(_events2.default.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback);\n element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback);\n element.removeEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownActivateCallback);\n\n _externalModules2.default.cornerstone.updateImage(element);\n }\n\n // Visible but not interactive\n function enable(element) {\n element.removeEventListener(_events2.default.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback);\n element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback);\n element.removeEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownActivateCallback);\n\n element.addEventListener(_events2.default.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n\n _externalModules2.default.cornerstone.updateImage(element);\n }\n\n // Visible, interactive and can create\n function activate(element, mouseButtonMask) {\n (0, _toolOptions.setToolOptions)(toolType, element, { mouseButtonMask: mouseButtonMask });\n\n element.removeEventListener(_events2.default.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback);\n element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback);\n element.removeEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownActivateCallback);\n\n element.addEventListener(_events2.default.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n element.addEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback);\n element.addEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback);\n element.addEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownActivateCallback);\n\n _externalModules2.default.cornerstone.updateImage(element);\n }\n\n // Visible, interactive\n function deactivate(element, mouseButtonMask) {\n (0, _toolOptions.setToolOptions)(toolType, element, { mouseButtonMask: mouseButtonMask });\n\n element.removeEventListener(_events2.default.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback);\n element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback);\n element.removeEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownActivateCallback);\n\n element.addEventListener(_events2.default.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n element.addEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback);\n element.addEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback);\n\n _externalModules2.default.cornerstone.updateImage(element);\n }\n\n var toolInterface = {\n enable: enable,\n disable: disable,\n activate: activate,\n deactivate: deactivate\n };\n\n return toolInterface;\n};\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _toolCoordinates = __webpack_require__(36);\n\nvar _toolCoordinates2 = _interopRequireDefault(_toolCoordinates);\n\nvar _getHandleNearImagePoint = __webpack_require__(21);\n\nvar _getHandleNearImagePoint2 = _interopRequireDefault(_getHandleNearImagePoint);\n\nvar _handleActivator = __webpack_require__(37);\n\nvar _handleActivator2 = _interopRequireDefault(_handleActivator);\n\nvar _moveHandle = __webpack_require__(23);\n\nvar _moveHandle2 = _interopRequireDefault(_moveHandle);\n\nvar _moveAllHandles = __webpack_require__(38);\n\nvar _moveAllHandles2 = _interopRequireDefault(_moveAllHandles);\n\nvar _anyHandlesOutsideImage = __webpack_require__(14);\n\nvar _anyHandlesOutsideImage2 = _interopRequireDefault(_anyHandlesOutsideImage);\n\nvar _isMouseButtonEnabled = __webpack_require__(4);\n\nvar _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled);\n\nvar _toolState = __webpack_require__(2);\n\nvar _toolOptions = __webpack_require__(3);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 56 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (touchPinchCallback) {\n return {\n activate: function activate(element) {\n element.removeEventListener(_events2.default.TOUCH_PINCH, touchPinchCallback);\n element.addEventListener(_events2.default.TOUCH_PINCH, touchPinchCallback);\n },\n disable: function disable(element) {\n element.removeEventListener(_events2.default.TOUCH_PINCH, touchPinchCallback);\n },\n enable: function enable(element) {\n element.removeEventListener(_events2.default.TOUCH_PINCH, touchPinchCallback);\n },\n deactivate: function deactivate(element) {\n element.removeEventListener(_events2.default.TOUCH_PINCH, touchPinchCallback);\n }\n };\n};\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 57 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = brushTool;\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _toolState = __webpack_require__(2);\n\nvar _mouseButtonTool = __webpack_require__(9);\n\nvar _mouseButtonTool2 = _interopRequireDefault(_mouseButtonTool);\n\nvar _isMouseButtonEnabled = __webpack_require__(4);\n\nvar _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled);\n\nvar _toolOptions = __webpack_require__(3);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar TOOL_STATE_TOOL_TYPE = 'brush';\nvar brushLayerId = void 0;\n\nfunction brushTool(brushToolInterface) {\n var toolType = brushToolInterface.toolType;\n\n function mouseMoveCallback(e) {\n brushToolInterface.onMouseMove(e);\n }\n\n function mouseUpCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n\n brushToolInterface.onMouseUp(e);\n\n element.removeEventListener(_events2.default.MOUSE_DRAG, mouseMoveCallback);\n element.removeEventListener(_events2.default.MOUSE_DRAG, dragCallback);\n element.removeEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback);\n }\n\n function dragCallback(e) {\n brushToolInterface.onDrag(e);\n\n return false;\n }\n\n function mouseDownActivateCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n var options = (0, _toolOptions.getToolOptions)(toolType, element);\n\n if ((0, _isMouseButtonEnabled2.default)(eventData.which, options.mouseButtonMask)) {\n element.addEventListener(_events2.default.MOUSE_DRAG, dragCallback);\n element.addEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n element.addEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback);\n brushToolInterface.onMouseDown(e);\n\n return false;\n }\n\n element.addEventListener(_events2.default.MOUSE_DRAG, mouseMoveCallback);\n element.addEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n }\n\n function onImageRendered(e) {\n var eventData = e.detail;\n var element = eventData.element;\n var toolData = (0, _toolState.getToolState)(element, TOOL_STATE_TOOL_TYPE);\n var pixelData = void 0;\n\n if (toolData) {\n pixelData = toolData.data[0].pixelData;\n } else {\n pixelData = new Uint8ClampedArray(eventData.image.width * eventData.image.height);\n (0, _toolState.addToolState)(element, TOOL_STATE_TOOL_TYPE, { pixelData: pixelData });\n }\n\n var layer = _externalModules2.default.cornerstone.getLayer(eventData.element, brushLayerId);\n\n layer.image.setPixelData(pixelData);\n layer.invalid = true;\n\n _externalModules2.default.cornerstone.updateImage(element);\n\n brushToolInterface.onImageRendered(e);\n }\n\n function activate(element, mouseButtonMask) {\n (0, _toolOptions.setToolOptions)(toolType, element, { mouseButtonMask: mouseButtonMask });\n\n element.removeEventListener(_events2.default.IMAGE_RENDERED, onImageRendered);\n element.addEventListener(_events2.default.IMAGE_RENDERED, onImageRendered);\n\n element.removeEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownActivateCallback);\n element.addEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownActivateCallback);\n\n element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback);\n element.addEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback);\n\n var enabledElement = _externalModules2.default.cornerstone.getEnabledElement(element);\n var _enabledElement$image = enabledElement.image,\n width = _enabledElement$image.width,\n height = _enabledElement$image.height;\n\n var pixelData = new Uint8ClampedArray(width * height);\n\n var configuration = brushTool.getConfiguration();\n var colormapId = configuration.colormapId;\n\n if (!colormapId) {\n colormapId = 'BrushColorMap';\n\n var colormap = _externalModules2.default.cornerstone.colors.getColormap(colormapId);\n\n colormap.setNumberOfColors(2);\n colormap.setColor(0, [0, 0, 0, 0]);\n colormap.setColor(1, [255, 0, 0, 255]);\n }\n\n var labelMapImage = {\n minPixelValue: 0,\n maxPixelValue: 1,\n slope: 1.0,\n intercept: 0,\n getPixelData: function getPixelData() {\n return pixelData;\n },\n rows: enabledElement.image.height,\n columns: enabledElement.image.width,\n height: height,\n width: width,\n pixelData: pixelData,\n setPixelData: function setPixelData(data) {\n pixelData = data;\n },\n colormap: colormapId,\n color: false,\n rgba: false,\n labelmap: true,\n invert: false,\n columnPixelSpacing: 1.0,\n rowPixelSpacing: 1.0,\n sizeInBytes: enabledElement.image.width * enabledElement.image.height\n };\n\n var layer = void 0;\n var options = {\n viewport: {\n pixelReplication: true\n }\n };\n\n if (brushLayerId) {\n layer = _externalModules2.default.cornerstone.getLayer(element, brushLayerId);\n }\n\n if (!layer) {\n brushLayerId = _externalModules2.default.cornerstone.addLayer(element, labelMapImage, options);\n }\n\n (0, _toolState.addToolState)(element, TOOL_STATE_TOOL_TYPE, { pixelData: pixelData });\n\n configuration.brushLayerId = brushLayerId;\n brushTool.setConfiguration(configuration);\n\n _externalModules2.default.cornerstone.updateImage(element);\n }\n\n function deactivate(element) {\n element.removeEventListener(_events2.default.IMAGE_RENDERED, onImageRendered);\n element.removeEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownActivateCallback);\n element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback);\n }\n\n var brushTool = (0, _mouseButtonTool2.default)({\n mouseMoveCallback: mouseMoveCallback,\n mouseDownActivateCallback: mouseDownActivateCallback,\n onImageRendered: onImageRendered,\n deactivate: deactivate\n });\n\n brushTool.activate = activate;\n\n return brushTool;\n}\n\n/***/ }),\n/* 58 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = getCircle;\nfunction getCircle(radius, rows, columns) {\n var xCoord = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;\n var yCoord = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0;\n\n var x0 = Math.round(xCoord);\n var y0 = Math.round(yCoord);\n\n if (radius === 1) {\n return [[x0, y0]];\n }\n\n var circleArray = [];\n var index = 0;\n\n for (var y = -radius; y <= radius; y++) {\n var _yCoord = y0 + y;\n\n if (_yCoord > rows || _yCoord < 0) {\n continue;\n }\n\n for (var x = -radius; x <= radius; x++) {\n var _xCoord = x0 + x;\n\n if (_xCoord > columns || _xCoord < 0) {\n continue;\n }\n\n if (x * x + y * y < radius * radius) {\n circleArray[index++] = [x0 + x, y0 + y];\n }\n }\n }\n\n return circleArray;\n}\n\n/***/ }),\n/* 59 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.drawBrushOnCanvas = exports.drawBrushPixels = undefined;\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction drawBrushPixels(pointerArray, storedPixels, brushPixelValue, columns) {\n var getPixelIndex = function getPixelIndex(x, y) {\n return y * columns + x;\n };\n\n pointerArray.forEach(function (point) {\n var spIndex = getPixelIndex(point[0], point[1]);\n\n storedPixels[spIndex] = brushPixelValue;\n });\n}\n\nfunction drawBrushOnCanvas(pointerArray, canvasContext, color, element) {\n var canvasPtTL = _externalModules2.default.cornerstone.pixelToCanvas(element, { x: 0,\n y: 0 });\n var canvasPtBR = _externalModules2.default.cornerstone.pixelToCanvas(element, { x: 1,\n y: 1 });\n var sizeX = canvasPtBR.x - canvasPtTL.x;\n var sizeY = canvasPtBR.y - canvasPtTL.y;\n\n canvasContext.save();\n canvasContext.fillStyle = color;\n\n pointerArray.forEach(function (point) {\n var canvasPt = _externalModules2.default.cornerstone.pixelToCanvas(element, {\n x: point[0],\n y: point[1]\n });\n\n canvasContext.fillRect(canvasPt.x, canvasPt.y, sizeX, sizeY);\n });\n\n canvasContext.restore();\n}\n\nexports.drawBrushPixels = drawBrushPixels;\nexports.drawBrushOnCanvas = drawBrushOnCanvas;\n\n/***/ }),\n/* 60 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _externalModules = __webpack_require__(0);\n\nObject.defineProperty(exports, 'external', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_externalModules).default;\n }\n});\n\nvar _index = __webpack_require__(61);\n\nObject.defineProperty(exports, 'referenceLines', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_index).default;\n }\n});\n\nvar _index2 = __webpack_require__(43);\n\nObject.defineProperty(exports, 'orientation', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_index2).default;\n }\n});\n\nvar _requestPoolManager = __webpack_require__(29);\n\nObject.defineProperty(exports, 'requestPoolManager', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_requestPoolManager).default;\n }\n});\n\nvar _setContextToDisplayFontSize = __webpack_require__(65);\n\nObject.defineProperty(exports, 'setContextToDisplayFontSize', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_setContextToDisplayFontSize).default;\n }\n});\n\nvar _scrollToIndex = __webpack_require__(44);\n\nObject.defineProperty(exports, 'scrollToIndex', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_scrollToIndex).default;\n }\n});\n\nvar _scroll = __webpack_require__(30);\n\nObject.defineProperty(exports, 'scroll', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_scroll).default;\n }\n});\n\nvar _roundToDecimal = __webpack_require__(31);\n\nObject.defineProperty(exports, 'roundToDecimal', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_roundToDecimal).default;\n }\n});\n\nvar _pointProjector = __webpack_require__(28);\n\nObject.defineProperty(exports, 'projectPatientPointToImagePlane', {\n enumerable: true,\n get: function get() {\n return _pointProjector.projectPatientPointToImagePlane;\n }\n});\nObject.defineProperty(exports, 'imagePointToPatientPoint', {\n enumerable: true,\n get: function get() {\n return _pointProjector.imagePointToPatientPoint;\n }\n});\nObject.defineProperty(exports, 'planePlaneIntersection', {\n enumerable: true,\n get: function get() {\n return _pointProjector.planePlaneIntersection;\n }\n});\n\nvar _pointInsideBoundingBox = __webpack_require__(19);\n\nObject.defineProperty(exports, 'pointInsideBoundingBox', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_pointInsideBoundingBox).default;\n }\n});\n\nvar _pointInEllipse = __webpack_require__(32);\n\nObject.defineProperty(exports, 'pointInEllipse', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_pointInEllipse).default;\n }\n});\n\nvar _pauseEvent = __webpack_require__(33);\n\nObject.defineProperty(exports, 'pauseEvent', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_pauseEvent).default;\n }\n});\n\nvar _isMouseButtonEnabled = __webpack_require__(4);\n\nObject.defineProperty(exports, 'isMouseButtonEnabled', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_isMouseButtonEnabled).default;\n }\n});\n\nvar _getRGBPixels = __webpack_require__(34);\n\nObject.defineProperty(exports, 'getRGBPixels', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_getRGBPixels).default;\n }\n});\n\nvar _getMaxSimultaneousRequests = __webpack_require__(22);\n\nObject.defineProperty(exports, 'getDefaultSimultaneousRequests', {\n enumerable: true,\n get: function get() {\n return _getMaxSimultaneousRequests.getDefaultSimultaneousRequests;\n }\n});\nObject.defineProperty(exports, 'getMaxSimultaneousRequests', {\n enumerable: true,\n get: function get() {\n return _getMaxSimultaneousRequests.getMaxSimultaneousRequests;\n }\n});\nObject.defineProperty(exports, 'getBrowserInfo', {\n enumerable: true,\n get: function get() {\n return _getMaxSimultaneousRequests.getBrowserInfo;\n }\n});\nObject.defineProperty(exports, 'isMobileDevice', {\n enumerable: true,\n get: function get() {\n return _getMaxSimultaneousRequests.isMobileDevice;\n }\n});\n\nvar _getLuminance = __webpack_require__(45);\n\nObject.defineProperty(exports, 'getLuminance', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_getLuminance).default;\n }\n});\n\nvar _drawTextBox = __webpack_require__(7);\n\nObject.defineProperty(exports, 'drawTextBox', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_drawTextBox).default;\n }\n});\n\nvar _drawEllipse = __webpack_require__(46);\n\nObject.defineProperty(exports, 'drawEllipse', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_drawEllipse).default;\n }\n});\n\nvar _drawCircle = __webpack_require__(47);\n\nObject.defineProperty(exports, 'drawCircle', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_drawCircle).default;\n }\n});\n\nvar _drawArrow = __webpack_require__(48);\n\nObject.defineProperty(exports, 'drawArrow', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_drawArrow).default;\n }\n});\n\nvar _copyPoints = __webpack_require__(35);\n\nObject.defineProperty(exports, 'copyPoints', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_copyPoints).default;\n }\n});\n\nvar _calculateSUV = __webpack_require__(20);\n\nObject.defineProperty(exports, 'calculateSUV', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_calculateSUV).default;\n }\n});\n\nvar _calculateEllipseStatistics = __webpack_require__(49);\n\nObject.defineProperty(exports, 'calculateEllipseStatistics', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_calculateEllipseStatistics).default;\n }\n});\n\nvar _probeTool4D = __webpack_require__(66);\n\nObject.defineProperty(exports, 'probeTool4D', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_probeTool4D).default;\n }\n});\n\nvar _incrementTimePoint = __webpack_require__(39);\n\nObject.defineProperty(exports, 'incrementTimePoint', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_incrementTimePoint).default;\n }\n});\n\nvar _timeSeriesPlayer = __webpack_require__(69);\n\nObject.defineProperty(exports, 'timeSeriesPlayer', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_timeSeriesPlayer).default;\n }\n});\n\nvar _timeSeriesScroll = __webpack_require__(70);\n\nObject.defineProperty(exports, 'timeSeriesScroll', {\n enumerable: true,\n get: function get() {\n return _timeSeriesScroll.timeSeriesScroll;\n }\n});\nObject.defineProperty(exports, 'timeSeriesScrollWheel', {\n enumerable: true,\n get: function get() {\n return _timeSeriesScroll.timeSeriesScrollWheel;\n }\n});\nObject.defineProperty(exports, 'timeSeriesScrollTouchDrag', {\n enumerable: true,\n get: function get() {\n return _timeSeriesScroll.timeSeriesScrollTouchDrag;\n }\n});\n\nvar _wwwcSynchronizer = __webpack_require__(71);\n\nObject.defineProperty(exports, 'wwwcSynchronizer', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_wwwcSynchronizer).default;\n }\n});\n\nvar _updateImageSynchronizer = __webpack_require__(72);\n\nObject.defineProperty(exports, 'updateImageSynchronizer', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_updateImageSynchronizer).default;\n }\n});\n\nvar _Synchronizer = __webpack_require__(73);\n\nObject.defineProperty(exports, 'Synchronizer', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_Synchronizer).default;\n }\n});\n\nvar _stackScrollSynchronizer = __webpack_require__(74);\n\nObject.defineProperty(exports, 'stackScrollSynchronizer', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_stackScrollSynchronizer).default;\n }\n});\n\nvar _stackImagePositionSynchronizer = __webpack_require__(75);\n\nObject.defineProperty(exports, 'stackImagePositionSynchronizer', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_stackImagePositionSynchronizer).default;\n }\n});\n\nvar _stackImagePositionOffsetSynchronizer = __webpack_require__(76);\n\nObject.defineProperty(exports, 'stackImagePositionOffsetSynchronizer', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_stackImagePositionOffsetSynchronizer).default;\n }\n});\n\nvar _stackImageIndexSynchronizer = __webpack_require__(77);\n\nObject.defineProperty(exports, 'stackImageIndexSynchronizer', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_stackImageIndexSynchronizer).default;\n }\n});\n\nvar _panZoomSynchronizer = __webpack_require__(78);\n\nObject.defineProperty(exports, 'panZoomSynchronizer', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_panZoomSynchronizer).default;\n }\n});\n\nvar _toolStyle = __webpack_require__(8);\n\nObject.defineProperty(exports, 'toolStyle', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_toolStyle).default;\n }\n});\n\nvar _toolState = __webpack_require__(2);\n\nObject.defineProperty(exports, 'addToolState', {\n enumerable: true,\n get: function get() {\n return _toolState.addToolState;\n }\n});\nObject.defineProperty(exports, 'getToolState', {\n enumerable: true,\n get: function get() {\n return _toolState.getToolState;\n }\n});\nObject.defineProperty(exports, 'removeToolState', {\n enumerable: true,\n get: function get() {\n return _toolState.removeToolState;\n }\n});\nObject.defineProperty(exports, 'clearToolState', {\n enumerable: true,\n get: function get() {\n return _toolState.clearToolState;\n }\n});\nObject.defineProperty(exports, 'setElementToolStateManager', {\n enumerable: true,\n get: function get() {\n return _toolState.setElementToolStateManager;\n }\n});\nObject.defineProperty(exports, 'getElementToolStateManager', {\n enumerable: true,\n get: function get() {\n return _toolState.getElementToolStateManager;\n }\n});\n\nvar _toolCoordinates = __webpack_require__(36);\n\nObject.defineProperty(exports, 'toolCoordinates', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_toolCoordinates).default;\n }\n});\n\nvar _toolColors = __webpack_require__(6);\n\nObject.defineProperty(exports, 'toolColors', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_toolColors).default;\n }\n});\n\nvar _timeSeriesSpecificStateManager = __webpack_require__(79);\n\nObject.defineProperty(exports, 'addTimeSeriesStateManager', {\n enumerable: true,\n get: function get() {\n return _timeSeriesSpecificStateManager.addTimeSeriesStateManager;\n }\n});\nObject.defineProperty(exports, 'newTimeSeriesSpecificToolStateManager', {\n enumerable: true,\n get: function get() {\n return _timeSeriesSpecificStateManager.newTimeSeriesSpecificToolStateManager;\n }\n});\n\nvar _textStyle = __webpack_require__(13);\n\nObject.defineProperty(exports, 'textStyle', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_textStyle).default;\n }\n});\n\nvar _stackSpecificStateManager = __webpack_require__(80);\n\nObject.defineProperty(exports, 'stackSpecificStateManager', {\n enumerable: true,\n get: function get() {\n return _stackSpecificStateManager.stackSpecificStateManager;\n }\n});\nObject.defineProperty(exports, 'newStackSpecificToolStateManager', {\n enumerable: true,\n get: function get() {\n return _stackSpecificStateManager.newStackSpecificToolStateManager;\n }\n});\nObject.defineProperty(exports, 'addStackStateManager', {\n enumerable: true,\n get: function get() {\n return _stackSpecificStateManager.addStackStateManager;\n }\n});\n\nvar _loadHandlerManager = __webpack_require__(12);\n\nObject.defineProperty(exports, 'loadHandlerManager', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_loadHandlerManager).default;\n }\n});\n\nvar _imageIdSpecificStateManager = __webpack_require__(18);\n\nObject.defineProperty(exports, 'newImageIdSpecificToolStateManager', {\n enumerable: true,\n get: function get() {\n return _imageIdSpecificStateManager.newImageIdSpecificToolStateManager;\n }\n});\nObject.defineProperty(exports, 'globalImageIdSpecificToolStateManager', {\n enumerable: true,\n get: function get() {\n return _imageIdSpecificStateManager.globalImageIdSpecificToolStateManager;\n }\n});\n\nvar _frameOfReferenceStateManager = __webpack_require__(81);\n\nObject.defineProperty(exports, 'newFrameOfReferenceSpecificToolStateManager', {\n enumerable: true,\n get: function get() {\n return _frameOfReferenceStateManager.newFrameOfReferenceSpecificToolStateManager;\n }\n});\nObject.defineProperty(exports, 'globalFrameOfReferenceSpecificToolStateManager', {\n enumerable: true,\n get: function get() {\n return _frameOfReferenceStateManager.globalFrameOfReferenceSpecificToolStateManager;\n }\n});\n\nvar _appState = __webpack_require__(82);\n\nObject.defineProperty(exports, 'appState', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_appState).default;\n }\n});\n\nvar _stackScrollKeyboard = __webpack_require__(83);\n\nObject.defineProperty(exports, 'stackScrollKeyboard', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_stackScrollKeyboard).default;\n }\n});\n\nvar _stackScroll = __webpack_require__(84);\n\nObject.defineProperty(exports, 'stackScroll', {\n enumerable: true,\n get: function get() {\n return _stackScroll.stackScroll;\n }\n});\nObject.defineProperty(exports, 'stackScrollWheel', {\n enumerable: true,\n get: function get() {\n return _stackScroll.stackScrollWheel;\n }\n});\nObject.defineProperty(exports, 'stackScrollTouchDrag', {\n enumerable: true,\n get: function get() {\n return _stackScroll.stackScrollTouchDrag;\n }\n});\nObject.defineProperty(exports, 'stackScrollMultiTouch', {\n enumerable: true,\n get: function get() {\n return _stackScroll.stackScrollMultiTouch;\n }\n});\n\nvar _stackPrefetch = __webpack_require__(85);\n\nObject.defineProperty(exports, 'stackPrefetch', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_stackPrefetch).default;\n }\n});\n\nvar _scrollIndicator = __webpack_require__(86);\n\nObject.defineProperty(exports, 'scrollIndicator', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_scrollIndicator).default;\n }\n});\n\nvar _stackRenderers = __webpack_require__(87);\n\nObject.defineProperty(exports, 'stackRenderers', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_stackRenderers).default;\n }\n});\n\nvar _playClip = __webpack_require__(89);\n\nObject.defineProperty(exports, 'playClip', {\n enumerable: true,\n get: function get() {\n return _playClip.playClip;\n }\n});\nObject.defineProperty(exports, 'stopClip', {\n enumerable: true,\n get: function get() {\n return _playClip.stopClip;\n }\n});\n\nvar _anyHandlesOutsideImage = __webpack_require__(14);\n\nObject.defineProperty(exports, 'anyHandlesOutsideImage', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_anyHandlesOutsideImage).default;\n }\n});\n\nvar _drawHandles = __webpack_require__(10);\n\nObject.defineProperty(exports, 'drawHandles', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_drawHandles).default;\n }\n});\n\nvar _getHandleNearImagePoint = __webpack_require__(21);\n\nObject.defineProperty(exports, 'getHandleNearImagePoint', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_getHandleNearImagePoint).default;\n }\n});\n\nvar _handleActivator = __webpack_require__(37);\n\nObject.defineProperty(exports, 'handleActivator', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_handleActivator).default;\n }\n});\n\nvar _moveAllHandles = __webpack_require__(38);\n\nObject.defineProperty(exports, 'moveAllHandles', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_moveAllHandles).default;\n }\n});\n\nvar _moveHandle = __webpack_require__(23);\n\nObject.defineProperty(exports, 'moveHandle', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_moveHandle).default;\n }\n});\n\nvar _moveNewHandle = __webpack_require__(24);\n\nObject.defineProperty(exports, 'moveNewHandle', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_moveNewHandle).default;\n }\n});\n\nvar _moveNewHandleTouch = __webpack_require__(27);\n\nObject.defineProperty(exports, 'moveNewHandleTouch', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_moveNewHandleTouch).default;\n }\n});\n\nvar _touchMoveAllHandles = __webpack_require__(51);\n\nObject.defineProperty(exports, 'touchMoveAllHandles', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_touchMoveAllHandles).default;\n }\n});\n\nvar _touchMoveHandle = __webpack_require__(52);\n\nObject.defineProperty(exports, 'touchMoveHandle', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_touchMoveHandle).default;\n }\n});\n\nvar _keyboardInput = __webpack_require__(90);\n\nObject.defineProperty(exports, 'keyboardInput', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_keyboardInput).default;\n }\n});\n\nvar _mouseInput = __webpack_require__(91);\n\nObject.defineProperty(exports, 'mouseInput', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_mouseInput).default;\n }\n});\n\nvar _mouseWheelInput = __webpack_require__(92);\n\nObject.defineProperty(exports, 'mouseWheelInput', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_mouseWheelInput).default;\n }\n});\n\nvar _preventGhostClick = __webpack_require__(53);\n\nObject.defineProperty(exports, 'preventGhostClick', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_preventGhostClick).default;\n }\n});\n\nvar _touchInput = __webpack_require__(93);\n\nObject.defineProperty(exports, 'touchInput', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_touchInput).default;\n }\n});\n\nvar _angleTool = __webpack_require__(94);\n\nObject.defineProperty(exports, 'angle', {\n enumerable: true,\n get: function get() {\n return _angleTool.angle;\n }\n});\nObject.defineProperty(exports, 'angleTouch', {\n enumerable: true,\n get: function get() {\n return _angleTool.angleTouch;\n }\n});\n\nvar _arrowAnnotate = __webpack_require__(95);\n\nObject.defineProperty(exports, 'arrowAnnotate', {\n enumerable: true,\n get: function get() {\n return _arrowAnnotate.arrowAnnotate;\n }\n});\nObject.defineProperty(exports, 'arrowAnnotateTouch', {\n enumerable: true,\n get: function get() {\n return _arrowAnnotate.arrowAnnotateTouch;\n }\n});\n\nvar _crosshairs = __webpack_require__(96);\n\nObject.defineProperty(exports, 'crosshairs', {\n enumerable: true,\n get: function get() {\n return _crosshairs.crosshairs;\n }\n});\nObject.defineProperty(exports, 'crosshairsTouch', {\n enumerable: true,\n get: function get() {\n return _crosshairs.crosshairsTouch;\n }\n});\n\nvar _displayTool = __webpack_require__(26);\n\nObject.defineProperty(exports, 'displayTool', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_displayTool).default;\n }\n});\n\nvar _doubleTapTool = __webpack_require__(54);\n\nObject.defineProperty(exports, 'doubleTapTool', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_doubleTapTool).default;\n }\n});\n\nvar _doubleTapZoom = __webpack_require__(97);\n\nObject.defineProperty(exports, 'doubleTapZoom', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_doubleTapZoom).default;\n }\n});\n\nvar _dragProbe = __webpack_require__(98);\n\nObject.defineProperty(exports, 'dragProbe', {\n enumerable: true,\n get: function get() {\n return _dragProbe.dragProbe;\n }\n});\nObject.defineProperty(exports, 'dragProbeTouch', {\n enumerable: true,\n get: function get() {\n return _dragProbe.dragProbeTouch;\n }\n});\n\nvar _ellipticalRoi = __webpack_require__(99);\n\nObject.defineProperty(exports, 'ellipticalRoi', {\n enumerable: true,\n get: function get() {\n return _ellipticalRoi.ellipticalRoi;\n }\n});\nObject.defineProperty(exports, 'ellipticalRoiTouch', {\n enumerable: true,\n get: function get() {\n return _ellipticalRoi.ellipticalRoiTouch;\n }\n});\n\nvar _freehand = __webpack_require__(100);\n\nObject.defineProperty(exports, 'freehand', {\n enumerable: true,\n get: function get() {\n return _freehand.freehand;\n }\n});\n\nvar _highlight = __webpack_require__(101);\n\nObject.defineProperty(exports, 'highlight', {\n enumerable: true,\n get: function get() {\n return _highlight.highlight;\n }\n});\nObject.defineProperty(exports, 'highlightTouch', {\n enumerable: true,\n get: function get() {\n return _highlight.highlightTouch;\n }\n});\n\nvar _imageStats = __webpack_require__(102);\n\nObject.defineProperty(exports, 'imageStats', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_imageStats).default;\n }\n});\n\nvar _keyboardTool = __webpack_require__(50);\n\nObject.defineProperty(exports, 'keyboardTool', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_keyboardTool).default;\n }\n});\n\nvar _length = __webpack_require__(103);\n\nObject.defineProperty(exports, 'length', {\n enumerable: true,\n get: function get() {\n return _length.length;\n }\n});\nObject.defineProperty(exports, 'lengthTouch', {\n enumerable: true,\n get: function get() {\n return _length.lengthTouch;\n }\n});\n\nvar _magnify = __webpack_require__(104);\n\nObject.defineProperty(exports, 'magnify', {\n enumerable: true,\n get: function get() {\n return _magnify.magnify;\n }\n});\nObject.defineProperty(exports, 'magnifyTouchDrag', {\n enumerable: true,\n get: function get() {\n return _magnify.magnifyTouchDrag;\n }\n});\n\nvar _mouseButtonRectangleTool = __webpack_require__(55);\n\nObject.defineProperty(exports, 'mouseButtonRectangleTool', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_mouseButtonRectangleTool).default;\n }\n});\n\nvar _mouseButtonTool = __webpack_require__(9);\n\nObject.defineProperty(exports, 'mouseButtonTool', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_mouseButtonTool).default;\n }\n});\n\nvar _mouseWheelTool = __webpack_require__(25);\n\nObject.defineProperty(exports, 'mouseWheelTool', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_mouseWheelTool).default;\n }\n});\n\nvar _multiTouchDragTool = __webpack_require__(40);\n\nObject.defineProperty(exports, 'multiTouchDragTool', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_multiTouchDragTool).default;\n }\n});\n\nvar _orientationMarkers = __webpack_require__(105);\n\nObject.defineProperty(exports, 'orientationMarkers', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_orientationMarkers).default;\n }\n});\n\nvar _pan = __webpack_require__(106);\n\nObject.defineProperty(exports, 'pan', {\n enumerable: true,\n get: function get() {\n return _pan.pan;\n }\n});\nObject.defineProperty(exports, 'panTouchDrag', {\n enumerable: true,\n get: function get() {\n return _pan.panTouchDrag;\n }\n});\n\nvar _panMultiTouch = __webpack_require__(107);\n\nObject.defineProperty(exports, 'panMultiTouch', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_panMultiTouch).default;\n }\n});\n\nvar _probe = __webpack_require__(108);\n\nObject.defineProperty(exports, 'probe', {\n enumerable: true,\n get: function get() {\n return _probe.probe;\n }\n});\nObject.defineProperty(exports, 'probeTouch', {\n enumerable: true,\n get: function get() {\n return _probe.probeTouch;\n }\n});\n\nvar _rectangleRoi = __webpack_require__(109);\n\nObject.defineProperty(exports, 'rectangleRoi', {\n enumerable: true,\n get: function get() {\n return _rectangleRoi.rectangleRoi;\n }\n});\nObject.defineProperty(exports, 'rectangleRoiTouch', {\n enumerable: true,\n get: function get() {\n return _rectangleRoi.rectangleRoiTouch;\n }\n});\n\nvar _rotate = __webpack_require__(110);\n\nObject.defineProperty(exports, 'rotate', {\n enumerable: true,\n get: function get() {\n return _rotate.rotate;\n }\n});\nObject.defineProperty(exports, 'rotateTouchDrag', {\n enumerable: true,\n get: function get() {\n return _rotate.rotateTouchDrag;\n }\n});\n\nvar _rotateTouch = __webpack_require__(111);\n\nObject.defineProperty(exports, 'rotateTouch', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_rotateTouch).default;\n }\n});\n\nvar _saveAs = __webpack_require__(112);\n\nObject.defineProperty(exports, 'saveAs', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_saveAs).default;\n }\n});\n\nvar _seedAnnotate = __webpack_require__(113);\n\nObject.defineProperty(exports, 'seedAnnotate', {\n enumerable: true,\n get: function get() {\n return _seedAnnotate.seedAnnotate;\n }\n});\nObject.defineProperty(exports, 'seedAnnotateTouch', {\n enumerable: true,\n get: function get() {\n return _seedAnnotate.seedAnnotateTouch;\n }\n});\n\nvar _simpleAngle = __webpack_require__(114);\n\nObject.defineProperty(exports, 'simpleAngle', {\n enumerable: true,\n get: function get() {\n return _simpleAngle.simpleAngle;\n }\n});\nObject.defineProperty(exports, 'simpleAngleTouch', {\n enumerable: true,\n get: function get() {\n return _simpleAngle.simpleAngleTouch;\n }\n});\n\nvar _simpleMouseButtonTool = __webpack_require__(16);\n\nObject.defineProperty(exports, 'simpleMouseButtonTool', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_simpleMouseButtonTool).default;\n }\n});\n\nvar _textMarker = __webpack_require__(115);\n\nObject.defineProperty(exports, 'textMarker', {\n enumerable: true,\n get: function get() {\n return _textMarker.textMarker;\n }\n});\nObject.defineProperty(exports, 'textMarkerTouch', {\n enumerable: true,\n get: function get() {\n return _textMarker.textMarkerTouch;\n }\n});\n\nvar _touchDragTool = __webpack_require__(15);\n\nObject.defineProperty(exports, 'touchDragTool', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_touchDragTool).default;\n }\n});\n\nvar _touchPinchTool = __webpack_require__(56);\n\nObject.defineProperty(exports, 'touchPinchTool', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_touchPinchTool).default;\n }\n});\n\nvar _touchTool = __webpack_require__(11);\n\nObject.defineProperty(exports, 'touchTool', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_touchTool).default;\n }\n});\n\nvar _wwwc = __webpack_require__(116);\n\nObject.defineProperty(exports, 'wwwc', {\n enumerable: true,\n get: function get() {\n return _wwwc.wwwc;\n }\n});\nObject.defineProperty(exports, 'wwwcTouchDrag', {\n enumerable: true,\n get: function get() {\n return _wwwc.wwwcTouchDrag;\n }\n});\n\nvar _wwwcRegion = __webpack_require__(117);\n\nObject.defineProperty(exports, 'wwwcRegion', {\n enumerable: true,\n get: function get() {\n return _wwwcRegion.wwwcRegion;\n }\n});\nObject.defineProperty(exports, 'wwwcRegionTouch', {\n enumerable: true,\n get: function get() {\n return _wwwcRegion.wwwcRegionTouch;\n }\n});\n\nvar _zoom = __webpack_require__(118);\n\nObject.defineProperty(exports, 'zoom', {\n enumerable: true,\n get: function get() {\n return _zoom.zoom;\n }\n});\nObject.defineProperty(exports, 'zoomWheel', {\n enumerable: true,\n get: function get() {\n return _zoom.zoomWheel;\n }\n});\nObject.defineProperty(exports, 'zoomTouchPinch', {\n enumerable: true,\n get: function get() {\n return _zoom.zoomTouchPinch;\n }\n});\nObject.defineProperty(exports, 'zoomTouchDrag', {\n enumerable: true,\n get: function get() {\n return _zoom.zoomTouchDrag;\n }\n});\n\nvar _brush = __webpack_require__(119);\n\nObject.defineProperty(exports, 'brush', {\n enumerable: true,\n get: function get() {\n return _brush.brush;\n }\n});\n\nvar _adaptiveBrush = __webpack_require__(120);\n\nObject.defineProperty(exports, 'adaptiveBrush', {\n enumerable: true,\n get: function get() {\n return _adaptiveBrush.adaptiveBrush;\n }\n});\n\nvar _version = __webpack_require__(121);\n\nObject.defineProperty(exports, 'version', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_version).default;\n }\n});\n\nvar _toolOptions = __webpack_require__(3);\n\nObject.defineProperty(exports, 'setToolOptions', {\n enumerable: true,\n get: function get() {\n return _toolOptions.setToolOptions;\n }\n});\nObject.defineProperty(exports, 'getToolOptions', {\n enumerable: true,\n get: function get() {\n return _toolOptions.getToolOptions;\n }\n});\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 61 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _calculateReferenceLine = __webpack_require__(41);\n\nvar _calculateReferenceLine2 = _interopRequireDefault(_calculateReferenceLine);\n\nvar _referenceLinesTool = __webpack_require__(62);\n\nvar _referenceLinesTool2 = _interopRequireDefault(_referenceLinesTool);\n\nvar _renderActiveReferenceLine = __webpack_require__(42);\n\nvar _renderActiveReferenceLine2 = _interopRequireDefault(_renderActiveReferenceLine);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar referenceLines = {\n calculateReferenceLine: _calculateReferenceLine2.default,\n tool: _referenceLinesTool2.default,\n renderActiveReferenceLine: _renderActiveReferenceLine2.default\n};\n\nexports.default = referenceLines;\n\n/***/ }),\n/* 62 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _toolState = __webpack_require__(2);\n\nvar _renderActiveReferenceLine = __webpack_require__(42);\n\nvar _renderActiveReferenceLine2 = _interopRequireDefault(_renderActiveReferenceLine);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'referenceLines';\n\nfunction onImageRendered(e) {\n var eventData = e.detail;\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n var toolData = (0, _toolState.getToolState)(e.currentTarget, toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n // Get the enabled elements associated with this synchronization context and draw them\n var syncContext = toolData.data[0].synchronizationContext;\n var enabledElements = syncContext.getSourceElements();\n\n var renderer = toolData.data[0].renderer;\n\n // Create the canvas context and reset it to the pixel coordinate system\n var context = eventData.canvasContext.canvas.getContext('2d');\n\n _externalModules2.default.cornerstone.setToPixelCoordinateSystem(eventData.enabledElement, context);\n\n // Iterate over each referenced element\n enabledElements.forEach(function (referenceEnabledElement) {\n\n // Don't draw ourselves\n if (referenceEnabledElement === e.currentTarget) {\n return;\n }\n\n // Render it\n renderer(context, eventData, e.currentTarget, referenceEnabledElement);\n });\n}\n\n// Enables the reference line tool for a given element. Note that a custom renderer\n// Can be provided if you want different rendering (e.g. all reference lines, first/last/active, etc)\nfunction enable(element, synchronizationContext, renderer) {\n renderer = renderer || _renderActiveReferenceLine2.default;\n\n (0, _toolState.addToolState)(element, toolType, {\n synchronizationContext: synchronizationContext,\n renderer: renderer\n });\n\n element.removeEventListener(_events2.default.IMAGE_RENDERED, onImageRendered);\n element.addEventListener(_events2.default.IMAGE_RENDERED, onImageRendered);\n _externalModules2.default.cornerstone.updateImage(element);\n}\n\n// Disables the reference line tool for the given element\nfunction disable(element) {\n element.removeEventListener(_events2.default.IMAGE_RENDERED, onImageRendered);\n _externalModules2.default.cornerstone.updateImage(element);\n}\n\n// Module/private exports\nvar tool = {\n enable: enable,\n disable: disable\n};\n\nexports.default = tool;\n\n/***/ }),\n/* 63 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (vector) {\n var vec3 = (0, _convertToVector2.default)(vector);\n\n // Thanks to David Clunie\n // https://sites.google.com/site/dicomnotes/\n\n var orientation = '';\n var orientationX = vec3.x < 0 ? 'R' : 'L';\n var orientationY = vec3.y < 0 ? 'A' : 'P';\n var orientationZ = vec3.z < 0 ? 'F' : 'H';\n\n // Should probably make this a function vector3.abs\n var abs = new _externalModules2.default.cornerstoneMath.Vector3(Math.abs(vec3.x), Math.abs(vec3.y), Math.abs(vec3.z));\n\n for (var i = 0; i < 3; i++) {\n if (abs.x > 0.0001 && abs.x > abs.y && abs.x > abs.z) {\n orientation += orientationX;\n abs.x = 0;\n } else if (abs.y > 0.0001 && abs.y > abs.x && abs.y > abs.z) {\n orientation += orientationY;\n abs.y = 0;\n } else if (abs.z > 0.0001 && abs.z > abs.x && abs.z > abs.y) {\n orientation += orientationZ;\n abs.z = 0;\n } else {\n break;\n }\n }\n\n return orientation;\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _convertToVector = __webpack_require__(17);\n\nvar _convertToVector2 = _interopRequireDefault(_convertToVector);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 64 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (string) {\n var inverted = string.replace('H', 'f');\n\n inverted = inverted.replace('F', 'h');\n inverted = inverted.replace('R', 'l');\n inverted = inverted.replace('L', 'r');\n inverted = inverted.replace('A', 'p');\n inverted = inverted.replace('P', 'a');\n inverted = inverted.toUpperCase();\n\n return inverted;\n};\n\n/***/ }),\n/* 65 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (enabledElement, context, fontSize) {\n var fontScale = 0.1;\n\n _externalModules2.default.cornerstone.setToPixelCoordinateSystem(enabledElement, context, fontScale);\n // Return the font size to use\n var scaledFontSize = fontSize / enabledElement.viewport.scale / fontScale;\n // TODO: actually calculate this?\n var lineHeight = fontSize / enabledElement.viewport.scale / fontScale;\n\n return {\n fontSize: scaledFontSize,\n lineHeight: lineHeight,\n fontScale: fontScale\n };\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 66 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _mouseButtonTool = __webpack_require__(9);\n\nvar _mouseButtonTool2 = _interopRequireDefault(_mouseButtonTool);\n\nvar _drawHandles = __webpack_require__(10);\n\nvar _drawHandles2 = _interopRequireDefault(_drawHandles);\n\nvar _toolState = __webpack_require__(2);\n\nvar _measurementManager = __webpack_require__(67);\n\nvar _measurementManager2 = _interopRequireDefault(_measurementManager);\n\nvar _lineSampleMeasurement = __webpack_require__(68);\n\nvar _lineSampleMeasurement2 = _interopRequireDefault(_lineSampleMeasurement);\n\nvar _textStyle = __webpack_require__(13);\n\nvar _textStyle2 = _interopRequireDefault(_textStyle);\n\nvar _drawTextBox = __webpack_require__(7);\n\nvar _drawTextBox2 = _interopRequireDefault(_drawTextBox);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'probe4D';\n\nfunction updateLineSample(measurementData) {\n var cornerstone = _externalModules2.default.cornerstone;\n var samples = [];\n\n measurementData.timeSeries.stacks.forEach(function (stack) {\n var loader = void 0;\n\n if (stack.preventCache === true) {\n loader = cornerstone.loadImage(stack.imageIds[measurementData.imageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(stack.imageIds[measurementData.imageIdIndex]);\n }\n\n loader.then(function (image) {\n var offset = Math.round(measurementData.handles.end.x) + Math.round(measurementData.handles.end.y) * image.width;\n var sample = image.getPixelData()[offset];\n\n samples.push(sample);\n });\n });\n measurementData.lineSample.set(samples);\n}\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement(mouseEventData) {\n var timeSeriestoolData = (0, _toolState.getToolState)(mouseEventData.element, 'timeSeries');\n\n if (timeSeriestoolData === undefined || timeSeriestoolData.data === undefined || timeSeriestoolData.data.length === 0) {\n return;\n }\n\n var timeSeries = timeSeriestoolData.data[0];\n\n // Create the measurement data for this tool with the end handle activated\n var measurementData = {\n timeSeries: timeSeries,\n lineSample: new _lineSampleMeasurement2.default(),\n imageIdIndex: timeSeries.stacks[timeSeries.currentStackIndex].currentImageIdIndex,\n visible: true,\n handles: {\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n }\n }\n };\n\n updateLineSample(measurementData);\n _measurementManager2.default.add(measurementData);\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\n// /////// BEGIN IMAGE RENDERING ///////\n\nfunction onImageRendered(e) {\n var cornerstone = _externalModules2.default.cornerstone;\n var eventData = e.detail;\n // If we have no toolData for this element, return immediately as there is nothing to do\n var toolData = (0, _toolState.getToolState)(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n // We have tool data for this element - iterate over each one and draw it\n var context = eventData.canvasContext;\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n var color = 'white';\n var font = _textStyle2.default.getFont();\n\n for (var i = 0; i < toolData.data.length; i++) {\n context.save();\n var data = toolData.data[i];\n\n // Draw the handles\n context.beginPath();\n (0, _drawHandles2.default)(context, eventData, data.handles, color);\n context.stroke();\n\n context.font = font;\n\n var coords = {\n // Translate the x/y away from the cursor\n x: data.handles.end.x + 3,\n y: data.handles.end.y - 3\n };\n\n var textCoords = cornerstone.pixelToCanvas(eventData.element, coords);\n\n context.fillStyle = color;\n\n (0, _drawTextBox2.default)(context, data.handles.end.x + ', ' + data.handles.end.y, textCoords.x, textCoords.y, color);\n\n context.restore();\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nvar probeTool4D = (0, _mouseButtonTool2.default)({\n createNewMeasurement: createNewMeasurement,\n onImageRendered: onImageRendered,\n toolType: toolType\n});\n\nexports.default = probeTool4D;\n\n/***/ }),\n/* 67 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _triggerEvent = __webpack_require__(5);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// This object manages a collection of measurements\nfunction MeasurementManager() {\n var cornerstone = _externalModules2.default.cornerstone;\n var that = this;\n\n that.measurements = [];\n\n // Adds an element as both a source and a target\n this.add = function (measurement) {\n var index = that.measurements.push(measurement);\n // Fire event\n var eventDetail = {\n index: index,\n measurement: measurement\n };\n\n (0, _triggerEvent2.default)(cornerstone.events, _events2.default.MEASUREMENT_ADDED, eventDetail);\n };\n\n this.remove = function (index) {\n var measurement = that.measurements[index];\n\n that.measurements.splice(index, 1);\n // Fire event\n var eventDetail = {\n index: index,\n measurement: measurement\n };\n\n (0, _triggerEvent2.default)(cornerstone.events, _events2.default.MEASUREMENT_REMOVED, eventDetail);\n };\n}\n\n// Module/private exports\nvar manager = new MeasurementManager();\n\nexports.default = manager;\n\n/***/ }),\n/* 68 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function () {\n var cornerstone = _externalModules2.default.cornerstone;\n var that = this;\n\n that.samples = [];\n\n this.set = function (samples) {\n that.samples = samples;\n // Fire event\n (0, _triggerEvent2.default)(cornerstone.events, _events2.default.LINE_SAMPLE_UPDATED);\n };\n};\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _triggerEvent = __webpack_require__(5);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 69 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _toolState = __webpack_require__(2);\n\nvar _incrementTimePoint = __webpack_require__(39);\n\nvar _incrementTimePoint2 = _interopRequireDefault(_incrementTimePoint);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'timeSeriesPlayer';\n\n/**\n * Starts playing a clip of different time series of the same image or adjusts the frame rate of an\n * already playing clip. framesPerSecond is optional and defaults to 30 if not specified. A negative\n * framesPerSecond will play the clip in reverse.\n * The element must have time series\n * @param element\n * @param framesPerSecond\n */\nfunction playClip(element, framesPerSecond) {\n if (element === undefined) {\n throw new Error('playClip: element must not be undefined');\n }\n\n if (framesPerSecond === undefined) {\n framesPerSecond = 30;\n }\n\n var timeSeriesToolData = (0, _toolState.getToolState)(element, 'timeSeries');\n\n if (timeSeriesToolData === undefined || timeSeriesToolData.data === undefined || timeSeriesToolData.data.length === 0) {\n return;\n }\n\n var playClipToolData = (0, _toolState.getToolState)(element, toolType);\n var playClipData = void 0;\n\n if (playClipToolData === undefined || playClipToolData.data.length === 0) {\n playClipData = {\n intervalId: undefined,\n framesPerSecond: framesPerSecond,\n lastFrameTimeStamp: undefined,\n frameRate: 0\n };\n (0, _toolState.addToolState)(element, toolType, playClipData);\n } else {\n playClipData = playClipToolData.data[0];\n playClipData.framesPerSecond = framesPerSecond;\n }\n\n // If already playing, do not set a new interval\n if (playClipData.intervalId !== undefined) {\n return;\n }\n\n playClipData.intervalId = setInterval(function () {\n if (playClipData.framesPerSecond > 0) {\n (0, _incrementTimePoint2.default)(element, 1, true);\n } else {\n (0, _incrementTimePoint2.default)(element, -1, true);\n }\n }, 1000 / Math.abs(playClipData.framesPerSecond));\n}\n\n/**\n * Stops an already playing clip.\n * * @param element\n */\nfunction stopClip(element) {\n var playClipToolData = (0, _toolState.getToolState)(element, toolType);\n\n if (!playClipToolData || !playClipToolData.data || !playClipToolData.data.length) {\n return;\n }\n var playClipData = playClipToolData.data[0];\n\n clearInterval(playClipData.intervalId);\n playClipData.intervalId = undefined;\n}\n\n// Module/private exports\nvar timeSeriesPlayer = {\n start: playClip,\n stop: stopClip\n};\n\nexports.default = timeSeriesPlayer;\n\n/***/ }),\n/* 70 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.timeSeriesScrollTouchDrag = exports.timeSeriesScrollWheel = exports.timeSeriesScroll = undefined;\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _simpleMouseButtonTool = __webpack_require__(16);\n\nvar _simpleMouseButtonTool2 = _interopRequireDefault(_simpleMouseButtonTool);\n\nvar _touchDragTool = __webpack_require__(15);\n\nvar _touchDragTool2 = _interopRequireDefault(_touchDragTool);\n\nvar _mouseWheelTool = __webpack_require__(25);\n\nvar _mouseWheelTool2 = _interopRequireDefault(_mouseWheelTool);\n\nvar _incrementTimePoint = __webpack_require__(39);\n\nvar _incrementTimePoint2 = _interopRequireDefault(_incrementTimePoint);\n\nvar _isMouseButtonEnabled = __webpack_require__(4);\n\nvar _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled);\n\nvar _toolState = __webpack_require__(2);\n\nvar _toolOptions = __webpack_require__(3);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'timeSeriesScroll';\n\nfunction mouseUpCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n\n element.removeEventListener(_events2.default.MOUSE_DRAG, mouseDragCallback);\n element.removeEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback);\n}\n\nfunction mouseDownCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n var options = (0, _toolOptions.getToolOptions)(toolType, element);\n\n if ((0, _isMouseButtonEnabled2.default)(eventData.which, options.mouseButtonMask)) {\n options.deltaY = 0;\n\n (0, _toolOptions.setToolOptions)(toolType, element, options);\n\n element.addEventListener(_events2.default.MOUSE_DRAG, mouseDragCallback);\n element.addEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n element.addEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback);\n e.stopImmediatePropagation();\n\n return false;\n }\n}\n\nfunction mouseDragCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n\n e.data.deltaY += eventData.deltaPoints.page.y;\n\n var toolData = (0, _toolState.getToolState)(eventData.element, 'timeSeries');\n\n if (toolData === undefined || toolData.data === undefined || toolData.data.length === 0) {\n return;\n }\n\n var timeSeriesData = toolData.data[0];\n\n var pixelsPerTimeSeries = element.offsetHeight / timeSeriesData.stacks.length;\n\n if (e.data.options !== undefined && e.data.options.timeSeriesScrollSpeed !== undefined) {\n pixelsPerTimeSeries = e.data.options.timeSeriesScrollSpeed;\n }\n\n if (e.data.deltaY >= pixelsPerTimeSeries || e.data.deltaY <= -pixelsPerTimeSeries) {\n var timeSeriesDelta = Math.round(e.data.deltaY / pixelsPerTimeSeries);\n var timeSeriesDeltaMod = e.data.deltaY % pixelsPerTimeSeries;\n\n (0, _incrementTimePoint2.default)(eventData.element, timeSeriesDelta);\n e.data.deltaY = timeSeriesDeltaMod;\n }\n\n return false;\n}\n\nfunction mouseWheelCallback(e) {\n var eventData = e.detail;\n var images = -eventData.direction;\n\n (0, _incrementTimePoint2.default)(eventData.element, images);\n}\n\nfunction dragCallback(e) {\n var mouseMoveData = e.originalEvent.detail;\n var eventData = {\n deltaY: 0\n };\n\n eventData.deltaY += mouseMoveData.deltaPoints.page.y;\n\n var toolData = (0, _toolState.getToolState)(mouseMoveData.element, 'stack');\n\n if (toolData === undefined || toolData.data === undefined || toolData.data.length === 0) {\n return;\n }\n\n if (eventData.deltaY >= 3 || eventData.deltaY <= -3) {\n var timeSeriesDelta = eventData.deltaY / 3;\n var timeSeriesDeltaMod = eventData.deltaY % 3;\n\n (0, _incrementTimePoint2.default)(eventData.element, timeSeriesDelta);\n eventData.deltaY = timeSeriesDeltaMod;\n }\n\n return false;\n}\n\n// Module/private exports\nvar timeSeriesScroll = (0, _simpleMouseButtonTool2.default)(mouseDownCallback, toolType);\nvar timeSeriesScrollWheel = (0, _mouseWheelTool2.default)(mouseWheelCallback);\nvar timeSeriesScrollTouchDrag = (0, _touchDragTool2.default)(dragCallback);\n\nexports.timeSeriesScroll = timeSeriesScroll;\nexports.timeSeriesScrollWheel = timeSeriesScrollWheel;\nexports.timeSeriesScrollTouchDrag = timeSeriesScrollTouchDrag;\n\n/***/ }),\n/* 71 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (synchronizer, sourceElement, targetElement) {\n\n // Ignore the case where the source and target are the same enabled element\n if (targetElement === sourceElement) {\n return;\n }\n\n var cornerstone = _externalModules2.default.cornerstone;\n // Get the source and target viewports\n var sourceViewport = cornerstone.getViewport(sourceElement);\n var targetViewport = cornerstone.getViewport(targetElement);\n\n // Do nothing if the ww/wc already match\n if (targetViewport.voi.windowWidth === sourceViewport.voi.windowWidth && targetViewport.voi.windowCenter === sourceViewport.voi.windowCenter && targetViewport.invert === sourceViewport.invert) {\n return;\n }\n\n // Www/wc are different, sync them\n targetViewport.voi.windowWidth = sourceViewport.voi.windowWidth;\n targetViewport.voi.windowCenter = sourceViewport.voi.windowCenter;\n targetViewport.invert = sourceViewport.invert;\n synchronizer.setViewport(targetElement, targetViewport);\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 72 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (synchronizer, sourceElement, targetElement) {\n\n // Ignore the case where the source and target are the same enabled element\n if (targetElement === sourceElement) {\n return;\n }\n\n _externalModules2.default.cornerstone.updateImage(targetElement);\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 73 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _convertToVector = __webpack_require__(17);\n\nvar _convertToVector2 = _interopRequireDefault(_convertToVector);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction unique(array) {\n return array.filter(function (value, index, self) {\n return self.indexOf(value) === index;\n });\n}\n\n// This object is responsible for synchronizing target elements when an event fires on a source\n// Element\nfunction Synchronizer(event, handler) {\n var cornerstone = _externalModules2.default.cornerstone;\n var that = this;\n var sourceElements = []; // Source elements fire the events we want to synchronize to\n var targetElements = []; // Target elements we want to synchronize to source elements\n\n var ignoreFiredEvents = false;\n var initialData = {};\n var eventHandler = handler;\n\n this.setHandler = function (handler) {\n eventHandler = handler;\n };\n\n this.getHandler = function () {\n return eventHandler;\n };\n\n this.getDistances = function () {\n if (!sourceElements.length || !targetElements.length) {\n return;\n }\n\n initialData.distances = {};\n initialData.imageIds = {\n sourceElements: [],\n targetElements: []\n };\n\n sourceElements.forEach(function (sourceElement) {\n var sourceEnabledElement = cornerstone.getEnabledElement(sourceElement);\n\n if (!sourceEnabledElement || !sourceEnabledElement.image) {\n return;\n }\n\n var sourceImageId = sourceEnabledElement.image.imageId;\n var sourceImagePlane = cornerstone.metaData.get('imagePlaneModule', sourceImageId);\n\n if (!sourceImagePlane || !sourceImagePlane.imagePositionPatient) {\n return;\n }\n\n var sourceImagePosition = (0, _convertToVector2.default)(sourceImagePlane.imagePositionPatient);\n\n if (initialData.hasOwnProperty(sourceEnabledElement)) {\n return;\n }\n initialData.distances[sourceImageId] = {};\n\n initialData.imageIds.sourceElements.push(sourceImageId);\n\n targetElements.forEach(function (targetElement) {\n var targetEnabledElement = cornerstone.getEnabledElement(targetElement);\n\n if (!targetEnabledElement || !targetEnabledElement.image) {\n return;\n }\n\n var targetImageId = targetEnabledElement.image.imageId;\n\n initialData.imageIds.targetElements.push(targetImageId);\n\n if (sourceElement === targetElement) {\n return;\n }\n\n if (sourceImageId === targetImageId) {\n return;\n }\n\n if (initialData.distances[sourceImageId].hasOwnProperty(targetImageId)) {\n return;\n }\n\n var targetImagePlane = cornerstone.metaData.get('imagePlaneModule', targetImageId);\n\n if (!targetImagePlane || !targetImagePlane.imagePositionPatient) {\n return;\n }\n\n var targetImagePosition = (0, _convertToVector2.default)(targetImagePlane.imagePositionPatient);\n\n initialData.distances[sourceImageId][targetImageId] = targetImagePosition.clone().sub(sourceImagePosition);\n });\n\n if (!Object.keys(initialData.distances[sourceImageId]).length) {\n delete initialData.distances[sourceImageId];\n }\n });\n };\n\n function fireEvent(sourceElement, eventData) {\n // Broadcast an event that something changed\n if (!sourceElements.length || !targetElements.length) {\n return;\n }\n\n ignoreFiredEvents = true;\n targetElements.forEach(function (targetElement) {\n var targetIndex = targetElements.indexOf(targetElement);\n\n if (targetIndex === -1) {\n return;\n }\n\n var targetImageId = initialData.imageIds.targetElements[targetIndex];\n var sourceIndex = sourceElements.indexOf(sourceElement);\n\n if (sourceIndex === -1) {\n return;\n }\n\n var sourceImageId = initialData.imageIds.sourceElements[sourceIndex];\n\n var positionDifference = void 0;\n\n if (sourceImageId === targetImageId) {\n positionDifference = 0;\n } else if (initialData.distances[sourceImageId] !== undefined) {\n positionDifference = initialData.distances[sourceImageId][targetImageId];\n }\n\n eventHandler(that, sourceElement, targetElement, eventData, positionDifference);\n });\n ignoreFiredEvents = false;\n }\n\n function onEvent(e) {\n var eventData = e.detail;\n\n if (ignoreFiredEvents === true) {\n return;\n }\n\n fireEvent(e.currentTarget, eventData);\n }\n\n // Adds an element as a source\n this.addSource = function (element) {\n // Return if this element was previously added\n var index = sourceElements.indexOf(element);\n\n if (index !== -1) {\n return;\n }\n\n // Add to our list of enabled elements\n sourceElements.push(element);\n\n // Subscribe to the event\n element.addEventListener(event, onEvent);\n\n // Update the initial distances between elements\n that.getDistances();\n\n that.updateDisableHandlers();\n };\n\n // Adds an element as a target\n this.addTarget = function (element) {\n // Return if this element was previously added\n var index = targetElements.indexOf(element);\n\n if (index !== -1) {\n return;\n }\n\n // Add to our list of enabled elements\n targetElements.push(element);\n\n // Update the initial distances between elements\n that.getDistances();\n\n // Invoke the handler for this new target element\n eventHandler(that, element, element, 0);\n\n that.updateDisableHandlers();\n };\n\n // Adds an element as both a source and a target\n this.add = function (element) {\n that.addSource(element);\n that.addTarget(element);\n };\n\n // Removes an element as a source\n this.removeSource = function (element) {\n // Find the index of this element\n var index = sourceElements.indexOf(element);\n\n if (index === -1) {\n return;\n }\n\n // Remove this element from the array\n sourceElements.splice(index, 1);\n\n // Stop listening for the event\n element.removeEventListener(event, onEvent);\n\n // Update the initial distances between elements\n that.getDistances();\n\n // Update everyone listening for events\n fireEvent(element);\n that.updateDisableHandlers();\n };\n\n // Removes an element as a target\n this.removeTarget = function (element) {\n // Find the index of this element\n var index = targetElements.indexOf(element);\n\n if (index === -1) {\n return;\n }\n\n // Remove this element from the array\n targetElements.splice(index, 1);\n\n // Update the initial distances between elements\n that.getDistances();\n\n // Invoke the handler for the removed target\n eventHandler(that, element, element, 0);\n that.updateDisableHandlers();\n };\n\n // Removes an element as both a source and target\n this.remove = function (element) {\n that.removeTarget(element);\n that.removeSource(element);\n };\n\n // Returns the source elements\n this.getSourceElements = function () {\n return sourceElements;\n };\n\n // Returns the target elements\n this.getTargetElements = function () {\n return targetElements;\n };\n\n this.displayImage = function (element, image, viewport) {\n ignoreFiredEvents = true;\n cornerstone.displayImage(element, image, viewport);\n ignoreFiredEvents = false;\n };\n\n this.setViewport = function (element, viewport) {\n ignoreFiredEvents = true;\n cornerstone.setViewport(element, viewport);\n ignoreFiredEvents = false;\n };\n\n function disableHandler(e) {\n var element = e.detail.element;\n\n that.remove(element);\n }\n\n this.updateDisableHandlers = function () {\n var elements = unique(sourceElements.concat(targetElements));\n\n elements.forEach(function (element) {\n element.removeEventListener(_events2.default.ELEMENT_DISABLED, disableHandler);\n element.addEventListener(_events2.default.ELEMENT_DISABLED, disableHandler);\n });\n };\n\n this.destroy = function () {\n var elements = unique(sourceElements.concat(targetElements));\n\n elements.forEach(function (element) {\n that.remove(element);\n });\n };\n}\n\nexports.default = Synchronizer;\n\n/***/ }),\n/* 74 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (synchronizer, sourceElement, targetElement, eventData) {\n // If the target and source are the same, stop\n if (sourceElement === targetElement) {\n return;\n }\n\n // If there is no event, or direction is 0, stop\n if (!eventData || !eventData.direction) {\n return;\n }\n\n var cornerstone = _externalModules2.default.cornerstone;\n // Get the stack of the target viewport\n var stackToolDataSource = (0, _toolState.getToolState)(targetElement, 'stack');\n var stackData = stackToolDataSource.data[0];\n\n // Get the new index for the stack\n var newImageIdIndex = stackData.currentImageIdIndex + eventData.direction;\n\n // Ensure the index does not exceed the bounds of the stack\n newImageIdIndex = Math.min(Math.max(newImageIdIndex, 0), stackData.imageIds.length - 1);\n\n // If the index has not changed, stop here\n if (stackData.currentImageIdIndex === newImageIdIndex) {\n return;\n }\n\n var startLoadingHandler = _loadHandlerManager2.default.getStartLoadHandler();\n var endLoadingHandler = _loadHandlerManager2.default.getEndLoadHandler();\n var errorLoadingHandler = _loadHandlerManager2.default.getErrorLoadingHandler();\n\n if (startLoadingHandler) {\n startLoadingHandler(targetElement);\n }\n\n var loader = void 0;\n\n if (stackData.preventCache === true) {\n loader = cornerstone.loadImage(stackData.imageIds[newImageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(stackData.imageIds[newImageIdIndex]);\n }\n\n loader.then(function (image) {\n var viewport = cornerstone.getViewport(targetElement);\n\n stackData.currentImageIdIndex = newImageIdIndex;\n synchronizer.displayImage(targetElement, image, viewport);\n if (endLoadingHandler) {\n endLoadingHandler(targetElement, image);\n }\n }, function (error) {\n var imageId = stackData.imageIds[newImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(targetElement, imageId, error);\n }\n });\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _toolState = __webpack_require__(2);\n\nvar _loadHandlerManager = __webpack_require__(12);\n\nvar _loadHandlerManager2 = _interopRequireDefault(_loadHandlerManager);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 75 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (synchronizer, sourceElement, targetElement) {\n\n // Ignore the case where the source and target are the same enabled element\n if (targetElement === sourceElement) {\n return;\n }\n\n var cornerstone = _externalModules2.default.cornerstone;\n var sourceImage = cornerstone.getEnabledElement(sourceElement).image;\n var sourceImagePlane = cornerstone.metaData.get('imagePlaneModule', sourceImage.imageId);\n\n if (sourceImagePlane === undefined || sourceImagePlane.imagePositionPatient === undefined) {\n // Console.log('No position found for image ' + sourceImage.imageId);\n\n return;\n }\n\n var sourceImagePosition = (0, _convertToVector2.default)(sourceImagePlane.imagePositionPatient);\n var stackToolDataSource = (0, _toolState.getToolState)(targetElement, 'stack');\n var stackData = stackToolDataSource.data[0];\n\n var minDistance = Number.MAX_VALUE;\n var newImageIdIndex = -1;\n\n stackData.imageIds.forEach(function (imageId, index) {\n var imagePlane = cornerstone.metaData.get('imagePlaneModule', imageId);\n\n if (imagePlane === undefined || imagePlane.imagePositionPatient === undefined) {\n // Console.log('No position found for image ' + imageId);\n\n return;\n }\n\n var imagePosition = (0, _convertToVector2.default)(imagePlane.imagePositionPatient);\n var distance = imagePosition.distanceToSquared(sourceImagePosition);\n // Console.log(index + '=' + distance);\n\n if (distance < minDistance) {\n minDistance = distance;\n newImageIdIndex = index;\n }\n });\n\n if (newImageIdIndex === stackData.currentImageIdIndex) {\n return;\n }\n\n var startLoadingHandler = _loadHandlerManager2.default.getStartLoadHandler();\n var endLoadingHandler = _loadHandlerManager2.default.getEndLoadHandler();\n var errorLoadingHandler = _loadHandlerManager2.default.getErrorLoadingHandler();\n\n if (startLoadingHandler) {\n startLoadingHandler(targetElement);\n }\n\n if (newImageIdIndex !== -1) {\n var loader = void 0;\n\n if (stackData.preventCache === true) {\n loader = cornerstone.loadImage(stackData.imageIds[newImageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(stackData.imageIds[newImageIdIndex]);\n }\n\n loader.then(function (image) {\n var viewport = cornerstone.getViewport(targetElement);\n\n stackData.currentImageIdIndex = newImageIdIndex;\n synchronizer.displayImage(targetElement, image, viewport);\n if (endLoadingHandler) {\n endLoadingHandler(targetElement, image);\n }\n }, function (error) {\n var imageId = stackData.imageIds[newImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(targetElement, imageId, error);\n }\n });\n }\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _toolState = __webpack_require__(2);\n\nvar _loadHandlerManager = __webpack_require__(12);\n\nvar _loadHandlerManager2 = _interopRequireDefault(_loadHandlerManager);\n\nvar _convertToVector = __webpack_require__(17);\n\nvar _convertToVector2 = _interopRequireDefault(_convertToVector);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 76 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (synchronizer, sourceElement, targetElement, eventData, positionDifference) {\n\n // Ignore the case where the source and target are the same enabled element\n if (targetElement === sourceElement) {\n return;\n }\n\n var cornerstone = _externalModules2.default.cornerstone;\n var sourceEnabledElement = cornerstone.getEnabledElement(sourceElement);\n var sourceImagePlane = cornerstone.metaData.get('imagePlaneModule', sourceEnabledElement.image.imageId);\n var sourceImagePosition = (0, _convertToVector2.default)(sourceImagePlane.imagePositionPatient);\n\n var stackToolDataSource = (0, _toolState.getToolState)(targetElement, 'stack');\n var stackData = stackToolDataSource.data[0];\n\n var minDistance = Number.MAX_VALUE;\n var newImageIdIndex = -1;\n\n if (!positionDifference) {\n return;\n }\n\n var finalPosition = sourceImagePosition.clone().add(positionDifference);\n\n stackData.imageIds.forEach(function (imageId, index) {\n var imagePlane = cornerstone.metaData.get('imagePlaneModule', imageId);\n var imagePosition = (0, _convertToVector2.default)(imagePlane.imagePositionPatient);\n var distance = finalPosition.distanceToSquared(imagePosition);\n\n if (distance < minDistance) {\n minDistance = distance;\n newImageIdIndex = index;\n }\n });\n\n if (newImageIdIndex === stackData.currentImageIdIndex || newImageIdIndex === -1) {\n return;\n }\n\n var startLoadingHandler = _loadHandlerManager2.default.getStartLoadHandler();\n var endLoadingHandler = _loadHandlerManager2.default.getEndLoadHandler();\n var errorLoadingHandler = _loadHandlerManager2.default.getErrorLoadingHandler();\n\n if (startLoadingHandler) {\n startLoadingHandler(targetElement);\n }\n\n var loader = void 0;\n\n if (stackData.preventCache === true) {\n loader = cornerstone.loadImage(stackData.imageIds[newImageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(stackData.imageIds[newImageIdIndex]);\n }\n\n loader.then(function (image) {\n var viewport = cornerstone.getViewport(targetElement);\n\n stackData.currentImageIdIndex = newImageIdIndex;\n synchronizer.displayImage(targetElement, image, viewport);\n if (endLoadingHandler) {\n endLoadingHandler(targetElement, image);\n }\n }, function (error) {\n var imageId = stackData.imageIds[newImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(targetElement, imageId, error);\n }\n });\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _toolState = __webpack_require__(2);\n\nvar _loadHandlerManager = __webpack_require__(12);\n\nvar _loadHandlerManager2 = _interopRequireDefault(_loadHandlerManager);\n\nvar _convertToVector = __webpack_require__(17);\n\nvar _convertToVector2 = _interopRequireDefault(_convertToVector);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 77 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (synchronizer, sourceElement, targetElement) {\n\n // Ignore the case where the source and target are the same enabled element\n if (targetElement === sourceElement) {\n return;\n }\n\n var cornerstone = _externalModules2.default.cornerstone;\n var sourceStackToolDataSource = (0, _toolState.getToolState)(sourceElement, 'stack');\n var sourceStackData = sourceStackToolDataSource.data[0];\n var targetStackToolDataSource = (0, _toolState.getToolState)(targetElement, 'stack');\n var targetStackData = targetStackToolDataSource.data[0];\n\n var newImageIdIndex = sourceStackData.currentImageIdIndex;\n\n // Clamp the index\n newImageIdIndex = Math.min(Math.max(newImageIdIndex, 0), targetStackData.imageIds.length - 1);\n\n // Do nothing if the index has not changed\n if (newImageIdIndex === targetStackData.currentImageIdIndex) {\n return;\n }\n\n var startLoadingHandler = _loadHandlerManager2.default.getStartLoadHandler();\n var endLoadingHandler = _loadHandlerManager2.default.getEndLoadHandler();\n var errorLoadingHandler = _loadHandlerManager2.default.getErrorLoadingHandler();\n\n if (startLoadingHandler) {\n startLoadingHandler(targetElement);\n }\n\n var loader = void 0;\n\n if (targetStackData.preventCache === true) {\n loader = cornerstone.loadImage(targetStackData.imageIds[newImageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(targetStackData.imageIds[newImageIdIndex]);\n }\n\n loader.then(function (image) {\n var viewport = cornerstone.getViewport(targetElement);\n\n targetStackData.currentImageIdIndex = newImageIdIndex;\n synchronizer.displayImage(targetElement, image, viewport);\n if (endLoadingHandler) {\n endLoadingHandler(targetElement, image);\n }\n }, function (error) {\n var imageId = targetStackData.imageIds[newImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(targetElement, imageId, error);\n }\n });\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _toolState = __webpack_require__(2);\n\nvar _loadHandlerManager = __webpack_require__(12);\n\nvar _loadHandlerManager2 = _interopRequireDefault(_loadHandlerManager);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 78 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (synchronizer, sourceElement, targetElement) {\n\n // Ignore the case where the source and target are the same enabled element\n if (targetElement === sourceElement) {\n return;\n }\n\n var cornerstone = _externalModules2.default.cornerstone;\n // Get the source and target viewports\n var sourceViewport = cornerstone.getViewport(sourceElement);\n var targetViewport = cornerstone.getViewport(targetElement);\n\n // Do nothing if the scale and translation are the same\n if (targetViewport.scale === sourceViewport.scale && targetViewport.translation.x === sourceViewport.translation.x && targetViewport.translation.y === sourceViewport.translation.y) {\n return;\n }\n\n // Scale and/or translation are different, sync them\n targetViewport.scale = sourceViewport.scale;\n targetViewport.translation.x = sourceViewport.translation.x;\n targetViewport.translation.y = sourceViewport.translation.y;\n synchronizer.setViewport(targetElement, targetViewport);\n};\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/***/ }),\n/* 79 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.newTimeSeriesSpecificToolStateManager = exports.addTimeSeriesStateManager = undefined;\n\nvar _imageIdSpecificStateManager = __webpack_require__(18);\n\nvar _toolState = __webpack_require__(2);\n\n// This implements an Stack specific tool state management strategy. This means\n// That tool data is shared between all imageIds in a given stack\nfunction newTimeSeriesSpecificToolStateManager(toolTypes, oldStateManager) {\n var toolState = {};\n\n // Here we add tool state, this is done by tools as well\n // As modules that restore saved state\n function addStackSpecificToolState(element, toolType, data) {\n // If this is a tool type to apply to the stack, do so\n if (toolTypes.indexOf(toolType) >= 0) {\n\n // If we don't have tool state for this type of tool, add an empty object\n if (toolState.hasOwnProperty(toolType) === false) {\n toolState[toolType] = {\n data: []\n };\n }\n\n var toolData = toolState[toolType];\n\n // Finally, add this new tool to the state\n toolData.data.push(data);\n } else {\n // Call the imageId specific tool state manager\n return oldStateManager.add(element, toolType, data);\n }\n }\n\n // Here you can get state - used by tools as well as modules\n // That save state persistently\n function getStackSpecificToolState(element, toolType) {\n // If this is a tool type to apply to the stack, do so\n if (toolTypes.indexOf(toolType) >= 0) {\n // If we don't have tool state for this type of tool, add an empty object\n if (toolState.hasOwnProperty(toolType) === false) {\n toolState[toolType] = {\n data: []\n };\n }\n\n return toolState[toolType];\n }\n\n // Call the imageId specific tool state manager\n return oldStateManager.get(element, toolType);\n }\n\n var imageIdToolStateManager = {\n get: getStackSpecificToolState,\n add: addStackSpecificToolState\n };\n\n return imageIdToolStateManager;\n}\n\nvar timeSeriesStateManagers = [];\n\nfunction addTimeSeriesStateManager(element, tools) {\n tools = tools || ['timeSeries'];\n var oldStateManager = (0, _toolState.getElementToolStateManager)(element);\n\n if (oldStateManager === undefined) {\n oldStateManager = _imageIdSpecificStateManager.globalImageIdSpecificToolStateManager;\n }\n\n var timeSeriesSpecificStateManager = newTimeSeriesSpecificToolStateManager(tools, oldStateManager);\n\n timeSeriesStateManagers.push(timeSeriesSpecificStateManager);\n (0, _toolState.setElementToolStateManager)(element, timeSeriesSpecificStateManager);\n}\n\nexports.addTimeSeriesStateManager = addTimeSeriesStateManager;\nexports.newTimeSeriesSpecificToolStateManager = newTimeSeriesSpecificToolStateManager;\n\n/***/ }),\n/* 80 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.addStackStateManager = exports.newStackSpecificToolStateManager = exports.stackSpecificStateManager = undefined;\n\nvar _imageIdSpecificStateManager = __webpack_require__(18);\n\nvar _toolState = __webpack_require__(2);\n\n// This implements an Stack specific tool state management strategy. This means\n// That tool data is shared between all imageIds in a given stack\nfunction newStackSpecificToolStateManager(toolTypes, oldStateManager) {\n var toolState = {};\n\n function saveToolState() {\n return toolState;\n }\n\n function restoreToolState(stackToolState) {\n toolState = stackToolState;\n }\n\n // Here we add tool state, this is done by tools as well\n // As modules that restore saved state\n function addStackSpecificToolState(element, toolType, data) {\n // If this is a tool type to apply to the stack, do so\n if (toolTypes.indexOf(toolType) >= 0) {\n\n // If we don't have tool state for this type of tool, add an empty object\n if (toolState.hasOwnProperty(toolType) === false) {\n toolState[toolType] = {\n data: []\n };\n }\n\n var toolData = toolState[toolType];\n\n // Finally, add this new tool to the state\n toolData.data.push(data);\n } else {\n // Call the imageId specific tool state manager\n return oldStateManager.add(element, toolType, data);\n }\n }\n\n // Here you can get state - used by tools as well as modules\n // That save state persistently\n function getStackSpecificToolState(element, toolType) {\n // If this is a tool type to apply to the stack, do so\n if (toolTypes.indexOf(toolType) >= 0) {\n // If we don't have tool state for this type of tool, add an empty object\n if (toolState.hasOwnProperty(toolType) === false) {\n toolState[toolType] = {\n data: []\n };\n }\n\n return toolState[toolType];\n }\n\n // Call the imageId specific tool state manager\n return oldStateManager.get(element, toolType);\n }\n\n var stackSpecificToolStateManager = {\n get: getStackSpecificToolState,\n add: addStackSpecificToolState,\n saveToolState: saveToolState,\n restoreToolState: restoreToolState,\n toolState: toolState\n };\n\n return stackSpecificToolStateManager;\n}\n\nvar stackStateManagers = [];\n\nfunction addStackStateManager(element, otherTools) {\n var oldStateManager = (0, _toolState.getElementToolStateManager)(element);\n\n if (!oldStateManager) {\n oldStateManager = _imageIdSpecificStateManager.globalImageIdSpecificToolStateManager;\n }\n\n var stackTools = ['stack', 'stackPrefetch', 'playClip', 'volume', 'slab', 'referenceLines', 'crosshairs', 'stackRenderer'];\n\n if (otherTools) {\n stackTools = stackTools.concat(otherTools);\n }\n\n var stackSpecificStateManager = newStackSpecificToolStateManager(stackTools, oldStateManager);\n\n stackStateManagers.push(stackSpecificStateManager);\n (0, _toolState.setElementToolStateManager)(element, stackSpecificStateManager);\n}\n\nvar stackSpecificStateManager = {\n newStackSpecificToolStateManager: newStackSpecificToolStateManager,\n addStackStateManager: addStackStateManager\n};\n\nexports.stackSpecificStateManager = stackSpecificStateManager;\nexports.newStackSpecificToolStateManager = newStackSpecificToolStateManager;\nexports.addStackStateManager = addStackStateManager;\n\n/***/ }),\n/* 81 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n// This implements a frame-of-reference specific tool state management strategy. This means that\n// Measurement data are tied to a specific frame of reference UID and only visible to objects using\n// That frame-of-reference UID\n\nfunction newFrameOfReferenceSpecificToolStateManager() {\n var toolState = {};\n\n // Here we add tool state, this is done by tools as well\n // As modules that restore saved state\n function addFrameOfReferenceSpecificToolState(frameOfReference, toolType, data) {\n // If we don't have any tool state for this frameOfReference, add an empty object\n if (toolState.hasOwnProperty(frameOfReference) === false) {\n toolState[frameOfReference] = {};\n }\n\n var frameOfReferenceToolState = toolState[frameOfReference];\n\n // If we don't have tool state for this type of tool, add an empty object\n if (frameOfReferenceToolState.hasOwnProperty(toolType) === false) {\n frameOfReferenceToolState[toolType] = {\n data: []\n };\n }\n\n var toolData = frameOfReferenceToolState[toolType];\n\n // Finally, add this new tool to the state\n toolData.data.push(data);\n }\n\n // Here you can get state - used by tools as well as modules\n // That save state persistently\n function getFrameOfReferenceSpecificToolState(frameOfReference, toolType) {\n // If we don't have any tool state for this frame of reference, return undefined\n if (toolState.hasOwnProperty(frameOfReference) === false) {\n return;\n }\n\n var frameOfReferenceToolState = toolState[frameOfReference];\n\n // If we don't have tool state for this type of tool, return undefined\n if (frameOfReferenceToolState.hasOwnProperty(toolType) === false) {\n return;\n }\n\n var toolData = frameOfReferenceToolState[toolType];\n\n return toolData;\n }\n\n function removeFrameOfReferenceSpecificToolState(frameOfReference, toolType, data) {\n // If we don't have any tool state for this frame of reference, return undefined\n if (toolState.hasOwnProperty(frameOfReference) === false) {\n return;\n }\n\n var frameOfReferenceToolState = toolState[frameOfReference];\n\n // If we don't have tool state for this type of tool, return undefined\n if (frameOfReferenceToolState.hasOwnProperty(toolType) === false) {\n return;\n }\n\n var toolData = frameOfReferenceToolState[toolType];\n // Find this tool data\n var indexOfData = -1;\n\n for (var i = 0; i < toolData.data.length; i++) {\n if (toolData.data[i] === data) {\n indexOfData = i;\n }\n }\n\n if (indexOfData !== -1) {\n toolData.data.splice(indexOfData, 1);\n }\n }\n\n return {\n get: getFrameOfReferenceSpecificToolState,\n add: addFrameOfReferenceSpecificToolState,\n remove: removeFrameOfReferenceSpecificToolState\n };\n}\n\n// A global frameOfReferenceSpecificToolStateManager - the most common case is to share 3d information\n// Between stacks of images\nvar globalFrameOfReferenceSpecificToolStateManager = newFrameOfReferenceSpecificToolStateManager();\n\nexports.newFrameOfReferenceSpecificToolStateManager = newFrameOfReferenceSpecificToolStateManager;\nexports.globalFrameOfReferenceSpecificToolStateManager = globalFrameOfReferenceSpecificToolStateManager;\n\n/***/ }),\n/* 82 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _imageIdSpecificStateManager = __webpack_require__(18);\n\nvar _toolState = __webpack_require__(2);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction saveApplicationState(elements) {\n // Save imageId-specific tool state data\n var appState = {\n imageIdToolState: _imageIdSpecificStateManager.globalImageIdSpecificToolStateManager.saveToolState(),\n elementToolState: {},\n elementViewport: {}\n };\n\n // For each of the given elements, save the viewport and any stack-specific tool data\n elements.forEach(function (element) {\n var toolStateManager = (0, _toolState.getElementToolStateManager)(element);\n\n if (toolStateManager === _imageIdSpecificStateManager.globalImageIdSpecificToolStateManager) {\n return;\n }\n\n appState.elementToolState[element.id] = toolStateManager.saveToolState();\n\n appState.elementViewport[element.id] = _externalModules2.default.cornerstone.getViewport(element);\n });\n\n return appState;\n}\n\nfunction restoreApplicationState(appState) {\n if (!appState.hasOwnProperty('imageIdToolState') || !appState.hasOwnProperty('elementToolState') || !appState.hasOwnProperty('elementViewport')) {\n return;\n }\n\n var cornerstone = _externalModules2.default.cornerstone;\n\n // Restore all the imageId specific tool data\n _imageIdSpecificStateManager.globalImageIdSpecificToolStateManager.restoreToolState(appState.imageIdToolState);\n\n Object.keys(appState.elementViewport).forEach(function (elementId) {\n // Restore any stack specific tool data\n var element = document.getElementById(elementId);\n\n if (!element) {\n return;\n }\n\n if (!appState.elementToolState.hasOwnProperty(elementId)) {\n return;\n }\n\n var toolStateManager = (0, _toolState.getElementToolStateManager)(element);\n\n if (toolStateManager === _imageIdSpecificStateManager.globalImageIdSpecificToolStateManager) {\n return;\n }\n\n toolStateManager.restoreToolState(appState.elementToolState[elementId]);\n\n // Restore the saved viewport information\n var savedViewport = appState.elementViewport[elementId];\n\n cornerstone.setViewport(element, savedViewport);\n\n // Update the element to apply the viewport and tool changes\n cornerstone.updateImage(element);\n });\n\n return appState;\n}\n\nvar appState = {\n save: saveApplicationState,\n restore: restoreApplicationState\n};\n\nexports.default = appState;\n\n/***/ }),\n/* 83 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _scroll = __webpack_require__(30);\n\nvar _scroll2 = _interopRequireDefault(_scroll);\n\nvar _keyboardTool = __webpack_require__(50);\n\nvar _keyboardTool2 = _interopRequireDefault(_keyboardTool);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar keys = {\n UP: 38,\n DOWN: 40\n};\n\nfunction keyDownCallback(e) {\n var eventData = e.detail;\n var keyCode = eventData.keyCode;\n\n if (keyCode !== keys.UP && keyCode !== keys.DOWN) {\n return;\n }\n\n var images = 1;\n\n if (keyCode === keys.DOWN) {\n images = -1;\n }\n\n (0, _scroll2.default)(eventData.element, images);\n}\n\n// Module/private exports\nvar stackScrollKeyboard = (0, _keyboardTool2.default)(keyDownCallback);\n\nexports.default = stackScrollKeyboard;\n\n/***/ }),\n/* 84 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.stackScrollMultiTouch = exports.stackScrollTouchDrag = exports.stackScrollWheel = exports.stackScroll = undefined;\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _touchDragTool = __webpack_require__(15);\n\nvar _touchDragTool2 = _interopRequireDefault(_touchDragTool);\n\nvar _multiTouchDragTool = __webpack_require__(40);\n\nvar _multiTouchDragTool2 = _interopRequireDefault(_multiTouchDragTool);\n\nvar _simpleMouseButtonTool = __webpack_require__(16);\n\nvar _simpleMouseButtonTool2 = _interopRequireDefault(_simpleMouseButtonTool);\n\nvar _mouseWheelTool = __webpack_require__(25);\n\nvar _mouseWheelTool2 = _interopRequireDefault(_mouseWheelTool);\n\nvar _isMouseButtonEnabled = __webpack_require__(4);\n\nvar _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled);\n\nvar _scroll = __webpack_require__(30);\n\nvar _scroll2 = _interopRequireDefault(_scroll);\n\nvar _toolState = __webpack_require__(2);\n\nvar _toolOptions = __webpack_require__(3);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'stackScroll';\n\nfunction mouseUpCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n\n element.removeEventListener(_events2.default.MOUSE_DRAG, dragCallback);\n element.removeEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback);\n}\n\nfunction mouseDownCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n var options = (0, _toolOptions.getToolOptions)(toolType, element);\n\n if ((0, _isMouseButtonEnabled2.default)(eventData.which, options.mouseButtonMask)) {\n options.deltaY = 0;\n\n (0, _toolOptions.setToolOptions)(toolType, element, options);\n\n element.addEventListener(_events2.default.MOUSE_DRAG, dragCallback);\n element.addEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n element.addEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback);\n e.stopImmediatePropagation();\n\n return false;\n }\n}\n\nfunction mouseWheelCallback(e) {\n var eventData = e.detail;\n var images = -eventData.direction;\n\n var config = stackScroll.getConfiguration();\n\n var loop = false;\n\n if (config && config.loop) {\n loop = config.loop;\n }\n\n (0, _scroll2.default)(eventData.element, images, loop);\n}\n\nfunction dragCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n\n var toolData = (0, _toolState.getToolState)(element, 'stack');\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n var stackData = toolData.data[0];\n\n var config = stackScroll.getConfiguration();\n\n // The Math.max here makes it easier to mouseDrag-scroll small or really large image stacks\n var pixelsPerImage = Math.max(2, element.offsetHeight / Math.max(stackData.imageIds.length, 8));\n\n if (config && config.stackScrollSpeed) {\n pixelsPerImage = config.stackScrollSpeed;\n }\n\n var options = (0, _toolOptions.getToolOptions)(toolType, element);\n var deltaY = options.deltaY || 0;\n\n deltaY += eventData.deltaPoints.page.y;\n\n if (Math.abs(deltaY) >= pixelsPerImage) {\n var imageIdIndexOffset = Math.round(deltaY / pixelsPerImage);\n\n (0, _scroll2.default)(element, imageIdIndexOffset);\n\n options.deltaY = deltaY % pixelsPerImage;\n } else {\n options.deltaY = deltaY;\n }\n\n (0, _toolOptions.setToolOptions)(toolType, element, options);\n\n e.preventDefault();\n e.stopPropagation();\n}\n\n// Module/private exports\nvar stackScroll = (0, _simpleMouseButtonTool2.default)(mouseDownCallback, toolType);\nvar stackScrollWheel = (0, _mouseWheelTool2.default)(mouseWheelCallback);\n\nvar options = {\n eventData: {\n deltaY: 0\n }\n};\nvar stackScrollTouchDrag = (0, _touchDragTool2.default)(dragCallback, toolType, options);\n\nfunction multiTouchDragCallback(e) {\n var eventData = e.detail;\n var config = stackScrollMultiTouch.getConfiguration();\n\n if (config && config.testPointers(eventData)) {\n dragCallback(e);\n }\n}\n\nvar configuration = {\n testPointers: function testPointers(eventData) {\n return eventData.numPointers >= 3;\n }\n};\n\nvar stackScrollMultiTouch = (0, _multiTouchDragTool2.default)(multiTouchDragCallback, options);\n\nstackScrollMultiTouch.setConfiguration(configuration);\n\nexports.stackScroll = stackScroll;\nexports.stackScrollWheel = stackScrollWheel;\nexports.stackScrollTouchDrag = stackScrollTouchDrag;\nexports.stackScrollMultiTouch = stackScrollMultiTouch;\n\n/***/ }),\n/* 85 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _requestPoolManager = __webpack_require__(29);\n\nvar _requestPoolManager2 = _interopRequireDefault(_requestPoolManager);\n\nvar _loadHandlerManager = __webpack_require__(12);\n\nvar _loadHandlerManager2 = _interopRequireDefault(_loadHandlerManager);\n\nvar _toolState = __webpack_require__(2);\n\nvar _getMaxSimultaneousRequests = __webpack_require__(22);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'stackPrefetch';\nvar requestType = 'prefetch';\n\nvar configuration = {\n maxImagesToPrefetch: Infinity\n};\n\nvar resetPrefetchTimeout = void 0;\nvar resetPrefetchDelay = 10;\n\nfunction range(lowEnd, highEnd) {\n // Javascript version of Python's range function\n // http://stackoverflow.com/questions/3895478/does-javascript-have-a-method-like-range-to-generate-an-array-based-on-suppl\n lowEnd = Math.round(lowEnd) || 0;\n highEnd = Math.round(highEnd) || 0;\n\n var arr = [];\n var c = highEnd - lowEnd + 1;\n\n if (c <= 0) {\n return arr;\n }\n\n while (c--) {\n arr[c] = highEnd--;\n }\n\n return arr;\n}\n\nvar max = function max(arr) {\n return Math.max.apply(null, arr);\n};\n\nvar min = function min(arr) {\n return Math.min.apply(null, arr);\n};\n\nfunction nearestIndex(arr, x) {\n // Return index of nearest values in array\n // http://stackoverflow.com/questions/25854212/return-index-of-nearest-values-in-an-array\n var l = [];\n var h = [];\n\n arr.forEach(function (v) {\n if (v < x) {\n l.push(v);\n } else if (v > x) {\n h.push(v);\n }\n });\n\n return {\n low: arr.indexOf(max(l)),\n high: arr.indexOf(min(h))\n };\n}\n\nfunction prefetch(element) {\n // Check to make sure stack data exists\n var stackData = (0, _toolState.getToolState)(element, 'stack');\n\n if (!stackData || !stackData.data || !stackData.data.length) {\n return;\n }\n\n var stack = stackData.data[0];\n\n // Get the stackPrefetch tool data\n var stackPrefetchData = (0, _toolState.getToolState)(element, toolType);\n\n if (!stackPrefetchData) {\n return;\n }\n\n var stackPrefetch = stackPrefetchData.data[0] || {};\n\n // If all the requests are complete, disable the stackPrefetch tool\n if (!stackPrefetch.indicesToRequest || !stackPrefetch.indicesToRequest.length) {\n stackPrefetch.enabled = false;\n }\n\n // Make sure the tool is still enabled\n if (stackPrefetch.enabled === false) {\n return;\n }\n\n // Remove an imageIdIndex from the list of indices to request\n // This fires when the individual image loading deferred is resolved\n function removeFromList(imageIdIndex) {\n var index = stackPrefetch.indicesToRequest.indexOf(imageIdIndex);\n\n if (index > -1) {\n // Don't remove last element if imageIdIndex not found\n stackPrefetch.indicesToRequest.splice(index, 1);\n }\n }\n\n // Remove all already cached images from the\n // IndicesToRequest array\n stackPrefetchData.data[0].indicesToRequest.sort(function (a, b) {\n return a - b;\n });\n var indicesToRequestCopy = stackPrefetch.indicesToRequest.slice();\n\n indicesToRequestCopy.forEach(function (imageIdIndex) {\n var imageId = stack.imageIds[imageIdIndex];\n\n if (!imageId) {\n return;\n }\n\n var imageLoadObject = _externalModules2.default.cornerstone.imageCache.getImageLoadObject(imageId);\n\n if (imageLoadObject) {\n removeFromList(imageIdIndex);\n }\n });\n\n // Stop here if there are no images left to request\n // After those in the cache have been removed\n if (!stackPrefetch.indicesToRequest.length) {\n return;\n }\n\n // Clear the requestPool of prefetch requests\n _requestPoolManager2.default.clearRequestStack(requestType);\n\n // Identify the nearest imageIdIndex to the currentImageIdIndex\n var nearest = nearestIndex(stackPrefetch.indicesToRequest, stack.currentImageIdIndex);\n\n var imageId = void 0;\n var nextImageIdIndex = void 0;\n var preventCache = false;\n\n function doneCallback(image) {\n // Console.log('prefetch done: ' + image.imageId);\n var imageIdIndex = stack.imageIds.indexOf(image.imageId);\n\n removeFromList(imageIdIndex);\n }\n\n // Retrieve the errorLoadingHandler if one exists\n var errorLoadingHandler = _loadHandlerManager2.default.getErrorLoadingHandler();\n\n function failCallback(error) {\n console.log('prefetch errored: ' + error);\n if (errorLoadingHandler) {\n errorLoadingHandler(element, imageId, error, 'stackPrefetch');\n }\n }\n\n // Prefetch images around the current image (before and after)\n var lowerIndex = nearest.low;\n var higherIndex = nearest.high;\n\n while (lowerIndex >= 0 || higherIndex < stackPrefetch.indicesToRequest.length) {\n var currentIndex = stack.currentImageIdIndex;\n var shouldSkipLower = currentIndex - stackPrefetch.indicesToRequest[lowerIndex] > configuration.maxImagesToPrefetch;\n var shouldSkipHigher = stackPrefetch.indicesToRequest[higherIndex] - currentIndex > configuration.maxImagesToPrefetch;\n\n var shouldLoadLower = !shouldSkipLower && lowerIndex >= 0;\n var shouldLoadHigher = !shouldSkipHigher && higherIndex < stackPrefetch.indicesToRequest.length;\n\n if (!shouldLoadHigher && !shouldLoadLower) {\n break;\n }\n\n if (shouldLoadLower) {\n nextImageIdIndex = stackPrefetch.indicesToRequest[lowerIndex--];\n imageId = stack.imageIds[nextImageIdIndex];\n _requestPoolManager2.default.addRequest(element, imageId, requestType, preventCache, doneCallback, failCallback);\n }\n\n if (shouldLoadHigher) {\n nextImageIdIndex = stackPrefetch.indicesToRequest[higherIndex++];\n imageId = stack.imageIds[nextImageIdIndex];\n _requestPoolManager2.default.addRequest(element, imageId, requestType, preventCache, doneCallback, failCallback);\n }\n }\n\n // Try to start the requestPool's grabbing procedure\n // In case it isn't already running\n _requestPoolManager2.default.startGrabbing();\n}\n\nfunction getPromiseRemovedHandler(element) {\n return function (e) {\n var eventData = e.detail;\n\n // When an imagePromise has been pushed out of the cache, re-add its index\n // It to the indicesToRequest list so that it will be retrieved later if the\n // CurrentImageIdIndex is changed to an image nearby\n var stackData = void 0;\n\n try {\n // It will throw an exception in some cases (eg: thumbnails)\n stackData = (0, _toolState.getToolState)(element, 'stack');\n } catch (error) {\n return;\n }\n\n if (!stackData || !stackData.data || !stackData.data.length) {\n return;\n }\n\n var stack = stackData.data[0];\n var imageIdIndex = stack.imageIds.indexOf(eventData.imageId);\n\n // Make sure the image that was removed is actually in this stack\n // Before adding it to the indicesToRequest array\n if (imageIdIndex < 0) {\n return;\n }\n\n var stackPrefetchData = (0, _toolState.getToolState)(element, toolType);\n\n if (!stackPrefetchData || !stackPrefetchData.data || !stackPrefetchData.data.length) {\n return;\n }\n\n stackPrefetchData.data[0].indicesToRequest.push(imageIdIndex);\n };\n}\n\nfunction onImageUpdated(e) {\n // Start prefetching again (after a delay)\n // When the user has scrolled to a new image\n clearTimeout(resetPrefetchTimeout);\n resetPrefetchTimeout = setTimeout(function () {\n var element = e.target;\n\n // If playClip is enabled and the user loads a different series in the viewport\n // An exception will be thrown because the element will not be enabled anymore\n try {\n prefetch(element);\n } catch (error) {\n return;\n }\n }, resetPrefetchDelay);\n}\n\nfunction enable(element) {\n // Clear old prefetch data. Skipping this can cause problems when changing the series inside an element\n var stackPrefetchDataArray = (0, _toolState.getToolState)(element, toolType);\n\n stackPrefetchDataArray.data = [];\n\n // First check that there is stack data available\n var stackData = (0, _toolState.getToolState)(element, 'stack');\n\n if (!stackData || !stackData.data || !stackData.data.length) {\n return;\n }\n\n var stack = stackData.data[0];\n\n // Check if we are allowed to cache images in this stack\n if (stack.preventCache === true) {\n console.warn('A stack that should not be cached was given the stackPrefetch');\n\n return;\n }\n\n // Use the currentImageIdIndex from the stack as the initalImageIdIndex\n var stackPrefetchData = {\n indicesToRequest: range(0, stack.imageIds.length - 1),\n enabled: true,\n direction: 1\n };\n\n // Remove the currentImageIdIndex from the list to request\n var indexOfCurrentImage = stackPrefetchData.indicesToRequest.indexOf(stack.currentImageIdIndex);\n\n stackPrefetchData.indicesToRequest.splice(indexOfCurrentImage, 1);\n\n (0, _toolState.addToolState)(element, toolType, stackPrefetchData);\n\n prefetch(element);\n\n element.removeEventListener(_events2.default.NEW_IMAGE, onImageUpdated);\n element.addEventListener(_events2.default.NEW_IMAGE, onImageUpdated);\n\n var promiseRemovedHandler = getPromiseRemovedHandler(element);\n\n _externalModules2.default.cornerstone.events.removeEventListener(_events2.default.IMAGE_CACHE_PROMISE_REMOVED, promiseRemovedHandler);\n _externalModules2.default.cornerstone.events.addEventListener(_events2.default.IMAGE_CACHE_PROMISE_REMOVED, promiseRemovedHandler);\n}\n\nfunction disable(element) {\n clearTimeout(resetPrefetchTimeout);\n element.removeEventListener(_events2.default.NEW_IMAGE, onImageUpdated);\n\n var promiseRemovedHandler = getPromiseRemovedHandler(element);\n\n _externalModules2.default.cornerstone.events.removeEventListener(_events2.default.IMAGE_CACHE_PROMISE_REMOVED, promiseRemovedHandler);\n\n var stackPrefetchData = (0, _toolState.getToolState)(element, toolType);\n // If there is actually something to disable, disable it\n\n if (stackPrefetchData && stackPrefetchData.data.length) {\n stackPrefetchData.data[0].enabled = false;\n\n // Clear current prefetch requests from the requestPool\n _requestPoolManager2.default.clearRequestStack(requestType);\n }\n}\n\nfunction getConfiguration() {\n return configuration;\n}\n\nfunction setConfiguration(config) {\n configuration = config;\n\n if (config.maxSimultaneousRequests) {\n (0, _getMaxSimultaneousRequests.setMaxSimultaneousRequests)(config.maxSimultaneousRequests);\n }\n}\n\n// Module/private exports\nvar stackPrefetch = {\n enable: enable,\n disable: disable,\n getConfiguration: getConfiguration,\n setConfiguration: setConfiguration\n};\n\nexports.default = stackPrefetch;\n\n/***/ }),\n/* 86 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _displayTool = __webpack_require__(26);\n\nvar _displayTool2 = _interopRequireDefault(_displayTool);\n\nvar _toolState = __webpack_require__(2);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/*\nDisplay scroll progress bar across bottom of image.\n */\nvar scrollBarHeight = 6;\n\nvar configuration = {\n backgroundColor: 'rgb(19, 63, 141)',\n fillColor: 'white',\n orientation: 'horizontal'\n};\n\nfunction onImageRendered(e) {\n var eventData = e.detail;\n var element = eventData.element;\n var width = eventData.enabledElement.canvas.width;\n var height = eventData.enabledElement.canvas.height;\n\n if (!width || !height) {\n return false;\n }\n\n var context = eventData.enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n context.save();\n\n var config = scrollIndicator.getConfiguration();\n\n // Draw indicator background\n context.fillStyle = config.backgroundColor;\n if (config.orientation === 'horizontal') {\n context.fillRect(0, height - scrollBarHeight, width, scrollBarHeight);\n } else {\n context.fillRect(0, 0, scrollBarHeight, height);\n }\n\n // Get current image index\n var stackData = (0, _toolState.getToolState)(element, 'stack');\n\n if (!stackData || !stackData.data || !stackData.data.length) {\n return;\n }\n\n var imageIds = stackData.data[0].imageIds;\n var currentImageIdIndex = stackData.data[0].currentImageIdIndex;\n\n // Draw current image cursor\n var cursorWidth = width / imageIds.length;\n var cursorHeight = height / imageIds.length;\n var xPosition = cursorWidth * currentImageIdIndex;\n var yPosition = cursorHeight * currentImageIdIndex;\n\n context.fillStyle = config.fillColor;\n if (config.orientation === 'horizontal') {\n context.fillRect(xPosition, height - scrollBarHeight, cursorWidth, scrollBarHeight);\n } else {\n context.fillRect(0, yPosition, scrollBarHeight, cursorHeight);\n }\n\n context.restore();\n}\n\nvar scrollIndicator = (0, _displayTool2.default)(onImageRendered);\n\nscrollIndicator.setConfiguration(configuration);\n\nexports.default = scrollIndicator;\n\n/***/ }),\n/* 87 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _fusionRenderer = __webpack_require__(88);\n\nvar _fusionRenderer2 = _interopRequireDefault(_fusionRenderer);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar stackRenderers = {};\n\nstackRenderers.FusionRenderer = _fusionRenderer2.default;\n\nexports.default = stackRenderers;\n\n/***/ }),\n/* 88 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _toolState = __webpack_require__(2);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar FusionRenderer = function () {\n function FusionRenderer() {\n _classCallCheck(this, FusionRenderer);\n\n this.currentImageIdIndex = 0;\n this.layerIds = [];\n this.findImageFn = undefined;\n }\n\n _createClass(FusionRenderer, [{\n key: 'render',\n value: function render(element, imageStacks) {\n var _this = this;\n\n // Move this to base Renderer class\n if (!Number.isInteger(this.currentImageIdIndex)) {\n throw new Error('FusionRenderer: render - Image ID Index is not an integer');\n }\n\n if (!this.findImageFn) {\n throw new Error('No findImage function has been defined');\n }\n\n if (!imageStacks) {\n var toolData = (0, _toolState.getToolState)(element, 'stack');\n\n imageStacks = toolData.data;\n }\n // TODO: Figure out what to do with LoadHandlers in this scenario...\n\n var cornerstone = _externalModules2.default.cornerstone;\n\n // For the base layer, go to the currentImageIdIndex\n var baseImageObject = imageStacks[0];\n var currentImageId = baseImageObject.imageIds[this.currentImageIdIndex];\n var overlayImageStacks = imageStacks.slice(1, imageStacks.length);\n\n cornerstone.loadAndCacheImage(currentImageId).then(function (baseImage) {\n var baseLayerId = _this.layerIds[0];\n\n // Get the base layer if one exists\n if (baseLayerId) {\n cornerstone.setLayerImage(element, baseImage, baseLayerId);\n } else {\n // Otherwise, create a new layer with the base layer's image\n baseLayerId = cornerstone.addLayer(element, baseImage, baseImageObject.options);\n _this.layerIds.push(baseLayerId);\n }\n\n // Display the image immediately while the overlay images are identified\n cornerstone.displayImage(element, baseImage);\n\n // Loop through the remaining 'overlay' image stacks\n overlayImageStacks.forEach(function (imgObj, overlayLayerIndex) {\n var imageId = _this.findImageFn(imgObj.imageIds, currentImageId);\n var layerIndex = overlayLayerIndex + 1;\n var currentLayerId = _this.layerIds[layerIndex];\n\n // If no layer exists yet for this overlaid stack, create\n // One and add it to the layerIds property for this instance\n // Of the fusion renderer.\n if (!currentLayerId) {\n currentLayerId = cornerstone.addLayer(element, undefined, imgObj.options);\n _this.layerIds.push(currentLayerId);\n }\n\n if (imageId) {\n // If an imageId was returned from the findImage function,\n // Load it, make sure it's visible and update the layer\n // With the new image object.\n cornerstone.loadAndCacheImage(imageId).then(function (image) {\n cornerstone.setLayerImage(element, image, currentLayerId);\n cornerstone.updateImage(element);\n });\n } else {\n // If no imageId was returned from the findImage function.\n // This means that there is no relevant image to display.\n cornerstone.setLayerImage(element, undefined, currentLayerId);\n cornerstone.setActiveLayer(element, baseLayerId);\n cornerstone.updateImage(element);\n }\n });\n });\n }\n }]);\n\n return FusionRenderer;\n}();\n\nexports.default = FusionRenderer;\n\n/***/ }),\n/* 89 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.stopClip = exports.playClip = undefined;\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _loadHandlerManager = __webpack_require__(12);\n\nvar _loadHandlerManager2 = _interopRequireDefault(_loadHandlerManager);\n\nvar _toolState = __webpack_require__(2);\n\nvar _triggerEvent = __webpack_require__(5);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'playClip';\n\n/**\n * [private] Turns a Frame Time Vector (0018,1065) array into a normalized array of timeouts. Each element\n * ... of the resulting array represents the amount of time each frame will remain on the screen.\n * @param {Array} vector A Frame Time Vector (0018,1065) as specified in section C.7.6.5.1.2 of DICOM standard.\n * @param {Number} speed A speed factor which will be applied to each element of the resulting array.\n * @return {Array} An array with timeouts for each animation frame.\n */\n/* eslint no-bitwise:0 */\nfunction getPlayClipTimeouts(vector, speed) {\n\n var i = void 0;\n var sample = void 0;\n var delay = void 0;\n var sum = 0;\n var limit = vector.length;\n var timeouts = [];\n\n // Initialize time varying to false\n timeouts.isTimeVarying = false;\n\n if (typeof speed !== 'number' || speed <= 0) {\n speed = 1;\n }\n\n // First element of a frame time vector must be discarded\n for (i = 1; i < limit; i++) {\n delay = Number(vector[i]) / speed | 0; // Integral part only\n timeouts.push(delay);\n if (i === 1) {\n // Use first item as a sample for comparison\n sample = delay;\n } else if (delay !== sample) {\n timeouts.isTimeVarying = true;\n }\n\n sum += delay;\n }\n\n if (timeouts.length > 0) {\n if (timeouts.isTimeVarying) {\n // If it's a time varying vector, make the last item an average...\n delay = sum / timeouts.length | 0;\n } else {\n delay = timeouts[0];\n }\n\n timeouts.push(delay);\n }\n\n return timeouts;\n}\n\n/**\n * [private] Performs the heavy lifting of stopping an ongoing animation.\n * @param {Object} playClipData The data from playClip that needs to be stopped.\n * @return void\n */\nfunction stopClipWithData(playClipData) {\n var id = playClipData.intervalId;\n\n if (typeof id !== 'undefined') {\n playClipData.intervalId = undefined;\n if (playClipData.usingFrameTimeVector) {\n clearTimeout(id);\n } else {\n clearInterval(id);\n }\n }\n}\n\n/**\n * [private] Trigger playClip tool stop event.\n * @param element\n * @return void\n */\nfunction triggerStopEvent(element) {\n var eventDetail = {\n element: element\n };\n\n (0, _triggerEvent2.default)(element, _events2.default.CLIP_STOPPED, eventDetail);\n}\n\n/**\n * Starts playing a clip or adjusts the frame rate of an already playing clip. framesPerSecond is\n * optional and defaults to 30 if not specified. A negative framesPerSecond will play the clip in reverse.\n * The element must be a stack of images\n * @param element\n * @param framesPerSecond\n */\nfunction playClip(element, framesPerSecond) {\n var playClipData = void 0;\n var playClipTimeouts = void 0;\n\n if (element === undefined) {\n throw new Error('playClip: element must not be undefined');\n }\n\n var stackToolData = (0, _toolState.getToolState)(element, 'stack');\n\n if (!stackToolData || !stackToolData.data || !stackToolData.data.length) {\n return;\n }\n\n var cornerstone = _externalModules2.default.cornerstone;\n // If we have more than one stack, check if we have a stack renderer defined\n var stackRenderer = void 0;\n\n if (stackToolData.data.length > 1) {\n var stackRendererData = (0, _toolState.getToolState)(element, 'stackRenderer');\n\n if (stackRendererData && stackRendererData.data && stackRendererData.data.length) {\n stackRenderer = stackRendererData.data[0];\n }\n }\n\n var stackData = stackToolData.data[0];\n\n var playClipToolData = (0, _toolState.getToolState)(element, toolType);\n\n if (!playClipToolData || !playClipToolData.data || !playClipToolData.data.length) {\n playClipData = {\n intervalId: undefined,\n framesPerSecond: 30,\n lastFrameTimeStamp: undefined,\n frameRate: 0,\n frameTimeVector: undefined,\n ignoreFrameTimeVector: false,\n usingFrameTimeVector: false,\n speed: 1,\n reverse: false,\n loop: true\n };\n (0, _toolState.addToolState)(element, toolType, playClipData);\n } else {\n playClipData = playClipToolData.data[0];\n // Make sure the specified clip is not running before any property update\n stopClipWithData(playClipData);\n }\n\n // If a framesPerSecond is specified and is valid, update the playClipData now\n if (framesPerSecond < 0 || framesPerSecond > 0) {\n playClipData.framesPerSecond = Number(framesPerSecond);\n playClipData.reverse = playClipData.framesPerSecond < 0;\n // If framesPerSecond is given, frameTimeVector will be ignored...\n playClipData.ignoreFrameTimeVector = true;\n }\n\n // Determine if frame time vector should be used instead of a fixed frame rate...\n if (playClipData.ignoreFrameTimeVector !== true && playClipData.frameTimeVector && playClipData.frameTimeVector.length === stackData.imageIds.length) {\n playClipTimeouts = getPlayClipTimeouts(playClipData.frameTimeVector, playClipData.speed);\n }\n\n // This function encapsulates the frame rendering logic...\n var playClipAction = function playClipAction() {\n\n // Hoisting of context variables\n var loader = void 0,\n startLoadingHandler = void 0,\n endLoadingHandler = void 0,\n errorLoadingHandler = void 0,\n newImageIdIndex = stackData.currentImageIdIndex;\n\n var imageCount = stackData.imageIds.length;\n\n if (playClipData.reverse) {\n newImageIdIndex--;\n } else {\n newImageIdIndex++;\n }\n\n if (!playClipData.loop && (newImageIdIndex < 0 || newImageIdIndex >= imageCount)) {\n stopClipWithData(playClipData);\n triggerStopEvent(element);\n\n return;\n }\n\n // Loop around if we go outside the stack\n if (newImageIdIndex >= imageCount) {\n newImageIdIndex = 0;\n }\n\n if (newImageIdIndex < 0) {\n newImageIdIndex = imageCount - 1;\n }\n\n if (newImageIdIndex !== stackData.currentImageIdIndex) {\n\n startLoadingHandler = _loadHandlerManager2.default.getStartLoadHandler();\n endLoadingHandler = _loadHandlerManager2.default.getEndLoadHandler();\n errorLoadingHandler = _loadHandlerManager2.default.getErrorLoadingHandler();\n\n if (startLoadingHandler) {\n startLoadingHandler(element);\n }\n\n if (stackData.preventCache === true) {\n loader = cornerstone.loadImage(stackData.imageIds[newImageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(stackData.imageIds[newImageIdIndex]);\n }\n\n loader.then(function (image) {\n try {\n stackData.currentImageIdIndex = newImageIdIndex;\n if (stackRenderer) {\n stackRenderer.currentImageIdIndex = newImageIdIndex;\n stackRenderer.render(element, stackToolData.data);\n } else {\n cornerstone.displayImage(element, image);\n }\n if (endLoadingHandler) {\n endLoadingHandler(element, image);\n }\n } catch (error) {\n return;\n }\n }, function (error) {\n var imageId = stackData.imageIds[newImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(element, imageId, error);\n }\n });\n }\n };\n\n // If playClipTimeouts array is available, not empty and its elements are NOT uniform ...\n // ... (at least one timeout is different from the others), use alternate setTimeout implementation\n if (playClipTimeouts && playClipTimeouts.length > 0 && playClipTimeouts.isTimeVarying) {\n playClipData.usingFrameTimeVector = true;\n playClipData.intervalId = setTimeout(function playClipTimeoutHandler() {\n playClipData.intervalId = setTimeout(playClipTimeoutHandler, playClipTimeouts[stackData.currentImageIdIndex]);\n playClipAction();\n }, 0);\n } else {\n // ... otherwise user setInterval implementation which is much more efficient.\n playClipData.usingFrameTimeVector = false;\n playClipData.intervalId = setInterval(playClipAction, 1000 / Math.abs(playClipData.framesPerSecond));\n }\n}\n\n/**\n * Stops an already playing clip.\n * * @param element\n */\nfunction stopClip(element) {\n\n var playClipToolData = (0, _toolState.getToolState)(element, toolType);\n\n if (!playClipToolData || !playClipToolData.data || !playClipToolData.data.length) {\n return;\n }\n\n stopClipWithData(playClipToolData.data[0]);\n}\n\nexports.playClip = playClip;\nexports.stopClip = stopClip;\n\n/***/ }),\n/* 90 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _triggerEvent = __webpack_require__(5);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar mouseX = void 0;\nvar mouseY = void 0;\n\nfunction keyPress(e) {\n var cornerstone = _externalModules2.default.cornerstone;\n var element = e.currentTarget;\n\n var keyPressData = {\n event: window.event || e, // Old IE support\n element: element,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n currentPoints: {\n page: {\n x: mouseX,\n y: mouseY\n },\n image: cornerstone.pageToPixel(element, mouseX, mouseY)\n },\n keyCode: e.keyCode,\n which: e.which\n };\n\n keyPressData.currentPoints.canvas = cornerstone.pixelToCanvas(element, keyPressData.currentPoints.image);\n\n var keyPressEvents = {\n keydown: _events2.default.KEY_DOWN,\n keypress: _events2.default.KEY_PRESS,\n keyup: _events2.default.KEY_UP\n };\n\n (0, _triggerEvent2.default)(element, keyPressEvents[e.type], keyPressData);\n}\n\nfunction mouseMove(e) {\n mouseX = e.pageX;\n mouseY = e.pageY;\n}\n\nvar keyboardEvents = ['keydown', 'keypress', 'keyup'];\n\nfunction enable(element) {\n keyboardEvents.forEach(function (eventType) {\n element.removeEventListener(eventType, keyPress);\n element.addEventListener(eventType, keyPress);\n });\n\n element.removeEventListener('mousemove', mouseMove);\n element.addEventListener('mousemove', mouseMove);\n}\n\nfunction disable(element) {\n keyboardEvents.forEach(function (eventType) {\n element.removeEventListener(eventType, keyPress);\n });\n\n element.removeEventListener('mousemove', mouseMove);\n}\n\n// Module exports\nvar keyboardInput = {\n enable: enable,\n disable: disable\n};\n\nexports.default = keyboardInput;\n\n/***/ }),\n/* 91 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _copyPoints = __webpack_require__(35);\n\nvar _copyPoints2 = _interopRequireDefault(_copyPoints);\n\nvar _pauseEvent = __webpack_require__(33);\n\nvar _pauseEvent2 = _interopRequireDefault(_pauseEvent);\n\nvar _triggerEvent = __webpack_require__(5);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar isClickEvent = true;\nvar preventClickTimeout = void 0;\nvar clickDelay = 200;\n\nfunction getEventWhich(event) {\n if (typeof event.buttons !== 'number') {\n return event.which;\n }\n\n if (event.buttons === 0) {\n return 0;\n } else if (event.buttons % 2 === 1) {\n return 1;\n } else if (event.buttons % 4 === 2) {\n return 3;\n } else if (event.buttons % 8 === 4) {\n return 2;\n }\n\n return 0;\n}\n\nfunction preventClickHandler() {\n isClickEvent = false;\n}\n\nfunction mouseDoubleClick(e) {\n var cornerstone = _externalModules2.default.cornerstone;\n var element = e.currentTarget;\n var eventType = _events2.default.MOUSE_DOUBLE_CLICK;\n\n var startPoints = {\n page: _externalModules2.default.cornerstoneMath.point.pageToPoint(e),\n image: cornerstone.pageToPixel(element, e.pageX, e.pageY),\n client: {\n x: e.clientX,\n y: e.clientY\n }\n };\n\n startPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image);\n\n var lastPoints = (0, _copyPoints2.default)(startPoints);\n\n /* Note: It seems we can't trust MouseEvent.buttons for dblclick events?\n For some reason they are always firing with e.buttons = 0\n so we have to use e.which for now instead.\n Might be related to using preventDefault on the original mousedown or click events?\n */\n var eventData = {\n event: e,\n which: e.which,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element: element,\n startPoints: startPoints,\n lastPoints: lastPoints,\n currentPoints: startPoints,\n deltaPoints: {\n x: 0,\n y: 0\n },\n type: eventType\n };\n\n (0, _triggerEvent2.default)(element, eventType, eventData);\n}\n\nfunction mouseDown(e) {\n preventClickTimeout = setTimeout(preventClickHandler, clickDelay);\n\n var cornerstone = _externalModules2.default.cornerstone;\n var element = e.currentTarget;\n var eventType = _events2.default.MOUSE_DOWN;\n\n // Prevent CornerstoneToolsMouseMove while mouse is down\n element.removeEventListener('mousemove', mouseMove);\n\n var startPoints = {\n page: _externalModules2.default.cornerstoneMath.point.pageToPoint(e),\n image: cornerstone.pageToPixel(element, e.pageX, e.pageY),\n client: {\n x: e.clientX,\n y: e.clientY\n }\n };\n\n startPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image);\n\n var lastPoints = (0, _copyPoints2.default)(startPoints);\n var eventData = {\n event: e,\n which: getEventWhich(e),\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element: element,\n startPoints: startPoints,\n lastPoints: lastPoints,\n currentPoints: startPoints,\n deltaPoints: {\n x: 0,\n y: 0\n },\n type: eventType\n };\n\n var eventPropagated = (0, _triggerEvent2.default)(eventData.element, eventType, eventData);\n\n if (eventPropagated) {\n // No tools responded to this event, create a new tool\n eventData.type = _events2.default.MOUSE_DOWN_ACTIVATE;\n (0, _triggerEvent2.default)(eventData.element, _events2.default.MOUSE_DOWN_ACTIVATE, eventData);\n }\n\n var whichMouseButton = getEventWhich(e);\n\n function onMouseMove(e) {\n // Calculate our current points in page and image coordinates\n var eventType = _events2.default.MOUSE_DRAG;\n var currentPoints = {\n page: _externalModules2.default.cornerstoneMath.point.pageToPoint(e),\n image: cornerstone.pageToPixel(element, e.pageX, e.pageY),\n client: {\n x: e.clientX,\n y: e.clientY\n }\n };\n\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n\n // Calculate delta values in page and image coordinates\n var deltaPoints = {\n page: _externalModules2.default.cornerstoneMath.point.subtract(currentPoints.page, lastPoints.page),\n image: _externalModules2.default.cornerstoneMath.point.subtract(currentPoints.image, lastPoints.image),\n client: _externalModules2.default.cornerstoneMath.point.subtract(currentPoints.client, lastPoints.client),\n canvas: _externalModules2.default.cornerstoneMath.point.subtract(currentPoints.canvas, lastPoints.canvas)\n };\n\n var eventData = {\n which: whichMouseButton,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element: element,\n startPoints: startPoints,\n lastPoints: lastPoints,\n currentPoints: currentPoints,\n deltaPoints: deltaPoints,\n type: eventType,\n ctrlKey: e.ctrlKey,\n metaKey: e.metaKey,\n shiftKey: e.shiftKey\n };\n\n (0, _triggerEvent2.default)(eventData.element, eventType, eventData);\n\n // Update the last points\n lastPoints = (0, _copyPoints2.default)(currentPoints);\n\n // Prevent left click selection of DOM elements\n return (0, _pauseEvent2.default)(e);\n }\n\n // Hook mouseup so we can unbind our event listeners\n // When they stop dragging\n function onMouseUp(e) {\n // Cancel the timeout preventing the click event from triggering\n clearTimeout(preventClickTimeout);\n\n var eventType = _events2.default.MOUSE_UP;\n\n if (isClickEvent) {\n eventType = _events2.default.MOUSE_CLICK;\n }\n\n // Calculate our current points in page and image coordinates\n var currentPoints = {\n page: _externalModules2.default.cornerstoneMath.point.pageToPoint(e),\n image: cornerstone.pageToPixel(element, e.pageX, e.pageY),\n client: {\n x: e.clientX,\n y: e.clientY\n }\n };\n\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n\n // Calculate delta values in page and image coordinates\n var deltaPoints = {\n page: _externalModules2.default.cornerstoneMath.point.subtract(currentPoints.page, lastPoints.page),\n image: _externalModules2.default.cornerstoneMath.point.subtract(currentPoints.image, lastPoints.image),\n client: _externalModules2.default.cornerstoneMath.point.subtract(currentPoints.client, lastPoints.client),\n canvas: _externalModules2.default.cornerstoneMath.point.subtract(currentPoints.canvas, lastPoints.canvas)\n };\n\n var eventData = {\n event: e,\n which: whichMouseButton,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element: element,\n startPoints: startPoints,\n lastPoints: lastPoints,\n currentPoints: currentPoints,\n deltaPoints: deltaPoints,\n type: eventType\n };\n\n (0, _triggerEvent2.default)(eventData.element, eventType, eventData);\n\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n\n element.addEventListener('mousemove', mouseMove);\n\n isClickEvent = true;\n }\n\n document.addEventListener('mousemove', onMouseMove);\n document.addEventListener('mouseup', onMouseUp);\n\n return (0, _pauseEvent2.default)(e);\n}\n\nfunction mouseMove(e) {\n var cornerstone = _externalModules2.default.cornerstone;\n var element = e.currentTarget;\n var eventType = _events2.default.MOUSE_MOVE;\n\n var startPoints = {\n page: _externalModules2.default.cornerstoneMath.point.pageToPoint(e),\n image: cornerstone.pageToPixel(element, e.pageX, e.pageY),\n client: {\n x: e.clientX,\n y: e.clientY\n }\n };\n\n startPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image);\n\n var lastPoints = (0, _copyPoints2.default)(startPoints);\n\n // Calculate our current points in page and image coordinates\n var currentPoints = {\n page: _externalModules2.default.cornerstoneMath.point.pageToPoint(e),\n image: cornerstone.pageToPixel(element, e.pageX, e.pageY),\n client: {\n x: e.clientX,\n y: e.clientY\n }\n };\n\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n\n // Calculate delta values in page and image coordinates\n var deltaPoints = {\n page: _externalModules2.default.cornerstoneMath.point.subtract(currentPoints.page, lastPoints.page),\n image: _externalModules2.default.cornerstoneMath.point.subtract(currentPoints.image, lastPoints.image),\n client: _externalModules2.default.cornerstoneMath.point.subtract(currentPoints.client, lastPoints.client),\n canvas: _externalModules2.default.cornerstoneMath.point.subtract(currentPoints.canvas, lastPoints.canvas)\n };\n\n var eventData = {\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element: element,\n startPoints: startPoints,\n lastPoints: lastPoints,\n currentPoints: currentPoints,\n deltaPoints: deltaPoints,\n type: eventType\n };\n\n (0, _triggerEvent2.default)(element, eventType, eventData);\n\n // Update the last points\n lastPoints = (0, _copyPoints2.default)(currentPoints);\n}\n\nfunction disable(element) {\n element.removeEventListener('mousedown', mouseDown);\n element.removeEventListener('mousemove', mouseMove);\n element.removeEventListener('dblclick', mouseDoubleClick);\n}\n\nfunction enable(element) {\n // Prevent handlers from being attached multiple times\n disable(element);\n\n element.addEventListener('mousedown', mouseDown);\n element.addEventListener('mousemove', mouseMove);\n element.addEventListener('dblclick', mouseDoubleClick);\n}\n\n// Module exports\nvar mouseInput = {\n enable: enable,\n disable: disable\n};\n\nexports.default = mouseInput;\n\n/***/ }),\n/* 92 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _triggerEvent = __webpack_require__(5);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction mouseWheel(e) {\n // !!!HACK/NOTE/WARNING!!!\n // For some reason I am getting mousewheel and DOMMouseScroll events on my\n // Mac os x mavericks system when middle mouse button dragging.\n // I couldn't find any info about this so this might break other systems\n // Webkit hack\n if (e.type === 'mousewheel' && e.wheelDeltaY === 0) {\n return;\n }\n // Firefox hack\n if (e.type === 'DOMMouseScroll' && e.axis === 1) {\n return;\n }\n\n e.preventDefault();\n\n var cornerstone = _externalModules2.default.cornerstone;\n var element = e.currentTarget;\n\n var x = void 0;\n var y = void 0;\n\n if (e.pageX !== undefined && e.pageY !== undefined) {\n x = e.pageX;\n y = e.pageY;\n } else {\n // IE9 & IE10\n x = e.x;\n y = e.y;\n }\n\n var startingCoords = cornerstone.pageToPixel(element, x, y);\n\n e = window.event && window.event.wheelDelta ? window.event : e; // Old IE support\n\n var wheelDelta = void 0;\n\n if (e.wheelDelta) {\n wheelDelta = -e.wheelDelta;\n } else if (e.deltaY) {\n wheelDelta = -e.deltaY;\n } else if (e.detail) {\n wheelDelta = -e.detail;\n } else {\n wheelDelta = e.wheelDelta;\n }\n\n var direction = wheelDelta < 0 ? -1 : 1;\n\n var mouseWheelData = {\n element: element,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n direction: direction,\n pageX: x,\n pageY: y,\n imageX: startingCoords.x,\n imageY: startingCoords.y\n };\n\n (0, _triggerEvent2.default)(element, _events2.default.MOUSE_WHEEL, mouseWheelData);\n}\n\nvar mouseWheelEvents = ['mousewheel', 'DOMMouseScroll'];\n\nfunction enable(element) {\n // Prevent handlers from being attached multiple times\n disable(element);\n\n mouseWheelEvents.forEach(function (eventType) {\n element.addEventListener(eventType, mouseWheel);\n });\n}\n\nfunction disable(element) {\n mouseWheelEvents.forEach(function (eventType) {\n element.removeEventListener(eventType, mouseWheel);\n });\n}\n\n// Module exports\nvar mouseWheelInput = {\n enable: enable,\n disable: disable\n};\n\nexports.default = mouseWheelInput;\n\n/***/ }),\n/* 93 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _copyPoints = __webpack_require__(35);\n\nvar _copyPoints2 = _interopRequireDefault(_copyPoints);\n\nvar _pauseEvent = __webpack_require__(33);\n\nvar _pauseEvent2 = _interopRequireDefault(_pauseEvent);\n\nvar _preventGhostClick = __webpack_require__(53);\n\nvar _preventGhostClick2 = _interopRequireDefault(_preventGhostClick);\n\nvar _triggerEvent = __webpack_require__(5);\n\nvar _triggerEvent2 = _interopRequireDefault(_triggerEvent);\n\nvar _toolOptions = __webpack_require__(3);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar startPoints = void 0,\n currentPoints = void 0,\n lastPoints = void 0,\n deltaPoints = void 0,\n eventData = void 0,\n touchStartDelay = void 0,\n pressTimeout = void 0,\n pageDistanceMoved = void 0;\n\nvar lastScale = 1.0,\n lastRotation = 0.0,\n preventNextPinch = false,\n isPress = false,\n lastDelta = void 0;\n\nvar pressDelay = 700,\n pressMaxDistance = 5;\n\nvar toolType = 'touchInput';\n\nfunction onTouch(e) {\n var cornerstone = _externalModules2.default.cornerstone;\n var element = e.currentTarget || e.srcEvent.currentTarget;\n var eventType = void 0,\n scaleChange = void 0,\n delta = void 0,\n remainingPointers = void 0,\n rotation = void 0;\n\n // Prevent mouse events from occurring alongside touch events\n e.preventDefault();\n\n // If more than one finger is placed on the element, stop the press timeout\n if (e.pointers && e.pointers.length > 1 || e.touches && e.touches.length > 1) {\n isPress = false;\n clearTimeout(pressTimeout);\n }\n\n switch (e.type) {\n case 'tap':\n isPress = false;\n clearTimeout(pressTimeout);\n\n // Calculate our current points in page and image coordinates\n currentPoints = {\n page: _externalModules2.default.cornerstoneMath.point.pageToPoint(e.pointers[0]),\n image: cornerstone.pageToPixel(element, e.pointers[0].pageX, e.pointers[0].pageY),\n client: {\n x: e.pointers[0].clientX,\n y: e.pointers[0].clientY\n }\n };\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n\n eventType = _events2.default.TAP;\n eventData = {\n event: e,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element: element,\n currentPoints: currentPoints,\n type: eventType,\n isTouchEvent: true\n };\n\n (0, _triggerEvent2.default)(element, eventType, eventData);\n break;\n\n case 'doubletap':\n isPress = false;\n clearTimeout(pressTimeout);\n\n // Calculate our current points in page and image coordinates\n currentPoints = {\n page: _externalModules2.default.cornerstoneMath.point.pageToPoint(e.pointers[0]),\n image: cornerstone.pageToPixel(element, e.pointers[0].pageX, e.pointers[0].pageY),\n client: {\n x: e.pointers[0].clientX,\n y: e.pointers[0].clientY\n }\n };\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n\n eventType = _events2.default.DOUBLE_TAP;\n eventData = {\n event: e,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element: element,\n currentPoints: currentPoints,\n type: eventType,\n isTouchEvent: true\n };\n\n (0, _triggerEvent2.default)(element, eventType, eventData);\n break;\n\n case 'pinchstart':\n isPress = false;\n clearTimeout(pressTimeout);\n\n lastScale = 1.0;\n break;\n\n case 'pinchmove':\n isPress = false;\n clearTimeout(pressTimeout);\n\n if (preventNextPinch === true) {\n lastScale = e.scale;\n preventNextPinch = false;\n break;\n }\n\n scaleChange = (e.scale - lastScale) / lastScale;\n\n startPoints = {\n page: e.center,\n image: cornerstone.pageToPixel(element, e.center.x, e.center.y)\n };\n startPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image);\n\n eventType = _events2.default.TOUCH_PINCH;\n eventData = {\n event: e,\n startPoints: startPoints,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element: element,\n direction: e.scale < 1 ? 1 : -1,\n scaleChange: scaleChange,\n type: eventType,\n isTouchEvent: true\n };\n\n (0, _triggerEvent2.default)(element, eventType, eventData);\n\n lastScale = e.scale;\n break;\n\n case 'touchstart':\n lastScale = 1.0;\n\n clearTimeout(pressTimeout);\n\n clearTimeout(touchStartDelay);\n touchStartDelay = setTimeout(function () {\n startPoints = {\n page: _externalModules2.default.cornerstoneMath.point.pageToPoint(e.touches[0]),\n image: cornerstone.pageToPixel(element, e.touches[0].pageX, e.touches[0].pageY),\n client: {\n x: e.touches[0].clientX,\n y: e.touches[0].clientY\n }\n };\n startPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image);\n\n eventType = _events2.default.TOUCH_START;\n if (e.touches.length > 1) {\n eventType = _events2.default.MULTI_TOUCH_START;\n }\n\n eventData = {\n event: e,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element: element,\n startPoints: startPoints,\n currentPoints: startPoints,\n type: eventType,\n isTouchEvent: true\n };\n\n var eventPropagated = (0, _triggerEvent2.default)(element, eventType, eventData);\n\n if (eventPropagated === true) {\n // IsPress = false;\n // ClearTimeout(pressTimeout);\n\n // No current tools responded to the drag action.\n // Create new tool measurement\n eventType = _events2.default.TOUCH_START_ACTIVE;\n if (e.touches.length > 1) {\n eventType = _events2.default.MULTI_TOUCH_START_ACTIVE;\n }\n\n eventData.type = eventType;\n (0, _triggerEvent2.default)(element, eventType, eventData);\n }\n\n // Console.log(eventType);\n lastPoints = (0, _copyPoints2.default)(startPoints);\n }, 50);\n\n isPress = true;\n pageDistanceMoved = 0;\n pressTimeout = setTimeout(function () {\n if (!isPress) {\n return;\n }\n\n currentPoints = {\n page: _externalModules2.default.cornerstoneMath.point.pageToPoint(e.touches[0]),\n image: cornerstone.pageToPixel(element, e.touches[0].pageX, e.touches[0].pageY),\n client: {\n x: e.touches[0].clientX,\n y: e.touches[0].clientY\n }\n };\n currentPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image);\n\n eventType = _events2.default.TOUCH_PRESS;\n eventData = {\n event: e,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element: element,\n currentPoints: currentPoints,\n type: eventType,\n isTouchEvent: true\n };\n\n (0, _triggerEvent2.default)(element, eventType, eventData);\n\n // Console.log(eventType);\n }, pressDelay);\n break;\n\n case 'touchend':\n lastScale = 1.0;\n\n isPress = false;\n clearTimeout(pressTimeout);\n\n setTimeout(function () {\n startPoints = {\n page: _externalModules2.default.cornerstoneMath.point.pageToPoint(e.changedTouches[0]),\n image: cornerstone.pageToPixel(element, e.changedTouches[0].pageX, e.changedTouches[0].pageY),\n client: {\n x: e.changedTouches[0].clientX,\n y: e.changedTouches[0].clientY\n }\n };\n startPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image);\n\n eventType = _events2.default.TOUCH_END;\n\n eventData = {\n event: e,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element: element,\n startPoints: startPoints,\n currentPoints: startPoints,\n type: eventType,\n isTouchEvent: true\n };\n\n (0, _triggerEvent2.default)(element, eventType, eventData);\n }, 50);\n break;\n\n case 'panmove':\n // Using the delta-value of HammerJS, because it takes all pointers into account\n // This is very important when using panning in combination with pinch-zooming\n // But HammerJS' delta is relative to the start of the pan event\n // So it needs to be converted to a per-event-delta for CornerstoneTools\n delta = {\n x: e.deltaX - lastDelta.x,\n y: e.deltaY - lastDelta.y\n };\n\n lastDelta = {\n x: e.deltaX,\n y: e.deltaY\n };\n\n // Calculate our current points in page and image coordinates\n currentPoints = {\n page: {\n x: lastPoints.page.x + delta.x,\n y: lastPoints.page.y + delta.y\n },\n image: cornerstone.pageToPixel(element, lastPoints.page.x + delta.x, lastPoints.page.y + delta.y),\n client: {\n x: lastPoints.client.x + delta.x,\n y: lastPoints.client.y + delta.y\n }\n };\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n\n // Calculate delta values in page and image coordinates\n deltaPoints = {\n page: _externalModules2.default.cornerstoneMath.point.subtract(currentPoints.page, lastPoints.page),\n image: _externalModules2.default.cornerstoneMath.point.subtract(currentPoints.image, lastPoints.image),\n client: _externalModules2.default.cornerstoneMath.point.subtract(currentPoints.client, lastPoints.client),\n canvas: _externalModules2.default.cornerstoneMath.point.subtract(currentPoints.canvas, lastPoints.canvas)\n };\n\n pageDistanceMoved += Math.sqrt(deltaPoints.page.x * deltaPoints.page.x + deltaPoints.page.y * deltaPoints.page.y);\n // Console.log(\"pageDistanceMoved: \" + pageDistanceMoved);\n if (pageDistanceMoved > pressMaxDistance) {\n // Console.log('Press event aborted due to movement');\n isPress = false;\n clearTimeout(pressTimeout);\n }\n\n eventType = _events2.default.TOUCH_DRAG;\n if (e.pointers.length > 1) {\n eventType = _events2.default.MULTI_TOUCH_DRAG;\n }\n\n eventData = {\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element: element,\n startPoints: startPoints,\n lastPoints: lastPoints,\n currentPoints: currentPoints,\n deltaPoints: deltaPoints,\n numPointers: e.pointers.length,\n type: eventType,\n isTouchEvent: true\n };\n\n (0, _triggerEvent2.default)(element, eventType, eventData);\n\n lastPoints = (0, _copyPoints2.default)(currentPoints);\n break;\n\n case 'panstart':\n lastDelta = {\n x: e.deltaX,\n y: e.deltaY\n };\n\n currentPoints = {\n page: _externalModules2.default.cornerstoneMath.point.pageToPoint(e.pointers[0]),\n image: cornerstone.pageToPixel(element, e.pointers[0].pageX, e.pointers[0].pageY),\n client: {\n x: e.pointers[0].clientX,\n y: e.pointers[0].clientY\n }\n };\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n lastPoints = (0, _copyPoints2.default)(currentPoints);\n break;\n\n case 'panend':\n isPress = false;\n clearTimeout(pressTimeout);\n\n // If lastPoints is not yet set, it means panend fired without panstart or pan,\n // So we can ignore this event\n if (!lastPoints) {\n return false;\n }\n\n currentPoints = {\n page: _externalModules2.default.cornerstoneMath.point.pageToPoint(e.pointers[0]),\n image: cornerstone.pageToPixel(element, e.pointers[0].pageX, e.pointers[0].pageY),\n client: {\n x: e.pointers[0].clientX,\n y: e.pointers[0].clientY\n }\n };\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n\n // Calculate delta values in page and image coordinates\n deltaPoints = {\n page: _externalModules2.default.cornerstoneMath.point.subtract(currentPoints.page, lastPoints.page),\n image: _externalModules2.default.cornerstoneMath.point.subtract(currentPoints.image, lastPoints.image),\n client: _externalModules2.default.cornerstoneMath.point.subtract(currentPoints.client, lastPoints.client),\n canvas: _externalModules2.default.cornerstoneMath.point.subtract(currentPoints.canvas, lastPoints.canvas)\n };\n\n eventType = _events2.default.TOUCH_DRAG_END;\n\n eventData = {\n event: e.srcEvent,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element: element,\n startPoints: startPoints,\n lastPoints: lastPoints,\n currentPoints: currentPoints,\n deltaPoints: deltaPoints,\n type: eventType,\n isTouchEvent: true\n };\n\n (0, _triggerEvent2.default)(element, eventType, eventData);\n\n remainingPointers = e.pointers.length - e.changedPointers.length;\n\n if (remainingPointers === 2) {\n preventNextPinch = true;\n }\n\n return (0, _pauseEvent2.default)(e);\n\n case 'rotatemove':\n isPress = false;\n clearTimeout(pressTimeout);\n\n rotation = e.rotation - lastRotation;\n\n lastRotation = e.rotation;\n\n eventType = _events2.default.TOUCH_ROTATE;\n eventData = {\n event: e.srcEvent,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element: element,\n rotation: rotation,\n type: eventType\n };\n (0, _triggerEvent2.default)(element, eventType, eventData);\n break;\n }\n\n return false;\n}\n\nfunction enable(element) {\n disable(element);\n var Hammer = _externalModules2.default.Hammer;\n\n var hammerOptions = {\n inputClass: Hammer.SUPPORT_POINTER_EVENTS ? Hammer.PointerEventInput : Hammer.TouchInput\n };\n\n var mc = new Hammer.Manager(element, hammerOptions);\n\n var panOptions = {\n pointers: 0,\n direction: Hammer.DIRECTION_ALL,\n threshold: 0\n };\n\n var pan = new Hammer.Pan(panOptions);\n var pinch = new Hammer.Pinch({\n threshold: 0\n });\n var rotate = new Hammer.Rotate({\n threshold: 0\n });\n\n pinch.recognizeWith(pan);\n pinch.recognizeWith(rotate);\n rotate.recognizeWith(pan);\n\n var doubleTap = new Hammer.Tap({\n event: 'doubletap',\n taps: 2,\n interval: 1500,\n threshold: 50,\n posThreshold: 50\n });\n\n doubleTap.recognizeWith(pan);\n\n // Add to the Manager\n mc.add([doubleTap, pan, rotate, pinch]);\n mc.on('tap doubletap panstart panmove panend pinchstart pinchmove rotatemove', onTouch);\n\n _preventGhostClick2.default.enable(element);\n\n var touchEvents = ['touchstart', 'touchend'];\n\n touchEvents.forEach(function (eventType) {\n element.addEventListener(eventType, onTouch);\n });\n\n var options = (0, _toolOptions.getToolOptions)(toolType, element);\n\n options.hammer = mc;\n\n (0, _toolOptions.setToolOptions)(toolType, element, options);\n}\n\nfunction disable(element) {\n _preventGhostClick2.default.disable(element);\n\n var touchEvents = ['touchstart', 'touchend'];\n\n touchEvents.forEach(function (eventType) {\n element.removeEventListener(eventType, onTouch);\n });\n\n var options = (0, _toolOptions.getToolOptions)(toolType, element);\n var mc = options.hammer;\n\n if (mc) {\n mc.off('tap doubletap panstart panmove panend pinchstart pinchmove rotatemove', onTouch);\n }\n}\n\n// Module exports\nvar touchInput = {\n enable: enable,\n disable: disable\n};\n\nexports.default = touchInput;\n\n/***/ }),\n/* 94 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.angleTouch = exports.angle = undefined;\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _mouseButtonTool = __webpack_require__(9);\n\nvar _mouseButtonTool2 = _interopRequireDefault(_mouseButtonTool);\n\nvar _touchTool = __webpack_require__(11);\n\nvar _touchTool2 = _interopRequireDefault(_touchTool);\n\nvar _drawTextBox = __webpack_require__(7);\n\nvar _drawTextBox2 = _interopRequireDefault(_drawTextBox);\n\nvar _roundToDecimal = __webpack_require__(31);\n\nvar _roundToDecimal2 = _interopRequireDefault(_roundToDecimal);\n\nvar _toolStyle = __webpack_require__(8);\n\nvar _toolStyle2 = _interopRequireDefault(_toolStyle);\n\nvar _textStyle = __webpack_require__(13);\n\nvar _textStyle2 = _interopRequireDefault(_textStyle);\n\nvar _toolColors = __webpack_require__(6);\n\nvar _toolColors2 = _interopRequireDefault(_toolColors);\n\nvar _drawHandles = __webpack_require__(10);\n\nvar _drawHandles2 = _interopRequireDefault(_drawHandles);\n\nvar _toolState = __webpack_require__(2);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'angle';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement(mouseEventData) {\n // Create the measurement data for this tool with the end handle activated\n var angleData = {\n visible: true,\n active: true,\n handles: {\n start: {\n x: mouseEventData.currentPoints.image.x - 20,\n y: mouseEventData.currentPoints.image.y + 10,\n highlight: true,\n active: false\n },\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n },\n start2: {\n x: mouseEventData.currentPoints.image.x - 20,\n y: mouseEventData.currentPoints.image.y + 10,\n highlight: true,\n active: false\n },\n end2: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y + 20,\n highlight: true,\n active: false\n }\n }\n };\n\n return angleData;\n}\n// /////// END ACTIVE TOOL ///////\n\nfunction pointNearTool(element, data, coords) {\n var cornerstone = _externalModules2.default.cornerstone;\n\n var lineSegment = {\n start: cornerstone.pixelToCanvas(element, data.handles.start),\n end: cornerstone.pixelToCanvas(element, data.handles.end)\n };\n\n var distanceToPoint = _externalModules2.default.cornerstoneMath.lineSegment.distanceToPoint(lineSegment, coords);\n\n if (distanceToPoint < 5) {\n return true;\n }\n\n lineSegment.start = cornerstone.pixelToCanvas(element, data.handles.start2);\n lineSegment.end = cornerstone.pixelToCanvas(element, data.handles.end2);\n\n distanceToPoint = _externalModules2.default.cornerstoneMath.lineSegment.distanceToPoint(lineSegment, coords);\n\n return distanceToPoint < 5;\n}\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction onImageRendered(e) {\n var eventData = e.detail;\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n var toolData = (0, _toolState.getToolState)(e.currentTarget, toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n // We have tool data for this element - iterate over each one and draw it\n var context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Activation color\n var color = void 0;\n var lineWidth = _toolStyle2.default.getToolWidth();\n var font = _textStyle2.default.getFont();\n var config = angle.getConfiguration();\n var cornerstone = _externalModules2.default.cornerstone;\n\n for (var i = 0; i < toolData.data.length; i++) {\n context.save();\n\n // Configurable shadow\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n var data = toolData.data[i];\n\n // Differentiate the color of activation tool\n if (data.active) {\n color = _toolColors2.default.getActiveColor();\n } else {\n color = _toolColors2.default.getToolColor();\n }\n\n // Draw the line\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n\n var handleStartCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.start);\n var handleEndCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.end);\n\n context.moveTo(handleStartCanvas.x, handleStartCanvas.y);\n context.lineTo(handleEndCanvas.x, handleEndCanvas.y);\n\n handleStartCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.start2);\n handleEndCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.end2);\n\n context.moveTo(handleStartCanvas.x, handleStartCanvas.y);\n context.lineTo(handleEndCanvas.x, handleEndCanvas.y);\n context.stroke();\n\n // Draw the handles\n (0, _drawHandles2.default)(context, eventData, data.handles);\n\n // Draw the text\n context.fillStyle = color;\n\n // Need to work on correct angle to measure. This is a cobb angle and we need to determine\n // Where lines cross to measure angle. For now it will show smallest angle.\n var dx1 = (Math.ceil(data.handles.start.x) - Math.ceil(data.handles.end.x)) * eventData.image.columnPixelSpacing;\n var dy1 = (Math.ceil(data.handles.start.y) - Math.ceil(data.handles.end.y)) * eventData.image.rowPixelSpacing;\n var dx2 = (Math.ceil(data.handles.start2.x) - Math.ceil(data.handles.end2.x)) * eventData.image.columnPixelSpacing;\n var dy2 = (Math.ceil(data.handles.start2.y) - Math.ceil(data.handles.end2.y)) * eventData.image.rowPixelSpacing;\n\n var _angle = Math.acos(Math.abs((dx1 * dx2 + dy1 * dy2) / (Math.sqrt(dx1 * dx1 + dy1 * dy1) * Math.sqrt(dx2 * dx2 + dy2 * dy2))));\n\n _angle *= 180 / Math.PI;\n\n var rAngle = (0, _roundToDecimal2.default)(_angle, 2);\n var str = '00B0'; // Degrees symbol\n var text = rAngle.toString() + String.fromCharCode(parseInt(str, 16));\n\n var textX = (handleStartCanvas.x + handleEndCanvas.x) / 2;\n var textY = (handleStartCanvas.y + handleEndCanvas.y) / 2;\n\n context.font = font;\n (0, _drawTextBox2.default)(context, text, textX, textY, color);\n context.restore();\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nvar angle = (0, _mouseButtonTool2.default)({\n createNewMeasurement: createNewMeasurement,\n onImageRendered: onImageRendered,\n pointNearTool: pointNearTool,\n toolType: toolType\n});\n\nvar angleTouch = (0, _touchTool2.default)({\n createNewMeasurement: createNewMeasurement,\n onImageRendered: onImageRendered,\n pointNearTool: pointNearTool,\n toolType: toolType\n});\n\nexports.angle = angle;\nexports.angleTouch = angleTouch;\n\n/***/ }),\n/* 95 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.arrowAnnotateTouch = exports.arrowAnnotate = undefined;\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _mouseButtonTool = __webpack_require__(9);\n\nvar _mouseButtonTool2 = _interopRequireDefault(_mouseButtonTool);\n\nvar _touchTool = __webpack_require__(11);\n\nvar _touchTool2 = _interopRequireDefault(_touchTool);\n\nvar _drawTextBox = __webpack_require__(7);\n\nvar _drawTextBox2 = _interopRequireDefault(_drawTextBox);\n\nvar _toolStyle = __webpack_require__(8);\n\nvar _toolStyle2 = _interopRequireDefault(_toolStyle);\n\nvar _textStyle = __webpack_require__(13);\n\nvar _textStyle2 = _interopRequireDefault(_textStyle);\n\nvar _toolColors = __webpack_require__(6);\n\nvar _toolColors2 = _interopRequireDefault(_toolColors);\n\nvar _drawHandles = __webpack_require__(10);\n\nvar _drawHandles2 = _interopRequireDefault(_drawHandles);\n\nvar _drawArrow = __webpack_require__(48);\n\nvar _drawArrow2 = _interopRequireDefault(_drawArrow);\n\nvar _moveNewHandle = __webpack_require__(24);\n\nvar _moveNewHandle2 = _interopRequireDefault(_moveNewHandle);\n\nvar _moveNewHandleTouch = __webpack_require__(27);\n\nvar _moveNewHandleTouch2 = _interopRequireDefault(_moveNewHandleTouch);\n\nvar _anyHandlesOutsideImage = __webpack_require__(14);\n\nvar _anyHandlesOutsideImage2 = _interopRequireDefault(_anyHandlesOutsideImage);\n\nvar _isMouseButtonEnabled = __webpack_require__(4);\n\nvar _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled);\n\nvar _pointInsideBoundingBox = __webpack_require__(19);\n\nvar _pointInsideBoundingBox2 = _interopRequireDefault(_pointInsideBoundingBox);\n\nvar _toolState = __webpack_require__(2);\n\nvar _toolOptions = __webpack_require__(3);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'arrowAnnotate';\n\n// Define a callback to get your text annotation\n// This could be used, e.g. to open a modal\n/* eslint no-alert:0 */\nfunction getTextCallback(doneChangingTextCallback) {\n doneChangingTextCallback(prompt('Enter your annotation:'));\n}\n\nfunction changeTextCallback(data, eventData, doneChangingTextCallback) {\n doneChangingTextCallback(prompt('Change your annotation:'));\n}\n\nvar configuration = {\n getTextCallback: getTextCallback,\n changeTextCallback: changeTextCallback,\n drawHandles: false,\n drawHandlesOnHover: true,\n arrowFirst: true\n};\n\n// / --- Mouse Tool --- ///\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction addNewMeasurement(mouseEventData) {\n var element = mouseEventData.element;\n var measurementData = createNewMeasurement(mouseEventData);\n var cornerstone = _externalModules2.default.cornerstone;\n\n function doneChangingTextCallback(text) {\n if (text === null) {\n (0, _toolState.removeToolState)(element, toolType, measurementData);\n } else {\n measurementData.text = text;\n }\n\n measurementData.active = false;\n cornerstone.updateImage(element);\n\n element.addEventListener(_events2.default.MOUSE_MOVE, arrowAnnotate.mouseMoveCallback);\n element.addEventListener(_events2.default.MOUSE_DOWN, arrowAnnotate.mouseDownCallback);\n element.addEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, arrowAnnotate.mouseDownActivateCallback);\n element.addEventListener(_events2.default.MOUSE_DOUBLE_CLICK, arrowAnnotate.mouseDoubleClickCallback);\n }\n\n // Associate this data with this imageId so we can render it and manipulate it\n (0, _toolState.addToolState)(element, toolType, measurementData);\n\n // Since we are dragging to another place to drop the end point, we can just activate\n // The end point and let the moveHandle move it for us.\n element.removeEventListener(_events2.default.MOUSE_MOVE, arrowAnnotate.mouseMoveCallback);\n element.removeEventListener(_events2.default.MOUSE_DOWN, arrowAnnotate.mouseDownCallback);\n element.removeEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, arrowAnnotate.mouseDownActivateCallback);\n element.removeEventListener(_events2.default.MOUSE_DOUBLE_CLICK, arrowAnnotate.mouseDoubleClickCallback);\n\n cornerstone.updateImage(element);\n (0, _moveNewHandle2.default)(mouseEventData, toolType, measurementData, measurementData.handles.end, function () {\n if ((0, _anyHandlesOutsideImage2.default)(mouseEventData, measurementData.handles)) {\n // Delete the measurement\n (0, _toolState.removeToolState)(element, toolType, measurementData);\n }\n\n var config = arrowAnnotate.getConfiguration();\n\n if (measurementData.text === undefined) {\n config.getTextCallback(doneChangingTextCallback);\n }\n\n cornerstone.updateImage(element);\n });\n}\n\nfunction createNewMeasurement(eventData) {\n // Create the measurement data for this tool with the end handle activated\n var measurementData = {\n visible: true,\n active: true,\n handles: {\n start: {\n x: eventData.currentPoints.image.x,\n y: eventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n end: {\n x: eventData.currentPoints.image.x,\n y: eventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n textBox: {\n active: false,\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n }\n }\n };\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\nfunction pointNearTool(element, data, coords) {\n var cornerstone = _externalModules2.default.cornerstone;\n\n var lineSegment = {\n start: cornerstone.pixelToCanvas(element, data.handles.start),\n end: cornerstone.pixelToCanvas(element, data.handles.end)\n };\n\n var distanceToPoint = _externalModules2.default.cornerstoneMath.lineSegment.distanceToPoint(lineSegment, coords);\n\n return distanceToPoint < 25;\n}\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction onImageRendered(e) {\n var eventData = e.detail;\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n var toolData = (0, _toolState.getToolState)(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n var enabledElement = eventData.enabledElement;\n var cornerstone = _externalModules2.default.cornerstone;\n\n // We have tool data for this element - iterate over each one and draw it\n var context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n var color = void 0;\n var lineWidth = _toolStyle2.default.getToolWidth();\n var font = _textStyle2.default.getFont();\n var config = arrowAnnotate.getConfiguration();\n\n for (var i = 0; i < toolData.data.length; i++) {\n context.save();\n\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n var data = toolData.data[i];\n\n if (data.active) {\n color = _toolColors2.default.getActiveColor();\n } else {\n color = _toolColors2.default.getToolColor();\n }\n\n // Draw the arrow\n var handleStartCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.start);\n var handleEndCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.end);\n\n // Config.arrowFirst = false;\n if (config.arrowFirst) {\n (0, _drawArrow2.default)(context, handleEndCanvas, handleStartCanvas, color, lineWidth);\n } else {\n (0, _drawArrow2.default)(context, handleStartCanvas, handleEndCanvas, color, lineWidth);\n }\n\n var handleOptions = {\n drawHandlesIfActive: config && config.drawHandlesOnHover\n };\n\n if (config.drawHandles) {\n (0, _drawHandles2.default)(context, eventData, data.handles, color, handleOptions);\n }\n\n // Draw the text\n if (data.text && data.text !== '') {\n context.font = font;\n\n // Calculate the text coordinates.\n var textWidth = context.measureText(data.text).width + 10;\n var textHeight = _textStyle2.default.getFontSize() + 10;\n\n var distance = Math.max(textWidth, textHeight) / 2 + 5;\n\n if (handleEndCanvas.x < handleStartCanvas.x) {\n distance = -distance;\n }\n\n var textCoords = void 0;\n\n if (!data.handles.textBox.hasMoved) {\n if (config.arrowFirst) {\n textCoords = {\n x: handleEndCanvas.x - textWidth / 2 + distance,\n y: handleEndCanvas.y - textHeight / 2\n };\n } else {\n // If the arrow is at the End position, the text should\n // Be placed near the Start position\n textCoords = {\n x: handleStartCanvas.x - textWidth / 2 - distance,\n y: handleStartCanvas.y - textHeight / 2\n };\n }\n\n var transform = cornerstone.internal.getTransform(enabledElement);\n\n transform.invert();\n\n var coords = transform.transformPoint(textCoords.x, textCoords.y);\n\n data.handles.textBox.x = coords.x;\n data.handles.textBox.y = coords.y;\n }\n\n textCoords = cornerstone.pixelToCanvas(eventData.element, data.handles.textBox);\n\n var boundingBox = (0, _drawTextBox2.default)(context, data.text, textCoords.x, textCoords.y, color);\n\n data.handles.textBox.boundingBox = boundingBox;\n\n if (data.handles.textBox.hasMoved) {\n // Draw dashed link line between tool and text\n var link = {\n start: {},\n end: {}\n };\n\n var midpointCanvas = {\n x: (handleStartCanvas.x + handleEndCanvas.x) / 2,\n y: (handleStartCanvas.y + handleEndCanvas.y) / 2\n };\n\n var points = [handleStartCanvas, handleEndCanvas, midpointCanvas];\n\n link.end.x = textCoords.x;\n link.end.y = textCoords.y;\n\n link.start = _externalModules2.default.cornerstoneMath.point.findClosestPoint(points, link.end);\n\n var boundingBoxPoints = [{\n // Top middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top\n }, {\n // Left middle point of bounding box\n x: boundingBox.left,\n y: boundingBox.top + boundingBox.height / 2\n }, {\n // Bottom middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top + boundingBox.height\n }, {\n // Right middle point of bounding box\n x: boundingBox.left + boundingBox.width,\n y: boundingBox.top + boundingBox.height / 2\n }];\n\n link.end = _externalModules2.default.cornerstoneMath.point.findClosestPoint(boundingBoxPoints, link.start);\n\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.setLineDash([2, 3]);\n context.moveTo(link.start.x, link.start.y);\n context.lineTo(link.end.x, link.end.y);\n context.stroke();\n }\n }\n\n context.restore();\n }\n}\n// ---- Touch tool ----\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction addNewMeasurementTouch(touchEventData) {\n var element = touchEventData.element;\n var measurementData = createNewMeasurement(touchEventData);\n var cornerstone = _externalModules2.default.cornerstone;\n\n function doneChangingTextCallback(text) {\n if (text === null) {\n (0, _toolState.removeToolState)(element, toolType, measurementData);\n } else {\n measurementData.text = text;\n }\n\n measurementData.active = false;\n cornerstone.updateImage(element);\n\n element.addEventListener(_events2.default.TOUCH_PRESS, arrowAnnotateTouch.pressCallback);\n element.addEventListener(_events2.default.TOUCH_START_ACTIVE, arrowAnnotateTouch.touchDownActivateCallback);\n element.addEventListener(_events2.default.TAP, arrowAnnotateTouch.tapCallback);\n }\n\n (0, _toolState.addToolState)(element, toolType, measurementData);\n element.removeEventListener(_events2.default.TOUCH_PRESS, arrowAnnotateTouch.pressCallback);\n element.removeEventListener(_events2.default.TOUCH_START_ACTIVE, arrowAnnotateTouch.touchDownActivateCallback);\n element.removeEventListener(_events2.default.TAP, arrowAnnotateTouch.tapCallback);\n cornerstone.updateImage(element);\n\n (0, _moveNewHandleTouch2.default)(touchEventData, toolType, measurementData, measurementData.handles.end, function () {\n cornerstone.updateImage(element);\n\n if ((0, _anyHandlesOutsideImage2.default)(touchEventData, measurementData.handles)) {\n // Delete the measurement\n (0, _toolState.removeToolState)(element, toolType, measurementData);\n }\n\n var config = arrowAnnotate.getConfiguration();\n\n if (measurementData.text === undefined) {\n config.getTextCallback(doneChangingTextCallback);\n }\n });\n}\n\nfunction doubleClickCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n var cornerstone = _externalModules2.default.cornerstone;\n var options = (0, _toolOptions.getToolOptions)(toolType, element);\n var data = void 0;\n\n if (!(0, _isMouseButtonEnabled2.default)(eventData.which, options.mouseButtonMask)) {\n return;\n }\n\n function doneChangingTextCallback(data, updatedText, deleteTool) {\n if (deleteTool === true) {\n (0, _toolState.removeToolState)(element, toolType, data);\n } else {\n data.text = updatedText;\n }\n\n data.active = false;\n cornerstone.updateImage(element);\n }\n\n var config = arrowAnnotate.getConfiguration();\n\n var coords = eventData.currentPoints.canvas;\n var toolData = (0, _toolState.getToolState)(element, toolType);\n\n // Now check to see if there is a handle we can move\n if (!toolData) {\n return;\n }\n\n for (var i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (pointNearTool(element, data, coords) || (0, _pointInsideBoundingBox2.default)(data.handles.textBox, coords)) {\n data.active = true;\n cornerstone.updateImage(element);\n // Allow relabelling via a callback\n config.changeTextCallback(data, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n\n return false;\n }\n }\n}\n\nfunction pressCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n var cornerstone = _externalModules2.default.cornerstone;\n var data = void 0;\n\n function doneChangingTextCallback(data, updatedText, deleteTool) {\n console.log('pressCallback doneChangingTextCallback');\n if (deleteTool === true) {\n (0, _toolState.removeToolState)(element, toolType, data);\n } else {\n data.text = updatedText;\n }\n\n data.active = false;\n cornerstone.updateImage(element);\n\n element.addEventListener(_events2.default.TOUCH_START, arrowAnnotateTouch.touchStartCallback);\n element.addEventListener(_events2.default.TOUCH_START_ACTIVE, arrowAnnotateTouch.touchDownActivateCallback);\n element.addEventListener(_events2.default.TAP, arrowAnnotateTouch.tapCallback);\n }\n\n var config = arrowAnnotate.getConfiguration();\n\n var coords = eventData.currentPoints.canvas;\n var toolData = (0, _toolState.getToolState)(element, toolType);\n\n // Now check to see if there is a handle we can move\n if (!toolData) {\n return;\n }\n\n if (eventData.handlePressed) {\n element.removeEventListener(_events2.default.TOUCH_START, arrowAnnotateTouch.touchStartCallback);\n element.removeEventListener(_events2.default.TOUCH_START_ACTIVE, arrowAnnotateTouch.touchDownActivateCallback);\n element.removeEventListener(_events2.default.TAP, arrowAnnotateTouch.tapCallback);\n\n // Allow relabelling via a callback\n config.changeTextCallback(eventData.handlePressed, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n\n return false;\n }\n\n for (var i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (pointNearTool(element, data, coords) || (0, _pointInsideBoundingBox2.default)(data.handles.textBox, coords)) {\n data.active = true;\n cornerstone.updateImage(element);\n\n element.removeEventListener(_events2.default.TOUCH_START, arrowAnnotateTouch.touchStartCallback);\n element.removeEventListener(_events2.default.TOUCH_START_ACTIVE, arrowAnnotateTouch.touchDownActivateCallback);\n element.removeEventListener(_events2.default.TAP, arrowAnnotateTouch.tapCallback);\n\n // Allow relabelling via a callback\n config.changeTextCallback(data, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n\n return false;\n }\n }\n\n e.preventDefault();\n e.stopPropagation();\n}\n\nvar arrowAnnotate = (0, _mouseButtonTool2.default)({\n addNewMeasurement: addNewMeasurement,\n createNewMeasurement: createNewMeasurement,\n onImageRendered: onImageRendered,\n pointNearTool: pointNearTool,\n toolType: toolType,\n mouseDoubleClickCallback: doubleClickCallback\n});\n\narrowAnnotate.setConfiguration(configuration);\n\nvar arrowAnnotateTouch = (0, _touchTool2.default)({\n addNewMeasurement: addNewMeasurementTouch,\n createNewMeasurement: createNewMeasurement,\n onImageRendered: onImageRendered,\n pointNearTool: pointNearTool,\n toolType: toolType,\n pressCallback: pressCallback\n});\n\nexports.arrowAnnotate = arrowAnnotate;\nexports.arrowAnnotateTouch = arrowAnnotateTouch;\n\n/***/ }),\n/* 96 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.crosshairsTouch = exports.crosshairs = undefined;\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _loadHandlerManager = __webpack_require__(12);\n\nvar _loadHandlerManager2 = _interopRequireDefault(_loadHandlerManager);\n\nvar _toolState = __webpack_require__(2);\n\nvar _isMouseButtonEnabled = __webpack_require__(4);\n\nvar _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled);\n\nvar _pointProjector = __webpack_require__(28);\n\nvar _convertToVector = __webpack_require__(17);\n\nvar _convertToVector2 = _interopRequireDefault(_convertToVector);\n\nvar _toolOptions = __webpack_require__(3);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'crosshairs';\n\nfunction chooseLocation(e) {\n var eventData = e.detail;\n\n e.stopImmediatePropagation(); // Prevent CornerstoneToolsTouchStartActive from killing any press events\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n var toolData = (0, _toolState.getToolState)(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n // Get current element target information\n var cornerstone = _externalModules2.default.cornerstone;\n var sourceElement = e.currentTarget;\n var sourceEnabledElement = cornerstone.getEnabledElement(sourceElement);\n var sourceImageId = sourceEnabledElement.image.imageId;\n var sourceImagePlane = cornerstone.metaData.get('imagePlaneModule', sourceImageId);\n\n // Get currentPoints from mouse cursor on selected element\n var sourceImagePoint = eventData.currentPoints.image;\n\n // Transfer this to a patientPoint given imagePlane metadata\n var patientPoint = (0, _pointProjector.imagePointToPatientPoint)(sourceImagePoint, sourceImagePlane);\n\n // Get the enabled elements associated with this synchronization context\n var syncContext = toolData.data[0].synchronizationContext;\n var enabledElements = syncContext.getSourceElements();\n\n // Iterate over each synchronized element\n enabledElements.forEach(function (targetElement) {\n // Don't do anything if the target is the same as the source\n if (targetElement === sourceElement) {\n return;\n }\n\n var minDistance = Number.MAX_VALUE;\n var newImageIdIndex = -1;\n\n var stackToolDataSource = (0, _toolState.getToolState)(targetElement, 'stack');\n\n if (stackToolDataSource === undefined) {\n return;\n }\n\n var stackData = stackToolDataSource.data[0];\n\n // Find within the element's stack the closest image plane to selected location\n stackData.imageIds.forEach(function (imageId, index) {\n var imagePlane = cornerstone.metaData.get('imagePlaneModule', imageId);\n var imagePosition = (0, _convertToVector2.default)(imagePlane.imagePositionPatient);\n var row = (0, _convertToVector2.default)(imagePlane.rowCosines);\n var column = (0, _convertToVector2.default)(imagePlane.columnCosines);\n var normal = column.clone().cross(row.clone());\n var distance = Math.abs(normal.clone().dot(imagePosition) - normal.clone().dot(patientPoint));\n // Console.log(index + '=' + distance);\n\n if (distance < minDistance) {\n minDistance = distance;\n newImageIdIndex = index;\n }\n });\n\n if (newImageIdIndex === stackData.currentImageIdIndex) {\n return;\n }\n\n // Switch the loaded image to the required image\n if (newImageIdIndex !== -1 && stackData.imageIds[newImageIdIndex] !== undefined) {\n var startLoadingHandler = _loadHandlerManager2.default.getStartLoadHandler();\n var endLoadingHandler = _loadHandlerManager2.default.getEndLoadHandler();\n var errorLoadingHandler = _loadHandlerManager2.default.getErrorLoadingHandler();\n\n if (startLoadingHandler) {\n startLoadingHandler(targetElement);\n }\n\n var loader = void 0;\n\n if (stackData.preventCache === true) {\n loader = cornerstone.loadImage(stackData.imageIds[newImageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(stackData.imageIds[newImageIdIndex]);\n }\n\n loader.then(function (image) {\n var viewport = cornerstone.getViewport(targetElement);\n\n stackData.currentImageIdIndex = newImageIdIndex;\n cornerstone.displayImage(targetElement, image, viewport);\n if (endLoadingHandler) {\n endLoadingHandler(targetElement, image);\n }\n }, function (error) {\n var imageId = stackData.imageIds[newImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(targetElement, imageId, error);\n }\n });\n }\n });\n}\n\nfunction mouseUpCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n\n element.removeEventListener(_events2.default.MOUSE_DRAG, mouseDragCallback);\n element.removeEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n}\n\nfunction mouseDownCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n var options = (0, _toolOptions.getToolOptions)(toolType, element);\n\n if ((0, _isMouseButtonEnabled2.default)(eventData.which, options.mouseButtonMask)) {\n element.addEventListener(_events2.default.MOUSE_DRAG, mouseDragCallback);\n element.addEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n chooseLocation(e);\n\n e.preventDefault();\n e.stopPropagation();\n }\n}\n\nfunction mouseDragCallback(e) {\n chooseLocation(e);\n\n e.preventDefault();\n e.stopPropagation();\n}\n\nfunction enable(element, mouseButtonMask, synchronizationContext) {\n (0, _toolOptions.setToolOptions)(toolType, element, { mouseButtonMask: mouseButtonMask });\n\n // Clear any currently existing toolData\n (0, _toolState.clearToolState)(element, toolType);\n\n (0, _toolState.addToolState)(element, toolType, {\n synchronizationContext: synchronizationContext\n });\n\n element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback);\n\n element.addEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback);\n}\n\n// Disables the reference line tool for the given element\nfunction disable(element) {\n element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback);\n}\n\n// Module/private exports\nvar crosshairs = {\n activate: enable,\n deactivate: disable,\n enable: enable,\n disable: disable\n};\n\nfunction dragEndCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n\n element.removeEventListener(_events2.default.TOUCH_DRAG, dragCallback);\n element.removeEventListener(_events2.default.TOUCH_DRAG_END, dragEndCallback);\n}\n\nfunction dragStartCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n\n element.addEventListener(_events2.default.TOUCH_DRAG, dragCallback);\n element.addEventListener(_events2.default.TOUCH_DRAG_END, dragEndCallback);\n chooseLocation(e);\n\n return false;\n}\n\nfunction dragCallback(e) {\n chooseLocation(e);\n\n e.preventDefault();\n e.stopPropagation();\n}\n\nfunction enableTouch(element, synchronizationContext) {\n // Clear any currently existing toolData\n (0, _toolState.clearToolState)(element, toolType);\n\n (0, _toolState.addToolState)(element, toolType, {\n synchronizationContext: synchronizationContext\n });\n\n element.removeEventListener(_events2.default.TOUCH_START, dragStartCallback);\n\n element.addEventListener(_events2.default.TOUCH_START, dragStartCallback);\n}\n\n// Disables the reference line tool for the given element\nfunction disableTouch(element) {\n element.removeEventListener(_events2.default.TOUCH_START, dragStartCallback);\n}\n\nvar crosshairsTouch = {\n activate: enableTouch,\n deactivate: disableTouch,\n enable: enableTouch,\n disable: disableTouch\n};\n\nexports.crosshairs = crosshairs;\nexports.crosshairsTouch = crosshairsTouch;\n\n/***/ }),\n/* 97 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _doubleTapTool = __webpack_require__(54);\n\nvar _doubleTapTool2 = _interopRequireDefault(_doubleTapTool);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction fitToWindowStrategy(eventData) {\n _externalModules2.default.cornerstone.fitToWindow(eventData.element);\n}\n\nfunction doubleTapCallback(e) {\n var eventData = e.detail;\n\n doubleTapZoom.strategy(eventData);\n\n e.preventDefault();\n e.stopPropagation();\n}\n\nvar doubleTapZoom = (0, _doubleTapTool2.default)(doubleTapCallback);\n\ndoubleTapZoom.strategies = {\n default: fitToWindowStrategy\n};\n\ndoubleTapZoom.strategy = fitToWindowStrategy;\n\nexports.default = doubleTapZoom;\n\n/***/ }),\n/* 98 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.dragProbeTouch = exports.dragProbe = undefined;\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _simpleMouseButtonTool = __webpack_require__(16);\n\nvar _simpleMouseButtonTool2 = _interopRequireDefault(_simpleMouseButtonTool);\n\nvar _touchDragTool = __webpack_require__(15);\n\nvar _touchDragTool2 = _interopRequireDefault(_touchDragTool);\n\nvar _textStyle = __webpack_require__(13);\n\nvar _textStyle2 = _interopRequireDefault(_textStyle);\n\nvar _toolColors = __webpack_require__(6);\n\nvar _toolColors2 = _interopRequireDefault(_toolColors);\n\nvar _drawTextBox = __webpack_require__(7);\n\nvar _drawTextBox2 = _interopRequireDefault(_drawTextBox);\n\nvar _getRGBPixels = __webpack_require__(34);\n\nvar _getRGBPixels2 = _interopRequireDefault(_getRGBPixels);\n\nvar _calculateSUV = __webpack_require__(20);\n\nvar _calculateSUV2 = _interopRequireDefault(_calculateSUV);\n\nvar _isMouseButtonEnabled = __webpack_require__(4);\n\nvar _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled);\n\nvar _toolOptions = __webpack_require__(3);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'dragProbe';\n\nvar dragEventData = void 0;\n\nfunction defaultStrategy(eventData) {\n var cornerstone = _externalModules2.default.cornerstone;\n var enabledElement = cornerstone.getEnabledElement(eventData.element);\n\n var context = enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n var color = _toolColors2.default.getActiveColor();\n var font = _textStyle2.default.getFont();\n var fontHeight = _textStyle2.default.getFontSize();\n var config = dragProbe.getConfiguration();\n\n context.save();\n\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n var x = Math.round(eventData.currentPoints.image.x);\n var y = Math.round(eventData.currentPoints.image.y);\n\n var storedPixels = void 0;\n var text = void 0,\n str = void 0;\n\n if (x < 0 || y < 0 || x >= eventData.image.columns || y >= eventData.image.rows) {\n return;\n }\n\n if (eventData.image.color) {\n storedPixels = (0, _getRGBPixels2.default)(eventData.element, x, y, 1, 1);\n text = x + ', ' + y;\n str = 'R: ' + storedPixels[0] + ' G: ' + storedPixels[1] + ' B: ' + storedPixels[2] + ' A: ' + storedPixels[3];\n } else {\n storedPixels = cornerstone.getStoredPixels(eventData.element, x, y, 1, 1);\n var sp = storedPixels[0];\n var mo = sp * eventData.image.slope + eventData.image.intercept;\n var suv = (0, _calculateSUV2.default)(eventData.image, sp);\n\n // Draw text\n text = x + ', ' + y;\n str = 'SP: ' + sp + ' MO: ' + parseFloat(mo.toFixed(3));\n if (suv) {\n str += ' SUV: ' + parseFloat(suv.toFixed(3));\n }\n }\n\n // Draw text\n var coords = {\n // Translate the x/y away from the cursor\n x: eventData.currentPoints.image.x + 3,\n y: eventData.currentPoints.image.y - 3\n };\n var textCoords = cornerstone.pixelToCanvas(eventData.element, coords);\n\n context.font = font;\n context.fillStyle = color;\n\n (0, _drawTextBox2.default)(context, str, textCoords.x, textCoords.y + fontHeight + 5, color);\n (0, _drawTextBox2.default)(context, text, textCoords.x, textCoords.y, color);\n context.restore();\n}\n\nfunction minimalStrategy(eventData) {\n var cornerstone = _externalModules2.default.cornerstone;\n var element = eventData.element;\n var enabledElement = cornerstone.getEnabledElement(element);\n var image = enabledElement.image;\n\n var context = enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n var color = _toolColors2.default.getActiveColor();\n var font = _textStyle2.default.getFont();\n var config = dragProbe.getConfiguration();\n\n context.save();\n\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n var seriesModule = cornerstone.metaData.get('generalSeriesModule', image.imageId);\n var modality = void 0;\n\n if (seriesModule) {\n modality = seriesModule.modality;\n }\n\n var toolCoords = void 0;\n\n if (eventData.isTouchEvent === true) {\n toolCoords = cornerstone.pageToPixel(element, eventData.currentPoints.page.x, eventData.currentPoints.page.y - _textStyle2.default.getFontSize() * 4);\n } else {\n toolCoords = cornerstone.pageToPixel(element, eventData.currentPoints.page.x, eventData.currentPoints.page.y - _textStyle2.default.getFontSize() / 2);\n }\n\n var storedPixels = void 0;\n var text = '';\n\n if (toolCoords.x < 0 || toolCoords.y < 0 || toolCoords.x >= image.columns || toolCoords.y >= image.rows) {\n return;\n }\n\n if (image.color) {\n storedPixels = (0, _getRGBPixels2.default)(element, toolCoords.x, toolCoords.y, 1, 1);\n text = 'R: ' + storedPixels[0] + ' G: ' + storedPixels[1] + ' B: ' + storedPixels[2];\n } else {\n storedPixels = cornerstone.getStoredPixels(element, toolCoords.x, toolCoords.y, 1, 1);\n var sp = storedPixels[0];\n var mo = sp * eventData.image.slope + eventData.image.intercept;\n\n var modalityPixelValueText = parseFloat(mo.toFixed(2));\n\n if (modality === 'CT') {\n text += 'HU: ' + modalityPixelValueText;\n } else if (modality === 'PT') {\n text += modalityPixelValueText;\n var suv = (0, _calculateSUV2.default)(eventData.image, sp);\n\n if (suv) {\n text += ' SUV: ' + parseFloat(suv.toFixed(2));\n }\n } else {\n text += modalityPixelValueText;\n }\n }\n\n // Prepare text\n var textCoords = cornerstone.pixelToCanvas(element, toolCoords);\n\n context.font = font;\n context.fillStyle = color;\n\n // Translate the x/y away from the cursor\n var translation = void 0;\n var handleRadius = 6;\n var width = context.measureText(text).width;\n\n if (eventData.isTouchEvent === true) {\n translation = {\n x: -width / 2 - 5,\n y: -_textStyle2.default.getFontSize() - 10 - 2 * handleRadius\n };\n } else {\n translation = {\n x: 12,\n y: -(_textStyle2.default.getFontSize() + 10) / 2\n };\n }\n\n context.beginPath();\n context.strokeStyle = color;\n context.arc(textCoords.x, textCoords.y, handleRadius, 0, 2 * Math.PI);\n context.stroke();\n\n (0, _drawTextBox2.default)(context, text, textCoords.x + translation.x, textCoords.y + translation.y, color);\n context.restore();\n}\n\nfunction mouseUpCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n\n element.removeEventListener(_events2.default.IMAGE_RENDERED, imageRenderedCallback);\n element.removeEventListener(_events2.default.MOUSE_DRAG, dragCallback);\n element.removeEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback);\n _externalModules2.default.cornerstone.updateImage(eventData.element);\n}\n\nfunction mouseDownCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n var options = (0, _toolOptions.getToolOptions)(toolType, element);\n\n if ((0, _isMouseButtonEnabled2.default)(eventData.which, options.mouseButtonMask)) {\n element.addEventListener(_events2.default.IMAGE_RENDERED, imageRenderedCallback);\n element.addEventListener(_events2.default.MOUSE_DRAG, dragCallback);\n element.addEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n element.addEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback);\n dragProbe.strategy(eventData);\n\n e.preventDefault();\n e.stopPropagation();\n }\n}\n\nfunction imageRenderedCallback() {\n if (dragEventData) {\n dragProbe.strategy(dragEventData);\n dragEventData = null;\n }\n}\n\n// The strategy can't be execute at this moment because the image is rendered asynchronously\n// (requestAnimationFrame). Then the eventData that contains all information needed is being\n// Cached and the strategy will be executed once cornerstoneimagerendered is triggered.\nfunction dragCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n\n dragEventData = eventData;\n _externalModules2.default.cornerstone.updateImage(element);\n\n e.preventDefault();\n e.stopPropagation();\n}\n\nvar dragProbe = (0, _simpleMouseButtonTool2.default)(mouseDownCallback, toolType);\n\ndragProbe.strategies = {\n default: defaultStrategy,\n minimal: minimalStrategy\n};\n\ndragProbe.strategy = defaultStrategy;\n\nvar options = {\n fireOnTouchStart: true\n};\n\nvar dragProbeTouch = (0, _touchDragTool2.default)(dragCallback, toolType, options);\n\nexports.dragProbe = dragProbe;\nexports.dragProbeTouch = dragProbeTouch;\n\n/***/ }),\n/* 99 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.ellipticalRoiTouch = exports.ellipticalRoi = undefined;\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _mouseButtonTool = __webpack_require__(9);\n\nvar _mouseButtonTool2 = _interopRequireDefault(_mouseButtonTool);\n\nvar _touchTool = __webpack_require__(11);\n\nvar _touchTool2 = _interopRequireDefault(_touchTool);\n\nvar _toolStyle = __webpack_require__(8);\n\nvar _toolStyle2 = _interopRequireDefault(_toolStyle);\n\nvar _toolColors = __webpack_require__(6);\n\nvar _toolColors2 = _interopRequireDefault(_toolColors);\n\nvar _drawHandles = __webpack_require__(10);\n\nvar _drawHandles2 = _interopRequireDefault(_drawHandles);\n\nvar _drawTextBox = __webpack_require__(7);\n\nvar _drawTextBox2 = _interopRequireDefault(_drawTextBox);\n\nvar _drawEllipse = __webpack_require__(46);\n\nvar _drawEllipse2 = _interopRequireDefault(_drawEllipse);\n\nvar _pointInEllipse = __webpack_require__(32);\n\nvar _pointInEllipse2 = _interopRequireDefault(_pointInEllipse);\n\nvar _calculateEllipseStatistics = __webpack_require__(49);\n\nvar _calculateEllipseStatistics2 = _interopRequireDefault(_calculateEllipseStatistics);\n\nvar _calculateSUV = __webpack_require__(20);\n\nvar _calculateSUV2 = _interopRequireDefault(_calculateSUV);\n\nvar _toolState = __webpack_require__(2);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'ellipticalRoi';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement(mouseEventData) {\n // Create the measurement data for this tool with the end handle activated\n var measurementData = {\n visible: true,\n active: true,\n invalidated: true,\n handles: {\n start: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n },\n textBox: {\n active: false,\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n }\n }\n };\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction pointNearEllipse(element, data, coords, distance) {\n var cornerstone = _externalModules2.default.cornerstone;\n var startCanvas = cornerstone.pixelToCanvas(element, data.handles.start);\n var endCanvas = cornerstone.pixelToCanvas(element, data.handles.end);\n\n var minorEllipse = {\n left: Math.min(startCanvas.x, endCanvas.x) + distance / 2,\n top: Math.min(startCanvas.y, endCanvas.y) + distance / 2,\n width: Math.abs(startCanvas.x - endCanvas.x) - distance,\n height: Math.abs(startCanvas.y - endCanvas.y) - distance\n };\n\n var majorEllipse = {\n left: Math.min(startCanvas.x, endCanvas.x) - distance / 2,\n top: Math.min(startCanvas.y, endCanvas.y) - distance / 2,\n width: Math.abs(startCanvas.x - endCanvas.x) + distance,\n height: Math.abs(startCanvas.y - endCanvas.y) + distance\n };\n\n var pointInMinorEllipse = (0, _pointInEllipse2.default)(minorEllipse, coords);\n var pointInMajorEllipse = (0, _pointInEllipse2.default)(majorEllipse, coords);\n\n if (pointInMajorEllipse && !pointInMinorEllipse) {\n return true;\n }\n\n return false;\n}\n\nfunction pointNearTool(element, data, coords) {\n return pointNearEllipse(element, data, coords, 15);\n}\n\nfunction pointNearToolTouch(element, data, coords) {\n return pointNearEllipse(element, data, coords, 25);\n}\n\nfunction numberWithCommas(x) {\n // http://stackoverflow.com/questions/2901102/how-to-print-a-number-with-commas-as-thousands-separators-in-javascript\n var parts = x.toString().split('.');\n\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n\n return parts.join('.');\n}\n\nfunction onImageRendered(e) {\n var eventData = e.detail;\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n var toolData = (0, _toolState.getToolState)(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n var cornerstone = _externalModules2.default.cornerstone;\n var image = eventData.image;\n var element = eventData.element;\n var lineWidth = _toolStyle2.default.getToolWidth();\n var config = ellipticalRoi.getConfiguration();\n var context = eventData.canvasContext.canvas.getContext('2d');\n var seriesModule = cornerstone.metaData.get('generalSeriesModule', image.imageId);\n var modality = void 0;\n\n if (seriesModule) {\n modality = seriesModule.modality;\n }\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // If we have tool data for this element - iterate over each set and draw it\n for (var i = 0; i < toolData.data.length; i++) {\n context.save();\n\n var data = toolData.data[i];\n\n // Apply any shadow settings defined in the tool configuration\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n // Check which color the rendered tool should be\n var color = _toolColors2.default.getColorIfActive(data.active);\n\n // Convert Image coordinates to Canvas coordinates given the element\n var handleStartCanvas = cornerstone.pixelToCanvas(element, data.handles.start);\n var handleEndCanvas = cornerstone.pixelToCanvas(element, data.handles.end);\n\n // Retrieve the bounds of the ellipse (left, top, width, and height)\n // In Canvas coordinates\n var leftCanvas = Math.min(handleStartCanvas.x, handleEndCanvas.x);\n var topCanvas = Math.min(handleStartCanvas.y, handleEndCanvas.y);\n var widthCanvas = Math.abs(handleStartCanvas.x - handleEndCanvas.x);\n var heightCanvas = Math.abs(handleStartCanvas.y - handleEndCanvas.y);\n\n // Draw the ellipse on the canvas\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n (0, _drawEllipse2.default)(context, leftCanvas, topCanvas, widthCanvas, heightCanvas);\n context.closePath();\n\n // If the tool configuration specifies to only draw the handles on hover / active,\n // Follow this logic\n if (config && config.drawHandlesOnHover) {\n // Draw the handles if the tool is active\n if (data.active === true) {\n (0, _drawHandles2.default)(context, eventData, data.handles, color);\n } else {\n // If the tool is inactive, draw the handles only if each specific handle is being\n // Hovered over\n var handleOptions = {\n drawHandlesIfActive: true\n };\n\n (0, _drawHandles2.default)(context, eventData, data.handles, color, handleOptions);\n }\n } else {\n // If the tool has no configuration settings, always draw the handles\n (0, _drawHandles2.default)(context, eventData, data.handles, color);\n }\n\n // Define variables for the area and mean/standard deviation\n var area = void 0,\n meanStdDev = void 0,\n meanStdDevSUV = void 0;\n\n // Perform a check to see if the tool has been invalidated. This is to prevent\n // Unnecessary re-calculation of the area, mean, and standard deviation if the\n // Image is re-rendered but the tool has not moved (e.g. during a zoom)\n if (data.invalidated === false) {\n // If the data is not invalidated, retrieve it from the toolData\n meanStdDev = data.meanStdDev;\n meanStdDevSUV = data.meanStdDevSUV;\n area = data.area;\n } else {\n // If the data has been invalidated, we need to calculate it again\n\n // Retrieve the bounds of the ellipse in image coordinates\n var ellipse = {\n left: Math.round(Math.min(data.handles.start.x, data.handles.end.x)),\n top: Math.round(Math.min(data.handles.start.y, data.handles.end.y)),\n width: Math.round(Math.abs(data.handles.start.x - data.handles.end.x)),\n height: Math.round(Math.abs(data.handles.start.y - data.handles.end.y))\n };\n\n // First, make sure this is not a color image, since no mean / standard\n // Deviation will be calculated for color images.\n if (!image.color) {\n // Retrieve the array of pixels that the ellipse bounds cover\n var pixels = cornerstone.getPixels(element, ellipse.left, ellipse.top, ellipse.width, ellipse.height);\n\n // Calculate the mean & standard deviation from the pixels and the ellipse details\n meanStdDev = (0, _calculateEllipseStatistics2.default)(pixels, ellipse);\n\n if (modality === 'PT') {\n // If the image is from a PET scan, use the DICOM tags to\n // Calculate the SUV from the mean and standard deviation.\n\n // Note that because we are using modality pixel values from getPixels, and\n // The calculateSUV routine also rescales to modality pixel values, we are first\n // Returning the values to storedPixel values before calcuating SUV with them.\n // TODO: Clean this up? Should we add an option to not scale in calculateSUV?\n meanStdDevSUV = {\n mean: (0, _calculateSUV2.default)(image, (meanStdDev.mean - image.intercept) / image.slope),\n stdDev: (0, _calculateSUV2.default)(image, (meanStdDev.stdDev - image.intercept) / image.slope)\n };\n }\n\n // If the mean and standard deviation values are sane, store them for later retrieval\n if (meanStdDev && !isNaN(meanStdDev.mean)) {\n data.meanStdDev = meanStdDev;\n data.meanStdDevSUV = meanStdDevSUV;\n }\n }\n\n // Retrieve the pixel spacing values, and if they are not\n // Real non-zero values, set them to 1\n var columnPixelSpacing = image.columnPixelSpacing || 1;\n var rowPixelSpacing = image.rowPixelSpacing || 1;\n\n // Calculate the image area from the ellipse dimensions and pixel spacing\n area = Math.PI * (ellipse.width * columnPixelSpacing / 2) * (ellipse.height * rowPixelSpacing / 2);\n\n // If the area value is sane, store it for later retrieval\n if (!isNaN(area)) {\n data.area = area;\n }\n\n // Set the invalidated flag to false so that this data won't automatically be recalculated\n data.invalidated = false;\n }\n\n // Define an array to store the rows of text for the textbox\n var textLines = [];\n\n // If the mean and standard deviation values are present, display them\n if (meanStdDev && meanStdDev.mean !== undefined) {\n // If the modality is CT, add HU to denote Hounsfield Units\n var moSuffix = '';\n\n if (modality === 'CT') {\n moSuffix = ' HU';\n }\n\n // Create a line of text to display the mean and any units that were specified (i.e. HU)\n var meanText = 'Mean: ' + numberWithCommas(meanStdDev.mean.toFixed(2)) + moSuffix;\n // Create a line of text to display the standard deviation and any units that were specified (i.e. HU)\n var stdDevText = 'StdDev: ' + numberWithCommas(meanStdDev.stdDev.toFixed(2)) + moSuffix;\n\n // If this image has SUV values to display, concatenate them to the text line\n if (meanStdDevSUV && meanStdDevSUV.mean !== undefined) {\n var SUVtext = ' SUV: ';\n\n meanText += SUVtext + numberWithCommas(meanStdDevSUV.mean.toFixed(2));\n stdDevText += SUVtext + numberWithCommas(meanStdDevSUV.stdDev.toFixed(2));\n }\n\n // Add these text lines to the array to be displayed in the textbox\n textLines.push(meanText);\n textLines.push(stdDevText);\n }\n\n // If the area is a sane value, display it\n if (area) {\n // Determine the area suffix based on the pixel spacing in the image.\n // If pixel spacing is present, use millimeters. Otherwise, use pixels.\n // This uses Char code 178 for a superscript 2\n var suffix = ' mm' + String.fromCharCode(178);\n\n if (!image.rowPixelSpacing || !image.columnPixelSpacing) {\n suffix = ' pixels' + String.fromCharCode(178);\n }\n\n // Create a line of text to display the area and its units\n var areaText = 'Area: ' + numberWithCommas(area.toFixed(2)) + suffix;\n\n // Add this text line to the array to be displayed in the textbox\n textLines.push(areaText);\n }\n\n // If the textbox has not been moved by the user, it should be displayed on the right-most\n // Side of the tool.\n if (!data.handles.textBox.hasMoved) {\n // Find the rightmost side of the ellipse at its vertical center, and place the textbox here\n // Note that this calculates it in image coordinates\n data.handles.textBox.x = Math.max(data.handles.start.x, data.handles.end.x);\n data.handles.textBox.y = (data.handles.start.y + data.handles.end.y) / 2;\n }\n\n // Convert the textbox Image coordinates into Canvas coordinates\n var textCoords = cornerstone.pixelToCanvas(element, data.handles.textBox);\n\n // Set options for the textbox drawing function\n var options = {\n centering: {\n x: false,\n y: true\n }\n };\n\n // Draw the textbox and retrieves it's bounding box for mouse-dragging and highlighting\n var boundingBox = (0, _drawTextBox2.default)(context, textLines, textCoords.x, textCoords.y, color, options);\n\n // Store the bounding box data in the handle for mouse-dragging and highlighting\n data.handles.textBox.boundingBox = boundingBox;\n\n // If the textbox has moved, we would like to draw a line linking it with the tool\n // This section decides where to draw this line to on the Ellipse based on the location\n // Of the textbox relative to the ellipse.\n if (data.handles.textBox.hasMoved) {\n // Draw dashed link line between tool and text\n\n // The initial link position is at the center of the\n // Textbox.\n var link = {\n start: {},\n end: {\n x: textCoords.x,\n y: textCoords.y\n }\n };\n\n // First we calculate the ellipse points (top, left, right, and bottom)\n var ellipsePoints = [{\n // Top middle point of ellipse\n x: leftCanvas + widthCanvas / 2,\n y: topCanvas\n }, {\n // Left middle point of ellipse\n x: leftCanvas,\n y: topCanvas + heightCanvas / 2\n }, {\n // Bottom middle point of ellipse\n x: leftCanvas + widthCanvas / 2,\n y: topCanvas + heightCanvas\n }, {\n // Right middle point of ellipse\n x: leftCanvas + widthCanvas,\n y: topCanvas + heightCanvas / 2\n }];\n\n // We obtain the link starting point by finding the closest point on the ellipse to the\n // Center of the textbox\n link.start = _externalModules2.default.cornerstoneMath.point.findClosestPoint(ellipsePoints, link.end);\n\n // Next we calculate the corners of the textbox bounding box\n var boundingBoxPoints = [{\n // Top middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top\n }, {\n // Left middle point of bounding box\n x: boundingBox.left,\n y: boundingBox.top + boundingBox.height / 2\n }, {\n // Bottom middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top + boundingBox.height\n }, {\n // Right middle point of bounding box\n x: boundingBox.left + boundingBox.width,\n y: boundingBox.top + boundingBox.height / 2\n }];\n\n // Now we recalculate the link endpoint by identifying which corner of the bounding box\n // Is closest to the start point we just calculated.\n link.end = _externalModules2.default.cornerstoneMath.point.findClosestPoint(boundingBoxPoints, link.start);\n\n // Finally we draw the dashed linking line\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.setLineDash([2, 3]);\n context.moveTo(link.start.x, link.start.y);\n context.lineTo(link.end.x, link.end.y);\n context.stroke();\n }\n\n context.restore();\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nvar ellipticalRoi = (0, _mouseButtonTool2.default)({\n createNewMeasurement: createNewMeasurement,\n onImageRendered: onImageRendered,\n pointNearTool: pointNearTool,\n toolType: toolType\n});\n\nvar ellipticalRoiTouch = (0, _touchTool2.default)({\n createNewMeasurement: createNewMeasurement,\n onImageRendered: onImageRendered,\n pointNearTool: pointNearToolTouch,\n toolType: toolType\n});\n\nexports.ellipticalRoi = ellipticalRoi;\nexports.ellipticalRoiTouch = ellipticalRoiTouch;\n\n/***/ }),\n/* 100 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.freehand = undefined;\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _toolStyle = __webpack_require__(8);\n\nvar _toolStyle2 = _interopRequireDefault(_toolStyle);\n\nvar _toolColors = __webpack_require__(6);\n\nvar _toolColors2 = _interopRequireDefault(_toolColors);\n\nvar _drawHandles = __webpack_require__(10);\n\nvar _drawHandles2 = _interopRequireDefault(_drawHandles);\n\nvar _isMouseButtonEnabled = __webpack_require__(4);\n\nvar _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled);\n\nvar _toolState = __webpack_require__(2);\n\nvar _toolOptions = __webpack_require__(3);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'freehand';\nvar configuration = {\n mouseLocation: {\n handles: {\n start: {\n highlight: true,\n active: true\n }\n }\n },\n freehand: false,\n modifying: false,\n currentHandle: 0,\n currentTool: -1\n};\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction addPoint(eventData) {\n var toolData = (0, _toolState.getToolState)(eventData.element, toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n var config = freehand.getConfiguration();\n\n // Get the toolData from the last-drawn drawing\n // (this should change when modification is added)\n var data = toolData.data[config.currentTool];\n\n var handleData = {\n x: eventData.currentPoints.image.x,\n y: eventData.currentPoints.image.y,\n highlight: true,\n active: true,\n lines: []\n };\n\n // If this is not the first handle\n if (data.handles.length) {\n // Add the line from the current handle to the new handle\n data.handles[config.currentHandle - 1].lines.push(eventData.currentPoints.image);\n }\n\n // Add the new handle\n data.handles.push(handleData);\n\n // Increment the current handle value\n config.currentHandle += 1;\n\n // Reset freehand value\n config.freehand = false;\n\n // Force onImageRendered to fire\n _externalModules2.default.cornerstone.updateImage(eventData.element);\n}\n\nfunction pointNearHandle(eventData, toolIndex) {\n var toolData = (0, _toolState.getToolState)(eventData.element, toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n var data = toolData.data[toolIndex];\n\n if (data.handles === undefined) {\n return;\n }\n\n var mousePoint = eventData.currentPoints.canvas;\n\n for (var i = 0; i < data.handles.length; i++) {\n var handleCanvas = _externalModules2.default.cornerstone.pixelToCanvas(eventData.element, data.handles[i]);\n\n if (_externalModules2.default.cornerstoneMath.point.distance(handleCanvas, mousePoint) < 5) {\n return i;\n }\n }\n\n return;\n}\n\nfunction pointNearHandleAllTools(eventData) {\n var toolData = (0, _toolState.getToolState)(eventData.element, toolType);\n\n if (!toolData) {\n return;\n }\n\n var handleNearby = void 0;\n\n for (var toolIndex = 0; toolIndex < toolData.data.length; toolIndex++) {\n handleNearby = pointNearHandle(eventData, toolIndex);\n if (handleNearby !== undefined) {\n return {\n handleNearby: handleNearby,\n toolIndex: toolIndex\n };\n }\n }\n}\n\n// --- Drawing loop ---\n// On first click, add point\n// After first click, on mouse move, record location\n// If mouse comes close to previous point, snap to it\n// On next click, add another point -- continuously\n// On each click, if it intersects with a current point, end drawing loop\n\nfunction mouseUpCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n\n element.removeEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n\n // Check if drawing is finished\n var toolData = (0, _toolState.getToolState)(eventData.element, toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n var config = freehand.getConfiguration();\n\n if (!eventData.event.shiftKey) {\n config.freehand = false;\n }\n\n _externalModules2.default.cornerstone.updateImage(eventData.element);\n}\n\nfunction mouseMoveCallback(e) {\n var eventData = e.detail;\n var toolData = (0, _toolState.getToolState)(eventData.element, toolType);\n\n if (!toolData) {\n return;\n }\n\n var config = freehand.getConfiguration();\n\n var data = toolData.data[config.currentTool];\n\n // Set the mouseLocation handle\n var x = Math.max(eventData.currentPoints.image.x, 0);\n\n x = Math.min(x, eventData.image.width);\n config.mouseLocation.handles.start.x = x;\n\n var y = Math.max(eventData.currentPoints.image.y, 0);\n\n y = Math.min(y, eventData.image.height);\n config.mouseLocation.handles.start.y = y;\n\n var currentHandle = config.currentHandle;\n\n if (config.modifying) {\n // Move the handle\n data.active = true;\n data.highlight = true;\n data.handles[currentHandle].x = config.mouseLocation.handles.start.x;\n data.handles[currentHandle].y = config.mouseLocation.handles.start.y;\n if (currentHandle) {\n var lastLineIndex = data.handles[currentHandle - 1].lines.length - 1;\n var lastLine = data.handles[currentHandle - 1].lines[lastLineIndex];\n\n lastLine.x = config.mouseLocation.handles.start.x;\n lastLine.y = config.mouseLocation.handles.start.y;\n }\n }\n\n if (config.freehand) {\n data.handles[currentHandle - 1].lines.push(eventData.currentPoints.image);\n } else {\n // No snapping in freehand mode\n var handleNearby = pointNearHandle(eventData, config.currentTool);\n\n // If there is a handle nearby to snap to\n // (and it's not the actual mouse handle)\n if (handleNearby !== undefined && handleNearby < data.handles.length - 1) {\n config.mouseLocation.handles.start.x = data.handles[handleNearby].x;\n config.mouseLocation.handles.start.y = data.handles[handleNearby].y;\n }\n }\n\n // Force onImageRendered\n _externalModules2.default.cornerstone.updateImage(eventData.element);\n}\n\nfunction startDrawing(eventData) {\n var element = eventData.element;\n\n element.addEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback);\n element.addEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n\n var measurementData = {\n visible: true,\n active: true,\n handles: []\n };\n\n var config = freehand.getConfiguration();\n\n config.mouseLocation.handles.start.x = eventData.currentPoints.image.x;\n config.mouseLocation.handles.start.y = eventData.currentPoints.image.y;\n\n (0, _toolState.addToolState)(eventData.element, toolType, measurementData);\n\n var toolData = (0, _toolState.getToolState)(eventData.element, toolType);\n\n config.currentTool = toolData.data.length - 1;\n}\n\nfunction endDrawing(eventData, handleNearby) {\n var element = eventData.element;\n var toolData = (0, _toolState.getToolState)(eventData.element, toolType);\n\n if (!toolData) {\n return;\n }\n\n var config = freehand.getConfiguration();\n\n var data = toolData.data[config.currentTool];\n\n data.active = false;\n data.highlight = false;\n\n // Connect the end of the drawing to the handle nearest to the click\n if (handleNearby !== undefined) {\n // Only save x,y params from nearby handle to prevent circular reference\n data.handles[config.currentHandle - 1].lines.push({\n x: data.handles[handleNearby].x,\n y: data.handles[handleNearby].y\n });\n }\n\n if (config.modifying) {\n config.modifying = false;\n }\n\n // Reset the current handle\n config.currentHandle = 0;\n config.currentTool = -1;\n\n element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback);\n\n _externalModules2.default.cornerstone.updateImage(eventData.element);\n}\n\nfunction mouseDownCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n var options = (0, _toolOptions.getToolOptions)(toolType, element);\n\n if ((0, _isMouseButtonEnabled2.default)(eventData.which, options.mouseButtonMask)) {\n var toolData = (0, _toolState.getToolState)(eventData.element, toolType);\n\n var handleNearby = void 0,\n toolIndex = void 0;\n\n var config = freehand.getConfiguration();\n var currentTool = config.currentTool;\n\n if (config.modifying) {\n endDrawing(eventData);\n\n return;\n }\n\n if (currentTool < 0) {\n var nearby = pointNearHandleAllTools(eventData);\n\n if (nearby) {\n handleNearby = nearby.handleNearby;\n toolIndex = nearby.toolIndex;\n // This means the user is trying to modify a point\n if (handleNearby !== undefined) {\n element.addEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback);\n element.addEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n config.modifying = true;\n config.currentHandle = handleNearby;\n config.currentTool = toolIndex;\n }\n } else {\n startDrawing(eventData);\n addPoint(eventData);\n }\n } else if (currentTool >= 0 && toolData.data[currentTool].active) {\n handleNearby = pointNearHandle(eventData, currentTool);\n if (handleNearby !== undefined) {\n endDrawing(eventData, handleNearby);\n } else if (eventData.event.shiftKey) {\n config.freehand = true;\n } else {\n addPoint(eventData);\n }\n }\n\n e.preventDefault();\n e.stopPropagation();\n }\n}\n\n// /////// END ACTIVE TOOL ///////\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction onImageRendered(e) {\n var eventData = e.detail;\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n var toolData = (0, _toolState.getToolState)(e.currentTarget, toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n var cornerstone = _externalModules2.default.cornerstone;\n var config = freehand.getConfiguration();\n\n // We have tool data for this element - iterate over each one and draw it\n var context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n var color = void 0;\n var lineWidth = _toolStyle2.default.getToolWidth();\n var fillColor = _toolColors2.default.getFillColor();\n\n for (var i = 0; i < toolData.data.length; i++) {\n context.save();\n\n var data = toolData.data[i];\n\n if (data.active) {\n color = _toolColors2.default.getActiveColor();\n fillColor = _toolColors2.default.getFillColor();\n } else {\n color = _toolColors2.default.getToolColor();\n fillColor = _toolColors2.default.getToolColor();\n }\n\n var handleStart = void 0;\n\n if (data.handles.length) {\n for (var j = 0; j < data.handles.length; j++) {\n // Draw a line between handle j and j+1\n handleStart = data.handles[j];\n var handleStartCanvas = cornerstone.pixelToCanvas(eventData.element, handleStart);\n\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.moveTo(handleStartCanvas.x, handleStartCanvas.y);\n\n for (var k = 0; k < data.handles[j].lines.length; k++) {\n var lineCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles[j].lines[k]);\n\n context.lineTo(lineCanvas.x, lineCanvas.y);\n context.stroke();\n }\n\n var mouseLocationCanvas = cornerstone.pixelToCanvas(eventData.element, config.mouseLocation.handles.start);\n\n if (j === data.handles.length - 1) {\n if (data.active && !config.freehand && !config.modifying) {\n // If it's still being actively drawn, keep the last line to\n // The mouse location\n context.lineTo(mouseLocationCanvas.x, mouseLocationCanvas.y);\n context.stroke();\n }\n }\n }\n }\n\n // If the tool is active, draw a handle at the cursor location\n var options = {\n fill: fillColor\n };\n\n if (data.active) {\n (0, _drawHandles2.default)(context, eventData, config.mouseLocation.handles, color, options);\n }\n // Draw the handles\n (0, _drawHandles2.default)(context, eventData, data.handles, color, options);\n\n context.restore();\n }\n}\n\n// /////// END IMAGE RENDERING ///////\nfunction enable(element) {\n element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback);\n element.removeEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback);\n element.removeEventListener(_events2.default.IMAGE_RENDERED, onImageRendered);\n\n element.addEventListener(_events2.default.IMAGE_RENDERED, onImageRendered);\n _externalModules2.default.cornerstone.updateImage(element);\n}\n\n// Disables the reference line tool for the given element\nfunction disable(element) {\n element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback);\n element.removeEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback);\n element.removeEventListener(_events2.default.IMAGE_RENDERED, onImageRendered);\n _externalModules2.default.cornerstone.updateImage(element);\n}\n\n// Visible and interactive\nfunction activate(element, mouseButtonMask) {\n (0, _toolOptions.setToolOptions)(toolType, element, { mouseButtonMask: mouseButtonMask });\n\n element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback);\n element.removeEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback);\n element.removeEventListener(_events2.default.IMAGE_RENDERED, onImageRendered);\n\n element.addEventListener(_events2.default.IMAGE_RENDERED, onImageRendered);\n element.addEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback);\n\n _externalModules2.default.cornerstone.updateImage(element);\n}\n\n// Visible, but not interactive\nfunction deactivate(element) {\n element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback);\n element.removeEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMoveCallback);\n element.removeEventListener(_events2.default.IMAGE_RENDERED, onImageRendered);\n\n element.addEventListener(_events2.default.IMAGE_RENDERED, onImageRendered);\n\n _externalModules2.default.cornerstone.updateImage(element);\n}\n\nfunction getConfiguration() {\n return configuration;\n}\n\nfunction setConfiguration(config) {\n configuration = config;\n}\n\n// Module/private exports\nvar freehand = {\n enable: enable,\n disable: disable,\n activate: activate,\n deactivate: deactivate,\n getConfiguration: getConfiguration,\n setConfiguration: setConfiguration\n};\n\nexports.freehand = freehand;\n\n/***/ }),\n/* 101 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.highlightTouch = exports.highlight = undefined;\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _mouseButtonRectangleTool = __webpack_require__(55);\n\nvar _mouseButtonRectangleTool2 = _interopRequireDefault(_mouseButtonRectangleTool);\n\nvar _touchTool = __webpack_require__(11);\n\nvar _touchTool2 = _interopRequireDefault(_touchTool);\n\nvar _toolStyle = __webpack_require__(8);\n\nvar _toolStyle2 = _interopRequireDefault(_toolStyle);\n\nvar _toolColors = __webpack_require__(6);\n\nvar _toolColors2 = _interopRequireDefault(_toolColors);\n\nvar _drawHandles = __webpack_require__(10);\n\nvar _drawHandles2 = _interopRequireDefault(_drawHandles);\n\nvar _toolState = __webpack_require__(2);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'highlight';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement(mouseEventData) {\n // If already a highlight measurement, creating a new one will be useless\n var existingToolData = (0, _toolState.getToolState)(mouseEventData.event.currentTarget, toolType);\n\n if (existingToolData && existingToolData.data && existingToolData.data.length > 0) {\n return;\n }\n\n // Create the measurement data for this tool with the end handle activated\n var measurementData = {\n visible: true,\n active: true,\n handles: {\n start: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n }\n }\n };\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\nfunction pointInsideRect(element, data, coords) {\n var cornerstone = _externalModules2.default.cornerstone;\n var startCanvas = cornerstone.pixelToCanvas(element, data.handles.start);\n var endCanvas = cornerstone.pixelToCanvas(element, data.handles.end);\n\n var rect = {\n left: Math.min(startCanvas.x, endCanvas.x),\n top: Math.min(startCanvas.y, endCanvas.y),\n width: Math.abs(startCanvas.x - endCanvas.x),\n height: Math.abs(startCanvas.y - endCanvas.y)\n };\n\n var insideBox = false;\n\n if (coords.x >= rect.left && coords.x <= rect.left + rect.width && coords.y >= rect.top && coords.y <= rect.top + rect.height) {\n insideBox = true;\n }\n\n return insideBox;\n}\n\nfunction pointNearTool(element, data, coords) {\n var cornerstone = _externalModules2.default.cornerstone;\n var startCanvas = cornerstone.pixelToCanvas(element, data.handles.start);\n var endCanvas = cornerstone.pixelToCanvas(element, data.handles.end);\n\n var rect = {\n left: Math.min(startCanvas.x, endCanvas.x),\n top: Math.min(startCanvas.y, endCanvas.y),\n width: Math.abs(startCanvas.x - endCanvas.x),\n height: Math.abs(startCanvas.y - endCanvas.y)\n };\n\n var distanceToPoint = _externalModules2.default.cornerstoneMath.rect.distanceToPoint(rect, coords);\n\n return distanceToPoint < 5;\n}\n\n// /////// BEGIN IMAGE RENDERING ///////\n\nfunction onImageRendered(e) {\n var eventData = e.detail;\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n var toolData = (0, _toolState.getToolState)(e.currentTarget, toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n var cornerstone = _externalModules2.default.cornerstone;\n // We have tool data for this elemen\n var context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n var color = void 0;\n var lineWidth = _toolStyle2.default.getToolWidth();\n\n context.save();\n\n var data = toolData.data[0];\n\n if (!data) {\n return;\n }\n\n if (data.active) {\n color = _toolColors2.default.getActiveColor();\n } else {\n color = _toolColors2.default.getToolColor();\n }\n\n var handleStartCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.start);\n var handleEndCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.end);\n\n var rect = {\n left: Math.min(handleStartCanvas.x, handleEndCanvas.x),\n top: Math.min(handleStartCanvas.y, handleEndCanvas.y),\n width: Math.abs(handleStartCanvas.x - handleEndCanvas.x),\n height: Math.abs(handleStartCanvas.y - handleEndCanvas.y)\n };\n\n // Draw dark fill outside the rectangle\n context.beginPath();\n context.strokeStyle = 'transparent';\n\n context.rect(0, 0, context.canvas.clientWidth, context.canvas.clientHeight);\n\n context.rect(rect.width + rect.left, rect.top, -rect.width, rect.height);\n context.stroke();\n context.fillStyle = 'rgba(0,0,0,0.7)';\n context.fill();\n context.closePath();\n\n // Draw dashed stroke rectangle\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.setLineDash([4]);\n context.strokeRect(rect.left, rect.top, rect.width, rect.height);\n\n // Strange fix, but restore doesn't seem to reset the line dashes?\n context.setLineDash([]);\n\n // Draw the handles last, so they will be on top of the overlay\n (0, _drawHandles2.default)(context, eventData, data.handles, color);\n context.restore();\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nvar preventHandleOutsideImage = true;\n\nvar highlight = (0, _mouseButtonRectangleTool2.default)({\n createNewMeasurement: createNewMeasurement,\n onImageRendered: onImageRendered,\n pointNearTool: pointNearTool,\n pointInsideRect: pointInsideRect,\n toolType: toolType\n}, preventHandleOutsideImage);\n\nvar highlightTouch = (0, _touchTool2.default)({\n createNewMeasurement: createNewMeasurement,\n onImageRendered: onImageRendered,\n pointNearTool: pointNearTool,\n pointInsideRect: pointInsideRect,\n toolType: toolType\n}, preventHandleOutsideImage);\n\nexports.highlight = highlight;\nexports.highlightTouch = highlightTouch;\n\n/***/ }),\n/* 102 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _displayTool = __webpack_require__(26);\n\nvar _displayTool2 = _interopRequireDefault(_displayTool);\n\nvar _drawTextBox = __webpack_require__(7);\n\nvar _drawTextBox2 = _interopRequireDefault(_drawTextBox);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction onImageRendered(e) {\n var eventData = e.detail;\n var image = eventData.image;\n var stats = image.stats;\n\n var context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n var textLines = [];\n\n Object.keys(stats).forEach(function (key) {\n var text = key + ' : ' + stats[key];\n\n textLines.push(text);\n });\n\n (0, _drawTextBox2.default)(context, textLines, 0, 0, 'orange');\n\n textLines.forEach(function (text) {\n console.log(text);\n });\n}\n\nvar imageStats = (0, _displayTool2.default)(onImageRendered);\n\nexports.default = imageStats;\n\n/***/ }),\n/* 103 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.lengthTouch = exports.length = undefined;\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _mouseButtonTool = __webpack_require__(9);\n\nvar _mouseButtonTool2 = _interopRequireDefault(_mouseButtonTool);\n\nvar _touchTool = __webpack_require__(11);\n\nvar _touchTool2 = _interopRequireDefault(_touchTool);\n\nvar _drawTextBox = __webpack_require__(7);\n\nvar _drawTextBox2 = _interopRequireDefault(_drawTextBox);\n\nvar _toolStyle = __webpack_require__(8);\n\nvar _toolStyle2 = _interopRequireDefault(_toolStyle);\n\nvar _toolColors = __webpack_require__(6);\n\nvar _toolColors2 = _interopRequireDefault(_toolColors);\n\nvar _drawHandles = __webpack_require__(10);\n\nvar _drawHandles2 = _interopRequireDefault(_drawHandles);\n\nvar _toolState = __webpack_require__(2);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'length';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement(mouseEventData) {\n // Create the measurement data for this tool with the end handle activated\n var measurementData = {\n visible: true,\n active: true,\n handles: {\n start: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n },\n textBox: {\n active: false,\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n }\n }\n };\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\nfunction pointNearTool(element, data, coords) {\n var cornerstone = _externalModules2.default.cornerstone;\n var lineSegment = {\n start: cornerstone.pixelToCanvas(element, data.handles.start),\n end: cornerstone.pixelToCanvas(element, data.handles.end)\n };\n var distanceToPoint = _externalModules2.default.cornerstoneMath.lineSegment.distanceToPoint(lineSegment, coords);\n\n return distanceToPoint < 25;\n}\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction onImageRendered(e) {\n var eventData = e.detail;\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n var toolData = (0, _toolState.getToolState)(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n var cornerstone = _externalModules2.default.cornerstone;\n // We have tool data for this element - iterate over each one and draw it\n var context = eventData.canvasContext.canvas.getContext('2d');\n var image = eventData.image,\n element = eventData.element;\n\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n var lineWidth = _toolStyle2.default.getToolWidth();\n var config = length.getConfiguration();\n var imagePlane = cornerstone.metaData.get('imagePlaneModule', image.imageId);\n var rowPixelSpacing = void 0;\n var colPixelSpacing = void 0;\n\n if (imagePlane) {\n rowPixelSpacing = imagePlane.rowPixelSpacing || imagePlane.rowImagePixelSpacing;\n colPixelSpacing = imagePlane.columnPixelSpacing || imagePlane.colImagePixelSpacing;\n } else {\n rowPixelSpacing = image.rowPixelSpacing;\n colPixelSpacing = image.columnPixelSpacing;\n }\n\n for (var i = 0; i < toolData.data.length; i++) {\n context.save();\n\n // Configurable shadow\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n var data = toolData.data[i];\n var color = _toolColors2.default.getColorIfActive(data.active);\n\n // Get the handle positions in canvas coordinates\n var handleStartCanvas = cornerstone.pixelToCanvas(element, data.handles.start);\n var handleEndCanvas = cornerstone.pixelToCanvas(element, data.handles.end);\n\n // Draw the measurement line\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.moveTo(handleStartCanvas.x, handleStartCanvas.y);\n context.lineTo(handleEndCanvas.x, handleEndCanvas.y);\n context.stroke();\n\n // Draw the handles\n var handleOptions = {\n drawHandlesIfActive: config && config.drawHandlesOnHover\n };\n\n (0, _drawHandles2.default)(context, eventData, data.handles, color, handleOptions);\n\n // Draw the text\n context.fillStyle = color;\n\n // Set rowPixelSpacing and columnPixelSpacing to 1 if they are undefined (or zero)\n var dx = (data.handles.end.x - data.handles.start.x) * (rowPixelSpacing || 1);\n var dy = (data.handles.end.y - data.handles.start.y) * (colPixelSpacing || 1);\n\n // Calculate the length, and create the text variable with the millimeters or pixels suffix\n var _length = Math.sqrt(dx * dx + dy * dy);\n\n // Store the length inside the tool for outside access\n data.length = _length;\n\n // Set the length text suffix depending on whether or not pixelSpacing is available\n var suffix = ' mm';\n\n if (!rowPixelSpacing || !colPixelSpacing) {\n suffix = ' pixels';\n }\n\n // Store the length measurement text\n var text = '' + _length.toFixed(2) + suffix;\n\n if (!data.handles.textBox.hasMoved) {\n var coords = {\n x: Math.max(data.handles.start.x, data.handles.end.x)\n };\n\n // Depending on which handle has the largest x-value,\n // Set the y-value for the text box\n if (coords.x === data.handles.start.x) {\n coords.y = data.handles.start.y;\n } else {\n coords.y = data.handles.end.y;\n }\n\n data.handles.textBox.x = coords.x;\n data.handles.textBox.y = coords.y;\n }\n\n var textCoords = cornerstone.pixelToCanvas(eventData.element, data.handles.textBox);\n\n // Move the textbox slightly to the right and upwards\n // So that it sits beside the length tool handle\n textCoords.x += 10;\n\n var options = {\n centering: {\n x: false,\n y: true\n }\n };\n\n // Draw the textbox\n var boundingBox = (0, _drawTextBox2.default)(context, text, textCoords.x, textCoords.y, color, options);\n\n data.handles.textBox.boundingBox = boundingBox;\n\n if (data.handles.textBox.hasMoved) {\n // Draw dashed link line between ellipse and text\n var link = {\n start: {},\n end: {}\n };\n\n var midpointCanvas = {\n x: (handleStartCanvas.x + handleEndCanvas.x) / 2,\n y: (handleStartCanvas.y + handleEndCanvas.y) / 2\n };\n\n var points = [handleStartCanvas, handleEndCanvas, midpointCanvas];\n\n link.end.x = textCoords.x;\n link.end.y = textCoords.y;\n\n link.start = _externalModules2.default.cornerstoneMath.point.findClosestPoint(points, link.end);\n\n var boundingBoxPoints = [{\n // Top middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top\n }, {\n // Left middle point of bounding box\n x: boundingBox.left,\n y: boundingBox.top + boundingBox.height / 2\n }, {\n // Bottom middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top + boundingBox.height\n }, {\n // Right middle point of bounding box\n x: boundingBox.left + boundingBox.width,\n y: boundingBox.top + boundingBox.height / 2\n }];\n\n link.end = _externalModules2.default.cornerstoneMath.point.findClosestPoint(boundingBoxPoints, link.start);\n\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.setLineDash([2, 3]);\n context.moveTo(link.start.x, link.start.y);\n context.lineTo(link.end.x, link.end.y);\n context.stroke();\n }\n\n context.restore();\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nvar length = (0, _mouseButtonTool2.default)({\n createNewMeasurement: createNewMeasurement,\n onImageRendered: onImageRendered,\n pointNearTool: pointNearTool,\n toolType: toolType\n});\n\nvar lengthTouch = (0, _touchTool2.default)({\n createNewMeasurement: createNewMeasurement,\n onImageRendered: onImageRendered,\n pointNearTool: pointNearTool,\n toolType: toolType\n});\n\nexports.length = length;\nexports.lengthTouch = lengthTouch;\n\n/***/ }),\n/* 104 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.magnifyTouchDrag = exports.magnify = undefined;\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _touchDragTool = __webpack_require__(15);\n\nvar _touchDragTool2 = _interopRequireDefault(_touchDragTool);\n\nvar _getMaxSimultaneousRequests = __webpack_require__(22);\n\nvar _isMouseButtonEnabled = __webpack_require__(4);\n\nvar _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled);\n\nvar _toolOptions = __webpack_require__(3);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'magnify';\n\nvar configuration = {\n magnifySize: 100,\n magnificationLevel: 2\n};\n\nvar browserName = void 0;\n\nvar currentPoints = void 0;\n\n/** Remove the magnifying glass when the mouse event ends */\nfunction mouseUpCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n\n element.removeEventListener(_events2.default.MOUSE_DRAG, dragCallback);\n element.removeEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback);\n element.removeEventListener(_events2.default.NEW_IMAGE, newImageCallback);\n hideTool(eventData);\n}\n\nfunction hideTool(eventData) {\n var element = eventData.element;\n\n element.querySelector('.magnifyTool').style.display = 'none';\n\n // Re-enable the mouse cursor\n document.body.style.cursor = 'default';\n}\n\n/** Draw the magnifying glass on mouseDown, and begin tracking mouse movements */\nfunction mouseDownCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n var options = (0, _toolOptions.getToolOptions)(toolType, element);\n\n if ((0, _isMouseButtonEnabled2.default)(eventData.which, options.mouseButtonMask)) {\n element.addEventListener(_events2.default.MOUSE_DRAG, dragCallback);\n element.addEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n element.addEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback);\n\n currentPoints = eventData.currentPoints;\n element.addEventListener(_events2.default.NEW_IMAGE, newImageCallback);\n drawMagnificationTool(eventData);\n\n e.preventDefault();\n e.stopPropagation();\n }\n}\n\nfunction newImageCallback(e) {\n var eventData = e.detail;\n\n eventData.currentPoints = currentPoints;\n drawMagnificationTool(eventData);\n}\n\nfunction dragEndCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n\n element.removeEventListener(_events2.default.TOUCH_DRAG_END, dragEndCallback);\n element.removeEventListener(_events2.default.TOUCH_END, dragEndCallback);\n element.removeEventListener(_events2.default.NEW_IMAGE, newImageCallback);\n hideTool(eventData);\n}\n\n/** Drag callback is triggered by both the touch and mouse magnify tools */\nfunction dragCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n\n currentPoints = eventData.currentPoints;\n\n drawMagnificationTool(eventData);\n if (eventData.isTouchEvent === true) {\n element.addEventListener(_events2.default.TOUCH_DRAG_END, dragEndCallback);\n element.addEventListener(_events2.default.TOUCH_END, dragEndCallback);\n }\n\n e.preventDefault();\n e.stopPropagation();\n}\n\n/** Draws the magnifying glass */\nfunction drawMagnificationTool(eventData) {\n var element = eventData.element;\n var magnifyCanvas = element.querySelector('.magnifyTool');\n\n if (!magnifyCanvas) {\n createMagnificationCanvas(eventData.element);\n }\n\n var config = magnify.getConfiguration();\n\n var magnifySize = config.magnifySize;\n var magnificationLevel = config.magnificationLevel;\n\n // The 'not' magnifyTool class here is necessary because cornerstone places\n // No classes of it's own on the canvas we want to select\n var canvas = element.querySelector('canvas:not(.magnifyTool)');\n var context = canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n var zoomCtx = magnifyCanvas.getContext('2d');\n\n zoomCtx.setTransform(1, 0, 0, 1, 0, 0);\n\n var getSize = magnifySize / magnificationLevel;\n\n // Calculate the on-canvas location of the mouse pointer / touch\n var canvasLocation = _externalModules2.default.cornerstone.pixelToCanvas(eventData.element, eventData.currentPoints.image);\n\n if (eventData.isTouchEvent === true) {\n canvasLocation.y -= 1.25 * getSize;\n }\n\n canvasLocation.x = Math.max(canvasLocation.x, 0);\n canvasLocation.x = Math.min(canvasLocation.x, canvas.width);\n\n canvasLocation.y = Math.max(canvasLocation.y, 0);\n canvasLocation.y = Math.min(canvasLocation.y, canvas.height);\n\n // Clear the rectangle\n zoomCtx.clearRect(0, 0, magnifySize, magnifySize);\n zoomCtx.fillStyle = 'transparent';\n\n // Fill it with the pixels that the mouse is clicking on\n zoomCtx.fillRect(0, 0, magnifySize, magnifySize);\n\n var copyFrom = {\n x: canvasLocation.x - 0.5 * getSize,\n y: canvasLocation.y - 0.5 * getSize\n };\n\n if (browserName === 'Safari') {\n // Safari breaks when trying to copy pixels with negative indices\n // This prevents proper Magnify usage\n copyFrom.x = Math.max(copyFrom.x, 0);\n copyFrom.y = Math.max(copyFrom.y, 0);\n }\n\n copyFrom.x = Math.min(copyFrom.x, canvas.width);\n copyFrom.y = Math.min(copyFrom.y, canvas.height);\n\n var scaledMagnify = {\n x: (canvas.width - copyFrom.x) * magnificationLevel,\n y: (canvas.height - copyFrom.y) * magnificationLevel\n };\n\n zoomCtx.drawImage(canvas, copyFrom.x, copyFrom.y, canvas.width - copyFrom.x, canvas.height - copyFrom.y, 0, 0, scaledMagnify.x, scaledMagnify.y);\n\n // Place the magnification tool at the same location as the pointer\n magnifyCanvas.style.top = canvasLocation.y - 0.5 * magnifySize + 'px';\n magnifyCanvas.style.left = canvasLocation.x - 0.5 * magnifySize + 'px';\n\n magnifyCanvas.style.display = 'block';\n\n // Hide the mouse cursor, so the user can see better\n document.body.style.cursor = 'none';\n}\n\n/** Creates the magnifying glass canvas */\nfunction createMagnificationCanvas(element) {\n // If the magnifying glass canvas doesn't already exist\n if (element.querySelector('.magnifyTool') === null) {\n // Create a canvas and append it as a child to the element\n var magnifyCanvas = document.createElement('canvas');\n // The magnifyTool class is used to find the canvas later on\n\n magnifyCanvas.classList.add('magnifyTool');\n\n var config = magnify.getConfiguration();\n\n magnifyCanvas.width = config.magnifySize;\n magnifyCanvas.height = config.magnifySize;\n\n // Make sure position is absolute so the canvas can follow the mouse / touch\n magnifyCanvas.style.position = 'absolute';\n element.appendChild(magnifyCanvas);\n }\n}\n\n/** Find the magnifying glass canvas and remove it */\nfunction removeMagnificationCanvas(element) {\n var magnifyCanvas = element.querySelector('.magnifyTool');\n\n if (magnifyCanvas) {\n element.removeChild(magnifyCanvas);\n }\n}\n\n// --- Mouse tool activate / disable --- //\nfunction disable(element) {\n element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback);\n removeMagnificationCanvas(element);\n}\n\nfunction enable(element) {\n if (!browserName) {\n var infoString = (0, _getMaxSimultaneousRequests.getBrowserInfo)();\n var info = infoString.split(' ');\n\n browserName = info[0];\n }\n\n createMagnificationCanvas(element);\n}\n\nfunction activate(element, mouseButtonMask) {\n (0, _toolOptions.setToolOptions)(toolType, element, { mouseButtonMask: mouseButtonMask });\n\n element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback);\n\n element.addEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback);\n createMagnificationCanvas(element);\n}\n\n// --- Touch tool activate / disable --- //\nfunction getConfiguration() {\n return configuration;\n}\n\nfunction setConfiguration(config) {\n configuration = config;\n}\n\n// Module exports\nvar magnify = {\n enable: enable,\n activate: activate,\n deactivate: disable,\n disable: disable,\n getConfiguration: getConfiguration,\n setConfiguration: setConfiguration\n};\n\nvar options = {\n fireOnTouchStart: true,\n activateCallback: createMagnificationCanvas,\n disableCallback: removeMagnificationCanvas\n};\n\nvar magnifyTouchDrag = (0, _touchDragTool2.default)(dragCallback, toolType, options);\n\nexports.magnify = magnify;\nexports.magnifyTouchDrag = magnifyTouchDrag;\n\n/***/ }),\n/* 105 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _index = __webpack_require__(43);\n\nvar _index2 = _interopRequireDefault(_index);\n\nvar _displayTool = __webpack_require__(26);\n\nvar _displayTool2 = _interopRequireDefault(_displayTool);\n\nvar _toolColors = __webpack_require__(6);\n\nvar _toolColors2 = _interopRequireDefault(_toolColors);\n\nvar _drawTextBox = __webpack_require__(7);\n\nvar _drawTextBox2 = _interopRequireDefault(_drawTextBox);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction getOrientationMarkers(element) {\n var cornerstone = _externalModules2.default.cornerstone;\n var enabledElement = cornerstone.getEnabledElement(element);\n var imagePlaneMetaData = cornerstone.metaData.get('imagePlaneModule', enabledElement.image.imageId);\n\n if (!imagePlaneMetaData || !imagePlaneMetaData.rowCosines || !imagePlaneMetaData.columnCosines) {\n return;\n }\n\n var rowString = _index2.default.getOrientationString(imagePlaneMetaData.rowCosines);\n var columnString = _index2.default.getOrientationString(imagePlaneMetaData.columnCosines);\n\n var oppositeRowString = _index2.default.invertOrientationString(rowString);\n var oppositeColumnString = _index2.default.invertOrientationString(columnString);\n\n return {\n top: oppositeColumnString,\n bottom: columnString,\n left: oppositeRowString,\n right: rowString\n };\n}\n\nfunction getOrientationMarkerPositions(element) {\n var cornerstone = _externalModules2.default.cornerstone;\n var enabledElement = cornerstone.getEnabledElement(element);\n var coords = void 0;\n\n coords = {\n x: enabledElement.image.width / 2,\n y: 5\n };\n var top = cornerstone.pixelToCanvas(element, coords);\n\n coords = {\n x: enabledElement.image.width / 2,\n y: enabledElement.image.height - 5\n };\n var bottom = cornerstone.pixelToCanvas(element, coords);\n\n coords = {\n x: 5,\n y: enabledElement.image.height / 2\n };\n var left = cornerstone.pixelToCanvas(element, coords);\n\n coords = {\n x: enabledElement.image.width - 10,\n y: enabledElement.image.height / 2\n };\n var right = cornerstone.pixelToCanvas(element, coords);\n\n return {\n top: top,\n bottom: bottom,\n left: left,\n right: right\n };\n}\n\nfunction onImageRendered(e) {\n var eventData = e.detail;\n var element = eventData.element;\n\n var markers = getOrientationMarkers(element);\n\n if (!markers) {\n return;\n }\n\n var coords = getOrientationMarkerPositions(element, markers);\n\n var context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n var color = _toolColors2.default.getToolColor();\n\n var textWidths = {\n top: context.measureText(markers.top).width,\n left: context.measureText(markers.left).width,\n right: context.measureText(markers.right).width,\n bottom: context.measureText(markers.bottom).width\n };\n\n (0, _drawTextBox2.default)(context, markers.top, coords.top.x - textWidths.top / 2, coords.top.y, color);\n (0, _drawTextBox2.default)(context, markers.left, coords.left.x - textWidths.left / 2, coords.left.y, color);\n\n var config = orientationMarkers.getConfiguration();\n\n if (config && config.drawAllMarkers) {\n (0, _drawTextBox2.default)(context, markers.right, coords.right.x - textWidths.right / 2, coords.right.y, color);\n (0, _drawTextBox2.default)(context, markers.bottom, coords.bottom.x - textWidths.bottom / 2, coords.bottom.y, color);\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nvar orientationMarkers = (0, _displayTool2.default)(onImageRendered);\n\nexports.default = orientationMarkers;\n\n/***/ }),\n/* 106 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.panTouchDrag = exports.pan = undefined;\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _simpleMouseButtonTool = __webpack_require__(16);\n\nvar _simpleMouseButtonTool2 = _interopRequireDefault(_simpleMouseButtonTool);\n\nvar _touchDragTool = __webpack_require__(15);\n\nvar _touchDragTool2 = _interopRequireDefault(_touchDragTool);\n\nvar _isMouseButtonEnabled = __webpack_require__(4);\n\nvar _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled);\n\nvar _toolOptions = __webpack_require__(3);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'pan';\n\nfunction mouseUpCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n\n element.removeEventListener(_events2.default.MOUSE_DRAG, dragCallback);\n element.removeEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback);\n}\n\nfunction mouseDownCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n var options = (0, _toolOptions.getToolOptions)(toolType, element);\n\n if ((0, _isMouseButtonEnabled2.default)(eventData.which, options.mouseButtonMask)) {\n element.addEventListener(_events2.default.MOUSE_DRAG, dragCallback);\n element.addEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n element.addEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback);\n\n e.preventDefault();\n e.stopPropagation();\n }\n}\n\nfunction dragCallback(e) {\n var eventData = e.detail;\n\n // FIXME: Copied from Cornerstone src/internal/calculateTransform.js, should be exposed from there.\n var widthScale = eventData.viewport.scale;\n var heightScale = eventData.viewport.scale;\n\n if (eventData.image.rowPixelSpacing < eventData.image.columnPixelSpacing) {\n widthScale *= eventData.image.columnPixelSpacing / eventData.image.rowPixelSpacing;\n } else if (eventData.image.columnPixelSpacing < eventData.image.rowPixelSpacing) {\n heightScale *= eventData.image.rowPixelSpacing / eventData.image.columnPixelSpacing;\n }\n\n eventData.viewport.translation.x += eventData.deltaPoints.page.x / widthScale;\n eventData.viewport.translation.y += eventData.deltaPoints.page.y / heightScale;\n _externalModules2.default.cornerstone.setViewport(eventData.element, eventData.viewport);\n\n e.preventDefault();\n e.stopPropagation();\n}\n\nvar pan = (0, _simpleMouseButtonTool2.default)(mouseDownCallback, toolType);\nvar panTouchDrag = (0, _touchDragTool2.default)(dragCallback, toolType);\n\nexports.pan = pan;\nexports.panTouchDrag = panTouchDrag;\n\n/***/ }),\n/* 107 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _multiTouchDragTool = __webpack_require__(40);\n\nvar _multiTouchDragTool2 = _interopRequireDefault(_multiTouchDragTool);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction touchPanCallback(e) {\n var eventData = e.detail;\n var config = panMultiTouch.getConfiguration();\n\n if (config && config.testPointers(eventData)) {\n eventData.viewport.translation.x += eventData.deltaPoints.page.x / eventData.viewport.scale;\n eventData.viewport.translation.y += eventData.deltaPoints.page.y / eventData.viewport.scale;\n _externalModules2.default.cornerstone.setViewport(eventData.element, eventData.viewport);\n\n e.preventDefault();\n e.stopPropagation();\n }\n}\n\nvar configuration = {\n testPointers: function testPointers(eventData) {\n return eventData.numPointers >= 2;\n }\n};\n\nvar panMultiTouch = (0, _multiTouchDragTool2.default)(touchPanCallback);\n\npanMultiTouch.setConfiguration(configuration);\n\nexports.default = panMultiTouch;\n\n/***/ }),\n/* 108 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.probeTouch = exports.probe = undefined;\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _mouseButtonTool = __webpack_require__(9);\n\nvar _mouseButtonTool2 = _interopRequireDefault(_mouseButtonTool);\n\nvar _touchTool = __webpack_require__(11);\n\nvar _touchTool2 = _interopRequireDefault(_touchTool);\n\nvar _toolColors = __webpack_require__(6);\n\nvar _toolColors2 = _interopRequireDefault(_toolColors);\n\nvar _textStyle = __webpack_require__(13);\n\nvar _textStyle2 = _interopRequireDefault(_textStyle);\n\nvar _drawHandles = __webpack_require__(10);\n\nvar _drawHandles2 = _interopRequireDefault(_drawHandles);\n\nvar _drawTextBox = __webpack_require__(7);\n\nvar _drawTextBox2 = _interopRequireDefault(_drawTextBox);\n\nvar _getRGBPixels = __webpack_require__(34);\n\nvar _getRGBPixels2 = _interopRequireDefault(_getRGBPixels);\n\nvar _calculateSUV = __webpack_require__(20);\n\nvar _calculateSUV2 = _interopRequireDefault(_calculateSUV);\n\nvar _toolState = __webpack_require__(2);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'probe';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement(mouseEventData) {\n // Create the measurement data for this tool with the end handle activated\n var measurementData = {\n visible: true,\n active: true,\n handles: {\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n }\n }\n };\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction pointNearTool(element, data, coords) {\n var endCanvas = _externalModules2.default.cornerstone.pixelToCanvas(element, data.handles.end);\n\n return _externalModules2.default.cornerstoneMath.point.distance(endCanvas, coords) < 5;\n}\n\nfunction onImageRendered(e) {\n var eventData = e.detail;\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n var toolData = (0, _toolState.getToolState)(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n var cornerstone = _externalModules2.default.cornerstone;\n // We have tool data for this element - iterate over each one and draw it\n var context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n var color = void 0;\n var font = _textStyle2.default.getFont();\n var fontHeight = _textStyle2.default.getFontSize();\n\n for (var i = 0; i < toolData.data.length; i++) {\n\n context.save();\n var data = toolData.data[i];\n\n if (data.active) {\n color = _toolColors2.default.getActiveColor();\n } else {\n color = _toolColors2.default.getToolColor();\n }\n\n // Draw the handles\n (0, _drawHandles2.default)(context, eventData, data.handles, color);\n\n var x = Math.round(data.handles.end.x);\n var y = Math.round(data.handles.end.y);\n var storedPixels = void 0;\n\n var text = void 0,\n str = void 0;\n\n if (x < 0 || y < 0 || x >= eventData.image.columns || y >= eventData.image.rows) {\n return;\n }\n\n if (eventData.image.color) {\n text = x + ', ' + y;\n storedPixels = (0, _getRGBPixels2.default)(eventData.element, x, y, 1, 1);\n str = 'R: ' + storedPixels[0] + ' G: ' + storedPixels[1] + ' B: ' + storedPixels[2];\n } else {\n storedPixels = cornerstone.getStoredPixels(eventData.element, x, y, 1, 1);\n var sp = storedPixels[0];\n var mo = sp * eventData.image.slope + eventData.image.intercept;\n var suv = (0, _calculateSUV2.default)(eventData.image, sp);\n\n // Draw text\n text = x + ', ' + y;\n str = 'SP: ' + sp + ' MO: ' + parseFloat(mo.toFixed(3));\n if (suv) {\n str += ' SUV: ' + parseFloat(suv.toFixed(3));\n }\n }\n\n var coords = {\n // Translate the x/y away from the cursor\n x: data.handles.end.x + 3,\n y: data.handles.end.y - 3\n };\n var textCoords = cornerstone.pixelToCanvas(eventData.element, coords);\n\n context.font = font;\n context.fillStyle = color;\n\n (0, _drawTextBox2.default)(context, str, textCoords.x, textCoords.y + fontHeight + 5, color);\n (0, _drawTextBox2.default)(context, text, textCoords.x, textCoords.y, color);\n context.restore();\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nvar probe = (0, _mouseButtonTool2.default)({\n createNewMeasurement: createNewMeasurement,\n onImageRendered: onImageRendered,\n pointNearTool: pointNearTool,\n toolType: toolType\n});\n\nvar probeTouch = (0, _touchTool2.default)({\n createNewMeasurement: createNewMeasurement,\n onImageRendered: onImageRendered,\n pointNearTool: pointNearTool,\n toolType: toolType\n});\n\nexports.probe = probe;\nexports.probeTouch = probeTouch;\n\n/***/ }),\n/* 109 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.rectangleRoiTouch = exports.rectangleRoi = undefined;\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _mouseButtonTool = __webpack_require__(9);\n\nvar _mouseButtonTool2 = _interopRequireDefault(_mouseButtonTool);\n\nvar _touchTool = __webpack_require__(11);\n\nvar _touchTool2 = _interopRequireDefault(_touchTool);\n\nvar _toolStyle = __webpack_require__(8);\n\nvar _toolStyle2 = _interopRequireDefault(_toolStyle);\n\nvar _toolColors = __webpack_require__(6);\n\nvar _toolColors2 = _interopRequireDefault(_toolColors);\n\nvar _drawHandles = __webpack_require__(10);\n\nvar _drawHandles2 = _interopRequireDefault(_drawHandles);\n\nvar _drawTextBox = __webpack_require__(7);\n\nvar _drawTextBox2 = _interopRequireDefault(_drawTextBox);\n\nvar _calculateSUV = __webpack_require__(20);\n\nvar _calculateSUV2 = _interopRequireDefault(_calculateSUV);\n\nvar _toolState = __webpack_require__(2);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'rectangleRoi';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement(mouseEventData) {\n // Create the measurement data for this tool with the end handle activated\n var measurementData = {\n visible: true,\n active: true,\n invalidated: true,\n handles: {\n start: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n },\n textBox: {\n active: false,\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n }\n }\n };\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\nfunction pointNearTool(element, data, coords) {\n var cornerstone = _externalModules2.default.cornerstone;\n var startCanvas = cornerstone.pixelToCanvas(element, data.handles.start);\n var endCanvas = cornerstone.pixelToCanvas(element, data.handles.end);\n\n var rect = {\n left: Math.min(startCanvas.x, endCanvas.x),\n top: Math.min(startCanvas.y, endCanvas.y),\n width: Math.abs(startCanvas.x - endCanvas.x),\n height: Math.abs(startCanvas.y - endCanvas.y)\n };\n\n var distanceToPoint = _externalModules2.default.cornerstoneMath.rect.distanceToPoint(rect, coords);\n\n return distanceToPoint < 5;\n}\n\n// /////// BEGIN IMAGE RENDERING ///////\n\nfunction calculateMeanStdDev(sp, ellipse) {\n // TODO: Get a real statistics library here that supports large counts\n\n var sum = 0;\n var sumSquared = 0;\n var count = 0;\n var index = 0;\n\n for (var y = ellipse.top; y < ellipse.top + ellipse.height; y++) {\n for (var x = ellipse.left; x < ellipse.left + ellipse.width; x++) {\n sum += sp[index];\n sumSquared += sp[index] * sp[index];\n count++;\n index++;\n }\n }\n\n if (count === 0) {\n return {\n count: count,\n mean: 0.0,\n variance: 0.0,\n stdDev: 0.0\n };\n }\n\n var mean = sum / count;\n var variance = sumSquared / count - mean * mean;\n\n return {\n count: count,\n mean: mean,\n variance: variance,\n stdDev: Math.sqrt(variance)\n };\n}\n\nfunction numberWithCommas(x) {\n // http://stackoverflow.com/questions/2901102/how-to-print-a-number-with-commas-as-thousands-separators-in-javascript\n var parts = x.toString().split('.');\n\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n\n return parts.join('.');\n}\n\nfunction onImageRendered(e) {\n var eventData = e.detail;\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n var toolData = (0, _toolState.getToolState)(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n var cornerstone = _externalModules2.default.cornerstone;\n var image = eventData.image;\n var element = eventData.element;\n var lineWidth = _toolStyle2.default.getToolWidth();\n var config = rectangleRoi.getConfiguration();\n var context = eventData.canvasContext.canvas.getContext('2d');\n var seriesModule = cornerstone.metaData.get('generalSeriesModule', image.imageId);\n var modality = void 0;\n\n if (seriesModule) {\n modality = seriesModule.modality;\n }\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // If we have tool data for this element - iterate over each set and draw it\n for (var i = 0; i < toolData.data.length; i++) {\n context.save();\n\n var data = toolData.data[i];\n\n // Apply any shadow settings defined in the tool configuration\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n // Check which color the rendered tool should be\n var color = _toolColors2.default.getColorIfActive(data.active);\n\n // Convert Image coordinates to Canvas coordinates given the element\n var handleStartCanvas = cornerstone.pixelToCanvas(element, data.handles.start);\n var handleEndCanvas = cornerstone.pixelToCanvas(element, data.handles.end);\n\n // Retrieve the bounds of the ellipse (left, top, width, and height)\n // In Canvas coordinates\n var leftCanvas = Math.min(handleStartCanvas.x, handleEndCanvas.x);\n var topCanvas = Math.min(handleStartCanvas.y, handleEndCanvas.y);\n var widthCanvas = Math.abs(handleStartCanvas.x - handleEndCanvas.x);\n var heightCanvas = Math.abs(handleStartCanvas.y - handleEndCanvas.y);\n\n // Draw the rectangle on the canvas\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.rect(leftCanvas, topCanvas, widthCanvas, heightCanvas);\n context.stroke();\n\n // If the tool configuration specifies to only draw the handles on hover / active,\n // Follow this logic\n if (config && config.drawHandlesOnHover) {\n // Draw the handles if the tool is active\n if (data.active === true) {\n (0, _drawHandles2.default)(context, eventData, data.handles, color);\n } else {\n // If the tool is inactive, draw the handles only if each specific handle is being\n // Hovered over\n var handleOptions = {\n drawHandlesIfActive: true\n };\n\n (0, _drawHandles2.default)(context, eventData, data.handles, color, handleOptions);\n }\n } else {\n // If the tool has no configuration settings, always draw the handles\n (0, _drawHandles2.default)(context, eventData, data.handles, color);\n }\n\n // Define variables for the area and mean/standard deviation\n var area = void 0,\n meanStdDev = void 0,\n meanStdDevSUV = void 0;\n\n // Perform a check to see if the tool has been invalidated. This is to prevent\n // Unnecessary re-calculation of the area, mean, and standard deviation if the\n // Image is re-rendered but the tool has not moved (e.g. during a zoom)\n if (data.invalidated === false) {\n // If the data is not invalidated, retrieve it from the toolData\n meanStdDev = data.meanStdDev;\n meanStdDevSUV = data.meanStdDevSUV;\n area = data.area;\n } else {\n // If the data has been invalidated, we need to calculate it again\n\n // Retrieve the bounds of the ellipse in image coordinates\n var ellipse = {\n left: Math.min(data.handles.start.x, data.handles.end.x),\n top: Math.min(data.handles.start.y, data.handles.end.y),\n width: Math.abs(data.handles.start.x - data.handles.end.x),\n height: Math.abs(data.handles.start.y - data.handles.end.y)\n };\n\n // First, make sure this is not a color image, since no mean / standard\n // Deviation will be calculated for color images.\n if (!image.color) {\n // Retrieve the array of pixels that the ellipse bounds cover\n var pixels = cornerstone.getPixels(element, ellipse.left, ellipse.top, ellipse.width, ellipse.height);\n\n // Calculate the mean & standard deviation from the pixels and the ellipse details\n meanStdDev = calculateMeanStdDev(pixels, ellipse);\n\n if (modality === 'PT') {\n // If the image is from a PET scan, use the DICOM tags to\n // Calculate the SUV from the mean and standard deviation.\n\n // Note that because we are using modality pixel values from getPixels, and\n // The calculateSUV routine also rescales to modality pixel values, we are first\n // Returning the values to storedPixel values before calcuating SUV with them.\n // TODO: Clean this up? Should we add an option to not scale in calculateSUV?\n meanStdDevSUV = {\n mean: (0, _calculateSUV2.default)(image, (meanStdDev.mean - image.intercept) / image.slope),\n stdDev: (0, _calculateSUV2.default)(image, (meanStdDev.stdDev - image.intercept) / image.slope)\n };\n }\n\n // If the mean and standard deviation values are sane, store them for later retrieval\n if (meanStdDev && !isNaN(meanStdDev.mean)) {\n data.meanStdDev = meanStdDev;\n data.meanStdDevSUV = meanStdDevSUV;\n }\n }\n\n // Retrieve the pixel spacing values, and if they are not\n // Real non-zero values, set them to 1\n var columnPixelSpacing = image.columnPixelSpacing || 1;\n var rowPixelSpacing = image.rowPixelSpacing || 1;\n\n // Calculate the image area from the ellipse dimensions and pixel spacing\n area = ellipse.width * columnPixelSpacing * (ellipse.height * rowPixelSpacing);\n\n // If the area value is sane, store it for later retrieval\n if (!isNaN(area)) {\n data.area = area;\n }\n\n // Set the invalidated flag to false so that this data won't automatically be recalculated\n data.invalidated = false;\n }\n\n // Define an array to store the rows of text for the textbox\n var textLines = [];\n\n // If the mean and standard deviation values are present, display them\n if (meanStdDev && meanStdDev.mean) {\n // If the modality is CT, add HU to denote Hounsfield Units\n var moSuffix = '';\n\n if (modality === 'CT') {\n moSuffix = ' HU';\n }\n\n // Create a line of text to display the mean and any units that were specified (i.e. HU)\n var meanText = 'Mean: ' + numberWithCommas(meanStdDev.mean.toFixed(2)) + moSuffix;\n // Create a line of text to display the standard deviation and any units that were specified (i.e. HU)\n var stdDevText = 'StdDev: ' + numberWithCommas(meanStdDev.stdDev.toFixed(2)) + moSuffix;\n\n // If this image has SUV values to display, concatenate them to the text line\n if (meanStdDevSUV && meanStdDevSUV.mean !== undefined) {\n var SUVtext = ' SUV: ';\n\n meanText += SUVtext + numberWithCommas(meanStdDevSUV.mean.toFixed(2));\n stdDevText += SUVtext + numberWithCommas(meanStdDevSUV.stdDev.toFixed(2));\n }\n\n // Add these text lines to the array to be displayed in the textbox\n textLines.push(meanText);\n textLines.push(stdDevText);\n }\n\n // If the area is a sane value, display it\n if (area) {\n // Determine the area suffix based on the pixel spacing in the image.\n // If pixel spacing is present, use millimeters. Otherwise, use pixels.\n // This uses Char code 178 for a superscript 2\n var suffix = ' mm' + String.fromCharCode(178);\n\n if (!image.rowPixelSpacing || !image.columnPixelSpacing) {\n suffix = ' pixels' + String.fromCharCode(178);\n }\n\n // Create a line of text to display the area and its units\n var areaText = 'Area: ' + numberWithCommas(area.toFixed(2)) + suffix;\n\n // Add this text line to the array to be displayed in the textbox\n textLines.push(areaText);\n }\n\n // If the textbox has not been moved by the user, it should be displayed on the right-most\n // Side of the tool.\n if (!data.handles.textBox.hasMoved) {\n // Find the rightmost side of the ellipse at its vertical center, and place the textbox here\n // Note that this calculates it in image coordinates\n data.handles.textBox.x = Math.max(data.handles.start.x, data.handles.end.x);\n data.handles.textBox.y = (data.handles.start.y + data.handles.end.y) / 2;\n }\n\n // Convert the textbox Image coordinates into Canvas coordinates\n var textCoords = cornerstone.pixelToCanvas(element, data.handles.textBox);\n\n // Set options for the textbox drawing function\n var options = {\n centering: {\n x: false,\n y: true\n }\n };\n\n // Draw the textbox and retrieves it's bounding box for mouse-dragging and highlighting\n var boundingBox = (0, _drawTextBox2.default)(context, textLines, textCoords.x, textCoords.y, color, options);\n\n // Store the bounding box data in the handle for mouse-dragging and highlighting\n data.handles.textBox.boundingBox = boundingBox;\n\n // If the textbox has moved, we would like to draw a line linking it with the tool\n // This section decides where to draw this line to on the Ellipse based on the location\n // Of the textbox relative to the ellipse.\n if (data.handles.textBox.hasMoved) {\n // Draw dashed link line between tool and text\n\n // The initial link position is at the center of the\n // Textbox.\n var link = {\n start: {},\n end: {\n x: textCoords.x,\n y: textCoords.y\n }\n };\n\n // First we calculate the ellipse points (top, left, right, and bottom)\n var ellipsePoints = [{\n // Top middle point of ellipse\n x: leftCanvas + widthCanvas / 2,\n y: topCanvas\n }, {\n // Left middle point of ellipse\n x: leftCanvas,\n y: topCanvas + heightCanvas / 2\n }, {\n // Bottom middle point of ellipse\n x: leftCanvas + widthCanvas / 2,\n y: topCanvas + heightCanvas\n }, {\n // Right middle point of ellipse\n x: leftCanvas + widthCanvas,\n y: topCanvas + heightCanvas / 2\n }];\n\n // We obtain the link starting point by finding the closest point on the ellipse to the\n // Center of the textbox\n link.start = _externalModules2.default.cornerstoneMath.point.findClosestPoint(ellipsePoints, link.end);\n\n // Next we calculate the corners of the textbox bounding box\n var boundingBoxPoints = [{\n // Top middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top\n }, {\n // Left middle point of bounding box\n x: boundingBox.left,\n y: boundingBox.top + boundingBox.height / 2\n }, {\n // Bottom middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top + boundingBox.height\n }, {\n // Right middle point of bounding box\n x: boundingBox.left + boundingBox.width,\n y: boundingBox.top + boundingBox.height / 2\n }];\n\n // Now we recalculate the link endpoint by identifying which corner of the bounding box\n // Is closest to the start point we just calculated.\n link.end = _externalModules2.default.cornerstoneMath.point.findClosestPoint(boundingBoxPoints, link.start);\n\n // Finally we draw the dashed linking line\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.setLineDash([2, 3]);\n context.moveTo(link.start.x, link.start.y);\n context.lineTo(link.end.x, link.end.y);\n context.stroke();\n }\n\n context.restore();\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nvar rectangleRoi = (0, _mouseButtonTool2.default)({\n createNewMeasurement: createNewMeasurement,\n onImageRendered: onImageRendered,\n pointNearTool: pointNearTool,\n toolType: toolType\n});\n\nvar rectangleRoiTouch = (0, _touchTool2.default)({\n createNewMeasurement: createNewMeasurement,\n onImageRendered: onImageRendered,\n pointNearTool: pointNearTool,\n toolType: toolType\n});\n\nexports.rectangleRoi = rectangleRoi;\nexports.rectangleRoiTouch = rectangleRoiTouch;\n\n/***/ }),\n/* 110 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.rotateTouchDrag = exports.rotate = undefined;\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _simpleMouseButtonTool = __webpack_require__(16);\n\nvar _simpleMouseButtonTool2 = _interopRequireDefault(_simpleMouseButtonTool);\n\nvar _touchDragTool = __webpack_require__(15);\n\nvar _touchDragTool2 = _interopRequireDefault(_touchDragTool);\n\nvar _isMouseButtonEnabled = __webpack_require__(4);\n\nvar _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled);\n\nvar _toolOptions = __webpack_require__(3);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'rotate';\n\n// --- Strategies --- //\nfunction defaultStrategy(eventData) {\n // Calculate distance from the center of the image\n var rect = eventData.element.getBoundingClientRect(eventData.element);\n\n var points = {\n x: eventData.currentPoints.client.x,\n y: eventData.currentPoints.client.y\n };\n\n var width = eventData.element.clientWidth;\n var height = eventData.element.clientHeight;\n\n var pointsFromCenter = {\n x: points.x - rect.left - width / 2,\n // Invert the coordinate system so that up is positive\n y: -1 * (points.y - rect.top - height / 2)\n };\n\n var rotationRadians = Math.atan2(pointsFromCenter.y, pointsFromCenter.x);\n var rotationDegrees = rotationRadians * (180 / Math.PI);\n var rotation = -1 * rotationDegrees + 90;\n\n eventData.viewport.rotation = rotation;\n _externalModules2.default.cornerstone.setViewport(eventData.element, eventData.viewport);\n}\n\nfunction horizontalStrategy(eventData) {\n eventData.viewport.rotation += eventData.deltaPoints.page.x / eventData.viewport.scale;\n _externalModules2.default.cornerstone.setViewport(eventData.element, eventData.viewport);\n}\n\nfunction verticalStrategy(eventData) {\n eventData.viewport.rotation += eventData.deltaPoints.page.y / eventData.viewport.scale;\n _externalModules2.default.cornerstone.setViewport(eventData.element, eventData.viewport);\n}\n\n// --- Mouse event callbacks --- //\nfunction mouseUpCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n\n element.removeEventListener(_events2.default.MOUSE_DRAG, dragCallback);\n element.removeEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback);\n}\n\nfunction mouseDownCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n var options = (0, _toolOptions.getToolOptions)(toolType, element);\n\n if ((0, _isMouseButtonEnabled2.default)(eventData.which, options.mouseButtonMask)) {\n element.addEventListener(_events2.default.MOUSE_DRAG, dragCallback);\n element.addEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n element.addEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback);\n\n e.preventDefault();\n e.stopPropagation();\n }\n}\n\nfunction dragCallback(e) {\n var eventData = e.detail;\n\n rotate.strategy(eventData);\n _externalModules2.default.cornerstone.setViewport(eventData.element, eventData.viewport);\n\n e.preventDefault();\n e.stopPropagation();\n}\n\nvar rotate = (0, _simpleMouseButtonTool2.default)(mouseDownCallback, toolType);\n\nrotate.strategies = {\n default: defaultStrategy,\n horizontal: horizontalStrategy,\n vertical: verticalStrategy\n};\n\nrotate.strategy = defaultStrategy;\n\nvar rotateTouchDrag = (0, _touchDragTool2.default)(dragCallback, toolType);\n\nexports.rotate = rotate;\nexports.rotateTouchDrag = rotateTouchDrag;\n\n/***/ }),\n/* 111 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction touchRotateCallback(e) {\n var eventData = e.detail;\n\n eventData.viewport.rotation += eventData.rotation;\n _externalModules2.default.cornerstone.setViewport(eventData.element, eventData.viewport);\n\n return false;\n}\n\nfunction disable(element) {\n element.removeEventListener(_events2.default.TOUCH_ROTATE, touchRotateCallback);\n}\n\nfunction activate(element) {\n element.removeEventListener(_events2.default.TOUCH_ROTATE, touchRotateCallback);\n element.addEventListener(_events2.default.TOUCH_ROTATE, touchRotateCallback);\n}\n\nvar rotateTouch = {\n activate: activate,\n disable: disable\n};\n\nexports.default = rotateTouch;\n\n/***/ }),\n/* 112 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = saveAs;\nfunction saveAs(element, filename) {\n var mimetype = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'image/png';\n\n // Setting the default value for mimetype to image/png\n var canvas = element.querySelector('canvas');\n\n // Thanks to Ken Fyrstenber\n // http://stackoverflow.com/questions/18480474/how-to-save-an-image-from-canvas\n var lnk = document.createElement('a');\n\n // The key here is to set the download attribute of the a tag\n lnk.download = filename;\n\n // Convert canvas content to data-uri for link. When download\n // Attribute is set the content pointed to by link will be\n // Pushed as 'download' in HTML5 capable browsers\n lnk.href = canvas.toDataURL(mimetype, 1);\n\n // / create a 'fake' click-event to trigger the download\n if (document.createEvent) {\n var e = document.createEvent('MouseEvents');\n\n e.initMouseEvent('click', true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);\n\n lnk.dispatchEvent(e);\n } else if (lnk.fireEvent) {\n lnk.fireEvent('onclick');\n }\n}\n\n/***/ }),\n/* 113 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.seedAnnotateTouch = exports.seedAnnotate = undefined;\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _mouseButtonTool = __webpack_require__(9);\n\nvar _mouseButtonTool2 = _interopRequireDefault(_mouseButtonTool);\n\nvar _touchTool = __webpack_require__(11);\n\nvar _touchTool2 = _interopRequireDefault(_touchTool);\n\nvar _drawTextBox = __webpack_require__(7);\n\nvar _drawTextBox2 = _interopRequireDefault(_drawTextBox);\n\nvar _textStyle = __webpack_require__(13);\n\nvar _textStyle2 = _interopRequireDefault(_textStyle);\n\nvar _toolStyle = __webpack_require__(8);\n\nvar _toolStyle2 = _interopRequireDefault(_toolStyle);\n\nvar _toolColors = __webpack_require__(6);\n\nvar _toolColors2 = _interopRequireDefault(_toolColors);\n\nvar _anyHandlesOutsideImage = __webpack_require__(14);\n\nvar _anyHandlesOutsideImage2 = _interopRequireDefault(_anyHandlesOutsideImage);\n\nvar _moveHandle = __webpack_require__(23);\n\nvar _moveHandle2 = _interopRequireDefault(_moveHandle);\n\nvar _drawHandles = __webpack_require__(10);\n\nvar _drawHandles2 = _interopRequireDefault(_drawHandles);\n\nvar _drawCircle = __webpack_require__(47);\n\nvar _drawCircle2 = _interopRequireDefault(_drawCircle);\n\nvar _isMouseButtonEnabled = __webpack_require__(4);\n\nvar _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled);\n\nvar _pointInsideBoundingBox = __webpack_require__(19);\n\nvar _pointInsideBoundingBox2 = _interopRequireDefault(_pointInsideBoundingBox);\n\nvar _toolState = __webpack_require__(2);\n\nvar _toolOptions = __webpack_require__(3);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/* eslint no-alert:0 */\nvar toolType = 'seedAnnotate';\n\n// Define a callback to get your text annotation\n// This could be used, e.g. to open a modal\nfunction getTextCallback(doneGetTextCallback) {\n doneGetTextCallback(prompt('Enter your annotation:'));\n}\n\nfunction changeTextCallback(data, eventData, doneChangingTextCallback) {\n doneChangingTextCallback(prompt('Change your annotation:'));\n}\n\nvar configuration = {\n getTextCallback: getTextCallback,\n changeTextCallback: changeTextCallback,\n drawHandles: false,\n drawHandlesOnHover: true,\n currentLetter: 'A',\n currentNumber: 0,\n showCoordinates: true,\n countUp: true\n};\n// / --- Mouse Tool --- ///\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction addNewMeasurement(mouseEventData) {\n var cornerstone = _externalModules2.default.cornerstone;\n var element = mouseEventData.element;\n var config = seedAnnotate.getConfiguration();\n var measurementData = createNewMeasurement(mouseEventData);\n\n function doneGetTextCallback(text) {\n if (text === null) {\n (0, _toolState.removeToolState)(element, toolType, measurementData);\n } else {\n measurementData.text = text;\n }\n\n measurementData.active = false;\n cornerstone.updateImage(element);\n }\n\n // Associate this data with this imageId so we can render it and manipulate it\n (0, _toolState.addToolState)(element, toolType, measurementData);\n\n cornerstone.updateImage(element);\n (0, _moveHandle2.default)(mouseEventData, toolType, measurementData, measurementData.handles.end, function () {\n if ((0, _anyHandlesOutsideImage2.default)(mouseEventData, measurementData.handles)) {\n // Delete the measurement\n (0, _toolState.removeToolState)(element, toolType, measurementData);\n }\n\n if (measurementData.text === undefined) {\n config.getTextCallback(doneGetTextCallback);\n }\n\n cornerstone.updateImage(element);\n });\n}\n\nfunction createNewMeasurement(mouseEventData) {\n // Create the measurement data for this tool with the end handle activated\n var measurementData = {\n visible: true,\n active: true,\n handles: {\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n textBox: {\n active: false,\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n }\n }\n };\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\nfunction pointNearTool(element, data, coords) {\n if (!data.handles.end) {\n return;\n }\n\n var realCoords = _externalModules2.default.cornerstone.pixelToCanvas(element, data.handles.end);\n var distanceToPoint = _externalModules2.default.cornerstoneMath.point.distance(realCoords, coords);\n\n return distanceToPoint < 25;\n}\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction onImageRendered(e) {\n var eventData = e.detail;\n // If we have no toolData for this element, return immediately as there is nothing to do\n var toolData = (0, _toolState.getToolState)(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n var cornerstone = _externalModules2.default.cornerstone;\n var enabledElement = eventData.enabledElement;\n\n // We have tool data for this element - iterate over each one and draw it\n var context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // We need the canvas width\n var canvasWidth = eventData.canvasContext.canvas.width;\n\n var color = void 0;\n var lineWidth = _toolStyle2.default.getToolWidth();\n var font = _textStyle2.default.getFont();\n var config = seedAnnotate.getConfiguration();\n\n for (var i = 0; i < toolData.data.length; i++) {\n context.save();\n\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n var data = toolData.data[i];\n\n if (data.active) {\n color = _toolColors2.default.getActiveColor();\n } else {\n color = _toolColors2.default.getToolColor();\n }\n\n // Draw\n var handleCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.end);\n\n // Draw the circle always at the end of the handle\n (0, _drawCircle2.default)(context, handleCanvas, color, lineWidth);\n\n var handleOptions = {\n drawHandlesIfActive: config && config.drawHandlesOnHover\n };\n\n if (config.drawHandles) {\n (0, _drawHandles2.default)(context, eventData, handleCanvas, color, handleOptions);\n }\n\n // Draw the text\n if (data.text && data.text !== '') {\n context.font = font;\n\n var textPlusCoords = '';\n\n if (config.showCoordinates) {\n textPlusCoords = data.text + ' x: ' + Math.round(data.handles.end.x) + ' y: ' + Math.round(data.handles.end.y);\n } else {\n textPlusCoords = data.text;\n }\n\n // Calculate the text coordinates.\n var textWidth = context.measureText(textPlusCoords).width + 10;\n var textHeight = _textStyle2.default.getFontSize() + 10;\n\n var distance = Math.max(textWidth, textHeight) / 2 + 5;\n\n if (handleCanvas.x > canvasWidth / 2) {\n distance = -distance;\n }\n\n var textCoords = void 0;\n\n if (!data.handles.textBox.hasMoved) {\n textCoords = {\n x: handleCanvas.x - textWidth / 2 + distance,\n y: handleCanvas.y - textHeight / 2\n };\n\n var transform = cornerstone.internal.getTransform(enabledElement);\n\n transform.invert();\n\n var coords = transform.transformPoint(textCoords.x, textCoords.y);\n\n data.handles.textBox.x = coords.x;\n data.handles.textBox.y = coords.y;\n }\n\n textCoords = cornerstone.pixelToCanvas(eventData.element, data.handles.textBox);\n\n var boundingBox = (0, _drawTextBox2.default)(context, textPlusCoords, textCoords.x, textCoords.y, color);\n\n data.handles.textBox.boundingBox = boundingBox;\n\n if (data.handles.textBox.hasMoved) {\n // Draw dashed link line between tool and text\n var link = {\n start: {},\n end: {}\n };\n\n link.end.x = textCoords.x;\n link.end.y = textCoords.y;\n\n link.start = handleCanvas;\n\n var boundingBoxPoints = [{\n // Top middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top\n }, {\n // Left middle point of bounding box\n x: boundingBox.left,\n y: boundingBox.top + boundingBox.height / 2\n }, {\n // Bottom middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top + boundingBox.height\n }, {\n // Right middle point of bounding box\n x: boundingBox.left + boundingBox.width,\n y: boundingBox.top + boundingBox.height / 2\n }];\n\n link.end = _externalModules2.default.cornerstoneMath.point.findClosestPoint(boundingBoxPoints, link.start);\n\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.setLineDash([2, 3]);\n context.moveTo(link.start.x, link.start.y);\n context.lineTo(link.end.x, link.end.y);\n context.stroke();\n }\n }\n\n context.restore();\n }\n}\n// ---- Touch tool ----\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction addNewMeasurementTouch(touchEventData) {\n var cornerstone = _externalModules2.default.cornerstone;\n var element = touchEventData.element;\n var config = seedAnnotate.getConfiguration();\n var measurementData = createNewMeasurement(touchEventData);\n\n function doneGetTextCallback(text) {\n if (text === null) {\n (0, _toolState.removeToolState)(element, toolType, measurementData);\n } else {\n measurementData.text = text;\n }\n\n measurementData.active = false;\n cornerstone.updateImage(element);\n }\n\n // Associate this data with this imageId so we can render it and manipulate it\n (0, _toolState.addToolState)(element, toolType, measurementData);\n\n cornerstone.updateImage(element);\n (0, _moveHandle2.default)(touchEventData, toolType, measurementData, measurementData.handles.end, function () {\n if ((0, _anyHandlesOutsideImage2.default)(touchEventData, measurementData.handles)) {\n // Delete the measurement\n (0, _toolState.removeToolState)(element, toolType, measurementData);\n }\n\n if (measurementData.text === undefined) {\n config.getTextCallback(doneGetTextCallback);\n }\n\n cornerstone.updateImage(element);\n });\n}\n\nfunction doubleClickCallback(e) {\n var eventData = e.detail;\n var cornerstone = _externalModules2.default.cornerstone;\n var element = eventData.element;\n var data = void 0;\n var options = (0, _toolOptions.getToolOptions)(toolType, element);\n\n if (!(0, _isMouseButtonEnabled2.default)(eventData.which, options.mouseButtonMask)) {\n return;\n }\n\n function doneChangingTextCallback(data, updatedText, deleteTool) {\n if (deleteTool === true) {\n (0, _toolState.removeToolState)(element, toolType, data);\n } else {\n data.text = updatedText;\n }\n\n data.active = false;\n cornerstone.updateImage(element);\n }\n\n var config = seedAnnotate.getConfiguration();\n\n var coords = eventData.currentPoints.canvas;\n var toolData = (0, _toolState.getToolState)(element, toolType);\n\n // Now check to see if there is a handle we can move\n if (!toolData) {\n return;\n }\n\n for (var i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (pointNearTool(element, data, coords) || (0, _pointInsideBoundingBox2.default)(data.handles.textBox, coords)) {\n\n data.active = true;\n cornerstone.updateImage(element);\n // Allow relabelling via a callback\n config.changeTextCallback(data, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n\n return false;\n }\n }\n\n e.preventDefault();\n e.stopPropagation();\n}\n\nfunction pressCallback(e) {\n var eventData = e.detail;\n var cornerstone = _externalModules2.default.cornerstone;\n var element = eventData.element;\n var data = void 0;\n\n function doneChangingTextCallback(data, updatedText, deleteTool) {\n console.log('pressCallback doneChangingTextCallback');\n if (deleteTool === true) {\n (0, _toolState.removeToolState)(element, toolType, data);\n } else {\n data.text = updatedText;\n }\n\n data.active = false;\n cornerstone.updateImage(element);\n\n element.addEventListener(_events2.default.TOUCH_START, seedAnnotateTouch.touchStartCallback);\n element.addEventListener(_events2.default.TOUCH_START_ACTIVE, seedAnnotateTouch.touchDownActivateCallback);\n element.addEventListener(_events2.default.TAP, seedAnnotateTouch.tapCallback);\n }\n\n var config = seedAnnotate.getConfiguration();\n\n var coords = eventData.currentPoints.canvas;\n var toolData = (0, _toolState.getToolState)(element, toolType);\n\n // Now check to see if there is a handle we can move\n if (!toolData) {\n return false;\n }\n\n if (eventData.handlePressed) {\n element.removeEventListener(_events2.default.TOUCH_START, seedAnnotateTouch.touchStartCallback);\n element.removeEventListener(_events2.default.TOUCH_START_ACTIVE, seedAnnotateTouch.touchDownActivateCallback);\n element.removeEventListener(_events2.default.TAP, seedAnnotateTouch.tapCallback);\n\n // Allow relabelling via a callback\n config.changeTextCallback(eventData.handlePressed, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n\n return false;\n }\n\n for (var i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (pointNearTool(element, data, coords) || (0, _pointInsideBoundingBox2.default)(data.handles.textBox, coords)) {\n data.active = true;\n cornerstone.updateImage(element);\n\n element.removeEventListener(_events2.default.TOUCH_START, seedAnnotateTouch.touchStartCallback);\n element.removeEventListener(_events2.default.TOUCH_START_ACTIVE, seedAnnotateTouch.touchDownActivateCallback);\n element.removeEventListener(_events2.default.TAP, seedAnnotateTouch.tapCallback);\n\n // Allow relabelling via a callback\n config.changeTextCallback(data, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n\n return false;\n }\n }\n\n e.preventDefault();\n e.stopPropagation();\n}\n\nvar seedAnnotate = (0, _mouseButtonTool2.default)({\n addNewMeasurement: addNewMeasurement,\n createNewMeasurement: createNewMeasurement,\n onImageRendered: onImageRendered,\n pointNearTool: pointNearTool,\n toolType: toolType,\n mouseDoubleClickCallback: doubleClickCallback\n});\n\nseedAnnotate.setConfiguration(configuration);\n\nvar seedAnnotateTouch = (0, _touchTool2.default)({\n addNewMeasurement: addNewMeasurementTouch,\n createNewMeasurement: createNewMeasurement,\n onImageRendered: onImageRendered,\n pointNearTool: pointNearTool,\n toolType: toolType,\n pressCallback: pressCallback\n});\n\nexports.seedAnnotate = seedAnnotate;\nexports.seedAnnotateTouch = seedAnnotateTouch;\n\n/***/ }),\n/* 114 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.simpleAngleTouch = exports.simpleAngle = undefined;\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _mouseButtonTool = __webpack_require__(9);\n\nvar _mouseButtonTool2 = _interopRequireDefault(_mouseButtonTool);\n\nvar _drawTextBox = __webpack_require__(7);\n\nvar _drawTextBox2 = _interopRequireDefault(_drawTextBox);\n\nvar _roundToDecimal = __webpack_require__(31);\n\nvar _roundToDecimal2 = _interopRequireDefault(_roundToDecimal);\n\nvar _textStyle = __webpack_require__(13);\n\nvar _textStyle2 = _interopRequireDefault(_textStyle);\n\nvar _toolStyle = __webpack_require__(8);\n\nvar _toolStyle2 = _interopRequireDefault(_toolStyle);\n\nvar _toolColors = __webpack_require__(6);\n\nvar _toolColors2 = _interopRequireDefault(_toolColors);\n\nvar _anyHandlesOutsideImage = __webpack_require__(14);\n\nvar _anyHandlesOutsideImage2 = _interopRequireDefault(_anyHandlesOutsideImage);\n\nvar _moveNewHandle = __webpack_require__(24);\n\nvar _moveNewHandle2 = _interopRequireDefault(_moveNewHandle);\n\nvar _moveNewHandleTouch = __webpack_require__(27);\n\nvar _moveNewHandleTouch2 = _interopRequireDefault(_moveNewHandleTouch);\n\nvar _drawHandles = __webpack_require__(10);\n\nvar _drawHandles2 = _interopRequireDefault(_drawHandles);\n\nvar _touchTool = __webpack_require__(11);\n\nvar _touchTool2 = _interopRequireDefault(_touchTool);\n\nvar _toolState = __webpack_require__(2);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'simpleAngle';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement(mouseEventData) {\n // Create the measurement data for this tool with the end handle activated\n var angleData = {\n visible: true,\n active: true,\n handles: {\n start: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n middle: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n },\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n textBox: {\n active: false,\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n }\n }\n };\n\n return angleData;\n}\n// /////// END ACTIVE TOOL ///////\n\nfunction pointNearTool(element, data, coords) {\n var cornerstone = _externalModules2.default.cornerstone;\n var lineSegment = {\n start: cornerstone.pixelToCanvas(element, data.handles.start),\n end: cornerstone.pixelToCanvas(element, data.handles.middle)\n };\n\n var distanceToPoint = _externalModules2.default.cornerstoneMath.lineSegment.distanceToPoint(lineSegment, coords);\n\n if (distanceToPoint < 25) {\n return true;\n }\n\n lineSegment.start = cornerstone.pixelToCanvas(element, data.handles.middle);\n lineSegment.end = cornerstone.pixelToCanvas(element, data.handles.end);\n\n distanceToPoint = _externalModules2.default.cornerstoneMath.lineSegment.distanceToPoint(lineSegment, coords);\n\n return distanceToPoint < 25;\n}\n\nfunction length(vector) {\n return Math.sqrt(Math.pow(vector.x, 2) + Math.pow(vector.y, 2));\n}\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction onImageRendered(e) {\n var eventData = e.detail;\n // If we have no toolData for this element, return immediately as there is nothing to do\n var toolData = (0, _toolState.getToolState)(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n var cornerstone = _externalModules2.default.cornerstone;\n var enabledElement = eventData.enabledElement;\n\n // We have tool data for this element - iterate over each one and draw it\n var context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Activation color\n var color = void 0;\n var lineWidth = _toolStyle2.default.getToolWidth();\n var font = _textStyle2.default.getFont();\n var config = simpleAngle.getConfiguration();\n\n for (var i = 0; i < toolData.data.length; i++) {\n context.save();\n\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n var data = toolData.data[i];\n\n // Differentiate the color of activation tool\n if (data.active) {\n color = _toolColors2.default.getActiveColor();\n } else {\n color = _toolColors2.default.getToolColor();\n }\n\n var handleStartCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.start);\n var handleMiddleCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.middle);\n var handleEndCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.end);\n\n // Draw the line\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.moveTo(handleStartCanvas.x, handleStartCanvas.y);\n context.lineTo(handleMiddleCanvas.x, handleMiddleCanvas.y);\n context.lineTo(handleEndCanvas.x, handleEndCanvas.y);\n context.stroke();\n\n // Draw the handles\n var handleOptions = {\n drawHandlesIfActive: config && config.drawHandlesOnHover\n };\n\n (0, _drawHandles2.default)(context, eventData, data.handles, color, handleOptions);\n\n // Draw the text\n context.fillStyle = color;\n\n // Default to isotropic pixel size, update suffix to reflect this\n var columnPixelSpacing = eventData.image.columnPixelSpacing || 1;\n var rowPixelSpacing = eventData.image.rowPixelSpacing || 1;\n var suffix = '';\n\n if (!eventData.image.rowPixelSpacing || !eventData.image.columnPixelSpacing) {\n suffix = ' (isotropic)';\n }\n\n var sideA = {\n x: (Math.ceil(data.handles.middle.x) - Math.ceil(data.handles.start.x)) * columnPixelSpacing,\n y: (Math.ceil(data.handles.middle.y) - Math.ceil(data.handles.start.y)) * rowPixelSpacing\n };\n\n var sideB = {\n x: (Math.ceil(data.handles.end.x) - Math.ceil(data.handles.middle.x)) * columnPixelSpacing,\n y: (Math.ceil(data.handles.end.y) - Math.ceil(data.handles.middle.y)) * rowPixelSpacing\n };\n\n var sideC = {\n x: (Math.ceil(data.handles.end.x) - Math.ceil(data.handles.start.x)) * columnPixelSpacing,\n y: (Math.ceil(data.handles.end.y) - Math.ceil(data.handles.start.y)) * rowPixelSpacing\n };\n\n var sideALength = length(sideA);\n var sideBLength = length(sideB);\n var sideCLength = length(sideC);\n\n // Cosine law\n var angle = Math.acos((Math.pow(sideALength, 2) + Math.pow(sideBLength, 2) - Math.pow(sideCLength, 2)) / (2 * sideALength * sideBLength));\n\n angle *= 180 / Math.PI;\n\n var rAngle = (0, _roundToDecimal2.default)(angle, 2);\n\n if (rAngle) {\n var str = '00B0'; // Degrees symbol\n var text = rAngle.toString() + String.fromCharCode(parseInt(str, 16)) + suffix;\n\n var distance = 15;\n\n var textCoords = void 0;\n\n if (data.handles.textBox.hasMoved) {\n textCoords = cornerstone.pixelToCanvas(eventData.element, data.handles.textBox);\n } else {\n textCoords = {\n x: handleMiddleCanvas.x,\n y: handleMiddleCanvas.y\n };\n\n context.font = font;\n var textWidth = context.measureText(text).width;\n\n if (handleMiddleCanvas.x < handleStartCanvas.x) {\n textCoords.x -= distance + textWidth + 10;\n } else {\n textCoords.x += distance;\n }\n\n var transform = cornerstone.internal.getTransform(enabledElement);\n\n transform.invert();\n\n var coords = transform.transformPoint(textCoords.x, textCoords.y);\n\n data.handles.textBox.x = coords.x;\n data.handles.textBox.y = coords.y;\n }\n\n var options = {\n centering: {\n x: false,\n y: true\n }\n };\n\n var boundingBox = (0, _drawTextBox2.default)(context, text, textCoords.x, textCoords.y, color, options);\n\n data.handles.textBox.boundingBox = boundingBox;\n\n if (data.handles.textBox.hasMoved) {\n // Draw dashed link line between tool and text\n var link = {\n start: {},\n end: {}\n };\n\n var points = [handleStartCanvas, handleEndCanvas, handleMiddleCanvas];\n\n link.end.x = textCoords.x;\n link.end.y = textCoords.y;\n\n link.start = _externalModules2.default.cornerstoneMath.point.findClosestPoint(points, link.end);\n\n var boundingBoxPoints = [{\n // Top middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top\n }, {\n // Left middle point of bounding box\n x: boundingBox.left,\n y: boundingBox.top + boundingBox.height / 2\n }, {\n // Bottom middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top + boundingBox.height\n }, {\n // Right middle point of bounding box\n x: boundingBox.left + boundingBox.width,\n y: boundingBox.top + boundingBox.height / 2\n }];\n\n link.end = _externalModules2.default.cornerstoneMath.point.findClosestPoint(boundingBoxPoints, link.start);\n\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.setLineDash([2, 3]);\n context.moveTo(link.start.x, link.start.y);\n context.lineTo(link.end.x, link.end.y);\n context.stroke();\n }\n }\n\n context.restore();\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction addNewMeasurement(mouseEventData) {\n var cornerstone = _externalModules2.default.cornerstone;\n var measurementData = createNewMeasurement(mouseEventData);\n var element = mouseEventData.element;\n\n // Associate this data with this imageId so we can render it and manipulate it\n (0, _toolState.addToolState)(element, toolType, measurementData);\n\n // Since we are dragging to another place to drop the end point, we can just activate\n // The end point and let the moveHandle move it for us.\n element.removeEventListener(_events2.default.MOUSE_MOVE, simpleAngle.mouseMoveCallback);\n element.removeEventListener(_events2.default.MOUSE_DRAG, simpleAngle.mouseMoveCallback);\n element.removeEventListener(_events2.default.MOUSE_DOWN, simpleAngle.mouseDownCallback);\n element.removeEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, simpleAngle.mouseDownActivateCallback);\n cornerstone.updateImage(element);\n\n (0, _moveNewHandle2.default)(mouseEventData, toolType, measurementData, measurementData.handles.middle, function () {\n measurementData.active = false;\n if ((0, _anyHandlesOutsideImage2.default)(mouseEventData, measurementData.handles)) {\n // Delete the measurement\n (0, _toolState.removeToolState)(element, toolType, measurementData);\n\n element.addEventListener(_events2.default.MOUSE_MOVE, simpleAngle.mouseMoveCallback);\n element.addEventListener(_events2.default.MOUSE_DRAG, simpleAngle.mouseMoveCallback);\n element.addEventListener(_events2.default.MOUSE_DOWN, simpleAngle.mouseDownCallback);\n element.addEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, simpleAngle.mouseDownActivateCallback);\n cornerstone.updateImage(element);\n\n return;\n }\n\n measurementData.handles.end.active = true;\n cornerstone.updateImage(element);\n\n (0, _moveNewHandle2.default)(mouseEventData, toolType, measurementData, measurementData.handles.end, function () {\n measurementData.active = false;\n if ((0, _anyHandlesOutsideImage2.default)(mouseEventData, measurementData.handles)) {\n // Delete the measurement\n (0, _toolState.removeToolState)(element, toolType, measurementData);\n }\n\n element.addEventListener(_events2.default.MOUSE_MOVE, simpleAngle.mouseMoveCallback);\n element.addEventListener(_events2.default.MOUSE_DRAG, simpleAngle.mouseMoveCallback);\n element.addEventListener(_events2.default.MOUSE_DOWN, simpleAngle.mouseDownCallback);\n element.addEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, simpleAngle.mouseDownActivateCallback);\n cornerstone.updateImage(element);\n });\n });\n}\n\nfunction addNewMeasurementTouch(touchEventData) {\n var cornerstone = _externalModules2.default.cornerstone;\n var measurementData = createNewMeasurement(touchEventData);\n var element = touchEventData.element;\n\n // Associate this data with this imageId so we can render it and manipulate it\n (0, _toolState.addToolState)(element, toolType, measurementData);\n\n // Since we are dragging to another place to drop the end point, we can just activate\n // The end point and let the moveHandle move it for us.\n element.removeEventListener(_events2.default.TOUCH_DRAG, simpleAngleTouch.touchMoveCallback);\n element.removeEventListener(_events2.default.TOUCH_START_ACTIVE, simpleAngleTouch.touchDownActivateCallback);\n element.removeEventListener(_events2.default.TOUCH_START, simpleAngleTouch.touchStartCallback);\n element.removeEventListener(_events2.default.TAP, simpleAngleTouch.tapCallback);\n cornerstone.updateImage(element);\n\n (0, _moveNewHandleTouch2.default)(touchEventData, toolType, measurementData, measurementData.handles.middle, function () {\n if ((0, _anyHandlesOutsideImage2.default)(touchEventData, measurementData.handles)) {\n // Delete the measurement\n (0, _toolState.removeToolState)(element, toolType, measurementData);\n element.addEventListener(_events2.default.TOUCH_DRAG, simpleAngleTouch.touchMoveCallback);\n element.addEventListener(_events2.default.TOUCH_START, simpleAngleTouch.touchStartCallback);\n element.addEventListener(_events2.default.TOUCH_START_ACTIVE, simpleAngleTouch.touchDownActivateCallback);\n element.addEventListener(_events2.default.TAP, simpleAngleTouch.tapCallback);\n cornerstone.updateImage(element);\n\n return;\n }\n\n (0, _moveNewHandleTouch2.default)(touchEventData, toolType, measurementData, measurementData.handles.end, function () {\n if ((0, _anyHandlesOutsideImage2.default)(touchEventData, measurementData.handles)) {\n // Delete the measurement\n (0, _toolState.removeToolState)(element, toolType, measurementData);\n cornerstone.updateImage(element);\n }\n\n element.addEventListener(_events2.default.TOUCH_DRAG, simpleAngleTouch.touchMoveCallback);\n element.addEventListener(_events2.default.TOUCH_START, simpleAngleTouch.touchStartCallback);\n element.addEventListener(_events2.default.TOUCH_START_ACTIVE, simpleAngleTouch.touchDownActivateCallback);\n element.addEventListener(_events2.default.TAP, simpleAngleTouch.tapCallback);\n });\n });\n}\n\nvar simpleAngle = (0, _mouseButtonTool2.default)({\n createNewMeasurement: createNewMeasurement,\n addNewMeasurement: addNewMeasurement,\n onImageRendered: onImageRendered,\n pointNearTool: pointNearTool,\n toolType: toolType\n});\n\nvar simpleAngleTouch = (0, _touchTool2.default)({\n createNewMeasurement: createNewMeasurement,\n addNewMeasurement: addNewMeasurementTouch,\n onImageRendered: onImageRendered,\n pointNearTool: pointNearTool,\n toolType: toolType\n});\n\nexports.simpleAngle = simpleAngle;\nexports.simpleAngleTouch = simpleAngleTouch;\n\n/***/ }),\n/* 115 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.textMarkerTouch = exports.textMarker = undefined;\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _mouseButtonTool = __webpack_require__(9);\n\nvar _mouseButtonTool2 = _interopRequireDefault(_mouseButtonTool);\n\nvar _touchTool = __webpack_require__(11);\n\nvar _touchTool2 = _interopRequireDefault(_touchTool);\n\nvar _pointInsideBoundingBox = __webpack_require__(19);\n\nvar _pointInsideBoundingBox2 = _interopRequireDefault(_pointInsideBoundingBox);\n\nvar _toolColors = __webpack_require__(6);\n\nvar _toolColors2 = _interopRequireDefault(_toolColors);\n\nvar _isMouseButtonEnabled = __webpack_require__(4);\n\nvar _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled);\n\nvar _drawTextBox = __webpack_require__(7);\n\nvar _drawTextBox2 = _interopRequireDefault(_drawTextBox);\n\nvar _toolState = __webpack_require__(2);\n\nvar _toolOptions = __webpack_require__(3);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'textMarker';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement(mouseEventData) {\n var config = textMarker.getConfiguration();\n\n if (!config.current) {\n return;\n }\n\n // Create the measurement data for this tool with the end handle activated\n var measurementData = {\n visible: true,\n active: true,\n text: config.current,\n handles: {\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true,\n hasBoundingBox: true\n }\n }\n };\n\n // Create a rectangle representing the image\n var imageRect = {\n left: 0,\n top: 0,\n width: mouseEventData.image.width,\n height: mouseEventData.image.height\n };\n\n // Check if the current handle is outside the image,\n // If it is, prevent the handle creation\n if (!_externalModules2.default.cornerstoneMath.point.insideRect(measurementData.handles.end, imageRect)) {\n return;\n }\n\n // Update the current marker for the next marker\n var currentIndex = config.markers.indexOf(config.current);\n\n if (config.ascending) {\n currentIndex += 1;\n if (currentIndex >= config.markers.length) {\n if (config.loop) {\n currentIndex -= config.markers.length;\n } else {\n currentIndex = -1;\n }\n }\n } else {\n currentIndex -= 1;\n if (currentIndex < 0) {\n if (config.loop) {\n currentIndex += config.markers.length;\n } else {\n currentIndex = -1;\n }\n }\n }\n\n config.current = config.markers[currentIndex];\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction pointNearTool(element, data, coords) {\n if (!data.handles.end.boundingBox) {\n return;\n }\n\n var distanceToPoint = _externalModules2.default.cornerstoneMath.rect.distanceToPoint(data.handles.end.boundingBox, coords);\n var insideBoundingBox = (0, _pointInsideBoundingBox2.default)(data.handles.end, coords);\n\n return distanceToPoint < 10 || insideBoundingBox;\n}\n\nfunction onImageRendered(e) {\n var eventData = e.detail;\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n var toolData = (0, _toolState.getToolState)(eventData.element, toolType);\n\n if (!toolData) {\n return;\n }\n\n // We have tool data for this element - iterate over each one and draw it\n var context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n var config = textMarker.getConfiguration();\n\n for (var i = 0; i < toolData.data.length; i++) {\n var data = toolData.data[i];\n\n var color = _toolColors2.default.getToolColor();\n\n if (data.active) {\n color = _toolColors2.default.getActiveColor();\n }\n\n context.save();\n\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n // Draw text\n context.fillStyle = color;\n var measureText = context.measureText(data.text);\n\n data.textWidth = measureText.width + 10;\n\n var textCoords = _externalModules2.default.cornerstone.pixelToCanvas(eventData.element, data.handles.end);\n\n var options = {\n centering: {\n x: true,\n y: true\n }\n };\n\n data.handles.end.boundingBox = (0, _drawTextBox2.default)(context, data.text, textCoords.x, textCoords.y - 10, color, options);\n\n context.restore();\n }\n}\n\nfunction doubleClickCallback(e) {\n var eventData = e.detail;\n var cornerstone = _externalModules2.default.cornerstone;\n var element = eventData.element;\n var data = void 0;\n var options = (0, _toolOptions.getToolOptions)(toolType, element);\n\n if (!(0, _isMouseButtonEnabled2.default)(eventData.which, options.mouseButtonMask)) {\n return;\n }\n\n function doneChangingTextCallback(data, updatedText, deleteTool) {\n if (deleteTool === true) {\n (0, _toolState.removeToolState)(element, toolType, data);\n } else {\n data.text = updatedText;\n }\n\n data.active = false;\n cornerstone.updateImage(element);\n\n element.addEventListener(_events2.default.MOUSE_MOVE, textMarker.mouseMoveCallback);\n element.addEventListener(_events2.default.MOUSE_DOWN, textMarker.mouseDownCallback);\n element.addEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, textMarker.mouseDownActivateCallback);\n element.addEventListener(_events2.default.MOUSE_DOUBLE_CLICK, textMarker.mouseDoubleClickCallback);\n }\n\n var config = textMarker.getConfiguration();\n var coords = eventData.currentPoints.canvas;\n var toolData = (0, _toolState.getToolState)(element, toolType);\n\n // Now check to see if there is a handle we can move\n if (!toolData) {\n return;\n }\n\n for (var i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (pointNearTool(element, data, coords)) {\n data.active = true;\n cornerstone.updateImage(element);\n\n element.removeEventListener(_events2.default.MOUSE_MOVE, textMarker.mouseMoveCallback);\n element.removeEventListener(_events2.default.MOUSE_DOWN, textMarker.mouseDownCallback);\n element.removeEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, textMarker.mouseDownActivateCallback);\n element.removeEventListener(_events2.default.MOUSE_DOUBLE_CLICK, textMarker.mouseDoubleClickCallback);\n // Allow relabelling via a callback\n config.changeTextCallback(data, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n e.preventDefault();\n e.stopPropagation();\n\n return;\n }\n }\n\n e.preventDefault();\n e.stopPropagation();\n}\n\nfunction touchPressCallback(e) {\n var eventData = e.detail;\n var cornerstone = _externalModules2.default.cornerstone;\n var element = eventData.element;\n var data = void 0;\n\n function doneChangingTextCallback(data, updatedText, deleteTool) {\n if (deleteTool === true) {\n (0, _toolState.removeToolState)(element, toolType, data);\n } else {\n data.text = updatedText;\n }\n\n data.active = false;\n cornerstone.updateImage(element);\n\n element.addEventListener(_events2.default.TOUCH_DRAG, textMarkerTouch.touchMoveCallback);\n element.addEventListener(_events2.default.TOUCH_START_ACTIVE, textMarkerTouch.touchDownActivateCallback);\n element.addEventListener(_events2.default.TOUCH_START, textMarkerTouch.touchStartCallback);\n element.addEventListener(_events2.default.TAP, textMarkerTouch.tapCallback);\n element.addEventListener(_events2.default.TOUCH_PRESS, textMarkerTouch.pressCallback);\n }\n\n var config = textMarker.getConfiguration();\n\n var coords = eventData.currentPoints.canvas;\n var toolData = (0, _toolState.getToolState)(element, toolType);\n\n // Now check to see if there is a handle we can move\n if (!toolData) {\n return false;\n }\n\n if (eventData.handlePressed) {\n eventData.handlePressed.active = true;\n cornerstone.updateImage(element);\n\n element.removeEventListener(_events2.default.TOUCH_DRAG, textMarkerTouch.touchMoveCallback);\n element.removeEventListener(_events2.default.TOUCH_START_ACTIVE, textMarkerTouch.touchDownActivateCallback);\n element.removeEventListener(_events2.default.TOUCH_START, textMarkerTouch.touchStartCallback);\n element.removeEventListener(_events2.default.TAP, textMarkerTouch.tapCallback);\n element.removeEventListener(_events2.default.TOUCH_PRESS, textMarkerTouch.pressCallback);\n\n // Allow relabelling via a callback\n config.changeTextCallback(eventData.handlePressed, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n e.preventDefault();\n e.stopPropagation();\n\n return;\n }\n\n for (var i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (pointNearTool(element, data, coords)) {\n data.active = true;\n cornerstone.updateImage(element);\n\n element.removeEventListener(_events2.default.TOUCH_DRAG, textMarkerTouch.touchMoveCallback);\n element.removeEventListener(_events2.default.TOUCH_START_ACTIVE, textMarkerTouch.touchDownActivateCallback);\n element.removeEventListener(_events2.default.TOUCH_START, textMarkerTouch.touchStartCallback);\n element.removeEventListener(_events2.default.TAP, textMarkerTouch.tapCallback);\n element.removeEventListener(_events2.default.TOUCH_PRESS, textMarkerTouch.pressCallback);\n // Allow relabelling via a callback\n config.changeTextCallback(data, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n e.preventDefault();\n e.stopPropagation();\n\n return;\n }\n }\n\n e.preventDefault();\n e.stopPropagation();\n}\n\nvar textMarker = (0, _mouseButtonTool2.default)({\n createNewMeasurement: createNewMeasurement,\n onImageRendered: onImageRendered,\n pointNearTool: pointNearTool,\n toolType: toolType,\n mouseDoubleClickCallback: doubleClickCallback\n});\n\nvar textMarkerTouch = (0, _touchTool2.default)({\n createNewMeasurement: createNewMeasurement,\n onImageRendered: onImageRendered,\n pointNearTool: pointNearTool,\n toolType: toolType,\n pressCallback: touchPressCallback\n});\n\nexports.textMarker = textMarker;\nexports.textMarkerTouch = textMarkerTouch;\n\n/***/ }),\n/* 116 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.wwwcTouchDrag = exports.wwwc = undefined;\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _simpleMouseButtonTool = __webpack_require__(16);\n\nvar _simpleMouseButtonTool2 = _interopRequireDefault(_simpleMouseButtonTool);\n\nvar _touchDragTool = __webpack_require__(15);\n\nvar _touchDragTool2 = _interopRequireDefault(_touchDragTool);\n\nvar _isMouseButtonEnabled = __webpack_require__(4);\n\nvar _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled);\n\nvar _toolOptions = __webpack_require__(3);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'wwwc';\n\nfunction mouseUpCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n\n element.removeEventListener(_events2.default.MOUSE_DRAG, mouseDragCallback);\n element.removeEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback);\n}\n\nfunction mouseDownCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n var options = (0, _toolOptions.getToolOptions)(toolType, element);\n\n if ((0, _isMouseButtonEnabled2.default)(eventData.which, options.mouseButtonMask)) {\n element.addEventListener(_events2.default.MOUSE_DRAG, mouseDragCallback);\n element.addEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n element.addEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback);\n\n e.preventDefault();\n e.stopPropagation();\n }\n}\n\nfunction defaultStrategy(eventData) {\n // Here we normalize the ww/wc adjustments so the same number of on screen pixels\n // Adjusts the same percentage of the dynamic range of the image. This is needed to\n // Provide consistency for the ww/wc tool regardless of the dynamic range (e.g. an 8 bit\n // Image will feel the same as a 16 bit image would)\n var maxVOI = eventData.image.maxPixelValue * eventData.image.slope + eventData.image.intercept;\n var minVOI = eventData.image.minPixelValue * eventData.image.slope + eventData.image.intercept;\n var imageDynamicRange = maxVOI - minVOI;\n var multiplier = imageDynamicRange / 1024;\n\n var deltaX = eventData.deltaPoints.page.x * multiplier;\n var deltaY = eventData.deltaPoints.page.y * multiplier;\n\n eventData.viewport.voi.windowWidth += deltaX;\n eventData.viewport.voi.windowCenter += deltaY;\n}\n\nfunction mouseDragCallback(e) {\n var eventData = e.detail;\n\n wwwc.strategy(eventData);\n _externalModules2.default.cornerstone.setViewport(eventData.element, eventData.viewport);\n}\n\nfunction touchDragCallback(e) {\n var eventData = e.detail;\n\n e.stopImmediatePropagation(); // Prevent CornerstoneToolsTouchStartActive from killing any press events\n var dragData = eventData;\n\n var maxVOI = dragData.image.maxPixelValue * dragData.image.slope + dragData.image.intercept;\n var minVOI = dragData.image.minPixelValue * dragData.image.slope + dragData.image.intercept;\n var imageDynamicRange = maxVOI - minVOI;\n var multiplier = imageDynamicRange / 1024;\n var deltaX = dragData.deltaPoints.page.x * multiplier;\n var deltaY = dragData.deltaPoints.page.y * multiplier;\n\n var config = wwwc.getConfiguration();\n\n if (config.orientation) {\n if (config.orientation === 0) {\n dragData.viewport.voi.windowWidth += deltaX;\n dragData.viewport.voi.windowCenter += deltaY;\n } else {\n dragData.viewport.voi.windowWidth += deltaY;\n dragData.viewport.voi.windowCenter += deltaX;\n }\n } else {\n dragData.viewport.voi.windowWidth += deltaX;\n dragData.viewport.voi.windowCenter += deltaY;\n }\n\n _externalModules2.default.cornerstone.setViewport(dragData.element, dragData.viewport);\n}\n\nvar wwwc = (0, _simpleMouseButtonTool2.default)(mouseDownCallback, toolType);\n\nwwwc.strategies = {\n default: defaultStrategy\n};\n\nwwwc.strategy = defaultStrategy;\n\nvar wwwcTouchDrag = (0, _touchDragTool2.default)(touchDragCallback);\n\nexports.wwwc = wwwc;\nexports.wwwcTouchDrag = wwwcTouchDrag;\n\n/***/ }),\n/* 117 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.wwwcRegionTouch = exports.wwwcRegion = undefined;\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _toolStyle = __webpack_require__(8);\n\nvar _toolStyle2 = _interopRequireDefault(_toolStyle);\n\nvar _toolColors = __webpack_require__(6);\n\nvar _toolColors2 = _interopRequireDefault(_toolColors);\n\nvar _toolState = __webpack_require__(2);\n\nvar _getLuminance = __webpack_require__(45);\n\nvar _getLuminance2 = _interopRequireDefault(_getLuminance);\n\nvar _isMouseButtonEnabled = __webpack_require__(4);\n\nvar _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled);\n\nvar _toolOptions = __webpack_require__(3);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'wwwcRegion';\n\nvar configuration = {\n minWindowWidth: 10\n};\n\n/** Calculates the minimum, maximum, and mean value in the given pixel array */\nfunction calculateMinMaxMean(storedPixelLuminanceData, globalMin, globalMax) {\n var numPixels = storedPixelLuminanceData.length;\n\n if (numPixels < 2) {\n return {\n min: globalMin,\n max: globalMax,\n mean: (globalMin + globalMax) / 2\n };\n }\n\n var min = globalMax;\n var max = globalMin;\n var sum = 0;\n\n for (var index = 0; index < numPixels; index++) {\n var spv = storedPixelLuminanceData[index];\n\n min = Math.min(min, spv);\n max = Math.max(max, spv);\n sum += spv;\n }\n\n return {\n min: min,\n max: max,\n mean: sum / numPixels\n };\n}\n\n/* Erases the toolData and rebinds the handlers when the image changes */\nfunction newImageCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n var toolData = (0, _toolState.getToolState)(element, toolType);\n\n if (toolData && toolData.data) {\n toolData.data = [];\n }\n\n element.removeEventListener(_events2.default.MOUSE_MOVE, dragCallback);\n element.removeEventListener(_events2.default.MOUSE_DRAG, dragCallback);\n\n element.removeEventListener(_events2.default.MOUSE_UP, dragEndCallback);\n element.removeEventListener(_events2.default.MOUSE_CLICK, dragEndCallback);\n\n element.addEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback);\n}\n\n/* Applies the windowing procedure when the mouse drag ends */\nfunction dragEndCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n\n element.removeEventListener(_events2.default.MOUSE_MOVE, dragCallback);\n element.removeEventListener(_events2.default.MOUSE_DRAG, dragCallback);\n\n element.removeEventListener(_events2.default.MOUSE_UP, dragEndCallback);\n element.removeEventListener(_events2.default.MOUSE_CLICK, dragEndCallback);\n\n element.addEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback);\n\n var toolData = (0, _toolState.getToolState)(eventData.element, toolType);\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n // Update the endpoint as the mouse/touch is dragged\n toolData.data[0].endPoint = {\n x: eventData.currentPoints.image.x,\n y: eventData.currentPoints.image.y\n };\n\n applyWWWCRegion(eventData);\n}\n\n/** Calculates the minimum and maximum value in the given pixel array */\nfunction applyWWWCRegion(eventData) {\n var cornerstone = _externalModules2.default.cornerstone;\n var toolData = (0, _toolState.getToolState)(eventData.element, toolType);\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n var startPoint = toolData.data[0].startPoint;\n var endPoint = toolData.data[0].endPoint;\n\n // Get the rectangular region defined by the handles\n var width = Math.abs(startPoint.x - endPoint.x);\n var height = Math.abs(startPoint.y - endPoint.y);\n\n var left = Math.min(startPoint.x, endPoint.x);\n var top = Math.min(startPoint.y, endPoint.y);\n\n // Bound the rectangle so we don't get undefined pixels\n left = Math.max(left, 0);\n left = Math.min(left, eventData.image.width);\n top = Math.max(top, 0);\n top = Math.min(top, eventData.image.height);\n width = Math.floor(Math.min(width, Math.abs(eventData.image.width - left)));\n height = Math.floor(Math.min(height, Math.abs(eventData.image.height - top)));\n\n // Get the pixel data in the rectangular region\n var pixelLuminanceData = (0, _getLuminance2.default)(eventData.element, left, top, width, height);\n\n // Calculate the minimum and maximum pixel values\n var minMaxMean = calculateMinMaxMean(pixelLuminanceData, eventData.image.minPixelValue, eventData.image.maxPixelValue);\n\n // Adjust the viewport window width and center based on the calculated values\n var config = wwwcRegion.getConfiguration();\n var viewport = cornerstone.getViewport(eventData.element);\n\n if (config.minWindowWidth === undefined) {\n config.minWindowWidth = 10;\n }\n\n viewport.voi.windowWidth = Math.max(Math.abs(minMaxMean.max - minMaxMean.min), config.minWindowWidth);\n viewport.voi.windowCenter = minMaxMean.mean;\n cornerstone.setViewport(eventData.element, viewport);\n\n // Clear the toolData\n toolData.data = [];\n\n cornerstone.updateImage(eventData.element);\n}\n\nfunction whichMovement(e) {\n var eventData = e.detail;\n var element = eventData.element;\n\n element.removeEventListener(_events2.default.MOUSE_MOVE, whichMovement);\n element.removeEventListener(_events2.default.MOUSE_DRAG, whichMovement);\n\n element.addEventListener(_events2.default.MOUSE_MOVE, dragCallback);\n element.addEventListener(_events2.default.MOUSE_DRAG, dragCallback);\n\n element.addEventListener(_events2.default.MOUSE_CLICK, dragEndCallback);\n if (e.type === _events2.default.MOUSE_DRAG) {\n element.addEventListener(_events2.default.MOUSE_UP, dragEndCallback);\n }\n}\n\n/** Records the start point and attaches the drag event handler */\nfunction mouseDownCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n var options = (0, _toolOptions.getToolOptions)(toolType, element);\n\n if ((0, _isMouseButtonEnabled2.default)(eventData.which, options.mouseButtonMask)) {\n element.addEventListener(_events2.default.MOUSE_DRAG, whichMovement);\n element.addEventListener(_events2.default.MOUSE_MOVE, whichMovement);\n\n element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback);\n recordStartPoint(eventData);\n\n return false;\n }\n}\n\n/** Records the start point of the click or touch */\nfunction recordStartPoint(eventData) {\n var toolData = (0, _toolState.getToolState)(eventData.element, toolType);\n\n if (toolData && toolData.data) {\n toolData.data = [];\n }\n\n var measurementData = {\n startPoint: {\n x: eventData.currentPoints.image.x,\n y: eventData.currentPoints.image.y\n }\n };\n\n (0, _toolState.addToolState)(eventData.element, toolType, measurementData);\n}\n\n/** Draws the rectangular region while the touch or mouse event drag occurs */\nfunction dragCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n var toolData = (0, _toolState.getToolState)(element, toolType);\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n // Update the endpoint as the mouse/touch is dragged\n toolData.data[0].endPoint = {\n x: eventData.currentPoints.image.x,\n y: eventData.currentPoints.image.y\n };\n\n _externalModules2.default.cornerstone.updateImage(element);\n}\n\nfunction onImageRendered(e) {\n var eventData = e.detail;\n var element = eventData.element;\n var context = eventData.canvasContext;\n var cornerstone = _externalModules2.default.cornerstone;\n var toolData = (0, _toolState.getToolState)(eventData.element, toolType);\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n var startPoint = toolData.data[0].startPoint;\n var endPoint = toolData.data[0].endPoint;\n\n if (!startPoint || !endPoint) {\n return;\n }\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Set to the active tool color\n var color = _toolColors2.default.getActiveColor();\n\n // Calculate the rectangle parameters\n var startPointCanvas = cornerstone.pixelToCanvas(element, startPoint);\n var endPointCanvas = cornerstone.pixelToCanvas(element, endPoint);\n\n var left = Math.min(startPointCanvas.x, endPointCanvas.x);\n var top = Math.min(startPointCanvas.y, endPointCanvas.y);\n var width = Math.abs(startPointCanvas.x - endPointCanvas.x);\n var height = Math.abs(startPointCanvas.y - endPointCanvas.y);\n\n var lineWidth = _toolStyle2.default.getToolWidth();\n var config = wwwcRegion.getConfiguration();\n\n // Draw the rectangle\n context.save();\n\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.rect(left, top, width, height);\n context.stroke();\n\n context.restore();\n}\n\n// --- Mouse tool enable / disable --- ///\nfunction disable(element) {\n element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback);\n\n element.removeEventListener(_events2.default.MOUSE_UP, dragEndCallback);\n element.removeEventListener(_events2.default.MOUSE_CLICK, dragEndCallback);\n\n element.removeEventListener(_events2.default.MOUSE_DRAG, dragCallback);\n element.removeEventListener(_events2.default.MOUSE_MOVE, dragCallback);\n\n element.removeEventListener(_events2.default.IMAGE_RENDERED, onImageRendered);\n element.removeEventListener(_events2.default.NEW_IMAGE, newImageCallback);\n\n _externalModules2.default.cornerstone.updateImage(element);\n}\n\nfunction activate(element, mouseButtonMask) {\n (0, _toolOptions.setToolOptions)(toolType, element, { mouseButtonMask: mouseButtonMask });\n\n var toolData = (0, _toolState.getToolState)(element, toolType);\n\n if (!toolData) {\n var data = [];\n\n (0, _toolState.addToolState)(element, toolType, data);\n }\n\n element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback);\n\n element.removeEventListener(_events2.default.MOUSE_UP, dragEndCallback);\n element.removeEventListener(_events2.default.MOUSE_CLICK, dragEndCallback);\n\n element.removeEventListener(_events2.default.MOUSE_DRAG, dragCallback);\n element.removeEventListener(_events2.default.MOUSE_MOVE, dragCallback);\n\n element.removeEventListener(_events2.default.IMAGE_RENDERED, onImageRendered);\n element.removeEventListener(_events2.default.NEW_IMAGE, newImageCallback);\n\n element.addEventListener(_events2.default.MOUSE_DOWN, mouseDownCallback);\n element.addEventListener(_events2.default.IMAGE_RENDERED, onImageRendered);\n\n // If the displayed image changes after the user has started clicking, we should\n // Cancel the handlers and prepare for another click\n element.addEventListener(_events2.default.NEW_IMAGE, newImageCallback);\n\n _externalModules2.default.cornerstone.updateImage(element);\n}\n\n// --- Touch tool enable / disable --- //\nfunction disableTouchDrag(element) {\n element.removeEventListener(_events2.default.TOUCH_DRAG, dragCallback);\n element.removeEventListener(_events2.default.TOUCH_START, recordStartPoint);\n element.removeEventListener(_events2.default.TOUCH_DRAG_END, applyWWWCRegion);\n element.removeEventListener(_events2.default.IMAGE_RENDERED, onImageRendered);\n}\n\nfunction activateTouchDrag(element) {\n var toolData = (0, _toolState.getToolState)(element, toolType);\n\n if (!toolData) {\n var data = [];\n\n (0, _toolState.addToolState)(element, toolType, data);\n }\n\n element.removeEventListener(_events2.default.TOUCH_DRAG, dragCallback);\n element.removeEventListener(_events2.default.TOUCH_START, recordStartPoint);\n element.removeEventListener(_events2.default.TOUCH_DRAG_END, applyWWWCRegion);\n element.removeEventListener(_events2.default.IMAGE_RENDERED, onImageRendered);\n\n element.addEventListener(_events2.default.TOUCH_DRAG, dragCallback);\n element.addEventListener(_events2.default.TOUCH_START, recordStartPoint);\n element.addEventListener(_events2.default.TOUCH_DRAG_END, applyWWWCRegion);\n element.addEventListener(_events2.default.IMAGE_RENDERED, onImageRendered);\n}\n\nfunction getConfiguration() {\n return configuration;\n}\n\nfunction setConfiguration(config) {\n configuration = config;\n}\n\n// Module exports\nvar wwwcRegion = {\n activate: activate,\n deactivate: disable,\n disable: disable,\n setConfiguration: setConfiguration,\n getConfiguration: getConfiguration\n};\n\nvar wwwcRegionTouch = {\n activate: activateTouchDrag,\n deactivate: disableTouchDrag,\n disable: disableTouchDrag\n};\n\nexports.wwwcRegion = wwwcRegion;\nexports.wwwcRegionTouch = wwwcRegionTouch;\n\n/***/ }),\n/* 118 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.zoomTouchDrag = exports.zoomTouchPinch = exports.zoomWheel = exports.zoom = undefined;\n\nvar _events = __webpack_require__(1);\n\nvar _events2 = _interopRequireDefault(_events);\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _simpleMouseButtonTool = __webpack_require__(16);\n\nvar _simpleMouseButtonTool2 = _interopRequireDefault(_simpleMouseButtonTool);\n\nvar _isMouseButtonEnabled = __webpack_require__(4);\n\nvar _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled);\n\nvar _mouseWheelTool = __webpack_require__(25);\n\nvar _mouseWheelTool2 = _interopRequireDefault(_mouseWheelTool);\n\nvar _touchPinchTool = __webpack_require__(56);\n\nvar _touchPinchTool2 = _interopRequireDefault(_touchPinchTool);\n\nvar _touchDragTool = __webpack_require__(15);\n\nvar _touchDragTool2 = _interopRequireDefault(_touchDragTool);\n\nvar _toolOptions = __webpack_require__(3);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar toolType = 'zoom';\nvar startPoints = void 0;\n\nfunction changeViewportScale(viewport, ticks) {\n var config = zoom.getConfiguration();\n var pow = 1.7;\n\n var oldFactor = Math.log(viewport.scale) / Math.log(pow);\n var factor = oldFactor + ticks;\n\n var scale = Math.pow(pow, factor);\n\n if (config.maxScale && scale > config.maxScale) {\n viewport.scale = config.maxScale;\n } else if (config.minScale && scale < config.minScale) {\n viewport.scale = config.minScale;\n } else {\n viewport.scale = scale;\n }\n\n return viewport;\n}\n\nfunction boundPosition(position, width, height) {\n position.x = Math.max(position.x, 0);\n position.y = Math.max(position.y, 0);\n position.x = Math.min(position.x, width);\n position.y = Math.min(position.y, height);\n\n return position;\n}\n\nfunction correctShift(shift, viewport) {\n // Apply Flips\n if (viewport.hflip) {\n shift.x *= -1;\n }\n\n if (viewport.vflip) {\n shift.y *= -1;\n }\n\n // Apply rotations\n if (viewport.rotation !== 0) {\n var angle = viewport.rotation * Math.PI / 180;\n\n var cosA = Math.cos(angle);\n var sinA = Math.sin(angle);\n\n var newX = shift.x * cosA - shift.y * sinA;\n var newY = shift.x * sinA + shift.y * cosA;\n\n shift.x = newX;\n shift.y = newY;\n }\n\n return shift;\n}\n\nfunction defaultStrategy(eventData, ticks) {\n var cornerstone = _externalModules2.default.cornerstone;\n var element = eventData.element;\n\n // Calculate the new scale factor based on how far the mouse has changed\n var viewport = changeViewportScale(eventData.viewport, ticks);\n\n cornerstone.setViewport(element, viewport);\n\n // Now that the scale has been updated, determine the offset we need to apply to the center so we can\n // Keep the original start location in the same position\n var newCoords = cornerstone.pageToPixel(element, eventData.startPoints.page.x, eventData.startPoints.page.y);\n\n // The shift we will use is the difference between the original image coordinates of the point we've selected\n // And the image coordinates of the same point on the page after the viewport scaling above has been performed\n // This shift is in image coordinates, and is designed to keep the target location fixed on the page.\n var shift = {\n x: eventData.startPoints.image.x - newCoords.x,\n y: eventData.startPoints.image.y - newCoords.y\n };\n\n // Correct the required shift using the viewport rotation and flip parameters\n shift = correctShift(shift, viewport);\n\n // Apply the shift to the Viewport's translation setting\n viewport.translation.x -= shift.x;\n viewport.translation.y -= shift.y;\n\n // Update the Viewport with the new translation value\n cornerstone.setViewport(element, viewport);\n}\n\nfunction translateStrategy(eventData, ticks) {\n var element = eventData.element;\n var image = eventData.image;\n var config = zoom.getConfiguration();\n\n // Calculate the new scale factor based on how far the mouse has changed\n // Note that in this case we don't need to update the viewport after the initial\n // Zoom step since we aren't don't intend to keep the target position static on\n // The page\n var viewport = changeViewportScale(eventData.viewport, ticks);\n\n // Define the default shift to take place during this zoom step\n var shift = {\n x: 0,\n y: 0\n };\n\n // Define the parameters for the translate strategy\n var translateSpeed = 8;\n var outwardsMinScaleToTranslate = 3;\n var minTranslation = 0.01;\n\n if (ticks < 0) {\n // Zoom outwards from the image center\n if (viewport.scale < outwardsMinScaleToTranslate) {\n // If the current translation is smaller than the minimum desired translation,\n // Set the translation to zero\n if (Math.abs(viewport.translation.x) < minTranslation) {\n viewport.translation.x = 0;\n } else {\n shift.x = viewport.translation.x / translateSpeed;\n }\n\n // If the current translation is smaller than the minimum desired translation,\n // Set the translation to zero\n if (Math.abs(viewport.translation.y) < minTranslation) {\n viewport.translation.y = 0;\n } else {\n shift.y = viewport.translation.y / translateSpeed;\n }\n }\n } else {\n // Zoom inwards to the current image point\n\n // Identify the coordinates of the point the user is trying to zoom into\n // If we are not allowed to zoom outside the image, bound the user-selected position to\n // A point inside the image\n if (config && config.preventZoomOutsideImage) {\n startPoints.image = boundPosition(startPoints.image, image.width, image.height);\n }\n\n // Calculate the translation value that would place the desired image point in the center\n // Of the viewport\n var desiredTranslation = {\n x: image.width / 2 - startPoints.image.x,\n y: image.height / 2 - startPoints.image.y\n };\n\n // Correct the target location using the viewport rotation and flip parameters\n desiredTranslation = correctShift(desiredTranslation, viewport);\n\n // Calculate the difference between the current viewport translation value and the\n // Final desired translation values\n var distanceToDesired = {\n x: viewport.translation.x - desiredTranslation.x,\n y: viewport.translation.y - desiredTranslation.y\n };\n\n // If the current translation is smaller than the minimum desired translation,\n // Stop translating in the x-direction\n if (Math.abs(distanceToDesired.x) < minTranslation) {\n viewport.translation.x = desiredTranslation.x;\n } else {\n // Otherwise, shift the viewport by one step\n shift.x = distanceToDesired.x / translateSpeed;\n }\n\n // If the current translation is smaller than the minimum desired translation,\n // Stop translating in the y-direction\n if (Math.abs(distanceToDesired.y) < minTranslation) {\n viewport.translation.y = desiredTranslation.y;\n } else {\n // Otherwise, shift the viewport by one step\n shift.y = distanceToDesired.y / translateSpeed;\n }\n }\n\n // Apply the shift to the Viewport's translation setting\n viewport.translation.x -= shift.x;\n viewport.translation.y -= shift.y;\n\n // Update the Viewport with the new translation value\n _externalModules2.default.cornerstone.setViewport(element, viewport);\n}\n\nfunction zoomToCenterStrategy(eventData, ticks) {\n var element = eventData.element;\n\n // Calculate the new scale factor based on how far the mouse has changed\n var viewport = changeViewportScale(eventData.viewport, ticks);\n\n _externalModules2.default.cornerstone.setViewport(element, viewport);\n}\n\nfunction mouseUpCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n\n element.removeEventListener(_events2.default.MOUSE_DRAG, dragCallback);\n element.removeEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback);\n}\n\nfunction mouseDownCallback(e) {\n var eventData = e.detail;\n var element = eventData.element;\n var options = (0, _toolOptions.getToolOptions)(toolType, element);\n\n if ((0, _isMouseButtonEnabled2.default)(eventData.which, options.mouseButtonMask)) {\n startPoints = eventData.startPoints; // Used for translateStrategy\n element.addEventListener(_events2.default.MOUSE_DRAG, dragCallback);\n element.addEventListener(_events2.default.MOUSE_UP, mouseUpCallback);\n element.addEventListener(_events2.default.MOUSE_CLICK, mouseUpCallback);\n\n e.preventDefault();\n e.stopPropagation();\n }\n}\n\nfunction dragCallback(e) {\n var eventData = e.detail;\n\n if (!eventData.deltaPoints.page.y) {\n return false;\n }\n\n var ticks = eventData.deltaPoints.page.y / 100;\n\n zoom.strategy(eventData, ticks);\n\n e.preventDefault();\n e.stopPropagation();\n}\n\nfunction mouseWheelCallback(e) {\n var eventData = e.detail;\n var ticks = -eventData.direction / 4;\n\n // Allow inversion of the mouse wheel scroll via a configuration option\n var config = zoom.getConfiguration();\n\n if (config && config.invert) {\n ticks *= -1;\n }\n\n var viewport = changeViewportScale(eventData.viewport, ticks);\n\n _externalModules2.default.cornerstone.setViewport(eventData.element, viewport);\n}\n\nfunction touchPinchCallback(e) {\n var eventData = e.detail;\n var cornerstone = _externalModules2.default.cornerstone;\n var config = zoom.getConfiguration();\n var viewport = eventData.viewport;\n var element = eventData.element;\n\n // Change the scale based on the pinch gesture's scale change\n viewport.scale += eventData.scaleChange * viewport.scale;\n if (config.maxScale && viewport.scale > config.maxScale) {\n viewport.scale = config.maxScale;\n } else if (config.minScale && viewport.scale < config.minScale) {\n viewport.scale = config.minScale;\n }\n\n cornerstone.setViewport(element, viewport);\n\n // Now that the scale has been updated, determine the offset we need to apply to the center so we can\n // Keep the original start location in the same position\n var newCoords = cornerstone.pageToPixel(element, eventData.startPoints.page.x, eventData.startPoints.page.y);\n var shift = {\n x: eventData.startPoints.image.x - newCoords.x,\n y: eventData.startPoints.image.y - newCoords.y\n };\n\n shift = correctShift(shift, viewport);\n viewport.translation.x -= shift.x;\n viewport.translation.y -= shift.y;\n cornerstone.setViewport(element, viewport);\n}\n\nvar zoom = (0, _simpleMouseButtonTool2.default)(mouseDownCallback, toolType);\n\nzoom.strategies = {\n default: defaultStrategy,\n translate: translateStrategy,\n zoomToCenter: zoomToCenterStrategy\n};\n\nzoom.strategy = defaultStrategy;\n\nvar zoomWheel = (0, _mouseWheelTool2.default)(mouseWheelCallback);\nvar zoomTouchPinch = (0, _touchPinchTool2.default)(touchPinchCallback);\nvar zoomTouchDrag = (0, _touchDragTool2.default)(dragCallback, toolType);\n\nexports.zoom = zoom;\nexports.zoomWheel = zoomWheel;\nexports.zoomTouchPinch = zoomTouchPinch;\nexports.zoomTouchDrag = zoomTouchDrag;\n\n/***/ }),\n/* 119 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.brush = undefined;\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _toolState = __webpack_require__(2);\n\nvar _brushTool = __webpack_require__(57);\n\nvar _brushTool2 = _interopRequireDefault(_brushTool);\n\nvar _getCircle = __webpack_require__(58);\n\nvar _getCircle2 = _interopRequireDefault(_getCircle);\n\nvar _drawBrush = __webpack_require__(59);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// This module is for creating segmentation overlays\nvar TOOL_STATE_TOOL_TYPE = 'brush';\nvar toolType = 'brush';\nvar configuration = {\n draw: 1,\n radius: 3,\n hoverColor: 'green',\n dragColor: 'yellow'\n};\n\nvar lastImageCoords = void 0;\nvar dragging = false;\n\nfunction paint(eventData) {\n var configuration = brush.getConfiguration();\n var element = eventData.element;\n var layer = _externalModules2.default.cornerstone.getLayer(element, configuration.brushLayerId);\n var _layer$image = layer.image,\n rows = _layer$image.rows,\n columns = _layer$image.columns;\n var _eventData$currentPoi = eventData.currentPoints.image,\n x = _eventData$currentPoi.x,\n y = _eventData$currentPoi.y;\n\n var toolData = (0, _toolState.getToolState)(element, TOOL_STATE_TOOL_TYPE);\n var pixelData = toolData.data[0].pixelData;\n var brushPixelValue = configuration.draw;\n var radius = configuration.radius;\n\n if (x < 0 || x > columns || y < 0 || y > rows) {\n return;\n }\n\n var pointerArray = (0, _getCircle2.default)(radius, rows, columns, x, y);\n\n (0, _drawBrush.drawBrushPixels)(pointerArray, pixelData, brushPixelValue, columns);\n\n layer.invalid = true;\n\n _externalModules2.default.cornerstone.updateImage(element);\n}\n\nfunction onMouseUp(e) {\n var eventData = e.detail;\n\n lastImageCoords = eventData.currentPoints.image;\n dragging = false;\n}\n\nfunction onMouseDown(e) {\n var eventData = e.detail;\n\n paint(eventData);\n dragging = true;\n lastImageCoords = eventData.currentPoints.image;\n}\n\nfunction onMouseMove(e) {\n var eventData = e.detail;\n\n lastImageCoords = eventData.currentPoints.image;\n _externalModules2.default.cornerstone.updateImage(eventData.element);\n}\n\nfunction onDrag(e) {\n var eventData = e.detail;\n\n paint(eventData);\n dragging = true;\n lastImageCoords = eventData.currentPoints.image;\n}\n\nfunction onImageRendered(e) {\n var eventData = e.detail;\n\n if (!lastImageCoords) {\n return;\n }\n\n var _eventData$image = eventData.image,\n rows = _eventData$image.rows,\n columns = _eventData$image.columns;\n var _lastImageCoords = lastImageCoords,\n x = _lastImageCoords.x,\n y = _lastImageCoords.y;\n\n\n if (x < 0 || x > columns || y < 0 || y > rows) {\n return;\n }\n\n // Draw the hover overlay on top of the pixel data\n var configuration = brush.getConfiguration();\n var radius = configuration.radius;\n var context = eventData.canvasContext;\n var color = dragging ? configuration.dragColor : configuration.hoverColor;\n var element = eventData.element;\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n var pointerArray = (0, _getCircle2.default)(radius, rows, columns, x, y);\n\n (0, _drawBrush.drawBrushOnCanvas)(pointerArray, context, color, element);\n}\n\nvar brush = (0, _brushTool2.default)({\n onMouseMove: onMouseMove,\n onMouseDown: onMouseDown,\n onMouseUp: onMouseUp,\n onDrag: onDrag,\n toolType: toolType,\n onImageRendered: onImageRendered\n});\n\nbrush.setConfiguration(configuration);\n\nexports.brush = brush;\n\n/***/ }),\n/* 120 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.adaptiveBrush = undefined;\n\nvar _externalModules = __webpack_require__(0);\n\nvar _externalModules2 = _interopRequireDefault(_externalModules);\n\nvar _toolState = __webpack_require__(2);\n\nvar _brushTool = __webpack_require__(57);\n\nvar _brushTool2 = _interopRequireDefault(_brushTool);\n\nvar _getCircle = __webpack_require__(58);\n\nvar _getCircle2 = _interopRequireDefault(_getCircle);\n\nvar _drawBrush = __webpack_require__(59);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// This module is for creating segmentation overlays\nvar TOOL_STATE_TOOL_TYPE = 'brush';\nvar toolType = 'adaptiveBrush';\nvar configuration = {\n draw: 1,\n radius: 3,\n tolerance: 5,\n minRadius: 1,\n hoverColor: 'green',\n dragColor: 'yellow'\n};\n\nvar lastImageCoords = void 0;\nvar thrMax = void 0;\nvar thrMin = void 0;\nvar currentRadius = void 0;\nvar dragging = void 0;\n\nfunction getGreyValues(pointerArray, pixelData, imageColumns) {\n var configuration = adaptiveBrush.getConfiguration();\n var tolerance = configuration.tolerance;\n var minValue = Number.MAX_VALUE;\n var maxValue = -Number.MAX_VALUE;\n\n pointerArray.forEach(function (point) {\n var pixelIndex = point[1] * imageColumns + point[0];\n var greyValue = pixelData[pixelIndex];\n\n minValue = Math.min(greyValue, minValue);\n maxValue = Math.max(greyValue, maxValue);\n });\n\n thrMin = minValue - tolerance;\n thrMax = maxValue + tolerance;\n}\n\n// Draws the pointer with overlap calculation - Used on mouse clicked\nfunction paintAdaptiveBrush(imagePixelData, brushPixelData, rows, columns) {\n var configuration = adaptiveBrush.getConfiguration();\n var brushPixelValue = configuration.draw;\n var mouseX = Math.round(lastImageCoords.x);\n var mouseY = Math.round(lastImageCoords.y);\n var numPixelsOutsideThresholdWindow = null;\n var pointerArray = [];\n var radius = configuration.radius;\n\n /*\n * Find pixels within the brush area. If within the brush area there are pixels outside the threshold min / max,\n * decrease the brush radius until there are no sub/supra threshold pixels left (or until you reach the minimum radius).\n */\n while (numPixelsOutsideThresholdWindow !== 0 && radius > configuration.minRadius) {\n numPixelsOutsideThresholdWindow = 0;\n pointerArray = (0, _getCircle2.default)(radius, rows, columns, mouseX, mouseY);\n\n // Loop through each of the relative pixel coordinates for the brush\n for (var j = 0; j < pointerArray.length; j++) {\n // Calculate the x / y image coordinates using the brush and the current mouse position\n var xCoord = pointerArray[j][0];\n var yCoord = pointerArray[j][1];\n\n // Otherwise, retrieve the image pixel value in this location\n var pixelIndex = yCoord * columns + xCoord;\n var pixelValue = imagePixelData[pixelIndex];\n\n /*\n If the image pixel value is outside of the thresholds,\n increase the numPixelsOutsideThresholdWindow counter\n */\n if (pixelValue > thrMax || pixelValue < thrMin) {\n numPixelsOutsideThresholdWindow++;\n break;\n }\n }\n\n radius--;\n }\n\n if (numPixelsOutsideThresholdWindow === 0) {\n (0, _drawBrush.drawBrushPixels)(pointerArray, brushPixelData, brushPixelValue, columns);\n }\n\n return radius;\n}\n\nfunction paint(eventData) {\n var configuration = adaptiveBrush.getConfiguration();\n var element = eventData.element;\n var layer = _externalModules2.default.cornerstone.getLayer(element, configuration.brushLayerId);\n var baseLayer = _externalModules2.default.cornerstone.getLayers(element)[0];\n var _layer$image = layer.image,\n rows = _layer$image.rows,\n columns = _layer$image.columns;\n\n var toolData = (0, _toolState.getToolState)(element, TOOL_STATE_TOOL_TYPE);\n var brushData = toolData.data[0];\n\n currentRadius = paintAdaptiveBrush(baseLayer.image.getPixelData(), brushData.pixelData, rows, columns);\n layer.invalid = true;\n\n _externalModules2.default.cornerstone.updateImage(element);\n}\n\nfunction erase(eventData) {\n var configuration = adaptiveBrush.getConfiguration();\n var element = eventData.element;\n var layer = _externalModules2.default.cornerstone.getLayer(element, configuration.brushLayerId);\n var _layer$image2 = layer.image,\n rows = _layer$image2.rows,\n columns = _layer$image2.columns;\n var _eventData$currentPoi = eventData.currentPoints.image,\n x = _eventData$currentPoi.x,\n y = _eventData$currentPoi.y;\n\n var toolData = (0, _toolState.getToolState)(element, TOOL_STATE_TOOL_TYPE);\n var pixelData = toolData.data[0].pixelData;\n var brushPixelValue = configuration.draw;\n var radius = configuration.radius;\n\n if (x < 0 || x > columns || y < 0 || y > rows) {\n return;\n }\n\n var pointerArray = (0, _getCircle2.default)(radius, rows, columns, x, y);\n\n (0, _drawBrush.drawBrushPixels)(pointerArray, pixelData, brushPixelValue, columns);\n\n layer.invalid = true;\n\n _externalModules2.default.cornerstone.updateImage(element);\n}\n\nfunction onMouseUp(e) {\n var eventData = e.detail;\n\n lastImageCoords = eventData.currentPoints.image;\n var configuration = adaptiveBrush.getConfiguration();\n\n dragging = false;\n currentRadius = configuration.radius;\n _externalModules2.default.cornerstone.updateImage(eventData.element);\n}\n\nfunction onMouseDown(e) {\n var eventData = e.detail;\n\n var element = eventData.element;\n var configuration = adaptiveBrush.getConfiguration();\n var layer = _externalModules2.default.cornerstone.getLayer(element, configuration.brushLayerId);\n var baseLayer = _externalModules2.default.cornerstone.getLayers(element)[0];\n var _eventData$currentPoi2 = eventData.currentPoints.image,\n x = _eventData$currentPoi2.x,\n y = _eventData$currentPoi2.y;\n var _layer$image3 = layer.image,\n rows = _layer$image3.rows,\n columns = _layer$image3.columns;\n\n var pointerArray = (0, _getCircle2.default)(configuration.radius, rows, columns, x, y);\n\n if (configuration.draw === 0) {\n erase(eventData);\n } else {\n getGreyValues(pointerArray, baseLayer.image.getPixelData(), columns);\n paint(eventData);\n }\n\n dragging = true;\n lastImageCoords = eventData.currentPoints.image;\n}\n\nfunction onMouseMove(e) {\n var eventData = e.detail;\n\n lastImageCoords = eventData.currentPoints.image;\n _externalModules2.default.cornerstone.updateImage(eventData.element);\n}\n\nfunction onDrag(e) {\n var eventData = e.detail;\n\n if (configuration.draw === 0) {\n erase(eventData);\n } else {\n paint(eventData);\n }\n\n dragging = true;\n lastImageCoords = eventData.currentPoints.image;\n}\n\nfunction onImageRendered(e) {\n var eventData = e.detail;\n\n if (!lastImageCoords) {\n return;\n }\n\n var _eventData$image = eventData.image,\n rows = _eventData$image.rows,\n columns = _eventData$image.columns;\n var _lastImageCoords = lastImageCoords,\n x = _lastImageCoords.x,\n y = _lastImageCoords.y;\n\n\n if (x < 0 || x > columns || y < 0 || y > rows) {\n return;\n }\n\n // Draw the hover overlay on top of the pixel data\n var configuration = adaptiveBrush.getConfiguration();\n var context = eventData.canvasContext;\n var color = dragging ? configuration.dragColor : configuration.hoverColor;\n var element = eventData.element;\n\n currentRadius = currentRadius || configuration.radius;\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n var pointerArray = (0, _getCircle2.default)(currentRadius, rows, columns, x, y);\n\n (0, _drawBrush.drawBrushOnCanvas)(pointerArray, context, color, element);\n}\n\nvar adaptiveBrush = (0, _brushTool2.default)({\n onMouseMove: onMouseMove,\n onMouseDown: onMouseDown,\n onMouseUp: onMouseUp,\n onDrag: onDrag,\n toolType: toolType,\n onImageRendered: onImageRendered\n});\n\nadaptiveBrush.setConfiguration(configuration);\n\nexports.adaptiveBrush = adaptiveBrush;\n\n/***/ }),\n/* 121 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = '2.0.0';\n\n/***/ })\n/******/ ]);\n});\n\n\n// WEBPACK FOOTER //\n// cornerstoneTools.min.js"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 60);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 07150c22977bb1491743","let cornerstone = window.cornerstone;\nlet cornerstoneMath = window.cornerstoneMath;\nlet Hammer = window.Hammer;\n\nexport default {\n set cornerstone (cs) {\n cornerstone = cs;\n },\n get cornerstone () {\n return cornerstone;\n },\n set cornerstoneMath (cm) {\n cornerstoneMath = cm;\n },\n get cornerstoneMath () {\n return cornerstoneMath;\n },\n set Hammer (module) {\n Hammer = module;\n },\n get Hammer () {\n return Hammer;\n }\n};\n\n\n\n// WEBPACK FOOTER //\n// ./externalModules.js","const EVENTS = {\n // Events from Cornerstone Core\n IMAGE_RENDERED: 'cornerstoneimagerendered',\n NEW_IMAGE: 'cornerstonenewimage',\n IMAGE_CACHE_PROMISE_REMOVED: 'cornerstoneimagecachepromiseremoved',\n ELEMENT_DISABLED: 'cornerstoneelementdisabled',\n\n // Mouse events\n MOUSE_DOWN: 'cornerstonetoolsmousedown',\n MOUSE_UP: 'cornerstonetoolsmouseup',\n MOUSE_DOWN_ACTIVATE: 'cornerstonetoolsmousedownactivate',\n MOUSE_DRAG: 'cornerstonetoolsmousedrag',\n MOUSE_MOVE: 'cornerstonetoolsmousemove',\n MOUSE_CLICK: 'cornerstonetoolsmouseclick',\n MOUSE_DOUBLE_CLICK: 'cornerstonetoolsmousedoubleclick',\n MOUSE_WHEEL: 'cornerstonetoolsmousewheel',\n\n // Touch events\n TOUCH_START: 'cornerstonetoolstouchstart',\n TOUCH_START_ACTIVE: 'cornerstonetoolstouchstartactive',\n TOUCH_END: 'cornerstonetoolstouchend',\n TOUCH_DRAG: 'cornerstonetoolstouchdrag',\n TOUCH_DRAG_END: 'cornerstonetoolstouchdragend',\n TOUCH_PINCH: 'cornerstonetoolstouchpinch',\n TOUCH_ROTATE: 'cornerstonetoolstouchrotate',\n TOUCH_PRESS: 'cornerstonetoolstouchpress',\n TAP: 'cornerstonetoolstap',\n DOUBLE_TAP: 'cornerstonetoolsdoubletap',\n MULTI_TOUCH_START: 'cornerstonetoolsmultitouchstart',\n MULTI_TOUCH_START_ACTIVE: 'cornerstonetoolsmultitouchstartactive',\n MULTI_TOUCH_DRAG: 'cornerstonetoolsmultitouchdrag',\n\n // Keyboard events\n KEY_DOWN: 'cornerstonetoolskeydown',\n KEY_UP: 'cornerstonetoolskeyup',\n KEY_PRESS: 'cornerstonetoolskeypress',\n\n // Measurement / tool events\n MEASUREMENT_ADDED: 'cornerstonetoolsmeasurementadded',\n MEASUREMENT_MODIFIED: 'cornerstonetoolsmeasurementmodified',\n MEASUREMENT_REMOVED: 'cornerstonemeasurementremoved',\n TOOL_DEACTIVATED: 'cornerstonetoolstooldeactivated',\n CLIP_STOPPED: 'cornerstonetoolsclipstopped',\n STACK_SCROLL: 'cornerstonestackscroll', // Should be renamed\n\n LINE_SAMPLE_UPDATED: 'cornerstonelinesampleupdated'\n};\n\nexport default EVENTS;\n\n\n\n// WEBPACK FOOTER //\n// ./events.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport { globalImageIdSpecificToolStateManager } from './imageIdSpecificStateManager.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nfunction getElementToolStateManager (element) {\n const enabledImage = external.cornerstone.getEnabledElement(element);\n // If the enabledImage has no toolStateManager, create a default one for it\n // NOTE: This makes state management element specific\n\n if (enabledImage.toolStateManager === undefined) {\n enabledImage.toolStateManager = globalImageIdSpecificToolStateManager;\n }\n\n return enabledImage.toolStateManager;\n}\n\n// Here we add tool state, this is done by tools as well\n// As modules that restore saved state\nfunction addToolState (element, toolType, measurementData) {\n const toolStateManager = getElementToolStateManager(element);\n\n toolStateManager.add(element, toolType, measurementData);\n\n const eventType = EVENTS.MEASUREMENT_ADDED;\n const eventData = {\n toolType,\n element,\n measurementData\n };\n\n triggerEvent(element, eventType, eventData);\n}\n\n// Here you can get state - used by tools as well as modules\n// That save state persistently\nfunction getToolState (element, toolType) {\n const toolStateManager = getElementToolStateManager(element);\n\n\n return toolStateManager.get(element, toolType);\n}\n\nfunction removeToolState (element, toolType, data) {\n const toolStateManager = getElementToolStateManager(element);\n const toolData = toolStateManager.get(element, toolType);\n // Find this tool data\n let indexOfData = -1;\n\n for (let i = 0; i < toolData.data.length; i++) {\n if (toolData.data[i] === data) {\n indexOfData = i;\n }\n }\n\n if (indexOfData !== -1) {\n toolData.data.splice(indexOfData, 1);\n\n const eventType = EVENTS.MEASUREMENT_REMOVED;\n const eventData = {\n toolType,\n element,\n measurementData: data\n };\n\n triggerEvent(element, eventType, eventData);\n }\n}\n\nfunction clearToolState (element, toolType) {\n const toolStateManager = getElementToolStateManager(element);\n const toolData = toolStateManager.get(element, toolType);\n\n // If any toolData actually exists, clear it\n if (toolData !== undefined) {\n toolData.data = [];\n }\n}\n\n// Sets the tool state manager for an element\nfunction setElementToolStateManager (element, toolStateManager) {\n const enabledImage = external.cornerstone.getEnabledElement(element);\n\n enabledImage.toolStateManager = toolStateManager;\n}\n\nexport {\n addToolState,\n getToolState,\n removeToolState,\n clearToolState,\n setElementToolStateManager,\n getElementToolStateManager\n};\n\n\n\n// WEBPACK FOOTER //\n// ./stateManagement/toolState.js","const elementToolOptions = {};\n\nfunction getToolOptions (toolType, element) {\n if (!elementToolOptions[toolType]) {\n return {};\n }\n\n const toolOptions = elementToolOptions[toolType];\n const optionsObject = toolOptions.find((toolOptionObject) => toolOptionObject.element === element);\n\n if (!optionsObject) {\n return {};\n }\n\n return optionsObject.options;\n}\n\nfunction setToolOptions (toolType, element, options) {\n if (!elementToolOptions[toolType]) {\n elementToolOptions[toolType] = [{\n element,\n options\n }];\n\n return;\n }\n\n const toolOptions = elementToolOptions[toolType];\n const index = toolOptions.findIndex((toolOptionObject) => toolOptionObject.element === element);\n\n if (index === -1) {\n elementToolOptions[toolType].push({\n element,\n options\n });\n } else {\n elementToolOptions[toolType][index].options = options;\n }\n}\n\nexport { getToolOptions, setToolOptions };\n\n\n\n// WEBPACK FOOTER //\n// ./toolOptions.js","/* eslint no-bitwise:0 */\n\nexport default function (which, mouseButtonMask) {\n const mouseButton = (1 << (which - 1));\n\n\n return ((mouseButtonMask & mouseButton) !== 0);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/isMouseButtonEnabled.js","/**\n * Trigger a CustomEvent\n *\n * @param {EventTarget} el The element or EventTarget to trigger the event upon\n * @param {String} type The event type name\n * @param {Object|null} detail=null The event data to be sent\n * @returns {Boolean} The return value is false if at least one event listener called preventDefault(). Otherwise it returns true.\n */\nexport default function triggerEvent (el, type, detail = null) {\n let event;\n\n // This check is needed to polyfill CustomEvent on IE11-\n if (typeof window.CustomEvent === 'function') {\n event = new CustomEvent(type, {\n detail,\n cancelable: true\n });\n } else {\n event = document.createEvent('CustomEvent');\n event.initCustomEvent(type, true, true, detail);\n }\n\n return el.dispatchEvent(event);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/triggerEvent.js","\nlet defaultColor = 'white',\n activeColor = 'greenyellow',\n fillColor = 'transparent';\n\nfunction setFillColor (color) {\n fillColor = color;\n}\n\nfunction getFillColor () {\n return fillColor;\n}\n\nfunction setToolColor (color) {\n defaultColor = color;\n}\n\nfunction getToolColor () {\n return defaultColor;\n}\n\nfunction setActiveColor (color) {\n activeColor = color;\n}\n\nfunction getActiveColor () {\n return activeColor;\n}\n\nfunction getColorIfActive (active) {\n return active ? activeColor : defaultColor;\n}\n\nconst toolColors = {\n setFillColor,\n getFillColor,\n setToolColor,\n getToolColor,\n setActiveColor,\n getActiveColor,\n getColorIfActive\n};\n\nexport default toolColors;\n\n\n\n// WEBPACK FOOTER //\n// ./stateManagement/toolColors.js","import textStyle from '../stateManagement/textStyle.js';\n\nexport default function (context, textLines, x, y, color, options) {\n if (Object.prototype.toString.call(textLines) !== '[object Array]') {\n textLines = [textLines];\n }\n\n const padding = 5;\n const font = textStyle.getFont();\n const fontSize = textStyle.getFontSize();\n const backgroundColor = textStyle.getBackgroundColor();\n\n context.save();\n context.font = font;\n context.textBaseline = 'top';\n context.strokeStyle = color;\n\n // Find the longest text width in the array of text data\n let maxWidth = 0;\n\n textLines.forEach(function (text) {\n // Get the text width in the current font\n const width = context.measureText(text).width;\n\n // Find the maximum with for all the text rows;\n maxWidth = Math.max(maxWidth, width);\n });\n\n // Draw the background box with padding\n context.fillStyle = backgroundColor;\n\n // Calculate the bounding box for this text box\n const boundingBox = {\n width: maxWidth + (padding * 2),\n height: padding + textLines.length * (fontSize + padding)\n };\n\n if (options && options.centering && options.centering.x === true) {\n x -= boundingBox.width / 2;\n }\n\n if (options && options.centering && options.centering.y === true) {\n y -= boundingBox.height / 2;\n }\n\n boundingBox.left = x;\n boundingBox.top = y;\n\n if (options && options.debug === true) {\n context.fillStyle = '#FF0000';\n }\n\n context.fillRect(boundingBox.left, boundingBox.top, boundingBox.width, boundingBox.height);\n\n // Draw each of the text lines on top of the background box\n textLines.forEach(function (text, index) {\n context.fillStyle = color;\n\n /* Var ypos;\n if (index === 0) {\n ypos = y + index * (fontSize + padding);\n } else {\n ypos = y + index * (fontSize + padding * 2);\n }*/\n\n context.fillText(text, x + padding, y + padding + index * (fontSize + padding));\n });\n\n context.restore();\n\n // Return the bounding box so it can be used for pointNearHandle\n return boundingBox;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/drawTextBox.js","let defaultWidth = 1,\n activeWidth = 2;\n\nfunction setToolWidth (width) {\n defaultWidth = width;\n}\n\nfunction getToolWidth () {\n return defaultWidth;\n}\n\nfunction setActiveWidth (width) {\n activeWidth = width;\n}\n\nfunction getActiveWidth () {\n return activeWidth;\n}\n\nconst toolStyle = {\n setToolWidth,\n getToolWidth,\n setActiveWidth,\n getActiveWidth\n};\n\nexport default toolStyle;\n\n\n\n// WEBPACK FOOTER //\n// ./stateManagement/toolStyle.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport toolCoordinates from '../stateManagement/toolCoordinates.js';\nimport getHandleNearImagePoint from '../manipulators/getHandleNearImagePoint.js';\nimport handleActivator from '../manipulators/handleActivator.js';\nimport moveHandle from '../manipulators/moveHandle.js';\nimport moveNewHandle from '../manipulators/moveNewHandle.js';\nimport moveAllHandles from '../manipulators/moveAllHandles.js';\nimport anyHandlesOutsideImage from '../manipulators/anyHandlesOutsideImage.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport { addToolState, removeToolState, getToolState } from '../stateManagement/toolState.js';\nimport triggerEvent from '../util/triggerEvent.js';\nimport { getToolOptions, setToolOptions } from '../toolOptions.js';\n\nexport default function (mouseToolInterface) {\n let configuration = {};\n const toolType = mouseToolInterface.toolType;\n\n function mouseDownActivateCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const options = getToolOptions(toolType, element);\n\n if (!isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) {\n return;\n }\n\n if (mouseToolInterface.addNewMeasurement) {\n mouseToolInterface.addNewMeasurement(eventData);\n } else {\n addNewMeasurement(eventData);\n }\n\n e.preventDefault();\n e.stopPropagation();\n }\n\n // /////// END ACTIVE TOOL ///////\n\n // /////// BEGIN DEACTIVE TOOL ///////\n\n function mouseMoveCallback (e) {\n const eventData = e.detail;\n\n toolCoordinates.setCoords(eventData);\n\n // If we have no tool data for this element, do nothing\n const toolData = getToolState(eventData.element, toolType);\n\n if (!toolData) {\n return;\n }\n\n // We have tool data, search through all data\n // And see if we can activate a handle\n let imageNeedsUpdate = false;\n\n for (let i = 0; i < toolData.data.length; i++) {\n // Get the cursor position in canvas coordinates\n const coords = eventData.currentPoints.canvas;\n\n const data = toolData.data[i];\n\n if (handleActivator(eventData.element, data.handles, coords) === true) {\n imageNeedsUpdate = true;\n }\n\n if ((mouseToolInterface.pointNearTool(eventData.element, data, coords) && !data.active) ||\n (!mouseToolInterface.pointNearTool(eventData.element, data, coords) && data.active)) {\n data.active = !data.active;\n imageNeedsUpdate = true;\n }\n }\n\n // Handle activation status changed, redraw the image\n if (imageNeedsUpdate === true) {\n external.cornerstone.updateImage(eventData.element);\n }\n }\n\n function mouseDownCallback (e) {\n const eventData = e.detail;\n let data;\n const element = eventData.element;\n const options = getToolOptions(toolType, element);\n\n if (!isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) {\n return;\n }\n\n function handleDoneMove () {\n data.invalidated = true;\n if (anyHandlesOutsideImage(eventData, data.handles)) {\n // Delete the measurement\n removeToolState(element, toolType, data);\n }\n\n external.cornerstone.updateImage(element);\n element.addEventListener(EVENTS.MOUSE_MOVE, mouseMove);\n }\n\n const coords = eventData.startPoints.canvas;\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n let i;\n\n // Now check to see if there is a handle we can move\n\n let preventHandleOutsideImage;\n\n if (mouseToolInterface.options && mouseToolInterface.options.preventHandleOutsideImage !== undefined) {\n preventHandleOutsideImage = mouseToolInterface.options.preventHandleOutsideImage;\n } else {\n preventHandleOutsideImage = false;\n }\n\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n const distance = 6;\n const handle = getHandleNearImagePoint(element, data.handles, coords, distance);\n\n if (handle) {\n element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMove);\n data.active = true;\n moveHandle(eventData, toolType, data, handle, handleDoneMove, preventHandleOutsideImage);\n e.stopImmediatePropagation();\n e.stopPropagation();\n e.preventDefault();\n\n return;\n }\n }\n\n // Now check to see if there is a line we can move\n // Now check to see if we have a tool that we can move\n if (!mouseToolInterface.pointNearTool) {\n return;\n }\n\n const opt = mouseToolInterface.options || {\n deleteIfHandleOutsideImage: true,\n preventHandleOutsideImage: false\n };\n\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n data.active = false;\n if (mouseToolInterface.pointNearTool(element, data, coords)) {\n data.active = true;\n element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMove);\n moveAllHandles(e, data, toolData, toolType, opt, handleDoneMove);\n e.stopImmediatePropagation();\n e.stopPropagation();\n e.preventDefault();\n\n return;\n }\n }\n }\n // /////// END DEACTIVE TOOL ///////\n\n\n const mouseMove = mouseToolInterface.mouseMoveCallback || mouseMoveCallback;\n const mouseDown = mouseToolInterface.mouseDownCallback || mouseDownCallback;\n const mouseDownActivate = mouseToolInterface.mouseDownActivateCallback || mouseDownActivateCallback;\n const mouseDoubleClick = mouseToolInterface.mouseDoubleClickCallback;\n\n // /////// BEGIN ACTIVE TOOL ///////\n function addNewMeasurement (mouseEventData) {\n const cornerstone = external.cornerstone;\n const element = mouseEventData.element;\n\n const measurementData = mouseToolInterface.createNewMeasurement(mouseEventData);\n\n if (!measurementData) {\n return;\n }\n\n // Associate this data with this imageId so we can render it and manipulate it\n addToolState(mouseEventData.element, toolType, measurementData);\n\n // Since we are dragging to another place to drop the end point, we can just activate\n // The end point and let the moveHandle move it for us.\n element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMove);\n element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDown);\n element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownActivate);\n\n if (mouseDoubleClick) {\n element.removeEventListener(EVENTS.MOUSE_DOUBLE_CLICK, mouseDoubleClick);\n }\n\n cornerstone.updateImage(element);\n\n let handleMover;\n\n if (Object.keys(measurementData.handles).length === 1) {\n handleMover = moveHandle;\n } else {\n handleMover = moveNewHandle;\n }\n\n let preventHandleOutsideImage;\n\n if (mouseToolInterface.options && mouseToolInterface.options.preventHandleOutsideImage !== undefined) {\n preventHandleOutsideImage = mouseToolInterface.options.preventHandleOutsideImage;\n } else {\n preventHandleOutsideImage = false;\n }\n\n handleMover(mouseEventData, toolType, measurementData, measurementData.handles.end, function () {\n measurementData.active = false;\n measurementData.invalidated = true;\n if (anyHandlesOutsideImage(mouseEventData, measurementData.handles)) {\n // Delete the measurement\n removeToolState(element, toolType, measurementData);\n }\n\n element.addEventListener(EVENTS.MOUSE_MOVE, mouseMove);\n element.addEventListener(EVENTS.MOUSE_DOWN, mouseDown);\n element.addEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownActivate);\n\n if (mouseDoubleClick) {\n element.addEventListener(EVENTS.MOUSE_DOUBLE_CLICK, mouseDoubleClick);\n }\n\n cornerstone.updateImage(element);\n }, preventHandleOutsideImage);\n }\n\n\n // Not visible, not interactive\n function disable (element) {\n element.removeEventListener(EVENTS.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMove);\n element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDown);\n element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownActivate);\n\n if (mouseDoubleClick) {\n element.removeEventListener(EVENTS.MOUSE_DOUBLE_CLICK, mouseDoubleClick);\n }\n\n external.cornerstone.updateImage(element);\n }\n\n // Visible but not interactive\n function enable (element) {\n element.removeEventListener(EVENTS.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMove);\n element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDown);\n element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownActivate);\n\n if (mouseDoubleClick) {\n element.removeEventListener(EVENTS.MOUSE_DOUBLE_CLICK, mouseDoubleClick);\n }\n\n element.addEventListener(EVENTS.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n\n external.cornerstone.updateImage(element);\n }\n\n // Visible, interactive and can create\n function activate (element, mouseButtonMask) {\n setToolOptions(toolType, element, { mouseButtonMask });\n\n element.removeEventListener(EVENTS.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMove);\n element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDown);\n element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownActivate);\n\n element.addEventListener(EVENTS.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n element.addEventListener(EVENTS.MOUSE_MOVE, mouseMove);\n element.addEventListener(EVENTS.MOUSE_DOWN, mouseDown);\n element.addEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownActivate);\n\n if (mouseDoubleClick) {\n element.removeEventListener(EVENTS.MOUSE_DOUBLE_CLICK, mouseDoubleClick);\n element.addEventListener(EVENTS.MOUSE_DOUBLE_CLICK, mouseDoubleClick);\n }\n\n external.cornerstone.updateImage(element);\n }\n\n // Visible, interactive\n function deactivate (element, mouseButtonMask) {\n setToolOptions(toolType, element, { mouseButtonMask });\n\n const eventType = EVENTS.TOOL_DEACTIVATED;\n const statusChangeEventData = {\n mouseButtonMask,\n toolType,\n type: eventType\n };\n\n triggerEvent(element, eventType, statusChangeEventData);\n\n element.removeEventListener(EVENTS.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMove);\n element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDown);\n element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownActivate);\n\n element.addEventListener(EVENTS.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n element.addEventListener(EVENTS.MOUSE_MOVE, mouseMove);\n element.addEventListener(EVENTS.MOUSE_DOWN, mouseDown);\n\n if (mouseDoubleClick) {\n element.removeEventListener(EVENTS.MOUSE_DOUBLE_CLICK, mouseDoubleClick);\n element.addEventListener(EVENTS.MOUSE_DOUBLE_CLICK, mouseDoubleClick);\n }\n\n if (mouseToolInterface.deactivate) {\n mouseToolInterface.deactivate(element, mouseButtonMask);\n }\n\n external.cornerstone.updateImage(element);\n }\n\n function getConfiguration () {\n return configuration;\n }\n\n function setConfiguration (config) {\n configuration = config;\n }\n\n const toolInterface = {\n enable,\n disable,\n activate,\n deactivate,\n getConfiguration,\n setConfiguration,\n mouseDownCallback,\n mouseMoveCallback,\n mouseDownActivateCallback\n };\n\n // Expose pointNearTool if available\n if (mouseToolInterface.pointNearTool) {\n toolInterface.pointNearTool = mouseToolInterface.pointNearTool;\n }\n\n if (mouseDoubleClick) {\n toolInterface.mouseDoubleClickCallback = mouseDoubleClick;\n }\n\n if (mouseToolInterface.addNewMeasurement) {\n toolInterface.addNewMeasurement = mouseToolInterface.addNewMeasurement;\n }\n\n return toolInterface;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/mouseButtonTool.js","import external from '../externalModules.js';\nimport toolStyle from '../stateManagement/toolStyle.js';\n\nconst handleRadius = 6;\n\nexport default function (context, renderData, handles, color, options) {\n context.strokeStyle = color;\n\n Object.keys(handles).forEach(function (name) {\n const handle = handles[name];\n\n if (handle.drawnIndependently === true) {\n return;\n }\n\n if (options && options.drawHandlesIfActive === true && !handle.active) {\n return;\n }\n\n context.beginPath();\n\n if (handle.active) {\n context.lineWidth = toolStyle.getActiveWidth();\n } else {\n context.lineWidth = toolStyle.getToolWidth();\n }\n\n const handleCanvasCoords = external.cornerstone.pixelToCanvas(renderData.element, handle);\n\n context.arc(handleCanvasCoords.x, handleCanvasCoords.y, handleRadius, 0, 2 * Math.PI);\n\n if (options && options.fill) {\n context.fillStyle = options.fill;\n context.fill();\n }\n\n context.stroke();\n });\n}\n\n\n\n// WEBPACK FOOTER //\n// ./manipulators/drawHandles.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport anyHandlesOutsideImage from '../manipulators/anyHandlesOutsideImage.js';\nimport getHandleNearImagePoint from '../manipulators/getHandleNearImagePoint.js';\nimport touchMoveHandle from '../manipulators/touchMoveHandle.js';\nimport moveNewHandleTouch from '../manipulators/moveNewHandleTouch.js';\nimport touchMoveAllHandles from '../manipulators/touchMoveAllHandles.js';\nimport { addToolState, removeToolState, getToolState } from '../stateManagement/toolState.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nfunction deactivateAllHandles (handles) {\n Object.keys(handles).forEach(function (name) {\n const handle = handles[name];\n\n handle.active = false;\n });\n}\n\nfunction deactivateAllToolInstances (toolData) {\n if (!toolData) {\n return;\n }\n\n for (let i = 0; i < toolData.data.length; i++) {\n const data = toolData.data[i];\n\n data.active = false;\n if (!data.handles) {\n continue;\n }\n\n deactivateAllHandles(data.handles);\n }\n}\n\nfunction touchTool (touchToolInterface) {\n // /////// BEGIN ACTIVE TOOL ///////\n function addNewMeasurement (touchEventData) {\n // Console.log('touchTool addNewMeasurement');\n const cornerstone = external.cornerstone;\n const element = touchEventData.element;\n\n const measurementData = touchToolInterface.createNewMeasurement(touchEventData);\n\n if (!measurementData) {\n return;\n }\n\n addToolState(element, touchToolInterface.toolType, measurementData);\n\n if (Object.keys(measurementData.handles).length === 1 && touchEventData.type === EVENTS.TAP) {\n measurementData.active = false;\n measurementData.handles.end.active = false;\n measurementData.handles.end.highlight = false;\n measurementData.invalidated = true;\n if (anyHandlesOutsideImage(touchEventData, measurementData.handles)) {\n // Delete the measurement\n removeToolState(element, touchToolInterface.toolType, measurementData);\n }\n\n cornerstone.updateImage(element);\n\n return;\n }\n\n element.removeEventListener(EVENTS.TOUCH_START_ACTIVE, touchToolInterface.touchDownActivateCallback || touchDownActivateCallback);\n element.removeEventListener(EVENTS.TAP, touchToolInterface.tapCallback || tapCallback);\n element.removeEventListener(EVENTS.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n\n cornerstone.updateImage(element);\n moveNewHandleTouch(touchEventData, touchToolInterface.toolType, measurementData, measurementData.handles.end, function () {\n measurementData.active = false;\n measurementData.invalidated = true;\n if (anyHandlesOutsideImage(touchEventData, measurementData.handles)) {\n // Delete the measurement\n removeToolState(element, touchToolInterface.toolType, measurementData);\n }\n\n element.addEventListener(EVENTS.TOUCH_START_ACTIVE, touchToolInterface.touchDownActivateCallback || touchDownActivateCallback);\n element.addEventListener(EVENTS.TAP, touchToolInterface.tapCallback || tapCallback);\n element.addEventListener(EVENTS.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n cornerstone.updateImage(element);\n });\n }\n\n function touchDownActivateCallback (e) {\n const eventData = e.detail;\n\n // Console.log('touchTool touchDownActivateCallback');\n if (touchToolInterface.addNewMeasurement) {\n touchToolInterface.addNewMeasurement(eventData);\n } else {\n addNewMeasurement(eventData);\n }\n\n e.stopImmediatePropagation();\n e.preventDefault();\n }\n // /////// END ACTIVE TOOL ///////\n\n // /////// BEGIN INACTIVE TOOL ///////\n function tapCallback (e) {\n const eventData = e.detail;\n\n // Console.log('touchTool tapCallback');\n const cornerstone = external.cornerstone;\n const element = eventData.element;\n const coords = eventData.currentPoints.canvas;\n const toolData = getToolState(e.currentTarget, touchToolInterface.toolType);\n let data;\n let i;\n\n // Deactivate everything\n deactivateAllToolInstances(toolData);\n\n function doneMovingCallback () {\n // Console.log('touchTool tapCallback doneMovingCallback');\n deactivateAllToolInstances(toolData);\n if (anyHandlesOutsideImage(eventData, data.handles)) {\n // Delete the measurement\n removeToolState(element, touchToolInterface.toolType, data);\n }\n\n cornerstone.updateImage(element);\n element.addEventListener(EVENTS.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n element.addEventListener(EVENTS.TAP, touchToolInterface.tapCallback || tapCallback);\n }\n\n // Now check to see if there is a handle we can move\n if (toolData) {\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n const distanceSq = 25; // Should probably make this a settable property later\n const handle = getHandleNearImagePoint(element, data.handles, coords, distanceSq);\n\n if (handle) {\n element.removeEventListener(EVENTS.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n element.removeEventListener(EVENTS.TAP, touchToolInterface.tapCallback || tapCallback);\n data.active = true;\n handle.active = true;\n cornerstone.updateImage(element);\n touchMoveHandle(e, touchToolInterface.toolType, data, handle, doneMovingCallback);\n e.stopImmediatePropagation();\n e.preventDefault();\n\n return;\n }\n }\n }\n\n // Now check to see if we have a tool that we can move\n if (toolData && touchToolInterface.pointNearTool) {\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (touchToolInterface.pointNearTool(element, data, coords)) {\n element.removeEventListener(EVENTS.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n element.removeEventListener(EVENTS.TAP, touchToolInterface.tapCallback || tapCallback);\n data.active = true;\n cornerstone.updateImage(element);\n touchMoveAllHandles(e, data, toolData, touchToolInterface.toolType, true, doneMovingCallback);\n e.stopImmediatePropagation();\n e.preventDefault();\n\n return;\n }\n }\n }\n\n // If there is nothing to move, add a new instance of the tool\n // Need to check here to see if activation is allowed!\n if (touchToolInterface.touchDownActivateCallback) {\n touchToolInterface.touchDownActivateCallback(e);\n } else {\n touchDownActivateCallback(e);\n }\n\n return false;\n }\n\n function touchStartCallback (e) {\n const eventData = e.detail;\n\n // Console.log('touchTool touchStartCallback');\n const cornerstone = external.cornerstone;\n const element = eventData.element;\n const coords = eventData.startPoints.canvas;\n let data;\n const toolData = getToolState(e.currentTarget, touchToolInterface.toolType);\n let i;\n\n function doneMovingCallback (lastEvent, lastEventData) {\n // Console.log('touchTool touchStartCallback doneMovingCallback');\n data.active = false;\n data.invalidated = true;\n if (anyHandlesOutsideImage(eventData, data.handles)) {\n // Delete the measurement\n removeToolState(eventData.element, touchToolInterface.toolType, data);\n }\n\n cornerstone.updateImage(eventData.element);\n element.addEventListener(EVENTS.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n element.addEventListener(EVENTS.TAP, touchToolInterface.tapCallback || tapCallback);\n\n if (touchToolInterface.pressCallback) {\n element.addEventListener(EVENTS.TOUCH_PRESS, touchToolInterface.pressCallback);\n }\n\n if (lastEvent && lastEvent.type === EVENTS.TOUCH_PRESS) {\n triggerEvent(element, lastEvent.type, lastEventData);\n }\n }\n\n // Now check to see if there is a handle we can move\n\n // Average pixel width of index finger is 45-57 pixels\n // https://www.smashingmagazine.com/2012/02/finger-friendly-design-ideal-mobile-touchscreen-target-sizes/\n const distance = 28;\n\n if (!toolData) {\n return;\n }\n\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n\n const handle = getHandleNearImagePoint(eventData.element, data.handles, coords, distance);\n\n if (handle) {\n element.removeEventListener(EVENTS.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n element.removeEventListener(EVENTS.TAP, touchToolInterface.tapCallback || tapCallback);\n if (touchToolInterface.pressCallback) {\n element.removeEventListener(EVENTS.TOUCH_PRESS, touchToolInterface.pressCallback);\n }\n\n data.active = true;\n touchMoveHandle(e, touchToolInterface.toolType, data, handle, doneMovingCallback);\n e.stopImmediatePropagation();\n e.preventDefault();\n e.stopPropagation();\n\n return;\n }\n }\n\n // Now check to see if we have a tool that we can move\n if (!touchToolInterface.pointNearTool) {\n return;\n }\n\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n\n if (touchToolInterface.pointNearTool(eventData.element, data, coords)) {\n element.removeEventListener(EVENTS.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n element.removeEventListener(EVENTS.TAP, touchToolInterface.tapCallback || tapCallback);\n if (touchToolInterface.pressCallback) {\n element.removeEventListener(EVENTS.TOUCH_PRESS, touchToolInterface.pressCallback);\n }\n\n touchMoveAllHandles(e, data, toolData, touchToolInterface.toolType, true, doneMovingCallback);\n e.stopImmediatePropagation();\n e.preventDefault();\n e.stopPropagation();\n\n return;\n }\n }\n }\n // /////// END INACTIVE TOOL ///////\n\n // Not visible, not interactive\n function disable (element) {\n element.removeEventListener(EVENTS.IMAGE_RENDERED, touchToolInterface.onImageRendered);\n element.removeEventListener(EVENTS.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n element.removeEventListener(EVENTS.TOUCH_START_ACTIVE, touchToolInterface.touchDownActivateCallback || touchDownActivateCallback);\n element.removeEventListener(EVENTS.TAP, touchToolInterface.tapCallback || tapCallback);\n\n if (touchToolInterface.doubleTapCallback) {\n element.removeEventListener(EVENTS.DOUBLE_TAP, touchToolInterface.doubleTapCallback);\n }\n\n if (touchToolInterface.pressCallback) {\n element.removeEventListener(EVENTS.TOUCH_PRESS, touchToolInterface.pressCallback);\n }\n\n external.cornerstone.updateImage(element);\n }\n\n // Visible but not interactive\n function enable (element) {\n element.removeEventListener(EVENTS.IMAGE_RENDERED, touchToolInterface.onImageRendered);\n element.removeEventListener(EVENTS.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n element.removeEventListener(EVENTS.TOUCH_START_ACTIVE, touchToolInterface.touchDownActivateCallback || touchDownActivateCallback);\n element.removeEventListener(EVENTS.TAP, touchToolInterface.tapCallback || tapCallback);\n\n element.addEventListener(EVENTS.IMAGE_RENDERED, touchToolInterface.onImageRendered);\n\n if (touchToolInterface.doubleTapCallback) {\n element.removeEventListener(EVENTS.DOUBLE_TAP, touchToolInterface.doubleTapCallback);\n }\n\n if (touchToolInterface.pressCallback) {\n element.removeEventListener(EVENTS.TOUCH_PRESS, touchToolInterface.pressCallback);\n }\n\n external.cornerstone.updateImage(element);\n }\n\n // Visible, interactive and can create\n function activate (element) {\n element.removeEventListener(EVENTS.IMAGE_RENDERED, touchToolInterface.onImageRendered);\n element.removeEventListener(EVENTS.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n element.removeEventListener(EVENTS.TOUCH_START_ACTIVE, touchToolInterface.touchDownActivateCallback || touchDownActivateCallback);\n element.removeEventListener(EVENTS.TAP, touchToolInterface.tapCallback || tapCallback);\n\n element.addEventListener(EVENTS.IMAGE_RENDERED, touchToolInterface.onImageRendered);\n element.addEventListener(EVENTS.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n element.addEventListener(EVENTS.TOUCH_START_ACTIVE, touchToolInterface.touchDownActivateCallback || touchDownActivateCallback);\n element.addEventListener(EVENTS.TAP, touchToolInterface.tapCallback || tapCallback);\n\n if (touchToolInterface.doubleTapCallback) {\n element.removeEventListener(EVENTS.DOUBLE_TAP, touchToolInterface.doubleTapCallback);\n element.addEventListener(EVENTS.DOUBLE_TAP, touchToolInterface.doubleTapCallback);\n }\n\n if (touchToolInterface.pressCallback) {\n element.removeEventListener(EVENTS.TOUCH_PRESS, touchToolInterface.pressCallback);\n element.addEventListener(EVENTS.TOUCH_PRESS, touchToolInterface.pressCallback);\n }\n\n external.cornerstone.updateImage(element);\n }\n\n // Visible, interactive\n function deactivate (element) {\n const eventType = EVENTS.TOOL_DEACTIVATED;\n const statusChangeEventData = {\n toolType: touchToolInterface.toolType,\n type: eventType\n };\n\n triggerEvent(element, eventType, statusChangeEventData);\n\n element.removeEventListener(EVENTS.IMAGE_RENDERED, touchToolInterface.onImageRendered);\n element.removeEventListener(EVENTS.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n element.removeEventListener(EVENTS.TOUCH_START_ACTIVE, touchToolInterface.touchDownActivateCallback || touchDownActivateCallback);\n element.removeEventListener(EVENTS.TAP, touchToolInterface.tapCallback || tapCallback);\n\n element.addEventListener(EVENTS.IMAGE_RENDERED, touchToolInterface.onImageRendered);\n element.addEventListener(EVENTS.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback);\n\n if (touchToolInterface.doubleTapCallback) {\n element.removeEventListener(EVENTS.DOUBLE_TAP, touchToolInterface.doubleTapCallback);\n }\n\n if (touchToolInterface.pressCallback) {\n element.removeEventListener(EVENTS.TOUCH_PRESS, touchToolInterface.pressCallback);\n }\n\n external.cornerstone.updateImage(element);\n }\n\n const toolInterface = {\n enable,\n disable,\n activate,\n deactivate,\n touchStartCallback: touchToolInterface.touchStartCallback || touchStartCallback,\n touchDownActivateCallback: touchToolInterface.touchDownActivateCallback || touchDownActivateCallback,\n tapCallback: touchToolInterface.tapCallback || tapCallback\n };\n\n // Expose pointNearTool if available\n if (touchToolInterface.pointNearTool) {\n toolInterface.pointNearTool = touchToolInterface.pointNearTool;\n }\n\n if (touchToolInterface.doubleTapCallback) {\n toolInterface.doubleTapCallback = touchToolInterface.doubleTapCallback;\n }\n\n if (touchToolInterface.pressCallback) {\n toolInterface.pressCallback = touchToolInterface.pressCallback;\n }\n\n if (touchToolInterface.addNewMeasurement) {\n toolInterface.addNewMeasurement = touchToolInterface.addNewMeasurement;\n }\n\n return toolInterface;\n}\n\nexport default touchTool;\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/touchTool.js","let defaultStartLoadHandler;\nlet defaultEndLoadHandler;\nlet defaultErrorLoadingHandler;\n\nfunction setStartLoadHandler (handler) {\n defaultStartLoadHandler = handler;\n}\n\nfunction getStartLoadHandler () {\n return defaultStartLoadHandler;\n}\n\nfunction setEndLoadHandler (handler) {\n defaultEndLoadHandler = handler;\n}\n\nfunction getEndLoadHandler () {\n return defaultEndLoadHandler;\n}\n\nfunction setErrorLoadingHandler (handler) {\n defaultErrorLoadingHandler = handler;\n}\n\nfunction getErrorLoadingHandler () {\n return defaultErrorLoadingHandler;\n}\n\nconst loadHandlerManager = {\n setStartLoadHandler,\n getStartLoadHandler,\n setEndLoadHandler,\n getEndLoadHandler,\n setErrorLoadingHandler,\n getErrorLoadingHandler\n};\n\nexport default loadHandlerManager;\n\n\n\n// WEBPACK FOOTER //\n// ./stateManagement/loadHandlerManager.js","let defaultFontSize = 15,\n defaultFont = `${defaultFontSize}px Arial`,\n defaultBackgroundColor = 'transparent';\n\nfunction setFont (font) {\n defaultFont = font;\n}\n\nfunction getFont () {\n return defaultFont;\n}\n\nfunction setFontSize (fontSize) {\n defaultFontSize = fontSize;\n}\n\nfunction getFontSize () {\n return defaultFontSize;\n}\n\nfunction setBackgroundColor (backgroundColor) {\n defaultBackgroundColor = backgroundColor;\n}\n\nfunction getBackgroundColor () {\n return defaultBackgroundColor;\n}\n\nconst textStyle = {\n setFont,\n getFont,\n setFontSize,\n getFontSize,\n setBackgroundColor,\n getBackgroundColor\n};\n\nexport default textStyle;\n\n\n\n// WEBPACK FOOTER //\n// ./stateManagement/textStyle.js","import external from '../externalModules.js';\n\nexport default function (renderData, handles) {\n const image = renderData.image;\n const imageRect = {\n left: 0,\n top: 0,\n width: image.width,\n height: image.height\n };\n\n let handleOutsideImage = false;\n\n Object.keys(handles).forEach(function (name) {\n const handle = handles[name];\n\n if (handle.allowedOutsideImage === true) {\n return;\n }\n\n if (external.cornerstoneMath.point.insideRect(handle, imageRect) === false) {\n handleOutsideImage = true;\n }\n });\n\n return handleOutsideImage;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./manipulators/anyHandlesOutsideImage.js","import EVENTS from '../events.js';\nimport { setToolOptions } from '../toolOptions.js';\n\nexport default function (touchDragCallback, toolType, options) {\n const events = [EVENTS.TOUCH_DRAG];\n\n if (options && options.fireOnTouchStart === true) {\n events.push(EVENTS.TOUCH_START);\n }\n\n return {\n activate (element) {\n if (options && options.eventData) {\n setToolOptions(toolType, element, options.eventData);\n }\n\n events.forEach((eventType) => {\n element.removeEventListener(eventType, touchDragCallback);\n element.addEventListener(eventType, touchDragCallback);\n });\n\n if (options && options.activateCallback) {\n options.activateCallback(element);\n }\n },\n disable (element) {\n events.forEach((eventType) => {\n element.removeEventListener(eventType, touchDragCallback);\n });\n\n if (options && options.disableCallback) {\n options.disableCallback(element);\n }\n },\n enable (element) {\n events.forEach((eventType) => {\n element.removeEventListener(eventType, touchDragCallback);\n });\n\n if (options && options.enableCallback) {\n options.enableCallback(element);\n }\n },\n deactivate (element) {\n events.forEach((eventType) => {\n element.removeEventListener(eventType, touchDragCallback);\n });\n\n if (options && options.deactivateCallback) {\n options.deactivateCallback(element);\n }\n }\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/touchDragTool.js","import EVENTS from '../events.js';\nimport { setToolOptions } from '../toolOptions.js';\n\nexport default function (mouseDownCallback, toolType) {\n if (!toolType) {\n throw new Error('simpleMouseButtonTool: toolType is required');\n }\n\n let configuration = {};\n\n return {\n activate (element, mouseButtonMask, options = {}) {\n options.mouseButtonMask = mouseButtonMask;\n setToolOptions(toolType, element, options);\n\n element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownCallback);\n element.addEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownCallback);\n },\n disable (element) {\n element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownCallback);\n },\n enable (element) {\n element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownCallback);\n },\n deactivate (element) {\n element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownCallback);\n },\n getConfiguration () {\n return configuration;\n },\n setConfiguration (config) {\n configuration = config;\n }\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/simpleMouseButtonTool.js","import external from '../externalModules.js';\n\n/**\n * Convert an Array to a cornerstoneMath.Vector3\n *\n * @param {Array|cornerstoneMath.Vector3} arrayOrVector3 Input array or Vector3\n * @return {cornerstoneMath.Vector3}\n */\nexport default function convertToVector3 (arrayOrVector3) {\n const cornerstoneMath = external.cornerstoneMath;\n\n if (arrayOrVector3 instanceof cornerstoneMath.Vector3) {\n return arrayOrVector3;\n }\n\n return new cornerstoneMath.Vector3(arrayOrVector3[0], arrayOrVector3[1], arrayOrVector3[2]);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/convertToVector3.js","import external from '../externalModules.js';\n\n// This implements an imageId specific tool state management strategy. This means that\n// Measurements data is tied to a specific imageId and only visible for enabled elements\n// That are displaying that imageId.\n\nfunction newImageIdSpecificToolStateManager () {\n let toolState = {};\n\n // Here we add tool state, this is done by tools as well\n // As modules that restore saved state\n\n function saveImageIdToolState (imageId) {\n return toolState[imageId];\n }\n\n function restoreImageIdToolState (imageId, imageIdToolState) {\n toolState[imageId] = imageIdToolState;\n }\n\n function saveToolState () {\n return toolState;\n }\n\n function restoreToolState (savedToolState) {\n toolState = savedToolState;\n }\n\n // Here we add tool state, this is done by tools as well\n // As modules that restore saved state\n function addImageIdSpecificToolState (element, toolType, data) {\n const enabledImage = external.cornerstone.getEnabledElement(element);\n // If we don't have any tool state for this imageId, add an empty object\n\n if (!enabledImage.image || toolState.hasOwnProperty(enabledImage.image.imageId) === false) {\n toolState[enabledImage.image.imageId] = {};\n }\n\n const imageIdToolState = toolState[enabledImage.image.imageId];\n\n // If we don't have tool state for this type of tool, add an empty object\n if (imageIdToolState.hasOwnProperty(toolType) === false) {\n imageIdToolState[toolType] = {\n data: []\n };\n }\n\n const toolData = imageIdToolState[toolType];\n\n // Finally, add this new tool to the state\n toolData.data.push(data);\n }\n\n // Here you can get state - used by tools as well as modules\n // That save state persistently\n function getImageIdSpecificToolState (element, toolType) {\n const enabledImage = external.cornerstone.getEnabledElement(element);\n // If we don't have any tool state for this imageId, return undefined\n\n if (!enabledImage.image || toolState.hasOwnProperty(enabledImage.image.imageId) === false) {\n return;\n }\n\n const imageIdToolState = toolState[enabledImage.image.imageId];\n\n // If we don't have tool state for this type of tool, return undefined\n if (imageIdToolState.hasOwnProperty(toolType) === false) {\n return;\n }\n\n const toolData = imageIdToolState[toolType];\n\n\n return toolData;\n }\n\n // Clears all tool data from this toolStateManager.\n function clearImageIdSpecificToolStateManager (element) {\n const enabledImage = external.cornerstone.getEnabledElement(element);\n\n if (!enabledImage.image || toolState.hasOwnProperty(enabledImage.image.imageId) === false) {\n return;\n }\n\n delete toolState[enabledImage.image.imageId];\n }\n\n return {\n get: getImageIdSpecificToolState,\n add: addImageIdSpecificToolState,\n clear: clearImageIdSpecificToolStateManager,\n saveImageIdToolState,\n restoreImageIdToolState,\n saveToolState,\n restoreToolState,\n toolState\n };\n}\n\n// A global imageIdSpecificToolStateManager - the most common case is to share state between all\n// Visible enabled images\nconst globalImageIdSpecificToolStateManager = newImageIdSpecificToolStateManager();\n\nexport {\n newImageIdSpecificToolStateManager,\n globalImageIdSpecificToolStateManager\n};\n\n\n\n// WEBPACK FOOTER //\n// ./stateManagement/imageIdSpecificStateManager.js","import external from '../externalModules.js';\n\nexport default function (handle, coords) {\n if (!handle.boundingBox) {\n return;\n }\n\n return external.cornerstoneMath.point.insideRect(coords, handle.boundingBox);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/pointInsideBoundingBox.js","import external from '../externalModules.js';\n\n// Returns a decimal value given a fractional value\nfunction fracToDec (fractionalValue) {\n return parseFloat(`.${fractionalValue}`);\n}\n\nexport default function (image, storedPixelValue) {\n const cornerstone = external.cornerstone;\n const patientStudyModule = cornerstone.metaData.get('patientStudyModule', image.imageId);\n const seriesModule = cornerstone.metaData.get('generalSeriesModule', image.imageId);\n\n if (!patientStudyModule || !seriesModule) {\n return;\n }\n\n const modality = seriesModule.modality;\n\n // Image must be PET\n if (modality !== 'PT') {\n return;\n }\n\n const modalityPixelValue = storedPixelValue * image.slope + image.intercept;\n\n const patientWeight = patientStudyModule.patientWeight; // In kg\n\n if (!patientWeight) {\n return;\n }\n\n const petSequenceModule = cornerstone.metaData.get('petIsotopeModule', image.imageId);\n\n if (!petSequenceModule) {\n return;\n }\n\n const radiopharmaceuticalInfo = petSequenceModule.radiopharmaceuticalInfo;\n const startTime = radiopharmaceuticalInfo.radiopharmaceuticalStartTime;\n const totalDose = radiopharmaceuticalInfo.radionuclideTotalDose;\n const halfLife = radiopharmaceuticalInfo.radionuclideHalfLife;\n const seriesAcquisitionTime = seriesModule.seriesTime;\n\n if (!startTime || !totalDose || !halfLife || !seriesAcquisitionTime) {\n return;\n }\n\n const acquisitionTimeInSeconds = fracToDec(seriesAcquisitionTime.fractionalSeconds || 0) + seriesAcquisitionTime.seconds + seriesAcquisitionTime.minutes * 60 + seriesAcquisitionTime.hours * 60 * 60;\n const injectionStartTimeInSeconds = fracToDec(startTime.fractionalSeconds) + startTime.seconds + startTime.minutes * 60 + startTime.hours * 60 * 60;\n const durationInSeconds = acquisitionTimeInSeconds - injectionStartTimeInSeconds;\n const correctedDose = totalDose * Math.exp(-durationInSeconds * Math.log(2) / halfLife);\n const suv = modalityPixelValue * patientWeight / correctedDose * 1000;\n\n return suv;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/calculateSUV.js","import external from '../externalModules.js';\nimport pointInsideBoundingBox from '../util/pointInsideBoundingBox.js';\n\nexport default function (element, handles, coords, distanceThreshold) {\n let nearbyHandle;\n\n if (!handles) {\n return;\n }\n\n Object.keys(handles).forEach(function (name) {\n const handle = handles[name];\n\n if (handle.hasOwnProperty('pointNearHandle')) {\n if (handle.pointNearHandle(element, handle, coords)) {\n nearbyHandle = handle;\n\n return;\n }\n } else if (handle.hasBoundingBox === true) {\n if (pointInsideBoundingBox(handle, coords)) {\n nearbyHandle = handle;\n\n return;\n }\n } else {\n const handleCanvas = external.cornerstone.pixelToCanvas(element, handle);\n const distance = external.cornerstoneMath.point.distance(handleCanvas, coords);\n\n if (distance <= distanceThreshold) {\n nearbyHandle = handle;\n\n return;\n }\n }\n });\n\n return nearbyHandle;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./manipulators/getHandleNearImagePoint.js","let configMaxSimultaneousRequests;\n\n// Maximum concurrent connections to the same server\n// Information from http://sgdev-blog.blogspot.fr/2014/01/maximum-concurrent-connection-to-same.html\nconst maxSimultaneousRequests = {\n default: 6,\n IE: {\n 9: 6,\n 10: 8,\n default: 8\n },\n Firefox: {\n default: 6\n },\n Opera: {\n 10: 8,\n 11: 6,\n 12: 6,\n default: 6\n },\n Chrome: {\n default: 6\n },\n Safari: {\n default: 6\n }\n};\n\n// Browser name / version detection\n// http://stackoverflow.com/questions/2400935/browser-detection-in-javascript\nfunction getBrowserInfo () {\n const ua = navigator.userAgent;\n let M = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\\/))\\/?\\s*(\\d+)/i) || [];\n let tem;\n\n if (/trident/i.test(M[1])) {\n tem = (/\\brv[ :]+(\\d+)/g).exec(ua) || [];\n\n return `IE ${tem[1] || ''}`;\n }\n\n if (M[1] === 'Chrome') {\n tem = ua.match(/\\b(OPR|Edge)\\/(\\d+)/);\n if (tem !== null) {\n return tem.slice(1).join(' ').replace('OPR', 'Opera');\n }\n }\n\n M = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, '-?'];\n if ((tem = ua.match(/version\\/(\\d+)/i)) !== null) {\n M.splice(1, 1, tem[1]);\n }\n\n return M.join(' ');\n}\n\nfunction setMaxSimultaneousRequests (newMaxSimultaneousRequests) {\n configMaxSimultaneousRequests = newMaxSimultaneousRequests;\n}\n\nfunction getMaxSimultaneousRequests () {\n if (configMaxSimultaneousRequests) {\n return configMaxSimultaneousRequests;\n }\n\n return getDefaultSimultaneousRequests();\n}\n\nfunction getDefaultSimultaneousRequests () {\n const infoString = getBrowserInfo();\n const info = infoString.split(' ');\n const browserName = info[0];\n const browserVersion = info[1];\n const browserData = maxSimultaneousRequests[browserName];\n\n if (!browserData) {\n return maxSimultaneousRequests.default;\n }\n\n if (!browserData[browserVersion]) {\n return browserData.default;\n }\n\n return browserData[browserVersion];\n}\n\nfunction isMobileDevice () {\n const pattern = new RegExp('Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini');\n\n\n return pattern.test(navigator.userAgent);\n}\n\nexport {\n getDefaultSimultaneousRequests,\n getMaxSimultaneousRequests,\n setMaxSimultaneousRequests,\n getBrowserInfo,\n isMobileDevice\n};\n\n\n\n// WEBPACK FOOTER //\n// ./util/getMaxSimultaneousRequests.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nexport default function (mouseEventData, toolType, data, handle, doneMovingCallback, preventHandleOutsideImage) {\n const cornerstone = external.cornerstone;\n const element = mouseEventData.element;\n const distanceFromTool = {\n x: handle.x - mouseEventData.currentPoints.image.x,\n y: handle.y - mouseEventData.currentPoints.image.y\n };\n\n function mouseDragCallback (e) {\n const eventData = e.detail;\n\n if (handle.hasMoved === false) {\n handle.hasMoved = true;\n }\n\n handle.active = true;\n handle.x = eventData.currentPoints.image.x + distanceFromTool.x;\n handle.y = eventData.currentPoints.image.y + distanceFromTool.y;\n\n if (preventHandleOutsideImage) {\n handle.x = Math.max(handle.x, 0);\n handle.x = Math.min(handle.x, eventData.image.width);\n\n handle.y = Math.max(handle.y, 0);\n handle.y = Math.min(handle.y, eventData.image.height);\n }\n\n cornerstone.updateImage(element);\n\n const eventType = EVENTS.MEASUREMENT_MODIFIED;\n const modifiedEventData = {\n toolType,\n element,\n measurementData: data\n };\n\n triggerEvent(element, eventType, modifiedEventData);\n }\n\n element.addEventListener(EVENTS.MOUSE_DRAG, mouseDragCallback);\n\n function mouseUpCallback () {\n handle.active = false;\n element.removeEventListener(EVENTS.MOUSE_DRAG, mouseDragCallback);\n element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n cornerstone.updateImage(element);\n\n if (typeof doneMovingCallback === 'function') {\n doneMovingCallback();\n }\n }\n\n element.addEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.addEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./manipulators/moveHandle.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nexport default function (mouseEventData, toolType, data, handle, doneMovingCallback, preventHandleOutsideImage) {\n const cornerstone = external.cornerstone;\n const element = mouseEventData.element;\n\n function moveCallback (e) {\n const eventData = e.detail;\n\n handle.active = true;\n handle.x = eventData.currentPoints.image.x;\n handle.y = eventData.currentPoints.image.y;\n\n if (preventHandleOutsideImage) {\n handle.x = Math.max(handle.x, 0);\n handle.x = Math.min(handle.x, eventData.image.width);\n\n handle.y = Math.max(handle.y, 0);\n handle.y = Math.min(handle.y, eventData.image.height);\n }\n\n cornerstone.updateImage(element);\n\n const eventType = EVENTS.MEASUREMENT_MODIFIED;\n const modifiedEventData = {\n toolType,\n element,\n measurementData: data\n };\n\n triggerEvent(element, eventType, modifiedEventData);\n }\n\n function whichMovement (e) {\n element.removeEventListener(EVENTS.MOUSE_MOVE, whichMovement);\n element.removeEventListener(EVENTS.MOUSE_DRAG, whichMovement);\n\n element.addEventListener(EVENTS.MOUSE_MOVE, moveCallback);\n element.addEventListener(EVENTS.MOUSE_DRAG, moveCallback);\n\n element.addEventListener(EVENTS.MOUSE_CLICK, moveEndCallback);\n if (e.type === EVENTS.MOUSE_DRAG) {\n element.addEventListener(EVENTS.MOUSE_UP, moveEndCallback);\n }\n }\n\n function measurementRemovedCallback (e) {\n const eventData = e.detail;\n\n if (eventData.measurementData === data) {\n moveEndCallback();\n }\n }\n\n function toolDeactivatedCallback (e) {\n const eventData = e.detail;\n\n if (eventData.toolType === toolType) {\n element.removeEventListener(EVENTS.MOUSE_MOVE, moveCallback);\n element.removeEventListener(EVENTS.MOUSE_DRAG, moveCallback);\n element.removeEventListener(EVENTS.MOUSE_CLICK, moveEndCallback);\n element.removeEventListener(EVENTS.MOUSE_UP, moveEndCallback);\n element.removeEventListener(EVENTS.MEASUREMENT_REMOVED, measurementRemovedCallback);\n element.removeEventListener(EVENTS.TOOL_DEACTIVATED, toolDeactivatedCallback);\n\n handle.active = false;\n cornerstone.updateImage(element);\n }\n }\n\n element.addEventListener(EVENTS.MOUSE_DRAG, whichMovement);\n element.addEventListener(EVENTS.MOUSE_MOVE, whichMovement);\n element.addEventListener(EVENTS.MEASUREMENT_REMOVED, measurementRemovedCallback);\n element.addEventListener(EVENTS.TOOL_DEACTIVATED, toolDeactivatedCallback);\n\n function moveEndCallback () {\n element.removeEventListener(EVENTS.MOUSE_MOVE, moveCallback);\n element.removeEventListener(EVENTS.MOUSE_DRAG, moveCallback);\n element.removeEventListener(EVENTS.MOUSE_CLICK, moveEndCallback);\n element.removeEventListener(EVENTS.MOUSE_UP, moveEndCallback);\n element.removeEventListener(EVENTS.MEASUREMENT_REMOVED, measurementRemovedCallback);\n element.removeEventListener(EVENTS.TOOL_DEACTIVATED, toolDeactivatedCallback);\n\n handle.active = false;\n cornerstone.updateImage(element);\n\n if (typeof doneMovingCallback === 'function') {\n doneMovingCallback();\n }\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./manipulators/moveNewHandle.js","import EVENTS from '../events.js';\n\nexport default function (mouseWheelCallback) {\n return {\n activate (element) {\n element.removeEventListener(EVENTS.MOUSE_WHEEL, mouseWheelCallback);\n element.addEventListener(EVENTS.MOUSE_WHEEL, mouseWheelCallback);\n },\n disable (element) {\n element.removeEventListener(EVENTS.MOUSE_WHEEL, mouseWheelCallback);\n },\n enable (element) {\n element.removeEventListener(EVENTS.MOUSE_WHEEL, mouseWheelCallback);\n },\n deactivate (element) {\n element.removeEventListener(EVENTS.MOUSE_WHEEL, mouseWheelCallback);\n }\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/mouseWheelTool.js","\nimport EVENTS from '../events.js';\nimport external from '../externalModules.js';\n\nexport default function (onImageRendered) {\n let configuration = {};\n\n return {\n disable (element) {\n element.removeEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n },\n enable (element) {\n element.removeEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n element.addEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n external.cornerstone.updateImage(element);\n },\n getConfiguration () {\n return configuration;\n },\n setConfiguration (config) {\n configuration = config;\n }\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/displayTool.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nexport default function (eventData, toolType, data, handle, doneMovingCallback, preventHandleOutsideImage) {\n // Console.log('moveNewHandleTouch');\n const cornerstone = external.cornerstone;\n const element = eventData.element;\n const imageCoords = cornerstone.pageToPixel(element, eventData.currentPoints.page.x, eventData.currentPoints.page.y + 50);\n const distanceFromTouch = {\n x: handle.x - imageCoords.x,\n y: handle.y - imageCoords.y\n };\n\n handle.active = true;\n data.active = true;\n\n function moveCallback (e) {\n const eventData = e.detail;\n\n handle.x = eventData.currentPoints.image.x + distanceFromTouch.x;\n handle.y = eventData.currentPoints.image.y + distanceFromTouch.y;\n\n if (preventHandleOutsideImage) {\n handle.x = Math.max(handle.x, 0);\n handle.x = Math.min(handle.x, eventData.image.width);\n\n handle.y = Math.max(handle.y, 0);\n handle.y = Math.min(handle.y, eventData.image.height);\n }\n\n cornerstone.updateImage(element);\n\n const eventType = EVENTS.MEASUREMENT_MODIFIED;\n const modifiedEventData = {\n toolType,\n element,\n measurementData: data\n };\n\n triggerEvent(element, eventType, modifiedEventData);\n }\n\n function moveEndCallback (e) {\n const eventData = e.detail;\n\n element.removeEventListener(EVENTS.TOUCH_DRAG, moveCallback);\n element.removeEventListener(EVENTS.TOUCH_PINCH, moveEndCallback);\n element.removeEventListener(EVENTS.TOUCH_END, moveEndCallback);\n element.removeEventListener(EVENTS.TAP, moveEndCallback);\n element.removeEventListener(EVENTS.TOUCH_START, stopImmediatePropagation);\n element.removeEventListener(EVENTS.TOOL_DEACTIVATED, toolDeactivatedCallback);\n\n if (e.type === EVENTS.TOUCH_PINCH || e.type === EVENTS.TOUCH_PRESS) {\n handle.active = false;\n cornerstone.updateImage(element);\n doneMovingCallback();\n\n return;\n }\n\n handle.active = false;\n data.active = false;\n handle.x = eventData.currentPoints.image.x + distanceFromTouch.x;\n handle.y = eventData.currentPoints.image.y + distanceFromTouch.y;\n\n if (preventHandleOutsideImage) {\n handle.x = Math.max(handle.x, 0);\n handle.x = Math.min(handle.x, eventData.image.width);\n\n handle.y = Math.max(handle.y, 0);\n handle.y = Math.min(handle.y, eventData.image.height);\n }\n\n cornerstone.updateImage(element);\n\n if (typeof doneMovingCallback === 'function') {\n doneMovingCallback();\n }\n }\n\n function stopImmediatePropagation (e) {\n // Stop the CornerstoneToolsTouchStart event from\n // Become a CornerstoneToolsTouchStartActive event when\n // MoveNewHandleTouch ends\n e.stopImmediatePropagation();\n\n return false;\n }\n\n element.addEventListener(EVENTS.TOUCH_DRAG, moveCallback);\n element.addEventListener(EVENTS.TOUCH_PINCH, moveEndCallback);\n element.addEventListener(EVENTS.TOUCH_END, moveEndCallback);\n element.addEventListener(EVENTS.TAP, moveEndCallback);\n element.addEventListener(EVENTS.TOUCH_START, stopImmediatePropagation);\n\n function toolDeactivatedCallback () {\n element.removeEventListener(EVENTS.TOUCH_DRAG, moveCallback);\n element.removeEventListener(EVENTS.TOUCH_PINCH, moveEndCallback);\n element.removeEventListener(EVENTS.TOUCH_END, moveEndCallback);\n element.removeEventListener(EVENTS.TAP, moveEndCallback);\n element.removeEventListener(EVENTS.TOUCH_START, stopImmediatePropagation);\n element.removeEventListener(EVENTS.TOOL_DEACTIVATED, toolDeactivatedCallback);\n\n handle.active = false;\n data.active = false;\n handle.x = eventData.currentPoints.image.x + distanceFromTouch.x;\n handle.y = eventData.currentPoints.image.y + distanceFromTouch.y;\n\n if (preventHandleOutsideImage) {\n handle.x = Math.max(handle.x, 0);\n handle.x = Math.min(handle.x, eventData.image.width);\n\n handle.y = Math.max(handle.y, 0);\n handle.y = Math.min(handle.y, eventData.image.height);\n }\n\n cornerstone.updateImage(element);\n }\n\n element.addEventListener(EVENTS.TOOL_DEACTIVATED, toolDeactivatedCallback);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./manipulators/moveNewHandleTouch.js","import external from '../externalModules.js';\nimport convertToVector3 from '../util/convertToVector3.js';\n\n// Projects a patient point to an image point\nexport function projectPatientPointToImagePlane (patientPoint, imagePlane) {\n const rowCosines = convertToVector3(imagePlane.rowCosines);\n const columnCosines = convertToVector3(imagePlane.columnCosines);\n const imagePositionPatient = convertToVector3(imagePlane.imagePositionPatient);\n const point = patientPoint.clone().sub(imagePositionPatient);\n const x = rowCosines.dot(point) / imagePlane.columnPixelSpacing;\n const y = columnCosines.dot(point) / imagePlane.rowPixelSpacing;\n\n\n return {\n x,\n y\n };\n}\n\n// Projects an image point to a patient point\nexport function imagePointToPatientPoint (imagePoint, imagePlane) {\n const rowCosines = convertToVector3(imagePlane.rowCosines);\n const columnCosines = convertToVector3(imagePlane.columnCosines);\n const imagePositionPatient = convertToVector3(imagePlane.imagePositionPatient);\n\n const x = rowCosines.clone().multiplyScalar(imagePoint.x);\n\n x.multiplyScalar(imagePlane.columnPixelSpacing);\n const y = columnCosines.clone().multiplyScalar(imagePoint.y);\n\n y.multiplyScalar(imagePlane.rowPixelSpacing);\n const patientPoint = x.add(y);\n\n patientPoint.add(imagePositionPatient);\n\n return patientPoint;\n}\n\nfunction getRectangleFromImagePlane (imagePlane) {\n // Get the points\n const topLeft = imagePointToPatientPoint({\n x: 0,\n y: 0\n }, imagePlane);\n const topRight = imagePointToPatientPoint({\n x: imagePlane.columns,\n y: 0\n }, imagePlane);\n const bottomLeft = imagePointToPatientPoint({\n x: 0,\n y: imagePlane.rows\n }, imagePlane);\n const bottomRight = imagePointToPatientPoint({\n x: imagePlane.columns,\n y: imagePlane.rows\n }, imagePlane);\n\n // Get each side as a vector\n const rect = {\n top: new external.cornerstoneMath.Line3(topLeft, topRight),\n left: new external.cornerstoneMath.Line3(topLeft, bottomLeft),\n right: new external.cornerstoneMath.Line3(topRight, bottomRight),\n bottom: new external.cornerstoneMath.Line3(bottomLeft, bottomRight)\n };\n\n\n return rect;\n}\n\nfunction lineRectangleIntersection (line, rect) {\n const intersections = [];\n\n Object.keys(rect).forEach(function (side) {\n const segment = rect[side];\n const intersection = line.intersectLine(segment);\n\n if (intersection) {\n intersections.push(intersection);\n }\n });\n\n return intersections;\n}\n\n// Gets the line of intersection between two planes in patient space\nexport function planePlaneIntersection (targetImagePlane, referenceImagePlane) {\n const targetRowCosines = convertToVector3(targetImagePlane.rowCosines);\n const targetColumnCosines = convertToVector3(targetImagePlane.columnCosines);\n const targetImagePositionPatient = convertToVector3(targetImagePlane.imagePositionPatient);\n const referenceRowCosines = convertToVector3(referenceImagePlane.rowCosines);\n const referenceColumnCosines = convertToVector3(referenceImagePlane.columnCosines);\n const referenceImagePositionPatient = convertToVector3(referenceImagePlane.imagePositionPatient);\n\n // First, get the normals of each image plane\n const targetNormal = targetRowCosines.clone().cross(targetColumnCosines);\n const targetPlane = new external.cornerstoneMath.Plane();\n\n targetPlane.setFromNormalAndCoplanarPoint(targetNormal, targetImagePositionPatient);\n\n const referenceNormal = referenceRowCosines.clone().cross(referenceColumnCosines);\n const referencePlane = new external.cornerstoneMath.Plane();\n\n referencePlane.setFromNormalAndCoplanarPoint(referenceNormal, referenceImagePositionPatient);\n\n const originDirection = referencePlane.clone().intersectPlane(targetPlane);\n const origin = originDirection.origin;\n const direction = originDirection.direction;\n\n // Calculate the longest possible length in the reference image plane (the length of the diagonal)\n const bottomRight = imagePointToPatientPoint({\n x: referenceImagePlane.columns,\n y: referenceImagePlane.rows\n }, referenceImagePlane);\n const distance = referenceImagePositionPatient.distanceTo(bottomRight);\n\n // Use this distance to bound the ray intersecting the two planes\n const line = new external.cornerstoneMath.Line3();\n\n line.start = origin;\n line.end = origin.clone().add(direction.multiplyScalar(distance));\n\n // Find the intersections between this line and the reference image plane's four sides\n const rect = getRectangleFromImagePlane(referenceImagePlane);\n const intersections = lineRectangleIntersection(line, rect);\n\n // Return the intersections between this line and the reference image plane's sides\n // In order to draw the reference line from the target image.\n if (intersections.length !== 2) {\n return;\n }\n\n return {\n start: intersections[0],\n end: intersections[1]\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/pointProjector.js","import external from '../externalModules.js';\nimport { getMaxSimultaneousRequests } from '../util/getMaxSimultaneousRequests.js';\n\nconst requestPool = {\n interaction: [],\n thumbnail: [],\n prefetch: []\n};\n\nconst numRequests = {\n interaction: 0,\n thumbnail: 0,\n prefetch: 0\n};\n\nlet maxNumRequests = {\n interaction: 6,\n thumbnail: 6,\n prefetch: 5\n};\n\nlet awake = false;\nconst grabDelay = 20;\n\nfunction addRequest (element, imageId, type, preventCache, doneCallback, failCallback) {\n if (!requestPool.hasOwnProperty(type)) {\n throw new Error('Request type must be one of interaction, thumbnail, or prefetch');\n }\n\n if (!element || !imageId) {\n return;\n }\n\n // Describe the request\n const requestDetails = {\n type,\n imageId,\n preventCache,\n doneCallback,\n failCallback\n };\n\n // If this imageId is in the cache, resolve it immediately\n const imageLoadObject = external.cornerstone.imageCache.getImageLoadObject(imageId);\n\n if (imageLoadObject) {\n imageLoadObject.promise.then(function (image) {\n doneCallback(image);\n }, function (error) {\n failCallback(error);\n });\n\n return;\n }\n\n // Add it to the end of the stack\n requestPool[type].push(requestDetails);\n}\n\nfunction clearRequestStack (type) {\n // Console.log('clearRequestStack');\n if (!requestPool.hasOwnProperty(type)) {\n throw new Error('Request type must be one of interaction, thumbnail, or prefetch');\n }\n\n requestPool[type] = [];\n}\n\nfunction startAgain () {\n if (!awake) {\n return;\n }\n\n setTimeout(function () {\n startGrabbing();\n }, grabDelay);\n}\n\nfunction sendRequest (requestDetails) {\n const cornerstone = external.cornerstone;\n // Increment the number of current requests of this type\n const type = requestDetails.type;\n\n numRequests[type]++;\n\n awake = true;\n const imageId = requestDetails.imageId;\n const doneCallback = requestDetails.doneCallback;\n const failCallback = requestDetails.failCallback;\n\n // Check if we already have this image promise in the cache\n const imageLoadObject = cornerstone.imageCache.getImageLoadObject(imageId);\n\n if (imageLoadObject) {\n // If we do, remove from list (when resolved, as we could have\n // Pending prefetch requests) and stop processing this iteration\n imageLoadObject.promise.then(function (image) {\n numRequests[type]--;\n // Console.log(numRequests);\n\n doneCallback(image);\n startAgain();\n }, function (error) {\n numRequests[type]--;\n // Console.log(numRequests);\n failCallback(error);\n startAgain();\n });\n\n return;\n }\n\n function requestTypeToLoadPriority (requestDetails) {\n if (requestDetails.type === 'prefetch') {\n return -5;\n } else if (requestDetails.type === 'interactive') {\n return 0;\n } else if (requestDetails.type === 'thumbnail') {\n return 5;\n }\n }\n\n const priority = requestTypeToLoadPriority(requestDetails);\n\n let loader;\n\n if (requestDetails.preventCache === true) {\n loader = cornerstone.loadImage(imageId, {\n priority,\n type: requestDetails.type\n });\n } else {\n loader = cornerstone.loadAndCacheImage(imageId, {\n priority,\n type: requestDetails.type\n });\n }\n\n // Load and cache the image\n loader.then(function (image) {\n numRequests[type]--;\n // Console.log(numRequests);\n doneCallback(image);\n startAgain();\n }, function (error) {\n numRequests[type]--;\n // Console.log(numRequests);\n failCallback(error);\n startAgain();\n });\n}\n\nfunction startGrabbing () {\n // Begin by grabbing X images\n const maxSimultaneousRequests = getMaxSimultaneousRequests();\n\n maxNumRequests = {\n interaction: Math.max(maxSimultaneousRequests, 1),\n thumbnail: Math.max(maxSimultaneousRequests - 2, 1),\n prefetch: Math.max(maxSimultaneousRequests - 1, 1)\n };\n\n const currentRequests = numRequests.interaction +\n numRequests.thumbnail +\n numRequests.prefetch;\n const requestsToSend = maxSimultaneousRequests - currentRequests;\n\n for (let i = 0; i < requestsToSend; i++) {\n const requestDetails = getNextRequest();\n\n if (requestDetails) {\n sendRequest(requestDetails);\n }\n }\n}\n\nfunction getNextRequest () {\n if (requestPool.interaction.length && numRequests.interaction < maxNumRequests.interaction) {\n return requestPool.interaction.shift();\n }\n\n if (requestPool.thumbnail.length && numRequests.thumbnail < maxNumRequests.thumbnail) {\n return requestPool.thumbnail.shift();\n }\n\n if (requestPool.prefetch.length && numRequests.prefetch < maxNumRequests.prefetch) {\n return requestPool.prefetch.shift();\n }\n\n if (!requestPool.interaction.length &&\n !requestPool.thumbnail.length &&\n !requestPool.prefetch.length) {\n awake = false;\n }\n\n return false;\n}\n\nfunction getRequestPool () {\n return requestPool;\n}\n\nexport default {\n addRequest,\n clearRequestStack,\n startGrabbing,\n getRequestPool\n};\n\n\n\n// WEBPACK FOOTER //\n// ./requestPool/requestPoolManager.js","import scrollToIndex from './scrollToIndex.js';\nimport { getToolState } from '../stateManagement/toolState.js';\n\nexport default function (element, images, loop = false) {\n const toolData = getToolState(element, 'stack');\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n const stackData = toolData.data[0];\n\n let newImageIdIndex = stackData.currentImageIdIndex + images;\n\n if (loop) {\n const nbImages = stackData.imageIds.length;\n\n newImageIdIndex %= nbImages;\n } else {\n newImageIdIndex = Math.min(stackData.imageIds.length - 1, newImageIdIndex);\n newImageIdIndex = Math.max(0, newImageIdIndex);\n }\n\n scrollToIndex(element, newImageIdIndex);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/scroll.js","export default function (value, precision) {\n const multiplier = Math.pow(10, precision);\n\n\n return (Math.round(value * multiplier) / multiplier);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/roundToDecimal.js","export default function (ellipse, location) {\n const xRadius = ellipse.width / 2;\n const yRadius = ellipse.height / 2;\n\n if (xRadius <= 0.0 || yRadius <= 0.0) {\n return false;\n }\n\n const center = {\n x: ellipse.left + xRadius,\n y: ellipse.top + yRadius\n };\n\n /* This is a more general form of the circle equation\n *\n * X^2/a^2 + Y^2/b^2 <= 1\n */\n\n const normalized = {\n x: location.x - center.x,\n y: location.y - center.y\n };\n\n const inEllipse = ((normalized.x * normalized.x) / (xRadius * xRadius)) + ((normalized.y * normalized.y) / (yRadius * yRadius)) <= 1.0;\n\n\n return inEllipse;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/pointInEllipse.js","/**\n * This function is used to prevent selection from occuring when left click dragging on the image\n * @param e the event that is provided to your event handler\n * Based on: http://stackoverflow.com/questions/5429827/how-can-i-prevent-text-element-selection-with-cursor-drag\n * @returns {boolean}\n */\nexport default function (e) {\n if (e.stopPropagation) {\n e.stopPropagation();\n }\n\n if (e.preventDefault) {\n e.preventDefault();\n }\n\n e.cancelBubble = true;\n e.returnValue = false;\n\n return false;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/pauseEvent.js","import external from '../externalModules.js';\n\nexport default function (element, x, y, width, height) {\n if (!element) {\n throw new Error('getRGBPixels: parameter element must not be undefined');\n }\n\n x = Math.round(x);\n y = Math.round(y);\n const enabledElement = external.cornerstone.getEnabledElement(element);\n const storedPixelData = [];\n let index = 0;\n const pixelData = enabledElement.image.getPixelData();\n let spIndex,\n row,\n column;\n\n if (enabledElement.image.color) {\n for (row = 0; row < height; row++) {\n for (column = 0; column < width; column++) {\n spIndex = (((row + y) * enabledElement.image.columns) + (column + x)) * 4;\n const red = pixelData[spIndex];\n const green = pixelData[spIndex + 1];\n const blue = pixelData[spIndex + 2];\n const alpha = pixelData[spIndex + 3];\n\n storedPixelData[index++] = red;\n storedPixelData[index++] = green;\n storedPixelData[index++] = blue;\n storedPixelData[index++] = alpha;\n }\n }\n }\n\n return storedPixelData;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/getRGBPixels.js","import external from '../externalModules.js';\n\nexport default function (points) {\n const page = external.cornerstoneMath.point.copy(points.page);\n const image = external.cornerstoneMath.point.copy(points.image);\n const client = external.cornerstoneMath.point.copy(points.client);\n const canvas = external.cornerstoneMath.point.copy(points.canvas);\n\n return {\n page,\n image,\n client,\n canvas\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/copyPoints.js","let coordsData;\n\nfunction setCoords (eventData) {\n coordsData = eventData.currentPoints.canvas;\n}\n\nfunction getCoords () {\n return coordsData;\n}\n\nconst toolCoordinates = {\n setCoords,\n getCoords\n};\n\nexport default toolCoordinates;\n\n\n\n// WEBPACK FOOTER //\n// ./stateManagement/toolCoordinates.js","import getHandleNearImagePoint from './getHandleNearImagePoint.js';\n\nfunction getActiveHandle (handles) {\n let activeHandle;\n\n Object.keys(handles).forEach(function (name) {\n const handle = handles[name];\n\n if (handle.active === true) {\n activeHandle = handle;\n\n return;\n }\n });\n\n return activeHandle;\n}\n\nexport default function (element, handles, canvasPoint, distanceThreshold) {\n if (!distanceThreshold) {\n distanceThreshold = 6;\n }\n\n const activeHandle = getActiveHandle(handles);\n const nearbyHandle = getHandleNearImagePoint(element, handles, canvasPoint, distanceThreshold);\n\n if (activeHandle !== nearbyHandle) {\n if (nearbyHandle !== undefined) {\n nearbyHandle.active = true;\n }\n\n if (activeHandle !== undefined) {\n activeHandle.active = false;\n }\n\n return true;\n }\n\n return false;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./manipulators/handleActivator.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport anyHandlesOutsideImage from './anyHandlesOutsideImage.js';\nimport { removeToolState } from '../stateManagement/toolState.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nexport default function (e, data, toolData, toolType, options, doneMovingCallback) {\n const cornerstone = external.cornerstone;\n const mouseEventData = e.detail;\n const element = mouseEventData.element;\n\n function mouseDragCallback (e) {\n const eventData = e.detail;\n\n data.active = true;\n\n Object.keys(data.handles).forEach(function (name) {\n const handle = data.handles[name];\n\n if (handle.movesIndependently === true) {\n return;\n }\n\n handle.x += eventData.deltaPoints.image.x;\n handle.y += eventData.deltaPoints.image.y;\n\n if (options.preventHandleOutsideImage === true) {\n handle.x = Math.max(handle.x, 0);\n handle.x = Math.min(handle.x, eventData.image.width);\n\n handle.y = Math.max(handle.y, 0);\n handle.y = Math.min(handle.y, eventData.image.height);\n }\n });\n\n cornerstone.updateImage(element);\n\n const eventType = EVENTS.MEASUREMENT_MODIFIED;\n const modifiedEventData = {\n toolType,\n element,\n measurementData: data\n };\n\n triggerEvent(element, eventType, modifiedEventData);\n\n e.preventDefault();\n e.stopPropagation();\n }\n\n element.addEventListener(EVENTS.MOUSE_DRAG, mouseDragCallback);\n\n function mouseUpCallback (e) {\n const eventData = e.detail;\n\n data.invalidated = true;\n\n element.removeEventListener(EVENTS.MOUSE_DRAG, mouseDragCallback);\n element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n\n // If any handle is outside the image, delete the tool data\n if (options.deleteIfHandleOutsideImage === true &&\n anyHandlesOutsideImage(eventData, data.handles)) {\n removeToolState(element, toolType, data);\n }\n\n cornerstone.updateImage(element);\n\n if (typeof doneMovingCallback === 'function') {\n doneMovingCallback();\n }\n }\n\n element.addEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.addEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n\n return true;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./manipulators/moveAllHandles.js","import external from '../externalModules.js';\nimport { getToolState } from '../stateManagement/toolState.js';\nimport loadHandlerManager from '../stateManagement/loadHandlerManager.js';\n\nexport default function (element, timePoints, wrap) {\n const toolData = getToolState(element, 'timeSeries');\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n const timeSeriesData = toolData.data[0];\n const currentStack = timeSeriesData.stacks[timeSeriesData.currentStackIndex];\n const currentImageIdIndex = currentStack.currentImageIdIndex;\n let newStackIndex = timeSeriesData.currentStackIndex + timePoints;\n\n // Loop around if we go outside the stack\n if (wrap) {\n if (newStackIndex >= timeSeriesData.stacks.length) {\n newStackIndex = 0;\n }\n\n if (newStackIndex < 0) {\n newStackIndex = timeSeriesData.stacks.length - 1;\n }\n } else {\n newStackIndex = Math.min(timeSeriesData.stacks.length - 1, newStackIndex);\n newStackIndex = Math.max(0, newStackIndex);\n }\n\n if (newStackIndex !== timeSeriesData.currentStackIndex) {\n const viewport = cornerstone.getViewport(element);\n const newStack = timeSeriesData.stacks[newStackIndex];\n\n const startLoadingHandler = loadHandlerManager.getStartLoadHandler();\n const endLoadingHandler = loadHandlerManager.getEndLoadHandler();\n const errorLoadingHandler = loadHandlerManager.getErrorLoadingHandler();\n\n if (startLoadingHandler) {\n startLoadingHandler(element);\n }\n\n let loader;\n\n if (newStack.preventCache === true) {\n loader = cornerstone.loadImage(newStack.imageIds[currentImageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(newStack.imageIds[currentImageIdIndex]);\n }\n\n loader.then(function (image) {\n if (timeSeriesData.currentImageIdIndex !== currentImageIdIndex) {\n newStack.currentImageIdIndex = currentImageIdIndex;\n timeSeriesData.currentStackIndex = newStackIndex;\n cornerstone.displayImage(element, image, viewport);\n if (endLoadingHandler) {\n endLoadingHandler(element, image);\n }\n }\n }, function (error) {\n const imageId = newStack.imageIds[currentImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(element, imageId, error);\n }\n });\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./timeSeriesTools/incrementTimePoint.js","import EVENTS from '../events.js';\n\nexport default function (touchDragCallback, options) {\n let configuration = {};\n const events = [EVENTS.MULTI_TOUCH_DRAG];\n\n if (options && options.fireOnTouchStart === true) {\n events.push(EVENTS.MULTI_TOUCH_START);\n }\n\n return {\n activate (element) {\n events.forEach((eventType) => {\n element.removeEventListener(eventType, touchDragCallback);\n element.addEventListener(eventType, touchDragCallback);\n });\n\n if (options && options.activateCallback) {\n options.activateCallback(element);\n }\n },\n disable (element) {\n events.forEach((eventType) => {\n element.removeEventListener(eventType, touchDragCallback);\n });\n\n if (options && options.disableCallback) {\n options.disableCallback(element);\n }\n },\n enable (element) {\n events.forEach((eventType) => {\n element.removeEventListener(eventType, touchDragCallback);\n });\n\n if (options && options.enableCallback) {\n options.enableCallback(element);\n }\n },\n deactivate (element) {\n events.forEach((eventType) => {\n element.removeEventListener(eventType, touchDragCallback);\n });\n\n if (options && options.deactivateCallback) {\n options.deactivateCallback(element);\n }\n },\n getConfiguration () {\n return configuration;\n },\n setConfiguration (config) {\n configuration = config;\n }\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/multiTouchDragTool.js","import { planePlaneIntersection, projectPatientPointToImagePlane } from '../util/pointProjector.js';\n\n// Calculates a reference line between two planes by projecting the top left hand corner and bottom right hand corner\n// Of the reference image onto the target image. Ideally we would calculate the intersection between the planes but\n// That requires a bit more math and this works fine for most cases\nexport default function (targetImagePlane, referenceImagePlane) {\n const points = planePlaneIntersection(targetImagePlane, referenceImagePlane);\n\n if (!points) {\n return;\n }\n\n return {\n start: projectPatientPointToImagePlane(points.start, targetImagePlane),\n end: projectPatientPointToImagePlane(points.end, targetImagePlane)\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./referenceLines/calculateReferenceLine.js","import external from '../externalModules.js';\nimport calculateReferenceLine from './calculateReferenceLine.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport toolStyle from '../stateManagement/toolStyle.js';\nimport convertToVector3 from '../util/convertToVector3.js';\n\n// Renders the active reference line\nexport default function (context, eventData, targetElement, referenceElement) {\n const cornerstone = external.cornerstone;\n const targetImage = cornerstone.getEnabledElement(targetElement).image;\n const referenceImage = cornerstone.getEnabledElement(referenceElement).image;\n\n // Make sure the images are actually loaded for the target and reference\n if (!targetImage || !referenceImage) {\n return;\n }\n\n const targetImagePlane = cornerstone.metaData.get('imagePlaneModule', targetImage.imageId);\n const referenceImagePlane = cornerstone.metaData.get('imagePlaneModule', referenceImage.imageId);\n\n // Make sure the target and reference actually have image plane metadata\n if (!targetImagePlane ||\n !referenceImagePlane ||\n !targetImagePlane.rowCosines ||\n !targetImagePlane.columnCosines ||\n !targetImagePlane.imagePositionPatient ||\n !referenceImagePlane.rowCosines ||\n !referenceImagePlane.columnCosines ||\n !referenceImagePlane.imagePositionPatient) {\n return;\n }\n\n // The image planes must be in the same frame of reference\n if (targetImagePlane.frameOfReferenceUID !== referenceImagePlane.frameOfReferenceUID) {\n return;\n }\n\n targetImagePlane.rowCosines = convertToVector3(targetImagePlane.rowCosines);\n targetImagePlane.columnCosines = convertToVector3(targetImagePlane.columnCosines);\n targetImagePlane.imagePositionPatient = convertToVector3(targetImagePlane.imagePositionPatient);\n referenceImagePlane.rowCosines = convertToVector3(referenceImagePlane.rowCosines);\n referenceImagePlane.columnCosines = convertToVector3(referenceImagePlane.columnCosines);\n referenceImagePlane.imagePositionPatient = convertToVector3(referenceImagePlane.imagePositionPatient);\n\n // The image plane normals must be > 30 degrees apart\n const targetNormal = targetImagePlane.rowCosines.clone().cross(targetImagePlane.columnCosines);\n const referenceNormal = referenceImagePlane.rowCosines.clone().cross(referenceImagePlane.columnCosines);\n let angleInRadians = targetNormal.angleTo(referenceNormal);\n\n angleInRadians = Math.abs(angleInRadians);\n if (angleInRadians < 0.5) { // 0.5 radians = ~30 degrees\n return;\n }\n\n const referenceLine = calculateReferenceLine(targetImagePlane, referenceImagePlane);\n\n if (!referenceLine) {\n return;\n }\n\n const refLineStartCanvas = cornerstone.pixelToCanvas(eventData.element, referenceLine.start);\n const refLineEndCanvas = cornerstone.pixelToCanvas(eventData.element, referenceLine.end);\n\n const color = toolColors.getActiveColor();\n const lineWidth = toolStyle.getToolWidth();\n\n // Draw the referenceLines\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n context.save();\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.moveTo(refLineStartCanvas.x, refLineStartCanvas.y);\n context.lineTo(refLineEndCanvas.x, refLineEndCanvas.y);\n context.stroke();\n context.restore();\n}\n\n\n\n// WEBPACK FOOTER //\n// ./referenceLines/renderActiveReferenceLine.js","import getOrientationString from './getOrientationString.js';\nimport invertOrientationString from './invertOrientationString.js';\n\nconst orientation = {\n getOrientationString,\n invertOrientationString\n};\n\nexport default orientation;\n\n\n\n// WEBPACK FOOTER //\n// ./orientation/index.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport { getToolState } from '../stateManagement/toolState.js';\nimport requestPoolManager from '../requestPool/requestPoolManager.js';\nimport loadHandlerManager from '../stateManagement/loadHandlerManager.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nexport default function (element, newImageIdIndex) {\n const toolData = getToolState(element, 'stack');\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n // If we have more than one stack, check if we have a stack renderer defined\n let stackRenderer;\n\n if (toolData.data.length > 1) {\n const stackRendererData = getToolState(element, 'stackRenderer');\n\n if (stackRendererData && stackRendererData.data && stackRendererData.data.length) {\n stackRenderer = stackRendererData.data[0];\n }\n }\n\n const stackData = toolData.data[0];\n\n // Allow for negative indexing\n if (newImageIdIndex < 0) {\n newImageIdIndex += stackData.imageIds.length;\n }\n\n const startLoadingHandler = loadHandlerManager.getStartLoadHandler();\n const endLoadingHandler = loadHandlerManager.getEndLoadHandler();\n const errorLoadingHandler = loadHandlerManager.getErrorLoadingHandler();\n\n function doneCallback (image) {\n if (stackData.currentImageIdIndex !== newImageIdIndex) {\n return;\n }\n\n // Check if the element is still enabled in Cornerstone,\n // If an error is thrown, stop here.\n try {\n // TODO: Add 'isElementEnabled' to Cornerstone?\n cornerstone.getEnabledElement(element);\n } catch(error) {\n return;\n }\n\n if (stackRenderer) {\n stackRenderer.currentImageIdIndex = newImageIdIndex;\n stackRenderer.render(element, toolData.data);\n } else {\n cornerstone.displayImage(element, image);\n }\n\n if (endLoadingHandler) {\n endLoadingHandler(element, image);\n }\n }\n\n function failCallback (error) {\n const imageId = stackData.imageIds[newImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(element, imageId, error);\n }\n }\n\n if (newImageIdIndex === stackData.currentImageIdIndex) {\n return;\n }\n\n if (startLoadingHandler) {\n startLoadingHandler(element);\n }\n\n const eventData = {\n newImageIdIndex,\n direction: newImageIdIndex - stackData.currentImageIdIndex\n };\n\n stackData.currentImageIdIndex = newImageIdIndex;\n const newImageId = stackData.imageIds[newImageIdIndex];\n\n // Retry image loading in cases where previous image promise\n // Was rejected, if the option is set\n /*\n\n Const config = stackScroll.getConfiguration();\n\n TODO: Revisit this. It appears that Core's imageCache is not\n keeping rejected promises anywhere, so we have no way to know\n if something was previously rejected.\n\n if (config && config.retryLoadOnScroll === true) {\n }\n */\n\n // Convert the preventCache value in stack data to a boolean\n const preventCache = Boolean(stackData.preventCache);\n\n let imagePromise;\n\n if (preventCache) {\n imagePromise = cornerstone.loadImage(newImageId);\n } else {\n imagePromise = cornerstone.loadAndCacheImage(newImageId);\n }\n\n imagePromise.then(doneCallback, failCallback);\n // Make sure we kick off any changed download request pools\n requestPoolManager.startGrabbing();\n\n triggerEvent(element, EVENTS.STACK_SCROLL, eventData);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/scrollToIndex.js","import external from '../externalModules.js';\n\nexport default function (element, x, y, width, height) {\n if (!element) {\n throw new Error('getLuminance: parameter element must not be undefined');\n }\n\n x = Math.round(x);\n y = Math.round(y);\n const enabledElement = external.cornerstone.getEnabledElement(element);\n const image = enabledElement.image;\n const luminance = [];\n let index = 0;\n const pixelData = image.getPixelData();\n let spIndex,\n row,\n column;\n\n if (image.color) {\n for (row = 0; row < height; row++) {\n for (column = 0; column < width; column++) {\n spIndex = (((row + y) * image.columns) + (column + x)) * 4;\n const red = pixelData[spIndex];\n const green = pixelData[spIndex + 1];\n const blue = pixelData[spIndex + 2];\n\n luminance[index++] = 0.2126 * red + 0.7152 * green + 0.0722 * blue;\n }\n }\n } else {\n for (row = 0; row < height; row++) {\n for (column = 0; column < width; column++) {\n spIndex = ((row + y) * image.columns) + (column + x);\n luminance[index++] = pixelData[spIndex] * image.slope + image.intercept;\n }\n }\n }\n\n return luminance;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/getLuminance.js","// http://stackoverflow.com/questions/2172798/how-to-draw-an-oval-in-html5-canvas\nexport default function (context, x, y, w, h) {\n const kappa = 0.5522848,\n ox = (w / 2) * kappa, // Control point offset horizontal\n oy = (h / 2) * kappa, // Control point offset vertical\n xe = x + w, // X-end\n ye = y + h, // Y-end\n xm = x + w / 2, // X-middle\n ym = y + h / 2; // Y-middle\n\n context.beginPath();\n context.moveTo(x, ym);\n context.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y);\n context.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym);\n context.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye);\n context.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym);\n context.closePath();\n context.stroke();\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/drawEllipse.js","export default function (context, start, color, lineWidth) {\n const handleRadius = 6;\n\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.arc(start.x, start.y, handleRadius, 0, 2 * Math.PI);\n context.stroke();\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/drawCircle.js","export default function (context, start, end, color, lineWidth) {\n // Variables to be used when creating the arrow\n const headLength = 10;\n\n const angle = Math.atan2(end.y - start.y, end.x - start.x);\n\n // Starting path of the arrow from the start square to the end square and drawing the stroke\n context.beginPath();\n context.moveTo(start.x, start.y);\n context.lineTo(end.x, end.y);\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.stroke();\n\n // Starting a new path from the head of the arrow to one of the sides of the point\n context.beginPath();\n context.moveTo(end.x, end.y);\n context.lineTo(end.x - headLength * Math.cos(angle - Math.PI / 7), end.y - headLength * Math.sin(angle - Math.PI / 7));\n\n // Path from the side point of the arrow, to the other side point\n context.lineTo(end.x - headLength * Math.cos(angle + Math.PI / 7), end.y - headLength * Math.sin(angle + Math.PI / 7));\n\n // Path from the side point back to the tip of the arrow, and then again to the opposite side point\n context.lineTo(end.x, end.y);\n context.lineTo(end.x - headLength * Math.cos(angle - Math.PI / 7), end.y - headLength * Math.sin(angle - Math.PI / 7));\n\n // Draws the paths created above\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.stroke();\n context.fillStyle = color;\n context.fill();\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/drawArrow.js","import pointInEllipse from './pointInEllipse.js';\n\nexport default function (sp, ellipse) {\n // TODO: Get a real statistics library here that supports large counts\n\n let sum = 0;\n let sumSquared = 0;\n let count = 0;\n let index = 0;\n\n for (let y = ellipse.top; y < ellipse.top + ellipse.height; y++) {\n for (let x = ellipse.left; x < ellipse.left + ellipse.width; x++) {\n const point = {\n x,\n y\n };\n\n if (pointInEllipse(ellipse, point)) {\n sum += sp[index];\n sumSquared += sp[index] * sp[index];\n count++;\n }\n\n index++;\n }\n }\n\n if (count === 0) {\n return {\n count,\n mean: 0.0,\n variance: 0.0,\n stdDev: 0.0\n };\n }\n\n const mean = sum / count;\n const variance = sumSquared / count - mean * mean;\n\n return {\n count,\n mean,\n variance,\n stdDev: Math.sqrt(variance)\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/calculateEllipseStatistics.js","import EVENTS from '../events.js';\n\nexport default function (keyDownCallback) {\n let configuration = {};\n\n return {\n activate (element) {\n element.removeEventListener(EVENTS.KEY_DOWN, keyDownCallback);\n element.addEventListener(EVENTS.KEY_DOWN, keyDownCallback);\n },\n disable (element) {\n element.removeEventListener(EVENTS.KEY_DOWN, keyDownCallback);\n },\n enable (element) {\n element.removeEventListener(EVENTS.KEY_DOWN, keyDownCallback);\n },\n deactivate (element) {\n element.removeEventListener(EVENTS.KEY_DOWN, keyDownCallback);\n },\n getConfiguration () {\n return configuration;\n },\n setConfiguration (config) {\n configuration = config;\n }\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/keyboardTool.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport anyHandlesOutsideImage from './anyHandlesOutsideImage.js';\nimport { removeToolState } from '../stateManagement/toolState.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nexport default function (event, data, toolData, toolType, deleteIfHandleOutsideImage, doneMovingCallback) {\n const touchEventData = event.detail;\n const element = touchEventData.element;\n const cornerstone = external.cornerstone;\n\n function touchDragCallback (e) {\n const eventData = e.detail;\n\n data.active = true;\n\n Object.keys(data.handles).forEach(function (name) {\n const handle = data.handles[name];\n\n if (handle.movesIndependently === true) {\n return;\n }\n\n handle.x += eventData.deltaPoints.image.x;\n handle.y += eventData.deltaPoints.image.y;\n });\n cornerstone.updateImage(element);\n\n const eventType = EVENTS.MEASUREMENT_MODIFIED;\n const modifiedEventData = {\n toolType,\n element,\n measurementData: data\n };\n\n triggerEvent(element, eventType, modifiedEventData);\n\n e.preventDefault();\n e.stopPropagation();\n }\n\n element.addEventListener(EVENTS.TOUCH_DRAG, touchDragCallback);\n\n function touchEndCallback (e) {\n const eventData = e.detail;\n\n // Console.log('touchMoveAllHandles touchEndCallback: ' + e.type);\n data.active = false;\n data.invalidated = false;\n\n element.removeEventListener(EVENTS.TOUCH_DRAG, touchDragCallback);\n\n element.removeEventListener(EVENTS.TOUCH_PINCH, touchEndCallback);\n element.removeEventListener(EVENTS.TOUCH_PRESS, touchEndCallback);\n element.removeEventListener(EVENTS.TOUCH_END, touchEndCallback);\n element.removeEventListener(EVENTS.TOUCH_DRAG_END, touchEndCallback);\n element.removeEventListener(EVENTS.TAP, touchEndCallback);\n\n // If any handle is outside the image, delete the tool data\n const handlesOutsideImage = anyHandlesOutsideImage(eventData, data.handles);\n\n if (deleteIfHandleOutsideImage === true && handlesOutsideImage === true) {\n removeToolState(element, toolType, data);\n }\n\n cornerstone.updateImage(element);\n\n if (typeof doneMovingCallback === 'function') {\n doneMovingCallback(e);\n }\n }\n\n element.addEventListener(EVENTS.TOUCH_PINCH, touchEndCallback);\n element.addEventListener(EVENTS.TOUCH_PRESS, touchEndCallback);\n element.addEventListener(EVENTS.TOUCH_END, touchEndCallback);\n element.addEventListener(EVENTS.TOUCH_DRAG_END, touchEndCallback);\n element.addEventListener(EVENTS.TAP, touchEndCallback);\n\n return true;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./manipulators/touchMoveAllHandles.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\n/*\n * Define the runAnimation boolean as an object\n * so that it can be modified by reference\n */\nconst runAnimation = {\n value: false\n};\n\nconst touchEndEvents = [\n EVENTS.TOUCH_END,\n EVENTS.TOUCH_DRAG_END,\n EVENTS.TOUCH_PINCH,\n EVENTS.TOUCH_PRESS,\n EVENTS.TAP\n];\n\nfunction animate (lastTime, handle, runAnimation, enabledElement, targetLocation) {\n // See http://www.html5canvastutorials.com/advanced/html5-canvas-start-and-stop-an-animation/\n if (!runAnimation.value) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n // Update\n const time = (new Date()).getTime();\n // Var timeDiff = time - lastTime;\n\n // Pixels / second\n const distanceRemaining = Math.abs(handle.y - targetLocation.y);\n const linearDistEachFrame = distanceRemaining / 10;\n\n if (distanceRemaining < 1) {\n handle.y = targetLocation.y;\n runAnimation.value = false;\n\n return;\n }\n\n if (handle.y > targetLocation.y) {\n handle.y -= linearDistEachFrame;\n } else if (handle.y < targetLocation.y) {\n handle.y += linearDistEachFrame;\n }\n\n // Update the image\n cornerstone.updateImage(enabledElement.element);\n\n // Request a new frame\n cornerstone.requestAnimationFrame(function () {\n animate(time, handle, runAnimation, enabledElement, targetLocation);\n });\n}\n\nexport default function (event, toolType, data, handle, doneMovingCallback) {\n // Console.log('touchMoveHandle');\n runAnimation.value = true;\n\n const touchEventData = event.detail;\n const cornerstone = external.cornerstone;\n const element = touchEventData.element;\n const enabledElement = cornerstone.getEnabledElement(element);\n\n const time = (new Date()).getTime();\n\n // Average pixel width of index finger is 45-57 pixels\n // https://www.smashingmagazine.com/2012/02/finger-friendly-design-ideal-mobile-touchscreen-target-sizes/\n const fingerDistance = -57;\n\n const aboveFinger = {\n x: touchEventData.currentPoints.page.x,\n y: touchEventData.currentPoints.page.y + fingerDistance\n };\n\n let targetLocation = cornerstone.pageToPixel(element, aboveFinger.x, aboveFinger.y);\n\n function touchDragCallback (e) {\n const eventData = e.detail;\n\n // Console.log('touchMoveHandle touchDragCallback: ' + e.type);\n runAnimation.value = false;\n\n if (handle.hasMoved === false) {\n handle.hasMoved = true;\n }\n\n handle.active = true;\n\n const currentPoints = eventData.currentPoints;\n const aboveFinger = {\n x: currentPoints.page.x,\n y: currentPoints.page.y + fingerDistance\n };\n\n targetLocation = cornerstone.pageToPixel(element, aboveFinger.x, aboveFinger.y);\n handle.x = targetLocation.x;\n handle.y = targetLocation.y;\n\n cornerstone.updateImage(element);\n\n const eventType = EVENTS.MEASUREMENT_MODIFIED;\n const modifiedEventData = {\n toolType,\n element,\n measurementData: data\n };\n\n triggerEvent(element, eventType, modifiedEventData);\n }\n\n element.addEventListener(EVENTS.TOUCH_DRAG, touchDragCallback);\n\n function touchEndCallback (e) {\n const eventData = e.detail;\n // Console.log('touchMoveHandle touchEndCallback: ' + e.type);\n\n runAnimation.value = false;\n\n handle.active = false;\n element.removeEventListener(EVENTS.TOUCH_DRAG, touchDragCallback);\n touchEndEvents.forEach((eventType) => {\n element.removeEventListener(eventType, touchEndCallback);\n });\n\n cornerstone.updateImage(element);\n\n if (e.type === EVENTS.TOUCH_PRESS) {\n eventData.handlePressed = data;\n\n handle.x = touchEventData.currentPoints.image.x;\n handle.y = touchEventData.currentPoints.image.y;\n }\n\n if (typeof doneMovingCallback === 'function') {\n doneMovingCallback(e);\n }\n }\n\n touchEndEvents.forEach((eventType) => {\n element.addEventListener(eventType, touchEndCallback);\n });\n\n animate(time, handle, runAnimation, enabledElement, targetLocation);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./manipulators/touchMoveHandle.js","// Functions to prevent ghost clicks following a touch\n// All credit to @kosich\n// https://gist.github.com/kosich/23188dd86633b6c2efb7\n\nconst antiGhostDelay = 2000,\n pointerType = {\n mouse: 0,\n touch: 1\n };\n\nlet lastInteractionType,\n lastInteractionTime;\n\nfunction handleTap (type, e) {\n const now = Date.now();\n\n if (type !== lastInteractionType) {\n if (now - lastInteractionTime <= antiGhostDelay) {\n e.preventDefault();\n e.stopPropagation();\n e.stopImmediatePropagation();\n\n return false;\n }\n\n lastInteractionType = type;\n }\n\n lastInteractionTime = now;\n}\n\n// Cacheing the function references\n// Necessary because a new function reference is created after .bind() is called\n// http://stackoverflow.com/questions/11565471/removing-event-listener-which-was-added-with-bind\nconst handleTapMouse = handleTap.bind(null, pointerType.mouse);\nconst handleTapTouch = handleTap.bind(null, pointerType.touch);\n\nfunction attachEvents (element, eventList, interactionType) {\n const tapHandler = interactionType ? handleTapMouse : handleTapTouch;\n\n eventList.forEach(function (eventName) {\n element.addEventListener(eventName, tapHandler);\n });\n}\n\nfunction removeEvents (element, eventList, interactionType) {\n const tapHandler = interactionType ? handleTapMouse : handleTapTouch;\n\n eventList.forEach(function (eventName) {\n element.removeEventListener(eventName, tapHandler);\n });\n}\n\nconst mouseEvents = ['mousedown', 'mouseup'];\nconst touchEvents = ['touchstart', 'touchend'];\n\nfunction disable (element) {\n removeEvents(element, mouseEvents, pointerType.mouse);\n removeEvents(element, touchEvents, pointerType.touch);\n}\n\nfunction enable (element) {\n disable(element);\n attachEvents(element, mouseEvents, pointerType.mouse);\n attachEvents(element, touchEvents, pointerType.touch);\n}\n\nconst preventGhostClick = {\n enable,\n disable\n};\n\nexport default preventGhostClick;\n\n\n\n// WEBPACK FOOTER //\n// ./inputSources/preventGhostClick.js","import EVENTS from '../events.js';\n\nexport default function (doubleTapCallback) {\n return {\n activate (element) {\n element.removeEventListener(EVENTS.DOUBLE_TAP, doubleTapCallback);\n element.addEventListener(EVENTS.DOUBLE_TAP, doubleTapCallback);\n },\n disable (element) {\n element.removeEventListener(EVENTS.DOUBLE_TAP, doubleTapCallback);\n },\n enable (element) {\n element.removeEventListener(EVENTS.DOUBLE_TAP, doubleTapCallback);\n },\n deactivate (element) {\n element.removeEventListener(EVENTS.DOUBLE_TAP, doubleTapCallback);\n }\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/doubleTapTool.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport toolCoordinates from '../stateManagement/toolCoordinates.js';\nimport getHandleNearImagePoint from '../manipulators/getHandleNearImagePoint.js';\nimport handleActivator from '../manipulators/handleActivator.js';\nimport moveHandle from '../manipulators/moveHandle.js';\nimport moveAllHandles from '../manipulators/moveAllHandles.js';\nimport anyHandlesOutsideImage from '../manipulators/anyHandlesOutsideImage.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport { addToolState, removeToolState, getToolState } from '../stateManagement/toolState.js';\nimport { setToolOptions, getToolOptions } from '../toolOptions.js';\n\nexport default function (mouseToolInterface, preventHandleOutsideImage) {\n const toolType = mouseToolInterface.toolType;\n\n // /////// BEGIN ACTIVE TOOL ///////\n function addNewMeasurement (mouseEventData) {\n const element = mouseEventData.element;\n const measurementData = mouseToolInterface.createNewMeasurement(mouseEventData);\n\n // Prevent adding new measurement if tool returns nill\n if (!measurementData) {\n return;\n }\n\n // Associate this data with this imageId so we can render it and manipulate it\n addToolState(mouseEventData.element, toolType, measurementData);\n\n // Since we are dragging to another place to drop the end point, we can just activate\n // The end point and let the moveHandle move it for us.\n element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n moveHandle(mouseEventData, toolType, measurementData, measurementData.handles.end, function () {\n measurementData.active = false;\n if (anyHandlesOutsideImage(mouseEventData, measurementData.handles)) {\n // Delete the measurement\n removeToolState(mouseEventData.element, toolType, measurementData);\n }\n\n element.addEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n }, preventHandleOutsideImage);\n }\n\n function mouseDownActivateCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const options = getToolOptions(toolType, element);\n\n if (isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) {\n addNewMeasurement(eventData);\n\n return false;\n }\n }\n // /////// END ACTIVE TOOL ///////\n\n // /////// BEGIN DEACTIVE TOOL ///////\n\n function mouseMoveCallback (e) {\n const eventData = e.detail;\n\n toolCoordinates.setCoords(eventData);\n\n // If we have no tool data for this element, do nothing\n const toolData = getToolState(eventData.element, toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n // We have tool data, search through all data\n // And see if we can activate a handle\n let imageNeedsUpdate = false;\n const coords = eventData.currentPoints.canvas;\n\n for (let i = 0; i < toolData.data.length; i++) {\n // Get the cursor position in image coordinates\n const data = toolData.data[i];\n\n if (handleActivator(eventData.element, data.handles, coords) === true) {\n imageNeedsUpdate = true;\n }\n\n if ((mouseToolInterface.pointInsideRect(eventData.element, data, coords) && !data.active) || (!mouseToolInterface.pointInsideRect(eventData.element, data, coords) && data.active)) {\n data.active = !data.active;\n imageNeedsUpdate = true;\n }\n }\n\n // Handle activation status changed, redraw the image\n if (imageNeedsUpdate === true) {\n external.cornerstone.updateImage(eventData.element);\n }\n }\n\n function mouseDownCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const cornerstone = external.cornerstone;\n let data;\n const options = getToolOptions(toolType, element);\n\n if (!isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) {\n return;\n }\n\n function handleDoneMove () {\n data.active = false;\n if (anyHandlesOutsideImage(eventData, data.handles)) {\n // Delete the measurement\n removeToolState(eventData.element, toolType, data);\n }\n\n cornerstone.updateImage(eventData.element);\n element.addEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n }\n\n const coords = eventData.startPoints.canvas;\n const toolData = getToolState(e.currentTarget, toolType);\n\n let i;\n\n // Now check to see if there is a handle we can move\n const distanceSq = 25;\n\n if (toolData !== undefined) {\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n const handle = getHandleNearImagePoint(eventData.element, data.handles, coords, distanceSq);\n\n if (handle !== undefined) {\n element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n data.active = true;\n moveHandle(eventData, toolType, data, handle, handleDoneMove, preventHandleOutsideImage);\n e.stopImmediatePropagation();\n\n return false;\n }\n }\n }\n\n // Now check to see if there is a line we can move\n // Now check to see if we have a tool that we can move\n const opt = {\n deleteIfHandleOutsideImage: true,\n preventHandleOutsideImage\n };\n\n if (toolData !== undefined && mouseToolInterface.pointInsideRect !== undefined) {\n for (i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (mouseToolInterface.pointInsideRect(eventData.element, data, coords)) {\n element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n moveAllHandles(e, data, toolData, toolType, opt, handleDoneMove);\n element.addEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n e.stopImmediatePropagation();\n\n return false;\n }\n }\n }\n }\n // /////// END DEACTIVE TOOL ///////\n\n // Not visible, not interactive\n function disable (element) {\n element.removeEventListener(EVENTS.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownActivateCallback);\n\n external.cornerstone.updateImage(element);\n }\n\n // Visible but not interactive\n function enable (element) {\n element.removeEventListener(EVENTS.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownActivateCallback);\n\n element.addEventListener(EVENTS.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n\n external.cornerstone.updateImage(element);\n }\n\n // Visible, interactive and can create\n function activate (element, mouseButtonMask) {\n setToolOptions(toolType, element, { mouseButtonMask });\n\n element.removeEventListener(EVENTS.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownActivateCallback);\n\n element.addEventListener(EVENTS.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n element.addEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n element.addEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n element.addEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownActivateCallback);\n\n external.cornerstone.updateImage(element);\n }\n\n // Visible, interactive\n function deactivate (element, mouseButtonMask) {\n setToolOptions(toolType, element, { mouseButtonMask });\n\n element.removeEventListener(EVENTS.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownActivateCallback);\n\n element.addEventListener(EVENTS.IMAGE_RENDERED, mouseToolInterface.onImageRendered);\n element.addEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n element.addEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n\n external.cornerstone.updateImage(element);\n }\n\n const toolInterface = {\n enable,\n disable,\n activate,\n deactivate\n };\n\n return toolInterface;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/mouseButtonRectangleTool.js","import EVENTS from '../events.js';\n\nexport default function (touchPinchCallback) {\n return {\n activate (element) {\n element.removeEventListener(EVENTS.TOUCH_PINCH, touchPinchCallback);\n element.addEventListener(EVENTS.TOUCH_PINCH, touchPinchCallback);\n },\n disable (element) {\n element.removeEventListener(EVENTS.TOUCH_PINCH, touchPinchCallback);\n },\n enable (element) {\n element.removeEventListener(EVENTS.TOUCH_PINCH, touchPinchCallback);\n },\n deactivate (element) {\n element.removeEventListener(EVENTS.TOUCH_PINCH, touchPinchCallback);\n }\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/touchPinchTool.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport { getToolState, addToolState } from '../stateManagement/toolState.js';\nimport mouseButtonTool from '../imageTools/mouseButtonTool.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport { setToolOptions, getToolOptions } from '../toolOptions.js';\n\nconst TOOL_STATE_TOOL_TYPE = 'brush';\nlet brushLayerId;\n\nexport default function brushTool (brushToolInterface) {\n const toolType = brushToolInterface.toolType;\n\n function mouseMoveCallback (e) {\n brushToolInterface.onMouseMove(e);\n }\n\n function mouseUpCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n brushToolInterface.onMouseUp(e);\n\n element.removeEventListener(EVENTS.MOUSE_DRAG, mouseMoveCallback);\n element.removeEventListener(EVENTS.MOUSE_DRAG, dragCallback);\n element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n }\n\n function dragCallback (e) {\n brushToolInterface.onDrag(e);\n\n return false;\n }\n\n function mouseDownActivateCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const options = getToolOptions(toolType, element);\n\n if (isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) {\n element.addEventListener(EVENTS.MOUSE_DRAG, dragCallback);\n element.addEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.addEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n brushToolInterface.onMouseDown(e);\n\n return false;\n }\n\n element.addEventListener(EVENTS.MOUSE_DRAG, mouseMoveCallback);\n element.addEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n }\n\n function onImageRendered (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const toolData = getToolState(element, TOOL_STATE_TOOL_TYPE);\n let pixelData;\n\n if (toolData) {\n pixelData = toolData.data[0].pixelData;\n } else {\n pixelData = new Uint8ClampedArray(eventData.image.width * eventData.image.height);\n addToolState(element, TOOL_STATE_TOOL_TYPE, { pixelData });\n }\n\n const layer = external.cornerstone.getLayer(eventData.element, brushLayerId);\n\n layer.image.setPixelData(pixelData);\n layer.invalid = true;\n\n external.cornerstone.updateImage(element);\n\n brushToolInterface.onImageRendered(e);\n }\n\n function activate (element, mouseButtonMask) {\n setToolOptions(toolType, element, { mouseButtonMask });\n\n element.removeEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n element.addEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n\n element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownActivateCallback);\n element.addEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownActivateCallback);\n\n element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n element.addEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n\n const enabledElement = external.cornerstone.getEnabledElement(element);\n const { width, height } = enabledElement.image;\n let pixelData = new Uint8ClampedArray(width * height);\n\n const configuration = brushTool.getConfiguration();\n let colormapId = configuration.colormapId;\n\n if (!colormapId) {\n colormapId = 'BrushColorMap';\n\n const colormap = external.cornerstone.colors.getColormap(colormapId);\n\n colormap.setNumberOfColors(2);\n colormap.setColor(0, [0, 0, 0, 0]);\n colormap.setColor(1, [255, 0, 0, 255]);\n }\n\n const labelMapImage = {\n minPixelValue: 0,\n maxPixelValue: 1,\n slope: 1.0,\n intercept: 0,\n getPixelData: () => pixelData,\n rows: enabledElement.image.height,\n columns: enabledElement.image.width,\n height,\n width,\n pixelData,\n setPixelData: (data) => {\n pixelData = data;\n },\n colormap: colormapId,\n color: false,\n rgba: false,\n labelmap: true,\n invert: false,\n columnPixelSpacing: 1.0,\n rowPixelSpacing: 1.0,\n sizeInBytes: enabledElement.image.width * enabledElement.image.height\n };\n\n let layer;\n const options = {\n viewport: {\n pixelReplication: true\n }\n };\n\n if (brushLayerId) {\n layer = external.cornerstone.getLayer(element, brushLayerId);\n }\n\n if (!layer) {\n brushLayerId = external.cornerstone.addLayer(element, labelMapImage, options);\n }\n\n addToolState(element, TOOL_STATE_TOOL_TYPE, { pixelData });\n\n configuration.brushLayerId = brushLayerId;\n brushTool.setConfiguration(configuration);\n\n external.cornerstone.updateImage(element);\n }\n\n function deactivate (element) {\n element.removeEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, mouseDownActivateCallback);\n element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n }\n\n const brushTool = mouseButtonTool({\n mouseMoveCallback,\n mouseDownActivateCallback,\n onImageRendered,\n deactivate\n });\n\n brushTool.activate = activate;\n\n return brushTool;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./paintingTools/brushTool.js","export default function getCircle (radius, rows, columns, xCoord = 0, yCoord = 0) {\n const x0 = Math.round(xCoord);\n const y0 = Math.round(yCoord);\n\n if (radius === 1) {\n return [[x0, y0]];\n }\n\n const circleArray = [];\n let index = 0;\n\n for(let y = -radius; y <= radius; y++) {\n const yCoord = y0 + y;\n\n if (yCoord > rows || yCoord < 0) {\n continue;\n }\n\n for(let x = -radius; x <= radius; x++) {\n const xCoord = x0 + x;\n\n if (xCoord > columns || xCoord < 0) {\n continue;\n }\n\n if (x * x + y * y < radius * radius) {\n circleArray[index++] = [x0 + x, y0 + y];\n }\n }\n }\n\n return circleArray;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./paintingTools/getCircle.js","import external from '../externalModules.js';\n\nfunction drawBrushPixels (pointerArray, storedPixels, brushPixelValue, columns) {\n const getPixelIndex = (x, y) => (y * columns) + x;\n\n pointerArray.forEach((point) => {\n const spIndex = getPixelIndex(point[0], point[1]);\n\n storedPixels[spIndex] = brushPixelValue;\n });\n}\n\nfunction drawBrushOnCanvas (pointerArray, canvasContext, color, element) {\n const canvasPtTL = external.cornerstone.pixelToCanvas(element, { x: 0,\n y: 0 });\n const canvasPtBR = external.cornerstone.pixelToCanvas(element, { x: 1,\n y: 1 });\n const sizeX = canvasPtBR.x - canvasPtTL.x;\n const sizeY = canvasPtBR.y - canvasPtTL.y;\n\n canvasContext.save();\n canvasContext.fillStyle = color;\n\n pointerArray.forEach((point) => {\n const canvasPt = external.cornerstone.pixelToCanvas(element, {\n x: point[0],\n y: point[1]\n });\n\n canvasContext.fillRect(canvasPt.x, canvasPt.y, sizeX, sizeY);\n });\n\n canvasContext.restore();\n}\n\nexport { drawBrushPixels, drawBrushOnCanvas };\n\n\n\n// WEBPACK FOOTER //\n// ./paintingTools/drawBrush.js","export { default as external } from './externalModules.js';\n\nexport { default as referenceLines } from './referenceLines/index.js';\nexport { default as orientation } from './orientation/index.js';\n\nexport { default as requestPoolManager } from './requestPool/requestPoolManager.js';\n\nexport { default as setContextToDisplayFontSize } from './util/setContextToDisplayFontSize.js';\nexport { default as scrollToIndex } from './util/scrollToIndex.js';\nexport { default as scroll } from './util/scroll.js';\nexport { default as roundToDecimal } from './util/roundToDecimal.js';\nexport { projectPatientPointToImagePlane,\n imagePointToPatientPoint,\n planePlaneIntersection } from './util/pointProjector.js';\n\nexport { default as pointInsideBoundingBox } from './util/pointInsideBoundingBox.js';\nexport { default as pointInEllipse } from './util/pointInEllipse.js';\nexport { default as pauseEvent } from './util/pauseEvent.js';\nexport { default as isMouseButtonEnabled } from './util/isMouseButtonEnabled.js';\nexport { default as getRGBPixels } from './util/getRGBPixels.js';\nexport { getDefaultSimultaneousRequests,\n getMaxSimultaneousRequests,\n getBrowserInfo,\n isMobileDevice } from './util/getMaxSimultaneousRequests.js';\n\nexport { default as getLuminance } from './util/getLuminance.js';\nexport { default as drawTextBox } from './util/drawTextBox.js';\nexport { default as drawEllipse } from './util/drawEllipse.js';\nexport { default as drawCircle } from './util/drawCircle.js';\nexport { default as drawArrow } from './util/drawArrow.js';\nexport { default as copyPoints } from './util/copyPoints.js';\nexport { default as calculateSUV } from './util/calculateSUV.js';\nexport { default as calculateEllipseStatistics } from './util/calculateEllipseStatistics.js';\n\nexport { default as probeTool4D } from './timeSeriesTools/probeTool4D.js';\nexport { default as incrementTimePoint } from './timeSeriesTools/incrementTimePoint.js';\nexport { default as timeSeriesPlayer } from './timeSeriesTools/timeSeriesPlayer.js';\nexport { timeSeriesScroll,\n timeSeriesScrollWheel,\n timeSeriesScrollTouchDrag } from './timeSeriesTools/timeSeriesScroll.js';\n\nexport { default as wwwcSynchronizer } from './synchronization/wwwcSynchronizer.js';\nexport { default as updateImageSynchronizer } from './synchronization/updateImageSynchronizer.js';\nexport { default as Synchronizer } from './synchronization/Synchronizer.js';\nexport { default as stackScrollSynchronizer } from './synchronization/stackScrollSynchronizer.js';\nexport { default as stackImagePositionSynchronizer } from './synchronization/stackImagePositionSynchronizer.js';\nexport { default as stackImagePositionOffsetSynchronizer } from './synchronization/stackImagePositionOffsetSynchronizer.js';\nexport { default as stackImageIndexSynchronizer } from './synchronization/stackImageIndexSynchronizer.js';\nexport { default as panZoomSynchronizer } from './synchronization/panZoomSynchronizer.js';\n\nexport { default as toolStyle } from './stateManagement/toolStyle.js';\nexport { addToolState,\n getToolState,\n removeToolState,\n clearToolState,\n setElementToolStateManager,\n getElementToolStateManager } from './stateManagement/toolState.js';\nexport { default as toolCoordinates } from './stateManagement/toolCoordinates.js';\nexport { default as toolColors } from './stateManagement/toolColors.js';\nexport { addTimeSeriesStateManager,\n newTimeSeriesSpecificToolStateManager } from './stateManagement/timeSeriesSpecificStateManager.js';\nexport { default as textStyle } from './stateManagement/textStyle.js';\n\nexport { stackSpecificStateManager,\n newStackSpecificToolStateManager,\n addStackStateManager } from './stateManagement/stackSpecificStateManager.js';\n\nexport { default as loadHandlerManager } from './stateManagement/loadHandlerManager.js';\n\nexport { newImageIdSpecificToolStateManager,\n globalImageIdSpecificToolStateManager } from './stateManagement/imageIdSpecificStateManager.js';\n\nexport { newFrameOfReferenceSpecificToolStateManager,\n globalFrameOfReferenceSpecificToolStateManager } from './stateManagement/frameOfReferenceStateManager.js';\n\nexport { default as appState } from './stateManagement/appState.js';\n\nexport { default as stackScrollKeyboard } from './stackTools/stackScrollKeyboard.js';\n\nexport { stackScroll,\n stackScrollWheel,\n stackScrollTouchDrag,\n stackScrollMultiTouch } from './stackTools/stackScroll.js';\n\nexport { default as stackPrefetch } from './stackTools/stackPrefetch.js';\nexport { default as scrollIndicator } from './stackTools/scrollIndicator.js';\nexport { default as stackRenderers } from './stackTools/stackRenderers.js';\nexport { playClip, stopClip } from './stackTools/playClip.js';\n\nexport { default as anyHandlesOutsideImage } from './manipulators/anyHandlesOutsideImage.js';\nexport { default as drawHandles } from './manipulators/drawHandles.js';\nexport { default as getHandleNearImagePoint } from './manipulators/getHandleNearImagePoint.js';\nexport { default as handleActivator } from './manipulators/handleActivator.js';\nexport { default as moveAllHandles } from './manipulators/moveAllHandles.js';\nexport { default as moveHandle } from './manipulators/moveHandle.js';\nexport { default as moveNewHandle } from './manipulators/moveNewHandle.js';\nexport { default as moveNewHandleTouch } from './manipulators/moveNewHandleTouch.js';\nexport { default as touchMoveAllHandles } from './manipulators/touchMoveAllHandles.js';\nexport { default as touchMoveHandle } from './manipulators/touchMoveHandle.js';\n\nexport { default as keyboardInput } from './inputSources/keyboardInput.js';\nexport { default as mouseInput } from './inputSources/mouseInput.js';\nexport { default as mouseWheelInput } from './inputSources/mouseWheelInput.js';\nexport { default as preventGhostClick } from './inputSources/preventGhostClick.js';\nexport { default as touchInput } from './inputSources/touchInput.js';\n\n\nexport { angle, angleTouch } from './imageTools/angleTool.js';\nexport { arrowAnnotate, arrowAnnotateTouch } from './imageTools/arrowAnnotate.js';\nexport { crosshairs, crosshairsTouch } from './imageTools/crosshairs.js';\nexport { default as displayTool } from './imageTools/displayTool.js';\nexport { default as doubleTapTool } from './imageTools/doubleTapTool.js';\nexport { default as doubleTapZoom } from './imageTools/doubleTapZoom.js';\nexport { dragProbe, dragProbeTouch } from './imageTools/dragProbe.js';\n\nexport { ellipticalRoi, ellipticalRoiTouch } from './imageTools/ellipticalRoi.js';\nexport { freehand } from './imageTools/freehand.js';\n\nexport { highlight, highlightTouch } from './imageTools/highlight.js';\nexport { default as imageStats } from './imageTools/imageStats.js';\nexport { default as keyboardTool } from './imageTools/keyboardTool.js';\nexport { length, lengthTouch } from './imageTools/length.js';\nexport { magnify, magnifyTouchDrag } from './imageTools/magnify.js';\nexport { default as mouseButtonRectangleTool } from './imageTools/mouseButtonRectangleTool.js';\nexport { default as mouseButtonTool } from './imageTools/mouseButtonTool.js';\nexport { default as mouseWheelTool } from './imageTools/mouseWheelTool.js';\nexport { default as multiTouchDragTool } from './imageTools/multiTouchDragTool.js';\nexport { default as orientationMarkers } from './imageTools/orientationMarkers.js';\n\nexport { pan, panTouchDrag } from './imageTools/pan.js';\nexport { default as panMultiTouch } from './imageTools/panMultiTouch.js';\nexport { probe, probeTouch } from './imageTools/probe.js';\nexport { rectangleRoi, rectangleRoiTouch } from './imageTools/rectangleRoi.js';\nexport { rotate, rotateTouchDrag } from './imageTools/rotate.js';\nexport { default as rotateTouch } from './imageTools/rotateTouch.js';\nexport { default as saveAs } from './imageTools/saveAs.js';\nexport { seedAnnotate, seedAnnotateTouch } from './imageTools/seedAnnotate.js';\nexport { simpleAngle, simpleAngleTouch } from './imageTools/simpleAngle.js';\nexport { default as simpleMouseButtonTool } from './imageTools/simpleMouseButtonTool.js';\nexport { textMarker, textMarkerTouch } from './imageTools/textMarker.js';\n\nexport { default as touchDragTool } from './imageTools/touchDragTool.js';\nexport { default as touchPinchTool } from './imageTools/touchPinchTool.js';\nexport { default as touchTool } from './imageTools/touchTool.js';\nexport { wwwc, wwwcTouchDrag } from './imageTools/wwwc.js';\nexport { wwwcRegion, wwwcRegionTouch } from './imageTools/wwwcRegion.js';\nexport { zoom,\n zoomWheel,\n zoomTouchPinch,\n zoomTouchDrag } from './imageTools/zoom.js';\nexport { brush } from './paintingTools/brush.js';\nexport { adaptiveBrush } from './paintingTools/adaptiveBrush.js';\nexport { default as version } from './version.js';\n\nexport { setToolOptions, getToolOptions } from './toolOptions.js';\n\n\n\n// WEBPACK FOOTER //\n// ./index.js","import calculateReferenceLine from './calculateReferenceLine.js';\nimport tool from './referenceLinesTool.js';\nimport renderActiveReferenceLine from './renderActiveReferenceLine.js';\n\nconst referenceLines = {\n calculateReferenceLine,\n tool,\n renderActiveReferenceLine\n};\n\nexport default referenceLines;\n\n\n\n// WEBPACK FOOTER //\n// ./referenceLines/index.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport { addToolState, getToolState } from '../stateManagement/toolState.js';\nimport renderActiveReferenceLine from './renderActiveReferenceLine.js';\n\nconst toolType = 'referenceLines';\n\nfunction onImageRendered (e) {\n const eventData = e.detail;\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n // Get the enabled elements associated with this synchronization context and draw them\n const syncContext = toolData.data[0].synchronizationContext;\n const enabledElements = syncContext.getSourceElements();\n\n const renderer = toolData.data[0].renderer;\n\n // Create the canvas context and reset it to the pixel coordinate system\n const context = eventData.canvasContext.canvas.getContext('2d');\n\n external.cornerstone.setToPixelCoordinateSystem(eventData.enabledElement, context);\n\n // Iterate over each referenced element\n enabledElements.forEach((referenceEnabledElement) => {\n\n // Don't draw ourselves\n if (referenceEnabledElement === e.currentTarget) {\n return;\n }\n\n // Render it\n renderer(context, eventData, e.currentTarget, referenceEnabledElement);\n });\n}\n\n// Enables the reference line tool for a given element. Note that a custom renderer\n// Can be provided if you want different rendering (e.g. all reference lines, first/last/active, etc)\nfunction enable (element, synchronizationContext, renderer) {\n renderer = renderer || renderActiveReferenceLine;\n\n addToolState(element, toolType, {\n synchronizationContext,\n renderer\n });\n\n element.removeEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n element.addEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n external.cornerstone.updateImage(element);\n}\n\n// Disables the reference line tool for the given element\nfunction disable (element) {\n element.removeEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n external.cornerstone.updateImage(element);\n}\n\n// Module/private exports\nconst tool = {\n enable,\n disable\n};\n\nexport default tool;\n\n\n\n// WEBPACK FOOTER //\n// ./referenceLines/referenceLinesTool.js","import external from '../externalModules.js';\nimport convertToVector3 from '../util/convertToVector3.js';\n\nexport default function (vector) {\n const vec3 = convertToVector3(vector);\n\n // Thanks to David Clunie\n // https://sites.google.com/site/dicomnotes/\n\n let orientation = '';\n const orientationX = vec3.x < 0 ? 'R' : 'L';\n const orientationY = vec3.y < 0 ? 'A' : 'P';\n const orientationZ = vec3.z < 0 ? 'F' : 'H';\n\n // Should probably make this a function vector3.abs\n const abs = new external.cornerstoneMath.Vector3(Math.abs(vec3.x), Math.abs(vec3.y), Math.abs(vec3.z));\n\n for (let i = 0; i < 3; i++) {\n if (abs.x > 0.0001 && abs.x > abs.y && abs.x > abs.z) {\n orientation += orientationX;\n abs.x = 0;\n } else if (abs.y > 0.0001 && abs.y > abs.x && abs.y > abs.z) {\n orientation += orientationY;\n abs.y = 0;\n } else if (abs.z > 0.0001 && abs.z > abs.x && abs.z > abs.y) {\n orientation += orientationZ;\n abs.z = 0;\n } else {\n break;\n }\n }\n\n return orientation;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./orientation/getOrientationString.js","export default function (string) {\n let inverted = string.replace('H', 'f');\n\n inverted = inverted.replace('F', 'h');\n inverted = inverted.replace('R', 'l');\n inverted = inverted.replace('L', 'r');\n inverted = inverted.replace('A', 'p');\n inverted = inverted.replace('P', 'a');\n inverted = inverted.toUpperCase();\n\n return inverted;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./orientation/invertOrientationString.js","import external from '../externalModules.js';\n\n/**\n * Sets the canvas context transformation matrix so it is scaled to show text\n * more cleanly even if the image is scaled up. See\n * https://github.com/cornerstonejs/cornerstoneTools/wiki/DrawingText\n * for more information\n *\n * @param enabledElement\n * @param context\n * @param fontSize\n * @returns {{fontSize: number, lineHeight: number, fontScale: number}}\n */\nexport default function (enabledElement, context, fontSize) {\n const fontScale = 0.1;\n\n external.cornerstone.setToPixelCoordinateSystem(enabledElement, context, fontScale);\n // Return the font size to use\n const scaledFontSize = fontSize / enabledElement.viewport.scale / fontScale;\n // TODO: actually calculate this?\n const lineHeight = fontSize / enabledElement.viewport.scale / fontScale;\n\n\n return {\n fontSize: scaledFontSize,\n lineHeight,\n fontScale\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./util/setContextToDisplayFontSize.js","import external from '../externalModules.js';\nimport mouseButtonTool from '../imageTools/mouseButtonTool.js';\nimport drawHandles from '../manipulators/drawHandles.js';\nimport { getToolState } from '../stateManagement/toolState.js';\nimport MeasurementManager from '../measurementManager/measurementManager.js';\nimport LineSampleMeasurement from '../measurementManager/lineSampleMeasurement.js';\nimport textStyle from '../stateManagement/textStyle.js';\nimport drawTextBox from '../util/drawTextBox.js';\n\nconst toolType = 'probe4D';\n\nfunction updateLineSample (measurementData) {\n const cornerstone = external.cornerstone;\n const samples = [];\n\n measurementData.timeSeries.stacks.forEach(function (stack) {\n let loader;\n\n if (stack.preventCache === true) {\n loader = cornerstone.loadImage(stack.imageIds[measurementData.imageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(stack.imageIds[measurementData.imageIdIndex]);\n }\n\n loader.then(function (image) {\n const offset = Math.round(measurementData.handles.end.x) + Math.round(measurementData.handles.end.y) * image.width;\n const sample = image.getPixelData()[offset];\n\n samples.push(sample);\n });\n });\n measurementData.lineSample.set(samples);\n}\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement (mouseEventData) {\n const timeSeriestoolData = getToolState(mouseEventData.element, 'timeSeries');\n\n if (timeSeriestoolData === undefined || timeSeriestoolData.data === undefined || timeSeriestoolData.data.length === 0) {\n return;\n }\n\n const timeSeries = timeSeriestoolData.data[0];\n\n // Create the measurement data for this tool with the end handle activated\n const measurementData = {\n timeSeries,\n lineSample: new LineSampleMeasurement(),\n imageIdIndex: timeSeries.stacks[timeSeries.currentStackIndex].currentImageIdIndex,\n visible: true,\n handles: {\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n }\n }\n };\n\n updateLineSample(measurementData);\n MeasurementManager.add(measurementData);\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\n// /////// BEGIN IMAGE RENDERING ///////\n\nfunction onImageRendered (e) {\n const cornerstone = external.cornerstone;\n const eventData = e.detail;\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n // We have tool data for this element - iterate over each one and draw it\n const context = eventData.canvasContext;\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n const color = 'white';\n const font = textStyle.getFont();\n\n for (let i = 0; i < toolData.data.length; i++) {\n context.save();\n const data = toolData.data[i];\n\n // Draw the handles\n context.beginPath();\n drawHandles(context, eventData, data.handles, color);\n context.stroke();\n\n context.font = font;\n\n const coords = {\n // Translate the x/y away from the cursor\n x: data.handles.end.x + 3,\n y: data.handles.end.y - 3\n };\n\n const textCoords = cornerstone.pixelToCanvas(eventData.element, coords);\n\n context.fillStyle = color;\n\n drawTextBox(context, `${data.handles.end.x}, ${data.handles.end.y}`, textCoords.x, textCoords.y, color);\n\n context.restore();\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nconst probeTool4D = mouseButtonTool({\n createNewMeasurement,\n onImageRendered,\n toolType\n});\n\nexport default probeTool4D;\n\n\n\n// WEBPACK FOOTER //\n// ./timeSeriesTools/probeTool4D.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\n// This object manages a collection of measurements\nfunction MeasurementManager () {\n const cornerstone = external.cornerstone;\n const that = this;\n\n that.measurements = [];\n\n // Adds an element as both a source and a target\n this.add = function (measurement) {\n const index = that.measurements.push(measurement);\n // Fire event\n const eventDetail = {\n index,\n measurement\n };\n\n triggerEvent(cornerstone.events, EVENTS.MEASUREMENT_ADDED, eventDetail);\n };\n\n this.remove = function (index) {\n const measurement = that.measurements[index];\n\n that.measurements.splice(index, 1);\n // Fire event\n const eventDetail = {\n index,\n measurement\n };\n\n triggerEvent(cornerstone.events, EVENTS.MEASUREMENT_REMOVED, eventDetail);\n };\n\n}\n\n// Module/private exports\nconst manager = new MeasurementManager();\n\nexport default manager;\n\n\n\n// WEBPACK FOOTER //\n// ./measurementManager/measurementManager.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\n// This object manages a collection of measurements\nexport default function () {\n const cornerstone = external.cornerstone;\n const that = this;\n\n that.samples = [];\n\n this.set = function (samples) {\n that.samples = samples;\n // Fire event\n triggerEvent(cornerstone.events, EVENTS.LINE_SAMPLE_UPDATED);\n };\n}\n\n\n\n// WEBPACK FOOTER //\n// ./measurementManager/lineSampleMeasurement.js","import { addToolState, getToolState } from '../stateManagement/toolState.js';\nimport incrementTimePoint from './incrementTimePoint.js';\n\nconst toolType = 'timeSeriesPlayer';\n\n/**\n * Starts playing a clip of different time series of the same image or adjusts the frame rate of an\n * already playing clip. framesPerSecond is optional and defaults to 30 if not specified. A negative\n * framesPerSecond will play the clip in reverse.\n * The element must have time series\n * @param element\n * @param framesPerSecond\n */\nfunction playClip (element, framesPerSecond) {\n if (element === undefined) {\n throw new Error('playClip: element must not be undefined');\n }\n\n if (framesPerSecond === undefined) {\n framesPerSecond = 30;\n }\n\n const timeSeriesToolData = getToolState(element, 'timeSeries');\n\n if (timeSeriesToolData === undefined || timeSeriesToolData.data === undefined || timeSeriesToolData.data.length === 0) {\n return;\n }\n\n const playClipToolData = getToolState(element, toolType);\n let playClipData;\n\n if (playClipToolData === undefined || playClipToolData.data.length === 0) {\n playClipData = {\n intervalId: undefined,\n framesPerSecond,\n lastFrameTimeStamp: undefined,\n frameRate: 0\n };\n addToolState(element, toolType, playClipData);\n } else {\n playClipData = playClipToolData.data[0];\n playClipData.framesPerSecond = framesPerSecond;\n }\n\n // If already playing, do not set a new interval\n if (playClipData.intervalId !== undefined) {\n return;\n }\n\n playClipData.intervalId = setInterval(function () {\n if (playClipData.framesPerSecond > 0) {\n incrementTimePoint(element, 1, true);\n } else {\n incrementTimePoint(element, -1, true);\n }\n }, 1000 / Math.abs(playClipData.framesPerSecond));\n}\n\n/**\n * Stops an already playing clip.\n * * @param element\n */\nfunction stopClip (element) {\n const playClipToolData = getToolState(element, toolType);\n\n if (!playClipToolData || !playClipToolData.data || !playClipToolData.data.length) {\n return;\n }\n const playClipData = playClipToolData.data[0];\n\n\n clearInterval(playClipData.intervalId);\n playClipData.intervalId = undefined;\n}\n\n// Module/private exports\nconst timeSeriesPlayer = {\n start: playClip,\n stop: stopClip\n};\n\nexport default timeSeriesPlayer;\n\n\n\n// WEBPACK FOOTER //\n// ./timeSeriesTools/timeSeriesPlayer.js","import EVENTS from '../events.js';\nimport simpleMouseButtonTool from '../imageTools/simpleMouseButtonTool.js';\nimport touchDragTool from '../imageTools/touchDragTool.js';\nimport mouseWheelTool from '../imageTools/mouseWheelTool.js';\nimport incrementTimePoint from './incrementTimePoint.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport { getToolState } from '../stateManagement/toolState.js';\nimport { setToolOptions, getToolOptions } from '../toolOptions.js';\n\nconst toolType = 'timeSeriesScroll';\n\nfunction mouseUpCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n element.removeEventListener(EVENTS.MOUSE_DRAG, mouseDragCallback);\n element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n}\n\nfunction mouseDownCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const options = getToolOptions(toolType, element);\n\n if (isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) {\n options.deltaY = 0;\n\n setToolOptions(toolType, element, options);\n\n element.addEventListener(EVENTS.MOUSE_DRAG, mouseDragCallback);\n element.addEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.addEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n e.stopImmediatePropagation();\n\n return false;\n }\n}\n\nfunction mouseDragCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n e.data.deltaY += eventData.deltaPoints.page.y;\n\n const toolData = getToolState(eventData.element, 'timeSeries');\n\n if (toolData === undefined || toolData.data === undefined || toolData.data.length === 0) {\n return;\n }\n\n const timeSeriesData = toolData.data[0];\n\n let pixelsPerTimeSeries = element.offsetHeight / timeSeriesData.stacks.length;\n\n if (e.data.options !== undefined && e.data.options.timeSeriesScrollSpeed !== undefined) {\n pixelsPerTimeSeries = e.data.options.timeSeriesScrollSpeed;\n }\n\n if (e.data.deltaY >= pixelsPerTimeSeries || e.data.deltaY <= -pixelsPerTimeSeries) {\n const timeSeriesDelta = Math.round(e.data.deltaY / pixelsPerTimeSeries);\n const timeSeriesDeltaMod = e.data.deltaY % pixelsPerTimeSeries;\n\n incrementTimePoint(eventData.element, timeSeriesDelta);\n e.data.deltaY = timeSeriesDeltaMod;\n }\n\n return false;\n}\n\nfunction mouseWheelCallback (e) {\n const eventData = e.detail;\n const images = -eventData.direction;\n\n incrementTimePoint(eventData.element, images);\n}\n\nfunction dragCallback (e) {\n const mouseMoveData = e.originalEvent.detail;\n const eventData = {\n deltaY: 0\n };\n\n eventData.deltaY += mouseMoveData.deltaPoints.page.y;\n\n const toolData = getToolState(mouseMoveData.element, 'stack');\n\n if (toolData === undefined || toolData.data === undefined || toolData.data.length === 0) {\n return;\n }\n\n if (eventData.deltaY >= 3 || eventData.deltaY <= -3) {\n const timeSeriesDelta = eventData.deltaY / 3;\n const timeSeriesDeltaMod = eventData.deltaY % 3;\n\n incrementTimePoint(eventData.element, timeSeriesDelta);\n eventData.deltaY = timeSeriesDeltaMod;\n }\n\n return false;\n}\n\n// Module/private exports\nconst timeSeriesScroll = simpleMouseButtonTool(mouseDownCallback, toolType);\nconst timeSeriesScrollWheel = mouseWheelTool(mouseWheelCallback);\nconst timeSeriesScrollTouchDrag = touchDragTool(dragCallback);\n\nexport {\n timeSeriesScroll,\n timeSeriesScrollWheel,\n timeSeriesScrollTouchDrag\n};\n\n\n\n// WEBPACK FOOTER //\n// ./timeSeriesTools/timeSeriesScroll.js","import external from '../externalModules.js';\n\n// This function synchronizes the target element ww/wc to match the source element\nexport default function (synchronizer, sourceElement, targetElement) {\n\n // Ignore the case where the source and target are the same enabled element\n if (targetElement === sourceElement) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n // Get the source and target viewports\n const sourceViewport = cornerstone.getViewport(sourceElement);\n const targetViewport = cornerstone.getViewport(targetElement);\n\n // Do nothing if the ww/wc already match\n if (targetViewport.voi.windowWidth === sourceViewport.voi.windowWidth && targetViewport.voi.windowCenter === sourceViewport.voi.windowCenter && targetViewport.invert === sourceViewport.invert) {\n return;\n }\n\n // Www/wc are different, sync them\n targetViewport.voi.windowWidth = sourceViewport.voi.windowWidth;\n targetViewport.voi.windowCenter = sourceViewport.voi.windowCenter;\n targetViewport.invert = sourceViewport.invert;\n synchronizer.setViewport(targetElement, targetViewport);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./synchronization/wwwcSynchronizer.js","import external from '../externalModules.js';\n\n// This function causes the target image to be drawn immediately\nexport default function (synchronizer, sourceElement, targetElement) {\n\n // Ignore the case where the source and target are the same enabled element\n if (targetElement === sourceElement) {\n return;\n }\n\n external.cornerstone.updateImage(targetElement);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./synchronization/updateImageSynchronizer.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport convertToVector3 from '../util/convertToVector3.js';\n\nfunction unique (array) {\n return array.filter(function (value, index, self) {\n return self.indexOf(value) === index;\n });\n}\n\n// This object is responsible for synchronizing target elements when an event fires on a source\n// Element\nfunction Synchronizer (event, handler) {\n const cornerstone = external.cornerstone;\n const that = this;\n const sourceElements = []; // Source elements fire the events we want to synchronize to\n const targetElements = []; // Target elements we want to synchronize to source elements\n\n let ignoreFiredEvents = false;\n const initialData = {};\n let eventHandler = handler;\n\n this.setHandler = function (handler) {\n eventHandler = handler;\n };\n\n this.getHandler = function () {\n return eventHandler;\n };\n\n this.getDistances = function () {\n if (!sourceElements.length || !targetElements.length) {\n return;\n }\n\n initialData.distances = {};\n initialData.imageIds = {\n sourceElements: [],\n targetElements: []\n };\n\n sourceElements.forEach(function (sourceElement) {\n const sourceEnabledElement = cornerstone.getEnabledElement(sourceElement);\n\n if (!sourceEnabledElement || !sourceEnabledElement.image) {\n return;\n }\n\n const sourceImageId = sourceEnabledElement.image.imageId;\n const sourceImagePlane = cornerstone.metaData.get('imagePlaneModule', sourceImageId);\n\n if (!sourceImagePlane || !sourceImagePlane.imagePositionPatient) {\n return;\n }\n\n const sourceImagePosition = convertToVector3(sourceImagePlane.imagePositionPatient);\n\n if (initialData.hasOwnProperty(sourceEnabledElement)) {\n return;\n }\n initialData.distances[sourceImageId] = {};\n\n\n initialData.imageIds.sourceElements.push(sourceImageId);\n\n targetElements.forEach(function (targetElement) {\n const targetEnabledElement = cornerstone.getEnabledElement(targetElement);\n\n if (!targetEnabledElement || !targetEnabledElement.image) {\n return;\n }\n\n const targetImageId = targetEnabledElement.image.imageId;\n\n initialData.imageIds.targetElements.push(targetImageId);\n\n if (sourceElement === targetElement) {\n return;\n }\n\n if (sourceImageId === targetImageId) {\n return;\n }\n\n if (initialData.distances[sourceImageId].hasOwnProperty(targetImageId)) {\n return;\n }\n\n const targetImagePlane = cornerstone.metaData.get('imagePlaneModule', targetImageId);\n\n if (!targetImagePlane || !targetImagePlane.imagePositionPatient) {\n return;\n }\n\n const targetImagePosition = convertToVector3(targetImagePlane.imagePositionPatient);\n\n initialData.distances[sourceImageId][targetImageId] = targetImagePosition.clone().sub(sourceImagePosition);\n });\n\n if (!Object.keys(initialData.distances[sourceImageId]).length) {\n delete initialData.distances[sourceImageId];\n }\n });\n };\n\n function fireEvent (sourceElement, eventData) {\n // Broadcast an event that something changed\n if (!sourceElements.length || !targetElements.length) {\n return;\n }\n\n ignoreFiredEvents = true;\n targetElements.forEach(function (targetElement) {\n const targetIndex = targetElements.indexOf(targetElement);\n\n if (targetIndex === -1) {\n return;\n }\n\n const targetImageId = initialData.imageIds.targetElements[targetIndex];\n const sourceIndex = sourceElements.indexOf(sourceElement);\n\n if (sourceIndex === -1) {\n return;\n }\n\n const sourceImageId = initialData.imageIds.sourceElements[sourceIndex];\n\n let positionDifference;\n\n if (sourceImageId === targetImageId) {\n positionDifference = 0;\n } else if (initialData.distances[sourceImageId] !== undefined) {\n positionDifference = initialData.distances[sourceImageId][targetImageId];\n }\n\n eventHandler(that, sourceElement, targetElement, eventData, positionDifference);\n });\n ignoreFiredEvents = false;\n }\n\n function onEvent (e) {\n const eventData = e.detail;\n\n if (ignoreFiredEvents === true) {\n return;\n }\n\n fireEvent(e.currentTarget, eventData);\n }\n\n // Adds an element as a source\n this.addSource = function (element) {\n // Return if this element was previously added\n const index = sourceElements.indexOf(element);\n\n if (index !== -1) {\n return;\n }\n\n // Add to our list of enabled elements\n sourceElements.push(element);\n\n // Subscribe to the event\n element.addEventListener(event, onEvent);\n\n // Update the initial distances between elements\n that.getDistances();\n\n that.updateDisableHandlers();\n };\n\n // Adds an element as a target\n this.addTarget = function (element) {\n // Return if this element was previously added\n const index = targetElements.indexOf(element);\n\n if (index !== -1) {\n return;\n }\n\n // Add to our list of enabled elements\n targetElements.push(element);\n\n // Update the initial distances between elements\n that.getDistances();\n\n // Invoke the handler for this new target element\n eventHandler(that, element, element, 0);\n\n that.updateDisableHandlers();\n };\n\n // Adds an element as both a source and a target\n this.add = function (element) {\n that.addSource(element);\n that.addTarget(element);\n };\n\n // Removes an element as a source\n this.removeSource = function (element) {\n // Find the index of this element\n const index = sourceElements.indexOf(element);\n\n if (index === -1) {\n return;\n }\n\n // Remove this element from the array\n sourceElements.splice(index, 1);\n\n // Stop listening for the event\n element.removeEventListener(event, onEvent);\n\n // Update the initial distances between elements\n that.getDistances();\n\n // Update everyone listening for events\n fireEvent(element);\n that.updateDisableHandlers();\n };\n\n // Removes an element as a target\n this.removeTarget = function (element) {\n // Find the index of this element\n const index = targetElements.indexOf(element);\n\n if (index === -1) {\n return;\n }\n\n // Remove this element from the array\n targetElements.splice(index, 1);\n\n // Update the initial distances between elements\n that.getDistances();\n\n // Invoke the handler for the removed target\n eventHandler(that, element, element, 0);\n that.updateDisableHandlers();\n };\n\n // Removes an element as both a source and target\n this.remove = function (element) {\n that.removeTarget(element);\n that.removeSource(element);\n };\n\n // Returns the source elements\n this.getSourceElements = function () {\n return sourceElements;\n };\n\n // Returns the target elements\n this.getTargetElements = function () {\n return targetElements;\n };\n\n this.displayImage = function (element, image, viewport) {\n ignoreFiredEvents = true;\n cornerstone.displayImage(element, image, viewport);\n ignoreFiredEvents = false;\n };\n\n this.setViewport = function (element, viewport) {\n ignoreFiredEvents = true;\n cornerstone.setViewport(element, viewport);\n ignoreFiredEvents = false;\n };\n\n function disableHandler (e) {\n const element = e.detail.element;\n\n that.remove(element);\n }\n\n this.updateDisableHandlers = function () {\n const elements = unique(sourceElements.concat(targetElements));\n\n elements.forEach(function (element) {\n element.removeEventListener(EVENTS.ELEMENT_DISABLED, disableHandler);\n element.addEventListener(EVENTS.ELEMENT_DISABLED, disableHandler);\n });\n };\n\n this.destroy = function () {\n const elements = unique(sourceElements.concat(targetElements));\n\n elements.forEach(function (element) {\n that.remove(element);\n });\n };\n}\n\nexport default Synchronizer;\n\n\n\n// WEBPACK FOOTER //\n// ./synchronization/Synchronizer.js","import external from '../externalModules.js';\nimport { getToolState } from '../stateManagement/toolState.js';\nimport loadHandlerManager from '../stateManagement/loadHandlerManager.js';\n\n// This function causes any scrolling actions within the stack to propagate to\n// All of the other viewports that are synced\nexport default function (synchronizer, sourceElement, targetElement, eventData) {\n // If the target and source are the same, stop\n if (sourceElement === targetElement) {\n return;\n }\n\n // If there is no event, or direction is 0, stop\n if (!eventData || !eventData.direction) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n // Get the stack of the target viewport\n const stackToolDataSource = getToolState(targetElement, 'stack');\n const stackData = stackToolDataSource.data[0];\n\n // Get the new index for the stack\n let newImageIdIndex = stackData.currentImageIdIndex + eventData.direction;\n\n // Ensure the index does not exceed the bounds of the stack\n newImageIdIndex = Math.min(Math.max(newImageIdIndex, 0), stackData.imageIds.length - 1);\n\n // If the index has not changed, stop here\n if (stackData.currentImageIdIndex === newImageIdIndex) {\n return;\n }\n\n const startLoadingHandler = loadHandlerManager.getStartLoadHandler();\n const endLoadingHandler = loadHandlerManager.getEndLoadHandler();\n const errorLoadingHandler = loadHandlerManager.getErrorLoadingHandler();\n\n if (startLoadingHandler) {\n startLoadingHandler(targetElement);\n }\n\n let loader;\n\n if (stackData.preventCache === true) {\n loader = cornerstone.loadImage(stackData.imageIds[newImageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(stackData.imageIds[newImageIdIndex]);\n }\n\n loader.then(function (image) {\n const viewport = cornerstone.getViewport(targetElement);\n\n stackData.currentImageIdIndex = newImageIdIndex;\n synchronizer.displayImage(targetElement, image, viewport);\n if (endLoadingHandler) {\n endLoadingHandler(targetElement, image);\n }\n }, function (error) {\n const imageId = stackData.imageIds[newImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(targetElement, imageId, error);\n }\n });\n}\n\n\n\n// WEBPACK FOOTER //\n// ./synchronization/stackScrollSynchronizer.js","import external from '../externalModules.js';\nimport { getToolState } from '../stateManagement/toolState.js';\nimport loadHandlerManager from '../stateManagement/loadHandlerManager.js';\nimport convertToVector3 from '../util/convertToVector3.js';\n\n// This function causes the image in the target stack to be set to the one closest\n// To the image in the source stack by image position\nexport default function (synchronizer, sourceElement, targetElement) {\n\n // Ignore the case where the source and target are the same enabled element\n if (targetElement === sourceElement) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n const sourceImage = cornerstone.getEnabledElement(sourceElement).image;\n const sourceImagePlane = cornerstone.metaData.get('imagePlaneModule', sourceImage.imageId);\n\n if (sourceImagePlane === undefined || sourceImagePlane.imagePositionPatient === undefined) {\n // Console.log('No position found for image ' + sourceImage.imageId);\n\n return;\n }\n\n const sourceImagePosition = convertToVector3(sourceImagePlane.imagePositionPatient);\n const stackToolDataSource = getToolState(targetElement, 'stack');\n const stackData = stackToolDataSource.data[0];\n\n let minDistance = Number.MAX_VALUE;\n let newImageIdIndex = -1;\n\n stackData.imageIds.forEach((imageId, index) => {\n const imagePlane = cornerstone.metaData.get('imagePlaneModule', imageId);\n\n if (imagePlane === undefined || imagePlane.imagePositionPatient === undefined) {\n // Console.log('No position found for image ' + imageId);\n\n return;\n }\n\n const imagePosition = convertToVector3(imagePlane.imagePositionPatient);\n const distance = imagePosition.distanceToSquared(sourceImagePosition);\n // Console.log(index + '=' + distance);\n\n if (distance < minDistance) {\n minDistance = distance;\n newImageIdIndex = index;\n }\n });\n\n if (newImageIdIndex === stackData.currentImageIdIndex) {\n return;\n }\n\n const startLoadingHandler = loadHandlerManager.getStartLoadHandler();\n const endLoadingHandler = loadHandlerManager.getEndLoadHandler();\n const errorLoadingHandler = loadHandlerManager.getErrorLoadingHandler();\n\n if (startLoadingHandler) {\n startLoadingHandler(targetElement);\n }\n\n if (newImageIdIndex !== -1) {\n let loader;\n\n if (stackData.preventCache === true) {\n loader = cornerstone.loadImage(stackData.imageIds[newImageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(stackData.imageIds[newImageIdIndex]);\n }\n\n loader.then(function (image) {\n const viewport = cornerstone.getViewport(targetElement);\n\n stackData.currentImageIdIndex = newImageIdIndex;\n synchronizer.displayImage(targetElement, image, viewport);\n if (endLoadingHandler) {\n endLoadingHandler(targetElement, image);\n }\n }, function (error) {\n const imageId = stackData.imageIds[newImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(targetElement, imageId, error);\n }\n });\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./synchronization/stackImagePositionSynchronizer.js","import external from '../externalModules.js';\nimport { getToolState } from '../stateManagement/toolState.js';\nimport loadHandlerManager from '../stateManagement/loadHandlerManager.js';\nimport convertToVector3 from '../util/convertToVector3.js';\n\n// This function causes the image in the target stack to be set to the one closest\n// To the image in the source stack by image position\n\n// In the future we will want to have a way to manually register links sets of the same orientation (e.g. an axial link set from a prior with an axial link set of a current). The user could do this by scrolling the two stacks to a similar location and then doing a user action (e.g. right click link) at which point the system will capture the delta between the image position (patient) of both stacks and use that to sync them. This offset will need to be adjustable.\n\nexport default function (synchronizer, sourceElement, targetElement, eventData, positionDifference) {\n\n // Ignore the case where the source and target are the same enabled element\n if (targetElement === sourceElement) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n const sourceEnabledElement = cornerstone.getEnabledElement(sourceElement);\n const sourceImagePlane = cornerstone.metaData.get('imagePlaneModule', sourceEnabledElement.image.imageId);\n const sourceImagePosition = convertToVector3(sourceImagePlane.imagePositionPatient);\n\n const stackToolDataSource = getToolState(targetElement, 'stack');\n const stackData = stackToolDataSource.data[0];\n\n let minDistance = Number.MAX_VALUE;\n let newImageIdIndex = -1;\n\n if (!positionDifference) {\n return;\n }\n\n const finalPosition = sourceImagePosition.clone().add(positionDifference);\n\n stackData.imageIds.forEach(function (imageId, index) {\n const imagePlane = cornerstone.metaData.get('imagePlaneModule', imageId);\n const imagePosition = convertToVector3(imagePlane.imagePositionPatient);\n const distance = finalPosition.distanceToSquared(imagePosition);\n\n if (distance < minDistance) {\n minDistance = distance;\n newImageIdIndex = index;\n }\n });\n\n if (newImageIdIndex === stackData.currentImageIdIndex || newImageIdIndex === -1) {\n return;\n }\n\n const startLoadingHandler = loadHandlerManager.getStartLoadHandler();\n const endLoadingHandler = loadHandlerManager.getEndLoadHandler();\n const errorLoadingHandler = loadHandlerManager.getErrorLoadingHandler();\n\n if (startLoadingHandler) {\n startLoadingHandler(targetElement);\n }\n\n let loader;\n\n if (stackData.preventCache === true) {\n loader = cornerstone.loadImage(stackData.imageIds[newImageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(stackData.imageIds[newImageIdIndex]);\n }\n\n loader.then(function (image) {\n const viewport = cornerstone.getViewport(targetElement);\n\n stackData.currentImageIdIndex = newImageIdIndex;\n synchronizer.displayImage(targetElement, image, viewport);\n if (endLoadingHandler) {\n endLoadingHandler(targetElement, image);\n }\n }, function (error) {\n const imageId = stackData.imageIds[newImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(targetElement, imageId, error);\n }\n });\n}\n\n\n\n// WEBPACK FOOTER //\n// ./synchronization/stackImagePositionOffsetSynchronizer.js","import external from '../externalModules.js';\nimport { getToolState } from '../stateManagement/toolState.js';\nimport loadHandlerManager from '../stateManagement/loadHandlerManager.js';\n\n// This function causes the image in the target stack to be set to the one closest\n// To the image in the source stack by image position\nexport default function (synchronizer, sourceElement, targetElement) {\n\n // Ignore the case where the source and target are the same enabled element\n if (targetElement === sourceElement) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n const sourceStackToolDataSource = getToolState(sourceElement, 'stack');\n const sourceStackData = sourceStackToolDataSource.data[0];\n const targetStackToolDataSource = getToolState(targetElement, 'stack');\n const targetStackData = targetStackToolDataSource.data[0];\n\n let newImageIdIndex = sourceStackData.currentImageIdIndex;\n\n // Clamp the index\n newImageIdIndex = Math.min(Math.max(newImageIdIndex, 0), targetStackData.imageIds.length - 1);\n\n // Do nothing if the index has not changed\n if (newImageIdIndex === targetStackData.currentImageIdIndex) {\n return;\n }\n\n const startLoadingHandler = loadHandlerManager.getStartLoadHandler();\n const endLoadingHandler = loadHandlerManager.getEndLoadHandler();\n const errorLoadingHandler = loadHandlerManager.getErrorLoadingHandler();\n\n if (startLoadingHandler) {\n startLoadingHandler(targetElement);\n }\n\n let loader;\n\n if (targetStackData.preventCache === true) {\n loader = cornerstone.loadImage(targetStackData.imageIds[newImageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(targetStackData.imageIds[newImageIdIndex]);\n }\n\n loader.then(function (image) {\n const viewport = cornerstone.getViewport(targetElement);\n\n targetStackData.currentImageIdIndex = newImageIdIndex;\n synchronizer.displayImage(targetElement, image, viewport);\n if (endLoadingHandler) {\n endLoadingHandler(targetElement, image);\n }\n }, function (error) {\n const imageId = targetStackData.imageIds[newImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(targetElement, imageId, error);\n }\n });\n}\n\n\n\n// WEBPACK FOOTER //\n// ./synchronization/stackImageIndexSynchronizer.js","import external from '../externalModules.js';\n\n// This function synchronizes the target zoom and pan to match the source\nexport default function (synchronizer, sourceElement, targetElement) {\n\n // Ignore the case where the source and target are the same enabled element\n if (targetElement === sourceElement) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n // Get the source and target viewports\n const sourceViewport = cornerstone.getViewport(sourceElement);\n const targetViewport = cornerstone.getViewport(targetElement);\n\n // Do nothing if the scale and translation are the same\n if (targetViewport.scale === sourceViewport.scale && targetViewport.translation.x === sourceViewport.translation.x && targetViewport.translation.y === sourceViewport.translation.y) {\n return;\n }\n\n // Scale and/or translation are different, sync them\n targetViewport.scale = sourceViewport.scale;\n targetViewport.translation.x = sourceViewport.translation.x;\n targetViewport.translation.y = sourceViewport.translation.y;\n synchronizer.setViewport(targetElement, targetViewport);\n}\n\n\n\n// WEBPACK FOOTER //\n// ./synchronization/panZoomSynchronizer.js","import { globalImageIdSpecificToolStateManager } from './imageIdSpecificStateManager.js';\nimport { getElementToolStateManager, setElementToolStateManager } from './toolState.js';\n\n// This implements an Stack specific tool state management strategy. This means\n// That tool data is shared between all imageIds in a given stack\nfunction newTimeSeriesSpecificToolStateManager (toolTypes, oldStateManager) {\n const toolState = {};\n\n // Here we add tool state, this is done by tools as well\n // As modules that restore saved state\n function addStackSpecificToolState (element, toolType, data) {\n // If this is a tool type to apply to the stack, do so\n if (toolTypes.indexOf(toolType) >= 0) {\n\n // If we don't have tool state for this type of tool, add an empty object\n if (toolState.hasOwnProperty(toolType) === false) {\n toolState[toolType] = {\n data: []\n };\n }\n\n const toolData = toolState[toolType];\n\n // Finally, add this new tool to the state\n toolData.data.push(data);\n } else {\n // Call the imageId specific tool state manager\n return oldStateManager.add(element, toolType, data);\n }\n }\n\n // Here you can get state - used by tools as well as modules\n // That save state persistently\n function getStackSpecificToolState (element, toolType) {\n // If this is a tool type to apply to the stack, do so\n if (toolTypes.indexOf(toolType) >= 0) {\n // If we don't have tool state for this type of tool, add an empty object\n if (toolState.hasOwnProperty(toolType) === false) {\n toolState[toolType] = {\n data: []\n };\n }\n\n return toolState[toolType];\n }\n\n // Call the imageId specific tool state manager\n return oldStateManager.get(element, toolType);\n }\n\n const imageIdToolStateManager = {\n get: getStackSpecificToolState,\n add: addStackSpecificToolState\n };\n\n\n return imageIdToolStateManager;\n}\n\nconst timeSeriesStateManagers = [];\n\nfunction addTimeSeriesStateManager (element, tools) {\n tools = tools || ['timeSeries'];\n let oldStateManager = getElementToolStateManager(element);\n\n if (oldStateManager === undefined) {\n oldStateManager = globalImageIdSpecificToolStateManager;\n }\n\n const timeSeriesSpecificStateManager = newTimeSeriesSpecificToolStateManager(tools, oldStateManager);\n\n timeSeriesStateManagers.push(timeSeriesSpecificStateManager);\n setElementToolStateManager(element, timeSeriesSpecificStateManager);\n}\n\nexport {\n addTimeSeriesStateManager,\n newTimeSeriesSpecificToolStateManager\n};\n\n\n\n// WEBPACK FOOTER //\n// ./stateManagement/timeSeriesSpecificStateManager.js","import { globalImageIdSpecificToolStateManager } from './imageIdSpecificStateManager.js';\nimport { getElementToolStateManager, setElementToolStateManager } from './toolState.js';\n\n// This implements an Stack specific tool state management strategy. This means\n// That tool data is shared between all imageIds in a given stack\nfunction newStackSpecificToolStateManager (toolTypes, oldStateManager) {\n let toolState = {};\n\n function saveToolState () {\n return toolState;\n }\n\n function restoreToolState (stackToolState) {\n toolState = stackToolState;\n }\n\n // Here we add tool state, this is done by tools as well\n // As modules that restore saved state\n function addStackSpecificToolState (element, toolType, data) {\n // If this is a tool type to apply to the stack, do so\n if (toolTypes.indexOf(toolType) >= 0) {\n\n // If we don't have tool state for this type of tool, add an empty object\n if (toolState.hasOwnProperty(toolType) === false) {\n toolState[toolType] = {\n data: []\n };\n }\n\n const toolData = toolState[toolType];\n\n // Finally, add this new tool to the state\n toolData.data.push(data);\n } else {\n // Call the imageId specific tool state manager\n return oldStateManager.add(element, toolType, data);\n }\n }\n\n // Here you can get state - used by tools as well as modules\n // That save state persistently\n function getStackSpecificToolState (element, toolType) {\n // If this is a tool type to apply to the stack, do so\n if (toolTypes.indexOf(toolType) >= 0) {\n // If we don't have tool state for this type of tool, add an empty object\n if (toolState.hasOwnProperty(toolType) === false) {\n toolState[toolType] = {\n data: []\n };\n }\n\n return toolState[toolType];\n }\n\n // Call the imageId specific tool state manager\n return oldStateManager.get(element, toolType);\n\n }\n\n const stackSpecificToolStateManager = {\n get: getStackSpecificToolState,\n add: addStackSpecificToolState,\n saveToolState,\n restoreToolState,\n toolState\n };\n\n\n return stackSpecificToolStateManager;\n}\n\nconst stackStateManagers = [];\n\nfunction addStackStateManager (element, otherTools) {\n let oldStateManager = getElementToolStateManager(element);\n\n if (!oldStateManager) {\n oldStateManager = globalImageIdSpecificToolStateManager;\n }\n\n let stackTools = ['stack', 'stackPrefetch', 'playClip', 'volume', 'slab', 'referenceLines', 'crosshairs', 'stackRenderer'];\n\n if (otherTools) {\n stackTools = stackTools.concat(otherTools);\n }\n\n const stackSpecificStateManager = newStackSpecificToolStateManager(stackTools, oldStateManager);\n\n stackStateManagers.push(stackSpecificStateManager);\n setElementToolStateManager(element, stackSpecificStateManager);\n}\n\nconst stackSpecificStateManager = {\n newStackSpecificToolStateManager,\n addStackStateManager\n};\n\nexport {\n stackSpecificStateManager,\n newStackSpecificToolStateManager,\n addStackStateManager\n};\n\n\n\n// WEBPACK FOOTER //\n// ./stateManagement/stackSpecificStateManager.js","// This implements a frame-of-reference specific tool state management strategy. This means that\n// Measurement data are tied to a specific frame of reference UID and only visible to objects using\n// That frame-of-reference UID\n\nfunction newFrameOfReferenceSpecificToolStateManager () {\n const toolState = {};\n\n // Here we add tool state, this is done by tools as well\n // As modules that restore saved state\n function addFrameOfReferenceSpecificToolState (frameOfReference, toolType, data) {\n // If we don't have any tool state for this frameOfReference, add an empty object\n if (toolState.hasOwnProperty(frameOfReference) === false) {\n toolState[frameOfReference] = {};\n }\n\n const frameOfReferenceToolState = toolState[frameOfReference];\n\n // If we don't have tool state for this type of tool, add an empty object\n if (frameOfReferenceToolState.hasOwnProperty(toolType) === false) {\n frameOfReferenceToolState[toolType] = {\n data: []\n };\n }\n\n const toolData = frameOfReferenceToolState[toolType];\n\n // Finally, add this new tool to the state\n toolData.data.push(data);\n }\n\n // Here you can get state - used by tools as well as modules\n // That save state persistently\n function getFrameOfReferenceSpecificToolState (frameOfReference, toolType) {\n // If we don't have any tool state for this frame of reference, return undefined\n if (toolState.hasOwnProperty(frameOfReference) === false) {\n return;\n }\n\n const frameOfReferenceToolState = toolState[frameOfReference];\n\n // If we don't have tool state for this type of tool, return undefined\n if (frameOfReferenceToolState.hasOwnProperty(toolType) === false) {\n return;\n }\n\n const toolData = frameOfReferenceToolState[toolType];\n\n\n return toolData;\n }\n\n function removeFrameOfReferenceSpecificToolState (frameOfReference, toolType, data) {\n // If we don't have any tool state for this frame of reference, return undefined\n if (toolState.hasOwnProperty(frameOfReference) === false) {\n return;\n }\n\n const frameOfReferenceToolState = toolState[frameOfReference];\n\n // If we don't have tool state for this type of tool, return undefined\n if (frameOfReferenceToolState.hasOwnProperty(toolType) === false) {\n return;\n }\n\n const toolData = frameOfReferenceToolState[toolType];\n // Find this tool data\n let indexOfData = -1;\n\n for (let i = 0; i < toolData.data.length; i++) {\n if (toolData.data[i] === data) {\n indexOfData = i;\n }\n }\n\n if (indexOfData !== -1) {\n toolData.data.splice(indexOfData, 1);\n }\n }\n\n return {\n get: getFrameOfReferenceSpecificToolState,\n add: addFrameOfReferenceSpecificToolState,\n remove: removeFrameOfReferenceSpecificToolState\n };\n}\n\n// A global frameOfReferenceSpecificToolStateManager - the most common case is to share 3d information\n// Between stacks of images\nconst globalFrameOfReferenceSpecificToolStateManager = newFrameOfReferenceSpecificToolStateManager();\n\nexport {\n newFrameOfReferenceSpecificToolStateManager,\n globalFrameOfReferenceSpecificToolStateManager\n};\n\n\n\n// WEBPACK FOOTER //\n// ./stateManagement/frameOfReferenceStateManager.js","import external from '../externalModules.js';\nimport { globalImageIdSpecificToolStateManager } from './imageIdSpecificStateManager.js';\nimport { getElementToolStateManager } from './toolState.js';\n\nfunction saveApplicationState (elements) {\n // Save imageId-specific tool state data\n const appState = {\n imageIdToolState: globalImageIdSpecificToolStateManager.saveToolState(),\n elementToolState: {},\n elementViewport: {}\n };\n\n // For each of the given elements, save the viewport and any stack-specific tool data\n elements.forEach(function (element) {\n const toolStateManager = getElementToolStateManager(element);\n\n if (toolStateManager === globalImageIdSpecificToolStateManager) {\n return;\n }\n\n appState.elementToolState[element.id] = toolStateManager.saveToolState();\n\n appState.elementViewport[element.id] = external.cornerstone.getViewport(element);\n });\n\n return appState;\n}\n\nfunction restoreApplicationState (appState) {\n if (!appState.hasOwnProperty('imageIdToolState') ||\n !appState.hasOwnProperty('elementToolState') ||\n !appState.hasOwnProperty('elementViewport')) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n\n // Restore all the imageId specific tool data\n globalImageIdSpecificToolStateManager.restoreToolState(appState.imageIdToolState);\n\n Object.keys(appState.elementViewport).forEach(function (elementId) {\n // Restore any stack specific tool data\n const element = document.getElementById(elementId);\n\n if (!element) {\n return;\n }\n\n if (!appState.elementToolState.hasOwnProperty(elementId)) {\n return;\n }\n\n const toolStateManager = getElementToolStateManager(element);\n\n if (toolStateManager === globalImageIdSpecificToolStateManager) {\n return;\n }\n\n toolStateManager.restoreToolState(appState.elementToolState[elementId]);\n\n // Restore the saved viewport information\n const savedViewport = appState.elementViewport[elementId];\n\n cornerstone.setViewport(element, savedViewport);\n\n // Update the element to apply the viewport and tool changes\n cornerstone.updateImage(element);\n });\n\n return appState;\n}\n\nconst appState = {\n save: saveApplicationState,\n restore: restoreApplicationState\n};\n\nexport default appState;\n\n\n\n// WEBPACK FOOTER //\n// ./stateManagement/appState.js","import scroll from '../util/scroll.js';\nimport keyboardTool from '../imageTools/keyboardTool.js';\n\nconst keys = {\n UP: 38,\n DOWN: 40\n};\n\nfunction keyDownCallback (e) {\n const eventData = e.detail;\n const keyCode = eventData.keyCode;\n\n if (keyCode !== keys.UP && keyCode !== keys.DOWN) {\n return;\n }\n\n let images = 1;\n\n if (keyCode === keys.DOWN) {\n images = -1;\n }\n\n scroll(eventData.element, images);\n}\n\n// Module/private exports\nconst stackScrollKeyboard = keyboardTool(keyDownCallback);\n\nexport default stackScrollKeyboard;\n\n\n\n// WEBPACK FOOTER //\n// ./stackTools/stackScrollKeyboard.js","import EVENTS from '../events.js';\nimport touchDragTool from '../imageTools/touchDragTool.js';\nimport multiTouchDragTool from '../imageTools/multiTouchDragTool.js';\nimport simpleMouseButtonTool from '../imageTools/simpleMouseButtonTool.js';\nimport mouseWheelTool from '../imageTools/mouseWheelTool.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport scroll from '../util/scroll.js';\nimport { getToolState } from '../stateManagement/toolState.js';\nimport { setToolOptions, getToolOptions } from '../toolOptions.js';\n\nconst toolType = 'stackScroll';\n\nfunction mouseUpCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n element.removeEventListener(EVENTS.MOUSE_DRAG, dragCallback);\n element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n}\n\nfunction mouseDownCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const options = getToolOptions(toolType, element);\n\n if (isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) {\n options.deltaY = 0;\n\n setToolOptions(toolType, element, options);\n\n element.addEventListener(EVENTS.MOUSE_DRAG, dragCallback);\n element.addEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.addEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n e.stopImmediatePropagation();\n\n return false;\n }\n}\n\nfunction mouseWheelCallback (e) {\n const eventData = e.detail;\n const images = -eventData.direction;\n\n const config = stackScroll.getConfiguration();\n\n let loop = false;\n\n if (config && config.loop) {\n loop = config.loop;\n }\n\n scroll(eventData.element, images, loop);\n}\n\nfunction dragCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n const toolData = getToolState(element, 'stack');\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n const stackData = toolData.data[0];\n\n const config = stackScroll.getConfiguration();\n\n // The Math.max here makes it easier to mouseDrag-scroll small or really large image stacks\n let pixelsPerImage = Math.max(2, element.offsetHeight / Math.max(stackData.imageIds.length, 8));\n\n if (config && config.stackScrollSpeed) {\n pixelsPerImage = config.stackScrollSpeed;\n }\n\n const options = getToolOptions(toolType, element);\n let deltaY = options.deltaY || 0;\n\n deltaY += eventData.deltaPoints.page.y;\n\n if (Math.abs(deltaY) >= pixelsPerImage) {\n const imageIdIndexOffset = Math.round(deltaY / pixelsPerImage);\n\n scroll(element, imageIdIndexOffset);\n\n options.deltaY = deltaY % pixelsPerImage;\n } else {\n options.deltaY = deltaY;\n }\n\n setToolOptions(toolType, element, options);\n\n e.preventDefault();\n e.stopPropagation();\n}\n\n// Module/private exports\nconst stackScroll = simpleMouseButtonTool(mouseDownCallback, toolType);\nconst stackScrollWheel = mouseWheelTool(mouseWheelCallback);\n\nconst options = {\n eventData: {\n deltaY: 0\n }\n};\nconst stackScrollTouchDrag = touchDragTool(dragCallback, toolType, options);\n\nfunction multiTouchDragCallback (e) {\n const eventData = e.detail;\n const config = stackScrollMultiTouch.getConfiguration();\n\n if (config && config.testPointers(eventData)) {\n dragCallback(e);\n }\n}\n\nconst configuration = {\n testPointers (eventData) {\n return (eventData.numPointers >= 3);\n }\n};\n\nconst stackScrollMultiTouch = multiTouchDragTool(multiTouchDragCallback, options);\n\nstackScrollMultiTouch.setConfiguration(configuration);\n\nexport {\n stackScroll,\n stackScrollWheel,\n stackScrollTouchDrag,\n stackScrollMultiTouch\n};\n\n\n\n// WEBPACK FOOTER //\n// ./stackTools/stackScroll.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport requestPoolManager from '../requestPool/requestPoolManager.js';\nimport loadHandlerManager from '../stateManagement/loadHandlerManager.js';\nimport { addToolState, getToolState } from '../stateManagement/toolState.js';\nimport { setMaxSimultaneousRequests } from '../util/getMaxSimultaneousRequests.js';\n\nconst toolType = 'stackPrefetch';\nconst requestType = 'prefetch';\n\nlet configuration = {\n maxImagesToPrefetch: Infinity\n};\n\nlet resetPrefetchTimeout;\nconst resetPrefetchDelay = 10;\n\nfunction range (lowEnd, highEnd) {\n // Javascript version of Python's range function\n // http://stackoverflow.com/questions/3895478/does-javascript-have-a-method-like-range-to-generate-an-array-based-on-suppl\n lowEnd = Math.round(lowEnd) || 0;\n highEnd = Math.round(highEnd) || 0;\n\n const arr = [];\n let c = highEnd - lowEnd + 1;\n\n if (c <= 0) {\n return arr;\n }\n\n while (c--) {\n arr[c] = highEnd--;\n }\n\n return arr;\n}\n\nconst max = function (arr) {\n return Math.max.apply(null, arr);\n};\n\nconst min = function (arr) {\n return Math.min.apply(null, arr);\n};\n\nfunction nearestIndex (arr, x) {\n // Return index of nearest values in array\n // http://stackoverflow.com/questions/25854212/return-index-of-nearest-values-in-an-array\n const l = [];\n const h = [];\n\n arr.forEach(function (v) {\n if (v < x) {\n l.push(v);\n } else if (v > x) {\n h.push(v);\n }\n });\n\n return {\n low: arr.indexOf(max(l)),\n high: arr.indexOf(min(h))\n };\n}\n\nfunction prefetch (element) {\n // Check to make sure stack data exists\n const stackData = getToolState(element, 'stack');\n\n if (!stackData || !stackData.data || !stackData.data.length) {\n return;\n }\n\n const stack = stackData.data[0];\n\n // Get the stackPrefetch tool data\n const stackPrefetchData = getToolState(element, toolType);\n\n if (!stackPrefetchData) {\n return;\n }\n\n const stackPrefetch = stackPrefetchData.data[0] || {};\n\n // If all the requests are complete, disable the stackPrefetch tool\n if (!stackPrefetch.indicesToRequest || !stackPrefetch.indicesToRequest.length) {\n stackPrefetch.enabled = false;\n }\n\n // Make sure the tool is still enabled\n if (stackPrefetch.enabled === false) {\n return;\n }\n\n // Remove an imageIdIndex from the list of indices to request\n // This fires when the individual image loading deferred is resolved\n function removeFromList (imageIdIndex) {\n const index = stackPrefetch.indicesToRequest.indexOf(imageIdIndex);\n\n if (index > -1) { // Don't remove last element if imageIdIndex not found\n stackPrefetch.indicesToRequest.splice(index, 1);\n }\n }\n\n // Remove all already cached images from the\n // IndicesToRequest array\n stackPrefetchData.data[0].indicesToRequest.sort((a, b) => (a - b));\n const indicesToRequestCopy = stackPrefetch.indicesToRequest.slice();\n\n indicesToRequestCopy.forEach(function (imageIdIndex) {\n const imageId = stack.imageIds[imageIdIndex];\n\n if (!imageId) {\n return;\n }\n\n const imageLoadObject = external.cornerstone.imageCache.getImageLoadObject(imageId);\n\n if (imageLoadObject) {\n removeFromList(imageIdIndex);\n }\n });\n\n // Stop here if there are no images left to request\n // After those in the cache have been removed\n if (!stackPrefetch.indicesToRequest.length) {\n return;\n }\n\n // Clear the requestPool of prefetch requests\n requestPoolManager.clearRequestStack(requestType);\n\n // Identify the nearest imageIdIndex to the currentImageIdIndex\n const nearest = nearestIndex(stackPrefetch.indicesToRequest, stack.currentImageIdIndex);\n\n let imageId;\n let nextImageIdIndex;\n const preventCache = false;\n\n function doneCallback (image) {\n // Console.log('prefetch done: ' + image.imageId);\n const imageIdIndex = stack.imageIds.indexOf(image.imageId);\n\n removeFromList(imageIdIndex);\n }\n\n // Retrieve the errorLoadingHandler if one exists\n const errorLoadingHandler = loadHandlerManager.getErrorLoadingHandler();\n\n function failCallback (error) {\n console.log(`prefetch errored: ${error}`);\n if (errorLoadingHandler) {\n errorLoadingHandler(element, imageId, error, 'stackPrefetch');\n }\n }\n\n // Prefetch images around the current image (before and after)\n let lowerIndex = nearest.low;\n let higherIndex = nearest.high;\n\n while (lowerIndex >= 0 || higherIndex < stackPrefetch.indicesToRequest.length) {\n const currentIndex = stack.currentImageIdIndex;\n const shouldSkipLower = currentIndex - stackPrefetch.indicesToRequest[lowerIndex] > configuration.maxImagesToPrefetch;\n const shouldSkipHigher = stackPrefetch.indicesToRequest[higherIndex] - currentIndex > configuration.maxImagesToPrefetch;\n\n const shouldLoadLower = !shouldSkipLower && lowerIndex >= 0;\n const shouldLoadHigher = !shouldSkipHigher && higherIndex < stackPrefetch.indicesToRequest.length;\n\n if (!shouldLoadHigher && !shouldLoadLower) {\n break;\n }\n\n if (shouldLoadLower) {\n nextImageIdIndex = stackPrefetch.indicesToRequest[lowerIndex--];\n imageId = stack.imageIds[nextImageIdIndex];\n requestPoolManager.addRequest(element, imageId, requestType, preventCache, doneCallback, failCallback);\n }\n\n if (shouldLoadHigher) {\n nextImageIdIndex = stackPrefetch.indicesToRequest[higherIndex++];\n imageId = stack.imageIds[nextImageIdIndex];\n requestPoolManager.addRequest(element, imageId, requestType, preventCache, doneCallback, failCallback);\n }\n\n }\n\n // Try to start the requestPool's grabbing procedure\n // In case it isn't already running\n requestPoolManager.startGrabbing();\n}\n\nfunction getPromiseRemovedHandler (element) {\n return function (e) {\n const eventData = e.detail;\n\n // When an imagePromise has been pushed out of the cache, re-add its index\n // It to the indicesToRequest list so that it will be retrieved later if the\n // CurrentImageIdIndex is changed to an image nearby\n let stackData;\n\n try {\n // It will throw an exception in some cases (eg: thumbnails)\n stackData = getToolState(element, 'stack');\n } catch(error) {\n return;\n }\n\n if (!stackData || !stackData.data || !stackData.data.length) {\n return;\n }\n\n const stack = stackData.data[0];\n const imageIdIndex = stack.imageIds.indexOf(eventData.imageId);\n\n // Make sure the image that was removed is actually in this stack\n // Before adding it to the indicesToRequest array\n if (imageIdIndex < 0) {\n return;\n }\n\n const stackPrefetchData = getToolState(element, toolType);\n\n if (!stackPrefetchData || !stackPrefetchData.data || !stackPrefetchData.data.length) {\n return;\n }\n\n stackPrefetchData.data[0].indicesToRequest.push(imageIdIndex);\n };\n}\n\nfunction onImageUpdated (e) {\n // Start prefetching again (after a delay)\n // When the user has scrolled to a new image\n clearTimeout(resetPrefetchTimeout);\n resetPrefetchTimeout = setTimeout(function () {\n const element = e.target;\n\n // If playClip is enabled and the user loads a different series in the viewport\n // An exception will be thrown because the element will not be enabled anymore\n try {\n prefetch(element);\n } catch(error) {\n return;\n }\n\n }, resetPrefetchDelay);\n}\n\nfunction enable (element) {\n // Clear old prefetch data. Skipping this can cause problems when changing the series inside an element\n const stackPrefetchDataArray = getToolState(element, toolType);\n\n stackPrefetchDataArray.data = [];\n\n // First check that there is stack data available\n const stackData = getToolState(element, 'stack');\n\n if (!stackData || !stackData.data || !stackData.data.length) {\n return;\n }\n\n const stack = stackData.data[0];\n\n // Check if we are allowed to cache images in this stack\n if (stack.preventCache === true) {\n console.warn('A stack that should not be cached was given the stackPrefetch');\n\n return;\n }\n\n // Use the currentImageIdIndex from the stack as the initalImageIdIndex\n const stackPrefetchData = {\n indicesToRequest: range(0, stack.imageIds.length - 1),\n enabled: true,\n direction: 1\n };\n\n // Remove the currentImageIdIndex from the list to request\n const indexOfCurrentImage = stackPrefetchData.indicesToRequest.indexOf(stack.currentImageIdIndex);\n\n stackPrefetchData.indicesToRequest.splice(indexOfCurrentImage, 1);\n\n addToolState(element, toolType, stackPrefetchData);\n\n prefetch(element);\n\n element.removeEventListener(EVENTS.NEW_IMAGE, onImageUpdated);\n element.addEventListener(EVENTS.NEW_IMAGE, onImageUpdated);\n\n const promiseRemovedHandler = getPromiseRemovedHandler(element);\n\n external.cornerstone.events.removeEventListener(EVENTS.IMAGE_CACHE_PROMISE_REMOVED, promiseRemovedHandler);\n external.cornerstone.events.addEventListener(EVENTS.IMAGE_CACHE_PROMISE_REMOVED, promiseRemovedHandler);\n}\n\nfunction disable (element) {\n clearTimeout(resetPrefetchTimeout);\n element.removeEventListener(EVENTS.NEW_IMAGE, onImageUpdated);\n\n const promiseRemovedHandler = getPromiseRemovedHandler(element);\n\n external.cornerstone.events.removeEventListener(EVENTS.IMAGE_CACHE_PROMISE_REMOVED, promiseRemovedHandler);\n\n const stackPrefetchData = getToolState(element, toolType);\n // If there is actually something to disable, disable it\n\n if (stackPrefetchData && stackPrefetchData.data.length) {\n stackPrefetchData.data[0].enabled = false;\n\n // Clear current prefetch requests from the requestPool\n requestPoolManager.clearRequestStack(requestType);\n }\n}\n\nfunction getConfiguration () {\n return configuration;\n}\n\nfunction setConfiguration (config) {\n configuration = config;\n\n if (config.maxSimultaneousRequests) {\n setMaxSimultaneousRequests(config.maxSimultaneousRequests);\n }\n}\n\n// Module/private exports\nconst stackPrefetch = {\n enable,\n disable,\n getConfiguration,\n setConfiguration\n};\n\nexport default stackPrefetch;\n\n\n\n// WEBPACK FOOTER //\n// ./stackTools/stackPrefetch.js","import displayTool from '../imageTools/displayTool.js';\nimport { getToolState } from '../stateManagement/toolState.js';\n\n/*\nDisplay scroll progress bar across bottom of image.\n */\nconst scrollBarHeight = 6;\n\nconst configuration = {\n backgroundColor: 'rgb(19, 63, 141)',\n fillColor: 'white',\n orientation: 'horizontal'\n};\n\nfunction onImageRendered (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const width = eventData.enabledElement.canvas.width;\n const height = eventData.enabledElement.canvas.height;\n\n if (!width || !height) {\n return false;\n }\n\n const context = eventData.enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n context.save();\n\n const config = scrollIndicator.getConfiguration();\n\n // Draw indicator background\n context.fillStyle = config.backgroundColor;\n if (config.orientation === 'horizontal') {\n context.fillRect(0, height - scrollBarHeight, width, scrollBarHeight);\n } else {\n context.fillRect(0, 0, scrollBarHeight, height);\n }\n\n // Get current image index\n const stackData = getToolState(element, 'stack');\n\n if (!stackData || !stackData.data || !stackData.data.length) {\n return;\n }\n\n const imageIds = stackData.data[0].imageIds;\n const currentImageIdIndex = stackData.data[0].currentImageIdIndex;\n\n // Draw current image cursor\n const cursorWidth = width / imageIds.length;\n const cursorHeight = height / imageIds.length;\n const xPosition = cursorWidth * currentImageIdIndex;\n const yPosition = cursorHeight * currentImageIdIndex;\n\n context.fillStyle = config.fillColor;\n if (config.orientation === 'horizontal') {\n context.fillRect(xPosition, height - scrollBarHeight, cursorWidth, scrollBarHeight);\n } else {\n context.fillRect(0, yPosition, scrollBarHeight, cursorHeight);\n }\n\n context.restore();\n}\n\nconst scrollIndicator = displayTool(onImageRendered);\n\nscrollIndicator.setConfiguration(configuration);\n\nexport default scrollIndicator;\n\n\n\n// WEBPACK FOOTER //\n// ./stackTools/scrollIndicator.js","import FusionRenderer from './fusionRenderer.js';\n\nconst stackRenderers = {};\n\nstackRenderers.FusionRenderer = FusionRenderer;\n\nexport default stackRenderers;\n\n\n\n// WEBPACK FOOTER //\n// ./stackTools/stackRenderers.js","import external from '../externalModules.js';\nimport { getToolState } from '../stateManagement/toolState.js';\n\nexport default class FusionRenderer {\n constructor () {\n this.currentImageIdIndex = 0;\n this.layerIds = [];\n this.findImageFn = undefined;\n }\n\n render (element, imageStacks) {\n // Move this to base Renderer class\n if (!Number.isInteger(this.currentImageIdIndex)) {\n throw new Error('FusionRenderer: render - Image ID Index is not an integer');\n }\n\n if (!this.findImageFn) {\n throw new Error('No findImage function has been defined');\n }\n\n if (!imageStacks) {\n const toolData = getToolState(element, 'stack');\n\n imageStacks = toolData.data;\n }\n // TODO: Figure out what to do with LoadHandlers in this scenario...\n\n const cornerstone = external.cornerstone;\n\n // For the base layer, go to the currentImageIdIndex\n const baseImageObject = imageStacks[0];\n const currentImageId = baseImageObject.imageIds[this.currentImageIdIndex];\n const overlayImageStacks = imageStacks.slice(1, imageStacks.length);\n\n cornerstone.loadAndCacheImage(currentImageId).then((baseImage) => {\n let baseLayerId = this.layerIds[0];\n\n // Get the base layer if one exists\n if (baseLayerId) {\n cornerstone.setLayerImage(element, baseImage, baseLayerId);\n } else {\n // Otherwise, create a new layer with the base layer's image\n baseLayerId = cornerstone.addLayer(element, baseImage, baseImageObject.options);\n this.layerIds.push(baseLayerId);\n }\n\n // Display the image immediately while the overlay images are identified\n cornerstone.displayImage(element, baseImage);\n\n // Loop through the remaining 'overlay' image stacks\n overlayImageStacks.forEach((imgObj, overlayLayerIndex) => {\n const imageId = this.findImageFn(imgObj.imageIds, currentImageId);\n const layerIndex = overlayLayerIndex + 1;\n let currentLayerId = this.layerIds[layerIndex];\n\n // If no layer exists yet for this overlaid stack, create\n // One and add it to the layerIds property for this instance\n // Of the fusion renderer.\n if (!currentLayerId) {\n currentLayerId = cornerstone.addLayer(element, undefined, imgObj.options);\n this.layerIds.push(currentLayerId);\n }\n\n if (imageId) {\n // If an imageId was returned from the findImage function,\n // Load it, make sure it's visible and update the layer\n // With the new image object.\n cornerstone.loadAndCacheImage(imageId).then((image) => {\n cornerstone.setLayerImage(element, image, currentLayerId);\n cornerstone.updateImage(element);\n });\n } else {\n // If no imageId was returned from the findImage function.\n // This means that there is no relevant image to display.\n cornerstone.setLayerImage(element, undefined, currentLayerId);\n cornerstone.setActiveLayer(element, baseLayerId);\n cornerstone.updateImage(element);\n }\n });\n });\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./stackTools/fusionRenderer.js","/* eslint no-bitwise:0 */\nimport EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport loadHandlerManager from '../stateManagement/loadHandlerManager.js';\nimport { addToolState, getToolState } from '../stateManagement/toolState.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nconst toolType = 'playClip';\n\n/**\n * [private] Turns a Frame Time Vector (0018,1065) array into a normalized array of timeouts. Each element\n * ... of the resulting array represents the amount of time each frame will remain on the screen.\n * @param {Array} vector A Frame Time Vector (0018,1065) as specified in section C.7.6.5.1.2 of DICOM standard.\n * @param {Number} speed A speed factor which will be applied to each element of the resulting array.\n * @return {Array} An array with timeouts for each animation frame.\n */\nfunction getPlayClipTimeouts (vector, speed) {\n\n let i;\n let sample;\n let delay;\n let sum = 0;\n const limit = vector.length;\n const timeouts = [];\n\n // Initialize time varying to false\n timeouts.isTimeVarying = false;\n\n if (typeof speed !== 'number' || speed <= 0) {\n speed = 1;\n }\n\n // First element of a frame time vector must be discarded\n for (i = 1; i < limit; i++) {\n delay = (Number(vector[i]) / speed) | 0; // Integral part only\n timeouts.push(delay);\n if (i === 1) { // Use first item as a sample for comparison\n sample = delay;\n } else if (delay !== sample) {\n timeouts.isTimeVarying = true;\n }\n\n sum += delay;\n }\n\n if (timeouts.length > 0) {\n if (timeouts.isTimeVarying) {\n // If it's a time varying vector, make the last item an average...\n delay = (sum / timeouts.length) | 0;\n } else {\n delay = timeouts[0];\n }\n\n timeouts.push(delay);\n }\n\n return timeouts;\n\n}\n\n/**\n * [private] Performs the heavy lifting of stopping an ongoing animation.\n * @param {Object} playClipData The data from playClip that needs to be stopped.\n * @return void\n */\nfunction stopClipWithData (playClipData) {\n const id = playClipData.intervalId;\n\n if (typeof id !== 'undefined') {\n playClipData.intervalId = undefined;\n if (playClipData.usingFrameTimeVector) {\n clearTimeout(id);\n } else {\n clearInterval(id);\n }\n }\n}\n\n/**\n * [private] Trigger playClip tool stop event.\n * @param element\n * @return void\n */\nfunction triggerStopEvent (element) {\n const eventDetail = {\n element\n };\n\n triggerEvent(element, EVENTS.CLIP_STOPPED, eventDetail);\n}\n\n/**\n * Starts playing a clip or adjusts the frame rate of an already playing clip. framesPerSecond is\n * optional and defaults to 30 if not specified. A negative framesPerSecond will play the clip in reverse.\n * The element must be a stack of images\n * @param element\n * @param framesPerSecond\n */\nfunction playClip (element, framesPerSecond) {\n let playClipData;\n let playClipTimeouts;\n\n if (element === undefined) {\n throw new Error('playClip: element must not be undefined');\n }\n\n const stackToolData = getToolState(element, 'stack');\n\n if (!stackToolData || !stackToolData.data || !stackToolData.data.length) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n // If we have more than one stack, check if we have a stack renderer defined\n let stackRenderer;\n\n if (stackToolData.data.length > 1) {\n const stackRendererData = getToolState(element, 'stackRenderer');\n\n if (stackRendererData && stackRendererData.data && stackRendererData.data.length) {\n stackRenderer = stackRendererData.data[0];\n }\n }\n\n const stackData = stackToolData.data[0];\n\n const playClipToolData = getToolState(element, toolType);\n\n if (!playClipToolData || !playClipToolData.data || !playClipToolData.data.length) {\n playClipData = {\n intervalId: undefined,\n framesPerSecond: 30,\n lastFrameTimeStamp: undefined,\n frameRate: 0,\n frameTimeVector: undefined,\n ignoreFrameTimeVector: false,\n usingFrameTimeVector: false,\n speed: 1,\n reverse: false,\n loop: true\n };\n addToolState(element, toolType, playClipData);\n } else {\n playClipData = playClipToolData.data[0];\n // Make sure the specified clip is not running before any property update\n stopClipWithData(playClipData);\n }\n\n // If a framesPerSecond is specified and is valid, update the playClipData now\n if (framesPerSecond < 0 || framesPerSecond > 0) {\n playClipData.framesPerSecond = Number(framesPerSecond);\n playClipData.reverse = playClipData.framesPerSecond < 0;\n // If framesPerSecond is given, frameTimeVector will be ignored...\n playClipData.ignoreFrameTimeVector = true;\n }\n\n // Determine if frame time vector should be used instead of a fixed frame rate...\n if (\n playClipData.ignoreFrameTimeVector !== true &&\n playClipData.frameTimeVector &&\n playClipData.frameTimeVector.length === stackData.imageIds.length\n ) {\n playClipTimeouts = getPlayClipTimeouts(playClipData.frameTimeVector, playClipData.speed);\n }\n\n // This function encapsulates the frame rendering logic...\n const playClipAction = () => {\n\n // Hoisting of context variables\n let loader,\n startLoadingHandler,\n endLoadingHandler,\n errorLoadingHandler,\n newImageIdIndex = stackData.currentImageIdIndex;\n\n const imageCount = stackData.imageIds.length;\n\n if (playClipData.reverse) {\n newImageIdIndex--;\n } else {\n newImageIdIndex++;\n }\n\n if (!playClipData.loop && (newImageIdIndex < 0 || newImageIdIndex >= imageCount)) {\n stopClipWithData(playClipData);\n triggerStopEvent(element);\n\n return;\n }\n\n // Loop around if we go outside the stack\n if (newImageIdIndex >= imageCount) {\n newImageIdIndex = 0;\n }\n\n if (newImageIdIndex < 0) {\n newImageIdIndex = imageCount - 1;\n }\n\n if (newImageIdIndex !== stackData.currentImageIdIndex) {\n\n startLoadingHandler = loadHandlerManager.getStartLoadHandler();\n endLoadingHandler = loadHandlerManager.getEndLoadHandler();\n errorLoadingHandler = loadHandlerManager.getErrorLoadingHandler();\n\n if (startLoadingHandler) {\n startLoadingHandler(element);\n }\n\n if (stackData.preventCache === true) {\n loader = cornerstone.loadImage(stackData.imageIds[newImageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(stackData.imageIds[newImageIdIndex]);\n }\n\n loader.then(function (image) {\n try {\n stackData.currentImageIdIndex = newImageIdIndex;\n if (stackRenderer) {\n stackRenderer.currentImageIdIndex = newImageIdIndex;\n stackRenderer.render(element, stackToolData.data);\n } else {\n cornerstone.displayImage(element, image);\n }\n if (endLoadingHandler) {\n endLoadingHandler(element, image);\n }\n } catch (error) {\n return;\n }\n }, function (error) {\n const imageId = stackData.imageIds[newImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(element, imageId, error);\n }\n });\n\n }\n\n };\n\n // If playClipTimeouts array is available, not empty and its elements are NOT uniform ...\n // ... (at least one timeout is different from the others), use alternate setTimeout implementation\n if (playClipTimeouts && playClipTimeouts.length > 0 && playClipTimeouts.isTimeVarying) {\n playClipData.usingFrameTimeVector = true;\n playClipData.intervalId = setTimeout(function playClipTimeoutHandler () {\n playClipData.intervalId = setTimeout(playClipTimeoutHandler, playClipTimeouts[stackData.currentImageIdIndex]);\n playClipAction();\n }, 0);\n } else {\n // ... otherwise user setInterval implementation which is much more efficient.\n playClipData.usingFrameTimeVector = false;\n playClipData.intervalId = setInterval(playClipAction, 1000 / Math.abs(playClipData.framesPerSecond));\n }\n\n}\n\n/**\n * Stops an already playing clip.\n * * @param element\n */\nfunction stopClip (element) {\n\n const playClipToolData = getToolState(element, toolType);\n\n if (!playClipToolData || !playClipToolData.data || !playClipToolData.data.length) {\n return;\n }\n\n stopClipWithData(playClipToolData.data[0]);\n\n}\n\nexport {\n playClip,\n stopClip\n};\n\n\n\n// WEBPACK FOOTER //\n// ./stackTools/playClip.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nlet mouseX;\nlet mouseY;\n\nfunction keyPress (e) {\n const cornerstone = external.cornerstone;\n const element = e.currentTarget;\n\n const keyPressData = {\n event: window.event || e, // Old IE support\n element,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n currentPoints: {\n page: {\n x: mouseX,\n y: mouseY\n },\n image: cornerstone.pageToPixel(element, mouseX, mouseY)\n },\n keyCode: e.keyCode,\n which: e.which\n };\n\n keyPressData.currentPoints.canvas = cornerstone.pixelToCanvas(element, keyPressData.currentPoints.image);\n\n const keyPressEvents = {\n keydown: EVENTS.KEY_DOWN,\n keypress: EVENTS.KEY_PRESS,\n keyup: EVENTS.KEY_UP\n };\n\n triggerEvent(element, keyPressEvents[e.type], keyPressData);\n}\n\nfunction mouseMove (e) {\n mouseX = e.pageX;\n mouseY = e.pageY;\n}\n\nconst keyboardEvents = ['keydown', 'keypress', 'keyup'];\n\nfunction enable (element) {\n keyboardEvents.forEach((eventType) => {\n element.removeEventListener(eventType, keyPress);\n element.addEventListener(eventType, keyPress);\n });\n\n element.removeEventListener('mousemove', mouseMove);\n element.addEventListener('mousemove', mouseMove);\n}\n\nfunction disable (element) {\n keyboardEvents.forEach((eventType) => {\n element.removeEventListener(eventType, keyPress);\n });\n\n element.removeEventListener('mousemove', mouseMove);\n}\n\n// Module exports\nconst keyboardInput = {\n enable,\n disable\n};\n\nexport default keyboardInput;\n\n\n\n// WEBPACK FOOTER //\n// ./inputSources/keyboardInput.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport copyPoints from '../util/copyPoints.js';\nimport pauseEvent from '../util/pauseEvent.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nlet isClickEvent = true;\nlet preventClickTimeout;\nconst clickDelay = 200;\n\nfunction getEventWhich (event) {\n if (typeof event.buttons !== 'number') {\n return event.which;\n }\n\n if (event.buttons === 0) {\n return 0;\n } else if (event.buttons % 2 === 1) {\n return 1;\n } else if (event.buttons % 4 === 2) {\n return 3;\n } else if (event.buttons % 8 === 4) {\n return 2;\n }\n\n return 0;\n}\n\nfunction preventClickHandler () {\n isClickEvent = false;\n}\n\nfunction mouseDoubleClick (e) {\n const cornerstone = external.cornerstone;\n const element = e.currentTarget;\n const eventType = EVENTS.MOUSE_DOUBLE_CLICK;\n\n const startPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e),\n image: cornerstone.pageToPixel(element, e.pageX, e.pageY),\n client: {\n x: e.clientX,\n y: e.clientY\n }\n };\n\n startPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image);\n\n const lastPoints = copyPoints(startPoints);\n\n\n /* Note: It seems we can't trust MouseEvent.buttons for dblclick events?\n\n For some reason they are always firing with e.buttons = 0\n so we have to use e.which for now instead.\n\n Might be related to using preventDefault on the original mousedown or click events?\n */\n const eventData = {\n event: e,\n which: e.which,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n startPoints,\n lastPoints,\n currentPoints: startPoints,\n deltaPoints: {\n x: 0,\n y: 0\n },\n type: eventType\n };\n\n triggerEvent(element, eventType, eventData);\n}\n\nfunction mouseDown (e) {\n preventClickTimeout = setTimeout(preventClickHandler, clickDelay);\n\n const cornerstone = external.cornerstone;\n const element = e.currentTarget;\n const eventType = EVENTS.MOUSE_DOWN;\n\n // Prevent CornerstoneToolsMouseMove while mouse is down\n element.removeEventListener('mousemove', mouseMove);\n\n const startPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e),\n image: cornerstone.pageToPixel(element, e.pageX, e.pageY),\n client: {\n x: e.clientX,\n y: e.clientY\n }\n };\n\n startPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image);\n\n let lastPoints = copyPoints(startPoints);\n const eventData = {\n event: e,\n which: getEventWhich(e),\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n startPoints,\n lastPoints,\n currentPoints: startPoints,\n deltaPoints: {\n x: 0,\n y: 0\n },\n type: eventType\n };\n\n const eventPropagated = triggerEvent(eventData.element, eventType, eventData);\n\n if (eventPropagated) {\n // No tools responded to this event, create a new tool\n eventData.type = EVENTS.MOUSE_DOWN_ACTIVATE;\n triggerEvent(eventData.element, EVENTS.MOUSE_DOWN_ACTIVATE, eventData);\n }\n\n const whichMouseButton = getEventWhich(e);\n\n function onMouseMove (e) {\n // Calculate our current points in page and image coordinates\n const eventType = EVENTS.MOUSE_DRAG;\n const currentPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e),\n image: cornerstone.pageToPixel(element, e.pageX, e.pageY),\n client: {\n x: e.clientX,\n y: e.clientY\n }\n };\n\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n\n // Calculate delta values in page and image coordinates\n const deltaPoints = {\n page: external.cornerstoneMath.point.subtract(currentPoints.page, lastPoints.page),\n image: external.cornerstoneMath.point.subtract(currentPoints.image, lastPoints.image),\n client: external.cornerstoneMath.point.subtract(currentPoints.client, lastPoints.client),\n canvas: external.cornerstoneMath.point.subtract(currentPoints.canvas, lastPoints.canvas)\n };\n\n const eventData = {\n which: whichMouseButton,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n startPoints,\n lastPoints,\n currentPoints,\n deltaPoints,\n type: eventType,\n ctrlKey: e.ctrlKey,\n metaKey: e.metaKey,\n shiftKey: e.shiftKey\n };\n\n triggerEvent(eventData.element, eventType, eventData);\n\n // Update the last points\n lastPoints = copyPoints(currentPoints);\n\n // Prevent left click selection of DOM elements\n return pauseEvent(e);\n }\n\n // Hook mouseup so we can unbind our event listeners\n // When they stop dragging\n function onMouseUp (e) {\n // Cancel the timeout preventing the click event from triggering\n clearTimeout(preventClickTimeout);\n\n let eventType = EVENTS.MOUSE_UP;\n\n if (isClickEvent) {\n eventType = EVENTS.MOUSE_CLICK;\n }\n\n // Calculate our current points in page and image coordinates\n const currentPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e),\n image: cornerstone.pageToPixel(element, e.pageX, e.pageY),\n client: {\n x: e.clientX,\n y: e.clientY\n }\n };\n\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n\n // Calculate delta values in page and image coordinates\n const deltaPoints = {\n page: external.cornerstoneMath.point.subtract(currentPoints.page, lastPoints.page),\n image: external.cornerstoneMath.point.subtract(currentPoints.image, lastPoints.image),\n client: external.cornerstoneMath.point.subtract(currentPoints.client, lastPoints.client),\n canvas: external.cornerstoneMath.point.subtract(currentPoints.canvas, lastPoints.canvas)\n };\n\n const eventData = {\n event: e,\n which: whichMouseButton,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n startPoints,\n lastPoints,\n currentPoints,\n deltaPoints,\n type: eventType\n };\n\n triggerEvent(eventData.element, eventType, eventData);\n\n document.removeEventListener('mousemove', onMouseMove);\n document.removeEventListener('mouseup', onMouseUp);\n\n element.addEventListener('mousemove', mouseMove);\n\n isClickEvent = true;\n }\n\n document.addEventListener('mousemove', onMouseMove);\n document.addEventListener('mouseup', onMouseUp);\n\n return pauseEvent(e);\n}\n\nfunction mouseMove (e) {\n const cornerstone = external.cornerstone;\n const element = e.currentTarget;\n const eventType = EVENTS.MOUSE_MOVE;\n\n const startPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e),\n image: cornerstone.pageToPixel(element, e.pageX, e.pageY),\n client: {\n x: e.clientX,\n y: e.clientY\n }\n };\n\n startPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image);\n\n let lastPoints = copyPoints(startPoints);\n\n // Calculate our current points in page and image coordinates\n const currentPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e),\n image: cornerstone.pageToPixel(element, e.pageX, e.pageY),\n client: {\n x: e.clientX,\n y: e.clientY\n }\n };\n\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n\n // Calculate delta values in page and image coordinates\n const deltaPoints = {\n page: external.cornerstoneMath.point.subtract(currentPoints.page, lastPoints.page),\n image: external.cornerstoneMath.point.subtract(currentPoints.image, lastPoints.image),\n client: external.cornerstoneMath.point.subtract(currentPoints.client, lastPoints.client),\n canvas: external.cornerstoneMath.point.subtract(currentPoints.canvas, lastPoints.canvas)\n };\n\n const eventData = {\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n startPoints,\n lastPoints,\n currentPoints,\n deltaPoints,\n type: eventType\n };\n\n triggerEvent(element, eventType, eventData);\n\n // Update the last points\n lastPoints = copyPoints(currentPoints);\n}\n\nfunction disable (element) {\n element.removeEventListener('mousedown', mouseDown);\n element.removeEventListener('mousemove', mouseMove);\n element.removeEventListener('dblclick', mouseDoubleClick);\n}\n\nfunction enable (element) {\n // Prevent handlers from being attached multiple times\n disable(element);\n\n element.addEventListener('mousedown', mouseDown);\n element.addEventListener('mousemove', mouseMove);\n element.addEventListener('dblclick', mouseDoubleClick);\n}\n\n// Module exports\nconst mouseInput = {\n enable,\n disable\n};\n\nexport default mouseInput;\n\n\n\n// WEBPACK FOOTER //\n// ./inputSources/mouseInput.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport triggerEvent from '../util/triggerEvent.js';\n\nfunction mouseWheel (e) {\n // !!!HACK/NOTE/WARNING!!!\n // For some reason I am getting mousewheel and DOMMouseScroll events on my\n // Mac os x mavericks system when middle mouse button dragging.\n // I couldn't find any info about this so this might break other systems\n // Webkit hack\n if (e.type === 'mousewheel' && e.wheelDeltaY === 0) {\n return;\n }\n // Firefox hack\n if (e.type === 'DOMMouseScroll' && e.axis === 1) {\n return;\n }\n\n e.preventDefault();\n\n const cornerstone = external.cornerstone;\n const element = e.currentTarget;\n\n let x;\n let y;\n\n if (e.pageX !== undefined && e.pageY !== undefined) {\n x = e.pageX;\n y = e.pageY;\n } else {\n // IE9 & IE10\n x = e.x;\n y = e.y;\n }\n\n const startingCoords = cornerstone.pageToPixel(element, x, y);\n\n e = (window.event && window.event.wheelDelta) ? window.event : e; // Old IE support\n\n let wheelDelta;\n\n if (e.wheelDelta) {\n wheelDelta = -e.wheelDelta;\n } else if (e.deltaY) {\n wheelDelta = -e.deltaY;\n } else if (e.detail) {\n wheelDelta = -e.detail;\n } else {\n wheelDelta = e.wheelDelta;\n }\n\n const direction = wheelDelta < 0 ? -1 : 1;\n\n const mouseWheelData = {\n element,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n direction,\n pageX: x,\n pageY: y,\n imageX: startingCoords.x,\n imageY: startingCoords.y\n };\n\n triggerEvent(element, EVENTS.MOUSE_WHEEL, mouseWheelData);\n}\n\nconst mouseWheelEvents = ['mousewheel', 'DOMMouseScroll'];\n\nfunction enable (element) {\n // Prevent handlers from being attached multiple times\n disable(element);\n\n mouseWheelEvents.forEach((eventType) => {\n element.addEventListener(eventType, mouseWheel);\n });\n}\n\nfunction disable (element) {\n mouseWheelEvents.forEach((eventType) => {\n element.removeEventListener(eventType, mouseWheel);\n });\n}\n\n// Module exports\nconst mouseWheelInput = {\n enable,\n disable\n};\n\nexport default mouseWheelInput;\n\n\n\n// WEBPACK FOOTER //\n// ./inputSources/mouseWheelInput.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport copyPoints from '../util/copyPoints.js';\nimport pauseEvent from '../util/pauseEvent.js';\nimport preventGhostClick from '../inputSources/preventGhostClick.js';\nimport triggerEvent from '../util/triggerEvent.js';\nimport { setToolOptions, getToolOptions } from '../toolOptions.js';\n\nlet startPoints,\n currentPoints,\n lastPoints,\n deltaPoints,\n eventData,\n touchStartDelay,\n pressTimeout,\n pageDistanceMoved;\n\nlet lastScale = 1.0,\n lastRotation = 0.0,\n preventNextPinch = false,\n isPress = false,\n lastDelta;\n\nconst pressDelay = 700,\n pressMaxDistance = 5;\n\nconst toolType = 'touchInput';\n\nfunction onTouch (e) {\n const cornerstone = external.cornerstone;\n const element = e.currentTarget || e.srcEvent.currentTarget;\n let eventType,\n scaleChange,\n delta,\n remainingPointers,\n rotation;\n\n // Prevent mouse events from occurring alongside touch events\n e.preventDefault();\n\n // If more than one finger is placed on the element, stop the press timeout\n if ((e.pointers && e.pointers.length > 1) || (e.touches && e.touches.length > 1)) {\n isPress = false;\n clearTimeout(pressTimeout);\n }\n\n switch (e.type) {\n case 'tap':\n isPress = false;\n clearTimeout(pressTimeout);\n\n // Calculate our current points in page and image coordinates\n currentPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e.pointers[0]),\n image: cornerstone.pageToPixel(element, e.pointers[0].pageX, e.pointers[0].pageY),\n client: {\n x: e.pointers[0].clientX,\n y: e.pointers[0].clientY\n }\n };\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n\n eventType = EVENTS.TAP;\n eventData = {\n event: e,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n currentPoints,\n type: eventType,\n isTouchEvent: true\n };\n\n triggerEvent(element, eventType, eventData);\n break;\n\n case 'doubletap':\n isPress = false;\n clearTimeout(pressTimeout);\n\n // Calculate our current points in page and image coordinates\n currentPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e.pointers[0]),\n image: cornerstone.pageToPixel(element, e.pointers[0].pageX, e.pointers[0].pageY),\n client: {\n x: e.pointers[0].clientX,\n y: e.pointers[0].clientY\n }\n };\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n\n eventType = EVENTS.DOUBLE_TAP;\n eventData = {\n event: e,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n currentPoints,\n type: eventType,\n isTouchEvent: true\n };\n\n triggerEvent(element, eventType, eventData);\n break;\n\n case 'pinchstart':\n isPress = false;\n clearTimeout(pressTimeout);\n\n lastScale = 1.0;\n break;\n\n case 'pinchmove':\n isPress = false;\n clearTimeout(pressTimeout);\n\n if (preventNextPinch === true) {\n lastScale = e.scale;\n preventNextPinch = false;\n break;\n }\n\n scaleChange = (e.scale - lastScale) / lastScale;\n\n startPoints = {\n page: e.center,\n image: cornerstone.pageToPixel(element, e.center.x, e.center.y)\n };\n startPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image);\n\n eventType = EVENTS.TOUCH_PINCH;\n eventData = {\n event: e,\n startPoints,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n direction: e.scale < 1 ? 1 : -1,\n scaleChange,\n type: eventType,\n isTouchEvent: true\n };\n\n triggerEvent(element, eventType, eventData);\n\n lastScale = e.scale;\n break;\n\n case 'touchstart':\n lastScale = 1.0;\n\n clearTimeout(pressTimeout);\n\n clearTimeout(touchStartDelay);\n touchStartDelay = setTimeout(function () {\n startPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e.touches[0]),\n image: cornerstone.pageToPixel(element, e.touches[0].pageX, e.touches[0].pageY),\n client: {\n x: e.touches[0].clientX,\n y: e.touches[0].clientY\n }\n };\n startPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image);\n\n eventType = EVENTS.TOUCH_START;\n if (e.touches.length > 1) {\n eventType = EVENTS.MULTI_TOUCH_START;\n }\n\n eventData = {\n event: e,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n startPoints,\n currentPoints: startPoints,\n type: eventType,\n isTouchEvent: true\n };\n\n const eventPropagated = triggerEvent(element, eventType, eventData);\n\n if (eventPropagated === true) {\n // IsPress = false;\n // ClearTimeout(pressTimeout);\n\n // No current tools responded to the drag action.\n // Create new tool measurement\n eventType = EVENTS.TOUCH_START_ACTIVE;\n if (e.touches.length > 1) {\n eventType = EVENTS.MULTI_TOUCH_START_ACTIVE;\n }\n\n eventData.type = eventType;\n triggerEvent(element, eventType, eventData);\n }\n\n // Console.log(eventType);\n lastPoints = copyPoints(startPoints);\n }, 50);\n\n isPress = true;\n pageDistanceMoved = 0;\n pressTimeout = setTimeout(function () {\n if (!isPress) {\n return;\n }\n\n currentPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e.touches[0]),\n image: cornerstone.pageToPixel(element, e.touches[0].pageX, e.touches[0].pageY),\n client: {\n x: e.touches[0].clientX,\n y: e.touches[0].clientY\n }\n };\n currentPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image);\n\n eventType = EVENTS.TOUCH_PRESS;\n eventData = {\n event: e,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n currentPoints,\n type: eventType,\n isTouchEvent: true\n };\n\n triggerEvent(element, eventType, eventData);\n\n // Console.log(eventType);\n }, pressDelay);\n break;\n\n case 'touchend':\n lastScale = 1.0;\n\n isPress = false;\n clearTimeout(pressTimeout);\n\n setTimeout(function () {\n startPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e.changedTouches[0]),\n image: cornerstone.pageToPixel(element, e.changedTouches[0].pageX, e.changedTouches[0].pageY),\n client: {\n x: e.changedTouches[0].clientX,\n y: e.changedTouches[0].clientY\n }\n };\n startPoints.canvas = cornerstone.pixelToCanvas(element, startPoints.image);\n\n eventType = EVENTS.TOUCH_END;\n\n eventData = {\n event: e,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n startPoints,\n currentPoints: startPoints,\n type: eventType,\n isTouchEvent: true\n };\n\n triggerEvent(element, eventType, eventData);\n }, 50);\n break;\n\n case 'panmove':\n // Using the delta-value of HammerJS, because it takes all pointers into account\n // This is very important when using panning in combination with pinch-zooming\n // But HammerJS' delta is relative to the start of the pan event\n // So it needs to be converted to a per-event-delta for CornerstoneTools\n delta = {\n x: e.deltaX - lastDelta.x,\n y: e.deltaY - lastDelta.y\n };\n\n lastDelta = {\n x: e.deltaX,\n y: e.deltaY\n };\n\n // Calculate our current points in page and image coordinates\n currentPoints = {\n page: {\n x: lastPoints.page.x + delta.x,\n y: lastPoints.page.y + delta.y\n },\n image: cornerstone.pageToPixel(element, lastPoints.page.x + delta.x, lastPoints.page.y + delta.y),\n client: {\n x: lastPoints.client.x + delta.x,\n y: lastPoints.client.y + delta.y\n }\n };\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n\n // Calculate delta values in page and image coordinates\n deltaPoints = {\n page: external.cornerstoneMath.point.subtract(currentPoints.page, lastPoints.page),\n image: external.cornerstoneMath.point.subtract(currentPoints.image, lastPoints.image),\n client: external.cornerstoneMath.point.subtract(currentPoints.client, lastPoints.client),\n canvas: external.cornerstoneMath.point.subtract(currentPoints.canvas, lastPoints.canvas)\n };\n\n pageDistanceMoved += Math.sqrt(deltaPoints.page.x * deltaPoints.page.x + deltaPoints.page.y * deltaPoints.page.y);\n // Console.log(\"pageDistanceMoved: \" + pageDistanceMoved);\n if (pageDistanceMoved > pressMaxDistance) {\n // Console.log('Press event aborted due to movement');\n isPress = false;\n clearTimeout(pressTimeout);\n }\n\n eventType = EVENTS.TOUCH_DRAG;\n if (e.pointers.length > 1) {\n eventType = EVENTS.MULTI_TOUCH_DRAG;\n }\n\n eventData = {\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n startPoints,\n lastPoints,\n currentPoints,\n deltaPoints,\n numPointers: e.pointers.length,\n type: eventType,\n isTouchEvent: true\n };\n\n triggerEvent(element, eventType, eventData);\n\n lastPoints = copyPoints(currentPoints);\n break;\n\n case 'panstart':\n lastDelta = {\n x: e.deltaX,\n y: e.deltaY\n };\n\n currentPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e.pointers[0]),\n image: cornerstone.pageToPixel(element, e.pointers[0].pageX, e.pointers[0].pageY),\n client: {\n x: e.pointers[0].clientX,\n y: e.pointers[0].clientY\n }\n };\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n lastPoints = copyPoints(currentPoints);\n break;\n\n case 'panend':\n isPress = false;\n clearTimeout(pressTimeout);\n\n // If lastPoints is not yet set, it means panend fired without panstart or pan,\n // So we can ignore this event\n if (!lastPoints) {\n return false;\n }\n\n currentPoints = {\n page: external.cornerstoneMath.point.pageToPoint(e.pointers[0]),\n image: cornerstone.pageToPixel(element, e.pointers[0].pageX, e.pointers[0].pageY),\n client: {\n x: e.pointers[0].clientX,\n y: e.pointers[0].clientY\n }\n };\n currentPoints.canvas = cornerstone.pixelToCanvas(element, currentPoints.image);\n\n // Calculate delta values in page and image coordinates\n deltaPoints = {\n page: external.cornerstoneMath.point.subtract(currentPoints.page, lastPoints.page),\n image: external.cornerstoneMath.point.subtract(currentPoints.image, lastPoints.image),\n client: external.cornerstoneMath.point.subtract(currentPoints.client, lastPoints.client),\n canvas: external.cornerstoneMath.point.subtract(currentPoints.canvas, lastPoints.canvas)\n };\n\n eventType = EVENTS.TOUCH_DRAG_END;\n\n eventData = {\n event: e.srcEvent,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n startPoints,\n lastPoints,\n currentPoints,\n deltaPoints,\n type: eventType,\n isTouchEvent: true\n };\n\n triggerEvent(element, eventType, eventData);\n\n remainingPointers = e.pointers.length - e.changedPointers.length;\n\n if (remainingPointers === 2) {\n preventNextPinch = true;\n }\n\n return pauseEvent(e);\n\n case 'rotatemove':\n isPress = false;\n clearTimeout(pressTimeout);\n\n rotation = e.rotation - lastRotation;\n\n lastRotation = e.rotation;\n\n eventType = EVENTS.TOUCH_ROTATE;\n eventData = {\n event: e.srcEvent,\n viewport: cornerstone.getViewport(element),\n image: cornerstone.getEnabledElement(element).image,\n element,\n rotation,\n type: eventType\n };\n triggerEvent(element, eventType, eventData);\n break;\n }\n\n return false;\n}\n\nfunction enable (element) {\n disable(element);\n const Hammer = external.Hammer;\n\n const hammerOptions = {\n inputClass: Hammer.SUPPORT_POINTER_EVENTS ? Hammer.PointerEventInput : Hammer.TouchInput\n };\n\n const mc = new Hammer.Manager(element, hammerOptions);\n\n const panOptions = {\n pointers: 0,\n direction: Hammer.DIRECTION_ALL,\n threshold: 0\n };\n\n const pan = new Hammer.Pan(panOptions);\n const pinch = new Hammer.Pinch({\n threshold: 0\n });\n const rotate = new Hammer.Rotate({\n threshold: 0\n });\n\n pinch.recognizeWith(pan);\n pinch.recognizeWith(rotate);\n rotate.recognizeWith(pan);\n\n const doubleTap = new Hammer.Tap({\n event: 'doubletap',\n taps: 2,\n interval: 1500,\n threshold: 50,\n posThreshold: 50\n });\n\n doubleTap.recognizeWith(pan);\n\n // Add to the Manager\n mc.add([doubleTap, pan, rotate, pinch]);\n mc.on('tap doubletap panstart panmove panend pinchstart pinchmove rotatemove', onTouch);\n\n preventGhostClick.enable(element);\n\n const touchEvents = ['touchstart', 'touchend'];\n\n touchEvents.forEach((eventType) => {\n element.addEventListener(eventType, onTouch);\n });\n\n const options = getToolOptions(toolType, element);\n\n options.hammer = mc;\n\n setToolOptions(toolType, element, options);\n}\n\nfunction disable (element) {\n preventGhostClick.disable(element);\n\n const touchEvents = ['touchstart', 'touchend'];\n\n touchEvents.forEach((eventType) => {\n element.removeEventListener(eventType, onTouch);\n });\n\n const options = getToolOptions(toolType, element);\n const mc = options.hammer;\n\n if (mc) {\n mc.off('tap doubletap panstart panmove panend pinchstart pinchmove rotatemove', onTouch);\n }\n}\n\n// Module exports\nconst touchInput = {\n enable,\n disable\n};\n\nexport default touchInput;\n\n\n\n// WEBPACK FOOTER //\n// ./inputSources/touchInput.js","import external from '../externalModules.js';\nimport mouseButtonTool from './mouseButtonTool.js';\nimport touchTool from './touchTool.js';\nimport drawTextBox from '../util/drawTextBox.js';\nimport roundToDecimal from '../util/roundToDecimal.js';\nimport toolStyle from '../stateManagement/toolStyle.js';\nimport textStyle from '../stateManagement/textStyle.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport drawHandles from '../manipulators/drawHandles.js';\nimport { getToolState } from '../stateManagement/toolState.js';\n\nconst toolType = 'angle';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement (mouseEventData) {\n // Create the measurement data for this tool with the end handle activated\n const angleData = {\n visible: true,\n active: true,\n handles: {\n start: {\n x: mouseEventData.currentPoints.image.x - 20,\n y: mouseEventData.currentPoints.image.y + 10,\n highlight: true,\n active: false\n },\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n },\n start2: {\n x: mouseEventData.currentPoints.image.x - 20,\n y: mouseEventData.currentPoints.image.y + 10,\n highlight: true,\n active: false\n },\n end2: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y + 20,\n highlight: true,\n active: false\n }\n }\n };\n\n return angleData;\n}\n// /////// END ACTIVE TOOL ///////\n\nfunction pointNearTool (element, data, coords) {\n const cornerstone = external.cornerstone;\n\n const lineSegment = {\n start: cornerstone.pixelToCanvas(element, data.handles.start),\n end: cornerstone.pixelToCanvas(element, data.handles.end)\n };\n\n let distanceToPoint = external.cornerstoneMath.lineSegment.distanceToPoint(lineSegment, coords);\n\n if (distanceToPoint < 5) {\n return true;\n }\n\n lineSegment.start = cornerstone.pixelToCanvas(element, data.handles.start2);\n lineSegment.end = cornerstone.pixelToCanvas(element, data.handles.end2);\n\n distanceToPoint = external.cornerstoneMath.lineSegment.distanceToPoint(lineSegment, coords);\n\n return (distanceToPoint < 5);\n}\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction onImageRendered (e) {\n const eventData = e.detail;\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n // We have tool data for this element - iterate over each one and draw it\n const context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Activation color\n let color;\n const lineWidth = toolStyle.getToolWidth();\n const font = textStyle.getFont();\n const config = angle.getConfiguration();\n const cornerstone = external.cornerstone;\n\n for (let i = 0; i < toolData.data.length; i++) {\n context.save();\n\n // Configurable shadow\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n const data = toolData.data[i];\n\n // Differentiate the color of activation tool\n if (data.active) {\n color = toolColors.getActiveColor();\n } else {\n color = toolColors.getToolColor();\n }\n\n // Draw the line\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n\n let handleStartCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.start);\n let handleEndCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.end);\n\n context.moveTo(handleStartCanvas.x, handleStartCanvas.y);\n context.lineTo(handleEndCanvas.x, handleEndCanvas.y);\n\n handleStartCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.start2);\n handleEndCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.end2);\n\n context.moveTo(handleStartCanvas.x, handleStartCanvas.y);\n context.lineTo(handleEndCanvas.x, handleEndCanvas.y);\n context.stroke();\n\n // Draw the handles\n drawHandles(context, eventData, data.handles);\n\n // Draw the text\n context.fillStyle = color;\n\n // Need to work on correct angle to measure. This is a cobb angle and we need to determine\n // Where lines cross to measure angle. For now it will show smallest angle.\n const dx1 = (Math.ceil(data.handles.start.x) - Math.ceil(data.handles.end.x)) * eventData.image.columnPixelSpacing;\n const dy1 = (Math.ceil(data.handles.start.y) - Math.ceil(data.handles.end.y)) * eventData.image.rowPixelSpacing;\n const dx2 = (Math.ceil(data.handles.start2.x) - Math.ceil(data.handles.end2.x)) * eventData.image.columnPixelSpacing;\n const dy2 = (Math.ceil(data.handles.start2.y) - Math.ceil(data.handles.end2.y)) * eventData.image.rowPixelSpacing;\n\n let angle = Math.acos(Math.abs(((dx1 * dx2) + (dy1 * dy2)) / (Math.sqrt((dx1 * dx1) + (dy1 * dy1)) * Math.sqrt((dx2 * dx2) + (dy2 * dy2)))));\n\n angle *= (180 / Math.PI);\n\n const rAngle = roundToDecimal(angle, 2);\n const str = '00B0'; // Degrees symbol\n const text = rAngle.toString() + String.fromCharCode(parseInt(str, 16));\n\n const textX = (handleStartCanvas.x + handleEndCanvas.x) / 2;\n const textY = (handleStartCanvas.y + handleEndCanvas.y) / 2;\n\n context.font = font;\n drawTextBox(context, text, textX, textY, color);\n context.restore();\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nconst angle = mouseButtonTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType\n});\n\nconst angleTouch = touchTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType\n});\n\nexport {\n angle,\n angleTouch\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/angleTool.js","/* eslint no-alert:0 */\nimport EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport mouseButtonTool from './mouseButtonTool.js';\nimport touchTool from './touchTool.js';\nimport drawTextBox from '../util/drawTextBox.js';\nimport toolStyle from '../stateManagement/toolStyle.js';\nimport textStyle from '../stateManagement/textStyle.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport drawHandles from '../manipulators/drawHandles.js';\nimport drawArrow from '../util/drawArrow.js';\nimport moveNewHandle from '../manipulators/moveNewHandle.js';\nimport moveNewHandleTouch from '../manipulators/moveNewHandleTouch.js';\nimport anyHandlesOutsideImage from '../manipulators/anyHandlesOutsideImage.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport pointInsideBoundingBox from '../util/pointInsideBoundingBox.js';\nimport { addToolState, removeToolState, getToolState } from '../stateManagement/toolState.js';\nimport { getToolOptions } from '../toolOptions.js';\n\nconst toolType = 'arrowAnnotate';\n\n// Define a callback to get your text annotation\n// This could be used, e.g. to open a modal\nfunction getTextCallback (doneChangingTextCallback) {\n doneChangingTextCallback(prompt('Enter your annotation:'));\n}\n\nfunction changeTextCallback (data, eventData, doneChangingTextCallback) {\n doneChangingTextCallback(prompt('Change your annotation:'));\n}\n\nconst configuration = {\n getTextCallback,\n changeTextCallback,\n drawHandles: false,\n drawHandlesOnHover: true,\n arrowFirst: true\n};\n\n// / --- Mouse Tool --- ///\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction addNewMeasurement (mouseEventData) {\n const element = mouseEventData.element;\n const measurementData = createNewMeasurement(mouseEventData);\n const cornerstone = external.cornerstone;\n\n function doneChangingTextCallback (text) {\n if (text === null) {\n removeToolState(element, toolType, measurementData);\n } else {\n measurementData.text = text;\n }\n\n measurementData.active = false;\n cornerstone.updateImage(element);\n\n element.addEventListener(EVENTS.MOUSE_MOVE, arrowAnnotate.mouseMoveCallback);\n element.addEventListener(EVENTS.MOUSE_DOWN, arrowAnnotate.mouseDownCallback);\n element.addEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, arrowAnnotate.mouseDownActivateCallback);\n element.addEventListener(EVENTS.MOUSE_DOUBLE_CLICK, arrowAnnotate.mouseDoubleClickCallback);\n }\n\n // Associate this data with this imageId so we can render it and manipulate it\n addToolState(element, toolType, measurementData);\n\n // Since we are dragging to another place to drop the end point, we can just activate\n // The end point and let the moveHandle move it for us.\n element.removeEventListener(EVENTS.MOUSE_MOVE, arrowAnnotate.mouseMoveCallback);\n element.removeEventListener(EVENTS.MOUSE_DOWN, arrowAnnotate.mouseDownCallback);\n element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, arrowAnnotate.mouseDownActivateCallback);\n element.removeEventListener(EVENTS.MOUSE_DOUBLE_CLICK, arrowAnnotate.mouseDoubleClickCallback);\n\n cornerstone.updateImage(element);\n moveNewHandle(mouseEventData, toolType, measurementData, measurementData.handles.end, function () {\n if (anyHandlesOutsideImage(mouseEventData, measurementData.handles)) {\n // Delete the measurement\n removeToolState(element, toolType, measurementData);\n }\n\n const config = arrowAnnotate.getConfiguration();\n\n if (measurementData.text === undefined) {\n config.getTextCallback(doneChangingTextCallback);\n }\n\n cornerstone.updateImage(element);\n });\n}\n\nfunction createNewMeasurement (eventData) {\n // Create the measurement data for this tool with the end handle activated\n const measurementData = {\n visible: true,\n active: true,\n handles: {\n start: {\n x: eventData.currentPoints.image.x,\n y: eventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n end: {\n x: eventData.currentPoints.image.x,\n y: eventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n textBox: {\n active: false,\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n }\n }\n };\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\nfunction pointNearTool (element, data, coords) {\n const cornerstone = external.cornerstone;\n\n const lineSegment = {\n start: cornerstone.pixelToCanvas(element, data.handles.start),\n end: cornerstone.pixelToCanvas(element, data.handles.end)\n };\n\n const distanceToPoint = external.cornerstoneMath.lineSegment.distanceToPoint(lineSegment, coords);\n\n\n return (distanceToPoint < 25);\n}\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction onImageRendered (e) {\n const eventData = e.detail;\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n const enabledElement = eventData.enabledElement;\n const cornerstone = external.cornerstone;\n\n // We have tool data for this element - iterate over each one and draw it\n const context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n let color;\n const lineWidth = toolStyle.getToolWidth();\n const font = textStyle.getFont();\n const config = arrowAnnotate.getConfiguration();\n\n for (let i = 0; i < toolData.data.length; i++) {\n context.save();\n\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n const data = toolData.data[i];\n\n if (data.active) {\n color = toolColors.getActiveColor();\n } else {\n color = toolColors.getToolColor();\n }\n\n // Draw the arrow\n const handleStartCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.start);\n const handleEndCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.end);\n\n // Config.arrowFirst = false;\n if (config.arrowFirst) {\n drawArrow(context, handleEndCanvas, handleStartCanvas, color, lineWidth);\n } else {\n drawArrow(context, handleStartCanvas, handleEndCanvas, color, lineWidth);\n }\n\n const handleOptions = {\n drawHandlesIfActive: (config && config.drawHandlesOnHover)\n };\n\n if (config.drawHandles) {\n drawHandles(context, eventData, data.handles, color, handleOptions);\n }\n\n // Draw the text\n if (data.text && data.text !== '') {\n context.font = font;\n\n // Calculate the text coordinates.\n const textWidth = context.measureText(data.text).width + 10;\n const textHeight = textStyle.getFontSize() + 10;\n\n let distance = Math.max(textWidth, textHeight) / 2 + 5;\n\n if (handleEndCanvas.x < handleStartCanvas.x) {\n distance = -distance;\n }\n\n let textCoords;\n\n if (!data.handles.textBox.hasMoved) {\n if (config.arrowFirst) {\n textCoords = {\n x: handleEndCanvas.x - textWidth / 2 + distance,\n y: handleEndCanvas.y - textHeight / 2\n };\n } else {\n // If the arrow is at the End position, the text should\n // Be placed near the Start position\n textCoords = {\n x: handleStartCanvas.x - textWidth / 2 - distance,\n y: handleStartCanvas.y - textHeight / 2\n };\n }\n\n const transform = cornerstone.internal.getTransform(enabledElement);\n\n transform.invert();\n\n const coords = transform.transformPoint(textCoords.x, textCoords.y);\n\n data.handles.textBox.x = coords.x;\n data.handles.textBox.y = coords.y;\n }\n\n textCoords = cornerstone.pixelToCanvas(eventData.element, data.handles.textBox);\n\n const boundingBox = drawTextBox(context, data.text, textCoords.x, textCoords.y, color);\n\n data.handles.textBox.boundingBox = boundingBox;\n\n if (data.handles.textBox.hasMoved) {\n // Draw dashed link line between tool and text\n const link = {\n start: {},\n end: {}\n };\n\n const midpointCanvas = {\n x: (handleStartCanvas.x + handleEndCanvas.x) / 2,\n y: (handleStartCanvas.y + handleEndCanvas.y) / 2\n };\n\n const points = [handleStartCanvas, handleEndCanvas, midpointCanvas];\n\n link.end.x = textCoords.x;\n link.end.y = textCoords.y;\n\n link.start = external.cornerstoneMath.point.findClosestPoint(points, link.end);\n\n const boundingBoxPoints = [{\n // Top middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top\n }, {\n // Left middle point of bounding box\n x: boundingBox.left,\n y: boundingBox.top + boundingBox.height / 2\n }, {\n // Bottom middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top + boundingBox.height\n }, {\n // Right middle point of bounding box\n x: boundingBox.left + boundingBox.width,\n y: boundingBox.top + boundingBox.height / 2\n }\n ];\n\n link.end = external.cornerstoneMath.point.findClosestPoint(boundingBoxPoints, link.start);\n\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.setLineDash([2, 3]);\n context.moveTo(link.start.x, link.start.y);\n context.lineTo(link.end.x, link.end.y);\n context.stroke();\n }\n }\n\n context.restore();\n }\n}\n// ---- Touch tool ----\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction addNewMeasurementTouch (touchEventData) {\n const element = touchEventData.element;\n const measurementData = createNewMeasurement(touchEventData);\n const cornerstone = external.cornerstone;\n\n function doneChangingTextCallback (text) {\n if (text === null) {\n removeToolState(element, toolType, measurementData);\n } else {\n measurementData.text = text;\n }\n\n measurementData.active = false;\n cornerstone.updateImage(element);\n\n element.addEventListener(EVENTS.TOUCH_PRESS, arrowAnnotateTouch.pressCallback);\n element.addEventListener(EVENTS.TOUCH_START_ACTIVE, arrowAnnotateTouch.touchDownActivateCallback);\n element.addEventListener(EVENTS.TAP, arrowAnnotateTouch.tapCallback);\n }\n\n addToolState(element, toolType, measurementData);\n element.removeEventListener(EVENTS.TOUCH_PRESS, arrowAnnotateTouch.pressCallback);\n element.removeEventListener(EVENTS.TOUCH_START_ACTIVE, arrowAnnotateTouch.touchDownActivateCallback);\n element.removeEventListener(EVENTS.TAP, arrowAnnotateTouch.tapCallback);\n cornerstone.updateImage(element);\n\n moveNewHandleTouch(touchEventData, toolType, measurementData, measurementData.handles.end, function () {\n cornerstone.updateImage(element);\n\n if (anyHandlesOutsideImage(touchEventData, measurementData.handles)) {\n // Delete the measurement\n removeToolState(element, toolType, measurementData);\n }\n\n const config = arrowAnnotate.getConfiguration();\n\n if (measurementData.text === undefined) {\n config.getTextCallback(doneChangingTextCallback);\n }\n });\n}\n\nfunction doubleClickCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const cornerstone = external.cornerstone;\n const options = getToolOptions(toolType, element);\n let data;\n\n if (!isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) {\n return;\n }\n\n function doneChangingTextCallback (data, updatedText, deleteTool) {\n if (deleteTool === true) {\n removeToolState(element, toolType, data);\n } else {\n data.text = updatedText;\n }\n\n data.active = false;\n cornerstone.updateImage(element);\n }\n\n const config = arrowAnnotate.getConfiguration();\n\n const coords = eventData.currentPoints.canvas;\n const toolData = getToolState(element, toolType);\n\n // Now check to see if there is a handle we can move\n if (!toolData) {\n return;\n }\n\n for (let i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (pointNearTool(element, data, coords) ||\n pointInsideBoundingBox(data.handles.textBox, coords)) {\n data.active = true;\n cornerstone.updateImage(element);\n // Allow relabelling via a callback\n config.changeTextCallback(data, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n\n return false;\n }\n }\n}\n\nfunction pressCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const cornerstone = external.cornerstone;\n let data;\n\n function doneChangingTextCallback (data, updatedText, deleteTool) {\n console.log('pressCallback doneChangingTextCallback');\n if (deleteTool === true) {\n removeToolState(element, toolType, data);\n } else {\n data.text = updatedText;\n }\n\n data.active = false;\n cornerstone.updateImage(element);\n\n element.addEventListener(EVENTS.TOUCH_START, arrowAnnotateTouch.touchStartCallback);\n element.addEventListener(EVENTS.TOUCH_START_ACTIVE, arrowAnnotateTouch.touchDownActivateCallback);\n element.addEventListener(EVENTS.TAP, arrowAnnotateTouch.tapCallback);\n }\n\n const config = arrowAnnotate.getConfiguration();\n\n const coords = eventData.currentPoints.canvas;\n const toolData = getToolState(element, toolType);\n\n // Now check to see if there is a handle we can move\n if (!toolData) {\n return;\n }\n\n if (eventData.handlePressed) {\n element.removeEventListener(EVENTS.TOUCH_START, arrowAnnotateTouch.touchStartCallback);\n element.removeEventListener(EVENTS.TOUCH_START_ACTIVE, arrowAnnotateTouch.touchDownActivateCallback);\n element.removeEventListener(EVENTS.TAP, arrowAnnotateTouch.tapCallback);\n\n // Allow relabelling via a callback\n config.changeTextCallback(eventData.handlePressed, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n\n return false;\n }\n\n for (let i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (pointNearTool(element, data, coords) ||\n pointInsideBoundingBox(data.handles.textBox, coords)) {\n data.active = true;\n cornerstone.updateImage(element);\n\n element.removeEventListener(EVENTS.TOUCH_START, arrowAnnotateTouch.touchStartCallback);\n element.removeEventListener(EVENTS.TOUCH_START_ACTIVE, arrowAnnotateTouch.touchDownActivateCallback);\n element.removeEventListener(EVENTS.TAP, arrowAnnotateTouch.tapCallback);\n\n // Allow relabelling via a callback\n config.changeTextCallback(data, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n\n return false;\n }\n }\n\n e.preventDefault();\n e.stopPropagation();\n}\n\nconst arrowAnnotate = mouseButtonTool({\n addNewMeasurement,\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType,\n mouseDoubleClickCallback: doubleClickCallback\n});\n\narrowAnnotate.setConfiguration(configuration);\n\nconst arrowAnnotateTouch = touchTool({\n addNewMeasurement: addNewMeasurementTouch,\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType,\n pressCallback\n});\n\nexport { arrowAnnotate, arrowAnnotateTouch };\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/arrowAnnotate.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport loadHandlerManager from '../stateManagement/loadHandlerManager.js';\nimport { addToolState, getToolState, clearToolState } from '../stateManagement/toolState.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport { imagePointToPatientPoint } from '../util/pointProjector.js';\nimport convertToVector3 from '../util/convertToVector3.js';\nimport { setToolOptions, getToolOptions } from '../toolOptions.js';\n\nconst toolType = 'crosshairs';\n\nfunction chooseLocation (e) {\n const eventData = e.detail;\n\n e.stopImmediatePropagation(); // Prevent CornerstoneToolsTouchStartActive from killing any press events\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n // Get current element target information\n const cornerstone = external.cornerstone;\n const sourceElement = e.currentTarget;\n const sourceEnabledElement = cornerstone.getEnabledElement(sourceElement);\n const sourceImageId = sourceEnabledElement.image.imageId;\n const sourceImagePlane = cornerstone.metaData.get('imagePlaneModule', sourceImageId);\n\n // Get currentPoints from mouse cursor on selected element\n const sourceImagePoint = eventData.currentPoints.image;\n\n // Transfer this to a patientPoint given imagePlane metadata\n const patientPoint = imagePointToPatientPoint(sourceImagePoint, sourceImagePlane);\n\n // Get the enabled elements associated with this synchronization context\n const syncContext = toolData.data[0].synchronizationContext;\n const enabledElements = syncContext.getSourceElements();\n\n // Iterate over each synchronized element\n enabledElements.forEach(function (targetElement) {\n // Don't do anything if the target is the same as the source\n if (targetElement === sourceElement) {\n return;\n }\n\n let minDistance = Number.MAX_VALUE;\n let newImageIdIndex = -1;\n\n const stackToolDataSource = getToolState(targetElement, 'stack');\n\n if (stackToolDataSource === undefined) {\n return;\n }\n\n const stackData = stackToolDataSource.data[0];\n\n // Find within the element's stack the closest image plane to selected location\n stackData.imageIds.forEach(function (imageId, index) {\n const imagePlane = cornerstone.metaData.get('imagePlaneModule', imageId);\n const imagePosition = convertToVector3(imagePlane.imagePositionPatient);\n const row = convertToVector3(imagePlane.rowCosines);\n const column = convertToVector3(imagePlane.columnCosines);\n const normal = column.clone().cross(row.clone());\n const distance = Math.abs(normal.clone().dot(imagePosition) - normal.clone().dot(patientPoint));\n // Console.log(index + '=' + distance);\n\n if (distance < minDistance) {\n minDistance = distance;\n newImageIdIndex = index;\n }\n });\n\n if (newImageIdIndex === stackData.currentImageIdIndex) {\n return;\n }\n\n // Switch the loaded image to the required image\n if (newImageIdIndex !== -1 && stackData.imageIds[newImageIdIndex] !== undefined) {\n const startLoadingHandler = loadHandlerManager.getStartLoadHandler();\n const endLoadingHandler = loadHandlerManager.getEndLoadHandler();\n const errorLoadingHandler = loadHandlerManager.getErrorLoadingHandler();\n\n if (startLoadingHandler) {\n startLoadingHandler(targetElement);\n }\n\n let loader;\n\n if (stackData.preventCache === true) {\n loader = cornerstone.loadImage(stackData.imageIds[newImageIdIndex]);\n } else {\n loader = cornerstone.loadAndCacheImage(stackData.imageIds[newImageIdIndex]);\n }\n\n loader.then(function (image) {\n const viewport = cornerstone.getViewport(targetElement);\n\n stackData.currentImageIdIndex = newImageIdIndex;\n cornerstone.displayImage(targetElement, image, viewport);\n if (endLoadingHandler) {\n endLoadingHandler(targetElement, image);\n }\n }, function (error) {\n const imageId = stackData.imageIds[newImageIdIndex];\n\n if (errorLoadingHandler) {\n errorLoadingHandler(targetElement, imageId, error);\n }\n });\n }\n });\n}\n\nfunction mouseUpCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n element.removeEventListener(EVENTS.MOUSE_DRAG, mouseDragCallback);\n element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n}\n\nfunction mouseDownCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const options = getToolOptions(toolType, element);\n\n if (isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) {\n element.addEventListener(EVENTS.MOUSE_DRAG, mouseDragCallback);\n element.addEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n chooseLocation(e);\n\n e.preventDefault();\n e.stopPropagation();\n }\n}\n\nfunction mouseDragCallback (e) {\n chooseLocation(e);\n\n e.preventDefault();\n e.stopPropagation();\n}\n\nfunction enable (element, mouseButtonMask, synchronizationContext) {\n setToolOptions(toolType, element, { mouseButtonMask });\n\n // Clear any currently existing toolData\n clearToolState(element, toolType);\n\n addToolState(element, toolType, {\n synchronizationContext\n });\n\n element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n\n element.addEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n}\n\n// Disables the reference line tool for the given element\nfunction disable (element) {\n element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n}\n\n// Module/private exports\nconst crosshairs = {\n activate: enable,\n deactivate: disable,\n enable,\n disable\n};\n\nfunction dragEndCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n element.removeEventListener(EVENTS.TOUCH_DRAG, dragCallback);\n element.removeEventListener(EVENTS.TOUCH_DRAG_END, dragEndCallback);\n}\n\nfunction dragStartCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n element.addEventListener(EVENTS.TOUCH_DRAG, dragCallback);\n element.addEventListener(EVENTS.TOUCH_DRAG_END, dragEndCallback);\n chooseLocation(e);\n\n return false;\n}\n\nfunction dragCallback (e) {\n chooseLocation(e);\n\n e.preventDefault();\n e.stopPropagation();\n}\n\nfunction enableTouch (element, synchronizationContext) {\n // Clear any currently existing toolData\n clearToolState(element, toolType);\n\n addToolState(element, toolType, {\n synchronizationContext\n });\n\n element.removeEventListener(EVENTS.TOUCH_START, dragStartCallback);\n\n element.addEventListener(EVENTS.TOUCH_START, dragStartCallback);\n}\n\n// Disables the reference line tool for the given element\nfunction disableTouch (element) {\n element.removeEventListener(EVENTS.TOUCH_START, dragStartCallback);\n}\n\nconst crosshairsTouch = {\n activate: enableTouch,\n deactivate: disableTouch,\n enable: enableTouch,\n disable: disableTouch\n};\n\nexport {\n crosshairs,\n crosshairsTouch\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/crosshairs.js","import external from '../externalModules.js';\nimport doubleTapTool from './doubleTapTool.js';\n\nfunction fitToWindowStrategy (eventData) {\n external.cornerstone.fitToWindow(eventData.element);\n}\n\nfunction doubleTapCallback (e) {\n const eventData = e.detail;\n\n doubleTapZoom.strategy(eventData);\n\n e.preventDefault();\n e.stopPropagation();\n}\n\nconst doubleTapZoom = doubleTapTool(doubleTapCallback);\n\ndoubleTapZoom.strategies = {\n default: fitToWindowStrategy\n};\n\ndoubleTapZoom.strategy = fitToWindowStrategy;\n\nexport default doubleTapZoom;\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/doubleTapZoom.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport simpleMouseButtonTool from './simpleMouseButtonTool.js';\nimport touchDragTool from './touchDragTool.js';\nimport textStyle from '../stateManagement/textStyle.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport drawTextBox from '../util/drawTextBox.js';\nimport getRGBPixels from '../util/getRGBPixels.js';\nimport calculateSUV from '../util/calculateSUV.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport { getToolOptions } from '../toolOptions.js';\n\nconst toolType = 'dragProbe';\n\nlet dragEventData;\n\nfunction defaultStrategy (eventData) {\n const cornerstone = external.cornerstone;\n const enabledElement = cornerstone.getEnabledElement(eventData.element);\n\n const context = enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n const color = toolColors.getActiveColor();\n const font = textStyle.getFont();\n const fontHeight = textStyle.getFontSize();\n const config = dragProbe.getConfiguration();\n\n context.save();\n\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n const x = Math.round(eventData.currentPoints.image.x);\n const y = Math.round(eventData.currentPoints.image.y);\n\n let storedPixels;\n let text,\n str;\n\n if (x < 0 || y < 0 || x >= eventData.image.columns || y >= eventData.image.rows) {\n return;\n }\n\n if (eventData.image.color) {\n storedPixels = getRGBPixels(eventData.element, x, y, 1, 1);\n text = `${x}, ${y}`;\n str = `R: ${storedPixels[0]} G: ${storedPixels[1]} B: ${storedPixels[2]} A: ${storedPixels[3]}`;\n } else {\n storedPixels = cornerstone.getStoredPixels(eventData.element, x, y, 1, 1);\n const sp = storedPixels[0];\n const mo = sp * eventData.image.slope + eventData.image.intercept;\n const suv = calculateSUV(eventData.image, sp);\n\n // Draw text\n text = `${x}, ${y}`;\n str = `SP: ${sp} MO: ${parseFloat(mo.toFixed(3))}`;\n if (suv) {\n str += ` SUV: ${parseFloat(suv.toFixed(3))}`;\n }\n }\n\n // Draw text\n const coords = {\n // Translate the x/y away from the cursor\n x: eventData.currentPoints.image.x + 3,\n y: eventData.currentPoints.image.y - 3\n };\n const textCoords = cornerstone.pixelToCanvas(eventData.element, coords);\n\n context.font = font;\n context.fillStyle = color;\n\n drawTextBox(context, str, textCoords.x, textCoords.y + fontHeight + 5, color);\n drawTextBox(context, text, textCoords.x, textCoords.y, color);\n context.restore();\n}\n\nfunction minimalStrategy (eventData) {\n const cornerstone = external.cornerstone;\n const element = eventData.element;\n const enabledElement = cornerstone.getEnabledElement(element);\n const image = enabledElement.image;\n\n const context = enabledElement.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n const color = toolColors.getActiveColor();\n const font = textStyle.getFont();\n const config = dragProbe.getConfiguration();\n\n context.save();\n\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n const seriesModule = cornerstone.metaData.get('generalSeriesModule', image.imageId);\n let modality;\n\n if (seriesModule) {\n modality = seriesModule.modality;\n }\n\n let toolCoords;\n\n if (eventData.isTouchEvent === true) {\n toolCoords = cornerstone.pageToPixel(element, eventData.currentPoints.page.x,\n eventData.currentPoints.page.y - textStyle.getFontSize() * 4);\n } else {\n toolCoords = cornerstone.pageToPixel(element, eventData.currentPoints.page.x,\n eventData.currentPoints.page.y - textStyle.getFontSize() / 2);\n }\n\n let storedPixels;\n let text = '';\n\n if (toolCoords.x < 0 || toolCoords.y < 0 ||\n toolCoords.x >= image.columns || toolCoords.y >= image.rows) {\n return;\n }\n\n if (image.color) {\n storedPixels = getRGBPixels(element, toolCoords.x, toolCoords.y, 1, 1);\n text = `R: ${storedPixels[0]} G: ${storedPixels[1]} B: ${storedPixels[2]}`;\n } else {\n storedPixels = cornerstone.getStoredPixels(element, toolCoords.x, toolCoords.y, 1, 1);\n const sp = storedPixels[0];\n const mo = sp * eventData.image.slope + eventData.image.intercept;\n\n const modalityPixelValueText = parseFloat(mo.toFixed(2));\n\n if (modality === 'CT') {\n text += `HU: ${modalityPixelValueText}`;\n } else if (modality === 'PT') {\n text += modalityPixelValueText;\n const suv = calculateSUV(eventData.image, sp);\n\n if (suv) {\n text += ` SUV: ${parseFloat(suv.toFixed(2))}`;\n }\n } else {\n text += modalityPixelValueText;\n }\n }\n\n // Prepare text\n const textCoords = cornerstone.pixelToCanvas(element, toolCoords);\n\n context.font = font;\n context.fillStyle = color;\n\n // Translate the x/y away from the cursor\n let translation;\n const handleRadius = 6;\n const width = context.measureText(text).width;\n\n if (eventData.isTouchEvent === true) {\n translation = {\n x: -width / 2 - 5,\n y: -textStyle.getFontSize() - 10 - 2 * handleRadius\n };\n } else {\n translation = {\n x: 12,\n y: -(textStyle.getFontSize() + 10) / 2\n };\n }\n\n context.beginPath();\n context.strokeStyle = color;\n context.arc(textCoords.x, textCoords.y, handleRadius, 0, 2 * Math.PI);\n context.stroke();\n\n drawTextBox(context, text, textCoords.x + translation.x, textCoords.y + translation.y, color);\n context.restore();\n}\n\nfunction mouseUpCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n element.removeEventListener(EVENTS.IMAGE_RENDERED, imageRenderedCallback);\n element.removeEventListener(EVENTS.MOUSE_DRAG, dragCallback);\n element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n external.cornerstone.updateImage(eventData.element);\n}\n\nfunction mouseDownCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const options = getToolOptions(toolType, element);\n\n if (isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) {\n element.addEventListener(EVENTS.IMAGE_RENDERED, imageRenderedCallback);\n element.addEventListener(EVENTS.MOUSE_DRAG, dragCallback);\n element.addEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.addEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n dragProbe.strategy(eventData);\n\n e.preventDefault();\n e.stopPropagation();\n }\n}\n\nfunction imageRenderedCallback () {\n if (dragEventData) {\n dragProbe.strategy(dragEventData);\n dragEventData = null;\n }\n}\n\n// The strategy can't be execute at this moment because the image is rendered asynchronously\n// (requestAnimationFrame). Then the eventData that contains all information needed is being\n// Cached and the strategy will be executed once cornerstoneimagerendered is triggered.\nfunction dragCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n dragEventData = eventData;\n external.cornerstone.updateImage(element);\n\n e.preventDefault();\n e.stopPropagation();\n}\n\nconst dragProbe = simpleMouseButtonTool(mouseDownCallback, toolType);\n\ndragProbe.strategies = {\n default: defaultStrategy,\n minimal: minimalStrategy\n};\n\ndragProbe.strategy = defaultStrategy;\n\nconst options = {\n fireOnTouchStart: true\n};\n\nconst dragProbeTouch = touchDragTool(dragCallback, toolType, options);\n\nexport {\n dragProbe,\n dragProbeTouch\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/dragProbe.js","import external from '../externalModules.js';\nimport mouseButtonTool from './mouseButtonTool.js';\nimport touchTool from './touchTool.js';\nimport toolStyle from '../stateManagement/toolStyle.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport drawHandles from '../manipulators/drawHandles.js';\nimport drawTextBox from '../util/drawTextBox.js';\nimport drawEllipse from '../util/drawEllipse.js';\nimport pointInEllipse from '../util/pointInEllipse.js';\nimport calculateEllipseStatistics from '../util/calculateEllipseStatistics.js';\nimport calculateSUV from '../util/calculateSUV.js';\nimport { getToolState } from '../stateManagement/toolState.js';\n\nconst toolType = 'ellipticalRoi';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement (mouseEventData) {\n // Create the measurement data for this tool with the end handle activated\n const measurementData = {\n visible: true,\n active: true,\n invalidated: true,\n handles: {\n start: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n },\n textBox: {\n active: false,\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n }\n }\n };\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction pointNearEllipse (element, data, coords, distance) {\n const cornerstone = external.cornerstone;\n const startCanvas = cornerstone.pixelToCanvas(element, data.handles.start);\n const endCanvas = cornerstone.pixelToCanvas(element, data.handles.end);\n\n const minorEllipse = {\n left: Math.min(startCanvas.x, endCanvas.x) + distance / 2,\n top: Math.min(startCanvas.y, endCanvas.y) + distance / 2,\n width: Math.abs(startCanvas.x - endCanvas.x) - distance,\n height: Math.abs(startCanvas.y - endCanvas.y) - distance\n };\n\n const majorEllipse = {\n left: Math.min(startCanvas.x, endCanvas.x) - distance / 2,\n top: Math.min(startCanvas.y, endCanvas.y) - distance / 2,\n width: Math.abs(startCanvas.x - endCanvas.x) + distance,\n height: Math.abs(startCanvas.y - endCanvas.y) + distance\n };\n\n const pointInMinorEllipse = pointInEllipse(minorEllipse, coords);\n const pointInMajorEllipse = pointInEllipse(majorEllipse, coords);\n\n if (pointInMajorEllipse && !pointInMinorEllipse) {\n return true;\n }\n\n return false;\n}\n\nfunction pointNearTool (element, data, coords) {\n return pointNearEllipse(element, data, coords, 15);\n}\n\nfunction pointNearToolTouch (element, data, coords) {\n return pointNearEllipse(element, data, coords, 25);\n}\n\nfunction numberWithCommas (x) {\n // http://stackoverflow.com/questions/2901102/how-to-print-a-number-with-commas-as-thousands-separators-in-javascript\n const parts = x.toString().split('.');\n\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n\n return parts.join('.');\n}\n\nfunction onImageRendered (e) {\n const eventData = e.detail;\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n const image = eventData.image;\n const element = eventData.element;\n const lineWidth = toolStyle.getToolWidth();\n const config = ellipticalRoi.getConfiguration();\n const context = eventData.canvasContext.canvas.getContext('2d');\n const seriesModule = cornerstone.metaData.get('generalSeriesModule', image.imageId);\n let modality;\n\n if (seriesModule) {\n modality = seriesModule.modality;\n }\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // If we have tool data for this element - iterate over each set and draw it\n for (let i = 0; i < toolData.data.length; i++) {\n context.save();\n\n const data = toolData.data[i];\n\n // Apply any shadow settings defined in the tool configuration\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n // Check which color the rendered tool should be\n const color = toolColors.getColorIfActive(data.active);\n\n // Convert Image coordinates to Canvas coordinates given the element\n const handleStartCanvas = cornerstone.pixelToCanvas(element, data.handles.start);\n const handleEndCanvas = cornerstone.pixelToCanvas(element, data.handles.end);\n\n // Retrieve the bounds of the ellipse (left, top, width, and height)\n // In Canvas coordinates\n const leftCanvas = Math.min(handleStartCanvas.x, handleEndCanvas.x);\n const topCanvas = Math.min(handleStartCanvas.y, handleEndCanvas.y);\n const widthCanvas = Math.abs(handleStartCanvas.x - handleEndCanvas.x);\n const heightCanvas = Math.abs(handleStartCanvas.y - handleEndCanvas.y);\n\n // Draw the ellipse on the canvas\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n drawEllipse(context, leftCanvas, topCanvas, widthCanvas, heightCanvas);\n context.closePath();\n\n // If the tool configuration specifies to only draw the handles on hover / active,\n // Follow this logic\n if (config && config.drawHandlesOnHover) {\n // Draw the handles if the tool is active\n if (data.active === true) {\n drawHandles(context, eventData, data.handles, color);\n } else {\n // If the tool is inactive, draw the handles only if each specific handle is being\n // Hovered over\n const handleOptions = {\n drawHandlesIfActive: true\n };\n\n drawHandles(context, eventData, data.handles, color, handleOptions);\n }\n } else {\n // If the tool has no configuration settings, always draw the handles\n drawHandles(context, eventData, data.handles, color);\n }\n\n // Define variables for the area and mean/standard deviation\n let area,\n meanStdDev,\n meanStdDevSUV;\n\n // Perform a check to see if the tool has been invalidated. This is to prevent\n // Unnecessary re-calculation of the area, mean, and standard deviation if the\n // Image is re-rendered but the tool has not moved (e.g. during a zoom)\n if (data.invalidated === false) {\n // If the data is not invalidated, retrieve it from the toolData\n meanStdDev = data.meanStdDev;\n meanStdDevSUV = data.meanStdDevSUV;\n area = data.area;\n } else {\n // If the data has been invalidated, we need to calculate it again\n\n // Retrieve the bounds of the ellipse in image coordinates\n const ellipse = {\n left: Math.round(Math.min(data.handles.start.x, data.handles.end.x)),\n top: Math.round(Math.min(data.handles.start.y, data.handles.end.y)),\n width: Math.round(Math.abs(data.handles.start.x - data.handles.end.x)),\n height: Math.round(Math.abs(data.handles.start.y - data.handles.end.y))\n };\n\n // First, make sure this is not a color image, since no mean / standard\n // Deviation will be calculated for color images.\n if (!image.color) {\n // Retrieve the array of pixels that the ellipse bounds cover\n const pixels = cornerstone.getPixels(element, ellipse.left, ellipse.top, ellipse.width, ellipse.height);\n\n // Calculate the mean & standard deviation from the pixels and the ellipse details\n meanStdDev = calculateEllipseStatistics(pixels, ellipse);\n\n if (modality === 'PT') {\n // If the image is from a PET scan, use the DICOM tags to\n // Calculate the SUV from the mean and standard deviation.\n\n // Note that because we are using modality pixel values from getPixels, and\n // The calculateSUV routine also rescales to modality pixel values, we are first\n // Returning the values to storedPixel values before calcuating SUV with them.\n // TODO: Clean this up? Should we add an option to not scale in calculateSUV?\n meanStdDevSUV = {\n mean: calculateSUV(image, (meanStdDev.mean - image.intercept) / image.slope),\n stdDev: calculateSUV(image, (meanStdDev.stdDev - image.intercept) / image.slope)\n };\n }\n\n // If the mean and standard deviation values are sane, store them for later retrieval\n if (meanStdDev && !isNaN(meanStdDev.mean)) {\n data.meanStdDev = meanStdDev;\n data.meanStdDevSUV = meanStdDevSUV;\n }\n }\n\n // Retrieve the pixel spacing values, and if they are not\n // Real non-zero values, set them to 1\n const columnPixelSpacing = image.columnPixelSpacing || 1;\n const rowPixelSpacing = image.rowPixelSpacing || 1;\n\n // Calculate the image area from the ellipse dimensions and pixel spacing\n area = Math.PI * (ellipse.width * columnPixelSpacing / 2) * (ellipse.height * rowPixelSpacing / 2);\n\n // If the area value is sane, store it for later retrieval\n if (!isNaN(area)) {\n data.area = area;\n }\n\n // Set the invalidated flag to false so that this data won't automatically be recalculated\n data.invalidated = false;\n }\n\n // Define an array to store the rows of text for the textbox\n const textLines = [];\n\n // If the mean and standard deviation values are present, display them\n if (meanStdDev && meanStdDev.mean !== undefined) {\n // If the modality is CT, add HU to denote Hounsfield Units\n let moSuffix = '';\n\n if (modality === 'CT') {\n moSuffix = ' HU';\n }\n\n // Create a line of text to display the mean and any units that were specified (i.e. HU)\n let meanText = `Mean: ${numberWithCommas(meanStdDev.mean.toFixed(2))}${moSuffix}`;\n // Create a line of text to display the standard deviation and any units that were specified (i.e. HU)\n let stdDevText = `StdDev: ${numberWithCommas(meanStdDev.stdDev.toFixed(2))}${moSuffix}`;\n\n // If this image has SUV values to display, concatenate them to the text line\n if (meanStdDevSUV && meanStdDevSUV.mean !== undefined) {\n const SUVtext = ' SUV: ';\n\n meanText += SUVtext + numberWithCommas(meanStdDevSUV.mean.toFixed(2));\n stdDevText += SUVtext + numberWithCommas(meanStdDevSUV.stdDev.toFixed(2));\n }\n\n // Add these text lines to the array to be displayed in the textbox\n textLines.push(meanText);\n textLines.push(stdDevText);\n }\n\n // If the area is a sane value, display it\n if (area) {\n // Determine the area suffix based on the pixel spacing in the image.\n // If pixel spacing is present, use millimeters. Otherwise, use pixels.\n // This uses Char code 178 for a superscript 2\n let suffix = ` mm${String.fromCharCode(178)}`;\n\n if (!image.rowPixelSpacing || !image.columnPixelSpacing) {\n suffix = ` pixels${String.fromCharCode(178)}`;\n }\n\n // Create a line of text to display the area and its units\n const areaText = `Area: ${numberWithCommas(area.toFixed(2))}${suffix}`;\n\n // Add this text line to the array to be displayed in the textbox\n textLines.push(areaText);\n }\n\n // If the textbox has not been moved by the user, it should be displayed on the right-most\n // Side of the tool.\n if (!data.handles.textBox.hasMoved) {\n // Find the rightmost side of the ellipse at its vertical center, and place the textbox here\n // Note that this calculates it in image coordinates\n data.handles.textBox.x = Math.max(data.handles.start.x, data.handles.end.x);\n data.handles.textBox.y = (data.handles.start.y + data.handles.end.y) / 2;\n }\n\n // Convert the textbox Image coordinates into Canvas coordinates\n const textCoords = cornerstone.pixelToCanvas(element, data.handles.textBox);\n\n // Set options for the textbox drawing function\n const options = {\n centering: {\n x: false,\n y: true\n }\n };\n\n // Draw the textbox and retrieves it's bounding box for mouse-dragging and highlighting\n const boundingBox = drawTextBox(context, textLines, textCoords.x,\n textCoords.y, color, options);\n\n // Store the bounding box data in the handle for mouse-dragging and highlighting\n data.handles.textBox.boundingBox = boundingBox;\n\n // If the textbox has moved, we would like to draw a line linking it with the tool\n // This section decides where to draw this line to on the Ellipse based on the location\n // Of the textbox relative to the ellipse.\n if (data.handles.textBox.hasMoved) {\n // Draw dashed link line between tool and text\n\n // The initial link position is at the center of the\n // Textbox.\n const link = {\n start: {},\n end: {\n x: textCoords.x,\n y: textCoords.y\n }\n };\n\n // First we calculate the ellipse points (top, left, right, and bottom)\n const ellipsePoints = [{\n // Top middle point of ellipse\n x: leftCanvas + widthCanvas / 2,\n y: topCanvas\n }, {\n // Left middle point of ellipse\n x: leftCanvas,\n y: topCanvas + heightCanvas / 2\n }, {\n // Bottom middle point of ellipse\n x: leftCanvas + widthCanvas / 2,\n y: topCanvas + heightCanvas\n }, {\n // Right middle point of ellipse\n x: leftCanvas + widthCanvas,\n y: topCanvas + heightCanvas / 2\n }];\n\n // We obtain the link starting point by finding the closest point on the ellipse to the\n // Center of the textbox\n link.start = external.cornerstoneMath.point.findClosestPoint(ellipsePoints, link.end);\n\n // Next we calculate the corners of the textbox bounding box\n const boundingBoxPoints = [{\n // Top middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top\n }, {\n // Left middle point of bounding box\n x: boundingBox.left,\n y: boundingBox.top + boundingBox.height / 2\n }, {\n // Bottom middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top + boundingBox.height\n }, {\n // Right middle point of bounding box\n x: boundingBox.left + boundingBox.width,\n y: boundingBox.top + boundingBox.height / 2\n }];\n\n // Now we recalculate the link endpoint by identifying which corner of the bounding box\n // Is closest to the start point we just calculated.\n link.end = external.cornerstoneMath.point.findClosestPoint(boundingBoxPoints, link.start);\n\n // Finally we draw the dashed linking line\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.setLineDash([2, 3]);\n context.moveTo(link.start.x, link.start.y);\n context.lineTo(link.end.x, link.end.y);\n context.stroke();\n }\n\n context.restore();\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nconst ellipticalRoi = mouseButtonTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType\n});\n\nconst ellipticalRoiTouch = touchTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool: pointNearToolTouch,\n toolType\n});\n\nexport { ellipticalRoi, ellipticalRoiTouch };\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/ellipticalRoi.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport toolStyle from '../stateManagement/toolStyle.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport drawHandles from '../manipulators/drawHandles.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport { addToolState, getToolState } from '../stateManagement/toolState.js';\nimport { setToolOptions, getToolOptions } from '../toolOptions.js';\n\nconst toolType = 'freehand';\nlet configuration = {\n mouseLocation: {\n handles: {\n start: {\n highlight: true,\n active: true\n }\n }\n },\n freehand: false,\n modifying: false,\n currentHandle: 0,\n currentTool: -1\n};\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction addPoint (eventData) {\n const toolData = getToolState(eventData.element, toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n const config = freehand.getConfiguration();\n\n // Get the toolData from the last-drawn drawing\n // (this should change when modification is added)\n const data = toolData.data[config.currentTool];\n\n const handleData = {\n x: eventData.currentPoints.image.x,\n y: eventData.currentPoints.image.y,\n highlight: true,\n active: true,\n lines: []\n };\n\n // If this is not the first handle\n if (data.handles.length) {\n // Add the line from the current handle to the new handle\n data.handles[config.currentHandle - 1].lines.push(eventData.currentPoints.image);\n }\n\n // Add the new handle\n data.handles.push(handleData);\n\n // Increment the current handle value\n config.currentHandle += 1;\n\n // Reset freehand value\n config.freehand = false;\n\n // Force onImageRendered to fire\n external.cornerstone.updateImage(eventData.element);\n}\n\nfunction pointNearHandle (eventData, toolIndex) {\n const toolData = getToolState(eventData.element, toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n const data = toolData.data[toolIndex];\n\n if (data.handles === undefined) {\n return;\n }\n\n const mousePoint = eventData.currentPoints.canvas;\n\n for (let i = 0; i < data.handles.length; i++) {\n const handleCanvas = external.cornerstone.pixelToCanvas(eventData.element, data.handles[i]);\n\n if (external.cornerstoneMath.point.distance(handleCanvas, mousePoint) < 5) {\n return i;\n }\n }\n\n return;\n}\n\nfunction pointNearHandleAllTools (eventData) {\n const toolData = getToolState(eventData.element, toolType);\n\n if (!toolData) {\n return;\n }\n\n let handleNearby;\n\n for (let toolIndex = 0; toolIndex < toolData.data.length; toolIndex++) {\n handleNearby = pointNearHandle(eventData, toolIndex);\n if (handleNearby !== undefined) {\n return {\n handleNearby,\n toolIndex\n };\n }\n }\n}\n\n// --- Drawing loop ---\n// On first click, add point\n// After first click, on mouse move, record location\n// If mouse comes close to previous point, snap to it\n// On next click, add another point -- continuously\n// On each click, if it intersects with a current point, end drawing loop\n\nfunction mouseUpCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n\n // Check if drawing is finished\n const toolData = getToolState(eventData.element, toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n const config = freehand.getConfiguration();\n\n if (!eventData.event.shiftKey) {\n config.freehand = false;\n }\n\n external.cornerstone.updateImage(eventData.element);\n}\n\nfunction mouseMoveCallback (e) {\n const eventData = e.detail;\n const toolData = getToolState(eventData.element, toolType);\n\n if (!toolData) {\n return;\n }\n\n const config = freehand.getConfiguration();\n\n const data = toolData.data[config.currentTool];\n\n // Set the mouseLocation handle\n let x = Math.max(eventData.currentPoints.image.x, 0);\n\n x = Math.min(x, eventData.image.width);\n config.mouseLocation.handles.start.x = x;\n\n let y = Math.max(eventData.currentPoints.image.y, 0);\n\n y = Math.min(y, eventData.image.height);\n config.mouseLocation.handles.start.y = y;\n\n const currentHandle = config.currentHandle;\n\n if (config.modifying) {\n // Move the handle\n data.active = true;\n data.highlight = true;\n data.handles[currentHandle].x = config.mouseLocation.handles.start.x;\n data.handles[currentHandle].y = config.mouseLocation.handles.start.y;\n if (currentHandle) {\n const lastLineIndex = data.handles[currentHandle - 1].lines.length - 1;\n const lastLine = data.handles[currentHandle - 1].lines[lastLineIndex];\n\n lastLine.x = config.mouseLocation.handles.start.x;\n lastLine.y = config.mouseLocation.handles.start.y;\n }\n }\n\n if (config.freehand) {\n data.handles[currentHandle - 1].lines.push(eventData.currentPoints.image);\n } else {\n // No snapping in freehand mode\n const handleNearby = pointNearHandle(eventData, config.currentTool);\n\n // If there is a handle nearby to snap to\n // (and it's not the actual mouse handle)\n if (handleNearby !== undefined && handleNearby < (data.handles.length - 1)) {\n config.mouseLocation.handles.start.x = data.handles[handleNearby].x;\n config.mouseLocation.handles.start.y = data.handles[handleNearby].y;\n }\n }\n\n // Force onImageRendered\n external.cornerstone.updateImage(eventData.element);\n}\n\nfunction startDrawing (eventData) {\n const element = eventData.element;\n\n element.addEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n element.addEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n\n const measurementData = {\n visible: true,\n active: true,\n handles: []\n };\n\n const config = freehand.getConfiguration();\n\n config.mouseLocation.handles.start.x = eventData.currentPoints.image.x;\n config.mouseLocation.handles.start.y = eventData.currentPoints.image.y;\n\n addToolState(eventData.element, toolType, measurementData);\n\n const toolData = getToolState(eventData.element, toolType);\n\n config.currentTool = toolData.data.length - 1;\n}\n\nfunction endDrawing (eventData, handleNearby) {\n const element = eventData.element;\n const toolData = getToolState(eventData.element, toolType);\n\n if (!toolData) {\n return;\n }\n\n const config = freehand.getConfiguration();\n\n const data = toolData.data[config.currentTool];\n\n data.active = false;\n data.highlight = false;\n\n // Connect the end of the drawing to the handle nearest to the click\n if (handleNearby !== undefined) {\n // Only save x,y params from nearby handle to prevent circular reference\n data.handles[config.currentHandle - 1].lines.push({\n x: data.handles[handleNearby].x,\n y: data.handles[handleNearby].y\n });\n }\n\n if (config.modifying) {\n config.modifying = false;\n }\n\n // Reset the current handle\n config.currentHandle = 0;\n config.currentTool = -1;\n\n element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n\n external.cornerstone.updateImage(eventData.element);\n}\n\nfunction mouseDownCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const options = getToolOptions(toolType, element);\n\n if (isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) {\n const toolData = getToolState(eventData.element, toolType);\n\n let handleNearby, toolIndex;\n\n const config = freehand.getConfiguration();\n const currentTool = config.currentTool;\n\n if (config.modifying) {\n endDrawing(eventData);\n\n return;\n }\n\n if (currentTool < 0) {\n const nearby = pointNearHandleAllTools(eventData);\n\n if (nearby) {\n handleNearby = nearby.handleNearby;\n toolIndex = nearby.toolIndex;\n // This means the user is trying to modify a point\n if (handleNearby !== undefined) {\n element.addEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n element.addEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n config.modifying = true;\n config.currentHandle = handleNearby;\n config.currentTool = toolIndex;\n }\n } else {\n startDrawing(eventData);\n addPoint(eventData);\n }\n } else if (currentTool >= 0 && toolData.data[currentTool].active) {\n handleNearby = pointNearHandle(eventData, currentTool);\n if (handleNearby !== undefined) {\n endDrawing(eventData, handleNearby);\n } else if (eventData.event.shiftKey) {\n config.freehand = true;\n } else {\n addPoint(eventData);\n }\n }\n\n e.preventDefault();\n e.stopPropagation();\n }\n}\n\n// /////// END ACTIVE TOOL ///////\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction onImageRendered (e) {\n const eventData = e.detail;\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n const config = freehand.getConfiguration();\n\n // We have tool data for this element - iterate over each one and draw it\n const context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n let color;\n const lineWidth = toolStyle.getToolWidth();\n let fillColor = toolColors.getFillColor();\n\n for (let i = 0; i < toolData.data.length; i++) {\n context.save();\n\n const data = toolData.data[i];\n\n if (data.active) {\n color = toolColors.getActiveColor();\n fillColor = toolColors.getFillColor();\n } else {\n color = toolColors.getToolColor();\n fillColor = toolColors.getToolColor();\n }\n\n let handleStart;\n\n if (data.handles.length) {\n for (let j = 0; j < data.handles.length; j++) {\n // Draw a line between handle j and j+1\n handleStart = data.handles[j];\n const handleStartCanvas = cornerstone.pixelToCanvas(eventData.element, handleStart);\n\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.moveTo(handleStartCanvas.x, handleStartCanvas.y);\n\n for (let k = 0; k < data.handles[j].lines.length; k++) {\n const lineCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles[j].lines[k]);\n\n context.lineTo(lineCanvas.x, lineCanvas.y);\n context.stroke();\n }\n\n const mouseLocationCanvas = cornerstone.pixelToCanvas(eventData.element, config.mouseLocation.handles.start);\n\n if (j === (data.handles.length - 1)) {\n if (data.active && !config.freehand && !config.modifying) {\n // If it's still being actively drawn, keep the last line to\n // The mouse location\n context.lineTo(mouseLocationCanvas.x, mouseLocationCanvas.y);\n context.stroke();\n }\n }\n }\n }\n\n // If the tool is active, draw a handle at the cursor location\n const options = {\n fill: fillColor\n };\n\n if (data.active) {\n drawHandles(context, eventData, config.mouseLocation.handles, color, options);\n }\n // Draw the handles\n drawHandles(context, eventData, data.handles, color, options);\n\n context.restore();\n }\n}\n\n// /////// END IMAGE RENDERING ///////\nfunction enable (element) {\n element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n element.removeEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n\n element.addEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n external.cornerstone.updateImage(element);\n}\n\n// Disables the reference line tool for the given element\nfunction disable (element) {\n element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n element.removeEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n external.cornerstone.updateImage(element);\n}\n\n// Visible and interactive\nfunction activate (element, mouseButtonMask) {\n setToolOptions(toolType, element, { mouseButtonMask });\n\n element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n element.removeEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n\n element.addEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n element.addEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n\n external.cornerstone.updateImage(element);\n}\n\n// Visible, but not interactive\nfunction deactivate (element) {\n element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(EVENTS.MOUSE_MOVE, mouseMoveCallback);\n element.removeEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n\n element.addEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n\n external.cornerstone.updateImage(element);\n}\n\nfunction getConfiguration () {\n return configuration;\n}\n\nfunction setConfiguration (config) {\n configuration = config;\n}\n\n// Module/private exports\nconst freehand = {\n enable,\n disable,\n activate,\n deactivate,\n getConfiguration,\n setConfiguration\n};\n\nexport { freehand };\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/freehand.js","import external from '../externalModules.js';\nimport mouseButtonRectangleTool from './mouseButtonRectangleTool.js';\nimport touchTool from './touchTool.js';\nimport toolStyle from '../stateManagement/toolStyle.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport drawHandles from '../manipulators/drawHandles.js';\nimport { getToolState } from '../stateManagement/toolState.js';\n\nconst toolType = 'highlight';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement (mouseEventData) {\n // If already a highlight measurement, creating a new one will be useless\n const existingToolData = getToolState(mouseEventData.event.currentTarget, toolType);\n\n if (existingToolData && existingToolData.data && existingToolData.data.length > 0) {\n return;\n }\n\n // Create the measurement data for this tool with the end handle activated\n const measurementData = {\n visible: true,\n active: true,\n handles: {\n start: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n }\n }\n };\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\nfunction pointInsideRect (element, data, coords) {\n const cornerstone = external.cornerstone;\n const startCanvas = cornerstone.pixelToCanvas(element, data.handles.start);\n const endCanvas = cornerstone.pixelToCanvas(element, data.handles.end);\n\n const rect = {\n left: Math.min(startCanvas.x, endCanvas.x),\n top: Math.min(startCanvas.y, endCanvas.y),\n width: Math.abs(startCanvas.x - endCanvas.x),\n height: Math.abs(startCanvas.y - endCanvas.y)\n };\n\n let insideBox = false;\n\n if ((coords.x >= rect.left && coords.x <= (rect.left + rect.width)) && coords.y >= rect.top && coords.y <= (rect.top + rect.height)) {\n insideBox = true;\n }\n\n return insideBox;\n}\n\nfunction pointNearTool (element, data, coords) {\n const cornerstone = external.cornerstone;\n const startCanvas = cornerstone.pixelToCanvas(element, data.handles.start);\n const endCanvas = cornerstone.pixelToCanvas(element, data.handles.end);\n\n const rect = {\n left: Math.min(startCanvas.x, endCanvas.x),\n top: Math.min(startCanvas.y, endCanvas.y),\n width: Math.abs(startCanvas.x - endCanvas.x),\n height: Math.abs(startCanvas.y - endCanvas.y)\n };\n\n const distanceToPoint = external.cornerstoneMath.rect.distanceToPoint(rect, coords);\n\n\n return (distanceToPoint < 5);\n}\n\n// /////// BEGIN IMAGE RENDERING ///////\n\nfunction onImageRendered (e) {\n const eventData = e.detail;\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (toolData === undefined) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n // We have tool data for this elemen\n const context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n let color;\n const lineWidth = toolStyle.getToolWidth();\n\n context.save();\n\n const data = toolData.data[0];\n\n if (!data) {\n return;\n }\n\n if (data.active) {\n color = toolColors.getActiveColor();\n } else {\n color = toolColors.getToolColor();\n }\n\n const handleStartCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.start);\n const handleEndCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.end);\n\n const rect = {\n left: Math.min(handleStartCanvas.x, handleEndCanvas.x),\n top: Math.min(handleStartCanvas.y, handleEndCanvas.y),\n width: Math.abs(handleStartCanvas.x - handleEndCanvas.x),\n height: Math.abs(handleStartCanvas.y - handleEndCanvas.y)\n };\n\n // Draw dark fill outside the rectangle\n context.beginPath();\n context.strokeStyle = 'transparent';\n\n context.rect(0, 0, context.canvas.clientWidth, context.canvas.clientHeight);\n\n context.rect(rect.width + rect.left, rect.top, -rect.width, rect.height);\n context.stroke();\n context.fillStyle = 'rgba(0,0,0,0.7)';\n context.fill();\n context.closePath();\n\n // Draw dashed stroke rectangle\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.setLineDash([4]);\n context.strokeRect(rect.left, rect.top, rect.width, rect.height);\n\n // Strange fix, but restore doesn't seem to reset the line dashes?\n context.setLineDash([]);\n\n // Draw the handles last, so they will be on top of the overlay\n drawHandles(context, eventData, data.handles, color);\n context.restore();\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nconst preventHandleOutsideImage = true;\n\nconst highlight = mouseButtonRectangleTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n pointInsideRect,\n toolType\n}, preventHandleOutsideImage);\n\nconst highlightTouch = touchTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n pointInsideRect,\n toolType\n}, preventHandleOutsideImage);\n\nexport {\n highlight,\n highlightTouch\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/highlight.js","import displayTool from './displayTool.js';\nimport drawTextBox from '../util/drawTextBox.js';\n\nfunction onImageRendered (e) {\n const eventData = e.detail;\n const image = eventData.image;\n const stats = image.stats;\n\n const context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n const textLines = [];\n\n Object.keys(stats).forEach(function (key) {\n const text = `${key} : ${stats[key]}`;\n\n textLines.push(text);\n });\n\n drawTextBox(context, textLines, 0, 0, 'orange');\n\n textLines.forEach(function (text) {\n console.log(text);\n });\n}\n\nconst imageStats = displayTool(onImageRendered);\n\nexport default imageStats;\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/imageStats.js","import external from '../externalModules.js';\nimport mouseButtonTool from './mouseButtonTool.js';\nimport touchTool from './touchTool.js';\nimport drawTextBox from '../util/drawTextBox.js';\nimport toolStyle from '../stateManagement/toolStyle.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport drawHandles from '../manipulators/drawHandles.js';\nimport { getToolState } from '../stateManagement/toolState.js';\n\nconst toolType = 'length';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement (mouseEventData) {\n // Create the measurement data for this tool with the end handle activated\n const measurementData = {\n visible: true,\n active: true,\n handles: {\n start: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n },\n textBox: {\n active: false,\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n }\n }\n };\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\nfunction pointNearTool (element, data, coords) {\n const cornerstone = external.cornerstone;\n const lineSegment = {\n start: cornerstone.pixelToCanvas(element, data.handles.start),\n end: cornerstone.pixelToCanvas(element, data.handles.end)\n };\n const distanceToPoint = external.cornerstoneMath.lineSegment.distanceToPoint(lineSegment, coords);\n\n\n return (distanceToPoint < 25);\n}\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction onImageRendered (e) {\n const eventData = e.detail;\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n // We have tool data for this element - iterate over each one and draw it\n const context = eventData.canvasContext.canvas.getContext('2d');\n const { image, element } = eventData;\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n const lineWidth = toolStyle.getToolWidth();\n const config = length.getConfiguration();\n const imagePlane = cornerstone.metaData.get('imagePlaneModule', image.imageId);\n let rowPixelSpacing;\n let colPixelSpacing;\n\n if (imagePlane) {\n rowPixelSpacing = imagePlane.rowPixelSpacing || imagePlane.rowImagePixelSpacing;\n colPixelSpacing = imagePlane.columnPixelSpacing || imagePlane.colImagePixelSpacing;\n } else {\n rowPixelSpacing = image.rowPixelSpacing;\n colPixelSpacing = image.columnPixelSpacing;\n }\n\n for (let i = 0; i < toolData.data.length; i++) {\n context.save();\n\n // Configurable shadow\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n const data = toolData.data[i];\n const color = toolColors.getColorIfActive(data.active);\n\n // Get the handle positions in canvas coordinates\n const handleStartCanvas = cornerstone.pixelToCanvas(element, data.handles.start);\n const handleEndCanvas = cornerstone.pixelToCanvas(element, data.handles.end);\n\n // Draw the measurement line\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.moveTo(handleStartCanvas.x, handleStartCanvas.y);\n context.lineTo(handleEndCanvas.x, handleEndCanvas.y);\n context.stroke();\n\n // Draw the handles\n const handleOptions = {\n drawHandlesIfActive: (config && config.drawHandlesOnHover)\n };\n\n drawHandles(context, eventData, data.handles, color, handleOptions);\n\n // Draw the text\n context.fillStyle = color;\n\n // Set rowPixelSpacing and columnPixelSpacing to 1 if they are undefined (or zero)\n const dx = (data.handles.end.x - data.handles.start.x) * (rowPixelSpacing || 1);\n const dy = (data.handles.end.y - data.handles.start.y) * (colPixelSpacing || 1);\n\n // Calculate the length, and create the text variable with the millimeters or pixels suffix\n const length = Math.sqrt(dx * dx + dy * dy);\n\n // Store the length inside the tool for outside access\n data.length = length;\n\n // Set the length text suffix depending on whether or not pixelSpacing is available\n let suffix = ' mm';\n\n if (!rowPixelSpacing || !colPixelSpacing) {\n suffix = ' pixels';\n }\n\n // Store the length measurement text\n const text = `${length.toFixed(2)}${suffix}`;\n\n if (!data.handles.textBox.hasMoved) {\n const coords = {\n x: Math.max(data.handles.start.x, data.handles.end.x)\n };\n\n // Depending on which handle has the largest x-value,\n // Set the y-value for the text box\n if (coords.x === data.handles.start.x) {\n coords.y = data.handles.start.y;\n } else {\n coords.y = data.handles.end.y;\n }\n\n data.handles.textBox.x = coords.x;\n data.handles.textBox.y = coords.y;\n }\n\n const textCoords = cornerstone.pixelToCanvas(eventData.element, data.handles.textBox);\n\n // Move the textbox slightly to the right and upwards\n // So that it sits beside the length tool handle\n textCoords.x += 10;\n\n const options = {\n centering: {\n x: false,\n y: true\n }\n };\n\n // Draw the textbox\n const boundingBox = drawTextBox(context, text, textCoords.x, textCoords.y, color, options);\n\n data.handles.textBox.boundingBox = boundingBox;\n\n if (data.handles.textBox.hasMoved) {\n // Draw dashed link line between ellipse and text\n const link = {\n start: {},\n end: {}\n };\n\n const midpointCanvas = {\n x: (handleStartCanvas.x + handleEndCanvas.x) / 2,\n y: (handleStartCanvas.y + handleEndCanvas.y) / 2\n };\n\n const points = [handleStartCanvas, handleEndCanvas, midpointCanvas];\n\n link.end.x = textCoords.x;\n link.end.y = textCoords.y;\n\n link.start = external.cornerstoneMath.point.findClosestPoint(points, link.end);\n\n const boundingBoxPoints = [{\n // Top middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top\n }, {\n // Left middle point of bounding box\n x: boundingBox.left,\n y: boundingBox.top + boundingBox.height / 2\n }, {\n // Bottom middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top + boundingBox.height\n }, {\n // Right middle point of bounding box\n x: boundingBox.left + boundingBox.width,\n y: boundingBox.top + boundingBox.height / 2\n }\n ];\n\n link.end = external.cornerstoneMath.point.findClosestPoint(boundingBoxPoints, link.start);\n\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.setLineDash([2, 3]);\n context.moveTo(link.start.x, link.start.y);\n context.lineTo(link.end.x, link.end.y);\n context.stroke();\n }\n\n context.restore();\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nconst length = mouseButtonTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType\n});\n\nconst lengthTouch = touchTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType\n});\n\nexport {\n length,\n lengthTouch\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/length.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport touchDragTool from './touchDragTool.js';\nimport { getBrowserInfo } from '../util/getMaxSimultaneousRequests.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport { setToolOptions, getToolOptions } from '../toolOptions.js';\n\nconst toolType = 'magnify';\n\nlet configuration = {\n magnifySize: 100,\n magnificationLevel: 2\n};\n\nlet browserName;\n\nlet currentPoints;\n\n/** Remove the magnifying glass when the mouse event ends */\nfunction mouseUpCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n element.removeEventListener(EVENTS.MOUSE_DRAG, dragCallback);\n element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n element.removeEventListener(EVENTS.NEW_IMAGE, newImageCallback);\n hideTool(eventData);\n}\n\nfunction hideTool (eventData) {\n const element = eventData.element;\n\n element.querySelector('.magnifyTool').style.display = 'none';\n\n // Re-enable the mouse cursor\n document.body.style.cursor = 'default';\n}\n\n/** Draw the magnifying glass on mouseDown, and begin tracking mouse movements */\nfunction mouseDownCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const options = getToolOptions(toolType, element);\n\n if (isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) {\n element.addEventListener(EVENTS.MOUSE_DRAG, dragCallback);\n element.addEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.addEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n\n currentPoints = eventData.currentPoints;\n element.addEventListener(EVENTS.NEW_IMAGE, newImageCallback);\n drawMagnificationTool(eventData);\n\n e.preventDefault();\n e.stopPropagation();\n }\n}\n\nfunction newImageCallback (e) {\n const eventData = e.detail;\n\n eventData.currentPoints = currentPoints;\n drawMagnificationTool(eventData);\n}\n\nfunction dragEndCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n element.removeEventListener(EVENTS.TOUCH_DRAG_END, dragEndCallback);\n element.removeEventListener(EVENTS.TOUCH_END, dragEndCallback);\n element.removeEventListener(EVENTS.NEW_IMAGE, newImageCallback);\n hideTool(eventData);\n}\n\n/** Drag callback is triggered by both the touch and mouse magnify tools */\nfunction dragCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n currentPoints = eventData.currentPoints;\n\n drawMagnificationTool(eventData);\n if (eventData.isTouchEvent === true) {\n element.addEventListener(EVENTS.TOUCH_DRAG_END, dragEndCallback);\n element.addEventListener(EVENTS.TOUCH_END, dragEndCallback);\n }\n\n e.preventDefault();\n e.stopPropagation();\n}\n\n/** Draws the magnifying glass */\nfunction drawMagnificationTool (eventData) {\n const element = eventData.element;\n const magnifyCanvas = element.querySelector('.magnifyTool');\n\n if (!magnifyCanvas) {\n createMagnificationCanvas(eventData.element);\n }\n\n const config = magnify.getConfiguration();\n\n const magnifySize = config.magnifySize;\n const magnificationLevel = config.magnificationLevel;\n\n // The 'not' magnifyTool class here is necessary because cornerstone places\n // No classes of it's own on the canvas we want to select\n const canvas = element.querySelector('canvas:not(.magnifyTool)');\n const context = canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n const zoomCtx = magnifyCanvas.getContext('2d');\n\n zoomCtx.setTransform(1, 0, 0, 1, 0, 0);\n\n const getSize = magnifySize / magnificationLevel;\n\n // Calculate the on-canvas location of the mouse pointer / touch\n const canvasLocation = external.cornerstone.pixelToCanvas(eventData.element, eventData.currentPoints.image);\n\n if (eventData.isTouchEvent === true) {\n canvasLocation.y -= 1.25 * getSize;\n }\n\n canvasLocation.x = Math.max(canvasLocation.x, 0);\n canvasLocation.x = Math.min(canvasLocation.x, canvas.width);\n\n canvasLocation.y = Math.max(canvasLocation.y, 0);\n canvasLocation.y = Math.min(canvasLocation.y, canvas.height);\n\n // Clear the rectangle\n zoomCtx.clearRect(0, 0, magnifySize, magnifySize);\n zoomCtx.fillStyle = 'transparent';\n\n // Fill it with the pixels that the mouse is clicking on\n zoomCtx.fillRect(0, 0, magnifySize, magnifySize);\n\n const copyFrom = {\n x: canvasLocation.x - 0.5 * getSize,\n y: canvasLocation.y - 0.5 * getSize\n };\n\n if (browserName === 'Safari') {\n // Safari breaks when trying to copy pixels with negative indices\n // This prevents proper Magnify usage\n copyFrom.x = Math.max(copyFrom.x, 0);\n copyFrom.y = Math.max(copyFrom.y, 0);\n }\n\n copyFrom.x = Math.min(copyFrom.x, canvas.width);\n copyFrom.y = Math.min(copyFrom.y, canvas.height);\n\n const scaledMagnify = {\n x: (canvas.width - copyFrom.x) * magnificationLevel,\n y: (canvas.height - copyFrom.y) * magnificationLevel\n };\n\n zoomCtx.drawImage(canvas, copyFrom.x, copyFrom.y, canvas.width - copyFrom.x, canvas.height - copyFrom.y, 0, 0, scaledMagnify.x, scaledMagnify.y);\n\n // Place the magnification tool at the same location as the pointer\n magnifyCanvas.style.top = `${canvasLocation.y - 0.5 * magnifySize}px`;\n magnifyCanvas.style.left = `${canvasLocation.x - 0.5 * magnifySize}px`;\n\n magnifyCanvas.style.display = 'block';\n\n // Hide the mouse cursor, so the user can see better\n document.body.style.cursor = 'none';\n}\n\n/** Creates the magnifying glass canvas */\nfunction createMagnificationCanvas (element) {\n // If the magnifying glass canvas doesn't already exist\n if (element.querySelector('.magnifyTool') === null) {\n // Create a canvas and append it as a child to the element\n const magnifyCanvas = document.createElement('canvas');\n // The magnifyTool class is used to find the canvas later on\n\n magnifyCanvas.classList.add('magnifyTool');\n\n const config = magnify.getConfiguration();\n\n magnifyCanvas.width = config.magnifySize;\n magnifyCanvas.height = config.magnifySize;\n\n // Make sure position is absolute so the canvas can follow the mouse / touch\n magnifyCanvas.style.position = 'absolute';\n element.appendChild(magnifyCanvas);\n }\n}\n\n/** Find the magnifying glass canvas and remove it */\nfunction removeMagnificationCanvas (element) {\n const magnifyCanvas = element.querySelector('.magnifyTool');\n\n if (magnifyCanvas) {\n element.removeChild(magnifyCanvas);\n }\n}\n\n// --- Mouse tool activate / disable --- //\nfunction disable (element) {\n element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n removeMagnificationCanvas(element);\n}\n\nfunction enable (element) {\n if (!browserName) {\n const infoString = getBrowserInfo();\n const info = infoString.split(' ');\n\n browserName = info[0];\n }\n\n createMagnificationCanvas(element);\n}\n\nfunction activate (element, mouseButtonMask) {\n setToolOptions(toolType, element, { mouseButtonMask });\n\n element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n\n element.addEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n createMagnificationCanvas(element);\n}\n\n// --- Touch tool activate / disable --- //\nfunction getConfiguration () {\n return configuration;\n}\n\nfunction setConfiguration (config) {\n configuration = config;\n}\n\n// Module exports\nconst magnify = {\n enable,\n activate,\n deactivate: disable,\n disable,\n getConfiguration,\n setConfiguration\n};\n\nconst options = {\n fireOnTouchStart: true,\n activateCallback: createMagnificationCanvas,\n disableCallback: removeMagnificationCanvas\n};\n\nconst magnifyTouchDrag = touchDragTool(dragCallback, toolType, options);\n\nexport {\n magnify,\n magnifyTouchDrag\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/magnify.js","import external from '../externalModules.js';\nimport orientation from '../orientation/index.js';\nimport displayTool from './displayTool.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport drawTextBox from '../util/drawTextBox.js';\n\nfunction getOrientationMarkers (element) {\n const cornerstone = external.cornerstone;\n const enabledElement = cornerstone.getEnabledElement(element);\n const imagePlaneMetaData = cornerstone.metaData.get('imagePlaneModule', enabledElement.image.imageId);\n\n if (!imagePlaneMetaData || !imagePlaneMetaData.rowCosines || !imagePlaneMetaData.columnCosines) {\n return;\n }\n\n const rowString = orientation.getOrientationString(imagePlaneMetaData.rowCosines);\n const columnString = orientation.getOrientationString(imagePlaneMetaData.columnCosines);\n\n const oppositeRowString = orientation.invertOrientationString(rowString);\n const oppositeColumnString = orientation.invertOrientationString(columnString);\n\n return {\n top: oppositeColumnString,\n bottom: columnString,\n left: oppositeRowString,\n right: rowString\n };\n}\n\nfunction getOrientationMarkerPositions (element) {\n const cornerstone = external.cornerstone;\n const enabledElement = cornerstone.getEnabledElement(element);\n let coords;\n\n coords = {\n x: enabledElement.image.width / 2,\n y: 5\n };\n const top = cornerstone.pixelToCanvas(element, coords);\n\n coords = {\n x: enabledElement.image.width / 2,\n y: enabledElement.image.height - 5\n };\n const bottom = cornerstone.pixelToCanvas(element, coords);\n\n coords = {\n x: 5,\n y: enabledElement.image.height / 2\n };\n const left = cornerstone.pixelToCanvas(element, coords);\n\n coords = {\n x: enabledElement.image.width - 10,\n y: enabledElement.image.height / 2\n };\n const right = cornerstone.pixelToCanvas(element, coords);\n\n return {\n top,\n bottom,\n left,\n right\n };\n}\n\nfunction onImageRendered (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n const markers = getOrientationMarkers(element);\n\n if (!markers) {\n return;\n }\n\n const coords = getOrientationMarkerPositions(element, markers);\n\n const context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n const color = toolColors.getToolColor();\n\n const textWidths = {\n top: context.measureText(markers.top).width,\n left: context.measureText(markers.left).width,\n right: context.measureText(markers.right).width,\n bottom: context.measureText(markers.bottom).width\n };\n\n drawTextBox(context, markers.top, coords.top.x - textWidths.top / 2, coords.top.y, color);\n drawTextBox(context, markers.left, coords.left.x - textWidths.left / 2, coords.left.y, color);\n\n const config = orientationMarkers.getConfiguration();\n\n if (config && config.drawAllMarkers) {\n drawTextBox(context, markers.right, coords.right.x - textWidths.right / 2, coords.right.y, color);\n drawTextBox(context, markers.bottom, coords.bottom.x - textWidths.bottom / 2, coords.bottom.y, color);\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nconst orientationMarkers = displayTool(onImageRendered);\n\nexport default orientationMarkers;\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/orientationMarkers.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport simpleMouseButtonTool from './simpleMouseButtonTool.js';\nimport touchDragTool from './touchDragTool.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport { getToolOptions } from '../toolOptions.js';\n\nconst toolType = 'pan';\n\nfunction mouseUpCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n element.removeEventListener(EVENTS.MOUSE_DRAG, dragCallback);\n element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n}\n\nfunction mouseDownCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const options = getToolOptions(toolType, element);\n\n if (isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) {\n element.addEventListener(EVENTS.MOUSE_DRAG, dragCallback);\n element.addEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.addEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n\n e.preventDefault();\n e.stopPropagation();\n }\n}\n\nfunction dragCallback (e) {\n const eventData = e.detail;\n\n // FIXME: Copied from Cornerstone src/internal/calculateTransform.js, should be exposed from there.\n let widthScale = eventData.viewport.scale;\n let heightScale = eventData.viewport.scale;\n\n if (eventData.image.rowPixelSpacing < eventData.image.columnPixelSpacing) {\n widthScale *= (eventData.image.columnPixelSpacing / eventData.image.rowPixelSpacing);\n } else if (eventData.image.columnPixelSpacing < eventData.image.rowPixelSpacing) {\n heightScale *= (eventData.image.rowPixelSpacing / eventData.image.columnPixelSpacing);\n }\n\n eventData.viewport.translation.x += (eventData.deltaPoints.page.x / widthScale);\n eventData.viewport.translation.y += (eventData.deltaPoints.page.y / heightScale);\n external.cornerstone.setViewport(eventData.element, eventData.viewport);\n\n e.preventDefault();\n e.stopPropagation();\n}\n\nconst pan = simpleMouseButtonTool(mouseDownCallback, toolType);\nconst panTouchDrag = touchDragTool(dragCallback, toolType);\n\nexport {\n pan,\n panTouchDrag\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/pan.js","import external from '../externalModules.js';\nimport multiTouchDragTool from './multiTouchDragTool.js';\n\nfunction touchPanCallback (e) {\n const eventData = e.detail;\n const config = panMultiTouch.getConfiguration();\n\n if (config && config.testPointers(eventData)) {\n eventData.viewport.translation.x += (eventData.deltaPoints.page.x / eventData.viewport.scale);\n eventData.viewport.translation.y += (eventData.deltaPoints.page.y / eventData.viewport.scale);\n external.cornerstone.setViewport(eventData.element, eventData.viewport);\n\n e.preventDefault();\n e.stopPropagation();\n }\n}\n\nconst configuration = {\n testPointers (eventData) {\n return (eventData.numPointers >= 2);\n }\n};\n\nconst panMultiTouch = multiTouchDragTool(touchPanCallback);\n\npanMultiTouch.setConfiguration(configuration);\n\nexport default panMultiTouch;\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/panMultiTouch.js","import external from '../externalModules.js';\nimport mouseButtonTool from './mouseButtonTool.js';\nimport touchTool from './touchTool.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport textStyle from '../stateManagement/textStyle.js';\nimport drawHandles from '../manipulators/drawHandles.js';\nimport drawTextBox from '../util/drawTextBox.js';\nimport getRGBPixels from '../util/getRGBPixels.js';\nimport calculateSUV from '../util/calculateSUV.js';\nimport { getToolState } from '../stateManagement/toolState.js';\n\nconst toolType = 'probe';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement (mouseEventData) {\n // Create the measurement data for this tool with the end handle activated\n const measurementData = {\n visible: true,\n active: true,\n handles: {\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n }\n }\n };\n\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction pointNearTool (element, data, coords) {\n const endCanvas = external.cornerstone.pixelToCanvas(element, data.handles.end);\n\n\n return external.cornerstoneMath.point.distance(endCanvas, coords) < 5;\n}\n\nfunction onImageRendered (e) {\n const eventData = e.detail;\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n // We have tool data for this element - iterate over each one and draw it\n const context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n let color;\n const font = textStyle.getFont();\n const fontHeight = textStyle.getFontSize();\n\n for (let i = 0; i < toolData.data.length; i++) {\n\n context.save();\n const data = toolData.data[i];\n\n if (data.active) {\n color = toolColors.getActiveColor();\n } else {\n color = toolColors.getToolColor();\n }\n\n // Draw the handles\n drawHandles(context, eventData, data.handles, color);\n\n const x = Math.round(data.handles.end.x);\n const y = Math.round(data.handles.end.y);\n let storedPixels;\n\n let text,\n str;\n\n if (x < 0 || y < 0 || x >= eventData.image.columns || y >= eventData.image.rows) {\n return;\n }\n\n if (eventData.image.color) {\n text = `${x}, ${y}`;\n storedPixels = getRGBPixels(eventData.element, x, y, 1, 1);\n str = `R: ${storedPixels[0]} G: ${storedPixels[1]} B: ${storedPixels[2]}`;\n } else {\n storedPixels = cornerstone.getStoredPixels(eventData.element, x, y, 1, 1);\n const sp = storedPixels[0];\n const mo = sp * eventData.image.slope + eventData.image.intercept;\n const suv = calculateSUV(eventData.image, sp);\n\n // Draw text\n text = `${x}, ${y}`;\n str = `SP: ${sp} MO: ${parseFloat(mo.toFixed(3))}`;\n if (suv) {\n str += ` SUV: ${parseFloat(suv.toFixed(3))}`;\n }\n }\n\n const coords = {\n // Translate the x/y away from the cursor\n x: data.handles.end.x + 3,\n y: data.handles.end.y - 3\n };\n const textCoords = cornerstone.pixelToCanvas(eventData.element, coords);\n\n context.font = font;\n context.fillStyle = color;\n\n drawTextBox(context, str, textCoords.x, textCoords.y + fontHeight + 5, color);\n drawTextBox(context, text, textCoords.x, textCoords.y, color);\n context.restore();\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nconst probe = mouseButtonTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType\n});\n\nconst probeTouch = touchTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType\n});\n\nexport {\n probe,\n probeTouch\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/probe.js","import external from '../externalModules.js';\nimport mouseButtonTool from './mouseButtonTool.js';\nimport touchTool from './touchTool.js';\nimport toolStyle from '../stateManagement/toolStyle.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport drawHandles from '../manipulators/drawHandles.js';\nimport drawTextBox from '../util/drawTextBox.js';\nimport calculateSUV from '../util/calculateSUV.js';\nimport { getToolState } from '../stateManagement/toolState.js';\n\nconst toolType = 'rectangleRoi';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement (mouseEventData) {\n // Create the measurement data for this tool with the end handle activated\n const measurementData = {\n visible: true,\n active: true,\n invalidated: true,\n handles: {\n start: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n },\n textBox: {\n active: false,\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n }\n }\n };\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\nfunction pointNearTool (element, data, coords) {\n const cornerstone = external.cornerstone;\n const startCanvas = cornerstone.pixelToCanvas(element, data.handles.start);\n const endCanvas = cornerstone.pixelToCanvas(element, data.handles.end);\n\n const rect = {\n left: Math.min(startCanvas.x, endCanvas.x),\n top: Math.min(startCanvas.y, endCanvas.y),\n width: Math.abs(startCanvas.x - endCanvas.x),\n height: Math.abs(startCanvas.y - endCanvas.y)\n };\n\n const distanceToPoint = external.cornerstoneMath.rect.distanceToPoint(rect, coords);\n\n\n return (distanceToPoint < 5);\n}\n\n// /////// BEGIN IMAGE RENDERING ///////\n\nfunction calculateMeanStdDev (sp, ellipse) {\n // TODO: Get a real statistics library here that supports large counts\n\n let sum = 0;\n let sumSquared = 0;\n let count = 0;\n let index = 0;\n\n for (let y = ellipse.top; y < ellipse.top + ellipse.height; y++) {\n for (let x = ellipse.left; x < ellipse.left + ellipse.width; x++) {\n sum += sp[index];\n sumSquared += sp[index] * sp[index];\n count++;\n index++;\n }\n }\n\n if (count === 0) {\n return {\n count,\n mean: 0.0,\n variance: 0.0,\n stdDev: 0.0\n };\n }\n\n const mean = sum / count;\n const variance = sumSquared / count - mean * mean;\n\n return {\n count,\n mean,\n variance,\n stdDev: Math.sqrt(variance)\n };\n}\n\nfunction numberWithCommas (x) {\n // http://stackoverflow.com/questions/2901102/how-to-print-a-number-with-commas-as-thousands-separators-in-javascript\n const parts = x.toString().split('.');\n\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n\n return parts.join('.');\n}\n\nfunction onImageRendered (e) {\n const eventData = e.detail;\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n const image = eventData.image;\n const element = eventData.element;\n const lineWidth = toolStyle.getToolWidth();\n const config = rectangleRoi.getConfiguration();\n const context = eventData.canvasContext.canvas.getContext('2d');\n const seriesModule = cornerstone.metaData.get('generalSeriesModule', image.imageId);\n let modality;\n\n if (seriesModule) {\n modality = seriesModule.modality;\n }\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // If we have tool data for this element - iterate over each set and draw it\n for (let i = 0; i < toolData.data.length; i++) {\n context.save();\n\n const data = toolData.data[i];\n\n // Apply any shadow settings defined in the tool configuration\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n // Check which color the rendered tool should be\n const color = toolColors.getColorIfActive(data.active);\n\n // Convert Image coordinates to Canvas coordinates given the element\n const handleStartCanvas = cornerstone.pixelToCanvas(element, data.handles.start);\n const handleEndCanvas = cornerstone.pixelToCanvas(element, data.handles.end);\n\n // Retrieve the bounds of the ellipse (left, top, width, and height)\n // In Canvas coordinates\n const leftCanvas = Math.min(handleStartCanvas.x, handleEndCanvas.x);\n const topCanvas = Math.min(handleStartCanvas.y, handleEndCanvas.y);\n const widthCanvas = Math.abs(handleStartCanvas.x - handleEndCanvas.x);\n const heightCanvas = Math.abs(handleStartCanvas.y - handleEndCanvas.y);\n\n // Draw the rectangle on the canvas\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.rect(leftCanvas, topCanvas, widthCanvas, heightCanvas);\n context.stroke();\n\n // If the tool configuration specifies to only draw the handles on hover / active,\n // Follow this logic\n if (config && config.drawHandlesOnHover) {\n // Draw the handles if the tool is active\n if (data.active === true) {\n drawHandles(context, eventData, data.handles, color);\n } else {\n // If the tool is inactive, draw the handles only if each specific handle is being\n // Hovered over\n const handleOptions = {\n drawHandlesIfActive: true\n };\n\n drawHandles(context, eventData, data.handles, color, handleOptions);\n }\n } else {\n // If the tool has no configuration settings, always draw the handles\n drawHandles(context, eventData, data.handles, color);\n }\n\n // Define variables for the area and mean/standard deviation\n let area,\n meanStdDev,\n meanStdDevSUV;\n\n // Perform a check to see if the tool has been invalidated. This is to prevent\n // Unnecessary re-calculation of the area, mean, and standard deviation if the\n // Image is re-rendered but the tool has not moved (e.g. during a zoom)\n if (data.invalidated === false) {\n // If the data is not invalidated, retrieve it from the toolData\n meanStdDev = data.meanStdDev;\n meanStdDevSUV = data.meanStdDevSUV;\n area = data.area;\n } else {\n // If the data has been invalidated, we need to calculate it again\n\n // Retrieve the bounds of the ellipse in image coordinates\n const ellipse = {\n left: Math.min(data.handles.start.x, data.handles.end.x),\n top: Math.min(data.handles.start.y, data.handles.end.y),\n width: Math.abs(data.handles.start.x - data.handles.end.x),\n height: Math.abs(data.handles.start.y - data.handles.end.y)\n };\n\n // First, make sure this is not a color image, since no mean / standard\n // Deviation will be calculated for color images.\n if (!image.color) {\n // Retrieve the array of pixels that the ellipse bounds cover\n const pixels = cornerstone.getPixels(element, ellipse.left, ellipse.top, ellipse.width, ellipse.height);\n\n // Calculate the mean & standard deviation from the pixels and the ellipse details\n meanStdDev = calculateMeanStdDev(pixels, ellipse);\n\n if (modality === 'PT') {\n // If the image is from a PET scan, use the DICOM tags to\n // Calculate the SUV from the mean and standard deviation.\n\n // Note that because we are using modality pixel values from getPixels, and\n // The calculateSUV routine also rescales to modality pixel values, we are first\n // Returning the values to storedPixel values before calcuating SUV with them.\n // TODO: Clean this up? Should we add an option to not scale in calculateSUV?\n meanStdDevSUV = {\n mean: calculateSUV(image, (meanStdDev.mean - image.intercept) / image.slope),\n stdDev: calculateSUV(image, (meanStdDev.stdDev - image.intercept) / image.slope)\n };\n }\n\n // If the mean and standard deviation values are sane, store them for later retrieval\n if (meanStdDev && !isNaN(meanStdDev.mean)) {\n data.meanStdDev = meanStdDev;\n data.meanStdDevSUV = meanStdDevSUV;\n }\n }\n\n // Retrieve the pixel spacing values, and if they are not\n // Real non-zero values, set them to 1\n const columnPixelSpacing = image.columnPixelSpacing || 1;\n const rowPixelSpacing = image.rowPixelSpacing || 1;\n\n // Calculate the image area from the ellipse dimensions and pixel spacing\n area = (ellipse.width * columnPixelSpacing) * (ellipse.height * rowPixelSpacing);\n\n // If the area value is sane, store it for later retrieval\n if (!isNaN(area)) {\n data.area = area;\n }\n\n // Set the invalidated flag to false so that this data won't automatically be recalculated\n data.invalidated = false;\n }\n\n // Define an array to store the rows of text for the textbox\n const textLines = [];\n\n // If the mean and standard deviation values are present, display them\n if (meanStdDev && meanStdDev.mean) {\n // If the modality is CT, add HU to denote Hounsfield Units\n let moSuffix = '';\n\n if (modality === 'CT') {\n moSuffix = ' HU';\n }\n\n // Create a line of text to display the mean and any units that were specified (i.e. HU)\n let meanText = `Mean: ${numberWithCommas(meanStdDev.mean.toFixed(2))}${moSuffix}`;\n // Create a line of text to display the standard deviation and any units that were specified (i.e. HU)\n let stdDevText = `StdDev: ${numberWithCommas(meanStdDev.stdDev.toFixed(2))}${moSuffix}`;\n\n // If this image has SUV values to display, concatenate them to the text line\n if (meanStdDevSUV && meanStdDevSUV.mean !== undefined) {\n const SUVtext = ' SUV: ';\n\n meanText += SUVtext + numberWithCommas(meanStdDevSUV.mean.toFixed(2));\n stdDevText += SUVtext + numberWithCommas(meanStdDevSUV.stdDev.toFixed(2));\n }\n\n // Add these text lines to the array to be displayed in the textbox\n textLines.push(meanText);\n textLines.push(stdDevText);\n }\n\n // If the area is a sane value, display it\n if (area) {\n // Determine the area suffix based on the pixel spacing in the image.\n // If pixel spacing is present, use millimeters. Otherwise, use pixels.\n // This uses Char code 178 for a superscript 2\n let suffix = ` mm${String.fromCharCode(178)}`;\n\n if (!image.rowPixelSpacing || !image.columnPixelSpacing) {\n suffix = ` pixels${String.fromCharCode(178)}`;\n }\n\n // Create a line of text to display the area and its units\n const areaText = `Area: ${numberWithCommas(area.toFixed(2))}${suffix}`;\n\n // Add this text line to the array to be displayed in the textbox\n textLines.push(areaText);\n }\n\n // If the textbox has not been moved by the user, it should be displayed on the right-most\n // Side of the tool.\n if (!data.handles.textBox.hasMoved) {\n // Find the rightmost side of the ellipse at its vertical center, and place the textbox here\n // Note that this calculates it in image coordinates\n data.handles.textBox.x = Math.max(data.handles.start.x, data.handles.end.x);\n data.handles.textBox.y = (data.handles.start.y + data.handles.end.y) / 2;\n }\n\n // Convert the textbox Image coordinates into Canvas coordinates\n const textCoords = cornerstone.pixelToCanvas(element, data.handles.textBox);\n\n // Set options for the textbox drawing function\n const options = {\n centering: {\n x: false,\n y: true\n }\n };\n\n // Draw the textbox and retrieves it's bounding box for mouse-dragging and highlighting\n const boundingBox = drawTextBox(context, textLines, textCoords.x,\n textCoords.y, color, options);\n\n // Store the bounding box data in the handle for mouse-dragging and highlighting\n data.handles.textBox.boundingBox = boundingBox;\n\n // If the textbox has moved, we would like to draw a line linking it with the tool\n // This section decides where to draw this line to on the Ellipse based on the location\n // Of the textbox relative to the ellipse.\n if (data.handles.textBox.hasMoved) {\n // Draw dashed link line between tool and text\n\n // The initial link position is at the center of the\n // Textbox.\n const link = {\n start: {},\n end: {\n x: textCoords.x,\n y: textCoords.y\n }\n };\n\n // First we calculate the ellipse points (top, left, right, and bottom)\n const ellipsePoints = [{\n // Top middle point of ellipse\n x: leftCanvas + widthCanvas / 2,\n y: topCanvas\n }, {\n // Left middle point of ellipse\n x: leftCanvas,\n y: topCanvas + heightCanvas / 2\n }, {\n // Bottom middle point of ellipse\n x: leftCanvas + widthCanvas / 2,\n y: topCanvas + heightCanvas\n }, {\n // Right middle point of ellipse\n x: leftCanvas + widthCanvas,\n y: topCanvas + heightCanvas / 2\n }];\n\n // We obtain the link starting point by finding the closest point on the ellipse to the\n // Center of the textbox\n link.start = external.cornerstoneMath.point.findClosestPoint(ellipsePoints, link.end);\n\n // Next we calculate the corners of the textbox bounding box\n const boundingBoxPoints = [{\n // Top middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top\n }, {\n // Left middle point of bounding box\n x: boundingBox.left,\n y: boundingBox.top + boundingBox.height / 2\n }, {\n // Bottom middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top + boundingBox.height\n }, {\n // Right middle point of bounding box\n x: boundingBox.left + boundingBox.width,\n y: boundingBox.top + boundingBox.height / 2\n }];\n\n // Now we recalculate the link endpoint by identifying which corner of the bounding box\n // Is closest to the start point we just calculated.\n link.end = external.cornerstoneMath.point.findClosestPoint(boundingBoxPoints, link.start);\n\n // Finally we draw the dashed linking line\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.setLineDash([2, 3]);\n context.moveTo(link.start.x, link.start.y);\n context.lineTo(link.end.x, link.end.y);\n context.stroke();\n }\n\n context.restore();\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// Module exports\nconst rectangleRoi = mouseButtonTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType\n});\n\nconst rectangleRoiTouch = touchTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType\n});\n\nexport {\n rectangleRoi,\n rectangleRoiTouch\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/rectangleRoi.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport simpleMouseButtonTool from './simpleMouseButtonTool.js';\nimport touchDragTool from './touchDragTool.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport { getToolOptions } from '../toolOptions.js';\n\nconst toolType = 'rotate';\n\n// --- Strategies --- //\nfunction defaultStrategy (eventData) {\n // Calculate distance from the center of the image\n const rect = eventData.element.getBoundingClientRect(eventData.element);\n\n const points = {\n x: eventData.currentPoints.client.x,\n y: eventData.currentPoints.client.y\n };\n\n const width = eventData.element.clientWidth;\n const height = eventData.element.clientHeight;\n\n const pointsFromCenter = {\n x: points.x - rect.left - width / 2,\n // Invert the coordinate system so that up is positive\n y: -1 * (points.y - rect.top - height / 2)\n };\n\n const rotationRadians = Math.atan2(pointsFromCenter.y, pointsFromCenter.x);\n const rotationDegrees = rotationRadians * (180 / Math.PI);\n const rotation = -1 * rotationDegrees + 90;\n\n eventData.viewport.rotation = rotation;\n external.cornerstone.setViewport(eventData.element, eventData.viewport);\n}\n\nfunction horizontalStrategy (eventData) {\n eventData.viewport.rotation += (eventData.deltaPoints.page.x / eventData.viewport.scale);\n external.cornerstone.setViewport(eventData.element, eventData.viewport);\n}\n\nfunction verticalStrategy (eventData) {\n eventData.viewport.rotation += (eventData.deltaPoints.page.y / eventData.viewport.scale);\n external.cornerstone.setViewport(eventData.element, eventData.viewport);\n}\n\n// --- Mouse event callbacks --- //\nfunction mouseUpCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n element.removeEventListener(EVENTS.MOUSE_DRAG, dragCallback);\n element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n}\n\nfunction mouseDownCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const options = getToolOptions(toolType, element);\n\n if (isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) {\n element.addEventListener(EVENTS.MOUSE_DRAG, dragCallback);\n element.addEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.addEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n\n e.preventDefault();\n e.stopPropagation();\n }\n}\n\nfunction dragCallback (e) {\n const eventData = e.detail;\n\n rotate.strategy(eventData);\n external.cornerstone.setViewport(eventData.element, eventData.viewport);\n\n e.preventDefault();\n e.stopPropagation();\n}\n\nconst rotate = simpleMouseButtonTool(mouseDownCallback, toolType);\n\nrotate.strategies = {\n default: defaultStrategy,\n horizontal: horizontalStrategy,\n vertical: verticalStrategy\n};\n\nrotate.strategy = defaultStrategy;\n\nconst rotateTouchDrag = touchDragTool(dragCallback, toolType);\n\nexport {\n rotate,\n rotateTouchDrag\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/rotate.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\n\nfunction touchRotateCallback (e) {\n const eventData = e.detail;\n\n eventData.viewport.rotation += eventData.rotation;\n external.cornerstone.setViewport(eventData.element, eventData.viewport);\n\n return false;\n}\n\nfunction disable (element) {\n element.removeEventListener(EVENTS.TOUCH_ROTATE, touchRotateCallback);\n}\n\nfunction activate (element) {\n element.removeEventListener(EVENTS.TOUCH_ROTATE, touchRotateCallback);\n element.addEventListener(EVENTS.TOUCH_ROTATE, touchRotateCallback);\n}\n\nconst rotateTouch = {\n activate,\n disable\n};\n\nexport default rotateTouch;\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/rotateTouch.js","export default function saveAs (element, filename, mimetype = 'image/png') {\n // Setting the default value for mimetype to image/png\n const canvas = element.querySelector('canvas');\n\n // Thanks to Ken Fyrstenber\n // http://stackoverflow.com/questions/18480474/how-to-save-an-image-from-canvas\n const lnk = document.createElement('a');\n\n // The key here is to set the download attribute of the a tag\n lnk.download = filename;\n\n // Convert canvas content to data-uri for link. When download\n // Attribute is set the content pointed to by link will be\n // Pushed as 'download' in HTML5 capable browsers\n lnk.href = canvas.toDataURL(mimetype, 1);\n\n // / create a 'fake' click-event to trigger the download\n if (document.createEvent) {\n const e = document.createEvent('MouseEvents');\n\n e.initMouseEvent('click', true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);\n\n lnk.dispatchEvent(e);\n } else if (lnk.fireEvent) {\n lnk.fireEvent('onclick');\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/saveAs.js","/* eslint no-alert:0 */\nimport EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport mouseButtonTool from './mouseButtonTool.js';\nimport touchTool from './touchTool.js';\nimport drawTextBox from '../util/drawTextBox.js';\nimport textStyle from '../stateManagement/textStyle.js';\nimport toolStyle from '../stateManagement/toolStyle.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport anyHandlesOutsideImage from '../manipulators/anyHandlesOutsideImage.js';\nimport moveHandle from '../manipulators/moveHandle.js';\nimport drawHandles from '../manipulators/drawHandles.js';\nimport drawCircle from '../util/drawCircle.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport pointInsideBoundingBox from '../util/pointInsideBoundingBox.js';\nimport { addToolState, removeToolState, getToolState } from '../stateManagement/toolState.js';\nimport { getToolOptions } from '../toolOptions.js';\n\nconst toolType = 'seedAnnotate';\n\n// Define a callback to get your text annotation\n// This could be used, e.g. to open a modal\nfunction getTextCallback (doneGetTextCallback) {\n doneGetTextCallback(prompt('Enter your annotation:'));\n}\n\nfunction changeTextCallback (data, eventData, doneChangingTextCallback) {\n doneChangingTextCallback(prompt('Change your annotation:'));\n}\n\nconst configuration = {\n getTextCallback,\n changeTextCallback,\n drawHandles: false,\n drawHandlesOnHover: true,\n currentLetter: 'A',\n currentNumber: 0,\n showCoordinates: true,\n countUp: true\n};\n// / --- Mouse Tool --- ///\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction addNewMeasurement (mouseEventData) {\n const cornerstone = external.cornerstone;\n const element = mouseEventData.element;\n const config = seedAnnotate.getConfiguration();\n const measurementData = createNewMeasurement(mouseEventData);\n\n function doneGetTextCallback (text) {\n if (text === null) {\n removeToolState(element, toolType, measurementData);\n } else {\n measurementData.text = text;\n }\n\n measurementData.active = false;\n cornerstone.updateImage(element);\n }\n\n // Associate this data with this imageId so we can render it and manipulate it\n addToolState(element, toolType, measurementData);\n\n cornerstone.updateImage(element);\n moveHandle(mouseEventData, toolType, measurementData, measurementData.handles.end, function () {\n if (anyHandlesOutsideImage(mouseEventData, measurementData.handles)) {\n // Delete the measurement\n removeToolState(element, toolType, measurementData);\n }\n\n if (measurementData.text === undefined) {\n config.getTextCallback(doneGetTextCallback);\n }\n\n cornerstone.updateImage(element);\n });\n}\n\nfunction createNewMeasurement (mouseEventData) {\n // Create the measurement data for this tool with the end handle activated\n const measurementData = {\n visible: true,\n active: true,\n handles: {\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n textBox: {\n active: false,\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n }\n }\n };\n\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\nfunction pointNearTool (element, data, coords) {\n if (!data.handles.end) {\n return;\n }\n\n const realCoords = external.cornerstone.pixelToCanvas(element, data.handles.end);\n const distanceToPoint = external.cornerstoneMath.point.distance(realCoords, coords);\n\n\n return (distanceToPoint < 25);\n}\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction onImageRendered (e) {\n const eventData = e.detail;\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n const enabledElement = eventData.enabledElement;\n\n // We have tool data for this element - iterate over each one and draw it\n const context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // We need the canvas width\n const canvasWidth = eventData.canvasContext.canvas.width;\n\n let color;\n const lineWidth = toolStyle.getToolWidth();\n const font = textStyle.getFont();\n const config = seedAnnotate.getConfiguration();\n\n for (let i = 0; i < toolData.data.length; i++) {\n context.save();\n\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n const data = toolData.data[i];\n\n if (data.active) {\n color = toolColors.getActiveColor();\n } else {\n color = toolColors.getToolColor();\n }\n\n // Draw\n const handleCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.end);\n\n // Draw the circle always at the end of the handle\n drawCircle(context, handleCanvas, color, lineWidth);\n\n const handleOptions = {\n drawHandlesIfActive: (config && config.drawHandlesOnHover)\n };\n\n if (config.drawHandles) {\n drawHandles(context, eventData, handleCanvas, color, handleOptions);\n }\n\n // Draw the text\n if (data.text && data.text !== '') {\n context.font = font;\n\n let textPlusCoords = '';\n\n if (config.showCoordinates) {\n textPlusCoords = `${data.text} x: ${Math.round(data.handles.end.x)\n } y: ${Math.round(data.handles.end.y)}`;\n } else {\n textPlusCoords = data.text;\n }\n\n // Calculate the text coordinates.\n const textWidth = context.measureText(textPlusCoords).width + 10;\n const textHeight = textStyle.getFontSize() + 10;\n\n let distance = Math.max(textWidth, textHeight) / 2 + 5;\n\n if (handleCanvas.x > (canvasWidth / 2)) {\n distance = -distance;\n }\n\n let textCoords;\n\n if (!data.handles.textBox.hasMoved) {\n textCoords = {\n x: handleCanvas.x - textWidth / 2 + distance,\n y: handleCanvas.y - textHeight / 2\n };\n\n const transform = cornerstone.internal.getTransform(enabledElement);\n\n transform.invert();\n\n const coords = transform.transformPoint(textCoords.x, textCoords.y);\n\n data.handles.textBox.x = coords.x;\n data.handles.textBox.y = coords.y;\n }\n\n textCoords = cornerstone.pixelToCanvas(eventData.element, data.handles.textBox);\n\n const boundingBox = drawTextBox(context, textPlusCoords, textCoords.x, textCoords.y, color);\n\n data.handles.textBox.boundingBox = boundingBox;\n\n if (data.handles.textBox.hasMoved) {\n // Draw dashed link line between tool and text\n const link = {\n start: {},\n end: {}\n };\n\n link.end.x = textCoords.x;\n link.end.y = textCoords.y;\n\n link.start = handleCanvas;\n\n const boundingBoxPoints = [\n {\n // Top middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top\n }, {\n // Left middle point of bounding box\n x: boundingBox.left,\n y: boundingBox.top + boundingBox.height / 2\n }, {\n // Bottom middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top + boundingBox.height\n }, {\n // Right middle point of bounding box\n x: boundingBox.left + boundingBox.width,\n y: boundingBox.top + boundingBox.height / 2\n }\n ];\n\n link.end = external.cornerstoneMath.point.findClosestPoint(boundingBoxPoints, link.start);\n\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.setLineDash([2, 3]);\n context.moveTo(link.start.x, link.start.y);\n context.lineTo(link.end.x, link.end.y);\n context.stroke();\n }\n }\n\n context.restore();\n }\n}\n// ---- Touch tool ----\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction addNewMeasurementTouch (touchEventData) {\n const cornerstone = external.cornerstone;\n const element = touchEventData.element;\n const config = seedAnnotate.getConfiguration();\n const measurementData = createNewMeasurement(touchEventData);\n\n function doneGetTextCallback (text) {\n if (text === null) {\n removeToolState(element, toolType, measurementData);\n } else {\n measurementData.text = text;\n }\n\n measurementData.active = false;\n cornerstone.updateImage(element);\n }\n\n // Associate this data with this imageId so we can render it and manipulate it\n addToolState(element, toolType, measurementData);\n\n cornerstone.updateImage(element);\n moveHandle(touchEventData, toolType, measurementData, measurementData.handles.end, function () {\n if (anyHandlesOutsideImage(touchEventData, measurementData.handles)) {\n // Delete the measurement\n removeToolState(element, toolType, measurementData);\n }\n\n if (measurementData.text === undefined) {\n config.getTextCallback(doneGetTextCallback);\n }\n\n cornerstone.updateImage(element);\n });\n}\n\nfunction doubleClickCallback (e) {\n const eventData = e.detail;\n const cornerstone = external.cornerstone;\n const element = eventData.element;\n let data;\n const options = getToolOptions(toolType, element);\n\n if (!isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) {\n return;\n }\n\n function doneChangingTextCallback (data, updatedText, deleteTool) {\n if (deleteTool === true) {\n removeToolState(element, toolType, data);\n } else {\n data.text = updatedText;\n }\n\n data.active = false;\n cornerstone.updateImage(element);\n }\n\n const config = seedAnnotate.getConfiguration();\n\n const coords = eventData.currentPoints.canvas;\n const toolData = getToolState(element, toolType);\n\n // Now check to see if there is a handle we can move\n if (!toolData) {\n return;\n }\n\n for (let i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (pointNearTool(element, data, coords) ||\n pointInsideBoundingBox(data.handles.textBox, coords)) {\n\n data.active = true;\n cornerstone.updateImage(element);\n // Allow relabelling via a callback\n config.changeTextCallback(data, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n\n return false;\n }\n }\n\n e.preventDefault();\n e.stopPropagation();\n}\n\nfunction pressCallback (e) {\n const eventData = e.detail;\n const cornerstone = external.cornerstone;\n const element = eventData.element;\n let data;\n\n function doneChangingTextCallback (data, updatedText, deleteTool) {\n console.log('pressCallback doneChangingTextCallback');\n if (deleteTool === true) {\n removeToolState(element, toolType, data);\n } else {\n data.text = updatedText;\n }\n\n data.active = false;\n cornerstone.updateImage(element);\n\n element.addEventListener(EVENTS.TOUCH_START, seedAnnotateTouch.touchStartCallback);\n element.addEventListener(EVENTS.TOUCH_START_ACTIVE, seedAnnotateTouch.touchDownActivateCallback);\n element.addEventListener(EVENTS.TAP, seedAnnotateTouch.tapCallback);\n }\n\n const config = seedAnnotate.getConfiguration();\n\n const coords = eventData.currentPoints.canvas;\n const toolData = getToolState(element, toolType);\n\n // Now check to see if there is a handle we can move\n if (!toolData) {\n return false;\n }\n\n if (eventData.handlePressed) {\n element.removeEventListener(EVENTS.TOUCH_START, seedAnnotateTouch.touchStartCallback);\n element.removeEventListener(EVENTS.TOUCH_START_ACTIVE, seedAnnotateTouch.touchDownActivateCallback);\n element.removeEventListener(EVENTS.TAP, seedAnnotateTouch.tapCallback);\n\n // Allow relabelling via a callback\n config.changeTextCallback(eventData.handlePressed, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n\n return false;\n }\n\n for (let i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (pointNearTool(element, data, coords) ||\n pointInsideBoundingBox(data.handles.textBox, coords)) {\n data.active = true;\n cornerstone.updateImage(element);\n\n element.removeEventListener(EVENTS.TOUCH_START, seedAnnotateTouch.touchStartCallback);\n element.removeEventListener(EVENTS.TOUCH_START_ACTIVE, seedAnnotateTouch.touchDownActivateCallback);\n element.removeEventListener(EVENTS.TAP, seedAnnotateTouch.tapCallback);\n\n // Allow relabelling via a callback\n config.changeTextCallback(data, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n\n return false;\n }\n }\n\n e.preventDefault();\n e.stopPropagation();\n}\n\nconst seedAnnotate = mouseButtonTool({\n addNewMeasurement,\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType,\n mouseDoubleClickCallback: doubleClickCallback\n});\n\nseedAnnotate.setConfiguration(configuration);\n\nconst seedAnnotateTouch = touchTool({\n addNewMeasurement: addNewMeasurementTouch,\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType,\n pressCallback\n});\n\nexport {\n seedAnnotate,\n seedAnnotateTouch\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/seedAnnotate.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport mouseButtonTool from './mouseButtonTool.js';\nimport drawTextBox from '../util/drawTextBox.js';\nimport roundToDecimal from '../util/roundToDecimal.js';\nimport textStyle from '../stateManagement/textStyle.js';\nimport toolStyle from '../stateManagement/toolStyle.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport anyHandlesOutsideImage from '../manipulators/anyHandlesOutsideImage.js';\nimport moveNewHandle from '../manipulators/moveNewHandle.js';\nimport moveNewHandleTouch from '../manipulators/moveNewHandleTouch.js';\nimport drawHandles from '../manipulators/drawHandles.js';\nimport touchTool from './touchTool.js';\nimport { addToolState, removeToolState, getToolState } from '../stateManagement/toolState.js';\n\n\nconst toolType = 'simpleAngle';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement (mouseEventData) {\n // Create the measurement data for this tool with the end handle activated\n const angleData = {\n visible: true,\n active: true,\n handles: {\n start: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n middle: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true\n },\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: false\n },\n textBox: {\n active: false,\n hasMoved: false,\n movesIndependently: false,\n drawnIndependently: true,\n allowedOutsideImage: true,\n hasBoundingBox: true\n }\n }\n };\n\n return angleData;\n}\n// /////// END ACTIVE TOOL ///////\n\nfunction pointNearTool (element, data, coords) {\n const cornerstone = external.cornerstone;\n const lineSegment = {\n start: cornerstone.pixelToCanvas(element, data.handles.start),\n end: cornerstone.pixelToCanvas(element, data.handles.middle)\n };\n\n let distanceToPoint = external.cornerstoneMath.lineSegment.distanceToPoint(lineSegment, coords);\n\n if (distanceToPoint < 25) {\n return true;\n }\n\n lineSegment.start = cornerstone.pixelToCanvas(element, data.handles.middle);\n lineSegment.end = cornerstone.pixelToCanvas(element, data.handles.end);\n\n distanceToPoint = external.cornerstoneMath.lineSegment.distanceToPoint(lineSegment, coords);\n\n return (distanceToPoint < 25);\n}\n\nfunction length (vector) {\n return Math.sqrt(Math.pow(vector.x, 2) + Math.pow(vector.y, 2));\n}\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction onImageRendered (e) {\n const eventData = e.detail;\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(e.currentTarget, toolType);\n\n if (!toolData) {\n return;\n }\n\n const cornerstone = external.cornerstone;\n const enabledElement = eventData.enabledElement;\n\n // We have tool data for this element - iterate over each one and draw it\n const context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Activation color\n let color;\n const lineWidth = toolStyle.getToolWidth();\n const font = textStyle.getFont();\n const config = simpleAngle.getConfiguration();\n\n for (let i = 0; i < toolData.data.length; i++) {\n context.save();\n\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n const data = toolData.data[i];\n\n // Differentiate the color of activation tool\n if (data.active) {\n color = toolColors.getActiveColor();\n } else {\n color = toolColors.getToolColor();\n }\n\n const handleStartCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.start);\n const handleMiddleCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.middle);\n const handleEndCanvas = cornerstone.pixelToCanvas(eventData.element, data.handles.end);\n\n // Draw the line\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.moveTo(handleStartCanvas.x, handleStartCanvas.y);\n context.lineTo(handleMiddleCanvas.x, handleMiddleCanvas.y);\n context.lineTo(handleEndCanvas.x, handleEndCanvas.y);\n context.stroke();\n\n // Draw the handles\n const handleOptions = {\n drawHandlesIfActive: (config && config.drawHandlesOnHover)\n };\n\n drawHandles(context, eventData, data.handles, color, handleOptions);\n\n // Draw the text\n context.fillStyle = color;\n\n // Default to isotropic pixel size, update suffix to reflect this\n const columnPixelSpacing = eventData.image.columnPixelSpacing || 1;\n const rowPixelSpacing = eventData.image.rowPixelSpacing || 1;\n let suffix = '';\n\n if (!eventData.image.rowPixelSpacing || !eventData.image.columnPixelSpacing) {\n suffix = ' (isotropic)';\n }\n\n const sideA = {\n x: (Math.ceil(data.handles.middle.x) - Math.ceil(data.handles.start.x)) * columnPixelSpacing,\n y: (Math.ceil(data.handles.middle.y) - Math.ceil(data.handles.start.y)) * rowPixelSpacing\n };\n\n const sideB = {\n x: (Math.ceil(data.handles.end.x) - Math.ceil(data.handles.middle.x)) * columnPixelSpacing,\n y: (Math.ceil(data.handles.end.y) - Math.ceil(data.handles.middle.y)) * rowPixelSpacing\n };\n\n const sideC = {\n x: (Math.ceil(data.handles.end.x) - Math.ceil(data.handles.start.x)) * columnPixelSpacing,\n y: (Math.ceil(data.handles.end.y) - Math.ceil(data.handles.start.y)) * rowPixelSpacing\n };\n\n const sideALength = length(sideA);\n const sideBLength = length(sideB);\n const sideCLength = length(sideC);\n\n // Cosine law\n let angle = Math.acos((Math.pow(sideALength, 2) + Math.pow(sideBLength, 2) - Math.pow(sideCLength, 2)) / (2 * sideALength * sideBLength));\n\n angle *= (180 / Math.PI);\n\n const rAngle = roundToDecimal(angle, 2);\n\n if (rAngle) {\n const str = '00B0'; // Degrees symbol\n const text = rAngle.toString() + String.fromCharCode(parseInt(str, 16)) + suffix;\n\n const distance = 15;\n\n let textCoords;\n\n if (data.handles.textBox.hasMoved) {\n textCoords = cornerstone.pixelToCanvas(eventData.element, data.handles.textBox);\n } else {\n textCoords = {\n x: handleMiddleCanvas.x,\n y: handleMiddleCanvas.y\n };\n\n context.font = font;\n const textWidth = context.measureText(text).width;\n\n if (handleMiddleCanvas.x < handleStartCanvas.x) {\n textCoords.x -= distance + textWidth + 10;\n } else {\n textCoords.x += distance;\n }\n\n const transform = cornerstone.internal.getTransform(enabledElement);\n\n transform.invert();\n\n const coords = transform.transformPoint(textCoords.x, textCoords.y);\n\n data.handles.textBox.x = coords.x;\n data.handles.textBox.y = coords.y;\n }\n\n const options = {\n centering: {\n x: false,\n y: true\n }\n };\n\n const boundingBox = drawTextBox(context, text, textCoords.x, textCoords.y, color, options);\n\n data.handles.textBox.boundingBox = boundingBox;\n\n if (data.handles.textBox.hasMoved) {\n // Draw dashed link line between tool and text\n const link = {\n start: {},\n end: {}\n };\n\n const points = [handleStartCanvas, handleEndCanvas, handleMiddleCanvas];\n\n link.end.x = textCoords.x;\n link.end.y = textCoords.y;\n\n link.start = external.cornerstoneMath.point.findClosestPoint(points, link.end);\n\n const boundingBoxPoints = [{\n // Top middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top\n }, {\n // Left middle point of bounding box\n x: boundingBox.left,\n y: boundingBox.top + boundingBox.height / 2\n }, {\n // Bottom middle point of bounding box\n x: boundingBox.left + boundingBox.width / 2,\n y: boundingBox.top + boundingBox.height\n }, {\n // Right middle point of bounding box\n x: boundingBox.left + boundingBox.width,\n y: boundingBox.top + boundingBox.height / 2\n }\n ];\n\n link.end = external.cornerstoneMath.point.findClosestPoint(boundingBoxPoints, link.start);\n\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.setLineDash([2, 3]);\n context.moveTo(link.start.x, link.start.y);\n context.lineTo(link.end.x, link.end.y);\n context.stroke();\n }\n }\n\n context.restore();\n }\n}\n// /////// END IMAGE RENDERING ///////\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction addNewMeasurement (mouseEventData) {\n const cornerstone = external.cornerstone;\n const measurementData = createNewMeasurement(mouseEventData);\n const element = mouseEventData.element;\n\n // Associate this data with this imageId so we can render it and manipulate it\n addToolState(element, toolType, measurementData);\n\n // Since we are dragging to another place to drop the end point, we can just activate\n // The end point and let the moveHandle move it for us.\n element.removeEventListener(EVENTS.MOUSE_MOVE, simpleAngle.mouseMoveCallback);\n element.removeEventListener(EVENTS.MOUSE_DRAG, simpleAngle.mouseMoveCallback);\n element.removeEventListener(EVENTS.MOUSE_DOWN, simpleAngle.mouseDownCallback);\n element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, simpleAngle.mouseDownActivateCallback);\n cornerstone.updateImage(element);\n\n moveNewHandle(mouseEventData, toolType, measurementData, measurementData.handles.middle, function () {\n measurementData.active = false;\n if (anyHandlesOutsideImage(mouseEventData, measurementData.handles)) {\n // Delete the measurement\n removeToolState(element, toolType, measurementData);\n\n element.addEventListener(EVENTS.MOUSE_MOVE, simpleAngle.mouseMoveCallback);\n element.addEventListener(EVENTS.MOUSE_DRAG, simpleAngle.mouseMoveCallback);\n element.addEventListener(EVENTS.MOUSE_DOWN, simpleAngle.mouseDownCallback);\n element.addEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, simpleAngle.mouseDownActivateCallback);\n cornerstone.updateImage(element);\n\n return;\n }\n\n measurementData.handles.end.active = true;\n cornerstone.updateImage(element);\n\n moveNewHandle(mouseEventData, toolType, measurementData, measurementData.handles.end, function () {\n measurementData.active = false;\n if (anyHandlesOutsideImage(mouseEventData, measurementData.handles)) {\n // Delete the measurement\n removeToolState(element, toolType, measurementData);\n }\n\n element.addEventListener(EVENTS.MOUSE_MOVE, simpleAngle.mouseMoveCallback);\n element.addEventListener(EVENTS.MOUSE_DRAG, simpleAngle.mouseMoveCallback);\n element.addEventListener(EVENTS.MOUSE_DOWN, simpleAngle.mouseDownCallback);\n element.addEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, simpleAngle.mouseDownActivateCallback);\n cornerstone.updateImage(element);\n });\n });\n}\n\nfunction addNewMeasurementTouch (touchEventData) {\n const cornerstone = external.cornerstone;\n const measurementData = createNewMeasurement(touchEventData);\n const element = touchEventData.element;\n\n // Associate this data with this imageId so we can render it and manipulate it\n addToolState(element, toolType, measurementData);\n\n // Since we are dragging to another place to drop the end point, we can just activate\n // The end point and let the moveHandle move it for us.\n element.removeEventListener(EVENTS.TOUCH_DRAG, simpleAngleTouch.touchMoveCallback);\n element.removeEventListener(EVENTS.TOUCH_START_ACTIVE, simpleAngleTouch.touchDownActivateCallback);\n element.removeEventListener(EVENTS.TOUCH_START, simpleAngleTouch.touchStartCallback);\n element.removeEventListener(EVENTS.TAP, simpleAngleTouch.tapCallback);\n cornerstone.updateImage(element);\n\n moveNewHandleTouch(touchEventData, toolType, measurementData, measurementData.handles.middle, function () {\n if (anyHandlesOutsideImage(touchEventData, measurementData.handles)) {\n // Delete the measurement\n removeToolState(element, toolType, measurementData);\n element.addEventListener(EVENTS.TOUCH_DRAG, simpleAngleTouch.touchMoveCallback);\n element.addEventListener(EVENTS.TOUCH_START, simpleAngleTouch.touchStartCallback);\n element.addEventListener(EVENTS.TOUCH_START_ACTIVE, simpleAngleTouch.touchDownActivateCallback);\n element.addEventListener(EVENTS.TAP, simpleAngleTouch.tapCallback);\n cornerstone.updateImage(element);\n\n return;\n }\n\n moveNewHandleTouch(touchEventData, toolType, measurementData, measurementData.handles.end, function () {\n if (anyHandlesOutsideImage(touchEventData, measurementData.handles)) {\n // Delete the measurement\n removeToolState(element, toolType, measurementData);\n cornerstone.updateImage(element);\n }\n\n element.addEventListener(EVENTS.TOUCH_DRAG, simpleAngleTouch.touchMoveCallback);\n element.addEventListener(EVENTS.TOUCH_START, simpleAngleTouch.touchStartCallback);\n element.addEventListener(EVENTS.TOUCH_START_ACTIVE, simpleAngleTouch.touchDownActivateCallback);\n element.addEventListener(EVENTS.TAP, simpleAngleTouch.tapCallback);\n });\n });\n}\n\nconst simpleAngle = mouseButtonTool({\n createNewMeasurement,\n addNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType\n});\n\nconst simpleAngleTouch = touchTool({\n createNewMeasurement,\n addNewMeasurement: addNewMeasurementTouch,\n onImageRendered,\n pointNearTool,\n toolType\n});\n\nexport {\n simpleAngle,\n simpleAngleTouch\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/simpleAngle.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport mouseButtonTool from './mouseButtonTool.js';\nimport touchTool from './touchTool.js';\nimport pointInsideBoundingBox from '../util/pointInsideBoundingBox.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport drawTextBox from '../util/drawTextBox.js';\nimport { removeToolState, getToolState } from '../stateManagement/toolState.js';\nimport { getToolOptions } from '../toolOptions.js';\n\nconst toolType = 'textMarker';\n\n// /////// BEGIN ACTIVE TOOL ///////\nfunction createNewMeasurement (mouseEventData) {\n const config = textMarker.getConfiguration();\n\n if (!config.current) {\n return;\n }\n\n // Create the measurement data for this tool with the end handle activated\n const measurementData = {\n visible: true,\n active: true,\n text: config.current,\n handles: {\n end: {\n x: mouseEventData.currentPoints.image.x,\n y: mouseEventData.currentPoints.image.y,\n highlight: true,\n active: true,\n hasBoundingBox: true\n }\n }\n };\n\n // Create a rectangle representing the image\n const imageRect = {\n left: 0,\n top: 0,\n width: mouseEventData.image.width,\n height: mouseEventData.image.height\n };\n\n // Check if the current handle is outside the image,\n // If it is, prevent the handle creation\n if (!external.cornerstoneMath.point.insideRect(measurementData.handles.end, imageRect)) {\n return;\n }\n\n // Update the current marker for the next marker\n let currentIndex = config.markers.indexOf(config.current);\n\n if (config.ascending) {\n currentIndex += 1;\n if (currentIndex >= config.markers.length) {\n if (config.loop) {\n currentIndex -= config.markers.length;\n } else {\n currentIndex = -1;\n }\n }\n } else {\n currentIndex -= 1;\n if (currentIndex < 0) {\n if (config.loop) {\n currentIndex += config.markers.length;\n } else {\n currentIndex = -1;\n }\n }\n }\n\n config.current = config.markers[currentIndex];\n\n return measurementData;\n}\n// /////// END ACTIVE TOOL ///////\n\n// /////// BEGIN IMAGE RENDERING ///////\nfunction pointNearTool (element, data, coords) {\n if (!data.handles.end.boundingBox) {\n return;\n }\n\n const distanceToPoint = external.cornerstoneMath.rect.distanceToPoint(data.handles.end.boundingBox, coords);\n const insideBoundingBox = pointInsideBoundingBox(data.handles.end, coords);\n\n\n return (distanceToPoint < 10) || insideBoundingBox;\n}\n\nfunction onImageRendered (e) {\n const eventData = e.detail;\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(eventData.element, toolType);\n\n if (!toolData) {\n return;\n }\n\n // We have tool data for this element - iterate over each one and draw it\n const context = eventData.canvasContext.canvas.getContext('2d');\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n const config = textMarker.getConfiguration();\n\n for (let i = 0; i < toolData.data.length; i++) {\n const data = toolData.data[i];\n\n let color = toolColors.getToolColor();\n\n if (data.active) {\n color = toolColors.getActiveColor();\n }\n\n context.save();\n\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n // Draw text\n context.fillStyle = color;\n const measureText = context.measureText(data.text);\n\n data.textWidth = measureText.width + 10;\n\n const textCoords = external.cornerstone.pixelToCanvas(eventData.element, data.handles.end);\n\n const options = {\n centering: {\n x: true,\n y: true\n }\n };\n\n data.handles.end.boundingBox = drawTextBox(context, data.text, textCoords.x, textCoords.y - 10, color, options);\n\n context.restore();\n }\n}\n\nfunction doubleClickCallback (e) {\n const eventData = e.detail;\n const cornerstone = external.cornerstone;\n const element = eventData.element;\n let data;\n const options = getToolOptions(toolType, element);\n\n if (!isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) {\n return;\n }\n\n function doneChangingTextCallback (data, updatedText, deleteTool) {\n if (deleteTool === true) {\n removeToolState(element, toolType, data);\n } else {\n data.text = updatedText;\n }\n\n data.active = false;\n cornerstone.updateImage(element);\n\n element.addEventListener(EVENTS.MOUSE_MOVE, textMarker.mouseMoveCallback);\n element.addEventListener(EVENTS.MOUSE_DOWN, textMarker.mouseDownCallback);\n element.addEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, textMarker.mouseDownActivateCallback);\n element.addEventListener(EVENTS.MOUSE_DOUBLE_CLICK, textMarker.mouseDoubleClickCallback);\n }\n\n const config = textMarker.getConfiguration();\n const coords = eventData.currentPoints.canvas;\n const toolData = getToolState(element, toolType);\n\n // Now check to see if there is a handle we can move\n if (!toolData) {\n return;\n }\n\n for (let i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (pointNearTool(element, data, coords)) {\n data.active = true;\n cornerstone.updateImage(element);\n\n element.removeEventListener(EVENTS.MOUSE_MOVE, textMarker.mouseMoveCallback);\n element.removeEventListener(EVENTS.MOUSE_DOWN, textMarker.mouseDownCallback);\n element.removeEventListener(EVENTS.MOUSE_DOWN_ACTIVATE, textMarker.mouseDownActivateCallback);\n element.removeEventListener(EVENTS.MOUSE_DOUBLE_CLICK, textMarker.mouseDoubleClickCallback);\n // Allow relabelling via a callback\n config.changeTextCallback(data, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n e.preventDefault();\n e.stopPropagation();\n\n return;\n }\n }\n\n e.preventDefault();\n e.stopPropagation();\n}\n\nfunction touchPressCallback (e) {\n const eventData = e.detail;\n const cornerstone = external.cornerstone;\n const element = eventData.element;\n let data;\n\n function doneChangingTextCallback (data, updatedText, deleteTool) {\n if (deleteTool === true) {\n removeToolState(element, toolType, data);\n } else {\n data.text = updatedText;\n }\n\n data.active = false;\n cornerstone.updateImage(element);\n\n element.addEventListener(EVENTS.TOUCH_DRAG, textMarkerTouch.touchMoveCallback);\n element.addEventListener(EVENTS.TOUCH_START_ACTIVE, textMarkerTouch.touchDownActivateCallback);\n element.addEventListener(EVENTS.TOUCH_START, textMarkerTouch.touchStartCallback);\n element.addEventListener(EVENTS.TAP, textMarkerTouch.tapCallback);\n element.addEventListener(EVENTS.TOUCH_PRESS, textMarkerTouch.pressCallback);\n }\n\n const config = textMarker.getConfiguration();\n\n const coords = eventData.currentPoints.canvas;\n const toolData = getToolState(element, toolType);\n\n // Now check to see if there is a handle we can move\n if (!toolData) {\n return false;\n }\n\n if (eventData.handlePressed) {\n eventData.handlePressed.active = true;\n cornerstone.updateImage(element);\n\n element.removeEventListener(EVENTS.TOUCH_DRAG, textMarkerTouch.touchMoveCallback);\n element.removeEventListener(EVENTS.TOUCH_START_ACTIVE, textMarkerTouch.touchDownActivateCallback);\n element.removeEventListener(EVENTS.TOUCH_START, textMarkerTouch.touchStartCallback);\n element.removeEventListener(EVENTS.TAP, textMarkerTouch.tapCallback);\n element.removeEventListener(EVENTS.TOUCH_PRESS, textMarkerTouch.pressCallback);\n\n // Allow relabelling via a callback\n config.changeTextCallback(eventData.handlePressed, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n e.preventDefault();\n e.stopPropagation();\n\n return;\n }\n\n for (let i = 0; i < toolData.data.length; i++) {\n data = toolData.data[i];\n if (pointNearTool(element, data, coords)) {\n data.active = true;\n cornerstone.updateImage(element);\n\n element.removeEventListener(EVENTS.TOUCH_DRAG, textMarkerTouch.touchMoveCallback);\n element.removeEventListener(EVENTS.TOUCH_START_ACTIVE, textMarkerTouch.touchDownActivateCallback);\n element.removeEventListener(EVENTS.TOUCH_START, textMarkerTouch.touchStartCallback);\n element.removeEventListener(EVENTS.TAP, textMarkerTouch.tapCallback);\n element.removeEventListener(EVENTS.TOUCH_PRESS, textMarkerTouch.pressCallback);\n // Allow relabelling via a callback\n config.changeTextCallback(data, eventData, doneChangingTextCallback);\n\n e.stopImmediatePropagation();\n e.preventDefault();\n e.stopPropagation();\n\n return;\n }\n }\n\n e.preventDefault();\n e.stopPropagation();\n}\n\nconst textMarker = mouseButtonTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType,\n mouseDoubleClickCallback: doubleClickCallback\n});\n\nconst textMarkerTouch = touchTool({\n createNewMeasurement,\n onImageRendered,\n pointNearTool,\n toolType,\n pressCallback: touchPressCallback\n});\n\nexport {\n textMarker,\n textMarkerTouch\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/textMarker.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport simpleMouseButtonTool from './simpleMouseButtonTool.js';\nimport touchDragTool from './touchDragTool.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport { getToolOptions } from '../toolOptions.js';\n\nconst toolType = 'wwwc';\n\nfunction mouseUpCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n element.removeEventListener(EVENTS.MOUSE_DRAG, mouseDragCallback);\n element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n}\n\nfunction mouseDownCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const options = getToolOptions(toolType, element);\n\n if (isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) {\n element.addEventListener(EVENTS.MOUSE_DRAG, mouseDragCallback);\n element.addEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.addEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n\n e.preventDefault();\n e.stopPropagation();\n }\n}\n\nfunction defaultStrategy (eventData) {\n // Here we normalize the ww/wc adjustments so the same number of on screen pixels\n // Adjusts the same percentage of the dynamic range of the image. This is needed to\n // Provide consistency for the ww/wc tool regardless of the dynamic range (e.g. an 8 bit\n // Image will feel the same as a 16 bit image would)\n const maxVOI = eventData.image.maxPixelValue * eventData.image.slope + eventData.image.intercept;\n const minVOI = eventData.image.minPixelValue * eventData.image.slope + eventData.image.intercept;\n const imageDynamicRange = maxVOI - minVOI;\n const multiplier = imageDynamicRange / 1024;\n\n const deltaX = eventData.deltaPoints.page.x * multiplier;\n const deltaY = eventData.deltaPoints.page.y * multiplier;\n\n eventData.viewport.voi.windowWidth += (deltaX);\n eventData.viewport.voi.windowCenter += (deltaY);\n}\n\nfunction mouseDragCallback (e) {\n const eventData = e.detail;\n\n wwwc.strategy(eventData);\n external.cornerstone.setViewport(eventData.element, eventData.viewport);\n}\n\nfunction touchDragCallback (e) {\n const eventData = e.detail;\n\n e.stopImmediatePropagation(); // Prevent CornerstoneToolsTouchStartActive from killing any press events\n const dragData = eventData;\n\n const maxVOI = dragData.image.maxPixelValue * dragData.image.slope + dragData.image.intercept;\n const minVOI = dragData.image.minPixelValue * dragData.image.slope + dragData.image.intercept;\n const imageDynamicRange = maxVOI - minVOI;\n const multiplier = imageDynamicRange / 1024;\n const deltaX = dragData.deltaPoints.page.x * multiplier;\n const deltaY = dragData.deltaPoints.page.y * multiplier;\n\n const config = wwwc.getConfiguration();\n\n if (config.orientation) {\n if (config.orientation === 0) {\n dragData.viewport.voi.windowWidth += (deltaX);\n dragData.viewport.voi.windowCenter += (deltaY);\n } else {\n dragData.viewport.voi.windowWidth += (deltaY);\n dragData.viewport.voi.windowCenter += (deltaX);\n }\n } else {\n dragData.viewport.voi.windowWidth += (deltaX);\n dragData.viewport.voi.windowCenter += (deltaY);\n }\n\n external.cornerstone.setViewport(dragData.element, dragData.viewport);\n}\n\nconst wwwc = simpleMouseButtonTool(mouseDownCallback, toolType);\n\nwwwc.strategies = {\n default: defaultStrategy\n};\n\nwwwc.strategy = defaultStrategy;\n\nconst wwwcTouchDrag = touchDragTool(touchDragCallback);\n\nexport {\n wwwc,\n wwwcTouchDrag\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/wwwc.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport toolStyle from '../stateManagement/toolStyle.js';\nimport toolColors from '../stateManagement/toolColors.js';\nimport { getToolState, addToolState } from '../stateManagement/toolState.js';\nimport getLuminance from '../util/getLuminance.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport { setToolOptions, getToolOptions } from '../toolOptions.js';\n\nconst toolType = 'wwwcRegion';\n\nlet configuration = {\n minWindowWidth: 10\n};\n\n/** Calculates the minimum, maximum, and mean value in the given pixel array */\nfunction calculateMinMaxMean (storedPixelLuminanceData, globalMin, globalMax) {\n const numPixels = storedPixelLuminanceData.length;\n\n if (numPixels < 2) {\n return {\n min: globalMin,\n max: globalMax,\n mean: (globalMin + globalMax) / 2\n };\n }\n\n let min = globalMax;\n let max = globalMin;\n let sum = 0;\n\n for (let index = 0; index < numPixels; index++) {\n const spv = storedPixelLuminanceData[index];\n\n min = Math.min(min, spv);\n max = Math.max(max, spv);\n sum += spv;\n }\n\n return {\n min,\n max,\n mean: sum / numPixels\n };\n}\n\n/* Erases the toolData and rebinds the handlers when the image changes */\nfunction newImageCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const toolData = getToolState(element, toolType);\n\n if (toolData && toolData.data) {\n toolData.data = [];\n }\n\n element.removeEventListener(EVENTS.MOUSE_MOVE, dragCallback);\n element.removeEventListener(EVENTS.MOUSE_DRAG, dragCallback);\n\n element.removeEventListener(EVENTS.MOUSE_UP, dragEndCallback);\n element.removeEventListener(EVENTS.MOUSE_CLICK, dragEndCallback);\n\n element.addEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n}\n\n/* Applies the windowing procedure when the mouse drag ends */\nfunction dragEndCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n element.removeEventListener(EVENTS.MOUSE_MOVE, dragCallback);\n element.removeEventListener(EVENTS.MOUSE_DRAG, dragCallback);\n\n element.removeEventListener(EVENTS.MOUSE_UP, dragEndCallback);\n element.removeEventListener(EVENTS.MOUSE_CLICK, dragEndCallback);\n\n element.addEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n\n const toolData = getToolState(eventData.element, toolType);\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n // Update the endpoint as the mouse/touch is dragged\n toolData.data[0].endPoint = {\n x: eventData.currentPoints.image.x,\n y: eventData.currentPoints.image.y\n };\n\n applyWWWCRegion(eventData);\n}\n\n/** Calculates the minimum and maximum value in the given pixel array */\nfunction applyWWWCRegion (eventData) {\n const cornerstone = external.cornerstone;\n const toolData = getToolState(eventData.element, toolType);\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n const startPoint = toolData.data[0].startPoint;\n const endPoint = toolData.data[0].endPoint;\n\n // Get the rectangular region defined by the handles\n let width = Math.abs(startPoint.x - endPoint.x);\n let height = Math.abs(startPoint.y - endPoint.y);\n\n let left = Math.min(startPoint.x, endPoint.x);\n let top = Math.min(startPoint.y, endPoint.y);\n\n // Bound the rectangle so we don't get undefined pixels\n left = Math.max(left, 0);\n left = Math.min(left, eventData.image.width);\n top = Math.max(top, 0);\n top = Math.min(top, eventData.image.height);\n width = Math.floor(Math.min(width, Math.abs(eventData.image.width - left)));\n height = Math.floor(Math.min(height, Math.abs(eventData.image.height - top)));\n\n // Get the pixel data in the rectangular region\n const pixelLuminanceData = getLuminance(eventData.element, left, top, width, height);\n\n // Calculate the minimum and maximum pixel values\n const minMaxMean = calculateMinMaxMean(pixelLuminanceData, eventData.image.minPixelValue, eventData.image.maxPixelValue);\n\n // Adjust the viewport window width and center based on the calculated values\n const config = wwwcRegion.getConfiguration();\n const viewport = cornerstone.getViewport(eventData.element);\n\n if (config.minWindowWidth === undefined) {\n config.minWindowWidth = 10;\n }\n\n viewport.voi.windowWidth = Math.max(Math.abs(minMaxMean.max - minMaxMean.min), config.minWindowWidth);\n viewport.voi.windowCenter = minMaxMean.mean;\n cornerstone.setViewport(eventData.element, viewport);\n\n // Clear the toolData\n toolData.data = [];\n\n cornerstone.updateImage(eventData.element);\n}\n\nfunction whichMovement (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n element.removeEventListener(EVENTS.MOUSE_MOVE, whichMovement);\n element.removeEventListener(EVENTS.MOUSE_DRAG, whichMovement);\n\n element.addEventListener(EVENTS.MOUSE_MOVE, dragCallback);\n element.addEventListener(EVENTS.MOUSE_DRAG, dragCallback);\n\n element.addEventListener(EVENTS.MOUSE_CLICK, dragEndCallback);\n if (e.type === EVENTS.MOUSE_DRAG) {\n element.addEventListener(EVENTS.MOUSE_UP, dragEndCallback);\n }\n}\n\n/** Records the start point and attaches the drag event handler */\nfunction mouseDownCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const options = getToolOptions(toolType, element);\n\n if (isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) {\n element.addEventListener(EVENTS.MOUSE_DRAG, whichMovement);\n element.addEventListener(EVENTS.MOUSE_MOVE, whichMovement);\n\n element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n recordStartPoint(eventData);\n\n return false;\n }\n}\n\n/** Records the start point of the click or touch */\nfunction recordStartPoint (eventData) {\n const toolData = getToolState(eventData.element, toolType);\n\n if (toolData && toolData.data) {\n toolData.data = [];\n }\n\n const measurementData = {\n startPoint: {\n x: eventData.currentPoints.image.x,\n y: eventData.currentPoints.image.y\n }\n };\n\n addToolState(eventData.element, toolType, measurementData);\n}\n\n/** Draws the rectangular region while the touch or mouse event drag occurs */\nfunction dragCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n // If we have no toolData for this element, return immediately as there is nothing to do\n const toolData = getToolState(element, toolType);\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n // Update the endpoint as the mouse/touch is dragged\n toolData.data[0].endPoint = {\n x: eventData.currentPoints.image.x,\n y: eventData.currentPoints.image.y\n };\n\n external.cornerstone.updateImage(element);\n}\n\nfunction onImageRendered (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const context = eventData.canvasContext;\n const cornerstone = external.cornerstone;\n const toolData = getToolState(eventData.element, toolType);\n\n if (!toolData || !toolData.data || !toolData.data.length) {\n return;\n }\n\n const startPoint = toolData.data[0].startPoint;\n const endPoint = toolData.data[0].endPoint;\n\n if (!startPoint || !endPoint) {\n return;\n }\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n // Set to the active tool color\n const color = toolColors.getActiveColor();\n\n // Calculate the rectangle parameters\n const startPointCanvas = cornerstone.pixelToCanvas(element, startPoint);\n const endPointCanvas = cornerstone.pixelToCanvas(element, endPoint);\n\n const left = Math.min(startPointCanvas.x, endPointCanvas.x);\n const top = Math.min(startPointCanvas.y, endPointCanvas.y);\n const width = Math.abs(startPointCanvas.x - endPointCanvas.x);\n const height = Math.abs(startPointCanvas.y - endPointCanvas.y);\n\n const lineWidth = toolStyle.getToolWidth();\n const config = wwwcRegion.getConfiguration();\n\n // Draw the rectangle\n context.save();\n\n if (config && config.shadow) {\n context.shadowColor = config.shadowColor || '#000000';\n context.shadowOffsetX = config.shadowOffsetX || 1;\n context.shadowOffsetY = config.shadowOffsetY || 1;\n }\n\n context.beginPath();\n context.strokeStyle = color;\n context.lineWidth = lineWidth;\n context.rect(left, top, width, height);\n context.stroke();\n\n context.restore();\n}\n\n// --- Mouse tool enable / disable --- ///\nfunction disable (element) {\n element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n\n element.removeEventListener(EVENTS.MOUSE_UP, dragEndCallback);\n element.removeEventListener(EVENTS.MOUSE_CLICK, dragEndCallback);\n\n element.removeEventListener(EVENTS.MOUSE_DRAG, dragCallback);\n element.removeEventListener(EVENTS.MOUSE_MOVE, dragCallback);\n\n element.removeEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n element.removeEventListener(EVENTS.NEW_IMAGE, newImageCallback);\n\n external.cornerstone.updateImage(element);\n}\n\nfunction activate (element, mouseButtonMask) {\n setToolOptions(toolType, element, { mouseButtonMask });\n\n const toolData = getToolState(element, toolType);\n\n if (!toolData) {\n const data = [];\n\n addToolState(element, toolType, data);\n }\n\n element.removeEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n\n element.removeEventListener(EVENTS.MOUSE_UP, dragEndCallback);\n element.removeEventListener(EVENTS.MOUSE_CLICK, dragEndCallback);\n\n element.removeEventListener(EVENTS.MOUSE_DRAG, dragCallback);\n element.removeEventListener(EVENTS.MOUSE_MOVE, dragCallback);\n\n element.removeEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n element.removeEventListener(EVENTS.NEW_IMAGE, newImageCallback);\n\n element.addEventListener(EVENTS.MOUSE_DOWN, mouseDownCallback);\n element.addEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n\n // If the displayed image changes after the user has started clicking, we should\n // Cancel the handlers and prepare for another click\n element.addEventListener(EVENTS.NEW_IMAGE, newImageCallback);\n\n external.cornerstone.updateImage(element);\n}\n\n// --- Touch tool enable / disable --- //\nfunction disableTouchDrag (element) {\n element.removeEventListener(EVENTS.TOUCH_DRAG, dragCallback);\n element.removeEventListener(EVENTS.TOUCH_START, recordStartPoint);\n element.removeEventListener(EVENTS.TOUCH_DRAG_END, applyWWWCRegion);\n element.removeEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n}\n\nfunction activateTouchDrag (element) {\n const toolData = getToolState(element, toolType);\n\n if (!toolData) {\n const data = [];\n\n addToolState(element, toolType, data);\n }\n\n element.removeEventListener(EVENTS.TOUCH_DRAG, dragCallback);\n element.removeEventListener(EVENTS.TOUCH_START, recordStartPoint);\n element.removeEventListener(EVENTS.TOUCH_DRAG_END, applyWWWCRegion);\n element.removeEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n\n element.addEventListener(EVENTS.TOUCH_DRAG, dragCallback);\n element.addEventListener(EVENTS.TOUCH_START, recordStartPoint);\n element.addEventListener(EVENTS.TOUCH_DRAG_END, applyWWWCRegion);\n element.addEventListener(EVENTS.IMAGE_RENDERED, onImageRendered);\n}\n\nfunction getConfiguration () {\n return configuration;\n}\n\nfunction setConfiguration (config) {\n configuration = config;\n}\n\n// Module exports\nconst wwwcRegion = {\n activate,\n deactivate: disable,\n disable,\n setConfiguration,\n getConfiguration\n};\n\nconst wwwcRegionTouch = {\n activate: activateTouchDrag,\n deactivate: disableTouchDrag,\n disable: disableTouchDrag\n};\n\nexport {\n wwwcRegion,\n wwwcRegionTouch\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/wwwcRegion.js","import EVENTS from '../events.js';\nimport external from '../externalModules.js';\nimport simpleMouseButtonTool from './simpleMouseButtonTool.js';\nimport isMouseButtonEnabled from '../util/isMouseButtonEnabled.js';\nimport mouseWheelTool from './mouseWheelTool.js';\nimport touchPinchTool from './touchPinchTool.js';\nimport touchDragTool from './touchDragTool.js';\nimport { getToolOptions } from '../toolOptions.js';\n\nconst toolType = 'zoom';\nlet startPoints;\n\nfunction changeViewportScale (viewport, ticks) {\n const config = zoom.getConfiguration();\n const pow = 1.7;\n\n const oldFactor = Math.log(viewport.scale) / Math.log(pow);\n const factor = oldFactor + ticks;\n\n const scale = Math.pow(pow, factor);\n\n if (config.maxScale && scale > config.maxScale) {\n viewport.scale = config.maxScale;\n } else if (config.minScale && scale < config.minScale) {\n viewport.scale = config.minScale;\n } else {\n viewport.scale = scale;\n }\n\n return viewport;\n}\n\nfunction boundPosition (position, width, height) {\n position.x = Math.max(position.x, 0);\n position.y = Math.max(position.y, 0);\n position.x = Math.min(position.x, width);\n position.y = Math.min(position.y, height);\n\n return position;\n}\n\nfunction correctShift (shift, viewport) {\n // Apply Flips\n if (viewport.hflip) {\n shift.x *= -1;\n }\n\n if (viewport.vflip) {\n shift.y *= -1;\n }\n\n // Apply rotations\n if (viewport.rotation !== 0) {\n const angle = viewport.rotation * Math.PI / 180;\n\n const cosA = Math.cos(angle);\n const sinA = Math.sin(angle);\n\n const newX = shift.x * cosA - shift.y * sinA;\n const newY = shift.x * sinA + shift.y * cosA;\n\n shift.x = newX;\n shift.y = newY;\n }\n\n return shift;\n}\n\nfunction defaultStrategy (eventData, ticks) {\n const cornerstone = external.cornerstone;\n const element = eventData.element;\n\n // Calculate the new scale factor based on how far the mouse has changed\n const viewport = changeViewportScale(eventData.viewport, ticks);\n\n cornerstone.setViewport(element, viewport);\n\n // Now that the scale has been updated, determine the offset we need to apply to the center so we can\n // Keep the original start location in the same position\n const newCoords = cornerstone.pageToPixel(element, eventData.startPoints.page.x, eventData.startPoints.page.y);\n\n // The shift we will use is the difference between the original image coordinates of the point we've selected\n // And the image coordinates of the same point on the page after the viewport scaling above has been performed\n // This shift is in image coordinates, and is designed to keep the target location fixed on the page.\n let shift = {\n x: eventData.startPoints.image.x - newCoords.x,\n y: eventData.startPoints.image.y - newCoords.y\n };\n\n // Correct the required shift using the viewport rotation and flip parameters\n shift = correctShift(shift, viewport);\n\n // Apply the shift to the Viewport's translation setting\n viewport.translation.x -= shift.x;\n viewport.translation.y -= shift.y;\n\n // Update the Viewport with the new translation value\n cornerstone.setViewport(element, viewport);\n}\n\nfunction translateStrategy (eventData, ticks) {\n const element = eventData.element;\n const image = eventData.image;\n const config = zoom.getConfiguration();\n\n // Calculate the new scale factor based on how far the mouse has changed\n // Note that in this case we don't need to update the viewport after the initial\n // Zoom step since we aren't don't intend to keep the target position static on\n // The page\n const viewport = changeViewportScale(eventData.viewport, ticks);\n\n // Define the default shift to take place during this zoom step\n const shift = {\n x: 0,\n y: 0\n };\n\n // Define the parameters for the translate strategy\n const translateSpeed = 8;\n const outwardsMinScaleToTranslate = 3;\n const minTranslation = 0.01;\n\n if (ticks < 0) {\n // Zoom outwards from the image center\n if (viewport.scale < outwardsMinScaleToTranslate) {\n // If the current translation is smaller than the minimum desired translation,\n // Set the translation to zero\n if (Math.abs(viewport.translation.x) < minTranslation) {\n viewport.translation.x = 0;\n } else {\n shift.x = viewport.translation.x / translateSpeed;\n }\n\n // If the current translation is smaller than the minimum desired translation,\n // Set the translation to zero\n if (Math.abs(viewport.translation.y) < minTranslation) {\n viewport.translation.y = 0;\n } else {\n shift.y = viewport.translation.y / translateSpeed;\n }\n }\n } else {\n // Zoom inwards to the current image point\n\n // Identify the coordinates of the point the user is trying to zoom into\n // If we are not allowed to zoom outside the image, bound the user-selected position to\n // A point inside the image\n if (config && config.preventZoomOutsideImage) {\n startPoints.image = boundPosition(startPoints.image, image.width, image.height);\n }\n\n // Calculate the translation value that would place the desired image point in the center\n // Of the viewport\n let desiredTranslation = {\n x: image.width / 2 - startPoints.image.x,\n y: image.height / 2 - startPoints.image.y\n };\n\n // Correct the target location using the viewport rotation and flip parameters\n desiredTranslation = correctShift(desiredTranslation, viewport);\n\n // Calculate the difference between the current viewport translation value and the\n // Final desired translation values\n const distanceToDesired = {\n x: viewport.translation.x - desiredTranslation.x,\n y: viewport.translation.y - desiredTranslation.y\n };\n\n // If the current translation is smaller than the minimum desired translation,\n // Stop translating in the x-direction\n if (Math.abs(distanceToDesired.x) < minTranslation) {\n viewport.translation.x = desiredTranslation.x;\n } else {\n // Otherwise, shift the viewport by one step\n shift.x = distanceToDesired.x / translateSpeed;\n }\n\n // If the current translation is smaller than the minimum desired translation,\n // Stop translating in the y-direction\n if (Math.abs(distanceToDesired.y) < minTranslation) {\n viewport.translation.y = desiredTranslation.y;\n } else {\n // Otherwise, shift the viewport by one step\n shift.y = distanceToDesired.y / translateSpeed;\n }\n }\n\n // Apply the shift to the Viewport's translation setting\n viewport.translation.x -= shift.x;\n viewport.translation.y -= shift.y;\n\n // Update the Viewport with the new translation value\n external.cornerstone.setViewport(element, viewport);\n}\n\nfunction zoomToCenterStrategy (eventData, ticks) {\n const element = eventData.element;\n\n // Calculate the new scale factor based on how far the mouse has changed\n const viewport = changeViewportScale(eventData.viewport, ticks);\n\n external.cornerstone.setViewport(element, viewport);\n}\n\nfunction mouseUpCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n\n element.removeEventListener(EVENTS.MOUSE_DRAG, dragCallback);\n element.removeEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.removeEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n}\n\nfunction mouseDownCallback (e) {\n const eventData = e.detail;\n const element = eventData.element;\n const options = getToolOptions(toolType, element);\n\n if (isMouseButtonEnabled(eventData.which, options.mouseButtonMask)) {\n startPoints = eventData.startPoints; // Used for translateStrategy\n element.addEventListener(EVENTS.MOUSE_DRAG, dragCallback);\n element.addEventListener(EVENTS.MOUSE_UP, mouseUpCallback);\n element.addEventListener(EVENTS.MOUSE_CLICK, mouseUpCallback);\n\n e.preventDefault();\n e.stopPropagation();\n }\n}\n\nfunction dragCallback (e) {\n const eventData = e.detail;\n\n if (!eventData.deltaPoints.page.y) {\n return false;\n }\n\n const ticks = eventData.deltaPoints.page.y / 100;\n\n zoom.strategy(eventData, ticks);\n\n e.preventDefault();\n e.stopPropagation();\n}\n\nfunction mouseWheelCallback (e) {\n const eventData = e.detail;\n let ticks = -eventData.direction / 4;\n\n // Allow inversion of the mouse wheel scroll via a configuration option\n const config = zoom.getConfiguration();\n\n if (config && config.invert) {\n ticks *= -1;\n }\n\n const viewport = changeViewportScale(eventData.viewport, ticks);\n\n external.cornerstone.setViewport(eventData.element, viewport);\n}\n\nfunction touchPinchCallback (e) {\n const eventData = e.detail;\n const cornerstone = external.cornerstone;\n const config = zoom.getConfiguration();\n const viewport = eventData.viewport;\n const element = eventData.element;\n\n // Change the scale based on the pinch gesture's scale change\n viewport.scale += eventData.scaleChange * viewport.scale;\n if (config.maxScale && viewport.scale > config.maxScale) {\n viewport.scale = config.maxScale;\n } else if (config.minScale && viewport.scale < config.minScale) {\n viewport.scale = config.minScale;\n }\n\n cornerstone.setViewport(element, viewport);\n\n // Now that the scale has been updated, determine the offset we need to apply to the center so we can\n // Keep the original start location in the same position\n const newCoords = cornerstone.pageToPixel(element, eventData.startPoints.page.x, eventData.startPoints.page.y);\n let shift = {\n x: eventData.startPoints.image.x - newCoords.x,\n y: eventData.startPoints.image.y - newCoords.y\n };\n\n shift = correctShift(shift, viewport);\n viewport.translation.x -= shift.x;\n viewport.translation.y -= shift.y;\n cornerstone.setViewport(element, viewport);\n}\n\nconst zoom = simpleMouseButtonTool(mouseDownCallback, toolType);\n\nzoom.strategies = {\n default: defaultStrategy,\n translate: translateStrategy,\n zoomToCenter: zoomToCenterStrategy\n};\n\nzoom.strategy = defaultStrategy;\n\nconst zoomWheel = mouseWheelTool(mouseWheelCallback);\nconst zoomTouchPinch = touchPinchTool(touchPinchCallback);\nconst zoomTouchDrag = touchDragTool(dragCallback, toolType);\n\nexport {\n zoom,\n zoomWheel,\n zoomTouchPinch,\n zoomTouchDrag\n};\n\n\n\n// WEBPACK FOOTER //\n// ./imageTools/zoom.js","import external from '../externalModules.js';\nimport { getToolState } from '../stateManagement/toolState.js';\nimport brushTool from './brushTool.js';\nimport getCircle from './getCircle.js';\nimport { drawBrushPixels, drawBrushOnCanvas } from './drawBrush.js';\n\n// This module is for creating segmentation overlays\nconst TOOL_STATE_TOOL_TYPE = 'brush';\nconst toolType = 'brush';\nconst configuration = {\n draw: 1,\n radius: 3,\n hoverColor: 'green',\n dragColor: 'yellow'\n};\n\nlet lastImageCoords;\nlet dragging = false;\n\nfunction paint (eventData) {\n const configuration = brush.getConfiguration();\n const element = eventData.element;\n const layer = external.cornerstone.getLayer(element, configuration.brushLayerId);\n const { rows, columns } = layer.image;\n const { x, y } = eventData.currentPoints.image;\n const toolData = getToolState(element, TOOL_STATE_TOOL_TYPE);\n const pixelData = toolData.data[0].pixelData;\n const brushPixelValue = configuration.draw;\n const radius = configuration.radius;\n\n if (x < 0 || x > columns ||\n y < 0 || y > rows) {\n return;\n }\n\n const pointerArray = getCircle(radius, rows, columns, x, y);\n\n drawBrushPixels(pointerArray, pixelData, brushPixelValue, columns);\n\n layer.invalid = true;\n\n external.cornerstone.updateImage(element);\n}\n\nfunction onMouseUp (e) {\n const eventData = e.detail;\n\n lastImageCoords = eventData.currentPoints.image;\n dragging = false;\n}\n\nfunction onMouseDown (e) {\n const eventData = e.detail;\n\n paint(eventData);\n dragging = true;\n lastImageCoords = eventData.currentPoints.image;\n}\n\nfunction onMouseMove (e) {\n const eventData = e.detail;\n\n lastImageCoords = eventData.currentPoints.image;\n external.cornerstone.updateImage(eventData.element);\n}\n\nfunction onDrag (e) {\n const eventData = e.detail;\n\n paint(eventData);\n dragging = true;\n lastImageCoords = eventData.currentPoints.image;\n}\n\nfunction onImageRendered (e) {\n const eventData = e.detail;\n\n if (!lastImageCoords) {\n return;\n }\n\n const { rows, columns } = eventData.image;\n const { x, y } = lastImageCoords;\n\n if (x < 0 || x > columns ||\n y < 0 || y > rows) {\n return;\n }\n\n // Draw the hover overlay on top of the pixel data\n const configuration = brush.getConfiguration();\n const radius = configuration.radius;\n const context = eventData.canvasContext;\n const color = dragging ? configuration.dragColor : configuration.hoverColor;\n const element = eventData.element;\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n const pointerArray = getCircle(radius, rows, columns, x, y);\n\n drawBrushOnCanvas(pointerArray, context, color, element);\n}\n\nconst brush = brushTool({\n onMouseMove,\n onMouseDown,\n onMouseUp,\n onDrag,\n toolType,\n onImageRendered\n});\n\nbrush.setConfiguration(configuration);\n\nexport { brush };\n\n\n\n// WEBPACK FOOTER //\n// ./paintingTools/brush.js","import external from '../externalModules.js';\nimport { getToolState } from '../stateManagement/toolState.js';\nimport brushTool from './brushTool.js';\nimport getCircle from './getCircle.js';\nimport { drawBrushPixels, drawBrushOnCanvas } from './drawBrush.js';\n\n// This module is for creating segmentation overlays\nconst TOOL_STATE_TOOL_TYPE = 'brush';\nconst toolType = 'adaptiveBrush';\nconst configuration = {\n draw: 1,\n radius: 3,\n tolerance: 5,\n minRadius: 1,\n hoverColor: 'green',\n dragColor: 'yellow'\n};\n\nlet lastImageCoords;\nlet thrMax;\nlet thrMin;\nlet currentRadius;\nlet dragging;\n\nfunction getGreyValues (pointerArray, pixelData, imageColumns) {\n const configuration = adaptiveBrush.getConfiguration();\n const tolerance = configuration.tolerance;\n let minValue = Number.MAX_VALUE;\n let maxValue = -Number.MAX_VALUE;\n\n pointerArray.forEach((point) => {\n const pixelIndex = point[1] * imageColumns + point[0];\n const greyValue = pixelData[pixelIndex];\n\n minValue = Math.min(greyValue, minValue);\n maxValue = Math.max(greyValue, maxValue);\n });\n\n thrMin = minValue - tolerance;\n thrMax = maxValue + tolerance;\n}\n\n// Draws the pointer with overlap calculation - Used on mouse clicked\nfunction paintAdaptiveBrush (imagePixelData, brushPixelData, rows, columns) {\n const configuration = adaptiveBrush.getConfiguration();\n const brushPixelValue = configuration.draw;\n const mouseX = Math.round(lastImageCoords.x);\n const mouseY = Math.round(lastImageCoords.y);\n let numPixelsOutsideThresholdWindow = null;\n let pointerArray = [];\n let radius = configuration.radius;\n\n /*\n * Find pixels within the brush area. If within the brush area there are pixels outside the threshold min / max,\n * decrease the brush radius until there are no sub/supra threshold pixels left (or until you reach the minimum radius).\n */\n while (numPixelsOutsideThresholdWindow !== 0 && radius > configuration.minRadius) {\n numPixelsOutsideThresholdWindow = 0;\n pointerArray = getCircle(radius, rows, columns, mouseX, mouseY);\n\n // Loop through each of the relative pixel coordinates for the brush\n for (let j = 0; j < pointerArray.length; j++) {\n // Calculate the x / y image coordinates using the brush and the current mouse position\n const xCoord = pointerArray[j][0];\n const yCoord = pointerArray[j][1];\n\n // Otherwise, retrieve the image pixel value in this location\n const pixelIndex = yCoord * columns + xCoord;\n const pixelValue = imagePixelData[pixelIndex];\n\n /*\n If the image pixel value is outside of the thresholds,\n increase the numPixelsOutsideThresholdWindow counter\n */\n if (pixelValue > thrMax || pixelValue < thrMin) {\n numPixelsOutsideThresholdWindow++;\n break;\n }\n }\n\n radius--;\n }\n\n if (numPixelsOutsideThresholdWindow === 0) {\n drawBrushPixels(pointerArray, brushPixelData, brushPixelValue, columns);\n }\n\n return radius;\n}\n\nfunction paint (eventData) {\n const configuration = adaptiveBrush.getConfiguration();\n const element = eventData.element;\n const layer = external.cornerstone.getLayer(element, configuration.brushLayerId);\n const baseLayer = external.cornerstone.getLayers(element)[0];\n const { rows, columns } = layer.image;\n const toolData = getToolState(element, TOOL_STATE_TOOL_TYPE);\n const brushData = toolData.data[0];\n\n currentRadius = paintAdaptiveBrush(baseLayer.image.getPixelData(), brushData.pixelData, rows, columns);\n layer.invalid = true;\n\n external.cornerstone.updateImage(element);\n}\n\nfunction erase (eventData) {\n const configuration = adaptiveBrush.getConfiguration();\n const element = eventData.element;\n const layer = external.cornerstone.getLayer(element, configuration.brushLayerId);\n const { rows, columns } = layer.image;\n const { x, y } = eventData.currentPoints.image;\n const toolData = getToolState(element, TOOL_STATE_TOOL_TYPE);\n const pixelData = toolData.data[0].pixelData;\n const brushPixelValue = configuration.draw;\n const radius = configuration.radius;\n\n if (x < 0 || x > columns ||\n y < 0 || y > rows) {\n return;\n }\n\n const pointerArray = getCircle(radius, rows, columns, x, y);\n\n drawBrushPixels(pointerArray, pixelData, brushPixelValue, columns);\n\n layer.invalid = true;\n\n external.cornerstone.updateImage(element);\n}\n\nfunction onMouseUp (e) {\n const eventData = e.detail;\n\n lastImageCoords = eventData.currentPoints.image;\n const configuration = adaptiveBrush.getConfiguration();\n\n dragging = false;\n currentRadius = configuration.radius;\n external.cornerstone.updateImage(eventData.element);\n}\n\nfunction onMouseDown (e) {\n const eventData = e.detail;\n\n const element = eventData.element;\n const configuration = adaptiveBrush.getConfiguration();\n const layer = external.cornerstone.getLayer(element, configuration.brushLayerId);\n const baseLayer = external.cornerstone.getLayers(element)[0];\n const { x, y } = eventData.currentPoints.image;\n const { rows, columns } = layer.image;\n const pointerArray = getCircle(configuration.radius, rows, columns, x, y);\n\n if (configuration.draw === 0) {\n erase(eventData);\n } else {\n getGreyValues(pointerArray, baseLayer.image.getPixelData(), columns);\n paint(eventData);\n }\n\n dragging = true;\n lastImageCoords = eventData.currentPoints.image;\n}\n\nfunction onMouseMove (e) {\n const eventData = e.detail;\n\n lastImageCoords = eventData.currentPoints.image;\n external.cornerstone.updateImage(eventData.element);\n}\n\nfunction onDrag (e) {\n const eventData = e.detail;\n\n if (configuration.draw === 0) {\n erase(eventData);\n } else {\n paint(eventData);\n }\n\n dragging = true;\n lastImageCoords = eventData.currentPoints.image;\n}\n\nfunction onImageRendered (e) {\n const eventData = e.detail;\n\n if (!lastImageCoords) {\n return;\n }\n\n const { rows, columns } = eventData.image;\n const { x, y } = lastImageCoords;\n\n if (x < 0 || x > columns ||\n y < 0 || y > rows) {\n return;\n }\n\n // Draw the hover overlay on top of the pixel data\n const configuration = adaptiveBrush.getConfiguration();\n const context = eventData.canvasContext;\n const color = dragging ? configuration.dragColor : configuration.hoverColor;\n const element = eventData.element;\n\n currentRadius = currentRadius || configuration.radius;\n\n context.setTransform(1, 0, 0, 1, 0, 0);\n\n const pointerArray = getCircle(currentRadius, rows, columns, x, y);\n\n drawBrushOnCanvas(pointerArray, context, color, element);\n}\n\nconst adaptiveBrush = brushTool({\n onMouseMove,\n onMouseDown,\n onMouseUp,\n onDrag,\n toolType,\n onImageRendered\n});\n\nadaptiveBrush.setConfiguration(configuration);\n\nexport { adaptiveBrush };\n\n\n\n// WEBPACK FOOTER //\n// ./paintingTools/adaptiveBrush.js","export default '2.0.0';\n\n\n\n// WEBPACK FOOTER //\n// ./version.js"],"sourceRoot":""}