UNPKG

cornerstone-tools-cacalc

Version:

Medical imaging tools for the Cornerstone library with added functionality for computing Agatston calcium scores

1,529 lines (1,161 loc) 507 kB
/*! cornerstone-tools-cacalc - 0.0.5 - 2017-11-13 | (c) 2017 Chris Hafey | undefined */ (function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(require("cornerstone-core"), require("cornerstone-math"), require("hammerjs")); else if(typeof define === 'function' && define.amd) define("cornerstoneTools", ["cornerstone-core", "cornerstone-math", "hammerjs"], factory); else if(typeof exports === 'object') exports["cornerstoneTools"] = factory(require("cornerstone-core"), require("cornerstone-math"), require("hammerjs")); else root["cornerstoneTools"] = factory(root["cornerstone"], root["cornerstoneMath"], root["Hammer"]); })(this, function(__WEBPACK_EXTERNAL_MODULE_0__, __WEBPACK_EXTERNAL_MODULE_3__, __WEBPACK_EXTERNAL_MODULE_119__) { 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; /******/ /******/ // identity function for calling harmony imports with the correct context /******/ __webpack_require__.i = function(value) { return value; }; /******/ /******/ // 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 = 109); /******/ }) /************************************************************************/ /******/ ([ /* 0 */ /***/ (function(module, exports) { module.exports = __WEBPACK_EXTERNAL_MODULE_0__; /***/ }), /* 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 _cornerstoneCore = __webpack_require__(0); var cornerstone = _interopRequireWildcard(_cornerstoneCore); var _imageIdSpecificStateManager = __webpack_require__(16); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } function getElementToolStateManager(element) { var enabledImage = 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 }; $(element).trigger(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 }; $(element).trigger(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 = 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) { module.exports = __WEBPACK_EXTERNAL_MODULE_3__; /***/ }), /* 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 (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 = 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 _cornerstoneCore = __webpack_require__(0); var cornerstone = _interopRequireWildcard(_cornerstoneCore); var _toolStyle = __webpack_require__(5); var _toolStyle2 = _interopRequireDefault(_toolStyle); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } var handleRadius = 6; /***/ }), /* 8 */ /***/ (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 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. $(element).off('CornerstoneToolsMouseMove', mouseToolInterface.mouseMoveCallback || mouseMoveCallback); $(element).off('CornerstoneToolsMouseDown', mouseToolInterface.mouseDownCallback || mouseDownCallback); $(element).off('CornerstoneToolsMouseDownActivate', mouseToolInterface.mouseDownActivateCallback || mouseDownActivateCallback); if (mouseToolInterface.mouseDoubleClickCallback) { $(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); } $(element).on('CornerstoneToolsMouseMove', eventData, mouseToolInterface.mouseMoveCallback || mouseMoveCallback); $(element).on('CornerstoneToolsMouseDown', eventData, mouseToolInterface.mouseDownCallback || mouseDownCallback); $(element).on('CornerstoneToolsMouseDownActivate', eventData, mouseToolInterface.mouseDownActivateCallback || mouseDownActivateCallback); if (mouseToolInterface.mouseDoubleClickCallback) { $(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) { 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); } cornerstone.updateImage(element); $(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) { $(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; $(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).off('CornerstoneImageRendered', mouseToolInterface.onImageRendered); $(element).off('CornerstoneToolsMouseMove', mouseToolInterface.mouseMoveCallback || mouseMoveCallback); $(element).off('CornerstoneToolsMouseDown', mouseToolInterface.mouseDownCallback || mouseDownCallback); $(element).off('CornerstoneToolsMouseDownActivate', mouseToolInterface.mouseDownActivateCallback || mouseDownActivateCallback); if (mouseToolInterface.mouseDoubleClickCallback) { $(element).off('CornerstoneToolsMouseDoubleClick', mouseToolInterface.mouseDoubleClickCallback); } cornerstone.updateImage(element); } // Visible but not interactive function enable(element) { $(element).off('CornerstoneImageRendered', mouseToolInterface.onImageRendered); $(element).off('CornerstoneToolsMouseMove', mouseToolInterface.mouseMoveCallback || mouseMoveCallback); $(element).off('CornerstoneToolsMouseDown', mouseToolInterface.mouseDownCallback || mouseDownCallback); $(element).off('CornerstoneToolsMouseDownActivate', mouseToolInterface.mouseDownActivateCallback || mouseDownActivateCallback); if (mouseToolInterface.mouseDoubleClickCallback) { $(element).off('CornerstoneToolsMouseDoubleClick', mouseToolInterface.mouseDoubleClickCallback); } $(element).on('CornerstoneImageRendered', mouseToolInterface.onImageRendered); cornerstone.updateImage(element); } // Visible, interactive and can create function activate(element, mouseButtonMask) { var eventData = { mouseButtonMask: mouseButtonMask }; $(element).off('CornerstoneImageRendered', mouseToolInterface.onImageRendered); $(element).off('CornerstoneToolsMouseMove', mouseToolInterface.mouseMoveCallback || mouseMoveCallback); $(element).off('CornerstoneToolsMouseDown', mouseToolInterface.mouseDownCallback || mouseDownCallback); $(element).off('CornerstoneToolsMouseDownActivate', mouseToolInterface.mouseDownActivateCallback || mouseDownActivateCallback); $(element).on('CornerstoneImageRendered', mouseToolInterface.onImageRendered); $(element).on('CornerstoneToolsMouseMove', eventData, mouseToolInterface.mouseMoveCallback || mouseMoveCallback); $(element).on('CornerstoneToolsMouseDown', eventData, mouseToolInterface.mouseDownCallback || mouseDownCallback); $(element).on('CornerstoneToolsMouseDownActivate', eventData, mouseToolInterface.mouseDownActivateCallback || mouseDownActivateCallback); if (mouseToolInterface.mouseDoubleClickCallback) { $(element).off('CornerstoneToolsMouseDoubleClick', mouseToolInterface.mouseDoubleClickCallback); $(element).on('CornerstoneToolsMouseDoubleClick', eventData, mouseToolInterface.mouseDoubleClickCallback); } 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 }; var event = $.Event(eventType, statusChangeEventData); $(element).trigger(event, statusChangeEventData); $(element).off('CornerstoneImageRendered', mouseToolInterface.onImageRendered); $(element).off('CornerstoneToolsMouseMove', mouseToolInterface.mouseMoveCallback || mouseMoveCallback); $(element).off('CornerstoneToolsMouseDown', mouseToolInterface.mouseDownCallback || mouseDownCallback); $(element).off('CornerstoneToolsMouseDownActivate', mouseToolInterface.mouseDownActivateCallback || mouseDownActivateCallback); $(element).on('CornerstoneImageRendered', mouseToolInterface.onImageRendered); $(element).on('CornerstoneToolsMouseMove', eventData, mouseToolInterface.mouseMoveCallback || mouseMoveCallback); $(element).on('CornerstoneToolsMouseDown', eventData, mouseToolInterface.mouseDownCallback || mouseDownCallback); if (mouseToolInterface.mouseDoubleClickCallback) { $(element).off('CornerstoneToolsMouseDoubleClick', mouseToolInterface.mouseDoubleClickCallback); $(element).on('CornerstoneToolsMouseDoubleClick', eventData, mouseToolInterface.mouseDoubleClickCallback); } 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 _cornerstoneCore = __webpack_require__(0); var cornerstone = _interopRequireWildcard(_cornerstoneCore); var _toolCoordinates = __webpack_require__(30); var _toolCoordinates2 = _interopRequireDefault(_toolCoordinates); var _getHandleNearImagePoint = __webpack_require__(15); var _getHandleNearImagePoint2 = _interopRequireDefault(_getHandleNearImagePoint); var _handleActivator = __webpack_require__(27); var _handleActivator2 = _interopRequireDefault(_handleActivator); var _moveHandle = __webpack_require__(21); var _moveHandle2 = _interopRequireDefault(_moveHandle); var _moveNewHandle = __webpack_require__(22); var _moveNewHandle2 = _interopRequireDefault(_moveNewHandle); var _moveAllHandles = __webpack_require__(28); 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); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } /***/ }), /* 9 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _cornerstoneCore = __webpack_require__(0); var cornerstone = _interopRequireWildcard(_cornerstoneCore); var _anyHandlesOutsideImage = __webpack_require__(12); var _anyHandlesOutsideImage2 = _interopRequireDefault(_anyHandlesOutsideImage); var _getHandleNearImagePoint = __webpack_require__(15); var _getHandleNearImagePoint2 = _interopRequireDefault(_getHandleNearImagePoint); var _touchMoveHandle = __webpack_require__(45); var _touchMoveHandle2 = _interopRequireDefault(_touchMoveHandle); var _moveNewHandleTouch = __webpack_require__(23); var _moveNewHandleTouch2 = _interopRequireDefault(_moveNewHandleTouch); var _touchMoveAllHandles = __webpack_require__(44); var _touchMoveAllHandles2 = _interopRequireDefault(_touchMoveAllHandles); var _toolState = __webpack_require__(1); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } 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 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; } $(element).off('CornerstoneToolsTouchStartActive', touchToolInterface.touchDownActivateCallback || touchDownActivateCallback); $(element).off('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback); $(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); } $(element).on('CornerstoneToolsTouchStartActive', touchToolInterface.touchDownActivateCallback || touchDownActivateCallback); $(element).on('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback); $(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); } return false; // False = causes jquery to preventDefault() and stopPropagation() this event } // /////// END ACTIVE TOOL /////// // /////// BEGIN INACTIVE TOOL /////// function tapCallback(e, eventData) { // Console.log('touchTool tapCallback'); 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); $(element).on('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback); $(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) { $(element).off('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback); $(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(); return false; // False = causes jquery to preventDefault() and stopPropagation() this event } } } // 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)) { $(element).off('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback); $(element).off('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback); data.active = true; cornerstone.updateImage(element); (0, _touchMoveAllHandles2.default)(e, data, toolData, touchToolInterface.toolType, true, doneMovingCallback); e.stopImmediatePropagation(); return false; // False = causes jquery to preventDefault() and stopPropagation() this event } } } // 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 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); $(element).on('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback); $(element).on('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback); if (touchToolInterface.pressCallback) { $(element).on('CornerstoneToolsTouchPress', touchToolInterface.pressCallback); } if (lastEvent && lastEvent.type === 'CornerstoneToolsTouchPress') { var event = $.Event(lastEvent.type, lastEventData); $(element).trigger(event, 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) { $(element).off('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback); $(element).off('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback); if (touchToolInterface.pressCallback) { $(element).off('CornerstoneToolsTouchPress', touchToolInterface.pressCallback); } data.active = true; (0, _touchMoveHandle2.default)(e, touchToolInterface.toolType, data, handle, doneMovingCallback); e.stopImmediatePropagation(); return false; // False = causes jquery to preventDefault() and stopPropagation() this event } } // 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)) { $(element).off('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback); $(element).off('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback); if (touchToolInterface.pressCallback) { $(element).off('CornerstoneToolsTouchPress', touchToolInterface.pressCallback); } (0, _touchMoveAllHandles2.default)(e, data, toolData, touchToolInterface.toolType, true, doneMovingCallback); e.stopImmediatePropagation(); return false; // False = causes jquery to preventDefault() and stopPropagation() this event } } } // /////// END INACTIVE TOOL /////// // Not visible, not interactive function disable(element) { $(element).off('CornerstoneImageRendered', touchToolInterface.onImageRendered); $(element).off('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback); $(element).off('CornerstoneToolsTouchStartActive', touchToolInterface.touchDownActivateCallback || touchDownActivateCallback); $(element).off('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback); if (touchToolInterface.doubleTapCallback) { $(element).off('CornerstoneToolsDoubleTap', touchToolInterface.doubleTapCallback); } if (touchToolInterface.pressCallback) { $(element).off('CornerstoneToolsTouchPress', touchToolInterface.pressCallback); } cornerstone.updateImage(element); } // Visible but not interactive function enable(element) { $(element).off('CornerstoneImageRendered', touchToolInterface.onImageRendered); $(element).off('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback); $(element).off('CornerstoneToolsTouchStartActive', touchToolInterface.touchDownActivateCallback || touchDownActivateCallback); $(element).off('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback); $(element).on('CornerstoneImageRendered', touchToolInterface.onImageRendered); if (touchToolInterface.doubleTapCallback) { $(element).off('CornerstoneToolsDoubleTap', touchToolInterface.doubleTapCallback); } if (touchToolInterface.pressCallback) { $(element).off('CornerstoneToolsTouchPress', touchToolInterface.pressCallback); } cornerstone.updateImage(element); } // Visible, interactive and can create function activate(element) { // Console.log('activate touchTool'); $(element).off('CornerstoneImageRendered', touchToolInterface.onImageRendered); $(element).off('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback); $(element).off('CornerstoneToolsTouchStartActive', touchToolInterface.touchDownActivateCallback || touchDownActivateCallback); $(element).off('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback); $(element).on('CornerstoneImageRendered', touchToolInterface.onImageRendered); $(element).on('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback); $(element).on('CornerstoneToolsTouchStartActive', touchToolInterface.touchDownActivateCallback || touchDownActivateCallback); $(element).on('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback); if (touchToolInterface.doubleTapCallback) { $(element).off('CornerstoneToolsDoubleTap', touchToolInterface.doubleTapCallback); $(element).on('CornerstoneToolsDoubleTap', touchToolInterface.doubleTapCallback); } if (touchToolInterface.pressCallback) { $(element).off('CornerstoneToolsTouchPress', touchToolInterface.pressCallback); $(element).on('CornerstoneToolsTouchPress', touchToolInterface.pressCallback); } cornerstone.updateImage(element); } // Visible, interactive function deactivate(element) { var eventType = 'CornerstoneToolsToolDeactivated'; var statusChangeEventData = { toolType: touchToolInterface.toolType, type: eventType }; var event = $.Event(eventType, statusChangeEventData); $(element).trigger(event, statusChangeEventData); $(element).off('CornerstoneImageRendered', touchToolInterface.onImageRendered); $(element).off('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback); $(element).off('CornerstoneToolsTouchStartActive', touchToolInterface.touchDownActivateCallback || touchDownActivateCallback); $(element).off('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback); $(element).on('CornerstoneImageRendered', touchToolInterface.onImageRendered); $(element).on('CornerstoneToolsTouchStart', touchToolInterface.touchStartCallback || touchStartCallback); // $(element).on('CornerstoneToolsTap', touchToolInterface.tapCallback || tapCallback); if (touchToolInterface.doubleTapCallback) { $(element).off('CornerstoneToolsDoubleTap', touchToolInterface.doubleTapCallback); } if (touchToolInterface.pressCallback) { $(element).off('CornerstoneToolsTouchPress', touchToolInterface.pressCallback); } 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) { $(element).off(events, touchDragCallback); if (options && options.eventData) { $(element).on(events, options.eventData, touchDragCallback); } else { $(element).on(events, touchDragCallback); } if (options && options.activateCallback) { options.activateCallback(element); } }, disable: function disable(element) { $(element).off(events, touchDragCallback); if (options && options.disableCallback) { options.disableCallback(element); } }, enable: function enable(element) { $(element).off(events, touchDragCallback); if (options && options.enableCallback) { options.enableCallback(element); } }, deactivate: function deactivate(element) { $(element).off(events, touchDragCallback); if (options && options.deactivateCallback) { options.deactivateCallback(element); } } }; return toolInterface; }; /***/ }), /* 12 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = function (renderData, handles) { var image = renderData.image; var imageRect = { left: 0, top: 0, width: image.width, height: image.height }; var handleOutsideImage = false; Object.keys(handles).forEach(function (name) { var handle = handles[name]; if (handle.allowedOutsideImage === true) { return; } if (cornerstoneMath.point.insideRect(handle, imageRect) === false) { handleOutsideImage = true; } }); return handleOutsideImage; }; var _cornerstoneMath = __webpack_require__(3); var cornerstoneMath = _interopRequireWildcard(_cornerstoneMath); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } /***/ }), /* 13 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = function (mouseDownCallback) { var configuration = {}; var toolInterface = { activate: function activate(element, mouseButtonMask, options) { $(element).off('CornerstoneToolsMouseDownActivate', mouseDownCallback); var eventData = { mouseButtonMask: mouseButtonMask, options: options }; $(element).on('CornerstoneToolsMouseDownActivate', eventData, mouseDownCallback); }, disable: function disable(element) { $(element).off('CornerstoneToolsMouseDownActivate', mouseDownCallback); }, enable: function enable(element) { $(element).off('CornerstoneToolsMouseDownActivate', mouseDownCallback); }, deactivate: function deactivate(element) { $(element).off('CornerstoneToolsMouseDownActivate', mouseDownCallback); }, getConfiguration: function getConfiguration() { return configuration; }, setConfiguration: function setConfiguration(config) { configuration = config; } }; return toolInterface; }; /***/ }), /* 14 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var defaultFontSize = 15, defaultFont = defaultFontSize + 'px Arial', defaultBackgroundColor = 'transparent'; function setFont(font) { defaultFont = font; } function getFont() { return defaultFont; } function setFontSize(fontSize) { defaultFontSize = fontSize; } function getFontSize() { return defaultFontSize; } function setBackgroundColor(backgroundColor) { defaultBackgroundColor = backgroundColor; } function getBackgroundColor() { return defaultBackgroundColor; } var textStyle = { setFont: setFont, getFont: getFont, setFontSize: setFontSize, getFontSize: getFontSize, setBackgroundColor: setBackgroundColor, getBackgroundColor: getBackgroundColor }; exports.default = textStyle; /***/ }), /* 15 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = function (element, handles, coords, distanceThreshold) { var nearbyHandle = void 0; if (!handles) { return; } Object.keys(handles).forEach(function (name) { var handle = handles[name]; if (handle.hasOwnProperty('pointNearHandle')) { if (handle.pointNearHandle(element, handle, coords)) { nearbyHandle = handle; return; } } else if (handle.hasBoundingBox === true) { if ((0, _pointInsideBoundingBox2.default)(handle, coords)) { nearbyHandle = handle; return; } } else { var handleCanvas = cornerstone.pixelToCanvas(element, handle