UNPKG

custom-cornerstone-tools

Version:

Medical imaging tools for the Cornerstone library - customized for DrNuvem

1,464 lines (1,122 loc) 514 kB
/*! drnuvem-cornerstone-tools - 1.1.2 - 2017-11-24 | (c) 2017 Chris Hafey | https://bitbucket.org/antonio_drtis/drnuvem-cornerstone-tools */ (function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(); else if(typeof define === 'function' && define.amd) define("cornerstoneTools", [], factory); else if(typeof exports === 'object') exports["cornerstoneTools"] = factory(); else root["cornerstoneTools"] = factory(); })(this, function() { return /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) { /******/ return installedModules[moduleId].exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ i: moduleId, /******/ l: false, /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ /******/ // Flag the module as loaded /******/ module.l = true; /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /******/ /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ /******/ // define getter function for harmony exports /******/ __webpack_require__.d = function(exports, name, getter) { /******/ if(!__webpack_require__.o(exports, name)) { /******/ Object.defineProperty(exports, name, { /******/ configurable: false, /******/ enumerable: true, /******/ get: getter /******/ }); /******/ } /******/ }; /******/ /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = function(module) { /******/ var getter = module && module.__esModule ? /******/ function getDefault() { return module['default']; } : /******/ function getModuleExports() { return module; }; /******/ __webpack_require__.d(getter, 'a', getter); /******/ return getter; /******/ }; /******/ /******/ // Object.prototype.hasOwnProperty.call /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; /******/ /******/ // __webpack_public_path__ /******/ __webpack_require__.p = ""; /******/ /******/ // Load entry module and return exports /******/ return __webpack_require__(__webpack_require__.s = 60); /******/ }) /************************************************************************/ /******/ ([ /* 0 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var cornerstone = window.cornerstone; var cornerstoneMath = window.cornerstoneMath; var $ = window.$; var Hammer = window.Hammer; exports.default = { set cornerstone(cs) { cornerstone = cs; }, get cornerstone() { return cornerstone; }, set cornerstoneMath(cm) { cornerstoneMath = cm; }, get cornerstoneMath() { return cornerstoneMath; }, set $(module) { $ = module; }, get $() { return $; }, set Hammer(module) { Hammer = module; }, get Hammer() { return Hammer; } }; /***/ }), /* 1 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getElementToolStateManager = exports.setElementToolStateManager = exports.clearToolState = exports.removeToolState = exports.getToolState = exports.addToolState = undefined; var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); var _imageIdSpecificStateManager = __webpack_require__(16); var _triggerEvent = __webpack_require__(3); var _triggerEvent2 = _interopRequireDefault(_triggerEvent); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function getElementToolStateManager(element) { var enabledImage = _externalModules2.default.cornerstone.getEnabledElement(element); // If the enabledImage has no toolStateManager, create a default one for it // NOTE: This makes state management element specific if (enabledImage.toolStateManager === undefined) { enabledImage.toolStateManager = _imageIdSpecificStateManager.globalImageIdSpecificToolStateManager; } return enabledImage.toolStateManager; } // Here we add tool state, this is done by tools as well // As modules that restore saved state function addToolState(element, toolType, measurementData) { var toolStateManager = getElementToolStateManager(element); toolStateManager.add(element, toolType, measurementData); var eventType = 'CornerstoneToolsMeasurementAdded'; var eventData = { toolType: toolType, element: element, measurementData: measurementData }; (0, _triggerEvent2.default)(element, eventType, eventData); } // Here you can get state - used by tools as well as modules // That save state persistently function getToolState(element, toolType) { var toolStateManager = getElementToolStateManager(element); return toolStateManager.get(element, toolType); } function removeToolState(element, toolType, data) { var toolStateManager = getElementToolStateManager(element); var toolData = toolStateManager.get(element, toolType); // Find this tool data var indexOfData = -1; for (var i = 0; i < toolData.data.length; i++) { if (toolData.data[i] === data) { indexOfData = i; } } if (indexOfData !== -1) { toolData.data.splice(indexOfData, 1); var eventType = 'CornerstoneToolsMeasurementRemoved'; var eventData = { toolType: toolType, element: element, measurementData: data }; (0, _triggerEvent2.default)(element, eventType, eventData); } } function clearToolState(element, toolType) { var toolStateManager = getElementToolStateManager(element); var toolData = toolStateManager.get(element, toolType); // If any toolData actually exists, clear it if (toolData !== undefined) { toolData.data = []; } } // Sets the tool state manager for an element function setElementToolStateManager(element, toolStateManager) { var enabledImage = _externalModules2.default.cornerstone.getEnabledElement(element); enabledImage.toolStateManager = toolStateManager; } exports.addToolState = addToolState; exports.getToolState = getToolState; exports.removeToolState = removeToolState; exports.clearToolState = clearToolState; exports.setElementToolStateManager = setElementToolStateManager; exports.getElementToolStateManager = getElementToolStateManager; /***/ }), /* 2 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = function (which, mouseButtonMask) { var mouseButton = 1 << which - 1; return (mouseButtonMask & mouseButton) !== 0; }; /***/ }), /* 3 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = triggerEvent; var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * Trigger a CustomEvent * * @param {EventTarget} el The element or EventTarget to trigger the event upon * @param {String} type The event type name * @param {Object|null} detail=null The event data to be sent * @returns {boolean} The return value is false if at least one event listener called preventDefault(). Otherwise it returns true. */ function triggerEvent(el, type) { var detail = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; var event = void 0; // This check is needed to polyfill CustomEvent on IE11- if (typeof window.CustomEvent === 'function') { event = new CustomEvent(type.toLocaleLowerCase(), { detail: detail, cancelable: true }); } else { event = document.createEvent('CustomEvent'); event.initCustomEvent(type.toLocaleLowerCase(), true, true, detail); } // TODO: remove jQuery event triggers var jqEvent = _externalModules2.default.$.Event(type, detail); _externalModules2.default.$(el).trigger(jqEvent, detail); if (jqEvent.isImmediatePropagationStopped()) { return false; } return el.dispatchEvent(event); } /***/ }), /* 4 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var defaultColor = 'white', activeColor = 'greenyellow', fillColor = 'transparent'; function setFillColor(color) { fillColor = color; } function getFillColor() { return fillColor; } function setToolColor(color) { defaultColor = color; } function getToolColor() { return defaultColor; } function setActiveColor(color) { activeColor = color; } function getActiveColor() { return activeColor; } function getColorIfActive(active) { return active ? activeColor : defaultColor; } var toolColors = { setFillColor: setFillColor, getFillColor: getFillColor, setToolColor: setToolColor, getToolColor: getToolColor, setActiveColor: setActiveColor, getActiveColor: getActiveColor, getColorIfActive: getColorIfActive }; exports.default = toolColors; /***/ }), /* 5 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var defaultWidth = 1, activeWidth = 2; function setToolWidth(width) { defaultWidth = width; } function getToolWidth() { return defaultWidth; } function setActiveWidth(width) { activeWidth = width; } function getActiveWidth() { return activeWidth; } var toolStyle = { setToolWidth: setToolWidth, getToolWidth: getToolWidth, setActiveWidth: setActiveWidth, getActiveWidth: getActiveWidth }; exports.default = toolStyle; /***/ }), /* 6 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = function (context, textLines, x, y, color, options) { if (Object.prototype.toString.call(textLines) !== '[object Array]') { textLines = [textLines]; } var padding = 5; var font = _textStyle2.default.getFont(); var fontSize = _textStyle2.default.getFontSize(); var backgroundColor = _textStyle2.default.getBackgroundColor(); context.save(); context.font = font; context.textBaseline = 'top'; context.strokeStyle = color; // Find the longest text width in the array of text data var maxWidth = 0; textLines.forEach(function (text) { // Get the text width in the current font var width = context.measureText(text).width; // Find the maximum with for all the text rows; maxWidth = Math.max(maxWidth, width); }); // Draw the background box with padding context.fillStyle = backgroundColor; // Calculate the bounding box for this text box var boundingBox = { width: maxWidth + padding * 2, height: padding + textLines.length * (fontSize + padding) }; if (options && options.centering && options.centering.x === true) { x -= boundingBox.width / 2; } if (options && options.centering && options.centering.y === true) { y -= boundingBox.height / 2; } boundingBox.left = x; boundingBox.top = y; if (options && options.debug === true) { context.fillStyle = '#FF0000'; } context.fillRect(boundingBox.left, boundingBox.top, boundingBox.width, boundingBox.height); // Draw each of the text lines on top of the background box textLines.forEach(function (text, index) { context.fillStyle = color; /* Var ypos; if (index === 0) { ypos = y + index * (fontSize + padding); } else { ypos = y + index * (fontSize + padding * 2); }*/ context.fillText(text, x + padding, y + padding + index * (fontSize + padding)); }); context.restore(); // Return the bounding box so it can be used for pointNearHandle return boundingBox; }; var _textStyle = __webpack_require__(14); var _textStyle2 = _interopRequireDefault(_textStyle); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }), /* 7 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = function (mouseToolInterface) { var configuration = {}; // /////// BEGIN ACTIVE TOOL /////// function addNewMeasurement(mouseEventData) { var cornerstone = _externalModules2.default.cornerstone; var element = mouseEventData.element; var measurementData = mouseToolInterface.createNewMeasurement(mouseEventData); if (!measurementData) { return; } var eventData = { mouseButtonMask: mouseEventData.which }; // Associate this data with this imageId so we can render it and manipulate it (0, _toolState.addToolState)(mouseEventData.element, mouseToolInterface.toolType, measurementData); // Since we are dragging to another place to drop the end point, we can just activate // The end point and let the moveHandle move it for us. _externalModules2.default.$(element).off('CornerstoneToolsMouseMove', mouseToolInterface.mouseMoveCallback || mouseMoveCallback); _externalModules2.default.$(element).off('CornerstoneToolsMouseDown', mouseToolInterface.mouseDownCallback || mouseDownCallback); _externalModules2.default.$(element).off('CornerstoneToolsMouseDownActivate', mouseToolInterface.mouseDownActivateCallback || mouseDownActivateCallback); if (mouseToolInterface.mouseDoubleClickCallback) { _externalModules2.default.$(element).off('CornerstoneToolsMouseDoubleClick', mouseToolInterface.mouseDoubleClickCallback); } cornerstone.updateImage(element); var handleMover = void 0; if (Object.keys(measurementData.handles).length === 1) { handleMover = _moveHandle2.default; } else { handleMover = _moveNewHandle2.default; } var preventHandleOutsideImage = void 0; if (mouseToolInterface.options && mouseToolInterface.options.preventHandleOutsideImage !== undefined) { preventHandleOutsideImage = mouseToolInterface.options.preventHandleOutsideImage; } else { preventHandleOutsideImage = false; } handleMover(mouseEventData, mouseToolInterface.toolType, measurementData, measurementData.handles.end, function () { measurementData.active = false; measurementData.invalidated = true; if ((0, _anyHandlesOutsideImage2.default)(mouseEventData, measurementData.handles)) { // Delete the measurement (0, _toolState.removeToolState)(element, mouseToolInterface.toolType, measurementData); } _externalModules2.default.$(element).on('CornerstoneToolsMouseMove', eventData, mouseToolInterface.mouseMoveCallback || mouseMoveCallback); _externalModules2.default.$(element).on('CornerstoneToolsMouseDown', eventData, mouseToolInterface.mouseDownCallback || mouseDownCallback); _externalModules2.default.$(element).on('CornerstoneToolsMouseDownActivate', eventData, mouseToolInterface.mouseDownActivateCallback || mouseDownActivateCallback); if (mouseToolInterface.mouseDoubleClickCallback) { _externalModules2.default.$(element).on('CornerstoneToolsMouseDoubleClick', eventData, mouseToolInterface.mouseDoubleClickCallback); } cornerstone.updateImage(element); }, preventHandleOutsideImage); } function mouseDownActivateCallback(e, eventData) { if ((0, _isMouseButtonEnabled2.default)(eventData.which, e.data.mouseButtonMask)) { if (mouseToolInterface.addNewMeasurement) { mouseToolInterface.addNewMeasurement(eventData); } else { addNewMeasurement(eventData); } return false; // False = causes jquery to preventDefault() and stopPropagation() this event } } // /////// END ACTIVE TOOL /////// // /////// BEGIN DEACTIVE TOOL /////// function mouseMoveCallback(e, eventData) { _toolCoordinates2.default.setCoords(eventData); // If a mouse button is down, do nothing if (eventData.which !== 0) { return; } // If we have no tool data for this element, do nothing var toolData = (0, _toolState.getToolState)(eventData.element, mouseToolInterface.toolType); if (!toolData) { return; } // We have tool data, search through all data // And see if we can activate a handle var imageNeedsUpdate = false; for (var i = 0; i < toolData.data.length; i++) { // Get the cursor position in canvas coordinates var coords = eventData.currentPoints.canvas; var data = toolData.data[i]; if ((0, _handleActivator2.default)(eventData.element, data.handles, coords) === true) { imageNeedsUpdate = true; } if (mouseToolInterface.pointNearTool(eventData.element, data, coords) && !data.active || !mouseToolInterface.pointNearTool(eventData.element, data, coords) && data.active) { data.active = !data.active; imageNeedsUpdate = true; } } // Handle activation status changed, redraw the image if (imageNeedsUpdate === true) { _externalModules2.default.cornerstone.updateImage(eventData.element); } } function mouseDownCallback(e, eventData) { var data = void 0; var element = eventData.element; function handleDoneMove() { data.invalidated = true; if ((0, _anyHandlesOutsideImage2.default)(eventData, data.handles)) { // Delete the measurement (0, _toolState.removeToolState)(element, mouseToolInterface.toolType, data); } _externalModules2.default.cornerstone.updateImage(element); _externalModules2.default.$(element).on('CornerstoneToolsMouseMove', eventData, mouseToolInterface.mouseMoveCallback || mouseMoveCallback); } if (!(0, _isMouseButtonEnabled2.default)(eventData.which, e.data.mouseButtonMask)) { return; } var coords = eventData.startPoints.canvas; var toolData = (0, _toolState.getToolState)(e.currentTarget, mouseToolInterface.toolType); if (!toolData) { return; } var i = void 0; // Now check to see if there is a handle we can move var preventHandleOutsideImage = void 0; if (mouseToolInterface.options && mouseToolInterface.options.preventHandleOutsideImage !== undefined) { preventHandleOutsideImage = mouseToolInterface.options.preventHandleOutsideImage; } else { preventHandleOutsideImage = false; } for (i = 0; i < toolData.data.length; i++) { data = toolData.data[i]; var distance = 6; var handle = (0, _getHandleNearImagePoint2.default)(element, data.handles, coords, distance); if (handle) { _externalModules2.default.$(element).off('CornerstoneToolsMouseMove', mouseToolInterface.mouseMoveCallback || mouseMoveCallback); data.active = true; (0, _moveHandle2.default)(eventData, mouseToolInterface.toolType, data, handle, handleDoneMove, preventHandleOutsideImage); e.stopImmediatePropagation(); return false; } } // Now check to see if there is a line we can move // Now check to see if we have a tool that we can move if (!mouseToolInterface.pointNearTool) { return; } var options = mouseToolInterface.options || { deleteIfHandleOutsideImage: true, preventHandleOutsideImage: false }; for (i = 0; i < toolData.data.length; i++) { data = toolData.data[i]; data.active = false; if (mouseToolInterface.pointNearTool(element, data, coords)) { data.active = true; _externalModules2.default.$(element).off('CornerstoneToolsMouseMove', mouseToolInterface.mouseMoveCallback || mouseMoveCallback); (0, _moveAllHandles2.default)(e, data, toolData, mouseToolInterface.toolType, options, handleDoneMove); e.stopImmediatePropagation(); return false; } } } // /////// END DEACTIVE TOOL /////// // Not visible, not interactive function disable(element) { element.removeEventListener('cornerstoneimagerendered', onImageRendered); _externalModules2.default.$(element).off('CornerstoneToolsMouseMove', mouseToolInterface.mouseMoveCallback || mouseMoveCallback); _externalModules2.default.$(element).off('CornerstoneToolsMouseDown', mouseToolInterface.mouseDownCallback || mouseDownCallback); _externalModules2.default.$(element).off('CornerstoneToolsMouseDownActivate', mouseToolInterface.mouseDownActivateCallback || mouseDownActivateCallback); if (mouseToolInterface.mouseDoubleClickCallback) { _externalModules2.default.$(element).off('CornerstoneToolsMouseDoubleClick', mouseToolInterface.mouseDoubleClickCallback); } _externalModules2.default.cornerstone.updateImage(element); } // Note: This is to maintain compatibility for developers that have // Built on top of mouseButtonTool.js // TODO: Remove this after we migrate Cornerstone Tools away from jQuery function onImageRendered(e) { mouseToolInterface.onImageRendered(e, e.detail); } // Visible but not interactive function enable(element) { element.removeEventListener('cornerstoneimagerendered', onImageRendered); _externalModules2.default.$(element).off('CornerstoneToolsMouseMove', mouseToolInterface.mouseMoveCallback || mouseMoveCallback); _externalModules2.default.$(element).off('CornerstoneToolsMouseDown', mouseToolInterface.mouseDownCallback || mouseDownCallback); _externalModules2.default.$(element).off('CornerstoneToolsMouseDownActivate', mouseToolInterface.mouseDownActivateCallback || mouseDownActivateCallback); if (mouseToolInterface.mouseDoubleClickCallback) { _externalModules2.default.$(element).off('CornerstoneToolsMouseDoubleClick', mouseToolInterface.mouseDoubleClickCallback); } element.addEventListener('cornerstoneimagerendered', onImageRendered); _externalModules2.default.cornerstone.updateImage(element); } // Visible, interactive and can create function activate(element, mouseButtonMask) { var eventData = { mouseButtonMask: mouseButtonMask }; element.removeEventListener('cornerstoneimagerendered', onImageRendered); _externalModules2.default.$(element).off('CornerstoneToolsMouseMove', mouseToolInterface.mouseMoveCallback || mouseMoveCallback); _externalModules2.default.$(element).off('CornerstoneToolsMouseDown', mouseToolInterface.mouseDownCallback || mouseDownCallback); _externalModules2.default.$(element).off('CornerstoneToolsMouseDownActivate', mouseToolInterface.mouseDownActivateCallback || mouseDownActivateCallback); element.addEventListener('cornerstoneimagerendered', onImageRendered); _externalModules2.default.$(element).on('CornerstoneToolsMouseMove', eventData, mouseToolInterface.mouseMoveCallback || mouseMoveCallback); _externalModules2.default.$(element).on('CornerstoneToolsMouseDown', eventData, mouseToolInterface.mouseDownCallback || mouseDownCallback); _externalModules2.default.$(element).on('CornerstoneToolsMouseDownActivate', eventData, mouseToolInterface.mouseDownActivateCallback || mouseDownActivateCallback); if (mouseToolInterface.mouseDoubleClickCallback) { _externalModules2.default.$(element).off('CornerstoneToolsMouseDoubleClick', mouseToolInterface.mouseDoubleClickCallback); _externalModules2.default.$(element).on('CornerstoneToolsMouseDoubleClick', eventData, mouseToolInterface.mouseDoubleClickCallback); } _externalModules2.default.cornerstone.updateImage(element); } // Visible, interactive function deactivate(element, mouseButtonMask) { var eventData = { mouseButtonMask: mouseButtonMask }; var eventType = 'CornerstoneToolsToolDeactivated'; var statusChangeEventData = { mouseButtonMask: mouseButtonMask, toolType: mouseToolInterface.toolType, type: eventType }; (0, _triggerEvent2.default)(element, eventType, statusChangeEventData); element.removeEventListener('cornerstoneimagerendered', onImageRendered); _externalModules2.default.$(element).off('CornerstoneToolsMouseMove', mouseToolInterface.mouseMoveCallback || mouseMoveCallback); _externalModules2.default.$(element).off('CornerstoneToolsMouseDown', mouseToolInterface.mouseDownCallback || mouseDownCallback); _externalModules2.default.$(element).off('CornerstoneToolsMouseDownActivate', mouseToolInterface.mouseDownActivateCallback || mouseDownActivateCallback); element.addEventListener('cornerstoneimagerendered', onImageRendered); _externalModules2.default.$(element).on('CornerstoneToolsMouseMove', eventData, mouseToolInterface.mouseMoveCallback || mouseMoveCallback); _externalModules2.default.$(element).on('CornerstoneToolsMouseDown', eventData, mouseToolInterface.mouseDownCallback || mouseDownCallback); if (mouseToolInterface.mouseDoubleClickCallback) { _externalModules2.default.$(element).off('CornerstoneToolsMouseDoubleClick', mouseToolInterface.mouseDoubleClickCallback); _externalModules2.default.$(element).on('CornerstoneToolsMouseDoubleClick', eventData, mouseToolInterface.mouseDoubleClickCallback); } if (mouseToolInterface.deactivate) { mouseToolInterface.deactivate(element, mouseButtonMask); } _externalModules2.default.cornerstone.updateImage(element); } function getConfiguration() { return configuration; } function setConfiguration(config) { configuration = config; } var toolInterface = { enable: enable, disable: disable, activate: activate, deactivate: deactivate, getConfiguration: getConfiguration, setConfiguration: setConfiguration, mouseDownCallback: mouseDownCallback, mouseMoveCallback: mouseMoveCallback, mouseDownActivateCallback: mouseDownActivateCallback }; // Expose pointNearTool if available if (mouseToolInterface.pointNearTool) { toolInterface.pointNearTool = mouseToolInterface.pointNearTool; } if (mouseToolInterface.mouseDoubleClickCallback) { toolInterface.mouseDoubleClickCallback = mouseToolInterface.mouseDoubleClickCallback; } if (mouseToolInterface.addNewMeasurement) { toolInterface.addNewMeasurement = mouseToolInterface.addNewMeasurement; } return toolInterface; }; var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); var _toolCoordinates = __webpack_require__(35); var _toolCoordinates2 = _interopRequireDefault(_toolCoordinates); var _getHandleNearImagePoint = __webpack_require__(19); var _getHandleNearImagePoint2 = _interopRequireDefault(_getHandleNearImagePoint); var _handleActivator = __webpack_require__(36); var _handleActivator2 = _interopRequireDefault(_handleActivator); var _moveHandle = __webpack_require__(22); var _moveHandle2 = _interopRequireDefault(_moveHandle); var _moveNewHandle = __webpack_require__(23); var _moveNewHandle2 = _interopRequireDefault(_moveNewHandle); var _moveAllHandles = __webpack_require__(37); var _moveAllHandles2 = _interopRequireDefault(_moveAllHandles); var _anyHandlesOutsideImage = __webpack_require__(12); var _anyHandlesOutsideImage2 = _interopRequireDefault(_anyHandlesOutsideImage); var _isMouseButtonEnabled = __webpack_require__(2); var _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled); var _toolState = __webpack_require__(1); var _triggerEvent = __webpack_require__(3); var _triggerEvent2 = _interopRequireDefault(_triggerEvent); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }), /* 8 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = function (context, renderData, handles, color, options) { context.strokeStyle = color; Object.keys(handles).forEach(function (name) { var handle = handles[name]; if (handle.drawnIndependently === true) { return; } if (options && options.drawHandlesIfActive === true && !handle.active) { return; } context.beginPath(); if (handle.active) { context.lineWidth = _toolStyle2.default.getActiveWidth(); } else { context.lineWidth = _toolStyle2.default.getToolWidth(); } var handleCanvasCoords = _externalModules2.default.cornerstone.pixelToCanvas(renderData.element, handle); context.arc(handleCanvasCoords.x, handleCanvasCoords.y, handleRadius, 0, 2 * Math.PI); if (options && options.fill) { context.fillStyle = options.fill; context.fill(); } context.stroke(); }); }; var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); var _toolStyle = __webpack_require__(5); var _toolStyle2 = _interopRequireDefault(_toolStyle); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var handleRadius = 6; /***/ }), /* 9 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); var _anyHandlesOutsideImage = __webpack_require__(12); var _anyHandlesOutsideImage2 = _interopRequireDefault(_anyHandlesOutsideImage); var _getHandleNearImagePoint = __webpack_require__(19); var _getHandleNearImagePoint2 = _interopRequireDefault(_getHandleNearImagePoint); var _touchMoveHandle = __webpack_require__(52); var _touchMoveHandle2 = _interopRequireDefault(_touchMoveHandle); var _moveNewHandleTouch = __webpack_require__(25); var _moveNewHandleTouch2 = _interopRequireDefault(_moveNewHandleTouch); var _touchMoveAllHandles = __webpack_require__(51); var _touchMoveAllHandles2 = _interopRequireDefault(_touchMoveAllHandles); var _toolState = __webpack_require__(1); var _triggerEvent = __webpack_require__(3); var _triggerEvent2 = _interopRequireDefault(_triggerEvent); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function deactivateAllHandles(handles) { Object.keys(handles).forEach(function (name) { var handle = handles[name]; handle.active = false; }); } function deactivateAllToolInstances(toolData) { if (!toolData) { return; } for (var i = 0; i < toolData.data.length; i++) { var data = toolData.data[i]; data.active = false; if (!data.handles) { continue; } deactivateAllHandles(data.handles); } } function touchTool(touchToolInterface) { // /////// BEGIN ACTIVE TOOL /////// function addNewMeasurement(touchEventData) { // Console.log('touchTool addNewMeasurement'); var cornerstone = _externalModules2.default.cornerstone; var element = touchEventData.element; var measurementData = touchToolInterface.createNewMeasurement(touchEventData); if (!measurementData) { return; } (0, _toolState.addToolState)(element, touchToolInterface.toolType, measurementData); if (Object.keys(measurementData.handles).length === 1 && touchEventData.type === 'CornerstoneToolsTap') { measurementData.active = false; measurementData.handles.end.active = false; measurementData.handles.end.highlight = false; measurementData.invalidated = true; if ((0, _anyHandlesOutsideImage2.default)(touchEventData, measurementData.handles)) { // Delete the measurement (0, _toolState.removeToolState)(element, touchToolInterface.toolType, measurementData); } cornerstone.updateImage(element); return; } _externalModules2.default.$(element).off('CornerstoneToolsTouchStartActive', touchToolInterface.touchDownActivateCallback || touchDownActivateCallback); _externalModules2.default.$(element).off('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback); _externalModules2.default.$(element).off('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback); cornerstone.updateImage(element); (0, _moveNewHandleTouch2.default)(touchEventData, touchToolInterface.toolType, measurementData, measurementData.handles.end, function () { measurementData.active = false; measurementData.invalidated = true; if ((0, _anyHandlesOutsideImage2.default)(touchEventData, measurementData.handles)) { // Delete the measurement (0, _toolState.removeToolState)(element, touchToolInterface.toolType, measurementData); } _externalModules2.default.$(element).on('CornerstoneToolsTouchStartActive', touchToolInterface.touchDownActivateCallback || touchDownActivateCallback); _externalModules2.default.$(element).on('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback); _externalModules2.default.$(element).on('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback); cornerstone.updateImage(element); }); } function touchDownActivateCallback(e, eventData) { // Console.log('touchTool touchDownActivateCallback'); if (touchToolInterface.addNewMeasurement) { touchToolInterface.addNewMeasurement(eventData); } else { addNewMeasurement(eventData); } e.stopImmediatePropagation(); e.preventDefault(); } // /////// END ACTIVE TOOL /////// // /////// BEGIN INACTIVE TOOL /////// function tapCallback(e, eventData) { // Console.log('touchTool tapCallback'); var cornerstone = _externalModules2.default.cornerstone; var element = eventData.element; var coords = eventData.currentPoints.canvas; var toolData = (0, _toolState.getToolState)(e.currentTarget, touchToolInterface.toolType); var data = void 0; var i = void 0; // Deactivate everything deactivateAllToolInstances(toolData); function doneMovingCallback() { // Console.log('touchTool tapCallback doneMovingCallback'); deactivateAllToolInstances(toolData); if ((0, _anyHandlesOutsideImage2.default)(eventData, data.handles)) { // Delete the measurement (0, _toolState.removeToolState)(element, touchToolInterface.toolType, data); } cornerstone.updateImage(element); _externalModules2.default.$(element).on('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback); _externalModules2.default.$(element).on('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback); } // Now check to see if there is a handle we can move if (toolData) { for (i = 0; i < toolData.data.length; i++) { data = toolData.data[i]; var distanceSq = 25; // Should probably make this a settable property later var handle = (0, _getHandleNearImagePoint2.default)(element, data.handles, coords, distanceSq); if (handle) { _externalModules2.default.$(element).off('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback); _externalModules2.default.$(element).off('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback); data.active = true; handle.active = true; cornerstone.updateImage(element); (0, _touchMoveHandle2.default)(e, touchToolInterface.toolType, data, handle, doneMovingCallback); e.stopImmediatePropagation(); e.preventDefault(); return; } } } // Now check to see if we have a tool that we can move if (toolData && touchToolInterface.pointNearTool) { for (i = 0; i < toolData.data.length; i++) { data = toolData.data[i]; if (touchToolInterface.pointNearTool(element, data, coords)) { _externalModules2.default.$(element).off('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback); _externalModules2.default.$(element).off('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback); data.active = true; cornerstone.updateImage(element); (0, _touchMoveAllHandles2.default)(e, data, toolData, touchToolInterface.toolType, true, doneMovingCallback); e.stopImmediatePropagation(); e.preventDefault(); return; } } } // If there is nothing to move, add a new instance of the tool // Need to check here to see if activation is allowed! if (touchToolInterface.touchDownActivateCallback) { touchToolInterface.touchDownActivateCallback(e, eventData); } else { touchDownActivateCallback(e, eventData); } return false; } function touchStartCallback(e, eventData) { // Console.log('touchTool touchStartCallback'); var cornerstone = _externalModules2.default.cornerstone; var element = eventData.element; var coords = eventData.startPoints.canvas; var data = void 0; var toolData = (0, _toolState.getToolState)(e.currentTarget, touchToolInterface.toolType); var i = void 0; function doneMovingCallback(lastEvent, lastEventData) { // Console.log('touchTool touchStartCallback doneMovingCallback'); data.active = false; data.invalidated = true; if ((0, _anyHandlesOutsideImage2.default)(eventData, data.handles)) { // Delete the measurement (0, _toolState.removeToolState)(eventData.element, touchToolInterface.toolType, data); } cornerstone.updateImage(eventData.element); _externalModules2.default.$(element).on('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback); _externalModules2.default.$(element).on('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback); if (touchToolInterface.pressCallback) { _externalModules2.default.$(element).on('CornerstoneToolsTouchPress', touchToolInterface.pressCallback); } if (lastEvent && lastEvent.type === 'CornerstoneToolsTouchPress') { (0, _triggerEvent2.default)(element, lastEvent.type, lastEventData); } } // Now check to see if there is a handle we can move // Average pixel width of index finger is 45-57 pixels // https://www.smashingmagazine.com/2012/02/finger-friendly-design-ideal-mobile-touchscreen-target-sizes/ var distance = 28; if (!toolData) { return; } for (i = 0; i < toolData.data.length; i++) { data = toolData.data[i]; var handle = (0, _getHandleNearImagePoint2.default)(eventData.element, data.handles, coords, distance); if (handle) { _externalModules2.default.$(element).off('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback); _externalModules2.default.$(element).off('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback); if (touchToolInterface.pressCallback) { _externalModules2.default.$(element).off('CornerstoneToolsTouchPress', touchToolInterface.pressCallback); } data.active = true; (0, _touchMoveHandle2.default)(e, touchToolInterface.toolType, data, handle, doneMovingCallback); e.stopImmediatePropagation(); e.preventDefault(); return; } } // Now check to see if we have a tool that we can move if (!touchToolInterface.pointNearTool) { return; } for (i = 0; i < toolData.data.length; i++) { data = toolData.data[i]; if (touchToolInterface.pointNearTool(eventData.element, data, coords)) { _externalModules2.default.$(element).off('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback); _externalModules2.default.$(element).off('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback); if (touchToolInterface.pressCallback) { _externalModules2.default.$(element).off('CornerstoneToolsTouchPress', touchToolInterface.pressCallback); } (0, _touchMoveAllHandles2.default)(e, data, toolData, touchToolInterface.toolType, true, doneMovingCallback); e.stopImmediatePropagation(); e.preventDefault(); return; } } } // /////// END INACTIVE TOOL /////// // Not visible, not interactive function disable(element) { element.removeEventListener('cornerstoneimagerendered', onImageRendered); _externalModules2.default.$(element).off('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback); _externalModules2.default.$(element).off('CornerstoneToolsTouchStartActive', touchToolInterface.touchDownActivateCallback || touchDownActivateCallback); _externalModules2.default.$(element).off('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback); if (touchToolInterface.doubleTapCallback) { _externalModules2.default.$(element).off('CornerstoneToolsDoubleTap', touchToolInterface.doubleTapCallback); } if (touchToolInterface.pressCallback) { _externalModules2.default.$(element).off('CornerstoneToolsTouchPress', touchToolInterface.pressCallback); } _externalModules2.default.cornerstone.updateImage(element); } // Visible but not interactive function enable(element) { element.removeEventListener('cornerstoneimagerendered', onImageRendered); _externalModules2.default.$(element).off('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback); _externalModules2.default.$(element).off('CornerstoneToolsTouchStartActive', touchToolInterface.touchDownActivateCallback || touchDownActivateCallback); _externalModules2.default.$(element).off('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback); element.addEventListener('cornerstoneimagerendered', onImageRendered); if (touchToolInterface.doubleTapCallback) { _externalModules2.default.$(element).off('CornerstoneToolsDoubleTap', touchToolInterface.doubleTapCallback); } if (touchToolInterface.pressCallback) { _externalModules2.default.$(element).off('CornerstoneToolsTouchPress', touchToolInterface.pressCallback); } _externalModules2.default.cornerstone.updateImage(element); } // Visible, interactive and can create function activate(element) { element.removeEventListener('cornerstoneimagerendered', onImageRendered); _externalModules2.default.$(element).off('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback); _externalModules2.default.$(element).off('CornerstoneToolsTouchStartActive', touchToolInterface.touchDownActivateCallback || touchDownActivateCallback); _externalModules2.default.$(element).off('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback); element.addEventListener('cornerstoneimagerendered', onImageRendered); _externalModules2.default.$(element).on('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback); _externalModules2.default.$(element).on('CornerstoneToolsTouchStartActive', touchToolInterface.touchDownActivateCallback || touchDownActivateCallback); _externalModules2.default.$(element).on('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback); if (touchToolInterface.doubleTapCallback) { _externalModules2.default.$(element).off('CornerstoneToolsDoubleTap', touchToolInterface.doubleTapCallback); _externalModules2.default.$(element).on('CornerstoneToolsDoubleTap', touchToolInterface.doubleTapCallback); } if (touchToolInterface.pressCallback) { _externalModules2.default.$(element).off('CornerstoneToolsTouchPress', touchToolInterface.pressCallback); _externalModules2.default.$(element).on('CornerstoneToolsTouchPress', touchToolInterface.pressCallback); } _externalModules2.default.cornerstone.updateImage(element); } // Note: This is to maintain compatibility for developers that have // Built on top of touchTool.js // TODO: Remove this after we migrate Cornerstone Tools away from jQuery function onImageRendered(e) { touchToolInterface.onImageRendered(e, e.detail); } // Visible, interactive function deactivate(element) { var eventType = 'CornerstoneToolsToolDeactivated'; var statusChangeEventData = { toolType: touchToolInterface.toolType, type: eventType }; (0, _triggerEvent2.default)(element, eventType, statusChangeEventData); element.removeEventListener('cornerstoneimagerendered', onImageRendered); _externalModules2.default.$(element).off('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback); _externalModules2.default.$(element).off('CornerstoneToolsTouchStartActive', touchToolInterface.touchDownActivateCallback || touchDownActivateCallback); _externalModules2.default.$(element).off('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback); element.addEventListener('cornerstoneimagerendered', onImageRendered); _externalModules2.default.$(element).on('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback); if (touchToolInterface.doubleTapCallback) { _externalModules2.default.$(element).off('CornerstoneToolsDoubleTap', touchToolInterface.doubleTapCallback); } if (touchToolInterface.pressCallback) { _externalModules2.default.$(element).off('CornerstoneToolsTouchPress', touchToolInterface.pressCallback); } _externalModules2.default.cornerstone.updateImage(element); } var toolInterface = { enable: enable, disable: disable, activate: activate, deactivate: deactivate, touchStartCallback: touchToolInterface.touchStartCallback || touchStartCallback, touchDownActivateCallback: touchToolInterface.touchDownActivateCallback || touchDownActivateCallback, tapCallback: touchToolInterface.tapCallback || tapCallback }; // Expose pointNearTool if available if (touchToolInterface.pointNearTool) { toolInterface.pointNearTool = touchToolInterface.pointNearTool; } if (touchToolInterface.doubleTapCallback) { toolInterface.doubleTapCallback = touchToolInterface.doubleTapCallback; } if (touchToolInterface.pressCallback) { toolInterface.pressCallback = touchToolInterface.pressCallback; } if (touchToolInterface.addNewMeasurement) { toolInterface.addNewMeasurement = touchToolInterface.addNewMeasurement; } return toolInterface; } exports.default = touchTool; /***/ }), /* 10 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var defaultStartLoadHandler = void 0; var defaultEndLoadHandler = void 0; var defaultErrorLoadingHandler = void 0; function setStartLoadHandler(handler) { defaultStartLoadHandler = handler; } function getStartLoadHandler() { return defaultStartLoadHandler; } function setEndLoadHandler(handler) { defaultEndLoadHandler = handler; } function getEndLoadHandler() { return defaultEndLoadHandler; } function setErrorLoadingHandler(handler) { defaultErrorLoadingHandler = handler; } function getErrorLoadingHandler() { return defaultErrorLoadingHandler; } var loadHandlerManager = { setStartLoadHandler: setStartLoadHandler, getStartLoadHandler: getStartLoadHandler, setEndLoadHandler: setEndLoadHandler, getEndLoadHandler: getEndLoadHandler, setErrorLoadingHandler: setErrorLoadingHandler, getErrorLoadingHandler: getErrorLoadingHandler }; exports.default = loadHandlerManager; /***/ }), /* 11 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = function (touchDragCallback, options) { var events = 'CornerstoneToolsTouchDrag'; if (options && options.fireOnTouchStart === true) { events += ' CornerstoneToolsTouchStart'; } var toolInterface = { activate: function activate(element) { _externalModules2.default.$(element).off(events, touchDragCallback); if (options && options.eventData) { _externalModules2.default.$(element).on(events, options.eventData, touchDragCallback); } else { _externalModules2.default.$(element).on(events, touchDragCallback); } if (options && options.activateCallback) { options.activateCallback(element); } }, disable: function disable(element) { _externalModules2.default.$(element).off(events, touchDragCallback); if (options && options.disableCallback) { options.disableCallback(element); } }, enable: function enable(element) { _externalModules2.default.$(element).off(events, touchDragCallback); if (options && options.enableCallback) { options.enableCallback(element); } }, deactivate: function deactivate(element) { _externalModules2.default.$(element).off(events, touchDragCallback); if (options && options.deactivateCallback) { options.deactivateCallback(element); } } }; return toolInterface; }; var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefa