UNPKG

cornerstone-nifti-image-loader

Version:
1,576 lines (1,204 loc) 517 kB
/*! cornerstone-tools - 2.0.0 - 2018-02-14 | (c) 2017 Chris Hafey | https://github.com/cornerstonejs/cornerstoneTools */ (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(); })(typeof self !== 'undefined' ? self : 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 Hammer = window.Hammer; exports.default = { set cornerstone(cs) { cornerstone = cs; }, get cornerstone() { return cornerstone; }, set cornerstoneMath(cm) { cornerstoneMath = cm; }, get cornerstoneMath() { return cornerstoneMath; }, set Hammer(module) { Hammer = module; }, get Hammer() { return Hammer; } }; /***/ }), /* 1 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var EVENTS = { // Events from Cornerstone Core IMAGE_RENDERED: 'cornerstoneimagerendered', NEW_IMAGE: 'cornerstonenewimage', IMAGE_CACHE_PROMISE_REMOVED: 'cornerstoneimagecachepromiseremoved', ELEMENT_DISABLED: 'cornerstoneelementdisabled', // Mouse events MOUSE_DOWN: 'cornerstonetoolsmousedown', MOUSE_UP: 'cornerstonetoolsmouseup', MOUSE_DOWN_ACTIVATE: 'cornerstonetoolsmousedownactivate', MOUSE_DRAG: 'cornerstonetoolsmousedrag', MOUSE_MOVE: 'cornerstonetoolsmousemove', MOUSE_CLICK: 'cornerstonetoolsmouseclick', MOUSE_DOUBLE_CLICK: 'cornerstonetoolsmousedoubleclick', MOUSE_WHEEL: 'cornerstonetoolsmousewheel', // Touch events TOUCH_START: 'cornerstonetoolstouchstart', TOUCH_START_ACTIVE: 'cornerstonetoolstouchstartactive', TOUCH_END: 'cornerstonetoolstouchend', TOUCH_DRAG: 'cornerstonetoolstouchdrag', TOUCH_DRAG_END: 'cornerstonetoolstouchdragend', TOUCH_PINCH: 'cornerstonetoolstouchpinch', TOUCH_ROTATE: 'cornerstonetoolstouchrotate', TOUCH_PRESS: 'cornerstonetoolstouchpress', TAP: 'cornerstonetoolstap', DOUBLE_TAP: 'cornerstonetoolsdoubletap', MULTI_TOUCH_START: 'cornerstonetoolsmultitouchstart', MULTI_TOUCH_START_ACTIVE: 'cornerstonetoolsmultitouchstartactive', MULTI_TOUCH_DRAG: 'cornerstonetoolsmultitouchdrag', // Keyboard events KEY_DOWN: 'cornerstonetoolskeydown', KEY_UP: 'cornerstonetoolskeyup', KEY_PRESS: 'cornerstonetoolskeypress', // Measurement / tool events MEASUREMENT_ADDED: 'cornerstonetoolsmeasurementadded', MEASUREMENT_MODIFIED: 'cornerstonetoolsmeasurementmodified', MEASUREMENT_REMOVED: 'cornerstonemeasurementremoved', TOOL_DEACTIVATED: 'cornerstonetoolstooldeactivated', CLIP_STOPPED: 'cornerstonetoolsclipstopped', STACK_SCROLL: 'cornerstonestackscroll', // Should be renamed LINE_SAMPLE_UPDATED: 'cornerstonelinesampleupdated' }; exports.default = EVENTS; /***/ }), /* 2 */ /***/ (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 _events = __webpack_require__(1); var _events2 = _interopRequireDefault(_events); var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); var _imageIdSpecificStateManager = __webpack_require__(18); var _triggerEvent = __webpack_require__(5); 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 = _events2.default.MEASUREMENT_ADDED; 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 = _events2.default.MEASUREMENT_REMOVED; 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; /***/ }), /* 3 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var elementToolOptions = {}; function getToolOptions(toolType, element) { if (!elementToolOptions[toolType]) { return {}; } var toolOptions = elementToolOptions[toolType]; var optionsObject = toolOptions.find(function (toolOptionObject) { return toolOptionObject.element === element; }); if (!optionsObject) { return {}; } return optionsObject.options; } function setToolOptions(toolType, element, options) { if (!elementToolOptions[toolType]) { elementToolOptions[toolType] = [{ element: element, options: options }]; return; } var toolOptions = elementToolOptions[toolType]; var index = toolOptions.findIndex(function (toolOptionObject) { return toolOptionObject.element === element; }); if (index === -1) { elementToolOptions[toolType].push({ element: element, options: options }); } else { elementToolOptions[toolType][index].options = options; } } function clearToolOptions(toolType, element) { var toolOptions = elementToolOptions[toolType]; if (toolOptions) { elementToolOptions[toolType] = toolOptions.filter(function (toolOptionObject) { return toolOptionObject.element !== element; }); } } function clearToolOptionsByToolType(toolType) { delete elementToolOptions[toolType]; } function clearToolOptionsByElement(element) { for (var toolType in elementToolOptions) { elementToolOptions[toolType] = elementToolOptions[toolType].filter(function (toolOptionObject) { return toolOptionObject.element !== element; }); } } exports.getToolOptions = getToolOptions; exports.setToolOptions = setToolOptions; exports.clearToolOptions = clearToolOptions; exports.clearToolOptionsByToolType = clearToolOptionsByToolType; exports.clearToolOptionsByElement = clearToolOptionsByElement; /***/ }), /* 4 */ /***/ (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; }; /***/ }), /* 5 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = triggerEvent; /** * 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, { detail: detail, cancelable: true }); } else { event = document.createEvent('CustomEvent'); event.initCustomEvent(type, true, true, detail); } return el.dispatchEvent(event); } /***/ }), /* 6 */ /***/ (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; /***/ }), /* 7 */ /***/ (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__(13); var _textStyle2 = _interopRequireDefault(_textStyle); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }), /* 8 */ /***/ (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; /***/ }), /* 9 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = function (mouseToolInterface) { var configuration = {}; var toolType = mouseToolInterface.toolType; function mouseDownActivateCallback(e) { var eventData = e.detail; var element = eventData.element; var options = (0, _toolOptions.getToolOptions)(toolType, element); if (!(0, _isMouseButtonEnabled2.default)(eventData.which, options.mouseButtonMask)) { return; } if (mouseToolInterface.addNewMeasurement) { mouseToolInterface.addNewMeasurement(eventData); } else { addNewMeasurement(eventData); } e.preventDefault(); e.stopPropagation(); } // /////// END ACTIVE TOOL /////// // /////// BEGIN DEACTIVE TOOL /////// function mouseMoveCallback(e) { var eventData = e.detail; _toolCoordinates2.default.setCoords(eventData); // If we have no tool data for this element, do nothing var toolData = (0, _toolState.getToolState)(eventData.element, 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) { var eventData = e.detail; var data = void 0; var element = eventData.element; var options = (0, _toolOptions.getToolOptions)(toolType, element); if (!(0, _isMouseButtonEnabled2.default)(eventData.which, options.mouseButtonMask)) { return; } function handleDoneMove() { data.invalidated = true; if ((0, _anyHandlesOutsideImage2.default)(eventData, data.handles)) { // Delete the measurement (0, _toolState.removeToolState)(element, toolType, data); } _externalModules2.default.cornerstone.updateImage(element); element.addEventListener(_events2.default.MOUSE_MOVE, mouseMove); } var coords = eventData.startPoints.canvas; var toolData = (0, _toolState.getToolState)(e.currentTarget, 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.removeEventListener(_events2.default.MOUSE_MOVE, mouseMove); data.active = true; (0, _moveHandle2.default)(eventData, toolType, data, handle, handleDoneMove, preventHandleOutsideImage); e.stopImmediatePropagation(); e.stopPropagation(); e.preventDefault(); return; } } // 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 opt = 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.removeEventListener(_events2.default.MOUSE_MOVE, mouseMove); (0, _moveAllHandles2.default)(e, data, toolData, toolType, opt, handleDoneMove); e.stopImmediatePropagation(); e.stopPropagation(); e.preventDefault(); return; } } } // /////// END DEACTIVE TOOL /////// var mouseMove = mouseToolInterface.mouseMoveCallback || mouseMoveCallback; var mouseDown = mouseToolInterface.mouseDownCallback || mouseDownCallback; var mouseDownActivate = mouseToolInterface.mouseDownActivateCallback || mouseDownActivateCallback; var mouseDoubleClick = mouseToolInterface.mouseDoubleClickCallback; // /////// BEGIN ACTIVE TOOL /////// function addNewMeasurement(mouseEventData) { var cornerstone = _externalModules2.default.cornerstone; var element = mouseEventData.element; var measurementData = mouseToolInterface.createNewMeasurement(mouseEventData); if (!measurementData) { return; } // Associate this data with this imageId so we can render it and manipulate it (0, _toolState.addToolState)(mouseEventData.element, 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.removeEventListener(_events2.default.MOUSE_MOVE, mouseMove); element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDown); element.removeEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownActivate); if (mouseDoubleClick) { element.removeEventListener(_events2.default.MOUSE_DOUBLE_CLICK, mouseDoubleClick); } 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, 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, toolType, measurementData); } element.addEventListener(_events2.default.MOUSE_MOVE, mouseMove); element.addEventListener(_events2.default.MOUSE_DOWN, mouseDown); element.addEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownActivate); if (mouseDoubleClick) { element.addEventListener(_events2.default.MOUSE_DOUBLE_CLICK, mouseDoubleClick); } cornerstone.updateImage(element); }, preventHandleOutsideImage); } // Not visible, not interactive function disable(element) { element.removeEventListener(_events2.default.IMAGE_RENDERED, mouseToolInterface.onImageRendered); element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMove); element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDown); element.removeEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownActivate); if (mouseDoubleClick) { element.removeEventListener(_events2.default.MOUSE_DOUBLE_CLICK, mouseDoubleClick); } _externalModules2.default.cornerstone.updateImage(element); } // Visible but not interactive function enable(element) { element.removeEventListener(_events2.default.IMAGE_RENDERED, mouseToolInterface.onImageRendered); element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMove); element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDown); element.removeEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownActivate); if (mouseDoubleClick) { element.removeEventListener(_events2.default.MOUSE_DOUBLE_CLICK, mouseDoubleClick); } element.addEventListener(_events2.default.IMAGE_RENDERED, mouseToolInterface.onImageRendered); _externalModules2.default.cornerstone.updateImage(element); } // Visible, interactive and can create function activate(element, mouseButtonMask) { (0, _toolOptions.setToolOptions)(toolType, element, { mouseButtonMask: mouseButtonMask }); element.removeEventListener(_events2.default.IMAGE_RENDERED, mouseToolInterface.onImageRendered); element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMove); element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDown); element.removeEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownActivate); element.addEventListener(_events2.default.IMAGE_RENDERED, mouseToolInterface.onImageRendered); element.addEventListener(_events2.default.MOUSE_MOVE, mouseMove); element.addEventListener(_events2.default.MOUSE_DOWN, mouseDown); element.addEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownActivate); if (mouseDoubleClick) { element.removeEventListener(_events2.default.MOUSE_DOUBLE_CLICK, mouseDoubleClick); element.addEventListener(_events2.default.MOUSE_DOUBLE_CLICK, mouseDoubleClick); } _externalModules2.default.cornerstone.updateImage(element); } // Visible, interactive function deactivate(element, mouseButtonMask) { (0, _toolOptions.setToolOptions)(toolType, element, { mouseButtonMask: mouseButtonMask }); var eventType = _events2.default.TOOL_DEACTIVATED; var statusChangeEventData = { mouseButtonMask: mouseButtonMask, toolType: toolType, type: eventType }; (0, _triggerEvent2.default)(element, eventType, statusChangeEventData); element.removeEventListener(_events2.default.IMAGE_RENDERED, mouseToolInterface.onImageRendered); element.removeEventListener(_events2.default.MOUSE_MOVE, mouseMove); element.removeEventListener(_events2.default.MOUSE_DOWN, mouseDown); element.removeEventListener(_events2.default.MOUSE_DOWN_ACTIVATE, mouseDownActivate); element.addEventListener(_events2.default.IMAGE_RENDERED, mouseToolInterface.onImageRendered); element.addEventListener(_events2.default.MOUSE_MOVE, mouseMove); element.addEventListener(_events2.default.MOUSE_DOWN, mouseDown); if (mouseDoubleClick) { element.removeEventListener(_events2.default.MOUSE_DOUBLE_CLICK, mouseDoubleClick); element.addEventListener(_events2.default.MOUSE_DOUBLE_CLICK, mouseDoubleClick); } 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 (mouseDoubleClick) { toolInterface.mouseDoubleClickCallback = mouseDoubleClick; } if (mouseToolInterface.addNewMeasurement) { toolInterface.addNewMeasurement = mouseToolInterface.addNewMeasurement; } return toolInterface; }; var _events = __webpack_require__(1); var _events2 = _interopRequireDefault(_events); var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); var _toolCoordinates = __webpack_require__(36); var _toolCoordinates2 = _interopRequireDefault(_toolCoordinates); var _getHandleNearImagePoint = __webpack_require__(21); var _getHandleNearImagePoint2 = _interopRequireDefault(_getHandleNearImagePoint); var _handleActivator = __webpack_require__(37); var _handleActivator2 = _interopRequireDefault(_handleActivator); var _moveHandle = __webpack_require__(23); var _moveHandle2 = _interopRequireDefault(_moveHandle); var _moveNewHandle = __webpack_require__(24); var _moveNewHandle2 = _interopRequireDefault(_moveNewHandle); var _moveAllHandles = __webpack_require__(38); var _moveAllHandles2 = _interopRequireDefault(_moveAllHandles); var _anyHandlesOutsideImage = __webpack_require__(14); var _anyHandlesOutsideImage2 = _interopRequireDefault(_anyHandlesOutsideImage); var _isMouseButtonEnabled = __webpack_require__(4); var _isMouseButtonEnabled2 = _interopRequireDefault(_isMouseButtonEnabled); var _toolState = __webpack_require__(2); var _triggerEvent = __webpack_require__(5); var _triggerEvent2 = _interopRequireDefault(_triggerEvent); var _toolOptions = __webpack_require__(3); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }), /* 10 */ /***/ (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__(8); var _toolStyle2 = _interopRequireDefault(_toolStyle); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var handleRadius = 6; /***/ }), /* 11 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _events = __webpack_require__(1); var _events2 = _interopRequireDefault(_events); var _externalModules = __webpack_require__(0); var _externalModules2 = _interopRequireDefault(_externalModules); var _anyHandlesOutsideImage = __webpack_require__(14); var _anyHandlesOutsideImage2 = _interopRequireDefault(_anyHandlesOutsideImage); var _getHandleNearImagePoint = __webpack_require__(21); var _getHandleNearImagePoint2 = _interopRequireDefault(_getHandleNearImagePoint); var _touchMoveHandle = __webpack_require__(52); var _touchMoveHandle2 = _interopRequireDefault(_touchMoveHandle); var _moveNewHandleTouch = __webpack_require__(27); var _moveNewHandleTouch2 = _interopRequireDefault(_moveNewHandleTouch); var _touchMoveAllHandles = __webpack_require__(51); var _touchMoveAllHandles2 = _interopRequireDefault(_touchMoveAllHandles); var _toolState = __webpack_require__(2); var _triggerEvent = __webpack_require__(5); 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 === _events2.default.TAP) { 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.removeEventListener(_events2.default.TOUCH_START_ACTIVE, touchToolInterface.touchDownActivateCallback || touchDownActivateCallback); element.removeEventListener(_events2.default.TAP, touchToolInterface.tapCallback || tapCallback); element.removeEventListener(_events2.default.TOUCH_START, 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.addEventListener(_events2.default.TOUCH_START_ACTIVE, touchToolInterface.touchDownActivateCallback || touchDownActivateCallback); element.addEventListener(_events2.default.TAP, touchToolInterface.tapCallback || tapCallback); element.addEventListener(_events2.default.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback); cornerstone.updateImage(element); }); } function touchDownActivateCallback(e) { var eventData = e.detail; // 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) { var eventData = e.detail; // 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); element.addEventListener(_events2.default.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback); element.addEventListener(_events2.default.TAP, 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.removeEventListener(_events2.default.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback); element.removeEventListener(_events2.default.TAP, 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)) { element.removeEventListener(_events2.default.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback); element.removeEventListener(_events2.default.TAP, 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); } else { touchDownActivateCallback(e); } return false; } function touchStartCallback(e) { var eventData = e.detail; // 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); element.addEventListener(_events2.default.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback); element.addEventListener(_events2.default.TAP, touchToolInterface.tapCallback || tapCallback); if (touchToolInterface.pressCallback) { element.addEventListener(_events2.default.TOUCH_PRESS, touchToolInterface.pressCallback); } if (lastEvent && lastEvent.type === _events2.default.TOUCH_PRESS) { (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) { element.removeEventListener(_events2.default.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback); element.removeEventListener(_events2.default.TAP, touchToolInterface.tapCallback || tapCallback); if (touchToolInterface.pressCallback) { element.removeEventListener(_events2.default.TOUCH_PRESS, touchToolInterface.pressCallback); } data.active = true; (0, _touchMoveHandle2.default)(e, touchToolInterface.toolType, data, handle, doneMovingCallback); e.stopImmediatePropagation(); e.preventDefault(); e.stopPropagation(); 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)) { element.removeEventListener(_events2.default.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback); element.removeEventListener(_events2.default.TAP, touchToolInterface.tapCallback || tapCallback); if (touchToolInterface.pressCallback) { element.removeEventListener(_events2.default.TOUCH_PRESS, touchToolInterface.pressCallback); } (0, _touchMoveAllHandles2.default)(e, data, toolData, touchToolInterface.toolType, true, doneMovingCallback); e.stopImmediatePropagation(); e.preventDefault(); e.stopPropagation(); return; } } } // /////// END INACTIVE TOOL /////// // Not visible, not interactive function disable(element) { element.removeEventListener(_events2.default.IMAGE_RENDERED, touchToolInterface.onImageRendered); element.removeEventListener(_events2.default.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback); element.removeEventListener(_events2.default.TOUCH_START_ACTIVE, touchToolInterface.touchDownActivateCallback || touchDownActivateCallback); element.removeEventListener(_events2.default.TAP, touchToolInterface.tapCallback || tapCallback); if (touchToolInterface.doubleTapCallback) { element.removeEventListener(_events2.default.DOUBLE_TAP, touchToolInterface.doubleTapCallback); } if (touchToolInterface.pressCallback) { element.removeEventListener(_events2.default.TOUCH_PRESS, touchToolInterface.pressCallback); } _externalModules2.default.cornerstone.updateImage(element); } // Visible but not interactive function enable(element) { element.removeEventListener(_events2.default.IMAGE_RENDERED, touchToolInterface.onImageRendered); element.removeEventListener(_events2.default.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback); element.removeEventListener(_events2.default.TOUCH_START_ACTIVE, touchToolInterface.touchDownActivateCallback || touchDownActivateCallback); element.removeEventListener(_events2.default.TAP, touchToolInterface.tapCallback || tapCallback); element.addEventListener(_events2.default.IMAGE_RENDERED, touchToolInterface.onImageRendered); if (touchToolInterface.doubleTapCallback) { element.removeEventListener(_events2.default.DOUBLE_TAP, touchToolInterface.doubleTapCallback); } if (touchToolInterface.pressCallback) { element.removeEventListener(_events2.default.TOUCH_PRESS, touchToolInterface.pressCallback); } _externalModules2.default.cornerstone.updateImage(element); } // Visible, interactive and can create function activate(element) { element.removeEventListener(_events2.default.IMAGE_RENDERED, touchToolInterface.onImageRendered); element.removeEventListener(_events2.default.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback); element.removeEventListener(_events2.default.TOUCH_START_ACTIVE, touchToolInterface.touchDownActivateCallback || touchDownActivateCallback); element.removeEventListener(_events2.default.TAP, touchToolInterface.tapCallback || tapCallback); element.addEventListener(_events2.default.IMAGE_RENDERED, touchToolInterface.onImageRendered); element.addEventListener(_events2.default.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback); element.addEventListener(_events2.default.TOUCH_START_ACTIVE, touchToolInterface.touchDownActivateCallback || touchDownActivateCallback); element.addEventListener(_events2.default.TAP, touchToolInterface.tapCallback || tapCallback); if (touchToolInterface.doubleTapCallback) { element.removeEventListener(_events2.default.DOUBLE_TAP, touchToolInterface.doubleTapCallback); element.addEventListener(_events2.default.DOUBLE_TAP, touchToolInterface.doubleTapCallback); } if (touchToolInterface.pressCallback) { element.removeEventListener(_events2.default.TOUCH_PRESS, touchToolInterface.pressCallback); element.addEventListener(_events2.default.TOUCH_PRESS, touchToolInterface.pressCallback); } _externalModules2.default.cornerstone.updateImage(element); } // Visible, interactive function deactivate(element) { var eventType = _events2.default.TOOL_DEACTIVATED; var statusChangeEventData = { toolType: touchToolInterface.toolType, type: eventType }; (0, _triggerEvent2.default)(element, eventType, statusChangeEventData); element.removeEventListener(_events2.default.IMAGE_RENDERED, touchToolInterface.onImageRendered); element.removeEventListener(_events2.default.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback); element.removeEventListener(_events2.default.TOUCH_START_ACTIVE, touchToolInterface.touchDownActivateCallback || touchDownActivateCallback); element.removeEventListener(_events2.default.TAP, touchToolInterface.tapCallback || tapCallback); element.addEventListener(_events2.default.IMAGE_RENDERED, touchToolInterface.onImageRendered); element.addEventListener(_events2.default.TOUCH_START, touchToolInterface.touchStartCallback || touchStartCallback); if (touchToolInterface.doubleTapCallback) { element.removeEventListener(_events2.default.DOUBLE_TAP, touchToolInterface.doubleTapCallback); } if (touchToolInterface.pressCallback) { element.removeEventListener(_events2.default.TOUCH_PRESS, 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; /***/ }), /* 12 */ /***/ (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; /***/ }), /* 13 */ /***/ (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 = backg