vendor: 5,696 bytes, lines 1-139
1/*! cornerstone-tools - 3.16.0 - 2019-07-18 | (c) 2017 Chris Hafey | https://github.com/cornerstonejs/cornerstoneTools */ 2(function webpackUniversalModuleDefinition(root, factory) { 3 if(typeof exports === 'object' && typeof module === 'object') 4 module.exports = factory(); 5 else if(typeof define === 'function' && define.amd) 6 define("cornerstone-tools", [], factory); 7 else if(typeof exports === 'object') 8 exports["cornerstone-tools"] = factory(); 9 else 10 root["cornerstoneTools"] = factory(); 11})(window, function() { 12return /******/ (function(modules) { // webpackBootstrap 13/******/ function hotDisposeChunk(chunkId) { 14/******/ delete installedChunks[chunkId]; 15/******/ } 16/******/ var parentHotUpdateCallback = window["webpackHotUpdate"]; 17/******/ window["webpackHotUpdate"] = // eslint-disable-next-line no-unused-vars 18/******/ function webpackHotUpdateCallback(chunkId, moreModules) { 19/******/ hotAddUpdateChunk(chunkId, moreModules); 20/******/ if (parentHotUpdateCallback) parentHotUpdateCallback(chunkId, moreModules); 21/******/ } ; 22/******/ 23/******/ // eslint-disable-next-line no-unused-vars 24/******/ function hotDownloadUpdateChunk(chunkId) { 25/******/ var head = document.getElementsByTagName("head")[0]; 26/******/ var script = document.createElement("script"); 27/******/ script.charset = "utf-8"; 28/******/ script.src = __webpack_require__.p + "" + chunkId + "." + hotCurrentHash + ".hot-update.js"; 29/******/ ; 30/******/ head.appendChild(script); 31/******/ } 32/******/ 33/******/ // eslint-disable-next-line no-unused-vars 34/******/ function hotDownloadManifest(requestTimeout) { 35/******/ requestTimeout = requestTimeout || 10000; 36/******/ return new Promise(function(resolve, reject) { 37/******/ if (typeof XMLHttpRequest === "undefined") 38/******/ return reject(new Error("No browser support")); 39/******/ try { 40/******/ var request = new XMLHttpRequest(); 41/******/ var requestPath = __webpack_require__.p + "" + hotCurrentHash + ".hot-update.json"; 42/******/ request.open("GET", requestPath, true); 43/******/ request.timeout = requestTimeout; 44/******/ request.send(null); 45/******/ } catch (err) { 46/******/ return reject(err); 47/******/ } 48/******/ request.onreadystatechange = function() { 49/******/ if (request.readyState !== 4) return; 50/******/ if (request.status === 0) { 51/******/ // timeout 52/******/ reject( 53/******/ new Error("Manifest request to " + requestPath + " timed out.") 54/******/ ); 55/******/ } else if (request.status === 404) { 56/******/ // no update available 57/******/ resolve(); 58/******/ } else if (request.status !== 200 && request.status !== 304) { 59/******/ // other failure 60/******/ reject(new Error("Manifest request to " + requestPath + " failed.")); 61/******/ } else { 62/******/ // success 63/******/ try { 64/******/ var update = JSON.parse(request.responseText); 65/******/ } catch (e) { 66/******/ reject(e); 67/******/ return; 68/******/ } 69/******/ resolve(update); 70/******/ } 71/******/ }; 72/******/ }); 73/******/ } 74/******/ 75/******/ var hotApplyOnUpdate = true; 76/******/ var hotCurrentHash = "629cef98364aabf113b0"; // eslint-disable-line no-unused-vars 77/******/ var hotRequestTimeout = 10000; 78/******/ var hotCurrentModuleData = {}; 79/******/ var hotCurrentChildModule; // eslint-disable-line no-unused-vars 80/******/ var hotCurrentParents = []; // eslint-disable-line no-unused-vars 81/******/ var hotCurrentParentsTemp = []; // eslint-disable-line no-unused-vars 82/******/ 83/******/ // eslint-disable-next-line no-unused-vars 84/******/ function hotCreateRequire(moduleId) { 85/******/ var me = installedModules[moduleId]; 86/******/ if (!me) return __webpack_require__; 87/******/ var fn = function(request) { 88/******/ if (me.hot.active) { 89/******/ if (installedModules[request]) { 90/******/ if (installedModules[request].parents.indexOf(moduleId) === -1) 91/******/ installedModules[request].parents.push(moduleId); 92/******/ } else { 93/******/ hotCurrentParents = [moduleId]; 94/******/ hotCurrentChildModule = request; 95/******/ } 96/******/ if (me.children.indexOf(request) === -1) me.children.push(request); 97/******/ } else { 98/******/ console.warn( 99/******/ "[HMR] unexpected require(" + 100/******/ request + 101/******/ ") from disposed module " + 102/******/ moduleId 103/******/ ); 104/******/ hotCurrentParents = []; 105/******/ } 106/******/ return __webpack_require__(request); 107/******/ }; 108/******/ var ObjectFactory = function ObjectFactory(name) { 109/******/ return { 110/******/ configurable: true, 111/******/ enumerable: true, 112/******/ get: function() { 113/******/ return __webpack_require__[name]; 114/******/ }, 115/******/ set: function(value) { 116/******/ __webpack_require__[name] = value; 117/******/ } 118/******/ }; 119/******/ }; 120/******/ for (var name in __webpack_require__) { 121/******/ if ( 122/******/ Object.prototype.hasOwnProperty.call(__webpack_require__, name) && 123/******/ name !== "e" 124/******/ ) { 125/******/ Object.defineProperty(fn, name, ObjectFactory(name)); 126/******/ } 127/******/ } 128/******/ fn.e = function(chunkId) { 129/******/ if (hotStatus === "ready") hotSetStatus("prepare"); 130/******/ hotChunksLoading++; 131/******/ return __webpack_require__.e(chunkId).then(finishChunkLoading, function(err) { 132/******/ finishChunkLoading(); 133/******/ throw err; 134/******/ }); 135/******/ 136/******/ function finishChunkLoading() { 137/******/ hotChunksLoading--; 138/******/ if (hotStatus === "prepare") { 139/******/ if (!hotWaitingFilesMap[chunkId]) {
vendor: 7,286 bytes, lines 140-349
140/******/ hotEnsureUpdateChunk(chunkId); 141/******/ } 142/******/ if (hotChunksLoading === 0 && hotWaitingFiles === 0) { 143/******/ hotUpdateDownloaded(); 144/******/ } 145/******/ } 146/******/ } 147/******/ }; 148/******/ return fn; 149/******/ } 150/******/ 151/******/ // eslint-disable-next-line no-unused-vars 152/******/ function hotCreateModule(moduleId) { 153/******/ var hot = { 154/******/ // private stuff 155/******/ _acceptedDependencies: {}, 156/******/ _declinedDependencies: {}, 157/******/ _selfAccepted: false, 158/******/ _selfDeclined: false, 159/******/ _disposeHandlers: [], 160/******/ _main: hotCurrentChildModule !== moduleId, 161/******/ 162/******/ // Module API 163/******/ active: true, 164/******/ accept: function(dep, callback) { 165/******/ if (typeof dep === "undefined") hot._selfAccepted = true; 166/******/ else if (typeof dep === "function") hot._selfAccepted = dep; 167/******/ else if (typeof dep === "object") 168/******/ for (var i = 0; i < dep.length; i++) 169/******/ hot._acceptedDependencies[dep[i]] = callback || function() {}; 170/******/ else hot._acceptedDependencies[dep] = callback || function() {}; 171/******/ }, 172/******/ decline: function(dep) { 173/******/ if (typeof dep === "undefined") hot._selfDeclined = true; 174/******/ else if (typeof dep === "object") 175/******/ for (var i = 0; i < dep.length; i++) 176/******/ hot._declinedDependencies[dep[i]] = true; 177/******/ else hot._declinedDependencies[dep] = true; 178/******/ }, 179/******/ dispose: function(callback) { 180/******/ hot._disposeHandlers.push(callback); 181/******/ }, 182/******/ addDisposeHandler: function(callback) { 183/******/ hot._disposeHandlers.push(callback); 184/******/ }, 185/******/ removeDisposeHandler: function(callback) { 186/******/ var idx = hot._disposeHandlers.indexOf(callback); 187/******/ if (idx >= 0) hot._disposeHandlers.splice(idx, 1); 188/******/ }, 189/******/ 190/******/ // Management API 191/******/ check: hotCheck, 192/******/ apply: hotApply, 193/******/ status: function(l) { 194/******/ if (!l) return hotStatus; 195/******/ hotStatusHandlers.push(l); 196/******/ }, 197/******/ addStatusHandler: function(l) { 198/******/ hotStatusHandlers.push(l); 199/******/ }, 200/******/ removeStatusHandler: function(l) { 201/******/ var idx = hotStatusHandlers.indexOf(l); 202/******/ if (idx >= 0) hotStatusHandlers.splice(idx, 1); 203/******/ }, 204/******/ 205/******/ //inherit from previous dispose call 206/******/ data: hotCurrentModuleData[moduleId] 207/******/ }; 208/******/ hotCurrentChildModule = undefined; 209/******/ return hot; 210/******/ } 211/******/ 212/******/ var hotStatusHandlers = []; 213/******/ var hotStatus = "idle"; 214/******/ 215/******/ function hotSetStatus(newStatus) { 216/******/ hotStatus = newStatus; 217/******/ for (var i = 0; i < hotStatusHandlers.length; i++) 218/******/ hotStatusHandlers[i].call(null, newStatus); 219/******/ } 220/******/ 221/******/ // while downloading 222/******/ var hotWaitingFiles = 0; 223/******/ var hotChunksLoading = 0; 224/******/ var hotWaitingFilesMap = {}; 225/******/ var hotRequestedFilesMap = {}; 226/******/ var hotAvailableFilesMap = {}; 227/******/ var hotDeferred; 228/******/ 229/******/ // The update info 230/******/ var hotUpdate, hotUpdateNewHash; 231/******/ 232/******/ function toModuleId(id) { 233/******/ var isNumber = +id + "" === id; 234/******/ return isNumber ? +id : id; 235/******/ } 236/******/ 237/******/ function hotCheck(apply) { 238/******/ if (hotStatus !== "idle") 239/******/ throw new Error("check() is only allowed in idle status"); 240/******/ hotApplyOnUpdate = apply; 241/******/ hotSetStatus("check"); 242/******/ return hotDownloadManifest(hotRequestTimeout).then(function(update) { 243/******/ if (!update) { 244/******/ hotSetStatus("idle"); 245/******/ return null; 246/******/ } 247/******/ hotRequestedFilesMap = {}; 248/******/ hotWaitingFilesMap = {}; 249/******/ hotAvailableFilesMap = update.c; 250/******/ hotUpdateNewHash = update.h; 251/******/ 252/******/ hotSetStatus("prepare"); 253/******/ var promise = new Promise(function(resolve, reject) { 254/******/ hotDeferred = { 255/******/ resolve: resolve, 256/******/ reject: reject 257/******/ }; 258/******/ }); 259/******/ hotUpdate = {}; 260/******/ var chunkId = "cornerstoneTools"; 261/******/ { 262/******/ // eslint-disable-line no-lone-blocks 263/******/ /*globals chunkId */ 264/******/ hotEnsureUpdateChunk(chunkId); 265/******/ } 266/******/ if ( 267/******/ hotStatus === "prepare" && 268/******/ hotChunksLoading === 0 && 269/******/ hotWaitingFiles === 0 270/******/ ) { 271/******/ hotUpdateDownloaded(); 272/******/ } 273/******/ return promise; 274/******/ }); 275/******/ } 276/******/ 277/******/ // eslint-disable-next-line no-unused-vars 278/******/ function hotAddUpdateChunk(chunkId, moreModules) { 279/******/ if (!hotAvailableFilesMap[chunkId] || !hotRequestedFilesMap[chunkId]) 280/******/ return; 281/******/ hotRequestedFilesMap[chunkId] = false; 282/******/ for (var moduleId in moreModules) { 283/******/ if (Object.prototype.hasOwnProperty.call(moreModules, moduleId)) { 284/******/ hotUpdate[moduleId] = moreModules[moduleId]; 285/******/ } 286/******/ } 287/******/ if (--hotWaitingFiles === 0 && hotChunksLoading === 0) { 288/******/ hotUpdateDownloaded(); 289/******/ } 290/******/ } 291/******/ 292/******/ function hotEnsureUpdateChunk(chunkId) { 293/******/ if (!hotAvailableFilesMap[chunkId]) { 294/******/ hotWaitingFilesMap[chunkId] = true; 295/******/ } else { 296/******/ hotRequestedFilesMap[chunkId] = true; 297/******/ hotWaitingFiles++; 298/******/ hotDownloadUpdateChunk(chunkId); 299/******/ } 300/******/ } 301/******/ 302/******/ function hotUpdateDownloaded() { 303/******/ hotSetStatus("ready"); 304/******/ var deferred = hotDeferred; 305/******/ hotDeferred = null; 306/******/ if (!deferred) return; 307/******/ if (hotApplyOnUpdate) { 308/******/ // Wrap deferred object in Promise to mark it as a well-handled Promise to 309/******/ // avoid triggering uncaught exception warning in Chrome. 310/******/ // See https://bugs.chromium.org/p/chromium/issues/detail?id=465666 311/******/ Promise.resolve() 312/******/ .then(function() { 313/******/ return hotApply(hotApplyOnUpdate); 314/******/ }) 315/******/ .then( 316/******/ function(result) { 317/******/ deferred.resolve(result); 318/******/ }, 319/******/ function(err) { 320/******/ deferred.reject(err); 321/******/ } 322/******/ ); 323/******/ } else { 324/******/ var outdatedModules = []; 325/******/ for (var id in hotUpdate) { 326/******/ if (Object.prototype.hasOwnProperty.call(hotUpdate, id)) { 327/******/ outdatedModules.push(toModuleId(id)); 328/******/ } 329/******/ } 330/******/ deferred.resolve(outdatedModules); 331/******/ } 332/******/ } 333/******/ 334/******/ function hotApply(options) { 335/******/ if (hotStatus !== "ready") 336/******/ throw new Error("apply() is only allowed in ready status"); 337/******/ options = options || {}; 338/******/ 339/******/ var cb; 340/******/ var i; 341/******/ var j; 342/******/ var module; 343/******/ var moduleId; 344/******/ 345/******/ function getAffectedStuff(updateModuleId) { 346/******/ var outdatedModules = [updateModuleId]; 347/******/ var outdatedDependencies = {}; 348/******/ 349/******/ var queue = outdatedModules.slice()
vendor: 6,483 bytes, lines 349-526
349.map(function(id) { 350/******/ return { 351/******/ chain: [id], 352/******/ id: id 353/******/ }; 354/******/ }); 355/******/ while (queue.length > 0) { 356/******/ var queueItem = queue.pop(); 357/******/ var moduleId = queueItem.id; 358/******/ var chain = queueItem.chain; 359/******/ module = installedModules[moduleId]; 360/******/ if (!module || module.hot._selfAccepted) continue; 361/******/ if (module.hot._selfDeclined) { 362/******/ return { 363/******/ type: "self-declined", 364/******/ chain: chain, 365/******/ moduleId: moduleId 366/******/ }; 367/******/ } 368/******/ if (module.hot._main) { 369/******/ return { 370/******/ type: "unaccepted", 371/******/ chain: chain, 372/******/ moduleId: moduleId 373/******/ }; 374/******/ } 375/******/ for (var i = 0; i < module.parents.length; i++) { 376/******/ var parentId = module.parents[i]; 377/******/ var parent = installedModules[parentId]; 378/******/ if (!parent) continue; 379/******/ if (parent.hot._declinedDependencies[moduleId]) { 380/******/ return { 381/******/ type: "declined", 382/******/ chain: chain.concat([parentId]), 383/******/ moduleId: moduleId, 384/******/ parentId: parentId 385/******/ }; 386/******/ } 387/******/ if (outdatedModules.indexOf(parentId) !== -1) continue; 388/******/ if (parent.hot._acceptedDependencies[moduleId]) { 389/******/ if (!outdatedDependencies[parentId]) 390/******/ outdatedDependencies[parentId] = []; 391/******/ addAllToSet(outdatedDependencies[parentId], [moduleId]); 392/******/ continue; 393/******/ } 394/******/ delete outdatedDependencies[parentId]; 395/******/ outdatedModules.push(parentId); 396/******/ queue.push({ 397/******/ chain: chain.concat([parentId]), 398/******/ id: parentId 399/******/ }); 400/******/ } 401/******/ } 402/******/ 403/******/ return { 404/******/ type: "accepted", 405/******/ moduleId: updateModuleId, 406/******/ outdatedModules: outdatedModules, 407/******/ outdatedDependencies: outdatedDependencies 408/******/ }; 409/******/ } 410/******/ 411/******/ function addAllToSet(a, b) { 412/******/ for (var i = 0; i < b.length; i++) { 413/******/ var item = b[i]; 414/******/ if (a.indexOf(item) === -1) a.push(item); 415/******/ } 416/******/ } 417/******/ 418/******/ // at begin all updates modules are outdated 419/******/ // the "outdated" status can propagate to parents if they don't accept the children 420/******/ var outdatedDependencies = {}; 421/******/ var outdatedModules = []; 422/******/ var appliedUpdate = {}; 423/******/ 424/******/ var warnUnexpectedRequire = function warnUnexpectedRequire() { 425/******/ console.warn( 426/******/ "[HMR] unexpected require(" + result.moduleId + ") to disposed module" 427/******/ ); 428/******/ }; 429/******/ 430/******/ for (var id in hotUpdate) { 431/******/ if (Object.prototype.hasOwnProperty.call(hotUpdate, id)) { 432/******/ moduleId = toModuleId(id); 433/******/ /** @type {TODO} */ 434/******/ var result; 435/******/ if (hotUpdate[id]) { 436/******/ result = getAffectedStuff(moduleId); 437/******/ } else { 438/******/ result = { 439/******/ type: "disposed", 440/******/ moduleId: id 441/******/ }; 442/******/ } 443/******/ /** @type {Error|false} */ 444/******/ var abortError = false; 445/******/ var doApply = false; 446/******/ var doDispose = false; 447/******/ var chainInfo = ""; 448/******/ if (result.chain) { 449/******/ chainInfo = "\nUpdate propagation: " + result.chain.join(" -> "); 450/******/ } 451/******/ switch (result.type) { 452/******/ case "self-declined": 453/******/ if (options.onDeclined) options.onDeclined(result); 454/******/ if (!options.ignoreDeclined) 455/******/ abortError = new Error( 456/******/ "Aborted because of self decline: " + 457/******/ result.moduleId + 458/******/ chainInfo 459/******/ ); 460/******/ break; 461/******/ case "declined": 462/******/ if (options.onDeclined) options.onDeclined(result); 463/******/ if (!options.ignoreDeclined) 464/******/ abortError = new Error( 465/******/ "Aborted because of declined dependency: " + 466/******/ result.moduleId + 467/******/ " in " + 468/******/ result.parentId + 469/******/ chainInfo 470/******/ ); 471/******/ break; 472/******/ case "unaccepted": 473/******/ if (options.onUnaccepted) options.onUnaccepted(result); 474/******/ if (!options.ignoreUnaccepted) 475/******/ abortError = new Error( 476/******/ "Aborted because " + moduleId + " is not accepted" + chainInfo 477/******/ ); 478/******/ break; 479/******/ case "accepted": 480/******/ if (options.onAccepted) options.onAccepted(result); 481/******/ doApply = true; 482/******/ break; 483/******/ case "disposed": 484/******/ if (options.onDisposed) options.onDisposed(result); 485/******/ doDispose = true; 486/******/ break; 487/******/ default: 488/******/ throw new Error("Unexception type " + result.type); 489/******/ } 490/******/ if (abortError) { 491/******/ hotSetStatus("abort"); 492/******/ return Promise.reject(abortError); 493/******/ } 494/******/ if (doApply) { 495/******/ appliedUpdate[moduleId] = hotUpdate[moduleId]; 496/******/ addAllToSet(outdatedModules, result.outdatedModules); 497/******/ for (moduleId in result.outdatedDependencies) { 498/******/ if ( 499/******/ Object.prototype.hasOwnProperty.call( 500/******/ result.outdatedDependencies, 501/******/ moduleId 502/******/ ) 503/******/ ) { 504/******/ if (!outdatedDependencies[moduleId]) 505/******/ outdatedDependencies[moduleId] = []; 506/******/ addAllToSet( 507/******/ outdatedDependencies[moduleId], 508/******/ result.outdatedDependencies[moduleId] 509/******/ ); 510/******/ } 511/******/ } 512/******/ } 513/******/ if (doDispose) { 514/******/ addAllToSet(outdatedModules, [result.moduleId]); 515/******/ appliedUpdate[moduleId] = warnUnexpectedRequire; 516/******/ } 517/******/ } 518/******/ } 519/******/ 520/******/ // Store self accepted outdated modules to require them later by the module system 521/******/ var outdatedSelfAcceptedModules = []; 522/******/ for (i = 0; i < outdatedModules.length; i++) { 523/******/ moduleId = outdatedModules[i]; 524/******/ if ( 525/******/ installedModules[moduleId] && 526/******/ installedModules[moduleId].hot._selfAccepted
vendor: 6,962 bytes, lines 526-725
526 527/******/ ) 528/******/ outdatedSelfAcceptedModules.push({ 529/******/ module: moduleId, 530/******/ errorHandler: installedModules[moduleId].hot._selfAccepted 531/******/ }); 532/******/ } 533/******/ 534/******/ // Now in "dispose" phase 535/******/ hotSetStatus("dispose"); 536/******/ Object.keys(hotAvailableFilesMap).forEach(function(chunkId) { 537/******/ if (hotAvailableFilesMap[chunkId] === false) { 538/******/ hotDisposeChunk(chunkId); 539/******/ } 540/******/ }); 541/******/ 542/******/ var idx; 543/******/ var queue = outdatedModules.slice(); 544/******/ while (queue.length > 0) { 545/******/ moduleId = queue.pop(); 546/******/ module = installedModules[moduleId]; 547/******/ if (!module) continue; 548/******/ 549/******/ var data = {}; 550/******/ 551/******/ // Call dispose handlers 552/******/ var disposeHandlers = module.hot._disposeHandlers; 553/******/ for (j = 0; j < disposeHandlers.length; j++) { 554/******/ cb = disposeHandlers[j]; 555/******/ cb(data); 556/******/ } 557/******/ hotCurrentModuleData[moduleId] = data; 558/******/ 559/******/ // disable module (this disables requires from this module) 560/******/ module.hot.active = false; 561/******/ 562/******/ // remove module from cache 563/******/ delete installedModules[moduleId]; 564/******/ 565/******/ // when disposing there is no need to call dispose handler 566/******/ delete outdatedDependencies[moduleId]; 567/******/ 568/******/ // remove "parents" references from all children 569/******/ for (j = 0; j < module.children.length; j++) { 570/******/ var child = installedModules[module.children[j]]; 571/******/ if (!child) continue; 572/******/ idx = child.parents.indexOf(moduleId); 573/******/ if (idx >= 0) { 574/******/ child.parents.splice(idx, 1); 575/******/ } 576/******/ } 577/******/ } 578/******/ 579/******/ // remove outdated dependency from module children 580/******/ var dependency; 581/******/ var moduleOutdatedDependencies; 582/******/ for (moduleId in outdatedDependencies) { 583/******/ if ( 584/******/ Object.prototype.hasOwnProperty.call(outdatedDependencies, moduleId) 585/******/ ) { 586/******/ module = installedModules[moduleId]; 587/******/ if (module) { 588/******/ moduleOutdatedDependencies = outdatedDependencies[moduleId]; 589/******/ for (j = 0; j < moduleOutdatedDependencies.length; j++) { 590/******/ dependency = moduleOutdatedDependencies[j]; 591/******/ idx = module.children.indexOf(dependency); 592/******/ if (idx >= 0) module.children.splice(idx, 1); 593/******/ } 594/******/ } 595/******/ } 596/******/ } 597/******/ 598/******/ // Not in "apply" phase 599/******/ hotSetStatus("apply"); 600/******/ 601/******/ hotCurrentHash = hotUpdateNewHash; 602/******/ 603/******/ // insert new code 604/******/ for (moduleId in appliedUpdate) { 605/******/ if (Object.prototype.hasOwnProperty.call(appliedUpdate, moduleId)) { 606/******/ modules[moduleId] = appliedUpdate[moduleId]; 607/******/ } 608/******/ } 609/******/ 610/******/ // call accept handlers 611/******/ var error = null; 612/******/ for (moduleId in outdatedDependencies) { 613/******/ if ( 614/******/ Object.prototype.hasOwnProperty.call(outdatedDependencies, moduleId) 615/******/ ) { 616/******/ module = installedModules[moduleId]; 617/******/ if (module) { 618/******/ moduleOutdatedDependencies = outdatedDependencies[moduleId]; 619/******/ var callbacks = []; 620/******/ for (i = 0; i < moduleOutdatedDependencies.length; i++) { 621/******/ dependency = moduleOutdatedDependencies[i]; 622/******/ cb = module.hot._acceptedDependencies[dependency]; 623/******/ if (cb) { 624/******/ if (callbacks.indexOf(cb) !== -1) continue; 625/******/ callbacks.push(cb); 626/******/ } 627/******/ } 628/******/ for (i = 0; i < callbacks.length; i++) { 629/******/ cb = callbacks[i]; 630/******/ try { 631/******/ cb(moduleOutdatedDependencies); 632/******/ } catch (err) { 633/******/ if (options.onErrored) { 634/******/ options.onErrored({ 635/******/ type: "accept-errored", 636/******/ moduleId: moduleId, 637/******/ dependencyId: moduleOutdatedDependencies[i], 638/******/ error: err 639/******/ }); 640/******/ } 641/******/ if (!options.ignoreErrored) { 642/******/ if (!error) error = err; 643/******/ } 644/******/ } 645/******/ } 646/******/ } 647/******/ } 648/******/ } 649/******/ 650/******/ // Load self accepted modules 651/******/ for (i = 0; i < outdatedSelfAcceptedModules.length; i++) { 652/******/ var item = outdatedSelfAcceptedModules[i]; 653/******/ moduleId = item.module; 654/******/ hotCurrentParents = [moduleId]; 655/******/ try { 656/******/ __webpack_require__(moduleId); 657/******/ } catch (err) { 658/******/ if (typeof item.errorHandler === "function") { 659/******/ try { 660/******/ item.errorHandler(err); 661/******/ } catch (err2) { 662/******/ if (options.onErrored) { 663/******/ options.onErrored({ 664/******/ type: "self-accept-error-handler-errored", 665/******/ moduleId: moduleId, 666/******/ error: err2, 667/******/ originalError: err 668/******/ }); 669/******/ } 670/******/ if (!options.ignoreErrored) { 671/******/ if (!error) error = err2; 672/******/ } 673/******/ if (!error) error = err; 674/******/ } 675/******/ } else { 676/******/ if (options.onErrored) { 677/******/ options.onErrored({ 678/******/ type: "self-accept-errored", 679/******/ moduleId: moduleId, 680/******/ error: err 681/******/ }); 682/******/ } 683/******/ if (!options.ignoreErrored) { 684/******/ if (!error) error = err; 685/******/ } 686/******/ } 687/******/ } 688/******/ } 689/******/ 690/******/ // handle errors in accept handlers and self accepted module load 691/******/ if (error) { 692/******/ hotSetStatus("fail"); 693/******/ return Promise.reject(error); 694/******/ } 695/******/ 696/******/ hotSetStatus("idle"); 697/******/ return new Promise(function(resolve) { 698/******/ resolve(outdatedModules); 699/******/ }); 700/******/ } 701/******/ 702/******/ // The module cache 703/******/ var installedModules = {}; 704/******/ 705/******/ // The require function 706/******/ function __webpack_require__(moduleId) { 707/******/ 708/******/ // Check if module is in cache 709/******/ if(installedModules[moduleId]) { 710/******/ return installedModules[moduleId].exports; 711/******/ } 712/******/ // Create a new module (and put it into the cache) 713/******/ var module = installedModules[moduleId] = { 714/******/ i: moduleId, 715/******/ l: false, 716/******/ exports: {}, 717/******/ hot: hotCreateModule(moduleId), 718/******/ parents: (hotCurrentParentsTemp = hotCurrentParents, hotCurrentParents = [], hotCurrentParentsTemp), 719/******/ children: [] 720/******/ }; 721/******/ 722/******/ // Execute the module function 723/******/ modules[moduleId].call(module.exports, module, module.exports, hotCreateRequire(moduleId)); 724/******/ 725/******/ // Flag the module as loaded
vendor: 1,970 bytes, lines 726-779
726/******/ module.l = true; 727/******/ 728/******/ // Return the exports of the module 729/******/ return module.exports; 730/******/ } 731/******/ 732/******/ 733/******/ // expose the modules object (__webpack_modules__) 734/******/ __webpack_require__.m = modules; 735/******/ 736/******/ // expose the module cache 737/******/ __webpack_require__.c = installedModules; 738/******/ 739/******/ // define getter function for harmony exports 740/******/ __webpack_require__.d = function(exports, name, getter) { 741/******/ if(!__webpack_require__.o(exports, name)) { 742/******/ Object.defineProperty(exports, name, { 743/******/ configurable: false, 744/******/ enumerable: true, 745/******/ get: getter 746/******/ }); 747/******/ } 748/******/ }; 749/******/ 750/******/ // define __esModule on exports 751/******/ __webpack_require__.r = function(exports) { 752/******/ Object.defineProperty(exports, '__esModule', { value: true }); 753/******/ }; 754/******/ 755/******/ // getDefaultExport function for compatibility with non-harmony modules 756/******/ __webpack_require__.n = function(module) { 757/******/ var getter = module && module.__esModule ? 758/******/ function getDefault() { return module['default']; } : 759/******/ function getModuleExports() { return module; }; 760/******/ __webpack_require__.d(getter, 'a', getter); 761/******/ return getter; 762/******/ }; 763/******/ 764/******/ // Object.prototype.hasOwnProperty.call 765/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; 766/******/ 767/******/ // __webpack_public_path__ 768/******/ __webpack_require__.p = ""; 769/******/ 770/******/ // __webpack_hash__ 771/******/ __webpack_require__.h = function() { return hotCurrentHash; }; 772/******/ 773/******/ 774/******/ // Load entry module and return exports 775/******/ return hotCreateRequire("./index.js")(__webpack_require__.s = "./index.js"); 776/******/ }) 777/************************************************************************/ 778/******/ ({ 779
vendor: 594 bytes, lines 780-800
780/***/ "../node_modules/@babel/runtime/helpers/arrayWithoutHoles.js": 781/*!*******************************************************************!*\ 782 !*** ../node_modules/@babel/runtime/helpers/arrayWithoutHoles.js ***! 783 \*******************************************************************/ 784/*! no static exports found */ 785/***/ (function(module, exports) { 786 787function _arrayWithoutHoles(arr) { 788 if (Array.isArray(arr)) { 789 for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) { 790 arr2[i] = arr[i]; 791 } 792 793 return arr2; 794 } 795} 796 797module.exports = _arrayWithoutHoles; 798 799/***/ }), 800
vendor: 602 bytes, lines 801-819
801/***/ "../node_modules/@babel/runtime/helpers/assertThisInitialized.js": 802/*!***********************************************************************!*\ 803 !*** ../node_modules/@babel/runtime/helpers/assertThisInitialized.js ***! 804 \***********************************************************************/ 805/*! no static exports found */ 806/***/ (function(module, exports) { 807 808function _assertThisInitialized(self) { 809 if (self === void 0) { 810 throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); 811 } 812 813 return self; 814} 815 816module.exports = _assertThisInitialized; 817 818/***/ }), 819
vendor: 1,172 bytes, lines 820-866
820/***/ "../node_modules/@babel/runtime/helpers/asyncToGenerator.js": 821/*!******************************************************************!*\ 822 !*** ../node_modules/@babel/runtime/helpers/asyncToGenerator.js ***! 823 \******************************************************************/ 824/*! no static exports found */ 825/***/ (function(module, exports) { 826 827function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { 828 try { 829 var info = gen[key](arg); 830 var value = info.value; 831 } catch (error) { 832 reject(error); 833 return; 834 } 835 836 if (info.done) { 837 resolve(value); 838 } else { 839 Promise.resolve(value).then(_next, _throw); 840 } 841} 842 843function _asyncToGenerator(fn) { 844 return function () { 845 var self = this, 846 args = arguments; 847 return new Promise(function (resolve, reject) { 848 var gen = fn.apply(self, args); 849 850 function _next(value) { 851 asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); 852 } 853 854 function _throw(err) { 855 asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); 856 } 857 858 _next(undefined); 859 }); 860 }; 861} 862 863module.exports = _asyncToGenerator; 864 865/***/ }), 866
vendor: 551 bytes, lines 867-883
867/***/ "../node_modules/@babel/runtime/helpers/classCallCheck.js": 868/*!****************************************************************!*\ 869 !*** ../node_modules/@babel/runtime/helpers/classCallCheck.js ***! 870 \****************************************************************/ 871/*! no static exports found */ 872/***/ (function(module, exports) { 873 874function _classCallCheck(instance, Constructor) { 875 if (!(instance instanceof Constructor)) { 876 throw new TypeError("Cannot call a class as a function"); 877 } 878} 879 880module.exports = _classCallCheck; 881 882/***/ }), 883
vendor: 939 bytes, lines 884-910
884/***/ "../node_modules/@babel/runtime/helpers/createClass.js": 885/*!*************************************************************!*\ 886 !*** ../node_modules/@babel/runtime/helpers/createClass.js ***! 887 \*************************************************************/ 888/*! no static exports found */ 889/***/ (function(module, exports) { 890 891function _defineProperties(target, props) { 892 for (var i = 0; i < props.length; i++) { 893 var descriptor = props[i]; 894 descriptor.enumerable = descriptor.enumerable || false; 895 descriptor.configurable = true; 896 if ("value" in descriptor) descriptor.writable = true; 897 Object.defineProperty(target, descriptor.key, descriptor); 898 } 899} 900 901function _createClass(Constructor, protoProps, staticProps) { 902 if (protoProps) _defineProperties(Constructor.prototype, protoProps); 903 if (staticProps) _defineProperties(Constructor, staticProps); 904 return Constructor; 905} 906 907module.exports = _createClass; 908 909/***/ }), 910
vendor: 622 bytes, lines 911-928
911/***/ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js": 912/*!****************************************************************!*\ 913 !*** ../node_modules/@babel/runtime/helpers/getPrototypeOf.js ***! 914 \****************************************************************/ 915/*! no static exports found */ 916/***/ (function(module, exports) { 917 918function _getPrototypeOf(o) { 919 module.exports = _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { 920 return o.__proto__ || Object.getPrototypeOf(o); 921 }; 922 return _getPrototypeOf(o); 923} 924 925module.exports = _getPrototypeOf; 926 927/***/ }), 928
vendor: 933 bytes, lines 929-956
929/***/ "../node_modules/@babel/runtime/helpers/inherits.js": 930/*!**********************************************************!*\ 931 !*** ../node_modules/@babel/runtime/helpers/inherits.js ***! 932 \**********************************************************/ 933/*! no static exports found */ 934/***/ (function(module, exports, __webpack_require__) { 935 936var setPrototypeOf = __webpack_require__(/*! ./setPrototypeOf */ "../node_modules/@babel/runtime/helpers/setPrototypeOf.js"); 937 938function _inherits(subClass, superClass) { 939 if (typeof superClass !== "function" && superClass !== null) { 940 throw new TypeError("Super expression must either be null or a function"); 941 } 942 943 subClass.prototype = Object.create(superClass && superClass.prototype, { 944 constructor: { 945 value: subClass, 946 writable: true, 947 configurable: true 948 } 949 }); 950 if (superClass) setPrototypeOf(subClass, superClass); 951} 952 953module.exports = _inherits; 954 955/***/ }), 956
vendor: 559 bytes, lines 957-971
957/***/ "../node_modules/@babel/runtime/helpers/iterableToArray.js": 958/*!*****************************************************************!*\ 959 !*** ../node_modules/@babel/runtime/helpers/iterableToArray.js ***! 960 \*****************************************************************/ 961/*! no static exports found */ 962/***/ (function(module, exports) { 963 964function _iterableToArray(iter) { 965 if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter); 966} 967 968module.exports = _iterableToArray; 969 970/***/ }), 971
vendor: 512 bytes, lines 972-986
972/***/ "../node_modules/@babel/runtime/helpers/nonIterableSpread.js": 973/*!*******************************************************************!*\ 974 !*** ../node_modules/@babel/runtime/helpers/nonIterableSpread.js ***! 975 \*******************************************************************/ 976/*! no static exports found */ 977/***/ (function(module, exports) { 978 979function _nonIterableSpread() { 980 throw new TypeError("Invalid attempt to spread non-iterable instance"); 981} 982 983module.exports = _nonIterableSpread; 984 985/***/ }), 986
vendor: 914 bytes, lines 987-1009
987/***/ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js": 988/*!***************************************************************************!*\ 989 !*** ../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js ***! 990 \***************************************************************************/ 991/*! no static exports found */ 992/***/ (function(module, exports, __webpack_require__) { 993 994var _typeof = __webpack_require__(/*! ../helpers/typeof */ "../node_modules/@babel/runtime/helpers/typeof.js"); 995 996var assertThisInitialized = __webpack_require__(/*! ./assertThisInitialized */ "../node_modules/@babel/runtime/helpers/assertThisInitialized.js"); 997 998function _possibleConstructorReturn(self, call) { 999 if (call && (_typeof(call) === "object" || typeof call === "function")) { 1000 return call; 1001 } 1002 1003 return assertThisInitialized(self); 1004} 1005 1006module.exports = _possibleConstructorReturn; 1007 1008/***/ }), 1009
vendor: 592 bytes, lines 1010-1029
1010/***/ "../node_modules/@babel/runtime/helpers/setPrototypeOf.js": 1011/*!****************************************************************!*\ 1012 !*** ../node_modules/@babel/runtime/helpers/setPrototypeOf.js ***! 1013 \****************************************************************/ 1014/*! no static exports found */ 1015/***/ (function(module, exports) { 1016 1017function _setPrototypeOf(o, p) { 1018 module.exports = _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { 1019 o.__proto__ = p; 1020 return o; 1021 }; 1022 1023 return _setPrototypeOf(o, p); 1024} 1025 1026module.exports = _setPrototypeOf; 1027 1028/***/ }), 1029
vendor: 944 bytes, lines 1030-1050
1030/***/ "../node_modules/@babel/runtime/helpers/toConsumableArray.js": 1031/*!*******************************************************************!*\ 1032 !*** ../node_modules/@babel/runtime/helpers/toConsumableArray.js ***! 1033 \*******************************************************************/ 1034/*! no static exports found */ 1035/***/ (function(module, exports, __webpack_require__) { 1036 1037var arrayWithoutHoles = __webpack_require__(/*! ./arrayWithoutHoles */ "../node_modules/@babel/runtime/helpers/arrayWithoutHoles.js"); 1038 1039var iterableToArray = __webpack_require__(/*! ./iterableToArray */ "../node_modules/@babel/runtime/helpers/iterableToArray.js"); 1040 1041var nonIterableSpread = __webpack_require__(/*! ./nonIterableSpread */ "../node_modules/@babel/runtime/helpers/nonIterableSpread.js"); 1042 1043function _toConsumableArray(arr) { 1044 return arrayWithoutHoles(arr) || iterableToArray(arr) || nonIterableSpread(); 1045} 1046 1047module.exports = _toConsumableArray; 1048 1049/***/ }), 1050
vendor: 1,140 bytes, lines 1051-1077
1051/***/ "../node_modules/@babel/runtime/helpers/typeof.js": 1052/*!********************************************************!*\ 1053 !*** ../node_modules/@babel/runtime/helpers/typeof.js ***! 1054 \********************************************************/ 1055/*! no static exports found */ 1056/***/ (function(module, exports) { 1057 1058function _typeof2(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof2 = function _typeof2(obj) { return typeof obj; }; } else { _typeof2 = function _typeof2(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof2(obj); } 1059 1060function _typeof(obj) { 1061 if (typeof Symbol === "function" && _typeof2(Symbol.iterator) === "symbol") { 1062 module.exports = _typeof = function _typeof(obj) { 1063 return _typeof2(obj); 1064 }; 1065 } else { 1066 module.exports = _typeof = function _typeof(obj) { 1067 return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : _typeof2(obj); 1068 }; 1069 } 1070 1071 return _typeof(obj); 1072} 1073 1074module.exports = _typeof; 1075 1076/***/ }), 1077
vendor: 478 bytes, lines 1078-1089
1078/***/ "../node_modules/@babel/runtime/regenerator/index.js": 1079/*!***********************************************************!*\ 1080 !*** ../node_modules/@babel/runtime/regenerator/index.js ***! 1081 \***********************************************************/ 1082/*! no static exports found */ 1083/***/ (function(module, exports, __webpack_require__) { 1084 1085module.exports = __webpack_require__(/*! regenerator-runtime */ "../node_modules/regenerator-runtime/runtime-module.js"); 1086 1087 1088/***/ }), 1089
vendor: 6,363 bytes, lines 1090-1365
1090/***/ "../node_modules/debug/src/browser.js": 1091/*!********************************************!*\ 1092 !*** ../node_modules/debug/src/browser.js ***! 1093 \********************************************/ 1094/*! no static exports found */ 1095/***/ (function(module, exports, __webpack_require__) { 1096 1097/* WEBPACK VAR INJECTION */(function(process) {/* eslint-env browser */ 1098 1099/** 1100 * This is the web browser implementation of `debug()`. 1101 */ 1102 1103exports.log = log; 1104exports.formatArgs = formatArgs; 1105exports.save = save; 1106exports.load = load; 1107exports.useColors = useColors; 1108exports.storage = localstorage(); 1109 1110/** 1111 * Colors. 1112 */ 1113 1114exports.colors = [ 1115 '#0000CC', 1116 '#0000FF', 1117 '#0033CC', 1118 '#0033FF', 1119 '#0066CC', 1120 '#0066FF', 1121 '#0099CC', 1122 '#0099FF', 1123 '#00CC00', 1124 '#00CC33', 1125 '#00CC66', 1126 '#00CC99', 1127 '#00CCCC', 1128 '#00CCFF', 1129 '#3300CC', 1130 '#3300FF', 1131 '#3333CC', 1132 '#3333FF', 1133 '#3366CC', 1134 '#3366FF', 1135 '#3399CC', 1136 '#3399FF', 1137 '#33CC00', 1138 '#33CC33', 1139 '#33CC66', 1140 '#33CC99', 1141 '#33CCCC', 1142 '#33CCFF', 1143 '#6600CC', 1144 '#6600FF', 1145 '#6633CC', 1146 '#6633FF', 1147 '#66CC00', 1148 '#66CC33', 1149 '#9900CC', 1150 '#9900FF', 1151 '#9933CC', 1152 '#9933FF', 1153 '#99CC00', 1154 '#99CC33', 1155 '#CC0000', 1156 '#CC0033', 1157 '#CC0066', 1158 '#CC0099', 1159 '#CC00CC', 1160 '#CC00FF', 1161 '#CC3300', 1162 '#CC3333', 1163 '#CC3366', 1164 '#CC3399', 1165 '#CC33CC', 1166 '#CC33FF', 1167 '#CC6600', 1168 '#CC6633', 1169 '#CC9900', 1170 '#CC9933', 1171 '#CCCC00', 1172 '#CCCC33', 1173 '#FF0000', 1174 '#FF0033', 1175 '#FF0066', 1176 '#FF0099', 1177 '#FF00CC', 1178 '#FF00FF', 1179 '#FF3300', 1180 '#FF3333', 1181 '#FF3366', 1182 '#FF3399', 1183 '#FF33CC', 1184 '#FF33FF', 1185 '#FF6600', 1186 '#FF6633', 1187 '#FF9900', 1188 '#FF9933', 1189 '#FFCC00', 1190 '#FFCC33' 1191]; 1192 1193/** 1194 * Currently only WebKit-based Web Inspectors, Firefox >= v31, 1195 * and the Firebug extension (any Firefox version) are known 1196 * to support "%c" CSS customizations. 1197 * 1198 * TODO: add a `localStorage` variable to explicitly enable/disable colors 1199 */ 1200 1201// eslint-disable-next-line complexity 1202function useColors() { 1203 // NB: In an Electron preload script, document will be defined but not fully 1204 // initialized. Since we know we're in Chrome, we'll just detect this case 1205 // explicitly 1206 if (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) { 1207 return true; 1208 } 1209 1210 // Internet Explorer and Edge do not support colors. 1211 if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) { 1212 return false; 1213 } 1214 1215 // Is webkit? http://stackoverflow.com/a/16459606/376773 1216 // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632 1217 return (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) || 1218 // Is firebug? http://stackoverflow.com/a/398120/376773 1219 (typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) || 1220 // Is firefox >= v31? 1221 // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages 1222 (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31) || 1223 // Double check webkit in userAgent just in case we are in a worker 1224 (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)); 1225} 1226 1227/** 1228 * Colorize log arguments if enabled. 1229 * 1230 * @api public 1231 */ 1232 1233function formatArgs(args) { 1234 args[0] = (this.useColors ? '%c' : '') + 1235 this.namespace + 1236 (this.useColors ? ' %c' : ' ') + 1237 args[0] + 1238 (this.useColors ? '%c ' : ' ') + 1239 '+' + module.exports.humanize(this.diff); 1240 1241 if (!this.useColors) { 1242 return; 1243 } 1244 1245 const c = 'color: ' + this.color; 1246 args.splice(1, 0, c, 'color: inherit'); 1247 1248 // The final "%c" is somewhat tricky, because there could be other 1249 // arguments passed either before or after the %c, so we need to 1250 // figure out the correct index to insert the CSS into 1251 let index = 0; 1252 let lastC = 0; 1253 args[0].replace(/%[a-zA-Z%]/g, match => { 1254 if (match === '%%') { 1255 return; 1256 } 1257 index++; 1258 if (match === '%c') { 1259 // We only are interested in the *last* %c 1260 // (the user may have provided their own) 1261 lastC = index; 1262 } 1263 }); 1264 1265 args.splice(lastC, 0, c); 1266} 1267 1268/** 1269 * Invokes `console.log()` when available. 1270 * No-op when `console.log` is not a "function". 1271 * 1272 * @api public 1273 */ 1274function log(...args) { 1275 // This hackery is required for IE8/9, where 1276 // the `console.log` function doesn't have 'apply' 1277 return typeof console === 'object' && 1278 console.log && 1279 console.log(...args); 1280} 1281 1282/** 1283 * Save `namespaces`. 1284 * 1285 * @param {String} namespaces 1286 * @api private 1287 */ 1288function save(namespaces) { 1289 try { 1290 if (namespaces) { 1291 exports.storage.setItem('debug', namespaces); 1292 } else { 1293 exports.storage.removeItem('debug'); 1294 } 1295 } catch (error) { 1296 // Swallow 1297 // XXX (@Qix-) should we be logging these? 1298 } 1299} 1300 1301/** 1302 * Load `namespaces`. 1303 * 1304 * @return {String} returns the previously persisted debug modes 1305 * @api private 1306 */ 1307function load() { 1308 let r; 1309 try { 1310 r = exports.storage.getItem('debug'); 1311 } catch (error) { 1312 // Swallow 1313 // XXX (@Qix-) should we be logging these? 1314 } 1315 1316 // If debug isn't set in LS, and we're in Electron, try to load $DEBUG 1317 if (!r && typeof process !== 'undefined' && 'env' in process) { 1318 r = process.env.DEBUG; 1319 } 1320 1321 return r; 1322} 1323 1324/** 1325 * Localstorage attempts to return the localstorage. 1326 * 1327 * This is necessary because safari throws 1328 * when a user disables cookies/localstorage 1329 * and you attempt to access it. 1330 * 1331 * @return {LocalStorage} 1332 * @api private 1333 */ 1334 1335function localstorage() { 1336 try { 1337 // TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context 1338 // The Browser also has localStorage in the global context. 1339 return localStorage; 1340 } catch (error) { 1341 // Swallow 1342 // XXX (@Qix-) should we be logging these? 1343 } 1344} 1345 1346module.exports = __webpack_require__(/*! ./common */ "../node_modules/debug/src/common.js")(exports); 1347 1348const {formatters} = module.exports; 1349 1350/** 1351 * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default. 1352 */ 1353 1354formatters.j = function (v) { 1355 try { 1356 return JSON.stringify(v); 1357 } catch (error) { 1358 return '[UnexpectedJSONParseError]: ' + error.message; 1359 } 1360}; 1361 1362/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../../process/browser.js */ "../node_modules/process/browser.js"))) 1363 1364/***/ }), 1365
vendor: 6,269 bytes, lines 1366-1642
1366/***/ "../node_modules/debug/src/common.js": 1367/*!*******************************************!*\ 1368 !*** ../node_modules/debug/src/common.js ***! 1369 \*******************************************/ 1370/*! no static exports found */ 1371/***/ (function(module, exports, __webpack_require__) { 1372 1373 1374/** 1375 * This is the common logic for both the Node.js and web browser 1376 * implementations of `debug()`. 1377 */ 1378 1379function setup(env) { 1380 createDebug.debug = createDebug; 1381 createDebug.default = createDebug; 1382 createDebug.coerce = coerce; 1383 createDebug.disable = disable; 1384 createDebug.enable = enable; 1385 createDebug.enabled = enabled; 1386 createDebug.humanize = __webpack_require__(/*! ms */ "../node_modules/ms/index.js"); 1387 1388 Object.keys(env).forEach(key => { 1389 createDebug[key] = env[key]; 1390 }); 1391 1392 /** 1393 * Active `debug` instances. 1394 */ 1395 createDebug.instances = []; 1396 1397 /** 1398 * The currently active debug mode names, and names to skip. 1399 */ 1400 1401 createDebug.names = []; 1402 createDebug.skips = []; 1403 1404 /** 1405 * Map of special "%n" handling functions, for the debug "format" argument. 1406 * 1407 * Valid key names are a single, lower or upper-case letter, i.e. "n" and "N". 1408 */ 1409 createDebug.formatters = {}; 1410 1411 /** 1412 * Selects a color for a debug namespace 1413 * @param {String} namespace The namespace string for the for the debug instance to be colored 1414 * @return {Number|String} An ANSI color code for the given namespace 1415 * @api private 1416 */ 1417 function selectColor(namespace) { 1418 let hash = 0; 1419 1420 for (let i = 0; i < namespace.length; i++) { 1421 hash = ((hash << 5) - hash) + namespace.charCodeAt(i); 1422 hash |= 0; // Convert to 32bit integer 1423 } 1424 1425 return createDebug.colors[Math.abs(hash) % createDebug.colors.length]; 1426 } 1427 createDebug.selectColor = selectColor; 1428 1429 /** 1430 * Create a debugger with the given `namespace`. 1431 * 1432 * @param {String} namespace 1433 * @return {Function} 1434 * @api public 1435 */ 1436 function createDebug(namespace) { 1437 let prevTime; 1438 1439 function debug(...args) { 1440 // Disabled? 1441 if (!debug.enabled) { 1442 return; 1443 } 1444 1445 const self = debug; 1446 1447 // Set `diff` timestamp 1448 const curr = Number(new Date()); 1449 const ms = curr - (prevTime || curr); 1450 self.diff = ms; 1451 self.prev = prevTime; 1452 self.curr = curr; 1453 prevTime = curr; 1454 1455 args[0] = createDebug.coerce(args[0]); 1456 1457 if (typeof args[0] !== 'string') { 1458 // Anything else let's inspect with %O 1459 args.unshift('%O'); 1460 } 1461 1462 // Apply any `formatters` transformations 1463 let index = 0; 1464 args[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => { 1465 // If we encounter an escaped % then don't increase the array index 1466 if (match === '%%') { 1467 return match; 1468 } 1469 index++; 1470 const formatter = createDebug.formatters[format]; 1471 if (typeof formatter === 'function') { 1472 const val = args[index]; 1473 match = formatter.call(self, val); 1474 1475 // Now we need to remove `args[index]` since it's inlined in the `format` 1476 args.splice(index, 1); 1477 index--; 1478 } 1479 return match; 1480 }); 1481 1482 // Apply env-specific formatting (colors, etc.) 1483 createDebug.formatArgs.call(self, args); 1484 1485 const logFn = self.log || createDebug.log; 1486 logFn.apply(self, args); 1487 } 1488 1489 debug.namespace = namespace; 1490 debug.enabled = createDebug.enabled(namespace); 1491 debug.useColors = createDebug.useColors(); 1492 debug.color = selectColor(namespace); 1493 debug.destroy = destroy; 1494 debug.extend = extend; 1495 // Debug.formatArgs = formatArgs; 1496 // debug.rawLog = rawLog; 1497 1498 // env-specific initialization logic for debug instances 1499 if (typeof createDebug.init === 'function') { 1500 createDebug.init(debug); 1501 } 1502 1503 createDebug.instances.push(debug); 1504 1505 return debug; 1506 } 1507 1508 function destroy() { 1509 const index = createDebug.instances.indexOf(this); 1510 if (index !== -1) { 1511 createDebug.instances.splice(index, 1); 1512 return true; 1513 } 1514 return false; 1515 } 1516 1517 function extend(namespace, delimiter) { 1518 const newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace); 1519 newDebug.log = this.log; 1520 return newDebug; 1521 } 1522 1523 /** 1524 * Enables a debug mode by namespaces. This can include modes 1525 * separated by a colon and wildcards. 1526 * 1527 * @param {String} namespaces 1528 * @api public 1529 */ 1530 function enable(namespaces) { 1531 createDebug.save(namespaces); 1532 1533 createDebug.names = []; 1534 createDebug.skips = []; 1535 1536 let i; 1537 const split = (typeof namespaces === 'string' ? namespaces : '').split(/[\s,]+/); 1538 const len = split.length; 1539 1540 for (i = 0; i < len; i++) { 1541 if (!split[i]) { 1542 // ignore empty strings 1543 continue; 1544 } 1545 1546 namespaces = split[i].replace(/\*/g, '.*?'); 1547 1548 if (namespaces[0] === '-') { 1549 createDebug.skips.push(new RegExp('^' + namespaces.substr(1) + '$')); 1550 } else { 1551 createDebug.names.push(new RegExp('^' + namespaces + '$')); 1552 } 1553 } 1554 1555 for (i = 0; i < createDebug.instances.length; i++) { 1556 const instance = createDebug.instances[i]; 1557 instance.enabled = createDebug.enabled(instance.namespace); 1558 } 1559 } 1560 1561 /** 1562 * Disable debug output. 1563 * 1564 * @return {String} namespaces 1565 * @api public 1566 */ 1567 function disable() { 1568 const namespaces = [ 1569 ...createDebug.names.map(toNamespace), 1570 ...createDebug.skips.map(toNamespace).map(namespace => '-' + namespace) 1571 ].join(','); 1572 createDebug.enable(''); 1573 return namespaces; 1574 } 1575 1576 /** 1577 * Returns true if the given mode name is enabled, false otherwise. 1578 * 1579 * @param {String} name 1580 * @return {Boolean} 1581 * @api public 1582 */ 1583 function enabled(name) { 1584 if (name[name.length - 1] === '*') { 1585 return true; 1586 } 1587 1588 let i; 1589 let len; 1590 1591 for (i = 0, len = createDebug.skips.length; i < len; i++) { 1592 if (createDebug.skips[i].test(name)) { 1593 return false; 1594 } 1595 } 1596 1597 for (i = 0, len = createDebug.names.length; i < len; i++) { 1598 if (createDebug.names[i].test(name)) { 1599 return true; 1600 } 1601 } 1602 1603 return false; 1604 } 1605 1606 /** 1607 * Convert regexp to namespace 1608 * 1609 * @param {RegExp} regxep 1610 * @return {String} namespace 1611 * @api private 1612 */ 1613 function toNamespace(regexp) { 1614 return regexp.toString() 1615 .substring(2, regexp.toString().length - 2) 1616 .replace(/\.\*\?$/, '*'); 1617 } 1618 1619 /** 1620 * Coerce `val`. 1621 * 1622 * @param {Mixed} val 1623 * @return {Mixed} 1624 * @api private 1625 */ 1626 function coerce(val) { 1627 if (val instanceof Error) { 1628 return val.stack || val.message; 1629 } 1630 return val; 1631 } 1632 1633 createDebug.enable(createDebug.load()); 1634 1635 return createDebug; 1636} 1637 1638module.exports = setup; 1639 1640 1641/***/ }), 1642
vendor: 3,273 bytes, lines 1643-1815
1643/***/ "../node_modules/ms/index.js": 1644/*!***********************************!*\ 1645 !*** ../node_modules/ms/index.js ***! 1646 \***********************************/ 1647/*! no static exports found */ 1648/***/ (function(module, exports) { 1649 1650/** 1651 * Helpers. 1652 */ 1653 1654var s = 1000; 1655var m = s * 60; 1656var h = m * 60; 1657var d = h * 24; 1658var w = d * 7; 1659var y = d * 365.25; 1660 1661/** 1662 * Parse or format the given `val`. 1663 * 1664 * Options: 1665 * 1666 * - `long` verbose formatting [false] 1667 * 1668 * @param {String|Number} val 1669 * @param {Object} [options] 1670 * @throws {Error} throw an error if val is not a non-empty string or a number 1671 * @return {String|Number} 1672 * @api public 1673 */ 1674 1675module.exports = function(val, options) { 1676 options = options || {}; 1677 var type = typeof val; 1678 if (type === 'string' && val.length > 0) { 1679 return parse(val); 1680 } else if (type === 'number' && isNaN(val) === false) { 1681 return options.long ? fmtLong(val) : fmtShort(val); 1682 } 1683 throw new Error( 1684 'val is not a non-empty string or a valid number. val=' + 1685 JSON.stringify(val) 1686 ); 1687}; 1688 1689/** 1690 * Parse the given `str` and return milliseconds. 1691 * 1692 * @param {String} str 1693 * @return {Number} 1694 * @api private 1695 */ 1696 1697function parse(str) { 1698 str = String(str); 1699 if (str.length > 100) { 1700 return; 1701 } 1702 var match = /^((?:\d+)?\-?\d?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec( 1703 str 1704 ); 1705 if (!match) { 1706 return; 1707 } 1708 var n = parseFloat(match[1]); 1709 var type = (match[2] || 'ms').toLowerCase(); 1710 switch (type) { 1711 case 'years': 1712 case 'year': 1713 case 'yrs': 1714 case 'yr': 1715 case 'y': 1716 return n * y; 1717 case 'weeks': 1718 case 'week': 1719 case 'w': 1720 return n * w; 1721 case 'days': 1722 case 'day': 1723 case 'd': 1724 return n * d; 1725 case 'hours': 1726 case 'hour': 1727 case 'hrs': 1728 case 'hr': 1729 case 'h': 1730 return n * h; 1731 case 'minutes': 1732 case 'minute': 1733 case 'mins': 1734 case 'min': 1735 case 'm': 1736 return n * m; 1737 case 'seconds': 1738 case 'second': 1739 case 'secs': 1740 case 'sec': 1741 case 's': 1742 return n * s; 1743 case 'milliseconds': 1744 case 'millisecond': 1745 case 'msecs': 1746 case 'msec': 1747 case 'ms': 1748 return n; 1749 default: 1750 return undefined; 1751 } 1752} 1753 1754/** 1755 * Short format for `ms`. 1756 * 1757 * @param {Number} ms 1758 * @return {String} 1759 * @api private 1760 */ 1761 1762function fmtShort(ms) { 1763 var msAbs = Math.abs(ms); 1764 if (msAbs >= d) { 1765 return Math.round(ms / d) + 'd'; 1766 } 1767 if (msAbs >= h) { 1768 return Math.round(ms / h) + 'h'; 1769 } 1770 if (msAbs >= m) { 1771 return Math.round(ms / m) + 'm'; 1772 } 1773 if (msAbs >= s) { 1774 return Math.round(ms / s) + 's'; 1775 } 1776 return ms + 'ms'; 1777} 1778 1779/** 1780 * Long format for `ms`. 1781 * 1782 * @param {Number} ms 1783 * @return {String} 1784 * @api private 1785 */ 1786 1787function fmtLong(ms) { 1788 var msAbs = Math.abs(ms); 1789 if (msAbs >= d) { 1790 return plural(ms, msAbs, d, 'day'); 1791 } 1792 if (msAbs >= h) { 1793 return plural(ms, msAbs, h, 'hour'); 1794 } 1795 if (msAbs >= m) { 1796 return plural(ms, msAbs, m, 'minute'); 1797 } 1798 if (msAbs >= s) { 1799 return plural(ms, msAbs, s, 'second'); 1800 } 1801 return ms + ' ms'; 1802} 1803 1804/** 1805 * Pluralization helper. 1806 */ 1807 1808function plural(ms, msAbs, n, name) { 1809 var isPlural = msAbs >= n * 1.5; 1810 return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : ''); 1811} 1812 1813 1814/***/ }), 1815
vendor: 5,685 bytes, lines 1816-2010
1816/***/ "../node_modules/process/browser.js": 1817/*!******************************************!*\ 1818 !*** ../node_modules/process/browser.js ***! 1819 \******************************************/ 1820/*! no static exports found */ 1821/***/ (function(module, exports) { 1822 1823// shim for using process in browser 1824var process = module.exports = {}; 1825 1826// cached from whatever global is present so that test runners that stub it 1827// don't break things. But we need to wrap it in a try catch in case it is 1828// wrapped in strict mode code which doesn't define any globals. It's inside a 1829// function because try/catches deoptimize in certain engines. 1830 1831var cachedSetTimeout; 1832var cachedClearTimeout; 1833 1834function defaultSetTimout() { 1835 throw new Error('setTimeout has not been defined'); 1836} 1837function defaultClearTimeout () { 1838 throw new Error('clearTimeout has not been defined'); 1839} 1840(function () { 1841 try { 1842 if (typeof setTimeout === 'function') { 1843 cachedSetTimeout = setTimeout; 1844 } else { 1845 cachedSetTimeout = defaultSetTimout; 1846 } 1847 } catch (e) { 1848 cachedSetTimeout = defaultSetTimout; 1849 } 1850 try { 1851 if (typeof clearTimeout === 'function') { 1852 cachedClearTimeout = clearTimeout; 1853 } else { 1854 cachedClearTimeout = defaultClearTimeout; 1855 } 1856 } catch (e) { 1857 cachedClearTimeout = defaultClearTimeout; 1858 } 1859} ()) 1860function runTimeout(fun) { 1861 if (cachedSetTimeout === setTimeout) { 1862 //normal enviroments in sane situations 1863 return setTimeout(fun, 0); 1864 } 1865 // if setTimeout wasn't available but was latter defined 1866 if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { 1867 cachedSetTimeout = setTimeout; 1868 return setTimeout(fun, 0); 1869 } 1870 try { 1871 // when when somebody has screwed with setTimeout but no I.E. maddness 1872 return cachedSetTimeout(fun, 0); 1873 } catch(e){ 1874 try { 1875 // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally 1876 return cachedSetTimeout.call(null, fun, 0); 1877 } catch(e){ 1878 // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error 1879 return cachedSetTimeout.call(this, fun, 0); 1880 } 1881 } 1882 1883 1884} 1885function runClearTimeout(marker) { 1886 if (cachedClearTimeout === clearTimeout) { 1887 //normal enviroments in sane situations 1888 return clearTimeout(marker); 1889 } 1890 // if clearTimeout wasn't available but was latter defined 1891 if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { 1892 cachedClearTimeout = clearTimeout; 1893 return clearTimeout(marker); 1894 } 1895 try { 1896 // when when somebody has screwed with setTimeout but no I.E. maddness 1897 return cachedClearTimeout(marker); 1898 } catch (e){ 1899 try { 1900 // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally 1901 return cachedClearTimeout.call(null, marker); 1902 } catch (e){ 1903 // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. 1904 // Some versions of I.E. have different rules for clearTimeout vs setTimeout 1905 return cachedClearTimeout.call(this, marker); 1906 } 1907 } 1908 1909 1910 1911} 1912var queue = []; 1913var draining = false; 1914var currentQueue; 1915var queueIndex = -1; 1916 1917function cleanUpNextTick() { 1918 if (!draining || !currentQueue) { 1919 return; 1920 } 1921 draining = false; 1922 if (currentQueue.length) { 1923 queue = currentQueue.concat(queue); 1924 } else { 1925 queueIndex = -1; 1926 } 1927 if (queue.length) { 1928 drainQueue(); 1929 } 1930} 1931 1932function drainQueue() { 1933 if (draining) { 1934 return; 1935 } 1936 var timeout = runTimeout(cleanUpNextTick); 1937 draining = true; 1938 1939 var len = queue.length; 1940 while(len) { 1941 currentQueue = queue; 1942 queue = []; 1943 while (++queueIndex < len) { 1944 if (currentQueue) { 1945 currentQueue[queueIndex].run(); 1946 } 1947 } 1948 queueIndex = -1; 1949 len = queue.length; 1950 } 1951 currentQueue = null; 1952 draining = false; 1953 runClearTimeout(timeout); 1954} 1955 1956process.nextTick = function (fun) { 1957 var args = new Array(arguments.length - 1); 1958 if (arguments.length > 1) { 1959 for (var i = 1; i < arguments.length; i++) { 1960 args[i - 1] = arguments[i]; 1961 } 1962 } 1963 queue.push(new Item(fun, args)); 1964 if (queue.length === 1 && !draining) { 1965 runTimeout(drainQueue); 1966 } 1967}; 1968 1969// v8 likes predictible objects 1970function Item(fun, array) { 1971 this.fun = fun; 1972 this.array = array; 1973} 1974Item.prototype.run = function () { 1975 this.fun.apply(null, this.array); 1976}; 1977process.title = 'browser'; 1978process.browser = true; 1979process.env = {}; 1980process.argv = []; 1981process.version = ''; // empty string to avoid regexp issues 1982process.versions = {}; 1983 1984function noop() {} 1985 1986process.on = noop; 1987process.addListener = noop; 1988process.once = noop; 1989process.off = noop; 1990process.removeListener = noop; 1991process.removeAllListeners = noop; 1992process.emit = noop; 1993process.prependListener = noop; 1994process.prependOnceListener = noop; 1995 1996process.listeners = function (name) { return [] } 1997 1998process.binding = function (name) { 1999 throw new Error('process.binding is not supported'); 2000}; 2001 2002process.cwd = function () { return '/' }; 2003process.chdir = function (dir) { 2004 throw new Error('process.chdir is not supported'); 2005}; 2006process.umask = function() { return 0; }; 2007 2008 2009/***/ }), 2010
vendor: 1,600 bytes, lines 2011-2058
2011/***/ "../node_modules/regenerator-runtime/runtime-module.js": 2012/*!*************************************************************!*\ 2013 !*** ../node_modules/regenerator-runtime/runtime-module.js ***! 2014 \*************************************************************/ 2015/*! no static exports found */ 2016/***/ (function(module, exports, __webpack_require__) { 2017 2018/** 2019 * Copyright (c) 2014-present, Facebook, Inc. 2020 * 2021 * This source code is licensed under the MIT license found in the 2022 * LICENSE file in the root directory of this source tree. 2023 */ 2024 2025// This method of obtaining a reference to the global object needs to be 2026// kept identical to the way it is obtained in runtime.js 2027var g = (function() { 2028 return this || (typeof self === "object" && self); 2029})() || Function("return this")(); 2030 2031// Use `getOwnPropertyNames` because not all browsers support calling 2032// `hasOwnProperty` on the global `self` object in a worker. See #183. 2033var hadRuntime = g.regeneratorRuntime && 2034 Object.getOwnPropertyNames(g).indexOf("regeneratorRuntime") >= 0; 2035 2036// Save the old regeneratorRuntime in case it needs to be restored later. 2037var oldRuntime = hadRuntime && g.regeneratorRuntime; 2038 2039// Force reevalutation of runtime.js. 2040g.regeneratorRuntime = undefined; 2041 2042module.exports = __webpack_require__(/*! ./runtime */ "../node_modules/regenerator-runtime/runtime.js"); 2043 2044if (hadRuntime) { 2045 // Restore the original runtime. 2046 g.regeneratorRuntime = oldRuntime; 2047} else { 2048 // Remove the global property added by runtime.js. 2049 try { 2050 delete g.regeneratorRuntime; 2051 } catch(e) { 2052 g.regeneratorRuntime = undefined; 2053 } 2054} 2055 2056 2057/***/ }), 2058
vendor: 23,835 bytes, lines 2059-2790
2059/***/ "../node_modules/regenerator-runtime/runtime.js": 2060/*!******************************************************!*\ 2061 !*** ../node_modules/regenerator-runtime/runtime.js ***! 2062 \******************************************************/ 2063/*! no static exports found */ 2064/***/ (function(module, exports) { 2065 2066/** 2067 * Copyright (c) 2014-present, Facebook, Inc. 2068 * 2069 * This source code is licensed under the MIT license found in the 2070 * LICENSE file in the root directory of this source tree. 2071 */ 2072 2073!(function(global) { 2074 "use strict"; 2075 2076 var Op = Object.prototype; 2077 var hasOwn = Op.hasOwnProperty; 2078 var undefined; // More compressible than void 0. 2079 var $Symbol = typeof Symbol === "function" ? Symbol : {}; 2080 var iteratorSymbol = $Symbol.iterator || "@@iterator"; 2081 var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator"; 2082 var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag"; 2083 2084 var inModule = typeof module === "object"; 2085 var runtime = global.regeneratorRuntime; 2086 if (runtime) { 2087 if (inModule) { 2088 // If regeneratorRuntime is defined globally and we're in a module, 2089 // make the exports object identical to regeneratorRuntime. 2090 module.exports = runtime; 2091 } 2092 // Don't bother evaluating the rest of this file if the runtime was 2093 // already defined globally. 2094 return; 2095 } 2096 2097 // Define the runtime globally (as expected by generated code) as either 2098 // module.exports (if we're in a module) or a new, empty object. 2099 runtime = global.regeneratorRuntime = inModule ? module.exports : {}; 2100 2101 function wrap(innerFn, outerFn, self, tryLocsList) { 2102 // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator. 2103 var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator; 2104 var generator = Object.create(protoGenerator.prototype); 2105 var context = new Context(tryLocsList || []); 2106 2107 // The ._invoke method unifies the implementations of the .next, 2108 // .throw, and .return methods. 2109 generator._invoke = makeInvokeMethod(innerFn, self, context); 2110 2111 return generator; 2112 } 2113 runtime.wrap = wrap; 2114 2115 // Try/catch helper to minimize deoptimizations. Returns a completion 2116 // record like context.tryEntries[i].completion. This interface could 2117 // have been (and was previously) designed to take a closure to be 2118 // invoked without arguments, but in all the cases we care about we 2119 // already have an existing method we want to call, so there's no need 2120 // to create a new function object. We can even get away with assuming 2121 // the method takes exactly one argument, since that happens to be true 2122 // in every case, so we don't have to touch the arguments object. The 2123 // only additional allocation required is the completion record, which 2124 // has a stable shape and so hopefully should be cheap to allocate. 2125 function tryCatch(fn, obj, arg) { 2126 try { 2127 return { type: "normal", arg: fn.call(obj, arg) }; 2128 } catch (err) { 2129 return { type: "throw", arg: err }; 2130 } 2131 } 2132 2133 var GenStateSuspendedStart = "suspendedStart"; 2134 var GenStateSuspendedYield = "suspendedYield"; 2135 var GenStateExecuting = "executing"; 2136 var GenStateCompleted = "completed"; 2137 2138 // Returning this object from the innerFn has the same effect as 2139 // breaking out of the dispatch switch statement. 2140 var ContinueSentinel = {}; 2141 2142 // Dummy constructor functions that we use as the .constructor and 2143 // .constructor.prototype properties for functions that return Generator 2144 // objects. For full spec compliance, you may wish to configure your 2145 // minifier not to mangle the names of these two functions. 2146 function Generator() {} 2147 function GeneratorFunction() {} 2148 function GeneratorFunctionPrototype() {} 2149 2150 // This is a polyfill for %IteratorPrototype% for environments that 2151 // don't natively support it. 2152 var IteratorPrototype = {}; 2153 IteratorPrototype[iteratorSymbol] = function () { 2154 return this; 2155 }; 2156 2157 var getProto = Object.getPrototypeOf; 2158 var NativeIteratorPrototype = getProto && getProto(getProto(values([]))); 2159 if (NativeIteratorPrototype && 2160 NativeIteratorPrototype !== Op && 2161 hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) { 2162 // This environment has a native %IteratorPrototype%; use it instead 2163 // of the polyfill. 2164 IteratorPrototype = NativeIteratorPrototype; 2165 } 2166 2167 var Gp = GeneratorFunctionPrototype.prototype = 2168 Generator.prototype = Object.create(IteratorPrototype); 2169 GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype; 2170 GeneratorFunctionPrototype.constructor = GeneratorFunction; 2171 GeneratorFunctionPrototype[toStringTagSymbol] = 2172 GeneratorFunction.displayName = "GeneratorFunction"; 2173 2174 // Helper for defining the .next, .throw, and .return methods of the 2175 // Iterator interface in terms of a single ._invoke method. 2176 function defineIteratorMethods(prototype) { 2177 ["next", "throw", "return"].forEach(function(method) { 2178 prototype[method] = function(arg) { 2179 return this._invoke(method, arg); 2180 }; 2181 }); 2182 } 2183 2184 runtime.isGeneratorFunction = function(genFun) { 2185 var ctor = typeof genFun === "function" && genFun.constructor; 2186 return ctor 2187 ? ctor === GeneratorFunction || 2188 // For the native GeneratorFunction constructor, the best we can 2189 // do is to check its .name property. 2190 (ctor.displayName || ctor.name) === "GeneratorFunction" 2191 : false; 2192 }; 2193 2194 runtime.mark = function(genFun) { 2195 if (Object.setPrototypeOf) { 2196 Object.setPrototypeOf(genFun, GeneratorFunctionPrototype); 2197 } else { 2198 genFun.__proto__ = GeneratorFunctionPrototype; 2199 if (!(toStringTagSymbol in genFun)) { 2200 genFun[toStringTagSymbol] = "GeneratorFunction"; 2201 } 2202 } 2203 genFun.prototype = Object.create(Gp); 2204 return genFun; 2205 }; 2206 2207 // Within the body of any async function, `await x` is transformed to 2208 // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test 2209 // `hasOwn.call(value, "__await")` to determine if the yielded value is 2210 // meant to be awaited. 2211 runtime.awrap = function(arg) { 2212 return { __await: arg }; 2213 }; 2214 2215 function AsyncIterator(generator) { 2216 function invoke(method, arg, resolve, reject) { 2217 var record = tryCatch(generator[method], generator, arg); 2218 if (record.type === "throw") { 2219 reject(record.arg); 2220 } else { 2221 var result = record.arg; 2222 var value = result.value; 2223 if (value && 2224 typeof value === "object" && 2225 hasOwn.call(value, "__await")) { 2226 return Promise.resolve(value.__await).then(function(value) { 2227 invoke("next", value, resolve, reject); 2228 }, function(err) { 2229 invoke("throw", err, resolve, reject); 2230 }); 2231 } 2232 2233 return Promise.resolve(value).then(function(unwrapped) { 2234 // When a yielded Promise is resolved, its final value becomes 2235 // the .value of the Promise<{value,done}> result for the 2236 // current iteration. 2237 result.value = unwrapped; 2238 resolve(result); 2239 }, function(error) { 2240 // If a rejected Promise was yielded, throw the rejection back 2241 // into the async generator function so it can be handled there. 2242 return invoke("throw", error, resolve, reject); 2243 }); 2244 } 2245 } 2246 2247 var previousPromise; 2248 2249 function enqueue(method, arg) { 2250 function callInvokeWithMethodAndArg() { 2251 return new Promise(function(resolve, reject) { 2252 invoke(method, arg, resolve, reject); 2253 }); 2254 } 2255 2256 return previousPromise = 2257 // If enqueue has been called before, then we want to wait until 2258 // all previous Promises have been resolved before calling invoke, 2259 // so that results are always delivered in the correct order. If 2260 // enqueue has not been called before, then it is important to 2261 // call invoke immediately, without waiting on a callback to fire, 2262 // so that the async generator function has the opportunity to do 2263 // any necessary setup in a predictable way. This predictability 2264 // is why the Promise constructor synchronously invokes its 2265 // executor callback, and why async functions synchronously 2266 // execute code before the first await. Since we implement simple 2267 // async functions in terms of async generators, it is especially 2268 // important to get this right, even though it requires care. 2269 previousPromise ? previousPromise.then( 2270 callInvokeWithMethodAndArg, 2271 // Avoid propagating failures to Promises returned by later 2272 // invocations of the iterator. 2273 callInvokeWithMethodAndArg 2274 ) : callInvokeWithMethodAndArg(); 2275 } 2276 2277 // Define the unified helper method that is used to implement .next, 2278 // .throw, and .return (see defineIteratorMethods). 2279 this._invoke = enqueue; 2280 } 2281 2282 defineIteratorMethods(AsyncIterator.prototype); 2283 AsyncIterator.prototype[asyncIteratorSymbol] = function () { 2284 return this; 2285 }; 2286 runtime.AsyncIterator = AsyncIterator; 2287 2288 // Note that simple async functions are implemented on top of 2289 // AsyncIterator objects; they just return a Promise for the value of 2290 // the final result produced by the iterator. 2291 runtime.async = function(innerFn, outerFn, self, tryLocsList) { 2292 var iter = new AsyncIterator( 2293 wrap(innerFn, outerFn, self, tryLocsList) 2294 ); 2295 2296 return runtime.isGeneratorFunction(outerFn) 2297 ? iter // If outerFn is a generator, return the full iterator. 2298 : iter.next().then(function(result) { 2299 return result.done ? result.value : iter.next(); 2300 }); 2301 }; 2302 2303 function makeInvokeMethod(innerFn, self, context) { 2304 var state = GenStateSuspendedStart; 2305 2306 return function invoke(method, arg) { 2307 if (state === GenStateExecuting) { 2308 throw new Error("Generator is already running"); 2309 } 2310 2311 if (state === GenStateCompleted) { 2312 if (method === "throw") { 2313 throw arg; 2314 } 2315 2316 // Be forgiving, per 25.3.3.3.3 of the spec: 2317 // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume 2318 return doneResult(); 2319 } 2320 2321 context.method = method; 2322 context.arg = arg; 2323 2324 while (true) { 2325 var delegate = context.delegate; 2326 if (delegate) { 2327 var delegateResult = maybeInvokeDelegate(delegate, context); 2328 if (delegateResult) { 2329 if (delegateResult === ContinueSentinel) continue; 2330 return delegateResult; 2331 } 2332 } 2333 2334 if (context.method === "next") { 2335 // Setting context._sent for legacy support of Babel's 2336 // function.sent implementation. 2337 context.sent = context._sent = context.arg; 2338 2339 } else if (context.method === "throw") { 2340 if (state === GenStateSuspendedStart) { 2341 state = GenStateCompleted; 2342 throw context.arg; 2343 } 2344 2345 context.dispatchException(context.arg); 2346 2347 } else if (context.method === "return") { 2348 context.abrupt("return", context.arg); 2349 } 2350 2351 state = GenStateExecuting; 2352 2353 var record = tryCatch(innerFn, self, context); 2354 if (record.type === "normal") { 2355 // If an exception is thrown from innerFn, we leave state === 2356 // GenStateExecuting and loop back for another invocation. 2357 state = context.done 2358 ? GenStateCompleted 2359 : GenStateSuspendedYield; 2360 2361 if (record.arg === ContinueSentinel) { 2362 continue; 2363 } 2364 2365 return { 2366 value: record.arg, 2367 done: context.done 2368 }; 2369 2370 } else if (record.type === "throw") { 2371 state = GenStateCompleted; 2372 // Dispatch the exception by looping back around to the 2373 // context.dispatchException(context.arg) call above. 2374 context.method = "throw"; 2375 context.arg = record.arg; 2376 } 2377 } 2378 }; 2379 } 2380 2381 // Call delegate.iterator[context.method](context.arg) and handle the 2382 // result, either by returning a { value, done } result from the 2383 // delegate iterator, or by modifying context.method and context.arg, 2384 // setting context.delegate to null, and returning the ContinueSentinel. 2385 function maybeInvokeDelegate(delegate, context) { 2386 var method = delegate.iterator[context.method]; 2387 if (method === undefined) { 2388 // A .throw or .return when the delegate iterator has no .throw 2389 // method always terminates the yield* loop. 2390 context.delegate = null; 2391 2392 if (context.method === "throw") { 2393 if (delegate.iterator.return) { 2394 // If the delegate iterator has a return method, give it a 2395 // chance to clean up. 2396 context.method = "return"; 2397 context.arg = undefined; 2398 maybeInvokeDelegate(delegate, context); 2399 2400 if (context.method === "throw") { 2401 // If maybeInvokeDelegate(context) changed context.method from 2402 // "return" to "throw", let that override the TypeError below. 2403 return ContinueSentinel; 2404 } 2405 } 2406 2407 context.method = "throw"; 2408 context.arg = new TypeError( 2409 "The iterator does not provide a 'throw' method"); 2410 } 2411 2412 return ContinueSentinel; 2413 } 2414 2415 var record = tryCatch(method, delegate.iterator, context.arg); 2416 2417 if (record.type === "throw") { 2418 context.method = "throw"; 2419 context.arg = record.arg; 2420 context.delegate = null; 2421 return ContinueSentinel; 2422 } 2423 2424 var info = record.arg; 2425 2426 if (! info) { 2427 context.method = "throw"; 2428 context.arg = new TypeError("iterator result is not an object"); 2429 context.delegate = null; 2430 return ContinueSentinel; 2431 } 2432 2433 if (info.done) { 2434 // Assign the result of the finished delegate to the temporary 2435 // variable specified by delegate.resultName (see delegateYield). 2436 context[delegate.resultName] = info.value; 2437 2438 // Resume execution at the desired location (see delegateYield). 2439 context.next = delegate.nextLoc; 2440 2441 // If context.method was "throw" but the delegate handled the 2442 // exception, let the outer generator proceed normally. If 2443 // context.method was "next", forget context.arg since it has been 2444 // "consumed" by the delegate iterator. If context.method was 2445 // "return", allow the original .return call to continue in the 2446 // outer generator. 2447 if (context.method !== "return") { 2448 context.method = "next"; 2449 context.arg = undefined; 2450 } 2451 2452 } else { 2453 // Re-yield the result returned by the delegate method. 2454 return info; 2455 } 2456 2457 // The delegate iterator is finished, so forget it and continue with 2458 // the outer generator. 2459 context.delegate = null; 2460 return ContinueSentinel; 2461 } 2462 2463 // Define Generator.prototype.{next,throw,return} in terms of the 2464 // unified ._invoke helper method. 2465 defineIteratorMethods(Gp); 2466 2467 Gp[toStringTagSymbol] = "Generator"; 2468 2469 // A Generator should always return itself as the iterator object when the 2470 // @@iterator function is called on it. Some browsers' implementations of the 2471 // iterator prototype chain incorrectly implement this, causing the Generator 2472 // object to not be returned from this call. This ensures that doesn't happen. 2473 // See https://github.com/facebook/regenerator/issues/274 for more details. 2474 Gp[iteratorSymbol] = function() { 2475 return this; 2476 }; 2477 2478 Gp.toString = function() { 2479 return "[object Generator]"; 2480 }; 2481 2482 function pushTryEntry(locs) { 2483 var entry = { tryLoc: locs[0] }; 2484 2485 if (1 in locs) { 2486 entry.catchLoc = locs[1]; 2487 } 2488 2489 if (2 in locs) { 2490 entry.finallyLoc = locs[2]; 2491 entry.afterLoc = locs[3]; 2492 } 2493 2494 this.tryEntries.push(entry); 2495 } 2496 2497 function resetTryEntry(entry) { 2498 var record = entry.completion || {}; 2499 record.type = "normal"; 2500 delete record.arg; 2501 entry.completion = record; 2502 } 2503 2504 function Context(tryLocsList) { 2505 // The root entry object (effectively a try statement without a catch 2506 // or a finally block) gives us a place to store values thrown from 2507 // locations where there is no enclosing try statement. 2508 this.tryEntries = [{ tryLoc: "root" }]; 2509 tryLocsList.forEach(pushTryEntry, this); 2510 this.reset(true); 2511 } 2512 2513 runtime.keys = function(object) { 2514 var keys = []; 2515 for (var key in object) { 2516 keys.push(key); 2517 } 2518 keys.reverse(); 2519 2520 // Rather than returning an object with a next method, we keep 2521 // things simple and return the next function itself. 2522 return function next() { 2523 while (keys.length) { 2524 var key = keys.pop(); 2525 if (key in object) { 2526 next.value = key; 2527 next.done = false; 2528 return next; 2529 } 2530 } 2531 2532 // To avoid creating an additional object, we just hang the .value 2533 // and .done properties off the next function object itself. This 2534 // also ensures that the minifier will not anonymize the function. 2535 next.done = true; 2536 return next; 2537 }; 2538 }; 2539 2540 function values(iterable) { 2541 if (iterable) { 2542 var iteratorMethod = iterable[iteratorSymbol]; 2543 if (iteratorMethod) { 2544 return iteratorMethod.call(iterable); 2545 } 2546 2547 if (typeof iterable.next === "function") { 2548 return iterable; 2549 } 2550 2551 if (!isNaN(iterable.length)) { 2552 var i = -1, next = function next() { 2553 while (++i < iterable.length) { 2554 if (hasOwn.call(iterable, i)) { 2555 next.value = iterable[i]; 2556 next.done = false; 2557 return next; 2558 } 2559 } 2560 2561 next.value = undefined; 2562 next.done = true; 2563 2564 return next; 2565 }; 2566 2567 return next.next = next; 2568 } 2569 } 2570 2571 // Return an iterator with no values. 2572 return { next: doneResult }; 2573 } 2574 runtime.values = values; 2575 2576 function doneResult() { 2577 return { value: undefined, done: true }; 2578 } 2579 2580 Context.prototype = { 2581 constructor: Context, 2582 2583 reset: function(skipTempReset) { 2584 this.prev = 0; 2585 this.next = 0; 2586 // Resetting context._sent for legacy support of Babel's 2587 // function.sent implementation. 2588 this.sent = this._sent = undefined; 2589 this.done = false; 2590 this.delegate = null; 2591 2592 this.method = "next"; 2593 this.arg = undefined; 2594 2595 this.tryEntries.forEach(resetTryEntry); 2596 2597 if (!skipTempReset) { 2598 for (var name in this) { 2599 // Not sure about the optimal order of these conditions: 2600 if (name.charAt(0) === "t" && 2601 hasOwn.call(this, name) && 2602 !isNaN(+name.slice(1))) { 2603 this[name] = undefined; 2604 } 2605 } 2606 } 2607 }, 2608 2609 stop: function() { 2610 this.done = true; 2611 2612 var rootEntry = this.tryEntries[0]; 2613 var rootRecord = rootEntry.completion; 2614 if (rootRecord.type === "throw") { 2615 throw rootRecord.arg; 2616 } 2617 2618 return this.rval; 2619 }, 2620 2621 dispatchException: function(exception) { 2622 if (this.done) { 2623 throw exception; 2624 } 2625 2626 var context = this; 2627 function handle(loc, caught) { 2628 record.type = "throw"; 2629 record.arg = exception; 2630 context.next = loc; 2631 2632 if (caught) { 2633 // If the dispatched exception was caught by a catch block, 2634 // then let that catch block handle the exception normally. 2635 context.method = "next"; 2636 context.arg = undefined; 2637 } 2638 2639 return !! caught; 2640 } 2641 2642 for (var i = this.tryEntries.length - 1; i >= 0; --i) { 2643 var entry = this.tryEntries[i]; 2644 var record = entry.completion; 2645 2646 if (entry.tryLoc === "root") { 2647 // Exception thrown outside of any try block that could handle 2648 // it, so set the completion value of the entire function to 2649 // throw the exception. 2650 return handle("end"); 2651 } 2652 2653 if (entry.tryLoc <= this.prev) { 2654 var hasCatch = hasOwn.call(entry, "catchLoc"); 2655 var hasFinally = hasOwn.call(entry, "finallyLoc"); 2656 2657 if (hasCatch && hasFinally) { 2658 if (this.prev < entry.catchLoc) { 2659 return handle(entry.catchLoc, true); 2660 } else if (this.prev < entry.finallyLoc) { 2661 return handle(entry.finallyLoc); 2662 } 2663 2664 } else if (hasCatch) { 2665 if (this.prev < entry.catchLoc) { 2666 return handle(entry.catchLoc, true); 2667 } 2668 2669 } else if (hasFinally) { 2670 if (this.prev < entry.finallyLoc) { 2671 return handle(entry.finallyLoc); 2672 } 2673 2674 } else { 2675 throw new Error("try statement without catch or finally"); 2676 } 2677 } 2678 } 2679 }, 2680 2681 abrupt: function(type, arg) { 2682 for (var i = this.tryEntries.length - 1; i >= 0; --i) { 2683 var entry = this.tryEntries[i]; 2684 if (entry.tryLoc <= this.prev && 2685 hasOwn.call(entry, "finallyLoc") && 2686 this.prev < entry.finallyLoc) { 2687 var finallyEntry = entry; 2688 break; 2689 } 2690 } 2691 2692 if (finallyEntry && 2693 (type === "break" || 2694 type === "continue") && 2695 finallyEntry.tryLoc <= arg && 2696 arg <= finallyEntry.finallyLoc) { 2697 // Ignore the finally entry if control is not jumping to a 2698 // location outside the try/catch block. 2699 finallyEntry = null; 2700 } 2701 2702 var record = finallyEntry ? finallyEntry.completion : {}; 2703 record.type = type; 2704 record.arg = arg; 2705 2706 if (finallyEntry) { 2707 this.method = "next"; 2708 this.next = finallyEntry.finallyLoc; 2709 return ContinueSentinel; 2710 } 2711 2712 return this.complete(record); 2713 }, 2714 2715 complete: function(record, afterLoc) { 2716 if (record.type === "throw") { 2717 throw record.arg; 2718 } 2719 2720 if (record.type === "break" || 2721 record.type === "continue") { 2722 this.next = record.arg; 2723 } else if (record.type === "return") { 2724 this.rval = this.arg = record.arg; 2725 this.method = "return"; 2726 this.next = "end"; 2727 } else if (record.type === "normal" && afterLoc) { 2728 this.next = afterLoc; 2729 } 2730 2731 return ContinueSentinel; 2732 }, 2733 2734 finish: function(finallyLoc) { 2735 for (var i = this.tryEntries.length - 1; i >= 0; --i) { 2736 var entry = this.tryEntries[i]; 2737 if (entry.finallyLoc === finallyLoc) { 2738 this.complete(entry.completion, entry.afterLoc); 2739 resetTryEntry(entry); 2740 return ContinueSentinel; 2741 } 2742 } 2743 }, 2744 2745 "catch": function(tryLoc) { 2746 for (var i = this.tryEntries.length - 1; i >= 0; --i) { 2747 var entry = this.tryEntries[i]; 2748 if (entry.tryLoc === tryLoc) { 2749 var record = entry.completion; 2750 if (record.type === "throw") { 2751 var thrown = record.arg; 2752 resetTryEntry(entry); 2753 } 2754 return thrown; 2755 } 2756 } 2757 2758 // The context.catch method must only be called with a location 2759 // argument that corresponds to a known catch block. 2760 throw new Error("illegal catch attempt"); 2761 }, 2762 2763 delegateYield: function(iterable, resultName, nextLoc) { 2764 this.delegate = { 2765 iterator: values(iterable), 2766 resultName: resultName, 2767 nextLoc: nextLoc 2768 }; 2769 2770 if (this.method === "next") { 2771 // Deliberately forget the last sent value so that we don't 2772 // accidentally pass it on to the delegate. 2773 this.arg = undefined; 2774 } 2775 2776 return ContinueSentinel; 2777 } 2778 }; 2779})( 2780 // In sloppy mode, unbound `this` refers to the global object, fallback to 2781 // Function constructor if we're in global strict mode. That is sadly a form 2782 // of indirect eval which violates Content Security Policy. 2783 (function() { 2784 return this || (typeof self === "object" && self); 2785 })() || Function("return this")() 2786); 2787 2788 2789/***/ }), 2790
2791/***/ "./drawing/draw.js": 2792/*!*************************!*\ 2793 !*** ./drawing/draw.js ***! 2794 \*************************/ 2795/*! exports provided: default */ 2796/***/ (function(module, __webpack_exports__, __webpack_require__) { 2797 2798"use strict"; 2799__webpack_require__.r(__webpack_exports__); 2800/** 2801 * This function manages the {@link https://www.w3.org/TR/2dcontext/#the-canvas-state|save/restore} 2802 * pattern for working in a new context state stack. The parameter `fn` is passed the `context` and can 2803 * execute any API calls in a clean stack. 2804 * @public 2805 * @method draw 2806 * @memberof Drawing 2807 * 2808 * @param {CanvasRenderingContext2D} context - Target Canvas 2809 * @param {ContextFn} fn - A function which performs drawing operations within the given context. 2810 * @returns {undefined} 2811 */ 2812/* harmony default export */ __webpack_exports__["default"] = (function (context, fn) { 2813 context.save(); 2814 fn(context); 2815 context.restore(); 2816}); 2817 2818/***/ }), 2819
2820/***/ "./drawing/drawArrow.js": 2821/*!******************************!*\ 2822 !*** ./drawing/drawArrow.js ***! 2823 \******************************/ 2824/*! exports provided: default */ 2825/***/ (function(module, __webpack_exports__, __webpack_require__) { 2826 2827"use strict"; 2828__webpack_require__.r(__webpack_exports__); 2829/* harmony import */ var _drawLine_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./drawLine.js */ "./drawing/drawLine.js"); 2830/* harmony import */ var _drawJoinedLines_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./drawJoinedLines.js */ "./drawing/drawJoinedLines.js"); 2831 2832 2833/** 2834 * Draw an arrow using the drawing API. 2835 * @public 2836 * @method drawArrow 2837 * @memberof Drawing 2838 * 2839 * @param {Object} context The canvas context. 2840 * @param {Object} start The start position. 2841 * @param {Object} end The end position. 2842 * @param {string} color The color of the arrow. 2843 * @param {number} lineWidth The width of the arrow line. 2844 * @returns {undefined} 2845 */ 2846 2847/* harmony default export */ __webpack_exports__["default"] = (function (context, start, end, color, lineWidth) { 2848 // Variables to be used when creating the arrow 2849 var headLength = 10; 2850 var angle = Math.atan2(end.y - start.y, end.x - start.x); // Starting path of the arrow from the start square to the end square and drawing the stroke 2851 2852 var options = { 2853 color: color, 2854 lineWidth: lineWidth 2855 }; 2856 Object(_drawLine_js__WEBPACK_IMPORTED_MODULE_0__["default"])(context, undefined, start, end, options, 'canvas'); 2857 options = { 2858 color: color, 2859 lineWidth: lineWidth, 2860 fillStyle: color 2861 }; 2862 var points = [{ 2863 x: end.x - headLength * Math.cos(angle - Math.PI / 7), 2864 y: end.y - headLength * Math.sin(angle - Math.PI / 7) 2865 }, { 2866 x: end.x - headLength * Math.cos(angle + Math.PI / 7), 2867 y: end.y - headLength * Math.sin(angle + Math.PI / 7) 2868 }, end]; 2869 Object(_drawJoinedLines_js__WEBPACK_IMPORTED_MODULE_1__["default"])(context, undefined, end, points, options, 'canvas'); 2870}); 2871 2872/***/ }), 2873
2874/***/ "./drawing/drawCircle.js": 2875/*!*******************************!*\ 2876 !*** ./drawing/drawCircle.js ***! 2877 \*******************************/ 2878/*! exports provided: default */ 2879/***/ (function(module, __webpack_exports__, __webpack_require__) { 2880 2881"use strict"; 2882__webpack_require__.r(__webpack_exports__); 2883/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../externalModules.js */ "./externalModules.js"); 2884/* harmony import */ var _path_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./path.js */ "./drawing/path.js"); 2885 2886 2887/** 2888 * Draw a circle with given `center` and `radius`. 2889 * @public 2890 * @method drawCircle 2891 * @memberof Drawing 2892 * 2893 * @param {CanvasRenderingContext2D} context - Target context 2894 * @param {HTMLElement} element - The DOM Element to draw on 2895 * @param {Object} center - `{ x, y }` in either pixel or canvas coordinates. 2896 * @param {number} radius - The circle's radius in canvas units. 2897 * @param {Object} options - See {@link path} 2898 * @param {String} [coordSystem='pixel'] - Can be "pixel" (default) or "canvas". The coordinate 2899 * system of the points passed in to the function. If "pixel" then cornerstone.pixelToCanvas 2900 * is used to transform the points from pixel to canvas coordinates. 2901 * @returns {undefined} 2902 */ 2903 2904/* harmony default export */ __webpack_exports__["default"] = (function (context, element, center, radius, options) { 2905 var coordSystem = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 'pixel'; 2906 2907 if (coordSystem === 'pixel') { 2908 center = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.pixelToCanvas(element, center); 2909 } 2910 2911 Object(_path_js__WEBPACK_IMPORTED_MODULE_1__["default"])(context, options, function (context) { 2912 context.arc(center.x, center.y, radius, 0, 2 * Math.PI); 2913 }); 2914}); 2915 2916/***/ }), 2917
2918/***/ "./drawing/drawEllipse.js": 2919/*!********************************!*\ 2920 !*** ./drawing/drawEllipse.js ***! 2921 \********************************/ 2922/*! exports provided: default */ 2923/***/ (function(module, __webpack_exports__, __webpack_require__) { 2924 2925"use strict"; 2926__webpack_require__.r(__webpack_exports__); 2927/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../externalModules.js */ "./externalModules.js"); 2928/* harmony import */ var _path_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./path.js */ "./drawing/path.js"); 2929/* harmony import */ var _util_pointProjector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../util/pointProjector.js */ "./util/pointProjector.js"); 2930 2931 2932 2933/** 2934 * Draw an ellipse within the bounding box defined by `corner1` and `corner2`. 2935 * @public 2936 * @method drawEllipse 2937 * @memberof Drawing 2938 * 2939 * @param {CanvasRenderingContext2D} context - Target context 2940 * @param {HTMLElement} element - The DOM Element to draw on 2941 * @param {Object} corner1 - `{ x, y }` in either pixel or canvas coordinates. 2942 * @param {Object} corner2 - `{ x, y }` in either pixel or canvas coordinates. 2943 * @param {Object} options - See {@link path} 2944 * @param {String} [coordSystem='pixel'] - Can be "pixel" (default) or "canvas". The coordinate 2945 * system of the points passed in to the function. If "pixel" then cornerstone.pixelToCanvas 2946 * is used to transform the points from pixel to canvas coordinates. 2947 * @param {Number} initialRotation - Ellipse initial rotation 2948 * @returns {undefined} 2949 */ 2950 2951/* harmony default export */ __webpack_exports__["default"] = (function (context, element, corner1, corner2, options) { 2952 var coordSystem = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 'pixel'; 2953 var initialRotation = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : 0.0; 2954 2955 if (coordSystem === 'pixel') { 2956 corner1 = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.pixelToCanvas(element, corner1); 2957 corner2 = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.pixelToCanvas(element, corner2); 2958 } 2959 2960 var viewport = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.getViewport(element); // Calculate the center of the image 2961 2962 var width = element.clientWidth, 2963 height = element.clientHeight; 2964 var scale = viewport.scale, 2965 translation = viewport.translation; 2966 var rotation = viewport.rotation - initialRotation; 2967 var centerPoint = { 2968 x: width / 2 + translation.x * scale, 2969 y: height / 2 + translation.y * scale 2970 }; 2971 2972 if (Math.abs(rotation) > 0.05) { 2973 corner1 = Object(_util_pointProjector_js__WEBPACK_IMPORTED_MODULE_2__["rotatePoint"])(corner1, centerPoint, -rotation); 2974 corner2 = Object(_util_pointProjector_js__WEBPACK_IMPORTED_MODULE_2__["rotatePoint"])(corner2, centerPoint, -rotation); 2975 } 2976 2977 var w = Math.abs(corner1.x - corner2.x); 2978 var h = Math.abs(corner1.y - corner2.y); 2979 var xMin = Math.min(corner1.x, corner2.x); 2980 var yMin = Math.min(corner1.y, corner2.y); 2981 var center = { 2982 x: xMin + w / 2, 2983 y: yMin + h / 2 2984 }; 2985 2986 if (Math.abs(rotation) > 0.05) { 2987 center = Object(_util_pointProjector_js__WEBPACK_IMPORTED_MODULE_2__["rotatePoint"])(center, centerPoint, rotation); 2988 } 2989 2990 var angle = rotation * Math.PI / 180; 2991 Object(_path_js__WEBPACK_IMPORTED_MODULE_1__["default"])(context, options, function (context) { 2992 context.ellipse(center.x, center.y, w / 2, h / 2, angle, 0, 2 * Math.PI); 2993 context.closePath(); 2994 }); 2995}); 2996 2997/***/ }), 2998
2999/***/ "./drawing/drawHandles.js": 3000/*!********************************!*\ 3001 !*** ./drawing/drawHandles.js ***! 3002 \********************************/ 3003/*! exports provided: default */ 3004/***/ (function(module, __webpack_exports__, __webpack_require__) { 3005 3006"use strict"; 3007__webpack_require__.r(__webpack_exports__); 3008/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../externalModules.js */ "./externalModules.js"); 3009/* harmony import */ var _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./../stateManagement/toolStyle.js */ "./stateManagement/toolStyle.js"); 3010/* harmony import */ var _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./../stateManagement/toolColors.js */ "./stateManagement/toolColors.js"); 3011/* harmony import */ var _path_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./path.js */ "./drawing/path.js"); 3012/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./../store/index.js */ "./store/index.js"); 3013 3014 3015 3016 3017 3018/** 3019 * Draws proivded handles to the provided context 3020 * @public 3021 * @method drawHandles 3022 * @memberof Drawing 3023 * 3024 * @param {CanvasRenderingContext2D} context - Target context 3025 * @param {*} evtDetail - Cornerstone's 'cornerstoneimagerendered' event's `detail` 3026 * @param {Object[]|Object} handles - An array of handle objects, or an object w/ named handle objects 3027 * @param {Object} [options={}] - Options object 3028 * @param {string} [options.color] 3029 * @param {Boolean} [options.drawHandlesIfActive=false] - Whether the handles should only be drawn if Active (hovered/selected) 3030 * @param {string} [options.fill] 3031 * @param {Number} [options.handleRadius=6] 3032 * @returns {undefined} 3033 */ 3034 3035/* harmony default export */ __webpack_exports__["default"] = (function (context, evtDetail, handles) { 3036 var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; 3037 var element = evtDetail.element; 3038 var defaultColor = _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_2__["default"].getToolColor(); 3039 context.strokeStyle = options.color || defaultColor; 3040 var handleKeys = Object.keys(handles); 3041 3042 var _loop = function _loop(i) { 3043 var handleKey = handleKeys[i]; 3044 var handle = handles[handleKey]; 3045 3046 if (handle.drawnIndependently === true) { 3047 return "continue"; 3048 } 3049 3050 if (options.drawHandlesIfActive === true && !handle.active) { 3051 return "continue"; 3052 } 3053 3054 var lineWidth = options.lineWidth? options.lineWidth : handle.active ? _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_1__["default"].getActiveWidth() : _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_1__["default"].getToolW
3054idth(); 3055 var fillStyle = options.fill; 3056 Object(_path_js__WEBPACK_IMPORTED_MODULE_3__["default"])(context, { 3057 lineWidth: lineWidth, 3058 fillStyle: fillStyle 3059 }, function (context) { 3060 var handleCanvasCoords = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.pixelToCanvas(element, handle); // Handle's radisu, then tool's radius, then default radius 3061 3062 var handleRadius = handle.radius || options.handleRadius || _store_index_js__WEBPACK_IMPORTED_MODULE_4__["state"].handleRadius; 3063 context.arc(handleCanvasCoords.x, handleCanvasCoords.y, handleRadius, 0, 2 * Math.PI); 3064 }); 3065 }; 3066 3067 for (var i = 0; i < handleKeys.length; i++) { 3068 var _ret = _loop(i); 3069 3070 if (_ret === "continue") continue; 3071 } 3072}); 3073 3074/***/ }), 3075
3076/***/ "./drawing/drawJoinedLines.js": 3077/*!************************************!*\ 3078 !*** ./drawing/drawJoinedLines.js ***! 3079 \************************************/ 3080/*! exports provided: default */ 3081/***/ (function(module, __webpack_exports__, __webpack_require__) { 3082 3083"use strict"; 3084__webpack_require__.r(__webpack_exports__); 3085/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../externalModules.js */ "./externalModules.js"); 3086/* harmony import */ var _path_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./path.js */ "./drawing/path.js"); 3087 3088 3089/** 3090 * Draw a series of joined lines, starting at `start` and then going to each point in `points`. 3091 * @public 3092 * @method drawJoinedLines 3093 * @memberof Drawing 3094 * 3095 * @param {CanvasRenderingContext2D} context - Target context 3096 * @param {HTMLElement} element - The DOM Element to draw on 3097 * @param {Object} start - `{ x, y }` in either pixel or canvas coordinates. 3098 * @param {Object[]} points - `[{ x, y }]` An array of points in either pixel or canvas coordinates. 3099 * @param {Object} options - See {@link path} 3100 * @param {String} [coordSystem='pixel'] - Can be "pixel" (default) or "canvas". The coordinate 3101 * system of the points passed in to the function. If "pixel" then cornerstone.pixelToCanvas 3102 * is used to transform the points from pixel to canvas coordinates. 3103 * @returns {undefined} 3104 */ 3105 3106/* harmony default export */ __webpack_exports__["default"] = (function (context, element, start, points, options) { 3107 var coordSystem = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 'pixel'; 3108 Object(_path_js__WEBPACK_IMPORTED_MODULE_1__["default"])(context, options, function (context) { 3109 if (coordSystem === 'pixel') { 3110 start = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.pixelToCanvas(element, start); 3111 points = points.map(function (p) { 3112 return _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.pixelToCanvas(element, p); 3113 }); 3114 } 3115 3116 context.moveTo(start.x, start.y); 3117 points.forEach(function (_ref) { 3118 var x = _ref.x, 3119 y = _ref.y; 3120 context.lineTo(x, y); 3121 }); 3122 }); 3123}); 3124 3125/***/ }), 3126
3127/***/ "./drawing/drawLine.js": 3128/*!*****************************!*\ 3129 !*** ./drawing/drawLine.js ***! 3130 \*****************************/ 3131/*! exports provided: default */ 3132/***/ (function(module, __webpack_exports__, __webpack_require__) { 3133 3134"use strict"; 3135__webpack_require__.r(__webpack_exports__); 3136/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return drawLine; }); 3137/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../externalModules.js */ "./externalModules.js"); 3138/* harmony import */ var _path_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./path.js */ "./drawing/path.js"); 3139 3140 3141/** 3142 * Draw a line between `start` and `end`. 3143 * 3144 * @public 3145 * @method drawLine 3146 * @memberof Drawing 3147 * 3148 * @param {CanvasRenderingContext2D} context 3149 * @param {HTMLElement} element - The DOM Element to draw on 3150 * @param {Object} start - `{ x, y } in either pixel or canvas coordinates. 3151 * @param {Object} end - `{ x, y }` in either pixel or canvas coordinates. 3152 * @param {Object} options - See {@link path} 3153 * @param {String} [coordSystem='pixel'] - Can be "pixel" (default) or "canvas". The coordinate 3154 * system of the points passed in to the function. If "pixel" then cornerstone.pixelToCanvas 3155 * is used to transform the points from pixel to canvas coordinates. 3156 * @returns {undefined} 3157 */ 3158 3159function drawLine(context, element, start, end, options) { 3160 var coordSystem = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 'pixel'; 3161 Object(_path_js__WEBPACK_IMPORTED_MODULE_1__["default"])(context, options, function (context) { 3162 if (coordSystem === 'pixel') { 3163 start = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.pixelToCanvas(element, start); 3164 end = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.pixelToCanvas(element, end); 3165 } 3166 3167 context.moveTo(start.x, start.y); 3168 context.lineTo(end.x, end.y); 3169 }); 3170} 3171 3172/***/ }), 3173
3174/***/ "./drawing/drawLines.js": 3175/*!******************************!*\ 3176 !*** ./drawing/drawLines.js ***! 3177 \******************************/ 3178/*! exports provided: default */ 3179/***/ (function(module, __webpack_exports__, __webpack_require__) { 3180 3181"use strict"; 3182__webpack_require__.r(__webpack_exports__); 3183/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../externalModules.js */ "./externalModules.js"); 3184/* harmony import */ var _path_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./path.js */ "./drawing/path.js"); 3185 3186 3187/** 3188 * Draw multiple lines. 3189 * @public 3190 * @method drawJoinedLines 3191 * @memberof Drawing 3192 * 3193 * @param {CanvasRenderingContext2D} context - Target context 3194 * @param {HTMLElement} element - The DOM Element to draw on 3195 * @param {Object[]} lines - `[{ start: {x, y}, end: { x, y }]` An array of `start`, `end` pairs. 3196 * Each point is `{ x, y }` in either pixel or canvas coordinates. 3197 * @param {Object} options - See {@link path} 3198 * @param {String} [coordSystem='pixel'] - Can be "pixel" (default) or "canvas". The coordinate 3199 * system of the points passed in to the function. If "pixel" then cornerstone.pixelToCanvas 3200 * is used to transform the points from pixel to canvas coordinates. 3201 * @returns {undefined} 3202 */ 3203 3204/* harmony default export */ __webpack_exports__["default"] = (function (context, element, lines, options) { 3205 var coordSystem = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 'pixel'; 3206 Object(_path_js__WEBPACK_IMPORTED_MODULE_1__["default"])(context, options, function (context) { 3207 lines.forEach(function (line) { 3208 var start = line.start; 3209 var end = line.end; 3210 3211 if (coordSystem === 'pixel') { 3212 var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone; 3213 start = cornerstone.pixelToCanvas(element, start); 3214 end = cornerstone.pixelToCanvas(element, end); 3215 } 3216 3217 context.moveTo(start.x, start.y); 3218 context.lineTo(end.x, end.y); 3219 }); 3220 }); 3221}); 3222 3223/***/ }), 3224
3225/***/ "./drawing/drawLink.js": 3226/*!*****************************!*\ 3227 !*** ./drawing/drawLink.js ***! 3228 \*****************************/ 3229/*! exports provided: default */ 3230/***/ (function(module, __webpack_exports__, __webpack_require__) { 3231 3232"use strict"; 3233__webpack_require__.r(__webpack_exports__); 3234/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js"); 3235/* harmony import */ var _drawLine_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./drawLine.js */ "./drawing/drawLine.js"); 3236 3237 3238/** 3239 * Draw a link between an annotation to a box. 3240 * @public 3241 * @method drawLink 3242 * @memberof Drawing 3243 * 3244 * @param {Object[]} linkAnchorPoints An array of possible anchor points. 3245 * @param {Object} refPoint A reference point to select the anchor point. 3246 * @param {Object} boundingBox The bounding box to link. 3247 * @param {Object} context The canvas context. 3248 * @param {string} color The link color. 3249 * @param {number} lineWidth The line width of the link. 3250 * @returns {undefined} 3251 */ 3252 3253/* harmony default export */ __webpack_exports__["default"] = (function (linkAnchorPoints, refPoint, boundingBox, context, color, lineWidth) { 3254 // Draw a link from "the closest anchor point to refPoint" to "the nearest midpoint on the bounding box". 3255 // Find the closest anchor point to RefPoint 3256 var start = linkAnchorPoints.length > 0 ? _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.point.findClosestPoint(linkAnchorPoints, refPoint) : refPoint; // Calculate the midpoints of the bounding box 3257 3258 var boundingBoxPoints = [{
3259 x: boundingBox.left + boundingBox.width / 2, 3260 y: boundingBox.top 3261 }, { 3262 x: boundingBox.left, 3263 y: boundingBox.top + boundingBox.height / 2 3264 }, { 3265 x: boundingBox.left + boundingBox.width / 2, 3266 y: boundingBox.top + boundingBox.height 3267 }, { 3268 x: boundingBox.left + boundingBox.width, 3269 y: boundingBox.top + boundingBox.height / 2 3270 }]; // Calculate the link endpoint by identifying which midpoint of the bounding box 3271 // Is closest to the start point. 3272 3273 var end = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.point.findClosestPoint(boundingBoxPoints, start); // Finally we draw the dashed linking line 3274 3275 var options = { 3276 color: color, 3277 lineWidth: lineWidth, 3278 lineDash: [2, 3] 3279 }; 3280 Object(_drawLine_js__WEBPACK_IMPORTED_MODULE_1__["default"])(context, undefined, start, end, options, 'canvas'); 3281}); 3282 3283/***/ }), 3284
3285/***/ "./drawing/drawLinkedTextBox.js": 3286/*!**************************************!*\ 3287 !*** ./drawing/drawLinkedTextBox.js ***! 3288 \**************************************/ 3289/*! exports provided: default */ 3290/***/ (function(module, __webpack_exports__, __webpack_require__) { 3291 3292"use strict"; 3293__webpack_require__.r(__webpack_exports__); 3294/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js"); 3295/* harmony import */ var _drawTextBox_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./drawTextBox.js */ "./drawing/drawTextBox.js"); 3296/* harmony import */ var _drawLink_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./drawLink.js */ "./drawing/drawLink.js"); 3297 3298 3299 3300/** 3301 * Draw a link between an annotation to a textBox. 3302 * @public 3303 * @method drawLinkedTextBox 3304 * @memberof Drawing 3305 * 3306 * @param {Object} context - The canvas context. 3307 * @param {HTMLElement} element - The element on which to draw the link. 3308 * @param {Object} textBox - The textBox to link. 3309 * @param {Object} text - The text to display in the textbox. 3310 * @param {Object[]} handles - The handles of the annotation. 3311 * @param {Object[]} textBoxAnchorPoints - An array of possible anchor points on the textBox. 3312 * @param {string} color - The link color. 3313 * @param {number} lineWidth - The line width of the link. 3314 * @param {number} xOffset - The x offset of the textbox. 3315 * @param {boolean} yCenter - Vertically centers the text if true. 3316 * @returns {undefined} 3317 */ 3318 3319/* harmony default export */ __webpack_exports__["default"] = (function (context, element, textBox, text, handles, textBoxAnchorPoints, color, lineWidth, xOffset, yCenter) { 3320 var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone; // Convert the textbox Image coordinates into Canvas coordinates 3321 3322 var textCoords = cornerstone.pixelToCanvas(element, textBox); 3323 3324 if (xOffset) { 3325 textCoords.x += xOffset; 3326 } 3327 3328 var options = { 3329 centering: { 3330 x: false, 3331 y: yCenter 3332 } 3333 }; // Draw the text box 3334 3335 textBox.boundingBox = Object(_drawTextBox_js__WEBPACK_IMPORTED_MODULE_1__["default"])(context, text, textCoords.x, textCoords.y, color, options); 3336 3337 if (textBox.hasMoved) { 3338 // Identify the possible anchor points for the tool -> text line 3339 var linkAnchorPoints = textBoxAnchorPoints(handles).map(function (h) { 3340 return cornerstone.pixelToCanvas(element, h); 3341 }); // Draw dashed link line between tool and text 3342 3343 Object(_drawLink_js__WEBPACK_IMPORTED_MODULE_2__["default"])(linkAnchorPoints, textCoords, textBox.boundingBox, context, color, lineWidth); 3344 } 3345}); 3346 3347/***/ }), 3348
3349/***/ "./drawing/drawRect.js": 3350/*!*****************************!*\ 3351 !*** ./drawing/drawRect.js ***! 3352 \*****************************/ 3353/*! exports provided: default */ 3354/***/ (function(module, __webpack_exports__, __webpack_require__) { 3355 3356"use strict"; 3357__webpack_require__.r(__webpack_exports__); 3358/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../externalModules.js */ "./externalModules.js"); 3359/* harmony import */ var _path_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./path.js */ "./drawing/path.js"); 3360/* harmony import */ var _util_pointProjector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../util/pointProjector.js */ "./util/pointProjector.js"); 3361 3362 3363 3364/** 3365 * Draw a rectangle defined by `corner1` and `corner2`. 3366 * @public 3367 * @method drawRect 3368 * @memberof Drawing 3369 * 3370 * @param {CanvasRenderingContext2D} context - Target context 3371 * @param {HTMLElement} element - The DOM Element to draw on 3372 * @param {Object} corner1 - `{ x, y }` in either pixel or canvas coordinates. 3373 * @param {Object} corner2 - `{ x, y }` in either pixel or canvas coordinates. 3374 * @param {Object} options - See {@link path} 3375 * @param {String} [coordSystem='pixel'] - Can be "pixel" (default) or "canvas". The coordinate 3376 * system of the points passed in to the function. If "pixel" then cornerstone.pixelToCanvas 3377 * is used to transform the points from pixel to canvas coordinates. 3378 * @param {Number} initialRotation - Rectangle initial rotation 3379 * @returns {undefined} 3380 */ 3381 3382/* harmony default export */ __webpack_exports__["default"] = (function (context, element, corner1, corner2, options) { 3383 var coordSystem = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 'pixel'; 3384 var initialRotation = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : 0.0; 3385 3386 if (coordSystem === 'pixel') { 3387 var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone; 3388 corner1 = cornerstone.pixelToCanvas(element, corner1); 3389 corner2 = cornerstone.pixelToCanvas(element, corner2); 3390 } 3391 3392 var viewport = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.getViewport(element); // Calculate the center of the image 3393 3394 var width = element.clientWidth, 3395 height = element.clientHeight; 3396 var scale = viewport.scale, 3397 translation = viewport.translation; 3398 var rotation = viewport.rotation - initialRotation; 3399 var centerPoint = { 3400 x: width / 2 + translation.x * scale, 3401 y: height / 2 + translation.y * scale 3402 }; 3403 3404 if (Math.abs(rotation) > 0.05) { 3405 corner1 = Object(_util_pointProjector_js__WEBPACK_IMPORTED_MODULE_2__["rotatePoint"])(corner1, centerPoint, -rotation); 3406 corner2 = Object(_util_pointProjector_js__WEBPACK_IMPORTED_MODULE_2__["rotatePoint"])(corner2, centerPoint, -rotation); 3407 } 3408 3409 var w = Math.abs(corner1.x - corner2.x); 3410 var h = Math.abs(corner1.y - corner2.y); 3411 corner1 = { 3412 x: Math.min(corner1.x, corner2.x), 3413 y: Math.min(corner1.y, corner2.y) 3414 }; 3415 corner2 = { 3416 x: corner1.x + w, 3417 y: corner1.y + h 3418 }; 3419 var corner3 = { 3420 x: corner1.x + w, 3421 y: corner1.y 3422 }; 3423 var corner4 = { 3424 x: corner1.x, 3425 y: corner1.y + h 3426 }; 3427 3428 if (Math.abs(rotation) > 0.05) { 3429 corner1 = Object(_util_pointProjector_js__WEBPACK_IMPORTED_MODULE_2__["rotatePoint"])(corner1, centerPoint, rotation); 3430 corner2 = Object(_util_pointProjector_js__WEBPACK_IMPORTED_MODULE_2__["rotatePoint"])(corner2, centerPoint, rotation); 3431 corner3 = Object(_util_pointProjector_js__WEBPACK_IMPORTED_MODULE_2__["rotatePoint"])(corner3, centerPoint, rotation); 3432 corner4 = Object(_util_pointProjector_js__WEBPACK_IMPORTED_MODULE_2__["rotatePoint"])(corner4, centerPoint, rotation); 3433 } 3434 3435 Object(_path_js__WEBPACK_IMPORTED_MODULE_1__["default"])(context, options, function (context) { 3436 context.moveTo(corner1.x, corner1.y); 3437 context.lineTo(corner3.x, corner3.y); 3438 context.moveTo(corner3.x, corner3.y); 3439 context.lineTo(corner2.x, corner2.y); 3440 context.moveTo(corner2.x, corner2.y); 3441 context.lineTo(corner4.x, corner4.y); 3442 context.moveTo(corner4.x, corner4.y); 3443 context.lineTo(corner1.x, corner1.y); 3444 }); 3445}); 3446 3447/***/ }), 3448
3449/***/ "./drawing/drawTextBox.js": 3450/*!********************************!*\ 3451 !*** ./drawing/drawTextBox.js ***! 3452 \********************************/ 3453/*! exports provided: textBoxWidth, default */ 3454/***/ (function(module, __webpack_exports__, __webpack_require__) { 3455 3456"use strict"; 3457__webpack_require__.r(__webpack_exports__); 3458/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "textBoxWidth", function() { return textBoxWidth; }); 3459/* harmony import */ var _stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../stateManagement/textStyle.js */ "./stateManagement/textStyle.js"); 3460/* harmony import */ var _draw_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./draw.js */ "./drawing/draw.js"); 3461/* harmony import */ var _fillTextLines_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./fillTextLines.js */ "./drawing/fillTextLines.js"); 3462/* harmony import */ var _fillBox_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./fillBox.js */ "./drawing/fillBox.js"); 3463 3464 3465 3466 3467/** 3468 * Compute the width of the box required to display the given `text` with a given `padding`. 3469 * @public 3470 * @function textBoxWidth 3471 * @memberof Drawing 3472 * 3473 * @param {CanvasRenderingContext2D} context - Target context 3474 * @param {String} text - The text to find the width of. 3475 * @param {Number} padding - The padding to apply on either end of the text. 3476 * @returns {Number} computed text box width 3477 */ 3478 3479function textBoxWidth(context, text, padding) { 3480 var font = _stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_0__["default"].getFont(); 3481 var origFont = context.font; 3482 3483 if (font && font !== origFont) { 3484 context.font = font; 3485 } 3486 3487 var width = context.measureText(text).width; 3488 3489 if (font && font !== origFont) { 3490 context.font = origFont; 3491 } 3492 3493 return width + 2 * padding; 3494} 3495/** 3496 * Draws a textBox. 3497 * @public 3498 * @function drawTextBox 3499 * @memberof Drawing 3500 * 3501 * @param {CanvasRenderingContext2D} context The canvas context. 3502 * @param {string} textLines The text to display. 3503 * @param {number} x The x position of the textBox. 3504 * @param {number} y The y position of the textBox. 3505 * @param {string} color The color of the textBox. 3506 * @param {Object} options Options for the textBox. 3507 * @returns {Object} {top, left, width, height} - Bounding box; can be used for pointNearTool 3508 */ 3509 3510/* harmony default export */ __webpack_exports__["default"] = (function (context, textLines, x, y, color, options) { 3511 if (Object.prototype.toString.call(textLines) !== '[object Array]') { 3512 textLines = [textLines]; 3513 } 3514 3515 var padding = 5; 3516 var fontSize = _stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_0__["default"].getFontSize(); 3517 var backgroundColor = _stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_0__["default"].getBackgroundColor(); // Find the longest text width in the array of text data 3518 3519 var maxWidth = 0; 3520 textLines.forEach(function (text) { 3521 // Get the text width in the current font 3522 var width = textBoxWidth(context, text, padding); // Find the maximum with for all the text rows; 3523 3524 maxWidth = Math.max(maxWidth, width); 3525 }); // Calculate the bounding box for this text box 3526 3527 var boundingBox = { 3528 width: maxWidth, 3529 height: padding + textLines.length * (fontSize + padding) 3530 }; 3531 Object(_draw_js__WEBPACK_IMPORTED_MODULE_1__["default"])(context, function (context) { 3532 context.strokeStyle = color; // Draw the background box with padding 3533 3534 if (options && options.centering && options.centering.x === true) { 3535 x -= boundingBox.width / 2; 3536 } 3537 3538 if (options && options.centering && options.centering.y === true) { 3539 y -= boundingBox.height / 2; 3540 } 3541 3542 boundingBox.left = x; 3543 boundingBox.top = y; 3544 var fillStyle = options && options.debug === true ? '#FF0000' : backgroundColor; 3545 Object(_fillBox_js__WEBPACK_IMPORTED_MODULE_3__["default"])(context, boundingBox, fillStyle); // Draw each of the text lines on top of the background box 3546 3547 Object(_fillTextLines_js__WEBPACK_IMPORTED_MODULE_2__["default"])(context, boundingBox, textLines, color, padding); 3548 }); // Return the bounding box so it can be used for pointNearHandle 3549 3550 return boundingBox; 3551}); 3552 3553/***/ }), 3554
3555/***/ "./drawing/fillBox.js": 3556/*!****************************!*\ 3557 !*** ./drawing/fillBox.js ***! 3558 \****************************/ 3559/*! exports provided: default */ 3560/***/ (function(module, __webpack_exports__, __webpack_require__) { 3561 3562"use strict"; 3563__webpack_require__.r(__webpack_exports__); 3564/** 3565 * Draw a filled rectangle defined by `boundingBox` using the style defined by `fillStyle`. 3566 * @public 3567 * @method fillBox 3568 * @memberof Drawing 3569 * 3570 * @param {CanvasRenderingContext2D} context - Target context 3571 * @param {Object} boundingBox - `{ left, top, width, height }` in canvas coordinates. 3572 * @param {FillStyle} fillStyle - The fillStyle to apply to the region. 3573 * @returns {undefined} 3574 */ 3575/* harmony default export */ __webpack_exports__["default"] = (function (context, boundingBox, fillStyle) { 3576 context.fillStyle = fillStyle; 3577 context.fillRect(boundingBox.left, boundingBox.top, boundingBox.width, boundingBox.height); 3578}); 3579 3580/***/ }), 3581
3582/***/ "./drawing/fillOutsideRect.js": 3583/*!************************************!*\ 3584 !*** ./drawing/fillOutsideRect.js ***! 3585 \************************************/ 3586/*! exports provided: default */ 3587/***/ (function(module, __webpack_exports__, __webpack_require__) { 3588 3589"use strict"; 3590__webpack_require__.r(__webpack_exports__); 3591/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../externalModules.js */ "./externalModules.js"); 3592/* harmony import */ var _path_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./path.js */ "./drawing/path.js"); 3593 3594 3595/** 3596 * Fill the region outside a rectangle defined by `corner1` and `corner2`. 3597 * @public 3598 * @method fillOutsideRect 3599 * @memberof Drawing 3600 * 3601 * @param {CanvasRenderingContext2D} context - Target context 3602 * @param {HTMLElement} element - The DOM Element to draw on 3603 * @param {Object} corner1 - `{ x, y }` in either pixel or canvas coordinates. 3604 * @param {Object} corner2 - `{ x, y }` in either pixel or canvas coordinates. 3605 * @param {Object} options - See {@link path} 3606 * @param {String} [coordSystem='pixel'] - Can be "pixel" (default) or "canvas". The coordinate 3607 * system of the points passed in to the function. If "pixel" then cornerstone.pixelToCanvas 3608 * is used to transform the points from pixel to canvas coordinates. 3609 * @returns {undefined} 3610 */ 3611 3612/* harmony default export */ __webpack_exports__["default"] = (function (context, element, corner1, corner2, options) { 3613 var coordSystem = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 'pixel'; 3614 3615 if (coordSystem === 'pixel') { 3616 var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone; 3617 corner1 = cornerstone.pixelToCanvas(element, corner1); 3618 corner2 = cornerstone.pixelToCanvas(element, corner2); 3619 } 3620 3621 var left = Math.min(corner1.x, corner2.x); 3622 var top = Math.min(corner1.y, corner2.y); 3623 var width = Math.abs(corner1.x - corner2.x); 3624 var height = Math.abs(corner1.y - corner2.y); 3625 Object(_path_js__WEBPACK_IMPORTED_MODULE_1__["default"])(context, options, function (context) { 3626 context.rect(0, 0, context.canvas.clientWidth, context.canvas.clientHeight); 3627 context.rect(left + width, top, -width, height); 3628 }); 3629}); 3630 3631/***/ }), 3632
3633/***/ "./drawing/fillTextLines.js": 3634/*!**********************************!*\ 3635 !*** ./drawing/fillTextLines.js ***! 3636 \**********************************/ 3637/*! exports provided: default */ 3638/***/ (function(module, __webpack_exports__, __webpack_require__) { 3639 3640"use strict"; 3641__webpack_require__.r(__webpack_exports__); 3642/* harmony import */ var _stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../stateManagement/textStyle.js */ "./stateManagement/textStyle.js"); 3643 3644/** 3645 * Draw multiple lines of text within a bounding box. 3646 * @public 3647 * @method fillTextLines 3648 * @memberof Drawing 3649 * 3650 * @param {CanvasRenderingContext2D} context - Target context 3651 * @param {Object} boundingBox - `{ left, top }` in canvas coordinates. Only the top-left corner is specified, as the text will take up as much space as it needs. 3652 * @param {String[]} textLines - The text to be displayed. 3653 * @param {FillStyle} fillStyle - The fillStyle to apply to the text. 3654 * @param {Number} padding - The amount of padding above/below each line in canvas units. Note this gives an inter-line spacing of `2*padding`. 3655 * @returns {undefined} 3656 */ 3657 3658/* harmony default export */ __webpack_exports__["default"] = (function (context, boundingBox, textLines, fillStyle, padding) { 3659 var fontSize = _stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_0__["default"].getFontSize(); 3660 context.font = _stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_0__["default"].getFont(); 3661 context.textBaseline = 'top'; 3662 context.fillStyle = fillStyle; 3663 textLines.forEach(function (text, index) { 3664 context.fillText(text, boundingBox.left + padding, boundingBox.top + padding + index * (fontSize + padding)); 3665 }); 3666}); 3667 3668/***/ }), 3669
3670/***/ "./drawing/getNewContext.js": 3671/*!**********************************!*\ 3672 !*** ./drawing/getNewContext.js ***! 3673 \**********************************/ 3674/*! exports provided: default */ 3675/***/ (function(module, __webpack_exports__, __webpack_require__) { 3676 3677"use strict"; 3678__webpack_require__.r(__webpack_exports__); 3679/** 3680 * Create a new {@link CanvasRenderingContext2D|context} object for the given {@link HTMLCanvasElement|canvas} 3681 * and set the transform to the {@link https://www.w3.org/TR/2dcontext/#transformations|identity transform}. 3682 * 3683 * @public 3684 * @function getNewContext 3685 * @memberof Drawing 3686 * 3687 * @param {HTMLCanvasElement} canvas - Canvas you would like the context for 3688 * @returns {CanvasRenderingContext2D} - The provided canvas's 2d context 3689 */ 3690/* harmony default export */ __webpack_exports__["default"] = (function (canvas) { 3691 var context = canvas.getContext('2d'); 3692 context.setTransform(1, 0, 0, 1, 0, 0); 3693 return context; 3694}); 3695 3696/***/ }), 3697
3698/***/ "./drawing/index.js": 3699/*!**************************!*\ 3700 !*** ./drawing/index.js ***! 3701 \**************************/ 3702/*! exports provided: draw, drawArrow, drawCircle, drawEllipse, drawHandles, drawJoinedLines, drawLine, drawLines, drawLink, drawLinkedTextBox, drawRect, drawTextBox, fillBox, fillOutsideRect, fillTextLines, getNewContext, path, setShadow, transformCanvasContext, resetCanvasContextTransform */ 3703/***/ (function(module, __webpack_exports__, __webpack_require__) { 3704 3705"use strict"; 3706__webpack_require__.r(__webpack_exports__); 3707/* harmony import */ var _draw_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./draw.js */ "./drawing/draw.js"); 3708/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "draw", function() { return _draw_js__WEBPACK_IMPORTED_MODULE_0__["default"]; }); 3709 3710/* harmony import */ var _drawArrow_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./drawArrow.js */ "./drawing/drawArrow.js"); 3711/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "drawArrow", function() { return _drawArrow_js__WEBPACK_IMPORTED_MODULE_1__["default"]; }); 3712 3713/* harmony import */ var _drawCircle_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./drawCircle.js */ "./drawing/drawCircle.js"); 3714/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "drawCircle", function() { return _drawCircle_js__WEBPACK_IMPORTED_MODULE_2__["default"]; }); 3715 3716/* harmony import */ var _drawEllipse_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./drawEllipse.js */ "./drawing/drawEllipse.js"); 3717/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "drawEllipse", function() { return _drawEllipse_js__WEBPACK_IMPORTED_MODULE_3__["default"]; }); 3718 3719/* harmony import */ var _drawHandles_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./drawHandles.js */ "./drawing/drawHandles.js"); 3720/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "drawHandles", function() { return _drawHandles_js__WEBPACK_IMPORTED_MODULE_4__["default"]; }); 3721 3722/* harmony import */ var _drawJoinedLines_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./drawJoinedLines.js */ "./drawing/drawJoinedLines.js"); 3723/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "drawJoinedLines", function() { return _drawJoinedLines_js__WEBPACK_IMPORTED_MODULE_5__["default"]; }); 3724 3725/* harmony import */ var _drawLine_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./drawLine.js */ "./drawing/drawLine.js"); 3726/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "drawLine", function() { return _drawLine_js__WEBPACK_IMPORTED_MODULE_6__["default"]; }); 3727 3728/* harmony import */ var _drawLines_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./drawLines.js */ "./drawing/drawLines.js"); 3729/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "drawLines", function() { return _drawLines_js__WEBPACK_IMPORTED_MODULE_7__["default"]; }); 3730 3731/* harmony import */ var _drawLink_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./drawLink.js */ "./drawing/drawLink.js"); 3732/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "drawLink", function() { return _drawLink_js__WEBPACK_IMPORTED_MODULE_8__["default"]; }); 3733 3734/* harmony import */ var _drawLinkedTextBox_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./drawLinkedTextBox.js */ "./drawing/drawLinkedTextBox.js"); 3735/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "drawLinkedTextBox", function() { return _drawLinkedTextBox_js__WEBPACK_IMPORTED_MODULE_9__["default"]; }); 3736 3737/* harmony import */ var _drawRect_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./drawRect.js */ "./drawing/drawRect.js"); 3738/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "drawRect", function() { return _drawRect_js__WEBPACK_IMPORTED_MODULE_10__["default"]; }); 3739 3740/* harmony import */ var _drawTextBox_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./drawTextBox.js */ "./drawing/drawTextBox.js"); 3741/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "drawTextBox", function() { return _drawTextBox_js__WEBPACK_IMPORTED_MODULE_11__["default"]; }); 3742 3743/* harmony import */ var _fillBox_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./fillBox.js */ "./drawing/fillBox.js"); 3744/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "fillBox", function() { return _fillBox_js__WEBPACK_IMPORTED_MODULE_12__["default"]; }); 3745 3746/* harmony import */ var _fillOutsideRect_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./fillOutsideRect.
3746js */ "./drawing/fillOutsideRect.js"); 3747/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "fillOutsideRect", function() { return _fillOutsideRect_js__WEBPACK_IMPORTED_MODULE_13__["default"]; }); 3748 3749/* harmony import */ var _fillTextLines_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./fillTextLines.js */ "./drawing/fillTextLines.js"); 3750/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "fillTextLines", function() { return _fillTextLines_js__WEBPACK_IMPORTED_MODULE_14__["default"]; }); 3751 3752/* harmony import */ var _getNewContext_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./getNewContext.js */ "./drawing/getNewContext.js"); 3753/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getNewContext", function() { return _getNewContext_js__WEBPACK_IMPORTED_MODULE_15__["default"]; }); 3754 3755/* harmony import */ var _path_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./path.js */ "./drawing/path.js"); 3756/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "path", function() { return _path_js__WEBPACK_IMPORTED_MODULE_16__["default"]; }); 3757 3758/* harmony import */ var _setShadow_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./setShadow.js */ "./drawing/setShadow.js"); 3759/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setShadow", function() { return _setShadow_js__WEBPACK_IMPORTED_MODULE_17__["default"]; }); 3760 3761/* harmony import */ var _transformCanvasContext_js__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./transformCanvasContext.js */ "./drawing/transformCanvasContext.js"); 3762/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "transformCanvasContext", function() { return _transformCanvasContext_js__WEBPACK_IMPORTED_MODULE_18__["default"]; }); 3763 3764/* harmony import */ var _resetCanvasContextTransform_js__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./resetCanvasContextTransform.js */ "./drawing/resetCanvasContextTransform.js"); 3765/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "resetCanvasContextTransform", function() { return _resetCanvasContextTransform_js__WEBPACK_IMPORTED_MODULE_19__["default"]; }); 3766 3767/** 3768 * A {@link https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/fillStyle|color, gradient or pattern} to use inside shapes. 3769 * @typedef {(String|CanvasGradient|CanvasPattern)} FillStyle 3770 */ 3771 3772/** 3773 * A {@link https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/strokeStyle|color, gradient or pattern} to use for the lines around shapes. 3774 * @typedef {(String|CanvasGradient|CanvasPattern)} StrokeStyle 3775 */ 3776 3777/** 3778 * @callback ContextFn 3779 * @param {CanvasRenderingContext2D} context 3780 */ 3781 3782 3783 3784 3785 3786 3787 3788 3789 3790 3791 3792 3793 3794 3795 3796 3797 3798 3799 3800 // Named exports 3801 3802 3803 3804/***/ }), 3805
3806/***/ "./drawing/path.js": 3807/*!*************************!*\ 3808 !*** ./drawing/path.js ***! 3809 \*************************/ 3810/*! exports provided: default */ 3811/***/ (function(module, __webpack_exports__, __webpack_require__) { 3812 3813"use strict"; 3814__webpack_require__.r(__webpack_exports__); 3815/* harmony import */ var _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../stateManagement/toolStyle.js */ "./stateManagement/toolStyle.js"); 3816 3817/** 3818 * This function manages the beginPath/stroke pattern for working with 3819 * {@link https://www.w3.org/TR/2dcontext/#drawing-paths-to-the-canvas|path objects}. 3820 * 3821 * @public 3822 * @function path 3823 * @memberof Drawing 3824 * 3825 * @param {CanvasRenderingContext2D} context - Context to add path to 3826 * @param {Object} [options={}] - Drawing Options 3827 * @param {StrokeStyle} [options.color] - The stroke style of the path. 3828 * @param {Number} [options.lineWidth] - The width of lines in the path. If null, no line width is set. 3829 * If undefined then toolStyle.getToolWidth() is set. 3830 * @param {FillStyle} [options.fillStyle] - The style to fill the path with. If undefined then no filling is done. 3831 * @param {Number[]} [options.lineDash] - The {@link https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/setLineDash|dash pattern} 3832 * to use on the lines. 3833 * @param {ContextFn} fn - A drawing function to execute with the provided stroke pattern. 3834 * @returns {undefined} 3835 */ 3836 3837/* harmony default export */ __webpack_exports__["default"] = (function (context) { 3838 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; 3839 var fn = arguments.length > 2 ? arguments[2] : undefined; 3840 var color = options.color, 3841 lineWidth = options.lineWidth, 3842 fillStyle = options.fillStyle, 3843 lineDash = options.lineDash; 3844 context.beginPath(); 3845 context.strokeStyle = color || context.strokeStyle; 3846 context.lineWidth = lineWidth || lineWidth === undefined && _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_0__["default"].getToolW
3846idth() || context.lineWidth; 3847 3848 if (lineDash) { 3849 context.setLineDash(lineDash); 3850 } 3851 3852 fn(context); 3853 3854 if (fillStyle) { 3855 context.fillStyle = fillStyle; 3856 context.fill(); 3857 } 3858 3859 context.stroke(); 3860 3861 if (lineDash) { 3862 context.setLineDash([]); 3863 } 3864}); 3865 3866/***/ }), 3867
3868/***/ "./drawing/resetCanvasContextTransform.js": 3869/*!************************************************!*\ 3870 !*** ./drawing/resetCanvasContextTransform.js ***! 3871 \************************************************/ 3872/*! exports provided: default */ 3873/***/ (function(module, __webpack_exports__, __webpack_require__) { 3874 3875"use strict"; 3876__webpack_require__.r(__webpack_exports__); 3877/** 3878 * Resets the canvas {@link CanvasRenderingContext2D|context} transform to the 3879 * {@link https://www.w3.org/TR/2dcontext/#transformations|identity transform}. 3880 * 3881 * @public 3882 * @function resetCanvasContextTransform 3883 * @memberof Drawing 3884 * 3885 * @param {CanvasRenderingContext2D} context - context you wish to transform 3886 * @returns {void} 3887 */ 3888/* harmony default export */ __webpack_exports__["default"] = (function (context) { 3889 context.setTransform(1, 0, 0, 1, 0, 0); 3890}); 3891 3892/***/ }), 3893
3894/***/ "./drawing/setShadow.js": 3895/*!******************************!*\ 3896 !*** ./drawing/setShadow.js ***! 3897 \******************************/ 3898/*! exports provided: default */ 3899/***/ (function(module, __webpack_exports__, __webpack_require__) { 3900 3901"use strict"; 3902__webpack_require__.r(__webpack_exports__); 3903/* harmony import */ var _util_getDefault_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../util/getDefault.js */ "./util/getDefault.js"); 3904 3905/** 3906 * Set the {@link https://www.w3.org/TR/2dcontext/#shadows|shadow} properties of the context. 3907 * Each property is set on the context object if defined, otherwise a default value is set. 3908 * 3909 * @public 3910 * @method setShadow 3911 * @memberof Drawing 3912 * 3913 * @param {CanvasRenderingContext2D} context - Context to apply shadow options on 3914 * @param {Object} [options={}] - Options object 3915 * @param {Boolean} [options.shadow=undefined] - Whether to set any shadow options 3916 * @param {String} [options.shadowColor=#000000] - Default value: #000000 3917 * @param {Number} [options.shadowBlur=0] - Default Value: 0 3918 * @param {Number} [options.shadowOffsetX=1] - Default value: 1 3919 * @param {Number} [options.shadowOffsetY=1] - Default value: 1 3920 * @returns {undefined} 3921 */ 3922 3923/* harmony default export */ __webpack_exports__["default"] = (function (context) { 3924 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; 3925 3926 if (options.shadow) { 3927 context.shadowColor = Object(_util_getDefault_js__WEBPACK_IMPORTED_MODULE_0__["default"])(options.shadowColor, '#000000'); 3928 context.shadowBlur = Object(_util_getDefault_js__WEBPACK_IMPORTED_MODULE_0__["default"])(options.shadowBlur, 0); 3929 context.shadowOffsetX = Object(_util_getDefault_js__WEBPACK_IMPORTED_MODULE_0__["default"])(options.shadowOffsetX, 1); 3930 context.shadowOffsetY = Object(_util_getDefault_js__WEBPACK_IMPORTED_MODULE_0__["default"])(options.shadowOffsetY, 1); 3931 } 3932}); 3933 3934/***/ }), 3935
3936/***/ "./drawing/transformCanvasContext.js": 3937/*!*******************************************!*\ 3938 !*** ./drawing/transformCanvasContext.js ***! 3939 \*******************************************/ 3940/*! exports provided: default */ 3941/***/ (function(module, __webpack_exports__, __webpack_require__) { 3942 3943"use strict"; 3944__webpack_require__.r(__webpack_exports__); 3945/** 3946 * Transform the canvas {@link CanvasRenderingContext2D|context} such that it 3947 * coincides with the orientation of the viewport. 3948 * 3949 * @public 3950 * @function transformCanvasContext 3951 * @memberof Drawing 3952 * 3953 * @param {CanvasRenderingContext2D} context - Context you wish to transform. 3954 * @param {HTMLCanvasElement} canvas - Canvas the context relates to. 3955 * @param {*} viewport - The viewport you wish to map on to. 3956 * @returns {void} 3957 */ 3958/* harmony default export */ __webpack_exports__["default"] = (function (context, canvas, viewport) { 3959 if (!(viewport.vflip || viewport.vflip || viewport.rotation)) { 3960 return; 3961 } 3962 3963 var translation = { 3964 x: canvas.width / 2 + viewport.translation.x * viewport.scale, 3965 y: canvas.height / 2 + viewport.translation.y * viewport.scale 3966 }; 3967 context.translate(translation.x, translation.y); 3968 3969 if (viewport.rotation) { 3970 context.rotate(viewport.rotation * Math.PI / 180); 3971 } 3972 3973 if (viewport.vflip) { 3974 context.scale(1, -1); 3975 } 3976 3977 if (viewport.hflip) { 3978 context.scale(-1, 1); 3979 } 3980 3981 context.translate(-translation.x, -translation.y); 3982}); 3983 3984/***/ }), 3985
3986/***/ "./eventDispatchers/imageRenderedEventDispatcher.js": 3987/*!**********************************************************!*\ 3988 !*** ./eventDispatchers/imageRenderedEventDispatcher.js ***! 3989 \**********************************************************/ 3990/*! exports provided: default */ 3991/***/ (function(module, __webpack_exports__, __webpack_require__) { 3992 3993"use strict"; 3994__webpack_require__.r(__webpack_exports__); 3995/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../store/index.js */ "./store/index.js"); 3996/* harmony import */ var _tools_base_BaseBrushTool_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./../tools/base/BaseBrushTool.js */ "./tools/base/BaseBrushTool.js"); 3997/* harmony import */ var _eventListeners_onImageRenderedBrushEventHandler_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../eventListeners/onImageRenderedBrushEventHandler.js */ "./eventListeners/onImageRenderedBrushEventHandler.js"); 3998/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./../externalModules.js */ "./externalModules.js"); 3999 4000 4001 4002 4003 4004var onImageRendered = function onImageRendered(evt) { 4005 var eventData = evt.detail; 4006 var element = eventData.element; // Render Annotation Tools 4007 4008 var toolsToRender = _store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].tools.filter(function (tool) { 4009 return tool.element === element && (tool.mode === 'active' || tool.mode === 'passive' || tool.mode === 'enabled'); 4010 }); 4011 var brushTools = toolsToRender.filter(function (tool) { 4012 return tool instanceof _tools_base_BaseBrushTool_js__WEBPACK_IMPORTED_MODULE_1__["default"]; 4013 }); 4014 4015 if (brushTools.length > 0) { 4016 Object(_eventListeners_onImageRenderedBrushEventHandler_js__WEBPACK_IMPORTED_MODULE_2__["default"])(evt); 4017 } 4018 4019 toolsToRender.forEach(function (tool) { 4020 if (tool.renderToolData) { 4021 tool.renderToolData(evt); 4022 } 4023 }); 4024}; 4025 4026var enable = function enable(element) { 4027 element.addEventListener(_externalModules_js__WEBPACK_IMPORTED_MODULE_3__["default"].cornerstone.EVENTS.IMAGE_RENDERED, onImageRendered); 4028}; 4029 4030var disable = function disable(element) { 4031 element.removeEventListener(_externalModules_js__WEBPACK_IMPORTED_MODULE_3__["default"].cornerstone.EVENTS.IMAGE_RENDERED, onImageRendered); 4032}; 4033 4034/* harmony default export */ __webpack_exports__["default"] = ({ 4035 enable: enable, 4036 disable: disable 4037}); 4038 4039/***/ }), 4040
4041/***/ "./eventDispatchers/index.js": 4042/*!***********************************!*\ 4043 !*** ./eventDispatchers/index.js ***! 4044 \***********************************/ 4045/*! exports provided: imageRenderedEventDispatcher, mouseToolEventDispatcher, newImageEventDispatcher, touchToolEventDispatcher */ 4046/***/ (function(module, __webpack_exports__, __webpack_require__) { 4047 4048"use strict"; 4049__webpack_require__.r(__webpack_exports__); 4050/* harmony import */ var _imageRenderedEventDispatcher_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./imageRenderedEventDispatcher.js */ "./eventDispatchers/imageRenderedEventDispatcher.js"); 4051/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "imageRenderedEventDispatcher", function() { return _imageRenderedEventDispatcher_js__WEBPACK_IMPORTED_MODULE_0__["default"]; }); 4052 4053/* harmony import */ var _mouseToolEventDispatcher_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./mouseToolEventDispatcher.js */ "./eventDispatchers/mouseToolEventDispatcher.js"); 4054/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mouseToolEventDispatcher", function() { return _mouseToolEventDispatcher_js__WEBPACK_IMPORTED_MODULE_1__["default"]; }); 4055 4056/* harmony import */ var _newImageEventDispatcher_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./newImageEventDispatcher.js */ "./eventDispatchers/newImageEventDispatcher.js"); 4057/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "newImageEventDispatcher", function() { return _newImageEventDispatcher_js__WEBPACK_IMPORTED_MODULE_2__["default"]; }); 4058 4059/* harmony import */ var _touchToolEventDispatcher_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./touchToolEventDispatcher.js */ "./eventDispatchers/touchToolEventDispatcher.js"); 4060/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "touchToolEventDispatcher", function() { return _touchToolEventDispatcher_js__WEBPACK_IMPORTED_MODULE_3__["default"]; }); 4061 4062 4063 4064 4065 4066 4067 4068/***/ }), 4069
4070/***/ "./eventDispatchers/mouseEventHandlers/addNewMeasurement.js": 4071/*!******************************************************************!*\ 4072 !*** ./eventDispatchers/mouseEventHandlers/addNewMeasurement.js ***! 4073 \******************************************************************/ 4074/*! exports provided: default */ 4075/***/ (function(module, __webpack_exports__, __webpack_require__) { 4076 4077"use strict"; 4078__webpack_require__.r(__webpack_exports__); 4079/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../events.js */ "./events.js"); 4080/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../externalModules.js */ "./externalModules.js"); 4081/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../stateManagement/toolState.js */ "./stateManagement/toolState.js"); 4082/* harmony import */ var _manipulators_index_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../manipulators/index.js */ "./manipulators/index.js"); 4083/* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../util/logger.js */ "./util/logger.js"); 4084/* harmony import */ var _util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../util/triggerEvent.js */ "./util/triggerEvent.js"); 4085 4086 4087 4088 4089 4090 4091var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_4__["getLogger"])('eventDispatchers:mouseEventHandlers'); 4092/* harmony default export */ __webpack_exports__["default"] = (function (evt, tool) { 4093 logger.log('addNewMeasurement'); 4094 evt.preventDefault(); 4095 evt.stopPropagation(); 4096 var eventData = evt.detail; 4097 var element = eventData.element; 4098 var measurementData = tool.createNewMeasurement(eventData); 4099 4100 if (!measurementData) { 4101 return; 4102 } // Associate this data with this imageId so we can render it and manipulate it 4103 4104 4105 Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_2__["addToolState"])(element, tool.name, measurementData); 4106 _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.updateImage(element); 4107 var options = Object.assign({ 4108 doneMovingCallback: function doneMovingCallback() { 4109 var eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MEASUREMENT_COMPLETED; 4110 var eventData = { 4111 toolName: tool.name, 4112 element: element, 4113 measurementData: measurementData 4114 }; 4115 Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_5__["default"])(element, eventType, eventData); 4116 } 4117 }, tool.options); 4118 var handleMover = Object.keys(measurementData.handles).length === 1 ? _manipulators_index_js__WEBPACK_IMPORTED_MODULE_3__["moveHandle"] : _manipulators_index_js__WEBPACK_IMPORTED_MODULE_3__["moveNewHandle"]; 4119 handleMover(eventData, tool.name, measurementData, measurementData.handles.end, options, 'mouse'); 4120}); 4121 4122/***/ }), 4123
4124/***/ "./eventDispatchers/mouseEventHandlers/index.js": 4125/*!******************************************************!*\ 4126 !*** ./eventDispatchers/mouseEventHandlers/index.js ***! 4127 \******************************************************/ 4128/*! exports provided: mouseClick, mouseDown, mouseDownActivate, mouseDoubleClick, mouseDrag, mouseMove, mouseUp, mouseWheel */ 4129/***/ (function(module, __webpack_exports__, __webpack_require__) { 4130 4131"use strict"; 4132__webpack_require__.r(__webpack_exports__); 4133/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mouseClick", function() { return mouseClick; }); 4134/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mouseDoubleClick", function() { return mouseDoubleClick; }); 4135/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mouseUp", function() { return mouseUp; }); 4136/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mouseWheel", function() { return mouseWheel; }); 4137/* harmony import */ var _shared_customCallbackHandler_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../shared/customCallbackHandler.js */ "./eventDispatchers/shared/customCallbackHandler.js"); 4138/* harmony import */ var _mouseDown_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./mouseDown.js */ "./eventDispatchers/mouseEventHandlers/mouseDown.js"); 4139/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mouseDown", function() { return _mouseDown_js__WEBPACK_IMPORTED_MODULE_1__["default"]; }); 4140 4141/* harmony import */ var _mouseDownActivate_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./mouseDownActivate.js */ "./eventDispatchers/mouseEventHandlers/mouseDownActivate.js"); 4142/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mouseDownActivate", function() { return _mouseDownActivate_js__WEBPACK_IMPORTED_MODULE_2__["default"]; }); 4143 4144/* harmony import */ var _mouseDrag_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./mouseDrag.js */ "./eventDispatchers/mouseEventHandlers/mouseDrag.js"); 4145/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mouseDrag", function() { return _mouseDrag_js__WEBPACK_IMPORTED_MODULE_3__["default"]; }); 4146 4147/* harmony import */ var _mouseMove_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./mouseMove.js */ "./eventDispatchers/mouseEventHandlers/mouseMove.js"); 4148/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mouseMove", function() { return _mouseMove_js__WEBPACK_IMPORTED_MODULE_4__["default"]; }); 4149 4150 4151 4152 4153 4154 4155var mouseClick = _shared_customCallbackHandler_js__WEBPACK_IMPORTED_MODULE_0__["default"].bind(null, 'Mouse', 'mouseClickCallback'); 4156var mouseDoubleClick = _shared_customCallbackHandler_js__WEBPACK_IMPORTED_MODULE_0__["default"].bind(null, 'Mouse', 'doubleClickCallback'); 4157var mouseUp = _shared_customCallbackHandler_js__WEBPACK_IMPORTED_MODULE_0__["default"].bind(null, 'Mouse', 'mouseUpCallback'); 4158var mouseWheel = _shared_customCallbackHandler_js__WEBPACK_IMPORTED_MODULE_0__["default"].bind(null, 'MouseWheel', 'mouseWheelCallback'); 4159 4160 4161/***/ }), 4162
4163/***/ "./eventDispatchers/mouseEventHandlers/mouseDown.js": 4164/*!**********************************************************!*\ 4165 !*** ./eventDispatchers/mouseEventHandlers/mouseDown.js ***! 4166 \**********************************************************/ 4167/*! exports provided: default */ 4168/***/ (function(module, __webpack_exports__, __webpack_require__) { 4169 4170"use strict"; 4171__webpack_require__.r(__webpack_exports__); 4172/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../../store/index.js */ "./store/index.js"); 4173/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./../../stateManagement/toolState.js */ "./stateManagement/toolState.js"); 4174/* harmony import */ var _store_getToolsWithMoveableHandles_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../store/getToolsWithMoveableHandles.js */ "./store/getToolsWithMoveableHandles.js"); 4175/* harmony import */ var _util_findAndMoveHelpers_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../util/findAndMoveHelpers.js */ "./util/findAndMoveHelpers.js"); 4176/* harmony import */ var _store_getInteractiveToolsForElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./../../store/getInteractiveToolsForElement.js */ "./store/getInteractiveToolsForElement.js"); 4177/* harmony import */ var _store_getToolsWithDataForElement_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./../../store/getToolsWithDataForElement.js */ "./store/getToolsWithDataForElement.js"); 4178/* harmony import */ var _store_filterToolsUsableWithMultiPartTools_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./../../store/filterToolsUsableWithMultiPartTools.js */ "./store/filterToolsUsableWithMultiPartTools.js"); 4179// State 4180 4181 // Util 4182 4183 4184 4185 4186 4187 4188/** 4189 * MouseDown is called before MouseDownActivate. If MouseDown 4190 * finds an existing tool to interact with, it can prevent the 4191 * event from bubbling to MouseDownActivate. 4192 * 4193 * @private 4194 * @param {mousedown} evt 4195 * @listens {CornerstoneTools.event:cornerstonetoolsmousedown} 4196 * @returns {undefined} 4197 */ 4198 4199/* harmony default export */ __webpack_exports__["default"] = (function (evt) { 4200 if (_store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].isToolLocked) { 4201 return; 4202 } 4203 4204 var eventData = evt.detail; 4205 var element = evt.detail.element; 4206 var coords = evt.detail.currentPoints.canvas; // High level filtering 4207 4208 var activeAndPassiveTools = Object(_store_getInteractiveToolsForElement_js__WEBPACK_IMPORTED_MODULE_4__["default"])(element, _store_index_js__WEBPACK_IMPORTED_MODULE_0__["getters"].mouseTools()); // ACTIVE TOOL W/ PRE CALLBACK? 4209 // Note: In theory, this should only ever be a single tool. 4210 4211 var activeTools = activeAndPassiveTools.filter(function (tool) { 4212 return tool.mode === 'active' && Array.isArray(tool.options.mouseButtonMask) && tool.options.mouseButtonMask.includes(eventData.buttons) && tool.options.isMouseActive; 4213 }); 4214 4215 if (_store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].isMultiPartToolActive) { 4216 activeTools = Object(_store_filterToolsUsableWithMultiPartTools_js__WEBPACK_IMPORTED_MODULE_6__["default"])(activeTools); 4217 } // If any tools are active, check if they have a special reason for dealing with the event. 4218 4219 4220 if (activeTools.length > 0) { 4221 // TODO: If length > 1, you could assess fitness and select the ideal tool 4222 // TODO: But because we're locking this to 'active' tools, that should rarely be an issue 4223 // Super-Meta-TODO: ^ I think we should just take the approach of one active tool per mou
4223se button? 4224 var firstActiveToolWithCallback = activeTools.find(function (tool) { 4225 return typeof tool.preMouseDownCallback === 'function'; 4226 }); 4227 4228 if (firstActiveToolWithCallback) { 4229 var consumedEvent = firstActiveToolWithCallback.preMouseDownCallback(evt); 4230 4231 if (consumedEvent) { 4232 return; 4233 } 4234 } 4235 } 4236 4237 if (_store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].isMultiPartToolActive) { 4238 // Don't fire events to Annotation Tools during a multi part loop. 4239 return; 4240 } // Annotation tool specific 4241 4242 4243 var annotationTools = Object(_store_getToolsWithDataForElement_js__WEBPACK_IMPORTED_MODULE_5__["default"])(element, activeAndPassiveTools); // NEAR HANDLES? 4244 4245 var annotationToolsWithMoveableHandles = Object(_store_getToolsWithMoveableHandles_js__WEBPACK_IMPORTED_MODULE_2__["default"])(element, annotationTools, coords, 'mouse'); 4246 4247 if (annotationToolsWithMoveableHandles.length > 0) { 4248 var firstToolWithMoveableHandles = annotationToolsWithMoveableHandles[0]; 4249 var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__["getToolState"])(element, firstToolWithMoveableHandles.name); 4250 4251 var _findHandleDataNearIm = Object(_util_findAndMoveHelpers_js__WEBPACK_IMPORTED_MODULE_3__["findHandleDataNearImagePoint"])(element, toolState, firstToolWithMoveableHandles.name, coords), 4252 handle = _findHandleDataNearIm.handle, 4253 data = _findHandleDataNearIm.data; 4254 4255 firstToolWithMoveableHandles.handleSelectedCallback(evt, data, handle, 'mouse'); 4256 return; 4257 } // NEAR TOOL? 4258 4259 4260 var annotationToolsWithPointNearClick = activeAndPassiveTools.filter(function (tool) { 4261 var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__["getToolState"])(element, tool.name); 4262 var isNearPoint = toolState && toolState.data && tool.pointNearTool && toolState.data.some(function (data) { 4263 return tool.pointNearTool(element, data, coords, 'mouse'); 4264 }); 4265 return isNearPoint; 4266 }); 4267 4268 if (annotationToolsWithPointNearClick.length > 0) { 4269 var firstToolNearPoint = annotationToolsWithPointNearClick[0]; 4270 4271 var _toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__["getToolState"])(element, firstToolNearPoint.name); 4272 4273 var firstAnnotationNearPoint = _toolState.data.find(function (data) { 4274 return firstToolNearPoint.pointNearTool(element, data, coords); 4275 }); 4276 4277 firstToolNearPoint.toolSelectedCallback(evt, firstAnnotationNearPoint, 'mouse'); 4278 return; 4279 } // ACTIVE TOOL W/ POST CALLBACK? 4280 // If any tools are active, check if they have a special reason for dealing with the event. 4281 4282 4283 if (activeTools.length > 0) { 4284 // TODO: If length > 1, you could assess fitness and select the ideal tool 4285 // TODO: But because we're locking this to 'active' tools, that should rarely be an issue 4286 // Super-Meta-TODO: ^ I think we should just take the approach of one active tool per mou
4286se button? 4287 var _firstActiveToolWithCallback = activeTools.find(function (tool) { 4288 return typeof tool.postMouseDownCallback === 'function'; 4289 }); 4290 4291 if (_firstActiveToolWithCallback) { 4292 var _consumedEvent = _firstActiveToolWithCallback.postMouseDownCallback(evt); 4293 4294 if (_consumedEvent) { 4295 return; 4296 } 4297 } 4298 } 4299}); 4300 4301/***/ }), 4302
4303/***/ "./eventDispatchers/mouseEventHandlers/mouseDownActivate.js": 4304/*!******************************************************************!*\ 4305 !*** ./eventDispatchers/mouseEventHandlers/mouseDownActivate.js ***! 4306 \******************************************************************/ 4307/*! exports provided: default */ 4308/***/ (function(module, __webpack_exports__, __webpack_require__) { 4309 4310"use strict"; 4311__webpack_require__.r(__webpack_exports__); 4312/* harmony import */ var _addNewMeasurement_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./addNewMeasurement.js */ "./eventDispatchers/mouseEventHandlers/addNewMeasurement.js"); 4313/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./../../store/index.js */ "./store/index.js"); 4314/* harmony import */ var _tools_base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./../../tools/base/BaseAnnotationTool.js */ "./tools/base/BaseAnnotationTool.js"); 4315/* harmony import */ var _util_getActiveTool__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../util/getActiveTool */ "./util/getActiveTool.js"); 4316 4317 4318 4319 4320/* harmony default export */ __webpack_exports__["default"] = (function (evt) { 4321 if (_store_index_js__WEBPACK_IMPORTED_MODULE_1__["state"].isToolLocked) { 4322 return; 4323 } 4324 4325 var _evt$detail = evt.detail, 4326 element = _evt$detail.element, 4327 buttons = _evt$detail.buttons; 4328 var activeTool = Object(_util_getActiveTool__WEBPACK_IMPORTED_MODULE_3__["default"])(element, buttons, 'mouse'); 4329 4330 if (!activeTool) { 4331 return; 4332 } 4333 4334 if (typeof activeTool.preMouseDownActivateCallback === 'function') { 4335 var consumedEvent = activeTool.preMouseDownActivateCallback(evt); 4336 4337 if (consumedEvent) { 4338 return; 4339 } 4340 } 4341 4342 if (_store_index_js__WEBPACK_IMPORTED_MODULE_1__["state"].isMultiPartToolActive) { 4343 return; 4344 } // Note: custom `addNewMeasurement` will need to prevent event bubbling 4345 4346 4347 if (activeTool.addNewMeasurement) { 4348 activeTool.addNewMeasurement(evt, 'mouse'); 4349 } else if (activeTool instanceof _tools_base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_2__["default"]) { 4350 Object(_addNewMeasurement_js__WEBPACK_IMPORTED_MODULE_0__["default"])(evt, activeTool); 4351 } 4352}); 4353 4354/***/ }), 4355
4356/***/ "./eventDispatchers/mouseEventHandlers/mouseDrag.js": 4357/*!**********************************************************!*\ 4358 !*** ./eventDispatchers/mouseEventHandlers/mouseDrag.js ***! 4359 \**********************************************************/ 4360/*! exports provided: default */ 4361/***/ (function(module, __webpack_exports__, __webpack_require__) { 4362 4363"use strict"; 4364__webpack_require__.r(__webpack_exports__); 4365/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../../store/index.js */ "./store/index.js"); 4366/* harmony import */ var _store_getActiveToolsForElement_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./../../store/getActiveToolsForElement.js */ "./store/getActiveToolsForElement.js"); 4367/* harmony import */ var _store_filterToolsUsableWithMultiPartTools_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./../../store/filterToolsUsableWithMultiPartTools.js */ "./store/filterToolsUsableWithMultiPartTools.js"); 4368 4369 4370 // Tools like wwwc. Non-annotation tools w/ specific 4371// Down + mouse behavior 4372// TODO: I don't like filtering in drag because it's such 4373// A high frequency event. Anything we can do to reduce 4374// Repeat math here would be a big help 4375 4376/* harmony default export */ __webpack_exports__["default"] = (function (evt) { 4377 if (_store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].isToolLocked) { 4378 return; 4379 } 4380 4381 var tools; 4382 var eventData = evt.detail; 4383 var element = eventData.element; // Filter out disabled, enabled, and passive 4384 4385 tools = Object(_store_getActiveToolsForElement_js__WEBPACK_IMPORTED_MODULE_1__["default"])(element, _store_index_js__WEBPACK_IMPORTED_MODULE_0__["getters"].mouseTools()); 4386 tools = tools.filter(function (tool) { 4387 return Array.isArray(tool.options.mouseButtonMask) && tool.options.mouseButtonMask.includes(eventData.buttons) && tool.options.isMouseActive; 4388 }); 4389 tools = tools.filter(function (tool) { 4390 return typeof tool.mouseDragCallback === 'function'; 4391 }); 4392 4393 if (_store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].isMultiPartToolActive) { 4394 tools = Object(_store_filterToolsUsableWithMultiPartTools_js__WEBPACK_IMPORTED_MODULE_2__["default"])(tools); 4395 } 4396 4397 if (tools.length === 0) { 4398 return; 4399 } 4400 4401 var activeTool = tools[0]; 4402 activeTool.mouseDragCallback(evt); 4403}); 4404 4405/***/ }), 4406
4407/***/ "./eventDispatchers/mouseEventHandlers/mouseMove.js": 4408/*!**********************************************************!*\ 4409 !*** ./eventDispatchers/mouseEventHandlers/mouseMove.js ***! 4410 \**********************************************************/ 4411/*! exports provided: default */ 4412/***/ (function(module, __webpack_exports__, __webpack_require__) { 4413 4414"use strict"; 4415__webpack_require__.r(__webpack_exports__); 4416/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../../externalModules.js */ "./externalModules.js"); 4417/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./../../store/index.js */ "./store/index.js"); 4418/* harmony import */ var _store_getInteractiveToolsForElement_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./../../store/getInteractiveToolsForElement.js */ "./store/getInteractiveToolsForElement.js"); 4419/* harmony import */ var _store_getToolsWithDataForElement_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./../../store/getToolsWithDataForElement.js */ "./store/getToolsWithDataForElement.js"); 4420 // State 4421 4422 4423 4424 4425/** 4426 * This is mostly used to update the [un]hover state 4427 * of a tool. 4428 * 4429 * @private 4430 * @param {*} evt 4431 * @returns {void} 4432 */ 4433 4434/* harmony default export */ __webpack_exports__["default"] = (function (evt) { 4435 if (_store_index_js__WEBPACK_IMPORTED_MODULE_1__["state"].isToolLocked || _store_index_js__WEBPACK_IMPORTED_MODULE_1__["state"].isMultiPartToolActive) { 4436 return; 4437 } 4438 4439 var tools; 4440 var _evt$detail = evt.detail, 4441 element = _evt$detail.element, 4442 currentPoints = _evt$detail.currentPoints; // Set the mouse position incase any tool needs it. 4443 4444 _store_index_js__WEBPACK_IMPORTED_MODULE_1__["state"].mousePositionImage = currentPoints.image; // TODO: instead of filtering these for every interaction, we can change our 4445 // TODO: State's structure to always know these values. 4446 // Filter out disabled and enabled 4447 4448 tools = Object(_store_getInteractiveToolsForElement_js__WEBPACK_IMPORTED_MODULE_2__["default"])(element, _store_index_js__WEBPACK_IMPORTED_MODULE_1__["getters"].mouseTools()); 4449 var activeTools = tools.filter(function (tool) { 4450 return tool.mode === 'active' && tool.options.isMouseActive; 4451 }); 4452 var imageNeedsUpdate = false; // If any tools are active, check if they have a canvas cursor, and if so update image. 4453 4454 if (activeTools.length > 0) { 4455 imageNeedsUpdate = activeTools.some(function (tool) { 4456 return tool.updateOnMouseMove; 4457 }); 4458 } 4459 4460 tools = Object(_store_getToolsWithDataForElement_js__WEBPACK_IMPORTED_MODULE_3__["default"])(element, tools); // Iterate over each tool, and each tool's data 4461 // Activate any handles we're hovering over, or whole tools if we're near the tool 4462 // If we've changed the state of anything, redrawn the image 4463 4464 for (var t = 0; t < tools.length; t++) { 4465 var tool = tools[t]; 4466 4467 if (typeof tool.mouseMoveCallback === 'function') { 4468 imageNeedsUpdate = tool.mouseMoveCallback(evt) || imageNeedsUpdate; 4469 } 4470 } // Tool data activation status changed, redraw the image 4471 4472 4473 if (imageNeedsUpdate === true) { 4474 _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.updateImage(element); 4475 } 4476}); 4477 4478/***/ }), 4479
4480/***/ "./eventDispatchers/mouseToolEventDispatcher.js": 4481/*!******************************************************!*\ 4482 !*** ./eventDispatchers/mouseToolEventDispatcher.js ***! 4483 \******************************************************/ 4484/*! exports provided: default */ 4485/***/ (function(module, __webpack_exports__, __webpack_require__) { 4486 4487"use strict"; 4488__webpack_require__.r(__webpack_exports__); 4489/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../events.js */ "./events.js"); 4490/* harmony import */ var _mouseEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./mouseEventHandlers/index.js */ "./eventDispatchers/mouseEventHandlers/index.js"); 4491 4492 4493/** 4494 * These listeners are emitted in order, and can be cancelled/prevented from bubbling 4495 * by any previous event. 4496 * - mouseMove: used to update the [un]hover state of a tool (highlighting) 4497 * - mouseDown: check to see if we are close to an existing annotation, grab it 4498 * - mouseDownActivate: createNewMeasurement (usually) 4499 * - mouseDrag: update measurement or apply strategy (wwwc) 4500 * - mouseDoubleClick: usually a one-time apply specialty action 4501 * - onImageRendered: redraw visible tool data 4502 * @private 4503 * @param {*} element 4504 * @returns {undefined} 4505 */ 4506 4507var enable = function enable(element) { 4508 element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_CLICK, _mouseEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["mouseClick"]); 4509 element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_DOWN, _mouseEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["mouseDown"]); 4510 element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_DOWN_ACTIVATE, _mouseEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["mouseDownActivate"]); 4511 element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_DOUBLE_CLICK, _mouseEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["mouseDoubleClick"]); 4512 element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_DRAG, _mouseEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["mouseDrag"]); 4513 element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_MOVE, _mouseEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["mouseMove"]); 4514 element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_UP, _mouseEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["mouseUp"]); 4515 element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_WHEEL, _mouseEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["mouseWheel"]); 4516}; 4517 4518var disable = function disable(element) { 4519 element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_CLICK, _mouseEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["mouseClick"]); 4520 element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_DOWN, _mouseEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["mouseDown"]); 4521 element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_DOWN_ACTIVATE, _mouseEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["mouseDownActivate"]); 4522 element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_DOUBLE_CLICK, _mouseEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["mouseDoubleClick"]); 4523 element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_DRAG, _mouseEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["mouseDrag"]); 4524 element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_MOVE, _mouseEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["mouseMove"]); 4525 element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_UP, _mouseEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["mouseUp"]); 4526 element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_WHEEL, _mouseEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["mouseWheel"]); 4527}; 4528 4529/* harmony default export */ __webpack_exports__["default"] = ({ 4530 enable: enable, 4531 disable: disable 4532}); 4533 4534/***/ }), 4535
4536/***/ "./eventDispatchers/newImageEventDispatcher.js": 4537/*!*****************************************************!*\ 4538 !*** ./eventDispatchers/newImageEventDispatcher.js ***! 4539 \*****************************************************/ 4540/*! exports provided: default */ 4541/***/ (function(module, __webpack_exports__, __webpack_require__) { 4542 4543"use strict"; 4544__webpack_require__.r(__webpack_exports__); 4545/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../store/index.js */ "./store/index.js"); 4546/* harmony import */ var _tools_base_BaseBrushTool_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./../tools/base/BaseBrushTool.js */ "./tools/base/BaseBrushTool.js"); 4547/* harmony import */ var _eventListeners_onNewImageBrushEventHandler_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../eventListeners/onNewImageBrushEventHandler.js */ "./eventListeners/onNewImageBrushEventHandler.js"); 4548/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./../externalModules.js */ "./externalModules.js"); 4549 4550 4551 4552 4553 4554var onNewImage = function onNewImage(evt) { 4555 if (_store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].isToolLocked) { 4556 return false; 4557 } 4558 4559 var element = evt.detail.element; 4560 var tools = _store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].tools.filter(function (tool) { 4561 return tool.element === element && (tool.mode === 'active' || tool.mode === 'passive' || tool.mode === 'enabled'); 4562 }); 4563 4564 if (tools.length === 0) { 4565 return false; 4566 } 4567 4568 tools.forEach(function (tool) { 4569 if (tool.newImageCallback) { 4570 tool.newImageCallback(evt); 4571 } 4572 }); // Check if any brush tools are present. 4573 4574 var brushTools = tools.filter(function (tool) { 4575 return tool instanceof _tools_base_BaseBrushTool_js__WEBPACK_IMPORTED_MODULE_1__["default"]; 4576 }); 4577 4578 if (brushTools.length > 0) { 4579 Object(_eventListeners_onNewImageBrushEventHandler_js__WEBPACK_IMPORTED_MODULE_2__["default"])(evt); 4580 } 4581}; 4582 4583var enable = function enable(element) { 4584 element.addEventListener(_externalModules_js__WEBPACK_IMPORTED_MODULE_3__["default"].cornerstone.EVENTS.NEW_IMAGE, onNewImage); 4585}; 4586 4587var disable = function disable(element) { 4588 element.removeEventListener(_externalModules_js__WEBPACK_IMPORTED_MODULE_3__["default"].cornerstone.EVENTS.NEW_IMAGE, onNewImage); 4589}; 4590 4591/* harmony default export */ __webpack_exports__["default"] = ({ 4592 enable: enable, 4593 disable: disable 4594}); 4595 4596/***/ }), 4597
4598/***/ "./eventDispatchers/shared/customCallbackHandler.js": 4599/*!**********************************************************!*\ 4600 !*** ./eventDispatchers/shared/customCallbackHandler.js ***! 4601 \**********************************************************/ 4602/*! exports provided: default */ 4603/***/ (function(module, __webpack_exports__, __webpack_require__) { 4604 4605"use strict"; 4606__webpack_require__.r(__webpack_exports__); 4607/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../../store/index.js */ "./store/index.js"); 4608/* harmony import */ var _store_getActiveToolsForElement_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./../../store/getActiveToolsForElement.js */ "./store/getActiveToolsForElement.js"); 4609/* harmony import */ var _store_filterToolsUsableWithMultiPartTools_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./../../store/filterToolsUsableWithMultiPartTools.js */ "./store/filterToolsUsableWithMultiPartTools.js"); 4610 4611 4612 4613/* harmony default export */ __webpack_exports__["default"] = (function (handlerType, customFunction, evt) { 4614 if (_store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].isToolLocked) { 4615 return false; 4616 } // TODO: We sometimes see a null detail for TOUCH_PRESS 4617 4618 4619 var element = evt.detail.element; 4620 var tools = _store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].tools.filter(function (tool) { 4621 return tool.supportedInteractionTypes.includes(handlerType); 4622 }); // Tool is active, and specific callback is active 4623 4624 tools = Object(_store_getActiveToolsForElement_js__WEBPACK_IMPORTED_MODULE_1__["default"])(element, tools, handlerType); // Tool has expected callback custom function 4625 4626 tools = tools.filter(function (tool) { 4627 return typeof tool[customFunction] === 'function'; 4628 }); 4629 4630 if (_store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].isMultiPartToolActive) { 4631 tools = Object(_store_filterToolsUsableWithMultiPartTools_js__WEBPACK_IMPORTED_MODULE_2__["default"])(tools); 4632 } 4633 4634 if (tools.length === 0) { 4635 return false; 4636 } 4637 4638 tools[0][customFunction](evt); 4639}); 4640 4641/***/ }), 4642
4643/***/ "./eventDispatchers/touchEventHandlers/addNewMeasurement.js": 4644/*!******************************************************************!*\ 4645 !*** ./eventDispatchers/touchEventHandlers/addNewMeasurement.js ***! 4646 \******************************************************************/ 4647/*! exports provided: default */ 4648/***/ (function(module, __webpack_exports__, __webpack_require__) { 4649 4650"use strict"; 4651__webpack_require__.r(__webpack_exports__); 4652/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../events.js */ "./events.js"); 4653/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../externalModules.js */ "./externalModules.js"); 4654/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../store/index.js */ "./store/index.js"); 4655/* harmony import */ var _manipulators_anyHandlesOutsideImage_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./../../manipulators/anyHandlesOutsideImage.js */ "./manipulators/anyHandlesOutsideImage.js"); 4656/* harmony import */ var _manipulators_index_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../manipulators/index.js */ "./manipulators/index.js"); 4657/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../stateManagement/toolState.js */ "./stateManagement/toolState.js"); 4658/* harmony import */ var _util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../util/triggerEvent.js */ "./util/triggerEvent.js"); 4659/* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../util/logger.js */ "./util/logger.js"); 4660 4661 4662 4663 4664 4665 4666 4667 4668var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_7__["getLogger"])('eventDispatchers:touchEventHandlers'); 4669/* harmony default export */ __webpack_exports__["default"] = (function (evt, tool) { 4670 logger.log('addNewMeasurement'); 4671 evt.preventDefault(); 4672 evt.stopPropagation(); 4673 var touchEventData = evt.detail; 4674 var element = touchEventData.element; 4675 var measurementData = tool.createNewMeasurement(touchEventData); 4676 4677 if (!measurementData) { 4678 return; 4679 } 4680 4681 Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_5__["addToolState"])(element, tool.name, measurementData); // Todo: Looks like we're handling the "up" of the tap? 4682 4683 if (Object.keys(measurementData.handles).length === 1 && touchEventData.type === _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TAP) { 4684 // Todo: bold assumptions about measurement data for all tools? 4685 measurementData.active = false; 4686 measurementData.handles.end.active = false; 4687 measurementData.handles.end.highlight = false; 4688 measurementData.invalidated = true; 4689 var deleteIfHandleOutsideImage = _store_index_js__WEBPACK_IMPORTED_MODULE_2__["state"].deleteIfHandleOutsideImage || tool.options.deleteIfHandleOutsideImage; 4690 4691 if (deleteIfHandleOutsideImage && Object(_manipulators_anyHandlesOutsideImage_js__WEBPACK_IMPORTED_MODULE_3__["default"])(touchEventData, measurementData.handles)) { 4692 // Delete the measurement 4693 Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_5__["removeToolState"])(element, tool.name, measurementData); 4694 } 4695 4696 _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.updateImage(element); 4697 return; 4698 } 4699 4700 _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.updateImage(element); 4701 var options = Object.assign({ 4702 doneMovingCallback: function doneMovingCallback() { 4703 var eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MEASUREMENT_COMPLETED; 4704 var eventData = { 4705 toolName: tool.name, 4706 element: element, 4707 measurementData: measurementData 4708 }; 4709 Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_6__["default"])(element, eventType, eventData); 4710 } 4711 }, tool.options); 4712 Object(_manipulators_index_js__WEBPACK_IMPORTED_MODULE_4__["moveNewHandle"])(touchEventData, tool.name, measurementData, measurementData.handles.end, options, 'touch'); 4713}); 4714 4715/***/ }), 4716
4717/***/ "./eventDispatchers/touchEventHandlers/index.js": 4718/*!******************************************************!*\ 4719 !*** ./eventDispatchers/touchEventHandlers/index.js ***! 4720 \******************************************************/ 4721/*! exports provided: doubleTap, multiTouchDrag, tap, touchDrag, touchEnd, touchPinch, touchPress, touchRotate, touchStart, touchStartActive */ 4722/***/ (function(module, __webpack_exports__, __webpack_require__) { 4723 4724"use strict"; 4725__webpack_require__.r(__webpack_exports__); 4726/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "doubleTap", function() { return doubleTap; }); 4727/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "touchDrag", function() { return touchDrag; }); 4728/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "touchEnd", function() { return touchEnd; }); 4729/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "touchPinch", function() { return touchPinch; }); 4730/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "touchPress", function() { return touchPress; }); 4731/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "touchRotate", function() { return touchRotate; }); 4732/* harmony import */ var _shared_customCallbackHandler_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../shared/customCallbackHandler.js */ "./eventDispatchers/shared/customCallbackHandler.js"); 4733/* harmony import */ var _multiTouchDrag_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./multiTouchDrag.js */ "./eventDispatchers/touchEventHandlers/multiTouchDrag.js"); 4734/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "multiTouchDrag", function() { return _multiTouchDrag_js__WEBPACK_IMPORTED_MODULE_1__["default"]; }); 4735 4736/* harmony import */ var _tap_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tap.js */ "./eventDispatchers/touchEventHandlers/tap.js"); 4737/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tap", function() { return _tap_js__WEBPACK_IMPORTED_MODULE_2__["default"]; }); 4738 4739/* harmony import */ var _touchStart_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./touchStart.js */ "./eventDispatchers/touchEventHandlers/touchStart.js"); 4740/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "touchStart", function() { return _touchStart_js__WEBPACK_IMPORTED_MODULE_3__["default"]; }); 4741 4742/* harmony import */ var _touchStartActive_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./touchStartActive.js */ "./eventDispatchers/touchEventHandlers/touchStartActive.js"); 4743/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "touchStartActive", function() { return _touchStartActive_js__WEBPACK_IMPORTED_MODULE_4__["default"]; }); 4744 4745 4746 4747 4748 4749 4750var doubleTap = _shared_customCallbackHandler_js__WEBPACK_IMPORTED_MODULE_0__["default"].bind(null, 'DoubleTap', 'doubleTapCallback'); // TODO: some touchDrag tools don't want to fire on touchStart 4751// TODO: Drag tools have an option `fireOnTouchStart` used to filter 4752// TODO: Them out of TOUCH_START handler 4753 4754var touchDrag = _shared_customCallbackHandler_js__WEBPACK_IMPORTED_MODULE_0__["default"].bind(null, 'Touch', 'touchDragCallback'); 4755var touchEnd = _shared_customCallbackHandler_js__WEBPACK_IMPORTED_MODULE_0__["default"].bind(null, 'Touch', 'touchEndCallback'); 4756var touchPinch = _shared_customCallbackHandler_js__WEBPACK_IMPORTED_MODULE_0__["default"].bind(null, 'TouchPinch', 'touchPinchCallback'); 4757var touchPress = _shared_customCallbackHandler_js__WEBPACK_IMPORTED_MODULE_0__["default"].bind(null, 'Touch', 'touchPressCallback'); 4758var touchRotate = _shared_customCallbackHandler_js__WEBPACK_IMPORTED_MODULE_0__["default"].bind(null, 'TouchRotate', 'touchRotateCallback'); 4759 4760 4761/***/ }), 4762
4763/***/ "./eventDispatchers/touchEventHandlers/multiTouchDrag.js": 4764/*!***************************************************************!*\ 4765 !*** ./eventDispatchers/touchEventHandlers/multiTouchDrag.js ***! 4766 \***************************************************************/ 4767/*! exports provided: default */ 4768/***/ (function(module, __webpack_exports__, __webpack_require__) { 4769 4770"use strict"; 4771__webpack_require__.r(__webpack_exports__); 4772/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../store/index.js */ "./store/index.js"); 4773/* harmony import */ var _store_getActiveToolsForElement_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../store/getActiveToolsForElement.js */ "./store/getActiveToolsForElement.js"); 4774/* harmony import */ var _store_filterToolsUsableWithMultiPartTools_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./../../store/filterToolsUsableWithMultiPartTools.js */ "./store/filterToolsUsableWithMultiPartTools.js"); 4775 4776 4777 4778/* harmony default export */ __webpack_exports__["default"] = (function (evt) { 4779 if (_store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].isToolLocked) { 4780 return false; 4781 } // TODO: We sometimes see a null detail for TOUCH_PRESS 4782 4783 4784 var _evt$detail = evt.detail, 4785 element = _evt$detail.element, 4786 numPointers = _evt$detail.numPointers; 4787 var tools = _store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].tools.filter(function (tool) { 4788 return tool.supportedInteractionTypes.includes('MultiTouch'); 4789 }); // Tool is active, and specific callback is active 4790 4791 tools = Object(_store_getActiveToolsForElement_js__WEBPACK_IMPORTED_MODULE_1__["default"])(element, tools, 'MultiTouch'); // Tool has expected callback custom function 4792 4793 tools = tools.filter(function (tool) { 4794 return typeof tool.multiTouchDragCallback === 'function' && numPointers === tool.configuration.touchPointers; 4795 }); 4796 4797 if (_store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].isMultiPartToolActive) { 4798 tools = Object(_store_filterToolsUsableWithMultiPartTools_js__WEBPACK_IMPORTED_MODULE_2__["default"])(tools); 4799 } 4800 4801 if (tools.length === 0) { 4802 return false; 4803 } 4804 4805 var activeTool = tools[0]; 4806 activeTool.multiTouchDragCallback(evt); 4807}); 4808 4809/***/ }), 4810
4811/***/ "./eventDispatchers/touchEventHandlers/shared/deactivateAllToolInstances.js": 4812/*!**********************************************************************************!*\ 4813 !*** ./eventDispatchers/touchEventHandlers/shared/deactivateAllToolInstances.js ***! 4814 \**********************************************************************************/ 4815/*! exports provided: default */ 4816/***/ (function(module, __webpack_exports__, __webpack_require__) { 4817 4818"use strict"; 4819__webpack_require__.r(__webpack_exports__); 4820/* harmony default export */ __webpack_exports__["default"] = (function (toolData) { 4821 if (!toolData) { 4822 return; 4823 } 4824 4825 for (var i = 0; i < toolData.data.length; i++) { 4826 var data = toolData.data[i]; 4827 data.active = false; 4828 4829 if (!data.handles) { 4830 continue; 4831 } 4832 4833 deactivateAllHandles(data.handles); 4834 } 4835}); 4836 4837function deactivateAllHandles(handles) { 4838 Object.keys(handles).forEach(function (name) { 4839 var handle = handles[name]; 4840 handle.active = false; 4841 }); 4842} 4843 4844/***/ }), 4845
4846/***/ "./eventDispatchers/touchEventHandlers/tap.js": 4847/*!****************************************************!*\ 4848 !*** ./eventDispatchers/touchEventHandlers/tap.js ***! 4849 \****************************************************/ 4850/*! exports provided: default */ 4851/***/ (function(module, __webpack_exports__, __webpack_require__) { 4852 4853"use strict"; 4854__webpack_require__.r(__webpack_exports__); 4855/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../externalModules.js */ "./externalModules.js"); 4856/* harmony import */ var _touchStartActive_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./touchStartActive.js */ "./eventDispatchers/touchEventHandlers/touchStartActive.js"); 4857/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../store/index.js */ "./store/index.js"); 4858/* harmony import */ var _store_getActiveToolsForElement_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../store/getActiveToolsForElement.js */ "./store/getActiveToolsForElement.js"); 4859/* harmony import */ var _store_getToolsWithDataForElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../store/getToolsWithDataForElement.js */ "./store/getToolsWithDataForElement.js"); 4860/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../stateManagement/toolState.js */ "./stateManagement/toolState.js"); 4861/* harmony import */ var _manipulators_getHandleNearImagePoint_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../manipulators/getHandleNearImagePoint.js */ "./manipulators/getHandleNearImagePoint.js"); 4862/* harmony import */ var _manipulators_index_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../manipulators/index.js */ "./manipulators/index.js"); 4863/* harmony import */ var _shared_deactivateAllToolInstances_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./shared/deactivateAllToolInstances.js */ "./eventDispatchers/touchEventHandlers/shared/deactivateAllToolInstances.js"); 4864 4865 // State 4866 4867 4868 4869 4870 // 4871 4872 4873 // 4874 4875 4876/* harmony default export */ __webpack_exports__["default"] = (function (evt) { 4877 if (_store_index_js__WEBPACK_IMPORTED_MODULE_2__["state"].isToolLocked || _store_index_js__WEBPACK_IMPORTED_MODULE_2__["state"].isMultiPartToolActive) { 4878 return; 4879 } 4880 4881 var tools; 4882 var distanceFromHandle = 28; 4883 var element = evt.detail.element; 4884 var coords = evt.detail.currentPoints.canvas; 4885 tools = Object(_store_getActiveToolsForElement_js__WEBPACK_IMPORTED_MODULE_3__["default"])(element, _store_index_js__WEBPACK_IMPORTED_MODULE_2__["getters"].touchTools()); 4886 tools = Object(_store_getToolsWithDataForElement_js__WEBPACK_IMPORTED_MODULE_4__["default"])(element, tools); // Deactivate everything 4887 // DeactivateAllToolInstances(toolData); 4888 // Find all tools w/ handles that we are near 4889 4890 var toolsWithMoveableHandles = tools.filter(function (tool) { 4891 var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_5__["getToolState"])(element, tool.name); 4892 4893 for (var i = 0; i < toolState.data.length; i++) { 4894 if (Object(_manipulators_getHandleNearImagePoint_js__WEBPACK_IMPORTED_MODULE_6__["default"])(element, toolState.data[i].handles, coords, distanceFromHandle) !== undefined) { 4895 return true; 4896 } 4897 } 4898 4899 return false; 4900 }); // TODO: More than one? Which one was moved most recently? 4901 // We'll just grab the first one we encounter for now 4902 4903 if (toolsWithMoveableHandles.length > 0) { 4904 // Todo: ignore: touch_start, tap 4905 var firstToolWithMoveableHandles = toolsWithMoveableHandles[0]; 4906 var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_5__["getToolState"])(element, firstToolWithMoveableHandles.name); 4907 var moveableHandle = toolState.data.find(function (d) { 4908 return Object(_manipulators_getHandleNearImagePoint_js__WEBPACK_IMPORTED_MODULE_6__["default"])(element, d.handles, coords, distanceFromHandle) !== undefined; 4909 }); 4910 toolState.data.active = true; 4911 moveableHandle.active = true; // Why here, but not touchStart? 4912 4913 _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.updateImage(element); 4914 var toolOptions = Object.assign({}, { 4915 doneMovingCallback: function doneMovingCallback() { 4916 Object(_shared_deactivateAllToolInstances_js__WEBPACK_IMPORTED_MODULE_8__["default"])(toolState); 4917 } 4918 }, firstToolWithMoveableHandles.options);
4919 Object(_manipulators_index_js__WEBPACK_IMPORTED_MODULE_7__["moveHandle"])(evt.detail, firstToolWithMoveableHandles.name, toolState.data, moveableHandle, toolOptions, 'touch'); 4920 evt.stopImmediatePropagation(); 4921 evt.preventDefault(); // Why no stopPropagation? 4922 4923 return; 4924 } // Find all tools near our point 4925 4926 4927 var toolsNearPoint = tools.filter(function (tool) { 4928 var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_5__["getToolState"])(element, tool.name); 4929 var isNearPoint = toolState && toolState.data && tool.pointNearTool && toolState.data.some(function (data) { 4930 return tool.pointNearTool(element, data, coords); 4931 }); 4932 return isNearPoint; 4933 }); // TODO: More than one? Which one was moved most recently? 4934 // We'll just grab the first one we encounter for now 4935 4936 if (toolsNearPoint.length > 0) { 4937 // Todo: Ignore: TAP, START, PRESS 4938 var firstToolNearPoint = toolsNearPoint[0]; 4939 4940 var _toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_5__["getToolState"])(element, firstToolNearPoint.name); 4941 4942 var firstAnnotationNearPoint = _toolState.data.find(function (data) { 4943 return firstToolNearPoint.pointNearTool(element, data, coords); 4944 }); // Todo: ignore: touch_start, tap 4945 4946 4947 firstAnnotationNearPoint.active = true; 4948 _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.updateImage(element); 4949 4950 var _toolOptions = Object.assign({}, { 4951 doneMovingCallback: function doneMovingCallback() { 4952 Object(_shared_deactivateAllToolInstances_js__WEBPACK_IMPORTED_MODULE_8__["default"])(_toolState); 4953 } 4954 }, firstToolNearPoint.options); 4955 4956 Object(_manipulators_index_js__WEBPACK_IMPORTED_MODULE_7__["moveAllHandles"])(evt.detail, firstToolNearPoint.name, firstAnnotationNearPoint, null, _toolOptions, 'touch'); 4957 evt.stopImmediatePropagation(); 4958 evt.preventDefault(); // TODO: Why no stop propagation? 4959 4960 return; 4961 } // If there is nothing to move, add a new instance of the tool 4962 // Need to check here to see if activation is allowed! 4963 // TODO: What would this be? First active tool? 4964 // Or should _always_ pass through to our larger event handler that checks 4965 // All tools anyway? 4966 4967 4968 var allActiveTools = Object(_store_getActiveToolsForElement_js__WEBPACK_IMPORTED_MODULE_3__["default"])(element, _store_index_js__WEBPACK_IMPORTED_MODULE_2__["getters"].touchTools()); 4969 4970 if (allActiveTools.length > 0 && allActiveTools[0].touchStartActiveCallback) { 4971 allActiveTools[0].touchStartActiveCallback(evt); 4972 } else { 4973 Object(_touchStartActive_js__WEBPACK_IMPORTED_MODULE_1__["default"])(evt); 4974 } 4975 4976 return false; 4977}); 4978 4979/***/ }), 4980
4981/***/ "./eventDispatchers/touchEventHandlers/touchStart.js": 4982/*!***********************************************************!*\ 4983 !*** ./eventDispatchers/touchEventHandlers/touchStart.js ***! 4984 \***********************************************************/ 4985/*! exports provided: default */ 4986/***/ (function(module, __webpack_exports__, __webpack_require__) { 4987 4988"use strict"; 4989__webpack_require__.r(__webpack_exports__); 4990/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../store/index.js */ "./store/index.js"); 4991/* harmony import */ var _util_findAndMoveHelpers_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../util/findAndMoveHelpers.js */ "./util/findAndMoveHelpers.js"); 4992/* harmony import */ var _store_getToolsWithMoveableHandles_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../store/getToolsWithMoveableHandles.js */ "./store/getToolsWithMoveableHandles.js"); 4993/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./../../stateManagement/toolState.js */ "./stateManagement/toolState.js"); 4994/* harmony import */ var _store_getInteractiveToolsForElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./../../store/getInteractiveToolsForElement.js */ "./store/getInteractiveToolsForElement.js"); 4995/* harmony import */ var _store_getToolsWithDataForElement_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./../../store/getToolsWithDataForElement.js */ "./store/getToolsWithDataForElement.js"); 4996/* harmony import */ var _store_filterToolsUsableWithMultiPartTools_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./../../store/filterToolsUsableWithMultiPartTools.js */ "./store/filterToolsUsableWithMultiPartTools.js"); 4997// State 4998 4999 5000 5001 5002 5003 5004 5005/* harmony default export */ __webpack_exports__["default"] = (function (evt) { 5006 if (_store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].isToolLocked) { 5007 return; 5008 } 5009 5010 var eventData = evt.detail; 5011 var element = eventData.element; 5012 var coords = eventData.startPoints.canvas; 5013 var activeAndPassiveTools = Object(_store_getInteractiveToolsForElement_js__WEBPACK_IMPORTED_MODULE_4__["default"])(element, _store_index_js__WEBPACK_IMPORTED_MODULE_0__["getters"].touchTools()); 5014 var activeTools = activeAndPassiveTools.filter(function (tool) { 5015 return tool.mode === 'active' && tool.options.isTouchActive; 5016 }); 5017 5018 if (_store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].isMultiPartToolActive) { 5019 activeTools = Object(_store_filterToolsUsableWithMultiPartTools_js__WEBPACK_IMPORTED_MODULE_6__["default"])(activeTools); 5020 } // If any tools are active, check if they have a special reason for dealing with the event. 5021 5022 5023 if (activeTools.length > 0) { 5024 // TODO: If length > 1, you could assess fitness and select the ideal tool 5025 // TODO: But because we're locking this to 'active' tools, that should rarely be an issue 5026 // Super-Meta-TODO: ^ I think we should just take the approach of one active tool per mou
5026se button? 5027 var firstActiveToolWithCallback = activeTools.find(function (tool) { 5028 return typeof tool.preTouchStartCallback === 'function'; 5029 }); 5030 5031 if (firstActiveToolWithCallback) { 5032 var consumedEvent = firstActiveToolWithCallback.preTouchStartCallback(evt); 5033 5034 if (consumedEvent) { 5035 return; 5036 } 5037 } 5038 } 5039 5040 if (_store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].isMultiPartToolActive) { 5041 return; 5042 } 5043 5044 var annotationTools = Object(_store_getToolsWithDataForElement_js__WEBPACK_IMPORTED_MODULE_5__["default"])(element, activeAndPassiveTools); // NEAR HANDLES? 5045 5046 var annotationToolsWithMoveableHandles = Object(_store_getToolsWithMoveableHandles_js__WEBPACK_IMPORTED_MODULE_2__["default"])(element, annotationTools, coords, 'touch'); // TODO: More than one? Which one was moved most recently? 5047 // We'll just grab the first one we encounter for now 5048 5049 if (annotationToolsWithMoveableHandles.length > 0) { 5050 // Todo: Ignore TAP, START, PRESS 5051 var firstToolWithMoveableHandles = annotationToolsWithMoveableHandles[0]; 5052 var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__["getToolState"])(element, firstToolWithMoveableHandles.name); 5053 5054 var _findHandleDataNearIm = Object(_util_findAndMoveHelpers_js__WEBPACK_IMPORTED_MODULE_1__["findHandleDataNearImagePoint"])(element, toolState, firstToolWithMoveableHandles.name, coords, 'touch'), 5055 handle = _findHandleDataNearIm.handle, 5056 data = _findHandleDataNearIm.data; 5057 5058 firstToolWithMoveableHandles.handleSelectedCallback(evt, data, handle, 'touch'); 5059 return; 5060 } // NEAR POINT? 5061 5062 5063 var annotationToolsWithPointNearTouch = annotationTools.filter(function (tool) { 5064 var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__["getToolState"])(element, tool.name); 5065 var isNearPoint = toolState && toolState.data && tool.pointNearTool && toolState.data.some(function (data) { 5066 return tool.pointNearTool(element, data, coords, 'touch'); 5067 }); 5068 return isNearPoint; 5069 }); // TODO: More than one? Which one was moved most recently? 5070 // We'll just grab the first one we encounter for now 5071 5072 if (annotationToolsWithPointNearTouch.length > 0) { 5073 // Todo: Ignore: TAP, START, PRESS 5074 var firstToolNearPoint = annotationToolsWithPointNearTouch[0]; 5075 5076 var _toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__["getToolState"])(element, firstToolNearPoint.name); 5077 5078 var firstAnnotationNearPoint = _toolState.data.find(function (data) { 5079 return firstToolNearPoint.pointNearTool(element, data, coords); 5080 }); 5081 5082 firstToolNearPoint.toolSelectedCallback(evt, firstAnnotationNearPoint, 'touch'); 5083 return; 5084 } // If any tools are active, check if they have a special reason for dealing with the event. 5085 5086 5087 if (activeTools.length > 0) { 5088 // TODO: If length > 1, you could assess fitness and select the ideal tool 5089 // TODO: But because we're locking this to 'active' tools, that should rarely be an issue 5090 // Super-Meta-TODO: ^ I think we should just take the approach of one active tool per mou
5090se button? 5091 var _firstActiveToolWithCallback = activeTools.find(function (tool) { 5092 return typeof tool.postTouchStartCallback === 'function'; 5093 }); 5094 5095 if (_firstActiveToolWithCallback) { 5096 var _consumedEvent = _firstActiveToolWithCallback.postTouchStartCallback(evt); 5097 5098 if (_consumedEvent) { 5099 return; 5100 } 5101 } 5102 } 5103}); 5104 5105/***/ }), 5106
5107/***/ "./eventDispatchers/touchEventHandlers/touchStartActive.js": 5108/*!*****************************************************************!*\ 5109 !*** ./eventDispatchers/touchEventHandlers/touchStartActive.js ***! 5110 \*****************************************************************/ 5111/*! exports provided: default */ 5112/***/ (function(module, __webpack_exports__, __webpack_require__) { 5113 5114"use strict"; 5115__webpack_require__.r(__webpack_exports__); 5116/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../../store/index.js */ "./store/index.js"); 5117/* harmony import */ var _addNewMeasurement_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./addNewMeasurement.js */ "./eventDispatchers/touchEventHandlers/addNewMeasurement.js"); 5118/* harmony import */ var _tools_base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./../../tools/base/BaseAnnotationTool.js */ "./tools/base/BaseAnnotationTool.js"); 5119/* harmony import */ var _util_getActiveTool__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../util/getActiveTool */ "./util/getActiveTool.js"); 5120// State 5121 5122 5123 5124 5125/* harmony default export */ __webpack_exports__["default"] = (function (evt) { 5126 if (_store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].isToolLocked || _store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].isMultiPartToolActive) { 5127 return; 5128 } 5129 5130 var element = evt.detail.element; 5131 var activeTool = Object(_util_getActiveTool__WEBPACK_IMPORTED_MODULE_3__["default"])(element, null, 'touch'); // Note: custom `addNewMeasurement` will need to prevent event bubbling 5132 5133 if (activeTool && activeTool.addNewMeasurement) { 5134 activeTool.addNewMeasurement(evt, 'touch'); 5135 } else if (activeTool instanceof _tools_base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_2__["default"]) { 5136 Object(_addNewMeasurement_js__WEBPACK_IMPORTED_MODULE_1__["default"])(evt, activeTool); 5137 } 5138}); 5139 5140/***/ }), 5141
5142/***/ "./eventDispatchers/touchToolEventDispatcher.js": 5143/*!******************************************************!*\ 5144 !*** ./eventDispatchers/touchToolEventDispatcher.js ***! 5145 \******************************************************/ 5146/*! exports provided: default */ 5147/***/ (function(module, __webpack_exports__, __webpack_require__) { 5148 5149"use strict"; 5150__webpack_require__.r(__webpack_exports__); 5151/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../events.js */ "./events.js"); 5152/* harmony import */ var _touchEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./touchEventHandlers/index.js */ "./eventDispatchers/touchEventHandlers/index.js"); 5153 5154 5155/** 5156 * These listeners are emitted in order, and can be cancelled/prevented from bubbling 5157 * by any previous event. 5158 * - tap: 5159 * - touchStart: check to see if we are close to an existing annotation, grab it 5160 * - touchDrag: 5161 * - touchStartActive: createNewMeasurement (usually) 5162 * - touchPress: 5163 * - touchRotate: 5164 * - doubleTap: usually a one-time apply specialty action 5165 * - touchPinch: 5166 * - onImageRendered: redraw visible tool data 5167 * @private 5168 * @param {*} element 5169 * @returns {void} 5170 */ 5171 5172var enable = function enable(element) { 5173 element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TAP, _touchEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["tap"]); 5174 element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_START, _touchEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["touchStart"], { 5175 passive: false 5176 }); 5177 element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_DRAG, _touchEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["touchDrag"], { 5178 passive: false 5179 }); 5180 element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_END, _touchEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["touchEnd"]); // Mouse equivelant is `mouse_down_activate` 5181 // Should the naming pattern here match? 5182 5183 element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_START_ACTIVE, _touchEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["touchStartActive"]); 5184 element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_PRESS, _touchEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["touchPress"]); 5185 element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].DOUBLE_TAP, _touchEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["doubleTap"]); 5186 element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_PINCH, _touchEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["touchPinch"]); 5187 element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_ROTATE, _touchEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["touchRotate"]); 5188 element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MULTI_TOUCH_DRAG, _touchEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["multiTouchDrag"]); 5189}; 5190 5191var disable = function disable(element) { 5192 element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TAP, _touchEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["tap"]); 5193 element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_START, _touchEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["touchStart"]); 5194 element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_DRAG, _touchEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["touchDrag"]); 5195 element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_END, _touchEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["touchEnd"]); // Mouse equivelant is `mouse_down_activate` 5196 // Should the naming pattern here match? 5197 5198 element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_START_ACTIVE, _touchEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["touchStartActive"]); 5199 element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_PRESS, _touchEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["touchPress"]); 5200 element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].DOUBLE_TAP, _touchEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["doubleTap"]); 5201 element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_PINCH, _touchEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["touchPinch"]); 5202 element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_ROTATE, _touchEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["touchRotate"]); 5203 element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MULTI_TOUCH_DRAG, _touchEventHandlers_index_js__WEBPACK_IMPORTED_MODULE_1__["multiTouchDrag"]); 5204}; 5205 5206/* harmony default export */ __webpack_exports__["default"] = ({ 5207 enable: enable, 5208 disable: disable 5209}); 5210 5211/***/ }), 5212
5213/***/ "./eventListeners/index.js": 5214/*!*********************************!*\ 5215 !*** ./eventListeners/index.js ***! 5216 \*********************************/ 5217/*! exports provided: mouseEventListeners, wheelEventListener, touchEventListeners */ 5218/***/ (function(module, __webpack_exports__, __webpack_require__) { 5219 5220"use strict"; 5221__webpack_require__.r(__webpack_exports__); 5222/* harmony import */ var _mouseEventListeners_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./mouseEventListeners.js */ "./eventListeners/mouseEventListeners.js"); 5223/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mouseEventListeners", function() { return _mouseEventListeners_js__WEBPACK_IMPORTED_MODULE_0__["default"]; }); 5224 5225/* harmony import */ var _wheelEventListener_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./wheelEventListener.js */ "./eventListeners/wheelEventListener.js"); 5226/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "wheelEventListener", function() { return _wheelEventListener_js__WEBPACK_IMPORTED_MODULE_1__["default"]; }); 5227 5228/* harmony import */ var _touchEventListeners_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./touchEventListeners.js */ "./eventListeners/touchEventListeners.js"); 5229/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "touchEventListeners", function() { return _touchEventListeners_js__WEBPACK_IMPORTED_MODULE_2__["default"]; }); 5230 5231 5232 5233 5234 5235 5236/***/ }), 5237
vendor: 1,908 bytes, lines 5238-5324
5238/***/ "./eventListeners/internals/normalizeWheel.js": 5239/*!****************************************************!*\ 5240 !*** ./eventListeners/internals/normalizeWheel.js ***! 5241 \****************************************************/ 5242/*! exports provided: default */ 5243/***/ (function(module, __webpack_exports__, __webpack_require__) { 5244 5245"use strict"; 5246__webpack_require__.r(__webpack_exports__); 5247// Reasonable defaults 5248var PIXEL_STEP = 10; 5249var LINE_HEIGHT = 40; 5250var PAGE_HEIGHT = 800; 5251/** 5252 * Normalizes wheel events and provides properties that are more 5253 * consistent and helpful across different browsers 5254 * 5255 * @private 5256 * @function normalizeWheel 5257 * @param {WheelEvent} event 5258 * @returns {Object} { spinX, spinY, pixlX, pixelY } 5259 */ 5260 5261/* harmony default export */ __webpack_exports__["default"] = (function (event) { 5262 var spinX = 0, 5263 spinY = 0, 5264 pixelX = 0, 5265 pixelY = 0; // Legacy 5266 5267 if ('detail' in event) { 5268 spinY = event.detail; 5269 } 5270 5271 if ('wheelDelta' in event) { 5272 spinY = -event.wheelDelta / 120; 5273 } 5274 5275 if ('wheelDeltaY' in event) { 5276 spinY = -event.wheelDeltaY / 120; 5277 } 5278 5279 if ('wheelDeltaX' in event) { 5280 spinX = -event.wheelDeltaX / 120; 5281 } 5282 5283 pixelX = spinX * PIXEL_STEP; 5284 pixelY = spinY * PIXEL_STEP; 5285 5286 if ('deltaY' in event) { 5287 pixelY = event.deltaY; 5288 } 5289 5290 if ('deltaX' in event) { 5291 pixelX = event.deltaX; 5292 } 5293 5294 if ((pixelX || pixelY) && event.deltaMode) { 5295 if (event.deltaMode === 1) { 5296 // Delta in LINE units 5297 pixelX *= LINE_HEIGHT; 5298 pixelY *= LINE_HEIGHT; 5299 } else { 5300 // Delta in PAGE units 5301 pixelX *= PAGE_HEIGHT; 5302 pixelY *= PAGE_HEIGHT; 5303 } 5304 } // Fall-back if spin cannot be determined 5305 5306 5307 if (pixelX && !spinX) { 5308 spinX = pixelX < 1 ? -1 : 1; 5309 } 5310 5311 if (pixelY && !spinY) { 5312 spinY = pixelY < 1 ? -1 : 1; 5313 } 5314 5315 return { 5316 spinX: spinX, 5317 spinY: spinY, 5318 pixelX: pixelX, 5319 pixelY: pixelY 5320 }; 5321}); 5322 5323/***/ }), 5324
5325/***/ "./eventListeners/mouseEventListeners.js": 5326/*!***********************************************!*\ 5327 !*** ./eventListeners/mouseEventListeners.js ***! 5328 \***********************************************/ 5329/*! exports provided: default */ 5330/***/ (function(module, __webpack_exports__, __webpack_require__) { 5331 5332"use strict"; 5333__webpack_require__.r(__webpack_exports__); 5334/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../events.js */ "./events.js"); 5335/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js"); 5336/* harmony import */ var _util_copyPoints_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../util/copyPoints.js */ "./util/copyPoints.js"); 5337/* harmony import */ var _util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../util/triggerEvent.js */ "./util/triggerEvent.js"); 5338/* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../util/logger.js */ "./util/logger.js"); 5339 5340 5341 5342 5343 5344var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_4__["getLogger"])('eventListeners:mouseEventListeners'); 5345var isClickEvent = true; 5346var preventClickTimeout; 5347var clickDelay = 200; 5348 5349function getEventButtons(event) { 5350 if (typeof event.buttons === 'number') { 5351 return event.buttons; 5352 } 5353 5354 switch (event.which) { 5355 // No button 5356 case 0: 5357 return 0; 5358 // Left 5359 5360 case 1: 5361 return 1; 5362 // Middle 5363 5364 case 2: 5365 return 4; 5366 // Right 5367 5368 case 3: 5369 return 2; 5370 } 5371 5372 return 0; 5373} 5374 5375function preventClickHandler() { 5376 isClickEvent = false; 5377} 5378 5379function mouseDoubleClick(e) { 5380 var element = e.currentTarget; 5381 var enabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getEnabledElement(element); 5382 5383 if (!enabledElement.image) { 5384 return; 5385 } 5386 5387 var eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_DOUBLE_CLICK; 5388 var startPoints = { 5389 page: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.pageToPoint(e), 5390 image: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pageToPixel(element, e.pageX, e.pageY), 5391 client: { 5392 x: e.clientX, 5393 y: e.clientY 5394 } 5395 }; 5396 startPoints.canvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pixelToCanvas(element, startPoints.image); 5397 var lastPoints = Object(_util_copyPoints_js__WEBPACK_IMPORTED_MODULE_2__["default"])(startPoints); 5398 logger.log('double-click: %o', getEventButtons(e)); 5399 var eventData = { 5400 event: e, 5401 buttons: getEventButtons(e), 5402 viewport: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getViewport(element), 5403 image: enabledElement.image, 5404 element: element, 5405 startPoints: startPoints, 5406 lastPoints: lastPoints, 5407 currentPoints: startPoints, 5408 deltaPoints: { 5409 x: 0, 5410 y: 0 5411 }, 5412 type: eventType 5413 }; 5414 Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_3__["default"])(element, eventType, eventData); 5415} 5416 5417function mouseDown(e) { 5418 var element = e.currentTarget; 5419 var enabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getEnabledElement(element); 5420 5421 if (!enabledElement.image) { 5422 return; 5423 } 5424 5425 preventClickTimeout = setTimeout(preventClickHandler, clickDelay); // Prevent CornerstoneToolsMouseMove while mouse is down 5426 5427 element.removeEventListener('mousemove', mouseMove); 5428 var startPoints = { 5429 page: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.pageToPoint(e), 5430 image: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pageToPixel(element, e.pageX, e.pageY), 5431 client: { 5432 x: e.clientX, 5433 y: e.clientY 5434 } 5435 }; 5436 startPoints.canvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pixelToCanvas(element, startPoints.image); 5437 var lastPoints = Object(_util_copyPoints_js__WEBPACK_IMPORTED_MODULE_2__["default"])(startPoints); 5438 var eventData = { 5439 event: e, 5440 buttons: getEventButtons(e), 5441 viewport: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getViewport(element), 5442 image: enabledElement.image, 5443 element: element, 5444 startPoints: startPoints, 5445 lastPoints: lastPoints, 5446 currentPoints: startPoints, 5447 deltaPoints: { 5448 x: 0, 5449 y: 0 5450 }, 5451 type: _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_DOWN 5452 }; 5453 var eventPropagated = Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_3__["default"])(eventData.element, _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_DOWN, eventData); 5454 5455 if (eventPropagated) { 5456 // No tools responded to this event, create a new tool 5457 eventData.type = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_DOWN_ACTIVATE;
5458 Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_3__["default"])(eventData.element, _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_DOWN_ACTIVATE, eventData); 5459 } 5460 5461 function onMouseMove(e) { 5462 // Calculate our current points in page and image coordinates 5463 var eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_DRAG; 5464 var currentPoints = { 5465 page: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.pageToPoint(e), 5466 image: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pageToPixel(element, e.pageX, e.pageY), 5467 client: { 5468 x: e.clientX, 5469 y: e.clientY 5470 } 5471 }; 5472 currentPoints.canvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pixelToCanvas(element, currentPoints.image); // Calculate delta values in page and image coordinates 5473 5474 var deltaPoints = { 5475 page: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.subtract(currentPoints.page, lastPoints.page), 5476 image: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.subtract(currentPoints.image, lastPoints.image), 5477 client: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.subtract(currentPoints.client, lastPoints.client), 5478 canvas: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.subtract(currentPoints.canvas, lastPoints.canvas) 5479 }; 5480 logger.log('mousemove: %o', getEventButtons(e)); 5481 var eventData = { 5482 buttons: getEventButtons(e), 5483 viewport: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getViewport(element), 5484 image: enabledElement.image, 5485 element: element, 5486 startPoints: startPoints, 5487 lastPoints: lastPoints, 5488 currentPoints: currentPoints, 5489 deltaPoints: deltaPoints, 5490 type: eventType, 5491 ctrlKey: e.ctrlKey, 5492 metaKey: e.metaKey, 5493 shiftKey: e.shiftKey 5494 }; 5495 Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_3__["default"])(eventData.element, eventType, eventData); // Update the last points 5496 5497 lastPoints = Object(_util_copyPoints_js__WEBPACK_IMPORTED_MODULE_2__["default"])(currentPoints); 5498 } // Hook mouseup so we can unbind our event listeners 5499 // When they stop dragging 5500 5501 5502 function onMouseUp(e) { 5503 // Cancel the timeout preventing the click event from triggering 5504 clearTimeout(preventClickTimeout); 5505 var eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_UP; 5506 5507 if (isClickEvent) { 5508 eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_CLICK; 5509 } // Calculate our current points in page and image coordinates 5510 5511 5512 var currentPoints = { 5513 page: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.pageToPoint(e), 5514 image: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pageToPixel(element, e.pageX, e.pageY), 5515 client: { 5516 x: e.clientX, 5517 y: e.clientY 5518 } 5519 }; 5520 currentPoints.canvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pixelToCanvas(element, currentPoints.image); // Calculate delta values in page and image coordinates 5521 5522 var deltaPoints = { 5523 page: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.subtract(currentPoints.page, lastPoints.page), 5524 image: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.subtract(currentPoints.image, lastPoints.image), 5525 client: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.subtract(currentPoints.client, lastPoints.client), 5526 canvas: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.subtract(currentPoints.canvas, lastPoints.canvas) 5527 }; 5528 logger.log('mouseup: %o', getEventButtons(e)); 5529 var eventData = { 5530 event: e, 5531 buttons: getEventButtons(e), 5532 viewport: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getViewport(element), 5533 image: enabledElement.image, 5534 element: element, 5535 startPoints: startPoints, 5536 lastPoints: lastPoints, 5537 currentPoints: currentPoints, 5538 deltaPoints: deltaPoints, 5539 type: eventType 5540 };
5541 Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_3__["default"])(eventData.element, eventType, eventData); 5542 document.removeEventListener('mousemove', onMouseMove); 5543 document.removeEventListener('mouseup', onMouseUp); 5544 element.addEventListener('mousemove', mouseMove); 5545 isClickEvent = true; 5546 } 5547 5548 document.addEventListener('mousemove', onMouseMove); 5549 document.addEventListener('mouseup', onMouseUp); 5550} 5551 5552function mouseMove(e) { 5553 var element = e.currentTarget; 5554 var enabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getEnabledElement(element); 5555 5556 if (!enabledElement.image) { 5557 return; 5558 } 5559 5560 var eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_MOVE; 5561 var startPoints = { 5562 page: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.pageToPoint(e), 5563 image: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pageToPixel(element, e.pageX, e.pageY), 5564 client: { 5565 x: e.clientX, 5566 y: e.clientY 5567 } 5568 }; 5569 startPoints.canvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pixelToCanvas(element, startPoints.image); 5570 var lastPoints = Object(_util_copyPoints_js__WEBPACK_IMPORTED_MODULE_2__["default"])(startPoints); // Calculate our current points in page and image coordinates 5571 5572 var currentPoints = { 5573 page: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.pageToPoint(e), 5574 image: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pageToPixel(element, e.pageX, e.pageY), 5575 client: { 5576 x: e.clientX, 5577 y: e.clientY 5578 } 5579 }; 5580 currentPoints.canvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pixelToCanvas(element, currentPoints.image); // Calculate delta values in page and image coordinates 5581 5582 var deltaPoints = { 5583 page: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.subtract(currentPoints.page, lastPoints.page), 5584 image: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.subtract(currentPoints.image, lastPoints.image), 5585 client: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.subtract(currentPoints.client, lastPoints.client), 5586 canvas: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.subtract(currentPoints.canvas, lastPoints.canvas) 5587 }; 5588 var eventData = { 5589 viewport: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getViewport(element), 5590 image: enabledElement.image, 5591 element: element, 5592 startPoints: startPoints, 5593 lastPoints: lastPoints, 5594 currentPoints: currentPoints, 5595 deltaPoints: deltaPoints, 5596 type: eventType 5597 }; 5598 Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_3__["default"])(element, eventType, eventData); // Update the last points 5599 5600 lastPoints = Object(_util_copyPoints_js__WEBPACK_IMPORTED_MODULE_2__["default"])(currentPoints); 5601} 5602 5603function disable(element) { 5604 element.removeEventListener('mousedown', mouseDown); 5605 element.removeEventListener('mousemove', mouseMove); 5606 element.removeEventListener('dblclick', mouseDoubleClick); 5607} 5608 5609function enable(element) { 5610 // Prevent handlers from being attached multiple times 5611 disable(element); 5612 element.addEventListener('mousedown', mouseDown); 5613 element.addEventListener('mousemove', mouseMove); 5614 element.addEventListener('dblclick', mouseDoubleClick); 5615} 5616 5617/* harmony default export */ __webpack_exports__["default"] = ({ 5618 enable: enable, 5619 disable: disable 5620}); 5621 5622/***/ }), 5623
5624/***/ "./eventListeners/onImageRenderedBrushEventHandler.js": 5625/*!************************************************************!*\ 5626 !*** ./eventListeners/onImageRenderedBrushEventHandler.js ***! 5627 \************************************************************/ 5628/*! exports provided: default */ 5629/***/ (function(module, __webpack_exports__, __webpack_require__) { 5630 5631"use strict"; 5632__webpack_require__.r(__webpack_exports__); 5633/* harmony import */ var _drawing_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../drawing/index.js */ "./drawing/index.js"); 5634/* harmony import */ var _tools_base_BaseBrushTool_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./../tools/base/BaseBrushTool.js */ "./tools/base/BaseBrushTool.js"); 5635/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js"); 5636/* harmony import */ var _store_getActiveToolsForElement_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../store/getActiveToolsForElement.js */ "./store/getActiveToolsForElement.js"); 5637/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../stateManagement/toolState.js */ "./stateManagement/toolState.js"); 5638/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../store/index.js */ "./store/index.js"); 5639 5640 5641 5642 5643 5644 5645/* Safari and Edge polyfill for createImageBitmap 5646 * https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/createImageBitmap 5647 */ 5648// TODO: Do we still need this? I've yanked the package for now 5649// It should be covered by @babel/runtime and plugin-transform-runtime: 5650// https://babeljs.io/docs/en/babel-plugin-transform-runtime 5651// @James, I think Babel should take care of this for us 5652// Import regeneratorRuntime from "regenerator-runtime"; 5653 5654if (!('createImageBitmap' in window)) { 5655 window.createImageBitmap = function (imageData) { 5656 return new Promise(function (resolve) { 5657 var img = document.createElement('img'); 5658 img.addEventListener('load', function () { 5659 resolve(this); 5660 }); 5661 var conversionCanvas = document.createElement('canvas'); 5662 conversionCanvas.width = imageData.width; 5663 conversionCanvas.height = imageData.height; 5664 var conversionCanvasContext = conversionCanvas.getContext('2d'); 5665 conversionCanvasContext.putImageData(imageData, 0, 0, 0, 0, conversionCanvas.width, conversionCanvas.height); 5666 img.src = conversionCanvas.toDataURL(); 5667 }); 5668 }; 5669} 5670 5671var _store$modules$brush = _store_index_js__WEBPACK_IMPORTED_MODULE_5__["default"].modules.brush, 5672 state = _store$modules$brush.state, 5673 getters = _store$modules$brush.getters, 5674 setters = _store$modules$brush.setters; 5675/** 5676 * Used to redraw the brush label map data per render. 5677 * 5678 * @private 5679 * @param {Object} evt - The event. 5680 * @returns {void} 5681 */ 5682 5683/* harmony default export */ __webpack_exports__["default"] = (function (evt) { 5684 var eventData = evt.detail; 5685 var element = eventData.element; 5686 var maxSegmentations = _tools_base_BaseBrushTool_js__WEBPACK_IMPORTED_MODULE_1__["default"].getNumberOfColors(); 5687 var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_4__["getToolState"])(element, _tools_base_BaseBrushTool_js__WEBPACK_IMPORTED_MODULE_1__["default"].getReferencedToolDataName()); 5688 5689 if (!toolData) { 5690 return; 5691 } 5692 5693 var enabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_2__["default"].cornerstone.getEnabledElement(element); 5694 var enabledElementUID = enabledElement.uuid; 5695 var segData = { 5696 visibleSegmentations: getters.visibleSegmentationsForElement(enabledElementUID), 5697 imageBitmapCache: getters.imageBitmapCacheForElement(enabledElementUID), 5698 toolData: toolData 5699 }; 5700 5701 for (var segIndex = 0; segIndex < maxSegmentations; segIndex++) { 5702 if (shouldRenderSegmentation(evt, segIndex, segData)) { 5703 renderSegmentation(evt, segIndex, segData); 5704 } 5705 } 5706}); 5707 5708function shouldRenderSegmentation(evt, segIndex, segData) { 5709 var element = evt.detail.element; 5710 var toolData = segData.toolData; 5711 var visibleSegmentations = segData.visibleSegmentations; 5712 5713 if (!toolData.data[segIndex] || !toolData.data[segIndex].pixelData) { 5714 // No data, no render. 5715 return false;
5716 } 5717 5718 if (visibleSegmentations[segIndex]) { 5719 // Has data and marked as visible, render! 5720 return true; 5721 } 5722 5723 var currentColor = state.drawColorId; 5724 5725 if (currentColor !== segIndex) { 5726 // Hidden and not current color, don't render. 5727 return false; 5728 } // Check that a brush tool is active. 5729 5730 5731 var activeTools = Object(_store_getActiveToolsForElement_js__WEBPACK_IMPORTED_MODULE_3__["default"])(element, _store_index_js__WEBPACK_IMPORTED_MODULE_5__["default"].state.tools); 5732 var brushTools = activeTools.filter(function (tool) { 5733 return tool instanceof _tools_base_BaseBrushTool_js__WEBPACK_IMPORTED_MODULE_1__["default"]; 5734 }); 5735 5736 if (brushTools.length > 0) { 5737 // Active brush tool with same color, render! 5738 return true; 5739 } 5740 5741 return false; 5742} 5743 5744function renderSegmentation(evt, segIndex, segData) { 5745 var toolData = segData.toolData; 5746 var imageBitmapCache = segData.imageBitmapCache; 5747 var visibleSegmentations = segData.visibleSegmentations; // Draw previous image if cached. 5748 5749 if (imageBitmapCache && imageBitmapCache[segIndex]) { 5750 _drawImageBitmap(evt, imageBitmapCache[segIndex], visibleSegmentations[segIndex]); 5751 } 5752 5753 if (toolData.data[segIndex].invalidated) { 5754 createNewBitmapAndQueueRenderOfSegmentation(evt, toolData, segIndex); 5755 } 5756} 5757 5758function createNewBitmapAndQueueRenderOfSegmentation(evt, toolData, segIndex) { 5759 var eventData = evt.detail; 5760 var element = eventData.element; 5761 var enabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_2__["default"].cornerstone.getEnabledElement(element); 5762 var pixelData = toolData.data[segIndex].pixelData; 5763 var imageSpecificSegmentationAlpha = toolData.data[segIndex].alpha; 5764 5765 if (!pixelData) { 5766 return; 5767 } 5768 5769 var colormapId = state.colorMapId; 5770 var colormap = _externalModules_js__WEBPACK_IMPORTED_MODULE_2__["default"].cornerstone.colors.getColormap(colormapId); 5771 var colorLutTable = [[0, 0, 0, 0], colormap.getColor(segIndex)]; 5772 var imageData = new ImageData(eventData.image.width, eventData.image.height); 5773 var image = { 5774 stats: {}, 5775 minPixelValue: 0, 5776 getPixelData: function getPixelData() { 5777 return pixelData; 5778 } 5779 }; 5780 var hasImageSpecificSegmentationAlpha = imageSpecificSegmentationAlpha !== undefined; 5781 5782 if (hasImageSpecificSegmentationAlpha) { 5783 colorLutTable[1][3] = imageSpecificSegmentationAlpha; 5784 } 5785 5786 _externalModules_js__WEBPACK_IMPORTED_MODULE_2__["default"].cornerstone.storedPixelDataToCanvasImageDataColorLUT(image, colorLutTable, imageData.data); 5787 window.createImageBitmap(imageData).then(function (newImageBitmap) { 5788 setters.imageBitmapCacheForElement(enabledElement.uuid, segIndex, newImageBitmap); 5789 toolData.data[segIndex].invalidated = false; 5790 _externalModules_js__WEBPACK_IMPORTED_MODULE_2__["default"].cornerstone.updateImage(eventData.element); 5791 }); 5792} 5793/** 5794 * Draws the ImageBitmap the canvas. 5795 * 5796 * @private 5797 * @param {Object} evt description 5798 * @param {ImageBitmap} imageBitmap 5799 * @param {Boolean} alwaysVisible 5800 * @returns {void} 5801 */ 5802 5803 5804function _drawImageBitmap(evt, imageBitmap, alwaysVisible) { 5805 var eventData = evt.detail; 5806 var context = Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_0__["getNewContext"])(eventData.canvasContext.canvas); 5807 var canvasTopLeft = _externalModules_js__WEBPACK_IMPORTED_MODULE_2__["default"].cornerstone.pixelToCanvas(eventData.element, { 5808 x: 0, 5809 y: 0 5810 }); 5811 var canvasTopRight = _externalModules_js__WEBPACK_IMPORTED_MODULE_2__["default"].cornerstone.pixelToCanvas(eventData.element, { 5812 x: eventData.image.width, 5813 y: 0 5814 }); 5815 var canvasBottomRight = _externalModules_js__WEBPACK_IMPORTED_MODULE_2__["default"].cornerstone.pixelToCanvas(eventData.element, { 5816 x: eventData.image.width, 5817 y: eventData.image.height 5818 }); 5819 var cornerstoneCanvasWidth = _externalModules_js__WEBPACK_IMPORTED_MODULE_2__["default"].cornerstoneMath.point.distance(canvasTopLeft, canvasTopRight); 5820 var cornerstoneCanvasHeight = _externalModules_js__WEBPACK_IMPORTED_MODULE_2__["default"].cornerstoneMath.point.distance(canvasTopRight, canvasBottomRight); 5821 var canvas = eventData.canvasContext.canvas; 5822 var viewport = eventData.viewport;
5823 context.imageSmoothingEnabled = false; 5824 context.globalAlpha = getLayerAlpha(alwaysVisible); 5825 Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_0__["transformCanvasContext"])(context, canvas, viewport); 5826 var canvasViewportTranslation = { 5827 x: viewport.translation.x * viewport.scale, 5828 y: viewport.translation.y * viewport.scale 5829 }; 5830 context.drawImage(imageBitmap, canvas.width / 2 - cornerstoneCanvasWidth / 2 + canvasViewportTranslation.x, canvas.height / 2 - cornerstoneCanvasHeight / 2 + canvasViewportTranslation.y, cornerstoneCanvasWidth, cornerstoneCanvasHeight); 5831 context.globalAlpha = 1.0; 5832 Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_0__["resetCanvasContextTransform"])(context); 5833} 5834 5835function getLayerAlpha(alwaysVisible) { 5836 if (alwaysVisible) { 5837 return state.alpha; 5838 } 5839 5840 return state.hiddenButActiveAlpha; 5841} 5842 5843/***/ }), 5844
5845/***/ "./eventListeners/onNewImageBrushEventHandler.js": 5846/*!*******************************************************!*\ 5847 !*** ./eventListeners/onNewImageBrushEventHandler.js ***! 5848 \*******************************************************/ 5849/*! exports provided: default */ 5850/***/ (function(module, __webpack_exports__, __webpack_require__) { 5851 5852"use strict"; 5853__webpack_require__.r(__webpack_exports__); 5854/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../stateManagement/toolState.js */ "./stateManagement/toolState.js"); 5855/* harmony import */ var _tools_base_BaseBrushTool_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./../tools/base/BaseBrushTool.js */ "./tools/base/BaseBrushTool.js"); 5856/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js"); 5857 5858 5859 5860/** 5861 * Clears the brush imageBitmapCache, 5862 * invaldates the data and calls for a re-render. 5863 * @private 5864 * @param {Object} evt - The event. 5865 * @returns {void} 5866 */ 5867 5868/* harmony default export */ __webpack_exports__["default"] = (function (evt) { 5869 var eventData = evt.detail; 5870 var element = eventData.element; 5871 var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_0__["getToolState"])(element, _tools_base_BaseBrushTool_js__WEBPACK_IMPORTED_MODULE_1__["default"].getReferencedToolDataName()); 5872 5873 if (!toolData) { 5874 Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_0__["addToolState"])(element, _tools_base_BaseBrushTool_js__WEBPACK_IMPORTED_MODULE_1__["default"].getReferencedToolDataName(), {}); 5875 toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_0__["getToolState"])(element, _tools_base_BaseBrushTool_js__WEBPACK_IMPORTED_MODULE_1__["default"].getReferencedToolDataName()); 5876 } 5877 5878 var maxSegmentations = _tools_base_BaseBrushTool_js__WEBPACK_IMPORTED_MODULE_1__["default"].getNumberOfColors(); // Invalidate the segmentation bitmap such that it gets redrawn. 5879 5880 for (var i = 0; i < maxSegmentations; i++) { 5881 if (toolData.data[i]) { 5882 toolData.data[i].invalidated = true; 5883 } 5884 } // Refresh the canvas 5885 5886 5887 _externalModules_js__WEBPACK_IMPORTED_MODULE_2__["default"].cornerstone.updateImage(eventData.element); 5888}); 5889 5890/***/ }), 5891
5892/***/ "./eventListeners/preventGhostClick.js": 5893/*!*********************************************!*\ 5894 !*** ./eventListeners/preventGhostClick.js ***! 5895 \*********************************************/ 5896/*! exports provided: default */ 5897/***/ (function(module, __webpack_exports__, __webpack_require__) { 5898 5899"use strict"; 5900__webpack_require__.r(__webpack_exports__); 5901// Functions to prevent ghost clicks following a touch 5902// All credit to @kosich 5903// https://gist.github.com/kosich/23188dd86633b6c2efb7 5904var antiGhostDelay = 2000, 5905 pointerType = { 5906 mouse: 0, 5907 touch: 1 5908}; 5909var lastInteractionType, lastInteractionTime; 5910 5911function handleTap(type, e) { 5912 var now = Date.now(); 5913 5914 if (type !== lastInteractionType) { 5915 if (now - lastInteractionTime <= antiGhostDelay) { 5916 e.preventDefault(); 5917 e.stopPropagation(); 5918 e.stopImmediatePropagation(); 5919 return false; 5920 } 5921 5922 lastInteractionType = type; 5923 } 5924 5925 lastInteractionTime = now; 5926} // Cacheing the function references 5927// Necessary because a new function reference is created after .bind() is called 5928// http://stackoverflow.com/questions/11565471/removing-event-listener-which-was-added-with-bind 5929 5930 5931var handleTapMouse = handleTap.bind(null, pointerType.mouse); 5932var handleTapTouch = handleTap.bind(null, pointerType.touch); 5933 5934function attachEvents(element, eventList, interactionType) { 5935 var tapHandler = interactionType ? handleTapMouse : handleTapTouch; 5936 eventList.forEach(function (eventName) { 5937 element.addEventListener(eventName, tapHandler, { 5938 passive: false 5939 }); 5940 }); 5941} 5942 5943function removeEvents(element, eventList, interactionType) { 5944 var tapHandler = interactionType ? handleTapMouse : handleTapTouch; 5945 eventList.forEach(function (eventName) { 5946 element.removeEventListener(eventName, tapHandler); 5947 }); 5948} 5949 5950var mouseEvents = ['mousedown', 'mouseup']; 5951var touchEvents = ['touchstart', 'touchend']; 5952 5953function disable(element) { 5954 removeEvents(element, mouseEvents, pointerType.mouse); 5955 removeEvents(element, touchEvents, pointerType.touch); 5956} 5957 5958function enable(element) { 5959 disable(element); 5960 attachEvents(element, mouseEvents, pointerType.mouse); 5961 attachEvents(element, touchEvents, pointerType.touch); 5962} 5963 5964/* harmony default export */ __webpack_exports__["default"] = ({ 5965 enable: enable, 5966 disable: disable 5967}); 5968 5969/***/ }), 5970
5971/***/ "./eventListeners/touchEventListeners.js": 5972/*!***********************************************!*\ 5973 !*** ./eventListeners/touchEventListeners.js ***! 5974 \***********************************************/ 5975/*! exports provided: default */ 5976/***/ (function(module, __webpack_exports__, __webpack_require__) { 5977 5978"use strict"; 5979__webpack_require__.r(__webpack_exports__); 5980/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../events.js */ "./events.js"); 5981/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js"); 5982/* harmony import */ var _util_copyPoints_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../util/copyPoints.js */ "./util/copyPoints.js"); 5983/* harmony import */ var _preventGhostClick_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./preventGhostClick.js */ "./eventListeners/preventGhostClick.js"); 5984/* harmony import */ var _util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../util/triggerEvent.js */ "./util/triggerEvent.js"); 5985/* harmony import */ var _toolOptions_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../toolOptions.js */ "./toolOptions.js"); 5986 5987 5988 5989 5990 5991 5992var startPoints, currentPoints, lastPoints, deltaPoints, eventData, touchStartDelay, pressTimeout, pageDistanceMoved; 5993var lastScale = 1.0, 5994 lastRotation = 0.0, 5995 preventNextPinch = false, 5996 isPress = false, 5997 lastDelta; 5998var pressDelay = 700, 5999 pressMaxDistance = 5; 6000var toolType = 'touchInput'; 6001 6002function onTouch(e) { 6003 var element = e.currentTarget || e.srcEvent.currentTarget; 6004 var enabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getEnabledElement(element); 6005 6006 if (!enabledElement.image) { 6007 return; 6008 } 6009 6010 var eventType, scaleChange, delta, remainingPointers, rotation; // Prevent mouse events from occurring alongside touch events 6011 6012 e.preventDefault(); // If more than one finger is placed on the element, stop the press t
6012imeout 6013 6014 if (e.pointers && e.pointers.length > 1 || e.touches && e.touches.length > 1) { 6015 isPress = false; 6016 clearTimeout(pressTimeout); 6017 } 6018 6019 switch (e.type) { 6020 case 'tap': 6021 isPress = false; 6022 clearTimeout(pressTimeout); // Calculate our current points in page and image coordinates 6023 6024 currentPoints = { 6025 page: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.pageToPoint(e.pointers[0]), 6026 image: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pageToPixel(element, e.pointers[0].pageX, e.pointers[0].pageY), 6027 client: { 6028 x: e.pointers[0].clientX, 6029 y: e.pointers[0].clientY 6030 } 6031 }; 6032 currentPoints.canvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pixelToCanvas(element, currentPoints.image); 6033 eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TAP; 6034 eventData = { 6035 event: e, 6036 viewport: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getViewport(element), 6037 image: enabledElement.image, 6038 element: element, 6039 currentPoints: currentPoints, 6040 type: eventType, 6041 isTouchEvent: true 6042 }; 6043 Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_4__["default"])(element, eventType, eventData); 6044 break; 6045 6046 case 'doubletap': 6047 isPress = false; 6048 clearTimeout(pressTimeout); // Calculate our current points in page and image coordinates 6049 6050 currentPoints = { 6051 page: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.pageToPoint(e.pointers[0]), 6052 image: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pageToPixel(element, e.pointers[0].pageX, e.pointers[0].pageY), 6053 client: { 6054 x: e.pointers[0].clientX, 6055 y: e.pointers[0].clientY 6056 } 6057 }; 6058 currentPoints.canvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pixelToCanvas(element, currentPoints.image); 6059 eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].DOUBLE_TAP; 6060 eventData = { 6061 event: e, 6062 viewport: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getViewport(element), 6063 image: enabledElement.image, 6064 element: element, 6065 currentPoints: currentPoints, 6066 type: eventType, 6067 isTouchEvent: true 6068 }; 6069 Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_4__["default"])(element, eventType, eventData); 6070 break; 6071 6072 case 'pinchstart': 6073 isPress = false; 6074 clearTimeout(pressTimeout); 6075 lastScale = 1.0; 6076 break; 6077 6078 case 'pinchmove': 6079 isPress = false; 6080 clearTimeout(pressTimeout); 6081 6082 if (preventNextPinch === true) { 6083 lastScale = e.scale; 6084 preventNextPinch = false; 6085 break; 6086 } 6087 6088 scaleChange = (e.scale - lastScale) / lastScale; 6089 startPoints = { 6090 page: e.center, 6091 image: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pageToPixel(element, e.center.x, e.center.y) 6092 }; 6093 startPoints.canvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pixelToCanvas(element, startPoints.image); 6094 eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_PINCH; 6095 eventData = { 6096 event: e, 6097 startPoints: startPoints, 6098 viewport: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getViewport(element), 6099 image: enabledElement.image, 6100 element: element, 6101 direction: e.scale < 1 ? 1 : -1, 6102 scaleChange: scaleChange, 6103 type: eventType, 6104 isTouchEvent: true 6105 }; 6106 Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_4__["default"])(element, eventType, eventData); 6107 lastScale = e.scale; 6108 break; 6109 6110 case 'touchstart': 6111 lastScale = 1.0; 6112 clearTimeout(pressTimeout); 6113 clearTimeout(touchStartDelay); 6114 touchStartDelay = setTimeout(function () { 6115 startPoints = { 6116 page: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.pageToPoint(e.touches[0]), 6117 image: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pageToPixel(element, e.touches[0].pageX, e.touches[0].pageY), 6118 client: { 6119 x: e.touches[0].clientX, 6120 y: e.touches[0].clientY 6121 } 6122 }; 6123 startPoints.canvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pixelToCanvas(element, startPoints.image); 6124 eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_START; 6125 6126 if (e.touches.length > 1) { 6127 eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MULTI_TOUCH_START; 6128 } 6129 6130 eventData = { 6131 event: e, 6132 viewport: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getViewport(element), 6133 image: enabledElement.image, 6134 element: element, 6135 startPoints: startPoints, 6136 currentPoints: startPoints, 6137 type: eventType, 6138 isTouchEvent: true 6139 }; 6140 var eventPropagated = Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_4__["default"])(element, eventType, eventData); 6141 6142 if (eventPropagated === true) { 6143 // IsPress = false;
6144 // ClearTimeout(pressTimeout); 6145 // No current tools responded to the drag action. 6146 // Create new tool measurement 6147 eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_START_ACTIVE; 6148 6149 if (e.touches.length > 1) { 6150 eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MULTI_TOUCH_START_ACTIVE; 6151 } 6152 6153 eventData.type = eventType; 6154 Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_4__["default"])(element, eventType, eventData); 6155 } // Console.log(eventType); 6156 6157 6158 lastPoints = Object(_util_copyPoints_js__WEBPACK_IMPORTED_MODULE_2__["default"])(startPoints); 6159 }, 50); 6160 isPress = true; 6161 pageDistanceMoved = 0; 6162 pressTimeout = setTimeout(function () { 6163 if (!isPress) { 6164 return; 6165 } 6166 6167 currentPoints = { 6168 page: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.pageToPoint(e.touches[0]), 6169 image: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pageToPixel(element, e.touches[0].pageX, e.touches[0].pageY), 6170 client: { 6171 x: e.touches[0].clientX, 6172 y: e.touches[0].clientY 6173 } 6174 }; 6175 currentPoints.canvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pixelToCanvas(element, startPoints.image); 6176 eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_PRESS; 6177 eventData = { 6178 event: e, 6179 viewport: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getViewport(element), 6180 image: enabledElement.image, 6181 element: element, 6182 currentPoints: currentPoints, 6183 type: eventType, 6184 isTouchEvent: true 6185 }; 6186 Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_4__["default"])(element, eventType, eventData); // Console.log(eventType); 6187 }, pressDelay); 6188 break; 6189 6190 case 'touchend': 6191 lastScale = 1.0; 6192 isPress = false; 6193 clearTimeout(pressTimeout); 6194 setTimeout(function () { 6195 startPoints = { 6196 page: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.pageToPoint(e.changedTouches[0]), 6197 image: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pageToPixel(element, e.changedTouches[0].pageX, e.changedTouches[0].pageY), 6198 client: { 6199 x: e.changedTouches[0].clientX, 6200 y: e.changedTouches[0].clientY 6201 } 6202 }; 6203 startPoints.canvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pixelToCanvas(element, startPoints.image); 6204 eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_END; 6205 eventData = { 6206 event: e, 6207 viewport: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getViewport(element), 6208 image: enabledElement.image, 6209 element: element, 6210 startPoints: startPoints, 6211 currentPoints: startPoints, 6212 type: eventType, 6213 isTouchEvent: true 6214 }; 6215 Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_4__["default"])(element, eventType, eventData); 6216 }, 50); 6217 break; 6218 6219 case 'panmove': 6220 // Using the delta-value of HammerJS, because it takes all pointers into account 6221 // This is very important when using panning in combination with pinch-zooming 6222 // But HammerJS' delta is relative to the start of the pan event 6223 // So it needs to be converted to a per-event-delta for CornerstoneTools 6224 delta = { 6225 x: e.deltaX - lastDelta.x, 6226 y: e.deltaY - lastDelta.y 6227 }; 6228 lastDelta = { 6229 x: e.deltaX, 6230 y: e.deltaY 6231 }; // Calculate our current points in page and image coordinates 6232 6233 currentPoints = { 6234 page: { 6235 x: lastPoints.page.x + delta.x, 6236 y: lastPoints.page.y + delta.y 6237 }, 6238 image: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pageToPixel(element, lastPoints.page.x + delta.x, lastPoints.page.y + delta.y), 6239 client: { 6240 x: lastPoints.client.x + delta.x, 6241 y: lastPoints.client.y + delta.y 6242 } 6243 }; 6244 currentPoints.canvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pixelToCanvas(element, currentPoints.image); // Calculate delta values in page and image coordinates 6245 6246 deltaPoints = { 6247 page: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.subtract(currentPoints.page, lastPoints.page), 6248 image: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.subtract(currentPoints.image, lastPoints.image), 6249 client: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.subtract(currentPoints.client, lastPoints.client), 6250 canvas: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.subtract(currentPoints.canvas, lastPoints.canvas) 6251 }; 6252 pageDistanceMoved += Math.sqrt(deltaPoints.page.x * deltaPoints.page.x + deltaPoints.page.y * deltaPoints.page.y); // Console.log("pageDistanceMoved: " + pageDistanceMoved); 6253 6254 if (pageDistanceMoved > pressMaxDistance) { 6255 // Console.log('Press event aborted due to movement'); 6256 isPress = false;
6257 clearTimeout(pressTimeout); 6258 } 6259 6260 eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_DRAG; 6261 6262 if (e.pointers.length > 1) { 6263 eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MULTI_TOUCH_DRAG; 6264 } 6265 6266 eventData = { 6267 viewport: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getViewport(element), 6268 image: enabledElement.image, 6269 element: element, 6270 startPoints: startPoints, 6271 lastPoints: lastPoints, 6272 currentPoints: currentPoints, 6273 deltaPoints: deltaPoints, 6274 numPointers: e.pointers.length, 6275 type: eventType, 6276 isTouchEvent: true 6277 }; 6278 Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_4__["default"])(element, eventType, eventData); 6279 lastPoints = Object(_util_copyPoints_js__WEBPACK_IMPORTED_MODULE_2__["default"])(currentPoints); 6280 break; 6281 6282 case 'panstart': 6283 lastDelta = { 6284 x: e.deltaX, 6285 y: e.deltaY 6286 }; 6287 currentPoints = { 6288 page: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.pageToPoint(e.pointers[0]), 6289 image: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pageToPixel(element, e.pointers[0].pageX, e.pointers[0].pageY), 6290 client: { 6291 x: e.pointers[0].clientX, 6292 y: e.pointers[0].clientY 6293 } 6294 }; 6295 currentPoints.canvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pixelToCanvas(element, currentPoints.image); 6296 lastPoints = Object(_util_copyPoints_js__WEBPACK_IMPORTED_MODULE_2__["default"])(currentPoints); 6297 break; 6298 6299 case 'panend': 6300 isPress = false; 6301 clearTimeout(pressTimeout); // If lastPoints is not yet set, it means panend fired without panstart or pan, 6302 // So we can ignore this event 6303 6304 if (!lastPoints) { 6305 return false; 6306 } 6307 6308 currentPoints = { 6309 page: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.pageToPoint(e.pointers[0]), 6310 image: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pageToPixel(element, e.pointers[0].pageX, e.pointers[0].pageY), 6311 client: { 6312 x: e.pointers[0].clientX, 6313 y: e.pointers[0].clientY 6314 } 6315 }; 6316 currentPoints.canvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pixelToCanvas(element, currentPoints.image); // Calculate delta values in page and image coordinates 6317 6318 deltaPoints = { 6319 page: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.subtract(currentPoints.page, lastPoints.page), 6320 image: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.subtract(currentPoints.image, lastPoints.image), 6321 client: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.subtract(currentPoints.client, lastPoints.client), 6322 canvas: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.subtract(currentPoints.canvas, lastPoints.canvas) 6323 }; 6324 eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_DRAG_END; 6325 eventData = { 6326 event: e.srcEvent, 6327 viewport: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getViewport(element), 6328 image: enabledElement.image, 6329 element: element, 6330 startPoints: startPoints, 6331 lastPoints: lastPoints, 6332 currentPoints: currentPoints, 6333 deltaPoints: deltaPoints, 6334 type: eventType, 6335 isTouchEvent: true 6336 }; 6337 Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_4__["default"])(element, eventType, eventData); 6338 remainingPointers = e.pointers.length - e.changedPointers.length; 6339 6340 if (remainingPointers === 2) { 6341 preventNextPinch = true; 6342 } 6343 6344 break; 6345 6346 case 'rotatemove': 6347 isPress = false; 6348 clearTimeout(pressTimeout); 6349 rotation = e.rotation - lastRotation; 6350 lastRotation = e.rotation; 6351 eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_ROTATE; 6352 eventData = { 6353 event: e.srcEvent, 6354 viewport: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getViewport(element), 6355 image: enabledElement.image, 6356 element: element, 6357 rotation: rotation, 6358 type: eventType 6359 }; 6360 Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_4__["default"])(element, eventType, eventData); 6361 break; 6362 } 6363 6364 return false;
6365} 6366 6367function enable(element) { 6368 disable(element); 6369 var Hammer = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].Hammer; 6370 var hammerOptions = { 6371 inputClass: Hammer.SUPPORT_POINTER_EVENTS ? Hammer.PointerEventInput : Hammer.TouchInput 6372 }; 6373 var mc = new Hammer.Manager(element, hammerOptions); 6374 var panOptions = { 6375 pointers: 0, 6376 direction: Hammer.DIRECTION_ALL, 6377 threshold: 0 6378 }; 6379 var pan = new Hammer.Pan(panOptions); 6380 var pinch = new Hammer.Pinch({ 6381 threshold: 0 6382 }); 6383 var rotate = new Hammer.Rotate({ 6384 threshold: 0 6385 }); 6386 pinch.recognizeWith(pan); 6387 pinch.recognizeWith(rotate); 6388 rotate.recognizeWith(pan); 6389 var doubleTap = new Hammer.Tap({ 6390 event: 'doubletap', 6391 taps: 2, 6392 interval: 1500, 6393 threshold: 50, 6394 posThreshold: 50 6395 }); 6396 doubleTap.recognizeWith(pan); // Add to the Manager 6397 6398 mc.add([doubleTap, pan, rotate, pinch]); 6399 mc.on('tap doubletap panstart panmove panend pinchstart pinchmove rotatemove', onTouch); 6400 _preventGhostClick_js__WEBPACK_IMPORTED_MODULE_3__["default"].enable(element); 6401 var touchEvents = ['touchstart', 'touchend']; 6402 touchEvents.forEach(function (eventType) { 6403 element.addEventListener(eventType, onTouch, { 6404 passive: false 6405 }); 6406 }); 6407 var options = Object(_toolOptions_js__WEBPACK_IMPORTED_MODULE_5__["getToolOptions"])(toolType, element); 6408 options.hammer = mc; 6409 Object(_toolOptions_js__WEBPACK_IMPORTED_MODULE_5__["setToolOptions"])(toolType, element, options); 6410} 6411 6412function disable(element) { 6413 _preventGhostClick_js__WEBPACK_IMPORTED_MODULE_3__["default"].disable(element); 6414 var touchEvents = ['touchstart', 'touchend']; 6415 touchEvents.forEach(function (eventType) { 6416 element.removeEventListener(eventType, onTouch); 6417 }); 6418 var options = Object(_toolOptions_js__WEBPACK_IMPORTED_MODULE_5__["getToolOptions"])(toolType, element); 6419 var mc = options.hammer; 6420 6421 if (mc) { 6422 mc.off('tap doubletap panstart panmove panend pinchstart pinchmove rotatemove', onTouch); 6423 } 6424} // Module exports 6425 6426 6427var touchInput = { 6428 enable: enable, 6429 disable: disable 6430}; 6431/* harmony default export */ __webpack_exports__["default"] = (touchInput); 6432 6433/***/ }), 6434
6435/***/ "./eventListeners/wheelEventListener.js": 6436/*!**********************************************!*\ 6437 !*** ./eventListeners/wheelEventListener.js ***! 6438 \**********************************************/ 6439/*! exports provided: default */ 6440/***/ (function(module, __webpack_exports__, __webpack_require__) { 6441 6442"use strict"; 6443__webpack_require__.r(__webpack_exports__); 6444/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../events.js */ "./events.js"); 6445/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js"); 6446/* harmony import */ var _util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../util/triggerEvent.js */ "./util/triggerEvent.js"); 6447/* harmony import */ var _internals_normalizeWheel_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./internals/normalizeWheel.js */ "./eventListeners/internals/normalizeWheel.js"); 6448/** 6449 * Internal module used to turn on listening, handling, and normalizing of the 6450 * native `wheel` event 6451 */ 6452 6453 6454 6455 6456/** 6457 * 6458 * @private 6459 * @function wheelEventHandler 6460 * @param {WheelEvent} evt 6461 * @returns {undefined} 6462 */ 6463 6464function wheelEventHandler(evt) { 6465 var element = evt.currentTarget; 6466 var enabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getEnabledElement(element); 6467 6468 if (!enabledElement.image) { 6469 return; 6470 } // Prevent triggering MouseWheel events that are not real scroll events: 6471 // E.g. when clicking the MiddleMouseWheelButton, a deltaY of 0 is emitted. 6472 // See https://github.com/cornerstonejs/cornerstoneTools/issues/935 6473 6474 6475 if (evt.deltaY > -1 && evt.deltaY < 1) { 6476 return; 6477 } 6478 6479 evt.preventDefault(); 6480 var pageX = evt.pageX, 6481 pageY = evt.pageY; 6482 var startingCoords = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pageToPixel(element, pageX, pageY); 6483 6484 var _normalizeWheel = Object(_internals_normalizeWheel_js__WEBPACK_IMPORTED_MODULE_3__["default"])(evt), 6485 spinX = _normalizeWheel.spinX, 6486 spinY = _normalizeWheel.spinY, 6487 pixelX = _normalizeWheel.pixelX, 6488 pixelY = _normalizeWheel.pixelY; 6489 6490 var direction = spinY < 0 ? -1 : 1; 6491 var mouseWheelData = { 6492 element: element, 6493 viewport: _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getViewport(element), 6494 detail: evt, 6495 image: enabledElement.image, 6496 direction: direction, 6497 spinX: spinX, 6498 spinY: spinY, 6499 pixelX: pixelX, 6500 pixelY: pixelY, 6501 pageX: pageX, 6502 pageY: pageY, 6503 imageX: startingCoords.x, 6504 imageY: startingCoords.y 6505 }; 6506 Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_2__["default"])(element, _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_WHEEL, mouseWheelData); 6507} 6508/** 6509 * Listens for the wheel event, and handles it. Handled event 6510 * will be "normalized" and re-emitted as `EVENTS.MOUSE_WHEEL` 6511 * 6512 * @private 6513 * @param {HTMLElement} element 6514 * @returns {undefined} 6515 */ 6516 6517 6518function enable(element) { 6519 disable(element); 6520 element.addEventListener('wheel', wheelEventHandler, { 6521 passive: false 6522 }); 6523} 6524/** 6525 * Removes listener and handler for wheel event. `EVENTS.MOUSE_WHEEL` 6526 * will no longer be emitted. 6527 * 6528 * @private 6529 * @param {HTMLElement} element 6530 * @returns {undefined} 6531 */ 6532 6533 6534function disable(element) { 6535 element.removeEventListener('wheel', wheelEventHandler, { 6536 passive: false 6537 }); 6538} 6539 6540/* harmony default export */ __webpack_exports__["default"] = ({ 6541 enable: enable, 6542 disable: disable 6543}); 6544 6545/***/ }), 6546
6547/***/ "./eventListeners/windowResizeHandler.js": 6548/*!***********************************************!*\ 6549 !*** ./eventListeners/windowResizeHandler.js ***! 6550 \***********************************************/ 6551/*! exports provided: forceEnabledElementResize, default */ 6552/***/ (function(module, __webpack_exports__, __webpack_require__) { 6553 6554"use strict"; 6555__webpack_require__.r(__webpack_exports__); 6556/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "forceEnabledElementResize", function() { return forceEnabledElementResize; }); 6557/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../store/index.js */ "./store/index.js"); 6558/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./../externalModules.js */ "./externalModules.js"); 6559 6560 6561 6562var enable = function enable() { 6563 disable(); // Clean up any lingering listeners 6564 6565 window.addEventListener('resize', resizeThrottler, false); 6566}; 6567 6568var disable = function disable() { 6569 window.removeEventListener('resize', resizeThrottler, false); 6570}; 6571 6572var resizeTimeout; 6573 6574function resizeThrottler() { 6575 // Ignore resize events as long as an actualResizeHandler execution is in the queue 6576 if (!resizeTimeout) { 6577 resizeTimeout = setTimeout(function () { 6578 resizeTimeout = null; 6579 forceEnabledElementResize(); // The actualResizeHandler will execute at a rate of 15fps 6580 }, 66); 6581 } 6582} 6583 6584var forceEnabledElementResize = function forceEnabledElementResize() { 6585 _store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].enabledElements.forEach(function (element) { 6586 _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.resize(element); 6587 }); 6588}; 6589/* harmony default export */ __webpack_exports__["default"] = ({ 6590 enable: enable, 6591 disable: disable 6592}); 6593 6594/***/ }), 6595
6596/***/ "./events.js": 6597/*!*******************!*\ 6598 !*** ./events.js ***! 6599 \*******************/ 6600/*! exports provided: default */ 6601/***/ (function(module, __webpack_exports__, __webpack_require__) { 6602 6603"use strict"; 6604__webpack_require__.r(__webpack_exports__); 6605/** 6606 * Enumerates the events for CornestoneTools. Native events are captured, 6607 * normalized, and re-triggered with a `cornerstonetools` prefix. This allows 6608 * us to handle events consistently across different browsers. 6609 * 6610 * @enum {String} 6611 * @memberof CornerstoneTools 6612 * @readonly 6613 */ 6614var EVENTS = { 6615 // 6616 // MOUSE 6617 // 6618 6619 /** 6620 * https://developer.mozilla.org/en-US/docs/Web/Events/mousedown 6621 * @type {String} 6622 */ 6623 MOUSE_DOWN: 'cornerstonetoolsmousedown', 6624 6625 /** 6626 * https://developer.mozilla.org/en-US/docs/Web/Events/mouseup 6627 * @type {String} 6628 */ 6629 MOUSE_UP: 'cornerstonetoolsmouseup', 6630 6631 /** 6632 * Is fired if a handled `MOUSE_DOWN` event does not `stopPropagation`. The hook 6633 * we use to create new measurement data for mouse events. 6634 * @type {String} 6635 */ 6636 MOUSE_DOWN_ACTIVATE: 'cornerstonetoolsmousedownactivate', 6637 6638 /** 6639 * https://developer.mozilla.org/en-US/docs/Web/Events/drag 6640 * @type {String} 6641 */ 6642 MOUSE_DRAG: 'cornerstonetoolsmousedrag', 6643 6644 /** 6645 * https://developer.mozilla.org/en-US/docs/Web/Events/mousemove 6646 * @type {String} 6647 */ 6648 MOUSE_MOVE: 'cornerstonetoolsmousemove', 6649 6650 /** 6651 * https://developer.mozilla.org/en-US/docs/Web/Events/click 6652 * @type {String} 6653 */ 6654 MOUSE_CLICK: 'cornerstonetoolsmouseclick', 6655 6656 /** 6657 * https://developer.mozilla.org/en-US/docs/Web/Events/dblclick 6658 * @type {String} 6659 */ 6660 MOUSE_DOUBLE_CLICK: 'cornerstonetoolsmousedoubleclick', 6661 6662 /** 6663 * https://developer.mozilla.org/en-US/docs/Web/Events/wheel 6664 * @type {String} 6665 */ 6666 MOUSE_WHEEL: 'cornerstonetoolsmousewheel', 6667 // 6668 // TOUCH 6669 // 6670 6671 /** 6672 * https://developer.mozilla.org/en-US/docs/Web/Events/touchstart 6673 * @type {String} 6674 */ 6675 TOUCH_START: 'cornerstonetoolstouchstart', 6676 6677 /** 6678 * Is fired if a handled `TOUCH_START` event does not `stopPropagation`. The hook 6679 * we use to create new measurement data for touch events. 6680 * @type {String} 6681 */ 6682 TOUCH_START_ACTIVE: 'cornerstonetoolstouchstartactive', 6683 6684 /** 6685 * @type {String} 6686 */ 6687 TOUCH_END: 'cornerstonetoolstouchend', 6688 6689 /** 6690 * @type {String} 6691 */ 6692 TOUCH_DRAG: 'cornerstonetoolstouchdrag', 6693 6694 /** 6695 * @type {String} 6696 */ 6697 TOUCH_DRAG_END: 'cornerstonetoolstouchdragend', 6698 6699 /** 6700 * http://hammerjs.github.io/recognizer-pinch/ 6701 * @type {String} 6702 */ 6703 TOUCH_PINCH: 'cornerstonetoolstouchpinch', 6704 6705 /** 6706 * http://hammerjs.github.io/recognizer-rotate/ 6707 * @type {String} 6708 */ 6709 TOUCH_ROTATE: 'cornerstonetoolstouchrotate', 6710 6711 /** 6712 * http://hammerjs.github.io/recognizer-press/ 6713 * @type {String} 6714 */ 6715 TOUCH_PRESS: 'cornerstonetoolstouchpress', 6716 6717 /** 6718 * http://hammerjs.github.io/recognizer-tap/ 6719 * @type {String} 6720 */ 6721 TAP: 'cornerstonetoolstap', 6722 6723 /** 6724 * @type {String} 6725 */ 6726 DOUBLE_TAP: 'cornerstonetoolsdoubletap', 6727 6728 /** 6729 * @type {String} 6730 */ 6731 MULTI_TOUCH_START: 'cornerstonetoolsmultitouchstart', 6732 6733 /** 6734 * @type {String} 6735 */ 6736 MULTI_TOUCH_START_ACTIVE: 'cornerstonetoolsmultitouchstartactive', 6737 6738 /** 6739 * @type {String} 6740 */ 6741 MULTI_TOUCH_DRAG: 'cornerstonetoolsmultitouchdrag', 6742 // 6743 // KEYBOARD 6744 // 6745 6746 /** 6747 * https://developer.mozilla.org/en-US/docs/Web/Events/keydown 6748 * @type {String} 6749 */ 6750 KEY_DOWN: 'cornerstonetoolskeydown', 6751 6752 /** 6753 * https://developer.mozilla.org/en-US/docs/Web/Events/keyup 6754 * @type {String} 6755 */ 6756 KEY_UP: 'cornerstonetoolskeyup', 6757 6758 /** 6759 * https://developer.mozilla.org/en-US/docs/Web/Events/keypress 6760 * @type {String} 6761 */ 6762 KEY_PRESS: 'cornerstonetoolskeypress', 6763 // 6764 // CUSTOM 6765 // 6766 6767 /** 6768 * @type {String} 6769 */ 6770 MEASUREMENT_ADDED: 'cornerstonetoolsmeasurementadded', 6771 6772 /** 6773 * @type {String} 6774 */ 6775 MEASUREMENT_MODIFIED: 'cornerstonetoolsmeasurementmodified', 6776 6777 /** 6778 * @type {String} 6779 */ 6780 MEASUREMENT_COMPLETED: 'cornerstonetoolsmeasurementcompleted', 6781 6782 /** 6783 * @type {String} 6784 */ 6785 MEASUREMENT_REMOVED: 'cornerstonetoolsmeasurementremoved', 6786 6787 /** 6788 * @type {String} 6789 */ 6790 TOOL_DEACTIVATED: 'cornerstonetoolstooldeactivated', 6791 6792 /** 6793 * @type {String} 6794 */ 6795 CLIP_STOPPED: 'cornerstonetoolsclipstopped', 6796 6797 /** 6798 * @type {String} 6799 */ 6800 STACK_SCROLL: 'cornerstonetoolsstackscroll' 6801}; 6802/* harmony default export */ __webpack_exports__["default"] = (EVENTS); 6803 6804/***/ }), 6805
6806/***/ "./externalModules.js": 6807/*!****************************!*\ 6808 !*** ./externalModules.js ***! 6809 \****************************/ 6810/*! exports provided: default */ 6811/***/ (function(module, __webpack_exports__, __webpack_require__) { 6812 6813"use strict"; 6814__webpack_require__.r(__webpack_exports__); 6815var cornerstone = window.cornerstone; 6816var cornerstoneMath = window.cornerstoneMath; 6817var Hammer = window.Hammer; 6818/* harmony default export */ __webpack_exports__["default"] = ({ 6819 set cornerstone(cs) { 6820 cornerstone = cs; 6821 }, 6822 6823 get cornerstone() { 6824 return cornerstone; 6825 }, 6826 6827 set cornerstoneMath(cm) { 6828 cornerstoneMath = cm; 6829 }, 6830 6831 get cornerstoneMath() { 6832 return cornerstoneMath; 6833 }, 6834 6835 set Hammer(module) { 6836 Hammer = module; 6837 }, 6838 6839 get Hammer() { 6840 return Hammer; 6841 } 6842 6843}); 6844 6845/***/ }), 6846
6847/***/ "./import.js": 6848/*!*******************!*\ 6849 !*** ./import.js ***! 6850 \*******************/ 6851/*! exports provided: default */ 6852/***/ (function(module, __webpack_exports__, __webpack_require__) { 6853 6854"use strict"; 6855__webpack_require__.r(__webpack_exports__); 6856/* harmony import */ var _lib_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./lib.js */ "./lib.js"); 6857 6858/** 6859 * Imports functionality from cornerstoneTools for use in external packages/plugins. 6860 * @export 6861 * @public 6862 * @method 6863 * @name import 6864 * 6865 * @param {string} uri the import path for the entity to import. 6866 * @returns {Class|Object|Function} The entity requested. 6867 */ 6868 6869/* harmony default export */ __webpack_exports__["default"] = (function (uri) { 6870 return _lib_js__WEBPACK_IMPORTED_MODULE_0__["lib"][uri]; 6871}); 6872 6873/***/ }), 6874
6875/***/ "./index.js": 6876/*!******************!*\ 6877 !*** ./index.js ***! 6878 \******************/ 6879/*! exports provided: AngleTool, ArrowAnnotateTool, BidirectionalTool, CircleRoiTool, CobbAngleTool, EllipticalRoiTool, FreehandMouseTool, LengthTool, ProbeTool, RectangleRoiTool, TextMarkerTool, BrushTool, CrosshairsTool, DoubleTapFitToWindowTool, DragProbeTool, EraserTool, FreehandSculpterMouseTool, MagnifyTool, PanMultiTouchTool, PanTool, ReferenceLinesTool, RotateTool, RotateTouchTool, ScaleOverlayTool, StackScrollMouseWheelTool, StackScrollMultiTouchTool, StackScrollTool, WwwcRegionTool, WwwcTool, ZoomMouseWheelTool, ZoomTool, ZoomTouchPinchTool, init, stackPrefetch, stackRenderers, playClip, stopClip, store, getToolForElement, addTool, addToolForElement, removeTool, removeToolForElement, setToolOptions, setToolOptionsForElement, setToolActive, setToolActiveForElement, setToolEnabled, setToolEnabledForElement, setToolDisabled, setToolDisabledForElement, setToolPassive, setToolPassiveForElement, addToolState, getToolState, removeToolState, clearToolState, setElementToolStateManager, getElementToolStateManager, textStyle, toolStyle, toolColors, toolCoordinates, stackSpecificStateManager, newStackSpecificToolStateManager, addStackStateManager, loadHandlerManager, newImageIdSpecificToolStateManager, globalImageIdSpecificToolStateManager, newFrameOfReferenceSpecificToolStateManager, globalFrameOfReferenceSpecificToolStateManager, forceEnabledElementResize, orientation, SaveAs, enableLogger, disableLogger, register, registerSome, wwwcSynchronizer, updateImageSynchronizer, Synchronizer, stackScrollSynchronizer, stackImagePositionSynchronizer, stackImagePositionOffsetSynchronizer, stackImageIndexSynchronizer, panZoomSynchronizer, requestPoolManager, external, EVENTS, version, import, default */ 6880/***/ (function(module, __webpack_exports__, __webpack_require__) { 6881 6882"use strict"; 6883__webpack_require__.r(__webpack_exports__); 6884/* harmony import */ var _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./tools/annotation/index.js */ "./tools/annotation/index.js"); 6885/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "AngleTool", function() { return _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["AngleTool"]; }); 6886 6887/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ArrowAnnotateTool", function() { return _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["ArrowAnnotateTool"]; }); 6888 6889/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "BidirectionalTool", function() { return _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["BidirectionalTool"]; }); 6890 6891/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "CircleRoiTool", function() { return _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["CircleRoiTool"]; }); 6892 6893/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "CobbAngleTool", function() { return _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["CobbAngleTool"]; }); 6894 6895/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "EllipticalRoiTool", function() { return _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["EllipticalRoiTool"]; }); 6896 6897/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FreehandMouseTool", function() { return _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["FreehandMouseTool"]; }); 6898 6899/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "LengthTool", function() { return _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["LengthTool"]; }); 6900 6901/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ProbeTool", function() { return _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["ProbeTool"]; }); 6902 6903/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "RectangleRoiTool", function() { return _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["RectangleRoiTool"]; }); 6904 6905/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "TextMarkerTool", function() { return _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["TextMarkerTool"]; }); 6906 6907/* harmony import */ var _tools_brush_index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tools/brush/index.js */ "./tools/brush/index.js"); 6908/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "BrushTool", function() { return _tools_brush_index_js__WEBPACK_IMPORTED_MODULE_1__["BrushTool"]; }); 6909 6910/* harmony import */ var _tools_index_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools/index.js */ "./tools/index.js"); 6911/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "CrosshairsTool", function() { return _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["CrosshairsTool"]; }); 6912 6913/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "DoubleTapFitToWindowTool", function() { return _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["DoubleTapFitToWindowTool"]; }); 6914 6915/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "DragProbeTool", function() { return _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["DragProbeTool"]; }); 6916 6917/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "EraserTool", function() { return _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["
6917EraserTool"]; }); 6918 6919/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FreehandSculpterMouseTool", function() { return _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["FreehandSculpterMouseTool"]; }); 6920 6921/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "MagnifyTool", function() { return _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["MagnifyTool"]; }); 6922 6923/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "PanMultiTouchTool", function() { return _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["PanMultiTouchTool"]; }); 6924 6925/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "PanTool", function() { return _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["PanTool"]; }); 6926 6927/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ReferenceLinesTool", function() { return _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["ReferenceLinesTool"]; }); 6928 6929/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "RotateTool", function() { return _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["RotateTool"]; }); 6930 6931/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "RotateTouchTool", function() { return _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["RotateTouchTool"]; }); 6932 6933/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ScaleOverlayTool", function() { return _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["ScaleOverlayTool"]; }); 6934 6935/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "StackScrollMouseWheelTool", function() { return _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["StackScrollMouseWheelTool"]; }); 6936 6937/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "StackScrollMultiTouchTool", function() { return _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["StackScrollMultiTouchTool"]; }); 6938 6939/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "StackScrollTool", function() { return _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["StackScrollTool"]; }); 6940 6941/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "WwwcRegionTool", function() { return _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["WwwcRegionTool"]; }); 6942 6943/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "WwwcTool", function() { return _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["WwwcTool"]; }); 6944 6945/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ZoomMouseWheelTool", function() { return _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["ZoomMouseWheelTool"]; }); 6946 6947/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ZoomTool", function() { return _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["ZoomTool"]; }); 6948 6949/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ZoomTouchPinchTool", function() { return _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["ZoomTouchPinchTool"]; }); 6950 6951/* harmony import */ var _import_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./import.js */ "./import.js"); 6952/* harmony import */ var _init_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./init.js */ "./init.js"); 6953/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "init", function() { return _init_js__WEBPACK_IMPORTED_MODULE_4__["default"]; }); 6954 6955/* harmony import */ var _stackTools_stackPrefetch_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./stackTools/stackPrefetch.js */ "./stackTools/stackPrefetch.js"); 6956/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stackPrefetch", function() { return _stackTools_stackPrefetch_js__WEBPACK_IMPORTED_MODULE_5__["default"]; }); 6957 6958/* harmony import */ var _stackTools_stackRenderers_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./stackTools/stackRenderers.js */ "./stackTools/stackRenderers.js"); 6959/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stackRenderers", function() { return _stackTools_stackRenderers_js__WEBPACK_IMPORTED_MODULE_6__["default"]; }); 6960 6961/* harmony import */ var _stackTools_playClip_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./stackTools/playClip.js */ "./stackTools/playClip.js"); 6962/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "playClip", function() { return _stackTools_playClip_js__WEBPACK_IMPORTED_MODULE_7__["playClip"]; }); 6963 6964/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stopClip", function() { return _stackTools_playClip_js__WEBPACK_IMPORTED_MODULE_7__["stopClip"]; }); 6965 6966/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./store/index.js */ "./store/index.js"); 6967/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "store", function() { return _store_index_js__WEBPACK_IMPORTED_MODULE_8__["default"]; }); 6968 6969/* harmony import */ var _store_getToolForElement_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./store/getToolForElement.js */ "./store/getToolForElement.js"); 6970/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getToolForElement", function() { return _store_getToolForElement_js__WEBPACK_IMPORTED_MODULE_9__["default"]; }); 6971 6972/* harmony import */ var _store_addTool_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./store/addTool.js */ "./store/addTool.js"); 6973/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "addTool", function() { return _store_addTool_js__WEBPACK_IMPORTED_MODULE_10__["addTool"]; }); 6974 6975/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "addToolForElement", function() { return _store_addTool_js__WEBPACK_IMPORTED_MODULE_10__["addToolForElement"]; }); 6976 6977/* harmony import */ var _store_removeTool_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./store/removeTool.js */ "./store/removeTool.js"); 6978/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "removeTool", function() { return _store_removeTool_js__WEBPACK_IMPORTED_MODULE_11__["removeTool"]; }); 6979 6980/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "removeToolForElement", function() { return _store_removeTool_js__WEBPACK_IMPORTED_MODULE_11__["removeToolForElement"]; }); 6981 6982/* harmony import */ var _store_setToolOptions_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./store/setToolOptions.js */ "./store/setToolOptions.js"); 6983/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setToolOptions", function() { return _store_setToolOptions_js__WEBPACK_IMPORTED_MODULE_12__["setToolOptions"]; }); 6984 6985/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setToolOptionsForElement", function() { return _store_setToolOptions_js__WEBPACK_IMPORTED_MODULE_12__["setToolOptionsForElement"]; }); 6986 6987/* harmony import */ var _store_setToolMode_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./store/setToolMode.js */ "./store/setToolMode.js"); 6988/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setToolActive", function() { return _store_setToolMode_js__WEBPACK_IMPORTED_MODULE_13__["setToolActive"]; }); 6989 6990/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setToolActiveForElement", function() { return _store_setToolMode_js__WEBPACK_IMPORTED_MODULE_13__["setToolActiveForElement"]; }); 6991 6992/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setToolEnabled", function() { return _store_setToolMode_js__WEBPACK_IMPORTED_MODULE_13__["setToolEnabled"]; }); 6993 6994/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setToolEnabledForElement", function() { return _store_setToolMode_js__WEBPACK_IMPORTED_MODULE_13__["setToolEnabledForElement"]; }); 6995 6996/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setToolDisabled", function() { return _store_setToolMode_js__WEBPACK_IMPORTED_MODULE_13__["setToolDisabled"]; }); 6997 6998/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setToolDisabledForElement", function() { return _store_setToolMode_js__WEBPACK_IMPORTED_MODULE_13__["setToolDisabledForElement"]; }); 6999 7000/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setToolPassive", function() { return _store_setToolMode_js__WEBPACK_IMPORTED_MODULE_13__["setToolPassive"]; }); 7001 7002/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setToolPassiveForElement", function() { return _store_setToolMode_js__WEBPACK_IMPORTED_MODULE_13__["setToolPassiveForElement"]; }); 7003 7004/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./stateManagement/toolState.js */ "./stateManagement/toolState.js"); 7005/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "addToolState", function() { return _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_14__["addToolState"]; }); 7006 7007/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getToolState", function() { return _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_14__["getToolState"]; }); 7008 7009/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "removeToolState", function() { return _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_14__["removeToolState"]; }); 7010 7011/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "clearToolState", function() { return _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_14__["clearToolState"]; }); 7012 7013/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "setElementToolStateManager", function() { return _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_14__["setElementToolStateManager"]; }); 7014 7015/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getElementToolStateManager", function() { return _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_14__["getElementToolStateManager"]; }); 7016 7017/* harmony import */ var _stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./stateManagement/textStyle.js */ "./stateManagement/textStyle.js"); 7018/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "textStyle", function() { return _stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_15__["default"]; }); 7019 7020/* harmony import */ var _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./stateManagement/toolStyle.js */ "./stateManagement/toolStyle.js"); 7021/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "toolStyle", function() { return _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_16__["default"]; }); 7022 7023/* harmony import */ var _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./stateManagement/toolColors.js */ "./stateManagement/toolColors.js"); 7024/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "toolColors", function() { return _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_17__["default"]; }); 7025 7026/* harmony import */ var _stateManagement_toolCoordinates_js__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./stateManagement/toolCoordinates.js */ "./stateManagement/toolCoordinates.js"); 7027/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "toolCoordinates", function() { return _stateManagement_toolCoordinates_js__WEBPACK_IMPORTED_MODULE_18__["default"]; }); 7028 7029/* harmony import */ var _stateManagement_stackSpecificStateManager_js__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./stateManagement/stackSpecificStateManager.js */ "./stateManagement/stackSpecificStateManager.js"); 7030/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stackSpecificStateManager", function() { return _stateManagement_stackSpecificStateManager_js__WEBPACK_IMPORTED_MODULE_19__["stackSpecificStateManager"]; }); 7031 7032/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "newStackSpecificToolStateManager", function() { return _stateManagement_stackSpecificStateManager_js__WEBPACK_IMPORTED_MODULE_19__["newStackSpecificToolStateManager"]; }); 7033 7034/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "addStackStateManager", function() { return _stateManagement_stackSpecificStateManager_js__WEBPACK_IMPORTED_MODULE_19__["addStackStateManager"]; }); 7035 7036/* harmony import */ var _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./stateManagement/loadHandlerManager.js */ "./stateManagement/loadHandlerManager.js"); 7037/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "loadHandlerManager", function() { return _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_20__["default"]; }); 7038 7039/* harmony import */ var _stateManagement_imageIdSpecificStateManager_js__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./stateManagement/imageIdSpecificStateManager.js */ "./stateManagement/imageIdSpecificStateManager.js"); 7040/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "newImageIdSpecificToolStateManager", function() { return _stateManagement_imageIdSpecificStateManager_js__WEBPACK_IMPORTED_MODULE_21__["newImageIdSpecificToolStateManager"]; }); 7041 7042/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "globalImageIdSpecificToolStateManager", function() { return _stateManagement_imageIdSpecificStateManager_js__WEBPACK_IMPORTED_MODULE_21__["globalImageIdSpecificToolStateManager"]; }); 7043 7044/* harmony import */ var _stateManagement_frameOfReferenceStateManager_js__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./stateManagement/frameOfReferenceStateManager.js */ "./stateManagement/frameOfReferenceStateManager.js"); 7045/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "newFrameOfReferenceSpecificToolStateManager", function() { return _stateManagement_frameOfReferenceStateManager_js__WEBPACK_IMPORTED_MODULE_22__["newFrameOfReferenceSpecificToolStateManager"]; }); 7046 7047/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "globalFrameOfReferenceSpecificToolStateManager", function() { return _stateManagement_frameOfReferenceStateManager_js__WEBPACK_IMPORTED_MODULE_22__["globalFrameOfReferenceSpecificToolStateManager"]; }); 7048 7049/* harmony import */ var _eventListeners_windowResizeHandler_js__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./eventListeners/windowResizeHandler.js */ "./eventListeners/windowResizeHandler.js"); 7050/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "forceEnabledElementResize", function() { return _eventListeners_windowResizeHandler_js__WEBPACK_IMPORTED_MODULE_23__["forceEnabledElementResize"]; }); 7051 7052/* harmony import */ var _orientation_index_js__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./orientation/index.js */ "./orientation/index.js"); 7053/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "orientation", function() { return _orientation_index_js__WEBPACK_IMPORTED_MODULE_24__["default"]; }); 7054 7055/* harmony import */ var _util_SaveAs_js__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./util/SaveAs.js */ "./util/SaveAs.js"); 7056/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "SaveAs", function() { return _util_SaveAs_js__WEBPACK_IMPORTED_MODULE_25__["default"]; }); 7057 7058/* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./util/logger.js */ "./util/logger.js"); 7059/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "enableLogger", function() { return _util_logger_js__WEBPACK_IMPORTED_MODULE_26__["enable"]; }); 7060 7061/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "disableLogger", function() { return _util_logger_js__WEBPACK_IMPORTED_MODULE_26__["disable"]; }); 7062 7063/* harmony import */ var _thirdParty_register_js__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./thirdParty/register.js */ "./thirdParty/register.js"); 7064/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "register", function() { return _thirdParty_register_js__WEBPACK_IMPORTED_MODULE_27__["default"]; }); 7065 7066/* harmony import */ var _thirdParty_registerSome_js__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./thirdParty/registerSome.js */ "./thirdParty/registerSome.
7066js"); 7067/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "registerSome", function() { return _thirdParty_registerSome_js__WEBPACK_IMPORTED_MODULE_28__["default"]; }); 7068 7069/* harmony import */ var _synchronization_wwwcSynchronizer_js__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./synchronization/wwwcSynchronizer.js */ "./synchronization/wwwcSynchronizer.js"); 7070/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "wwwcSynchronizer", function() { return _synchronization_wwwcSynchronizer_js__WEBPACK_IMPORTED_MODULE_29__["default"]; }); 7071 7072/* harmony import */ var _synchronization_updateImageSynchronizer_js__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./synchronization/updateImageSynchronizer.js */ "./synchronization/updateImageSynchronizer.js"); 7073/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "updateImageSynchronizer", function() { return _synchronization_updateImageSynchronizer_js__WEBPACK_IMPORTED_MODULE_30__["default"]; }); 7074 7075/* harmony import */ var _synchronization_Synchronizer_js__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./synchronization/Synchronizer.js */ "./synchronization/Synchronizer.js"); 7076/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Synchronizer", function() { return _synchronization_Synchronizer_js__WEBPACK_IMPORTED_MODULE_31__["default"]; }); 7077 7078/* harmony import */ var _synchronization_stackScrollSynchronizer_js__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./synchronization/stackScrollSynchronizer.js */ "./synchronization/stackScrollSynchronizer.js"); 7079/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stackScrollSynchronizer", function() { return _synchronization_stackScrollSynchronizer_js__WEBPACK_IMPORTED_MODULE_32__["default"]; }); 7080 7081/* harmony import */ var _synchronization_stackImagePositionSynchronizer_js__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ./synchronization/stackImagePositionSynchronizer.js */ "./synchronization/stackImagePositionSynchronizer.js"); 7082/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stackImagePositionSynchronizer", function() { return _synchronization_stackImagePositionSynchronizer_js__WEBPACK_IMPORTED_MODULE_33__["default"]; }); 7083 7084/* harmony import */ var _synchronization_stackImagePositionOffsetSynchronizer_js__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ./synchronization/stackImagePositionOffsetSynchronizer.js */ "./synchronization/stackImagePositionOffsetSynchronizer.js"); 7085/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stackImagePositionOffsetSynchronizer", function() { return _synchronization_stackImagePositionOffsetSynchronizer_js__WEBPACK_IMPORTED_MODULE_34__["default"]; }); 7086 7087/* harmony import */ var _synchronization_stackImageIndexSynchronizer_js__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./synchronization/stackImageIndexSynchronizer.js */ "./synchronization/stackImageIndexSynchronizer.js"); 7088/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "stackImageIndexSynchronizer", function() { return _synchronization_stackImageIndexSynchronizer_js__WEBPACK_IMPORTED_MODULE_35__["default"]; }); 7089 7090/* harmony import */ var _synchronization_panZoomSynchronizer_js__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./synchronization/panZoomSynchronizer.js */ "./synchronization/panZoomSynchronizer.js"); 7091/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "panZoomSynchronizer", function() { return _synchronization_panZoomSynchronizer_js__WEBPACK_IMPORTED_MODULE_36__["default"]; }); 7092 7093/* harmony import */ var _requestPool_requestPoolManager_js__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./requestPool/requestPoolManager.js */ "./requestPool/requestPoolManager.js"); 7094/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "requestPoolManager", function() { return _requestPool_requestPoolManager_js__WEBPACK_IMPORTED_MODULE_37__["default"]; }); 7095 7096/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./externalModules.js */ "./externalModules.js"); 7097/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "external", function() { return _externalModules_js__WEBPACK_IMPORTED_MODULE_38__["default"]; }); 7098 7099/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ./events.js */ "./events.js"); 7100/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "EVENTS", function() { return _events_js__WEBPACK_IMPORTED_MODULE_39__["default"]; }); 7101 7102/* harmony import */ var _version_js__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ./version.js */ "./version.js"); 7103/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "version", function() { return _version_js__WEBPACK_IMPORTED_MODULE_40__["default"]; }); 7104 7105/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "import", function() { return _import_js__WEBPACK_IMPORTED_MODULE_3__["default"]; }); 7106 7107/* harmony import */ var _lib_js__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ./lib.js */ "./lib.js"); 7108/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "lib", function() { return _lib_js__WEBPACK_IMPORTED_MODULE_41__["lib"]; }); 7109 7110/** 7111 * Root 7112 * @namespace CornerstoneTools 7113 */ 7114
7115/** 7116 * Drawing API to assist in consistent annotation creation 7117 * @namespace Drawing 7118 */ 7119 7120/** 7121 * Event dispatchers listen for events from `cornerstone` and `enabledElements`. Dispatchers 7122 * choose which tool(s) get to handle the event by looking at callbacks, priority, and other factors. 7123 * @private 7124 * @namespace EventDispatchers 7125 */ 7126 7127/** 7128 * Event listeners normalize events emitted by `cornerstone` and `enabledElements`. The listeners 7129 * then re-emit events prefixed with `cornerstonetools`. For example, `mousemove` becomes `cornerstonetoolsmousemove`. 7130 * Most of these events are caught by an `eventDispatcher`, and used to shape tool behavior. 7131 * @private 7132 * @namespace EventListeners 7133 */ 7134 7135/** 7136 * Manipulators describe a tool's `handle` behavior. Leveraging a small set of manipulators 7137 * allows us to create a consistent experience when interacting with tools via their handles. 7138 * @namespace Manipulators 7139 */ 7140 7141/** 7142 * Mixins are "tool beahviors" that can be added to a tool via its mixin 7143 * array configuration property 7144 * @namespace Mixins 7145 */ 7146 7147/** 7148 * StateManagement 7149 * @namespace StateManagement 7150 */ 7151 7152/** 7153 * Sync 7154 * @namespace Synchronization 7155 */ 7156 7157/** 7158 * Third party 7159 * @namespace ThirdParty 7160 */ 7161 7162/** 7163 * Tools 7164 * @namespace Tools 7165 */ 7166 7167/** 7168 * Tools that extend the {@link #Tools.Base.BaseAnnotationTool|`BaseAnnotationTool`} 7169 * @namespace Tools.Annotation 7170 */ 7171 7172/** 7173 * The parent (abstract) classes that all tools derive from. 7174 * @namespace Tools.Base 7175 */ 7176 7177/** 7178 * Tools that extend the {@link #Tools.Base.BaseBrushTool|`BaseBrushTool`} 7179 * @namespace Tools.Brush 7180 */ 7181 7182/** 7183 * Util 7184 * @namespace Util 7185 */ 7186 7187 7188 7189 7190 // ~~~~~~ STACK TOOLS ~~~~~ // 7191 7192 7193 7194 // ~~~~~~ STATE MANAGEMENT ~~~~~ // 7195 7196 7197 7198 7199 7200 7201 7202 7203 7204 7205 7206 7207 7208 7209 7210 7211 // ~~~~~~ ORIENTATION ~~~~~ // 7212 7213 // ~~~~~~ CANVAS EXPORT ~~~~~ // 7214 7215 7216 // ~~~~~~ THIRD PARTY SUPPORT ~~~~~ // 7217 7218 7219 // ~~~~~~ SYNCHRONIZERS ~~~~~ // 7220 7221 7222 7223 7224 7225 7226 7227 7228 // ~~~~~~ REQUEST POOL MANAGER ~~~~~ // 7229 7230 7231 7232 7233 7234var cornerstoneTools = { 7235 // ~~~ TOOLS 7236 // ~ Annotation Tools 7237 AngleTool: _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["AngleTool"], 7238 ArrowAnnotateTool: _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["ArrowAnnotateTool"], 7239 BidirectionalTool: _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["BidirectionalTool"], 7240 CircleRoiTool: _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["CircleRoiTool"], 7241 CobbAngleTool: _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["CobbAngleTool"], 7242 EllipticalRoiTool: _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["EllipticalRoiTool"], 7243 FreehandMouseTool: _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["FreehandMouseTool"], 7244 LengthTool: _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["LengthTool"], 7245 ProbeTool: _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["ProbeTool"], 7246 RectangleRoiTool: _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["RectangleRoiTool"], 7247 TextMarkerTool: _tools_annotation_index_js__WEBPACK_IMPORTED_MODULE_0__["TextMarkerTool"], 7248 // ~ Brush Tools 7249 BrushTool: _tools_brush_index_js__WEBPACK_IMPORTED_MODULE_1__["BrushTool"], 7250 // ~ Tools 7251 CrosshairsTool: _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["CrosshairsTool"], 7252 DoubleTapFitToWindowTool: _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["DoubleTapFitToWindowTool"], 7253 DragProbeTool: _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["DragProbeTool"], 7254 EraserTool: _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["EraserTool"], 7255 FreehandSculpterMouseTool: _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["FreehandSculpterMouseTool"], 7256 MagnifyTool: _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["MagnifyTool"], 7257 PanMultiTouchTool: _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["PanMultiTouchTool"], 7258 PanTool: _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["PanTool"], 7259 ReferenceLinesTool: _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["ReferenceLinesTool"], 7260 RotateTool: _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["RotateTool"], 7261 RotateTouchTool: _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["RotateTouchTool"], 7262 ScaleOverlayTool: _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["ScaleOverlayTool"], 7263 StackScrollMouseWheelTool: _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["StackScrollMouseWheelTool"], 7264 StackScrollMultiTouchTool: _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["StackScrollMultiTouchTool"], 7265 StackScrollTool: _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["StackScrollTool"], 7266 WwwcRegionTool: _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["WwwcRegionTool"], 7267 WwwcTool: _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["WwwcTool"], 7268 ZoomMouseWheelTool: _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["ZoomMouseWheelTool"], 7269 ZoomTool: _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["ZoomTool"], 7270 ZoomTouchPinchTool: _tools_index_js__WEBPACK_IMPORTED_MODULE_2__["ZoomTouchPinchTool"], 7271 init: _init_js__WEBPACK_IMPORTED_MODULE_4__["default"], 7272 stackPrefetch: _stackTools_stackPrefetch_js__WEBPACK_IMPORTED_MODULE_5__["default"], 7273 stackRenderers: _stackTools_stackRenderers_js__WEBPACK_IMPORTED_MODULE_6__["default"], 7274 playClip: _stackTools_playClip_js__WEBPACK_IMPORTED_MODULE_7__["playClip"], 7275 stopClip: _stackTools_playClip_js__WEBPACK_IMPORTED_MODULE_7__["stopClip"], 7276 store: _store_index_js__WEBPACK_IMPORTED_MODULE_8__["default"], 7277 getToolForElement: _store_getToolForElement_js__WEBPACK_IMPORTED_MODULE_9__["default"], 7278 addTool: _store_addTool_js__WEBPACK_IMPORTED_MODULE_10__["addTool"], 7279 addToolForElement: _store_addTool_js__WEBPACK_IMPORTED_MODULE_10__["addToolForElement"], 7280 removeTool: _store_removeTool_js__WEBPACK_IMPORTED_MODULE_11__["removeTool"], 7281 removeToolForElement: _store_removeTool_js__WEBPACK_IMPORTED_MODULE_11__["removeToolForElement"], 7282 setToolOptions: _store_setToolOptions_js__WEBPACK_IMPORTED_MODULE_12__["setToolOptions"], 7283 setToolOptionsForElement: _store_setToolOptions_js__WEBPACK_IMPORTED_MODULE_12__["setToolOptionsForElement"], 7284 setToolActive: _store_setToolMode_js__WEBPACK_IMPORTED_MODULE_13__["setToolActive"], 7285 setToolActiveForElement: _store_setToolMode_js__WEBPACK_IMPORTED_MODULE_13__["setToolActiveForElement"], 7286 setToolEnabled: _store_setToolMode_js__WEBPACK_IMPORTED_MODULE_13__["setToolEnabled"], 7287 setToolEnabledForElement: _store_setToolMode_js__WEBPACK_IMPORTED_MODULE_13__["setToolEnabledForElement"], 7288 setToolDisabled: _store_setToolMode_js__WEBPACK_IMPORTED_MODULE_13__["setToolDisabled"], 7289 setToolDisabledForElement: _store_setToolMode_js__WEBPACK_IMPORTED_MODULE_13__["setToolDisabledForElement"], 7290 setToolPassive: _store_setToolMode_js__WEBPACK_IMPORTED_MODULE_13__["setToolPassive"], 7291 setToolPassiveForElement: _store_setToolMode_js__WEBPACK_IMPORTED_MODULE_13__["setToolPassiveForElement"], 7292 addToolState: _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_14__["addToolState"], 7293 getToolState: _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_14__["getToolState"], 7294 removeToolState: _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_14__["removeToolState"], 7295 clearToolState: _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_14__["clearToolState"], 7296 setElementToolStateManager: _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_14__["setElementToolStateManager"], 7297 getElementToolStateManager: _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_14__["getElementToolStateManager"], 7298 textStyle: _stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_15__["default"], 7299 toolStyle: _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_16__["default"], 7300 toolColors: _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_17__["default"], 7301 toolCoordinates: _stateManagement_toolCoordinates_js__WEBPACK_IMPORTED_MODULE_18__["default"], 7302 stackSpecificStateManager: _stateManagement_stackSpecificStateManager_js__WEBPACK_IMPORTED_MODULE_19__["stackSpecificStateManager"], 7303 newStackSpecificToolStateManager: _stateManagement_stackSpecificStateManager_js__WEBPACK_IMPORTED_MODULE_19__["newStackSpecificToolStateManager"], 7304 addStackStateManager: _stateManagement_stackSpecificStateManager_js__WEBPACK_IMPORTED_MODULE_19__["addStackStateManager"], 7305 loadHandlerManager: _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_20__["default"], 7306 newImageIdSpecificToolStateManager: _stateManagement_imageIdSpecificStateManager_js__WEBPACK_IMPORTED_MODULE_21__["newImageIdSpecificToolStateManager"], 7307 globalImageIdSpecificToolStateManager: _stateManagement_imageIdSpecificStateManager_js__WEBPACK_IMPORTED_MODULE_21__["globalImageIdSpecificToolStateManager"], 7308 newFrameOfReferenceSpecificToolStateManager: _stateManagement_frameOfReferenceStateManager_js__WEBPACK_IMPORTED_MODULE_22__["newFrameOfReferenceSpecificToolStateManager"], 7309 globalFrameOfReferenceSpecificToolStateManager: _stateManagement_frameOfReferenceStateManager_js__WEBPACK_IMPORTED_MODULE_22__["globalFrameOfReferenceSpecificToolStateManager"], 7310 forceEnabledElementResize: _eventListeners_windowResizeHandler_js__WEBPACK_IMPORTED_MODULE_23__["forceEnabledElementResize"], 7311 orientation: _orientation_index_js__WEBPACK_IMPORTED_MODULE_24__["default"], 7312 SaveAs: _util_SaveAs_js__WEBPACK_IMPORTED_MODULE_25__["default"], 7313 enableLogger: _util_logger_js__WEBPACK_IMPORTED_MODULE_26__["enable"], 7314 disableLogger: _util_logger_js__WEBPACK_IMPORTED_MODULE_26__["disable"], 7315 import: _import_js__WEBPACK_IMPORTED_MODULE_3__["default"], 7316 register: _thirdParty_register_js__WEBPACK_IMPORTED_MODULE_27__["default"], 7317 registerSome: _thirdParty_registerSome_js__WEBPACK_IMPORTED_MODULE_28__["default"], 7318 wwwcSynchronizer: _synchronization_wwwcSynchronizer_js__WEBPACK_IMPORTED_MODULE_29__["default"], 7319 updateImageSynchronizer: _synchronization_updateImageSynchronizer_js__WEBPACK_IMPORTED_MODULE_30__["default"], 7320 Synchronizer: _synchronization_Synchronizer_js__WEBPACK_IMPORTED_MODULE_31__["default"], 7321 stackScrollSynchronizer: _synchronization_stackScrollSynchronizer_js__WEBPACK_IMPORTED_MODULE_32__["default"], 7322 stackImagePositionSynchronizer: _synchronization_stackImagePositionSynchronizer_js__WEBPACK_IMPORTED_MODULE_33__["default"], 7323 stackImagePositionOffsetSynchronizer: _synchronization_stackImagePositionOffsetSynchronizer_js__WEBPACK_IMPORTED_MODULE_34__["default"], 7324 stackImageIndexSynchronizer: _synchronization_stackImageIndexSynchronizer_js__WEBPACK_IMPORTED_MODULE_35__["default"],
7325 panZoomSynchronizer: _synchronization_panZoomSynchronizer_js__WEBPACK_IMPORTED_MODULE_36__["default"], 7326 requestPoolManager: _requestPool_requestPoolManager_js__WEBPACK_IMPORTED_MODULE_37__["default"], 7327 external: _externalModules_js__WEBPACK_IMPORTED_MODULE_38__["default"], 7328 EVENTS: _events_js__WEBPACK_IMPORTED_MODULE_39__["default"], 7329 version: _version_js__WEBPACK_IMPORTED_MODULE_40__["default"], 7330 lib: _lib_js__WEBPACK_IMPORTED_MODULE_41__["lib"] 7331}; // Named Exports 7332 7333 // This has a weird name, so we can't just import it as 'import'; 7334 7335 7336/* harmony default export */ __webpack_exports__["default"] = (cornerstoneTools); 7337 7338/***/ }), 7339
7340/***/ "./init.js": 7341/*!*****************!*\ 7342 !*** ./init.js ***! 7343 \*****************/ 7344/*! exports provided: default */ 7345/***/ (function(module, __webpack_exports__, __webpack_require__) { 7346 7347"use strict"; 7348__webpack_require__.r(__webpack_exports__); 7349/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./externalModules.js */ "./externalModules.js"); 7350/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./store/index.js */ "./store/index.js"); 7351/* harmony import */ var _store_internals_addEnabledElement_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./store/internals/addEnabledElement.js */ "./store/internals/addEnabledElement.js"); 7352/* harmony import */ var _store_internals_removeEnabledElement_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./store/internals/removeEnabledElement.js */ "./store/internals/removeEnabledElement.js"); 7353/* harmony import */ var _eventListeners_windowResizeHandler_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./eventListeners/windowResizeHandler.js */ "./eventListeners/windowResizeHandler.js"); 7354 7355 7356 7357 7358 7359/** 7360 * Merges the provided configuration with default values and returns a 7361 * configured CornerstoneTools instance. 7362 * @export 7363 * @public 7364 * @method 7365 * @name init 7366 * 7367 * @param {Object} configuration 7368 * @returns {Object} A configured CornerstoneTools instance with top level API members. 7369 */ 7370 7371/* harmony default export */ __webpack_exports__["default"] = (function (configuration) { 7372 _addCornerstoneEventListeners(); 7373 7374 _initModules(); 7375 7376 _eventListeners_windowResizeHandler_js__WEBPACK_IMPORTED_MODULE_4__["default"].enable(); // Apply global configuration 7377 7378 _store_index_js__WEBPACK_IMPORTED_MODULE_1__["default"].modules.globalConfiguration.state = Object.assign({}, _store_index_js__WEBPACK_IMPORTED_MODULE_1__["default"].modules.globalConfiguration.state, configuration); 7379}); 7380/** 7381 * Wires up event listeners for the Cornerstone#ElementDisabled and 7382 * Cornerstone#ElementEnabled events. 7383 * @private 7384 * @method 7385 * @returns {void} 7386 */ 7387 7388function _addCornerstoneEventListeners() { 7389 // Clear any listeners that may already be set 7390 _removeCornerstoneEventListeners(); 7391 7392 var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone; 7393 var elementEnabledEvent = cornerstone.EVENTS.ELEMENT_ENABLED; 7394 var elementDisabledEvent = cornerstone.EVENTS.ELEMENT_DISABLED; 7395 cornerstone.events.addEventListener(elementEnabledEvent, _store_internals_addEnabledElement_js__WEBPACK_IMPORTED_MODULE_2__["default"]); 7396 cornerstone.events.addEventListener(elementDisabledEvent, _store_internals_removeEnabledElement_js__WEBPACK_IMPORTED_MODULE_3__["default"]); 7397} 7398/** 7399 * Removes event listeners for the Cornerstone#ElementDisabled and 7400 * Cornerstone#ElementEnabled events. 7401 * @private 7402 * @method 7403 * @returns {void} 7404 */ 7405 7406 7407function _removeCornerstoneEventListeners() { 7408 var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone; 7409 var elementEnabledEvent = cornerstone.EVENTS.ELEMENT_ENABLED; 7410 var elementDisabledEvent = cornerstone.EVENTS.ELEMENT_DISABLED; 7411 cornerstone.events.removeEventListener(elementEnabledEvent, _store_internals_addEnabledElement_js__WEBPACK_IMPORTED_MODULE_2__["default"]); 7412 cornerstone.events.removeEventListener(elementDisabledEvent, _store_internals_removeEnabledElement_js__WEBPACK_IMPORTED_MODULE_3__["default"]); 7413} 7414/* 7415 * TODO: This could cause issues if the module was already initialized for 7416 * the store. As there's nothing stopping implementers from calling `init` 7417 * multiple times. Modules should self-check if they have already been 7418 * registered to prevent issues. 7419 */ 7420 7421/** 7422 * Iterate over our store's modules. If the module has an `onRegisterCallback` 7423 * call it. This hook can be used to setup any global store requirements per 7424 * module. 7425 * @private 7426 * @method 7427 * @returns {void} 7428 */ 7429 7430 7431function _initModules() { 7432 var modules = _store_index_js__WEBPACK_IMPORTED_MODULE_1__["default"].modules; 7433 Object.keys(modules).forEach(function (key) { 7434 if (typeof modules[key].onRegisterCallback === 'function') { 7435 modules[key].onRegisterCallback(); 7436 } 7437 }); 7438} 7439 7440/***/ }), 7441
7442/***/ "./lib.js": 7443/*!****************!*\ 7444 !*** ./lib.js ***! 7445 \****************/ 7446/*! exports provided: lib */ 7447/***/ (function(module, __webpack_exports__, __webpack_require__) { 7448 7449"use strict"; 7450__webpack_require__.r(__webpack_exports__); 7451/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "lib", function() { return lib; }); 7452/* harmony import */ var _tools_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./tools/base/BaseTool.js */ "./tools/base/BaseTool.js"); 7453/* harmony import */ var _tools_base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./tools/base/BaseAnnotationTool.js */ "./tools/base/BaseAnnotationTool.js"); 7454/* harmony import */ var _tools_base_BaseBrushTool_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./tools/base/BaseBrushTool.js */ "./tools/base/BaseBrushTool.js"); 7455/* harmony import */ var _manipulators_index_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./manipulators/index.js */ "./manipulators/index.js"); 7456/* harmony import */ var _util_findAndMoveHelpers_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./util/findAndMoveHelpers.js */ "./util/findAndMoveHelpers.js"); 7457/* harmony import */ var _mixins_index_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./mixins/index.js */ "./mixins/index.js"); 7458/* harmony import */ var _tools_cursors_index_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./tools/cursors/index.js */ "./tools/cursors/index.js"); 7459/* harmony import */ var _drawing_index_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./drawing/index.js */ "./drawing/index.js"); 7460/* harmony import */ var _drawing_drawTextBox_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./drawing/drawTextBox.js */ "./drawing/drawTextBox.js"); 7461/* harmony import */ var _drawing_drawArrow_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./drawing/drawArrow.js */ "./drawing/drawArrow.js"); 7462/* harmony import */ var _drawing_drawLink_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./drawing/drawLink.js */ "./drawing/drawLink.js"); 7463/* harmony import */ var _drawing_drawLinkedTextBox_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./drawing/drawLinkedTextBox.js */ "./drawing/drawLinkedTextBox.js"); 7464/* harmony import */ var _drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./drawing/drawHandles.js */ "./drawing/drawHandles.js"); 7465/* harmony import */ var _util_getLuminance_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./util/getLuminance.js */ "./util/getLuminance.js"); 7466/* harmony import */ var _util_copyPoints_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./util/copyPoints.js */ "./util/copyPoints.js"); 7467/* harmony import */ var _util_calculateSUV_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./util/calculateSUV.js */ "./util/calculateSUV.js"); 7468/* harmony import */ var _util_setContextToDisplayFontSize_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./util/setContextToDisplayFontSize.js */ "./util/setContextToDisplayFontSize.js"); 7469/* harmony import */ var _util_scrollToIndex_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./util/scrollToIndex.js */ "./util/scrollToIndex.js"); 7470/* harmony import */ var _util_scroll_js__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./util/scroll.js */ "./util/scroll.js"); 7471/* harmony import */ var _util_roundToDecimal_js__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./util/roundToDecimal.js */ "./util/roundToDecimal.js"); 7472/* harmony import */ var _util_pointProjector_js__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./util/pointProjector.js */ "./util/pointProjector.js"); 7473/* harmony import */ var _util_lineSegDistance_js__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ./util/lineSegDistance.js */ "./util/lineSegDistance.js"); 7474/* harmony import */ var _util_pointInsideBoundingBox_js__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ./util/pointInsideBoundingBox.js */ "./util/pointInsideBoundingBox.js"); 7475/* harmony import */ var _util_makeUnselectable_js__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ./util/makeUnselectable.js */ "./util/makeUnselectable.js"); 7476/* harmony import */ var _util_getRGBPixels_js__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ./util/getRGBPixels.js */ "./util/getRGBPixels.js"); 7477/* harmony import */ var _util_getMaxSimultaneousRequests_js__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ./util/getMaxSimultaneousRequests.js */ "./util/getMaxSimultaneousRequests.js"); 7478/* harmony import */ var _util_angleBetweenPoints_js__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ./util/angleBetweenPoints.js */ "./util/angleBetweenPoints.js"); 7479/* harmony import */ var _util_getKeyFromKeyCode_js__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ./util/getKeyFromKeyCode.js */ "./util/getKeyFromKeyCode.js"); 7480/* harmony import */ var _util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ./util/numbersWithCommas.js */ "./util/numbersWithCommas.js"); 7481/* harmony import */ var _tools_cursors_MouseCursor_js__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ./tools/cursors/MouseCursor.js */ "./tools/cursors/MouseCursor.js"); 7482/* harmony import */ var _util_ellipse_index_js__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ./util/ellipse/index.js */ "./util/ellipse/index.js"); 7483/* harmony import */ var _util_freehand_index_js__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ./util/freehand/index.js */ "./util/freehand/index.js"); 7484/* harmony import */ var _util_brush_index_js__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ./util/brush/index.js */ "./util/brush/index.js"); 7485/* harmony import */ var _util_zoom_index_js__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ./util/zoom/index.js */ "./util/zoom/index.js"); 7486/* harmony import */ var _util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ./util/triggerEvent.js */ "./util/triggerEvent.js"); 7487/* harmony import */ var _util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ./util/convertToVector3.js */ "./util/convertToVector3.js"); 7488 7489 7490 7491 7492 7493 7494 7495 7496 7497 7498 7499 7500 7501 7502 7503 7504 7505 7506 7507 7508 7509 7510 7511 7512 7513 7514 7515 7516 7517 7518 7519 7520 7521 7522 7523 7524var lib = { 7525 'base/BaseTool': _tools_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_0__["default"], 7526 'base/BaseAnnotationTool': _tools_base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_1__["default"], 7527 'base/BaseBrushTool': _tools_base_BaseBrushTool_js__WEBPACK_IMPORTED_MODULE_2__["default"], 7528 'tools/cursors/MouseCursor': _tools_cursors_MouseCursor_js__WEBPACK_IMPORTED_MODULE_29__["default"], 7529 'tools/cursors': _tools_cursors_index_js__WEBPACK_IMPORTED_MODULE_6__, 7530 'manipulators/anyHandlesOutsideImage': _manipulators_index_js__WEBPACK_IMPORTED_MODULE_3__["anyHandlesOutsideImage"], 7531 'manipulators/getHandleNearImagePoint': _manipulators_index_js__WEBPACK_IMPORTED_MODULE_3__["getHandleNearImagePoint"], 7532 'manipulators/handleActivator': _manipulators_index_js__WEBPACK_IMPORTED_MODULE_3__["handleActivator"], 7533 'manipulators/moveAllHandles': _manipulators_index_js__WEBPACK_IMPORTED_MODULE_3__["moveAllHandles"], 7534 'manipulators/moveHandle': _manipulators_index_js__WEBPACK_IMPORTED_MODULE_3__["moveHandle"], 7535 'manipulators/moveNewHandle': _manipulators_index_js__WEBPACK_IMPORTED_MODULE_3__["moveNewHandle"], 7536 'manipulators/moveHandleNearImagePoint': _util_findAndMoveHelpers_js__WEBPACK_IMPORTED_MODULE_4__["moveHandleNearImagePoint"], 7537 'manipulators/findHandleDataNearImagePoint': _util_findAndMoveHelpers_js__WEBPACK_IMPORTED_MODULE_4__["findHandleDataNearImagePoint"], 7538 'manipulators/moveAnnotation': _util_findAndMoveHelpers_js__WEBPACK_IMPORTED_MODULE_4__["moveAnnotation"], 7539 'mixins/activeOrDisabledBinaryTool': _mixins_index_js__WEBPACK_IMPORTED_MODULE_5__["default"].activeOrDisabledBinaryTool, 7540 'mixins/enabledOrDisabledBinaryTool': _mixins_index_js__WEBPACK_IMPORTED_MODULE_5__["default"].enabledOrDisabledBinaryTool, 7541 'drawing/getNewContext': _drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["getNewContext"], 7542 'drawing/draw': _drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["draw"], 7543 'drawing/path': _drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["path"], 7544 'drawing/setShadow': _drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["setShadow"], 7545 'drawing/drawLine': _drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["drawLine"], 7546 'drawing/drawLines': _drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["drawLines"], 7547 'drawing/drawJoinedLines': _drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["drawJoinedLines"], 7548 'drawing/drawCircle': _drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["drawCircle"], 7549 'drawing/drawEllipse': _drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["drawEllipse"], 7550 'drawing/drawRect': _drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["drawRect"],
7551 'drawing/fillOutsideRect': _drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["fillOutsideRect"], 7552 'drawing/drawTextBox': _drawing_drawTextBox_js__WEBPACK_IMPORTED_MODULE_8__["default"], 7553 'drawing/drawArrow': _drawing_drawArrow_js__WEBPACK_IMPORTED_MODULE_9__["default"], 7554 'drawing/fillBox': _drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["fillBox"], 7555 'drawing/fillTextLines': _drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["fillTextLines"], 7556 'drawing/drawLink': _drawing_drawLink_js__WEBPACK_IMPORTED_MODULE_10__["default"], 7557 'drawing/drawLinkedTextBox': _drawing_drawLinkedTextBox_js__WEBPACK_IMPORTED_MODULE_11__["default"], 7558 'drawing/drawHandles': _drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_12__["default"], 7559 'drawing/textBoxWidth': _drawing_drawTextBox_js__WEBPACK_IMPORTED_MODULE_8__["textBoxWidth"], 7560 'util/getLuminance': _util_getLuminance_js__WEBPACK_IMPORTED_MODULE_13__["default"], 7561 'util/copyPoints': _util_copyPoints_js__WEBPACK_IMPORTED_MODULE_14__["default"], 7562 'util/calculateSUV': _util_calculateSUV_js__WEBPACK_IMPORTED_MODULE_15__["default"], 7563 'util/setContextToDisplayFontSize': _util_setContextToDisplayFontSize_js__WEBPACK_IMPORTED_MODULE_16__["default"], 7564 'util/scrollToIndex': _util_scrollToIndex_js__WEBPACK_IMPORTED_MODULE_17__["default"], 7565 'util/scroll': _util_scroll_js__WEBPACK_IMPORTED_MODULE_18__["default"], 7566 'util/roundToDecimal': _util_roundToDecimal_js__WEBPACK_IMPORTED_MODULE_19__["default"], 7567 'util/projectPatientPointToImagePlane': _util_pointProjector_js__WEBPACK_IMPORTED_MODULE_20__["projectPatientPointToImagePlane"], 7568 'util/imagePointToPatientPoint': _util_pointProjector_js__WEBPACK_IMPORTED_MODULE_20__["imagePointToPatientPoint"], 7569 'util/planePlaneIntersection': _util_pointProjector_js__WEBPACK_IMPORTED_MODULE_20__["planePlaneIntersection"], 7570 'util/pointInsideBoundingBox': _util_pointInsideBoundingBox_js__WEBPACK_IMPORTED_MODULE_22__["default"], 7571 'util/makeUnselectable': _util_makeUnselectable_js__WEBPACK_IMPORTED_MODULE_23__["default"], 7572 'util/getRGBPixels': _util_getRGBPixels_js__WEBPACK_IMPORTED_MODULE_24__["default"], 7573 'util/getDefaultSimultaneousRequests': _util_getMaxSimultaneousRequests_js__WEBPACK_IMPORTED_MODULE_25__["getDefaultSimultaneousRequests"], 7574 'util/getMaxSimultaneousRequests': _util_getMaxSimultaneousRequests_js__WEBPACK_IMPORTED_MODULE_25__["getMaxSimultaneousRequests"], 7575 'util/getBrowserInfo': _util_getMaxSimultaneousRequests_js__WEBPACK_IMPORTED_MODULE_25__["getBrowserInfo"], 7576 'util/isMobileDevice': _util_getMaxSimultaneousRequests_js__WEBPACK_IMPORTED_MODULE_25__["isMobileDevice"], 7577 'util/angleBetweenPoints': _util_angleBetweenPoints_js__WEBPACK_IMPORTED_MODULE_26__["default"], 7578 'util/getKeyFromKeyCode': _util_getKeyFromKeyCode_js__WEBPACK_IMPORTED_MODULE_27__["default"], 7579 'util/numbersWithCommas': _util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_28__["default"], 7580 'util/lineSegDistance': _util_lineSegDistance_js__WEBPACK_IMPORTED_MODULE_21__["default"], 7581 'util/triggerEvent': _util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_34__["default"], 7582 'util/convertToVectro3': _util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_35__["default"], 7583 // Whole tool specific util packages 7584 'util/ellipseUtils': _util_ellipse_index_js__WEBPACK_IMPORTED_MODULE_30__["default"], 7585 'util/freehandUtils': _util_freehand_index_js__WEBPACK_IMPORTED_MODULE_31__["default"], 7586 'util/brushUtils': _util_brush_index_js__WEBPACK_IMPORTED_MODULE_32__["default"], 7587 'util/zoomUtils': _util_zoom_index_js__WEBPACK_IMPORTED_MODULE_33__["default"] 7588}; 7589 7590/***/ }), 7591
7592/***/ "./manipulators/anyHandlesOutsideImage.js": 7593/*!************************************************!*\ 7594 !*** ./manipulators/anyHandlesOutsideImage.js ***! 7595 \************************************************/ 7596/*! exports provided: default */ 7597/***/ (function(module, __webpack_exports__, __webpack_require__) { 7598 7599"use strict"; 7600__webpack_require__.r(__webpack_exports__); 7601/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js"); 7602 7603/** 7604 * Determine if a handle is outside the bounds of the rendered image. 7605 * @public 7606 * @function anyHandlesOutsideImage 7607 * @memberof Manipulators 7608 * 7609 * @param {*} renderData - Cornerstone Tool's event detail 7610 * @param {Object} handles - An object containing named handles 7611 * @returns {Boolean} - True if the handle was placed outside the image 7612 */ 7613 7614/* harmony default export */ __webpack_exports__["default"] = (function (renderData, handles) { 7615 var image = renderData.image; 7616 var imageRect = { 7617 left: 0, 7618 top: 0, 7619 width: image.width, 7620 height: image.height 7621 }; 7622 var handleOutsideImage = false; 7623 Object.keys(handles).forEach(function (name) { 7624 var handle = handles[name]; 7625 7626 if (handle.allowedOutsideImage === true) { 7627 return; 7628 } 7629 7630 if (_externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.point.insideRect(handle, imageRect) === false) { 7631 handleOutsideImage = true; 7632 } 7633 }); 7634 return handleOutsideImage; 7635}); 7636 7637/***/ }), 7638
7639/***/ "./manipulators/getHandleNearImagePoint.js": 7640/*!*************************************************!*\ 7641 !*** ./manipulators/getHandleNearImagePoint.js ***! 7642 \*************************************************/ 7643/*! exports provided: default */ 7644/***/ (function(module, __webpack_exports__, __webpack_require__) { 7645 7646"use strict"; 7647__webpack_require__.r(__webpack_exports__); 7648/* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/typeof */ "../node_modules/@babel/runtime/helpers/typeof.js"); 7649/* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__); 7650/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js"); 7651/* harmony import */ var _util_pointInsideBoundingBox_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../util/pointInsideBoundingBox.js */ "./util/pointInsideBoundingBox.js"); 7652 7653 7654 7655/** 7656 * Returns the first handle found to be near the provided point. Handles to search can be an array of handles, an 7657 * object of named handles, or an object of named handles AND named arrays of handles. 7658 * 7659 * @public 7660 * @function getHandleNearImagePoint 7661 * @memberof Manipulators 7662 * 7663 * @param {*} element - Target enabledElement 7664 * @param {(Array|Object)} handles - An arry of handles, object with named handles, or object with named handles AND named arrays of handles 7665 * @param {Object} coords - The coordinates to measure from when determining distance from handles 7666 * @param {number} distanceThreshold - minimum distance handle needs to be from provided coords 7667 * @returns {Object} Handle 7668 */ 7669 7670var getHandleNearImagePoint = function getHandleNearImagePoint(element, handles, coords, distanceThreshold) { 7671 var nearbyHandle; 7672 7673 if (!handles) { 7674 return; 7675 } 7676 7677 if (Array.isArray(handles)) { 7678 var handleKeys = Object.keys(handles); 7679 7680 for (var i = 0; i < handleKeys.length; i++) { 7681 var key = handleKeys[i]; 7682 var handle = handles[key]; 7683 7684 if ( // Not a true handle 7685 !handle.hasOwnProperty('x') || !handle.hasOwnProperty('y')) { 7686 continue; 7687 } 7688 7689 if (_isHandleNearImagePoint(handle, element, coords, distanceThreshold)) { 7690 nearbyHandle = handle; 7691 break; 7692 } 7693 } 7694 } else if (_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default()(handles) === 'object') { 7695 var _handleKeys = Object.keys(handles); 7696 7697 for (var _i = 0; _i < _handleKeys.length; _i++) { 7698 var handleName = _handleKeys[_i]; 7699 7700 if (Array.isArray(handles[handleName])) { 7701 nearbyHandle = getHandleNearImagePoint(element, handles[handleName], coords, distanceThreshold); 7702 7703 if (nearbyHandle) { 7704 break; 7705 } 7706 } else { 7707 var _handle = handles[handleName]; 7708 7709 if (_isHandleNearImagePoint(_handle, element, coords, distanceThreshold)) { 7710 nearbyHandle = _handle; 7711 break; 7712 } 7713 } 7714 } 7715 } 7716 7717 return nearbyHandle; 7718}; 7719/** 7720 * Determines if the handle is less than the provided distance from the provided coordinates 7721 * @private 7722 * @function _isHandleNearImagePoint 7723 * 7724 * @param {*} handle 7725 * @param {*} element 7726 * @param {*} coords 7727 * @param {*} distanceThreshold 7728 * @returns {boolean} true if handles is near image point 7729 */ 7730 7731 7732var _isHandleNearImagePoint = function _isHandleNearImagePoint(handle, element, coords, distanceThreshold) { 7733 if (handle.hasOwnProperty('pointNearHandle')) { 7734 if (handle.pointNearHandle(element, handle, coords)) { 7735 return true; 7736 } 7737 } else if (handle.hasBoundingBox === true) { 7738 if (Object(_util_pointInsideBoundingBox_js__WEBPACK_IMPORTED_MODULE_2__["default"])(handle, coords)) { 7739 return true; 7740 } 7741 } else { 7742 var handleCanvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pixelToCanvas(element, handle); 7743 var distance = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath.point.distance(handleCanvas, coords); 7744 7745 if (distance <= distanceThreshold) { 7746 return true; 7747 } 7748 } 7749 7750 return false;
7751}; 7752 7753/* harmony default export */ __webpack_exports__["default"] = (getHandleNearImagePoint); 7754 7755/***/ }), 7756
7757/***/ "./manipulators/handleActivator.js": 7758/*!*****************************************!*\ 7759 !*** ./manipulators/handleActivator.js ***! 7760 \*****************************************/ 7761/*! exports provided: default */ 7762/***/ (function(module, __webpack_exports__, __webpack_require__) { 7763 7764"use strict"; 7765__webpack_require__.r(__webpack_exports__); 7766/* harmony import */ var _getHandleNearImagePoint_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getHandleNearImagePoint.js */ "./manipulators/getHandleNearImagePoint.js"); 7767 7768/** 7769 * Update the active handle 7770 * @public 7771 * @function handleActivator 7772 * @memberof Manipulators 7773 * 7774 * @param {*} element 7775 * @param {*} handles 7776 * @param {*} canvasPoint 7777 * @param {*} distanceThreshold 7778 * @returns {Boolean} - True if a handle was activated 7779 */ 7780 7781/* harmony default export */ __webpack_exports__["default"] = (function (element, handles, canvasPoint, distanceThreshold) { 7782 if (!distanceThreshold) { 7783 distanceThreshold = 6; 7784 } 7785 7786 var activeHandle = _getActiveHandle(handles); 7787 7788 var nearbyHandle = Object(_getHandleNearImagePoint_js__WEBPACK_IMPORTED_MODULE_0__["default"])(element, handles, canvasPoint, distanceThreshold); 7789 7790 if (activeHandle !== nearbyHandle) { 7791 if (nearbyHandle !== undefined) { 7792 nearbyHandle.active = true; 7793 } 7794 7795 if (activeHandle !== undefined) { 7796 activeHandle.active = false; 7797 } 7798 7799 return true; 7800 } 7801 7802 return false; 7803}); 7804/** 7805 * 7806 * @private 7807 * 7808 * @param {*} handles 7809 * @returns {Object} - Activated Handle 7810 */ 7811 7812function _getActiveHandle(handles) { 7813 var activeHandle; 7814 Object.keys(handles).forEach(function (name) { 7815 var handle = handles[name]; 7816 7817 if (handle.active === true) { 7818 activeHandle = handle; 7819 return; 7820 } 7821 }); 7822 return activeHandle; 7823}
vendor: 22 bytes, lines 7823-7827
7823 7824 7825/***/ }), 7826 7827/***/ "./
7827manipulators/index.js": 7828/*!*******************************!*\ 7829 !*** ./manipulators/index.js ***! 7830 \*******************************/ 7831/*! exports provided: anyHandlesOutsideImage, getHandleNearImagePoint, handleActivator, moveAllHandles, moveHandle, moveNewHandle */ 7832/***/ (function(module, __webpack_exports__, __webpack_require__) { 7833 7834"use strict"; 7835__webpack_require__.r(__webpack_exports__); 7836/* harmony import */ var _anyHandlesOutsideImage_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./anyHandlesOutsideImage.js */ "./manipulators/anyHandlesOutsideImage.js"); 7837/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "anyHandlesOutsideImage", function() { return _anyHandlesOutsideImage_js__WEBPACK_IMPORTED_MODULE_0__["default"]; }); 7838 7839/* harmony import */ var _getHandleNearImagePoint_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./getHandleNearImagePoint.js */ "./manipulators/getHandleNearImagePoint.js"); 7840/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "getHandleNearImagePoint", function() { return _getHandleNearImagePoint_js__WEBPACK_IMPORTED_MODULE_1__["default"]; }); 7841 7842/* harmony import */ var _handleActivator_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./handleActivator.js */ "./manipulators/handleActivator.js"); 7843/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "handleActivator", function() { return _handleActivator_js__WEBPACK_IMPORTED_MODULE_2__["default"]; }); 7844 7845/* harmony import */ var _moveAllHandles_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./moveAllHandles.js */ "./manipulators/moveAllHandles.js"); 7846/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "moveAllHandles", function() { return _moveAllHandles_js__WEBPACK_IMPORTED_MODULE_3__["default"]; }); 7847 7848/* harmony import */ var _moveHandle_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./moveHandle.js */ "./manipulators/moveHandle.js"); 7849/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "moveHandle", function() { return _moveHandle_js__WEBPACK_IMPORTED_MODULE_4__["default"]; }); 7850 7851/* harmony import */ var _moveNewHandle_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./moveNewHandle.js */ "./manipulators/moveNewHandle.js"); 7852/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "moveNewHandle", function() { return _moveNewHandle_js__WEBPACK_IMPORTED_MODULE_5__["default"]; }); 7853 7854 7855 7856 7857 7858 7859 7860 7861 7862/***/ }), 7863
7864/***/ "./manipulators/moveAllHandles.js": 7865/*!****************************************!*\ 7866 !*** ./manipulators/moveAllHandles.js ***! 7867 \****************************************/ 7868/*! exports provided: default */ 7869/***/ (function(module, __webpack_exports__, __webpack_require__) { 7870 7871"use strict"; 7872__webpack_require__.r(__webpack_exports__); 7873/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../events.js */ "./events.js"); 7874/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js"); 7875/* harmony import */ var _anyHandlesOutsideImage_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./anyHandlesOutsideImage.js */ "./manipulators/anyHandlesOutsideImage.js"); 7876/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../stateManagement/toolState.js */ "./stateManagement/toolState.js"); 7877/* harmony import */ var _util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../util/triggerEvent.js */ "./util/triggerEvent.js"); 7878/* harmony import */ var _util_clip_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../util/clip.js */ "./util/clip.js"); 7879/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./../store/index.js */ "./store/index.js"); 7880/* harmony import */ var _util_getActiveTool__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../util/getActiveTool */ "./util/getActiveTool.js"); 7881/* harmony import */ var _tools_base_BaseAnnotationTool__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../tools/base/BaseAnnotationTool */ "./tools/base/BaseAnnotationTool.js"); 7882 7883 7884 7885 7886 7887 7888 7889 7890 7891var _dragEvents = { 7892 mouse: [_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_DRAG], 7893 touch: [_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_DRAG] 7894}; 7895var _upOrEndEvents = { 7896 mouse: [_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_UP, _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_CLICK
7896], 7897 touch: [_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_END, _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_DRAG_END, _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_PINCH, _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_PRESS, _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TAP] 7898}; 7899/** 7900 * Manipulator to move all provided handles at the same time 7901 * @public 7902 * @function moveAllHandles 7903 * @memberof Manipulators 7904 * 7905 * @param {*} evtDetail 7906 * @param {*} evtDetail.element 7907 * @param {String} toolName 7908 * @param {*} annotation 7909 * @param {*} [handle=null] - not needed by moveAllHandles, but keeps call signature the same as `moveHandle` 7910 * @param {Object} [options={}] 7911 * @param {Boolean} [options.deleteIfHandleOutsideImage] 7912 * @param {function} [options.doneMovingCallback] 7913 * @param {Boolean} [options.preventHandleOutsideImage] 7914 * @param {string} [interactionType=mouse] 7915 * @returns {undefined} 7916 */ 7917 7918/* harmony default export */ __webpack_exports__["default"] = (function (_ref, toolName, annotation, handle) { 7919 var element = _ref.element; 7920 var options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {}; 7921 var interactionType = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 'mouse'; 7922 // Use global defaults, unless overidden by provided options 7923 options = Object.assign({ 7924 deleteIfHandleOutsideImage: _store_index_js__WEBPACK_IMPORTED_MODULE_6__["state"].deleteIfHandleOutsideImage, 7925 preventHandleOutsideImage: _store_index_js__WEBPACK_IMPORTED_MODULE_6__["state"].preventHandleOutsideImage 7926 }, options); 7927 7928 var dragHandler = _dragHandler.bind(this, toolName, annotation, options, interactionType); // So we don't need to inline the entire `upOrEndHandler` function 7929 7930 7931 var upOrEndHandler = function upOrEndHandler(evt) { 7932 _upOrEndHandler(toolName, annotation, options, interactionType, { 7933 dragHandler: dragHandler, 7934 upOrEndHandler: upOrEndHandler 7935 }, evt); 7936 }; 7937 7938 annotation.active = true; 7939 _store_index_js__WEBPACK_IMPORTED_MODULE_6__["state"].isToolLocked = true; // Add Event Listeners 7940 7941 _dragEvents[interactionType].forEach(function (eventType) { 7942 element.addEventListener(eventType, dragHandler); 7943 }); 7944 7945 _upOrEndEvents[interactionType].forEach(function (eventType) { 7946 element.addEventListener(eventType, upOrEndHandler); 7947 }); 7948}); 7949 7950function _dragHandler(toolName, annotation) { 7951 var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; 7952 var interactionType = arguments.length > 3 ? arguments[3] : undefined; 7953 var evt = arguments.length > 4 ? arguments[4] : undefined; 7954 var _evt$detail = evt.detail, 7955 element = _evt$detail.element, 7956 image = _evt$detail.image, 7957 buttons = _evt$detail.buttons; 7958 var _evt$detail$deltaPoin = evt.detail.deltaPoints.image, 7959 x = _evt$detail$deltaPoin.x, 7960 y = _evt$detail$deltaPoin.y; 7961 annotation.active = true; 7962 annotation.invalidated = true; 7963 var handleKeys = Object.keys(annotation.handles); 7964 7965 for (var i = 0; i < handleKeys.length; i++) { 7966 var key = handleKeys[i]; 7967 var handle = annotation.handles[key]; 7968 7969 if ( // Don't move this part of the annotation 7970 handle.movesIndependently === true || // Not a true handle 7971 !handle.hasOwnProperty('x') || !handle.hasOwnProperty('y')) { 7972 continue; 7973 } 7974 7975 handle.x += x; 7976 handle.y += y; 7977 7978 if (options.preventHandleOutsideImage) { 7979 Object(_util_clip_js__WEBPACK_IMPORTED_MODULE_5__["clipToBox"])(handle, image); 7980 } 7981 } 7982 7983 _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.updateImage(element); 7984 var activeTool = Object(_util_getActiveTool__WEBPACK_IMPORTED_MODULE_7__["default"])(element, buttons, interactionType); 7985 7986 if (activeTool instanceof _tools_base_BaseAnnotationTool__WEBPACK_IMPORTED_MODULE_8__["default"]) { 7987 activeTool.updateCachedStats(image, element, annotation); 7988 } 7989 7990 var eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MEASUREMENT_MODIFIED; 7991 var modifiedEventData = { 7992 toolName: toolName, 7993 element: element, 7994 measurementData: annotation 7995 }; 7996 Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_4__["default"])(element, eventType, modifiedEventData); 7997 evt.preventDefault(); 7998 evt.stopPropagation(); 7999} 8000 8001function _upOrEndHandler(toolName, annotation) { 8002 var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; 8003 var interactionType = arguments.length > 3 ? arguments[3] : undefined; 8004 8005 var _ref2 = arguments.length > 4 ? arguments[4] : undefined, 8006 dragHandler = _ref2.dragHandler, 8007 upOrEndHandler = _ref2.upOrEndHandler; 8008 8009 var evt = arguments.length > 5 ? arguments[5] : undefined; 8010 var eventData = evt.detail; 8011 var element = evt.detail.element; 8012 annotation.active = false;
8013 annotation.invalidated = true; 8014 _store_index_js__WEBPACK_IMPORTED_MODULE_6__["state"].isToolLocked = false; // Remove Event Listeners 8015 8016 _dragEvents[interactionType].forEach(function (eventType) { 8017 element.removeEventListener(eventType, dragHandler); 8018 }); 8019 8020 _upOrEndEvents[interactionType].forEach(function (eventType) { 8021 element.removeEventListener(eventType, upOrEndHandler); 8022 }); // If any handle is outside the image, delete the tool data 8023 8024 8025 if (options.deleteIfHandleOutsideImage && Object(_anyHandlesOutsideImage_js__WEBPACK_IMPORTED_MODULE_2__["default"])(eventData, annotation.handles)) { 8026 Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__["removeToolState"])(element, toolName, annotation); 8027 } 8028 8029 if (typeof options.doneMovingCallback === 'function') { 8030 options.doneMovingCallback(); 8031 } 8032 8033 _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.updateImage(element); 8034} 8035 8036/***/ }), 8037
8038/***/ "./manipulators/moveHandle.js": 8039/*!************************************!*\ 8040 !*** ./manipulators/moveHandle.js ***! 8041 \************************************/ 8042/*! exports provided: default */ 8043/***/ (function(module, __webpack_exports__, __webpack_require__) { 8044 8045"use strict"; 8046__webpack_require__.r(__webpack_exports__); 8047/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../events.js */ "./events.js"); 8048/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js"); 8049/* harmony import */ var _anyHandlesOutsideImage_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./anyHandlesOutsideImage.js */ "./manipulators/anyHandlesOutsideImage.js"); 8050/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../stateManagement/toolState.js */ "./stateManagement/toolState.js"); 8051/* harmony import */ var _util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../util/triggerEvent.js */ "./util/triggerEvent.js"); 8052/* harmony import */ var _util_clip_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../util/clip.js */ "./util/clip.js"); 8053/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./../store/index.js */ "./store/index.js"); 8054/* harmony import */ var _util_getActiveTool__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../util/getActiveTool */ "./util/getActiveTool.js"); 8055/* harmony import */ var _tools_base_BaseAnnotationTool__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../tools/base/BaseAnnotationTool */ "./tools/base/BaseAnnotationTool.js"); 8056 8057 8058 8059 8060 8061 8062 8063 8064 8065var runAnimation = { 8066 value: false 8067}; 8068var _dragEvents = { 8069 mouse: [_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_DRAG], 8070 touch: [_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_DRAG] 8071}; 8072var _upOrEndEvents = { 8073 mouse: [_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_UP, _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_CLICK
8073], 8074 touch: [_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_END, _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_DRAG_END, _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_PINCH, _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_PRESS, _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TAP] 8075}; 8076/** 8077 * Move the provided handle 8078 * 8079 * @public 8080 * @method moveHandle 8081 * @memberof Manipulators 8082 * 8083 * @param {*} evtDetail 8084 * @param {*} toolName 8085 * @param {*} annotation 8086 * @param {*} handle 8087 * @param {*} [options={}] 8088 * @param {Boolean} [options.deleteIfHandleOutsideImage] 8089 * @param {function} [options.doneMovingCallback] 8090 * @param {Boolean} [options.preventHandleOutsideImage] 8091 * @param {*} [interactionType=mouse] 8092 * @returns {undefined} 8093 */ 8094 8095/* harmony default export */ __webpack_exports__["default"] = (function (evtDetail, toolName, annotation, handle) { 8096 var options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {}; 8097 var interactionType = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 'mouse'; 8098 // Use global defaults, unless overidden by provided options 8099 options = Object.assign({ 8100 deleteIfHandleOutsideImage: _store_index_js__WEBPACK_IMPORTED_MODULE_6__["state"].deleteIfHandleOutsideImage, 8101 preventHandleOutsideImage: _store_index_js__WEBPACK_IMPORTED_MODULE_6__["state"].preventHandleOutsideImage 8102 }, options); 8103 var element = evtDetail.element; 8104 8105 var dragHandler = _dragHandler.bind(this, toolName, annotation, handle, options, interactionType); // So we don't need to inline the entire `upOrEndHandler` function 8106 8107 8108 var upOrEndHandler = function upOrEndHandler(evt) { 8109 _upOrEndHandler(toolName, evtDetail, annotation, handle, options, interactionType, { 8110 dragHandler: dragHandler, 8111 upOrEndHandler: upOrEndHandler 8112 }, evt); 8113 }; 8114 8115 handle.active = true; 8116 annotation.active = true; 8117 _store_index_js__WEBPACK_IMPORTED_MODULE_6__["state"].isToolLocked = true; // Add Event Listeners 8118 8119 _dragEvents[interactionType].forEach(function (eventType) { 8120 element.addEventListener(eventType, dragHandler); 8121 }); 8122 8123 _upOrEndEvents[interactionType].forEach(function (eventType) { 8124 element.addEventListener(eventType, upOrEndHandler); 8125 }); // ========================== 8126 // ======== TOUCH ========== 8127 // ========================== 8128 8129 8130 if (interactionType === 'touch') { 8131 runAnimation.value = true; 8132 var enabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getEnabledElement(element); // Average pixel width of index finger is 45-57 pixels 8133 // https://www.smashingmagazine.com/2012/02/finger-friendly-design-ideal-mobile-touchscreen-target-sizes/ 8134 8135 var fingerDistance = -57; 8136 var aboveFinger = { 8137 x: evtDetail.currentPoints.page.x, 8138 y: evtDetail.currentPoints.page.y + fingerDistance 8139 }; 8140 var targetLocation = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pageToPixel(element, aboveFinger.x, aboveFinger.y); 8141 8142 _animate(handle, runAnimation, enabledElement, targetLocation); 8143 } 8144}); 8145 8146function _dragHandler(toolName, annotation, handle, options, interactionType, evt) { 8147 var _evt$detail = evt.detail, 8148 image = _evt$detail.image, 8149 currentPoints = _evt$detail.currentPoints, 8150 element = _evt$detail.element, 8151 buttons = _evt$detail.buttons; 8152 var page = currentPoints.page; 8153 var fingerOffset = -57; 8154 var targetLocation = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pageToPixel(element, page.x, interactionType === 'touch' ? page.y + fingerOffset : page.y); 8155 runAnimation.value = false; 8156 handle.active = true; 8157 handle.hasMoved = true; 8158 handle.x = targetLocation.x; 8159 handle.y = targetLocation.y; // TODO: A way to not flip this for textboxes on annotations 8160 8161 annotation.invalidated = true; 8162 8163 if (options.preventHandleOutsideImage) { 8164 Object(_util_clip_js__WEBPACK_IMPORTED_MODULE_5__["clipToBox"])(handle, image); 8165 } 8166 8167 _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.updateImage(element); 8168 var activeTool = Object(_util_getActiveTool__WEBPACK_IMPORTED_MODULE_7__["default"])(element, buttons, interactionType); 8169 8170 if (activeTool instanceof _tools_base_BaseAnnotationTool__WEBPACK_IMPORTED_MODULE_8__["default"]) { 8171 activeTool.updateCachedStats(image, element, annotation); 8172 } 8173 8174 var eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MEASUREMENT_MODIFIED; 8175 var modifiedEventData = { 8176 toolName: toolName, 8177 element: element, 8178 measurementData: annotation 8179 }; 8180 Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_4__["default"])(element, eventType, modifiedEventData); 8181} 8182 8183function _upOrEndHandler(toolName, evtDetail, annotation, handle) { 8184 var options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {}; 8185 var interactionType = arguments.length > 5 ? arguments[5] : undefined; 8186 8187 var _ref = arguments.length > 6 ? arguments[6] : undefined, 8188 dragHandler = _ref.dragHandler, 8189 upOrEndHandler = _ref.upOrEndHandler; 8190 8191 var evt = arguments.length > 7 ? arguments[7] : undefined; 8192 var image = evtDetail.currentPoints.image; 8193 var element = evt.detail.element; 8194 handle.active = false;
8195 annotation.active = false; // TODO: A way to not flip this for textboxes on annotations 8196 8197 annotation.invalidated = true; 8198 _store_index_js__WEBPACK_IMPORTED_MODULE_6__["state"].isToolLocked = false; 8199 runAnimation.value = false; // Remove Event Listeners 8200 8201 _dragEvents[interactionType].forEach(function (eventType) { 8202 element.removeEventListener(eventType, dragHandler); 8203 }); 8204 8205 _upOrEndEvents[interactionType].forEach(function (eventType) { 8206 element.removeEventListener(eventType, upOrEndHandler); 8207 }); // If any handle is outside the image, delete the tool data 8208 8209 8210 if (options.deleteIfHandleOutsideImage && Object(_anyHandlesOutsideImage_js__WEBPACK_IMPORTED_MODULE_2__["default"])(evtDetail, annotation.handles)) { 8211 Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__["removeToolState"])(element, toolName, annotation); 8212 } // TODO: What dark magic makes us want to handle TOUCH_PRESS differently? 8213 8214 8215 if (evt.type === _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_PRESS) { 8216 evt.detail.handlePressed = annotation; 8217 handle.x = image.x; // Original Event 8218 8219 handle.y = image.y; 8220 } 8221 8222 if (typeof options.doneMovingCallback === 'function') { 8223 options.doneMovingCallback(); 8224 } 8225 8226 _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.updateImage(element); 8227} 8228/** 8229 * Animates the provided handle using `requestAnimationFrame` 8230 * @private 8231 * @method _animate 8232 * 8233 * @param {*} handle 8234 * @param {*} runAnimation 8235 * @param {*} enabledElement 8236 * @param {*} targetLocation 8237 * @returns {undefined} 8238 */ 8239 8240 8241function _animate(handle, runAnimation, enabledElement, targetLocation) { 8242 if (!runAnimation.value) { 8243 return; 8244 } // Pixels / second 8245 8246 8247 var distanceRemaining = Math.abs(handle.y - targetLocation.y); 8248 var linearDistEachFrame = distanceRemaining / 10; 8249 8250 if (distanceRemaining < 1) { 8251 handle.y = targetLocation.y; 8252 runAnimation.value = false; 8253 return; 8254 } 8255 8256 if (handle.y > targetLocation.y) { 8257 handle.y -= linearDistEachFrame; 8258 } else if (handle.y < targetLocation.y) { 8259 handle.y += linearDistEachFrame; 8260 } // Update the image 8261 8262 8263 _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.updateImage(enabledElement.element); // Request a new frame 8264 8265 _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.requestAnimationFrame(function () { 8266 _animate(handle, runAnimation, enabledElement, targetLocation); 8267 }); 8268} 8269 8270/***/ }), 8271
8272/***/ "./manipulators/moveNewHandle.js": 8273/*!***************************************!*\ 8274 !*** ./manipulators/moveNewHandle.js ***! 8275 \***************************************/ 8276/*! exports provided: default */ 8277/***/ (function(module, __webpack_exports__, __webpack_require__) { 8278 8279"use strict"; 8280__webpack_require__.r(__webpack_exports__); 8281/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../events.js */ "./events.js"); 8282/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js"); 8283/* harmony import */ var _anyHandlesOutsideImage_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./anyHandlesOutsideImage.js */ "./manipulators/anyHandlesOutsideImage.js"); 8284/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../stateManagement/toolState.js */ "./stateManagement/toolState.js"); 8285/* harmony import */ var _util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../util/triggerEvent.js */ "./util/triggerEvent.js"); 8286/* harmony import */ var _util_clip_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../util/clip.js */ "./util/clip.js"); 8287/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./../store/index.js */ "./store/index.js"); 8288/* harmony import */ var _util_getActiveTool__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../util/getActiveTool */ "./util/getActiveTool.js"); 8289/* harmony import */ var _tools_base_BaseAnnotationTool__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../tools/base/BaseAnnotationTool */ "./tools/base/BaseAnnotationTool.js"); 8290 8291 8292 8293 8294 8295 8296 8297 8298 8299var _moveEvents = { 8300 mouse: [_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_MOVE, _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_DRAG], 8301 touch: [_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_DRAG] 8302}; 8303var _moveEndEvents = { 8304 mouse: [_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_UP, _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MOUSE_CLICK
8304], 8305 touch: [_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_END, _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_PINCH, _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TAP] 8306}; 8307/** 8308 * Move a new handle 8309 * @public 8310 * @method moveNewHandle 8311 * @memberof Manipulators 8312 * 8313 * @param {*} evtDetail 8314 * @param {*} toolName 8315 * @param {*} annotation 8316 * @param {*} handle 8317 * @param {*} [options={}] 8318 * @param {Boolean} [options.deleteIfHandleOutsideImage] 8319 * @param {function} [options.doneMovingCallback] 8320 * @param {Boolean} [options.preventHandleOutsideImage] 8321 * @param {*} [interactionType=mouse] 8322 * @returns {undefined} 8323 */ 8324 8325/* harmony default export */ __webpack_exports__["default"] = (function (evtDetail, toolName, annotation, handle, options) { 8326 var interactionType = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 'mouse'; 8327 // Use global defaults, unless overidden by provided options 8328 options = Object.assign({ 8329 deleteIfHandleOutsideImage: _store_index_js__WEBPACK_IMPORTED_MODULE_6__["state"].deleteIfHandleOutsideImage, 8330 preventHandleOutsideImage: _store_index_js__WEBPACK_IMPORTED_MODULE_6__["state"].preventHandleOutsideImage 8331 }, options); 8332 var element = evtDetail.element; 8333 annotation.active = true; 8334 handle.active = true; 8335 _store_index_js__WEBPACK_IMPORTED_MODULE_6__["state"].isToolLocked = true; 8336 8337 var moveHandler = _moveHandler.bind(this, toolName, annotation, handle, options, interactionType); // So we don't need to inline the entire `moveEndEventHandler` function 8338 8339 8340 var moveEndHandler = function moveEndHandler(evt) { 8341 _moveEndHandler(toolName, annotation, handle, options, interactionType, { 8342 moveHandler: moveHandler, 8343 moveEndHandler: moveEndHandler 8344 }, evt); 8345 }; // Add event listeners 8346 8347 8348 _moveEvents[interactionType].forEach(function (eventType) { 8349 element.addEventListener(eventType, moveHandler); 8350 }); 8351 8352 _moveEndEvents[interactionType].forEach(function (eventType) { 8353 element.addEventListener(eventType, moveEndHandler); 8354 }); 8355 8356 element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_START, _stopImmediatePropagation); 8357}); 8358 8359function _moveHandler(toolName, annotation, handle, options, interactionType, evt) { 8360 var _evt$detail = evt.detail, 8361 currentPoints = _evt$detail.currentPoints, 8362 image = _evt$detail.image, 8363 element = _evt$detail.element, 8364 buttons = _evt$detail.buttons; 8365 var page = currentPoints.page; 8366 var fingerOffset = -57; 8367 var targetLocation = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pageToPixel(element, interactionType === 'touch' ? page.x + fingerOffset : page.x, interactionType === 'touch' ? page.y + fingerOffset : page.y); 8368 annotation.invalidated = true; 8369 handle.active = true; 8370 handle.x = targetLocation.x; 8371 handle.y = targetLocation.y; 8372 8373 if (options && options.preventHandleOutsideImage) { 8374 Object(_util_clip_js__WEBPACK_IMPORTED_MODULE_5__["clipToBox"])(handle, image); 8375 } 8376 8377 _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.updateImage(element); 8378 var activeTool = Object(_util_getActiveTool__WEBPACK_IMPORTED_MODULE_7__["default"])(element, buttons, interactionType); 8379 8380 if (activeTool instanceof _tools_base_BaseAnnotationTool__WEBPACK_IMPORTED_MODULE_8__["default"]) { 8381 activeTool.updateCachedStats(image, element, annotation); 8382 } 8383 8384 var eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MEASUREMENT_MODIFIED; 8385 var modifiedEventData = { 8386 toolName: toolName, 8387 element: element, 8388 measurementData: annotation 8389 }; 8390 Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_4__["default"])(element, eventType, modifiedEventData); 8391} 8392 8393function _moveEndHandler(toolName, annotation, handle, options, interactionType, _ref, evt) { 8394 var moveHandler = _ref.moveHandler, 8395 moveEndHandler = _ref.moveEndHandler; 8396 var _evt$detail2 = evt.detail, 8397 element = _evt$detail2.element, 8398 currentPoints = _evt$detail2.currentPoints; 8399 var page = currentPoints.page; 8400 var fingerOffset = -57; 8401 var targetLocation = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.pageToPixel(element, interactionType === 'touch' ? page.x + fingerOffset : page.x, interactionType === 'touch' ? page.y + fingerOffset : page.y); // "Release" the handle 8402 8403 annotation.active = false;
8404 annotation.invalidated = true; 8405 handle.active = false; 8406 handle.x = targetLocation.x; 8407 handle.y = targetLocation.y; 8408 _store_index_js__WEBPACK_IMPORTED_MODULE_6__["state"].isToolLocked = false; // Remove event listeners 8409 8410 _moveEvents[interactionType].forEach(function (eventType) { 8411 element.removeEventListener(eventType, moveHandler); 8412 }); 8413 8414 _moveEndEvents[interactionType].forEach(function (eventType) { 8415 element.removeEventListener(eventType, moveEndHandler); 8416 }); 8417 8418 element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_START, _stopImmediatePropagation); // TODO: WHY? 8419 // Why would a Touch_Pinch or Touch_Press be associated with a new handle? 8420 8421 if (evt.type === _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_PINCH || evt.type === _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOUCH_PRESS) { 8422 handle.active = false; 8423 _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.updateImage(element); 8424 8425 if (typeof options.doneMovingCallback === 'function') { 8426 options.doneMovingCallback(); 8427 } 8428 8429 return; 8430 } 8431 8432 if (options.preventHandleOutsideImage) { 8433 Object(_util_clip_js__WEBPACK_IMPORTED_MODULE_5__["clipToBox"])(handle, evt.detail.image); 8434 } // If any handle is outside the image, delete the tool data 8435 8436 8437 if (options.deleteIfHandleOutsideImage && Object(_anyHandlesOutsideImage_js__WEBPACK_IMPORTED_MODULE_2__["default"])(evt.detail, annotation.handles)) { 8438 Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__["removeToolState"])(element, toolName, annotation); 8439 } 8440 8441 if (typeof options.doneMovingCallback === 'function') { 8442 options.doneMovingCallback(); 8443 } // Update Image 8444 8445 8446 _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.updateImage(element); 8447} 8448/** 8449 * Stop the CornerstoneToolsTouchStart event from 8450 * Becoming a CornerstoneToolsTouchStartActive event when 8451 * MoveNewHandle ends 8452 * 8453 * @private 8454 * @function _stopImmediatePropagation 8455 * 8456 * @param {*} evt 8457 * @returns {Boolean} false 8458 */ 8459 8460 8461function _stopImmediatePropagation(evt) { 8462 evt.stopImmediatePropagation(); 8463 return false; 8464} 8465 8466/***/ }), 8467
8468/***/ "./mixins/activeOrDisabledBinaryTool.js": 8469/*!**********************************************!*\ 8470 !*** ./mixins/activeOrDisabledBinaryTool.js ***! 8471 \**********************************************/ 8472/*! exports provided: default */ 8473/***/ (function(module, __webpack_exports__, __webpack_require__) { 8474 8475"use strict"; 8476__webpack_require__.r(__webpack_exports__); 8477/* harmony import */ var _store_setToolMode_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../store/setToolMode.js */ "./store/setToolMode.js"); 8478 8479/** 8480 * If one attempts to change mode to 'passive', redirect the tool to 'disabled'. 8481 * 8482 * @param {HTMLElement} element The element on which the tool resides. 8483 * @returns {undefined} 8484 */ 8485 8486function passiveCallback(element) { 8487 Object(_store_setToolMode_js__WEBPACK_IMPORTED_MODULE_0__["setToolDisabledForElement"])(element, this.name); 8488} 8489/** 8490 * If one attempts to turn the tool 'enabled', redirect the tool to 'active'. 8491 * 8492 * @param {HTMLElement} element The element on which the tool resides. 8493 * @returns {undefined} 8494 */ 8495 8496 8497function enabledCallback(element) { 8498 Object(_store_setToolMode_js__WEBPACK_IMPORTED_MODULE_0__["setToolActiveForElement"])(element, this.name); 8499} 8500/** 8501 * @mixin activeOrDisabledBinaryTool - Redirect enabled/passive mode changes to active/disabled. 8502 * @memberof Mixins 8503 */ 8504 8505 8506/* harmony default export */ __webpack_exports__["default"] = ({ 8507 passiveCallback: passiveCallback, 8508 enabledCallback: enabledCallback 8509}); 8510 8511/***/ }), 8512
8513/***/ "./mixins/enabledOrDisabledBinaryTool.js": 8514/*!***********************************************!*\ 8515 !*** ./mixins/enabledOrDisabledBinaryTool.js ***! 8516 \***********************************************/ 8517/*! exports provided: default */ 8518/***/ (function(module, __webpack_exports__, __webpack_require__) { 8519 8520"use strict"; 8521__webpack_require__.r(__webpack_exports__); 8522/* harmony import */ var _store_setToolMode_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../store/setToolMode.js */ "./store/setToolMode.js"); 8523 8524/** 8525 * If one attempts to change mode to 'passive', redirect the tool to 'disabled'. 8526 * 8527 * @param {HTMLElement} element The element on which the tool resides. 8528 * @returns {undefined} 8529 */ 8530 8531function passiveCallback(element) { 8532 Object(_store_setToolMode_js__WEBPACK_IMPORTED_MODULE_0__["setToolDisabledForElement"])(element, this.name); 8533} 8534/** 8535 * If one attempts to change mode to 'active', redirect the tool to 'enabled'. 8536 * 8537 * @param {HTMLElement} element The element on which the tool resides. 8538 * @returns {undefined} 8539 */ 8540 8541 8542function activeCallback(element) { 8543 Object(_store_setToolMode_js__WEBPACK_IMPORTED_MODULE_0__["setToolEnabledForElement"])(element, this.name); 8544} 8545/** 8546 * 8547 * @mixin enabledOrDisabledBinaryTool - Redirect active/passive mode changes to enabled/disabled. 8548 * @memberof Mixins 8549 */ 8550 8551 8552/* harmony default export */ __webpack_exports__["default"] = ({ 8553 passiveCallback: passiveCallback, 8554 activeCallback: activeCallback 8555}); 8556 8557/***/ }), 8558
8559/***/ "./mixins/index.js": 8560/*!*************************!*\ 8561 !*** ./mixins/index.js ***! 8562 \*************************/ 8563/*! exports provided: default */ 8564/***/ (function(module, __webpack_exports__, __webpack_require__) { 8565 8566"use strict"; 8567__webpack_require__.r(__webpack_exports__); 8568/* harmony import */ var _activeOrDisabledBinaryTool_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./activeOrDisabledBinaryTool.js */ "./mixins/activeOrDisabledBinaryTool.js"); 8569/* harmony import */ var _enabledOrDisabledBinaryTool_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./enabledOrDisabledBinaryTool.js */ "./mixins/enabledOrDisabledBinaryTool.js"); 8570 8571 8572/* harmony default export */ __webpack_exports__["default"] = ({ 8573 activeOrDisabledBinaryTool: _activeOrDisabledBinaryTool_js__WEBPACK_IMPORTED_MODULE_0__["default"], 8574 enabledOrDisabledBinaryTool: _enabledOrDisabledBinaryTool_js__WEBPACK_IMPORTED_MODULE_1__["default"] 8575}); 8576 8577/***/ }), 8578
8579/***/ "./orientation/getOrientationString.js": 8580/*!*********************************************!*\ 8581 !*** ./orientation/getOrientationString.js ***! 8582 \*********************************************/ 8583/*! exports provided: default */ 8584/***/ (function(module, __webpack_exports__, __webpack_require__) { 8585 8586"use strict"; 8587__webpack_require__.r(__webpack_exports__); 8588/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js"); 8589/* harmony import */ var _util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../util/convertToVector3.js */ "./util/convertToVector3.js"); 8590 8591 8592/** 8593 * Returns the orientation of the vector in the patient coordinate system. 8594 * @public 8595 * @function getOrientationString 8596 * 8597 * @param {Array|cornerstoneMath.Vector3} vector Input array or Vector3 8598 * @returns {string} The orientation in the patient coordinate system. 8599 */ 8600 8601/* harmony default export */ __webpack_exports__["default"] = (function (vector) { 8602 var vec3 = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_1__["default"])(vector); // Thanks to David Clunie 8603 // https://sites.google.com/site/dicomnotes/ 8604 8605 var orientation = ''; 8606 var orientationX = vec3.x < 0 ? 'R' : 'L'; 8607 var orientationY = vec3.y < 0 ? 'A' : 'P'; 8608 var orientationZ = vec3.z < 0 ? 'F' : 'H'; // Should probably make this a function vector3.abs 8609 8610 var abs = new _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.Vector3(Math.abs(vec3.x), Math.abs(vec3.y), Math.abs(vec3.z)); 8611 8612 for (var i = 0; i < 3; i++) { 8613 if (abs.x > 0.0001 && abs.x > abs.y && abs.x > abs.z) { 8614 orientation += orientationX; 8615 abs.x = 0; 8616 } else if (abs.y > 0.0001 && abs.y > abs.x && abs.y > abs.z) { 8617 orientation += orientationY; 8618 abs.y = 0; 8619 } else if (abs.z > 0.0001 && abs.z > abs.x && abs.z > abs.y) { 8620 orientation += orientationZ; 8621 abs.z = 0; 8622 } else { 8623 break; 8624 } 8625 } 8626 8627 return orientation; 8628}); 8629 8630/***/ }), 8631
8632/***/ "./orientation/index.js": 8633/*!******************************!*\ 8634 !*** ./orientation/index.js ***! 8635 \******************************/ 8636/*! exports provided: default */ 8637/***/ (function(module, __webpack_exports__, __webpack_require__) { 8638 8639"use strict"; 8640__webpack_require__.r(__webpack_exports__); 8641/* harmony import */ var _getOrientationString_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getOrientationString.js */ "./orientation/getOrientationString.js"); 8642/* harmony import */ var _invertOrientationString_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./invertOrientationString.js */ "./orientation/invertOrientationString.js"); 8643 8644 8645var orientation = { 8646 getOrientationString: _getOrientationString_js__WEBPACK_IMPORTED_MODULE_0__["default"], 8647 invertOrientationString: _invertOrientationString_js__WEBPACK_IMPORTED_MODULE_1__["default"] 8648}; 8649/* harmony default export */ __webpack_exports__["default"] = (orientation); 8650 8651/***/ }), 8652
8653/***/ "./orientation/invertOrientationString.js": 8654/*!************************************************!*\ 8655 !*** ./orientation/invertOrientationString.js ***! 8656 \************************************************/ 8657/*! exports provided: default */ 8658/***/ (function(module, __webpack_exports__, __webpack_require__) { 8659 8660"use strict"; 8661__webpack_require__.r(__webpack_exports__); 8662/** 8663 * Inverts an orientation string. 8664 * @public 8665 * @function invertOrientationString 8666 * 8667 * @param {string} orientationString The orientation. 8668 * @returns {string} The inverted orientationString. 8669 */ 8670/* harmony default export */ __webpack_exports__["default"] = (function (orientationString) { 8671 var inverted = orientationString.replace('H', 'f'); 8672 inverted = inverted.replace('F', 'h'); 8673 inverted = inverted.replace('R', 'l'); 8674 inverted = inverted.replace('L', 'r'); 8675 inverted = inverted.replace('A', 'p'); 8676 inverted = inverted.replace('P', 'a'); 8677 inverted = inverted.toUpperCase(); 8678 return inverted; 8679}); 8680 8681/***/ }), 8682
8683/***/ "./requestPool/requestPoolManager.js": 8684/*!*******************************************!*\ 8685 !*** ./requestPool/requestPoolManager.js ***! 8686 \*******************************************/ 8687/*! exports provided: default */ 8688/***/ (function(module, __webpack_exports__, __webpack_require__) { 8689 8690"use strict"; 8691__webpack_require__.r(__webpack_exports__); 8692/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js"); 8693/* harmony import */ var _util_getMaxSimultaneousRequests_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../util/getMaxSimultaneousRequests.js */ "./util/getMaxSimultaneousRequests.js"); 8694 8695 8696var requestPool = { 8697 interaction: [], 8698 thumbnail: [], 8699 prefetch: [] 8700}; 8701var numRequests = { 8702 interaction: 0, 8703 thumbnail: 0, 8704 prefetch: 0 8705}; 8706var maxNumRequests = { 8707 interaction: 6, 8708 thumbnail: 6, 8709 prefetch: 5 8710}; 8711var awake = false; 8712var grabDelay = 20; 8713 8714function addRequest(element, imageId, type, preventCache, doneCallback, failCallback, addToBeginning) { 8715 if (!requestPool.hasOwnProperty(type)) { 8716 throw new Error('Request type must be one of interaction, thumbnail, or prefetch'); 8717 } 8718 8719 if (!element || !imageId) { 8720 return; 8721 } // Describe the request 8722 8723 8724 var requestDetails = { 8725 type: type, 8726 imageId: imageId, 8727 preventCache: preventCache, 8728 doneCallback: doneCallback, 8729 failCallback: failCallback 8730 }; // If this imageId is in the cache, resolve it immediately 8731 8732 var imageLoadObject = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.imageCache.getImageLoadObject(imageId); 8733 8734 if (imageLoadObject) { 8735 imageLoadObject.promise.then(function (image) { 8736 doneCallback(image); 8737 }, function (error) { 8738 failCallback(error); 8739 }); 8740 return; 8741 } 8742 8743 if (addToBeginning) { 8744 // Add it to the beginning of the stack 8745 requestPool[type].unshift(requestDetails); 8746 } else { 8747 // Add it to the end of the stack 8748 requestPool[type].push(requestDetails); 8749 } // Wake up 8750 8751 8752 awake = true; 8753} 8754 8755function clearRequestStack(type) { 8756 // Console.log('clearRequestStack'); 8757 if (!requestPool.hasOwnProperty(type)) { 8758 throw new Error('Request type must be one of interaction, thumbnail, or prefetch'); 8759 } 8760 8761 requestPool[type] = []; 8762} 8763 8764function startAgain() { 8765 if (!awake) { 8766 return; 8767 } 8768 8769 setTimeout(function () { 8770 startGrabbing(); 8771 }, grabDelay); 8772} 8773 8774function sendRequest(requestDetails) { 8775 var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone; // Increment the number of current requests of this type 8776 8777 var type = requestDetails.type; 8778 numRequests[type]++; 8779 awake = true; 8780 var imageId = requestDetails.imageId; 8781 var doneCallback = requestDetails.doneCallback; 8782 var failCallback = requestDetails.failCallback; // Check if we already have this image promise in the cache 8783 8784 var imageLoadObject = cornerstone.imageCache.getImageLoadObject(imageId); 8785 8786 if (imageLoadObject) { 8787 // If we do, remove from list (when resolved, as we could have 8788 // Pending prefetch requests) and stop processing this iteration 8789 imageLoadObject.promise.then(function (image) { 8790 numRequests[type]--; // Console.log(numRequests); 8791 8792 doneCallback(image); 8793 startAgain(); 8794 }, function (error) { 8795 numRequests[type]--; // Console.log(numRequests); 8796 8797 failCallback(error); 8798 startAgain(); 8799 }); 8800 return; 8801 } 8802 8803 function requestTypeToLoadPriority(requestDetails) { 8804 if (requestDetails.type === 'prefetch') { 8805 return -5; 8806 } else if (requestDetails.type === 'interactive') { 8807 return 0; 8808 } else if (requestDetails.type === 'thumbnail') { 8809 return 5; 8810 } 8811 } 8812 8813 var priority = requestTypeToLoadPriority(requestDetails); 8814 var loader; 8815 8816 if (requestDetails.preventCache === true) { 8817 loader = cornerstone.loadImage(imageId, { 8818 priority: priority, 8819 type: requestDetails.type 8820 }); 8821 } else { 8822 loader = cornerstone.loadAndCacheImage(imageId, { 8823 priority: priority, 8824 type: requestDetails.type 8825 }); 8826 } // Load and cache the image 8827 8828 8829 loader.then(function (image) { 8830 numRequests[type]--; // Console.log(numRequests); 8831 8832 doneCallback(image); 8833 startAgain(); 8834 }, function (error) { 8835 numRequests[type]--; // Console.log(numRequests); 8836 8837 failCallback(error); 8838 startAgain(); 8839 }); 8840} 8841 8842function startGrabbing() { 8843 // Begin by grabbing X images 8844 var maxSimultaneousRequests = Object(_util_getMaxSimultaneousRequests_js__WEBPACK_IMPORTED_MODULE_1__["getMaxSimultaneousRequests"])(); 8845 maxNumRequests = { 8846 interaction: Math.max(maxSimultaneousRequests, 1), 8847 thumbnail: Math.max(maxSimultaneousRequests - 2, 1), 8848 prefetch: Math.max(maxSimultaneousRequests - 1, 1) 8849 }; 8850 var currentRequests = numRequests.interaction + numRequests.thumbnail + numRequests.prefetch; 8851 var requestsToSend = maxSimultaneousRequests - currentRequests; 8852 8853 for (var i = 0; i < requestsToSend; i++) { 8854 var requestDetails = getNextRequest(); 8855 8856 if (requestDetails) { 8857 sendRequest(requestDetails); 8858 } 8859 } 8860} 8861 8862function getNextRequest() { 8863 if (requestPool.interaction.length && numRequests.interaction < maxNumRequests.interaction) { 8864 return requestPool.interaction.shift(); 8865 } 8866 8867 if (requestPool.thumbnail.length && numRequests.thumbnail < maxNumRequests.thumbnail) { 8868 return requestPool.thumbnail.shift(); 8869 } 8870 8871 if (requestPool.prefetch.length && numRequests.prefetch < maxNumRequests.prefetch) { 8872 return requestPool.prefetch.shift(); 8873 } 8874 8875 if (!requestPool.interaction.length && !requestPool.thumbnail.length && !requestPool.prefetch.length) { 8876 awake = false;
8877 } 8878 8879 return false; 8880} 8881 8882function getRequestPool() { 8883 return requestPool; 8884} 8885 8886/* harmony default export */ __webpack_exports__["default"] = ({ 8887 numRequests, 8888 addRequest: addRequest, 8889 clearRequestStack: clearRequestStack, 8890 startGrabbing: startGrabbing, 8891 getRequestPool: getRequestPool 8892}); 8893 8894/***/ }), 8895
8896/***/ "./stackTools/fusionRenderer.js": 8897/*!**************************************!*\ 8898 !*** ./stackTools/fusionRenderer.js ***! 8899 \**************************************/ 8900/*! exports provided: default */ 8901/***/ (function(module, __webpack_exports__, __webpack_require__) { 8902 8903"use strict"; 8904__webpack_require__.r(__webpack_exports__); 8905/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return FusionRenderer; }); 8906/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js"); 8907/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); 8908/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js"); 8909/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); 8910/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js"); 8911/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../stateManagement/toolState.js */ "./stateManagement/toolState.js"); 8912 8913 8914 8915 8916 8917var FusionRenderer = 8918/*#__PURE__*/ 8919function () { 8920 function FusionRenderer() { 8921 _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, FusionRenderer); 8922 8923 this.currentImageIdIndex = 0; 8924 this.layerIds = []; 8925 this.findImageFn = undefined; 8926 } 8927 8928 _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(FusionRenderer, [{ 8929 key: "render", 8930 value: function render(element, imageStacks) { 8931 var _this = this; 8932 8933 // Move this to base Renderer class 8934 if (!Number.isInteger(this.currentImageIdIndex)) { 8935 throw new Error('FusionRenderer: render - Image ID Index is not an integer'); 8936 } 8937 8938 if (!this.findImageFn) { 8939 throw new Error('No findImage function has been defined'); 8940 } 8941 8942 if (!imageStacks) { 8943 var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__["getToolState"])(element, 'stack'); 8944 imageStacks = toolData.data; 8945 } // TODO: Figure out what to do with LoadHandlers in this scenario... 8946 8947 8948 var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_2__["default"].cornerstone; // For the base layer, go to the currentImageIdIndex 8949 8950 var baseImageObject = imageStacks[0]; 8951 var currentImageId = baseImageObject.imageIds[this.currentImageIdIndex]; 8952 var overlayImageStacks = imageStacks.slice(1, imageStacks.length); 8953 cornerstone.loadAndCacheImage(currentImageId).then(function (baseImage) { 8954 var baseLayerId = _this.layerIds[0]; // Get the base layer if one exists 8955 8956 if (baseLayerId) { 8957 cornerstone.setLayerImage(element, baseImage, baseLayerId); 8958 } else { 8959 // Otherwise, create a new layer with the base layer's image 8960 baseLayerId = cornerstone.addLayer(element, baseImage, baseImageObject.options); 8961 8962 _this.layerIds.push(baseLayerId); 8963 } // Display the image immediately while the overlay images are identified 8964 8965 8966 cornerstone.displayImage(element, baseImage); // Loop through the remaining 'overlay' image stacks 8967 8968 overlayImageStacks.forEach(function (imgObj, overlayLayerIndex) { 8969 var imageId = _this.findImageFn(imgObj.imageIds, currentImageId); 8970 8971 var layerIndex = overlayLayerIndex + 1; 8972 var currentLayerId = _this.layerIds[layerIndex]; // If no layer exists yet for this overlaid stack, create 8973 // One and add it to the layerIds property for this instance 8974 // Of the fusion renderer. 8975 8976 if (!currentLayerId) { 8977 currentLayerId = cornerstone.addLayer(element, undefined, imgObj.options); 8978 8979 _this.layerIds.push(currentLayerId); 8980 } 8981 8982 if (imageId) { 8983 // If an imageId was returned from the findImage function, 8984 // Load it, make sure it's visible and update the layer
8985 // With the new image object. 8986 cornerstone.loadAndCacheImage(imageId).then(function (image) { 8987 cornerstone.setLayerImage(element, image, currentLayerId); 8988 cornerstone.updateImage(element); 8989 }); 8990 } else { 8991 // If no imageId was returned from the findImage function. 8992 // This means that there is no relevant image to display. 8993 cornerstone.setLayerImage(element, undefined, currentLayerId); 8994 cornerstone.setActiveLayer(element, baseLayerId); 8995 cornerstone.updateImage(element); 8996 } 8997 }); 8998 }); 8999 } 9000 }]); 9001 9002 return FusionRenderer; 9003}(); 9004 9005 9006 9007/***/ }), 9008
9009/***/ "./stackTools/playClip.js": 9010/*!********************************!*\ 9011 !*** ./stackTools/playClip.js ***! 9012 \********************************/ 9013/*! exports provided: playClip, stopClip */ 9014/***/ (function(module, __webpack_exports__, __webpack_require__) { 9015 9016"use strict"; 9017__webpack_require__.r(__webpack_exports__); 9018/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "playClip", function() { return playClip; }); 9019/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "stopClip", function() { return stopClip; }); 9020/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../events.js */ "./events.js"); 9021/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js"); 9022/* harmony import */ var _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../stateManagement/loadHandlerManager.js */ "./stateManagement/loadHandlerManager.js"); 9023/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../stateManagement/toolState.js */ "./stateManagement/toolState.js"); 9024/* harmony import */ var _util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../util/triggerEvent.js */ "./util/triggerEvent.js"); 9025 9026 9027 9028 9029 9030var toolType = 'playClip'; 9031/** 9032 * [private] Turns a Frame Time Vector (0018,1065) array into a normalized array of timeouts. Each element 9033 * ... of the resulting array represents the amount of time each frame will remain on the screen. 9034 * @param {Array} vector A Frame Time Vector (0018,1065) as specified in section C.7.6.5.1.2 of DICOM standard. 9035 * @param {Number} speed A speed factor which will be applied to each element of the resulting array. 9036 * @returns {Array} An array with timeouts for each animation frame. 9037 */ 9038 9039function getPlayClipTimeouts(vector, speed) { 9040 var i; 9041 var sample; 9042 var delay; 9043 var sum = 0; 9044 var limit = vector.length; 9045 var timeouts = []; // Initialize time varying to false 9046 9047 timeouts.isTimeVarying = false; 9048 9049 if (typeof speed !== 'number' || speed <= 0) { 9050 speed = 1; 9051 } // First element of a frame time vector must be discarded 9052 9053 9054 for (i = 1; i < limit; i++) { 9055 // eslint-disable-next-line no-bitwise 9056 delay = Number(vector[i]) / speed | 0; // Integral part only 9057 9058 timeouts.push(delay); 9059 9060 if (i === 1) { 9061 // Use first item as a sample for comparison 9062 sample = delay; 9063 } else if (delay !== sample) { 9064 timeouts.isTimeVarying = true; 9065 } 9066 9067 sum += delay; 9068 } 9069 9070 if (timeouts.length > 0) { 9071 if (timeouts.isTimeVarying) { 9072 // If it's a time varying vector, make the last item an average... 9073 // eslint-disable-next-line no-bitwise 9074 delay = sum / timeouts.length | 0; 9075 } else { 9076 delay = timeouts[0]; 9077 } 9078 9079 timeouts.push(delay); 9080 } 9081 9082 return timeouts; 9083} 9084/** 9085 * [private] Performs the heavy lifting of stopping an ongoing animation. 9086 * @param {Object} playClipData The data from playClip that needs to be stopped. 9087 * @returns {void} 9088 */ 9089 9090 9091function stopClipWithData(playClipData) { 9092 var id = playClipData.intervalId; 9093 9094 if (typeof id !== 'undefined') { 9095 playClipData.intervalId = undefined; 9096 9097 if (playClipData.usingFrameTimeVector) { 9098 clearTimeout(id); 9099 } else { 9100 clearInterval(id); 9101 } 9102 } 9103} 9104/** 9105 * [private] Trigger playClip tool stop event. 9106 * @param {HTMLElement} element 9107 * @returns {void} 9108 */ 9109 9110 9111function triggerStopEvent(element) { 9112 var eventDetail = { 9113 element: element 9114 }; 9115 Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_4__["default"])(element, _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].CLIP_STOPPED, eventDetail); 9116} 9117/** 9118 * Starts playing a clip or adjusts the frame rate of an already playing clip. framesPerSecond is 9119 * optional and defaults to 30 if not specified. A negative framesPerSecond will play the clip in reverse. 9120 * The element must be a stack of images 9121 * @param {HTMLElement} element 9122 * @param {number} framesPerSecond 9123 * @returns {void} 9124 */ 9125 9126 9127function playClip(element, framesPerSecond) { 9128 var playClipData; 9129 var playClipTimeouts; 9130 9131 if (element === undefined) { 9132 throw new Error('playClip: element must not be undefined'); 9133 } 9134 9135 var stackToolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__["getToolState"])(element, 'stack'); 9136 9137 if (!stackToolData || !stackToolData.data || !stackToolData.data.length) { 9138 return; 9139 } 9140 9141 var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone; // If we have more than one stack, check if we have a stack renderer defined 9142 9143 var stackRenderer; 9144 9145 if (stackToolData.data.length > 1) { 9146 var stackRendererData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__["getToolState"])(element, 'stackRenderer'); 9147 9148 if (stackRendererData && stackRendererData.data && stackRendererData.data.length) { 9149 stackRenderer = stackRendererData.data[0]; 9150 } 9151 } 9152 9153 var stackData = stackToolData.data[0]; 9154 var playClipToolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__["getToolState"])(element, toolType); 9155 9156 if (!playClipToolData || !playClipToolData.data || !playClipToolData.data.length) { 9157 playClipData = { 9158 intervalId: undefined, 9159 framesPerSecond: 30, 9160 lastFrameTimeStamp: undefined, 9161 frameRate: 0, 9162 frameTimeVector: undefined, 9163 ignoreFrameTimeVector: false, 9164 usingFrameTimeVector: false, 9165 speed: 1, 9166 reverse: false, 9167 loop: true 9168 };
9169 Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__["addToolState"])(element, toolType, playClipData); 9170 } else { 9171 playClipData = playClipToolData.data[0]; // Make sure the specified clip is not running before any property update 9172 9173 stopClipWithData(playClipData); 9174 } // If a framesPerSecond is specified and is valid, update the playClipData now 9175 9176 9177 if (framesPerSecond < 0 || framesPerSecond > 0) { 9178 playClipData.framesPerSecond = Number(framesPerSecond); 9179 playClipData.reverse = playClipData.framesPerSecond < 0; // If framesPerSecond is given, frameTimeVector will be ignored... 9180 9181 playClipData.ignoreFrameTimeVector = true; 9182 } // Determine if frame time vector should be used instead of a fixed frame rate... 9183 9184 9185 if (playClipData.ignoreFrameTimeVector !== true && playClipData.frameTimeVector && playClipData.frameTimeVector.length === stackData.imageIds.length) { 9186 playClipTimeouts = getPlayClipTimeouts(playClipData.frameTimeVector, playClipData.speed); 9187 } // This function encapsulates the frame rendering logic... 9188 9189 9190 var playClipAction = function playClipAction() { 9191 // Hoisting of context variables 9192 var loader, 9193 startLoadingHandler, 9194 endLoadingHandler, 9195 errorLoadingHandler, 9196 newImageIdIndex = stackData.currentImageIdIndex; 9197 var imageCount = stackData.imageIds.length; 9198 9199 if (playClipData.reverse) { 9200 newImageIdIndex--; 9201 } else { 9202 newImageIdIndex++; 9203 } 9204 9205 if (!playClipData.loop && (newImageIdIndex < 0 || newImageIdIndex >= imageCount)) { 9206 stopClipWithData(playClipData); 9207 triggerStopEvent(element); 9208 return; 9209 } // Loop around if we go outside the stack 9210 9211 9212 if (newImageIdIndex >= imageCount) { 9213 newImageIdIndex = 0; 9214 } 9215 9216 if (newImageIdIndex < 0) { 9217 newImageIdIndex = imageCount - 1; 9218 } 9219 9220 if (newImageIdIndex !== stackData.currentImageIdIndex) { 9221 startLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__["default"].getStartLoadHandler(element); 9222 endLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__["default"].getEndLoadHandler(element); 9223 errorLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__["default"].getErrorLoadingHandler(element); 9224 9225 if (startLoadingHandler) { 9226 startLoadingHandler(element); 9227 } 9228 9229 if (stackData.preventCache === true) { 9230 loader = cornerstone.loadImage(stackData.imageIds[newImageIdIndex]); 9231 } else { 9232 loader = cornerstone.loadAndCacheImage(stackData.imageIds[newImageIdIndex]); 9233 } 9234 9235 loader.then(function (image) { 9236 try { 9237 stackData.currentImageIdIndex = newImageIdIndex; 9238 9239 if (stackRenderer) { 9240 stackRenderer.currentImageIdIndex = newImageIdIndex; 9241 stackRenderer.render(element, stackToolData.data); 9242 } else { 9243 cornerstone.displayImage(element, image); 9244 } 9245 9246 if (endLoadingHandler) { 9247 endLoadingHandler(element, image); 9248 } 9249 } catch (error) { 9250 return; 9251 } 9252 }, function (error) { 9253 var imageId = stackData.imageIds[newImageIdIndex]; 9254 9255 if (errorLoadingHandler) { 9256 errorLoadingHandler(element, imageId, error); 9257 } 9258 }); 9259 } 9260 }; // If playClipTimeouts array is available, not empty and its elements are NOT uniform ... 9261 // ... (at least one timeout is different from the others), use alternate setTimeout implementation 9262 9263 9264 if (playClipTimeouts && playClipTimeouts.length > 0 && playClipTimeouts.isTimeVarying) { 9265 playClipData.usingFrameTimeVector = true; 9266 playClipData.intervalId = setTimeout(function playClipTimeoutHandler() { 9267 playClipData.intervalId = setTimeout(playClipTimeoutHandler, playClipTimeouts[stackData.currentImageIdIndex]); 9268 playClipAction(); 9269 }, 0); 9270 } else { 9271 // ... otherwise user setInterval implementation which is much more efficient. 9272 playClipData.usingFrameTimeVector = false; 9273 playClipData.intervalId = setInterval(playClipAction, 1000 / Math.abs(playClipData.framesPerSecond)); 9274 } 9275} 9276/** 9277 * Stops an already playing clip. 9278 * @param {HTMLElement} element 9279 * @returns {void} 9280 */ 9281 9282 9283function stopClip(element) { 9284 var playClipToolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__["getToolState"])(element, toolType); 9285 9286 if (!playClipToolData || !playClipToolData.data || !playClipToolData.data.length) { 9287 return; 9288 } 9289 9290 stopClipWithData(playClipToolData.data[0]); 9291} 9292 9293 9294 9295/***/ }), 9296
9297/***/ "./stackTools/stackPrefetch.js": 9298/*!*************************************!*\ 9299 !*** ./stackTools/stackPrefetch.js ***! 9300 \*************************************/ 9301/*! exports provided: default */ 9302/***/ (function(module, __webpack_exports__, __webpack_require__) { 9303 9304"use strict"; 9305__webpack_require__.r(__webpack_exports__); 9306/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../externalModules.js */ "./externalModules.js"); 9307/* harmony import */ var _requestPool_requestPoolManager_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../requestPool/requestPoolManager.js */ "./requestPool/requestPoolManager.js"); 9308/* harmony import */ var _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../stateManagement/loadHandlerManager.js */ "./stateManagement/loadHandlerManager.js"); 9309/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../stateManagement/toolState.js */ "./stateManagement/toolState.js"); 9310/* harmony import */ var _util_getMaxSimultaneousRequests_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../util/getMaxSimultaneousRequests.js */ "./util/getMaxSimultaneousRequests.js"); 9311/* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../util/logger.js */ "./util/logger.js"); 9312 9313 9314 9315 9316 9317 9318var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_5__["getLogger"])('stackTools:stackPrefetch'); 9319var toolType = 'stackPrefetch'; 9320var requestType = 'prefetch'; 9321var configuration = { 9322 maxImagesToPrefetch: Infinity 9323}; 9324var resetPrefetchTimeout; 9325var resetPrefetchDelay = 10; 9326 9327function range(lowEnd, highEnd) { 9328 // Javascript version of Python's range function 9329 // http://stackoverflow.com/questions/3895478/does-javascript-have-a-method-like-range-to-generate-an-array-based-on-suppl 9330 lowEnd = Math.round(lowEnd) || 0; 9331 highEnd = Math.round(highEnd) || 0; 9332 var arr = []; 9333 var c = highEnd - lowEnd + 1; 9334 9335 if (c <= 0) { 9336 return arr; 9337 } 9338 9339 while (c--) { 9340 arr[c] = highEnd--; 9341 } 9342 9343 return arr; 9344} 9345 9346var max = function max(arr) { 9347 return Math.max.apply(null, arr); 9348}; 9349 9350var min = function min(arr) { 9351 return Math.min.apply(null, arr); 9352}; 9353 9354function nearestIndex(arr, x) { 9355 // Return index of nearest values in array 9356 // http://stackoverflow.com/questions/25854212/return-index-of-nearest-values-in-an-array 9357 var l = []; 9358 var h = []; 9359 arr.forEach(function (v) { 9360 if (v < x) { 9361 l.push(v); 9362 } else if (v > x) { 9363 h.push(v); 9364 } 9365 }); 9366 return { 9367 low: arr.indexOf(max(l)), 9368 high: arr.indexOf(min(h)) 9369 }; 9370} 9371 9372function prefetch(element) { 9373 // Check to make sure stack data exists 9374 var stackData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__["getToolState"])(element, 'stack'); 9375 9376 if (!stackData || !stackData.data || !stackData.data.length) { 9377 return; 9378 } 9379 9380 var stack = stackData.data[0]; // Get the stackPrefetch tool data 9381 9382 var stackPrefetchData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__["getToolState"])(element, toolType); 9383 9384 if (!stackPrefetchData) { 9385 return; 9386 } 9387 9388 var stackPrefetch = stackPrefetchData.data[0] || {}; // If all the requests are complete, disable the stackPrefetch tool 9389 9390 if (!stackPrefetch.indicesToRequest || !stackPrefetch.indicesToRequest.length) { 9391 stackPrefetch.enabled = false; 9392 } // Make sure the tool is still enabled 9393 9394 9395 if (stackPrefetch.enabled === false) { 9396 return; 9397 } // Remove an imageIdIndex from the list of indices to request 9398 // This fires when the individual image loading deferred is resolved 9399 9400 9401 function removeFromList(imageIdIndex) { 9402 var index = stackPrefetch.indicesToRequest.indexOf(imageIdIndex); 9403 9404 if (index > -1) { 9405 // Don't remove last element if imageIdIndex not found 9406 stackPrefetch.indicesToRequest.splice(index, 1); 9407 } 9408 } // Remove all already cached images from the 9409 // IndicesToRequest array 9410 9411 9412 stackPrefetchData.data[0].indicesToRequest.sort(function (a, b) { 9413 return a - b; 9414 }); 9415 var indicesToRequestCopy = stackPrefetch.indicesToRequest.slice(); 9416 indicesToRequestCopy.forEach(function (imageIdIndex) { 9417 var imageId = stack.imageIds[imageIdIndex]; 9418 9419 if (!imageId) { 9420 return; 9421 } 9422 9423 var imageLoadObject = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.imageCache.getImageLoadObject(imageId); 9424 9425 if (imageLoadObject) { 9426 removeFromList(imageIdIndex); 9427 } 9428 }); // Stop here if there are no images left to request 9429 // After those in the cache have been removed 9430 9431 if (!stackPrefetch.indicesToRequest.length) { 9432 return; 9433 } // Clear the requestPool of prefetch requests 9434 9435 9436 _requestPool_requestPoolManager_js__WEBPACK_IMPORTED_MODULE_1__["default"].clearRequestStack(requestType); // Identify the nearest imageIdIndex to the currentImageIdIndex 9437 9438 var nearest = nearestIndex(stackPrefetch.indicesToRequest, stack.currentImageIdIndex); 9439 var imageId; 9440 var nextImageIdIndex; 9441 var preventCache = false;
9442 9443 function doneCallback(image) { 9444 logger.log('prefetch done: %s', image.imageId); 9445 var imageIdIndex = stack.imageIds.indexOf(image.imageId); 9446 removeFromList(imageIdIndex); 9447 } // Retrieve the errorLoadingHandler if one exists 9448 9449 9450 var errorLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__["default"].getErrorLoadingHandler(element); 9451 9452 function failCallback(error) { 9453 logger.log('prefetch errored: %o', error); 9454 9455 if (errorLoadingHandler) { 9456 errorLoadingHandler(element, imageId, error, 'stackPrefetch'); 9457 } 9458 } // Prefetch images around the current image (before and after) 9459 9460 9461 var lowerIndex = nearest.low; 9462 var higherIndex = nearest.high; 9463 9464 while (lowerIndex >= 0 || higherIndex < stackPrefetch.indicesToRequest.length) { 9465 var currentIndex = stack.currentImageIdIndex; 9466 var shouldSkipLower = currentIndex - stackPrefetch.indicesToRequest[lowerIndex] > configuration.maxImagesToPrefetch; 9467 var shouldSkipHigher = stackPrefetch.indicesToRequest[higherIndex] - currentIndex > configuration.maxImagesToPrefetch; 9468 var shouldLoadLower = !shouldSkipLower && lowerIndex >= 0; 9469 var shouldLoadHigher = !shouldSkipHigher && higherIndex < stackPrefetch.indicesToRequest.length; 9470 9471 if (!shouldLoadHigher && !shouldLoadLower) { 9472 break; 9473 } 9474 9475 if (shouldLoadLower) { 9476 nextImageIdIndex = stackPrefetch.indicesToRequest[lowerIndex--]; 9477 imageId = stack.imageIds[nextImageIdIndex]; 9478 _requestPool_requestPoolManager_js__WEBPACK_IMPORTED_MODULE_1__["default"].addRequest(element, imageId, requestType, preventCache, doneCallback, failCallback); 9479 } 9480 9481 if (shouldLoadHigher) { 9482 nextImageIdIndex = stackPrefetch.indicesToRequest[higherIndex++]; 9483 imageId = stack.imageIds[nextImageIdIndex]; 9484 _requestPool_requestPoolManager_js__WEBPACK_IMPORTED_MODULE_1__["default"].addRequest(element, imageId, requestType, preventCache, doneCallback, failCallback); 9485 } 9486 } // Try to start the requestPool's grabbing procedure 9487 // In case it isn't already running 9488 9489 9490 _requestPool_requestPoolManager_js__WEBPACK_IMPORTED_MODULE_1__["default"].startGrabbing(); 9491} 9492 9493function getPromiseRemovedHandler(element) { 9494 return function (e) { 9495 var eventData = e.detail; // When an imagePromise has been pushed out of the cache, re-add its index 9496 // It to the indicesToRequest list so that it will be retrieved later if the 9497 // CurrentImageIdIndex is changed to an image nearby 9498 9499 var stackData; 9500 9501 try { 9502 // It will throw an exception in some cases (eg: thumbnails) 9503 stackData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__["getToolState"])(element, 'stack'); 9504 } catch (error) { 9505 return; 9506 } 9507 9508 if (!stackData || !stackData.data || !stackData.data.length) { 9509 return; 9510 } 9511 9512 var stack = stackData.data[0]; 9513 var imageIdIndex = stack.imageIds.indexOf(eventData.imageId); // Make sure the image that was removed is actually in this stack 9514 // Before adding it to the indicesToRequest array 9515 9516 if (imageIdIndex < 0) { 9517 return; 9518 } 9519 9520 var stackPrefetchData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__["getToolState"])(element, toolType); 9521 9522 if (!stackPrefetchData || !stackPrefetchData.data || !stackPrefetchData.data.length) { 9523 return; 9524 } 9525 9526 stackPrefetchData.data[0].indicesToRequest.push(imageIdIndex); 9527 }; 9528} 9529 9530function onImageUpdated(e) { 9531 // Start prefetching again (after a delay) 9532 // When the user has scrolled to a new image 9533 clearTimeout(resetPrefetchTimeout); 9534 resetPrefetchTimeout = setTimeout(function () { 9535 var element = e.target; // If playClip is enabled and the user loads a different series in the viewport 9536 // An exception will be thrown because the element will not be enabled anymore 9537 9538 try { 9539 prefetch(element); 9540 } catch (error) { 9541 return; 9542 } 9543 }, resetPrefetchDelay); 9544} 9545 9546function enable(element) { 9547 // Clear old prefetch data. Skipping this can cause problems when changing the series inside an element 9548 var stackPrefetchDataArray = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__["getToolState"])(element, toolType); 9549 stackPrefetchDataArray.data = []; // First check that there is stack data available 9550 9551 var stackData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__["getToolState"])(element, 'stack'); 9552 9553 if (!stackData || !stackData.data || !stackData.data.length) { 9554 return; 9555 } 9556 9557 var stack = stackData.data[0]; // Check if we are allowed to cache images in this stack 9558 9559 if (stack.preventCache === true) { 9560 logger.warn('A stack that should not be cached was given the stackPrefetch'); 9561 return; 9562 } // Use the currentImageIdIndex from the stack as the initalImageIdIndex 9563 9564 9565 var stackPrefetchData = { 9566 indicesToRequest: range(0, stack.imageIds.length - 1), 9567 enabled: true, 9568 direction: 1 9569 }; // Remove the currentImageIdIndex from the list to request 9570 9571 var indexOfCurrentImage = stackPrefetchData.indicesToRequest.indexOf(stack.currentImageIdIndex); 9572 stackPrefetchData.indicesToRequest.splice(indexOfCurrentImage, 1); 9573 Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__["addToolState"])(element, toolType, stackPrefetchData); 9574 prefetch(element); 9575 element.removeEventListener(_externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.EVENTS.NEW_IMAGE, onImageUpdated); 9576 element.addEventListener(_externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.EVENTS.NEW_IMAGE, onImageUpdated); 9577 var promiseRemovedHandler = getPromiseRemovedHandler(element); 9578 _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.events.removeEventListener(_externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.EVENTS.IMAGE_CACHE_PROMISE_REMOVED, promiseRemovedHandler); 9579 _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.events.addEventListener(_externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.EVENTS.IMAGE_CACHE_PROMISE_REMOVED, promiseRemovedHandler); 9580} 9581 9582function disable(element) { 9583 clearTimeout(resetPrefetchTimeout); 9584 element.removeEventListener(_externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.EVENTS.NEW_IMAGE, onImageUpdated); 9585 var promiseRemovedHandler = getPromiseRemovedHandler(element); 9586 _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.events.removeEventListener(_externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.EVENTS.IMAGE_CACHE_PROMISE_REMOVED, promiseRemovedHandler); 9587 var stackPrefetchData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__["getToolState"])(element, toolType); // If there is actually something to disable, disable it 9588 9589 if (stackPrefetchData && stackPrefetchData.data.length) { 9590 stackPrefetchData.data[0].enabled = false; // Clear current prefetch requests from the requestPool 9591 9592 _requestPool_requestPoolManager_js__WEBPACK_IMPORTED_MODULE_1__["default"].clearRequestStack(requestType); 9593 } 9594} 9595 9596function getConfiguration() { 9597 return configuration; 9598} 9599 9600function setConfiguration(config) { 9601 configuration = config; 9602 9603 if (config.maxSimultaneousRequests) { 9604 Object(_util_getMaxSimultaneousRequests_js__WEBPACK_IMPORTED_MODULE_4__["setMaxSimultaneousRequests"])(config.maxSimultaneousRequests); 9605 } 9606} // Module/private exports 9607 9608 9609var stackPrefetch = { 9610 enable: enable, 9611 disable: disable, 9612 getConfiguration: getConfiguration, 9613 setConfiguration: setConfiguration 9614}; 9615/* harmony default export */ __webpack_exports__["default"] = (stackPrefetch); 9616 9617/***/ }), 9618
9619/***/ "./stackTools/stackRenderers.js": 9620/*!**************************************!*\ 9621 !*** ./stackTools/stackRenderers.js ***! 9622 \**************************************/ 9623/*! exports provided: default */ 9624/***/ (function(module, __webpack_exports__, __webpack_require__) { 9625 9626"use strict"; 9627__webpack_require__.r(__webpack_exports__); 9628/* harmony import */ var _fusionRenderer_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./fusionRenderer.js */ "./stackTools/fusionRenderer.js"); 9629 9630var stackRenderers = {}; 9631stackRenderers.FusionRenderer = _fusionRenderer_js__WEBPACK_IMPORTED_MODULE_0__["default"]; 9632/* harmony default export */ __webpack_exports__["default"] = (stackRenderers); 9633 9634/***/ }), 9635
9636/***/ "./stateManagement/frameOfReferenceStateManager.js": 9637/*!*********************************************************!*\ 9638 !*** ./stateManagement/frameOfReferenceStateManager.js ***! 9639 \*********************************************************/ 9640/*! exports provided: newFrameOfReferenceSpecificToolStateManager, globalFrameOfReferenceSpecificToolStateManager */ 9641/***/ (function(module, __webpack_exports__, __webpack_require__) { 9642 9643"use strict"; 9644__webpack_require__.r(__webpack_exports__); 9645/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "newFrameOfReferenceSpecificToolStateManager", function() { return newFrameOfReferenceSpecificToolStateManager; }); 9646/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "globalFrameOfReferenceSpecificToolStateManager", function() { return globalFrameOfReferenceSpecificToolStateManager; }); 9647/** 9648 * Implements a frame-of-reference specific tool state management strategy. This means that 9649 * Measurement data are tied to a specific frame of reference UID and only visible to objects using 9650 * That frame-of-reference UID. 9651 * @public 9652 * @constructor newFrameOfReferenceSpecificToolStateManager 9653 * @memberof StateManagement 9654 * 9655 * @returns {Object} A frameOfReferenceSpecificToolStateManager instance. 9656 */ 9657function newFrameOfReferenceSpecificToolStateManager() { 9658 var toolState = {}; // Here we add tool state, this is done by tools as well 9659 // As modules that restore saved state 9660 9661 function addFrameOfReferenceSpecificToolState(frameOfReference, toolType, data) { 9662 // If we don't have any tool state for this frameOfReference, add an empty object 9663 if (toolState.hasOwnProperty(frameOfReference) === false) { 9664 toolState[frameOfReference] = {}; 9665 } 9666 9667 var frameOfReferenceToolState = toolState[frameOfReference]; // If we don't have tool state for this type of tool, add an empty object 9668 9669 if (frameOfReferenceToolState.hasOwnProperty(toolType) === false) { 9670 frameOfReferenceToolState[toolType] = { 9671 data: [] 9672 }; 9673 } 9674 9675 var toolData = frameOfReferenceToolState[toolType]; // Finally, add this new tool to the state 9676 9677 toolData.data.push(data); 9678 } // Here you can get state - used by tools as well as modules 9679 // That save state persistently 9680 9681 9682 function getFrameOfReferenceSpecificToolState(frameOfReference, toolType) { 9683 // If we don't have any tool state for this frame of reference, return undefined 9684 if (toolState.hasOwnProperty(frameOfReference) === false) { 9685 return; 9686 } 9687 9688 var frameOfReferenceToolState = toolState[frameOfReference]; // If we don't have tool state for this type of tool, return undefined 9689 9690 if (frameOfReferenceToolState.hasOwnProperty(toolType) === false) { 9691 return; 9692 } 9693 9694 var toolData = frameOfReferenceToolState[toolType]; 9695 return toolData; 9696 } 9697 9698 function removeFrameOfReferenceSpecificToolState(frameOfReference, toolType, data) { 9699 // If we don't have any tool state for this frame of reference, return undefined 9700 if (toolState.hasOwnProperty(frameOfReference) === false) { 9701 return; 9702 } 9703 9704 var frameOfReferenceToolState = toolState[frameOfReference]; // If we don't have tool state for this type of tool, return undefined 9705 9706 if (frameOfReferenceToolState.hasOwnProperty(toolType) === false) { 9707 return; 9708 } 9709 9710 var toolData = frameOfReferenceToolState[toolType]; // Find this tool data 9711 9712 var indexOfData = -1; 9713 9714 for (var i = 0; i < toolData.data.length; i++) { 9715 if (toolData.data[i] === data) { 9716 indexOfData = i; 9717 } 9718 } 9719 9720 if (indexOfData !== -1) { 9721 toolData.data.splice(indexOfData, 1); 9722 } 9723 } 9724 9725 return { 9726 get: getFrameOfReferenceSpecificToolState, 9727 add: addFrameOfReferenceSpecificToolState, 9728 remove: removeFrameOfReferenceSpecificToolState 9729 }; 9730} // A global frameOfReferenceSpecificToolStateManager - the most common case is to share 3d information 9731// Between stacks of images 9732 9733 9734var globalFrameOfReferenceSpecificToolStateManager = newFrameOfReferenceSpecificToolStateManager(); 9735 9736 9737/***/ }), 9738
9739/***/ "./stateManagement/imageIdSpecificStateManager.js": 9740/*!********************************************************!*\ 9741 !*** ./stateManagement/imageIdSpecificStateManager.js ***! 9742 \********************************************************/ 9743/*! exports provided: newImageIdSpecificToolStateManager, globalImageIdSpecificToolStateManager */ 9744/***/ (function(module, __webpack_exports__, __webpack_require__) { 9745 9746"use strict"; 9747__webpack_require__.r(__webpack_exports__); 9748/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "newImageIdSpecificToolStateManager", function() { return newImageIdSpecificToolStateManager; }); 9749/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "globalImageIdSpecificToolStateManager", function() { return globalImageIdSpecificToolStateManager; }); 9750/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js"); 9751 9752/** 9753 * Implements an imageId specific tool state management strategy. This means that 9754 * Measurements data is tied to a specific imageId and only visible for enabled elements 9755 * That are displaying that imageId. 9756 * @public 9757 * @constructor newImageIdSpecificToolStateManager 9758 * @memberof StateManagement 9759 * 9760 * @returns {Object} An imageIdSpecificToolStateManager instance. 9761 */ 9762 9763function newImageIdSpecificToolStateManager() { 9764 var toolState = {}; // Here we add tool state, this is done by tools as well 9765 // As modules that restore saved state 9766 9767 function saveImageIdToolState(imageId) { 9768 return toolState[imageId]; 9769 } 9770 9771 function restoreImageIdToolState(imageId, imageIdToolState) { 9772 toolState[imageId] = imageIdToolState; 9773 } 9774 9775 function saveToolState() { 9776 return toolState; 9777 } 9778 9779 function restoreToolState(savedToolState) { 9780 toolState = savedToolState; 9781 } // Here we add tool state, this is done by tools as well 9782 // As modules that restore saved state 9783 9784 9785 function addImageIdSpecificToolState(element, toolType, data) { 9786 var enabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.getEnabledElement(element); // If we don't have an image for this element exit early 9787 9788 if (!enabledElement.image) { 9789 return; 9790 } // If we don't have any tool state for this imageId, add an empty object 9791 9792 9793 if (toolState.hasOwnProperty(enabledElement.image.imageId) === false) { 9794 toolState[enabledElement.image.imageId] = {}; 9795 } 9796 9797 var imageIdToolState = toolState[enabledElement.image.imageId]; // If we don't have tool state for this type of tool, add an empty object 9798 9799 if (imageIdToolState.hasOwnProperty(toolType) === false) { 9800 imageIdToolState[toolType] = { 9801 data: [] 9802 }; 9803 } 9804 9805 var toolData = imageIdToolState[toolType]; // Finally, add this new tool to the state 9806 9807 toolData.data.push(data); 9808 } // Here you can get state - used by tools as well as modules 9809 // That save state persistently 9810 9811 9812 function getImageIdSpecificToolState(element, toolType) { 9813 var enabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.getEnabledElement(element); // If we don't have any tool state for this imageId, return undefined 9814 9815 if (!enabledElement.image || toolState.hasOwnProperty(enabledElement.image.imageId) === false) { 9816 return; 9817 } 9818 9819 var imageIdToolState = toolState[enabledElement.image.imageId]; // If we don't have tool state for this type of tool, return undefined 9820 9821 if (imageIdToolState.hasOwnProperty(toolType) === false) { 9822 return; 9823 } 9824 9825 var toolData = imageIdToolState[toolType]; 9826 return toolData; 9827 } // Clears all tool data from this toolStateManager. 9828 9829 9830 function clearImageIdSpecificToolStateManager(element) { 9831 var enabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.getEnabledElement(element); 9832 9833 if (!enabledElement.image || toolState.hasOwnProperty(enabledElement.image.imageId) === false) { 9834 return; 9835 } 9836 9837 delete toolState[enabledElement.image.imageId]; 9838 } 9839 9840 return { 9841 get: getImageIdSpecificToolState, 9842 add: addImageIdSpecificToolState, 9843 clear: clearImageIdSpecificToolStateManager, 9844 saveImageIdToolState: saveImageIdToolState, 9845 restoreImageIdToolState: restoreImageIdToolState, 9846 saveToolState: saveToolState, 9847 restoreToolState: restoreToolState, 9848 toolState: toolState 9849 }; 9850} // A global imageIdSpecificToolStateManager - the most common case is to share state between all 9851// Visible enabled images 9852 9853 9854var globalImageIdSpecificToolStateManager = newImageIdSpecificToolStateManager(); 9855 9856 9857/***/ }), 9858
9859/***/ "./stateManagement/loadHandlerManager.js": 9860/*!***********************************************!*\ 9861 !*** ./stateManagement/loadHandlerManager.js ***! 9862 \***********************************************/ 9863/*! exports provided: default */ 9864/***/ (function(module, __webpack_exports__, __webpack_require__) { 9865 9866"use strict"; 9867__webpack_require__.r(__webpack_exports__); 9868/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js"); 9869 9870var _DEFAULT_LOAD_HANDLER = 'DEFAULT'; 9871var defaultStartLoadHandler = {}; 9872var defaultEndLoadHandler = {}; 9873var defaultErrorLoadingHandler = {}; 9874 9875function _getUUIDFromElement(element) { 9876 if (!element) { 9877 return _DEFAULT_LOAD_HANDLER; 9878 } 9879 9880 var uuid = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.getEnabledElement(element).uuid; 9881 9882 if (!uuid) { 9883 throw new Error('Something went wrong when getting uuid from element'); 9884 } 9885 9886 return uuid; 9887} 9888 9889function setStartLoadHandler(handler) { 9890 var element = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined; 9891 9892 if (!handler) { 9893 throw new Error('The Handler function must be defined'); 9894 } 9895 9896 var uuid = _getUUIDFromElement(element); 9897 9898 defaultStartLoadHandler[uuid] = handler; 9899} 9900 9901function getStartLoadHandler(element) { 9902 var uuid = _getUUIDFromElement(element); 9903 9904 return defaultStartLoadHandler[uuid] || defaultStartLoadHandler[_DEFAULT_LOAD_HANDLER]; 9905} 9906 9907function setEndLoadHandler(handler) { 9908 var element = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined; 9909 9910 if (!handler) { 9911 throw new Error('The Handler function must be defined'); 9912 } 9913 9914 var uuid = _getUUIDFromElement(element); 9915 9916 defaultEndLoadHandler[uuid] = handler; 9917} 9918 9919function getEndLoadHandler(element) { 9920 var uuid = _getUUIDFromElement(element); 9921 9922 return defaultEndLoadHandler[uuid] || defaultEndLoadHandler[_DEFAULT_LOAD_HANDLER]; 9923} 9924 9925function setErrorLoadingHandler(handler) { 9926 var element = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined; 9927 9928 if (!handler) { 9929 throw new Error('The Handler function must be defined'); 9930 } 9931 9932 var uuid = _getUUIDFromElement(element); 9933 9934 defaultErrorLoadingHandler[uuid] = handler; 9935} 9936 9937function getErrorLoadingHandler(element) { 9938 var uuid = _getUUIDFromElement(element); 9939 9940 return defaultErrorLoadingHandler[uuid] || defaultErrorLoadingHandler[_DEFAULT_LOAD_HANDLER]; 9941} 9942 9943function removeHandlers(element) { 9944 var uuid = _getUUIDFromElement(element); 9945 9946 delete defaultStartLoadHandler[uuid]; 9947 delete defaultEndLoadHandler[uuid]; 9948 delete defaultErrorLoadingHandler[uuid]; 9949} 9950 9951var loadHandlerManager = { 9952 setStartLoadHandler: setStartLoadHandler, 9953 getStartLoadHandler: getStartLoadHandler, 9954 setEndLoadHandler: setEndLoadHandler, 9955 getEndLoadHandler: getEndLoadHandler, 9956 setErrorLoadingHandler: setErrorLoadingHandler, 9957 getErrorLoadingHandler: getErrorLoadingHandler, 9958 removeHandlers: removeHandlers 9959}; 9960/* harmony default export */ __webpack_exports__["default"] = (loadHandlerManager); 9961 9962/***/ }), 9963
9964/***/ "./stateManagement/stackSpecificStateManager.js": 9965/*!******************************************************!*\ 9966 !*** ./stateManagement/stackSpecificStateManager.js ***! 9967 \******************************************************/ 9968/*! exports provided: stackSpecificStateManager, newStackSpecificToolStateManager, addStackStateManager */ 9969/***/ (function(module, __webpack_exports__, __webpack_require__) { 9970 9971"use strict"; 9972__webpack_require__.r(__webpack_exports__); 9973/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "stackSpecificStateManager", function() { return stackSpecificStateManager; }); 9974/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "newStackSpecificToolStateManager", function() { return newStackSpecificToolStateManager; }); 9975/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addStackStateManager", function() { return addStackStateManager; }); 9976/* harmony import */ var _imageIdSpecificStateManager_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./imageIdSpecificStateManager.js */ "./stateManagement/imageIdSpecificStateManager.js"); 9977/* harmony import */ var _toolState_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./toolState.js */ "./stateManagement/toolState.js"); 9978 9979 9980/** 9981 * Implements an Stack specific tool state management strategy. This means 9982 * That tool data is shared between all imageIds in a given stack. 9983 * @public 9984 * @constructor newStackSpecificToolStateManager 9985 * @memberof StateManagement 9986 * 9987 * @param {string[]} toolTypes The tool types to apply to the stack. 9988 * @param {Object} oldStateManager The imageIdSpecificStateManager. 9989 * @returns {Object} A stackSpecificToolStateManager instance. 9990 */ 9991 9992function newStackSpecificToolStateManager(toolTypes, oldStateManager) { 9993 var toolState = {}; 9994 9995 function saveToolState() { 9996 return toolState; 9997 } 9998 9999 function restoreToolState(stackToolState) { 10000 toolState = stackToolState; 10001 } // Here we add tool state, this is done by tools as well 10002 // As modules that restore saved state 10003 10004 10005 function addStackSpecificToolState(element, toolType, data) { 10006 // If this is a tool type to apply to the stack, do so 10007 if (toolTypes.indexOf(toolType) >= 0) { 10008 // If we don't have tool state for this type of tool, add an empty object 10009 if (toolState.hasOwnProperty(toolType) === false) { 10010 toolState[toolType] = { 10011 data: [] 10012 }; 10013 } 10014 10015 var toolData = toolState[toolType]; // Finally, add this new tool to the state 10016 10017 toolData.data.push(data); 10018 } else { 10019 // Call the imageId specific tool state manager 10020 return oldStateManager.add(element, toolType, data); 10021 } 10022 } // Here you can get state - used by tools as well as modules 10023 // That save state persistently 10024 10025 10026 function getStackSpecificToolState(element, toolType) { 10027 // If this is a tool type to apply to the stack, do so 10028 if (toolTypes.indexOf(toolType) >= 0) { 10029 // If we don't have tool state for this type of tool, add an empty object 10030 if (toolState.hasOwnProperty(toolType) === false) { 10031 toolState[toolType] = { 10032 data: [] 10033 }; 10034 } 10035 10036 return toolState[toolType]; 10037 } // Call the imageId specific tool state manager 10038 10039 10040 return oldStateManager.get(element, toolType); 10041 } 10042 10043 var stackSpecificToolStateManager = { 10044 get: getStackSpecificToolState, 10045 add: addStackSpecificToolState, 10046 saveToolState: saveToolState, 10047 restoreToolState: restoreToolState, 10048 toolState: toolState 10049 }; 10050 return stackSpecificToolStateManager; 10051} 10052 10053var stackStateManagers = []; 10054 10055function addStackStateManager(element, otherTools) { 10056 var oldStateManager = Object(_toolState_js__WEBPACK_IMPORTED_MODULE_1__["getElementToolStateManager"])(element); 10057 10058 if (!oldStateManager) { 10059 oldStateManager = _imageIdSpecificStateManager_js__WEBPACK_IMPORTED_MODULE_0__["globalImageIdSpecificToolStateManager"]; 10060 } 10061 10062 var stackTools = ['stack', 'stackPrefetch', 'playClip', 'volume', 'slab', 'referenceLines', 'crosshairs', 'stackRenderer']; 10063 10064 if (otherTools) { 10065 stackTools = stackTools.concat(otherTools); 10066 } 10067 10068 var stackSpecificStateManager = newStackSpecificToolStateManager(stackTools, oldStateManager); 10069 stackStateManagers.push(stackSpecificStateManager); 10070 Object(_toolState_js__WEBPACK_IMPORTED_MODULE_1__["setElementToolStateManager"])(element, stackSpecificStateManager); 10071} 10072 10073var stackSpecificStateManager = { 10074 newStackSpecificToolStateManager: newStackSpecificToolStateManager, 10075 addStackStateManager: addStackStateManager 10076}; 10077 10078 10079/***/ }), 10080
10081/***/ "./stateManagement/textStyle.js": 10082/*!**************************************!*\ 10083 !*** ./stateManagement/textStyle.js ***! 10084 \**************************************/ 10085/*! exports provided: default */ 10086/***/ (function(module, __webpack_exports__, __webpack_require__) { 10087 10088"use strict"; 10089__webpack_require__.r(__webpack_exports__); 10090var defaultFontSize = 15, 10091 defaultFont = "".concat(defaultFontSize, "px Arial"), 10092 defaultBackgroundColor = 'transparent'; 10093 10094function setFont(font) { 10095 defaultFont = font; 10096} 10097 10098function getFont() { 10099 return defaultFont; 10100} 10101 10102function setFontSize(fontSize) { 10103 defaultFontSize = fontSize; 10104} 10105 10106function getFontSize() { 10107 return defaultFontSize; 10108} 10109 10110function setBackgroundColor(backgroundColor) { 10111 defaultBackgroundColor = backgroundColor; 10112} 10113 10114function getBackgroundColor() { 10115 return defaultBackgroundColor; 10116} 10117 10118var textStyle = { 10119 setFont: setFont, 10120 getFont: getFont, 10121 setFontSize: setFontSize, 10122 getFontSize: getFontSize, 10123 setBackgroundColor: setBackgroundColor, 10124 getBackgroundColor: getBackgroundColor 10125}; 10126/* harmony default export */ __webpack_exports__["default"] = (textStyle); 10127 10128/***/ }), 10129
10130/***/ "./stateManagement/toolColors.js": 10131/*!***************************************!*\ 10132 !*** ./stateManagement/toolColors.js ***! 10133 \***************************************/ 10134/*! exports provided: default */ 10135/***/ (function(module, __webpack_exports__, __webpack_require__) { 10136 10137"use strict"; 10138__webpack_require__.r(__webpack_exports__); 10139var defaultColor = 'white', 10140 activeColor = 'greenyellow', 10141 fillColor = 'transparent'; 10142 10143function setFillColor(color) { 10144 fillColor = color; 10145} 10146 10147function getFillColor() { 10148 return fillColor; 10149} 10150 10151function setToolColor(color) { 10152 defaultColor = color; 10153} 10154 10155function getToolColor() { 10156 return defaultColor; 10157} 10158 10159function setActiveColor(color) { 10160 activeColor = color; 10161} 10162 10163function getActiveColor() { 10164 return activeColor; 10165} 10166 10167function getColorIfActive(data) { 10168 if (data.color) { 10169 return data.color; 10170 } 10171 10172 return data.active ? activeColor : defaultColor; 10173} 10174 10175var toolColors = { 10176 setFillColor: setFillColor, 10177 getFillColor: getFillColor, 10178 setToolColor: setToolColor, 10179 getToolColor: getToolColor, 10180 setActiveColor: setActiveColor, 10181 getActiveColor: getActiveColor, 10182 getColorIfActive: getColorIfActive 10183}; 10184/* harmony default export */ __webpack_exports__["default"] = (toolColors); 10185 10186/***/ }), 10187
10188/***/ "./stateManagement/toolCoordinates.js": 10189/*!********************************************!*\ 10190 !*** ./stateManagement/toolCoordinates.js ***! 10191 \********************************************/ 10192/*! exports provided: default */ 10193/***/ (function(module, __webpack_exports__, __webpack_require__) { 10194 10195"use strict"; 10196__webpack_require__.r(__webpack_exports__); 10197var coordsData; 10198 10199function setCoords(eventData) { 10200 coordsData = eventData.currentPoints.canvas; 10201} 10202 10203function getCoords() { 10204 return coordsData; 10205} 10206 10207var toolCoordinates = { 10208 setCoords: setCoords, 10209 getCoords: getCoords 10210}; 10211/* harmony default export */ __webpack_exports__["default"] = (toolCoordinates); 10212 10213/***/ }), 10214
10215/***/ "./stateManagement/toolState.js": 10216/*!**************************************!*\ 10217 !*** ./stateManagement/toolState.js ***! 10218 \**************************************/ 10219/*! exports provided: addToolState, getToolState, removeToolState, clearToolState, setElementToolStateManager, getElementToolStateManager */ 10220/***/ (function(module, __webpack_exports__, __webpack_require__) { 10221 10222"use strict"; 10223__webpack_require__.r(__webpack_exports__); 10224/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addToolState", function() { return addToolState; }); 10225/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getToolState", function() { return getToolState; }); 10226/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "removeToolState", function() { return removeToolState; }); 10227/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clearToolState", function() { return clearToolState; }); 10228/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setElementToolStateManager", function() { return setElementToolStateManager; }); 10229/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getElementToolStateManager", function() { return getElementToolStateManager; }); 10230/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../events.js */ "./events.js"); 10231/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js"); 10232/* harmony import */ var _imageIdSpecificStateManager_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./imageIdSpecificStateManager.js */ "./stateManagement/imageIdSpecificStateManager.js"); 10233/* harmony import */ var _util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../util/triggerEvent.js */ "./util/triggerEvent.js"); 10234 10235 10236 10237 10238/** 10239 * Returns the toolstate for a specific element. 10240 * @public 10241 * @function getElementToolStateManager 10242 * 10243 * @param {HTMLElement} element The element. 10244 * @returns {Object} The toolState. 10245 */ 10246 10247function getElementToolStateManager(element) { 10248 var enabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getEnabledElement(element); // If the enabledElement has no toolStateManager, create a default one for it 10249 // NOTE: This makes state management element specific 10250 10251 if (enabledElement.toolStateManager === undefined) { 10252 enabledElement.toolStateManager = _imageIdSpecificStateManager_js__WEBPACK_IMPORTED_MODULE_2__["globalImageIdSpecificToolStateManager"]; 10253 } 10254 10255 return enabledElement.toolStateManager; 10256} 10257/** 10258 * Adds tool state to the toolStateManager, this is done by tools as well 10259 * as modules that restore saved state. 10260 * @public 10261 * @method addToolState 10262 * 10263 * @param {HTMLElement} element The element. 10264 * @param {string} toolType The toolType of the state. 10265 * @param {Object} measurementData The data to store in the state. 10266 * @returns {undefined} 10267 */ 10268 10269 10270function addToolState(element, toolType, measurementData) { 10271 var toolStateManager = getElementToolStateManager(element); 10272 toolStateManager.add(element, toolType, measurementData); 10273 var eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MEASUREMENT_ADDED; 10274 var eventData = { 10275 toolType: toolType, 10276 element: element, 10277 measurementData: measurementData 10278 }; 10279 Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_3__["default"])(element, eventType, eventData); 10280} 10281/** 10282 * Returns tool specific state of an element. Used by tools as well as modules 10283 * that save state persistently 10284 * @export 10285 * @public 10286 * @method 10287 * @name getToolState 10288 * 10289 * @param {HTMLElement} element The element. 10290 * @param {string} toolType The toolType of the state. 10291 * @returns {Object} The element's state for the given toolType. 10292 */ 10293 10294 10295function getToolState(element, toolType) { 10296 var toolStateManager = getElementToolStateManager(element); 10297 return toolStateManager.get(element, toolType); 10298} 10299/** 10300 * Removes specific tool state from the toolStateManager. 10301 * @public 10302 * @method removeToolState 10303 * 10304 * @param {HTMLElement} element The element. 10305 * @param {string} toolType The toolType of the state. 10306 * @param {Object}
10306 data The data to remove from the toolStateManager. 10307 * @returns {undefined} 10308 */ 10309 10310 10311function removeToolState(element, toolType, data) { 10312 var toolStateManager = getElementToolStateManager(element); 10313 var toolData = toolStateManager.get(element, toolType); // Find this tool data 10314 10315 var indexOfData = -1; 10316 10317 for (var i = 0; i < toolData.data.length; i++) { 10318 if (toolData.data[i] === data) { 10319 indexOfData = i; 10320 } 10321 } 10322 10323 if (indexOfData !== -1) { 10324 toolData.data.splice(indexOfData, 1); 10325 var eventType = _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].MEASUREMENT_REMOVED; 10326 var eventData = { 10327 toolType: toolType, 10328 element: element, 10329 measurementData: data 10330 }; 10331 Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_3__["default"])(element, eventType, eventData); 10332 } 10333} 10334/** 10335 * Removes all toolState from the toolStateManager corresponding to 10336 * the toolType and element. 10337 * @public 10338 * @method clearToolState 10339 * 10340 * @param {HTMLElement} element The element. 10341 * @param {string} toolType The toolType of the state. 10342 * @returns {undefined} 10343 */ 10344 10345 10346function clearToolState(element, toolType) { 10347 var toolStateManager = getElementToolStateManager(element); 10348 var toolData = toolStateManager.get(element, toolType); // If any toolData actually exists, clear it 10349 10350 if (toolData !== undefined) { 10351 toolData.data = []; 10352 } 10353} 10354/** 10355 * Sets the tool state manager for an element 10356 * @public 10357 * @method setElementToolStateManager 10358 * 10359 * @param {HTMLElement} element The element. 10360 * @param {Object} toolStateManager The toolStateManager. 10361 * @returns {undefined} 10362 */ 10363 10364 10365function setElementToolStateManager(element, toolStateManager) { 10366 var enabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.getEnabledElement(element); 10367 enabledElement.toolStateManager = toolStateManager; 10368} 10369 10370 10371 10372/***/ }), 10373
10374/***/ "./stateManagement/toolStyle.js": 10375/*!**************************************!*\ 10376 !*** ./stateManagement/toolStyle.js ***! 10377 \**************************************/ 10378/*! exports provided: default */ 10379/***/ (function(module, __webpack_exports__, __webpack_require__) { 10380 10381"use strict"; 10382__webpack_require__.r(__webpack_exports__); 10383var defaultWidth = 1, 10384 activeWidth = 2; 10385 10386function setToolWidth(width) { 10387 defaultWidth = width; 10388} 10389 10390function getToolWidth() { 10391 return defaultWidth; 10392} 10393 10394function setActiveWidth(width) { 10395 activeWidth = width; 10396} 10397 10398function getActiveWidth() { 10399 return activeWidth; 10400} 10401 10402var toolStyle = { 10403 setToolWidth: setToolWidth, 10404 getToolWidth: getToolWidth, 10405 setActiveWidth: setActiveWidth, 10406 getActiveWidth: getActiveWidth 10407}; 10408/* harmony default export */ __webpack_exports__["default"] = (toolStyle); 10409 10410/***/ }), 10411
10412/***/ "./store/addTool.js": 10413/*!**************************!*\ 10414 !*** ./store/addTool.js ***! 10415 \**************************/ 10416/*! exports provided: addTool, addToolForElement */ 10417/***/ (function(module, __webpack_exports__, __webpack_require__) { 10418 10419"use strict"; 10420__webpack_require__.r(__webpack_exports__); 10421/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addTool", function() { return addTool; }); 10422/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "addToolForElement", function() { return addToolForElement; }); 10423/* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./index.js */ "./store/index.js"); 10424/* harmony import */ var _getToolForElement_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./getToolForElement.js */ "./store/getToolForElement.js"); 10425/* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../util/logger.js */ "./util/logger.js"); 10426 10427 10428 10429var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_2__["getLogger"])('addTool'); 10430/** 10431 * Adds a tool to an enabled element. 10432 * 10433 * @public 10434 * @function addToolForElement 10435 * @memberof CornerstoneTools 10436 * 10437 * @param {HTMLElement} element The element to add the tool to. 10438 * @param {BaseTool} ApiTool The tool to add to the element. 10439 * @param {Object} [props] Override the default tool props 10440 * @returns {undefined} 10441 */ 10442 10443var addToolForElement = function addToolForElement(element, ApiTool, props) { 10444 // Instantiating the tool here makes it harder to accidentally add 10445 // The same tool (by reference) for multiple elements (which would reassign the tool 10446 // To a new element). 10447 var tool = new ApiTool(props); 10448 var toolAlreadyAddedToElement = Object(_getToolForElement_js__WEBPACK_IMPORTED_MODULE_1__["default"])(element, tool.name); 10449 10450 if (toolAlreadyAddedToElement) { 10451 logger.warn('%s has already been added to the target element', tool.name); 10452 return; 10453 } 10454 10455 tool.element = element; 10456 _index_js__WEBPACK_IMPORTED_MODULE_0__["default"].state.tools.push(tool); 10457}; 10458/** 10459 * Adds a tool to all enabled element. 10460 * 10461 * @public 10462 * @function addTool 10463 * @memberof CornerstoneTools 10464 * 10465 * @param {BaseTool} ApiTool The tool to add to each element. 10466 * @param {Object} [props] Override the default tool configuration 10467 * @returns {undefined} 10468 */ 10469 10470 10471var addTool = function addTool(ApiTool, props) { 10472 _addToolGlobally(ApiTool, props); 10473 10474 _index_js__WEBPACK_IMPORTED_MODULE_0__["default"].state.enabledElements.forEach(function (element) { 10475 addToolForElement(element, ApiTool, props); 10476 }); 10477}; 10478/** 10479 * Adds tool with matching name from globally registered tools. 10480 * Requires `globalToolSyncEnabled` to be set to true 10481 * 10482 * @private 10483 * @function addToolGlobally 10484 * 10485 * @param {BaseTool} ApiTool 10486 * @param {Object} [props] Override the default tool configuration 10487 * @returns {undefined} 10488 */ 10489 10490 10491var _addToolGlobally = function _addToolGlobally(ApiTool, props) { 10492 if (!_index_js__WEBPACK_IMPORTED_MODULE_0__["default"].modules.globalConfiguration.state.globalToolSyncEnabled) { 10493 return; 10494 } 10495 10496 var tool = new ApiTool(props); 10497 var toolAlreadyAddedGlobally = _index_js__WEBPACK_IMPORTED_MODULE_0__["default"].state.globalTools[tool.name] !== undefined; 10498 10499 if (toolAlreadyAddedGlobally) { 10500 logger.warn('%s has already been added globally', tool.name); 10501 return; 10502 } 10503 10504 _index_js__WEBPACK_IMPORTED_MODULE_0__["default"].state.globalTools[tool.name] = { 10505 tool: ApiTool, 10506 props: props, 10507 activeBindings: [] 10508 }; 10509}; 10510 10511 10512 10513/***/ }), 10514
10515/***/ "./store/filterToolsUsableWithMultiPartTools.js": 10516/*!******************************************************!*\ 10517 !*** ./store/filterToolsUsableWithMultiPartTools.js ***! 10518 \******************************************************/ 10519/*! exports provided: default */ 10520/***/ (function(module, __webpack_exports__, __webpack_require__) { 10521 10522"use strict"; 10523__webpack_require__.r(__webpack_exports__); 10524/* harmony import */ var _tools_base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../tools/base/BaseAnnotationTool.js */ "./tools/base/BaseAnnotationTool.js"); 10525/* harmony import */ var _tools_base_BaseBrushTool_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../tools/base/BaseBrushTool.js */ "./tools/base/BaseBrushTool.js"); 10526 10527 10528/** 10529 * Filters an array of tools, returning only tools which are active or passive. 10530 * @export 10531 * @public 10532 * @method 10533 * @name filterToolsUseableWithMultiPartTools 10534 * 10535 * @param {Object[]} tools The input tool array. 10536 * @returns {Object[]} The filtered array. 10537 */ 10538 10539/* harmony default export */ __webpack_exports__["default"] = (function (tools) { 10540 return tools.filter(function (tool) { 10541 return !tool.isMultiPartTool && !(tool instanceof _tools_base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_0__["default"]) && !(tool instanceof _tools_base_BaseBrushTool_js__WEBPACK_IMPORTED_MODULE_1__["default"]); 10542 }); 10543}); 10544 10545/***/ }), 10546
10547/***/ "./store/getActiveToolsForElement.js": 10548/*!*******************************************!*\ 10549 !*** ./store/getActiveToolsForElement.js ***! 10550 \*******************************************/ 10551/*! exports provided: default */ 10552/***/ (function(module, __webpack_exports__, __webpack_require__) { 10553 10554"use strict"; 10555__webpack_require__.r(__webpack_exports__); 10556/** 10557 * Filters an array of tools, returning only tools which are active. 10558 * @export 10559 * @public 10560 * @method 10561 * @name getActiveToolsForElement 10562 * 10563 * @param {HTMLElement} element The element. 10564 * @param {Object[]} tools The input tool array. 10565 * @param {string} handlerType The input type being queried. 10566 * @returns {Object[]} The filtered array. 10567 */ 10568/* harmony default export */ __webpack_exports__["default"] = (function (element, tools, handlerType) { 10569 return tools.filter(function (tool) { 10570 return tool.element === element && tool.mode === 'active' && (handlerType === undefined || tool.options["is".concat(handlerType, "Active")]); 10571 }); 10572}); 10573 10574/***/ }), 10575
10576/***/ "./store/getInteractiveToolsForElement.js": 10577/*!************************************************!*\ 10578 !*** ./store/getInteractiveToolsForElement.js ***! 10579 \************************************************/ 10580/*! exports provided: default */ 10581/***/ (function(module, __webpack_exports__, __webpack_require__) { 10582 10583"use strict"; 10584__webpack_require__.r(__webpack_exports__); 10585/** 10586 * Filters an array of tools, returning only tools which are active or passive. 10587 * @export 10588 * @public 10589 * @method 10590 * @name getInteractiveToolsForElement 10591 * 10592 * @param {HTMLElement} element The element. 10593 * @param {Object[]} tools The input tool array. 10594 * @returns {Object[]} The filtered array. 10595 */ 10596/* harmony default export */ __webpack_exports__["default"] = (function (element, tools) { 10597 return tools.filter(function (tool) { 10598 return tool.element === element && (tool.mode === 'active' || tool.mode === 'passive'); 10599 }); 10600}); 10601 10602/***/ }), 10603
10604/***/ "./store/getToolForElement.js": 10605/*!************************************!*\ 10606 !*** ./store/getToolForElement.js ***! 10607 \************************************/ 10608/*! exports provided: default */ 10609/***/ (function(module, __webpack_exports__, __webpack_require__) { 10610 10611"use strict"; 10612__webpack_require__.r(__webpack_exports__); 10613/* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./index.js */ "./store/index.js"); 10614 10615/** 10616 * Returns the tool instance attached to the element. 10617 * @export 10618 * @public 10619 * @method 10620 * @name getToolForElement 10621 * 10622 * @param {HTMLElement} element The element. 10623 * @param {string} name The tool's name. 10624 * @returns {Object} The tool instance. 10625 */ 10626 10627/* harmony default export */ __webpack_exports__["default"] = (function (element, name) { 10628 return _index_js__WEBPACK_IMPORTED_MODULE_0__["state"].tools.find(function (tool) { 10629 return tool.element === element && tool.name === name; 10630 }); 10631}); 10632 10633/***/ }), 10634
10635/***/ "./store/getToolsWithDataForElement.js": 10636/*!*********************************************!*\ 10637 !*** ./store/getToolsWithDataForElement.js ***! 10638 \*********************************************/ 10639/*! exports provided: default */ 10640/***/ (function(module, __webpack_exports__, __webpack_require__) { 10641 10642"use strict"; 10643__webpack_require__.r(__webpack_exports__); 10644/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../stateManagement/toolState.js */ "./stateManagement/toolState.js"); 10645 10646/** 10647 * Filters an array of tools, returning only tools which have annotation data. 10648 * @export 10649 * @public 10650 * @method 10651 * @name getToolsWithDataForElement 10652 * 10653 * @param {HTMLElement} element The element. 10654 * @param {Object[]} tools The input tool array. 10655 * @returns {Object[]} The filtered array. 10656 */ 10657 10658/* harmony default export */ __webpack_exports__["default"] = (function (element, tools) { 10659 return tools.filter(function (tool) { 10660 var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_0__["getToolState"])(element, tool.name); 10661 return toolState && toolState.data.length > 0; 10662 }); 10663}); 10664 10665/***/ }), 10666
10667/***/ "./store/getToolsWithMoveableHandles.js": 10668/*!**********************************************!*\ 10669 !*** ./store/getToolsWithMoveableHandles.js ***! 10670 \**********************************************/ 10671/*! exports provided: default */ 10672/***/ (function(module, __webpack_exports__, __webpack_require__) { 10673 10674"use strict"; 10675__webpack_require__.r(__webpack_exports__); 10676/* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./index.js */ "./store/index.js"); 10677/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../stateManagement/toolState.js */ "./stateManagement/toolState.js"); 10678/* harmony import */ var _manipulators_getHandleNearImagePoint_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../manipulators/getHandleNearImagePoint.js */ "./manipulators/getHandleNearImagePoint.js"); 10679 10680 10681 10682/** 10683 * Filters an array of tools, returning only tools with moveable handles at the 10684 * mouse location. 10685 * 10686 * @public 10687 * @function getToolsWithMoveableHandles 10688 * 10689 * @param {HTMLElement} element The element 10690 * @param {Object[]} tools The input tool array. 10691 * @param {Object} coords The coordinates of the mouse position. 10692 * @param {string} [interactionType=mouse] 10693 * @returns {Object[]} The filtered array. 10694 */ 10695 10696/* harmony default export */ __webpack_exports__["default"] = (function (element, tools, coords) { 10697 var interactionType = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'mouse'; 10698 var proximity = interactionType === 'mouse' ? _index_js__WEBPACK_IMPORTED_MODULE_0__["state"].clickProximity : _index_js__WEBPACK_IMPORTED_MODULE_0__["state"].touchProximity; 10699 return tools.filter(function (tool) { 10700 var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__["getToolState"])(element, tool.name); 10701 10702 for (var i = 0; i < toolState.data.length; i++) { 10703 if (Object(_manipulators_getHandleNearImagePoint_js__WEBPACK_IMPORTED_MODULE_2__["default"])(element, toolState.data[i].handles, coords, proximity) !== undefined) { 10704 return true; 10705 } 10706 } 10707 10708 return false; 10709 }); 10710}); 10711 10712/***/ }), 10713
10714/***/ "./store/index.js": 10715/*!************************!*\ 10716 !*** ./store/index.js ***! 10717 \************************/ 10718/*! exports provided: state, getters, setters, modules, default */ 10719/***/ (function(module, __webpack_exports__, __webpack_require__) { 10720 10721"use strict"; 10722__webpack_require__.r(__webpack_exports__); 10723/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "state", function() { return state; }); 10724/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getters", function() { return getters; }); 10725/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setters", function() { return setters; }); 10726/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "modules", function() { return modules; }); 10727/* harmony import */ var _modules_brushModule_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./modules/brushModule.js */ "./store/modules/brushModule.js"); 10728/* harmony import */ var _modules_cursorModule_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./modules/cursorModule.js */ "./store/modules/cursorModule.js"); 10729/* harmony import */ var _modules_globalConfigurationModule_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./modules/globalConfigurationModule.js */ "./store/modules/globalConfigurationModule.js"); 10730/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js"); 10731// Modules 10732 10733 10734 10735 10736var state = { 10737 // Global 10738 globalTools: {}, 10739 globalToolChangeHistory: [], 10740 // Tracking 10741 enabledElements: [], 10742 tools: [], 10743 isToolLocked: false, 10744 activeMultiPartTool: null, 10745 mousePositionImage: {}, 10746 // Settings 10747 clickProximity: 6, 10748 touchProximity: 10, 10749 handleRadius: 6, 10750 deleteIfHandleOutsideImage: true, 10751 preventHandleOutsideImage: false, 10752 // Cursor 10753 svgCursorUrl: null 10754}; 10755var getters = { 10756 mouseTools: function mouseTools() { 10757 return state.tools.filter(function (tool) { 10758 return tool.supportedInteractionTypes.includes('Mouse'); 10759 }); 10760 }, 10761 touchTools: function touchTools() { 10762 return state.tools.filter(function (tool) { 10763 return tool.supportedInteractionTypes.includes('Touch'); 10764 }); 10765 }, 10766 enabledElementByUID: function enabledElementByUID(enabledElementUID) { 10767 return state.enabledElements.find(function (element) { 10768 return _externalModules_js__WEBPACK_IMPORTED_MODULE_3__["default"].cornerstone.getEnabledElement(element).uuid === enabledElementUID; 10769 }); 10770 } 10771}; 10772var setters = {}; 10773var modules = { 10774 brush: _modules_brushModule_js__WEBPACK_IMPORTED_MODULE_0__["default"],
10775 cursor: _modules_cursorModule_js__WEBPACK_IMPORTED_MODULE_1__["default"], 10776 globalConfiguration: _modules_globalConfigurationModule_js__WEBPACK_IMPORTED_MODULE_2__["default"] 10777}; 10778/* harmony default export */ __webpack_exports__["default"] = ({ 10779 modules: modules, 10780 state: state, 10781 getters: getters 10782}); 10783 10784/***/ }), 10785
10786/***/ "./store/internals/addEnabledElement.js": 10787/*!**********************************************!*\ 10788 !*** ./store/internals/addEnabledElement.js ***! 10789 \**********************************************/ 10790/*! exports provided: default */ 10791/***/ (function(module, __webpack_exports__, __webpack_require__) { 10792 10793"use strict"; 10794__webpack_require__.r(__webpack_exports__); 10795/* harmony import */ var _eventListeners_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../eventListeners/index.js */ "./eventListeners/index.js"); 10796/* harmony import */ var _eventDispatchers_index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../eventDispatchers/index.js */ "./eventDispatchers/index.js"); 10797/* harmony import */ var _addTool_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./../addTool.js */ "./store/addTool.js"); 10798/* harmony import */ var _setToolMode_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./../setToolMode.js */ "./store/setToolMode.js"); 10799/* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../index.js */ "./store/index.js"); 10800/* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../util/logger.js */ "./util/logger.js"); 10801 10802 10803 10804 10805 10806 10807var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_5__["getLogger"])('internals:addEnabledElement'); 10808/** 10809 * Element Enabled event. 10810 * 10811 * @event Cornerstone#ElementEnabled 10812 * @type {Object} 10813 * @property {string} type 10814 * @property {Object} detail 10815 * @property {HTMLElement} detail.element - The element being enabled. 10816 */ 10817 10818/* TODO: It would be nice if this automatically added "all tools" 10819 * To the enabledElement that already exist on all other tools. 10820 * A half-measure might be a new method to "duplicate" the tool 10821 * Configuration for an existing enabled element 10822 * We may need to also save/store the original class/constructor per tool 10823 * To accomplish this 10824 */ 10825 10826/** 10827 * Adds an enabledElement to our store. 10828 * @export 10829 * @private 10830 * @method 10831 * @name addEnabledElement 10832 * @param {Cornerstone#ElementEnabled} elementEnabledEvt 10833 * @listens Cornerstone#ElementEnabled 10834 * @returns {void} 10835 */ 10836 10837/* harmony default export */ __webpack_exports__["default"] = (function (elementEnabledEvt) { 10838 logger.log('EVENT:ELEMENT_ENABLED'); 10839 var enabledElement = elementEnabledEvt.detail.element; // Dispatchers 10840 10841 _eventDispatchers_index_js__WEBPACK_IMPORTED_MODULE_1__["imageRenderedEventDispatcher"].enable(enabledElement); 10842 _eventDispatchers_index_js__WEBPACK_IMPORTED_MODULE_1__["newImageEventDispatcher"].enable(enabledElement); // Mouse 10843 10844 if (_index_js__WEBPACK_IMPORTED_MODULE_4__["default"].modules.globalConfiguration.state.mouseEnabled) { 10845 _eventListeners_index_js__WEBPACK_IMPORTED_MODULE_0__["mouseEventListeners"].enable(enabledElement); 10846 _eventListeners_index_js__WEBPACK_IMPORTED_MODULE_0__["wheelEventListener"].enable(enabledElement); 10847 _eventDispatchers_index_js__WEBPACK_IMPORTED_MODULE_1__["mouseToolEventDispatcher"].enable(enabledElement); 10848 } // Touch 10849 10850 10851 if (_index_js__WEBPACK_IMPORTED_MODULE_4__["default"].modules.globalConfiguration.state.touchEnabled) { 10852 _eventListeners_index_js__WEBPACK_IMPORTED_MODULE_0__["touchEventListeners"].enable(enabledElement); 10853 _eventDispatchers_index_js__WEBPACK_IMPORTED_MODULE_1__["touchToolEventDispatcher"].enable(enabledElement); 10854 } // State 10855 10856 10857 _addEnabledElement(enabledElement); 10858}); 10859/** 10860 * Adds the enabled element to the store. 10861 * @private 10862 * @method 10863 * @param {HTMLElement} enabledElement 10864 * @returns {void} 10865 */ 10866 10867var _addEnabledElement = function _addEnabledElement(enabledElement) { 10868 _index_js__WEBPACK_IMPORTED_MODULE_4__["default"].state.enabledElements.push(enabledElement); 10869 10870 if (_index_js__WEBPACK_IMPORTED_MODULE_4__["default"].modules) { 10871 _initModulesOnElement(enabledElement); 10872 } 10873 10874 _addGlobalToolsToElement(enabledElement); 10875 10876 _repeatGlobalToolHistory(enabledElement); 10877}; 10878/** 10879 * Iterate over our store's modules. If the module has an `enabledElementCallback` 10880 * call it and pass it a reference to our enabled element. 10881 * @private 10882 * @method 10883 * @param {Object} enabledElement 10884 * @returns {void} 10885 */ 10886 10887 10888function _initModulesOnElement(enabledElement) { 10889 var modules = _index_js__WEBPACK_IMPORTED_MODULE_4__["default"].modules;
10890 Object.keys(modules).forEach(function (key) { 10891 if (typeof modules[key].enabledElementCallback === 'function') { 10892 modules[key].enabledElementCallback(enabledElement); 10893 } 10894 }); 10895} 10896/** 10897 * Iterate over our stores globalTools adding each one to `enabledElement` 10898 * @private 10899 * @method 10900 * @param {HTMLElement} enabledElement 10901 * @returns {void} 10902 */ 10903 10904 10905function _addGlobalToolsToElement(enabledElement) { 10906 if (!_index_js__WEBPACK_IMPORTED_MODULE_4__["default"].modules.globalConfiguration.state.globalToolSyncEnabled) { 10907 return; 10908 } 10909 10910 Object.keys(_index_js__WEBPACK_IMPORTED_MODULE_4__["default"].state.globalTools).forEach(function (key) { 10911 var _store$state$globalTo = _index_js__WEBPACK_IMPORTED_MODULE_4__["default"].state.globalTools[key], 10912 tool = _store$state$globalTo.tool, 10913 props = _store$state$globalTo.props; 10914 Object(_addTool_js__WEBPACK_IMPORTED_MODULE_2__["addToolForElement"])(enabledElement, tool, props); 10915 }); 10916} 10917/** 10918 * Iterate over the globalToolChangeHistory and apply each `historyEvent` 10919 * to the supplied `enabledElement`. 10920 * @private 10921 * @method 10922 * @param {HTMLElement} enabledElement 10923 * @returns {void} 10924 */ 10925 10926 10927function _repeatGlobalToolHistory(enabledElement) { 10928 if (!_index_js__WEBPACK_IMPORTED_MODULE_4__["default"].modules.globalConfiguration.state.globalToolSyncEnabled) { 10929 return; 10930 } 10931 10932 var setToolModeFns = { 10933 active: _setToolMode_js__WEBPACK_IMPORTED_MODULE_3__["setToolActiveForElement"], 10934 passive: _setToolMode_js__WEBPACK_IMPORTED_MODULE_3__["setToolPassiveForElement"], 10935 enabled: _setToolMode_js__WEBPACK_IMPORTED_MODULE_3__["setToolEnabledForElement"], 10936 disabled: _setToolMode_js__WEBPACK_IMPORTED_MODULE_3__["setToolDisabledForElement"] 10937 }; 10938 _index_js__WEBPACK_IMPORTED_MODULE_4__["default"].state.globalToolChangeHistory.forEac
10938h(function (historyEvent) { 10939 var args = historyEvent.args.slice(0); 10940 args.unshift(enabledElement); 10941 setToolModeFns[historyEvent.mode].apply(null, args); 10942 }); 10943} 10944 10945/***/ }), 10946
10947/***/ "./store/internals/removeEnabledElement.js": 10948/*!*************************************************!*\ 10949 !*** ./store/internals/removeEnabledElement.js ***! 10950 \*************************************************/ 10951/*! exports provided: default */ 10952/***/ (function(module, __webpack_exports__, __webpack_require__) { 10953 10954"use strict"; 10955__webpack_require__.r(__webpack_exports__); 10956/* harmony import */ var _eventListeners_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../eventListeners/index.js */ "./eventListeners/index.js"); 10957/* harmony import */ var _eventDispatchers_index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../eventDispatchers/index.js */ "./eventDispatchers/index.js"); 10958/* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../index.js */ "./store/index.js"); 10959/* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../util/logger.js */ "./util/logger.js"); 10960/* harmony import */ var _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../stateManagement/loadHandlerManager.js */ "./stateManagement/loadHandlerManager.js"); 10961 10962 10963 10964 10965 10966var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_3__["getLogger"])('internals:removeEnabledElement'); 10967/** 10968 * Element Disabled event. 10969 * 10970 * @event Cornerstone#ElementDisabled 10971 * @type {Object} 10972 * @property {string} type 10973 * @property {Object} detail 10974 * @property {HTMLElement} detail.element - The element being disabled. 10975 */ 10976 10977/** 10978 * Removes an enabledElement from our store, and all associated tools that were added to it. 10979 * @export 10980 * @private 10981 * @method 10982 * @name removeEnabledElement 10983 * @param {Cornerstone#ElementDisabled} elementDisabledEvt 10984 * @listens Cornerstone#ElementDisabled 10985 * @returns {void} 10986 */ 10987 10988/* harmony default export */ __webpack_exports__["default"] = (function (elementDisabledEvt) { 10989 logger.log('EVENT:ELEMENT_DISABLED'); 10990 var enabledElement = elementDisabledEvt.detail.element; // Dispatchers 10991 10992 _eventDispatchers_index_js__WEBPACK_IMPORTED_MODULE_1__["imageRenderedEventDispatcher"].disable(enabledElement); 10993 _eventDispatchers_index_js__WEBPACK_IMPORTED_MODULE_1__["newImageEventDispatcher"].disable(enabledElement); // Mouse 10994 10995 if (_index_js__WEBPACK_IMPORTED_MODULE_2__["default"].modules.globalConfiguration.state.mouseEnabled) { 10996 _eventListeners_index_js__WEBPACK_IMPORTED_MODULE_0__["mouseEventListeners"].disable(enabledElement); 10997 _eventListeners_index_js__WEBPACK_IMPORTED_MODULE_0__["wheelEventListener"].disable(enabledElement); 10998 _eventDispatchers_index_js__WEBPACK_IMPORTED_MODULE_1__["mouseToolEventDispatcher"].disable(enabledElement); 10999 } // Touch 11000 11001 11002 if (_index_js__WEBPACK_IMPORTED_MODULE_2__["default"].modules.globalConfiguration.state.touchEnabled) { 11003 _eventListeners_index_js__WEBPACK_IMPORTED_MODULE_0__["touchEventListeners"].disable(enabledElement); 11004 _eventDispatchers_index_js__WEBPACK_IMPORTED_MODULE_1__["touchToolEventDispatcher"].disable(enabledElement); 11005 } // State 11006 11007 11008 _removeAllToolsForElement(enabledElement); 11009 11010 _removeEnabledElement(enabledElement); 11011 11012 _removeLoadHandlers(enabledElement); 11013}); 11014/** 11015 * Remove all tools associated with enabled element. 11016 * @private 11017 * @method 11018 * @param {HTMLElement} enabledElement 11019 * @returns {void} 11020 */ 11021 11022var _removeAllToolsForElement = function _removeAllToolsForElement(enabledElement) { 11023 // Note: We may want to `setToolDisabled` before removing from store 11024 // Or take other action to remove any lingering eventListeners/state 11025 _index_js__WEBPACK_IMPORTED_MODULE_2__["default"].state.tools = _index_js__WEBPACK_IMPORTED_MODULE_2__["default"].state.tools.filter(function (tool) { 11026 return tool.element !== enabledElement; 11027 }); 11028}; 11029/** 11030 * Remove the enabled element from the store if it exists. 11031 * @private 11032 * @method 11033 * @param {HTMLElement} enabledElement 11034 * @returns {void} 11035 */ 11036 11037 11038var _removeEnabledElement = function _removeEnabledElement(enabledElement) { 11039 if (_index_js__WEBPACK_IMPORTED_MODULE_2__["default"].modules) { 11040 _cleanModulesOnElement(enabledElement); 11041 } 11042 11043 var foundElementIndex = _index_js__WEBPACK_IMPORTED_MODULE_2__["default"].state.enabledElements.findIndex(function (element) { 11044 return element === enabledElement; 11045 }); 11046 11047 if (foundElementIndex > -1) { 11048 _index_js__WEBPACK_IMPORTED_MODULE_2__["default"].state.enabledElements.splice(foundElementIndex, 1); 11049 } else { 11050 logger.warn('unable to remove element'); 11051 } 11052}; 11053/** 11054 * Remove load handler for the element 11055 * @private 11056 * @method 11057 * @param {HTMLElement} element 11058 * @returns {void} 11059 */ 11060 11061 11062var _removeLoadHandlers = function _removeLoadHandlers(element) { 11063 _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_4__["default"].removeHandlers(element); 11064}; 11065/** 11066 * Iterate over our store's modules. If the module has a 11067 * `removeEnabledElementCallback` call it and clean up unneeded metadata. 11068 * @private 11069 * @method 11070 * @param {Object} enabledElement 11071 * @returns {void} 11072 */ 11073 11074 11075function _cleanModulesOnElement(enabledElement) { 11076 var modules = _index_js__WEBPACK_IMPORTED_MODULE_2__["default"].modules;
11077 Object.keys(modules).forEach(function (key) { 11078 if (typeof modules[key].removeEnabledElementCallback === 'function') { 11079 modules[key].removeEnabledElementCallback(enabledElement); 11080 } 11081 }); 11082} 11083 11084/***/ }), 11085
11086/***/ "./store/isToolActive.js": 11087/*!*******************************!*\ 11088 !*** ./store/isToolActive.js ***! 11089 \*******************************/ 11090/*! exports provided: default */ 11091/***/ (function(module, __webpack_exports__, __webpack_require__) { 11092 11093"use strict"; 11094__webpack_require__.r(__webpack_exports__); 11095/* harmony import */ var _getToolForElement_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getToolForElement.js */ "./store/getToolForElement.js"); 11096 11097/** 11098 * Queries if a tool is active on the specified element. 11099 * @export 11100 * @public 11101 * @method 11102 * @name isToolActive 11103 * 11104 * @param {HTMLElement} element The element being queried. 11105 * @param {string} name The name of the tool. 11106 * @returns {boolean} True if the tool is active. 11107 */ 11108 11109/* harmony default export */ __webpack_exports__["default"] = (function (element, name) { 11110 var tool = Object(_getToolForElement_js__WEBPACK_IMPORTED_MODULE_0__["default"])(element, name); 11111 return tool.mode === 'active'; 11112}); 11113 11114/***/ }), 11115
11116/***/ "./store/modules/brushModule.js": 11117/*!**************************************!*\ 11118 !*** ./store/modules/brushModule.js ***! 11119 \**************************************/ 11120/*! exports provided: default */ 11121/***/ (function(module, __webpack_exports__, __webpack_require__) { 11122 11123"use strict"; 11124__webpack_require__.r(__webpack_exports__); 11125/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../../externalModules.js */ "./externalModules.js"); 11126 11127var state = { 11128 drawColorId: 0, 11129 radius: 10, 11130 minRadius: 1, 11131 maxRadius: 50, 11132 alpha: 0.4, 11133 renderBrushIfHiddenButActive: true, 11134 hiddenButActiveAlpha: 0.2, 11135 colorMapId: 'BrushColorMap', 11136 visibleSegmentations: {}, 11137 imageBitmapCache: {}, 11138 segmentationMetadata: {} 11139}; 11140var setters = { 11141 /** 11142 * Sets the brush radius, account for global min/max radius 11143 * 11144 * @param {number} radius 11145 * @returns {void} 11146 */ 11147 radius: function radius(_radius) { 11148 state.radius = Math.min(Math.max(_radius, state.minRadius), state.maxRadius); 11149 }, 11150 11151 /** 11152 * TODO: Should this be a init config property? 11153 * Sets the brush color map to something other than the default 11154 * 11155 * @param {Array} colors An array of 4D [red, green, blue, alpha] arrays. 11156 * @returns {void} 11157 */ 11158 brushColorMap: function brushColorMap(colors) { 11159 var colormap = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.colors.getColormap(state.colorMapId); 11160 colormap.setNumberOfColors(colors.length); 11161 11162 for (var i = 0; i < colors.length; i++) { 11163 colormap.setColor(i, colors[i]); 11164 } 11165 }, 11166 elementVisible: function elementVisible(enabledElement) { 11167 if (!_externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone) { 11168 return; 11169 } 11170 11171 var cornerstoneEnabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.getEnabledElement(enabledElement); 11172 var enabledElementUID = cornerstoneEnabledElement.uuid; 11173 var colormap = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.colors.getColormap(state.colorMapId); 11174 var numberOfColors = colormap.getNumberOfColors(); 11175 state.visibleSegmentations[enabledElementUID] = []; 11176 11177 for (var i = 0; i < numberOfColors; i++) { 11178 state.visibleSegmentations[enabledElementUID].push(true); 11179 } 11180 }, 11181 brushVisibilityForElement: function brushVisibilityForElement(enabledElementUID, segIndex) { 11182 var visible = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; 11183 11184 if (!state.visibleSegmentations[enabledElementUID]) { 11185 state.imageBitmapCache[enabledElementUID] = []; 11186 } 11187 11188 state.visibleSegmentations[enabledElementUID][segIndex] = visible; 11189 }, 11190 imageBitmapCacheForElement: function imageBitmapCacheForElement(enabledElementUID, segIndex, imageBitmap) { 11191 if (!state.imageBitmapCache[enabledElementUID]) { 11192 state.imageBitmapCache[enabledElementUID] = []; 11193 } 11194 11195 state.imageBitmapCache[enabledElementUID][segIndex] = imageBitmap; 11196 }, 11197 clearImageBitmapCacheForElement: function clearImageBitmapCacheForElement(enabledElementUID) { 11198 state.imageBitmapCache[enabledElementUID] = []; 11199 }, 11200 metadata: function metadata(seriesInstanceUid, segIndex, _metadata) { 11201 if (!state.segmentationMetadata[seriesInstanceUid]) { 11202 state.segmentationMetadata[seriesInstanceUid] = []; 11203 } 11204 11205 state.segmentationMetadata[seriesInstanceUid][segIndex] = _metadata; 11206 } 11207}; 11208var getters = { 11209 imageBitmapCacheForElement: function imageBitmapCacheForElement(enabledElementUID) { 11210 if (!state.imageBitmapCache[enabledElementUID]) { 11211 return null; 11212 } 11213 11214 return state.imageBitmapCache[enabledElementUID]; 11215 }, 11216 visibleSegmentationsForElement: function visibleSegmentationsForElement(enabledElementUID) { 11217 if (!state.visibleSegmentations[enabledElementUID]) { 11218 return null; 11219 } 11220 11221 return state.visibleSegmentations[enabledElementUID]; 11222 }, 11223 11224 /** 11225 * Retrieves series-specific brush segmentation metadata. 11226 * @public 11227 * @function metadata 11228 * @param {string} seriesInstanceUid - The seriesInstanceUid of the scan. 11229 * @param {number} [segIndex] - The segmentation index. 11230 * 11231 * @returns {Object[]|Object} An array of segmentation metadata, or specifc 11232 * segmentation data if segIndex is defined. 11233 */ 11234 metadata: function metadata(seriesInstanceUid, segIndex) { 11235 if (!state.segmentationMetadata[seriesInstanceUid]) { 11236 return; 11237 } 11238 11239 if (segIndex !== undefined) { 11240 return state.segmentationMetadata[seriesInstanceUid][segIndex]; 11241 } 11242 11243 return state.segmentationMetadata[seriesInstanceUid]; 11244 } 11245}; 11246/** 11247 * EnabledElementCallback - Element specific initilisation. 11248 * @public 11249 * @param {Object} enabledElement - The element on which the module is 11250 * being initialised. 11251 * @returns {void} 11252 */ 11253 11254function enabledElementCallback(enabledElement) {
11255 setters.elementVisible(enabledElement); 11256} 11257/** 11258 * RemoveEnabledElementCallback - Element specific memory cleanup. 11259 * @public 11260 * @param {Object} enabledElement The element being removed. 11261 * @returns {void} 11262 */ 11263// TODO -> Test this before adding it to the module. 11264 11265 11266function removeEnabledElementCallback(enabledElement) { 11267 if (!_externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone) { 11268 return; 11269 } 11270 11271 var cornerstoneEnabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.getEnabledElement(enabledElement); 11272 var enabledElementUID = cornerstoneEnabledElement.uuid; 11273 var colormap = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.colors.getColormap(state.colorMapId); 11274 var numberOfColors = colormap.getNumberOfColors(); // Remove enabledElement specific data. 11275 11276 delete state.visibleSegmentations[enabledElementUID]; 11277 delete state.imageBitmapCache[enabledElementUID]; 11278} 11279/** 11280 * OnRegisterCallback - Initialise the module when a new element is added. 11281 * @public 11282 * @returns {void} 11283 */ 11284 11285 11286function onRegisterCallback() { 11287 _initDefaultColorMap(); 11288} 11289 11290/* harmony default export */ __webpack_exports__["default"] = ({ 11291 state: state, 11292 onRegisterCallback: onRegisterCallback, 11293 enabledElementCallback: enabledElementCallback, 11294 getters: getters, 11295 setters: setters 11296}); 11297var distinctColors = [[230, 25, 75, 255], [60, 180, 175, 255], [255, 225, 25, 255], [0, 130, 200, 255], [245, 130, 48, 255], [145, 30, 180, 255], [70, 240, 240, 255], [240, 50, 230, 255], [210, 245, 60, 255], [250, 190, 190, 255], [0, 128, 128, 255], [230, 190, 255, 255], [170, 110, 40, 255], [255, 250, 200, 255], [128, 0, 0, 255], [170, 255, 195, 255], [128, 128, 0, 255], [255, 215, 180, 255], [0, 0, 128, 255]]; 11298var colorPairIndex = 0; 11299 11300function _initDefaultColorMap() { 11301 var defaultSegmentationCount = 19; 11302 var colormap = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.colors.getColormap(state.colorMapId); 11303 colormap.setNumberOfColors(defaultSegmentationCount); 11304 /* 11305 19 Colors selected to be as distinct from each other as possible, 11306 and ordered such that between each index you make large jumps around the 11307 color wheel. If defaultSegmentationCount is greater than 19, generate a 11308 random linearly interperlated color between 2 colors. 11309 */ 11310 11311 for (var i = 0; i < defaultSegmentationCount; i++) { 11312 if (i < distinctColors.length) { 11313 colormap.setColor(i, distinctColors[i]); 11314 } else { 11315 colormap.setColor(i, _generateInterpolatedColor()); 11316 } 11317 } 11318} 11319/** 11320 * _generateInterpolatedColor - generates a color interpolated between two 11321 * colors. Humans can only distinguish between 11322 * ~15-20 colors, so this is the best we can do. 11323 * @private 11324 * 11325 * @returns {type} description 11326 */ 11327 11328 11329function _generateInterpolatedColor() { 11330 var randIndicies = _getNextColorPair(); 11331 11332 var fraction = Math.random(); 11333 var interpolatedColor = []; 11334 11335 for (var i = 0; i < 4; i++) { 11336 interpolatedColor.push(Math.floor(fraction * distinctColors[randIndicies[0]][i] + (1.0 - fraction) * distinctColors[randIndicies[1]][i])); 11337 } 11338 11339 return interpolatedColor; 11340} 11341/** 11342 * _getNextColorPair - returns the next pair of indicies to interpolate between. 11343 * 11344 * @private 11345 * 11346 * @returns {Array} An array containing the two indicies. 11347 */ 11348 11349 11350function _getNextColorPair() { 11351 var indexPair = [colorPairIndex]; 11352 11353 if (colorPairIndex < distinctColors.length - 1) { 11354 colorPairIndex++; 11355 indexPair.push(colorPairIndex); 11356 } else { 11357 colorPairIndex = 0; 11358 indexPair.push(colorPairIndex); 11359 } 11360 11361 return indexPair; 11362} 11363 11364/***/ }), 11365
11366/***/ "./store/modules/cursorModule.js": 11367/*!***************************************!*\ 11368 !*** ./store/modules/cursorModule.js ***! 11369 \***************************************/ 11370/*! exports provided: default */ 11371/***/ (function(module, __webpack_exports__, __webpack_require__) { 11372 11373"use strict"; 11374__webpack_require__.r(__webpack_exports__); 11375var state = { 11376 iconSize: 16, 11377 viewBox: { 11378 x: 16, 11379 y: 16 11380 }, 11381 mousePoint: { 11382 x: 8, 11383 y: 8 11384 }, 11385 mousePointerGroupString: "\n <path stroke=\"ACTIVE_COLOR\" d=\"M8 16L8 0\"></path>\n <path stroke=\"ACTIVE_COLOR\" d=\"M16 8L0 8\"></path>\n " 11386}; 11387var setters = { 11388 defaultOptions: function defaultOptions(newOptions) { 11389 Object.assign(state, newOptions); 11390 } 11391}; 11392var getters = { 11393 defaultOptions: function defaultOptions() { 11394 return state; 11395 } 11396}; 11397/* harmony default export */ __webpack_exports__["default"] = ({ 11398 getters: getters, 11399 setters: setters 11400}); 11401 11402/***/ }), 11403
11404/***/ "./store/modules/globalConfigurationModule.js": 11405/*!****************************************************!*\ 11406 !*** ./store/modules/globalConfigurationModule.js ***! 11407 \****************************************************/ 11408/*! exports provided: default */ 11409/***/ (function(module, __webpack_exports__, __webpack_require__) { 11410 11411"use strict"; 11412__webpack_require__.r(__webpack_exports__); 11413var state = { 11414 mouseEnabled: true, 11415 touchEnabled: true, 11416 globalToolSyncEnabled: false, 11417 showSVGCursors: false 11418}; 11419/* harmony default export */ __webpack_exports__["default"] = ({ 11420 state: state, 11421 setters: {} 11422}); 11423 11424/***/ }), 11425
11426/***/ "./store/removeTool.js": 11427/*!*****************************!*\ 11428 !*** ./store/removeTool.js ***! 11429 \*****************************/ 11430/*! exports provided: removeTool, removeToolForElement */ 11431/***/ (function(module, __webpack_exports__, __webpack_require__) { 11432 11433"use strict"; 11434__webpack_require__.r(__webpack_exports__); 11435/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "removeTool", function() { return removeTool; }); 11436/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "removeToolForElement", function() { return removeToolForElement; }); 11437/* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./index.js */ "./store/index.js"); 11438 11439/** 11440 * Deactivates and removes the tool from the target element with the provided name 11441 * 11442 * @export 11443 * @public 11444 * @method 11445 * @name removeToolForElement 11446 * @param {HTMLElement} element The element. 11447 * @param {string} toolName The name of the tool. 11448 * @returns {void} 11449 */ 11450 11451var removeToolForElement = function removeToolForElement(element, toolName) { 11452 var toolIndex = _index_js__WEBPACK_IMPORTED_MODULE_0__["default"].state.tools.findIndex(function (tool) { 11453 return tool.element === element && tool.name === toolName; 11454 }); 11455 11456 if (toolIndex >= 0) { 11457 _index_js__WEBPACK_IMPORTED_MODULE_0__["default"].state.tools.splice(toolIndex, 1); 11458 } 11459}; 11460/** 11461 * Removes all tools from all enabled elements with the provided name. 11462 * 11463 * @export 11464 * @public 11465 * @method 11466 * @name removeTool 11467 * @param {string} toolName The name of the tool. 11468 * @returns {void} 11469 */ 11470 11471 11472var removeTool = function removeTool(toolName) { 11473 _removeToolGlobally(toolName); 11474 11475 _index_js__WEBPACK_IMPORTED_MODULE_0__["default"].state.enabledElements.forEach(function (element) { 11476 removeToolForElement(element, toolName); 11477 }); 11478}; 11479/** 11480 * Removes tool with matching name from globally registered tools. 11481 * Requires `globalToolSyncEnabled` to be set to true 11482 * 11483 * @private 11484 * @method 11485 * @name removeToolGlobally 11486 * @param {string} toolName The name of the tool to remove. 11487 * @returns {void} 11488 */ 11489 11490 11491var _removeToolGlobally = function _removeToolGlobally(toolName) { 11492 if (!_index_js__WEBPACK_IMPORTED_MODULE_0__["default"].modules.globalConfiguration.state.globalToolSyncEnabled) { 11493 return; 11494 } 11495 11496 if (_index_js__WEBPACK_IMPORTED_MODULE_0__["default"].state.globalTools[toolName]) { 11497 delete _index_js__WEBPACK_IMPORTED_MODULE_0__["default"].state.globalTools[toolName]; 11498 } 11499}; 11500 11501 11502 11503/***/ }), 11504
11505/***/ "./store/setToolCursor.js": 11506/*!********************************!*\ 11507 !*** ./store/setToolCursor.js ***! 11508 \********************************/ 11509/*! exports provided: setToolCursor, resetToolCursor, hideToolCursor */ 11510/***/ (function(module, __webpack_exports__, __webpack_require__) { 11511 11512"use strict"; 11513__webpack_require__.r(__webpack_exports__); 11514/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setToolCursor", function() { return setToolCursor; }); 11515/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "resetToolCursor", function() { return resetToolCursor; }); 11516/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "hideToolCursor", function() { return hideToolCursor; }); 11517/* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./index.js */ "./store/index.js"); 11518 11519 11520var globalConfiguration = _index_js__WEBPACK_IMPORTED_MODULE_0__["modules"].globalConfiguration; 11521/** 11522 * Creates an SVG Cursor for the target element 11523 * 11524 * @param {HTMLElement} element - The DOM Element to draw on 11525 * @param {MouseCursor} svgCursor - The cursor. 11526 * @returns {void} 11527 */ 11528 11529function setToolCursor(element, svgCursor) { 11530 if (!globalConfiguration.state.showSVGCursors) { 11531 return; 11532 } // TODO: (state vs options) Exit if cursor wasn't updated 11533 // TODO: Exit if invalid options to create cursor 11534 // Note: Max size of an SVG cursor is 128x128, default is 32x32. 11535 11536 11537 var cursorBlob = svgCursor.getIconWithPointerSVG(); 11538 var mousePoint = svgCursor.mousePoint; 11539 var svgCursorUrl = window.URL.createObjectURL(cursorBlob); 11540 element.style.cursor = "url('".concat(svgCursorUrl, "') ").concat(mousePoint, ", auto"); 11541 _index_js__WEBPACK_IMPORTED_MODULE_0__["state"].svgCursorUrl = svgCursorUrl; 11542} 11543 11544function resetToolCursor(element) { 11545 _clearStateAndSetCursor(element, 'initial'); 11546} 11547 11548function hideToolCursor(element) { 11549 if (!globalConfiguration.state.showSVGCursors) { 11550 return; 11551 } 11552 11553 _clearStateAndSetCursor(element, 'none'); 11554} 11555 11556function _clearStateAndSetCursor(element, cursorSeting) { 11557 if (_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].svgCursorUrl) { 11558 window.URL.revokeObjectURL(_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].svgCursorUrl); 11559 } 11560 11561 _index_js__WEBPACK_IMPORTED_MODULE_0__["state"].svgCursorUrl = null; 11562 element.style.cursor = cursorSeting; 11563} 11564 11565/***/ }), 11566
11567/***/ "./store/setToolMode.js": 11568/*!******************************!*\ 11569 !*** ./store/setToolMode.js ***! 11570 \******************************/ 11571/*! exports provided: setToolActive, setToolActiveForElement, setToolDisabled, setToolDisabledForElement, setToolEnabled, setToolEnabledForElement, setToolPassive, setToolPassiveForElement, setToolMode, setToolModeForElement, _getNormalizedOptions, _mergeMouseButtonMask */ 11572/***/ (function(module, __webpack_exports__, __webpack_require__) { 11573 11574"use strict"; 11575__webpack_require__.r(__webpack_exports__); 11576/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setToolActive", function() { return setToolActive; }); 11577/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setToolActiveForElement", function() { return setToolActiveForElement; }); 11578/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setToolDisabled", function() { return setToolDisabled; }); 11579/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setToolDisabledForElement", function() { return setToolDisabledForElement; }); 11580/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setToolEnabled", function() { return setToolEnabled; }); 11581/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setToolEnabledForElement", function() { return setToolEnabledForElement; }); 11582/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setToolPassive", function() { return setToolPassive; }); 11583/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setToolPassiveForElement", function() { return setToolPassiveForElement; }); 11584/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setToolMode", function() { return setToolMode; }); 11585/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setToolModeForElement", function() { return setToolModeForElement; }); 11586/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_getNormalizedOptions", function() { return _getNormalizedOptions; }); 11587/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "_mergeMouseButtonMask", function() { return _mergeMouseButtonMask; }); 11588/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../events.js */ "./events.js"); 11589/* harmony import */ var _util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./../util/triggerEvent.js */ "./util/triggerEvent.js"); 11590/* harmony import */ var _getToolForElement_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./getToolForElement.js */ "./store/getToolForElement.js"); 11591/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./../store/index.js */ "./store/index.js"); 11592/* harmony import */ var _setToolCursor_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./setToolCursor.js */ "./store/setToolCursor.js"); 11593/* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../util/logger.js */ "./util/logger.js"); 11594 11595 11596 11597 11598 11599 11600var globalConfiguration = _store_index_js__WEBPACK_IMPORTED_MODULE_3__["default"].modules.globalConfiguration; 11601var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_5__["getLogger"])('store:setToolMode'); 11602/** 11603 * Sets a tool's state, with the provided toolName and element, to 'active'. Active tools are rendered, 11604 * respond to user input, and can create new data. 11605 * 11606 * @public 11607 * @function setToolActiveForElement 11608 * @memberof CornerstoneTools 11609 * 11610 * @example <caption>Setting a tool 'active' for a specific interaction type.</caption> 11611 * // Sets length tool to Active 11612 * setToolActiveForElement(element, 'Length', { 11613 * mouseButtonMask: 1 11614 * }, ['Mouse']) 11615 * @example <caption>Setting a tool 'active' for all interaction types.</caption> 11616 * // Sets length tool to Active 11617 * setToolActiveForElement(element, 'Length', { 11618 * mouseButtonMask: 1 11619 * }) 11620 * @param {HTMLElement} element 11621 * @param {string} toolName 11622 * @param {(Object|string[]|number)} options 11623 * @param {(string[])} interactionTypes 11624 * @returns {undefined} 11625 */ 11626 11627var setToolActiveForElement = function setToolActiveForElement(element, toolName, options, interactionTypes) { 11628 // If interactionTypes was passed in via options 11629 if (interactionTypes === undefined && Array.isArray(options)) { 11630 interactionTypes = options; 11631 options = null; 11632 } 11633 11634 var tool = Object(_getToolForElement_js__WEBPACK_IMPORTED_MODULE_2__["default"])(element, toolName); 11635 11636 if (tool) { 11637 _resolveInputConflicts(element, tool, options, interactionTypes); // Iterate over specific interaction types and set active 11638 // This is used as a secondary check on active tools to find the active "parts" of the tool 11639 11640
11641 tool.supportedInteractionTypes.forEach(function (interactionType) { 11642 if (interactionTypes === undefined || interactionTypes.includes(interactionType)) { 11643 options["is".concat(interactionType, "Active")] = true; 11644 } else { 11645 options["is".concat(interactionType, "Active")] = false; 11646 } 11647 }); 11648 11649 if (globalConfiguration.state.showSVGCursors && tool.supportedInteractionTypes.includes('Mouse')) { 11650 _setToolCursorIfPrimary(element, options, tool); 11651 } 11652 } // Resume normal behavior 11653 11654 11655 setToolModeForElement('active', null, element, toolName, options); 11656}; 11657 11658function _setToolCursorIfPrimary(element, options, tool) { 11659 var mouseButtonMask; 11660 11661 if (typeof options === 'number') { 11662 mouseButtonMask = [options]; 11663 } else { 11664 mouseButtonMask = options.mouseButtonMask; 11665 } 11666 11667 if (mouseButtonMask.includes(1)) { 11668 if (tool.svgCursor) { 11669 Object(_setToolCursor_js__WEBPACK_IMPORTED_MODULE_4__["setToolCursor"])(tool.element, tool.svgCursor); 11670 } else if (tool.hideDefaultCursor) { 11671 Object(_setToolCursor_js__WEBPACK_IMPORTED_MODULE_4__["hideToolCursor"])(element); 11672 } else { 11673 Object(_setToolCursor_js__WEBPACK_IMPORTED_MODULE_4__["resetToolCursor"])(element); 11674 } 11675 } 11676} 11677/** 11678 * Sets all tool's state, with the provided toolName, to 'active'. Active tools are rendered, 11679 * respond to user input, and can create new data. 11680 * @public 11681 * @function setToolActive 11682 * @memberof CornerstoneTools 11683 * 11684 * @param {string} toolName 11685 * @param {(Object|string[]|number)} options 11686 * @param {(string[])} interactionTypes 11687 * @returns {undefined} 11688 */ 11689 11690 11691var setToolActive = function setToolActive(toolName, options, interactionTypes) { 11692 _trackGlobalToolModeChange('active', toolName, options, interactionTypes); 11693 11694 _store_index_js__WEBPACK_IMPORTED_MODULE_3__["default"].state.enabledElements.forEach(function (element) { 11695 setToolActiveForElement(element, toolName, options, interactionTypes); 11696 }); 11697}; 11698/** 11699 * Sets a tool's state, with the provided toolName and element, to 'disabled'. Disabled tools are not rendered, 11700 * and do not respond to user input 11701 * @public 11702 * @function setToolDisabledForElement 11703 * @memberof CornerstoneTools 11704 * 11705 * @param {HTMLElement} element 11706 * @param {string} toolName 11707 * @param {(Object|number)} options 11708 * @returns {undefined} 11709 */ 11710 11711 11712var setToolDisabledForElement = setToolModeForElement.bind(null, 'disabled', null); 11713/** 11714 * Sets all tool's state, with the provided toolName, to 'disabled'. Disabled tools are not rendered, 11715 * and do not respond to user input 11716 * @public 11717 * @function setToolDisabled 11718 * @memberof CornerstoneTools 11719 * 11720 * @param {string} toolName 11721 * @param {(Object|number)} options 11722 * @returns {undefined} 11723 */ 11724 11725var setToolDisabled = setToolMode.bind(null, 'disabled', null); 11726/** 11727 * Sets a tool's state, with the provided toolName and element, to 'enabled'. Enabled tools are rendered, 11728 * but do not respond to user input 11729 * @public 11730 * @function setToolEnabledForElement 11731 * @memberof CornerstoneTools 11732 * 11733 * @param {HTMLElement} element 11734 * @param {string} toolName 11735 * @param {(Object|number)} options 11736 * @returns {undefined} 11737 */ 11738 11739var setToolEnabledForElement = setToolModeForElement.bind(null, 'enabled', null); 11740/** 11741 * Sets all tool's state, with the provided toolName, to 'enabled'. Enabled tools are rendered, 11742 * but do not respond to user input 11743 * @public 11744 * @function setToolEnabled 11745 * @memberof CornerstoneTools 11746 * 11747 * @param {string} toolName 11748 * @param {(Object|number)} options 11749 * @returns {undefined} 11750 */ 11751 11752var setToolEnabled = setToolMode.bind(null, 'enabled', null); 11753/** 11754 * Sets a tool's state, with the provided toolName and element, to 'passive'. Passive tools are rendered and respond to user input, 11755 * but do not create new measurements or annotations. 11756 * @public 11757 * @function setToolPassiveForElement 11758 * @memberof CornerstoneTools 11759 * 11760 * @param {HTMLElement} element 11761 * @param {string} toolName 11762 * @param {(Object|number)} options 11763 * @returns {undefined} 11764 */ 11765 11766var setToolPassiveForElement = setToolModeForElement.bind(null, 'passive', _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOOL_DEACTIVATED); 11767/** 11768 * Sets all tool's state, with the provided toolName, to 'passive'. Passive tools are rendered and respond to user input, 11769 * but do not create new measurements or annotations. 11770 * @public 11771 * @function setToolPassive 11772 * @memberof CornerstoneTools 11773 * 11774 * @param {string} toolName 11775 * @param {(Object|number)} options 11776 * @returns {undefined} 11777 */ 11778 11779var setToolPassive = setToolMode.bind(null, 'passive', _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].TOOL_DEACTIVATED); 11780/** 11781 * An internal method that helps make sure we change tool mode in a consistent 11782 * way 11783 * @private 11784 * @function setToolModeForElement 11785 * 11786 * @param {string} mode 11787 * @param {string} changeEvent 11788 * @param {HTMLElement} element 11789 * @param {string} toolName 11790 * @param {(Object|number[]|number)} options 11791 * @returns {undefined} 11792 */ 11793 11794function setToolModeForElement(mode, changeEvent, element, toolName, options) { 11795 var tool = Object(_getToolForElement_js__WEBPACK_IMPORTED_MODULE_2__["default"])(element, toolName); 11796 11797 if (!tool) { 11798 logger.warn('Unable to find tool "%s" for enabledElement', toolName); 11799 return; 11800 } 11801 11802 options = _getNormalizedOptions(options); // Keep the same if not an array (undefined) 11803 // Reset if empty array 11804 // Merge if array contains any bindings 11805 11806 if (Array.isArray(options.mouseButtonMask) && options.mouseButtonMask.length !== 0 && Array.isArray(tool.options.mouseButtonMask)) { 11807 options.mouseButtonMask = _mergeMouseButtonMask(options.mouseButtonMask, tool.options.mouseButtonMask); 11808 } // Set mode & options 11809 11810 11811 tool.mode = mode; 11812 tool.mergeOptions(options); // Call tool's hook for this event, if one exists 11813 11814 if (tool["".concat(mode, "Callback")]) { 11815 tool["".concat(mode, "Callback")](element, options); 11816 } // Emit event indicating tool state change 11817 11818 11819 if (changeEvent) { 11820 var statusChangeEventData = { 11821 options: options, 11822 toolName: toolName, 11823 type: changeEvent 11824 };
11825 Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_1__["default"])(element, changeEvent, statusChangeEventData); 11826 } // Trigger Update 11827 // Todo: don't error out if image hasn't been loaded... 11828 // Cornerstone.updateImage(element); 11829 11830} 11831/** 11832 * A helper/quick way to set a tool's mode for all canvases 11833 * 11834 * @private 11835 * @function setToolMode 11836 * 11837 * @param {string} mode 11838 * @param {string} changeEvent 11839 * @param {string} toolName 11840 * @param {(Object|number)} options 11841 * @returns {undefined} 11842 */ 11843 11844 11845function setToolMode(mode, changeEvent, toolName, options) { 11846 _trackGlobalToolModeChange(mode, toolName, options); 11847 11848 _store_index_js__WEBPACK_IMPORTED_MODULE_3__["default"].state.enabledElements.forEach(function (element) { 11849 setToolModeForElement(mode, changeEvent, element, toolName, options); 11850 }); 11851} 11852/** 11853 * Find tool's that conflict with the incoming tool's mouse/touch bindings and 11854 * resolve those conflicts. 11855 * 11856 * @private 11857 * @function _resolveInputConflicts 11858 * 11859 * @param {HTMLElement} element 11860 * @param {Object} tool 11861 * @param {(Object|number)} options 11862 * @param {(Array)} interactionTypes 11863 * @returns {undefined} 11864 */ 11865 11866 11867function _resolveInputConflicts(element, tool, options, interactionTypes) { 11868 // Iterate over the interaction types our tool supports. 11869 // For each one we intend to activate, check for potential conflicts 11870 // And resolve them 11871 tool.supportedInteractionTypes.forEach(function (interactionType) { 11872 if (interactionTypes === undefined || interactionTypes.includes(interactionType)) { 11873 var inputResolver = _inputResolvers[interactionType]; 11874 11875 if (inputResolver) { 11876 inputResolver(tool, element, options); 11877 } else { 11878 logger.warn('Unable to resolve input conflicts for type %s', interactionType); 11879 } 11880 } 11881 }); 11882 var activeToolsForElement = _store_index_js__WEBPACK_IMPORTED_MODULE_3__["default"].state.tools.filter(function (t) { 11883 return t.element === element && t.mode === 'active' && t.supportedInteractionTypes.length > 0; 11884 }); 11885 activeToolsForElement.forEach(function (t) { 11886 var toolHasAnyActiveInteractionType = false;
11887 t.supportedInteractionTypes.forEach(function (interactionType) { 11888 if (t.options["is".concat(interactionType, "Active")]) { 11889 toolHasAnyActiveInteractionType = true; 11890 } 11891 }); 11892 11893 if (!toolHasAnyActiveInteractionType) { 11894 logger.log("Setting tool %s's to PASSIVE", t.name); 11895 setToolPassiveForElement(element, t.name); 11896 } 11897 }); 11898} 11899/** 11900 * Resolves conflicting active tools when activating a tool for mouse interaction 11901 * @private 11902 * @function _resolveMouseInputConflicts 11903 * 11904 * @param {Object} tool 11905 * @param {HTMLElement} element 11906 * @param {(Object|number)} options 11907 * @returns {undefined} 11908 */ 11909 11910 11911function _resolveMouseInputConflicts(tool, element, options) { 11912 var mouseButtonMask = _getNormalizedOptions(options).mouseButtonMask; 11913 11914 var hasMouseButtonMask = Array.isArray(mouseButtonMask) && mouseButtonMask.length > 0; 11915 11916 if (!hasMouseButtonMask) { 11917 return; 11918 } 11919 11920 var activeToolWithMatchingMouseButtonMask = _store_index_js__WEBPACK_IMPORTED_MODULE_3__["default"].state.tools.find(function (t) { 11921 return t.element === element && t.mode === 'active' && t.options.isMouseActive === true && Array.isArray(t.options.mouseButtonMask) && t.options.mouseButtonMask.some(function (v) { 11922 return mouseButtonMask.includes(v); 11923 }); 11924 }); 11925 11926 if (activeToolWithMatchingMouseButtonMask) { 11927 // Remove collissions 11928 activeToolWithMatchingMouseButtonMask.options.mouseButtonMask = activeToolWithMatchingMouseButtonMask.options.mouseButtonMask.filter(function (mask) { 11929 return !mouseButtonMask.includes(mask); 11930 }); // If no remaining bindings, set inactive 11931 11932 if (activeToolWithMatchingMouseButtonMask.options.mouseButtonMask.length === 0) { 11933 activeToolWithMatchingMouseButtonMask.options.isMouseActive = false; 11934 } 11935 } 11936} 11937/** 11938 * Resolves conflicting active tools when activating a tool for touch interaction 11939 * @private 11940 * @function _resolveTouchInputConflicts 11941 * 11942 * @param {Object} tool 11943 * @param {HTMLElement} element 11944 * @param {Object} options 11945 * @returns {undefined} 11946 */ 11947 11948 11949function _resolveTouchInputConflicts(tool, element, options) { 11950 var activeTouchTool = _store_index_js__WEBPACK_IMPORTED_MODULE_3__["default"].state.tools.find(function (t) { 11951 return t.element === element && t.mode === 'active' && t.options.isTouchActive === true; 11952 }); 11953 var activeMultiTouchToolWithOneTouchPointer = _store_index_js__WEBPACK_IMPORTED_MODULE_3__["default"].state.tools.find(function (t) { 11954 return t.element === element && t.mode === 'active' && t.options.isMultiTouchActive === true && t.configuration.touchPointers === 1; 11955 }); 11956 11957 if (activeTouchTool) { 11958 logger.log("Setting tool %s's isTouchActive to false", activeTouchTool.name); 11959 activeTouchTool.options.isTouchActive = false; 11960 } 11961 11962 if (activeMultiTouchToolWithOneTouchPointer) { 11963 logger.log("Setting tool %s's isTouchActive to false", activeMultiTouchToolWithOneTouchPointer.name); 11964 activeMultiTouchToolWithOneTouchPointer.options.isMultiTouchActive = false; 11965 } 11966} 11967/** 11968 * Resolves conflicting active tools when activating a tool for MultiTouch interaction 11969 * @private 11970 * @function _resolveMultiTouchInputConflicts 11971 * 11972 * @param {Object} tool 11973 * @param {HTMLElement} element 11974 * @param {Object} options 11975 * @returns {undefined} 11976 */ 11977 11978 11979function _resolveMultiTouchInputConflicts(tool, element, options) { 11980 var activeMultiTouchTool = _store_index_js__WEBPACK_IMPORTED_MODULE_3__["default"].state.tools.find(function (t) { 11981 return t.element === element && t.mode === 'active' && t.options.isMultiTouchActive === true && t.configuration.touchPointers === tool.configuration.touchPointers; 11982 }); 11983 var activeTouchTool; 11984 11985 if (tool.configuration.touchPointers === 1) { 11986 activeTouchTool = _store_index_js__WEBPACK_IMPORTED_MODULE_3__["default"].state.tools.find(function (t) { 11987 return t.element === element && t.mode === 'active' && t.options.isTouchActive === true; 11988 }); 11989 } 11990 11991 if (activeMultiTouchTool) { 11992 logger.log("Setting tool %s's isMultiTouchActive to false", activeMultiTouchTool.name); 11993 activeMultiTouchTool.options.isMultiTouchActive = false; 11994 } 11995 11996 if (activeTouchTool) { 11997 logger.log("Setting tool %s's isTouchActive to false", activeTouchTool.name); 11998 activeTouchTool.options.isTouchActive = false;
11999 } 12000} 12001/** 12002 * If the incoming tool isTouchActive, find any conflicting tools 12003 * and set their isTouchActive to false to avoid conflicts. 12004 * 12005 * @private 12006 * @function _resolveGenericInputConflicts 12007 * 12008 * @param {string} interactionType 12009 * @param {Object} tool 12010 * @param {HTMLElement} element 12011 * @param {(Object|number)} options 12012 * @returns {undefined} 12013 */ 12014 12015 12016function _resolveGenericInputConflicts(interactionType, tool, element, options) { 12017 var interactionTypeFlag = "is".concat(interactionType, "Active"); 12018 var activeToolWithActiveInteractionType = _store_index_js__WEBPACK_IMPORTED_MODULE_3__["default"].state.tools.find(function (t) { 12019 return t.element === element && t.mode === 'active' && t.options[interactionTypeFlag] === true; 12020 }); 12021 12022 if (activeToolWithActiveInteractionType) { 12023 logger.log("Setting tool %s's %s to false", activeToolWithActiveInteractionType.name, interactionTypeFlag); 12024 activeToolWithActiveInteractionType.options[interactionTypeFlag] = false; 12025 } 12026} 12027 12028function _trackGlobalToolModeChange(mode, toolName, options, interactionTypes) { 12029 if (!_store_index_js__WEBPACK_IMPORTED_MODULE_3__["default"].modules.globalConfiguration.state.globalToolSyncEnabled) { 12030 return; 12031 } // Update Tool History 12032 12033 12034 var historyEvent = { 12035 mode: mode, 12036 args: [toolName, options] 12037 }; 12038 12039 if (interactionTypes) { 12040 historyEvent.push(interactionTypes); 12041 } 12042 12043 _store_index_js__WEBPACK_IMPORTED_MODULE_3__["default"].state.globalToolChangeHistory.push(historyEvent); 12044 var arbitraryChangeHistoryLimit = 50; 12045 12046 if (_store_index_js__WEBPACK_IMPORTED_MODULE_3__["default"].state.globalToolChangeHistory.length > arbitraryChangeHistoryLimit) { 12047 _store_index_js__WEBPACK_IMPORTED_MODULE_3__["default"].state.globalToolChangeHistory.shift(); 12048 } // Update ActiveBindings Array 12049 12050 12051 var globalTool = _store_index_js__WEBPACK_IMPORTED_MODULE_3__["default"].state.globalTools[toolName]; 12052 12053 if (!globalTool) { 12054 logger.warn("setToolMode call for tool that's not available globally: ".concat(toolName)); 12055 return; 12056 } 12057 12058 if (mode === 'active') { 12059 var stringBindings = _determineStringBindings(toolName, options, interactionTypes); // Remove the incoming bindings from all global tools 12060 12061 12062 Object.keys(_store_index_js__WEBPACK_IMPORTED_MODULE_3__["default"].state.globalTools).forEach(function (key) { 12063 var tool = _store_index_js__WEBPACK_IMPORTED_MODULE_3__["default"].state.globalTools[key]; 12064 tool.activeBindings = tool.activeBindings.filter(function (binding) { 12065 return !stringBindings.includes(binding); 12066 }); 12067 }); // @HACK: Clear mouse bindings 12068 12069 if (stringBindings.some(function (binding) { 12070 return binding.includes('Mouse-DELETE'); 12071 })) { 12072 globalTool.activeBindings = globalTool.activeBindings.filter(function (binding) { 12073 return !binding.includes('Mouse'); 12074 }); 12075 stringBindings = stringBindings.filter(function (binding) { 12076 return !binding.includes('Mouse'); 12077 }); 12078 } 12079 12080 globalTool.activeBindings = globalTool.activeBindings.concat(stringBindings); 12081 } else { 12082 globalTool.activeBindings = []; 12083 } 12084} 12085 12086function _determineStringBindings(toolName, options, interactionTypes) { 12087 if (interactionTypes === undefined && Array.isArray(options)) { 12088 interactionTypes = options; 12089 options = null; 12090 } 12091 12092 var stringBindings = []; 12093 var globalTool = _store_index_js__WEBPACK_IMPORTED_MODULE_3__["default"].state.globalTools[toolName]; 12094 12095 if (globalTool) { 12096 // eslint-disable-next-line new-cap 12097 var tool = new globalTool.tool(globalTool.props); 12098 tool.supportedInteractionTypes.forEach(function (interactionType) { 12099 if (interactionTypes === undefined || interactionTypes.includes(interactionType)) { 12100 if (interactionType === 'Mouse') { 12101 var mouseButtonMasks = _getNormalizedOptions(options).mouseButtonMask; // Add or delete 12102 12103 12104 if (Array.isArray(mouseButtonMasks) && mouseButtonMasks.length > 0) { 12105 mouseButtonMasks.forEach(function (mask) { 12106 return stringBindings.push("".concat(interactionType, "-").concat(mask)); 12107 }); 12108 } else if (Array.isArray(mouseButtonMasks) && mouseButtonMasks.length === 0) {
12109 stringBindings.push("".concat(interactionType, "-DELETE")); 12110 } 12111 } else if (interactionType === 'MultiTouch') { 12112 stringBindings.push("".concat(interactionType, "-").concat(tool.configuration.touchPointers)); 12113 } else { 12114 stringBindings.push(interactionType); 12115 } 12116 } 12117 }); 12118 } 12119 12120 return stringBindings; 12121} 12122 12123var _inputResolvers = { 12124 Mouse: _resolveMouseInputConflicts, 12125 MouseWheel: _resolveGenericInputConflicts.bind(undefined, 'MouseWheel'), 12126 Touch: _resolveTouchInputConflicts, 12127 TouchPinch: _resolveGenericInputConflicts.bind(undefined, 'TouchPinch'), 12128 TouchRotate: _resolveGenericInputConflicts.bind(undefined, 'TouchRotate'), 12129 DoubleTap: _resolveGenericInputConflicts.bind(undefined, 'DoubleTap'), 12130 MultiTouch: _resolveMultiTouchInputConflicts 12131}; 12132 12133function _getNormalizedOptions(options) { 12134 if (Array.isArray(options)) { 12135 // If options is an array assume the array is the mouseButtonMask array 12136 options = { 12137 mouseButtonMask: options 12138 }; 12139 } else if (options !== Object(options)) { 12140 // And if it's something other than an object, assume options is 12141 // a single mouseButtonMask 12142 options = { 12143 mouseButtonMask: [options] 12144 }; 12145 } // If there is still no 'mouseButtonMask' default it to an empty array 12146 12147 12148 if (!options.hasOwnProperty('mouseButtonMask')) { 12149 options.mouseButtonMask = []; 12150 } 12151 12152 if (!Array.isArray(options.mouseButtonMask)) { 12153 options.mouseButtonMask = [options.mouseButtonMask]; 12154 } // Now filter out anything that is not an number or is the number 0 12155 12156 12157 options.mouseButtonMask = options.mouseButtonMask.filter(function (o) { 12158 return typeof o === 'number' && o !== 0; 12159 }); 12160 return options; 12161} 12162 12163function _mergeMouseButtonMask(newMask, oldMask) { 12164 // Merges and removes duplicates 12165 return newMask.concat(oldMask).reduce(function (acc, m) { 12166 if (acc.indexOf(m) === -1) { 12167 acc.push(m); 12168 } 12169 12170 return acc; 12171 }, []); 12172} 12173 12174 12175 12176/***/ }), 12177
12178/***/ "./store/setToolOptions.js": 12179/*!*********************************!*\ 12180 !*** ./store/setToolOptions.js ***! 12181 \*********************************/ 12182/*! exports provided: setToolOptions, setToolOptionsForElement */ 12183/***/ (function(module, __webpack_exports__, __webpack_require__) { 12184 12185"use strict"; 12186__webpack_require__.r(__webpack_exports__); 12187/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setToolOptions", function() { return setToolOptions; }); 12188/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setToolOptionsForElement", function() { return setToolOptionsForElement; }); 12189/* harmony import */ var _getToolForElement_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./getToolForElement.js */ "./store/getToolForElement.js"); 12190/* harmony import */ var _index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./index.js */ "./store/index.js"); 12191 12192 12193/** 12194 * Sets the options of a tool on a specific element. 12195 * @export 12196 * @public 12197 * @method 12198 * @name setToolOptionsForElement 12199 * 12200 * @param {HTMLElement} element The element. 12201 * @param {string} toolName The name of the tool. 12202 * @param {Object} options The options to set. 12203 * @returns {void} 12204 */ 12205 12206var setToolOptionsForElement = function setToolOptionsForElement(element, toolName, options) { 12207 var tool = Object(_getToolForElement_js__WEBPACK_IMPORTED_MODULE_0__["default"])(element, toolName); 12208 12209 if (tool) { 12210 tool.mergeOptions(options); 12211 } 12212}; 12213/** 12214 * Sets the options of a tool for all elements. 12215 * @export 12216 * @public 12217 * @method 12218 * @name setToolOptions 12219 * 12220 * @param {string} toolName 12221 * @param {Object} options 12222 * @returns {void} 12223 */ 12224 12225 12226var setToolOptions = function setToolOptions(toolName, options) { 12227 _index_js__WEBPACK_IMPORTED_MODULE_1__["state"].enabledElements.forEach(function (element) { 12228 setToolOptionsForElement(element, toolName, options); 12229 }); 12230}; 12231 12232 12233 12234/***/ }), 12235
12236/***/ "./synchronization/Synchronizer.js": 12237/*!*****************************************!*\ 12238 !*** ./synchronization/Synchronizer.js ***! 12239 \*****************************************/ 12240/*! exports provided: default */ 12241/***/ (function(module, __webpack_exports__, __webpack_require__) { 12242 12243"use strict"; 12244__webpack_require__.r(__webpack_exports__); 12245/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js"); 12246/* harmony import */ var _util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../util/convertToVector3.js */ "./util/convertToVector3.js"); 12247/* harmony import */ var _toolOptions_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../toolOptions.js */ "./toolOptions.js"); 12248 12249 12250 12251/** 12252 * Return an array filtered to only its unique members 12253 * 12254 * @private 12255 * @param {Array} array - The array to filter 12256 * @returns {Array} 12257 */ 12258 12259function unique(array) { 12260 return array.filter(function (value, index, self) { 12261 return self.indexOf(value) === index; 12262 }); 12263} 12264/** 12265 * Synchronize target and source elements when an event fires on the source element 12266 * @export @public constructor 12267 * @name Synchronizer 12268 * 12269 * @param {String} event - The event(s) that will trigger synchronization. Separate multiple events by a space 12270 * @param {Function} handler - The function that will make the necessary changes to the target element in order to synchronize it with the source element 12271 * @returns {void} 12272 */ 12273 12274 12275function Synchronizer(event, handler) { 12276 var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone; 12277 var that = this; 12278 var sourceElements = []; // Source elements fire the events we want to synchronize to 12279 12280 var targetElements = []; // Target elements we want to synchronize to source elements 12281 12282 var ignoreFiredEvents = false; 12283 var initialData = {}; 12284 var eventHandler = handler; 12285 this.enabled = true; 12286 /** 12287 * Update the event handler to perform synchronization 12288 * @param {Function} handler - The event handler function 12289 * @returns {void} 12290 */ 12291 12292 this.setHandler = function (handler) { 12293 eventHandler = handler; 12294 }; 12295 /** 12296 * Return a reference to the event handler function 12297 * @returns {Function} 12298 */ 12299 12300 12301 this.getHandler = function () { 12302 return eventHandler; 12303 }; 12304 /** 12305 * Calculate the initial distances between the source image and each 12306 * of the target images 12307 * @returns {void} 12308 */ 12309 12310 12311 this.getDistances = function () { 12312 if (!sourceElements.length || !targetElements.length) { 12313 return; 12314 } 12315 12316 initialData.distances = {}; 12317 initialData.imageIds = { 12318 sourceElements: [], 12319 targetElements: [] 12320 }; 12321 sourceElements.forEach(function (sourceElement) { 12322 var sourceEnabledElement = cornerstone.getEnabledElement(sourceElement); 12323 12324 if (!sourceEnabledElement || !sourceEnabledElement.image) { 12325 return; 12326 } 12327 12328 var sourceImageId = sourceEnabledElement.image.imageId; 12329 var sourceImagePlane = cornerstone.metaData.get('imagePlaneModule', sourceImageId); 12330 12331 if (!sourceImagePlane || !sourceImagePlane.imagePositionPatient) { 12332 return; 12333 } 12334 12335 var sourceImagePosition = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_1__["default"])(sourceImagePlane.imagePositionPatient); 12336 12337 if (initialData.hasOwnProperty(sourceEnabledElement)) { 12338 return; 12339 } 12340 12341 initialData.distances[sourceImageId] = {}; 12342 initialData.imageIds.sourceElements.push(sourceImageId); 12343 targetElements.forEach(function (targetElement) { 12344 var targetEnabledElement = cornerstone.getEnabledElement(targetElement); 12345 12346 if (!targetEnabledElement || !targetEnabledElement.image) { 12347 return; 12348 } 12349 12350 var targetImageId = targetEnabledElement.image.imageId; 12351 initialData.imageIds.targetElements.push(targetImageId); 12352 12353 if (sourceElement === targetElement) { 12354 return; 12355 } 12356 12357 if (sourceImageId === targetImageId) { 12358 return; 12359 } 12360 12361 if (initialData.distances[sourceImageId].hasOwnProperty(targetImageId)) { 12362 return; 12363 } 12364 12365 var targetImagePlane = cornerstone.metaData.get('imagePlaneModule', targetImageId); 12366 12367 if (!targetImagePlane || !targetImagePlane.imagePositionPatient) { 12368 return; 12369 } 12370
12371 var targetImagePosition = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_1__["default"])(targetImagePlane.imagePositionPatient); 12372 initialData.distances[sourceImageId][targetImageId] = targetImagePosition.clone().sub(sourceImagePosition); 12373 }); 12374 12375 if (!Object.keys(initialData.distances[sourceImageId]).length) { 12376 delete initialData.distances[sourceImageId]; 12377 } 12378 }); 12379 }; 12380 /** 12381 * Gather necessary event data and call synchronization handler 12382 * 12383 * @private 12384 * @param {HTMLElement} sourceElement - The source element for the event 12385 * @param {Object} eventData - The data object for the source event 12386 * @returns {void} 12387 */ 12388 12389 12390 function fireEvent(sourceElement, eventData) { 12391 var isDisabled = !that.enabled; 12392 var noElements = !sourceElements.length || !targetElements.length; 12393 12394 if (isDisabled || noElements) { 12395 return; 12396 } 12397 12398 ignoreFiredEvents = true; 12399 targetElements.forEach(function (targetElement) { 12400 var targetIndex = targetElements.indexOf(targetElement); 12401 12402 if (targetIndex === -1) { 12403 return; 12404 } 12405 12406 var targetImageId = initialData.imageIds.targetElements[targetIndex]; 12407 var sourceIndex = sourceElements.indexOf(sourceElement); 12408 12409 if (sourceIndex === -1) { 12410 return; 12411 } 12412 12413 var sourceImageId = initialData.imageIds.sourceElements[sourceIndex]; 12414 var positionDifference; 12415 12416 if (sourceImageId === targetImageId) { 12417 positionDifference = 0; 12418 } else if (initialData.distances[sourceImageId] !== undefined) { 12419 positionDifference = initialData.distances[sourceImageId][targetImageId]; 12420 } 12421 12422 eventHandler(that, sourceElement, targetElement, eventData, positionDifference); 12423 }); 12424 ignoreFiredEvents = false; 12425 } 12426 /** 12427 * Call fireEvent if not ignoring events, and pass along event data 12428 * 12429 * @private 12430 * @param {Event} e - The source event object 12431 * @returns {void} 12432 */ 12433 12434 12435 function onEvent(e) { 12436 var eventData = e.detail; 12437 12438 if (ignoreFiredEvents === true) { 12439 return; 12440 } 12441 12442 fireEvent(e.currentTarget, eventData); 12443 } 12444 /** 12445 * Add a source element to this synchronizer 12446 * 12447 * @param {HTMLElement} element - The new source element 12448 * @returns {void} 12449 */ 12450 12451 12452 this.addSource = function (element) { 12453 // Return if this element was previously added 12454 var index = sourceElements.indexOf(element); 12455 12456 if (index !== -1) { 12457 return; 12458 } // Add to our list of enabled elements 12459 12460 12461 sourceElements.push(element); // Subscribe to the event 12462 12463 event.split(' ').forEach(function (oneEvent) { 12464 element.addEventListener(oneEvent, onEvent); 12465 }); // Update the initial distances between elements 12466 12467 that.getDistances(); 12468 that.updateDisableHandlers(); 12469 }; 12470 /** 12471 * Add a target element to this synchronizer 12472 * 12473 * @param {HTMLElement} element - The new target element to be synchronized 12474 * @returns {void} 12475 */ 12476 12477 12478 this.addTarget = function (element) { 12479 // Return if this element was previously added 12480 var index = targetElements.indexOf(element); 12481 12482 if (index !== -1) { 12483 return; 12484 } // Add to our list of enabled elements 12485 12486 12487 targetElements.push(element); // Update the initial distances between elements 12488 12489 that.getDistances(); // Invoke the handler for this new target element 12490 12491 eventHandler(that, element, element, 0); 12492 that.updateDisableHandlers(); 12493 }; 12494 /** 12495 * Add an element to this synchronizer as both a source and a target 12496 * 12497 * @param {HTMLElement} element - The new element 12498 * @returns {void} 12499 */ 12500 12501 12502 this.add = function (element) { 12503 that.addSource(element); 12504 that.addTarget(element); 12505 }; 12506 /** 12507 * Remove a source element from this synchronizer 12508 * 12509 * @param {HTMLElement} element - The element to be removed 12510 * @returns {void} 12511 */ 12512 12513 12514 this.removeSource = function (element) { 12515 // Find the index of this element 12516 var index = sourceElements.indexOf(element); 12517 12518 if (index === -1) { 12519 return; 12520 } // Remove this element from the array 12521 12522 12523 sourceElements.splice(index, 1); // Stop listening for the event 12524 12525 event.split(' ').forEach(function (oneEvent) { 12526 element.removeEventListener(oneEvent, onEvent); 12527 }); // Update the initial distances between elements 12528 12529 that.getDistances(); // Update everyone listening for events 12530 12531 fireEvent(element); 12532 that.updateDisableHandlers(); 12533 }; 12534 /** 12535 * Remove a target element from this synchronizer 12536 * 12537 * @param {HTMLElement} element - The element to be removed 12538 * @returns {void} 12539 */ 12540 12541 12542 this.removeTarget = function (element) { 12543 // Find the index of this element 12544 var index = targetElements.indexOf(element); 12545 12546 if (index === -1) { 12547 return; 12548 } // Remove this element from the array 12549 12550 12551 targetElements.splice(index, 1); // Update the initial distances between elements 12552 12553 that.getDistances(); // Invoke the handler for the removed target 12554 12555 eventHandler(that, element, element, 0); 12556 that.updateDisableHandlers(); 12557 }; 12558 /** 12559 * Remove an element from this synchronizer as both a target and source 12560 * 12561 * @param {HTMLElement} element - The element to be removed 12562 * @returns {void} 12563 */ 12564 12565 12566 this.remove = function (element) { 12567 that.removeTarget(element); 12568 that.removeSource(element); 12569 }; 12570 /** 12571 * Get the array of source elements 12572 * 12573 * @returns {HTMLElement[]} 12574 */ 12575 12576
12577 this.getSourceElements = function () { 12578 return sourceElements; 12579 }; 12580 /** 12581 * Get the array of target elements 12582 * 12583 * @returns {HTMLElement[]} 12584 */ 12585 12586 12587 this.getTargetElements = function () { 12588 return targetElements; 12589 }; 12590 /** 12591 * Display an image while halting synchronization 12592 * 12593 * @param {HTMLElement} element - The element containing the image 12594 * @param {Object} image - The cornerstone image object 12595 * @param {Object} viewport - The cornerstone viewport object 12596 * @returns {void} 12597 */ 12598 12599 12600 this.displayImage = function (element, image, viewport) { 12601 ignoreFiredEvents = true; 12602 cornerstone.displayImage(element, image, viewport); 12603 ignoreFiredEvents = false; 12604 }; 12605 /** 12606 * Update a viewport while halting synchronization 12607 * 12608 * @param {HTMLElement} element - The target element 12609 * @param {Object} viewport - The new cornerstone viewport object 12610 * @returns {void} 12611 */ 12612 12613 12614 this.setViewport = function (element, viewport) { 12615 ignoreFiredEvents = true; 12616 cornerstone.setViewport(element, viewport); 12617 ignoreFiredEvents = false; 12618 }; 12619 /** 12620 * Remove an element from the synchronizer based on an event from that element 12621 * 12622 * @private 12623 * @param {Event} e - The event whose element will be removed 12624 * @returns {void} 12625 */ 12626 12627 12628 function disableHandler(e) { 12629 var element = e.detail.element; 12630 that.remove(element); 12631 Object(_toolOptions_js__WEBPACK_IMPORTED_MODULE_2__["clearToolOptionsByElement"])(element); 12632 } 12633 /** 12634 * Add an event listener to each element that can remove it from the synchronizer 12635 * @returns {void} 12636 */ 12637 12638 12639 this.updateDisableHandlers = function () { 12640 var elements = unique(sourceElements.concat(targetElements)); 12641 elements.forEach(function (element) { 12642 element.removeEventListener(_externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.EVENTS.ELEMENT_DISABLED, disableHandler); 12643 element.addEventListener(_externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.EVENTS.ELEMENT_DISABLED, disableHandler); 12644 }); 12645 }; 12646 /** 12647 * Remove all elements from this synchronizer 12648 * @returns {void} 12649 */ 12650 12651 12652 this.destroy = function () { 12653 var elements = unique(sourceElements.concat(targetElements)); 12654 elements.forEach(function (element) { 12655 that.remove(element); 12656 }); 12657 }; 12658} 12659 12660/* harmony default export */ __webpack_exports__["default"] = (Synchronizer); 12661 12662/***/ }), 12663
12664/***/ "./synchronization/panZoomSynchronizer.js": 12665/*!************************************************!*\ 12666 !*** ./synchronization/panZoomSynchronizer.js ***! 12667 \************************************************/ 12668/*! exports provided: default */ 12669/***/ (function(module, __webpack_exports__, __webpack_require__) { 12670 12671"use strict"; 12672__webpack_require__.r(__webpack_exports__); 12673/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js"); 12674 12675/** 12676 * Synchronize the target zoom and pan to match the source 12677 * @export 12678 * @public 12679 * @method 12680 * @name panZoomSynchronizer 12681 * 12682 * @param {Object} synchronizer - The Synchronizer instance that attaches this 12683 * handler to an event 12684 * @param {HTMLElement} sourceElement - The source element for the zoom and pan values 12685 * @param {HTMLElement} targetElement - The target element 12686 * @returns {void} 12687 */ 12688 12689/* harmony default export */ __webpack_exports__["default"] = (function (synchronizer, sourceElement, targetElement) { 12690 // Ignore the case where the source and target are the same enabled element 12691 if (targetElement === sourceElement) { 12692 return; 12693 } 12694 12695 var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone; // Get the source and target viewports 12696 12697 var sourceViewport = cornerstone.getViewport(sourceElement); 12698 var targetViewport = cornerstone.getViewport(targetElement); // Do nothing if the scale and translation are the same 12699 12700 if (targetViewport.scale === sourceViewport.scale && targetViewport.translation.x === sourceViewport.translation.x && targetViewport.translation.y === sourceViewport.translation.y) { 12701 return; 12702 } // Scale and/or translation are different, sync them 12703 12704 12705 targetViewport.scale = sourceViewport.scale; 12706 targetViewport.translation.x = sourceViewport.translation.x; 12707 targetViewport.translation.y = sourceViewport.translation.y; 12708 synchronizer.setViewport(targetElement, targetViewport); 12709}); 12710 12711/***/ }), 12712
12713/***/ "./synchronization/stackImageIndexSynchronizer.js": 12714/*!********************************************************!*\ 12715 !*** ./synchronization/stackImageIndexSynchronizer.js ***! 12716 \********************************************************/ 12717/*! exports provided: default */ 12718/***/ (function(module, __webpack_exports__, __webpack_require__) { 12719 12720"use strict"; 12721__webpack_require__.r(__webpack_exports__); 12722/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js"); 12723/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../stateManagement/toolState.js */ "./stateManagement/toolState.js"); 12724/* harmony import */ var _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../stateManagement/loadHandlerManager.js */ "./stateManagement/loadHandlerManager.js"); 12725/* harmony import */ var _util_clip_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../util/clip.js */ "./util/clip.js"); 12726 12727 12728 12729 12730/** 12731 * Synchronize the target stack to the index closest to the source stack's index 12732 * @export 12733 * @public 12734 * @method 12735 * @name stackImageIndexSynchronizer 12736 * 12737 * @param {Object} synchronizer - The Synchronizer instance that attaches this 12738 * handler to an event 12739 * @param {HTMLElement} sourceElement - The source element for the index value 12740 * @param {HTMLElement} targetElement - The target element 12741 * @returns {void} 12742 */ 12743 12744/* harmony default export */ __webpack_exports__["default"] = (function (synchronizer, sourceElement, targetElement) { 12745 // Ignore the case where the source and target are the same enabled element 12746 if (targetElement === sourceElement) { 12747 return; 12748 } 12749 12750 var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone; 12751 var sourceStackToolDataSource = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__["getToolState"])(sourceElement, 'stack'); 12752 var sourceStackData = sourceStackToolDataSource.data[0]; 12753 var targetStackToolDataSource = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__["getToolState"])(targetElement, 'stack'); 12754 var targetStackData = targetStackToolDataSource.data[0]; 12755 var newImageIdIndex = sourceStackData.currentImageIdIndex; // Clamp the index 12756 12757 newImageIdIndex = Object(_util_clip_js__WEBPACK_IMPORTED_MODULE_3__["default"])(newImageIdIndex, 0, targetStackData.imageIds.length - 1); // Do nothing if the index has not changed 12758 12759 if (newImageIdIndex === targetStackData.currentImageIdIndex) { 12760 return; 12761 } 12762 12763 var startLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__["default"].getStartLoadHandler(targetElement); 12764 var endLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__["default"].getEndLoadHandler(targetElement); 12765 var errorLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__["default"].getErrorLoadingHandler(targetElement); 12766 12767 if (startLoadingHandler) { 12768 startLoadingHandler(targetElement); 12769 } 12770 12771 var loader; 12772 12773 if (targetStackData.preventCache === true) { 12774 loader = cornerstone.loadImage(targetStackData.imageIds[newImageIdIndex]); 12775 } else { 12776 loader = cornerstone.loadAndCacheImage(targetStackData.imageIds[newImageIdIndex]); 12777 } 12778 12779 loader.then(function (image) { 12780 var viewport = cornerstone.getViewport(targetElement); 12781 targetStackData.currentImageIdIndex = newImageIdIndex; 12782 synchronizer.displayImage(targetElement, image, viewport); 12783 12784 if (endLoadingHandler) { 12785 endLoadingHandler(targetElement, image); 12786 } 12787 }, function (error) { 12788 var imageId = targetStackData.imageIds[newImageIdIndex]; 12789 12790 if (errorLoadingHandler) { 12791 errorLoadingHandler(targetElement, imageId, error); 12792 } 12793 }); 12794}); 12795 12796/***/ }), 12797
12798/***/ "./synchronization/stackImagePositionOffsetSynchronizer.js": 12799/*!*****************************************************************!*\ 12800 !*** ./synchronization/stackImagePositionOffsetSynchronizer.js ***! 12801 \*****************************************************************/ 12802/*! exports provided: default */ 12803/***/ (function(module, __webpack_exports__, __webpack_require__) { 12804 12805"use strict"; 12806__webpack_require__.r(__webpack_exports__); 12807/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js"); 12808/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../stateManagement/toolState.js */ "./stateManagement/toolState.js"); 12809/* harmony import */ var _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../stateManagement/loadHandlerManager.js */ "./stateManagement/loadHandlerManager.js"); 12810/* harmony import */ var _util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../util/convertToVector3.js */ "./util/convertToVector3.js"); 12811 12812 12813 12814 // In the future we will want to have a way to manually register links sets of the same orientation (e.g. an axial link set from a prior with an axial link set of a current). The user could do this by scrolling the two stacks to a similar location and then doing a user action (e.g. right click link) at which point the system will capture the delta between the image position (patient) of both stacks and use that to sync them. This offset will need to be adjustable. 12815 12816/** 12817 * Calculate a position in space that is offset from the source image's position, 12818 * and synchronize the target stack to the image that is closest to that position. 12819 * @export 12820 * @public 12821 * @method 12822 * @name stackImagePositionOffsetSynchronizer 12823 * 12824 * @param {Object} synchronizer - The Synchronizer instance that attaches this 12825 * handler to an event 12826 * @param {HTMLElement} sourceElement - The source element 12827 * @param {HTMLElement} targetElement - The target element 12828 * @param {Object} eventData - The data object from the triggering event 12829 * @param {Object} positionDifference - An object with { x, y, z } values that will be 12830 * added to the source image's coordinates 12831 * @returns {void} 12832 */ 12833 12834/* harmony default export */ __webpack_exports__["default"] = (function (synchronizer, sourceElement, targetElement, eventData, positionDifference) { 12835 // Ignore the case where the source and target are the same enabled element 12836 if (targetElement === sourceElement) { 12837 return; 12838 } 12839 12840 var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone; 12841 var sourceStackData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__["getToolState"])(sourceElement, 'stack').data[0]; 12842 var sourceImageId = sourceStackData.imageIds[sourceStackData.currentImageIdIndex]; 12843 var sourceImagePlane = cornerstone.metaData.get('imagePlaneModule', sourceImageId); 12844 12845 if (sourceImagePlane === undefined || sourceImagePlane.imagePositionPatient === undefined) { 12846 return; 12847 } 12848 12849 var sourceImagePosition = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_3__["default"])(sourceImagePlane.imagePositionPatient); 12850 var stackToolDataSource = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__["getToolState"])(targetElement, 'stack'); 12851 var stackData = stackToolDataSource.data[0]; 12852 var minDistance = Number.MAX_VALUE; 12853 var newImageIdIndex = -1; 12854 12855 if (!positionDifference) { 12856 return; 12857 } 12858 12859 var finalPosition = sourceImagePosition.clone().add(positionDifference); 12860 stackData.imageIds.forEach(function (imageId, index) { 12861 var imagePlane = cornerstone.metaData.get('imagePlaneModule', imageId); 12862 12863 if (imagePlane === undefined || imagePlane.imagePositionPatient === undefined) { 12864 return; 12865 } 12866 12867 var imagePosition = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_3__["default"])(imagePlane.imagePositionPatient); 12868 var distance = finalPosition.distanceToSquared(imagePosition); 12869 12870 if (distance < minDistance) { 12871 minDistance = distance; 12872 newImageIdIndex = index; 12873 } 12874 }); 12875 12876 if (newImageIdIndex === stackData.currentImageIdIndex || newImageIdIndex === -1) { 12877 return; 12878 } 12879 12880 var startLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__["default"].getStartLoadHandler(targetElement); 12881 var endLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__["default"].getEndLoadHandler(targetElement); 12882 var errorLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__["default"].getErrorLoadingHandler(targetElement); 12883 stackData.currentImageIdIndex = newImageIdIndex; 12884 var newImageId = stackData.imageIds[newImageIdIndex]; 12885 12886 if (startLoadingHandler) { 12887 startLoadingHandler(targetElement); 12888 } 12889 12890 var loader; 12891 12892 if (stackData.preventCache === true) { 12893 loader = cornerstone.loadImage(newImageId); 12894 } else { 12895 loader = cornerstone.loadAndCacheImage(newImageId); 12896 } 12897 12898 loader.then(function (image) { 12899 var viewport = cornerstone.getViewport(targetElement); 12900 12901 if (stackData.currentImageIdIndex !== newImageIdIndex) { 12902 return; 12903 } 12904 12905 synchronizer.displayImage(targetElement, image, viewport); 12906 12907 if (endLoadingHandler) { 12908 endLoadingHandler(targetElement, image); 12909 } 12910 }, function (error) { 12911 var imageId = stackData.imageIds[newImageIdIndex]; 12912 12913 if (errorLoadingHandler) { 12914 errorLoadingHandler(targetElement, imageId, error); 12915 } 12916 }); 12917}); 12918 12919/***/ }), 12920
12921/***/ "./synchronization/stackImagePositionSynchronizer.js": 12922/*!***********************************************************!*\ 12923 !*** ./synchronization/stackImagePositionSynchronizer.js ***! 12924 \***********************************************************/ 12925/*! exports provided: default */ 12926/***/ (function(module, __webpack_exports__, __webpack_require__) { 12927 12928"use strict"; 12929__webpack_require__.r(__webpack_exports__); 12930/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js"); 12931/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../stateManagement/toolState.js */ "./stateManagement/toolState.js"); 12932/* harmony import */ var _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../stateManagement/loadHandlerManager.js */ "./stateManagement/loadHandlerManager.js"); 12933/* harmony import */ var _util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../util/convertToVector3.js */ "./util/convertToVector3.js"); 12934 12935 12936 12937 12938/** 12939 * Synchronize the target stack to the image closest to the source image's position 12940 * @export 12941 * @public 12942 * @method 12943 * @name stackImagePositionSynchronizer 12944 * 12945 * @param {Object} synchronizer - The Synchronizer instance that attaches this 12946 * handler to an event 12947 * @param {HTMLElement} sourceElement - The source element for the image position 12948 * @param {HTMLElement} targetElement - The target element 12949 * @returns {void} 12950 */ 12951 12952/* harmony default export */ __webpack_exports__["default"] = (function (synchronizer, sourceElement, targetElement) { 12953 // Ignore the case where the source and target are the same enabled element 12954 if (targetElement === sourceElement) { 12955 return; 12956 } 12957 12958 var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone; 12959 var sourceStackData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__["getToolState"])(sourceElement, 'stack').data[0]; 12960 var sourceImageId = sourceStackData.imageIds[sourceStackData.currentImageIdIndex]; 12961 var sourceImagePlane = cornerstone.metaData.get('imagePlaneModule', sourceImageId); 12962 12963 if (sourceImagePlane === undefined || sourceImagePlane.imagePositionPatient === undefined) { 12964 // Console.log('No position found for image ' + sourceImage.imageId); 12965 return; 12966 } 12967 12968 var sourceImagePosition = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_3__["default"])(sourceImagePlane.imagePositionPatient); 12969 var stackToolDataSource = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__["getToolState"])(targetElement, 'stack'); 12970 var stackData = stackToolDataSource.data[0]; 12971 var minDistance = Number.MAX_VALUE; 12972 var newImageIdIndex = -1; 12973 stackData.imageIds.forEach(function (imageId, index) { 12974 var imagePlane = cornerstone.metaData.get('imagePlaneModule', imageId); 12975 12976 if (imagePlane === undefined || imagePlane.imagePositionPatient === undefined) { 12977 // Console.log('No position found for image ' + imageId); 12978 return; 12979 } 12980 12981 var imagePosition = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_3__["default"])(imagePlane.imagePositionPatient); 12982 var distance = imagePosition.distanceToSquared(sourceImagePosition); // Console.log(index + '=' + distance); 12983 12984 if (distance < minDistance) { 12985 minDistance = distance; 12986 newImageIdIndex = index; 12987 } 12988 }); 12989 12990 if (newImageIdIndex === stackData.currentImageIdIndex) { 12991 return; 12992 } 12993 12994 var startLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__["default"].getStartLoadHandler(targetElement); 12995 var endLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__["default"].getEndLoadHandler(targetElement); 12996 var errorLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__["default"].getErrorLoadingHandler(targetElement); 12997 stackData.currentImageIdIndex = newImageIdIndex; 12998 var newImageId = stackData.imageIds[newImageIdIndex]; 12999 13000 if (startLoadingHandler) { 13001 startLoadingHandler(targetElement); 13002 } 13003 13004 if (newImageIdIndex !== -1) { 13005 var loader; 13006 13007 if (stackData.preventCache === true) { 13008 loader = cornerstone.loadImage(newImageId); 13009 } else { 13010 loader = cornerstone.loadAndCacheImage(newImageId); 13011 } 13012 13013 loader.then(function (image) { 13014 var viewport = cornerstone.getViewport(targetElement); 13015 13016 if (stackData.currentImageIdIndex !== newImageIdIndex) { 13017 return; 13018 } 13019 13020 synchronizer.displayImage(targetElement, image, viewport); 13021 13022 if (endLoadingHandler) { 13023 endLoadingHandler(targetElement, image); 13024 } 13025 }, function (error) { 13026 var imageId = stackData.imageIds[newImageIdIndex]; 13027 13028 if (errorLoadingHandler) { 13029 errorLoadingHandler(targetElement, imageId, error); 13030 } 13031 }); 13032 } 13033}); 13034 13035/***/ }), 13036
13037/***/ "./synchronization/stackScrollSynchronizer.js": 13038/*!****************************************************!*\ 13039 !*** ./synchronization/stackScrollSynchronizer.js ***! 13040 \****************************************************/ 13041/*! exports provided: default */ 13042/***/ (function(module, __webpack_exports__, __webpack_require__) { 13043 13044"use strict"; 13045__webpack_require__.r(__webpack_exports__); 13046/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js"); 13047/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../stateManagement/toolState.js */ "./stateManagement/toolState.js"); 13048/* harmony import */ var _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../stateManagement/loadHandlerManager.js */ "./stateManagement/loadHandlerManager.js"); 13049/* harmony import */ var _util_clip_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../util/clip.js */ "./util/clip.js"); 13050 13051 13052 13053 13054/** 13055 * Propogate scrolling actions from the source element to the target element. 13056 * @export 13057 * @public 13058 * @method 13059 * @name stackScrollSynchronizer 13060 * 13061 * @param {Object} synchronizer - The Synchronizer instance that attaches this 13062 * handler to an event 13063 * @param {HTMLElement} sourceElement - The source element for the scroll event 13064 * @param {HTMLElement} targetElement - The target element 13065 * @param {Object} eventData - The data object from the triggering event 13066 * @returns {void} 13067 */ 13068 13069/* harmony default export */ __webpack_exports__["default"] = (function (synchronizer, sourceElement, targetElement, eventData) { 13070 // If the target and source are the same, stop 13071 if (sourceElement === targetElement) { 13072 return; 13073 } // If there is no event, or direction is 0, stop 13074 13075 13076 if (!eventData || !eventData.direction) { 13077 return; 13078 } 13079 13080 var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone; // Get the stack of the target viewport 13081 13082 var stackToolDataSource = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__["getToolState"])(targetElement, 'stack'); 13083 var stackData = stackToolDataSource.data[0]; // Get the new index for the stack 13084 13085 var newImageIdIndex = stackData.currentImageIdIndex + eventData.direction; // Ensure the index does not exceed the bounds of the stack 13086 13087 newImageIdIndex = Object(_util_clip_js__WEBPACK_IMPORTED_MODULE_3__["default"])(newImageIdIndex, 0, stackData.imageIds.length - 1); // If the index has not changed, stop here 13088 13089 if (stackData.currentImageIdIndex === newImageIdIndex) { 13090 return; 13091 } 13092 13093 var startLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__["default"].getStartLoadHandler(targetElement); 13094 var endLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__["default"].getEndLoadHandler(targetElement); 13095 var errorLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_2__["default"].getErrorLoadingHandler(targetElement); 13096 stackData.currentImageIdIndex = newImageIdIndex; 13097 var newImageId = stackData.imageIds[newImageIdIndex]; 13098 13099 if (startLoadingHandler) { 13100 startLoadingHandler(targetElement); 13101 } 13102 13103 var loader; 13104 13105 if (stackData.preventCache === true) { 13106 loader = cornerstone.loadImage(newImageId); 13107 } else { 13108 loader = cornerstone.loadAndCacheImage(newImageId); 13109 } 13110 13111 loader.then(function (image) { 13112 var viewport = cornerstone.getViewport(targetElement); 13113 13114 if (stackData.currentImageIdIndex !== newImageIdIndex) { 13115 return; 13116 } 13117 13118 synchronizer.displayImage(targetElement, image, viewport); 13119 13120 if (endLoadingHandler) { 13121 endLoadingHandler(targetElement, image); 13122 } 13123 }, function (error) { 13124 var imageId = stackData.imageIds[newImageIdIndex]; 13125 13126 if (errorLoadingHandler) { 13127 errorLoadingHandler(targetElement, imageId, error); 13128 } 13129 }); 13130}); 13131 13132/***/ }), 13133
13134/***/ "./synchronization/updateImageSynchronizer.js": 13135/*!****************************************************!*\ 13136 !*** ./synchronization/updateImageSynchronizer.js ***! 13137 \****************************************************/ 13138/*! exports provided: default */ 13139/***/ (function(module, __webpack_exports__, __webpack_require__) { 13140 13141"use strict"; 13142__webpack_require__.r(__webpack_exports__); 13143/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js"); 13144 13145/** 13146 * Redraw target image immediately any time handler is called from source element. 13147 * @export 13148 * @public 13149 * @method 13150 * @name updateImageSynchronizer 13151 * 13152 * @param {Object} synchronizer - The Synchronizer instance that attaches this 13153 * handler to an event 13154 * @param {HTMLElement} sourceElement - The source element 13155 * @param {HTMLElement} targetElement - The target element 13156 * @returns {void} 13157 */ 13158 13159/* harmony default export */ __webpack_exports__["default"] = (function (synchronizer, sourceElement, targetElement) { 13160 // Ignore the case where the source and target are the same enabled element 13161 if (targetElement === sourceElement) { 13162 return; 13163 } 13164 13165 _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.updateImage(targetElement); 13166}); 13167 13168/***/ }), 13169
13170/***/ "./synchronization/wwwcSynchronizer.js": 13171/*!*********************************************!*\ 13172 !*** ./synchronization/wwwcSynchronizer.js ***! 13173 \*********************************************/ 13174/*! exports provided: default */ 13175/***/ (function(module, __webpack_exports__, __webpack_require__) { 13176 13177"use strict"; 13178__webpack_require__.r(__webpack_exports__); 13179/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js"); 13180 13181/** 13182 * Synchronize the target viewport ww/wc to match the source element. 13183 * @export 13184 * @public 13185 * @method 13186 * @name wwwcSynchronizer 13187 * 13188 * @param {Object} synchronizer - The Synchronizer instance that attaches this 13189 * handler to an event 13190 * @param {HTMLElement} sourceElement - The source element for the ww/wc values 13191 * @param {HTMLElement} targetElement - The target element 13192 * @returns {void} 13193 */ 13194 13195/* harmony default export */ __webpack_exports__["default"] = (function (synchronizer, sourceElement, targetElement) { 13196 // Ignore the case where the source and target are the same enabled element 13197 if (targetElement === sourceElement) { 13198 return; 13199 } 13200 13201 var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone; // Get the source and target viewports 13202 13203 var sourceViewport = cornerstone.getViewport(sourceElement); 13204 var targetViewport = cornerstone.getViewport(targetElement); // Do nothing if the ww/wc already match 13205 13206 if (targetViewport.voi.windowWidth === sourceViewport.voi.windowWidth && targetViewport.voi.windowCenter === sourceViewport.voi.windowCenter && targetViewport.invert === sourceViewport.invert) { 13207 return; 13208 } // Www/wc are different, sync them 13209 13210 13211 targetViewport.voi.windowWidth = sourceViewport.voi.windowWidth; 13212 targetViewport.voi.windowCenter = sourceViewport.voi.windowCenter; 13213 targetViewport.invert = sourceViewport.invert; 13214 synchronizer.setViewport(targetElement, targetViewport); 13215}); 13216 13217/***/ }), 13218
13219/***/ "./thirdParty/register.js": 13220/*!********************************!*\ 13221 !*** ./thirdParty/register.js ***! 13222 \********************************/ 13223/*! exports provided: default */ 13224/***/ (function(module, __webpack_exports__, __webpack_require__) { 13225 13226"use strict"; 13227__webpack_require__.r(__webpack_exports__); 13228/* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/typeof */ "../node_modules/@babel/runtime/helpers/typeof.js"); 13229/* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__); 13230/* harmony import */ var _registerModule_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./registerModule.js */ "./thirdParty/registerModule.js"); 13231/* harmony import */ var _registerMixin_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./registerMixin.js */ "./thirdParty/registerMixin.js"); 13232/* harmony import */ var _registerItem_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./registerItem.js */ "./thirdParty/registerItem.js"); 13233/* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../util/logger.js */ "./util/logger.js"); 13234 13235 13236 13237 13238 13239var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_4__["getLogger"])('thirdParty:register'); 13240/** 13241 * Register an item or module to cornerstoneTools. 13242 * @export 13243 * @public 13244 * @method 13245 * @name register 13246 * 13247 * @param {string} type The type of the item/module. 13248 * @param {string} name The name of the item/module. 13249 * @param {Object|function} item The item/module itself. 13250 * @param {boolean} [overwrite=false] Whether an item/module should be 13251 * overwritten, should it have the same name. 13252 * @returns {void} 13253 */ 13254 13255/* harmony default export */ __webpack_exports__["default"] = (function (type, name, item) { 13256 var overwrite = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; 13257 13258 if (!isValidInput(type, name, item)) { 13259 return; 13260 } 13261 13262 switch (type) { 13263 case 'module': 13264 Object(_registerModule_js__WEBPACK_IMPORTED_MODULE_1__["default"])(name, item, overwrite); 13265 break; 13266 13267 case 'mixin': 13268 Object(_registerMixin_js__WEBPACK_IMPORTED_MODULE_2__["default"])(name, item, overwrite); 13269 break; 13270 13271 default: 13272 Object(_registerItem_js__WEBPACK_IMPORTED_MODULE_3__["default"])(type, name, item, overwrite); 13273 } 13274}); 13275/** 13276 * Returns true if the item is valid, this avoids 13277 * clogging up the library with invalid data. 13278 * @private 13279 * @method 13280 * @name isValidInput 13281 * 13282 * @param {string} type The type of the item/module. 13283 * @param {string} name The name of the item/module. 13284 * @param {Object|function} item The item/module itself. 13285 * @returns {boolean} Whether the input is valid. 13286 */ 13287 13288function isValidInput(type, name, item) { 13289 if (!type) { 13290 logger.warn('The type must be given in order to register.'); 13291 return false; 13292 } 13293 13294 if (!name) { 13295 logger.warn("The %s must have a name in order to register.", type); 13296 return false; 13297 } 13298 13299 if (_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default()(item) !== 'object' && typeof item !== 'function') { 13300 logger.warn("The %s is a %s, it should be an Object or a function.", item, _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default()(item)); 13301 return false; 13302 } 13303 13304 return true; 13305} 13306 13307/***/ }), 13308
13309/***/ "./thirdParty/registerItem.js": 13310/*!************************************!*\ 13311 !*** ./thirdParty/registerItem.js ***! 13312 \************************************/ 13313/*! exports provided: default */ 13314/***/ (function(module, __webpack_exports__, __webpack_require__) { 13315 13316"use strict"; 13317__webpack_require__.r(__webpack_exports__); 13318/* harmony import */ var _lib_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../lib.js */ "./lib.js"); 13319/* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../util/logger.js */ "./util/logger.js"); 13320 13321 13322var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_1__["getLogger"])('thirdParty:registerType'); 13323/** 13324 * Register an item to cornerstoneTools. 13325 * @export 13326 * @private 13327 * @method 13328 * @name registerItem 13329 * 13330 * @param {string} type The type of the item. 13331 * @param {string} name The name of the item. 13332 * @param {Object|function} item The item itself. 13333 * @param {boolean} [overwrite=false] Whether an item should be overwritten, 13334 * should it have the same name. 13335 * @returns {void} 13336 */ 13337 13338/* harmony default export */ __webpack_exports__["default"] = (function (type, name, item) { 13339 var overwrite = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; 13340 var itemKey = "".concat(type, "/").concat(name); 13341 var alreadyRegistered = isItemNameRegistered(itemKey); 13342 13343 if (alreadyRegistered && !overwrite) { 13344 logger.warn('%s is already registered', itemKey); 13345 return; 13346 } 13347 13348 if (alreadyRegistered) { 13349 logger.warn('Overwriting %s', itemKey); 13350 } 13351 13352 _lib_js__WEBPACK_IMPORTED_MODULE_0__["lib"][itemKey] = item; 13353}); 13354 13355function isItemNameRegistered(itemKey) { 13356 return _lib_js__WEBPACK_IMPORTED_MODULE_0__["lib"][itemKey] !== undefined; 13357} 13358 13359/***/ }), 13360
13361/***/ "./thirdParty/registerMixin.js": 13362/*!*************************************!*\ 13363 !*** ./thirdParty/registerMixin.js ***! 13364 \*************************************/ 13365/*! exports provided: default */ 13366/***/ (function(module, __webpack_exports__, __webpack_require__) { 13367 13368"use strict"; 13369__webpack_require__.r(__webpack_exports__); 13370/* harmony import */ var _lib_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../lib.js */ "./lib.js"); 13371/* harmony import */ var _mixins_index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../mixins/index.js */ "./mixins/index.js"); 13372/* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../util/logger.js */ "./util/logger.js"); 13373 13374 13375 13376var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_2__["getLogger"])('thirdParty:registerMixin'); 13377/** 13378 * Register an mixin to cornerstoneTools. 13379 * @export 13380 * @private 13381 * @method 13382 * @name registerMixin 13383 * 13384 * @param {string} name The name of the mixin. 13385 * @param {Object} mixin The mixin itself. 13386 * @param {boolean} [overwrite=false] Whether an mixin should be overwritten, 13387 * should it have the same name. 13388 * @returns {void} 13389 */ 13390 13391/* harmony default export */ __webpack_exports__["default"] = (function (name, mixin) { 13392 var overwrite = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; 13393 var alreadyRegistered = isMixinRegistered(name); 13394 13395 if (alreadyRegistered && !overwrite) { 13396 logger.warn('mixins/%s is already registered', name); 13397 return; 13398 } 13399 13400 if (alreadyRegistered) { 13401 logger.warn('Overwriting mixins/%s', name); 13402 } // Register to the mixins object 13403 13404 13405 _mixins_index_js__WEBPACK_IMPORTED_MODULE_1__["default"][name] = mixin; // Reference the mixin from the library so it can be exported externally. 13406 13407 _lib_js__WEBPACK_IMPORTED_MODULE_0__["lib"]["mixins/".concat(name)] = _mixins_index_js__WEBPACK_IMPORTED_MODULE_1__["default"][name]; 13408}); 13409 13410function isMixinRegistered(name) { 13411 return _mixins_index_js__WEBPACK_IMPORTED_MODULE_1__["default"][name] !== undefined; 13412} 13413 13414/***/ }), 13415
13416/***/ "./thirdParty/registerModule.js": 13417/*!**************************************!*\ 13418 !*** ./thirdParty/registerModule.js ***! 13419 \**************************************/ 13420/*! exports provided: default */ 13421/***/ (function(module, __webpack_exports__, __webpack_require__) { 13422 13423"use strict"; 13424__webpack_require__.r(__webpack_exports__); 13425/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../store/index.js */ "./store/index.js"); 13426/* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../util/logger.js */ "./util/logger.js"); 13427 13428 13429var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_1__["getLogger"])('thirdParty:registerModule'); 13430/** 13431 * Register a module. 13432 * @export 13433 * @private 13434 * @method 13435 * @name registerModule 13436 * 13437 * @param {string} name The name of the module. 13438 * @param {Object} newModule The module to register. 13439 * @param {boolean} [overwrite] Whether a module should be overwritten, 13440 * should it have the same name. 13441 * @returns {void} 13442 */ 13443 13444/* harmony default export */ __webpack_exports__["default"] = (function (name, newModule) { 13445 var overwrite = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; 13446 var alreadyRegistered = isModuleNameRegistered(name); 13447 13448 if (alreadyRegistered && !overwrite) { 13449 logger.warn('A module with the name %s is already registered', name); 13450 return; 13451 } 13452 13453 if (alreadyRegistered) { 13454 logger.warn('Overwriting module %s', name); 13455 } 13456 13457 _store_index_js__WEBPACK_IMPORTED_MODULE_0__["modules"][name] = newModule; 13458}); 13459 13460function isModuleNameRegistered(name) { 13461 return _store_index_js__WEBPACK_IMPORTED_MODULE_0__["modules"][name] !== undefined; 13462} 13463 13464/***/ }), 13465
13466/***/ "./thirdParty/registerSome.js": 13467/*!************************************!*\ 13468 !*** ./thirdParty/registerSome.js ***! 13469 \************************************/ 13470/*! exports provided: default */ 13471/***/ (function(module, __webpack_exports__, __webpack_require__) { 13472 13473"use strict"; 13474__webpack_require__.r(__webpack_exports__); 13475/* harmony import */ var _register_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./register.js */ "./thirdParty/register.js"); 13476 13477/** 13478 * Register an array of items and/or modules to cornerstoneTools. 13479 * @export 13480 * @public 13481 * @method 13482 * @name registerSome 13483 * 13484 * @param {Object[]} items An array of items/modules to register. 13485 * @param {boolean} [overwrite=false] Whether an item/module should be 13486 * overwritten, should it have the same name. 13487 * @returns {void} 13488 */ 13489 13490/* harmony default export */ __webpack_exports__["default"] = (function (items) { 13491 var overwrite = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; 13492 items.forEach(function (_ref) { 13493 var type = _ref.type, 13494 name = _ref.name, 13495 item = _ref.item; 13496 Object(_register_js__WEBPACK_IMPORTED_MODULE_0__["default"])(type, name, item, overwrite); 13497 }); 13498}); 13499 13500/***/ }), 13501
13502/***/ "./toolOptions.js": 13503/*!************************!*\ 13504 !*** ./toolOptions.js ***! 13505 \************************/ 13506/*! exports provided: getToolOptions, setToolOptions, clearToolOptions, clearToolOptionsByToolType, clearToolOptionsByElement */ 13507/***/ (function(module, __webpack_exports__, __webpack_require__) { 13508 13509"use strict"; 13510__webpack_require__.r(__webpack_exports__); 13511/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getToolOptions", function() { return getToolOptions; }); 13512/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setToolOptions", function() { return setToolOptions; }); 13513/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clearToolOptions", function() { return clearToolOptions; }); 13514/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clearToolOptionsByToolType", function() { return clearToolOptionsByToolType; }); 13515/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clearToolOptionsByElement", function() { return clearToolOptionsByElement; }); 13516var elementToolOptions = {}; 13517/** 13518 * Retrieve the options object associated with a particular toolType and element 13519 * @export 13520 * @public 13521 * @method 13522 * @name getToolOptions 13523 * 13524 * @param {string} toolType Tool type identifier of the target options object 13525 * @param {HTMLElement} element Element of the target options object 13526 * 13527 * @returns {Object} Target options object (empty if not yet set) 13528 */ 13529 13530function getToolOptions(toolType, element) { 13531 if (!elementToolOptions[toolType]) { 13532 return {}; 13533 } 13534 13535 var toolOptions = elementToolOptions[toolType]; 13536 var optionsObject = toolOptions.find(function (toolOptionObject) { 13537 return toolOptionObject.element === element; 13538 }); 13539 13540 if (!optionsObject) { 13541 return {}; 13542 } 13543 13544 return optionsObject.options; 13545} 13546/** 13547 * Set the options object associated with a particular toolType and element. 13548 * @export 13549 * @public 13550 * @method 13551 * @name setToolOptions 13552 * 13553 * @param {string} toolType Tool type identifier of the target options object. 13554 * @param {HTMLElement} element Element of the target options object. 13555 * @param {Object} options Options object to store at target. 13556 * @returns {void} 13557 */ 13558 13559 13560function setToolOptions(toolType, element, options) { 13561 if (!elementToolOptions[toolType]) { 13562 elementToolOptions[toolType] = [{ 13563 element: element, 13564 options: options 13565 }]; 13566 return; 13567 } 13568 13569 var toolOptions = elementToolOptions[toolType]; 13570 var index = toolOptions.findIndex(function (toolOptionObject) { 13571 return toolOptionObject.element === element; 13572 }); 13573 13574 if (index === -1) { 13575 elementToolOptions[toolType].push({ 13576 element: element, 13577 options: options 13578 }); 13579 } else { 13580 var elementOptions = elementToolOptions[toolType][index].options || {}; 13581 elementToolOptions[toolType][index].options = Object.assign(elementOptions, options); 13582 } 13583} 13584/** 13585 * Clear the options object associated with a particular toolType and element. 13586 * @export 13587 * @public 13588 * @method 13589 * @name clearToolOptions 13590 * 13591 * @param {string} toolType Tool type identifier of the target options object. 13592 * @param {HTMLElement} element Element of the target options object. 13593 * @returns {void} 13594 */ 13595 13596 13597function clearToolOptions(toolType, element) { 13598 var toolOptions = elementToolOptions[toolType]; 13599 13600 if (toolOptions) { 13601 elementToolOptions[toolType] = toolOptions.filter(function (toolOptionObject) { 13602 return toolOptionObject.element !== element; 13603 }); 13604 } 13605} 13606/** 13607 * Clear the options objects associated with a particular toolType. 13608 * @export 13609 * @public 13610 * @method 13611 * @name clearToolOptionsByToolType 13612 * 13613 * @param {string} toolType Tool type identifier of the target options objects. 13614 * @returns {void} 13615 */ 13616 13617 13618function clearToolOptionsByToolType(toolType) { 13619 delete elementToolOptions[toolType]; 13620} 13621/** 13622 * Clear the options objects associated with a particular element. 13623 * @export 13624 * @public 13625 * @method 13626 * @name clearToolOptionsByElement 13627 * 13628 * @param {HTMLElement} element Element of the target options objects. 13629 * @returns {void} 13630 */ 13631 13632 13633function clearToolOptionsByElement(element) { 13634 for (var toolType in elementToolOptions) { 13635 elementToolOptions[toolType] = elementToolOptions[toolType].filter(function (toolOptionObject) { 13636 return toolOptionObject.element !== element; 13637 }); 13638 } 13639} 13640 13641 13642 13643/***/ }), 13644
13645/***/ "./tools/CrosshairsTool.js": 13646/*!*********************************!*\ 13647 !*** ./tools/CrosshairsTool.js ***! 13648 \*********************************/ 13649/*! exports provided: default */ 13650/***/ (function(module, __webpack_exports__, __webpack_require__) { 13651 13652"use strict"; 13653__webpack_require__.r(__webpack_exports__); 13654/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return CrosshairsTool; }); 13655/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js"); 13656/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); 13657/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js"); 13658/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); 13659/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js"); 13660/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); 13661/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js"); 13662/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); 13663/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/assertThisInitialized */ "../node_modules/@babel/runtime/helpers/assertThisInitialized.js"); 13664/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__); 13665/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js"); 13666/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__); 13667/* harmony import */ var _base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./base/BaseTool.js */ "./tools/base/BaseTool.js"); 13668/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./../externalModules.js */ "./externalModules.js"); 13669/* harmony import */ var _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../stateManagement/loadHandlerManager.js */ "./stateManagement/loadHandlerManager.js"); 13670/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../stateManagement/toolState.js */ "./stateManagement/toolState.js"); 13671/* harmony import */ var _util_pointProjector_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../util/pointProjector.js */ "./util/pointProjector.js"); 13672/* harmony import */ var _util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../util/convertToVector3.js */ "./util/convertToVector3.js"); 13673/* harmony import */ var _toolOptions_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../toolOptions.js */ "./toolOptions.js"); 13674/* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./cursors/index.js */ "./tools/cursors/index.js"); 13675 13676 13677 13678 13679 13680 13681 13682 13683 13684 13685 13686 13687 13688 13689/** 13690 * @public 13691 * @class CrosshairsTool 13692 * @memberof Tools 13693 * 13694 * @classdesc Tool for finding the slice in another element corresponding to the 13695 * image position in a synchronized image series. 13696 * @extends Tools.Base.BaseTool 13697 */ 13698 13699var CrosshairsTool = 13700/*#__PURE__*/ 13701function (_BaseTool) { 13702 _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(CrosshairsTool, _BaseTool); 13703 13704 function CrosshairsTool() { 13705 var _this; 13706 13707 var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 13708 13709 _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, CrosshairsTool); 13710 13711 var defaultProps = { 13712 name: 'Crosshairs', 13713 supportedInteractionTypes: ['Mouse', 'Touch'], 13714 svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_13__["crosshairsCursor"] 13715 }; 13716 _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(CrosshairsTool).call(this, props, defaultProps)); 13717 _this.mouseDownCallback = _this._chooseLocation.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this)); 13718 _this.mouseDragCallback = _this._chooseLocation.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this)); 13719 _this.touchDragCallback = _this._chooseLocation.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this)); 13720 return _this; 13721 } 13722 13723 _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(CrosshairsTool, [{ 13724 key: "_chooseLocation", 13725 value: function _chooseLocation(evt) { 13726 var eventData = evt.detail; 13727 var element = eventData.element; // Prevent CornerstoneToolsTouchStartActive from killing any press events 13728 13729 evt.stopImmediatePropagation(); // If we have no toolData for this element, return immediately as there is nothing to do 13730 13731 //var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_9__["getToolState"])(element, this.name); 13732 13733 //if (!toolData) { 13734 // return; 13735 //} // Get current element target information 13736 13737 13738 var sourceElement = element; 13739 var sourceEnabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.getEnabledElement(sourceElement); 13740 var sourceImageId = sourceEnabledElement.image.imageId; 13741 var sourceImagePlane = _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.metaData.get('imagePlaneModule', sourceImageId); 13742 13743 if (!sourceImagePlane) { 13744 return; 13745 }
13745 // Get currentPoints from mouse cursor on selected element 13746 13747 13748 var sourceImagePoint = eventData.currentPoints.image; // Transfer this to a patientPoint given imagePlane metadata 13749 13750 var patientPoint = Object(_util_pointProjector_js__WEBPACK_IMPORTED_MODULE_10__["imagePointToPatientPoint"])(sourceImagePoint, sourceImagePlane); // Get the enabled elements associated with this synchronization context 13751 13752 var syncContext = /*toolData.data[0]*/this.synchronizationContext; 13753 var enabledElements = syncContext.getTargetElements(); // Iterate over each synchronized element 13754 13755 enabledElements.forEach(function (targetElement) { 13756 // Don't do anything if the target is the same as the source 13757 if (targetElement === sourceElement) { 13758 return; 13759 } 13760 13761 var minDistance = Number.MAX_VALUE; 13762 var newImageIdIndex = -1; 13763 var stackToolDataSource = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_9__["getToolState"])(targetElement, 'stack'); 13764 13765 if (stackToolDataSource === undefined) { 13766 return; 13767 } 13768 13769 var stackData = stackToolDataSource.data[0]; // Find within the element's stack the closest image plane to selected location 13770 13771 stackData.imageIds.forEach(function (imageId, index) { 13772 var imagePlane = _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.metaData.get('imagePlaneModule', imageId); // Skip if the image plane is not ready 13773 13774 if (!imagePlane || !imagePlane.imagePositionPatient || !imagePlane.rowCosines || !imagePlane.columnCosines) { 13775 return; 13776 } 13777 13778 var imagePosition = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_11__["default"])(imagePlane.imagePositionPatient); 13779 var row = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_11__["default"])(imagePlane.rowCosines); 13780 var column = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_11__["default"])(imagePlane.columnCosines); 13781 var normal = column.clone().cross(row.clone()); 13782 var distance = Math.abs(normal.clone().dot(imagePosition) - normal.clone().dot(patientPoint)); 13783 13784 if (distance < minDistance) { 13785 minDistance = distance; 13786 newImageIdIndex = index; 13787 } 13788 }); 13789 13790 if (newImageIdIndex === stackData.currentImageIdIndex) { 13791 return; 13792 } // Switch the loaded image to the required image 13793 13794 13795 if (newImageIdIndex !== -1 && stackData.imageIds[newImageIdIndex] !== undefined) { 13796 var startLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_8__["default"].getStartLoadHandler(targetElement); 13797 var endLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_8__["default"].getEndLoadHandler(targetElement); 13798 var errorLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_8__["default"].getErrorLoadingHandler(targetElement); 13799 13800 if (startLoadingHandler) { 13801 startLoadingHandler(targetElement); 13802 } 13803 13804 var loader; 13805 13806 if (stackData.preventCache === true) { 13807 loader = _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.loadImage(stackData.imageIds[newImageIdIndex]); 13808 } else { 13809 loader = _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.loadAndCacheImage(stackData.imageIds[newImageIdIndex]); 13810 } 13811 13812 loader.then(function (image) { 13813 var viewport = _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.getViewport(targetElement); 13814 stackData.currentImageIdIndex = newImageIdIndex; 13815 _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.displayImage(targetElement, image, viewport); 13816 13817 if (endLoadingHandler) { 13818 endLoadingHandler(targetElement, image); 13819 } 13820 }, function (error) { 13821 var imageId = stackData.imageIds[newImageIdIndex]; 13822 13823 if (errorLoadingHandler) { 13824 errorLoadingHandler(targetElement, imageId, error); 13825 } 13826 }); 13827 } 13828 }); 13829 } 13830 }, { 13831 key: "activeCallback", 13832 value: function activeCallback(element, _ref) { 13833 var mouseButtonMask = _ref.mouseButtonMask, 13834 synchronizationContext = _ref.synchronizationContext; 13835 Object(_toolOptions_js__WEBPACK_IMPORTED_MODULE_12__["setToolOptions"])(this.name, element, { 13836 mouseButtonMask: mouseButtonMask 13837 }); // Clear any currently existing toolData 13838 13839 Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_9__["clearToolState"])(element, this.name); 13840 Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_9__["addToolState"])(element, this.name, { 13841 synchronizationContext: synchronizationContext 13842 }); 13843 this.synchronizationContext = synchronizationContext; 13844 } 13845 }]); 13846 13847 return CrosshairsTool; 13848}(_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]); 13849 13850 13851 13852/***/ }), 13853
13854/***/ "./tools/DoubleTapFitToWindowTool.js": 13855/*!*******************************************!*\ 13856 !*** ./tools/DoubleTapFitToWindowTool.js ***! 13857 \*******************************************/ 13858/*! exports provided: default */ 13859/***/ (function(module, __webpack_exports__, __webpack_require__) { 13860 13861"use strict"; 13862__webpack_require__.r(__webpack_exports__); 13863/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return DoubleTapFitToWindowTool; }); 13864/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js"); 13865/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); 13866/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js"); 13867/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); 13868/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js"); 13869/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); 13870/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js"); 13871/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); 13872/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js"); 13873/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__); 13874/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js"); 13875/* harmony import */ var _base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./base/BaseTool.js */ "./tools/base/BaseTool.js"); 13876 13877 13878 13879 13880 13881 13882 13883/** 13884 * @public 13885 * @class DoubleTapFitToWindowTool 13886 * @memberof Tools 13887 * 13888 * @classdesc Tool which calls the external cornerstone.fitToWindow() function 13889 * on double tap. 13890 * @extends Tools.Base.BaseTool 13891 */ 13892 13893var DoubleTapFitToWindowTool = 13894/*#__PURE__*/ 13895function (_BaseTool) { 13896 _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(DoubleTapFitToWindowTool, _BaseTool); 13897 13898 function DoubleTapFitToWindowTool() { 13899 var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 13900 13901 _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, DoubleTapFitToWindowTool); 13902 13903 var defaultProps = { 13904 name: 'DoubleTapFitToWindow', 13905 supportedInteractionTypes: ['DoubleTap'] 13906 }; 13907 return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(DoubleTapFitToWindowTool).call(this, props, defaultProps)); 13908 } 13909 13910 _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(DoubleTapFitToWindowTool, [{ 13911 key: "doubleTapCallback", 13912 value: function doubleTapCallback(evt) { 13913 var eventData = evt.detail; 13914 _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.fitToWindow(eventData.element); 13915 } 13916 }]); 13917 13918 return DoubleTapFitToWindowTool; 13919}(_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]); 13920 13921 13922 13923/***/ }), 13924
13925/***/ "./tools/DragProbeTool.js": 13926/*!********************************!*\ 13927 !*** ./tools/DragProbeTool.js ***! 13928 \********************************/ 13929/*! exports provided: default */ 13930/***/ (function(module, __webpack_exports__, __webpack_require__) { 13931 13932"use strict"; 13933__webpack_require__.r(__webpack_exports__); 13934/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return DragProbeTool; }); 13935/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js"); 13936/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); 13937/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js"); 13938/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); 13939/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js"); 13940/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); 13941/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js"); 13942/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); 13943/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/assertThisInitialized */ "../node_modules/@babel/runtime/helpers/assertThisInitialized.js"); 13944/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__); 13945/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js"); 13946/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__); 13947/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js"); 13948/* harmony import */ var _base_BaseTool_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./base/BaseTool.js */ "./tools/base/BaseTool.js"); 13949/* harmony import */ var _stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../stateManagement/textStyle.js */ "./stateManagement/textStyle.js"); 13950/* harmony import */ var _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../stateManagement/toolColors.js */ "./stateManagement/toolColors.js"); 13951/* harmony import */ var _util_getRGBPixels_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../util/getRGBPixels.js */ "./util/getRGBPixels.js"); 13952/* harmony import */ var _util_calculateSUV_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../util/calculateSUV.js */ "./util/calculateSUV.js"); 13953/* harmony import */ var _drawing_index_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../drawing/index.js */ "./drawing/index.js"); 13954/* harmony import */ var _drawing_drawTextBox_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../drawing/drawTextBox.js */ "./drawing/drawTextBox.js"); 13955/* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./cursors/index.js */ "./tools/cursors/index.js"); 13956 13957 13958 13959 13960 13961 13962 13963 13964 13965 13966 13967 13968 13969 13970 13971/** 13972 * @public 13973 * @class DragProbeTool 13974 * @memberof Tools 13975 * 13976 * @classdesc Tool which provides a probe of the image data at the 13977 * input position on drag. 13978 * @extends Tools.Base.BaseTool 13979 */ 13980 13981var DragProbeTool = 13982/*#__PURE__*/ 13983function (_BaseTool) { 13984 _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(DragProbeTool, _BaseTool); 13985 13986 function DragProbeTool() { 13987 var _this; 13988 13989 var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 13990 13991 _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, DragProbeTool); 13992 13993 var defaultProps = { 13994 name: 'DragProbe', 13995 strategies: { 13996 default: defaultStrategy, 13997 minimal: minimalStrategy 13998 }, 13999 defaultStrategy: 'default', 14000 supportedInteractionTypes: ['Mouse', 'Touch'], 14001 svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_14__["probeCursor"] 14002 }; 14003 _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(DragProbeTool).call(this, props, defaultProps)); 14004 _this.touchDragCallback = _this._movingEventCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this)); 14005 _this.touchEndCallback = _this._endMovingEventCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this)); 14006 _this.mouseDragCallback = _this._movingEventCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this)); 14007 _this.mouseUpCallback = _this._endMovingEventCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this)); 14008 _this.dragEventData = {}; 14009 return _this; 14010 } 14011 14012 _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(DragProbeTool, [{ 14013 key: "_movingEventCallback", 14014 value: function _movingEventCallback(evt) { 14015 var eventData = evt.detail; 14016 var element = eventData.element; 14017 this.dragEventData = eventData; 14018 _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone.updateImage(element); 14019 } 14020 }, { 14021 key: "_endMovingEventCallback", 14022 value: function _endMovingEventCallback(evt) { 14023 var eventData = evt.detail; 14024 var element = eventData.element; 14025 this.dragEventData = {}; 14026 _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone.updateImage(element); 14027 } 14028 }, { 14029 key: "renderToolData", 14030 value: function renderToolData(evt) { 14031 if (!this.dragEventData.currentPoints) { 14032 return; 14033 } 14034 14035 if (evt && evt.detail && Boolean(Object.keys(this.dragEventData.currentPoints).length)) { 14036 evt.detail.currentPoints = this.dragEventData.currentPoints; 14037 this.applyActiveStrategy(evt); 14038 } 14039 } 14040 }]); 14041 14042 return DragProbeTool; 14043}(_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_7__["default"]); 14044/** 14045 * Default strategy will pick the exactly point of mouse/touch interact and display the probe data. 14046 * 14047 * @param {Object} evt Image rendered event 14048 * @param {Object} config Tool configuration 14049 * @returns {void} 14050 */ 14051 14052 14053 14054 14055var defaultStrategy = function defaultStrategy(evt, config) { 14056 var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone; 14057 var eventData = evt.detail; 14058 var element = eventData.element, 14059 image = eventData.image, 14060 currentPoints = eventData.currentPoints, 14061 canvasContext = eventData.canvasContext; 14062 var context = Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_12__["getNewContext"])(canvasContext.canvas); 14063 var color = _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_9__["default"].getActiveColor(); 14064 var fontHeight = _stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_8__["default"].getFontSize(); 14065 var x = Math.round(currentPoints.image.x); 14066 var y = Math.round(currentPoints.image.y); 14067 14068 if (x < 0 || y < 0 || x >= image.columns || y >= image.rows) { 14069 return; 14070 } 14071 14072 Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_12__["draw"])(context, function (context) { 14073 Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_12__["setShadow"])(context, config); 14074 var text = "".concat(x, ", ").concat(y); 14075 var storedPixels; 14076 var str; 14077 14078 if (image.color) { 14079 storedPixels = Object(_util_getRGBPixels_js__WEBPACK_IMPORTED_MODULE_10__["default"])(element, x, y, 1, 1); 14080 str = "R: ".concat(storedPixels[0], " G: ").concat(storedPixels[1], " B: ").concat(storedPixels[2], " A: ").concat(storedPixels[3]); 14081 } else { 14082 storedPixels = cornerstone.getStoredPixels(element, x, y, 1, 1); 14083 var sp = storedPixels[0]; 14084 var mo = sp * image.slope + image.intercept;
14085 var suv = Object(_util_calculateSUV_js__WEBPACK_IMPORTED_MODULE_11__["default"])(image, sp); // Draw text 14086 14087 str = "SP: ".concat(sp, " MO: ").concat(parseFloat(mo.toFixed(3))); 14088 14089 if (suv) { 14090 str += " SUV: ".concat(parseFloat(suv.toFixed(3))); 14091 } 14092 } // Draw text 5px away from cursor 14093 14094 14095 var textCoords = { 14096 x: currentPoints.canvas.x + 5, 14097 y: currentPoints.canvas.y - 5 14098 }; 14099 Object(_drawing_drawTextBox_js__WEBPACK_IMPORTED_MODULE_13__["default"])(context, str, textCoords.x, textCoords.y + fontHeight + 5, color); 14100 Object(_drawing_drawTextBox_js__WEBPACK_IMPORTED_MODULE_13__["default"])(context, text, textCoords.x, textCoords.y, color); 14101 }); 14102}; 14103/** 14104 * Minimal strategy will position a circle and use the center of the circle to calculate and display probe data. 14105 * 14106 * @param {Object} evt Image rendered event 14107 * @param {Object} config Tool configuration 14108 * @returns {void} 14109 */ 14110 14111 14112var minimalStrategy = function minimalStrategy(evt, config) { 14113 var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone; 14114 var eventData = evt.detail; 14115 var element = eventData.element, 14116 image = eventData.image, 14117 currentPoints = eventData.currentPoints, 14118 canvasContext = eventData.canvasContext, 14119 isTouchEvent = eventData.isTouchEvent; 14120 var context = Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_12__["getNewContext"])(canvasContext.canvas); 14121 var color = _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_9__["default"].getActiveColor(); 14122 var pageCoordY = currentPoints.page.y - _stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_8__["default"].getFontSize() / 2; 14123 14124 if (isTouchEvent) { 14125 pageCoordY = currentPoints.page.y - _stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_8__["default"].getFontSize() * 4; 14126 } 14127 14128 var toolCoords = cornerstone.pageToPixel(element, currentPoints.page.x, pageCoordY); 14129 14130 if (toolCoords.x < 0 || toolCoords.y < 0 || toolCoords.x >= image.columns || toolCoords.y >= image.rows) { 14131 return; 14132 } 14133 14134 Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_12__["draw"])(context, function (context) { 14135 Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_12__["setShadow"])(context, config); 14136 var seriesModule = cornerstone.metaData.get('generalSeriesModule', image.imageId); 14137 var modality = seriesModule && seriesModule.modality; 14138 var storedPixels; 14139 var text = ''; 14140 14141 if (image.color) { 14142 storedPixels = Object(_util_getRGBPixels_js__WEBPACK_IMPORTED_MODULE_10__["default"])(element, toolCoords.x, toolCoords.y, 1, 1); 14143 text = "R: ".concat(storedPixels[0], " G: ").concat(storedPixels[1], " B: ").concat(storedPixels[2]); 14144 } else { 14145 storedPixels = cornerstone.getStoredPixels(element, toolCoords.x, toolCoords.y, 1, 1); 14146 var sp = storedPixels[0]; 14147 var mo = sp * image.slope + image.intercept; 14148 var modalityPixelValueText = parseFloat(mo.toFixed(2)); 14149 14150 if (modality === 'CT') { 14151 text += "HU: ".concat(modalityPixelValueText); 14152 } else if (modality === 'PT') { 14153 text += modalityPixelValueText; 14154 var suv = Object(_util_calculateSUV_js__WEBPACK_IMPORTED_MODULE_11__["default"])(image, sp); 14155 14156 if (suv) { 14157 text += " SUV: ".concat(parseFloat(suv.toFixed(2))); 14158 } 14159 } else { 14160 text += modalityPixelValueText; 14161 } 14162 } // Prepare text 14163 14164 14165 var textCoords = cornerstone.pixelToCanvas(element, toolCoords); // Translate the x/y away from the cursor 14166 14167 var translation = { 14168 x: 12, 14169 y: -(_stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_8__["default"].getFontSize() + 10) / 2 14170 }; 14171 var handleRadius = 6; 14172 var padding = 5; 14173 var width = Object(_drawing_drawTextBox_js__WEBPACK_IMPORTED_MODULE_13__["textBoxWidth"])(context, text, padding); 14174 14175 if (isTouchEvent) { 14176 translation = { 14177 x: -width / 2, 14178 y: -_stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_8__["default"].getFontSize() - 10 - 2 * handleRadius 14179 }; 14180 } 14181 14182 Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_12__["drawCircle"])(context, element, textCoords, handleRadius, { 14183 color: color 14184 }, 'canvas');
14185 Object(_drawing_drawTextBox_js__WEBPACK_IMPORTED_MODULE_13__["default"])(context, text, textCoords.x + translation.x, textCoords.y + translation.y, color); 14186 }); 14187}; 14188 14189/***/ }), 14190
14191/***/ "./tools/EraserTool.js": 14192/*!*****************************!*\ 14193 !*** ./tools/EraserTool.js ***! 14194 \*****************************/ 14195/*! exports provided: default */ 14196/***/ (function(module, __webpack_exports__, __webpack_require__) { 14197 14198"use strict"; 14199__webpack_require__.r(__webpack_exports__); 14200/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return EraserTool; }); 14201/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js"); 14202/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); 14203/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js"); 14204/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); 14205/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js"); 14206/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); 14207/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js"); 14208/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); 14209/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/assertThisInitialized */ "../node_modules/@babel/runtime/helpers/assertThisInitialized.js"); 14210/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__); 14211/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js"); 14212/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__); 14213/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js"); 14214/* harmony import */ var _base_BaseTool_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./base/BaseTool.js */ "./tools/base/BaseTool.js"); 14215/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../stateManagement/toolState.js */ "./stateManagement/toolState.js"); 14216/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../store/index.js */ "./store/index.js"); 14217/* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./cursors/index.js */ "./tools/cursors/index.js"); 14218 14219 14220 14221 14222 14223 14224 14225 14226 14227 14228 14229/** 14230 * @public 14231 * @class EraserTool 14232 * @memberof Tools 14233 * 14234 * @classdesc Tool for deleting the data of other Annotation Tools. 14235 * @extends Tools.Base.BaseTool 14236 */ 14237 14238var EraserTool = 14239/*#__PURE__*/ 14240function (_BaseTool) { 14241 _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(EraserTool, _BaseTool); 14242 14243 function EraserTool() { 14244 var _this; 14245 14246 var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 14247 14248 _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, EraserTool); 14249 14250 var defaultProps = { 14251 name: 'Eraser', 14252 supportedInteractionTypes: ['Mouse', 'Touch'], 14253 svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_10__["eraserCursor"] 14254 }; 14255 _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(EraserTool).call(this, props, defaultProps)); 14256 _this.preMouseDownCallback = _this._deleteAllNearbyTools.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this)); 14257 _this.preTouchStartCallback = _this._deleteAllNearbyTools.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this)); 14258 return _this; 14259 } 14260 14261 _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(EraserTool, [{ 14262 key: "_deleteAllNearbyTools", 14263 value: function _deleteAllNearbyTools(evt) { 14264 var coords = evt.detail.currentPoints.canvas; 14265 var element = evt.detail.element; 14266 _store_index_js__WEBPACK_IMPORTED_MODULE_9__["state"].tools.forEac
14266h(function (tool) { 14267 var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_8__["getToolState"])(element, tool.name); 14268 14269 if (toolState) { 14270 // Modifying in a foreach? Probably not ideal 14271 toolState.data.forEach(function (data) { 14272 if (typeof tool.pointNearTool === 'function' && tool.pointNearTool(element, data, coords)) { 14273 Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_8__["removeToolState"])(element, tool.name, data); 14274 _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone.updateImage(element); 14275 } 14276 }); 14277 } 14278 }); 14279 var consumeEvent = true; 14280 return consumeEvent; 14281 } 14282 }]); 14283 14284 return EraserTool; 14285}(_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_7__["default"]); 14286 14287 14288 14289/***/ }), 14290
14291/***/ "./tools/FreehandSculpterMouseTool.js": 14292/*!********************************************!*\ 14293 !*** ./tools/FreehandSculpterMouseTool.js ***! 14294 \********************************************/ 14295/*! exports provided: default */ 14296/***/ (function(module, __webpack_exports__, __webpack_require__) { 14297 14298"use strict"; 14299__webpack_require__.r(__webpack_exports__); 14300/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return FreehandSculpterMouseTool; }); 14301/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js"); 14302/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); 14303/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js"); 14304/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); 14305/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js"); 14306/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); 14307/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js"); 14308/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); 14309/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/assertThisInitialized */ "../node_modules/@babel/runtime/helpers/assertThisInitialized.js"); 14310/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__); 14311/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js"); 14312/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__); 14313/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../events.js */ "./events.js"); 14314/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js"); 14315/* harmony import */ var _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../stateManagement/toolColors.js */ "./stateManagement/toolColors.js"); 14316/* harmony import */ var _drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../drawing/drawHandles.js */ "./drawing/drawHandles.js"); 14317/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../store/index.js */ "./store/index.js"); 14318/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../stateManagement/toolState.js */ "./stateManagement/toolState.js"); 14319/* harmony import */ var _util_clip_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../util/clip.js */ "./util/clip.js"); 14320/* harmony import */ var _store_getToolForElement_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../store/getToolForElement.js */ "./store/getToolForElement.js"); 14321/* harmony import */ var _base_BaseTool_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./base/BaseTool.js */ "./tools/base/BaseTool.js"); 14322/* harmony import */ var _store_setToolCursor_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../store/setToolCursor.js */ "./store/setToolCursor.js"); 14323/* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./cursors/index.js */ "./tools/cursors/index.js"); 14324/* harmony import */ var _util_freehand_index_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../util/freehand/index.js */ "./util/freehand/index.js"); 14325 14326 14327 14328 14329 14330 14331 14332 14333 14334 14335 14336 14337 14338 14339 14340 14341 14342 14343var FreehandHandleData = _util_freehand_index_js__WEBPACK_IMPORTED_MODULE_17__["default"].FreehandHandleData; 14344/** 14345 * @public 14346 * @class FreehandSculpterMouseTool 14347 * @memberof Tools 14348 * 14349 * @classdesc Tool for easily sculpting annotations drawn with 14350 * the FreehandMouseTool. 14351 * @extends Tools.Base.BaseTool 14352 */ 14353 14354var FreehandSculpterMouseTool = 14355/*#__PURE__*/ 14356function (_BaseTool) { 14357 _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(FreehandSculpterMouseTool, _BaseTool); 14358 14359 function FreehandSculpterMouseTool() { 14360 var _this; 14361 14362 var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 14363 14364 _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, FreehandSculpterMouseTool); 14365 14366 var defaultProps = { 14367 name: 'FreehandSculpterMouse', 14368 referencedToolName: 'FreehandMouse', 14369 supportedInteractionTypes: ['Mouse', 'Touch', 'DoubleTap'], 14370 mixins: ['activeOrDisabledBinaryTool'], 14371 configuration: getDefaultFreehandSculpterMouseToolConfiguration(), 14372 svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_16__["freehandSculpterMouseCursor"] 14373 }; 14374 _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(FreehandSculpterMouseTool).call(this, props, defaultProps)); 14375 _this.updateOnMouseMove = true; 14376 _this.isMultiPartTool = true; 14377 _this.referencedToolName = defaultProps.referencedToolName; 14378 _this._active = false; // Create bound functions for private event loop. 14379 14380 _this.activeMouseUpCallback = _this.activeMouseUpCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this)); 14381 _this.activeTouchEndCallback = _this.activeTouchEndCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this)); 14382 _this.activeMouseDragCallback = _this.activeMouseDragCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this)); 14383 return _this; 14384 } 14385 14386 _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(FreehandSculpterMouseTool, [{ 14387 key: "renderToolData", 14388 value: function renderToolData(evt) { 14389 var eventData = evt.detail; 14390 14391 if (this.configuration.currentTool === null) { 14392 return false;
14393 } 14394 14395 var element = eventData.element; 14396 var config = this.configuration; 14397 var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_11__["getToolState"])(element, this.referencedToolName); 14398 var data = toolState.data[config.currentTool]; 14399 14400 if (!data) { 14401 return false; 14402 } 14403 14404 if (this._active) { 14405 var context = eventData.canvasContext.canvas.getContext('2d'); 14406 var options = { 14407 color: this.configuration.dragColor, 14408 fill: null, 14409 handleRadius: this._toolSizeCanvas 14410 }; 14411 Object(_drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_9__["default"])(context, eventData, this.configuration.mouseLocation.handles, options); 14412 } else if (this.configuration.showCursorOnHover && !this._recentTouchEnd) { 14413 this._renderHoverCursor(evt); 14414 } 14415 } 14416 }, { 14417 key: "doubleClickCallback", 14418 value: function doubleClickCallback(evt) { 14419 var eventData = evt.detail; 14420 14421 this._selectFreehandTool(eventData); 14422 14423 _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(eventData.element); 14424 } 14425 }, { 14426 key: "doubleTapCallback", 14427 value: function doubleTapCallback(evt) { 14428 var eventData = evt.detail; 14429 14430 this._selectFreehandTool(eventData); 14431 14432 _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(eventData.element); 14433 } 14434 }, { 14435 key: "preTouchStartCallback", 14436 value: function preTouchStartCallback(evt) { 14437 this._initialiseSculpting(evt); 14438 14439 return true; 14440 } 14441 /** 14442 * Event handler for MOUSE_DOWN. 14443 * 14444 * @param {Object} evt - The event. 14445 * @returns {boolean} 14446 */ 14447 14448 }, { 14449 key: "preMouseDownCallback", 14450 value: function preMouseDownCallback(evt) { 14451 if (!this.options.mouseButtonMask.includes(evt.detail.buttons)) { 14452 return; 14453 } 14454 14455 this._initialiseSculpting(evt); 14456 14457 return true; 14458 } 14459 /** 14460 * Event handler for MOUSE_DRAG during the active loop. 14461 * 14462 * @event 14463 * @param {Object} evt - The event. 14464 * @returns {void} 14465 */ 14466 14467 }, { 14468 key: "activeMouseDragCallback", 14469 value: function activeMouseDragCallback(evt) { 14470 var config = this.configuration; 14471 14472 if (!this._active) { 14473 return; 14474 } 14475 14476 var eventData = evt.detail; 14477 var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_11__["getToolState"])(eventData.element, this.referencedToolName); 14478 14479 if (!toolState) { 14480 return; 14481 } 14482 14483 var points = toolState.data[config.currentTool].handles.points; // Set the mouseLocation handle 14484 14485 this._getMouseLocation(eventData); 14486 14487 this._sculpt(eventData, points); // Update the image 14488 14489 14490 _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(eventData.element); 14491 } 14492 /** 14493 * Event handler for MOUSE_UP during the active loop. 14494 * 14495 * @param {Object} evt - The event. 14496 * @returns {void} 14497 */ 14498 14499 }, { 14500 key: "activeMouseUpCallback", 14501 value: function activeMouseUpCallback(evt) { 14502 this._activeEnd(evt); 14503 } 14504 /** 14505 * Event handler for TOUCH_END during the active loop. 14506 * 14507 * @param {Object} evt - The event. 14508 * @returns {void} 14509 */ 14510 14511 }, { 14512 key: "activeTouchEndCallback", 14513 value: function activeTouchEndCallback(evt) { 14514 this._activeEnd(evt); 14515 14516 this._deselectAllTools(evt); 14517 14518 this._recentTouchEnd = true; 14519 } 14520 }, { 14521 key: "_activeEnd", 14522 value: function _activeEnd(evt) { 14523 var eventData = evt.detail; 14524 var element = eventData.element; 14525 var config = this.configuration; 14526 this._active = false; 14527 _store_index_js__WEBPACK_IMPORTED_MODULE_10__["state"].isMultiPartToolActive = false; 14528 14529 this._getMouseLocation(eventData); 14530 14531 this._invalidateToolData(eventData); 14532 14533 config.mouseUpRender = true; 14534 14535 this._deactivateSculpt(element); // Update the image 14536 14537 14538 _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(eventData.element); 14539 preventPropagation(evt); 14540 } 14541 /**
14542 * Renders the cursor 14543 * 14544 * @private 14545 * @param {type} evt description 14546 * @returns {void} 14547 */ 14548 14549 }, { 14550 key: "_renderHoverCursor", 14551 value: function _renderHoverCursor(evt) { 14552 var eventData = evt.detail; 14553 var element = eventData.element; 14554 var context = eventData.canvasContext.canvas.getContext('2d'); 14555 var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_11__["getToolState"])(element, this.referencedToolName); 14556 var data = toolState.data[this.configuration.currentTool]; 14557 this._recentTouchEnd = false; 14558 var coords; 14559 14560 if (this.configuration.mouseUpRender) { 14561 coords = this.configuration.mouseLocation.handles.start; 14562 this.configuration.mouseUpRender = false; 14563 } else { 14564 coords = _store_index_js__WEBPACK_IMPORTED_MODULE_10__["state"].mousePositionImage; 14565 } 14566 14567 var freehandMouseTool = Object(_store_getToolForElement_js__WEBPACK_IMPORTED_MODULE_13__["default"])(element, this.referencedToolName); 14568 var radiusCanvas = freehandMouseTool.distanceFromPointCanvas(element, data, coords);
14569 this.configuration.mouseLocation.handles.start.x = coords.x; 14570 this.configuration.mouseLocation.handles.start.y = coords.y; 14571 14572 if (this.configuration.limitRadiusOutsideRegion) { 14573 var unlimitedRadius = radiusCanvas; 14574 radiusCanvas = this._limitCursorRadiusCanvas(eventData, radiusCanvas); // Fade if distant 14575 14576 if (unlimitedRadius > this.configuration.hoverCursorFadeDistance * radiusCanvas) { 14577 context.globalAlpha = this.configuration.hoverCursorFadeAlpha; 14578 } 14579 } 14580 14581 var options = { 14582 fill: null, 14583 color: this.configuration.hoverColor, 14584 handleRadius: radiusCanvas 14585 }; 14586 Object(_drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_9__["default"])(context, eventData, this.configuration.mouseLocation.handles, options); 14587 14588 if (this.configuration.limitRadiusOutsideRegion) { 14589 context.globalAlpha = 1.0; // Reset drawing alpha for other draw calls. 14590 } 14591 } 14592 /** 14593 * Event handler for NEW_IMAGE event. 14594 * 14595 * @public 14596 * @param {Object} evt - The event. 14597 * @returns {void} 14598 */ 14599 14600 }, { 14601 key: "newImageCallback", 14602 value: function newImageCallback(evt) { 14603 this._deselectAllTools(evt); 14604 } 14605 /** 14606 * Event handler for switching mode to enabled. 14607 * 14608 * @public 14609 * @param {Object} evt - The event. 14610 * @returns {void} 14611 */ 14612 14613 }, { 14614 key: "enabledCallback", 14615 value: function enabledCallback(evt) { 14616 this._deselectAllTools(evt); 14617 } 14618 /** 14619 * Event handler for switching mode to passive. 14620 * 14621 * @public 14622 * @param {Object} evt - The event. 14623 * @returns {void} 14624 */ 14625 14626 }, { 14627 key: "passiveCallback", 14628 value: function passiveCallback(evt) { 14629 this._deselectAllTools(evt); 14630 } 14631 /** 14632 * Event handler for switching mode to disabled. 14633 * 14634 * @public 14635 * @param {Object} evt - The event. 14636 * @returns {void} 14637 */ 14638 14639 }, { 14640 key: "disabledCallback", 14641 value: function disabledCallback(evt) { 14642 this._deselectAllTools(evt); 14643 } 14644 /** 14645 * Select the freehand tool to be edited. 14646 * 14647 * @private 14648 * @param {Object} eventData - Data object associated with the event. 14649 * @returns {void} 14650 */ 14651 14652 }, { 14653 key: "_selectFreehandTool", 14654 value: function _selectFreehandTool(eventData) { 14655 var config = this.configuration; 14656 var element = eventData.element; 14657 14658 var closestToolIndex = this._getClosestFreehandToolOnElement(element, eventData); 14659 14660 if (closestToolIndex === undefined) { 14661 return; 14662 } 14663 14664 config.currentTool = closestToolIndex; 14665 Object(_store_setToolCursor_js__WEBPACK_IMPORTED_MODULE_15__["hideToolCursor"])(element); 14666 } 14667 /** 14668 * Activate the selected freehand tool and deactivate others. 14669 * 14670 * @private 14671 * @param {Object} element - The parent element of the freehand tool. 14672 * @param {Number} toolIndex - The ID of the freehand tool. 14673 * @returns {void} 14674 */ 14675 14676 }, { 14677 key: "_activateFreehandTool", 14678 value: function _activateFreehandTool(element, toolIndex) { 14679 var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_11__["getToolState"])(element, this.referencedToolName); 14680 var data = toolState.data; 14681 var config = this.configuration; 14682 config.currentTool = toolIndex; 14683 14684 for (var i = 0; i < data.length; i++) { 14685 if (i === toolIndex) { 14686 data[i].active = true; 14687 } else { 14688 data[i].active = false; 14689 } 14690 } 14691 } 14692 /** 14693 * Choose the tool radius from the mouse position relative to the active freehand 14694 * tool, and begin sculpting. 14695 * 14696 * @private 14697 * @param {Object} evt - The event. 14698 * @returns {void} 14699 */ 14700 14701 }, { 14702 key: "_initialiseSculpting", 14703 value: function _initialiseSculpting(evt) { 14704 var eventData = evt.detail; 14705 var config = this.configuration; 14706 var element = eventData.element; 14707 14708 if (config.currentTool === null) { 14709 this._selectFreehandTool(eventData); 14710 14711 if (config.currentTool === null) { 14712 return; 14713 } 14714 } 14715 14716 this._active = true; // Interupt event dispatcher 14717 14718 _store_index_js__WEBPACK_IMPORTED_MODULE_10__["state"].isMultiPartToolActive = true; 14719 14720 this._configureToolSize(eventData); 14721 14722 this._getMouseLocation(eventData); 14723 14724 this._activateFreehandTool(element, config.currentTool); 14725 14726 this._activateSculpt(element); 14727 14728 _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(eventData.element); 14729 } 14730 /** 14731 * Sculpts the freehand ROI with the circular freehandSculpter tool, moving, 14732 * adding and removing handles as necessary. 14733 * 14734 * @private 14735 * @param {Object} eventData - Data object associated with the event. 14736 * @param {Object} points - Array of points. 14737 * @returns {void} 14738 */ 14739 14740 }, { 14741 key: "_sculpt", 14742 value: function _sculpt(eventData, points) { 14743 var config = this.configuration; 14744 this._sculptData = { 14745 element: eventData.element, 14746 image: eventData.image, 14747 mousePoint: eventData.currentPoints.image, 14748 points: points, 14749 toolSize: this._toolSizeImage, 14750 minSpacing: config.minSpacing, 14751 maxSpacing: Math.max(this._toolSizeImage, config.minSpacing * 2) 14752 }; // Push existing handles radially away from tool. 14753 14754 var pushedHandles = this._pushHandles(); // Insert new handles in sparsely populated areas of the 14755 // Pushed part of the contour. 14756 14757 14758 if (pushedHandles.first !== undefined) { 14759 this._insertNewHandles(pushedHandles); // If any handles have been pushed very close together or even overlap, 14760 // Combine these into a single handle. 14761 14762 14763 this._consolidateHandles(); 14764 } 14765 } 14766 /** 14767 * _pushHandles -Pushes the points radially away from the mouse if they are 14768 * contained within the circle defined by the freehandSculpter's toolSize and 14769 * the mouse position. 14770 * 14771 * @returns {Object} The first and last pushedHandles. 14772 */ 14773 14774 }, { 14775 key: "_pushHandles", 14776 value: function _pushHandles() { 14777 var _this$_sculptData = this._sculptData, 14778 points = _this$_sculptData.points, 14779 mousePoint = _this$_sculptData.mousePoint, 14780 toolSize = _this$_sculptData.toolSize; 14781 var pushedHandles = {}; 14782 14783 for (var i = 0; i < points.length; i++) { 14784 var distanceToHandle = _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstoneMath.point.distance(points[i], mousePoint); 14785 14786 if (distanceToHandle > toolSize) { 14787 continue; 14788 } // Push point if inside circle, to edge of circle. 14789 14790 14791 this._pushOneHandle(i, distanceToHandle); 14792 14793 if (pushedHandles.first === undefined) { 14794 pushedHandles.first = i; 14795 pushedHandles.last = i; 14796 } else { 14797 pushedHandles.last = i; 14798 } 14799 } 14800 14801 return pushedHandles; 14802 } 14803 /** 14804 * Pushes one handle. 14805 * 14806 * @private 14807 * @param {number} i - The index of the handle to push. 14808 * @param {number}
14808 distanceToHandle - The distance between the mouse cursor and the handle. 14809 * @returns {void} 14810 */ 14811 14812 }, { 14813 key: "_pushOneHandle", 14814 value: function _pushOneHandle(i, distanceToHandle) { 14815 var _this$_sculptData2 = this._sculptData, 14816 points = _this$_sculptData2.points, 14817 mousePoint = _this$_sculptData2.mousePoint, 14818 toolSize = _this$_sculptData2.toolSize, 14819 image = _this$_sculptData2.image; 14820 var handle = points[i]; 14821 var directionUnitVector = { 14822 x: (handle.x - mousePoint.x) / distanceToHandle, 14823 y: (handle.y - mousePoint.y) / distanceToHandle 14824 }; 14825 var position = { 14826 x: mousePoint.x + toolSize * directionUnitVector.x, 14827 y: mousePoint.y + toolSize * directionUnitVector.y 14828 }; 14829 Object(_util_clip_js__WEBPACK_IMPORTED_MODULE_12__["clipToBox"])(position, image); 14830 handle.x = position.x; 14831 handle.y = position.y; // Push lines 14832 14833 var lastHandleIndex = this.constructor._getPreviousHandleIndex(i, points.length); 14834 14835 points[lastHandleIndex].lines.pop(); 14836 points[lastHandleIndex].lines.push(handle); 14837 } 14838 /** 14839 * Inserts additional handles in sparsely sampled regions of the contour. The 14840 * new handles are placed on the circle defined by the the freehandSculpter's 14841 * toolSize and the mouse position. 14842 * @private 14843 * @param {Array} pushedHandles 14844 * @returns {void} 14845 */ 14846 14847 }, { 14848 key: "_insertNewHandles", 14849 value: function _insertNewHandles(pushedHandles) { 14850 var indiciesToInsertAfter = this._findNewHandleIndicies(pushedHandles); 14851 14852 var newIndexModifier = 0; 14853 14854 for (var i = 0; i < indiciesToInsertAfter.length; i++) { 14855 var insertIndex = indiciesToInsertAfter[i] + 1 + newIndexModifier; 14856 14857 this._insertHandleRadially(insertIndex); 14858 14859 newIndexModifier++; 14860 } 14861 } 14862 /** 14863 * Returns an array of indicies that describe where new handles should be 14864 * inserted (where the distance between subsequent handles is > 14865 * config.maxSpacing). 14866 * 14867 * @private 14868 * @param {Object} pushedHandles - The first and last handles that were pushed. 14869 * @returns {Object} An array of indicies that describe where new handles should be inserted. 14870 */ 14871 14872 }, { 14873 key: "_findNewHandleIndicies", 14874 value: function _findNewHandleIndicies(pushedHandles) { 14875 var _this$_sculptData3 = this._sculptData, 14876 points = _this$_sculptData3.points, 14877 maxSpacing = _this$_sculptData3.maxSpacing; 14878 var indiciesToInsertAfter = []; 14879 14880 for (var i = pushedHandles.first; i <= pushedHandles.last; i++) { 14881 this._checkSpacing(i, points, indiciesToInsertAfter, maxSpacing); 14882 } 14883 14884 var pointAfterLast = this.constructor._getNextHandleIndex(pushedHandles.last, points.length); // Check points before and after those pushed. 14885 14886 14887 if (pointAfterLast !== pushedHandles.first) { 14888 this._checkSpacing(pointAfterLast, points, indiciesToInsertAfter, maxSpacing); 14889 14890 var pointBeforeFirst = this.constructor._getPreviousHandleIndex(pushedHandles.first, points.length); 14891 14892 if (pointBeforeFirst !== pointAfterLast) { 14893 this._checkSpacing(pointBeforeFirst, points, indiciesToInsertAfter, maxSpacing); 14894 } 14895 } 14896 14897 return indiciesToInsertAfter; 14898 } 14899 /** 14900 * _checkSpacing - description 14901 *@modifies indiciesToInsertAfter 14902 * 14903 * @param {number} i - The index to check. 14904 * @param {Object} points - The points. 14905 * @param {Array} indiciesToInsertAfter - The working list of indicies to insert new points after. 14906 * @param {number} maxSpacing 14907 * @returns {void} 14908 */ 14909 14910 }, { 14911 key: "_checkSpacing", 14912 value: function _checkSpacing(i, points, indiciesToInsertAfter, maxSpacing) { 14913 var nextHandleIndex = this.constructor._getNextHandleIndex(i, points.length); 14914 14915 var distanceToNextHandle = _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstoneMath.point.distance(points[i], points[nextHandleIndex]); 14916 14917 if (distanceToNextHandle > maxSpacing) { 14918 indiciesToInsertAfter.push(i); 14919 } 14920 } 14921 /** 14922 * Inserts a handle on the surface of the circle defined by toolSize and the 14923 * mousePoint. 14924 * 14925 * @private 14926 * @param {number} insertIndex - The index to insert the new handle. 14927 * @returns {void} 14928 */ 14929 14930 }, { 14931 key: "_insertHandleRadially", 14932 value: function _insertHandleRadially(insertIndex) { 14933 var points = this._sculptData.points; 14934 var previousIndex = insertIndex - 1; 14935 14936 var nextIndex = this.constructor._getNextHandleIndexBeforeInsert(insertIndex, points.length); 14937 14938 var insertPosition = this._getInsertPosition(insertIndex, previousIndex, nextIndex); 14939 14940 var handleData = new FreehandHandleData(insertPosition); 14941 points.splice(insertIndex, 0, handleData); // Add the line from the previous handle to the inserted handle (note the tool is now one increment longer) 14942 14943 points[previousIndex].lines.pop(); 14944 points[previousIndex].lines.push(points[insertIndex]); 14945 _util_freehand_index_js__WEBPACK_IMPORTED_MODULE_17__["default"].addLine(points, insertIndex); 14946 } 14947 /** 14948 * Checks for any close points and consolidates these to a 14949 * single point. 14950 * 14951 * @private 14952 * @returns {void} 14953 */ 14954 14955 }, { 14956 key: "_consolidateHandles", 14957 value: function _consolidateHandles() { 14958 var points = this._sculptData.points; // Don't merge handles if it would destroy the polygon. 14959 14960 if (points.length <= 3) { 14961 return; 14962 } 14963 14964 var closePairs = this._findCloseHandlePairs(); 14965 14966 this._mergeCloseHandles(closePairs); 14967 } 14968 /** 14969 * Finds pairs of close handles with seperations < config.minSpacing. No handle 14970 * is included in more than one pair, to avoid spurious deletion of densely
14971 * populated regions of the contour (see mergeCloseHandles). 14972 * 14973 * @private 14974 * @returns {Array} An array of close pairs in points. 14975 */ 14976 14977 }, { 14978 key: "_findCloseHandlePairs", 14979 value: function _findCloseHandlePairs() { 14980 var _this$_sculptData4 = this._sculptData, 14981 points = _this$_sculptData4.points, 14982 minSpacing = _this$_sculptData4.minSpacing; 14983 var closePairs = []; 14984 var length = points.length; 14985 14986 for (var i = 0; i < length; i++) { 14987 var nextHandleIndex = this.constructor._getNextHandleIndex(i, points.length); 14988 14989 var distanceToNextHandle = _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstoneMath.point.distance(points[i], points[nextHandleIndex]); 14990 14991 if (distanceToNextHandle < minSpacing) { 14992 var pair = [i, nextHandleIndex]; 14993 closePairs.push(pair); // Don't check last node if first in pair to avoid double counting. 14994 14995 if (i === 0) { 14996 length -= 1; 14997 } // Don't double count pairs in order to prevent your polygon collapsing to a singularity. 14998 14999 15000 i++; 15001 } 15002 } 15003 15004 return closePairs; 15005 } 15006 /** 15007 * Merges points given a list of close pairs. The points are merged in an 15008 * iterative fashion to prevent generating a singularity in some edge cases. 15009 * 15010 * @private 15011 * @param {Array} closePairs - An array of pairs of handle indicies. 15012 * @returns {void} 15013 */ 15014 15015 }, { 15016 key: "_mergeCloseHandles", 15017 value: function _mergeCloseHandles(closePairs) { 15018 var removedIndexModifier = 0; 15019 15020 for (var i = 0; i < closePairs.length; i++) { 15021 var pair = this.constructor._getCorrectedPair(closePairs[i], removedIndexModifier); 15022 15023 this._combineHandles(pair); 15024 15025 removedIndexModifier++; 15026 } // Recursively remove problem childs 15027 15028 15029 var newClosePairs = this._findCloseHandlePairs(); 15030 15031 if (newClosePairs.length) { 15032 this._mergeCloseHandles(newClosePairs); 15033 } 15034 } 15035 /** 15036 * Combines two handles defined by the indicies in handlePairs. 15037 * 15038 * @private 15039 * @param {Object} handlePair - A pair of handle indicies. 15040 * @returns {void} 15041 */ 15042 15043 }, { 15044 key: "_combineHandles", 15045 value: function _combineHandles(handlePair) { 15046 var _this$_sculptData5 = this._sculptData, 15047 points = _this$_sculptData5.points, 15048 image = _this$_sculptData5.image; // Calculate combine position: half way between the handles. 15049 15050 var midPoint = { 15051 x: (points[handlePair[0]].x + points[handlePair[1]].x) / 2.0, 15052 y: (points[handlePair[0]].y + points[handlePair[1]].y) / 2.0 15053 }; 15054 Object(_util_clip_js__WEBPACK_IMPORTED_MODULE_12__["clipToBox"])(midPoint, image); // Move first point to midpoint 15055 15056 points[handlePair[0]].x = midPoint.x; 15057 points[handlePair[0]].y = midPoint.y; // Link first point to handle that second point links to. 15058 15059 var handleAfterPairIndex = this.constructor._getNextHandleIndex(handlePair[1], points.length); 15060 15061 points[handlePair[0]].lines.pop(); 15062 points[handlePair[0]].lines.push(points[handleAfterPairIndex]); // Remove the latter handle 15063 15064 points.splice(handlePair[1], 1); 15065 } 15066 /** 15067 * Calculates the distance to the closest handle in the tool, and stores the 15068 * result in this._toolSizeImage and this._toolSizeCanvas. 15069 * 15070 * @private 15071 * @param {Object} eventData - Data object associated with the event. 15072 * @returns {void} 15073 */ 15074 15075 }, { 15076 key: "_configureToolSize", 15077 value: function _configureToolSize(eventData) { 15078 var element = eventData.element; 15079 var config = this.configuration; 15080 var toolIndex = config.currentTool; 15081 var coords = eventData.currentPoints.image; 15082 var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_11__["getToolState"])(element, this.referencedToolName); 15083 var data = toolState.data[toolIndex]; 15084 var freehandMouseTool = Object(_store_getToolForElement_js__WEBPACK_IMPORTED_MODULE_13__["default"])(element, this.referencedToolName); 15085 var radiusImage = freehandMouseTool.distanceFromPoint(element, data, coords); 15086 var radiusCanvas = freehandMouseTool.distanceFromPointCanvas(element, data, coords); // Check if should limit maximum size. 15087 15088 if (config.limitRadiusOutsideRegion) { 15089 radiusImage = this._limitCursorRadiusImage(eventData, radiusImage); 15090 radiusCanvas = this._limitCursorRadiusCanvas(eventData, radiusCanvas); 15091 } 15092 15093 this._toolSizeImage = radiusImage;
15094 this._toolSizeCanvas = radiusCanvas; 15095 } 15096 /** 15097 * Gets the current mouse location and stores it in the configuration object. 15098 * 15099 * @private 15100 * @param {Object} eventData - The data assoicated with the event. 15101 * @returns {void} 15102 */ 15103 15104 }, { 15105 key: "_getMouseLocation", 15106 value: function _getMouseLocation(eventData) { 15107 var config = this.configuration; 15108 config.mouseLocation.handles.start.x = eventData.currentPoints.image.x; 15109 config.mouseLocation.handles.start.y = eventData.currentPoints.image.y; 15110 Object(_util_clip_js__WEBPACK_IMPORTED_MODULE_12__["clipToBox"])(config.mouseLocation.handles.start, eventData.image); 15111 } 15112 /** 15113 * Attaches event listeners to the element such that is is visible, modifiable, and new data can be created. 15114 * 15115 * @private 15116 * @param {Object} element - The viewport element to attach event listeners to. 15117 * @modifies {element} 15118 * @returns {void} 15119 */ 15120 15121 }, { 15122 key: "_activateSculpt", 15123 value: function _activateSculpt(element) { 15124 this._deactivateSculpt(element); // Begin activeMouseDragCallback loop - call activeMouseUpCallback at end of drag or straight away if just a click. 15125 15126 15127 element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].MOUSE_UP, this.activeMouseUpCallback); 15128 element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].MOUSE_CLICK, this.activeMouseUpCallback); 15129 element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].MOUSE_DRAG, this.activeMouseDragCallback); 15130 element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].TOUCH_END, this.activeTouchEndCallback); 15131 element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].TOUCH_TAP, this.activeTouchEndCallback); 15132 element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].TOUCH_DRAG, this.activeMouseDragCallback); 15133 _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(element); 15134 } 15135 /** 15136 * Removes event listeners from the element. 15137 * 15138 * @private 15139 * @param {Object} element - The viewport element to remove event listeners from. 15140 * @modifies {element} 15141 * @returns {void} 15142 */ 15143 15144 }, { 15145 key: "_deactivateSculpt", 15146 value: function _deactivateSculpt(element) { 15147 element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].MOUSE_UP, this.activeMouseUpCallback); 15148 element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].MOUSE_CLICK, this.activeMouseUpCallback); 15149 element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].MOUSE_DRAG, this.activeMouseDragCallback); 15150 element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].TOUCH_END, this.activeTouchEndCallback); 15151 element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].TOUCH_TAP, this.activeTouchEndCallback); 15152 element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_6__["default"].TOUCH_DRAG, this.activeMouseDragCallback); 15153 _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(element); 15154 } 15155 /** 15156 * Invalidate the freehand tool data, tirggering re-calculation of statistics. 15157 * 15158 * @private 15159 * @param {Object} eventData - Data object associated with the event. 15160 * @returns {void} 15161 */ 15162 15163 }, { 15164 key: "_invalidateToolData", 15165 value: function _invalidateToolData(eventData) { 15166 var config = this.configuration; 15167 var element = eventData.element; 15168 var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_11__["getToolState"])(element, this.referencedToolName); 15169 var data = toolData.data[config.currentTool]; 15170 data.invalidated = true; 15171 } 15172 /** 15173 * Deactivates all freehand ROIs and change currentTool to null 15174 * 15175 * @private 15176 * @param {Object} evt - The event. 15177 * @returns {void} 15178 */ 15179 // eslint-disable-next-line no-unused-vars 15180 15181 }, { 15182 key: "_deselectAllTools", 15183 value: function _deselectAllTools(evt) { 15184 var config = this.configuration; 15185 var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_11__["getToolState"])(this.element, this.referencedToolName); 15186 config.currentTool = null; 15187 15188 if (toolData) { 15189 for (var i = 0; i < toolData.data.length; i++) { 15190 toolData.data[i].active = false;
15191 } 15192 } 15193 15194 Object(_store_setToolCursor_js__WEBPACK_IMPORTED_MODULE_15__["setToolCursor"])(this.element, this.svgCursor); 15195 _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(this.element); 15196 } 15197 /** 15198 * Given a pair of indicies, and the number of points already removed, 15199 * convert to the correct live indicies. 15200 * 15201 * @private 15202 * @static 15203 * @param {Object} pair A pairs of handle indicies. 15204 * @param {Number} removedIndexModifier The number of handles already removed. 15205 * @returns {Object} The corrected pair of handle indicies. 15206 */ 15207 15208 }, { 15209 key: "_limitCursorRadiusCanvas", 15210 15211 /** 15212 * Limits the cursor radius so that it its maximum area is the same as the 15213 * ROI being sculpted (in canvas coordinates). 15214 * 15215 * @private 15216 * @param {Object} eventData Data object associated with the event. 15217 * @param {Number} radiusCanvas The distance from the mouse to the ROI 15218 * in canvas coordinates. 15219 * @returns {Number} The limited radius in canvas coordinates. 15220 */ 15221 value: function _limitCursorRadiusCanvas(eventData, radiusCanvas) { 15222 return this._limitCursorRadius(eventData, radiusCanvas, true); 15223 } 15224 /** 15225 * Limits the cursor radius so that it its maximum area is the same as the 15226 * ROI being sculpted (in image coordinates). 15227 * 15228 * @private 15229 * @param {Object} eventData Data object associated with the event. 15230 * @param {Number} radiusImage The distance from the mouse to the ROI 15231 * in image coordinates. 15232 * @returns {Number} The limited radius in image coordinates. 15233 */ 15234 15235 }, { 15236 key: "_limitCursorRadiusImage", 15237 value: function _limitCursorRadiusImage(eventData, radiusImage) { 15238 return this._limitCursorRadius(eventData, radiusImage, false); 15239 } 15240 /** 15241 * Limits the cursor radius so that it its maximum area is the same as the 15242 * ROI being sculpted. 15243 * 15244 * @private 15245 * @param {Object} eventData Data object associated with the event. 15246 * @param {Number} radius The distance from the mouse to the ROI. 15247 * @param {Boolean} canvasCoords Whether the calculation should be performed 15248 * In canvas coordinates. 15249 * @returns {Number} The limited radius. 15250 */ 15251 15252 }, { 15253 key: "_limitCursorRadius", 15254 value: function _limitCursorRadius(eventData, radius) { 15255 var canvasCoords = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; 15256 var element = eventData.element; 15257 var image = eventData.image; 15258 var config = this.configuration; 15259 var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_11__["getToolState"])(element, this.referencedToolName); 15260 var data = toolState.data[config.currentTool]; 15261 var areaModifier = 1.0; 15262 15263 if (canvasCoords) { 15264 var topLeft = _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.pixelToCanvas(element, { 15265 x: 0, 15266 y: 0 15267 }); 15268 var bottomRight = _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.pixelToCanvas(element, { 15269 x: image.width, 15270 y: image.height 15271 }); 15272 var canvasArea = (bottomRight.x - topLeft.x) * (bottomRight.y - topLeft.y); 15273 areaModifier = canvasArea / (image.width * image.height); 15274 } 15275 15276 var area = data.area * areaModifier; 15277 var maxRadius = Math.pow(area / Math.PI, 0.5); 15278 return Math.min(radius, maxRadius); 15279 } 15280 /** 15281 * Finds the nearest handle to the mouse cursor for all freehand 15282 * data on the element. 15283 * 15284 * @private 15285 * @param {Object} element - The element. 15286 * @param {Object} eventData - Data object associated with the event. 15287 * @returns {Number} The tool index of the closest freehand tool. 15288 */ 15289 15290 }, { 15291 key: "_getClosestFreehandToolOnElement", 15292 value: function _getClosestFreehandToolOnElement(element, eventData) { 15293 var freehand = Object(_store_getToolForElement_js__WEBPACK_IMPORTED_MODULE_13__["default"])(element, this.referencedToolName); 15294 var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_11__["getToolState"])(element, this.referencedToolName); 15295 15296 if (!toolState) { 15297 return; 15298 } 15299 15300 var data = toolState.data; 15301 var pixelCoords = eventData.currentPoints.image; 15302 var closest = { 15303 distance: Infinity, 15304 toolIndex: null 15305 }; 15306 15307 for (var i = 0; i < data.length; i++) { 15308 var distanceFromToolI = freehand.distanceFromPoint(element, data[i], pixelCoords); 15309 15310 if (distanceFromToolI === -1) { 15311 continue; 15312 } 15313 15314 if (distanceFromToolI < closest.distance) { 15315 closest.distance = distanceFromToolI; 15316 closest.toolIndex = i; 15317 } 15318 } 15319 15320 return closest.toolIndex; 15321 } 15322 /** 15323 * Returns the next handle index. 15324 * 15325 * @private 15326 * @static 15327 * @param {Number} i - The handle index. 15328 * @param {Number} length - The length of the polygon. 15329 * @returns {Number} The next handle index. 15330 */ 15331 15332 }, { 15333 key: "_getInsertPosition", 15334 15335 /** 15336 * Calculates the position that a new handle should be inserted. 15337 * 15338 * @private 15339 * @static 15340 * @param {Number} insertIndex - The index to insert the new handle. 15341 * @param {Number} previousIndex - The previous index. 15342 * @param {Number} nextIndex - The next index. 15343 * @returns {Object} The position the handle should be inserted. 15344 */ 15345 value: function _getInsertPosition(insertIndex, previousIndex, nextIndex) { 15346 var _this$_sculptData6 = this._sculptData, 15347 points = _this$_sculptData6.points, 15348 toolSize = _this$_sculptData6.toolSize, 15349 mousePoint = _this$_sculptData6.mousePoint, 15350 image = _this$_sculptData6.image; // Calculate insert position: half way between the handles, then pushed out 15351 // Radially to the edge of the freehandSculpter. 15352 15353 var midPoint = { 15354 x: (points[previousIndex].x + points[nextIndex].x) / 2.0, 15355 y: (points[previousIndex].y + points[nextIndex].y) / 2.0 15356 }; 15357 var distanceToMidPoint = _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstoneMath.point.distance(mousePoint, midPoint); 15358 var insertPosition; 15359 15360 if (distanceToMidPoint < toolSize) { 15361 var directionUnitVector = { 15362 x: (midPoint.x - mousePoint.x) / distanceToMidPoint, 15363 y: (midPoint.y - mousePoint.y) / distanceToMidPoint 15364 }; 15365 insertPosition = { 15366 x: mousePoint.x + toolSize * directionUnitVector.x, 15367 y: mousePoint.y + toolSize * directionUnitVector.y 15368 }; 15369 } else { 15370 insertPosition = midPoint; 15371 } 15372
15373 Object(_util_clip_js__WEBPACK_IMPORTED_MODULE_12__["clipToBox"])(insertPosition, image); 15374 return insertPosition; 15375 } // =================================================================== 15376 // Public Configuration API. . 15377 // =================================================================== 15378 15379 }, { 15380 key: "minSpacing", 15381 get: function get() { 15382 return this.configuration.minSpacing; 15383 }, 15384 set: function set(value) { 15385 if (typeof value !== 'number') { 15386 throw new Error('Attempting to set freehandSculpter minSpacing to a value other than a number.'); 15387 } 15388 15389 this.configuration.minSpacing = value; 15390 } 15391 }, { 15392 key: "maxSpacing", 15393 get: function get() { 15394 return this.configuration.maxSpacing; 15395 }, 15396 set: function set(value) { 15397 if (typeof value !== 'number') { 15398 throw new Error('Attempting to set freehandSculpter maxSpacing to a value other than a number.'); 15399 } 15400 15401 this.configuration.maxSpacing = value; 15402 } 15403 }, { 15404 key: "showCursorOnHover", 15405 get: function get() { 15406 return this.configuration.showCursorOnHover; 15407 }, 15408 set: function set(value) { 15409 if (typeof value !== 'boolean') { 15410 throw new Error('Attempting to set freehandSculpter showCursorOnHover to a value other than a boolean.'); 15411 } 15412 15413 this.configuration.showCursorOnHover = value; 15414 _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(this.element); 15415 } 15416 }, { 15417 key: "limitRadiusOutsideRegion", 15418 get: function get() { 15419 return this.configuration.limitRadiusOutsideRegion; 15420 }, 15421 set: function set(value) { 15422 if (typeof value !== 'boolean') { 15423 throw new Error('Attempting to set freehandSculpter limitRadiusOutsideRegion to a value other than a boolean.'); 15424 } 15425 15426 this.configuration.limitRadiusOutsideRegion = value; 15427 _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(this.element); 15428 } 15429 }, { 15430 key: "hoverCursorFadeAlpha", 15431 get: function get() { 15432 return this.configuration.hoverCursorFadeAlpha; 15433 }, 15434 set: function set(value) { 15435 if (typeof value !== 'number') { 15436 throw new Error('Attempting to set freehandSculpter hoverCursorFadeAlpha to a value other than a number.'); 15437 } // Clamp the value from 0 to 1. 15438 15439 15440 value = Math.max(Math.min(value, 1.0), 0.0); 15441 this.configuration.hoverCursorFadeAlpha = value; 15442 _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(this.element); 15443 } 15444 }, { 15445 key: "hoverCursorFadeDistance", 15446 get: function get() { 15447 return this.configuration.hoverCursorFadeDistance; 15448 }, 15449 set: function set(value) { 15450 if (typeof value !== 'number') { 15451 throw new Error('Attempting to set freehandSculpter hoverCursorFadeDistance to a value other than a number.'); 15452 } // Don't allow to fade a distances smaller than the tool's radius. 15453 15454 15455 value = Math.max(value, 1.0); 15456 this.configuration.hoverCursorFadeDistance = value; 15457 _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(this.element); 15458 } 15459 }], [{ 15460 key: "_getCorrectedPair", 15461 value: function _getCorrectedPair(pair, removedIndexModifier) { 15462 var correctedPair = [pair[0] - removedIndexModifier, pair[1] - removedIndexModifier];
15462 // Deal with edge case of last node + first node. 15463 15464 if (correctedPair[1] < 0) { 15465 correctedPair[1] = 0; 15466 } 15467 15468 return correctedPair; 15469 } 15470 }, { 15471 key: "_getNextHandleIndex", 15472 value: function _getNextHandleIndex(i, length) { 15473 if (i === length - 1) { 15474 return 0; 15475 } 15476 15477 return i + 1; 15478 } 15479 /** 15480 * Returns the previous handle index. 15481 * 15482 * @private 15483 * @static 15484 * @param {Number} i - The handle index. 15485 * @param {Number} length - The length of the polygon. 15486 * @returns {Number} The previous handle index. 15487 */ 15488 15489 }, { 15490 key: "_getPreviousHandleIndex", 15491 value: function _getPreviousHandleIndex(i, length) { 15492 if (i === 0) { 15493 return length - 1; 15494 } 15495 15496 return i - 1; 15497 } 15498 /** 15499 * Returns the next handle index, with a correction considering a handle is 15500 * about to be inserted. 15501 * 15502 * @private 15503 * @static 15504 * @param {Number} insertIndex - The index in which the handle is being inserted. 15505 * @param {Number} length - The length of the polygon. 15506 * @returns {Number} The next handle index. 15507 */ 15508 15509 }, { 15510 key: "_getNextHandleIndexBeforeInsert", 15511 value: function _getNextHandleIndexBeforeInsert(insertIndex, length) { 15512 if (insertIndex === length) { 15513 return 0; 15514 } // Index correction here: The line bellow is correct, as we haven't inserted our handle yet! 15515 15516 15517 return insertIndex; 15518 } 15519 }]); 15520 15521 return FreehandSculpterMouseTool; 15522}(_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_14__["default"]); 15523/** 15524 * Returns the default freehandSculpterMouseTool configuration. 15525 * 15526 * @returns {Object} The default configuration object. 15527 */ 15528 15529 15530 15531 15532function getDefaultFreehandSculpterMouseToolConfiguration() { 15533 return { 15534 mouseLocation: { 15535 handles: { 15536 start: { 15537 highlight: true, 15538 active: true 15539 } 15540 } 15541 },
15542 minSpacing: 1, 15543 currentTool: null, 15544 dragColor: _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_8__["default"].getActiveColor(), 15545 hoverColor: _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_8__["default"].getToolColor(), 15546 15547 /* --- Hover options --- 15548 showCursorOnHover: Shows a preview of the sculpting radius on hover. 15549 limitRadiusOutsideRegion: Limit max toolsize outside the subject ROI based 15550 on subject ROI area. 15551 hoverCursorFadeAlpha: Alpha to fade to when tool very distant from 15552 subject ROI. 15553 hoverCursorFadeDistance: Distance from ROI in which to fade the hoverCursor 15554 (in units of radii). 15555 */ 15556 showCursorOnHover: true, 15557 limitRadiusOutsideRegion: true, 15558 hoverCursorFadeAlpha: 0.5, 15559 hoverCursorFadeDistance: 1.2 15560 }; 15561} 15562 15563function preventPropagation(evt) { 15564 evt.stopImmediatePropagation(); 15565 evt.stopPropagation(); 15566 evt.preventDefault(); 15567} 15568 15569/***/ }), 15570
15571/***/ "./tools/MagnifyTool.js": 15572/*!******************************!*\ 15573 !*** ./tools/MagnifyTool.js ***! 15574 \******************************/ 15575/*! exports provided: default */ 15576/***/ (function(module, __webpack_exports__, __webpack_require__) { 15577 15578"use strict"; 15579__webpack_require__.r(__webpack_exports__); 15580/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return MagnifyTool; }); 15581/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js"); 15582/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); 15583/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js"); 15584/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); 15585/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js"); 15586/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); 15587/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js"); 15588/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); 15589/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/assertThisInitialized */ "../node_modules/@babel/runtime/helpers/assertThisInitialized.js"); 15590/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__); 15591/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js"); 15592/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__); 15593/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js"); 15594/* harmony import */ var _drawing_index_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../drawing/index.js */ "./drawing/index.js"); 15595/* harmony import */ var _base_BaseTool_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./base/BaseTool.js */ "./tools/base/BaseTool.js"); 15596/* harmony import */ var _store_setToolCursor_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../store/setToolCursor.js */ "./store/setToolCursor.js"); 15597/* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./cursors/index.js */ "./tools/cursors/index.js"); 15598 15599 15600 15601 15602 15603 15604 15605 15606 15607 15608 15609/** 15610 * @public 15611 * @class MagnifyTool 15612 * @memberof Tools 15613 * 15614 * @classdesc Tool for inspecting a region at increased magnification. 15615 * @extends Tools.Base.BaseTool 15616 */ 15617 15618var MagnifyTool = 15619/*#__PURE__*/ 15620function (_BaseTool) { 15621 _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(MagnifyTool, _BaseTool); 15622 15623 function MagnifyTool() { 15624 var _this; 15625 15626 var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 15627 15628 _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, MagnifyTool); 15629 15630 var defaultProps = { 15631 name: 'Magnify', 15632 supportedInteractionTypes: ['Mouse', 'Touch'], 15633 configuration: { 15634 magnifySize: 300, 15635 magnificationLevel: 2 15636 }, 15637 svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_10__["magnifyCursor"] 15638 }; 15639 _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(MagnifyTool).call(this, props, defaultProps)); 15640 _this.zoomCanvas = undefined; 15641 _this.zoomElement = undefined; // Mode Callbacks: (element, options) 15642 15643 _this.activeCallback = _this._createMagnificationCanvas.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this)); 15644 _this.enabledCallback = _this._createMagnificationCanvas.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this)); 15645 _this.disabledCallback = _this._destroyMagnificationCanvas.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this)); // Touch 15646 15647 _this.postTouchStartCallback = _this._addMagnifyingGlass.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this)); 15648 _this.touchDragCallback = _this._updateMagnifyingGlass.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this)); 15649 _this.touchEndCallback = _this._removeMagnifyingGlass.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this)); 15650 _this.touchDragEndCallback = _this._removeMagnifyingGlass.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this)); // Mouse 15651 15652 _this.postMouseDownCallback = _this._addMagnifyingGlass.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this)); 15653 _this.mouseDragCallback = _this._updateMagnifyingGlass.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this)); 15654 _this.mouseUpCallback = _this._removeMagnifyingGlass.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this)); // On quick clicks, mouseUp does not fire, but this does 15655 15656 _this.mouseClickCallback = _this._removeMagnifyingGlass.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this)); // Misc 15657 15658 _this.newImageCallback = _this._drawMagnificationTool.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this)); 15659 return _this; 15660 } 15661 15662 _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(MagnifyTool, [{ 15663 key: "_addMagnifyingGlass", 15664 value: function _addMagnifyingGlass(evt) { 15665 var _this2 = this; 15666 15667 // Ignore until next event 15668 this._removeZoomElement(); 15669 15670 this._drawZoomedElement(evt); // On next frame 15671 15672 15673 window.requestAnimationFrame(function () { 15674 return _this2._drawMagnificationTool(evt); 15675 }); 15676 Object(_store_setToolCursor_js__WEBPACK_IMPORTED_MODULE_9__["hideToolCursor"])(evt.detail.element); 15677 evt.preventDefault(); 15678 evt.stopPropagation(); 15679 } 15680 }, { 15681 key: "_updateMagnifyingGlass", 15682 value: function _updateMagnifyingGlass(evt) { 15683 this._drawMagnificationTool(evt); 15684 15685 evt.preventDefault(); 15686 evt.stopPropagation(); 15687 } 15688 }, { 15689 key: "_removeMagnifyingGlass", 15690 value: function _removeMagnifyingGlass(evt) { 15691 var element = evt.detail.element;
15691 // Re-enable the mouse cursor 15692 15693 Object(_store_setToolCursor_js__WEBPACK_IMPORTED_MODULE_9__["setToolCursor"])(this.element, this.svgCursor); 15694 element.querySelector('.magnifyTool').style.display = 'none'; 15695 15696 this._removeZoomElement(); 15697 } 15698 }, { 15699 key: "_drawMagnificationTool", 15700 value: function _drawMagnificationTool(evt) { 15701 var element = evt.detail.element; 15702 var magnifyCanvas = element.querySelector('.magnifyTool'); 15703 15704 if (!magnifyCanvas) { 15705 this._createMagnificationCanvas(element); 15706 } 15707 15708 if (this.zoomCanvas === undefined) { 15709 return; 15710 } // The 'not' magnifyTool class here is necessary because cornerstone places 15711 // No classes of it's own on the canvas we want to select 15712 15713 15714 var canvas = element.querySelector('canvas:not(.magnifyTool)'); 15715 var context = Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["getNewContext"])(magnifyCanvas); // Calculate the on-canvas location of the mouse pointer / touch 15716 15717 var canvasLocation = _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone.pixelToCanvas(evt.detail.element, evt.detail.currentPoints.image); // Shrink magnifier to smallest canvas dimension if smaller than desired magnifier size 15718 15719 var magnifySize = Math.min(this.configuration.magnifySize, canvas.width, canvas.height); 15720 var magnificationLevel = this.configuration.magnificationLevel; 15721 magnifyCanvas.width = magnifySize; 15722 magnifyCanvas.height = magnifySize; // Constrain drag movement to zoomed image boundaries 15723 15724 canvasLocation.x = Math.max(canvasLocation.x, 0.5 * magnifySize / magnificationLevel); 15725 canvasLocation.x = Math.min(canvasLocation.x, canvas.width - 0.5 * magnifySize / magnificationLevel); 15726 canvasLocation.y = Math.max(canvasLocation.y, 0.5 * magnifySize / magnificationLevel); 15727 canvasLocation.y = Math.min(canvasLocation.y, canvas.height - 0.5 * magnifySize / magnificationLevel); 15728 var copyFrom = { 15729 x: canvasLocation.x * magnificationLevel - 0.5 * magnifySize, 15730 y: canvasLocation.y * magnificationLevel - 0.5 * magnifySize 15731 }; 15732 copyFrom.x = Math.max(copyFrom.x, 0); 15733 copyFrom.y = Math.max(copyFrom.y, 0); 15734 context.drawImage(this.zoomCanvas, copyFrom.x, copyFrom.y, magnifySize, magnifySize, 0, 0, magnifySize, magnifySize); // Place the magnification tool at the same location as the pointer 15735 15736 var touchOffset = evt.detail.isTouchEvent ? 120 : 0; 15737 var magnifyPosition = { 15738 top: Math.max(canvasLocation.y - 0.5 * magnifySize - touchOffset, 0), 15739 left: Math.max(canvasLocation.x - 0.5 * magnifySize, 0) 15740 }; // Get full magnifier dimensions with borders 15741 15742 var magnifierBox = magnifyCanvas.getBoundingClientRect(); // Constrain magnifier to canvas boundaries 15743 15744 magnifyPosition.top = Math.min(magnifyPosition.top, canvas.height - magnifierBox.height); 15745 magnifyPosition.left = Math.min(magnifyPosition.left, canvas.width - magnifierBox.width); 15746 magnifyCanvas.style.top = "".concat(magnifyPosition.top, "px"); 15747 magnifyCanvas.style.left = "".concat(magnifyPosition.left, "px"); 15748 magnifyCanvas.style.display = 'block'; 15749 } 15750 /** 15751 * Creates a cornerstone enabled element, and renders the target image at the 15752 * desired magnification level using it. 15753 * 15754 * @private 15755 * @param {*} evt 15756 * @returns {void} 15757 */ 15758 15759 }, { 15760 key: "_drawZoomedElement", 15761 value: function _drawZoomedElement(evt) { 15762 var element = evt.detail.element; 15763 var enabledElement = evt.detail.enabledElement; 15764 15765 if (enabledElement === undefined) { 15766 enabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone.getEnabledElement(element); 15767 } 15768 15769 var magnificationLevel = this.configuration.magnificationLevel; 15770 var origCanvas = enabledElement.canvas; 15771 var image = enabledElement.image; // Create a new cornerstone enabledElement 15772 15773 if (!this.zoomElement) { 15774 this.zoomElement = document.createElement('div'); 15775 this.zoomElement.width = origCanvas.width * magnificationLevel; 15776 this.zoomElement.height = origCanvas.height * magnificationLevel; 15777 _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone.enable(this.zoomElement, enabledElement.options); 15778 } 15779 15780 var zoomEnabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone.getEnabledElement(this.zoomElement); 15781 var viewport = _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone.getViewport(enabledElement.element); 15782 this.zoomCanvas = zoomEnabledElement.canvas; 15783 this.zoomCanvas.width = origCanvas.width * magnificationLevel; 15784 this.zoomCanvas.height = origCanvas.height * magnificationLevel; 15785 zoomEnabledElement.viewport = Object.assign({}, viewport); // Update it's viewport to render at desired magnification level 15786 15787 viewport.scale *= magnificationLevel; 15788 _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone.displayImage(this.zoomElement, image); 15789 _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone.setViewport(this.zoomElement, viewport); // To do enable annotation tools for zoomElement 15790 } 15791 /** 15792 * Removes the canvas and associated enabled element that's 15793 * used to render the zoomed image. 15794 * @returns {void} 15795 */ 15796 15797 }, { 15798 key: "_removeZoomElement", 15799 value: function _removeZoomElement() { 15800 if (this.zoomElement !== undefined) { 15801 _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone.disable(this.zoomCanvas); 15802 this.zoomElement = undefined; 15803 this.zoomCanvas = undefined; 15804 } 15805 } 15806 /** 15807 * The canvas used to render the zoomed image. 15808 * It will be displayed and clipped inside the magnifying glass frame/element. 15809 * 15810 * @private 15811 * 15812 * @param {*} element 15813 * @returns {void} 15814 */ 15815 15816 }, { 15817 key: "_createMagnificationCanvas", 15818 value: function _createMagnificationCanvas(element) { 15819 // If the magnifying glass canvas doesn't already exist 15820 if (element.querySelector('.magnifyTool') === null) { 15821 // Create a canvas and append it as a child to the element 15822 var magnifyCanvas = document.createElement('canvas'); // The magnifyTool class is used to find the canvas later on 15823 // Make sure position is absolute so the canvas can follow the mouse / touch 15824 15825 magnifyCanvas.classList.add('magnifyTool'); 15826 magnifyCanvas.width = this.configuration.magnifySize; 15827 magnifyCanvas.height = this.configuration.magnifySize; 15828 magnifyCanvas.style.position = 'absolute'; 15829 magnifyCanvas.style.display = 'none'; 15830 element.appendChild(magnifyCanvas); 15831 } 15832 } 15833 /** 15834 * 15835 * 15836 * @param {*} element 15837 * @returns {void} 15838 */ 15839 15840 }, { 15841 key: "_destroyMagnificationCanvas", 15842 value: function _destroyMagnificationCanvas(element) { 15843 var magnifyCanvas = element.querySelector('.magnifyTool'); 15844 15845 if (magnifyCanvas) { 15846 element.removeChild(magnifyCanvas); 15847 } 15848 } 15849 }]); 15850 15851 return MagnifyTool; 15852}(_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_8__["default"]); 15853 15854 15855 15856/***/ }), 15857
15858/***/ "./tools/PanMultiTouchTool.js": 15859/*!************************************!*\ 15860 !*** ./tools/PanMultiTouchTool.js ***! 15861 \************************************/ 15862/*! exports provided: default */ 15863/***/ (function(module, __webpack_exports__, __webpack_require__) { 15864 15865"use strict"; 15866__webpack_require__.r(__webpack_exports__); 15867/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return PanMultiTouchTool; }); 15868/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js"); 15869/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); 15870/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js"); 15871/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); 15872/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js"); 15873/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); 15874/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js"); 15875/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); 15876/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/assertThisInitialized */ "../node_modules/@babel/runtime/helpers/assertThisInitialized.js"); 15877/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__); 15878/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js"); 15879/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__); 15880/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js"); 15881/* harmony import */ var _base_BaseTool_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./base/BaseTool.js */ "./tools/base/BaseTool.js"); 15882 15883 15884 15885 15886 15887 15888 15889 15890/** 15891 * @public 15892 * @class PanMultiTouchTool 15893 * @memberof Tools 15894 * 15895 * @classdesc Tool for panning the image using multi-touch. 15896 * @extends Tools.Base.BaseTool 15897 */ 15898 15899var PanMultiTouchTool = 15900/*#__PURE__*/ 15901function (_BaseTool) { 15902 _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(PanMultiTouchTool, _BaseTool); 15903 15904 function PanMultiTouchTool() { 15905 var _this; 15906 15907 var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 15908 15909 _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, PanMultiTouchTool); 15910 15911 var defaultProps = { 15912 name: 'PanMultiTouch', 15913 supportedInteractionTypes: ['MultiTouch'], 15914 configuration: { 15915 touchPointers: 2 15916 } 15917 }; 15918 _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(PanMultiTouchTool).call(this, props, defaultProps)); // Touch 15919 15920 _this.multiTouchDragCallback = _this._dragCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this)); 15921 return _this; 15922 } 15923 15924 _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(PanMultiTouchTool, [{ 15925 key: "_dragCallback", 15926 value: function _dragCallback(evt) { 15927 var eventData = evt.detail; 15928 var element = eventData.element, 15929 viewport = eventData.viewport; 15930 15931 if (eventData.numPointers === this.configuration.touchPointers) { 15932 var translation = this._getTranslation(eventData); 15933 15934 this._applyTranslation(viewport, translation); 15935 15936 _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone.setViewport(element, viewport); 15937 } 15938 } 15939 }, { 15940 key: "_getTranslation", 15941 value: function _getTranslation(eventData) { 15942 var viewport = eventData.viewport, 15943 image = eventData.image, 15944 deltaPoints = eventData.deltaPoints; 15945 var widthScale = viewport.scale; 15946 var heightScale = viewport.scale; 15947 15948 if (image.rowPixelSpacing < image.columnPixelSpacing) { 15949 widthScale *= image.columnPixelSpacing / image.rowPixelSpacing; 15950 } else if (image.columnPixelSpacing < image.rowPixelSpacing) { 15951 heightScale *= image.rowPixelSpacing / image.columnPixelSpacing; 15952 } 15953 15954 return { 15955 x: deltaPoints.page.x / widthScale, 15956 y: deltaPoints.page.y / heightScale 15957 }; 15958 } 15959 }, { 15960 key: "_applyTranslation", 15961 value: function _applyTranslation(viewport, translation) { 15962 viewport.translation.x += translation.x; 15963 viewport.translation.y += translation.y; 15964 } 15965 }]); 15966 15967 return PanMultiTouchTool; 15968}(_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_7__["default"]); 15969 15970 15971 15972/***/ }), 15973
15974/***/ "./tools/PanTool.js": 15975/*!**************************!*\ 15976 !*** ./tools/PanTool.js ***! 15977 \**************************/ 15978/*! exports provided: default */ 15979/***/ (function(module, __webpack_exports__, __webpack_require__) { 15980 15981"use strict"; 15982__webpack_require__.r(__webpack_exports__); 15983/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return PanTool; }); 15984/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js"); 15985/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); 15986/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js"); 15987/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); 15988/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js"); 15989/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); 15990/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js"); 15991/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); 15992/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/assertThisInitialized */ "../node_modules/@babel/runtime/helpers/assertThisInitialized.js"); 15993/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__); 15994/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js"); 15995/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__); 15996/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./../externalModules.js */ "./externalModules.js"); 15997/* harmony import */ var _base_BaseTool_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./base/BaseTool.js */ "./tools/base/BaseTool.js"); 15998/* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./cursors/index.js */ "./tools/cursors/index.js"); 15999 16000 16001 16002 16003 16004 16005 16006 16007 16008/** 16009 * @public 16010 * @class PanTool 16011 * @memberof Tools 16012 * 16013 * @classdesc Tool for panning the image. 16014 * @extends Tools.Base.BaseTool 16015 */ 16016 16017var PanTool = 16018/*#__PURE__*/ 16019function (_BaseTool) { 16020 _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(PanTool, _BaseTool); 16021 16022 function PanTool() { 16023 var _this; 16024 16025 var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 16026 16027 _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, PanTool); 16028 16029 var defaultProps = { 16030 name: 'Pan', 16031 supportedInteractionTypes: ['Mouse', 'Touch'], 16032 svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_8__["panCursor"] 16033 }; 16034 _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(PanTool).call(this, props, defaultProps)); // Touch 16035 16036 _this.touchDragCallback = _this._dragCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this)); // Mouse 16037 16038 _this.mouseDragCallback = _this._dragCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this)); 16039 return _this; 16040 } 16041 16042 _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(PanTool, [{ 16043 key: "_dragCallback", 16044 value: function _dragCallback(evt) { 16045 var eventData = evt.detail; 16046 var element = eventData.element, 16047 viewport = eventData.viewport; 16048 16049 var translation = this._getTranslation(eventData); 16050 16051 this._applyTranslation(viewport, translation); 16052 16053 _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone.setViewport(element, viewport); 16054 } 16055 }, { 16056 key: "_getTranslation", 16057 value: function _getTranslation(eventData) { 16058 var viewport = eventData.viewport, 16059 image = eventData.image, 16060 deltaPoints = eventData.deltaPoints; 16061 var widthScale = viewport.scale; 16062 var heightScale = viewport.scale; 16063 16064 if (image.rowPixelSpacing < image.columnPixelSpacing) { 16065 widthScale *= image.columnPixelSpacing / image.rowPixelSpacing; 16066 } else if (image.columnPixelSpacing < image.rowPixelSpacing) { 16067 heightScale *= image.rowPixelSpacing / image.columnPixelSpacing; 16068 } 16069 16070 return { 16071 x: deltaPoints.page.x / widthScale, 16072 y: deltaPoints.page.y / heightScale 16073 }; 16074 } 16075 }, { 16076 key: "_applyTranslation", 16077 value: function _applyTranslation(viewport, translation) { 16078 viewport.translation.x += translation.x; 16079 viewport.translation.y += translation.y; 16080 } 16081 }]); 16082 16083 return PanTool; 16084}(_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_7__["default"]); 16085 16086 16087 16088/***/ }), 16089
16090/***/ "./tools/ReferenceLinesTool.js": 16091/*!*************************************!*\ 16092 !*** ./tools/ReferenceLinesTool.js ***! 16093 \*************************************/ 16094/*! exports provided: default */ 16095/***/ (function(module, __webpack_exports__, __webpack_require__) { 16096 16097"use strict"; 16098__webpack_require__.r(__webpack_exports__); 16099/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ReferenceLinesTool; }); 16100/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/regenerator */ "../node_modules/@babel/runtime/regenerator/index.js"); 16101/* harmony import */ var _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0__); 16102/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ "../node_modules/@babel/runtime/helpers/asyncToGenerator.js"); 16103/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1__); 16104/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js"); 16105/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_2__); 16106/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js"); 16107/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_3__); 16108/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js"); 16109/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_4__); 16110/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js"); 16111/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_5__); 16112/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js"); 16113/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_6__); 16114/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./../externalModules.js */ "./externalModules.js"); 16115/* harmony import */ var _base_BaseTool_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./base/BaseTool.js */ "./tools/base/BaseTool.js"); 16116/* harmony import */ var _drawing_index_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../drawing/index.js */ "./drawing/index.js"); 16117/* harmony import */ var _referenceLines_renderActiveReferenceLine_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./referenceLines/renderActiveReferenceLine.js */ "./tools/referenceLines/renderActiveReferenceLine.js"); 16118/* harmony import */ var _util_wait_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../util/wait.js */ "./util/wait.js"); 16119/* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../util/logger.js */ "./util/logger.js"); 16120 16121 16122 16123 16124 16125 16126 16127 16128 16129 16130 16131 16132 16133var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_12__["getLogger"])('tools:ReferenceLinesTool'); 16134/** 16135 * When enabled, this tool will display references lines for each source 16136 * enabledElement in the provided synchronizer. This tool can also be c
16136onfigured 16137 * to use a custom renderer for alternative reference line rendering behavior 16138 * 16139 * TODO: Need to watch for configuration changes to update ToolState 16140 * TODO: 16141 * 16142 * @export @public @class 16143 * @name ReferenceLinesTool 16144 * @classdesc Tool for displaying reference lines of other enabledElements 16145 * @extends Tools.Base.BaseTool 16146 */ 16147 16148var ReferenceLinesTool = 16149/*#__PURE__*/ 16150function (_BaseTool) { 16151 _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_6___default()(ReferenceLinesTool, _BaseTool); 16152 16153 function ReferenceLinesTool() { 16154 var _this; 16155 16156 var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 16157 16158 _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_2___default()(this, ReferenceLinesTool); 16159 16160 var defaultProps = { 16161 name: 'ReferenceLines', 16162 mixins: ['enabledOrDisabledBinaryTool'], 16163 configuration: { 16164 renderer: _referenceLines_renderActiveReferenceLine_js__WEBPACK_IMPORTED_MODULE_10__["default"] 16165 } 16166 }; 16167 _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_4___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_5___default()(ReferenceLinesTool).call(this, props, defaultProps)); 16168 _this.renderer = null; 16169 _this.synchronizationContext = null; 16170 return _this; 16171 } 16172 16173 _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_3___default()(ReferenceLinesTool, [{ 16174 key: "enabledCallback", 16175 value: function () { 16176 var _enabledCallback = _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_1___default()( 16177 /*#__PURE__*/ 16178 _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.mark(function _callee(element) { 16179 var _ref, 16180 synchronizationContext, 16181 renderer, 16182 enabledElement, 16183 _args = arguments; 16184 16185 return _babel_runtime_regenerator__WEBPACK_IMPORTED_MODULE_0___default.a.wrap(function _callee$(_context) { 16186 while (1) { 16187 switch (_context.prev = _context.next) { 16188 case 0: 16189 _ref = _args.length > 1 && _args[1] !== undefined ? _args[1] : {}, synchronizationContext = _ref.synchronizationContext; 16190 renderer = this.configuration.renderer; 16191 _context.next = 4; 16192 return Object(_util_wait_js__WEBPACK_IMPORTED_MODULE_11__["waitForEnabledElementImageToLoad"])(element); 16193 16194 case 4: 16195 enabledElement = _context.sent; 16196 16197 if (!(!enabledElement || !renderer || !synchronizationContext)) { 16198 _context.next = 8; 16199 break; 16200 } 16201 16202 // TODO: Unable to add tool state, image never loaded. 16203 // Should we `setToolDisabledForElement` here? 16204 logger.warn("Unable to enable ".concat(this.name, ". Exiting enable callback. Tool will be enabled, but will not render.")); 16205 return _context.abrupt("return"); 16206 16207 case 8: 16208 this.renderer = renderer; 16209 this.synchronizationContext = synchronizationContext; 16210 this.forceImageUpdate(element); 16211 16212 case 11: 16213 case "end": 16214 return _context.stop(); 16215 } 16216 } 16217 }, _callee, this); 16218 })); 16219 16220 function enabledCallback(_x) { 16221 return _enabledCallback.apply(this, arguments); 16222 } 16223 16224 return enabledCallback; 16225 }() 16226 }, { 16227 key: "disabledCallback", 16228 value: function disabledCallback(element) { 16229 this.forceImageUpdate(element); 16230 } 16231 }, { 16232 key: "forceImageUpdate", 16233 value: function forceImageUpdate(element) { 16234 var enabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.getEnabledElement(element); 16235 16236 if (enabledElement.image) { 16237 _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(element); 16238 } 16239 } 16240 }, { 16241 key: "renderToolData", 16242 value: function renderToolData(evt) { 16243 var _this2 = this; 16244 16245 var eventData = evt.detail; // No renderer or synch context? Adios 16246 16247 if (!this.renderer || !this.synchronizationContext) { 16248 return; 16249 } // Get the enabled elements associated with this synchronization context and draw them 16250 16251 16252 var enabledElements = this.synchronizationContext.getSourceElements(); 16253 var context = Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_9__["getNewContext"])(eventData.canvasContext.canvas); 16254 _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.setToPixelCoordinateSystem(eventData.enabledElement, context);
16255 enabledElements.forEach(function (referenceEnabledElement) { 16256 // Don't draw ourselves 16257 if (referenceEnabledElement === evt.currentTarget) { 16258 return; 16259 } // Render it 16260 16261 16262 _this2.renderer(context, eventData, evt.currentTarget, referenceEnabledElement); 16263 }); 16264 } 16265 }]); 16266 16267 return ReferenceLinesTool; 16268}(_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_8__["default"]); 16269 16270 16271 16272/***/ }), 16273
16274/***/ "./tools/RotateTool.js": 16275/*!*****************************!*\ 16276 !*** ./tools/RotateTool.js ***! 16277 \*****************************/ 16278/*! exports provided: default */ 16279/***/ (function(module, __webpack_exports__, __webpack_require__) { 16280 16281"use strict"; 16282__webpack_require__.r(__webpack_exports__); 16283/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return RotateTool; }); 16284/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js"); 16285/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); 16286/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js"); 16287/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); 16288/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js"); 16289/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); 16290/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js"); 16291/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); 16292/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js"); 16293/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__); 16294/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./../externalModules.js */ "./externalModules.js"); 16295/* harmony import */ var _base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./base/BaseTool.js */ "./tools/base/BaseTool.js"); 16296/* harmony import */ var _util_angleBetweenPoints_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../util/angleBetweenPoints.js */ "./util/angleBetweenPoints.js"); 16297/* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./cursors/index.js */ "./tools/cursors/index.js"); 16298 16299 16300 16301 16302 16303 16304 16305 16306 16307/** 16308 * @public 16309 * @class RotateTool 16310 * @memberof Tools 16311 * 16312 * @classdesc Tool for rotating the image. 16313 * @extends Tools.Base.BaseTool 16314 */ 16315 16316var RotateTool = 16317/*#__PURE__*/ 16318function (_BaseTool) { 16319 _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(RotateTool, _BaseTool); 16320 16321 function RotateTool() { 16322 var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 16323 16324 _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, RotateTool); 16325 16326 var defaultProps = { 16327 name: 'Rotate', 16328 strategies: { 16329 default: defaultStrategy, 16330 horizontal: horizontalStrategy, 16331 vertical: verticalStrategy 16332 }, 16333 defaultStrategy: 'default', 16334 supportedInteractionTypes: ['Mouse', 'Touch'], 16335 svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_8__["rotateCursor"] 16336 }; 16337 return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(RotateTool).call(this, props, defaultProps)); 16338 } 16339 16340 _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(RotateTool, [{ 16341 key: "touchDragCallback", 16342 value: function touchDragCallback(evt) { 16343 this.dragCallback(evt); 16344 } 16345 }, { 16346 key: "mouseDragCallback", 16347 value: function mouseDragCallback(evt) { 16348 this.dragCallback(evt); 16349 } 16350 }, { 16351 key: "postMouseDownCallback", 16352 value: function postMouseDownCallback(evt) { 16353 this.initialRotation = evt.detail.viewport.rotation; 16354 } 16355 }, { 16356 key: "dragCallback", 16357 value: function dragCallback(evt) { 16358 evt.detail.viewport.initialRotation = this.initialRotation; 16359 this.applyActiveStrategy(evt, this.configuration); 16360 _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.setViewport(evt.detail.element, evt.detail.viewport); 16361 } 16362 }]); 16363 16364 return RotateTool; 16365}(_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]); 16366 16367 16368 16369var defaultStrategy = function defaultStrategy(evt) { 16370 var eventData = evt.detail; 16371 var element = eventData.element, 16372 viewport = eventData.viewport; 16373 var initialRotation = viewport.initialRotation; // Calculate the center of the image 16374 16375 var rect = element.getBoundingClientRect(element); 16376 var width = element.clientWidth, 16377 height = element.clientHeight; 16378 var initialPoints = { 16379 x: eventData.startPoints.client.x, 16380 y: eventData.startPoints.client.y 16381 }; 16382 var scale = viewport.scale, 16383 translation = viewport.translation; 16384 var centerPoints = { 16385 x: rect.left + width / 2 + translation.x * scale, 16386 y: rect.top + height / 2 + translation.y * scale 16387 }; 16388 var currentPoints = { 16389 x: eventData.currentPoints.client.x, 16390 y: eventData.currentPoints.client.y 16391 }; 16392 var angleInfo = Object(_util_angleBetweenPoints_js__WEBPACK_IMPORTED_MODULE_7__["default"])(centerPoints, initialPoints, currentPoints); 16393 16394 if (angleInfo.direction < 0) { 16395 angleInfo.angle = -angleInfo.angle; 16396 } 16397 16398 viewport.rotation = initialRotation + angleInfo.angle; 16399}; 16400 16401var horizontalStrategy = function horizontalStrategy(evt) { 16402 var eventData = evt.detail; 16403 var viewport = eventData.viewport, 16404 deltaPoints = eventData.deltaPoints; 16405 viewport.rotation += deltaPoints.page.x / viewport.scale; 16406}; 16407 16408var verticalStrategy = function verticalStrategy(evt) { 16409 var eventData = evt.detail; 16410 var viewport = eventData.viewport, 16411 deltaPoints = eventData.deltaPoints; 16412 viewport.rotation += deltaPoints.page.y / viewport.scale; 16413}; 16414 16415/***/ }), 16416
16417/***/ "./tools/RotateTouchTool.js": 16418/*!**********************************!*\ 16419 !*** ./tools/RotateTouchTool.js ***! 16420 \**********************************/ 16421/*! exports provided: default */ 16422/***/ (function(module, __webpack_exports__, __webpack_require__) { 16423 16424"use strict"; 16425__webpack_require__.r(__webpack_exports__); 16426/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return RotateTouchTool; }); 16427/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js"); 16428/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); 16429/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js"); 16430/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); 16431/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js"); 16432/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); 16433/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js"); 16434/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); 16435/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js"); 16436/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__); 16437/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./../externalModules.js */ "./externalModules.js"); 16438/* harmony import */ var _base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./base/BaseTool.js */ "./tools/base/BaseTool.js"); 16439 16440 16441 16442 16443 16444 16445 16446/** 16447 * @public 16448 * @class RotateTouchTool 16449 * @memberof Tools 16450 * 16451 * @classdesc Tool for rotating the image using touch. 16452 * @extends Tools.Base.BaseTool 16453 */ 16454 16455var RotateTouchTool = 16456/*#__PURE__*/ 16457function (_BaseTool) { 16458 _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(RotateTouchTool, _BaseTool); 16459 16460 function RotateTouchTool() { 16461 var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 16462 16463 _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, RotateTouchTool); 16464 16465 var defaultProps = { 16466 name: 'RotateTouch', 16467 supportedInteractionTypes: ['TouchRotate'] 16468 }; 16469 return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(RotateTouchTool).call(this, props, defaultProps)); 16470 } 16471 16472 _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(RotateTouchTool, [{ 16473 key: "touchRotateCallback", 16474 value: function touchRotateCallback(evt) { 16475 var eventData = evt.detail; 16476 var element = eventData.element, 16477 viewport = eventData.viewport, 16478 rotation = eventData.rotation; 16479 viewport.rotation += rotation; 16480 _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.setViewport(element, viewport); 16481 } 16482 }]); 16483 16484 return RotateTouchTool; 16485}(_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]); 16486 16487 16488 16489/***/ }), 16490
16491/***/ "./tools/ScaleOverlayTool.js": 16492/*!***********************************!*\ 16493 !*** ./tools/ScaleOverlayTool.js ***! 16494 \***********************************/ 16495/*! exports provided: default */ 16496/***/ (function(module, __webpack_exports__, __webpack_require__) { 16497 16498"use strict"; 16499__webpack_require__.r(__webpack_exports__); 16500/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ScaleOverlayTool; }); 16501/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js"); 16502/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); 16503/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js"); 16504/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); 16505/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js"); 16506/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); 16507/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js"); 16508/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); 16509/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js"); 16510/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__); 16511/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js"); 16512/* harmony import */ var _base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./base/BaseTool.js */ "./tools/base/BaseTool.js"); 16513/* harmony import */ var _drawing_index_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../drawing/index.js */ "./drawing/index.js"); 16514/* harmony import */ var _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../stateManagement/toolStyle.js */ "./stateManagement/toolStyle.js"); 16515/* harmony import */ var _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../stateManagement/toolColors.js */ "./stateManagement/toolColors.js"); 16516/* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../util/logger.js */ "./util/logger.js"); 16517 16518 16519 16520 16521 16522 16523 // Drawing 16524 16525 16526 16527 16528 16529var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_10__["getLogger"])('tools:ScaleOverlayTool'); 16530/** 16531 * @public 16532 * @class ScaleOverlayTool 16533 * @memberof Tools 16534 * 16535 * @classdesc Tool for displaying a scale overlay on the image. 16536 * @extends Tools.Base.BaseTool 16537 */ 16538 16539var ScaleOverlayTool = 16540/*#__PURE__*/ 16541function (_BaseTool) { 16542 _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(ScaleOverlayTool, _BaseTool); 16543 16544 function ScaleOverlayTool() { 16545 var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 16546 16547 _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, ScaleOverlayTool); 16548 16549 var defaultProps = { 16550 name: 'ScaleOverlay', 16551 configuration: { 16552 minorTickLength: 12.5, 16553 majorTickLength: 25 16554 }, 16555 mixins: ['enabledOrDisabledBinaryTool'] 16556 }; 16557 return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(ScaleOverlayTool).call(this, props, defaultProps)); 16558 } 16559 16560 _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(ScaleOverlayTool, [{ 16561 key: "enabledCallback", 16562 value: function enabledCallback(element) { 16563 this.forceImageUpdate(element); 16564 } 16565 }, { 16566 key: "disabledCallback", 16567 value: function disabledCallback(element) { 16568 this.forceImageUpdate(element); 16569 } 16570 }, { 16571 key: "forceImageUpdate", 16572 value: function forceImageUpdate(element) { 16573 var enabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.getEnabledElement(element); 16574 16575 if (enabledElement.image) { 16576 _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.updateImage(element); 16577 } 16578 } 16579 }, { 16580 key: "renderToolData", 16581 value: function renderToolData(evt) { 16582 var eventData = evt.detail; 16583 var context = Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["getNewContext"])(eventData.canvasContext.canvas); 16584 var image = eventData.image, 16585 viewport = eventData.viewport, 16586 element = eventData.element;
16587 var rowPixelSpacing = image.rowPixelSpacing; 16588 var colPixelSpacing = image.columnPixelSpacing; 16589 var imagePlane = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.metaData.get('imagePlaneModule', image.imageId); 16590 16591 if (imagePlane) { 16592 rowPixelSpacing = imagePlane.rowPixelSpacing || imagePlane.rowImagePixelSpacing; 16593 colPixelSpacing = imagePlane.columnPixelSpacing || imagePlane.colImagePixelSpacing; 16594 } // Check whether pixel spacing is defined 16595 16596 16597 if (!rowPixelSpacing || !colPixelSpacing) { 16598 logger.warn("unable to define rowPixelSpacing or colPixelSpacing from data on ".concat(this.name, "'s renderToolData")); 16599 return; 16600 } 16601 16602 var canvasSize = { 16603 width: context.canvas.width, 16604 height: context.canvas.height 16605 }; // Distance between intervals is 10mm 16606 16607 var verticalIntervalScale = 10.0 / rowPixelSpacing * viewport.scale; 16608 var horizontalIntervalScale = 10.0 / colPixelSpacing * viewport.scale; // 0.1 and 0.05 gives margin to horizontal and vertical lines 16609 16610 var hscaleBounds = computeScaleBounds(canvasSize, 0.25, 0.05); 16611 var vscaleBounds = computeScaleBounds(canvasSize, 0.05, 0.15); 16612 16613 if (!canvasSize.width || !canvasSize.height || !hscaleBounds || !vscaleBounds) { 16614 return; 16615 } 16616 16617 var color = _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_9__["default"].getToolColor(); 16618 var lineWidth = _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_8__["default"].getToolW
16618idth(); 16619 var imageAttributes = Object.assign({}, { 16620 hscaleBounds: hscaleBounds, 16621 vscaleBounds: vscaleBounds, 16622 verticalMinorTick: verticalIntervalScale, 16623 horizontalMinorTick: horizontalIntervalScale, 16624 verticalLine: { 16625 start: { 16626 x: vscaleBounds.bottomRight.x, 16627 y: vscaleBounds.topLeft.y 16628 }, 16629 end: { 16630 x: vscaleBounds.bottomRight.x, 16631 y: vscaleBounds.bottomRight.y 16632 } 16633 }, 16634 horizontalLine: { 16635 start: { 16636 x: hscaleBounds.topLeft.x, 16637 y: hscaleBounds.bottomRight.y 16638 }, 16639 end: { 16640 x: hscaleBounds.bottomRight.x, 16641 y: hscaleBounds.bottomRight.y 16642 } 16643 }, 16644 color: color, 16645 lineWidth: lineWidth 16646 }, this.configuration); 16647 Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["draw"])(context, function (context) { 16648 Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["setShadow"])(context, imageAttributes); // Draw vertical line 16649 16650 Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["drawLine"])(context, element, imageAttributes.verticalLine.start, imageAttributes.verticalLine.end, { 16651 color: color, 16652 lineWidth: lineWidth 16653 }, 'canvas'); 16654 drawVerticalScalebarIntervals(context, element, imageAttributes); // Draw horizontal line 16655 16656 Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["drawLine"])(context, element, imageAttributes.horizontalLine.start, imageAttributes.horizontalLine.end, { 16657 color: color, 16658 lineWidth: lineWidth 16659 }, 'canvas'); 16660 drawHorizontalScalebarIntervals(context, element, imageAttributes); 16661 }); 16662 } 16663 }]); 16664 16665 return ScaleOverlayTool; 16666}(_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]); 16667/** 16668 * Computes the max bound for scales on the image 16669 * @param {{width: number, height: number}} canvasSize 16670 * @param {number} horizontalReduction 16671 * @param {number} verticalReduction 16672 * @returns {Object.<string, { x:number, y:number }>} 16673 */ 16674 16675 16676 16677 16678var computeScaleBounds = function computeScaleBounds(canvasSize, horizontalReduction, verticalReduction) { 16679 var hReduction = horizontalReduction * Math.min(1000, canvasSize.width); 16680 var vReduction = verticalReduction * Math.min(1000, canvasSize.height); 16681 var canvasBounds = { 16682 left: hReduction, 16683 top: vReduction, 16684 width: canvasSize.width - 2 * hReduction, 16685 height: canvasSize.height - 2 * vReduction 16686 }; 16687 return { 16688 topLeft: { 16689 x: canvasBounds.left, 16690 y: canvasBounds.top 16691 }, 16692 bottomRight: { 16693 x: canvasBounds.left + canvasBounds.width, 16694 y: canvasBounds.top + canvasBounds.height 16695 } 16696 }; 16697}; 16698/** 16699 * @param {CanvasRenderingContext2D} context 16700 * @param {HTMLElement} element 16701 * @param {Object} imageAttributes 16702 * @returns {void} 16703 */ 16704 16705 16706var drawVerticalScalebarIntervals = function drawVerticalScalebarIntervals(context, element, imageAttributes) { 16707 var i = 0; 16708 16709 while (imageAttributes.verticalLine.start.y + i * imageAttributes.verticalMinorTick <= imageAttributes.vscaleBounds.bottomRight.y) { 16710 var color = imageAttributes.color, 16711 lineWidth = imageAttributes.lineWidth; 16712 var startPoint = { 16713 x: imageAttributes.verticalLine.start.x, 16714 y: imageAttributes.verticalLine.start.y + i * imageAttributes.verticalMinorTick 16715 }; 16716 var endPoint = { 16717 x: 0, 16718 y: imageAttributes.verticalLine.start.y + i * imageAttributes.verticalMinorTick 16719 }; 16720 16721 if (i % 5 === 0) { 16722 endPoint.x = imageAttributes.verticalLine.start.x - imageAttributes.majorTickLength; 16723 } else { 16724 endPoint.x = imageAttributes.verticalLine.start.x - imageAttributes.minorTickLength; 16725 } 16726 16727 Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["drawLine"])(context, element, startPoint, endPoint, { 16728 color: color, 16729 lineWidth: lineWidth 16730 }, 'canvas'); 16731 i++; 16732 } 16733}; 16734/** 16735 * @param {CanvasRenderingContext2D} context 16736 * @param {HTMLElement} element 16737 * @param {Object} imageAttributes 16738 * @returns {void} 16739 */ 16740 16741 16742var drawHorizontalScalebarIntervals = function drawHorizontalScalebarIntervals(context, element, imageAttributes) { 16743 var i = 0; 16744 16745 while (imageAttributes.horizontalLine.start.x + i * imageAttributes.horizontalMinorTick <= imageAttributes.hscaleBounds.bottomRight.x) { 16746 var color = imageAttributes.color, 16747 lineWidth = imageAttributes.lineWidth; 16748 var startPoint = { 16749 x: imageAttributes.horizontalLine.start.x + i * imageAttributes.horizontalMinorTick, 16750 y: imageAttributes.horizontalLine.start.y 16751 }; 16752 var endPoint = { 16753 x: imageAttributes.horizontalLine.start.x + i * imageAttributes.horizontalMinorTick, 16754 y: 0 16755 }; 16756 16757 if (i % 5 === 0) { 16758 endPoint.y = imageAttributes.horizontalLine.start.y - imageAttributes.majorTickLength; 16759 } else { 16760 endPoint.y = imageAttributes.horizontalLine.start.y - imageAttributes.minorTickLength; 16761 } 16762 16763 Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_7__["drawLine"])(context, element, startPoint, endPoint, { 16764 color: color, 16765 lineWidth: lineWidth 16766 }, 'canvas'); 16767 i++; 16768 } 16769}; 16770 16771/***/ }), 16772
16773/***/ "./tools/StackScrollMouseWheelTool.js": 16774/*!********************************************!*\ 16775 !*** ./tools/StackScrollMouseWheelTool.js ***! 16776 \********************************************/ 16777/*! exports provided: default */ 16778/***/ (function(module, __webpack_exports__, __webpack_require__) { 16779 16780"use strict"; 16781__webpack_require__.r(__webpack_exports__); 16782/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return StackScrollMouseWheelTool; }); 16783/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js"); 16784/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); 16785/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js"); 16786/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); 16787/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js"); 16788/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); 16789/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js"); 16790/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); 16791/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js"); 16792/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__); 16793/* harmony import */ var _base_BaseTool_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./base/BaseTool.js */ "./tools/base/BaseTool.js"); 16794/* harmony import */ var _util_scroll_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../util/scroll.js */ "./util/scroll.js"); 16795 16796 16797 16798 16799 16800 16801 16802/** 16803 * @public 16804 * @class StackScrollMouseWheelTool 16805 * @memberof Tools 16806 * 16807 * @classdesc Tool for scrolling through a series using the mouse wheel. 16808 * @extends Tools.Base.BaseTool 16809 */ 16810 16811var StackScrollMouseWheelTool = 16812/*#__PURE__*/ 16813function (_BaseTool) { 16814 _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(StackScrollMouseWheelTool, _BaseTool); 16815 16816 function StackScrollMouseWheelTool() { 16817 var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 16818 16819 _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, StackScrollMouseWheelTool); 16820 16821 var defaultProps = { 16822 name: 'StackScrollMouseWheel', 16823 supportedInteractionTypes: ['MouseWheel'], 16824 configuration: { 16825 loop: true, 16826 allowSkipping: true, 16827 invert: false 16828 } 16829 }; 16830 return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(StackScrollMouseWheelTool).call(this, props, defaultProps)); 16831 } 16832 16833 _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(StackScrollMouseWheelTool, [{ 16834 key: "mouseWheelCallback", 16835 value: function mouseWheelCallback(evt) { 16836 var _evt$detail = evt.detail, 16837 images = _evt$detail.direction, 16838 element = _evt$detail.element; 16839 var _this$configuration = this.configuration, 16840 loop = _this$configuration.loop, 16841 allowSkipping = _this$configuration.allowSkipping, 16842 invert = _this$configuration.invert; 16843 var direction = invert ? -images : images; 16844 Object(_util_scroll_js__WEBPACK_IMPORTED_MODULE_6__["default"])(element, direction, loop, allowSkipping); 16845 } 16846 }]); 16847 16848 return StackScrollMouseWheelTool; 16849}(_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_5__["default"]); 16850 16851 16852 16853/***/ }), 16854
16855/***/ "./tools/StackScrollMultiTouchTool.js": 16856/*!********************************************!*\ 16857 !*** ./tools/StackScrollMultiTouchTool.js ***! 16858 \********************************************/ 16859/*! exports provided: default */ 16860/***/ (function(module, __webpack_exports__, __webpack_require__) { 16861 16862"use strict"; 16863__webpack_require__.r(__webpack_exports__); 16864/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return StackScrollMultiTouchTool; }); 16865/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js"); 16866/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); 16867/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js"); 16868/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); 16869/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js"); 16870/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); 16871/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js"); 16872/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); 16873/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/assertThisInitialized */ "../node_modules/@babel/runtime/helpers/assertThisInitialized.js"); 16874/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__); 16875/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js"); 16876/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__); 16877/* harmony import */ var _base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./base/BaseTool.js */ "./tools/base/BaseTool.js"); 16878/* harmony import */ var _util_scroll_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../util/scroll.js */ "./util/scroll.js"); 16879/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../stateManagement/toolState.js */ "./stateManagement/toolState.js"); 16880/* harmony import */ var _toolOptions_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../toolOptions.js */ "./toolOptions.js"); 16881 16882 16883 16884 16885 16886 16887 16888 16889 16890 16891/** 16892 * @public 16893 * @class StackScrollMultiTouchTool 16894 * @memberof Tools 16895 * 16896 * @classdesc Tool for scrolling through a series using multi-touch. 16897 * @extends Tools.Base.BaseTool 16898 */ 16899 16900var StackScrollMultiTouchTool = 16901/*#__PURE__*/ 16902function (_BaseTool) { 16903 _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(StackScrollMultiTouchTool, _BaseTool); 16904 16905 function StackScrollMultiTouchTool() { 16906 var _this; 16907 16908 var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 16909 16910 _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, StackScrollMultiTouchTool); 16911 16912 var defaultProps = { 16913 name: 'StackScrollMultiTouch', 16914 supportedInteractionTypes: ['MultiTouch'], 16915 configuration: { 16916 loop: false, 16917 allowSkipping: true, 16918 touchPointers: 3 16919 } 16920 }; 16921 _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(StackScrollMultiTouchTool).call(this, props, defaultProps)); 16922 _this.multiTouchDragCallback = _this._dragCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this)); 16923 return _this; 16924 } 16925 16926 _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(StackScrollMultiTouchTool, [{ 16927 key: "_dragCallback", 16928 value: function _dragCallback(evt) { 16929 var eventData = evt.detail; 16930 16931 if (eventData.numPointers === this.configuration.touchPointers) { 16932 var element = eventData.element, 16933 deltaPoints = eventData.deltaPoints; 16934 var _this$configuration = this.configuration, 16935 loop = _this$configuration.loop, 16936 allowSkipping = _this$configuration.allowSkipping; 16937 var options = Object(_toolOptions_js__WEBPACK_IMPORTED_MODULE_9__["getToolOptions"])(this.name, element); 16938 16939 var pixelsPerImage = this._getPixelPerImage(element); 16940 16941 var deltaY = this._getDeltaY(element, deltaPoints.page.y); 16942 16943 if (!pixelsPerImage) { 16944 return; 16945 } 16946 16947 if (Math.abs(deltaY) >= pixelsPerImage) { 16948 var imageIdIndexOffset = Math.round(deltaY / pixelsPerImage); 16949 Object(_util_scroll_js__WEBPACK_IMPORTED_MODULE_7__["default"])(element, imageIdIndexOffset, loop, allowSkipping); 16950 options.deltaY = deltaY % pixelsPerImage; 16951 } else { 16952 options.deltaY = deltaY; 16953 } 16954 16955 Object(_toolOptions_js__WEBPACK_IMPORTED_MODULE_9__["setToolOptions"])(this.name, element, options); 16956 } 16957 } 16958 }, { 16959 key: "_getDeltaY", 16960 value: function _getDeltaY(element, deltaPointsY) { 16961 var options = Object(_toolOptions_js__WEBPACK_IMPORTED_MODULE_9__["getToolOptions"])(this.name, element); 16962 var deltaY = options.deltaY || 0; 16963 return deltaY + deltaPointsY; 16964 } 16965 }, { 16966 key: "_getPixelPerImage", 16967 value: function _getPixelPerImage(element) { 16968 var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_8__["getToolState"])(element, 'stack'); 16969 16970 if (!toolData || !toolData.data || !toolData.data.length) { 16971 return; 16972 } 16973 16974 var stackData = toolData.data[0]; 16975 var stackScrollSpeed = this.configuration.stackScrollSpeed; // The Math.max here makes it easier to mouseDrag-scroll small or really large image stacks 16976 16977 return stackScrollSpeed || Math.max(2, element.offsetHeight / Math.max(stackData.imageIds.length, 8)); 16978 } 16979 }]); 16980 16981 return StackScrollMultiTouchTool; 16982}(_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]); 16983 16984 16985 16986/***/ }), 16987
16988/***/ "./tools/StackScrollTool.js": 16989/*!**********************************!*\ 16990 !*** ./tools/StackScrollTool.js ***! 16991 \**********************************/ 16992/*! exports provided: default */ 16993/***/ (function(module, __webpack_exports__, __webpack_require__) { 16994 16995"use strict"; 16996__webpack_require__.r(__webpack_exports__); 16997/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return StackScrollTool; }); 16998/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js"); 16999/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); 17000/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js"); 17001/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); 17002/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js"); 17003/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); 17004/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js"); 17005/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); 17006/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/assertThisInitialized */ "../node_modules/@babel/runtime/helpers/assertThisInitialized.js"); 17007/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__); 17008/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js"); 17009/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__); 17010/* harmony import */ var _base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./base/BaseTool.js */ "./tools/base/BaseTool.js"); 17011/* harmony import */ var _util_scroll_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../util/scroll.js */ "./util/scroll.js"); 17012/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../stateManagement/toolState.js */ "./stateManagement/toolState.js"); 17013/* harmony import */ var _toolOptions_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../toolOptions.js */ "./toolOptions.js"); 17014/* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./cursors/index.js */ "./tools/cursors/index.js"); 17015 17016 17017 17018 17019 17020 17021 17022 17023 17024 17025 17026/** 17027 * @public 17028 * @class StackScrollTool 17029 * @memberof Tools 17030 * 17031 * @classdesc Tool for scrolling through a series. 17032 * @extends Tools.Base.BaseTool 17033 */ 17034 17035var StackScrollTool = 17036/*#__PURE__*/ 17037function (_BaseTool) { 17038 _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(StackScrollTool, _BaseTool); 17039 17040 function StackScrollTool() { 17041 var _this; 17042 17043 var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 17044 17045 _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, StackScrollTool); 17046 17047 var defaultProps = { 17048 name: 'StackScroll', 17049 supportedInteractionTypes: ['Mouse', 'Touch'], 17050 configuration: { 17051 loop: true, 17052 allowSkipping: true 17053 }, 17054 svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_10__["stackScrollCursor"] 17055 }; 17056 _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(StackScrollTool).
17056call(this, props, defaultProps)); 17057 _this.mouseDragCallback = _this._dragCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this)); 17058 _this.touchDragCallback = _this._dragCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this)); 17059 return _this; 17060 } 17061 17062 _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(StackScrollTool, [{ 17063 key: "_dragCallback", 17064 value: function _dragCallback(evt) { 17065 var eventData = evt.detail; 17066 var element = eventData.element, 17067 deltaPoints = eventData.deltaPoints; 17068 var _this$configuration = this.configuration, 17069 loop = _this$configuration.loop, 17070 allowSkipping = _this$configuration.allowSkipping; 17071 var options = Object(_toolOptions_js__WEBPACK_IMPORTED_MODULE_9__["getToolOptions"])(this.name, element); 17072 17073 var pixelsPerImage = this._getPixelPerImage(element); 17074 17075 var deltaY = this._getDeltaY(element, deltaPoints.page.y); 17076 17077 if (!pixelsPerImage) { 17078 return; 17079 } 17080 17081 if (Math.abs(deltaY) >= pixelsPerImage) { 17082 var imageIdIndexOffset = Math.round(deltaY / pixelsPerImage); 17083 Object(_util_scroll_js__WEBPACK_IMPORTED_MODULE_7__["default"])(element, imageIdIndexOffset, loop, allowSkipping); 17084 options.deltaY = deltaY % pixelsPerImage; 17085 } else { 17086 options.deltaY = deltaY; 17087 } 17088 17089 Object(_toolOptions_js__WEBPACK_IMPORTED_MODULE_9__["setToolOptions"])(this.name, element, options); 17090 } 17091 }, { 17092 key: "_getDeltaY", 17093 value: function _getDeltaY(element, deltaPointsY) { 17094 var options = Object(_toolOptions_js__WEBPACK_IMPORTED_MODULE_9__["getToolOptions"])(this.name, element); 17095 var deltaY = options.deltaY || 0; 17096 return deltaY + deltaPointsY; 17097 } 17098 }, { 17099 key: "_getPixelPerImage", 17100 value: function _getPixelPerImage(element) { 17101 var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_8__["getToolState"])(element, 'stack'); 17102 17103 if (!toolData || !toolData.data || !toolData.data.length) { 17104 return; 17105 } 17106 17107 var stackData = toolData.data[0]; 17108 var stackScrollSpeed = this.configuration.stackScrollSpeed; // The Math.max here makes it easier to mouseDrag-scroll small or really large image stacks 17109 17110 return stackScrollSpeed || Math.max(2, element.offsetHeight / Math.max(stackData.imageIds.length, 8)); 17111 } 17112 }]); 17113 17114 return StackScrollTool; 17115}(_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]); 17116 17117 17118 17119/***/ }), 17120
17121/***/ "./tools/WwwcRegionTool.js": 17122/*!*********************************!*\ 17123 !*** ./tools/WwwcRegionTool.js ***! 17124 \*********************************/ 17125/*! exports provided: default */ 17126/***/ (function(module, __webpack_exports__, __webpack_require__) { 17127 17128"use strict"; 17129__webpack_require__.r(__webpack_exports__); 17130/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return WwwcRegionTool; }); 17131/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js"); 17132/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); 17133/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js"); 17134/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); 17135/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js"); 17136/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); 17137/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js"); 17138/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); 17139/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/assertThisInitialized */ "../node_modules/@babel/runtime/helpers/assertThisInitialized.js"); 17140/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__); 17141/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js"); 17142/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__); 17143/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js"); 17144/* harmony import */ var _base_BaseTool_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./base/BaseTool.js */ "./tools/base/BaseTool.js"); 17145/* harmony import */ var _drawing_index_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../drawing/index.js */ "./drawing/index.js"); 17146/* harmony import */ var _util_clip_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../util/clip.js */ "./util/clip.js"); 17147/* harmony import */ var _util_getLuminance_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../util/getLuminance.js */ "./util/getLuminance.js"); 17148/* harmony import */ var _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../stateManagement/toolColors.js */ "./stateManagement/toolColors.js"); 17149/* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./cursors/index.js */ "./tools/cursors/index.js"); 17150 17151 17152 17153 17154 17155 17156 17157 // Drawing 17158 17159 17160 17161 17162 17163 17164/** 17165 * @public 17166 * @class WwwcRegionTool 17167 * @memberof Tools 17168 * 17169 * @classdesc Tool for setting wwwc based on a rectangular region. 17170 * @extends Tools.Base.BaseTool 17171 */ 17172 17173var WwwcRegionTool = 17174/*#__PURE__*/ 17175function (_BaseTool) { 17176 _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(WwwcRegionTool, _BaseTool); 17177 17178 /** @inheritdoc */ 17179 function WwwcRegionTool() { 17180 var _this; 17181 17182 var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 17183 17184 _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, WwwcRegionTool); 17185 17186 var defaultProps = { 17187 name: 'WwwcRegion', 17188 supportedInteractionTypes: ['Mouse', 'Touch'], 17189 configuration: { 17190 minWindowWidth: 10 17191 }, 17192 svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_12__["wwwcRegionCursor"] 17193 }; 17194 _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(WwwcRegionTool).call(this, props, defaultProps)); 17195 17196 _this._resetHandles(); // 17197 // Touch 17198 // 17199 17200 /** @inheritdoc */ 17201 17202 17203 _this.postTouchStartCallback = _this._startOutliningRegion.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this)); 17204 /** @inheritdoc */ 17205 17206 _this.touchDragCallback = _this._setHandlesAndUpdate.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this)); 17207 /** @inheritdoc */ 17208 17209 _this.touchEndCallback = _this._applyStrategy.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this)); // 17210 // MOUSE 17211 // 17212 17213 /** @inheritdoc */ 17214 17215 _this.postMouseDownCallback = _this._startOutliningRegion.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this)); 17216 /** @inheritdoc */ 17217 17218 _this.mouseClickCallback = _this._startOutliningRegion.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this)); 17219 /** @inheritdoc */ 17220 17221 _this.mouseDragCallback = _this._setHandlesAndUpdate.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this)); 17222 /** @inheritdoc */ 17223 17224 _this.mouseMoveCallback = _this._setHandlesAndUpdate.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this)); 17225 /** @inheritdoc */ 17226 17227 _this.mouseUpCallback = _this._applyStrategy.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this)); 17228 return _this; 17229 } 17230 /** 17231 * Render hook: draws the WWWCRegion's "box" when selecting 17232 * 17233 * @param {Cornerstone.event#cornerstoneimagerendered} evt cornerstoneimagerendered event 17234 * @memberof Tools.WwwcRegionTool 17235 * @returns {void} 17236 */ 17237 17238 17239 _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(WwwcRegionTool, [{ 17240 key: "renderToolData", 17241 value: function renderToolData(evt) { 17242 var _this2 = this; 17243 17244 var eventData = evt.detail; 17245 var element = eventData.element; 17246 var color = _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_11__["default"].getColorIfActive({ 17247 active: true 17248 }); 17249 var context = Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_8__["getNewContext"])(eventData.canvasContext.canvas); 17250 Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_8__["draw"])(context, function (context) { 17251 Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_8__["drawRect"])(context, element, _this2.handles.start, _this2.handles.end, { 17252 color: color 17253 }); 17254 }); 17255 } 17256 /** 17257 * Sets the start handle point and claims the eventDispatcher event 17258 * 17259 * @private 17260 * @param {*} evt // mousedown, touchstart, click 17261 * @returns {Boolean} True 17262 */ 17263 17264 }, { 17265 key: "_startOutliningRegion", 17266 value: function _startOutliningRegion(evt) { 17267 var consumeEvent = true; 17268 var element = evt.detail.element; 17269 var image = evt.detail.currentPoints.image; 17270 17271 if (_isEmptyObject(this.handles.start)) { 17272 this.handles.start = image; 17273 } else { 17274 this.handles.end = image; 17275 17276 this._applyStrategy(evt); 17277 } 17278 17279 _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone.updateImage(element); 17280 return consumeEvent; 17281 } 17282 /** 17283 * This function will update the handles and updateImage to force re-draw 17284 * 17285 * @private 17286 * @method _setHandlesAndUpdate 17287 * @param {(CornerstoneTools.event#TOUCH_DRAG|CornerstoneTools.event#MOUSE_DRAG|CornerstoneTools.event#MOUSE_MOVE)} evt Interaction event emitted by an enabledElement 17288 * @returns {void} 17289 */ 17290 17291 }, { 17292 key: "_setHandlesAndUpdate", 17293 value: function _setHandlesAndUpdate(evt) { 17294 var element = evt.detail.element; 17295 var image = evt.detail.currentPoints.image; 17296 this.handles.end = image; 17297 _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone.updateImage(element); 17298 } 17299 /** 17300 * Event handler for MOUSE_UP/TOUCH_END during handle drag event loop. 17301 * 17302 * @private 17303 * @method _applyStrategy 17304 * @param {(CornerstoneTools.event#MOUSE_UP|CornerstoneTools.event#TOUCH_END)} evt Interaction event emitted by an enabledElement 17305 * @returns {void} 17306 */ 17307 17308 }, { 17309 key: "_applyStrategy", 17310 value: function _applyStrategy(evt) { 17311 if (_isEmptyObject(this.handles.start) || _isEmptyObject(this.handles.end)) { 17312 return; 17313 } 17314 17315 evt.detail.handles = this.handles; 17316 17317 _applyWWWCRegion(evt, this.configuration); 17318 17319 this._resetHandles(); 17320 } 17321 /** 17322 * Sets the start and end handle points to empty objects 17323 * 17324 * @private 17325 * @method _resetHandles 17326 * @returns {undefined} 17327 */ 17328 17329 }, { 17330 key: "_resetHandles", 17331 value: function _resetHandles() { 17332 this.handles = { 17333 start: {}, 17334 end: {} 17335 }; 17336 } 17337 }]); 17338 17339 return WwwcRegionTool; 17340}(_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_7__["default"]); 17341/** 17342 * Helper to determine if an object has no keys and is the correct type (is empty) 17343 * 17344 * @private 17345 * @function _isEmptyObject 17346 * @param {Object} obj The object to check 17347 * @returns {Boolean} true if the object is empty 17348 */ 17349 17350 17351 17352 17353var _isEmptyObject = function _isEmptyObject(obj) { 17354 return Object.keys(obj).length === 0 && obj.constructor === Object; 17355}; 17356/** 17357 * Calculates the minimum and maximum value in the given pixel array 17358 * and updates the viewport of the element in the event. 17359 * 17360 * @private 17361 * @method _applyWWWCRegion 17362 * @param {(CornerstoneTools.event#MOUSE_UP|CornerstoneTools.event#TOUCH_END)} evt Interaction event emitted by an enabledElement 17363 * @param {Object} config The tool's configuration object 17364 * @returns {void} 17365 */ 17366 17367 17368var _applyWWWCRegion = function _applyWWWCRegion(evt, config) { 17369 var eventData = evt.detail; 17370 var image = eventData.image, 17371 element = eventData.element; 17372 var _evt$detail$handles = evt.detail.handles, 17373 startPoint = _evt$detail$handles.start, 17374 endPoint = _evt$detail$handles.end; // Get the rectangular region defined by the handles 17375 17376 var left = Math.min(startPoint.x, endPoint.x); 17377 var top = Math.min(startPoint.y, endPoint.y); 17378 var width = Math.abs(startPoint.x - endPoint.x); 17379 var height = Math.abs(startPoint.y - endPoint.y); // Bound the rectangle so we don't get undefined pixels 17380
17381 left = Object(_util_clip_js__WEBPACK_IMPORTED_MODULE_9__["default"])(left, 0, image.width); 17382 top = Object(_util_clip_js__WEBPACK_IMPORTED_MODULE_9__["default"])(top, 0, image.height); 17383 width = Math.floor(Math.min(width, Math.abs(image.width - left))); 17384 height = Math.floor(Math.min(height, Math.abs(image.height - top))); // Get the pixel data in the rectangular region 17385 17386 var pixelLuminanceData = Object(_util_getLuminance_js__WEBPACK_IMPORTED_MODULE_10__["default"])(element, left, top, width, height); // Calculate the minimum and maximum pixel values 17387 17388 var minMaxMean = _calculateMinMaxMean(pixelLuminanceData, image.minPixelValue, image.maxPixelValue); // Adjust the viewport window width and center based on the calculated values 17389 17390 17391 var viewport = eventData.viewport; 17392 17393 if (config.minWindowWidth === undefined) { 17394 config.minWindowWidth = 10; 17395 } 17396 17397 viewport.voi.windowWidth = Math.max(Math.abs(minMaxMean.max - minMaxMean.min), config.minWindowWidth); 17398 viewport.voi.windowCenter = minMaxMean.mean; 17399 _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone.setViewport(element, viewport); 17400 _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone.updateImage(element); 17401}; 17402/** 17403 * Calculates the minimum, maximum, and mean value in the given pixel array 17404 * 17405 * @private 17406 * @method _calculateMinMaxMean 17407 * @param {number[]} pixelLuminance array of pixel luminance values 17408 * @param {number} globalMin starting "min" valie 17409 * @param {bumber} globalMax starting "max" value 17410 * @returns {Object} {min: number, max: number, mean: number } 17411 */ 17412 17413 17414var _calculateMinMaxMean = function _calculateMinMaxMean(pixelLuminance, globalMin, globalMax) { 17415 var numPixels = pixelLuminance.length; 17416 var min = globalMax; 17417 var max = globalMin; 17418 var sum = 0; 17419 17420 if (numPixels < 2) { 17421 return { 17422 min: min, 17423 max: max, 17424 mean: (globalMin + globalMax) / 2 17425 }; 17426 } 17427 17428 for (var index = 0; index < numPixels; index++) { 17429 var spv = pixelLuminance[index]; 17430 min = Math.min(min, spv); 17431 max = Math.max(max, spv); 17432 sum += spv; 17433 } 17434 17435 return { 17436 min: min, 17437 max: max, 17438 mean: sum / numPixels 17439 }; 17440}; 17441 17442/***/ }), 17443
17444/***/ "./tools/WwwcTool.js": 17445/*!***************************!*\ 17446 !*** ./tools/WwwcTool.js ***! 17447 \***************************/ 17448/*! exports provided: default */ 17449/***/ (function(module, __webpack_exports__, __webpack_require__) { 17450 17451"use strict"; 17452__webpack_require__.r(__webpack_exports__); 17453/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return WwwcTool; }); 17454/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js"); 17455/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); 17456/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js"); 17457/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); 17458/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js"); 17459/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); 17460/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js"); 17461/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); 17462/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js"); 17463/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__); 17464/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js"); 17465/* harmony import */ var _base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./base/BaseTool.js */ "./tools/base/BaseTool.js"); 17466/* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./cursors/index.js */ "./tools/cursors/index.js"); 17467 17468 17469 17470 17471 17472 17473 17474 17475/** 17476 * @public 17477 * @class WwwcTool 17478 * @memberof Tools 17479 * 17480 * @classdesc Tool for setting wwwc by dragging with mouse/touch. 17481 * @extends Tools.Base.BaseTool 17482 */ 17483 17484var WwwcTool = 17485/*#__PURE__*/ 17486function (_BaseTool) { 17487 _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(WwwcTool, _BaseTool); 17488 17489 function WwwcTool() { 17490 var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 17491 17492 _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, WwwcTool); 17493 17494 var defaultProps = { 17495 name: 'Wwwc', 17496 strategies: { 17497 basicLevelingStrategy: basicLevelingStrategy 17498 }, 17499 supportedInteractionTypes: ['Mouse', 'Touch'], 17500 configuration: { 17501 orientation: 0 17502 }, 17503 svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_7__["wwwcCursor"] 17504 }; 17505 return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(WwwcTool).call(this, props, defaultProps)); 17506 } 17507 17508 _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(WwwcTool, [{ 17509 key: "mouseDragCallback", 17510 value: function mouseDragCallback(evt) { 17511 this.applyActiveStrategy(evt); 17512 _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.setViewport(evt.detail.element, evt.detail.viewport); 17513 } 17514 }, { 17515 key: "touchDragCallback", 17516 value: function touchDragCallback(evt) { 17517 // Prevent CornerstoneToolsTouchStartActive from killing any press events 17518 evt.stopImmediatePropagation(); 17519 this.applyActiveStrategy(evt); 17520 _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.setViewport(evt.detail.element, evt.detail.viewport); 17521 } 17522 }]); 17523 17524 return WwwcTool; 17525}(_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]); 17526/** 17527 * Here we normalize the ww/wc adjustments so the same number of on screen pixels 17528 * adjusts the same percentage of the dynamic range of the image. This is needed to 17529 * provide consistency for the ww/wc tool regardless of the dynamic range (e.g. an 8 bit 17530 * image will feel the same as a 16 bit image would) 17531 * 17532 * @param {Object} evt 17533 * @param {Object} { orienttion } 17534 * @returns {void} 17535 */ 17536 17537 17538 17539 17540function basicLevelingStrategy(evt, _ref) { 17541 var orientation = _ref.orientation; 17542 var eventData = evt.detail; 17543 var maxVOI = eventData.image.maxPixelValue * eventData.image.slope + eventData.image.intercept; 17544 var minVOI = eventData.image.minPixelValue * eventData.image.slope + eventData.image.intercept; 17545 var imageDynamicRange = maxVOI - minVOI; 17546 var multiplier = imageDynamicRange / 1024; 17547 var deltaX = eventData.deltaPoints.page.x * multiplier; 17548 var deltaY = eventData.deltaPoints.page.y * multiplier; 17549 17550 if (orientation === 0) { 17551 eventData.viewport.voi.windowWidth += deltaX; 17552 eventData.viewport.voi.windowCenter += deltaY; 17553 } else { 17554 eventData.viewport.voi.windowWidth += deltaY; 17555 eventData.viewport.voi.windowCenter += deltaX; 17556 } 17557} 17558 17559/***/ }), 17560
17561/***/ "./tools/ZoomMouseWheelTool.js": 17562/*!*************************************!*\ 17563 !*** ./tools/ZoomMouseWheelTool.js ***! 17564 \*************************************/ 17565/*! exports provided: default */ 17566/***/ (function(module, __webpack_exports__, __webpack_require__) { 17567 17568"use strict"; 17569__webpack_require__.r(__webpack_exports__); 17570/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ZoomMouseWheelTool; }); 17571/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js"); 17572/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); 17573/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js"); 17574/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); 17575/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js"); 17576/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); 17577/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js"); 17578/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); 17579/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js"); 17580/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__); 17581/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./../externalModules.js */ "./externalModules.js"); 17582/* harmony import */ var _base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./base/BaseTool.js */ "./tools/base/BaseTool.js"); 17583/* harmony import */ var _util_zoom_index_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../util/zoom/index.js */ "./util/zoom/index.js"); 17584 17585 17586 17587 17588 17589 17590 17591 17592/** 17593 * @public 17594 * @class ZoomMouseWheelTool 17595 * @memberof Tools 17596 * 17597 * @classdesc Tool for changing magnification with the mouse wheel. 17598 * @extends Tools.Base.BaseTool 17599 */ 17600 17601var ZoomMouseWheelTool = 17602/*#__PURE__*/ 17603function (_BaseTool) { 17604 _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(ZoomMouseWheelTool, _BaseTool); 17605 17606 function ZoomMouseWheelTool() { 17607 var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 17608 17609 _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, ZoomMouseWheelTool); 17610 17611 var defaultProps = { 17612 name: 'ZoomMouseWheel', 17613 supportedInteractionTypes: ['MouseWheel'], 17614 configuration: { 17615 minScale: 0.25, 17616 maxScale: 20.0, 17617 invert: false 17618 } 17619 }; 17620 return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(ZoomMouseWheelTool).call(this, props, defaultProps)); 17621 } 17622 17623 _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(ZoomMouseWheelTool, [{ 17624 key: "mouseWheelCallback", 17625 value: function mouseWheelCallback(evt) { 17626 var _evt$detail = evt.detail, 17627 element = _evt$detail.element, 17628 viewport = _evt$detail.viewport, 17629 spinY = _evt$detail.spinY; 17630 var _this$configuration = this.configuration, 17631 invert = _this$configuration.invert, 17632 maxScale = _this$configuration.maxScale, 17633 minScale = _this$configuration.minScale; 17634 var ticks = invert ? spinY / 4 : -spinY / 4; 17635 var updatedViewport = Object(_util_zoom_index_js__WEBPACK_IMPORTED_MODULE_7__["changeViewportScale"])(viewport, ticks, { 17636 maxScale: maxScale, 17637 minScale: minScale 17638 }); 17639 _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.setViewport(element, updatedViewport); 17640 } 17641 }]); 17642 17643 return ZoomMouseWheelTool; 17644}(_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]); 17645 17646 17647 17648/***/ }), 17649
17650/***/ "./tools/ZoomTool.js": 17651/*!***************************!*\ 17652 !*** ./tools/ZoomTool.js ***! 17653 \***************************/ 17654/*! exports provided: default */ 17655/***/ (function(module, __webpack_exports__, __webpack_require__) { 17656 17657"use strict"; 17658__webpack_require__.r(__webpack_exports__); 17659/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ZoomTool; }); 17660/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js"); 17661/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); 17662/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js"); 17663/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); 17664/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js"); 17665/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); 17666/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js"); 17667/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); 17668/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js"); 17669/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__); 17670/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js"); 17671/* harmony import */ var _base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./base/BaseTool.js */ "./tools/base/BaseTool.js"); 17672/* harmony import */ var _util_clip_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../util/clip.js */ "./util/clip.js"); 17673/* harmony import */ var _util_zoom_index_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../util/zoom/index.js */ "./util/zoom/index.js"); 17674/* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./cursors/index.js */ "./tools/cursors/index.js"); 17675 17676 17677 17678 17679 17680 17681 17682 17683 17684 17685var correctShift = _util_zoom_index_js__WEBPACK_IMPORTED_MODULE_8__["default"].correctShift, 17686 changeViewportScale = _util_zoom_index_js__WEBPACK_IMPORTED_MODULE_8__["default"].changeViewportScale; 17687/** 17688 * @public 17689 * @class ZoomTool 17690 * @memberof Tools 17691 * 17692 * @classdesc Tool for changing magnification. 17693 * @extends Tools.Base.BaseTool 17694 */ 17695 17696var ZoomTool = 17697/*#__PURE__*/ 17698function (_BaseTool) { 17699 _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(ZoomTool, _BaseTool); 17700 17701 function ZoomTool() { 17702 var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 17703 17704 _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, ZoomTool); 17705 17706 var defaultProps = { 17707 name: 'Zoom', 17708 strategies: { 17709 default: defaultStrategy, 17710 translate: translateStrategy, 17711 zoomToCenter: zoomToCenterStrategy 17712 }, 17713 defaultStrategy: 'default', 17714 supportedInteractionTypes: ['Mouse', 'Touch'], 17715 configuration: { 17716 invert: false, 17717 preventZoomOutsideImage: false, 17718 minScale: 0.25, 17719 maxScale: 20.0 17720 }, 17721 svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_9__["zoomCursor"] 17722 }; 17723 return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(ZoomTool).call(this, props, defaultProps)); 17724 } 17725 17726 _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(ZoomTool, [{ 17727 key: "touchDragCallback", 17728 value: function touchDragCallback(evt) { 17729 dragCallback.call(this, evt); 17730 } 17731 }, { 17732 key: "mouseDragCallback", 17733 value: function mouseDragCallback(evt) { 17734 dragCallback.call(this, evt); 17735 } 17736 }]); 17737 17738 return ZoomTool; 17739}(_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]); 17740 17741 17742 17743var dragCallback = function dragCallback(evt) { 17744 var deltaY = evt.detail.deltaPoints.page.y; 17745 17746 if (!deltaY) { 17747 return false;
17748 } 17749 17750 this.applyActiveStrategy(evt, this.configuration); 17751 _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.setViewport(evt.detail.element, evt.detail.viewport); 17752}; 17753/** 17754 * The default strategy keeps the target location fixed on the page 17755 * as we zoom in/out. 17756 * 17757 * @param {*} evt 17758 * @param {*} { invert, maxScale, minScale } 17759 * @returns {void} 17760 */ 17761 17762 17763function defaultStrategy(evt, _ref) { 17764 var invert = _ref.invert, 17765 maxScale = _ref.maxScale, 17766 minScale = _ref.minScale; 17767 var deltaY = evt.detail.deltaPoints.page.y; 17768 var ticks = invert ? -deltaY / 100 : deltaY / 100; 17769 var _evt$detail = evt.detail, 17770 element = _evt$detail.element, 17771 viewport = _evt$detail.viewport; 17772 var _ref2 = [evt.detail.startPoints.page.x, evt.detail.startPoints.page.y, evt.detail.startPoints.image.x, evt.detail.startPoints.image.y], 17773 startX = _ref2[0], 17774 startY = _ref2[1], 17775 imageX = _ref2[2], 17776 imageY = _ref2[3]; // Calculate the new scale factor based on how far the mouse has changed 17777 17778 var updatedViewport = changeViewportScale(viewport, ticks, { 17779 maxScale: maxScale, 17780 minScale: minScale 17781 }); 17782 _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.setViewport(element, updatedViewport); // Now that the scale has been updated, determine the offset we need to apply to the center so we can 17783 // Keep the original start location in the same position 17784 17785 var newCoords = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.pageToPixel(element, startX, startY); // The shift we will use is the difference between the original image coordinates of the point we've selected 17786 // And the image coordinates of the same point on the page after the viewport scaling above has been performed 17787 // This shift is in image coordinates, and is designed to keep the target location fixed on the page. 17788 17789 var shift = { 17790 x: imageX - newCoords.x, 17791 y: imageY - newCoords.y 17792 }; // Correct the required shift using the viewport rotation and flip parameters 17793 17794 shift = correctShift(shift, updatedViewport); // Apply the shift to the Viewport's translation setting 17795 17796 viewport.translation.x -= shift.x; 17797 viewport.translation.y -= shift.y; 17798} 17799 17800function translateStrategy(evt, _ref3) { 17801 var invert = _ref3.invert, 17802 preventZoomOutsideImage = _ref3.preventZoomOutsideImage, 17803 maxScale = _ref3.maxScale, 17804 minScale = _ref3.minScale; 17805 var deltaY = evt.detail.deltaPoints.page.y; 17806 var ticks = invert ? -deltaY / 100 : deltaY / 100; 17807 var image = evt.detail.image; 17808 var viewport = evt.detail.viewport; 17809 var _ref4 = [evt.detail.startPoints.image.x, evt.detail.startPoints.image.y], 17810 startX = _ref4[0], 17811 startY = _ref4[1]; // Calculate the new scale factor based on how far the mouse has changed 17812 // Note that in this case we don't need to update the viewport after the initial 17813 // Zoom step since we aren't don't intend to keep the target position static on 17814 // The page 17815 17816 var updatedViewport = changeViewportScale(viewport, ticks, { 17817 maxScale: maxScale, 17818 minScale: minScale 17819 }); // Define the default shift to take place during this zoom step 17820 17821 var shift = { 17822 x: 0, 17823 y: 0 17824 }; // Define the parameters for the translate strategy 17825 17826 var translateSpeed = 8; 17827 var outwardsMinScaleToTranslate = 3; 17828 var minTranslation = 0.01; 17829 17830 if (ticks < 0) { 17831 // Zoom outwards from the image center 17832 if (updatedViewport.scale < outwardsMinScaleToTranslate) { 17833 // If the current translation is smaller than the minimum desired translation, 17834 // Set the translation to zero 17835 if (Math.abs(updatedViewport.translation.x) < minTranslation) { 17836 updatedViewport.translation.x = 0; 17837 } else { 17838 shift.x = updatedViewport.translation.x / translateSpeed; 17839 } // If the current translation is smaller than the minimum desired translation, 17840 // Set the translation to zero 17841 17842 17843 if (Math.abs(updatedViewport.translation.y) < minTranslation) { 17844 updatedViewport.translation.y = 0; 17845 } else { 17846 shift.y = updatedViewport.translation.y / translateSpeed; 17847 } 17848 } 17849 } else { 17850 // Zoom inwards to the current image point 17851 // Identify the coordinates of the point the user is trying to zoom into 17852 // If we are not allowed to zoom outside the image, bound the user-selected position to 17853 // A point inside the image 17854 if (preventZoomOutsideImage) {
17855 Object(_util_clip_js__WEBPACK_IMPORTED_MODULE_7__["clipToBox"])(evt.detail.startPoints.image, image); 17856 } // Calculate the translation value that would place the desired image point in the center 17857 // Of the viewport 17858 17859 17860 var desiredTranslation = { 17861 x: image.width / 2 - startX, 17862 y: image.height / 2 - startY 17863 }; // Correct the target location using the viewport rotation and flip parameters 17864 17865 desiredTranslation = correctShift(desiredTranslation, updatedViewport); // Calculate the difference between the current viewport translation value and the 17866 // Final desired translation values 17867 17868 var distanceToDesired = { 17869 x: updatedViewport.translation.x - desiredTranslation.x, 17870 y: updatedViewport.translation.y - desiredTranslation.y 17871 }; // If the current translation is smaller than the minimum desired translation, 17872 // Stop translating in the x-direction 17873 17874 if (Math.abs(distanceToDesired.x) < minTranslation) { 17875 updatedViewport.translation.x = desiredTranslation.x; 17876 } else { 17877 // Otherwise, shift the viewport by one step 17878 shift.x = distanceToDesired.x / translateSpeed; 17879 } // If the current translation is smaller than the minimum desired translation, 17880 // Stop translating in the y-direction 17881 17882 17883 if (Math.abs(distanceToDesired.y) < minTranslation) { 17884 updatedViewport.translation.y = desiredTranslation.y; 17885 } else { 17886 // Otherwise, shift the viewport by one step 17887 shift.y = distanceToDesired.y / translateSpeed; 17888 } 17889 } // Apply the shift to the Viewport's translation setting 17890 17891 17892 updatedViewport.translation.x -= shift.x; 17893 updatedViewport.translation.y -= shift.y; 17894} 17895 17896function zoomToCenterStrategy(evt, _ref5) { 17897 var invert = _ref5.invert, 17898 maxScale = _ref5.maxScale, 17899 minScale = _ref5.minScale; 17900 var deltaY = evt.detail.deltaPoints.page.y; 17901 var ticks = invert ? -deltaY / 100 : deltaY / 100; 17902 var viewport = evt.detail.viewport; // Calculate the new scale factor based on how far the mouse has changed 17903 17904 changeViewportScale(viewport, ticks, { 17905 maxScale: maxScale, 17906 minScale: minScale 17907 }); 17908} 17909 17910/***/ }), 17911
17912/***/ "./tools/ZoomTouchPinchTool.js": 17913/*!*************************************!*\ 17914 !*** ./tools/ZoomTouchPinchTool.js ***! 17915 \*************************************/ 17916/*! exports provided: default */ 17917/***/ (function(module, __webpack_exports__, __webpack_require__) { 17918 17919"use strict"; 17920__webpack_require__.r(__webpack_exports__); 17921/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ZoomTouchPinchTool; }); 17922/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js"); 17923/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); 17924/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js"); 17925/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); 17926/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js"); 17927/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); 17928/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js"); 17929/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); 17930/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js"); 17931/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__); 17932/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./../externalModules.js */ "./externalModules.js"); 17933/* harmony import */ var _base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./base/BaseTool.js */ "./tools/base/BaseTool.js"); 17934/* harmony import */ var _util_zoom_index_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../util/zoom/index.js */ "./util/zoom/index.js"); 17935 17936 17937 17938 17939 17940 17941 17942 17943var correctShift = _util_zoom_index_js__WEBPACK_IMPORTED_MODULE_7__["default"].correctShift; 17944/** 17945 * 17946 * 17947 * @public 17948 * @class ZoomTouchPinchTool 17949 * @memberof Tools 17950 * 17951 * @extends {BaseTool} 17952 */ 17953 17954var ZoomTouchPinchTool = 17955/*#__PURE__*/ 17956function (_BaseTool) { 17957 _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(ZoomTouchPinchTool, _BaseTool); 17958 17959 function ZoomTouchPinchTool() { 17960 var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 17961 17962 _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, ZoomTouchPinchTool); 17963 17964 var defaultProps = { 17965 name: 'ZoomTouchPinch', 17966 // TODO: Do we need a better way to specify touchPinch? 17967 supportedInteractionTypes: ['TouchPinch'], 17968 configuration: { 17969 minScale: 0.25, 17970 maxScale: 20.0 17971 } 17972 }; 17973 return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(ZoomTouchPinchTool).call(this, props, defaultProps)); 17974 } 17975 17976 _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(ZoomTouchPinchTool, [{ 17977 key: "touchPinchCallback", 17978 value: function touchPinchCallback(evt) { 17979 var _evt$detail = evt.detail, 17980 element = _evt$detail.element, 17981 viewport = _evt$detail.viewport, 17982 scaleChange = _evt$detail.scaleChange; 17983 var _ref = [evt.detail.startPoints.page.x, evt.detail.startPoints.page.y, evt.detail.startPoints.image.x, evt.detail.startPoints.image.y], 17984 pageStartX = _ref[0], 17985 pageStartY = _ref[1], 17986 imageStartX = _ref[2], 17987 imageStartY = _ref[3]; 17988 var _this$configuration = this.configuration, 17989 maxScale = _this$configuration.maxScale, 17990 minScale = _this$configuration.minScale; // Change the scale based on the pinch gesture's scale change 17991 17992 viewport.scale += scaleChange * viewport.scale; 17993 17994 if (maxScale && viewport.scale > maxScale) { 17995 viewport.scale = maxScale; 17996 } else if (minScale && viewport.scale < minScale) { 17997 viewport.scale = minScale; 17998 } 17999 18000 _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.setViewport(element, viewport); // Now that the scale has been updated, determine the offset we need to apply to the center so we can 18001 // Keep the original start location in the same position 18002 18003 var newCoords = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.pageToPixel(element, pageStartX, pageStartY); 18004 var shift = { 18005 x: imageStartX - newCoords.x, 18006 y: imageStartY - newCoords.y 18007 }; 18008 shift = correctShift(shift, viewport); 18009 viewport.translation.x -= shift.x; 18010 viewport.translation.y -= shift.y; 18011 _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.setViewport(element, viewport); 18012 } 18013 }]); 18014 18015 return ZoomTouchPinchTool; 18016}(_base_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]); 18017 18018 18019 18020/***/ }), 18021
18022/***/ "./tools/annotation/AngleTool.js": 18023/*!***************************************!*\ 18024 !*** ./tools/annotation/AngleTool.js ***! 18025 \***************************************/ 18026/*! exports provided: default */ 18027/***/ (function(module, __webpack_exports__, __webpack_require__) { 18028 18029"use strict"; 18030__webpack_require__.r(__webpack_exports__); 18031/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return AngleTool; }); 18032/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js"); 18033/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); 18034/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js"); 18035/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); 18036/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js"); 18037/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); 18038/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js"); 18039/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); 18040/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js"); 18041/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__); 18042/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./../../externalModules.js */ "./externalModules.js"); 18043/* harmony import */ var _base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../base/BaseAnnotationTool.js */ "./tools/base/BaseAnnotationTool.js"); 18044/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./../../stateManagement/toolState.js */ "./stateManagement/toolState.js"); 18045/* harmony import */ var _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./../../stateManagement/toolStyle.js */ "./stateManagement/toolStyle.js"); 18046/* harmony import */ var _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./../../stateManagement/toolColors.js */ "./stateManagement/toolColors.js"); 18047/* harmony import */ var _manipulators_index_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./../../manipulators/index.js */ "./manipulators/index.js"); 18048/* harmony import */ var _drawing_index_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./../../drawing/index.js */ "./drawing/index.js"); 18049/* harmony import */ var _drawing_drawLinkedTextBox_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./../../drawing/drawLinkedTextBox.js */ "./drawing/drawLinkedTextBox.js"); 18050/* harmony import */ var _drawing_drawTextBox_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./../../drawing/drawTextBox.js */ "./drawing/drawTextBox.js"); 18051/* harmony import */ var _drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./../../drawing/drawHandles.js */ "./drawing/drawHandles.js"); 18052/* harmony import */ var _util_lineSegDistance_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./../../util/lineSegDistance.js */ "./util/lineSegDistance.js"); 18053/* harmony import */ var _util_roundToDecimal_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./../../util/roundToDecimal.js */ "./util/roundToDecimal.js"); 18054/* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../cursors/index.js */ "./tools/cursors/index.js"); 18055/* harmony import */ var _util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../../util/triggerEvent.js */ "./util/triggerEvent.js"); 18056/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../../events.js */ "./events.js"); 18057/* harmony import */ var _util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../../util/getPixelSpacing */ "./util/getPixelSpacing.js"); 18058/* harmony import */ var _util_throttle__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../../util/throttle */ "./util/throttle.js"); 18059 18060 18061 18062 18063 18064 18065 // State 18066 18067 18068 18069 // Manipulators 18070 18071 // Drawing 18072 18073 18074 18075 18076 18077 18078 18079 18080 18081 18082 18083 18084/** 18085 * @public 18086 * @class AngleTool 18087 * @memberof Tools.Annotation 18088 * @classdesc Create and position an angle by placing three consecutive points. 18089 * @extends Tools.Base.BaseAnnotationTool 18090 * @hideconstructor 18091 * 18092 * @param {ToolConfiguration} [props={}] 18093 */ 18094 18095var AngleTool = 18096/*#__PURE__*/ 18097function (_BaseAnnotationTool) { 18098 _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(AngleTool, _BaseAnnotationTool); 18099 18100 function AngleTool() { 18101 var _this; 18102 18103 var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 18104 18105 _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, AngleTool); 18106 18107 var defaultProps = { 18108 name: 'Angle', 18109 supportedInteractionTypes: ['Mouse', 'Touch'], 18110 svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_17__["angleCursor"] 18111 }; 18112 _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(AngleTool).call(this, props, defaultProps)); 18113 _this.preventNewMeasurement = false;
18114 _this.throttledUpdateCachedStats = Object(_util_throttle__WEBPACK_IMPORTED_MODULE_21__["default"])(_this.updateCachedStats, 110); 18115 return _this; 18116 } 18117 18118 _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(AngleTool, [{ 18119 key: "createNewMeasurement", 18120 value: function createNewMeasurement(eventData) { 18121 // Create the measurement data for this tool with the end handle activated 18122 return { 18123 visible: true, 18124 active: true, 18125 color: undefined, 18126 invalidated: true, 18127 handles: { 18128 start: { 18129 x: eventData.currentPoints.image.x, 18130 y: eventData.currentPoints.image.y, 18131 highlight: true, 18132 active: false 18133 }, 18134 middle: { 18135 x: eventData.currentPoints.image.x, 18136 y: eventData.currentPoints.image.y, 18137 highlight: true, 18138 active: true 18139 }, 18140 end: { 18141 x: eventData.currentPoints.image.x, 18142 y: eventData.currentPoints.image.y, 18143 highlight: true, 18144 active: false 18145 }, 18146 textBox: { 18147 active: false, 18148 hasMoved: false, 18149 movesIndependently: false, 18150 drawnIndependently: true, 18151 allowedOutsideImage: true, 18152 hasBoundingBox: true 18153 } 18154 } 18155 }; 18156 } 18157 }, { 18158 key: "pointNearTool", 18159 value: function pointNearTool(element, data, coords) { 18160 if (data.visible === false) { 18161 return false; 18162 } 18163 18164 return Object(_util_lineSegDistance_js__WEBPACK_IMPORTED_MODULE_15__["default"])(element, data.handles.start, data.handles.middle, coords) < 25 || Object(_util_lineSegDistance_js__WEBPACK_IMPORTED_MODULE_15__["default"])(element, data.handles.middle, data.handles.end, coords) < 25; 18165 } 18166 }, { 18167 key: "updateCachedStats", 18168 value: function updateCachedStats(image, element, data) { 18169 var _getPixelSpacing = Object(_util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_20__["default"])(image), 18170 rowPixelSpacing = _getPixelSpacing.rowPixelSpacing, 18171 colPixelSpacing = _getPixelSpacing.colPixelSpacing; 18172 18173 var sideA = { 18174 x: (data.handles.middle.x - data.handles.start.x) * colPixelSpacing, 18175 y: (data.handles.middle.y - data.handles.start.y) * rowPixelSpacing 18176 }; 18177 var sideB = { 18178 x: (data.handles.end.x - data.handles.middle.x) * colPixelSpacing, 18179 y: (data.handles.end.y - data.handles.middle.y) * rowPixelSpacing 18180 }; 18181 var sideC = { 18182 x: (data.handles.end.x - data.handles.start.x) * colPixelSpacing, 18183 y: (data.handles.end.y - data.handles.start.y) * rowPixelSpacing 18184 }; 18185 var sideALength = length(sideA); 18186 var sideBLength = length(sideB); 18187 var sideCLength = length(sideC); // Cosine law 18188 18189 var angle = Math.acos((Math.pow(sideALength, 2) + Math.pow(sideBLength, 2) - Math.pow(sideCLength, 2)) / (2 * sideALength * sideBLength)); 18190 angle *= 180 / Math.PI; 18191 data.rAngle = Object(_util_roundToDecimal_js__WEBPACK_IMPORTED_MODULE_16__["default"])(angle, 2); 18192 data.invalidated = false; 18193 } 18194 }, { 18195 key: "renderToolData", 18196 value: function renderToolData(evt) { 18197 var _this2 = this; 18198 18199 var eventData = evt.detail; 18200 var enabledElement = eventData.enabledElement; 18201 var _this$configuration = this.configuration, 18202 handleRadius = _this$configuration.handleRadius, 18203 drawHandlesOnHover = _this$configuration.drawHandlesOnHover; // If we have no toolData for this element, return immediately as there is nothing to do 18204 18205 var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_7__["getToolState"])(evt.currentTarget, this.name); 18206 18207 if (!toolData) { 18208 return; 18209 } // We have tool data for this element - iterate over each one and draw it 18210 18211 18212 var context = Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_11__["getNewContext"])(eventData.canvasContext.canvas); 18213 var image = eventData.image, 18214 element = eventData.element; 18215 18216 var _getPixelSpacing2 = Object(_util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_20__["default"])(image), 18217 rowPixelSpacing = _getPixelSpacing2.rowPixelSpacing, 18218 colPixelSpacing = _getPixelSpacing2.colPixelSpacing; 18219 18220 var lineWidth = _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_8__["default"].getToolW
18220idth(); 18221 18222 var _loop = function _loop(i) { 18223 var data = toolData.data[i]; 18224 18225 if (data.visible === false) { 18226 return "continue"; 18227 } 18228 18229 Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_11__["draw"])(context, function (context) { 18230 Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_11__["setShadow"])(context, _this2.configuration); // Differentiate the color of activation tool 18231 18232 var color = _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_9__["default"].getColorIfActive(data); 18233 var handleStartCanvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.pixelToCanvas(eventData.element, data.handles.start); 18234 var handleMiddleCanvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.pixelToCanvas(eventData.element, data.handles.middle); 18235 18236 var lineOptions = { 18237 color: color 18238 }; 18239 if(data.lineWidth){ 18240 lineOptions.lineWidth = data.lineWidth; 18241 } 18242 Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_11__["drawJoinedLines"])(context, eventData.element, data.handles.start, [data.handles.middle, data.handles.end], lineOptions); // Draw the handles 18243 18244 var handleOptions = { 18245 color: color, 18246 handleRadius: handleRadius, 18247 drawHandlesIfActive: drawHandlesOnHover 18248 }; 18249 Object(_drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_14__["default"])(context, eventData, data.handles, handleOptions); // Update textbox stats 18250 18251 if (data.invalidated === true) { 18252 if (data.rAngle) { 18253 _this2.throttledUpdateCachedStats(image, element, data); 18254 } else { 18255 _this2.updateCachedStats(image, element, data); 18256 } 18257 } 18258 18259 if (data.rAngle) { 18260 var text = textBoxText(data, rowPixelSpacing, colPixelSpacing); 18261 var distance = 15; 18262 var textCoords; 18263 18264 if (!data.handles.textBox.hasMoved) { 18265 textCoords = { 18266 x: handleMiddleCanvas.x, 18267 y: handleMiddleCanvas.y 18268 }; 18269 var padding = 5; 18270 var textWidth = Object(_drawing_drawTextBox_js__WEBPACK_IMPORTED_MODULE_13__["textBoxWidth"])(context, text, padding); 18271 18272 if (handleMiddleCanvas.x < handleStartCanvas.x) { 18273 textCoords.x -= distance + textWidth + 10; 18274 } else { 18275 textCoords.x += distance; 18276 } 18277 18278 var transform = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.internal.getTransform(enabledElement); 18279 transform.invert(); 18280 var coords = transform.transformPoint(textCoords.x, textCoords.y); 18281 data.handles.textBox.x = coords.x; 18282 data.handles.textBox.y = coords.y; 18283 } 18284 18285 Object(_drawing_drawLinkedTextBox_js__WEBPACK_IMPORTED_MODULE_12__["default"])(context, eventData.element, data.handles.textBox, text, data.handles, textBoxAnchorPoints, color, lineWidth, 0, true); 18286 } 18287 }); 18288 }; 18289 18290 for (var i = 0; i < toolData.data.length; i++) { 18291 var _ret = _loop(i); 18292 18293 if (_ret === "continue") continue; 18294 } 18295 18296 function textBoxText(data, rowPixelSpacing, colPixelSpacing) { 18297 var suffix = !rowPixelSpacing || !colPixelSpacing ? ' (isotropic)' : ''; 18298 var str = '00B0'; // Degrees symbol 18299 18300 return data.rAngle.toString() + String.fromCharCode(parseInt(str, 16)) + suffix; 18301 } 18302 18303 function textBoxAnchorPoints(handles) { 18304 return [handles.start, handles.middle, handles.end]; 18305 } 18306 } 18307 }, { 18308 key: "addNewMeasurement", 18309 value: function addNewMeasurement(evt, interactionType) { 18310 var _this3 = this; 18311 18312 if (this.preventNewMeasurement) { 18313 return; 18314 } 18315 18316 this.preventNewMeasurement = true; 18317 evt.preventDefault(); 18318 evt.stopPropagation(); 18319 var eventData = evt.detail; 18320 var measurementData = this.createNewMeasurement(eventData); 18321 var element = evt.detail.element; // Associate this data with this imageId so we can render it and manipulate it 18322 18323 Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_7__["addToolState"])(element, this.name, measurementData); 18324 _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.updateImage(element); 18325 var doneMovingEndHandleOptions = Object.assign({}, { 18326 doneMovingCallback: function doneMovingCallback() { 18327 measurementData.active = false;
18328 _this3.preventNewMeasurement = false; 18329 var eventType = _events_js__WEBPACK_IMPORTED_MODULE_19__["default"].MEASUREMENT_COMPLETED; 18330 var eventData = { 18331 toolType: _this3.name, 18332 element: element, 18333 measurementData: measurementData 18334 }; 18335 Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_18__["default"])(element, eventType, eventData); 18336 _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.updateImage(element); 18337 } 18338 }, this.options); 18339 var doneMovingMiddleHandleOptions = Object.assign({}, { 18340 doneMovingCallback: function doneMovingCallback() { 18341 measurementData.active = false; 18342 measurementData.handles.end.active = true; 18343 _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.updateImage(element); 18344 Object(_manipulators_index_js__WEBPACK_IMPORTED_MODULE_10__["moveNewHandle"])(eventData, _this3.name, measurementData, measurementData.handles.end, doneMovingEndHandleOptions, interactionType); 18345 } 18346 }, this.options); // Step 1, create start and second middle 18347 18348 Object(_manipulators_index_js__WEBPACK_IMPORTED_MODULE_10__["moveNewHandle"])(eventData, this.name, measurementData, measurementData.handles.middle, doneMovingMiddleHandleOptions, interactionType); 18349 } 18350 }]); 18351 18352 return AngleTool; 18353}(_base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]); 18354 18355 18356 18357function length(vector) { 18358 return Math.sqrt(Math.pow(vector.x, 2) + Math.pow(vector.y, 2)); 18359} 18360 18361/***/ }), 18362
18363/***/ "./tools/annotation/ArrowAnnotateTool.js": 18364/*!***********************************************!*\ 18365 !*** ./tools/annotation/ArrowAnnotateTool.js ***! 18366 \***********************************************/ 18367/*! exports provided: default */ 18368/***/ (function(module, __webpack_exports__, __webpack_require__) { 18369 18370"use strict"; 18371__webpack_require__.r(__webpack_exports__); 18372/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ArrowAnnotateTool; }); 18373/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js"); 18374/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); 18375/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js"); 18376/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); 18377/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js"); 18378/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); 18379/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js"); 18380/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); 18381/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js"); 18382/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__); 18383/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./../../externalModules.js */ "./externalModules.js"); 18384/* harmony import */ var _base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../base/BaseAnnotationTool.js */ "./tools/base/BaseAnnotationTool.js"); 18385/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./../../events.js */ "./events.js"); 18386/* harmony import */ var _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./../../stateManagement/toolStyle.js */ "./stateManagement/toolStyle.js"); 18387/* harmony import */ var _stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./../../stateManagement/textStyle.js */ "./stateManagement/textStyle.js"); 18388/* harmony import */ var _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./../../stateManagement/toolColors.js */ "./stateManagement/toolColors.js"); 18389/* harmony import */ var _manipulators_index_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./../../manipulators/index.js */ "./manipulators/index.js"); 18390/* harmony import */ var _util_pointInsideBoundingBox_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./../../util/pointInsideBoundingBox.js */ "./util/pointInsideBoundingBox.js"); 18391/* harmony import */ var _util_lineSegDistance_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./../../util/lineSegDistance.js */ "./util/lineSegDistance.js"); 18392/* harmony import */ var _util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./../../util/triggerEvent.js */ "./util/triggerEvent.js"); 18393/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./../../stateManagement/toolState.js */ "./stateManagement/toolState.js"); 18394/* harmony import */ var _drawing_drawLinkedTextBox_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./../../drawing/drawLinkedTextBox.js */ "./drawing/drawLinkedTextBox.js"); 18395/* harmony import */ var _drawing_index_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./../../drawing/index.js */ "./drawing/index.js"); 18396/* harmony import */ var _drawing_drawArrow_js__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./../../drawing/drawArrow.js */ "./drawing/drawArrow.js"); 18397/* harmony import */ var _drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./../../drawing/drawHandles.js */ "./drawing/drawHandles.js"); 18398/* harmony import */ var _drawing_drawTextBox_js__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ./../../drawing/drawTextBox.js */ "./drawing/drawTextBox.js"); 18399/* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../cursors/index.js */ "./tools/cursors/index.js"); 18400 18401 18402 18403 18404 18405 18406/* eslint no-alert: 0 */ 18407 18408 18409 18410 18411 18412 18413 18414 18415 18416 18417 18418 18419 18420 18421 18422 18423 18424/** 18425 * @public 18426 * @class ArrowAnnotateTool 18427 * @memberof Tools.Annotation 18428 * @classdesc Create and position an arrow and label 18429 * @extends Tools.Base.BaseAnnotationTool 18430 */ 18431 18432var ArrowAnnotateTool = 18433/*#__PURE__*/ 18434function (_BaseAnnotationTool) { 18435 _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(ArrowAnnotateTool, _BaseAnnotationTool); 18436 18437 function ArrowAnnotateTool() { 18438 var _this; 18439 18440 var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 18441 18442 _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, ArrowAnnotateTool); 18443 18444 var defaultProps = { 18445 name: 'ArrowAnnotate', 18446 supportedInteractionTypes: ['Mouse', 'Touch'], 18447 configuration: { 18448 getTextCallback: getTextCallback, 18449 changeTextCallback: changeTextCallback, 18450 drawHandles: false, 18451 drawHandlesOnHover: true, 18452 arrowFirst: true 18453 }, 18454 svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_21__["arrowAnnotateCursor"] 18455 }; 18456 _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(ArrowAnnotateTool).call(this, props, defaultProps)); 18457 _this.preventNewMeasurement = false;
18458 return _this; 18459 } 18460 18461 _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(ArrowAnnotateTool, [{ 18462 key: "createNewMeasurement", 18463 value: function createNewMeasurement(evt) { 18464 // Create the measurement data for this tool with the end handle activated 18465 return { 18466 visible: true, 18467 active: true, 18468 color: undefined, 18469 handles: { 18470 start: { 18471 x: evt.detail.currentPoints.image.x, 18472 y: evt.detail.currentPoints.image.y, 18473 highlight: true, 18474 active: false 18475 }, 18476 end: { 18477 x: evt.detail.currentPoints.image.x, 18478 y: evt.detail.currentPoints.image.y, 18479 highlight: true, 18480 active: false 18481 }, 18482 textBox: { 18483 active: false, 18484 hasMoved: false, 18485 movesIndependently: false, 18486 drawnIndependently: true, 18487 allowedOutsideImage: true, 18488 hasBoundingBox: true 18489 } 18490 } 18491 }; 18492 } 18493 }, { 18494 key: "pointNearTool", 18495 value: function pointNearTool(element, data, coords) { 18496 if (data.visible === false) { 18497 return false; 18498 } 18499 18500 return Object(_util_lineSegDistance_js__WEBPACK_IMPORTED_MODULE_13__["default"])(element, data.handles.start, data.handles.end, coords) < 25; 18501 } 18502 }, { 18503 key: "updateCachedStats", 18504 value: function updateCachedStats(image, element, data) {// No stats calculation for this tool 18505 } 18506 }, { 18507 key: "renderToolData", 18508 value: function renderToolData(evt) { 18509 var _this2 = this; 18510 18511 var _evt$detail = evt.detail, 18512 element = _evt$detail.element, 18513 enabledElement = _evt$detail.enabledElement; 18514 var _this$configuration = this.configuration, 18515 handleRadius = _this$configuration.handleRadius, 18516 drawHandlesOnHover = _this$configuration.drawHandlesOnHover; // If we have no toolData for this element, return immediately as there is nothing to do 18517 18518 var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_15__["getToolState"])(element, this.name); 18519 18520 if (!toolData) { 18521 return; 18522 } // We have tool data for this element - iterate over each one and draw it 18523 18524 18525 var canvas = evt.detail.canvasContext.canvas; 18526 var context = Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_17__["getNewContext"])(canvas); 18527 var lineWidth = _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_8__["default"].getToolW
18527idth(); 18528 18529 var _loop = function _loop(i) { 18530 var data = toolData.data[i]; 18531 18532 if (data.visible === false) { 18533 return "continue"; 18534 } 18535 18536 Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_17__["draw"])(context, function (context) { 18537 Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_17__["setShadow"])(context, _this2.configuration); 18538 var color = _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_10__["default"].getColorIfActive(data); // Draw the arrow 18539 18540 var handleStartCanvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.pixelToCanvas(element, data.handles.start); 18541 var handleEndCanvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.pixelToCanvas(element, data.handles.end); // Config.arrowFirst = false; 18542 18543 if (_this2.configuration.arrowFirst) { 18544 Object(_drawing_drawArrow_js__WEBPACK_IMPORTED_MODULE_18__["default"])(context, handleEndCanvas, handleStartCanvas, color, lineWidth); 18545 } else { 18546 Object(_drawing_drawArrow_js__WEBPACK_IMPORTED_MODULE_18__["default"])(context, handleStartCanvas, handleEndCanvas, color, lineWidth); 18547 } 18548 18549 var handleOptions = { 18550 color: color, 18551 handleRadius: handleRadius, 18552 drawHandlesIfActive: drawHandlesOnHover 18553 }; 18554 18555 if (_this2.configuration.drawHandles) { 18556 Object(_drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_19__["default"])(context, evt.detail, data.handles, handleOptions); 18557 } 18558 18559 var text = textBoxText(data); // Draw the text 18560 18561 if (text && text !== '') { 18562 // Calculate the text coordinates. 18563 var padding = 5; 18564 var textWidth = Object(_drawing_drawTextBox_js__WEBPACK_IMPORTED_MODULE_20__["textBoxWidth"])(context, text, padding); 18565 var textHeight = _stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_9__["default"].getFontSize() + 10; 18566 var distance = Math.max(textWidth, textHeight) / 2 + 5; 18567 18568 if (handleEndCanvas.x < handleStartCanvas.x) { 18569 distance = -distance; 18570 } 18571 18572 if (!data.handles.textBox.hasMoved) { 18573 var textCoords; 18574 18575 if (_this2.configuration.arrowFirst) { 18576 textCoords = { 18577 x: handleEndCanvas.x - textWidth / 2 + distance, 18578 y: handleEndCanvas.y - textHeight / 2 18579 }; 18580 } else { 18581 // If the arrow is at the End position, the text should 18582 // Be placed near the Start position 18583 textCoords = { 18584 x: handleStartCanvas.x - textWidth / 2 - distance, 18585 y: handleStartCanvas.y - textHeight / 2 18586 }; 18587 } 18588 18589 var transform = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.internal.getTransform(enabledElement); 18590 transform.invert(); 18591 var coords = transform.transformPoint(textCoords.x, textCoords.y); 18592 data.handles.textBox.x = coords.x; 18593 data.handles.textBox.y = coords.y; 18594 } 18595 18596 Object(_drawing_drawLinkedTextBox_js__WEBPACK_IMPORTED_MODULE_16__["default"])(context, element, data.handles.textBox, text, data.handles, textBoxAnchorPoints, color, lineWidth, 0, false); 18597 } 18598 }); 18599 }; 18600 18601 for (var i = 0; i < toolData.data.length; i++) { 18602 var _ret = _loop(i); 18603 18604 if (_ret === "continue") continue; 18605 } 18606 18607 function textBoxText(data) { 18608 return data.text; 18609 } 18610 18611 function textBoxAnchorPoints(handles) { 18612 var midpoint = { 18613 x: (handles.start.x + handles.end.x) / 2, 18614 y: (handles.start.y + handles.end.y) / 2 18615 }; 18616 return [handles.start, midpoint, handles.end]; 18617 } 18618 } 18619 }, { 18620 key: "addNewMeasurement", 18621 value: function addNewMeasurement(evt, interactionType) { 18622 var _this3 = this; 18623 18624 var element = evt.detail.element; 18625 var measurementData = this.createNewMeasurement(evt); // Associate this data with this imageId so we can render it and manipulate it 18626 18627 Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_15__["addToolState"])(element, this.name, measurementData); 18628 _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.updateImage(element); 18629 var toolOptions = Object.assign({}, { 18630 doneMovingCallback: function doneMovingCallback() { 18631 if (measurementData.text === undefined) { 18632 _this3.configuration.getTextCallback(function (text) { 18633 measurementData.active = false;
18634 18635 if (text) { 18636 measurementData.text = text; 18637 var eventType = _events_js__WEBPACK_IMPORTED_MODULE_7__["default"].MEASUREMENT_COMPLETED; 18638 var eventData = { 18639 toolName: _this3.name, 18640 element: element, 18641 measurementData: measurementData 18642 }; 18643 Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_14__["default"])(element, eventType, eventData); 18644 } else { 18645 Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_15__["removeToolState"])(element, _this3.name, measurementData); 18646 } 18647 18648 _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.updateImage(element); 18649 }); 18650 } 18651 18652 _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.updateImage(element); 18653 } 18654 }, this.options); 18655 Object(_manipulators_index_js__WEBPACK_IMPORTED_MODULE_11__["moveNewHandle"])(evt.detail, this.name, measurementData, measurementData.handles.end, toolOptions, interactionType); 18656 } 18657 }, { 18658 key: "doubleClickCallback", 18659 value: function doubleClickCallback(evt) { 18660 if (!Array.isArray(this.options.mouseButtonMask) || !this.options.mouseButtonMask.includes(evt.detail.buttons)) { 18661 return; 18662 } 18663 18664 return this._updateTextForNearbyAnnotation(evt); 18665 } 18666 }, { 18667 key: "touchPressCallback", 18668 value: function touchPressCallback(evt) { 18669 return this._updateTextForNearbyAnnotation(evt); 18670 } 18671 }, { 18672 key: "_updateTextForNearbyAnnotation", 18673 value: function _updateTextForNearbyAnnotation(evt) { 18674 var element = evt.detail.element; 18675 var coords = evt.detail.currentPoints.canvas; 18676 var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_15__["getToolState"])(element, this.name); 18677 18678 if (!toolState) { 18679 return false; 18680 } 18681 18682 for (var i = 0; i < toolState.data.length; i++) { 18683 var data = toolState.data[i]; 18684 18685 if (this.pointNearTool(element, data, coords) || Object(_util_pointInsideBoundingBox_js__WEBPACK_IMPORTED_MODULE_12__["default"])(data.handles.textBox, coords)) { 18686 data.active = true; 18687 _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.updateImage(element); // Allow relabelling via a callback 18688 18689 this.configuration.changeTextCallback(data, evt.detail, this._doneChangingTextCallback.bind(this, element, data)); 18690 evt.stopImmediatePropagation(); 18691 evt.preventDefault(); 18692 evt.stopPropagation(); 18693 return true; 18694 } 18695 } 18696 } 18697 }, { 18698 key: "_doneChangingTextCallback", 18699 value: function _doneChangingTextCallback(element, data, updatedText, deleteTool) { 18700 if (deleteTool === true) { 18701 Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_15__["removeToolState"])(element, this.name, data); 18702 } else { 18703 data.text = updatedText; 18704 } 18705 18706 data.active = false; 18707 _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.updateImage(element); 18708 } 18709 }]); 18710 18711 return ArrowAnnotateTool; 18712}(_base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]); 18713 18714 18715 18716function getTextCallback(doneChangingTextCallback) { 18717 doneChangingTextCallback(prompt('Enter your annotation:')); 18718} 18719 18720function changeTextCallback(data, eventData, doneChangingTextCallback) { 18721 doneChangingTextCallback(prompt('Change your annotation:')); 18722} 18723 18724/***/ }), 18725
18726/***/ "./tools/annotation/BidirectionalTool.js": 18727/*!***********************************************!*\ 18728 !*** ./tools/annotation/BidirectionalTool.js ***! 18729 \***********************************************/ 18730/*! exports provided: default */ 18731/***/ (function(module, __webpack_exports__, __webpack_require__) { 18732 18733"use strict"; 18734__webpack_require__.r(__webpack_exports__); 18735/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return BidirectionalTool; }); 18736/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js"); 18737/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); 18738/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js"); 18739/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); 18740/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js"); 18741/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); 18742/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js"); 18743/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); 18744/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/assertThisInitialized */ "../node_modules/@babel/runtime/helpers/assertThisInitialized.js"); 18745/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__); 18746/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js"); 18747/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__); 18748/* harmony import */ var _base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../base/BaseAnnotationTool.js */ "./tools/base/BaseAnnotationTool.js"); 18749/* harmony import */ var _bidirectionalTool_createNewMeasurement_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./bidirectionalTool/createNewMeasurement.js */ "./tools/annotation/bidirectionalTool/createNewMeasurement.js"); 18750/* harmony import */ var _bidirectionalTool_pointNearTool_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./bidirectionalTool/pointNearTool.js */ "./tools/annotation/bidirectionalTool/pointNearTool.js"); 18751/* harmony import */ var _bidirectionalTool_renderToolData_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./bidirectionalTool/renderToolData.js */ "./tools/annotation/bidirectionalTool/renderToolData.js"); 18752/* harmony import */ var _bidirectionalTool_addNewMeasurement_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./bidirectionalTool/addNewMeasurement.js */ "./tools/annotation/bidirectionalTool/addNewMeasurement.js"); 18753/* harmony import */ var _bidirectionalTool_mouseMoveCallback_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./bidirectionalTool/mouseMoveCallback.js */ "./tools/annotation/bidirectionalTool/mouseMoveCallback.js"); 18754/* harmony import */ var _bidirectionalTool_handleSelectedCallback_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./bidirectionalTool/handleSelectedCallback.js */ "./tools/annotation/bidirectionalTool/handleSelectedCallback.js"); 18755/* harmony import */ var _bidirectionalTool_handleSelectedMouseCallback_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./bidirectionalTool/handleSelectedMouseCallback.js */ "./tools/annotation/bidirectionalTool/handleSelectedMouseCallback.js"); 18756/* harmony import */ var _bidirectionalTool_handleSelectedTouchCallback_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./bidirectionalTool/handleSelectedTouchCallback.js */ "./tools/annotation/bidirectionalTool/handleSelectedTouchCallback.js"); 18757/* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../cursors/index.js */ "./tools/cursors/index.js"); 18758/* harmony import */ var _util_throttle__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../util/throttle */ "./util/throttle.js"); 18759/* harmony import */ var _util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../../util/getPixelSpacing */ "./util/getPixelSpacing.js"); 18760/* harmony import */ var _bidirectionalTool_utils_calculateLongestAndSh
18760ortestDiameters__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./bidirectionalTool/utils/calculateLongestAndShortestDiameters */ "./tools/annotation/bidirectionalTool/utils/calculateLongestAndShortestDiameters.js"); 18761 18762 18763 18764 18765 18766 18767 18768 18769 18770 18771 18772 18773 18774 18775 18776 18777 18778 18779 18780 18781var emptyLocationCallback = function emptyLocationCallback(measurementData, eventData, doneCallback) { 18782 return doneCallback(); 18783}; 18784/** 18785 * @public 18786 * @class BidirectionalTool 18787 * @memberof Tools.Annotation 18788 * @classdesc Create and position an annotation that measures the 18789 * length and width of a region. 18790 * @extends Tools.Base.BaseAnnotationTool 18791 */ 18792 18793 18794var BidirectionalTool = 18795/*#__PURE__*/ 18796function (_BaseAnnotationTool) { 18797 _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(BidirectionalTool, _BaseAnnotationTool); 18798 18799 function BidirectionalTool(props) { 18800 var _this; 18801 18802 _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, BidirectionalTool); 18803 18804 var defaultProps = { 18805 name: 'Bidirectional', 18806 supportedInteractionTypes: ['Mouse', 'Touch'], 18807 configuration: { 18808 changeMeasurementLocationCallback: emptyLocationCallback, 18809 getMeasurementLocationCallback: emptyLocationCallback, 18810 textBox: '', 18811 shadow: '', 18812 drawHandlesOnHover: true, 18813 additionalData: [] 18814 }, 18815 svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_15__["bidirectionalCursor"] 18816 }; 18817 _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(BidirectionalTool).call(this, props, defaultProps)); 18818 _this.throttledUpdateCachedStats = Object(_util_throttle__WEBPACK_IMPORTED_MODULE_16__["default"])(_this.updateCachedStats, 110); 18819 _this.createNewMeasurement = _bidirectionalTool_createNewMeasurement_js__WEBPACK_IMPORTED_MODULE_7__["default"].bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this)); 18820 _this.pointNearTool = _bidirectionalTool_pointNearTool_js__WEBPACK_IMPORTED_MODULE_8__["default"].bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this)); 18821 _this.renderToolData = _bidirectionalTool_renderToolData_js__WEBPACK_IMPORTED_MODULE_9__["default"].bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this)); 18822 _this.addNewMeasurement = _bidirectionalTool_addNewMeasurement_js__WEBPACK_IMPORTED_MODULE_10__["default"].bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this)); 18823 _this._moveCallback = _bidirectionalTool_mouseMoveCallback_js__WEBPACK_IMPORTED_MODULE_11__["default"].bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this)); 18824 _this.handleSelectedCallback = _bidirectionalTool_handleSelectedCallback_js__WEBPACK_IMPORTED_MODULE_12__["default"].bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this)); 18825 _this.handleSelectedMouseCallback = _bidirectionalTool_handleSelectedMouseCallback_js__WEBPACK_IMPORTED_MODULE_13__["default"].bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this)); 18826 _this.handleSelectedTouchCallback = _bidirectionalTool_handleSelectedTouchCallback_js__WEBPACK_IMPORTED_MODULE_14__["default"].bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this)); 18827 return _this; 18828 } 18829 18830 _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(BidirectionalTool, [{ 18831 key: "updateCachedStats", 18832 value: function updateCachedStats(image, element, data) { 18833 var pixelSpacing = Object(_util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_17__["default"])(image); 18834 18835 var _calculateLongestAndS = Object(_bidirectionalTool_utils_calculateLongestAndShortestDiameters__WEBPACK_IMPORTED_MODULE_18__["default"])(data, pixelSpacing), 18836 longestDiameter = _calculateLongestAndS.longestDiameter, 18837 shortestDiameter = _calculateLongestAndS.shortestDiameter; // Set measurement text to show lesion table 18838 18839 18840 data.longestDiameter = longestDiameter; 18841 data.shortestDiameter = shortestDiameter; 18842 data.invalidated = false;
18843 } 18844 }]); 18845 18846 return BidirectionalTool; 18847}(_base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]); 18848 18849 18850 18851/***/ }), 18852
18853/***/ "./tools/annotation/CircleRoiTool.js": 18854/*!*******************************************!*\ 18855 !*** ./tools/annotation/CircleRoiTool.js ***! 18856 \*******************************************/ 18857/*! exports provided: default */ 18858/***/ (function(module, __webpack_exports__, __webpack_require__) { 18859 18860"use strict"; 18861__webpack_require__.r(__webpack_exports__); 18862/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return CircleRoiTool; }); 18863/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js"); 18864/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); 18865/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js"); 18866/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); 18867/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js"); 18868/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); 18869/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js"); 18870/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); 18871/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js"); 18872/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__); 18873/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./../../externalModules.js */ "./externalModules.js"); 18874/* harmony import */ var _base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../base/BaseAnnotationTool.js */ "./tools/base/BaseAnnotationTool.js"); 18875/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./../../stateManagement/toolState.js */ "./stateManagement/toolState.js"); 18876/* harmony import */ var _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./../../stateManagement/toolStyle.js */ "./stateManagement/toolStyle.js"); 18877/* harmony import */ var _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./../../stateManagement/toolColors.js */ "./stateManagement/toolColors.js"); 18878/* harmony import */ var _drawing_index_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./../../drawing/index.js */ "./drawing/index.js"); 18879/* harmony import */ var _util_calculateSUV_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./../../util/calculateSUV.js */ "./util/calculateSUV.js"); 18880/* harmony import */ var _util_ellipse_index_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./../../util/ellipse/index.js */ "./util/ellipse/index.js"); 18881/* harmony import */ var _util_getROITextBoxCoords_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../util/getROITextBoxCoords.js */ "./util/getROITextBoxCoords.js"); 18882/* harmony import */ var _util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./../../util/numbersWithCommas.js */ "./util/numbersWithCommas.js"); 18883/* harmony import */ var _util_throttle_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./../../util/throttle.js */ "./util/throttle.js"); 18884/* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../util/logger.js */ "./util/logger.js"); 18885/* harmony import */ var _util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../../util/getPixelSpacing */ "./util/getPixelSpacing.js"); 18886/* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../cursors/index.js */ "./tools/cursors/index.js"); 18887 18888 18889 18890 18891 18892 18893 // State 18894 18895 18896 18897 // Drawing 18898 18899 // Util 18900 18901 18902 18903 18904 18905 18906 18907 18908 18909var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_16__["getLogger"])('tools:annotation:CircleRoiTool'); 18910/** 18911 * @public 18912 * @class CircleRoiTool 18913 * @memberof Tools.Annotation 18914 * @classdesc Tool for drawing circular regions of interest, and measuring 18915 * the statistics of the enclosed pixels. 18916 * @extends Tools.Base.BaseAnnotationTool 18917 */ 18918 18919var CircleRoiTool = 18920/*#__PURE__*/ 18921function (_BaseAnnotationTool) { 18922 _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(CircleRoiTool, _BaseAnnotationTool); 18923 18924 function CircleRoiTool() { 18925 var _this; 18926 18927 var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 18928 18929 _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, CircleRoiTool); 18930 18931 var defaultProps = {
18932 name: 'CircleRoi', 18933 supportedInteractionTypes: ['Mouse', 'Touch'], 18934 svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_18__["circleRoiCursor"] 18935 }; 18936 _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(CircleRoiTool).call(this, props, defaultProps)); 18937 _this.throttledUpdateCachedStats = Object(_util_throttle_js__WEBPACK_IMPORTED_MODULE_15__["default"])(_this.updateCachedStats, 110); 18938 return _this; 18939 } 18940 18941 _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(CircleRoiTool, [{ 18942 key: "createNewMeasurement", 18943 value: function createNewMeasurement(eventData) { 18944 var goodEventData = eventData && eventData.currentPoints && eventData.currentPoints.image; 18945 18946 if (!goodEventData) { 18947 logger.error("required eventData not supplied to tool ".concat(this.name, "'s createNewMeasurement")); 18948 return; 18949 } 18950 18951 return { 18952 visible: true, 18953 active: true, 18954 color: undefined, 18955 invalidated: true, 18956 handles: { 18957 start: { 18958 x: eventData.currentPoints.image.x, 18959 y: eventData.currentPoints.image.y, 18960 highlight: true, 18961 active: false 18962 }, 18963 end: { 18964 x: eventData.currentPoints.image.x, 18965 y: eventData.currentPoints.image.y, 18966 highlight: true, 18967 active: true 18968 }, 18969 initialRotation: eventData.viewport.rotation, 18970 textBox: { 18971 active: false, 18972 hasMoved: false, 18973 movesIndependently: false, 18974 drawnIndependently: true, 18975 allowedOutsideImage: true, 18976 hasBoundingBox: true 18977 } 18978 } 18979 }; 18980 } 18981 }, { 18982 key: "pointNearTool", 18983 value: function pointNearTool(element, data, coords, interactionType) { 18984 var hasStartAndEndHandles = data && data.handles && data.handles.start && data.handles.end; 18985 18986 if (!hasStartAndEndHandles) { 18987 logger.warn("invalid parameters supplied to tool ".concat(this.name, "'s pointNearTool")); 18988 } 18989 18990 if (!hasStartAndEndHandles || data.visible === false) { 18991 return false; 18992 } 18993 18994 var distance = interactionType === 'mouse' ? 15 : 25; 18995 var startCanvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.pixelToCanvas(element, data.handles.start); 18996 var endCanvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.pixelToCanvas(element, data.handles.end); // StartCanvas is the center of the circle 18997 18998 var distanceFromCenter = _getDistance(startCanvas, coords); // Getting radius of circle annotation in canvas 18999 19000 19001 var radius = _getDistance(startCanvas, endCanvas); // Checking if point is near the tool by comparing its distance from the center of the circle 19002 19003 19004 return distanceFromCenter > radius - distance / 2 && distanceFromCenter < radius + distance / 2; 19005 } 19006 }, { 19007 key: "updateCachedStats", 19008 value: function updateCachedStats(image, element, data) { 19009 var seriesModule = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.metaData.get('generalSeriesModule', image.imageId) || {}; 19010 var modality = seriesModule.modality; 19011 var pixelSpacing = Object(_util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_17__["default"])(image); 19012 19013 var stats = _calculateStats(image, element, data.handles, modality, pixelSpacing); 19014 19015 data.cachedStats = stats; 19016 data.invalidated = false; 19017 } 19018 }, { 19019 key: "renderToolData", 19020 value: function renderToolData(evt) { 19021 var _this2 = this; 19022 19023 var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_7__["getToolState"])(evt.currentTarget, this.name); 19024 19025 if (!toolData) { 19026 return; 19027 } 19028 19029 var eventData = evt.detail; 19030 var image = eventData.image, 19031 element = eventData.element, 19032 canvasContext = eventData.canvasContext; 19033 var lineWidth = _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_8__["default"].getToolW
19033idth(); 19034 var _this$configuration = this.configuration, 19035 handleRadius = _this$configuration.handleRadius, 19036 drawHandlesOnHover = _this$configuration.drawHandlesOnHover; 19037 var newContext = Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["getNewContext"])(canvasContext.canvas); 19038 19039 var _getPixelSpacing = Object(_util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_17__["default"])(image), 19040 rowPixelSpacing = _getPixelSpacing.rowPixelSpacing, 19041 colPixelSpacing = _getPixelSpacing.colPixelSpacing; // Meta 19042 19043 19044 var seriesModule = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.metaData.get('generalSeriesModule', image.imageId) || {}; // Pixel Spacing 19045 19046 var modality = seriesModule.modality; 19047 var hasPixelSpacing = rowPixelSpacing && colPixelSpacing; 19048 Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["draw"])(newContext, function (context) { 19049 // If we have tool data for this element, iterate over each set and draw it 19050 for (var i = 0; i < toolData.data.length; i++) { 19051 var data = toolData.data[i]; 19052 19053 if (data.visible === false) { 19054 continue; 19055 } // Configure 19056 19057 19058 var color = _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_9__["default"].getColorIfActive(data); 19059 var handleOptions = { 19060 color: color, 19061 handleRadius: handleRadius, 19062 drawHandlesIfActive: drawHandlesOnHover 19063 }; 19064 Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["setShadow"])(context, _this2.configuration); 19065 var startCanvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.pixelToCanvas(element, data.handles.start); 19066 var endCanvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.pixelToCanvas(element, data.handles.end); // Calculating the radius where startCanvas is the center of the circle to be drawn 19067 19068 var radius = _getDistance(startCanvas, endCanvas); // Draw Circle 19069 19070 19071 Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["drawCircle"])(context, element, data.handles.start, radius, { 19072 color: color 19073 }, 'pixel'); 19074 Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["drawHandles"])(context, eventData, data.handles, handleOptions); // Update textbox stats 19075 19076 if (data.invalidated === true) { 19077 if (data.cachedStats) { 19078 _this2.throttledUpdateCachedStats(image, element, data); 19079 } else { 19080 _this2.updateCachedStats(image, element, data); 19081 } 19082 } // Default to textbox on right side of ROI 19083 19084 19085 if (!data.handles.textBox.hasMoved) { 19086 var defaultCoords = Object(_util_getROITextBoxCoords_js__WEBPACK_IMPORTED_MODULE_13__["default"])(eventData.viewport, data.handles); 19087 Object.assign(data.handles.textBox, defaultCoords); 19088 } 19089 19090 var textBoxAnchorPoints = function textBoxAnchorPoints(handles) { 19091 return _findTextBoxAnchorPoints(handles.start, handles.end); 19092 }; 19093 19094 var textBoxContent = _createTextBoxContent(context, image.color, data.cachedStats, modality, hasPixelSpacing, _this2.configuration); 19095 19096 Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["drawLinkedTextBox"])(context, element, data.handles.textBox, textBoxContent, data.handles, textBoxAnchorPoints, color, lineWidth, 10, true); 19097 } 19098 }); 19099 } 19100 }]); 19101 19102 return CircleRoiTool; 19103}(_base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]); 19104/** 19105 * 19106 * 19107 * @param {*} startHandle 19108 * @param {*} endHandle 19109 * @returns {Array.<{x: number, y: number}>} 19110 */ 19111 19112 19113 19114 19115function _findTextBoxAnchorPoints(startHandle, endHandle) { 19116 var _getCirlceImageCoodin = _getCirlceImageCoodinates(startHandle, endHandle), 19117 left = _getCirlceImageCoodin.left, 19118 top = _getCirlceImageCoodin.top, 19119 width = _getCirlceImageCoodin.width, 19120 height = _getCirlceImageCoodin.height; 19121 19122 return [{ 19123 // Top middle point of ellipse 19124 x: left + width / 2, 19125 y: top 19126 }, { 19127 // Left middle point of ellipse 19128 x: left, 19129 y: top + height / 2 19130 }, { 19131 // Bottom middle point of ellipse 19132 x: left + width / 2, 19133 y: top + height 19134 }, { 19135 // Right middle point of ellipse 19136 x: left + width, 19137 y: top + height / 2 19138 }]; 19139} 19140/** 19141 * 19142 * 19143 * @param {*} context 19144 * @param {*} isColorImage 19145 * @param {*} { area, mean, stdDev, min, max, meanStdDevSUV } 19146 * @param {*} modality 19147 * @param {*} hasPixelSpacing 19148 * @param {*} [options={}] - { showMinMax, showHounsfieldUnits } 19149 * @returns {string[]} 19150 */ 19151 19152 19153function _createTextBoxContent(context, isColorImage) { 19154 var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}, 19155 area = _ref.area, 19156 mean = _ref.mean, 19157 stdDev = _ref.stdDev, 19158 min = _ref.min, 19159 max = _ref.max, 19160 meanStdDevSUV = _ref.meanStdDevSUV; 19161 19162 var modality = arguments.length > 3 ? arguments[3] : undefined; 19163 var hasPixelSpacing = arguments.length > 4 ? arguments[4] : undefined; 19164 var options = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {}; 19165 var showMinMax = options.showMinMax || false; 19166 var showHounsfieldUnits = options.showHounsfieldUnits !== false; 19167 var textLines = []; // Don't display mean/standardDev for color images 19168 19169 var otherLines = []; 19170 19171 if (!isColorImage) { 19172 var hasStandardUptakeValues = meanStdDevSUV && meanStdDevSUV.mean !== 0; 19173 var suffix = modality === 'CT' && showHounsfieldUnits ? ' HU' : ''; 19174 var meanString = "Mean: ".concat(Object(_util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_14__["default"])(mean.toFixed(2))).concat(suffix); 19175 var stdDevString = "Std Dev: ".concat(Object(_util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_14__["default"])(stdDev.toFixed(2))).concat(suffix); // If this image has SUV values to display, concatenate them to the text line 19176 19177 if (hasStandardUptakeValues) { 19178 var SUVtext = ' SUV: '; 19179 var meanSuvString = "".concat(SUVtext).concat(Object(_util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_14__["default"])(meanStdDevSUV.mean.toFixed(2))); 19180 var stdDevSuvString = "".concat(SUVtext).concat(Object(_util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_14__["default"])(meanStdDevSUV.stdDev.toFixed(2))); 19181 var targetStringLength = Math.floor(context.measureText("".concat(stdDevString, " ")).width); 19182 19183 while (context.measureText(meanString).width < targetStringLength) { 19184 meanString += ' '; 19185 } 19186 19187 otherLines.push("".concat(meanString).concat(meanSuvString)); 19188 otherLines.push("".concat(stdDevString, " ").concat(stdDevSuvString)); 19189 } else { 19190 otherLines.push("".concat(meanString, " ").concat(stdDevString)); 19191 } 19192 19193 if (showMinMax) {
19194 var minString = "Min: ".concat(min).concat(suffix); 19195 var maxString = "Max: ".concat(max).concat(suffix); 19196 19197 var _targetStringLength = hasStandardUptakeValues ? Math.floor(context.measureText("".concat(stdDevString, " ")).width) : Math.floor(context.measureText("".concat(meanString, " ")).width); 19198 19199 while (context.measureText(minString).width < _targetStringLength) { 19200 minString += ' '; 19201 } 19202 19203 otherLines.push("".concat(minString).concat(maxString)); 19204 } 19205 } 19206 19207 textLines.push(_formatArea(area, hasPixelSpacing)); 19208 otherLines.forEach(function (x) { 19209 return textLines.push(x); 19210 }); 19211 return textLines; 19212} 19213/** 19214 * 19215 * 19216 * @param {*} area 19217 * @param {*} hasPixelSpacing 19218 * @returns {string} The formatted label for showing area 19219 */ 19220 19221 19222function _formatArea(area, hasPixelSpacing) { 19223 // This uses Char code 178 for a superscript 2 19224 var suffix = hasPixelSpacing ? " mm".concat(String.fromCharCode(178)) : " px".concat(String.fromCharCode(178)); 19225 return "Area: ".concat(Object(_util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_14__["default"])(area.toFixed(2))).concat(suffix); 19226} 19227/** 19228 * 19229 * 19230 * @param {*} image 19231 * @param {*} element 19232 * @param {*} handles 19233 * @param {*} modality 19234 * @param {*} pixelSpacing 19235 * @returns {Object} The Stats object 19236 */ 19237 19238 19239function _calculateStats(image, element, handles, modality, pixelSpacing) { 19240 // Retrieve the bounds of the ellipse in image coordinates 19241 var circleCoordinates = _getCirlceImageCoodinates(handles.start, handles.end); // Retrieve the array of pixels that the ellipse bounds cover 19242 19243 19244 var pixels = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.getPixels(element, circleCoordinates.left, circleCoordinates.top, circleCoordinates.width, circleCoordinates.height); // Calculate the mean & standard deviation from the pixels and the ellipse details. 19245 19246 var ellipseMeanStdDev = Object(_util_ellipse_index_js__WEBPACK_IMPORTED_MODULE_12__["calculateEllipseStatistics"])(pixels, circleCoordinates); 19247 var meanStdDevSUV; 19248 19249 if (modality === 'PT') { 19250 meanStdDevSUV = { 19251 mean: Object(_util_calculateSUV_js__WEBPACK_IMPORTED_MODULE_11__["default"])(image, ellipseMeanStdDev.mean, true) || 0, 19252 stdDev: Object(_util_calculateSUV_js__WEBPACK_IMPORTED_MODULE_11__["default"])(image, ellipseMeanStdDev.stdDev, true) || 0 19253 }; 19254 } 19255 19256 var area = Math.PI * (circleCoordinates.width * (pixelSpacing.colPixelSpacing || 1) / 2) * (circleCoordinates.height * (pixelSpacing.rowPixelSpacing || 1) / 2); 19257 return { 19258 area: area || 0, 19259 count: ellipseMeanStdDev.count || 0, 19260 mean: ellipseMeanStdDev.mean || 0, 19261 variance: ellipseMeanStdDev.variance || 0, 19262 stdDev: ellipseMeanStdDev.stdDev || 0, 19263 min: ellipseMeanStdDev.min || 0, 19264 max: ellipseMeanStdDev.max || 0, 19265 meanStdDevSUV: meanStdDevSUV 19266 }; 19267} 19268/** 19269 * Retrieve the bounds of the ellipse in image coordinates 19270 * 19271 * @param {*} startHandle 19272 * @param {*} endHandle 19273 * @returns {{ left: number, top: number, width: number, height: number }} 19274 */ 19275 19276 19277function _getCirlceImageCoodinates(startHandle, endHandle) { 19278 var radius = _getDistance(startHandle, endHandle); 19279 19280 return { 19281 left: Math.round(Math.min(startHandle.x - radius, endHandle.x)), 19282 top: Math.round(Math.min(startHandle.y - radius, endHandle.y)), 19283 width: radius * 2, 19284 height: radius * 2 19285 }; 19286} 19287/** 19288 * Returns the distance in canvas from the given coords to the center of the circle annotation. 19289 * 19290 * @param {*} startCoords - start point cooridnates 19291 * @param {*} endCoords - end point cooridnates 19292 * @returns {number} number - the distance between two points (start and end) 19293 */ 19294 19295 19296function _getDistance(startCoords, endCoords) { 19297 var dx = startCoords.x - endCoords.x; 19298 var dy = startCoords.y - endCoords.y; 19299 return Math.sqrt(dx * dx + dy * dy); 19300} 19301 19302/***/ }), 19303
19304/***/ "./tools/annotation/CobbAngleTool.js": 19305/*!*******************************************!*\ 19306 !*** ./tools/annotation/CobbAngleTool.js ***! 19307 \*******************************************/ 19308/*! exports provided: default */ 19309/***/ (function(module, __webpack_exports__, __webpack_require__) { 19310 19311"use strict"; 19312__webpack_require__.r(__webpack_exports__); 19313/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return CobbAngleTool; }); 19314/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js"); 19315/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); 19316/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js"); 19317/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); 19318/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js"); 19319/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); 19320/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js"); 19321/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); 19322/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js"); 19323/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__); 19324/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./../../externalModules.js */ "./externalModules.js"); 19325/* harmony import */ var _base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../base/BaseAnnotationTool.js */ "./tools/base/BaseAnnotationTool.js"); 19326/* harmony import */ var _stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./../../stateManagement/textStyle.js */ "./stateManagement/textStyle.js"); 19327/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./../../stateManagement/toolState.js */ "./stateManagement/toolState.js"); 19328/* harmony import */ var _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./../../stateManagement/toolStyle.js */ "./stateManagement/toolStyle.js"); 19329/* harmony import */ var _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./../../stateManagement/toolColors.js */ "./stateManagement/toolColors.js"); 19330/* harmony import */ var _manipulators_index_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./../../manipulators/index.js */ "./manipulators/index.js"); 19331/* harmony import */ var _drawing_index_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./../../drawing/index.js */ "./drawing/index.js"); 19332/* harmony import */ var _drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./../../drawing/drawHandles.js */ "./drawing/drawHandles.js"); 19333/* harmony import */ var _drawing_drawLinkedTextBox_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./../../drawing/drawLinkedTextBox.js */ "./drawing/drawLinkedTextBox.js"); 19334/* harmony import */ var _util_lineSegDistance_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./../../util/lineSegDistance.js */ "./util/lineSegDistance.js"); 19335/* harmony import */ var _util_roundToDecimal_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./../../util/roundToDecimal.js */ "./util/roundToDecimal.js"); 19336/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./../../events.js */ "./events.js"); 19337/* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../cursors/index.js */ "./tools/cursors/index.js"); 19338/* harmony import */ var _util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../../util/triggerEvent.js */ "./util/triggerEvent.js"); 19339/* harmony import */ var _util_throttle__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../../util/throttle */ "./util/throttle.js"); 19340/* harmony import */ var _util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../../util/getPixelSpacing */ "./util/getPixelSpacing.js"); 19341 19342 19343 19344 19345 19346 19347 // State 19348 19349 19350 19351 19352 // Manipulators 19353 19354 // Drawing 19355 19356 19357 19358 19359 19360 19361 19362 19363 19364 19365 19366/** 19367 * @public 19368 * @class CobbAngleTool 19369 * @memberof Tools.Annotation 19370 * @classdesc Tool for measuring the angle between two straight lines. 19371 * @extends Tools.Base.BaseAnnotationTool 19372 */ 19373 19374var CobbAngleTool = 19375/*#__PURE__*/ 19376function (_BaseAnnotationTool) { 19377 _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(CobbAngleTool, _BaseAnnotationTool); 19378 19379 function CobbAngleTool() { 19380 var _this; 19381 19382 var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 19383 19384 _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, CobbAngleTool); 19385 19386 var defaultProps = { 19387 name: 'CobbAngle', 19388 supportedInteractionTypes: ['Mouse', 'Touch'], 19389 svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_18__["cobbAngleCursor"] 19390 }; 19391 _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(CobbAngleTool).call(this, props, defaultProps)); 19392 _this.hasIncomplete = false;
19393 _this.throttledUpdateCachedStats = Object(_util_throttle__WEBPACK_IMPORTED_MODULE_20__["default"])(_this.updateCachedStats, 110); 19394 return _this; 19395 } 19396 19397 _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(CobbAngleTool, [{ 19398 key: "createNewMeasurement", 19399 value: function createNewMeasurement(eventData) { 19400 // Create the measurement data for this tool with the end handle activated 19401 this.hasIncomplete = true; 19402 return { 19403 visible: true, 19404 active: true, 19405 color: undefined, 19406 invalidated: true, 19407 complete: false, 19408 value: '', 19409 handles: { 19410 start: { 19411 x: eventData.currentPoints.image.x, 19412 y: eventData.currentPoints.image.y, 19413 highlight: true, 19414 active: false 19415 }, 19416 end: { 19417 x: eventData.currentPoints.image.x, 19418 y: eventData.currentPoints.image.y, 19419 highlight: true, 19420 active: true 19421 }, 19422 start2: { 19423 x: eventData.currentPoints.image.x, 19424 y: eventData.currentPoints.image.y, 19425 highlight: true, 19426 active: false, 19427 drawnIndependently: true 19428 }, 19429 end2: { 19430 x: eventData.currentPoints.image.x + 1, 19431 y: eventData.currentPoints.image.y, 19432 highlight: true, 19433 active: false, 19434 drawnIndependently: true 19435 }, 19436 textBox: { 19437 active: false, 19438 hasMoved: false, 19439 movesIndependently: false, 19440 drawnIndependently: true, 19441 allowedOutsideImage: true, 19442 hasBoundingBox: true 19443 } 19444 } 19445 }; 19446 } 19447 /** 19448 * 19449 * 19450 * @param {*} element 19451 * @param {*} data 19452 * @param {*} coords 19453 * @returns {Boolean} 19454 */ 19455 19456 }, { 19457 key: "pointNearTool", 19458 value: function pointNearTool(element, data, coords) { 19459 if (data.visible === false) { 19460 return false; 19461 } 19462 19463 if (this.hasIncomplete) { 19464 return false; 19465 } 19466 19467 return Object(_util_lineSegDistance_js__WEBPACK_IMPORTED_MODULE_15__["default"])(element, data.handles.start, data.handles.end, coords) < 25 || Object(_util_lineSegDistance_js__WEBPACK_IMPORTED_MODULE_15__["default"])(element, data.handles.start2, data.handles.end2, coords) < 25; 19468 } 19469 }, { 19470 key: "updateCachedStats", 19471 value: function updateCachedStats(image, element, data) { 19472 var _getPixelSpacing = Object(_util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_21__["default"])(image), 19473 rowPixelSpacing = _getPixelSpacing.rowPixelSpacing, 19474 colPixelSpacing = _getPixelSpacing.colPixelSpacing; 19475 19476 var dx1 = (Math.ceil(data.handles.start.x) - Math.ceil(data.handles.end.x)) * colPixelSpacing; 19477 var dy1 = (Math.ceil(data.handles.start.y) - Math.ceil(data.handles.end.y)) * rowPixelSpacing; 19478 var dx2 = (Math.ceil(data.handles.start2.x) - Math.ceil(data.handles.end2.x)) * colPixelSpacing; 19479 var dy2 = (Math.ceil(data.handles.start2.y) - Math.ceil(data.handles.end2.y)) * rowPixelSpacing; 19480 var angle = Math.acos(Math.abs((dx1 * dx2 + dy1 * dy2) / (Math.sqrt(dx1 * dx1 + dy1 * dy1) * Math.sqrt(dx2 * dx2 + dy2 * dy2)))); 19481 angle *= 180 / Math.PI; 19482 data.rAngle = Object(_util_roundToDecimal_js__WEBPACK_IMPORTED_MODULE_16__["default"])(angle, 2); 19483 data.invalidated = false; 19484 } 19485 }, { 19486 key: "renderToolData", 19487 value: function renderToolData(evt) { 19488 var _this2 = this; 19489 19490 var eventData = evt.detail; 19491 var _this$configuration = this.configuration, 19492 handleRadius = _this$configuration.handleRadius, 19493 drawHandlesOnHover = _this$configuration.drawHandlesOnHover; // If we have no toolData for this element, return immediately as there is nothing to do 19494 19495 var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_8__["getToolState"])(evt.currentTarget, this.name); 19496 19497 if (!toolData) { 19498 return; 19499 } // We have tool data for this element - iterate over each one and draw it 19500 19501 19502 var context = Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_12__["getNewContext"])(eventData.canvasContext.canvas); 19503 var lineWidth = _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_9__["default"].getToolW
19503idth(); 19504 var font = _stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_7__["default"].getFont(); 19505 19506 var _loop = function _loop(i) { 19507 var data = toolData.data[i]; 19508 19509 if (data.visible === false) { 19510 return "continue"; 19511 } 19512 19513 Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_12__["draw"])(context, function (context) { 19514 Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_12__["setShadow"])(context, _this2.configuration); // Differentiate the color of activation tool 19515 19516 var color = _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_10__["default"].getColorIfActive(data); 19517 Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_12__["drawLine"])(context, eventData.element, data.handles.start, data.handles.end, { 19518 color: color 19519 }); 19520 19521 if (data.complete) { 19522 Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_12__["drawLine"])(context, eventData.element, data.handles.start2, data.handles.end2, { 19523 color: color 19524 }); 19525 } // Draw the handles 19526 19527 19528 var handleOptions = { 19529 color: color, 19530 handleRadius: handleRadius, 19531 drawHandlesIfActive: drawHandlesOnHover 19532 }; 19533 Object(_drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_13__["default"])(context, eventData, data.handles, handleOptions); // Draw the text 19534 19535 context.fillStyle = color; 19536 var text = data.value; 19537 19538 if (!data.handles.textBox.hasMoved) { 19539 var textCoords = { 19540 x: (data.handles.start.x + data.handles.end.x) / 2, 19541 y: (data.handles.start.y + data.handles.end.y) / 2 - 10 19542 }; 19543 context.font = font; 19544 data.handles.textBox.x = textCoords.x; 19545 data.handles.textBox.y = textCoords.y; 19546 } 19547 19548 Object(_drawing_drawLinkedTextBox_js__WEBPACK_IMPORTED_MODULE_14__["default"])(context, eventData.element, data.handles.textBox, text, data.handles, textBoxAnchorPoints, color, lineWidth, 0, true); 19549 }); 19550 }; 19551 19552 for (var i = 0; i < toolData.data.length; i++) { 19553 var _ret = _loop(i); 19554 19555 if (_ret === "continue") continue; 19556 } 19557 19558 function textBoxAnchorPoints(handles) { 19559 return [handles.start, handles.start2, handles.end, handles.end2]; 19560 } 19561 } 19562 }, { 19563 key: "getIncomplete", 19564 value: function getIncomplete(element) { 19565 var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_8__["getToolState"])(element, this.name); 19566 19567 if (toolState && Array.isArray(toolState.data)) { 19568 return toolState.data.find(function (_ref) { 19569 var complete = _ref.complete; 19570 return complete === false; 19571 }); 19572 } 19573 } 19574 }, { 19575 key: "addNewMeasurement", 19576 value: function addNewMeasurement(evt, interactionType) { 19577 var _this3 = this; 19578 19579 evt.preventDefault(); 19580 evt.stopPropagation(); 19581 var eventData = evt.detail; 19582 var measurementData; 19583 var toMoveHandle; 19584 var options; // Search for incomplete measurements 19585 19586 var element = evt.detail.element; 19587 var pendingMeasurement = this.getIncomplete(element); 19588 19589 if (pendingMeasurement) { 19590 measurementData = pendingMeasurement; 19591 measurementData.complete = true; 19592 measurementData.handles.start2 = { 19593 x: eventData.currentPoints.image.x, 19594 y: eventData.currentPoints.image.y, 19595 drawnIndependently: false, 19596 highlight: true, 19597 active: false 19598 }; 19599 measurementData.handles.end2 = { 19600 x: eventData.currentPoints.image.x, 19601 y: eventData.currentPoints.image.y, 19602 drawnIndependently: false, 19603 highlight: true, 19604 active: true 19605 }; 19606 toMoveHandle = measurementData.handles.end2; 19607 this.hasIncomplete = false; 19608 options = Object.assign({ 19609 doneMovingCallback: function doneMovingCallback() { 19610 var eventType = _events_js__WEBPACK_IMPORTED_MODULE_17__["default"].MEASUREMENT_COMPLETED; 19611 var eventData = { 19612 toolType: _this3.name, 19613 element: element, 19614 measurementData: measurementData 19615 }; 19616 Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_19__["default"])(element, eventType, eventData); 19617 } 19618 }, this.options); 19619 } else { 19620 measurementData = this.createNewMeasurement(eventData); 19621 Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_8__["addToolState"])(element, this.name, measurementData); 19622 toMoveHandle = measurementData.handles.end; 19623 options = this.options; 19624 } // Associate this data with this imageId so we can render it and manipulate it 19625 19626 19627 _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.updateImage(element); 19628 Object(_manipulators_index_js__WEBPACK_IMPORTED_MODULE_11__["moveNewHandle"])(eventData, this.name, measurementData, toMoveHandle, options, interactionType); 19629 } 19630 }, { 19631 key: "onMeasureModified", 19632 value: function onMeasureModified(ev) { 19633 var element = ev.detail.element; 19634 var image = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.getEnabledElement(element).image; 19635 19636 var _getPixelSpacing2 = Object(_util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_21__["default"])(image), 19637 rowPixelSpacing = _getPixelSpacing2.rowPixelSpacing, 19638 colPixelSpacing = _getPixelSpacing2.colPixelSpacing; 19639 19640 if (ev.detail.toolName !== this.name) { 19641 return; 19642 } 19643 19644 var data = ev.detail.measurementData; // Update textbox stats 19645 19646 if (data.invalidated === true) { 19647 if (data.rAngle) { 19648 this.throttledUpdateCachedStats(image, element, data); 19649 } else { 19650 this.updateCachedStats(image, element, data); 19651 } 19652 } 19653 19654 var rAngle = data.rAngle; 19655 data.value = ''; 19656 19657 if (!Number.isNaN(rAngle)) { 19658 data.value = textBoxText(rAngle, rowPixelSpacing, colPixelSpacing); 19659 } 19660 19661 function textBoxText(rAngle, rowPixelSpacing, colPixelSpacing) { 19662 var suffix = !rowPixelSpacing || !colPixelSpacing ? ' (isotropic)' : ''; 19663 var str = '00B0'; // Degrees symbol 19664 19665 return rAngle.toString() + String.fromCharCode(parseInt(str, 16)) + suffix; 19666 } 19667 } 19668 }, { 19669 key: "activeCallback", 19670 value: function activeCallback(element) { 19671 this.onMeasureModified = this.onMeasureModified.bind(this); 19672 element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_17__["default"].MEASUREMENT_MODIFIED, this.onMeasureModified); 19673 } 19674 }, { 19675 key: "passiveCallback", 19676 value: function passiveCallback(element) { 19677 this.onMeasureModified = this.onMeasureModified.bind(this); 19678 element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_17__["default"].MEASUREMENT_MODIFIED, this.onMeasureModified); 19679 } 19680 }, { 19681 key: "enabledCallback", 19682 value: function enabledCallback(element) { 19683 element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_17__["default"].MEASUREMENT_MODIFIED, this.onMeasureModified); 19684 } 19685 }, { 19686 key: "disabledCallback", 19687 value: function disabledCallback(element) { 19688 element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_17__["default"].MEASUREMENT_MODIFIED, this.onMeasureModified); 19689 } 19690 }]); 19691 19692 return CobbAngleTool; 19693}(_base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]); 19694 19695 19696 19697/***/ }), 19698
19699/***/ "./tools/annotation/EllipticalRoiTool.js": 19700/*!***********************************************!*\ 19701 !*** ./tools/annotation/EllipticalRoiTool.js ***! 19702 \***********************************************/ 19703/*! exports provided: default */ 19704/***/ (function(module, __webpack_exports__, __webpack_require__) { 19705 19706"use strict"; 19707__webpack_require__.r(__webpack_exports__); 19708/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return EllipticalRoiTool; }); 19709/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js"); 19710/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); 19711/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js"); 19712/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); 19713/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js"); 19714/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); 19715/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js"); 19716/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); 19717/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js"); 19718/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__); 19719/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./../../externalModules.js */ "./externalModules.js"); 19720/* harmony import */ var _base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../base/BaseAnnotationTool.js */ "./tools/base/BaseAnnotationTool.js"); 19721/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./../../stateManagement/toolState.js */ "./stateManagement/toolState.js"); 19722/* harmony import */ var _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./../../stateManagement/toolStyle.js */ "./stateManagement/toolStyle.js"); 19723/* harmony import */ var _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./../../stateManagement/toolColors.js */ "./stateManagement/toolColors.js"); 19724/* harmony import */ var _drawing_index_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./../../drawing/index.js */ "./drawing/index.js"); 19725/* harmony import */ var _util_calculateSUV_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./../../util/calculateSUV.js */ "./util/calculateSUV.js"); 19726/* harmony import */ var _util_ellipse_index_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./../../util/ellipse/index.js */ "./util/ellipse/index.js"); 19727/* harmony import */ var _util_getROITextBoxCoords_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../util/getROITextBoxCoords.js */ "./util/getROITextBoxCoords.js"); 19728/* harmony import */ var _util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./../../util/numbersWithCommas.js */ "./util/numbersWithCommas.js"); 19729/* harmony import */ var _util_throttle_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./../../util/throttle.js */ "./util/throttle.js"); 19730/* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../cursors/index.js */ "./tools/cursors/index.js"); 19731/* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../../util/logger.js */ "./util/logger.js"); 19732/* harmony import */ var _util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../../util/getPixelSpacing */ "./util/getPixelSpacing.js"); 19733 19734 19735 19736 19737 19738 19739 // State 19740 19741 19742 19743 // Drawing 19744 19745 // Util 19746 19747 19748 19749 19750 19751 19752 19753 19754 19755var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_17__["getLogger"])('tools:annotation:EllipticalRoiTool'); 19756/** 19757 * @public 19758 * @class EllipticalRoiTool 19759 * @memberof Tools.Annotation 19760 * @classdesc Tool for drawing elliptical regions of interest, and measuring 19761 * the statistics of the enclosed pixels. 19762 * @extends Tools.Base.BaseAnnotationTool 19763 */ 19764 19765var EllipticalRoiTool = 19766/*#__PURE__*/ 19767function (_BaseAnnotationTool) { 19768 _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(EllipticalRoiTool, _BaseAnnotationTool); 19769 19770 function EllipticalRoiTool() { 19771 var _this; 19772 19773 var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 19774 19775 _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, EllipticalRoiTool); 19776 19777 var defaultProps = { 19778 name: 'EllipticalRoi', 19779 supportedInteractionTypes: ['Mouse', 'Touch'], 19780 configuration: {// showMinMax: false, 19781 // showHounsfieldUnits: true, 19782 }, 19783 svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_16__["ellipticalRoiCursor"] 19784 }; 19785 _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(EllipticalRoiTool).call(this, props, defaultProps)); 19786 _this.throttledUpdateCachedStats = Object(_util_throttle_js__WEBPACK_IMPORTED_MODULE_15__["default"])(_this.updateCachedStats, 110); 19787 return _this; 19788 } 19789 19790 _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(EllipticalRoiTool, [{ 19791 key: "createNewMeasurement", 19792 value: function createNewMeasurement(eventData) { 19793 var goodEventData = eventData && eventData.currentPoints && eventData.currentPoints.image; 19794 19795 if (!goodEventData) { 19796 logger.error("required eventData not supplied to tool ".concat(this.name, "'s createNewMeasurement")); 19797 return; 19798 } 19799 19800 return { 19801 visible: true, 19802 active: true, 19803 color: undefined, 19804 invalidated: true, 19805 handles: { 19806 start: { 19807 x: eventData.currentPoints.image.x, 19808 y: eventData.currentPoints.image.y, 19809 highlight: true, 19810 active: false 19811 }, 19812 end: { 19813 x: eventData.currentPoints.image.x, 19814 y: eventData.currentPoints.image.y, 19815 highlight: true, 19816 active: true 19817 }, 19818 initialRotation: eventData.viewport.rotation, 19819 textBox: { 19820 active: false, 19821 hasMoved: false, 19822 movesIndependently: false, 19823 drawnIndependently: true, 19824 allowedOutsideImage: true, 19825 hasBoundingBox: true 19826 } 19827 } 19828 }; 19829 } 19830 }, { 19831 key: "pointNearTool", 19832 value: function pointNearTool(element, data, coords, interactionType) { 19833 var hasStartAndEndHandles = data && data.handles && data.handles.start && data.handles.end;
19834 var validParameters = hasStartAndEndHandles; 19835 19836 if (!validParameters) { 19837 logger.warn("invalid parameters supplied to tool ".concat(this.name, "'s pointNearTool")); 19838 } 19839 19840 if (!validParameters || data.visible === false) { 19841 return false; 19842 } 19843 19844 var distance = interactionType === 'mouse' ? 15 : 25; 19845 var startCanvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.pixelToCanvas(element, data.handles.start); 19846 var endCanvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.pixelToCanvas(element, data.handles.end); 19847 var minorEllipse = { 19848 left: Math.min(startCanvas.x, endCanvas.x) + distance / 2, 19849 top: Math.min(startCanvas.y, endCanvas.y) + distance / 2, 19850 width: Math.abs(startCanvas.x - endCanvas.x) - distance, 19851 height: Math.abs(startCanvas.y - endCanvas.y) - distance 19852 }; 19853 var majorEllipse = { 19854 left: Math.min(startCanvas.x, endCanvas.x) - distance / 2, 19855 top: Math.min(startCanvas.y, endCanvas.y) - distance / 2, 19856 width: Math.abs(startCanvas.x - endCanvas.x) + distance, 19857 height: Math.abs(startCanvas.y - endCanvas.y) + distance 19858 }; 19859 var pointInMinorEllipse = Object(_util_ellipse_index_js__WEBPACK_IMPORTED_MODULE_12__["pointInEllipse"])(minorEllipse, coords); 19860 var pointInMajorEllipse = Object(_util_ellipse_index_js__WEBPACK_IMPORTED_MODULE_12__["pointInEllipse"])(majorEllipse, coords); 19861 19862 if (pointInMajorEllipse && !pointInMinorEllipse) { 19863 return true; 19864 } 19865 19866 return false; 19867 } 19868 }, { 19869 key: "updateCachedStats", 19870 value: function updateCachedStats(image, element, data) { 19871 var seriesModule = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.metaData.get('generalSeriesModule', image.imageId) || {}; 19872 var modality = seriesModule.modality; 19873 var pixelSpacing = Object(_util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_18__["default"])(image); 19874 19875 var stats = _calculateStats(image, element, data.handles, modality, pixelSpacing); 19876 19877 data.cachedStats = stats; 19878 data.invalidated = false; 19879 } 19880 }, { 19881 key: "renderToolData", 19882 value: function renderToolData(evt) { 19883 var _this2 = this; 19884 19885 var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_7__["getToolState"])(evt.currentTarget, this.name); 19886 19887 if (!toolData) { 19888 return; 19889 } 19890 19891 var eventData = evt.detail; 19892 var image = eventData.image, 19893 element = eventData.element; 19894 var lineWidth = _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_8__["default"].getToolW
19894idth(); 19895 var _this$configuration = this.configuration, 19896 handleRadius = _this$configuration.handleRadius, 19897 drawHandlesOnHover = _this$configuration.drawHandlesOnHover; 19898 var context = Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["getNewContext"])(eventData.canvasContext.canvas); 19899 19900 var _getPixelSpacing = Object(_util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_18__["default"])(image), 19901 rowPixelSpacing = _getPixelSpacing.rowPixelSpacing, 19902 colPixelSpacing = _getPixelSpacing.colPixelSpacing; // Meta 19903 19904 19905 var seriesModule = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.metaData.get('generalSeriesModule', image.imageId) || {}; // Pixel Spacing 19906 19907 var modality = seriesModule.modality; 19908 var hasPixelSpacing = rowPixelSpacing && colPixelSpacing; 19909 Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["draw"])(context, function (context) { 19910 // If we have tool data for this element - iterate over each set and draw it 19911 for (var i = 0; i < toolData.data.length; i++) { 19912 var data = toolData.data[i]; 19913 19914 if (data.visible === false) { 19915 continue; 19916 } // Configure 19917 19918 19919 var color = _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_9__["default"].getColorIfActive(data); 19920 var handleOptions = { 19921 color: color, 19922 handleRadius: handleRadius, 19923 drawHandlesIfActive: drawHandlesOnHover 19924 }; 19925 var lineOptions = { 19926 color: color 19927 }; 19928 if(data.lineWidth){ 19929 lineOptions.lineWidth = data.lineWidth; 19930 } 19931 Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["setShadow"])(context, _this2.configuration); // Draw 19932 19933 Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["drawEllipse"])(context, element, data.handles.start, data.handles.end, 19934 lineOptions, 'pixel', data.handles.initialRotation); 19935 Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["drawHandles"])(context, eventData, data.handles, handleOptions); // Update textbox stats 19936 19937 if (data.invalidated === true) { 19938 if (data.cachedStats) { 19939 _this2.throttledUpdateCachedStats(image, element, data); 19940 } else { 19941 _this2.updateCachedStats(image, element, data); 19942 } 19943 } // Default to textbox on right side of ROI 19944 19945 19946 if (!data.handles.textBox.hasMoved) { 19947 var defaultCoords = Object(_util_getROITextBoxCoords_js__WEBPACK_IMPORTED_MODULE_13__["default"])(eventData.viewport, data.handles); 19948 Object.assign(data.handles.textBox, defaultCoords); 19949 } 19950 19951 var textBoxAnchorPoints = function textBoxAnchorPoints(handles) { 19952 return _findTextBoxAnchorPoints(handles.start, handles.end); 19953 }; 19954 19955 var textBoxContent = _createTextBoxContent(context, image.color, data.cachedStats, modality, hasPixelSpacing, _this2.configuration); 19956 19957 Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["drawLinkedTextBox"])(context, element, data.handles.textBox, textBoxContent, data.handles, textBoxAnchorPoints, color, lineWidth, 10, true); 19958 } 19959 }); 19960 } 19961 }]); 19962 19963 return EllipticalRoiTool; 19964}(_base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]); 19965/** 19966 * 19967 * 19968 * @param {*} startHandle 19969 * @param {*} endHandle 19970 * @returns {Array.<{x: number, y: number}>} 19971 */ 19972 19973 19974 19975 19976function _findTextBoxAnchorPoints(startHandle, endHandle) { 19977 var _getEllipseImageCoord = _getEllipseImageCoordinates(startHandle, endHandle), 19978 left = _getEllipseImageCoord.left, 19979 top = _getEllipseImageCoord.top, 19980 width = _getEllipseImageCoord.width, 19981 height = _getEllipseImageCoord.height; 19982 19983 return [{ 19984 // Top middle point of ellipse 19985 x: left + width / 2, 19986 y: top 19987 }, { 19988 // Left middle point of ellipse 19989 x: left, 19990 y: top + height / 2 19991 }, { 19992 // Bottom middle point of ellipse 19993 x: left + width / 2, 19994 y: top + height 19995 }, { 19996 // Right middle point of ellipse 19997 x: left + width, 19998 y: top + height / 2 19999 }]; 20000} 20001/** 20002 * 20003 * 20004 * @param {*} context 20005 * @param {*} isColorImage 20006 * @param {*} { area, mean, stdDev, min, max, meanStdDevSUV } 20007 * @param {*} modality 20008 * @param {*} hasPixelSpacing 20009 * @param {*} [options={}] - { showMinMax, showHounsfieldUnits } 20010 * @returns {string[]} 20011 */ 20012 20013 20014function _createTextBoxContent(context, isColorImage) { 20015 var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}, 20016 area = _ref.area, 20017 mean = _ref.mean, 20018 stdDev = _ref.stdDev, 20019 min = _ref.min, 20020 max = _ref.max, 20021 meanStdDevSUV = _ref.meanStdDevSUV; 20022 20023 var modality = arguments.length > 3 ? arguments[3] : undefined; 20024 var hasPixelSpacing = arguments.length > 4 ? arguments[4] : undefined; 20025 var options = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {}; 20026 var showMinMax = options.showMinMax || false; 20027 var showHounsfieldUnits = options.showHounsfieldUnits !== false; 20028 var textLines = []; // Don't display mean/standardDev for color images 20029 20030 var otherLines = []; 20031 20032 if (!isColorImage) { 20033 var hasStandardUptakeValues = meanStdDevSUV && meanStdDevSUV.mean !== 0; 20034 var suffix = modality === 'CT' && showHounsfieldUnits ? ' HU' : ''; 20035 var meanString = "Mean: ".concat(Object(_util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_14__["default"])(mean.toFixed(2))).concat(suffix); 20036 var stdDevString = "Std Dev: ".concat(Object(_util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_14__["default"])(stdDev.toFixed(2))).concat(suffix); // If this image has SUV values to display, concatenate them to the text line 20037 20038 if (hasStandardUptakeValues) { 20039 var SUVtext = ' SUV: '; 20040 var meanSuvString = "".concat(SUVtext).concat(Object(_util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_14__["default"])(meanStdDevSUV.mean.toFixed(2))); 20041 var stdDevSuvString = "".concat(SUVtext).concat(Object(_util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_14__["default"])(meanStdDevSUV.stdDev.toFixed(2))); 20042 var targetStringLength = Math.floor(context.measureText("".concat(stdDevString, " ")).width); 20043 20044 while (context.measureText(meanString).width < targetStringLength) { 20045 meanString += ' '; 20046 } 20047 20048 otherLines.push("".concat(meanString).concat(meanSuvString)); 20049 otherLines.push("".concat(stdDevString, " ").concat(stdDevSuvString)); 20050 } else { 20051 otherLines.push("".concat(meanString, " ").concat(stdDevString)); 20052 } 20053 20054 if (showMinMax) {
20055 var minString = "Min: ".concat(min).concat(suffix); 20056 var maxString = "Max: ".concat(max).concat(suffix); 20057 20058 var _targetStringLength = hasStandardUptakeValues ? Math.floor(context.measureText("".concat(stdDevString, " ")).width) : Math.floor(context.measureText("".concat(meanString, " ")).width); 20059 20060 while (context.measureText(minString).width < _targetStringLength) { 20061 minString += ' '; 20062 } 20063 20064 otherLines.push("".concat(minString).concat(maxString)); 20065 } 20066 } 20067 20068 textLines.push(_formatArea(area, hasPixelSpacing)); 20069 otherLines.forEach(function (x) { 20070 return textLines.push(x); 20071 }); 20072 return textLines; 20073} 20074/** 20075 * 20076 * 20077 * @param {*} area 20078 * @param {*} hasPixelSpacing 20079 * @returns {string} The formatted label for showing area 20080 */ 20081 20082 20083function _formatArea(area, hasPixelSpacing) { 20084 // This uses Char code 178 for a superscript 2 20085 var suffix = hasPixelSpacing ? " mm".concat(String.fromCharCode(178)) : " px".concat(String.fromCharCode(178)); 20086 return "Area: ".concat(Object(_util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_14__["default"])(area.toFixed(2))).concat(suffix); 20087} 20088/** 20089 * 20090 * 20091 * @param {*} image 20092 * @param {*} element 20093 * @param {*} handles 20094 * @param {*} modality 20095 * @param {*} pixelSpacing 20096 * @returns {Object} The Stats object 20097 */ 20098 20099 20100function _calculateStats(image, element, handles, modality, pixelSpacing) { 20101 // Retrieve the bounds of the ellipse in image coordinates 20102 var ellipseCoordinates = _getEllipseImageCoordinates(handles.start, handles.end); // Retrieve the array of pixels that the ellipse bounds cover 20103 20104 20105 var pixels = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.getPixels(element, ellipseCoordinates.left, ellipseCoordinates.top, ellipseCoordinates.width, ellipseCoordinates.height); // Calculate the mean & standard deviation from the pixels and the ellipse details. 20106 20107 var ellipseMeanStdDev = Object(_util_ellipse_index_js__WEBPACK_IMPORTED_MODULE_12__["calculateEllipseStatistics"])(pixels, ellipseCoordinates); 20108 var meanStdDevSUV; 20109 20110 if (modality === 'PT') { 20111 meanStdDevSUV = { 20112 mean: Object(_util_calculateSUV_js__WEBPACK_IMPORTED_MODULE_11__["default"])(image, ellipseMeanStdDev.mean, true) || 0, 20113 stdDev: Object(_util_calculateSUV_js__WEBPACK_IMPORTED_MODULE_11__["default"])(image, ellipseMeanStdDev.stdDev, true) || 0 20114 }; 20115 } // Calculate the image area from the ellipse dimensions and pixel spacing 20116 20117 20118 var area = Math.PI * (ellipseCoordinates.width * (pixelSpacing.colPixelSpacing || 1) / 2) * (ellipseCoordinates.height * (pixelSpacing.rowPixelSpacing || 1) / 2); 20119 return { 20120 area: area || 0, 20121 count: ellipseMeanStdDev.count || 0, 20122 mean: ellipseMeanStdDev.mean || 0, 20123 variance: ellipseMeanStdDev.variance || 0, 20124 stdDev: ellipseMeanStdDev.stdDev || 0, 20125 min: ellipseMeanStdDev.min || 0, 20126 max: ellipseMeanStdDev.max || 0, 20127 meanStdDevSUV: meanStdDevSUV 20128 }; 20129} 20130/** 20131 * Retrieve the bounds of the ellipse in image coordinates 20132 * 20133 * @param {*} startHandle 20134 * @param {*} endHandle 20135 * @returns {{ left: number, top: number, width: number, height: number }} 20136 */ 20137 20138 20139function _getEllipseImageCoordinates(startHandle, endHandle) { 20140 return { 20141 left: Math.round(Math.min(startHandle.x, endHandle.x)), 20142 top: Math.round(Math.min(startHandle.y, endHandle.y)), 20143 width: Math.round(Math.abs(startHandle.x - endHandle.x)), 20144 height: Math.round(Math.abs(startHandle.y - endHandle.y)) 20145 }; 20146} 20147 20148/***/ }), 20149
20150/***/ "./tools/annotation/FreehandMouseTool.js": 20151/*!***********************************************!*\ 20152 !*** ./tools/annotation/FreehandMouseTool.js ***! 20153 \***********************************************/ 20154/*! exports provided: default */ 20155/***/ (function(module, __webpack_exports__, __webpack_require__) { 20156 20157"use strict"; 20158__webpack_require__.r(__webpack_exports__); 20159/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return FreehandMouseTool; }); 20160/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "../node_modules/@babel/runtime/helpers/toConsumableArray.js"); 20161/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__); 20162/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js"); 20163/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1__); 20164/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js"); 20165/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2__); 20166/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js"); 20167/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3__); 20168/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js"); 20169/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4__); 20170/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/assertThisInitialized */ "../node_modules/@babel/runtime/helpers/assertThisInitialized.js"); 20171/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_5__); 20172/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js"); 20173/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_6__); 20174/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./../../events.js */ "./events.js"); 20175/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./../../externalModules.js */ "./externalModules.js"); 20176/* harmony import */ var _base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./../base/BaseAnnotationTool.js */ "./tools/base/BaseAnnotationTool.js"); 20177/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./../../stateManagement/toolState.js */ "./stateManagement/toolState.js"); 20178/* harmony import */ var _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./../../stateManagement/toolStyle.js */ "./stateManagement/toolStyle.js"); 20179/* harmony import */ var _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./../../stateManagement/toolColors.js */ "./stateManagement/toolColors.js"); 20180/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../store/index.js */ "./store/index.js"); 20181/* harmony import */ var _util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../../util/triggerEvent.js */ "./util/triggerEvent.js"); 20182/* harmony import */ var _util_findAndMoveHelpers_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../util/findAndMoveHelpers.js */ "./util/findAndMoveHelpers.js"); 20183/* harmony import */ var _util_pointInsideBoundingBox_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../util/pointInsideBoundingBox.js */ "./util/pointInsideBoundingBox.js"); 20184/* harmony import */ var _util_calculateSUV_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../../util/calculateSUV.js */ "./util/calculateSUV.js"); 20185/* harmony import */ var _util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../../util/numbersWithCommas.js */ "./util/numbersWithCommas.js"); 20186/* harmony import */ var _drawing_index_js__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../../drawing/index.js */ "./drawing/index.js"); 20187/* harmony import */ var _drawing_drawLinkedTextBox_js__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../../drawing/drawLinkedTextBox.js */ "./drawing/drawLinkedTextBox.js"); 20188/* harmony import */ var _drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../../drawing/drawHandles.js */ "./drawing/drawHandles.js"); 20189/* harmony import */ var _util_clip_js__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../../util/clip.js */ "./util/clip.js"); 20190/* harmony import */ var _store_setToolCursor_js__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../../store/setToolCursor.js */ "./store/setToolCursor.js"); 20191/* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ../cursors/index.js */ "./tools/cursors/index.js"); 20192/* harmony import */ var _util_freehand_index_js__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ../../util/freehand/index.js */ "./util/freehand/index.js"); 20193/* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ../../util/logger.js */ "./util/logger.js"); 20194/* harmony import */ var _util_throttle__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ../../util/throttle */ "./util/throttle.js"); 20195 20196 20197 20198 20199 20200 20201 20202 20203 20204 // State 20205 20206 20207 20208 20209 20210 // Manipulators 20211 20212 // Implementation Logic 20213 20214 20215 20216 // Drawing 20217 20218 20219 20220 20221 20222 20223 20224 20225 20226 20227var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_26__["getLogger"])('tools:annotation:FreehandMouseTool'); 20228var insertOrDelete = _util_freehand_index_js__WEBPACK_IMPORTED_MODULE_25__["default"].insertOrDelete, 20229 freehandArea = _util_freehand_index_js__WEBPACK_IMPORTED_MODULE_25__["default"].freehandArea, 20230 calculateFreehandStatistics = _util_freehand_index_js__WEBPACK_IMPORTED_MODULE_25__["default"].calculateFreehandStatistics, 20231 freehandIntersect = _util_freehand_index_js__WEBPACK_IMPORTED_MODULE_25__["default"].freehandIntersect, 20232 FreehandHandleData = _util_freehand_index_js__WEBPACK_IMPORTED_MODULE_25__["default"].FreehandHandleData; 20233/** 20234 * @public 20235 * @class FreehandMouseTool 20236 * @memberof Tools.Annotation 20237 * @classdesc Tool for drawing arbitrary polygonal regions of interest, and 20238 * measuring the statistics of the enclosed pixels. 20239 * @extends Tools.Base.BaseAnnotationTool 20240 */ 20241 20242var FreehandMouseTool = 20243/*#__PURE__*/ 20244function (_BaseAnnotationTool) { 20245 _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_6___default()(FreehandMouseTool, _BaseAnnotationTool); 20246 20247 function FreehandMouseTool() { 20248 var _this; 20249 20250 var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 20251 20252 _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1___default()(this, FreehandMouseTool); 20253 20254 var defaultProps = { 20255 name: 'FreehandMouse', 20256 supportedInteractionTypes: ['Mouse', 'Touch'], 20257 configuration: defaultFreehandConfiguration(), 20258 svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_24__["freehandMouseCursor"] 20259 }; 20260 _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_3___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_4___default()(FreehandMouseTool).call(this, props, defaultProps)); 20261 _this.isMultiPartTool = true; 20262 _this._drawing = false;
20263 _this._dragging = false; 20264 _this._modifying = false; // Create bound callback functions for private event loops 20265 20266 _this._drawingMouseDownCallback = _this._drawingMouseDownCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_5___default()(_this)); 20267 _this._drawingMouseMoveCallback = _this._drawingMouseMoveCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_5___default()(_this)); 20268 _this._drawingMouseDragCallback = _this._drawingMouseDragCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_5___default()(_this)); 20269 _this._drawingMouseUpCallback = _this._drawingMouseUpCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_5___default()(_this)); 20270 _this._drawingMouseDoubleClickCallback = _this._drawingMouseDoubleClickCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_5___default()(_this)); 20271 _this._editMouseUpCallback = _this._editMouseUpCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_5___default()(_this)); 20272 _this._editMouseDragCallback = _this._editMouseDragCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_5___default()(_this)); 20273 _this._drawingTouchStartCallback = _this._drawingTouchStartCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_5___default()(_this)); 20274 _this._drawingTouchDragCallback = _this._drawingTouchDragCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_5___default()(_this)); 20275 _this._drawingDoubleTapClickCallback = _this._drawingDoubleTapClickCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_5___default()(_this)); 20276 _this._editTouchDragCallback = _this._editTouchDragCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_5___default()(_this)); 20277 _this.throttledUpdateCachedStats = Object(_util_throttle__WEBPACK_IMPORTED_MODULE_27__["default"])(_this.updateCachedStats, 110); 20278 return _this; 20279 } 20280 20281 _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2___default()(FreehandMouseTool, [{ 20282 key: "createNewMeasurement", 20283 value: function createNewMeasurement(eventData) { 20284 var goodEventData = eventData && eventData.currentPoints && eventData.currentPoints.image; 20285 20286 if (!goodEventData) { 20287 logger.error("required eventData not supplied to tool ".concat(this.name, "'s createNewMeasurement")); 20288 return; 20289 } 20290 20291 var measurementData = { 20292 visible: true, 20293 active: true, 20294 invalidated: true, 20295 color: undefined, 20296 handles: { 20297 points: [] 20298 } 20299 }; 20300 measurementData.handles.textBox = { 20301 active: false, 20302 hasMoved: false, 20303 movesIndependently: false, 20304 drawnIndependently: true, 20305 allowedOutsideImage: true, 20306 hasBoundingBox: true 20307 }; 20308 return measurementData; 20309 } 20310 /** 20311 * 20312 * 20313 * @param {*} element 20314 * @param {*} data 20315 * @param {*} coords 20316 * @returns {Boolean} 20317 */ 20318 20319 }, { 20320 key: "pointNearTool", 20321 value: function pointNearTool(element, data, coords) { 20322 var validParameters = data && data.handles && data.handles.points; 20323 20324 if (!validParameters) { 20325 throw new Error("invalid parameters supplied to tool ".concat(this.name, "'s pointNearTool")); 20326 } 20327 20328 if (!validParameters || data.visible === false) { 20329 return false; 20330 } 20331 20332 var isPointNearTool = this._pointNearHandle(element, data, coords); 20333 20334 if (isPointNearTool !== undefined) { 20335 return true; 20336 } 20337 20338 return false; 20339 } 20340 /** 20341 * @param {*} element 20342 * @param {*} data 20343 * @param {*} coords 20344 * @returns {number} the distance in px from the provided coordinates to the 20345 * closest rendered portion of the annotation. -1 if the distance cannot be 20346 * calculated. 20347 */ 20348 20349 }, { 20350 key: "distanceFromPoint", 20351 value: function distanceFromPoint(element, data, coords) { 20352 var distance = Infinity; 20353 20354 for (var i = 0; i < data.handles.points.length; i++) { 20355 var distanceI = _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstoneMath.point.distance(data.handles.points[i], coords); 20356 distance = Math.min(distance, distanceI); 20357 } // If an error caused distance not to be calculated, return -1. 20358 20359 20360 if (distance === Infinity) { 20361 return -1; 20362 } 20363 20364 return distance; 20365 } 20366 /** 20367 * @param {*} element 20368 * @param {*} data 20369 * @param {*} coords 20370 * @returns {number} the distance in canvas units from the provided coordinates to the 20371 * closest rendered portion of the annotation. -1 if the distance cannot be 20372 * calculated. 20373 */ 20374 20375 }, { 20376 key: "distanceFromPointCanvas", 20377 value: function distanceFromPointCanvas(element, data, coords) { 20378 var distance = Infinity; 20379 20380 if (!data) { 20381 return -1; 20382 } 20383 20384 var canvasCoords = _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.pixelToCanvas(element, coords); 20385 var points = data.handles.points; 20386 20387 for (var i = 0; i < points.length; i++) { 20388 var handleCanvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.pixelToCanvas(element, points[i]); 20389 var distanceI = _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstoneMath.point.distance(handleCanvas, canvasCoords); 20390 distance = Math.min(distance, distanceI); 20391 } // If an error caused distance not to be calculated, return -1. 20392 20393 20394 if (distance === Infinity) { 20395 return -1; 20396 } 20397 20398 return distance; 20399 } 20400 /** 20401 * 20402 * 20403 * 20404 * @param image 20405 * @param element 20406 * @param data 20407 */ 20408 20409 }, { 20410 key: "updateCachedStats", 20411 value: function updateCachedStats(image, element, data) { 20412 // Define variables for the area and mean/standard deviation 20413 var area, meanStdDev, meanStdDevSUV; 20414 var seriesModule = _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.metaData.get('generalSeriesModule', image.imageId); 20415 var modality = seriesModule ? seriesModule.modality : null; 20416 var points = data.handles.points; // If the data has been invalidated, and the tool is not currently active, 20417 // We need to calculate it again. 20418 // Retrieve the bounds of the ROI in image coordinates 20419 20420 var bounds = { 20421 left: points[0].x, 20422 right: points[0].x, 20423 bottom: points[0].y, 20424 top: points[0].x 20425 }; 20426 20427 for (var i = 0; i < points.length; i++) { 20428 bounds.left = Math.min(bounds.left, points[i].x); 20429 bounds.right = Math.max(bounds.right, points[i].x); 20430 bounds.bottom = Math.min(bounds.bottom, points[i].y); 20431 bounds.top = Math.max(bounds.top, points[i].y); 20432 } 20433 20434 var polyBoundingBox = { 20435 left: bounds.left, 20436 top: bounds.bottom, 20437 width: Math.abs(bounds.right - bounds.left), 20438 height: Math.abs(bounds.top - bounds.bottom) 20439 }; // Store the bounding box information for the text box 20440 20441 data.polyBoundingBox = polyBoundingBox; // First, make sure this is not a color image, since no mean / standard 20442 // Deviation will be calculated for color images. 20443 20444 if (!image.color) { 20445 // Retrieve the array of pixels that the ROI bounds cover 20446 var pixels = _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.getPixels(element, polyBoundingBox.left, polyBoundingBox.top, polyBoundingBox.width, polyBoundingBox.height); // Calculate the mean & standard deviation from the pixels and the object shape 20447 20448 meanStdDev = calculateFreehandStatistics.call(this, pixels, polyBoundingBox, data.handles.points); 20449 20450 if (modality === 'PT') { 20451 // If the image is from a PET scan, use the DICOM tags to 20452 // Calculate the SUV from the mean and standard deviation. 20453 // Note that because we are using modality pixel values from getPixels, and 20454 // The calculateSUV routine also rescales to modality pixel values, we are first 20455 // Returning the values to storedPixel values before calcuating SUV with them. 20456 // TODO: Clean this up? Should we add an option to not scale in calculateSUV? 20457 meanStdDevSUV = {
20458 mean: Object(_util_calculateSUV_js__WEBPACK_IMPORTED_MODULE_17__["default"])(image, (meanStdDev.mean - image.intercept) / image.slope), 20459 stdDev: Object(_util_calculateSUV_js__WEBPACK_IMPORTED_MODULE_17__["default"])(image, (meanStdDev.stdDev - image.intercept) / image.slope) 20460 }; 20461 } // If the mean and standard deviation values are sane, store them for later retrieval 20462 20463 20464 if (meanStdDev && !isNaN(meanStdDev.mean)) { 20465 data.meanStdDev = meanStdDev; 20466 data.meanStdDevSUV = meanStdDevSUV; 20467 } 20468 } // Retrieve the pixel spacing values, and if they are not 20469 // Real non-zero values, set them to 1 20470 20471 20472 var columnPixelSpacing = image.columnPixelSpacing || 1; 20473 var rowPixelSpacing = image.rowPixelSpacing || 1; 20474 var scaling = columnPixelSpacing * rowPixelSpacing; 20475 area = freehandArea(data.handles.points, scaling); // If the area value is sane, store it for later retrieval 20476 20477 if (!isNaN(area)) { 20478 data.area = area; 20479 } // Set the invalidated flag to false so that this data won't automatically be recalculated 20480 20481 20482 data.invalidated = false; 20483 } 20484 /** 20485 * 20486 * 20487 * @param {*} evt 20488 * @returns {undefined} 20489 */ 20490 20491 }, { 20492 key: "renderToolData", 20493 value: function renderToolData(evt) { 20494 var _this2 = this; 20495 20496 var eventData = evt.detail; // If we have no toolState for this element, return immediately as there is nothing to do 20497 20498 var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_10__["getToolState"])(evt.currentTarget, this.name); 20499 20500 if (!toolState) { 20501 return; 20502 } 20503 20504 var image = eventData.image, 20505 element = eventData.element; 20506 var config = this.configuration; 20507 var seriesModule = _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.metaData.get('generalSeriesModule', image.imageId); 20508 var modality = seriesModule ? seriesModule.modality : null; // We have tool data for this element - iterate over each one and draw it 20509 20510 var context = Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_19__["getNewContext"])(eventData.canvasContext.canvas); 20511 var lineWidth = _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_11__["default"].getToolW
20511idth(); 20512 20513 var _loop = function _loop(i) { 20514 var data = toolState.data[i]; 20515 20516 if (data.visible === false) { 20517 return "continue"; 20518 } 20519 20520 Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_19__["draw"])(context, function (context) { 20521 var color = _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_12__["default"].getColorIfActive(data); 20522 var fillColor; 20523 20524 if (data.active) { 20525 if (data.handles.invalidHandlePlacement) { 20526 color = config.invalidColor; 20527 fillColor = config.invalidColor; 20528 } else { 20529 color = _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_12__["default"].getColorIfActive(data); 20530 fillColor = _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_12__["default"].getFillColor(); 20531 } 20532 } else { 20533 fillColor = _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_12__["default"].getToolColor(); 20534 } 20535 20536 if (data.handles.points.length) { 20537 for (var j = 0; j < data.handles.points.length; j++) { 20538 var lines = _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(data.handles.points[j].lines); 20539 20540 var points = data.handles.points; 20541 20542 if (j === points.length - 1 && !data.polyBoundingBox) { 20543 // If it's still being actively drawn, keep the last line to 20544 // The mouse location 20545 lines.push(config.mouseLocation.handles.start); 20546 } 20547 20548 var lineOptions = { 20549 color: color 20550 }; 20551 if(data.lineWidth){ 20552 lineOptions.lineWidth = data.lineWidth; 20553 } 20554 Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_19__["drawJoinedLines"])(context, eventData.element, data.handles.points[j], lines, lineOptions); 20555 } 20556 } // Draw handles 20557 20558 20559 var options = { 20560 color: color, 20561 fill: fillColor 20562 }; 20563 20564 if (config.alwaysShowHandles || data.active && data.polyBoundingBox) { 20565 // Render all handles 20566 options.handleRadius = config.activeHandleRadius; 20567 Object(_drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_21__["default"])(context, eventData, data.handles.points, options); 20568 } 20569 20570 if (data.canComplete) { 20571 // Draw large handle at the origin if can complete drawing 20572 options.handleRadius = config.completeHandleRadius; 20573 var handle = data.handles.points[0]; 20574 Object(_drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_21__["default"])(context, eventData, [handle], options); 20575 } 20576 20577 if (data.active && !data.polyBoundingBox) { 20578 // Draw handle at origin and at mouse if actively drawing 20579 options.handleRadius = config.activeHandleRadius; 20580 Object(_drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_21__["default"])(context, eventData, config.mouseLocation.handles, options); 20581 var firstHandle = data.handles.points[0]; 20582 Object(_drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_21__["default"])(context, eventData, [firstHandle], options); 20583 } // Update textbox stats 20584 20585 20586 if (data.invalidated === true && !data.active) { 20587 if (data.meanStdDev && data.meanStdDevSUV && data.area) { 20588 _this2.throttledUpdateCachedStats(image, element, data); 20589 } else { 20590 _this2.updateCachedStats(image, element, data); 20591 } 20592 } // Only render text if polygon ROI has been completed and freehand 'shiftKey' mode was not used: 20593 20594 20595 if (data.polyBoundingBox && !data.handles.textBox.freehand) { 20596 // If the textbox has not been moved by the user, it should be displayed on the right-most 20597 // Side of the tool. 20598 if (!data.handles.textBox.hasMoved) { 20599 // Find the rightmost side of the polyBoundingBox at its vertical center, and place the textbox here 20600 // Note that this calculates it in image coordinates 20601 data.handles.textBox.x = data.polyBoundingBox.left + data.polyBoundingBox.width; 20602 data.handles.textBox.y = data.polyBoundingBox.top + data.polyBoundingBox.height / 2; 20603 } 20604 20605 var text = textBoxText.call(_this2, data); 20606 Object(_drawing_drawLinkedTextBox_js__WEBPACK_IMPORTED_MODULE_20__["default"])(context, element, data.handles.textBox, text, data.handles.points, textBoxAnchorPoints, color, lineWidth, 0, true); 20607 } 20608 }); 20609 }; 20610 20611 for (var i = 0; i < toolState.data.length; i++) { 20612 var _ret = _loop(i); 20613 20614 if (_ret === "continue") continue; 20615 } 20616 20617 function textBoxText(data) { 20618 var meanStdDev = data.meanStdDev, 20619 meanStdDevSUV = data.meanStdDevSUV, 20620 area = data.area; // Define an array to store the rows of text for the textbox 20621 20622 var textLines = []; // If the mean and standard deviation values are present, display them 20623 20624 if (meanStdDev && meanStdDev.mean !== undefined) { 20625 // If the modality is CT, add HU to denote Hounsfield Units 20626 var moSuffix = ''; 20627 20628 if (modality === 'CT') { 20629 moSuffix = ' HU'; 20630 } // Create a line of text to display the mean and any units that were specified (i.e. HU) 20631 20632 20633 var meanText = "Mean: ".concat(Object(_util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_18__["default"])(meanStdDev.mean.toFixed(2))).concat(moSuffix); // Create a line of text to display the standard deviation and any units that were specified (i.e. HU) 20634 20635 var stdDevText = "StdDev: ".concat(Object(_util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_18__["default"])(meanStdDev.stdDev.toFixed(2))).concat(moSuffix); // If this image has SUV values to display, concatenate them to the text line 20636 20637 if (meanStdDevSUV && meanStdDevSUV.mean !== undefined) { 20638 var SUVtext = ' SUV: '; 20639 meanText += SUVtext + Object(_util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_18__["default"])(meanStdDevSUV.mean.toFixed(2)); 20640 stdDevText += SUVtext + Object(_util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_18__["default"])(meanStdDevSUV.stdDev.toFixed(2)); 20641 } // Add these text lines to the array to be displayed in the textbox 20642 20643 20644 textLines.push(meanText); 20645 textLines.push(stdDevText); 20646 } // If the area is a sane value, display it 20647 20648 20649 if (area) { 20650 // Determine the area suffix based on the pixel spacing in the image. 20651 // If pixel spacing is present, use millimeters. Otherwise, use pixels. 20652 // This uses Char code 178 for a superscript 2 20653 var suffix = " mm".concat(String.fromCharCode(178)); 20654 20655 if (!image.rowPixelSpacing || !image.columnPixelSpacing) { 20656 suffix = " pixels".concat(String.fromCharCode(178)); 20657 } // Create a line of text to display the area and its units 20658 20659 20660 var areaText = "Area: ".concat(Object(_util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_18__["default"])(area.toFixed(2))).concat(suffix); // Add this text line to the array to be displayed in the textbox 20661 20662 textLines.push(areaText); 20663 } 20664 20665 return textLines; 20666 } 20667 20668 function textBoxAnchorPoints(handles) { 20669 return handles; 20670 } 20671 } 20672 }, { 20673 key: "addNewMeasurement",
20674 value: function addNewMeasurement(evt) { 20675 var eventData = evt.detail; 20676 20677 this._startDrawing(evt); 20678 20679 this._addPoint(eventData); 20680 20681 preventPropagation(evt); 20682 } 20683 }, { 20684 key: "preMouseDownCallback", 20685 value: function preMouseDownCallback(evt) { 20686 var eventData = evt.detail; 20687 20688 var nearby = this._pointNearHandleAllTools(eventData); 20689 20690 if (eventData.event.ctrlKey) { 20691 if (nearby !== undefined && nearby.handleNearby.hasBoundingBox) {// Ctrl + clicked textBox, do nothing but still consume event. 20692 } else { 20693 insertOrDelete.call(this, evt, nearby); 20694 } 20695 20696 preventPropagation(evt); 20697 return true; 20698 } 20699 20700 return false; 20701 } 20702 }, { 20703 key: "handleSelectedCallback", 20704 value: function handleSelectedCallback(evt, toolData, handle) { 20705 var interactionType = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'mouse'; 20706 var eventData = evt.detail; 20707 var element = eventData.element; 20708 var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_10__["getToolState"])(eventData.element, this.name); 20709 20710 if (handle.hasBoundingBox) { 20711 // Use default move handler. 20712 Object(_util_findAndMoveHelpers_js__WEBPACK_IMPORTED_MODULE_15__["moveHandleNearImagePoint"])(evt, this, toolData, handle, interactionType); 20713 return; 20714 } 20715 20716 var config = this.configuration; 20717 config.dragOrigin = { 20718 x: handle.x, 20719 y: handle.y 20720 }; // Iterating over handles of all toolData instances to find the indices of the selected handle 20721 20722 for (var toolIndex = 0; toolIndex < toolState.data.length; toolIndex++) { 20723 var points = toolState.data[toolIndex].handles.points; 20724 20725 for (var p = 0; p < points.length; p++) { 20726 if (points[p] === handle) { 20727 config.currentHandle = p; 20728 config.currentTool = toolIndex; 20729 } 20730 } 20731 } 20732 20733 this._modifying = true; 20734 20735 this._activateModify(element); // Interupt eventDispatchers 20736 20737 20738 preventPropagation(evt); 20739 } 20740 /** 20741 * Event handler for MOUSE_MOVE during drawing event loop. 20742 * 20743 * @event 20744 * @param {Object} evt - The event. 20745 * @returns {undefined} 20746 */ 20747 20748 }, { 20749 key: "_drawingMouseMoveCallback", 20750 value: function _drawingMouseMoveCallback(evt) { 20751 var eventData = evt.detail; 20752 var element = eventData.element; 20753 var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_10__["getToolState"])(eventData.element, this.name); 20754 var config = this.configuration; 20755 var currentTool = config.currentTool; 20756 var data = toolState.data[currentTool]; 20757 var coords = eventData.currentPoints.canvas; // Set the mouseLocation handle 20758 20759 this._getMouseLocation(eventData); 20760 20761 this._checkInvalidHandleLocation(data, eventData); // Mouse move -> Polygon Mode 20762 20763 20764 var handleNearby = this._pointNearHandle(element, data, coords); 20765 20766 var points = data.handles.points; // If there is a handle nearby to snap to 20767 // (and it's not the actual mouse handle) 20768 20769 if (handleNearby !== undefined && !handleNearby.hasBoundingBox && handleNearby < points.length - 1) {
20770 config.mouseLocation.handles.start.x = points[handleNearby].x; 20771 config.mouseLocation.handles.start.y = points[handleNearby].y; 20772 } // Force onImageRendered 20773 20774 20775 _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.updateImage(eventData.element); 20776 } 20777 /** 20778 * Event handler for MOUSE_DRAG during drawing event loop. 20779 * 20780 * @event 20781 * @param {Object} evt - The event. 20782 * @returns {undefined} 20783 */ 20784 20785 }, { 20786 key: "_drawingMouseDragCallback", 20787 value: function _drawingMouseDragCallback(evt) { 20788 if (!this.options.mouseButtonMask.includes(evt.detail.buttons)) { 20789 return; 20790 } 20791 20792 this._drawingDrag(evt); 20793 } 20794 /** 20795 * Event handler for TOUCH_DRAG during drawing event loop. 20796 * 20797 * @event 20798 * @param {Object} evt - The event. 20799 * @returns {undefined} 20800 */ 20801 20802 }, { 20803 key: "_drawingTouchDragCallback", 20804 value: function _drawingTouchDragCallback(evt) { 20805 this._drawingDrag(evt); 20806 } 20807 }, { 20808 key: "_drawingDrag", 20809 value: function _drawingDrag(evt) { 20810 var eventData = evt.detail; 20811 var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_10__["getToolState"])(eventData.element, this.name); 20812 var config = this.configuration; 20813 var currentTool = config.currentTool; 20814 var data = toolState.data[currentTool]; // Set the mouseLocation handle 20815 20816 this._getMouseLocation(eventData); 20817 20818 this._checkInvalidHandleLocation(data, eventData); 20819 20820 this._addPointPencilMode(eventData, data.handles.points); 20821 20822 this._dragging = true; // Force onImageRendered 20823 20824 _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.updateImage(eventData.element); 20825 } 20826 /** 20827 * Event handler for MOUSE_UP during drawing event loop. 20828 * 20829 * @event 20830 * @param {Object} evt - The event. 20831 * @returns {undefined} 20832 */ 20833 20834 }, { 20835 key: "_drawingMouseUpCallback", 20836 value: function _drawingMouseUpCallback(evt) { 20837 var eventData = evt.detail; 20838 20839 if (!this._dragging) { 20840 return; 20841 } 20842 20843 this._dragging = false; 20844 var element = eventData.element; 20845 var config = this.configuration; 20846 var currentTool = config.currentTool; 20847 var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_10__["getToolState"])(eventData.element, this.name); 20848 var data = toolState.data[currentTool]; 20849 20850 if (!freehandIntersect.end(data.handles.points) && data.canComplete) { 20851 var lastHandlePlaced = config.currentHandle; 20852 20853 this._endDrawing(element, lastHandlePlaced); 20854 } 20855 20856 preventPropagation(evt); 20857 return; 20858 } 20859 /** 20860 * Event handler for MOUSE_DOWN during drawing event loop. 20861 * 20862 * @event 20863 * @param {Object} evt - The event. 20864 * @returns {undefined} 20865 */ 20866 20867 }, { 20868 key: "_drawingMouseDownCallback", 20869 value: function _drawingMouseDownCallback(evt) { 20870 var eventData = evt.detail; 20871 20872 if (!this.options.mouseButtonMask.includes(eventData.buttons)) { 20873 return; 20874 } 20875 20876 var element = eventData.element; 20877 var coords = eventData.currentPoints.canvas; 20878 var config = this.configuration; 20879 var currentTool = config.currentTool; 20880 var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_10__["getToolState"])(eventData.element, this.name); 20881 var data = toolState.data[currentTool]; 20882 20883 var handleNearby = this._pointNearHandle(element, data, coords); 20884 20885 if (!freehandIntersect.end(data.handles.points) && data.canComplete) { 20886 var lastHandlePlaced = config.currentHandle; 20887 20888 this._endDrawing(element, lastHandlePlaced); 20889 } else if (handleNearby === undefined) { 20890 this._addPoint(eventData); 20891 } 20892 20893 preventPropagation(evt); 20894 return; 20895 } 20896 /** 20897 * Event handler for TOUCH_START during drawing event loop. 20898 * 20899 * @event 20900 * @param {Object} evt - The event. 20901 * @returns {undefined} 20902 */ 20903 20904 }, { 20905 key: "_drawingTouchStartCallback", 20906 value: function _drawingTouchStartCallback(evt) { 20907 var eventData = evt.detail; 20908 var element = eventData.element; 20909 var coords = eventData.currentPoints.canvas; 20910 var config = this.configuration; 20911 var currentTool = config.currentTool; 20912 var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_10__["getToolState"])(eventData.element, this.name); 20913 var data = toolState.data[currentTool]; 20914 20915 var handleNearby = this._pointNearHandle(element, data, coords); 20916 20917 if (!freehandIntersect.end(data.handles.points) && data.canComplete) {
20918 var lastHandlePlaced = config.currentHandle; 20919 20920 this._endDrawing(element, lastHandlePlaced); 20921 } else if (handleNearby === undefined) { 20922 this._addPoint(eventData); 20923 } 20924 20925 preventPropagation(evt); 20926 return; 20927 } 20928 /** Ends the active drawing loop and completes the polygon. 20929 * 20930 * @public 20931 * @param {Object} element - The element on which the roi is being drawn. 20932 * @returns {null} 20933 */ 20934 20935 }, { 20936 key: "completeDrawing", 20937 value: function completeDrawing(element) { 20938 if (!this._drawing) { 20939 return; 20940 } 20941 20942 var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_10__["getToolState"])(element, this.name); 20943 var config = this.configuration; 20944 var data = toolState.data[config.currentTool]; 20945 20946 if (!freehandIntersect.end(data.handles.points) && data.handles.points.length >= 2) { 20947 var lastHandlePlaced = config.currentHandle; 20948 data.polyBoundingBox = {}; 20949 20950 this._endDrawing(element, lastHandlePlaced); 20951 } 20952 } 20953 /** 20954 * Event handler for MOUSE_DOUBLE_CLICK during drawing event loop. 20955 * 20956 * @event 20957 * @param {Object} evt - The event. 20958 * @returns {undefined} 20959 */ 20960 20961 }, { 20962 key: "_drawingMouseDoubleClickCallback", 20963 value: function _drawingMouseDoubleClickCallback(evt) { 20964 var eventData = evt.detail; 20965 this.completeDrawing(eventData.element); 20966 preventPropagation(evt); 20967 } 20968 /** 20969 * Event handler for DOUBLE_TAP during drawing event loop. 20970 * 20971 * @event 20972 * @param {Object} evt - The event. 20973 * @returns {undefined} 20974 */ 20975 20976 }, { 20977 key: "_drawingDoubleTapClickCallback", 20978 value: function _drawingDoubleTapClickCallback(evt) { 20979 var eventData = evt.detail; 20980 this.completeDrawing(eventData.element); 20981 preventPropagation(evt); 20982 } 20983 /** 20984 * Event handler for MOUSE_DRAG during handle drag event loop. 20985 * 20986 * @event 20987 * @param {Object} evt - The event. 20988 * @returns {undefined} 20989 */ 20990 20991 }, { 20992 key: "_editMouseDragCallback", 20993 value: function _editMouseDragCallback(evt) { 20994 var eventData = evt.detail; 20995 20996 if (!this.options.mouseButtonMask.includes(eventData.buttons)) { 20997 return; 20998 } 20999 21000 var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_10__["getToolState"])(eventData.element, this.name); 21001 var config = this.configuration; 21002 var data = toolState.data[config.currentTool]; 21003 var currentHandle = config.currentHandle; 21004 var points = data.handles.points; 21005 var handleIndex = -1; // Set the mouseLocation handle 21006 21007 this._getMouseLocation(eventData); 21008 21009 data.handles.invalidHandlePlacement = freehandIntersect.modify(points, currentHandle); 21010 data.active = true; 21011 data.highlight = true; 21012 points[currentHandle].x = config.mouseLocation.handles.start.x; 21013 points[currentHandle].y = config.mouseLocation.handles.start.y; 21014 handleIndex = this._getPrevHandleIndex(currentHandle, points); 21015 21016 if (currentHandle >= 0) { 21017 var lastLineIndex = points[handleIndex].lines.length - 1; 21018 var lastLine = points[handleIndex].lines[lastLineIndex]; 21019 lastLine.x = config.mouseLocation.handles.start.x; 21020 lastLine.y = config.mouseLocation.handles.start.y; 21021 } // Update the image 21022 21023 21024 _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.updateImage(eventData.element); 21025 } 21026 /** 21027 * Event handler for TOUCH_DRAG during handle drag event loop. 21028 * 21029 * @event 21030 * @param {Object} evt - The event. 21031 * @returns {void} 21032 */ 21033 21034 }, { 21035 key: "_editTouchDragCallback", 21036 value: function _editTouchDragCallback(evt) { 21037 var eventData = evt.detail; 21038 var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_10__["getToolState"])(eventData.element, this.name); 21039 var config = this.configuration; 21040 var data = toolState.data[config.currentTool]; 21041 var currentHandle = config.currentHandle; 21042 var points = data.handles.points; 21043 var handleIndex = -1; // Set the mouseLocation handle 21044 21045 this._getMouseLocation(eventData); 21046 21047 data.handles.invalidHandlePlacement = freehandIntersect.modify(points, currentHandle); 21048 data.active = true; 21049 data.highlight = true; 21050 points[currentHandle].x = config.mouseLocation.handles.start.x; 21051 points[currentHandle].y = config.mouseLocation.handles.start.y; 21052 handleIndex = this._getPrevHandleIndex(currentHandle, points); 21053 21054 if (currentHandle >= 0) { 21055 var lastLineIndex = points[handleIndex].lines.length - 1; 21056 var lastLine = points[handleIndex].lines[lastLineIndex]; 21057 lastLine.x = config.mouseLocation.handles.start.x; 21058 lastLine.y = config.mouseLocation.handles.start.y; 21059 } // Update the image 21060 21061 21062 _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.updateImage(eventData.element); 21063 } 21064 /** 21065 * Returns the previous handle to the current one. 21066 * @param {Number} currentHandle - the current handle index 21067 * @param {Array} points - the handles Array of the freehand data 21068 * @returns {Number} - The index of the previos handle 21069 */ 21070 21071 }, { 21072 key: "_getPrevHandleIndex", 21073 value: function _getPrevHandleIndex(currentHandle, points) { 21074 if (currentHandle === 0) { 21075 return points.length - 1; 21076 } 21077 21078 return currentHandle - 1; 21079 } 21080 /** 21081 * Event handler for MOUSE_UP during handle drag event loop. 21082 * 21083 * @private 21084 * @param {Object} evt - The event. 21085 * @returns {undefined} 21086 */ 21087 21088 }, { 21089 key: "_editMouseUpCallback", 21090 value: function _editMouseUpCallback(evt) { 21091 var eventData = evt.detail; 21092 var element = eventData.element; 21093 var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_10__["getToolState"])(eventData.element, this.name); 21094 21095 this._deactivateModify(element); 21096 21097 this._dropHandle(eventData, toolState); 21098 21099 this._endDrawing(element); 21100 21101 _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.updateImage(eventData.element); 21102 } 21103 /** 21104 * Places a handle of the freehand tool if the new location is valid.
21105 * If the new location is invalid the handle snaps back to its previous position. 21106 * 21107 * @private 21108 * @param {Object} eventData - Data object associated with the event. 21109 * @param {Object} toolState - The data associated with the freehand tool. 21110 * @modifies {toolState} 21111 * @returns {undefined} 21112 */ 21113 21114 }, { 21115 key: "_dropHandle", 21116 value: function _dropHandle(eventData, toolState) { 21117 var config = this.configuration; 21118 var currentTool = config.currentTool; 21119 var handles = toolState.data[currentTool].handles; 21120 var points = handles.points; // Don't allow the line being modified to intersect other lines 21121 21122 if (handles.invalidHandlePlacement) { 21123 var currentHandle = config.currentHandle; 21124 var currentHandleData = points[currentHandle]; 21125 var previousHandleData; 21126 21127 if (currentHandle === 0) { 21128 var lastHandleID = points.length - 1; 21129 previousHandleData = points[lastHandleID]; 21130 } else { 21131 previousHandleData = points[currentHandle - 1]; 21132 } // Snap back to previous position 21133 21134 21135 currentHandleData.x = config.dragOrigin.x; 21136 currentHandleData.y = config.dragOrigin.y; 21137 previousHandleData.lines[0] = currentHandleData; 21138 handles.invalidHandlePlacement = false; 21139 } 21140 } 21141 /** 21142 * Begining of drawing loop when tool is active and a click event happens far 21143 * from existing handles. 21144 * 21145 * @private 21146 * @param {Object} evt - The event. 21147 * @returns {undefined} 21148 */ 21149 21150 }, { 21151 key: "_startDrawing", 21152 value: function _startDrawing(evt) { 21153 var eventData = evt.detail; 21154 var measurementData = this.createNewMeasurement(eventData); 21155 var element = eventData.element; 21156 var config = this.configuration; 21157 this._referencedElement = element; 21158 var interactionType; 21159 21160 if (evt.type === _events_js__WEBPACK_IMPORTED_MODULE_7__["default"].MOUSE_DOWN_ACTIVATE) { 21161 interactionType = 'Mouse'; 21162 } else if (evt.type === _events_js__WEBPACK_IMPORTED_MODULE_7__["default"].TOUCH_START_ACTIVE) { 21163 interactionType = 'Touch'; 21164 } 21165 21166 this._activateDraw(element, interactionType); 21167 21168 this._getMouseLocation(eventData); 21169 21170 Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_10__["addToolState"])(eventData.element, this.name, measurementData); 21171 var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_10__["getToolState"])(eventData.element, this.name); 21172 config.currentTool = toolState.data.length - 1; 21173 this._activeDrawingToolReference = toolState.data[config.currentTool]; 21174 } 21175 /** 21176 * Adds a point on mouse click in polygon mode. 21177 * 21178 * @private 21179 * @param {Object} eventData - data object associated with an event. 21180 * @returns {undefined} 21181 */ 21182 21183 }, { 21184 key: "_addPoint", 21185 value: function _addPoint(eventData) { 21186 var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_10__["getToolState"])(eventData.element, this.name); // Get the toolState from the last-drawn polygon 21187 21188 var config = this.configuration; 21189 var data = toolState.data[config.currentTool]; 21190 21191 if (data.handles.invalidHandlePlacement) { 21192 return; 21193 } 21194 21195 var newHandleData = new FreehandHandleData(eventData.currentPoints.image); // If this is not the first handle 21196 21197 if (data.handles.points.length) { 21198 // Add the line from the current handle to the new handle 21199 data.handles.points[config.currentHandle - 1].lines.push(eventData.currentPoints.image); 21200 } // Add the new handle 21201 21202 21203 data.handles.points.push(newHandleData); // Increment the current handle value 21204 21205 config.currentHandle += 1; // Force onImageRendered to fire 21206 21207 _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.updateImage(eventData.element); 21208 this.fireModifiedEvent(eventData.element, data); 21209 } 21210 /** 21211 * If in pencilMode, check the mouse position is farther than the minimum 21212 * distance between points, then add a point. 21213 * 21214 * @private 21215 * @param {Object} eventData - Data object associated with an event. 21216 * @param {Object} points - Data object associated with the tool. 21217 * @returns {undefined} 21218 */ 21219 21220 }, { 21221 key: "_addPointPencilMode", 21222 value: function _addPointPencilMode(eventData, points) { 21223 var _this3 = this; 21224 21225 var config = this.configuration; 21226 var element = eventData.element; 21227 var mousePoint = config.mouseLocation.handles.start; 21228 21229 var handleFurtherThanMinimumSpacing = function handleFurtherThanMinimumSpacing(handle) { 21230 return _this3._isDistanceLargerThanSpacing(element, handle, mousePoint); 21231 }; 21232 21233 if (points.every(handleFurtherThanMinimumSpacing)) { 21234 this._addPoint(eventData); 21235 } 21236 } 21237 /** 21238 * Ends the active drawing loop and completes the polygon. 21239 * 21240 * @private 21241 * @param {Object} element - The element on which the roi is being drawn. 21242 * @param {Object}
21242 handleNearby - the handle nearest to the mouse cursor. 21243 * @returns {undefined} 21244 */ 21245 21246 }, { 21247 key: "_endDrawing", 21248 value: function _endDrawing(element, handleNearby) { 21249 var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_10__["getToolState"])(element, this.name); 21250 var config = this.configuration; 21251 var data = toolState.data[config.currentTool]; 21252 data.active = false; 21253 data.highlight = false; 21254 data.handles.invalidHandlePlacement = false; // Connect the end handle to the origin handle 21255 21256 if (handleNearby !== undefined) { 21257 var points = data.handles.points; 21258 points[config.currentHandle - 1].lines.push(points[0]); 21259 } 21260 21261 if (this._modifying) { 21262 this._modifying = false; 21263 data.invalidated = true; 21264 } // Reset the current handle 21265 21266 21267 config.currentHandle = 0; 21268 config.currentTool = -1; 21269 data.canComplete = false; 21270 21271 if (this._drawing) { 21272 this._deactivateDraw(element); 21273 } 21274 21275 _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.updateImage(element); 21276 this.fireModifiedEvent(element, data); 21277 this.fireCompletedEvent(element, data); 21278 } 21279 /** 21280 * Returns a handle of a particular tool if it is close to the mouse cursor 21281 * 21282 * @private 21283 * @param {Object} element - The element on which the roi is being drawn. 21284 * @param {Object} data Data object associated with the tool. 21285 * @param {*} coords 21286 * @returns {Number|Object|Boolean} 21287 */ 21288 21289 }, { 21290 key: "_pointNearHandle", 21291 value: function _pointNearHandle(element, data, coords) { 21292 if (data.handles === undefined || data.handles.points === undefined) { 21293 return; 21294 } 21295 21296 if (data.visible === false) { 21297 return; 21298 } 21299 21300 for (var i = 0; i < data.handles.points.length; i++) { 21301 var handleCanvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.pixelToCanvas(element, data.handles.points[i]); 21302 21303 if (_externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstoneMath.point.distance(handleCanvas, coords) < 6) { 21304 return i; 21305 } 21306 } // Check to see if mouse in bounding box of textbox 21307 21308 21309 if (data.handles.textBox) { 21310 if (Object(_util_pointInsideBoundingBox_js__WEBPACK_IMPORTED_MODULE_16__["default"])(data.handles.textBox, coords)) { 21311 return data.handles.textBox; 21312 } 21313 } 21314 } 21315 /** 21316 * Returns a handle if it is close to the mouse cursor (all tools) 21317 * 21318 * @private 21319 * @param {Object} eventData - data object associated with an event. 21320 * @returns {Object} 21321 */ 21322 21323 }, { 21324 key: "_pointNearHandleAllTools", 21325 value: function _pointNearHandleAllTools(eventData) { 21326 var element = eventData.element; 21327 var coords = eventData.currentPoints.canvas; 21328 var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_10__["getToolState"])(element, this.name); 21329 21330 if (!toolState) { 21331 return; 21332 } 21333 21334 var handleNearby; 21335 21336 for (var toolIndex = 0; toolIndex < toolState.data.length; toolIndex++) { 21337 handleNearby = this._pointNearHandle(element, toolState.data[toolIndex], coords); 21338 21339 if (handleNearby !== undefined) { 21340 return { 21341 handleNearby: handleNearby, 21342 toolIndex: toolIndex 21343 }; 21344 } 21345 } 21346 } 21347 /** 21348 * Gets the current mouse location and stores it in the configuration object. 21349 * 21350 * @private 21351 * @param {Object} eventData The data assoicated with the event. 21352 * @returns {undefined} 21353 */ 21354 21355 }, { 21356 key: "_getMouseLocation", 21357 value: function _getMouseLocation(eventData) { 21358 // Set the mouseLocation handle 21359 var config = this.configuration;
21360 config.mouseLocation.handles.start.x = eventData.currentPoints.image.x; 21361 config.mouseLocation.handles.start.y = eventData.currentPoints.image.y; 21362 Object(_util_clip_js__WEBPACK_IMPORTED_MODULE_22__["clipToBox"])(config.mouseLocation.handles.start, eventData.image); 21363 } 21364 /** 21365 * Returns true if the proposed location of a new handle is invalid. 21366 * 21367 * @private 21368 * @param {Object} data Data object associated with the tool. 21369 * @param {Object} eventData The data assoicated with the event. 21370 * @returns {Boolean} 21371 */ 21372 21373 }, { 21374 key: "_checkInvalidHandleLocation", 21375 value: function _checkInvalidHandleLocation(data, eventData) { 21376 if (data.handles.points.length < 2) { 21377 return true; 21378 } 21379 21380 var invalidHandlePlacement; 21381 21382 if (this._dragging) { 21383 invalidHandlePlacement = this._checkHandlesPencilMode(data, eventData); 21384 } else { 21385 invalidHandlePlacement = this._checkHandlesPolygonMode(data, eventData); 21386 } 21387 21388 data.handles.invalidHandlePlacement = invalidHandlePlacement; 21389 } 21390 /** 21391 * Returns true if the proposed location of a new handle is invalid (in polygon mode). 21392 * 21393 * @private 21394 * 21395 * @param {Object} data - data object associated with the tool. 21396 * @param {Object} eventData The data assoicated with the event. 21397 * @returns {Boolean} 21398 */ 21399 21400 }, { 21401 key: "_checkHandlesPolygonMode", 21402 value: function _checkHandlesPolygonMode(data, eventData) { 21403 var config = this.configuration; 21404 var element = eventData.element; 21405 var mousePoint = config.mouseLocation.handles.start; 21406 var points = data.handles.points; 21407 var invalidHandlePlacement = false; 21408 data.canComplete = false; 21409 21410 var mouseAtOriginHandle = this._isDistanceSmallerThanCompleteSpacingCanvas(element, points[0], mousePoint); 21411 21412 if (mouseAtOriginHandle && !freehandIntersect.end(points) && points.length > 2) { 21413 data.canComplete = true; 21414 invalidHandlePlacement = false; 21415 } else { 21416 invalidHandlePlacement = freehandIntersect.newHandle(mousePoint, points); 21417 } 21418 21419 return invalidHandlePlacement; 21420 } 21421 /** 21422 * Returns true if the proposed location of a new handle is invalid (in pencilMode). 21423 * 21424 * @private 21425 * @param {Object} data - data object associated with the tool. 21426 * @param {Object} eventData The data associated with the event. 21427 * @returns {Boolean} 21428 */ 21429 21430 }, { 21431 key: "_checkHandlesPencilMode", 21432 value: function _checkHandlesPencilMode(data, eventData) { 21433 var config = this.configuration; 21434 var mousePoint = config.mouseLocation.handles.start; 21435 var points = data.handles.points; 21436 var invalidHandlePlacement = freehandIntersect.newHandle(mousePoint, points); 21437 21438 if (invalidHandlePlacement === false) { 21439 invalidHandlePlacement = this._invalidHandlePencilMode(data, eventData); 21440 } 21441 21442 return invalidHandlePlacement; 21443 } 21444 /** 21445 * Returns true if the mouse position is far enough from previous points (in pencilMode). 21446 * 21447 * @private 21448 * @param {Object} data - data object associated with the tool. 21449 * @param {Object} eventData The data associated with the event. 21450 * @returns {Boolean} 21451 */ 21452 21453 }, { 21454 key: "_invalidHandlePencilMode", 21455 value: function _invalidHandlePencilMode(data, eventData) { 21456 var config = this.configuration; 21457 var element = eventData.element; 21458 var mousePoint = config.mouseLocation.handles.start; 21459 var points = data.handles.points; 21460 21461 var mouseAtOriginHandle = this._isDistanceSmallerThanCompleteSpacingCanvas(element, points[0], mousePoint); 21462 21463 if (mouseAtOriginHandle) { 21464 data.canComplete = true; 21465 return false; 21466 } 21467 21468 data.canComplete = false; // Compare with all other handles appart from the last one 21469 21470 for (var i = 1; i < points.length - 1; i++) { 21471 if (this._isDistanceSmallerThanSpacing(element, points[i], mousePoint)) { 21472 return true; 21473 } 21474 } 21475 21476 return false; 21477 } 21478 /** 21479 * Returns true if two points are closer than this.configuration.spacing. 21480 * 21481 * @private 21482 * @param {Object} element The element on which the roi is being drawn. 21483 * @param {Object} p1 The first point, in pixel space. 21484 * @param {Object} p2 The second point, in pixel space. 21485 * @returns {boolean} True if the distance is smaller than the 21486 * allowed canvas spacing. 21487 */ 21488 21489 }, { 21490 key: "_isDistanceSmallerThanCompleteSpacingCanvas", 21491 value: function _isDistanceSmallerThanCompleteSpacingCanvas(element, p1, p2) { 21492 var p1Canvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.pixelToCanvas(element, p1); 21493 var p2Canvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.pixelToCanvas(element, p2); 21494 var completeHandleRadius; 21495 21496 if (this._drawingInteractionType === 'Mouse') { 21497 completeHandleRadius = this.configuration.completeHandleRadius; 21498 } else if (this._drawingInteractionType === 'Touch') { 21499 completeHandleRadius = this.configuration.completeHandleRadiusTouch; 21500 } 21501 21502 return this._compareDistanceToSpacing(element, p1Canvas, p2Canvas, '<', completeHandleRadius); 21503 } 21504 /** 21505 * Returns true if two points are closer than this.configuration.spacing. 21506 * 21507 * @private 21508 * @param {Object} element The element on which the roi is being drawn. 21509 * @param {Object} p1 The first point, in pixel space. 21510 * @param {Object} p2 The second point, in pixel space. 21511 * @returns {boolean} True if the distance is smaller than the 21512 * allowed canvas spacing. 21513 */ 21514 21515 }, { 21516 key: "_isDistanceSmallerThanSpacing", 21517 value: function _isDistanceSmallerThanSpacing(element, p1, p2) { 21518 return this._compareDistanceToSpacing(element, p1, p2, '<'); 21519 } 21520 /** 21521 * Returns true if two points are farther than this.configuration.spacing. 21522 * 21523 * @private 21524 * @param {Object} element The element on which the roi is being drawn. 21525 * @param {Object} p1 The first point, in pixel space. 21526 * @param {Object} p2 The second point, in pixel space. 21527 * @returns {boolean} True if the distance is smaller than the 21528 * allowed canvas spacing. 21529 */ 21530 21531 }, { 21532 key: "_isDistanceLargerThanSpacing", 21533 value: function _isDistanceLargerThanSpacing(element, p1, p2) { 21534 return this._compareDistanceToSpacing(element, p1, p2, '>'); 21535 } 21536 /** 21537 * Compares the distance between two points to this.configuration.spacing. 21538 * 21539 * @private 21540 * @param {Object} element The element on which the roi is being drawn. 21541 * @param {Object} p1 The first point, in pixel space. 21542 * @param {Object} p2 The second point, in pixel space. 21543 * @param {string} comparison The comparison to make. 21544 * @param {number} spacing The allowed canvas spacing 21545 * @returns {boolean} True if the distance is smaller than the 21546 * allowed canvas spacing. 21547 */ 21548 21549 }, { 21550 key: "_compareDistanceToSpacing", 21551 value: function _compareDistanceToSpacing(element, p1, p2) { 21552 var comparison = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '>'; 21553 var spacing = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : this.configuration.spacing; 21554 21555 if (comparison === '>') { 21556 return _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstoneMath.point.distance(p1, p2) > spacing; 21557 } 21558 21559 return _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstoneMath.point.distance(p1, p2) < spacing; 21560 } 21561 /** 21562 * Adds drawing loop event listeners. 21563 * 21564 * @private 21565 * @param {Object} element - The viewport element to add event listeners to. 21566 * @param {string} interactionType - The interactionType used for the loop. 21567 * @modifies {element} 21568 * @returns {undefined} 21569 */ 21570 21571 }, { 21572 key: "_activateDraw", 21573 value: function _activateDraw(element) { 21574 var interactionType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'Mouse'; 21575 this._drawing = true; 21576 this._drawingInteractionType = interactionType; 21577 _store_index_js__WEBPACK_IMPORTED_MODULE_13__["state"].isMultiPartToolActive = true; 21578 Object(_store_setToolCursor_js__WEBPACK_IMPORTED_MODULE_23__["hideToolCursor"])(this.element); // Polygonal Mode 21579 21580 element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].MOUSE_DOWN, this._drawingMouseDownCallback); 21581 element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].MOUSE_MOVE, this._drawingMouseMoveCallback); 21582 element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].MOUSE_DOUBLE_CLICK, this._drawingMouseDoubleClickCallback); // Drag/Pencil Mode 21583 21584 element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].MOUSE_DRAG, this._drawingMouseDragCallback); 21585 element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].MOUSE_UP, this._drawingMouseUpCallback); // Touch 21586 21587 element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].TOUCH_START, this._drawingMouseMoveCallback); 21588 element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].TOUCH_START, this._drawingTouchStartCallback); 21589 element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].TOUCH_DRAG, this._drawingTouchDragCallback); 21590 element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].TOUCH_END, this._drawingMouseUpCallback); 21591 element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].DOUBLE_TAP, this._drawingDoubleTapClickCallback); 21592 _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.updateImage(element); 21593 } 21594 /** 21595 * Removes drawing loop event listeners. 21596 * 21597 * @private 21598 * @param {Object} element - The viewport element to add event listeners to. 21599 * @modifies {element} 21600 * @returns {undefined} 21601 */ 21602 21603 }, { 21604 key: "_deactivateDraw", 21605 value: function _deactivateDraw(element) { 21606 this._drawing = false;
21607 _store_index_js__WEBPACK_IMPORTED_MODULE_13__["state"].isMultiPartToolActive = false; 21608 this._activeDrawingToolReference = null; 21609 this._drawingInteractionType = null; 21610 Object(_store_setToolCursor_js__WEBPACK_IMPORTED_MODULE_23__["setToolCursor"])(this.element, this.svgCursor); 21611 element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].MOUSE_DOWN, this._drawingMouseDownCallback); 21612 element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].MOUSE_MOVE, this._drawingMouseMoveCallback); 21613 element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].MOUSE_DOUBLE_CLICK, this._drawingMouseDoubleClickCallback); 21614 element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].MOUSE_DRAG, this._drawingMouseDragCallback); 21615 element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].MOUSE_UP, this._drawingMouseUpCallback); // Touch 21616 21617 element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].TOUCH_START, this._drawingTouchStartCallback); 21618 element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].TOUCH_DRAG, this._drawingTouchDragCallback); 21619 element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].TOUCH_START, this._drawingMouseMoveCallback); 21620 element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].TOUCH_END, this._drawingMouseUpCallback); 21621 _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.updateImage(element); 21622 } 21623 /** 21624 * Adds modify loop event listeners. 21625 * 21626 * @private 21627 * @param {Object} element - The viewport element to add event listeners to. 21628 * @modifies {element} 21629 * @returns {undefined} 21630 */ 21631 21632 }, { 21633 key: "_activateModify", 21634 value: function _activateModify(element) { 21635 _store_index_js__WEBPACK_IMPORTED_MODULE_13__["state"].isToolLocked = true; 21636 element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].MOUSE_UP, this._editMouseUpCallback); 21637 element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].MOUSE_DRAG, this._editMouseDragCallback); 21638 element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].MOUSE_CLICK, this._editMouseUpCallback); 21639 element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].TOUCH_END, this._editMouseUpCallback); 21640 element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].TOUCH_DRAG, this._editTouchDragCallback); 21641 _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.updateImage(element); 21642 } 21643 /** 21644 * Removes modify loop event listeners. 21645 * 21646 * @private 21647 * @param {Object} element - The viewport element to add event listeners to. 21648 * @modifies {element} 21649 * @returns {undefined} 21650 */ 21651 21652 }, { 21653 key: "_deactivateModify", 21654 value: function _deactivateModify(element) { 21655 _store_index_js__WEBPACK_IMPORTED_MODULE_13__["state"].isToolLocked = false; 21656 element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].MOUSE_UP, this._editMouseUpCallback); 21657 element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].MOUSE_DRAG, this._editMouseDragCallback); 21658 element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].MOUSE_CLICK, this._editMouseUpCallback); 21659 element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].TOUCH_END, this._editMouseUpCallback); 21660 element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].TOUCH_DRAG, this._editTouchDragCallback); 21661 _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.updateImage(element); 21662 } 21663 }, { 21664 key: "passiveCallback", 21665 value: function passiveCallback(element) { 21666 this._closeToolIfDrawing(element); 21667 } 21668 }, { 21669 key: "enabledCallback", 21670 value: function enabledCallback(element) { 21671 this._closeToolIfDrawing(element); 21672 } 21673 }, { 21674 key: "disabledCallback", 21675 value: function disabledCallback(element) { 21676 this._closeToolIfDrawing(element); 21677 } 21678 }, { 21679 key: "_closeToolIfDrawing", 21680 value: function _closeToolIfDrawing(element) { 21681 if (this._drawing) { 21682 // Actively drawing but changed mode. 21683 var config = this.configuration;
21684 var lastHandlePlaced = config.currentHandle; 21685 21686 this._endDrawing(element, lastHandlePlaced); 21687 21688 _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.updateImage(element); 21689 } 21690 } 21691 /** 21692 * Fire MEASUREMENT_MODIFIED event on provided element 21693 * @param {any} element which freehand data has been modified 21694 * @param {any} measurementData the measurment data 21695 * @returns {void} 21696 */ 21697 21698 }, { 21699 key: "fireModifiedEvent", 21700 value: function fireModifiedEvent(element, measurementData) { 21701 var eventType = _events_js__WEBPACK_IMPORTED_MODULE_7__["default"].MEASUREMENT_MODIFIED; 21702 var eventData = { 21703 toolName: this.name, 21704 element: element, 21705 measurementData: measurementData 21706 }; 21707 Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_14__["default"])(element, eventType, eventData); 21708 } 21709 }, { 21710 key: "fireCompletedEvent", 21711 value: function fireCompletedEvent(element, measurementData) { 21712 var eventType = _events_js__WEBPACK_IMPORTED_MODULE_7__["default"].MEASUREMENT_COMPLETED; 21713 var eventData = { 21714 toolName: this.name, 21715 element: element, 21716 measurementData: measurementData 21717 }; 21718 Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_14__["default"])(element, eventType, eventData); 21719 } // =================================================================== 21720 // Public Configuration API. . 21721 // =================================================================== 21722 21723 }, { 21724 key: "cancelDrawing", 21725 21726 /** 21727 * Ends the active drawing loop and removes the polygon. 21728 * 21729 * @public 21730 * @param {Object} element - The element on which the roi is being drawn. 21731 * @returns {null} 21732 */ 21733 value: function cancelDrawing(element) { 21734 if (!this._drawing) { 21735 return; 21736 } 21737 21738 var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_10__["getToolState"])(element, this.name); 21739 var config = this.configuration; 21740 var data = toolState.data[config.currentTool]; 21741 data.active = false; 21742 data.highlight = false; 21743 data.handles.invalidHandlePlacement = false; // Reset the current handle 21744 21745 config.currentHandle = 0; 21746 config.currentTool = -1; 21747 data.canComplete = false; 21748 Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_10__["removeToolState"])(element, this.name, data); 21749 21750 this._deactivateDraw(element); 21751 21752 _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.updateImage(element); 21753 } 21754 /** 21755 * New image event handler. 21756 * 21757 * @public 21758 * @param {Object} evt The event. 21759 * @returns {null} 21760 */ 21761 21762 }, { 21763 key: "newImageCallback", 21764 value: function newImageCallback(evt) { 21765 var config = this.configuration; 21766 21767 if (!(this._drawing && this._activeDrawingToolReference)) { 21768 return; 21769 } // Actively drawing but scrolled to different image. 21770 21771 21772 var element = evt.detail.element; 21773 var data = this._activeDrawingToolReference; 21774 data.active = false; 21775 data.highlight = false; 21776 data.handles.invalidHandlePlacement = false; // Connect the end handle to the origin handle 21777 21778 var points = data.handles.points; 21779 points[config.currentHandle - 1].lines.push(points[0]); // Reset the current handle 21780 21781 config.currentHandle = 0; 21782 config.currentTool = -1; 21783 data.canComplete = false; 21784 21785 this._deactivateDraw(element); 21786 21787 _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.updateImage(element); 21788 } 21789 }, { 21790 key: "spacing", 21791 get: function get() { 21792 return this.configuration.spacing; 21793 }, 21794 set: function set(value) { 21795 if (typeof value !== 'number') { 21796 throw new Error('Attempting to set freehand spacing to a value other than a number.'); 21797 } 21798 21799 this.configuration.spacing = value; 21800 _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.updateImage(this.element); 21801 } 21802 }, { 21803 key: "activeHandleRadius", 21804 get: function get() { 21805 return this.configuration.activeHandleRadius; 21806 }, 21807 set: function set(value) { 21808 if (typeof value !== 'number') { 21809 throw new Error('Attempting to set freehand activeHandleRadius to a value other than a
21809number.'); 21810 } 21811 21812 this.configuration.activeHandleRadius = value; 21813 _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.updateImage(this.element); 21814 } 21815 }, { 21816 key: "completeHandleRadius", 21817 get: function get() { 21818 return this.configuration.completeHandleRadius; 21819 }, 21820 set: function set(value) { 21821 if (typeof value !== 'number') { 21822 throw new Error('Attempting to set freehand completeHandleRadius to a value other than a number.'); 21823 } 21824 21825 this.configuration.completeHandleRadius = value; 21826 _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.updateImage(this.element); 21827 } 21828 }, { 21829 key: "alwaysShowHandles", 21830 get: function get() { 21831 return this.configuration.alwaysShowHandles; 21832 }, 21833 set: function set(value) { 21834 if (typeof value !== 'boolean') { 21835 throw new Error('Attempting to set freehand alwaysShowHandles to a value other than a boolean.'); 21836 } 21837 21838 this.configuration.alwaysShowHandles = value; 21839 _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.updateImage(this.element); 21840 } 21841 }, { 21842 key: "invalidColor", 21843 get: function get() { 21844 return this.configuration.invalidColor; 21845 }, 21846 set: function set(value) { 21847 /* 21848 It'd be easy to check if the color was e.g. a valid rgba color. However 21849 it'd be difficult to check if the color was a named CSS color without 21850 bloating the library, so we don't. If the canvas can't intepret the color 21851 it'll show up grey. 21852 */ 21853 this.configuration.invalidColor = value; 21854 _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.updateImage(this.element); 21855 } 21856 }]); 21857 21858 return FreehandMouseTool; 21859}(_base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_9__["default"]); 21860 21861 21862 21863function defaultFreehandConfiguration() { 21864 return { 21865 mouseLocation: { 21866 handles: { 21867 start: { 21868 highlight: true, 21869 active: true 21870 } 21871 } 21872 }, 21873 spacing: 1, 21874 activeHandleRadius: 3, 21875 completeHandleRadius: 6, 21876 completeHandleRadiusTouch: 28, 21877 alwaysShowHandles: false, 21878 invalidColor: 'crimson', 21879 currentHandle: 0, 21880 currentTool: -1 21881 }; 21882} 21883 21884function preventPropagation(evt) { 21885 evt.stopImmediatePropagation(); 21886 evt.stopPropagation(); 21887 evt.preventDefault(); 21888} 21889 21890/***/ }), 21891
21892/***/ "./tools/annotation/LengthTool.js": 21893/*!****************************************!*\ 21894 !*** ./tools/annotation/LengthTool.js ***! 21895 \****************************************/ 21896/*! exports provided: default */ 21897/***/ (function(module, __webpack_exports__, __webpack_require__) { 21898 21899"use strict"; 21900__webpack_require__.r(__webpack_exports__); 21901/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return LengthTool; }); 21902/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js"); 21903/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); 21904/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js"); 21905/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); 21906/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js"); 21907/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); 21908/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js"); 21909/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); 21910/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js"); 21911/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__); 21912/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./../../externalModules.js */ "./externalModules.js"); 21913/* harmony import */ var _base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../base/BaseAnnotationTool.js */ "./tools/base/BaseAnnotationTool.js"); 21914/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./../../stateManagement/toolState.js */ "./stateManagement/toolState.js"); 21915/* harmony import */ var _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./../../stateManagement/toolStyle.js */ "./stateManagement/toolStyle.js"); 21916/* harmony import */ var _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./../../stateManagement/toolColors.js */ "./stateManagement/toolColors.js"); 21917/* harmony import */ var _drawing_index_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./../../drawing/index.js */ "./drawing/index.js"); 21918/* harmony import */ var _drawing_drawLinkedTextBox_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./../../drawing/drawLinkedTextBox.js */ "./drawing/drawLinkedTextBox.js"); 21919/* harmony import */ var _drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./../../drawing/drawHandles.js */ "./drawing/drawHandles.js"); 21920/* harmony import */ var _util_lineSegDistance_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./../../util/lineSegDistance.js */ "./util/lineSegDistance.js"); 21921/* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../cursors/index.js */ "./tools/cursors/index.js"); 21922/* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../util/logger.js */ "./util/logger.js"); 21923/* harmony import */ var _util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../util/getPixelSpacing */ "./util/getPixelSpacing.js"); 21924/* harmony import */ var _util_throttle__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../../util/throttle */ "./util/throttle.js"); 21925 21926 21927 21928 21929 21930 21931 // State 21932 21933 21934 21935 // Drawing 21936 21937 21938 21939 21940 21941 21942 21943 21944 21945var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_15__["getLogger"])('tools:annotation:LengthTool'); 21946/** 21947 * @public 21948 * @class LengthTool 21949 * @memberof Tools.Annotation 21950 * @classdesc Tool for measuring distances. 21951 * @extends Tools.Base.BaseAnnotationTool 21952 */ 21953 21954var LengthTool = 21955/*#__PURE__*/ 21956function (_BaseAnnotationTool) { 21957 _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(LengthTool, _BaseAnnotationTool); 21958 21959 function LengthTool() { 21960 var _this; 21961 21962 var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 21963 21964 _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, LengthTool); 21965 21966 var defaultProps = { 21967 name: 'Length', 21968 supportedInteractionTypes: ['Mouse', 'Touch'], 21969 svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_14__["lengthCursor"] 21970 }; 21971 _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(LengthTool).call(this, props, defaultProps)); 21972 _this.throttledUpdateCachedStats = Object(_util_throttle__WEBPACK_IMPORTED_MODULE_17__["default"])(_this.updateCachedStats, 110); 21973 return _this; 21974 } 21975 21976 _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(LengthTool, [{ 21977 key: "createNewMeasurement", 21978 value: function createNewMeasurement(eventData) { 21979 var goodEventData = eventData && eventData.currentPoints && eventData.currentPoints.image; 21980 21981 if (!goodEventData) { 21982 logger.error("required eventData not supplied to tool ".concat(this.name, "'s createNewMeasurement")); 21983 return; 21984 } 21985 21986 var _eventData$currentPoi = eventData.currentPoints.image, 21987 x = _eventData$currentPoi.x, 21988 y = _eventData$currentPoi.y; 21989 return { 21990 visible: true, 21991 active: true, 21992 color: undefined, 21993 invalidated: true, 21994 handles: { 21995 start: { 21996 x: x, 21997 y: y, 21998 highlight: true, 21999 active: false 22000 }, 22001 end: { 22002 x: x, 22003 y: y, 22004 highlight: true, 22005 active: true 22006 }, 22007 textBox: { 22008 active: false, 22009 hasMoved: false, 22010 movesIndependently: false, 22011 drawnIndependently: true, 22012 allowedOutsideImage: true, 22013 hasBoundingBox: true 22014 } 22015 } 22016 }; 22017 } 22018 /** 22019 * 22020 * 22021 * @param {*} element 22022 * @param {*} data 22023 * @param {*} coords 22024 * @returns {Boolean} 22025 */ 22026 22027 }, { 22028 key: "pointNearTool", 22029 value: function pointNearTool(element, data, coords) { 22030 var hasStartAndEndHandles = data && data.handles && data.handles.start && data.handles.end;
22031 var validParameters = hasStartAndEndHandles; 22032 22033 if (!validParameters) { 22034 logger.warn("invalid parameters supplied to tool ".concat(this.name, "'s pointNearTool")); 22035 return false; 22036 } 22037 22038 if (data.visible === false) { 22039 return false; 22040 } 22041 22042 return Object(_util_lineSegDistance_js__WEBPACK_IMPORTED_MODULE_13__["default"])(element, data.handles.start, data.handles.end, coords) < 25; 22043 } 22044 }, { 22045 key: "updateCachedStats", 22046 value: function updateCachedStats(image, element, data) { 22047 var _getPixelSpacing = Object(_util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_16__["default"])(image), 22048 rowPixelSpacing = _getPixelSpacing.rowPixelSpacing, 22049 colPixelSpacing = _getPixelSpacing.colPixelSpacing; // Set rowPixelSpacing and columnPixelSpacing to 1 if they are undefined (or zero) 22050 22051 22052 var dx = (data.handles.end.x - data.handles.start.x) * (colPixelSpacing || 1); 22053 var dy = (data.handles.end.y - data.handles.start.y) * (rowPixelSpacing || 1); // Calculate the length, and create the text variable with the millimeters or pixels suffix 22054 22055 var length = Math.sqrt(dx * dx + dy * dy); // Store the length inside the tool for outside access 22056 22057 data.length = length; 22058 data.invalidated = false; 22059 } 22060 }, { 22061 key: "renderToolData", 22062 value: function renderToolData(evt) { 22063 var _this2 = this; 22064 22065 var eventData = evt.detail; 22066 var _this$configuration = this.configuration, 22067 handleRadius = _this$configuration.handleRadius, 22068 drawHandlesOnHover = _this$configuration.drawHandlesOnHover; 22069 var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_7__["getToolState"])(evt.currentTarget, this.name); 22070 22071 if (!toolData) { 22072 return; 22073 } // We have tool data for this element - iterate over each one and draw it 22074 22075 22076 var context = Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["getNewContext"])(eventData.canvasContext.canvas); 22077 var image = eventData.image, 22078 element = eventData.element; 22079 22080 var _getPixelSpacing2 = Object(_util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_16__["default"])(image), 22081 rowPixelSpacing = _getPixelSpacing2.rowPixelSpacing, 22082 colPixelSpacing = _getPixelSpacing2.colPixelSpacing; 22083 22084 var lineWidth = _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_8__["default"].getToolW
22084idth(); 22085 22086 var _loop = function _loop(i) { 22087 var data = toolData.data[i]; 22088 22089 if (data.visible === false) { 22090 return "continue"; 22091 } 22092 22093 Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["draw"])(context, function (context) { 22094 // Configurable shadow 22095 Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["setShadow"])(context, _this2.configuration); 22096 var color = _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_9__["default"].getColorIfActive(data); // Draw the measurement line 22097 22098 var lineOptions = { 22099 color: color 22100 }; 22101 if(data.lineWidth){ 22102 lineOptions.lineWidth = data.lineWidth; 22103 } 22104 Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["drawLine"])(context, element, data.handles.start, data.handles.end, lineOptions); // Draw the handles 22105 22106 var handleOptions = { 22107 color: color, 22108 handleRadius: handleRadius, 22109 drawHandlesIfActive: drawHandlesOnHover 22110 }; 22111 Object(_drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_12__["default"])(context, eventData, data.handles, handleOptions); 22112 22113 if (!data.handles.textBox.hasMoved) { 22114 var coords = { 22115 x: Math.max(data.handles.start.x, data.handles.end.x) 22116 }; // Depending on which handle has the largest x-value, 22117 // Set the y-value for the text box 22118 22119 if (coords.x === data.handles.start.x) { 22120 coords.y = data.handles.start.y; 22121 } else { 22122 coords.y = data.handles.end.y; 22123 } 22124 22125 data.handles.textBox.x = coords.x; 22126 data.handles.textBox.y = coords.y; 22127 } // Move the textbox slightly to the right and upwards 22128 // So that it sits beside the length tool handle 22129 22130 22131 var xOffset = 10; // Update textbox stats 22132 22133 if (data.invalidated === true) { 22134 if (data.length) { 22135 _this2.throttledUpdateCachedStats(image, element, data); 22136 } else { 22137 _this2.updateCachedStats(image, element, data); 22138 } 22139 } 22140 22141 var text = textBoxText(data, rowPixelSpacing, colPixelSpacing); 22142 Object(_drawing_drawLinkedTextBox_js__WEBPACK_IMPORTED_MODULE_11__["default"])(context, element, data.handles.textBox, text, data.handles, textBoxAnchorPoints, color, lineWidth, xOffset, true); 22143 }); 22144 }; 22145 22146 for (var i = 0; i < toolData.data.length; i++) { 22147 var _ret = _loop(i); 22148 22149 if (_ret === "continue") continue; 22150 } 22151 22152 function textBoxText(data, rowPixelSpacing, colPixelSpacing) { 22153 // Set the length text suffix depending on whether or not pixelSpacing is available 22154 var suffix = ' mm'; 22155 22156 if (!rowPixelSpacing || !colPixelSpacing) { 22157 suffix = ' pixels'; 22158 } 22159 22160 return "".concat(data.length.toFixed(2)).concat(suffix); 22161 } 22162 22163 function textBoxAnchorPoints(handles) { 22164 var midpoint = { 22165 x: (handles.start.x + handles.end.x) / 2, 22166 y: (handles.start.y + handles.end.y) / 2 22167 }; 22168 return [handles.start, midpoint, handles.end]; 22169 } 22170 } 22171 }]); 22172 22173 return LengthTool; 22174}(_base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]); 22175 22176 22177 22178/***/ }), 22179
22180/***/ "./tools/annotation/ProbeTool.js": 22181/*!***************************************!*\ 22182 !*** ./tools/annotation/ProbeTool.js ***! 22183 \***************************************/ 22184/*! exports provided: default */ 22185/***/ (function(module, __webpack_exports__, __webpack_require__) { 22186 22187"use strict"; 22188__webpack_require__.r(__webpack_exports__); 22189/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ProbeTool; }); 22190/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js"); 22191/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); 22192/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js"); 22193/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); 22194/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js"); 22195/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); 22196/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js"); 22197/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); 22198/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js"); 22199/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__); 22200/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../externalModules.js */ "./externalModules.js"); 22201/* harmony import */ var _base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../base/BaseAnnotationTool.js */ "./tools/base/BaseAnnotationTool.js"); 22202/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../stateManagement/toolState.js */ "./stateManagement/toolState.js"); 22203/* harmony import */ var _stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../stateManagement/textStyle.js */ "./stateManagement/textStyle.js"); 22204/* harmony import */ var _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../stateManagement/toolColors.js */ "./stateManagement/toolColors.js"); 22205/* harmony import */ var _drawing_index_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../drawing/index.js */ "./drawing/index.js"); 22206/* harmony import */ var _drawing_drawTextBox_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../drawing/drawTextBox.js */ "./drawing/drawTextBox.js"); 22207/* harmony import */ var _drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../drawing/drawHandles.js */ "./drawing/drawHandles.js"); 22208/* harmony import */ var _util_getRGBPixels_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../util/getRGBPixels.js */ "./util/getRGBPixels.js"); 22209/* harmony import */ var _util_calculateSUV_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../../util/calculateSUV.js */ "./util/calculateSUV.js"); 22210/* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../cursors/index.js */ "./tools/cursors/index.js"); 22211/* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../util/logger.js */ "./util/logger.js"); 22212/* harmony import */ var _util_throttle__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../../util/throttle */ "./util/throttle.js"); 22213 22214 22215 22216 22217 22218 22219 // State 22220 22221 22222 22223 // Drawing 22224 22225 22226 22227 // Utilities 22228 22229 22230 22231 22232 22233 22234var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_16__["getLogger"])('tools:annotation:ProbeTool'); 22235/** 22236 * @public 22237 * @class ProbeTool 22238 * @memberof Tools.Annotation 22239 * @classdesc Tool which provides a probe of the image data at the 22240 * desired position. 22241 * @extends Tools.Base.BaseAnnotationTool 22242 */ 22243 22244var ProbeTool = 22245/*#__PURE__*/ 22246function (_BaseAnnotationTool) { 22247 _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(ProbeTool, _BaseAnnotationTool); 22248 22249 function ProbeTool() { 22250 var _this; 22251 22252 var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 22253 22254 _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, ProbeTool); 22255 22256 var defaultProps = { 22257 name: 'Probe', 22258 supportedInteractionTypes: ['Mouse', 'Touch'], 22259 svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_15__["probeCursor"] 22260 }; 22261 _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(ProbeTool).call(this, props, defaultProps)); 22262 _this.throttledUpdateCachedStats = Object(_util_throttle__WEBPACK_IMPORTED_MODULE_17__["default"])(_this.updateCachedStats, 110); 22263 return _this; 22264 } 22265 22266 _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(ProbeTool, [{ 22267 key: "createNewMeasurement", 22268 value: function createNewMeasurement(eventData) { 22269 var goodEventData = eventData && eventData.currentPoints && eventData.currentPoints.image; 22270 22271 if (!goodEventData) { 22272 logger.error("required eventData not supplied to tool ".concat(this.name, "'s createNewMeasurement")); 22273 return; 22274 } 22275 22276 return { 22277 visible: true, 22278 active: true, 22279 color: undefined, 22280 invalidated: true, 22281 handles: { 22282 end: { 22283 x: eventData.currentPoints.image.x, 22284 y: eventData.currentPoints.image.y, 22285 highlight: true, 22286 active: true 22287 } 22288 } 22289 }; 22290 } 22291 /** 22292 * 22293 * 22294 * @param {*} element 22295 * @param {*} data 22296 * @param {*} coords 22297 * @returns {Boolean} 22298 */ 22299 22300 }, { 22301 key: "pointNearTool", 22302 value: function pointNearTool(element, data, coords) { 22303 var hasEndHandle = data && data.handles && data.handles.end;
22304 var validParameters = hasEndHandle; 22305 22306 if (!validParameters) { 22307 logger.warn("invalid parameters supplied to tool ".concat(this.name, "'s pointNearTool")); 22308 } 22309 22310 if (!validParameters || data.visible === false) { 22311 return false; 22312 } 22313 22314 var probeCoords = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.pixelToCanvas(element, data.handles.end); 22315 return _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstoneMath.point.distance(probeCoords, coords) < 5; 22316 } 22317 }, { 22318 key: "updateCachedStats", 22319 value: function updateCachedStats(image, element, data) { 22320 var x = Math.round(data.handles.end.x); 22321 var y = Math.round(data.handles.end.y); 22322 var stats = {}; 22323 22324 if (x >= 0 && y >= 0 && x < image.columns && y < image.rows) { 22325 stats.x = x; 22326 stats.y = y; 22327 22328 if (image.color) { 22329 stats.storedPixels = Object(_util_getRGBPixels_js__WEBPACK_IMPORTED_MODULE_13__["default"])(element, x, y, 1, 1); 22330 } else { 22331 stats.storedPixels = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.getStoredPixels(element, x, y, 1, 1); 22332 stats.sp = stats.storedPixels[0]; 22333 stats.mo = stats.sp * image.slope + image.intercept; 22334 stats.suv = Object(_util_calculateSUV_js__WEBPACK_IMPORTED_MODULE_14__["default"])(image, stats.sp); 22335 } 22336 } 22337 22338 data.cachedStats = stats; 22339 data.invalidated = false; 22340 } 22341 }, { 22342 key: "renderToolData", 22343 value: function renderToolData(evt) { 22344 var _this2 = this; 22345 22346 var eventData = evt.detail; 22347 var handleRadius = this.configuration.handleRadius; 22348 var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_7__["getToolState"])(evt.currentTarget, this.name); 22349 22350 if (!toolData) { 22351 return; 22352 } // We have tool data for this element - iterate over each one and draw it 22353 22354 22355 var context = Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["getNewContext"])(eventData.canvasContext.canvas); 22356 var image = eventData.image, 22357 element = eventData.element; 22358 var fontHeight = _stateManagement_textStyle_js__WEBPACK_IMPORTED_MODULE_8__["default"].getFontSize(); 22359 22360 var _loop = function _loop(i) { 22361 var data = toolData.data[i]; 22362 22363 if (data.visible === false) { 22364 return "continue"; 22365 } 22366 22367 Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["draw"])(context, function (context) { 22368 var color = _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_9__["default"].getColorIfActive(data); // Draw the handles 22369 22370 var handlesOptions = { 22371 handleRadius: handleRadius, 22372 color: color 22373 } 22374 if(data.lineWidth){ 22375 handlesOptions.lineWidth = data.lineWidth; 22376 } 22377 Object(_drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_12__["default"])(context, eventData, data.handles, handlesOptions); // Update textbox stats 22378 22379 if (data.invalidated === true) { 22380 if (data.cachedStats) { 22381 _this2.throttledUpdateCachedStats(image, element, data); 22382 } else { 22383 _this2.updateCachedStats(image, element, data); 22384 } 22385 } 22386 22387 var text, str; 22388 var _data$cachedStats = data.cachedStats, 22389 x = _data$cachedStats.x, 22390 y = _data$cachedStats.y, 22391 storedPixels = _data$cachedStats.storedPixels, 22392 sp = _data$cachedStats.sp, 22393 mo = _data$cachedStats.mo, 22394 suv = _data$cachedStats.suv; 22395 22396 if (x >= 0 && y >= 0 && x < image.columns && y < image.rows) { 22397 text = "".concat(x, ", ").concat(y); 22398 22399 if (image.color) { 22400 str = "R: ".concat(storedPixels[0], " G: ").concat(storedPixels[1], " B: ").concat(storedPixels[2]); 22401 } else { 22402 // Draw text 22403 str = "SP: ".concat(sp, " MO: ").concat(parseFloat(mo.toFixed(3))); 22404 22405 if (suv) { 22406 str += " SUV: ".concat(parseFloat(suv.toFixed(3))); 22407 } 22408 } // Coords for text 22409 22410 22411 var coords = { 22412 // Translate the x/y away from the cursor 22413 x: data.handles.end.x + 3, 22414 y: data.handles.end.y - 3 22415 }; 22416 var textCoords = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.pixelToCanvas(eventData.element, coords); 22417 Object(_drawing_drawTextBox_js__WEBPACK_IMPORTED_MODULE_11__["default"])(context, str, textCoords.x, textCoords.y + fontHeight + 5, color); 22418 Object(_drawing_drawTextBox_js__WEBPACK_IMPORTED_MODULE_11__["default"])(context, text, textCoords.x, textCoords.y, color); 22419 } 22420 }); 22421 }; 22422 22423 for (var i = 0; i < toolData.data.length; i++) { 22424 var _ret = _loop(i); 22425 22426 if (_ret === "continue") continue; 22427 } 22428 } 22429 }]); 22430 22431 return ProbeTool; 22432}(_base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]); 22433 22434 22435 22436/***/ }), 22437
22438/***/ "./tools/annotation/RectangleRoiTool.js": 22439/*!**********************************************!*\ 22440 !*** ./tools/annotation/RectangleRoiTool.js ***! 22441 \**********************************************/ 22442/*! exports provided: default */ 22443/***/ (function(module, __webpack_exports__, __webpack_require__) { 22444 22445"use strict"; 22446__webpack_require__.r(__webpack_exports__); 22447/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return RectangleRoiTool; }); 22448/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js"); 22449/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); 22450/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js"); 22451/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); 22452/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js"); 22453/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); 22454/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js"); 22455/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); 22456/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js"); 22457/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__); 22458/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./../../externalModules.js */ "./externalModules.js"); 22459/* harmony import */ var _base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../base/BaseAnnotationTool.js */ "./tools/base/BaseAnnotationTool.js"); 22460/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./../../stateManagement/toolState.js */ "./stateManagement/toolState.js"); 22461/* harmony import */ var _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./../../stateManagement/toolStyle.js */ "./stateManagement/toolStyle.js"); 22462/* harmony import */ var _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./../../stateManagement/toolColors.js */ "./stateManagement/toolColors.js"); 22463/* harmony import */ var _drawing_index_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./../../drawing/index.js */ "./drawing/index.js"); 22464/* harmony import */ var _util_calculateSUV_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./../../util/calculateSUV.js */ "./util/calculateSUV.js"); 22465/* harmony import */ var _util_getROITextBoxCoords_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../util/getROITextBoxCoords.js */ "./util/getROITextBoxCoords.js"); 22466/* harmony import */ var _util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./../../util/numbersWithCommas.js */ "./util/numbersWithCommas.js"); 22467/* harmony import */ var _util_throttle_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./../../util/throttle.js */ "./util/throttle.js"); 22468/* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../cursors/index.js */ "./tools/cursors/index.js"); 22469/* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../../util/logger.js */ "./util/logger.js"); 22470/* harmony import */ var _util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../../util/getPixelSpacing */ "./util/getPixelSpacing.js"); 22471 22472 22473 22474 22475 22476 22477 // State 22478 22479 22480 22481 // Drawing 22482 22483 // Util 22484 22485 22486 22487 22488 22489 22490 22491 22492var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_16__["getLogger"])('tools:annotation:RectangleRoiTool'); 22493/** 22494 * @public 22495 * @class RectangleRoiTool 22496 * @memberof Tools.Annotation 22497 * @classdesc Tool for drawing rectangular regions of interest, and measuring 22498 * the statistics of the enclosed pixels. 22499 * @extends Tools.Base.BaseAnnotationTool 22500 */ 22501 22502var RectangleRoiTool = 22503/*#__PURE__*/ 22504function (_BaseAnnotationTool) { 22505 _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(RectangleRoiTool, _BaseAnnotationTool); 22506 22507 function RectangleRoiTool() { 22508 var _this; 22509 22510 var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 22511 22512 _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, RectangleRoiTool); 22513 22514 var defaultProps = { 22515 name: 'RectangleRoi', 22516 supportedInteractionTypes: ['Mouse', 'Touch'], 22517 configuration: {// showMinMax: false, 22518 // showHounsfieldUnits: true 22519 }, 22520 svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_15__["rectangleRoiCursor"] 22521 }; 22522 _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(RectangleRoiTool).call(this, props, defaultProps)); 22523 _this.throttledUpdateCachedStats = Object(_util_throttle_js__WEBPACK_IMPORTED_MODULE_14__["default"])(_this.updateCachedStats, 110); 22524 return _this; 22525 } 22526 22527 _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(RectangleRoiTool, [{ 22528 key: "createNewMeasurement", 22529 value: function createNewMeasurement(eventData) { 22530 var goodEventData = eventData && eventData.currentPoints && eventData.currentPoints.image; 22531 22532 if (!goodEventData) { 22533 logger.error("required eventData not supplied to tool ".concat(this.name, "'s createNewMeasurement")); 22534 return; 22535 } 22536 22537 return { 22538 visible: true, 22539 active: true, 22540 color: undefined, 22541 invalidated: true, 22542 handles: { 22543 start: { 22544 x: eventData.currentPoints.image.x, 22545 y: eventData.currentPoints.image.y, 22546 highlight: true, 22547 active: false 22548 }, 22549 end: { 22550 x: eventData.currentPoints.image.x, 22551 y: eventData.currentPoints.image.y, 22552 highlight: true, 22553 active: true 22554 }, 22555 initialRotation: eventData.viewport.rotation, 22556 textBox: { 22557 active: false, 22558 hasMoved: false, 22559 movesIndependently: false, 22560 drawnIndependently: true, 22561 allowedOutsideImage: true, 22562 hasBoundingBox: true 22563 } 22564 } 22565 }; 22566 } 22567 }, { 22568 key: "pointNearTool", 22569 value: function pointNearTool(element, data, coords, interactionType) { 22570 var hasStartAndEndHandles = data && data.handles && data.handles.start && data.handles.end;
22571 var validParameters = hasStartAndEndHandles; 22572 22573 if (!validParameters) { 22574 logger.warn("invalid parameters supplied to tool ".concat(this.name, "'s pointNearTool")); 22575 } 22576 22577 if (!validParameters || data.visible === false) { 22578 return false; 22579 } 22580 22581 var distance = interactionType === 'mouse' ? 15 : 25; 22582 var startCanvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.pixelToCanvas(element, data.handles.start); 22583 var endCanvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.pixelToCanvas(element, data.handles.end); 22584 var rect = { 22585 left: Math.min(startCanvas.x, endCanvas.x), 22586 top: Math.min(startCanvas.y, endCanvas.y), 22587 width: Math.abs(startCanvas.x - endCanvas.x), 22588 height: Math.abs(startCanvas.y - endCanvas.y) 22589 }; 22590 var distanceToPoint = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstoneMath.rect.distanceToPoint(rect, coords); 22591 return distanceToPoint < distance; 22592 } 22593 }, { 22594 key: "updateCachedStats", 22595 value: function updateCachedStats(image, element, data) { 22596 var seriesModule = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.metaData.get('generalSeriesModule', image.imageId) || {}; 22597 var modality = seriesModule.modality; 22598 var pixelSpacing = Object(_util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_17__["default"])(image); 22599 22600 var stats = _calculateStats(image, element, data.handles, modality, pixelSpacing); 22601 22602 data.cachedStats = stats; 22603 data.invalidated = false; 22604 } 22605 }, { 22606 key: "renderToolData", 22607 value: function renderToolData(evt) { 22608 var _this2 = this; 22609 22610 var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_7__["getToolState"])(evt.currentTarget, this.name); 22611 22612 if (!toolData) { 22613 return; 22614 } 22615 22616 var eventData = evt.detail; 22617 var image = eventData.image, 22618 element = eventData.element; 22619 var lineWidth = _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_8__["default"].getToolW
22619idth(); 22620 var _this$configuration = this.configuration, 22621 handleRadius = _this$configuration.handleRadius, 22622 drawHandlesOnHover = _this$configuration.drawHandlesOnHover; 22623 var context = Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["getNewContext"])(eventData.canvasContext.canvas); 22624 22625 var _getPixelSpacing = Object(_util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_17__["default"])(image), 22626 rowPixelSpacing = _getPixelSpacing.rowPixelSpacing, 22627 colPixelSpacing = _getPixelSpacing.colPixelSpacing; // Meta 22628 22629 22630 var seriesModule = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.metaData.get('generalSeriesModule', image.imageId) || {}; // Pixel Spacing 22631 22632 var modality = seriesModule.modality; 22633 var hasPixelSpacing = rowPixelSpacing && colPixelSpacing; 22634 Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["draw"])(context, function (context) { 22635 // If we have tool data for this element - iterate over each set and draw it 22636 for (var i = 0; i < toolData.data.length; i++) { 22637 var data = toolData.data[i]; 22638 22639 if (data.visible === false) { 22640 continue; 22641 } // Configure 22642 22643 22644 var color = _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_9__["default"].getColorIfActive(data); 22645 var handleOptions = { 22646 color: color, 22647 handleRadius: handleRadius, 22648 drawHandlesIfActive: drawHandlesOnHover 22649 }; 22650 var lineOptions = { 22651 color: color 22652 }; 22653 if(data.lineWidth){ 22654 lineOptions.lineWidth = data.lineWidth; 22655 } 22656 Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["setShadow"])(context, _this2.configuration); // Draw 22657 22658 Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["drawRect"])(context, element, data.handles.start, data.handles.end, lineOptions, 'pixel', data.handles.initialRotation); 22659 Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["drawHandles"])(context, eventData, data.handles, handleOptions); // Update textbox stats 22660 22661 if (data.invalidated === true) { 22662 if (data.cachedStats) { 22663 _this2.throttledUpdateCachedStats(image, element, data); 22664 } else { 22665 _this2.updateCachedStats(image, element, data); 22666 } 22667 } // Default to textbox on right side of ROI 22668 22669 22670 if (!data.handles.textBox.hasMoved) { 22671 var defaultCoords = Object(_util_getROITextBoxCoords_js__WEBPACK_IMPORTED_MODULE_12__["default"])(eventData.viewport, data.handles); 22672 Object.assign(data.handles.textBox, defaultCoords); 22673 } 22674 22675 var textBoxAnchorPoints = function textBoxAnchorPoints(handles) { 22676 return _findTextBoxAnchorPoints(handles.start, handles.end); 22677 }; 22678 22679 var textBoxContent = _createTextBoxContent(context, image.color, data.cachedStats, modality, hasPixelSpacing, _this2.configuration); 22680 22681 Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["drawLinkedTextBox"])(context, element, data.handles.textBox, textBoxContent, data.handles, textBoxAnchorPoints, color, lineWidth, 10, true); 22682 } 22683 }); 22684 } 22685 }]); 22686 22687 return RectangleRoiTool; 22688}(_base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]); 22689/** 22690 * TODO: This is the same method (+ GetPixels) for the other ROIs 22691 * TODO: The pixel filtering is the unique bit 22692 * 22693 * @param {*} startHandle 22694 * @param {*} endHandle 22695 * @returns {{ left: number, top: number, width: number, height: number}} 22696 */ 22697 22698 22699 22700 22701function _getRectangleImageCoordinates(startHandle, endHandle) { 22702 return { 22703 left: Math.min(startHandle.x, endHandle.x), 22704 top: Math.min(startHandle.y, endHandle.y), 22705 width: Math.abs(startHandle.x - endHandle.x), 22706 height: Math.abs(startHandle.y - endHandle.y) 22707 }; 22708} 22709/** 22710 * 22711 * 22712 * @param {*} image 22713 * @param {*} element 22714 * @param {*} handles 22715 * @param {*} modality 22716 * @param {*} pixelSpacing 22717 * @returns {Object} The Stats object 22718 */ 22719 22720 22721function _calculateStats(image, element, handles, modality, pixelSpacing) { 22722 // Retrieve the bounds of the rectangle in image coordinates 22723 var roiCoordinates = _getRectangleImageCoordinates(handles.start, handles.end); // Retrieve the array of pixels that the rectangle bounds cover 22724 22725 22726 var pixels = _externalModules_js__WEBPACK_IMPORTED_MODULE_5__["default"].cornerstone.getPixels(element, roiCoordinates.left, roiCoordinates.top, roiCoordinates.width, roiCoordinates.height); // Calculate the mean & standard deviation from the pixels and the rectangle details 22727 22728 var roiMeanStdDev = _calculateRectangleStats(pixels, roiCoordinates); 22729 22730 var meanStdDevSUV; 22731 22732 if (modality === 'PT') { 22733 meanStdDevSUV = {
22734 mean: Object(_util_calculateSUV_js__WEBPACK_IMPORTED_MODULE_11__["default"])(image, roiMeanStdDev.mean, true) || 0, 22735 stdDev: Object(_util_calculateSUV_js__WEBPACK_IMPORTED_MODULE_11__["default"])(image, roiMeanStdDev.stdDev, true) || 0 22736 }; 22737 } // Calculate the image area from the rectangle dimensions and pixel spacing 22738 22739 22740 var area = roiCoordinates.width * (pixelSpacing.colPixelSpacing || 1) * (roiCoordinates.height * (pixelSpacing.rowPixelSpacing || 1)); 22741 return { 22742 area: area || 0, 22743 count: roiMeanStdDev.count || 0, 22744 mean: roiMeanStdDev.mean || 0, 22745 variance: roiMeanStdDev.variance || 0, 22746 stdDev: roiMeanStdDev.stdDev || 0, 22747 min: roiMeanStdDev.min || 0, 22748 max: roiMeanStdDev.max || 0, 22749 meanStdDevSUV: meanStdDevSUV 22750 }; 22751} 22752/** 22753 * 22754 * 22755 * @param {*} sp 22756 * @param {*} rectangle 22757 * @returns {{ count, number, mean: number, variance: number, stdDev: number, min: number, max: number }} 22758 */ 22759 22760 22761function _calculateRectangleStats(sp, rectangle) { 22762 var sum = 0; 22763 var sumSquared = 0; 22764 var count = 0; 22765 var index = 0; 22766 var min = sp ? sp[0] : null; 22767 var max = sp ? sp[0] : null; 22768 22769 for (var y = rectangle.top; y < rectangle.top + rectangle.height; y++) { 22770 for (var x = rectangle.left; x < rectangle.left + rectangle.width; x++) { 22771 sum += sp[index]; 22772 sumSquared += sp[index] * sp[index]; 22773 min = Math.min(min, sp[index]); 22774 max = Math.max(max, sp[index]); 22775 count++; // TODO: Wouldn't this just be sp.length? 22776 22777 index++; 22778 } 22779 } 22780 22781 if (count === 0) { 22782 return { 22783 count: count, 22784 mean: 0.0, 22785 variance: 0.0, 22786 stdDev: 0.0, 22787 min: 0.0, 22788 max: 0.0 22789 }; 22790 } 22791 22792 var mean = sum / count; 22793 var variance = sumSquared / count - mean * mean; 22794 return { 22795 count: count, 22796 mean: mean, 22797 variance: variance, 22798 stdDev: Math.sqrt(variance), 22799 min: min, 22800 max: max 22801 }; 22802} 22803/** 22804 * 22805 * 22806 * @param {*} startHandle 22807 * @param {*} endHandle 22808 * @returns {Array.<{x: number, y: number}>} 22809 */ 22810 22811 22812function _findTextBoxAnchorPoints(startHandle, endHandle) { 22813 var _getRectangleImageCoo = _getRectangleImageCoordinates(startHandle, endHandle), 22814 left = _getRectangleImageCoo.left, 22815 top = _getRectangleImageCoo.top, 22816 width = _getRectangleImageCoo.width, 22817 height = _getRectangleImageCoo.height; 22818 22819 return [{ 22820 // Top middle point of rectangle 22821 x: left + width / 2, 22822 y: top 22823 }, { 22824 // Left middle point of rectangle 22825 x: left, 22826 y: top + height / 2 22827 }, { 22828 // Bottom middle point of rectangle 22829 x: left + width / 2, 22830 y: top + height 22831 }, { 22832 // Right middle point of rectangle 22833 x: left + width, 22834 y: top + height / 2 22835 }]; 22836} 22837/** 22838 * 22839 * 22840 * @param {*} area 22841 * @param {*} hasPixelSpacing 22842 * @returns {string} The formatted label for showing area 22843 */ 22844 22845 22846function _formatArea(area, hasPixelSpacing) { 22847 // This uses Char code 178 for a superscript 2 22848 var suffix = hasPixelSpacing ? " mm".concat(String.fromCharCode(178)) : " px".concat(String.fromCharCode(178)); 22849 return "Area: ".concat(Object(_util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_13__["default"])(area.toFixed(2))).concat(suffix); 22850} 22851/** 22852 * TODO: This is identical to EllipticalROI's same fn 22853 * TODO: We may want to make this a utility for ROIs with these values? 22854 * 22855 * @param {*} context 22856 * @param {*} isColorImage 22857 * @param {*} { area, mean, stdDev, min, max, meanStdDevSUV } 22858 * @param {*} modality 22859 * @param {*} hasPixelSpacing 22860 * @param {*} [options={}] 22861 * @returns {string[]} 22862 */ 22863 22864 22865function _createTextBoxContent(context, isColorImage, _ref, modality, hasPixelSpacing) { 22866 var area = _ref.area, 22867 mean = _ref.mean, 22868 stdDev = _ref.stdDev, 22869 min = _ref.min, 22870 max = _ref.max, 22871 meanStdDevSUV = _ref.meanStdDevSUV; 22872 var options = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {}; 22873 var showMinMax = options.showMinMax || false; 22874 var showHounsfieldUnits = options.showHounsfieldUnits !== false; 22875 var textLines = []; 22876 var otherLines = []; 22877 22878 if (!isColorImage) { 22879 var hasStandardUptakeValues = meanStdDevSUV && meanStdDevSUV.mean !== 0; 22880 var suffix = modality === 'CT' && showHounsfieldUnits ? ' HU' : ''; 22881 var meanString = "Mean: ".concat(Object(_util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_13__["default"])(mean.toFixed(2))).concat(suffix); 22882 var stdDevString = "Std Dev: ".concat(Object(_util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_13__["default"])(stdDev.toFixed(2))).concat(suffix); // If this image has SUV values to display, concatenate them to the text line 22883 22884 if (hasStandardUptakeValues) { 22885 var SUVtext = ' SUV: '; 22886 var meanSuvString = "".concat(SUVtext).concat(Object(_util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_13__["default"])(meanStdDevSUV.mean.toFixed(2))); 22887 var stdDevSuvString = "".concat(SUVtext).concat(Object(_util_numbersWithCommas_js__WEBPACK_IMPORTED_MODULE_13__["default"])(meanStdDevSUV.stdDev.toFixed(2))); 22888 var targetStringLength = Math.floor(context.measureText("".concat(stdDevString, " ")).width); 22889 22890 while (context.measureText(meanString).width < targetStringLength) { 22891 meanString += ' '; 22892 } 22893 22894 otherLines.push("".concat(meanString).concat(meanSuvString)); 22895 otherLines.push("".concat(stdDevString, " ").concat(stdDevSuvString)); 22896 } else { 22897 otherLines.push("".concat(meanString, " ").concat(stdDevString)); 22898 } 22899 22900 if (showMinMax) {
22901 var minString = "Min: ".concat(min).concat(suffix); 22902 var maxString = "Max: ".concat(max).concat(suffix); 22903 22904 var _targetStringLength = hasStandardUptakeValues ? Math.floor(context.measureText("".concat(stdDevString, " ")).width) : Math.floor(context.measureText("".concat(meanString, " ")).width); 22905 22906 while (context.measureText(minString).width < _targetStringLength) { 22907 minString += ' '; 22908 } 22909 22910 otherLines.push("".concat(minString).concat(maxString)); 22911 } 22912 } 22913 22914 textLines.push(_formatArea(area, hasPixelSpacing)); 22915 otherLines.forEach(function (x) { 22916 return textLines.push(x); 22917 }); 22918 return textLines; 22919} 22920 22921/***/ }), 22922
22923/***/ "./tools/annotation/TextMarkerTool.js": 22924/*!********************************************!*\ 22925 !*** ./tools/annotation/TextMarkerTool.js ***! 22926 \********************************************/ 22927/*! exports provided: default */ 22928/***/ (function(module, __webpack_exports__, __webpack_require__) { 22929 22930"use strict"; 22931__webpack_require__.r(__webpack_exports__); 22932/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return TextMarkerTool; }); 22933/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js"); 22934/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); 22935/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js"); 22936/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); 22937/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js"); 22938/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); 22939/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js"); 22940/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); 22941/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/assertThisInitialized */ "../node_modules/@babel/runtime/helpers/assertThisInitialized.js"); 22942/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__); 22943/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js"); 22944/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__); 22945/* harmony import */ var _base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../base/BaseAnnotationTool.js */ "./tools/base/BaseAnnotationTool.js"); 22946/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./../../externalModules.js */ "./externalModules.js"); 22947/* harmony import */ var _util_pointInsideBoundingBox_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./../../util/pointInsideBoundingBox.js */ "./util/pointInsideBoundingBox.js"); 22948/* harmony import */ var _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./../../stateManagement/toolColors.js */ "./stateManagement/toolColors.js"); 22949/* harmony import */ var _drawing_index_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./../../drawing/index.js */ "./drawing/index.js"); 22950/* harmony import */ var _drawing_drawTextBox_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./../../drawing/drawTextBox.js */ "./drawing/drawTextBox.js"); 22951/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./../../stateManagement/toolState.js */ "./stateManagement/toolState.js"); 22952/* harmony import */ var _cursors_index_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../cursors/index.js */ "./tools/cursors/index.js"); 22953 22954 22955 22956 22957 22958 22959 22960 22961 22962 22963 22964 22965 22966 22967/** 22968 * @public 22969 * @class TextMarkerTool 22970 * @memberof Tools.Annotation 22971 * 22972 * @classdesc Tool for annotating an image with text markers. 22973 * @extends Tools.Base.BaseAnnotationTool 22974 */ 22975 22976var TextMarkerTool = 22977/*#__PURE__*/ 22978function (_BaseAnnotationTool) { 22979 _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(TextMarkerTool, _BaseAnnotationTool); 22980 22981 function TextMarkerTool() { 22982 var _this; 22983 22984 var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 22985 22986 _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, TextMarkerTool); 22987 22988 var defaultProps = { 22989 name: 'TextMarker', 22990 supportedInteractionTypes: ['Mouse', 'Touch'], 22991 configuration: { 22992 markers: [], 22993 current: '', 22994 ascending: true, 22995 loop: false, 22996 changeTextCallback: changeTextCallback 22997 }, 22998 svgCursor: _cursors_index_js__WEBPACK_IMPORTED_MODULE_13__["textMarkerCursor"] 22999 }; 23000 _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(TextMarkerTool).call(this, props, defaultProps)); 23001 _this.touchPressCallback = _this._changeText.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this)); 23002 _this.doubleClickCallback = _this._changeText.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this)); 23003 return _this; 23004 } 23005 23006 _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(TextMarkerTool, [{ 23007 key: "createNewMeasurement", 23008 value: function createNewMeasurement(eventData) { 23009 var config = this.configuration; 23010 23011 if (!config.current) { 23012 return; 23013 } // Create the measurement data for this tool with the end handle activated 23014 23015 23016 var measurementData = { 23017 visible: true, 23018 active: true, 23019 text: config.current, 23020 color: undefined, 23021 handles: { 23022 end: { 23023 x: eventData.currentPoints.image.x, 23024 y: eventData.currentPoints.image.y, 23025 highlight: true, 23026 active: true, 23027 hasBoundingBox: true 23028 } 23029 } 23030 }; // Create a rectangle representing the image 23031 23032 var imageRect = { 23033 left: 0, 23034 top: 0, 23035 width: eventData.image.width, 23036 height: eventData.image.height 23037 }; // Check if the current handle is outside the image, 23038 // If it is, prevent the handle creation 23039 23040 if (!_externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstoneMath.point.insideRect(measurementData.handles.end, imageRect)) { 23041 return; 23042 } // Update the current marker for the next marker 23043 23044 23045 var currentIndex = config.markers.indexOf(config.current); 23046 var increment = config.ascending ? 1 : -1; 23047 currentIndex += increment; 23048 23049 if (currentIndex >= config.markers.length) { 23050 currentIndex = config.loop ? 0 : -1; 23051 } else if (currentIndex < 0) { 23052 currentIndex = config.loop ? config.markers.length : -1; 23053 } 23054 23055 config.current = config.markers[currentIndex]; 23056 return measurementData; 23057 } 23058 }, { 23059 key: "pointNearTool", 23060 value: function pointNearTool(element, data, coords) { 23061 if (data.visible === false) { 23062 return false;
23063 } 23064 23065 if (!data.handles.end.boundingBox) { 23066 return; 23067 } 23068 23069 var distanceToPoint = _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstoneMath.rect.distanceToPoint(data.handles.end.boundingBox, coords); 23070 var insideBoundingBox = Object(_util_pointInsideBoundingBox_js__WEBPACK_IMPORTED_MODULE_8__["default"])(data.handles.end, coords); 23071 return distanceToPoint < 10 || insideBoundingBox; 23072 } 23073 }, { 23074 key: "updateCachedStats", 23075 value: function updateCachedStats(image, element, data) {// No stats calculation for this tool 23076 } 23077 }, { 23078 key: "renderToolData", 23079 value: function renderToolData(evt) { 23080 var eventData = evt.detail; 23081 var config = this.configuration; // If we have no toolData for this element, return immediately as there is nothing to do 23082 23083 var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_12__["getToolState"])(eventData.element, this.name); 23084 23085 if (!toolData) { 23086 return; 23087 } // We have tool data for this element - iterate over each one and draw it 23088 23089 23090 var context = Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["getNewContext"])(eventData.canvasContext.canvas); 23091 23092 var _loop = function _loop(i) { 23093 var data = toolData.data[i]; 23094 23095 if (data.visible === false) { 23096 return "continue"; 23097 } 23098 23099 var color = _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_9__["default"].getColorIfActive(data); 23100 Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["draw"])(context, function (context) { 23101 Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_10__["setShadow"])(context, config); 23102 var textCoords = _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.pixelToCanvas(eventData.element, data.handles.end); 23103 var options = { 23104 centering: { 23105 x: true, 23106 y: true 23107 } 23108 }; 23109 data.handles.end.boundingBox = Object(_drawing_drawTextBox_js__WEBPACK_IMPORTED_MODULE_11__["default"])(context, data.text, textCoords.x, textCoords.y - 10, color, options); 23110 }); 23111 }; 23112 23113 for (var i = 0; i < toolData.data.length; i++) { 23114 var _ret = _loop(i); 23115 23116 if (_ret === "continue") continue; 23117 } 23118 } 23119 }, { 23120 key: "_changeText", 23121 value: function _changeText(evt) { 23122 var eventData = evt.detail; 23123 var element = eventData.element, 23124 currentPoints = eventData.currentPoints; 23125 var data; 23126 23127 function doneChangingTextCallback(data, updatedText, deleteTool) { 23128 if (deleteTool === true) { 23129 Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_12__["removeToolState"])(element, this.name, data); 23130 } else { 23131 data.text = updatedText; 23132 } 23133 23134 data.active = false; 23135 _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(element); 23136 } 23137 23138 var config = this.configuration; 23139 var coords = currentPoints.canvas; 23140 var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_12__["getToolState"])(element, this.name); // Now check to see if there is a handle we can move 23141 23142 if (!toolData) { 23143 return; 23144 } 23145 23146 for (var i = 0; i < toolData.data.length; i++) { 23147 data = toolData.data[i]; 23148 23149 if (this.pointNearTool(element, data, coords)) { 23150 data.active = true; 23151 _externalModules_js__WEBPACK_IMPORTED_MODULE_7__["default"].cornerstone.updateImage(element); // Allow relabelling via a callback 23152 23153 config.changeTextCallback(data, eventData, doneChangingTextCallback); 23154 evt.stopImmediatePropagation(); 23155 evt.preventDefault(); 23156 evt.stopPropagation(); 23157 return; 23158 } 23159 } 23160 } 23161 }]); 23162 23163 return TextMarkerTool; 23164}(_base_BaseAnnotationTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]); 23165/** 23166 * This function is a callback to be overwriten in order to provide the wanted feature 23167 * modal, overlay, popup or any kind of interaction with the user to be able to update 23168 * the text marker label. 23169 * 23170 * @param {Object} data 23171 * @param {Object} eventData 23172 * @param {doneChangingTextCallback} doneChangingTextCallback 23173 * @returns {void} 23174 */ 23175 23176 23177 23178 23179var changeTextCallback = function changeTextCallback(data, eventData, doneChangingTextCallback) { 23180 // eslint-disable-next-line no-alert 23181 doneChangingTextCallback(data, prompt('Change your annotation:')); 23182}; 23183/** 23184 * @callback doneChangingTextCallback 23185 * @param {Object} data 23186 * @param {string} text - The new text 23187 */ 23188 23189/***/ }), 23190
23191/***/ "./tools/annotation/bidirectionalTool/addNewMeasurement.js": 23192/*!*****************************************************************!*\ 23193 !*** ./tools/annotation/bidirectionalTool/addNewMeasurement.js ***! 23194 \*****************************************************************/ 23195/*! exports provided: default */ 23196/***/ (function(module, __webpack_exports__, __webpack_require__) { 23197 23198"use strict"; 23199__webpack_require__.r(__webpack_exports__); 23200/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../../../externalModules.js */ "./externalModules.js"); 23201/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./../../../events.js */ "./events.js"); 23202/* harmony import */ var _manipulators_index_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./../../../manipulators/index.js */ "./manipulators/index.js"); 23203/* harmony import */ var _manipulators_anyHandlesOutsideImage_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./../../../manipulators/anyHandlesOutsideImage.js */ "./manipulators/anyHandlesOutsideImage.js"); 23204/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./../../../stateManagement/toolState.js */ "./stateManagement/toolState.js"); 23205/* harmony import */ var _util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../../util/triggerEvent.js */ "./util/triggerEvent.js"); 23206/* harmony import */ var _util_getActiveTool__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../../util/getActiveTool */ "./util/getActiveTool.js"); 23207/* harmony import */ var _base_BaseAnnotationTool__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../base/BaseAnnotationTool */ "./tools/base/BaseAnnotationTool.js"); 23208 23209 23210 23211 23212 23213 23214 23215 23216/* harmony default export */ __webpack_exports__["default"] = (function (evt, interactionType) { 23217 var _this = this; 23218 23219 var eventData = evt.detail; 23220 var element = eventData.element, 23221 image = eventData.image, 23222 buttons = eventData.buttons; 23223 var config = this.configuration; 23224 23225 if (checkPixelSpacing(image)) { 23226 return; 23227 } 23228 23229 var measurementData = this.createNewMeasurement(eventData); 23230 23231 var doneCallback = function doneCallback() { 23232 measurementData.active = false; 23233 _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.updateImage(element); 23234 }; // Associate this data with this imageId so we can render it and manipulate it 23235 23236 23237 Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_4__["addToolState"])(element, this.name, measurementData); 23238 _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.updateImage(element); 23239 var timestamp = new Date().getTime(); 23240 var _measurementData$hand = measurementData.handles, 23241 end = _measurementData$hand.end, 23242 perpendicularStart = _measurementData$hand.perpendicularStart; 23243 Object(_manipulators_index_js__WEBPACK_IMPORTED_MODULE_2__["moveNewHandle"])(eventData, this.name, measurementData, end, { 23244 doneMovingCallback: function doneMovingCallback() { 23245 var handles = measurementData.handles, 23246 longestDiameter = measurementData.longestDiameter, 23247 shortestDiameter = measurementData.shortestDiameter; 23248 var hasHandlesOutside = Object(_manipulators_anyHandlesOutsideImage_js__WEBPACK_IMPORTED_MODULE_3__["default"])(eventData, handles); 23249 var longestDiameterSize = parseFloat(longestDiameter) || 0; 23250 var shortestDiameterSize = parseFloat(shortestDiameter) || 0; 23251 var isTooSmal = longestDiameterSize < 1 || shortestDiameterSize < 1; 23252 var isTooFast = new Date().getTime() - timestamp < 150; 23253 23254 if (hasHandlesOutside || isTooSmal || isTooFast) { 23255 // Delete the measurement 23256 measurementData.cancelled = true; 23257 Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_4__["removeToolState"])(element, _this.name, measurementData); 23258 } else { 23259 // Set lesionMeasurementData Session 23260 config.getMeasurementLocationCallback(measurementData, eventData, doneCallback); 23261 } // Perpendicular line is not connected to long-line 23262 23263 23264 perpendicularStart.locked = false;
23265 measurementData.invalidated = true; 23266 _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.updateImage(element); 23267 var activeTool = Object(_util_getActiveTool__WEBPACK_IMPORTED_MODULE_6__["default"])(element, buttons, interactionType); 23268 23269 if (activeTool instanceof _base_BaseAnnotationTool__WEBPACK_IMPORTED_MODULE_7__["default"]) { 23270 activeTool.updateCachedStats(image, element, measurementData); 23271 } 23272 23273 var modifiedEventData = { 23274 toolType: _this.name, 23275 element: element, 23276 measurementData: measurementData 23277 }; 23278 Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_5__["default"])(element, _events_js__WEBPACK_IMPORTED_MODULE_1__["default"].MEASUREMENT_MODIFIED, modifiedEventData); 23279 Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_5__["default"])(element, _events_js__WEBPACK_IMPORTED_MODULE_1__["default"].MEASUREMENT_COMPLETED, modifiedEventData); 23280 } 23281 }, interactionType); 23282}); 23283 23284var checkPixelSpacing = function checkPixelSpacing(image) { 23285 var imagePlane = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.metaData.get('imagePlaneModule', image.imageId); 23286 var rowPixelSpacing = image.rowPixelSpacing; 23287 var colPixelSpacing = image.columnPixelSpacing; 23288 23289 if (imagePlane) { 23290 rowPixelSpacing = imagePlane.rowPixelSpacing || imagePlane.rowImagePixelSpacing; 23291 colPixelSpacing = imagePlane.columnPixelSpacing || imagePlane.colImagePixelSpacing; 23292 } // LT-29 Disable Target Measurements when pixel spacing is not available 23293 23294 23295 return !rowPixelSpacing || !colPixelSpacing; 23296}; 23297 23298/***/ }), 23299
23300/***/ "./tools/annotation/bidirectionalTool/createNewMeasurement.js": 23301/*!********************************************************************!*\ 23302 !*** ./tools/annotation/bidirectionalTool/createNewMeasurement.js ***! 23303 \********************************************************************/ 23304/*! exports provided: default */ 23305/***/ (function(module, __webpack_exports__, __webpack_require__) { 23306 23307"use strict"; 23308__webpack_require__.r(__webpack_exports__); 23309var getHandle = function getHandle(x, y, index) { 23310 var extraAttributes = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; 23311 return Object.assign({ 23312 x: x, 23313 y: y, 23314 index: index, 23315 drawnIndependently: false, 23316 allowedOutsideImage: false, 23317 highlight: true, 23318 active: false 23319 }, extraAttributes); 23320}; 23321 23322/* harmony default export */ __webpack_exports__["default"] = (function (mouseEventData) { 23323 var _mouseEventData$curre = mouseEventData.currentPoints.image, 23324 x = _mouseEventData$curre.x, 23325 y = _mouseEventData$curre.y; // Create the measurement data for this tool with the end handle activated 23326 23327 var measurementData = { 23328 toolType: this.name, 23329 isCreating: true, 23330 visible: true, 23331 active: true, 23332 invalidated: true, 23333 handles: { 23334 start: getHandle(x, y, 0), 23335 end: getHandle(x, y, 1, { 23336 active: true 23337 }), 23338 perpendicularStart: getHandle(x, y, 2, { 23339 locked: true 23340 }), 23341 perpendicularEnd: getHandle(x, y, 3), 23342 textBox: getHandle(x - 50, y - 70, null, { 23343 highlight: false, 23344 hasMoved: true, 23345 active: false, 23346 movesIndependently: false, 23347 drawnIndependently: true, 23348 allowedOutsideImage: true, 23349 hasBoundingBox: true 23350 }) 23351 }, 23352 longestDiameter: 0, 23353 shortestDiameter: 0 23354 }; 23355 return measurementData; 23356}); 23357 23358/***/ }), 23359
23360/***/ "./tools/annotation/bidirectionalTool/handleSelectedCallback.js": 23361/*!**********************************************************************!*\ 23362 !*** ./tools/annotation/bidirectionalTool/handleSelectedCallback.js ***! 23363 \**********************************************************************/ 23364/*! exports provided: default */ 23365/***/ (function(module, __webpack_exports__, __webpack_require__) { 23366 23367"use strict"; 23368__webpack_require__.r(__webpack_exports__); 23369/* harmony default export */ __webpack_exports__["default"] = (function (evt, toolData, handle) { 23370 var interactionType = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'mouse'; 23371 23372 if (interactionType === 'touch') { 23373 this.handleSelectedTouchCallback(evt); 23374 } else { 23375 this.handleSelectedMouseCallback(evt); 23376 } 23377}); 23378 23379/***/ }), 23380
23381/***/ "./tools/annotation/bidirectionalTool/handleSelectedMouseCallback.js": 23382/*!***************************************************************************!*\ 23383 !*** ./tools/annotation/bidirectionalTool/handleSelectedMouseCallback.js ***! 23384 \***************************************************************************/ 23385/*! exports provided: default */ 23386/***/ (function(module, __webpack_exports__, __webpack_require__) { 23387 23388"use strict"; 23389__webpack_require__.r(__webpack_exports__); 23390/* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/typeof */ "../node_modules/@babel/runtime/helpers/typeof.js"); 23391/* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__); 23392/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./../../../externalModules.js */ "./externalModules.js"); 23393/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../store/index.js */ "./store/index.js"); 23394/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./../../../events.js */ "./events.js"); 23395/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./../../../stateManagement/toolState.js */ "./stateManagement/toolState.js"); 23396/* harmony import */ var _manipulators_anyHandlesOutsideImage_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./../../../manipulators/anyHandlesOutsideImage.js */ "./manipulators/anyHandlesOutsideImage.js"); 23397/* harmony import */ var _manipulators_getHandleNearImagePoint_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./../../../manipulators/getHandleNearImagePoint.js */ "./manipulators/getHandleNearImagePoint.js"); 23398/* harmony import */ var _manipulators_index_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./../../../manipulators/index.js */ "./manipulators/index.js"); 23399/* harmony import */ var _moveHandle_moveHandle_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./moveHandle/moveHandle.js */ "./tools/annotation/bidirectionalTool/moveHandle/moveHandle.js"); 23400/* harmony import */ var _invertHandles_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./invertHandles.js */ "./tools/annotation/bidirectionalTool/invertHandles.js"); 23401/* harmony import */ var _store_setToolCursor_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../../store/setToolCursor.js */ "./store/setToolCursor.js"); 23402 23403 23404/* jshint -W083 */ 23405 23406 23407 23408 23409 23410 23411 23412 23413 23414 23415/* harmony default export */ __webpack_exports__["default"] = (function (evt) { 23416 var _this = this; 23417 23418 var eventData = evt.detail; 23419 var element = eventData.element; 23420 var data; 23421 var distanceThreshold = _store_index_js__WEBPACK_IMPORTED_MODULE_2__["state"].clickProximity; 23422 23423 var handleDoneMove = function handleDoneMove(handle) { 23424 data.invalidated = true; 23425 23426 if (Object(_manipulators_anyHandlesOutsideImage_js__WEBPACK_IMPORTED_MODULE_5__["default"])(eventData, data.handles)) { 23427 // Delete the measurement 23428 Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_4__["removeToolState"])(element, _this.name, data); 23429 } // Update the handles to keep selected state 23430 23431 23432 if (handle) { 23433 handle.moving = false; 23434 handle.selected = true; 23435 } 23436 23437 Object(_store_setToolCursor_js__WEBPACK_IMPORTED_MODULE_10__["setToolCursor"])(_this.element, _this.svgCursor); 23438 _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.updateImage(element); 23439 element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_3__["default"].MOUSE_MOVE, _this._moveCallback); 23440 element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_3__["default"].TOUCH_START, _this._moveCallback); 23441 }; 23442 23443 var coords = eventData.startPoints.canvas; 23444 var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_4__["getToolState"])(evt.currentTarget, this.name); 23445 23446 if (!toolData) { 23447 return; 23448 } // Now check to see if there is a handle we can move 23449 23450 23451 var _loop = function _loop(i) { 23452 data = toolData.data[i]; 23453 var handleParams = [element, data.handles, coords, distanceThreshold]; 23454 var handle = _manipulators_getHandleNearImagePoint_js__WEBPACK_IMPORTED_MODULE_6__["default"].apply(void 0, handleParams); 23455 23456 if (handle) { 23457 element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_3__["default"].MOUSE_MOVE, _this._moveCallback); 23458 element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_3__["default"].TOUCH_START, _this._moveCallback); 23459 data.active = true; 23460 unselectAllHandles(data.handles); 23461 handle.moving = true; // Invert handles if needed 23462 23463 handle = Object(_invertHandles_js__WEBPACK_IMPORTED_MODULE_9__["default"])(eventData, data, handle); 23464 /* Hide the cursor to improve precision while resizing the line or set to move 23465 if dragging text box 23466 */ 23467 23468 if (!handle.hasBoundingBox) { 23469 Object(_store_setToolCursor_js__WEBPACK_IMPORTED_MODULE_10__["hideToolCursor"])(_this.element); 23470 } 23471 23472 Object(_moveHandle_moveHandle_js__WEBPACK_IMPORTED_MODULE_8__["default"])(eventData, _this.name, data, handle, function () { 23473 return handleDoneMove(handle); 23474 }); 23475 preventPropagation(evt); 23476 return { 23477 v: true 23478 }; 23479 } 23480 }; 23481 23482 for (var i = 0; i < toolData.data.length; i++) { 23483 var _ret = _loop(i); 23484 23485 if (_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default()(_ret) === "object") return _ret.v; 23486 } 23487 23488 var getDoneMovingCallback = function getDoneMovingCallback(handles) { 23489 return function () { 23490 setHandlesMovingState(handles, false); 23491 handleDoneMove(); 23492 }; 23493 }; 23494 23495 for (var i = 0; i < toolData.data.length; i++) { 23496 data = toolData.data[i]; 23497 23498 if (this.pointNearTool(element, data, coords, 'mouse')) { 23499 element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_3__["default"].MOUSE_MOVE, this._moveCallback); 23500 element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_3__["default"].TOUCH_START, this._moveCallback); 23501 data.active = true; 23502 unselectAllHandles(data.handles); 23503 setHandlesMovingState(data.handles, true); 23504 var doneMovingCallback = getDoneMovingCallback(data.handles); 23505 Object(_manipulators_index_js__WEBPACK_IMPORTED_MODULE_7__["moveAllHandles"])(eventData, this.name, data, null, { 23506 deleteIfHandleOutsideImage: true, 23507 preventHandleOutsideImage: false, 23508 doneMovingCallback: doneMovingCallback 23509 }, 'mouse'); 23510 preventPropagation(evt); 23511 return true; 23512 } 23513 } 23514}); // Clear the selected state for the given handles object 23515 23516var unselectAllHandles = function unselectAllHandles(handles) { 23517 var imageNeedsUpdate = false;
23518 Object.keys(handles).forEach(function (handleKey) { 23519 if (handleKey === 'textBox') { 23520 return; 23521 } 23522 23523 handles[handleKey].selected = false; 23524 imageNeedsUpdate = handles[handleKey].active || imageNeedsUpdate; 23525 handles[handleKey].active = false; 23526 }); 23527 return imageNeedsUpdate; 23528}; 23529 23530var setHandlesMovingState = function setHandlesMovingState(handles, state) { 23531 Object.keys(handles).forEach(function (handleKey) { 23532 if (handleKey === 'textBox') { 23533 return; 23534 } 23535 23536 handles[handleKey].moving = state; 23537 }); 23538}; 23539 23540var preventPropagation = function preventPropagation(evt) { 23541 evt.stopImmediatePropagation(); 23542 evt.stopPropagation(); 23543 evt.preventDefault(); 23544}; 23545 23546/***/ }), 23547
23548/***/ "./tools/annotation/bidirectionalTool/handleSelectedTouchCallback.js": 23549/*!***************************************************************************!*\ 23550 !*** ./tools/annotation/bidirectionalTool/handleSelectedTouchCallback.js ***! 23551 \***************************************************************************/ 23552/*! exports provided: default */ 23553/***/ (function(module, __webpack_exports__, __webpack_require__) { 23554 23555"use strict"; 23556__webpack_require__.r(__webpack_exports__); 23557/* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/typeof */ "../node_modules/@babel/runtime/helpers/typeof.js"); 23558/* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__); 23559/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./../../../externalModules.js */ "./externalModules.js"); 23560/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../../store/index.js */ "./store/index.js"); 23561/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./../../../events.js */ "./events.js"); 23562/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./../../../stateManagement/toolState.js */ "./stateManagement/toolState.js"); 23563/* harmony import */ var _manipulators_anyHandlesOutsideImage_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./../../../manipulators/anyHandlesOutsideImage.js */ "./manipulators/anyHandlesOutsideImage.js"); 23564/* harmony import */ var _manipulators_getHandleNearImagePoint_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./../../../manipulators/getHandleNearImagePoint.js */ "./manipulators/getHandleNearImagePoint.js"); 23565/* harmony import */ var _manipulators_index_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./../../../manipulators/index.js */ "./manipulators/index.js"); 23566/* harmony import */ var _moveHandle_touchMoveHandle_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./moveHandle/touchMoveHandle.js */ "./tools/annotation/bidirectionalTool/moveHandle/touchMoveHandle.js"); 23567 23568 23569/* jshint -W083 */ 23570 23571 23572 23573 23574 23575 23576 23577 23578/* harmony default export */ __webpack_exports__["default"] = (function (evt) { 23579 var _this = this; 23580 23581 var eventData = evt.detail; 23582 var element = eventData.element; 23583 var data; 23584 var distanceThreshold = _store_index_js__WEBPACK_IMPORTED_MODULE_2__["state"].touchProximity; 23585 23586 var handleDoneMove = function handleDoneMove(handle) { 23587 data.invalidated = true; 23588 23589 if (Object(_manipulators_anyHandlesOutsideImage_js__WEBPACK_IMPORTED_MODULE_5__["default"])(eventData, data.handles)) { 23590 // Delete the measurement 23591 Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_4__["removeToolState"])(element, _this.name, data); 23592 } // Update the handles to keep selected state 23593 23594 23595 if (handle) { 23596 handle.moving = false; 23597 handle.selected = true; 23598 } 23599 23600 _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone.updateImage(element); 23601 element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_3__["default"].TOUCH_DRAG, _this._moveCallback); 23602 }; 23603 23604 var coords = eventData.startPoints.canvas; 23605 var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_4__["getToolState"])(evt.currentTarget, this.name); 23606 23607 if (!toolData) { 23608 return; 23609 } // Now check to see if there is a handle we can move 23610 23611 23612 var _loop = function _loop(i) { 23613 data = toolData.data[i]; 23614 var handleParams = [element, data.handles, coords, distanceThreshold]; 23615 var handle = _manipulators_getHandleNearImagePoint_js__WEBPACK_IMPORTED_MODULE_6__["default"].apply(void 0, handleParams); 23616 23617 if (handle) { 23618 element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_3__["default"].TOUCH_DRAG, _this._moveCallback); 23619 data.active = true; 23620 unselectAllHandles(data.handles); 23621 handle.moving = true; 23622 Object(_moveHandle_touchMoveHandle_js__WEBPACK_IMPORTED_MODULE_8__["default"])(eventData, _this.name, data, handle, function () { 23623 return handleDoneMove(handle); 23624 }); 23625 preventPropagation(evt); 23626 return { 23627 v: true 23628 }; 23629 } 23630 }; 23631 23632 for (var i = 0; i < toolData.data.length; i++) { 23633 var _ret = _loop(i); 23634 23635 if (_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default()(_ret) === "object") return _ret.v; 23636 } 23637 23638 var getDoneMovingCallback = function getDoneMovingCallback(handles) { 23639 return function () { 23640 setHandlesMovingState(handles, false); 23641 handleDoneMove(); 23642 }; 23643 }; 23644 23645 for (var i = 0; i < toolData.data.length; i++) { 23646 data = toolData.data[i]; 23647 23648 if (this.pointNearTool(element, data, coords, 'touch')) { 23649 element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_3__["default"].TOUCH_DRAG, this._moveCallback); 23650 data.active = true; 23651 unselectAllHandles(data.handles); 23652 setHandlesMovingState(data.handles, true); 23653 var doneMovingCallback = getDoneMovingCallback(data.handles); 23654 Object(_manipulators_index_js__WEBPACK_IMPORTED_MODULE_7__["moveAllHandles"])(eventData, this.name, data, null, { 23655 deleteIfHandleOutsideImage: true, 23656 preventHandleOutsideImage: false, 23657 doneMovingCallback: doneMovingCallback 23658 }, 'touch'); 23659 preventPropagation(evt); 23660 return true; 23661 } 23662 } 23663}); // Clear the selected state for the given handles object 23664 23665var unselectAllHandles = function unselectAllHandles(handles) { 23666 var imageNeedsUpdate = false;
23667 Object.keys(handles).forEach(function (handleKey) { 23668 if (handleKey === 'textBox') { 23669 return; 23670 } 23671 23672 handles[handleKey].selected = false; 23673 imageNeedsUpdate = handles[handleKey].active || imageNeedsUpdate; 23674 handles[handleKey].active = false; 23675 }); 23676 return imageNeedsUpdate; 23677}; 23678 23679var setHandlesMovingState = function setHandlesMovingState(handles, state) { 23680 Object.keys(handles).forEach(function (handleKey) { 23681 if (handleKey === 'textBox') { 23682 return; 23683 } 23684 23685 handles[handleKey].moving = state; 23686 }); 23687}; 23688 23689var preventPropagation = function preventPropagation(evt) { 23690 evt.stopImmediatePropagation(); 23691 evt.stopPropagation(); 23692 evt.preventDefault(); 23693}; 23694 23695/***/ }), 23696
23697/***/ "./tools/annotation/bidirectionalTool/invertHandles.js": 23698/*!*************************************************************!*\ 23699 !*** ./tools/annotation/bidirectionalTool/invertHandles.js ***! 23700 \*************************************************************/ 23701/*! exports provided: default */ 23702/***/ (function(module, __webpack_exports__, __webpack_require__) { 23703 23704"use strict"; 23705__webpack_require__.r(__webpack_exports__); 23706/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return invertHandles; }); 23707var swapAttribute = function swapAttribute(a, b, attribute) { 23708 var originalA = a[attribute]; 23709 var originalB = b[attribute]; 23710 a[attribute] = originalB; 23711 b[attribute] = originalA; 23712}; 23713 23714var swapHandles = function swapHandles(a, b) { 23715 swapAttribute(a, b, 'x'); 23716 swapAttribute(a, b, 'y'); 23717 swapAttribute(a, b, 'moving'); 23718 swapAttribute(a, b, 'hover'); 23719 swapAttribute(a, b, 'active'); 23720 swapAttribute(a, b, 'selected'); 23721}; 23722 23723function invertHandles(eventData, measurementData, handle) { 23724 var _eventData$image = eventData.image, 23725 rowPixelSpacing = _eventData$image.rowPixelSpacing, 23726 columnPixelSpacing = _eventData$image.columnPixelSpacing; 23727 var handles = measurementData.handles; 23728 var start = handles.start, 23729 end = handles.end, 23730 perpendicularStart = handles.perpendicularStart, 23731 perpendicularEnd = handles.perpendicularEnd; // Calculate the long axis length 23732 23733 var dx = (start.x - end.x) * (columnPixelSpacing || 1); 23734 var dy = (start.y - end.y) * (rowPixelSpacing || 1); 23735 var length = Math.sqrt(dx * dx + dy * dy); // Calculate the short axis length 23736 23737 var wx = (perpendicularStart.x - perpendicularEnd.x) * (columnPixelSpacing || 1); 23738 var wy = (perpendicularStart.y - perpendicularEnd.y) * (rowPixelSpacing || 1); 23739 var width = Math.sqrt(wx * wx + wy * wy) || 0; 23740 23741 if (width > length) { 23742 swapHandles(start, end); 23743 swapHandles(start, perpendicularStart); 23744 swapHandles(end, perpendicularEnd); 23745 return Object.values(handles).find(function (h) { 23746 return h.moving === true; 23747 }); 23748 } 23749 23750 return handle; 23751}
vendor: 22 bytes, lines 23751-23755
23751 23752 23753/***/ }), 23754 23755/***/ "./
23755tools/annotation/bidirectionalTool/mouseMoveCallback.js": 23756/*!*****************************************************************!*\ 23757 !*** ./tools/annotation/bidirectionalTool/mouseMoveCallback.js ***! 23758 \*****************************************************************/ 23759/*! exports provided: default */ 23760/***/ (function(module, __webpack_exports__, __webpack_require__) { 23761 23762"use strict"; 23763__webpack_require__.r(__webpack_exports__); 23764/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../../../externalModules.js */ "./externalModules.js"); 23765/* harmony import */ var _stateManagement_toolCoordinates_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./../../../stateManagement/toolCoordinates.js */ "./stateManagement/toolCoordinates.js"); 23766/* harmony import */ var _manipulators_getHandleNearImagePoint_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./../../../manipulators/getHandleNearImagePoint.js */ "./manipulators/getHandleNearImagePoint.js"); 23767/* harmony
23767import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./../../../stateManagement/toolState.js */ "./stateManagement/toolState.js"); 23768 23769 23770 23771 // Replaces the cornerstoneTools.handleActivator function by skiping the active handle comparison 23772 23773var handleActivator = function handleActivator(element, handles, canvasPoint) { 23774 var distanceThreshold = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 6; 23775 var nearbyHandle = Object(_manipulators_getHandleNearImagePoint_js__WEBPACK_IMPORTED_MODULE_2__["default"])(element, handles, canvasPoint, distanceThreshold); 23776 var handleActivatorChanged = false; 23777 Object.keys(handles).forEach(function (handleKey) { 23778 if (handleKey === 'textBox') { 23779 return; 23780 } 23781 23782 var handle = handles[handleKey]; 23783 var newActiveState = handle === nearbyHandle; 23784 23785 if (handle.active !== newActiveState) { 23786 handleActivatorChanged = true; 23787 } 23788 23789 handle.active = newActiveState; 23790 }); 23791 return handleActivatorChanged; 23792}; // MouseMoveCallback is used to hide handles when mouse is away 23793 23794 23795/* harmony default export */ __webpack_exports__["default"] = (function (event) { 23796 var _this = this; 23797 23798 var eventData = event.detail; 23799 var element = eventData.element; 23800 _stateManagement_toolCoordinates_js__WEBPACK_IMPORTED_MODULE_1__["default"].setCoords(eventData); // If we have no tool data for this element, do nothing 23801 23802 var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_3__["getToolState"])(element, this.name); 23803 23804 if (!toolData) { 23805 return; 23806 } // We have tool data, search through all data and see if we can activate a handle 23807 23808 23809 var imageNeedsUpdate = false; 23810 23811 var _loop = function _loop(i) { 23812 // Get the cursor position in canvas coordinates 23813 var coords = eventData.currentPoints.canvas; 23814 var data = toolData.data[i]; 23815 var handleActivatorChanged = handleActivator(element, data.handles, coords); 23816 Object.keys(data.handles).forEach(function (handleKey) { 23817 if (handleKey === 'textBox') { 23818 return; 23819 } 23820 23821 var handle = data.handles[handleKey]; 23822 handle.hover = handle.active; 23823 }); 23824 23825 if (handleActivatorChanged) { 23826 imageNeedsUpdate = true; 23827 } 23828 23829 var nearTool = _this.pointNearTool(element, data, coords, 'mouse'); 23830 23831 var nearToolAndInactive = nearTool && !data.active; 23832 var notNearToolAndActive = !nearTool && data.active; 23833 23834 if (nearToolAndInactive || notNearToolAndActive) { 23835 data.active = !data.active; 23836 imageNeedsUpdate = true; 23837 } 23838 }; 23839 23840 for (var i = 0; i < toolData.data.length; i++) { 23841 _loop(i); 23842 } // Handle activation status changed, redraw the image 23843 23844 23845 if (imageNeedsUpdate === true) { 23846 _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.updateImage(element); 23847 } 23848}); 23849 23850/***/ }), 23851
23852/***/ "./tools/annotation/bidirectionalTool/moveHandle/moveHandle.js": 23853/*!*********************************************************************!*\ 23854 !*** ./tools/annotation/bidirectionalTool/moveHandle/moveHandle.js ***! 23855 \*********************************************************************/ 23856/*! exports provided: default */ 23857/***/ (function(module, __webpack_exports__, __webpack_require__) { 23858 23859"use strict"; 23860__webpack_require__.r(__webpack_exports__); 23861/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../../../../externalModules.js */ "./externalModules.js"); 23862/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../store/index.js */ "./store/index.js"); 23863/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./../../../../events.js */ "./events.js"); 23864/* harmony import */ var _setHandlesPosition_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./setHandlesPosition.js */ "./tools/annotation/bidirectionalTool/moveHandle/setHandlesPosition.js"); 23865/* harmony import */ var _util_getActiveTool__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../../util/getActiveTool */ "./util/getActiveTool.js"); 23866/* harmony import */ var _base_BaseAnnotationTool__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../../base/BaseAnnotationTool */ "./tools/base/BaseAnnotationTool.js"); 23867 23868 23869 23870 23871 23872 23873/* harmony default export */ __webpack_exports__["default"] = (function (mouseEventData, toolType, data, handle, doneMovingCallback, preventHandleOutsideImage) { 23874 var element = mouseEventData.element, 23875 image = mouseEventData.image, 23876 buttons = mouseEventData.buttons; 23877 var distanceFromTool = { 23878 x: handle.x - mouseEventData.currentPoints.image.x, 23879 y: handle.y - mouseEventData.currentPoints.image.y 23880 }; 23881 23882 var _dragCallback = function _dragCallback(event) { 23883 var eventData = event.detail; 23884 handle.hasMoved = true; 23885 23886 if (handle.index === undefined || handle.index === null) { 23887 handle.x = eventData.currentPoints.image.x + distanceFromTool.x; 23888 handle.y = eventData.currentPoints.image.y + distanceFromTool.y; 23889 } else { 23890 Object(_setHandlesPosition_js__WEBPACK_IMPORTED_MODULE_3__["default"])(handle, eventData, data, distanceFromTool); 23891 } 23892 23893 if (preventHandleOutsideImage) { 23894 handle.x = Math.max(handle.x, 0); 23895 handle.x = Math.min(handle.x, eventData.image.width); 23896 handle.y = Math.max(handle.y, 0); 23897 handle.y = Math.min(handle.y, eventData.image.height); 23898 } 23899 23900 data.invalidated = true; 23901 _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.updateImage(element); 23902 var activeTool = Object(_util_getActiveTool__WEBPACK_IMPORTED_MODULE_4__["default"])(element, buttons, 'mouse'); 23903 23904 if (activeTool instanceof _base_BaseAnnotationTool__WEBPACK_IMPORTED_MODULE_5__["default"]) { 23905 activeTool.updateCachedStats(image, element, data); 23906 } 23907 23908 var modifiedEventData = { 23909 toolType: toolType, 23910 element: element, 23911 measurementData: data 23912 }; 23913 _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.triggerEvent(element, _events_js__WEBPACK_IMPORTED_MODULE_2__["default"].MEASUREMENT_MODIFIED, modifiedEventData); 23914 }; 23915 23916 handle.active = true; 23917 _store_index_js__WEBPACK_IMPORTED_MODULE_1__["state"].isToolLocked = true; 23918 element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_2__["default"].MOUSE_DRAG, _dragCallback); 23919 element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_2__["default"].TOUCH_DRAG, _dragCallback); 23920 var currentImage = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.getImage(element); 23921 23922 var imageRenderedHandler = function imageRenderedHandler() { 23923 var newImage = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.getImage(element); // Check if the rendered image changed during measurement modifying and stop it if so 23924 23925 if (newImage.imageId !== currentImage.imageId) { 23926 interactionEndCallback(); 23927 } 23928 }; // Bind the event listener for image rendering 23929 23930 23931 element.addEventListener(_externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.EVENTS.IMAGE_RENDERED, imageRenderedHandler); 23932 23933 var interactionEndCallback = function interactionEndCallback() { 23934 handle.active = false;
23935 _store_index_js__WEBPACK_IMPORTED_MODULE_1__["state"].isToolLocked = false; 23936 element.removeEventListener(_externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.EVENTS.IMAGE_RENDERED, imageRenderedHandler); 23937 element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_2__["default"].MOUSE_DRAG, _dragCallback); 23938 element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_2__["default"].MOUSE_UP, interactionEndCallback); 23939 element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_2__["default"].MOUSE_CLICK, interactionEndCallback); 23940 element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_2__["default"].TOUCH_DRAG, _dragCallback); 23941 element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_2__["default"].TOUCH_DRAG_END, interactionEndCallback); 23942 element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_2__["default"].TAP, interactionEndCallback); 23943 _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.updateImage(element); 23944 23945 if (typeof doneMovingCallback === 'function') { 23946 doneMovingCallback(); 23947 } 23948 }; 23949 23950 element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_2__["default"].MOUSE_UP, interactionEndCallback); 23951 element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_2__["default"].MOUSE_CLICK, interactionEndCallback); 23952 element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_2__["default"].TOUCH_DRAG_END, interactionEndCallback); 23953 element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_2__["default"].TAP, interactionEndCallback); 23954}); 23955 23956/***/ }), 23957
23958/***/ "./tools/annotation/bidirectionalTool/moveHandle/perpendicularBothFixedLeft.js": 23959/*!*************************************************************************************!*\ 23960 !*** ./tools/annotation/bidirectionalTool/moveHandle/perpendicularBothFixedLeft.js ***! 23961 \*************************************************************************************/ 23962/*! exports provided: default */ 23963/***/ (function(module, __webpack_exports__, __webpack_require__) { 23964 23965"use strict"; 23966__webpack_require__.r(__webpack_exports__); 23967/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../../../../externalModules.js */ "./externalModules.js"); 23968 // Move long-axis start point 23969 23970/* harmony default export */ __webpack_exports__["default"] = (function (proposedPoint, data) { 23971 var distance = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.point.distance; 23972 var _data$handles = data.handles, 23973 start = _data$handles.start, 23974 end = _data$handles.end, 23975 perpendicularStart = _data$handles.perpendicularStart, 23976 perpendicularEnd = _data$handles.perpendicularEnd; 23977 var longLine = { 23978 start: { 23979 x: start.x, 23980 y: start.y 23981 }, 23982 end: { 23983 x: end.x, 23984 y: end.y 23985 } 23986 }; 23987 var perpendicularLine = { 23988 start: { 23989 x: perpendicularStart.x, 23990 y: perpendicularStart.y 23991 }, 23992 end: { 23993 x: perpendicularEnd.x, 23994 y: perpendicularEnd.y 23995 } 23996 }; 23997 var intersection = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.lineSegment.intersectLine(longLine, perpendicularLine); 23998 var distanceFromPerpendicularP1 = distance(perpendicularStart, intersection); 23999 var distanceFromPerpendicularP2 = distance(perpendicularEnd, intersection); 24000 var distanceToLineP2 = distance(end, intersection); 24001 var newLineLength = distance(end, proposedPoint); 24002 24003 if (newLineLength <= distanceToLineP2) { 24004 return false; 24005 } 24006 24007 var dx = (end.x - proposedPoint.x) / newLineLength; 24008 var dy = (end.y - proposedPoint.y) / newLineLength; 24009 var k = distanceToLineP2 / newLineLength; 24010 var newIntersection = { 24011 x: end.x + (proposedPoint.x - end.x) * k, 24012 y: end.y + (proposedPoint.y - end.y) * k 24013 }; 24014 perpendicularStart.x = newIntersection.x - distanceFromPerpendicularP1 * dy; 24015 perpendicularStart.y = newIntersection.y + distanceFromPerpendicularP1 * dx; 24016 perpendicularEnd.x = newIntersection.x + distanceFromPerpendicularP2 * dy; 24017 perpendicularEnd.y = newIntersection.y - distanceFromPerpendicularP2 * dx; 24018 return true; 24019}); 24020 24021/***/ }), 24022
24023/***/ "./tools/annotation/bidirectionalTool/moveHandle/perpendicularBothFixedRight.js": 24024/*!**************************************************************************************!*\ 24025 !*** ./tools/annotation/bidirectionalTool/moveHandle/perpendicularBothFixedRight.js ***! 24026 \**************************************************************************************/ 24027/*! exports provided: default */ 24028/***/ (function(module, __webpack_exports__, __webpack_require__) { 24029 24030"use strict"; 24031__webpack_require__.r(__webpack_exports__); 24032/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../../../../externalModules.js */ "./externalModules.js"); 24033 // Move long-axis end point 24034 24035/* harmony default export */ __webpack_exports__["default"] = (function (proposedPoint, data) { 24036 var distance = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.point.distance; 24037 var _data$handles = data.handles, 24038 start = _data$handles.start, 24039 end = _data$handles.end, 24040 perpendicularStart = _data$handles.perpendicularStart, 24041 perpendicularEnd = _data$handles.perpendicularEnd; 24042 var longLine = { 24043 start: { 24044 x: start.x, 24045 y: start.y 24046 }, 24047 end: { 24048 x: end.x, 24049 y: end.y 24050 } 24051 }; 24052 var perpendicularLine = { 24053 start: { 24054 x: perpendicularStart.x, 24055 y: perpendicularStart.y 24056 }, 24057 end: { 24058 x: perpendicularEnd.x, 24059 y: perpendicularEnd.y 24060 } 24061 }; 24062 var intersection = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.lineSegment.intersectLine(longLine, perpendicularLine); 24063 var distanceFromPerpendicularP1 = distance(perpendicularStart, intersection); 24064 var distanceFromPerpendicularP2 = distance(perpendicularEnd, intersection); 24065 var distanceToLineP2 = distance(start, intersection); 24066 var newLineLength = distance(start, proposedPoint); 24067 24068 if (newLineLength <= distanceToLineP2) { 24069 return false; 24070 } 24071 24072 var dx = (start.x - proposedPoint.x) / newLineLength; 24073 var dy = (start.y - proposedPoint.y) / newLineLength; 24074 var k = distanceToLineP2 / newLineLength; 24075 var newIntersection = { 24076 x: start.x + (proposedPoint.x - start.x) * k, 24077 y: start.y + (proposedPoint.y - start.y) * k 24078 }; 24079 perpendicularStart.x = newIntersection.x + distanceFromPerpendicularP1 * dy; 24080 perpendicularStart.y = newIntersection.y - distanceFromPerpendicularP1 * dx; 24081 perpendicularEnd.x = newIntersection.x - distanceFromPerpendicularP2 * dy; 24082 perpendicularEnd.y = newIntersection.y + distanceFromPerpendicularP2 * dx; 24083 return true; 24084}); 24085 24086/***/ }), 24087
24088/***/ "./tools/annotation/bidirectionalTool/moveHandle/perpendicularLeftFixedPoint.js": 24089/*!**************************************************************************************!*\ 24090 !*** ./tools/annotation/bidirectionalTool/moveHandle/perpendicularLeftFixedPoint.js ***! 24091 \**************************************************************************************/ 24092/*! exports provided: default */ 24093/***/ (function(module, __webpack_exports__, __webpack_require__) { 24094 24095"use strict"; 24096__webpack_require__.r(__webpack_exports__); 24097/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../../../../externalModules.js */ "./externalModules.js"); 24098 // Move perpendicular line start point 24099 24100/* harmony default export */ __webpack_exports__["default"] = (function (movedPoint, data) { 24101 var distance = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.point.distance; 24102 var _data$handles = data.handles, 24103 start = _data$handles.start, 24104 end = _data$handles.end, 24105 perpendicularStart = _data$handles.perpendicularStart, 24106 perpendicularEnd = _data$handles.perpendicularEnd; 24107 var fudgeFactor = 1; 24108 var fixedPoint = perpendicularEnd; 24109 var distanceFromFixed = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.lineSegment.distanceToPoint(data.handles, fixedPoint); 24110 var distanceFromMoved = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.lineSegment.distanceToPoint(data.handles, movedPoint); 24111 var distanceBetweenPoints = distance(fixedPoint, movedPoint); 24112 var total = distanceFromFixed + distanceFromMoved; 24113 24114 if (distanceBetweenPoints <= distanceFromFixed) { 24115 return false; 24116 } 24117 24118 var length = distance(start, end); 24119 24120 if (length === 0) { 24121 return false; 24122 } 24123 24124 var dx = (start.x - end.x) / length; 24125 var dy = (start.y - end.y) / length; 24126 var adjustedLineP1 = { 24127 x: start.x - fudgeFactor * dx, 24128 y: start.y - fudgeFactor * dy 24129 }; 24130 var adjustedLineP2 = { 24131 x: end.x + fudgeFactor * dx, 24132 y: end.y + fudgeFactor * dy 24133 }; 24134 perpendicularStart.x = movedPoint.x; 24135 perpendicularStart.y = movedPoint.y; 24136 perpendicularEnd.x = movedPoint.x - total * dy; 24137 perpendicularEnd.y = movedPoint.y + total * dx; 24138 var longLine = { 24139 start: { 24140 x: start.x, 24141 y: start.y 24142 }, 24143 end: { 24144 x: end.x, 24145 y: end.y 24146 } 24147 }; 24148 var perpendicularLine = { 24149 start: { 24150 x: perpendicularStart.x, 24151 y: perpendicularStart.y 24152 }, 24153 end: { 24154 x: perpendicularEnd.x, 24155 y: perpendicularEnd.y 24156 } 24157 }; 24158 var intersection = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.lineSegment.intersectLine(longLine, perpendicularLine); 24159 24160 if (!intersection) { 24161 if (distance(movedPoint, start) > distance(movedPoint, end)) { 24162 perpendicularStart.x = adjustedLineP2.x + distanceFromMoved * dy; 24163 perpendicularStart.y = adjustedLineP2.y - distanceFromMoved * dx; 24164 perpendicularEnd.x = perpendicularStart.x - total * dy; 24165 perpendicularEnd.y = perpendicularStart.y + total * dx; 24166 } else { 24167 perpendicularStart.x = adjustedLineP1.x + distanceFromMoved * dy; 24168 perpendicularStart.y = adjustedLineP1.y - distanceFromMoved * dx; 24169 perpendicularEnd.x = perpendicularStart.x - total * dy; 24170 perpendicularEnd.y = perpendicularStart.y + total * dx; 24171 } 24172 } 24173 24174 return true; 24175}); 24176 24177/***/ }), 24178
24179/***/ "./tools/annotation/bidirectionalTool/moveHandle/perpendicularRightFixedPoint.js": 24180/*!***************************************************************************************!*\ 24181 !*** ./tools/annotation/bidirectionalTool/moveHandle/perpendicularRightFixedPoint.js ***! 24182 \***************************************************************************************/ 24183/*! exports provided: default */ 24184/***/ (function(module, __webpack_exports__, __webpack_require__) { 24185 24186"use strict"; 24187__webpack_require__.r(__webpack_exports__); 24188/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../../../../externalModules.js */ "./externalModules.js"); 24189 // Move perpendicular line end point 24190 24191/* harmony default export */ __webpack_exports__["default"] = (function (movedPoint, data) { 24192 var distance = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.point.distance; 24193 var _data$handles = data.handles, 24194 start = _data$handles.start, 24195 end = _data$handles.end, 24196 perpendicularStart = _data$handles.perpendicularStart, 24197 perpendicularEnd = _data$handles.perpendicularEnd; 24198 var fudgeFactor = 1; 24199 var fixedPoint = perpendicularStart; 24200 var distanceFromFixed = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.lineSegment.distanceToPoint(data.handles, fixedPoint); 24201 var distanceFromMoved = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.lineSegment.distanceToPoint(data.handles, movedPoint); 24202 var distanceBetweenPoints = distance(fixedPoint, movedPoint); 24203 var total = distanceFromFixed + distanceFromMoved; 24204 24205 if (distanceBetweenPoints <= distanceFromFixed) { 24206 return false; 24207 } 24208 24209 var length = distance(start, end); 24210 var dx = (start.x - end.x) / length; 24211 var dy = (start.y - end.y) / length; 24212 var adjustedLineP1 = { 24213 x: start.x - fudgeFactor * dx, 24214 y: start.y - fudgeFactor * dy 24215 }; 24216 var adjustedLineP2 = { 24217 x: end.x + fudgeFactor * dx, 24218 y: end.y + fudgeFactor * dy 24219 }; 24220 perpendicularStart.x = movedPoint.x + total * dy; 24221 perpendicularStart.y = movedPoint.y - total * dx; 24222 perpendicularEnd.x = movedPoint.x; 24223 perpendicularEnd.y = movedPoint.y; 24224 perpendicularEnd.locked = false; 24225 perpendicularStart.locked = false; 24226 var longLine = { 24227 start: { 24228 x: start.x, 24229 y: start.y 24230 }, 24231 end: { 24232 x: end.x, 24233 y: end.y 24234 } 24235 }; 24236 var perpendicularLine = { 24237 start: { 24238 x: perpendicularStart.x, 24239 y: perpendicularStart.y 24240 }, 24241 end: { 24242 x: perpendicularEnd.x, 24243 y: perpendicularEnd.y 24244 } 24245 }; 24246 var intersection = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.lineSegment.intersectLine(longLine, perpendicularLine); 24247 24248 if (!intersection) { 24249 if (distance(movedPoint, start) > distance(movedPoint, end)) { 24250 perpendicularEnd.x = adjustedLineP2.x - distanceFromMoved * dy; 24251 perpendicularEnd.y = adjustedLineP2.y + distanceFromMoved * dx; 24252 perpendicularStart.x = perpendicularEnd.x + total * dy; 24253 perpendicularStart.y = perpendicularEnd.y - total * dx; 24254 } else { 24255 perpendicularEnd.x = adjustedLineP1.x - distanceFromMoved * dy; 24256 perpendicularEnd.y = adjustedLineP1.y + distanceFromMoved * dx; 24257 perpendicularStart.x = perpendicularEnd.x + total * dy; 24258 perpendicularStart.y = perpendicularEnd.y - total * dx; 24259 } 24260 } 24261 24262 return true; 24263}); 24264 24265/***/ }), 24266
24267/***/ "./tools/annotation/bidirectionalTool/moveHandle/setHandlesPosition.js": 24268/*!*****************************************************************************!*\ 24269 !*** ./tools/annotation/bidirectionalTool/moveHandle/setHandlesPosition.js ***! 24270 \*****************************************************************************/ 24271/*! exports provided: default */ 24272/***/ (function(module, __webpack_exports__, __webpack_require__) { 24273 24274"use strict"; 24275__webpack_require__.r(__webpack_exports__); 24276/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../../../../externalModules.js */ "./externalModules.js"); 24277/* harmony import */ var _perpendicularBothFixedLeft_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./perpendicularBothFixedLeft.js */ "./tools/annotation/bidirectionalTool/moveHandle/perpendicularBothFixedLeft.js"); 24278/* harmony import */ var _perpendicularBothFixedRight_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./perpendicularBothFixedRight.js */ "./tools/annotation/bidirectionalTool/moveHandle/perpendicularBothFixedRight.js"); 24279/* harmony import */ var _perpendicularLeftFixedPoint_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./perpendicularLeftFixedPoint.js */ "./tools/annotation/bidirectionalTool/moveHandle/perpendicularLeftFixedPoint.js"); 24280/* harmony import */ var _perpendicularRightFixedPoint_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./perpendicularRightFixedPoint.js */ "./tools/annotation/bidirectionalTool/moveHandle/perpendicularRightFixedPoint.js"); 24281 24282 24283 24284 24285 // Sets position of handles(start, end, perpendicularStart, perpendicularEnd) 24286 24287/* harmony default export */ __webpack_exports__["default"] = (function (handle, eventData, data, distanceFromTool) { 24288 var movedPoint; 24289 var outOfBounds; 24290 var result; 24291 var intersection; 24292 var d1; 24293 var d2; 24294 var longLine = {}; 24295 var perpendicularLine = {}; 24296 var proposedPoint = { 24297 x: eventData.currentPoints.image.x + distanceFromTool.x, 24298 y: eventData.currentPoints.image.y + distanceFromTool.y 24299 }; 24300 24301 if (handle.index === 0) { 24302 // If long-axis start point is moved 24303 result = Object(_perpendicularBothFixedLeft_js__WEBPACK_IMPORTED_MODULE_1__["default"])(proposedPoint, data); 24304 24305 if (result) { 24306 handle.x = proposedPoint.x; 24307 handle.y = proposedPoint.y; 24308 } else { 24309 eventData.currentPoints.image.x = handle.x; 24310 eventData.currentPoints.image.y = handle.y; 24311 } 24312 } else if (handle.index === 1) { 24313 // If long-axis end point is moved 24314 result = Object(_perpendicularBothFixedRight_js__WEBPACK_IMPORTED_MODULE_2__["default"])(proposedPoint, data); 24315 24316 if (result) { 24317 handle.x = proposedPoint.x; 24318 handle.y = proposedPoint.y; 24319 } else { 24320 eventData.currentPoints.image.x = handle.x; 24321 eventData.currentPoints.image.y = handle.y; 24322 } 24323 } else if (handle.index === 2) { 24324 outOfBounds = false; // If perpendicular start point is moved 24325 24326 longLine.start = { 24327 x: data.handles.start.x, 24328 y: data.handles.start.y 24329 }; 24330 longLine.end = { 24331 x: data.handles.end.x, 24332 y: data.handles.end.y 24333 }; 24334 perpendicularLine.start = { 24335 x: data.handles.perpendicularEnd.x, 24336 y: data.handles.perpendicularEnd.y 24337 }; 24338 perpendicularLine.end = { 24339 x: proposedPoint.x, 24340 y: proposedPoint.y 24341 }; 24342 intersection = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.lineSegment.intersectLine(longLine, perpendicularLine); 24343 24344 if (!intersection) { 24345 perpendicularLine.end = { 24346 x: data.handles.perpendicularStart.x, 24347 y: data.handles.perpendicularStart.y 24348 }; 24349 intersection = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.lineSegment.intersectLine(longLine, perpendicularLine); 24350 d1 = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.point.distance(intersection, data.handles.start); 24351 d2 = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.point.distance(intersection, data.handles.end); 24352 24353 if (!intersection || d1 < 3 || d2 < 3) { 24354 outOfBounds = true; 24355 } 24356 } 24357 24358 movedPoint = false;
24359 24360 if (!outOfBounds) { 24361 movedPoint = Object(_perpendicularLeftFixedPoint_js__WEBPACK_IMPORTED_MODULE_3__["default"])(proposedPoint, data); 24362 24363 if (!movedPoint) { 24364 eventData.currentPoints.image.x = data.handles.perpendicularStart.x; 24365 eventData.currentPoints.image.y = data.handles.perpendicularStart.y; 24366 } 24367 } 24368 } else if (handle.index === 3) { 24369 outOfBounds = false; // If perpendicular end point is moved 24370 24371 longLine.start = { 24372 x: data.handles.start.x, 24373 y: data.handles.start.y 24374 }; 24375 longLine.end = { 24376 x: data.handles.end.x, 24377 y: data.handles.end.y 24378 }; 24379 perpendicularLine.start = { 24380 x: data.handles.perpendicularStart.x, 24381 y: data.handles.perpendicularStart.y 24382 }; 24383 perpendicularLine.end = { 24384 x: proposedPoint.x, 24385 y: proposedPoint.y 24386 }; 24387 intersection = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.lineSegment.intersectLine(longLine, perpendicularLine); 24388 24389 if (!intersection) { 24390 perpendicularLine.end = { 24391 x: data.handles.perpendicularEnd.x, 24392 y: data.handles.perpendicularEnd.y 24393 }; 24394 intersection = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.lineSegment.intersectLine(longLine, perpendicularLine); 24395 d1 = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.point.distance(intersection, data.handles.start); 24396 d2 = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.point.distance(intersection, data.handles.end); 24397 24398 if (!intersection || d1 < 3 || d2 < 3) { 24399 outOfBounds = true; 24400 } 24401 } 24402 24403 movedPoint = false; 24404 24405 if (!outOfBounds) { 24406 movedPoint = Object(_perpendicularRightFixedPoint_js__WEBPACK_IMPORTED_MODULE_4__["default"])(proposedPoint, data); 24407 24408 if (!movedPoint) { 24409 eventData.currentPoints.image.x = data.handles.perpendicularEnd.x; 24410 eventData.currentPoints.image.y = data.handles.perpendicularEnd.y; 24411 } 24412 } 24413 } 24414}); 24415 24416/***/ }), 24417
24418/***/ "./tools/annotation/bidirectionalTool/moveHandle/touchMoveHandle.js": 24419/*!**************************************************************************!*\ 24420 !*** ./tools/annotation/bidirectionalTool/moveHandle/touchMoveHandle.js ***! 24421 \**************************************************************************/ 24422/*! exports provided: default */ 24423/***/ (function(module, __webpack_exports__, __webpack_require__) { 24424 24425"use strict"; 24426__webpack_require__.r(__webpack_exports__); 24427/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../../../../externalModules.js */ "./externalModules.js"); 24428/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../../../store/index.js */ "./store/index.js"); 24429/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./../../../../events.js */ "./events.js"); 24430/* harmony import */ var _setHandlesPosition_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./setHandlesPosition.js */ "./tools/annotation/bidirectionalTool/moveHandle/setHandlesPosition.js"); 24431/* harmony import */ var _util_getActiveTool__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../../../util/getActiveTool */ "./util/getActiveTool.js"); 24432/* harmony import */ var _base_BaseAnnotationTool__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../../base/BaseAnnotationTool */ "./tools/base/BaseAnnotationTool.js"); 24433 24434 24435 24436 24437 24438 24439var touchEndEvents = [_events_js__WEBPACK_IMPORTED_MODULE_2__["default"].TOUCH_END, _events_js__WEBPACK_IMPORTED_MODULE_2__["default"].TOUCH_DRAG_END, _events_js__WEBPACK_IMPORTED_MODULE_2__["default"].TOUCH_PINCH, _events_js__WEBPACK_IMPORTED_MODULE_2__["default"].TOUCH_PRESS, _events_js__WEBPACK_IMPORTED_MODULE_2__["default"].TAP]; 24440/* harmony default export */ __webpack_exports__["default"] = (function (mouseEventData, toolType, data, handle, doneMovingCallback, preventHandleOutsideImage) { 24441 var element = mouseEventData.element, 24442 image = mouseEventData.image, 24443 buttons = mouseEventData.buttons; 24444 var distanceFromTool = { 24445 x: handle.x - mouseEventData.currentPoints.image.x, 24446 y: handle.y - mouseEventData.currentPoints.image.y 24447 }; 24448 24449 var touchDragCallback = function touchDragCallback(event) { 24450 var eventData = event.detail; 24451 handle.hasMoved = true; 24452 24453 if (handle.index === undefined || handle.index === null) { 24454 handle.x = eventData.currentPoints.image.x + distanceFromTool.x; 24455 handle.y = eventData.currentPoints.image.y + distanceFromTool.y; 24456 } else { 24457 Object(_setHandlesPosition_js__WEBPACK_IMPORTED_MODULE_3__["default"])(handle, eventData, data, distanceFromTool); 24458 } 24459 24460 if (preventHandleOutsideImage) { 24461 handle.x = Math.max(handle.x, 0); 24462 handle.x = Math.min(handle.x, eventData.image.width); 24463 handle.y = Math.max(handle.y, 0); 24464 handle.y = Math.min(handle.y, eventData.image.height); 24465 } 24466 24467 data.invalidated = true; 24468 _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.updateImage(element); 24469 var activeTool = Object(_util_getActiveTool__WEBPACK_IMPORTED_MODULE_4__["default"])(element, buttons, 'touch'); 24470 24471 if (activeTool instanceof _base_BaseAnnotationTool__WEBPACK_IMPORTED_MODULE_5__["default"]) { 24472 activeTool.updateCachedStats(image, element, data); 24473 } 24474 24475 var modifiedEventData = { 24476 toolType: toolType, 24477 element: element, 24478 measurementData: data 24479 }; 24480 _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.triggerEvent(element, _events_js__WEBPACK_IMPORTED_MODULE_2__["default"].MEASUREMENT_MODIFIED, modifiedEventData); 24481 }; 24482 24483 handle.active = true; 24484 _store_index_js__WEBPACK_IMPORTED_MODULE_1__["state"].isToolLocked = true; 24485 element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_2__["default"].TOUCH_DRAG, touchDragCallback); 24486 24487 var touchEndCallback = function touchEndCallback() { 24488 handle.active = false; 24489 _store_index_js__WEBPACK_IMPORTED_MODULE_1__["state"].isToolLocked = false; 24490 element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_2__["default"].TOUCH_DRAG, touchDragCallback);
24491 touchEndEvents.forEach(function (eventType) { 24492 element.removeEventListener(eventType, touchEndCallback); 24493 }); 24494 _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.updateImage(element); 24495 24496 if (typeof doneMovingCallback === 'function') { 24497 doneMovingCallback(); 24498 } 24499 }; 24500 24501 touchEndEvents.forEach(function (eventType) { 24502 element.addEventListener(eventType, touchEndCallback); 24503 }); 24504}); 24505 24506/***/ }), 24507
24508/***/ "./tools/annotation/bidirectionalTool/pointNearTool.js": 24509/*!*************************************************************!*\ 24510 !*** ./tools/annotation/bidirectionalTool/pointNearTool.js ***! 24511 \*************************************************************/ 24512/*! exports provided: default */ 24513/***/ (function(module, __webpack_exports__, __webpack_require__) { 24514 24515"use strict"; 24516__webpack_require__.r(__webpack_exports__); 24517/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../../store/index.js */ "./store/index.js"); 24518/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./../../../externalModules.js */ "./externalModules.js"); 24519/* harmony import */ var _util_pointInsideBoundingBox_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./../../../util/pointInsideBoundingBox.js */ "./util/pointInsideBoundingBox.js"); 24520 24521 24522 24523 24524var pointNearPerpendicular = function pointNearPerpendicular(element, handles, coords, distanceThreshold) { 24525 var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone; 24526 var cornerstoneMath = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath; 24527 var lineSegment = { 24528 start: cornerstone.pixelToCanvas(element, handles.perpendicularStart), 24529 end: cornerstone.pixelToCanvas(element, handles.perpendicularEnd) 24530 }; 24531 var distanceToPoint = cornerstoneMath.lineSegment.distanceToPoint(lineSegment, coords); 24532 return distanceToPoint < distanceThreshold; 24533}; 24534 24535/* harmony default export */ __webpack_exports__["default"] = (function (element, data, coords) { 24536 var interactionType = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'mouse'; 24537 var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone; 24538 var cornerstoneMath = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstoneMath; 24539 var handles = data.handles; 24540 var lineSegment = { 24541 start: cornerstone.pixelToCanvas(element, handles.start), 24542 end: cornerstone.pixelToCanvas(element, handles.end) 24543 }; 24544 var distanceToPoint = cornerstoneMath.lineSegment.distanceToPoint(lineSegment, coords); 24545 24546 if (Object(_util_pointInsideBoundingBox_js__WEBPACK_IMPORTED_MODULE_2__["default"])(handles.textBox, coords)) { 24547 return true; 24548 } 24549 24550 var distanceThreshold = interactionType === 'mouse' ? _store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].clickProximity : _store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].touchProximity; 24551 24552 if (pointNearPerpendicular(element, handles, coords, distanceThreshold)) { 24553 return true; 24554 } 24555 24556 return distanceToPoint < distanceThreshold; 24557}); 24558 24559/***/ }), 24560
24561/***/ "./tools/annotation/bidirectionalTool/renderToolData.js": 24562/*!**************************************************************!*\ 24563 !*** ./tools/annotation/bidirectionalTool/renderToolData.js ***! 24564 \**************************************************************/ 24565/*! exports provided: default */ 24566/***/ (function(module, __webpack_exports__, __webpack_require__) { 24567 24568"use strict"; 24569__webpack_require__.r(__webpack_exports__); 24570/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/toConsumableArray */ "../node_modules/@babel/runtime/helpers/toConsumableArray.js"); 24571/* harmony import */ var _babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0__); 24572/* harmony import */ var _drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./../../../drawing/drawHandles.js */ "./drawing/drawHandles.js"); 24573/* harmony import */ var _utils_updatePerpendicularLineHandles_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./utils/updatePerpendicularLineHandles.js */ "./tools/annotation/bidirectionalTool/utils/updatePerpendicularLineHandles.js"); 24574/* harmony import */ var _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./../../../stateManagement/toolStyle.js */ "./stateManagement/toolStyle.js"); 24575/* harmony import */ var _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./../../../stateManagement/toolColors.js */ "./stateManagement/toolColors.js"); 24576/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./../../../stateManagement/toolState.js */ "./stateManagement/toolState.js"); 24577/* harmony import */ var _drawing_index_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./../../../drawing/index.js */ "./drawing/index.js"); 24578/* harmony import */ var _drawing_drawLinkedTextBox_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./../../../drawing/drawLinkedTextBox.js */ "./drawing/drawLinkedTextBox.js"); 24579/* harmony import */ var _util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../../util/getPixelSpacing */ "./util/getPixelSpacing.js"); 24580 24581 24582/* eslint no-loop-func: 0 */ 24583// --> OFF 24584 24585 24586 24587 24588 24589 24590 24591 24592/* harmony default export */ __webpack_exports__["default"] = (function (evt) { 24593 var _this = this; 24594 24595 var eventData = evt.detail; 24596 var element = eventData.element, 24597 canvasContext = eventData.canvasContext, 24598 image = eventData.image; 24599 var _this$configuration = this.configuration, 24600 handleRadius = _this$configuration.handleRadius, 24601 drawHandlesOnHover = _this$configuration.drawHandlesOnHover; // If we have no toolData for this element, return immediately as there is nothing to do 24602 24603 var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_5__["getToolState"])(element, this.name); 24604 24605 if (!toolData) { 24606 return; 24607 } 24608 24609 var _getPixelSpacing = Object(_util_getPixelSpacing__WEBPACK_IMPORTED_MODULE_8__["default"])(image), 24610 rowPixelSpacing = _getPixelSpacing.rowPixelSpacing, 24611 colPixelSpacing = _getPixelSpacing.colPixelSpacing; // LT-29 Disable Target Measurements when pixel spacing is not available 24612 24613 24614 if (!rowPixelSpacing || !colPixelSpacing) { 24615 return; 24616 } // We have tool data for this element - iterate over each one and draw it 24617 24618 24619 var context = Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_6__["getNewContext"])(canvasContext.canvas); 24620 var color; 24621 var activeColor = _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_4__["default"].getActiveColor(); 24622 var lineWidth = _stateManagement_toolStyle_js__WEBPACK_IMPORTED_MODULE_3__["default"].getToolW
24622idth(); 24623 24624 var _loop = function _loop(i) { 24625 var data = toolData.data[i]; 24626 24627 if (data.visible === false) { 24628 return "continue"; 24629 } 24630 24631 color = data.active ? activeColor : _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_4__["default"].getToolColor(); // Calculate the data measurements 24632 24633 if (data.invalidated === true) { 24634 if (data.longestDiameter && data.shortestDiameter) { 24635 _this.throttledUpdateCachedStats(image, element, data); 24636 } else { 24637 _this.updateCachedStats(image, element, data); 24638 } 24639 } 24640 24641 Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_6__["draw"])(context, function (context) { 24642 // Configurable shadow 24643 Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_6__["setShadow"])(context, _this.configuration); 24644 var _data$handles = data.handles, 24645 start = _data$handles.start, 24646 end = _data$handles.end, 24647 perpendicularStart = _data$handles.perpendicularStart, 24648 perpendicularEnd = _data$handles.perpendicularEnd, 24649 textBox = _data$handles.textBox; // Draw the measurement line 24650 24651 Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_6__["drawLine"])(context, element, start, end, { 24652 color: color 24653 }); // Draw perpendicular line 24654 24655 var strokeWidth = lineWidth; 24656 Object(_utils_updatePerpendicularLineHandles_js__WEBPACK_IMPORTED_MODULE_2__["default"])(eventData, data); 24657 Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_6__["drawLine"])(context, element, perpendicularStart, perpendicularEnd, { 24658 color: color, 24659 strokeWidth: strokeWidth 24660 }); // Draw the handles 24661 24662 var handleOptions = { 24663 color: color, 24664 handleRadius: handleRadius, 24665 drawHandlesIfActive: drawHandlesOnHover 24666 }; // Draw the handles 24667 24668 Object(_drawing_drawHandles_js__WEBPACK_IMPORTED_MODULE_1__["default"])(context, eventData, data.handles, handleOptions); // Draw the textbox 24669 // Move the textbox slightly to the right and upwards 24670 // So that it sits beside the length tool handle 24671 24672 var xOffset = 10; 24673 24674 var textBoxAnchorPoints = function textBoxAnchorPoints(handles) { 24675 return [handles.start, handles.end, handles.perpendicularStart, handles.perpendicularEnd]; 24676 }; 24677 24678 var textLines = getTextBoxText(data, rowPixelSpacing, colPixelSpacing); 24679 Object(_drawing_drawLinkedTextBox_js__WEBPACK_IMPORTED_MODULE_7__["default"])(context, element, textBox, textLines, data.handles, textBoxAnchorPoints, color, lineWidth, xOffset, true); 24680 }); 24681 }; 24682 24683 for (var i = 0; i < toolData.data.length; i++) { 24684 var _ret = _loop(i); 24685 24686 if (_ret === "continue") continue; 24687 } 24688}); 24689 24690var getTextBoxText = function getTextBoxText(data, rowPixelSpacing, colPixelSpacing) { 24691 var suffix = ' mm'; 24692 24693 if (!rowPixelSpacing || !colPixelSpacing) { 24694 suffix = ' pixels'; 24695 } 24696 24697 var lengthText = " L ".concat(data.longestDiameter).concat(suffix); 24698 var widthText = " W ".concat(data.shortestDiameter).concat(suffix); 24699 var labels = data.labels; 24700 24701 if (labels && Array.isArray(labels)) { 24702 return [].concat(_babel_runtime_helpers_toConsumableArray__WEBPACK_IMPORTED_MODULE_0___default()(labels), [lengthText, widthText]); 24703 } 24704 24705 return [lengthText, widthText]; 24706}; 24707 24708/***/ }), 24709
24710/***/ "./tools/annotation/bidirectionalTool/utils/calculateLongestAndShortestDiameters.js": 24711/*!******************************************************************************************!*\ 24712 !*** ./tools/annotation/bidirectionalTool/utils/calculateLongestAndShortestDiameters.js ***! 24713 \******************************************************************************************/ 24714/*! exports provided: default */ 24715/***/ (function(module, __webpack_exports__, __webpack_require__) { 24716 24717"use strict"; 24718__webpack_require__.r(__webpack_exports__); 24719/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return calculateLongestAndShortestDiameters; }); 24720/** 24721 * Calculates longest and shortest diameters using measurement handles and pixelSpacing 24722 * @param {Object} measurementData 24723 * @param pixelSpacing 24724 */ 24725function calculateLongestAndShortestDiameters(measurementData, pixelSpacing) { 24726 var rowPixelSpacing = pixelSpacing.rowPixelSpacing, 24727 colPixelSpacing = pixelSpacing.colPixelSpacing; 24728 var _measurementData$hand = measurementData.handles, 24729 start = _measurementData$hand.start, 24730 end = _measurementData$hand.end, 24731 perpendicularStart = _measurementData$hand.perpendicularStart, 24732 perpendicularEnd = _measurementData$hand.perpendicularEnd; // Calculate the long axis length 24733 24734 var dx = (start.x - end.x) * (colPixelSpacing || 1); 24735 var dy = (start.y - end.y) * (rowPixelSpacing || 1); 24736 var length = Math.sqrt(dx * dx + dy * dy); // Calculate the short axis length 24737 24738 var wx = (perpendicularStart.x - perpendicularEnd.x) * (colPixelSpacing || 1); 24739 var wy = (perpendicularStart.y - perpendicularEnd.y) * (rowPixelSpacing || 1); 24740 var width = Math.sqrt(wx * wx + wy * wy); 24741 24742 if (!width) { 24743 width = 0; 24744 } // Length is always longer than width 24745 24746 24747 if (width > length) { 24748 var tempW = width; 24749 var tempL = length; 24750 length = tempW; 24751 width = tempL; 24752 } 24753 24754 return { 24755 longestDiameter: length.toFixed(1), 24756 shortestDiameter: width.toFixed(1) 24757 }; 24758} 24759 24760/***/ }), 24761
24762/***/ "./tools/annotation/bidirectionalTool/utils/updatePerpendicularLineHandles.js": 24763/*!************************************************************************************!*\ 24764 !*** ./tools/annotation/bidirectionalTool/utils/updatePerpendicularLineHandles.js ***! 24765 \************************************************************************************/ 24766/*! exports provided: default */ 24767/***/ (function(module, __webpack_exports__, __webpack_require__) { 24768 24769"use strict"; 24770__webpack_require__.r(__webpack_exports__); 24771// Update the perpendicular line handles 24772/* harmony default export */ __webpack_exports__["default"] = (function (eventData, data) { 24773 if (!data.handles.perpendicularStart.locked) { 24774 return; 24775 } 24776 24777 var startX, startY, endX, endY; 24778 var _data$handles = data.handles, 24779 start = _data$handles.start, 24780 end = _data$handles.end; 24781 24782 if (start.x === end.x && start.y === end.y) { 24783 startX = start.x; 24784 startY = start.y; 24785 endX = end.x; 24786 endY = end.y; 24787 } else { 24788 // Mid point of long-axis line 24789 var mid = { 24790 x: (start.x + end.x) / 2, 24791 y: (start.y + end.y) / 2 24792 }; // Length of long-axis 24793 24794 var dx = (start.x - end.x) * (eventData.image.columnPixelSpacing || 1); 24795 var dy = (start.y - end.y) * (eventData.image.rowPixelSpacing || 1); 24796 var length = Math.sqrt(dx * dx + dy * dy); 24797 var vectorX = (start.x - end.x) / length; 24798 var vectorY = (start.y - end.y) / length; 24799 var perpendicularLineLength = length / 2; 24800 startX = mid.x + perpendicularLineLength / 2 * vectorY; 24801 startY = mid.y - perpendicularLineLength / 2 * vectorX; 24802 endX = mid.x - perpendicularLineLength / 2 * vectorY; 24803 endY = mid.y + perpendicularLineLength / 2 * vectorX; 24804 } 24805 24806 data.handles.perpendicularStart.x = startX; 24807 data.handles.perpendicularStart.y = startY; 24808 data.handles.perpendicularEnd.x = endX; 24809 data.handles.perpendicularEnd.y = endY; 24810}); 24811 24812/***/ }), 24813
24814/***/ "./tools/annotation/index.js": 24815/*!***********************************!*\ 24816 !*** ./tools/annotation/index.js ***! 24817 \***********************************/ 24818/*! exports provided: AngleTool, ArrowAnnotateTool, BidirectionalTool, CircleRoiTool, CobbAngleTool, EllipticalRoiTool, FreehandMouseTool, LengthTool, ProbeTool, RectangleRoiTool, TextMarkerTool, default */ 24819/***/ (function(module, __webpack_exports__, __webpack_require__) { 24820 24821"use strict"; 24822__webpack_require__.r(__webpack_exports__); 24823/* harmony import */ var _AngleTool_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./AngleTool.js */ "./tools/annotation/AngleTool.js"); 24824/* harmony import */ var _ArrowAnnotateTool_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ArrowAnnotateTool.js */ "./tools/annotation/ArrowAnnotateTool.js"); 24825/* harmony import */ var _BidirectionalTool_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./BidirectionalTool.js */ "./tools/annotation/BidirectionalTool.js"); 24826/* harmony import */ var _CircleRoiTool_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./CircleRoiTool.js */ "./tools/annotation/CircleRoiTool.js"); 24827/* harmony import */ var _CobbAngleTool_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./CobbAngleTool.js */ "./tools/annotation/CobbAngleTool.js"); 24828/* harmony import */ var _EllipticalRoiTool_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./EllipticalRoiTool.js */ "./tools/annotation/EllipticalRoiTool.js"); 24829/* harmony import */ var _FreehandMouseTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./FreehandMouseTool.js */ "./tools/annotation/FreehandMouseTool.js"); 24830/* harmony import */ var _LengthTool_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./LengthTool.js */ "./tools/annotation/LengthTool.js"); 24831/* harmony import */ var _ProbeTool_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./ProbeTool.js */ "./tools/annotation/ProbeTool.js"); 24832/* harmony import */ var _RectangleRoiTool_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./RectangleRoiTool.js */ "./tools/annotation/RectangleRoiTool.js"); 24833/* harmony import */ var _TextMarkerTool_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./TextMarkerTool.js */ "./tools/annotation/TextMarkerTool.js"); 24834/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "AngleTool", function() { return _AngleTool_js__WEBPACK_IMPORTED_MODULE_0__["default"]; }); 24835 24836/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ArrowAnnotateTool", function() { return _ArrowAnnotateTool_js__WEBPACK_IMPORTED_MODULE_1__["default"]; }); 24837 24838/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "BidirectionalTool", function() { return _BidirectionalTool_js__WEBPACK_IMPORTED_MODULE_2__["default"]; }); 24839 24840/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "CircleRoiTool", function() { return _CircleRoiTool_js__WEBPACK_IMPORTED_MODULE_3__["default"]; }); 24841 24842/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "CobbAngleTool", function() { return _CobbAngleTool_js__WEBPACK_IMPORTED_MODULE_4__["default"]; }); 24843 24844/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "EllipticalRoiTool", function() { return _EllipticalRoiTool_js__WEBPACK_IMPORTED_MODULE_5__["default"]; }); 24845 24846/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FreehandMouseTool", function() { return _FreehandMouseTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]; }); 24847 24848/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "LengthTool", function() { return _LengthTool_js__WEBPACK_IMPORTED_MODULE_7__["default"]; }); 24849 24850/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ProbeTool", function() { return _ProbeTool_js__WEBPACK_IMPORTED_MODULE_8__["default"]; }); 24851 24852/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "RectangleRoiTool", function() { return _RectangleRoiTool_js__WEBPACK_IMPORTED_MODULE_9__["default"]; }); 24853 24854/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "TextMarkerTool", function() { return _TextMarkerTool_js__WEBPACK_IMPORTED_MODULE_10__["default"]; }); 24855 24856 24857 24858 24859 24860 24861 24862 24863 24864 24865 24866 // Named Exports 24867 24868 24869 24870 24871 24872 24873 24874 24875 24876 24877 24878 // Namespace, default export 24879 24880/* harmony default export */ __webpack_exports__["default"] = ({ 24881 AngleTool: _AngleTool_js__WEBPACK_IMPORTED_MODULE_0__["default"], 24882 ArrowAnnotateTool: _ArrowAnnotateTool_js__WEBPACK_IMPORTED_MODULE_1__["default"], 24883 BidirectionalTool: _BidirectionalTool_js__WEBPACK_IMPORTED_MODULE_2__["default"], 24884 CircleRoiTool: _CircleRoiTool_js__WEBPACK_IMPORTED_MODULE_3__["default"], 24885 CobbAngleTool: _CobbAngleTool_js__WEBPACK_IMPORTED_MODULE_4__["default"], 24886 EllipticalRoiTool: _EllipticalRoiTool_js__WEBPACK_IMPORTED_MODULE_5__["default"], 24887 FreehandMouseTool: _FreehandMouseTool_js__WEBPACK_IMPORTED_MODULE_6__["default"], 24888 LengthTool: _LengthTool_js__WEBPACK_IMPORTED_MODULE_7__["default"], 24889 ProbeTool: _ProbeTool_js__WEBPACK_IMPORTED_MODULE_8__["default"], 24890 RectangleRoiTool: _RectangleRoiTool_js__WEBPACK_IMPORTED_MODULE_9__["default"], 24891 TextMarkerTool: _TextMarkerTool_js__WEBPACK_IMPORTED_MODULE_10__["default"] 24892}); 24893 24894/***/ }), 24895
24896/***/ "./tools/base/BaseAnnotationTool.js": 24897/*!******************************************!*\ 24898 !*** ./tools/base/BaseAnnotationTool.js ***! 24899 \******************************************/ 24900/*! exports provided: default */ 24901/***/ (function(module, __webpack_exports__, __webpack_require__) { 24902 24903"use strict"; 24904__webpack_require__.r(__webpack_exports__); 24905/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js"); 24906/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); 24907/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js"); 24908/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); 24909/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js"); 24910/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); 24911/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js"); 24912/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); 24913/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js"); 24914/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4__); 24915/* harmony import */ var _BaseTool_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./BaseTool.js */ "./tools/base/BaseTool.js"); 24916/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./../../stateManagement/toolState.js */ "./stateManagement/toolState.js"); 24917/* harmony import */ var _manipulators_handleActivator_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./../../manipulators/handleActivator.js */ "./manipulators/handleActivator.js"); 24918/* harmony import */ var _util_findAndMoveHelpers_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./../../util/findAndMoveHelpers.js */ "./util/findAndMoveHelpers.js"); 24919/* harmony import */ var _util_logger__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../util/logger */ "./util/logger.js"); 24920 24921 24922 24923 24924 24925 24926 24927 24928 24929 24930var logger = Object(_util_logger__WEBPACK_IMPORTED_MODULE_9__["getLogger"])('baseAnnotationTool'); 24931/** 24932 * @memberof Tools.Base 24933 * @classdesc Abstract class for tools which create and display annotations on the 24934 * cornerstone canvas. 24935 * @extends Tools.Base.BaseTool 24936 */ 24937 24938var BaseAnnotationTool = 24939/*#__PURE__*/ 24940function (_BaseTool) { 24941 _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_4___default()(BaseAnnotationTool, _BaseTool); 24942 24943 function BaseAnnotationTool() { 24944 var _getPrototypeOf2; 24945 24946 _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, BaseAnnotationTool); 24947 24948 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { 24949 args[_key] = arguments[_key]; 24950 } 24951 24952 return _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, (_getPrototypeOf2 = _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(BaseAnnotationTool)).call.apply(_getPrototypeOf2, [this].concat(args))); 24953 } // =================================================================== 24954 // Abstract Methods - Must be implemented. 24955 // =================================================================== 24956 24957 /** 24958 * Creates a new annotation. 24959 * 24960 * @method createNewMeasurement 24961 * @memberof Tools.Base.BaseAnnotationTool 24962 * 24963 * @param {type} evt description 24964 * @returns {type} description 24965 */ 24966 // eslint-disable-next-line no-unused-vars 24967 24968 24969 _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(BaseAnnotationTool, [{ 24970 key: "createNewMeasurement", 24971 value: function createNewMeasurement(evt) { 24972 throw new Error("Method createNewMeasurement not implemented for ".concat(this.name, ".")); 24973 } 24974 /** 24975 * 24976 * Returns true if the given coords are need the tool. 24977 * 24978 * @method pointNearTool 24979 * @memberof Tools.Base.BaseAnnotationTool 24980 * 24981 * @param {*} element 24982 * @param {*} data 24983 * @param {*} coords 24984 * @param {string} [interactionType=mouse] 24985 * @returns {boolean} If the point is near the tool 24986 */ 24987 // eslint-disable-next-line no-unused-vars 24988 24989 }, { 24990 key: "pointNearTool", 24991 value: function pointNearTool(element, data, coords) { 24992 var interactionType = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'mouse'; 24993 throw new Error("Method pointNearTool not implemented for ".concat(this.name, ".")); 24994 } 24995 /** 24996 * Returns the distance in px from the given coords to the closest handle of the annotation. 24997 * 24998 * @method distanceFromPoint 24999 * @memberof Tools.Base.BaseAnnotationTool 25000 * 25001 * @param {*} element 25002 * @param {*} data 25003 * @param {*} coords 25004 * @returns {number} - the distance in px from the provided coordinates to the 25005 * closest rendered portion of the annotation. -1 if the distance cannot be 25006 * calculated. 25007 */ 25008 // eslint-disable-next-line no-unused-vars 25009 25010 }, { 25011 key: "distanceFromPoint", 25012 value: function distanceFromPoint(element, data, coords) { 25013 throw new Error("Method distanceFromPoint not implemented for ".concat(this.name, ".")); 25014 } 25015 /** 25016 * Used to redraw the tool's annotation data per render 25017 * 25018 * @abstract 25019 * @param {*} evt 25020 * @returns {void} 25021 */ 25022 // eslint-disable-next-line no-unused-vars 25023 25024 }, { 25025 key: "renderToolData", 25026 value: function renderToolData(evt) { 25027 throw new Error("renderToolData not implemented for ".concat(this.name, ".")); 25028 } // =================================================================== 25029 // Virtual Methods - Have default behavior but may be overriden. 25030 // =================================================================== 25031 25032 /** 25033 * Event handler for MOUSE_MOVE event. 25034 * 25035 * @abstract 25036 * @event 25037 * @param {Object} evt - The event. 25038 * @returns {boolean} - True if the image needs to be updated 25039 */ 25040 25041 }, { 25042 key: "mouseMoveCallback", 25043 value: function mouseMoveCallback(evt) { 25044 var _evt$detail = evt.detail, 25045 element = _evt$detail.element, 25046 currentPoints = _evt$detail.currentPoints; 25047 var coords = currentPoints.canvas; 25048 var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_6__["getToolState"])(element, this.name); 25049 var imageNeedsUpdate = false;
25050 25051 for (var d = 0; d < toolState.data.length; d++) { 25052 var data = toolState.data[d]; // Hovering a handle? 25053 25054 if (Object(_manipulators_handleActivator_js__WEBPACK_IMPORTED_MODULE_7__["default"])(element, data.handles, coords) === true) { 25055 imageNeedsUpdate = true; 25056 } // Tool data's 'active' does not match coordinates 25057 // TODO: can't we just do an if/else and save on a pointNearTool check? 25058 25059 25060 var nearToolAndNotMarkedActive = this.pointNearTool(element, data, coords, 'mouse') && !data.active; 25061 var notNearToolAndMarkedActive = !this.pointNearTool(element, data, coords, 'mouse') && data.active; 25062 25063 if (nearToolAndNotMarkedActive || notNearToolAndMarkedActive) { 25064 data.active = !data.active; 25065 imageNeedsUpdate = true; 25066 } 25067 } 25068 25069 return imageNeedsUpdate; 25070 } 25071 /** 25072 * Custom callback for when a handle is selected. 25073 * @method handleSelectedCallback 25074 * @memberof Tools.Base.BaseAnnotationTool 25075 * 25076 * @param {*} evt - 25077 * @param {*} toolData - 25078 * @param {*} handle - The selected handle. 25079 * @param {String} interactionType - 25080 * @returns {void} 25081 */ 25082 25083 }, { 25084 key: "handleSelectedCallback", 25085 value: function handleSelectedCallback(evt, toolData, handle) { 25086 var interactionType = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'mouse'; 25087 Object(_util_findAndMoveHelpers_js__WEBPACK_IMPORTED_MODULE_8__["moveHandleNearImagePoint"])(evt, this, toolData, handle, interactionType); 25088 } 25089 /** 25090 * Custom callback for when a tool is selected. 25091 * 25092 * @method toolSelectedCallback 25093 * @memberof Tools.Base.BaseAnnotationTool 25094 * 25095 * @param {*} evt 25096 * @param {*} annotation 25097 * @param {string} [interactionType=mouse] 25098 * @returns {void} 25099 */ 25100 25101 }, { 25102 key: "toolSelectedCallback", 25103 value: function toolSelectedCallback(evt, annotation) { 25104 var interactionType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'mouse'; 25105 Object(_util_findAndMoveHelpers_js__WEBPACK_IMPORTED_MODULE_8__["moveAnnotation"])(evt, this, annotation, interactionType); 25106 } 25107 /** 25108 * Updates cached statistics for the tool's annotation data on the element 25109 * 25110 * @param {*} image 25111 * @param {*} element 25112 * @param {*} data 25113 * @returns {void} 25114 */ 25115 25116 }, { 25117 key: "updateCachedStats", 25118 value: function updateCachedStats(image, element, data) { 25119 logger.warn("updateCachedStats not implemented for ".concat(this.name, ".")); 25120 } 25121 }]); 25122 25123 return BaseAnnotationTool; 25124}(_BaseTool_js__WEBPACK_IMPORTED_MODULE_5__["default"]); 25125 25126/* harmony default export */ __webpack_exports__["default"] = (BaseAnnotationTool); 25127 25128/***/ }), 25129
25130/***/ "./tools/base/BaseBrushTool.js": 25131/*!*************************************!*\ 25132 !*** ./tools/base/BaseBrushTool.js ***! 25133 \*************************************/ 25134/*! exports provided: default */ 25135/***/ (function(module, __webpack_exports__, __webpack_require__) { 25136 25137"use strict"; 25138__webpack_require__.r(__webpack_exports__); 25139/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js"); 25140/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); 25141/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js"); 25142/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); 25143/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js"); 25144/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); 25145/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js"); 25146/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); 25147/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/assertThisInitialized */ "../node_modules/@babel/runtime/helpers/assertThisInitialized.js"); 25148/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__); 25149/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js"); 25150/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__); 25151/* harmony import */ var _BaseTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./BaseTool.js */ "./tools/base/BaseTool.js"); 25152/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./../../events.js */ "./events.js"); 25153/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./../../externalModules.js */ "./externalModules.js"); 25154/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../stateManagement/toolState.js */ "./stateManagement/toolState.js"); 25155/* harmony import */ var _stateManagement_imageIdSpecificStateManager_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../../stateManagement/imageIdSpecificStateManager.js */ "./stateManagement/imageIdSpecificStateManager.js"); 25156/* harmony import */ var _store_isToolActive_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./../../store/isToolActive.js */ "./store/isToolActive.js"); 25157/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./../../store/index.js */ "./store/index.js"); 25158/* harmony import */ var _util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./../../util/triggerEvent.js */ "./util/triggerEvent.js"); 25159/* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./../../util/logger.js */ "./util/logger.js"); 25160 25161 25162 25163 25164 25165 25166 25167 25168 25169 25170 25171 25172 25173 25174 25175var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_14__["getLogger"])('baseBrushTool'); 25176var _store$modules$brush = _store_index_js__WEBPACK_IMPORTED_MODULE_12__["default"].modules.brush, 25177 state = _store$modules$brush.state, 25178 setters = _store$modules$brush.setters; 25179/** 25180 * @abstract 25181 * @memberof Tools.Base 25182 * @classdesc Abstract class for tools which manipulate the mask data to be displayed on 25183 * the cornerstone canvas. 25184 * @extends Tools.Base.BaseTool 25185 */ 25186 25187var BaseBrushTool = 25188/*#__PURE__*/ 25189function (_BaseTool) { 25190 _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(BaseBrushTool, _BaseTool); 25191 25192 function BaseBrushTool(props) { 25193 var _this; 25194 25195 var defaultProps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; 25196 25197 _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, BaseBrushTool); 25198 25199 if (!defaultProps.configuration) { 25200 defaultProps.configuration = {}; 25201 } 25202 25203 defaultProps.configuration.referencedToolData = 'brush'; 25204 _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(BaseBrushTool).call(this, props, defaultProps)); 25205 _this.updateOnMouseMove = true; 25206 _this.hideDefaultCursor = true; 25207 _this._drawing = false;
25208 _this._drawingMouseUpCallback = _this._drawingMouseUpCallback.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this)); 25209 return _this; 25210 } // =================================================================== 25211 // Abstract Methods - Must be implemented. 25212 // =================================================================== 25213 25214 /** 25215 * Helper function for rendering the brush. 25216 * 25217 * @abstract 25218 * @param {Object} evt - The event. 25219 * @returns {void} 25220 */ 25221 // eslint-disable-next-line no-unused-vars 25222 25223 25224 _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(BaseBrushTool, [{ 25225 key: "renderBrush", 25226 value: function renderBrush(evt) { 25227 throw new Error("Method renderBrush not implemented for ".concat(this.name, ".")); 25228 } 25229 /** 25230 * Paints the data to the canvas. 25231 * 25232 * @protected 25233 * @abstract 25234 * @param {Object} evt The event. 25235 * @returns {void} 25236 */ 25237 // eslint-disable-next-line no-unused-vars 25238 25239 }, { 25240 key: "_paint", 25241 value: function _paint(evt) { 25242 throw new Error("Method _paint not implemented for ".concat(this.name, ".")); 25243 } // =================================================================== 25244 // Virtual Methods - Have default behavior but may be overriden. 25245 // =================================================================== 25246 25247 /** 25248 * Event handler for MOUSE_DRAG event. 25249 * 25250 * @override 25251 * @event 25252 * @param {Object} evt - The event. 25253 */ 25254 25255 }, { 25256 key: "mouseDragCallback", 25257 value: function mouseDragCallback(evt) { 25258 this._startPainting(evt); 25259 } 25260 /** 25261 * Event handler for MOUSE_DOWN event. 25262 * 25263 * @override 25264 * @event 25265 * @param {Object} evt - The event. 25266 */ 25267 25268 }, { 25269 key: "preMouseDownCallback", 25270 value: function preMouseDownCallback(evt) { 25271 this._startPainting(evt); 25272 25273 return true; 25274 } 25275 /** 25276 * Initialise painting with baseBrushTool 25277 * 25278 * @protected 25279 * @event 25280 * @param {Object} evt - The event. 25281 * @returns {void} 25282 */ 25283 25284 }, { 25285 key: "_startPainting", 25286 value: function _startPainting(evt) { 25287 var eventData = evt.detail; 25288 var element = eventData.element; 25289 25290 this._paint(evt); 25291 25292 this._drawing = true; 25293 25294 this._startListeningForMouseUp(element); 25295 25296 this._lastImageCoords = eventData.currentPoints.image; 25297 } 25298 /** 25299 * Event handler for MOUSE_MOVE event. 25300 * 25301 * @override 25302 * @event 25303 * @param {Object} evt - The event. 25304 */ 25305 25306 }, { 25307 key: "mouseMoveCallback", 25308 value: function mouseMoveCallback(evt) { 25309 var currentPoints = evt.detail.currentPoints; 25310 this._lastImageCoords = currentPoints.image; 25311 } 25312 /** 25313 * Event handler for switching mode to passive; 25314 * 25315 * @override 25316 * @event 25317 * @param {Object} evt - The event. 25318 */ 25319 // eslint-disable-next-line no-unused-vars 25320 25321 }, { 25322 key: "passiveCallback", 25323 value: function passiveCallback(evt) { 25324 try { 25325 _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.updateImage(this.element); 25326 } catch (error) { 25327 // It is possible that the image has not been loaded 25328 // when this is called. 25329 return; 25330 } 25331 } 25332 /** 25333 * Used to redraw the tool's annotation data per render. 25334 * 25335 * @override 25336 * @param {Object} evt - The event. 25337 */ 25338 25339 }, { 25340 key: "renderToolData", 25341 value: function renderToolData(evt) { 25342 var eventData = evt.detail; 25343 var element = eventData.element; // Only brush needs to render. 25344 25345 if (Object(_store_isToolActive_js__WEBPACK_IMPORTED_MODULE_11__["default"])(element, this.name)) { 25346 // Call the hover event for the brush 25347 this.renderBrush(evt); 25348 } 25349 } // =================================================================== 25350 // Implementation interface 25351 // =================================================================== 25352 25353 /** 25354 * Get the draw color (segmentation) of the tool. 25355 * 25356 * @protected 25357 * @param {Number} drawId The id of the color (segmentation) to switch to. 25358 * @returns {string} The brush color in rgba format 25359 */ 25360 25361 }, { 25362 key: "_getBrushColor", 25363 value: function _getBrushColor(drawId) { 25364 var colormap = _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.colors.getColormap(state.colorMapId); 25365 var colorArray = colormap.getColor(drawId); 25366 25367 if (this._drawing) { 25368 return "rgba(".concat(colorArray[[0]], ", ").concat(colorArray[[1]], ", ").concat(colorArray[[2]], ", 1.0 )"); 25369 } 25370 25371 return "rgba(".concat(colorArray[[0]], ", ").concat(colorArray[[1]], ", ").concat(colorArray[[2]], ", 0.8 )"); 25372 } 25373 /** 25374 * Event handler for MOUSE_UP during the drawing event loop. 25375 * 25376 * @protected 25377 * @event 25378 * @param {Object} evt - The event. 25379 * @returns {void} 25380 */ 25381 25382 }, { 25383 key: "_drawingMouseUpCallback", 25384 value: function _drawingMouseUpCallback(evt) { 25385 var element = evt.detail.element; 25386 this._drawing = false;
25387 this._mouseUpRender = true; 25388 var measurementData = null; 25389 var brushModule = _store_index_js__WEBPACK_IMPORTED_MODULE_12__["default"].modules.brush; 25390 var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_9__["getToolState"])(element, this.name) || Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_9__["getToolState"])(element, 'brush'); 25391 var currentSegmentationIndex = brushModule.state.drawColorId; 25392 25393 if (toolState.data && toolState.data.length > currentSegmentationIndex) { 25394 measurementData = toolState.data[currentSegmentationIndex]; 25395 } 25396 25397 var eventData = { 25398 toolName: this.name, 25399 element: element, 25400 measurementData: measurementData, 25401 evtDetail: evt.detail 25402 }; 25403 Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_13__["default"])(element, _events_js__WEBPACK_IMPORTED_MODULE_7__["default"].MEASUREMENT_COMPLETED, eventData); 25404 25405 this._stopListeningForMouseUp(element); 25406 } 25407 /** 25408 * Adds modify loop event listeners. 25409 * 25410 * @protected 25411 * @param {Object} element - The viewport element to add event listeners to. 25412 * @modifies {element} 25413 * @returns {void} 25414 */ 25415 25416 }, { 25417 key: "_startListeningForMouseUp", 25418 value: function _startListeningForMouseUp(element) { 25419 element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].MOUSE_UP, this._drawingMouseUpCallback); 25420 element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].MOUSE_CLICK, this._drawingMouseUpCallback); 25421 element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].MOUSE_UP, this._drawingMouseUpCallback); 25422 element.addEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].MOUSE_CLICK, this._drawingMouseUpCallback); 25423 _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.updateImage(element); 25424 } 25425 /** 25426 * Adds modify loop event listeners. 25427 * 25428 * @protected 25429 * @param {Object} element - The viewport element to add event listeners to. 25430 * @modifies {element} 25431 * @returns {void} 25432 */ 25433 25434 }, { 25435 key: "_stopListeningForMouseUp", 25436 value: function _stopListeningForMouseUp(element) { 25437 element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].MOUSE_UP, this._drawingMouseUpCallback); 25438 element.removeEventListener(_events_js__WEBPACK_IMPORTED_MODULE_7__["default"].MOUSE_CLICK, this._drawingMouseUpCallback); 25439 _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.updateImage(element); 25440 } // =================================================================== 25441 // Segmentation API. This is effectively a wrapper around the store. 25442 // =================================================================== 25443 25444 /** 25445 * Switches to the next segmentation color. 25446 * 25447 * @public 25448 * @api 25449 * @returns {void} 25450 */ 25451 25452 }, { 25453 key: "nextSegmentation", 25454 value: function nextSegmentation() { 25455 var numberOfColors = this.constructor.getNumberOfColors(); 25456 var drawId = state.drawColorId + 1; 25457 25458 if (drawId === numberOfColors) { 25459 drawId = 0; 25460 } 25461 25462 state.drawColorId = drawId; 25463 } 25464 /** 25465 * Switches to the previous segmentation color. 25466 * 25467 * @public 25468 * @api 25469 * @returns {void} 25470 */ 25471 25472 }, { 25473 key: "previousSegmentation", 25474 value: function previousSegmentation() { 25475 var numberOfColors = this.constructor.getNumberOfColors(); 25476 var drawId = state.drawColorId - 1; 25477 25478 if (drawId < 0) { 25479 drawId = numberOfColors - 1; 25480 } 25481 25482 state.drawColorId = drawId; 25483 } 25484 /** 25485 * Increases the brush size 25486 * 25487 * @public 25488 * @api 25489 * @returns {void} 25490 */ 25491 25492 }, { 25493 key: "increaseBrushSize", 25494 value: function increaseBrushSize() { 25495 var oldRadius = state.radius; 25496 var newRadius = Math.floor(oldRadius * 1.2); // If e.g. only 2 pixels big. Math.floor(2*1.2) = 2. 25497 // Hence, have minimum increment of 1 pixel. 25498 25499 if (newRadius === oldRadius) { 25500 newRadius += 1; 25501 } 25502 25503 setters.radius(newRadius); 25504 } 25505 /** 25506 * Decreases the brush size 25507 * 25508 * @public 25509 * @api 25510 * @returns {void} 25511 */ 25512 25513 }, { 25514 key: "decreaseBrushSize", 25515 value: function decreaseBrushSize() { 25516 var oldRadius = state.radius; 25517 var newRadius = Math.floor(oldRadius * 0.8); 25518 setters.radius(newRadius); 25519 } 25520 /**
25521 * Displays a segmentation on the element. 25522 * 25523 * @public 25524 * @api 25525 * @param {Number} segIndex The index of the segmentation. 25526 * @returns {void} 25527 */ 25528 25529 }, { 25530 key: "showSegmentationOnElement", 25531 value: function showSegmentationOnElement(segIndex) { 25532 var enabledElement = this._getEnabledElement(); 25533 25534 var enabledElementUID = enabledElement.uuid; 25535 setters.brushVisibilityForElement(enabledElementUID, segIndex, true); 25536 _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.updateImage(enabledElement.element); 25537 } 25538 /** 25539 * Hides a segmentation on an element. 25540 * 25541 * @public 25542 * @api 25543 * @param {Number} segIndex The index of the segmentation. 25544 * @returns {void} 25545 */ 25546 25547 }, { 25548 key: "hideSegmentationOnElement", 25549 value: function hideSegmentationOnElement(segIndex) { 25550 var enabledElement = this._getEnabledElement(); 25551 25552 var enabledElementUID = enabledElement.uuid; 25553 setters.brushVisibilityForElement(enabledElementUID, segIndex, false); 25554 _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.updateImage(enabledElement.element); 25555 } 25556 /** 25557 * Displays all segmentations on an element. 25558 * 25559 * @public 25560 * @api 25561 * @returns {void} 25562 */ 25563 25564 }, { 25565 key: "showAllSegmentationsOnElement", 25566 value: function showAllSegmentationsOnElement() { 25567 var enabledElement = this._getEnabledElement(); 25568 25569 var enabledElementUID = enabledElement.uuid; 25570 var colormap = _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.colors.getColormap(state.colorMapId); 25571 var numberOfColors = colormap.getNumberOfColors(); 25572 25573 for (var segIndex = 0; segIndex < numberOfColors; segIndex++) { 25574 setters.brushVisibilityForElement(enabledElementUID, segIndex, true); 25575 } 25576 25577 _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.updateImage(enabledElement.element); 25578 } 25579 /** 25580 * Hides all segmentations on an element. 25581 * 25582 * @public 25583 * @api 25584 * @returns {void} 25585 */ 25586 25587 }, { 25588 key: "hideAllSegmentationsOnElement", 25589 value: function hideAllSegmentationsOnElement() { 25590 var enabledElement = this._getEnabledElement(); 25591 25592 var enabledElementUID = enabledElement.uuid; 25593 var colormap = _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.colors.getColormap(state.colorMapId); 25594 var numberOfColors = colormap.getNumberOfColors(); 25595 25596 for (var segIndex = 0; segIndex < numberOfColors; segIndex++) { 25597 setters.brushVisibilityForElement(enabledElementUID, segIndex, false); 25598 } 25599 25600 _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.updateImage(enabledElement.element); 25601 } 25602 /** 25603 * Returns the number of colors in the colormap. 25604 * 25605 * @static 25606 * @public 25607 * @api 25608 * @returns {Number} The number of colors in the color map. 25609 */ 25610 25611 }, { 25612 key: "_getEnabledElement", 25613 value: function _getEnabledElement() { 25614 return _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.getEnabledElement(this.element); 25615 } 25616 /** 25617 * Returns the toolData type assoicated with this type of tool. 25618 * 25619 * @static 25620 * @public 25621 * @returns {String} The number of colors in the color map. 25622 */ 25623 25624 }, { 25625 key: "alpha", 25626 get: function get() { 25627 return state.alpha; 25628 }, 25629 set: function set(value) { 25630 var enabledElement = this._getEnabledElement(); 25631 25632 state.alpha = value; 25633 _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.updateImage(enabledElement.element); 25634 } 25635 }, { 25636 key: "hiddenButActiveAlpha", 25637 get: function get() { 25638 return state.hiddenButActiveAlpha; 25639 }, 25640 set: function set(value) { 25641 var enabledElement = this._getEnabledElement(); 25642 25643 state.hiddenButActiveAlpha = value; 25644 _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.updateImage(enabledElement.element); 25645 } 25646 }], [{ 25647 key: "getNumberOfColors", 25648 value: function getNumberOfColors() { 25649 var colormap = _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.colors.getColormap(state.colorMapId); 25650 return colormap.getNumberOfColors(); 25651 } 25652 }, { 25653 key: "getReferencedToolDataName", 25654 value: function getReferencedToolDataName() { 25655 return 'brush'; 25656 } 25657 /** 25658 * Invalidate all the brush data. 25659 * 25660 * @static 25661 * @public 25662 * @param {string}
25662 enabledElementUID - This identifier for the enabled element. 25663 * @returns {void} 25664 */ 25665 25666 }, { 25667 key: "invalidateBrushOnEnabledElement", 25668 value: function invalidateBrushOnEnabledElement(enabledElementUID) { 25669 /** WIP **/ 25670 var element = _store_index_js__WEBPACK_IMPORTED_MODULE_12__["default"].getters.enabledElementByUID(enabledElementUID); 25671 var stackToolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_9__["getToolState"])(element, 'stack'); 25672 25673 if (!stackToolState) { 25674 return; 25675 } 25676 25677 var imageIds = stackToolState.data[0].imageIds; 25678 var toolState = _stateManagement_imageIdSpecificStateManager_js__WEBPACK_IMPORTED_MODULE_10__["globalImageIdSpecificToolStateManager"].saveToolState(); 25679 25680 for (var i = 0; i < imageIds.length; i++) { 25681 var imageId = imageIds[i]; 25682 25683 if (toolState[imageId] && toolState[imageId].brush) { 25684 var brushData = toolState[imageId].brush.data; 25685 25686 for (var j = 0; j < brushData.length; j++) { 25687 if (brushData[j].pixelData) { 25688 brushData[j].invalidated = true; 25689 } 25690 } 25691 } 25692 } 25693 25694 _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.updateImage(element, true); 25695 } 25696 /** 25697 * Returns a datacube for the segmentation. 25698 * 25699 * @static 25700 * @param {string} enabledElementUID - This identifier for the enabled element. 25701 * @returns {type} description 25702 */ 25703 25704 }, { 25705 key: "getDataAsVolume", 25706 value: function getDataAsVolume(enabledElementUID) { 25707 /** WIP **/ 25708 var element = _store_index_js__WEBPACK_IMPORTED_MODULE_12__["default"].getters.enabledElementByUID(enabledElementUID); 25709 var stackToolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_9__["getToolState"])(element, 'stack'); 25710 25711 if (!stackToolState) { 25712 return; 25713 } 25714 25715 var imageIds = stackToolState.data[0].imageIds; 25716 var enabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_8__["default"].cornerstone.getEnabledElement(element); 25717 var image = enabledElement.image; 25718 var dim = { 25719 xy: image.columns * image.rows, 25720 z: image.rows, 25721 xyz: image.columns * image.rows * imageIds.length 25722 }; 25723 var toolState = _stateManagement_imageIdSpecificStateManager_js__WEBPACK_IMPORTED_MODULE_10__["globalImageIdSpecificToolStateManager"].saveToolState(); 25724 var buffer = new ArrayBuffer(dim.xyz); 25725 var uint8View = new Uint8Array(buffer); 25726 25727 for (var i = 0; i < imageIds.length; i++) { 25728 var imageId = imageIds[i]; // TODO -> Workout HTF we will do this for multiple colors etc. 25729 25730 if (toolState[imageId] && toolState[imageId].brush && toolState[imageId].brush.data[0].pixelData) {// ADD brush data to the location of that slice. 25731 } 25732 } 25733 } 25734 }]); 25735 25736 return BaseBrushTool; 25737}(_BaseTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]); 25738 25739/* harmony default export */ __webpack_exports__["default"] = (BaseBrushTool); 25740 25741/***/ }), 25742
25743/***/ "./tools/base/BaseTool.js": 25744/*!********************************!*\ 25745 !*** ./tools/base/BaseTool.js ***! 25746 \********************************/ 25747/*! exports provided: default */ 25748/***/ (function(module, __webpack_exports__, __webpack_require__) { 25749 25750"use strict"; 25751__webpack_require__.r(__webpack_exports__); 25752/* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/typeof */ "../node_modules/@babel/runtime/helpers/typeof.js"); 25753/* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__); 25754/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js"); 25755/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1__); 25756/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js"); 25757/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2__); 25758/* harmony import */ var _mixins_index_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./../../mixins/index.js */ "./mixins/index.js"); 25759/* harmony import */ var _util_logger_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../util/logger.js */ "./util/logger.js"); 25760/* harmony import */ var _util_deepmerge_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./../../util/deepmerge.js */ "./util/deepmerge.js"); 25761 25762 25763 25764 25765 25766 25767var logger = Object(_util_logger_js__WEBPACK_IMPORTED_MODULE_4__["getLogger"])('tools:base:BaseTool'); 25768/** 25769 * @typedef ToolConfiguration 25770 * @param {String} name 25771 * @param {object} strategies - Named strategy functions 25772 * @param {String} defaultStrategy - The name of the strategy to use by default 25773 * @param {Object} configuration 25774 * @param {String[]} mixins - A list of mixin names to apply to the tool 25775 */ 25776 25777/** 25778 * @memberof Tools.Base 25779 * @classdesc BaseTool Class description 25780 * @property {String[]} supportedInteractionTypes - A string list of ways the tool can interact with the user 25781 */ 25782 25783var BaseTool = 25784/*#__PURE__*/ 25785function () { 25786 /** 25787 * Constructor description 25788 * @param {defaultProps} [defaultProps={}] Tools Default properties 25789 * @param {props} [props={}] Tool properties set on instantiation of a tool 25790 */ 25791 function BaseTool(props, defaultProps) { 25792 _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_1___default()(this, BaseTool); 25793 25794 /** 25795 * Merge default props with custom props 25796 */ 25797 this.initialConfiguration = Object(_util_deepmerge_js__WEBPACK_IMPORTED_MODULE_5__["default"])(defaultProps, props); 25798 var _this$initialConfigur = this.initialConfiguration, 25799 name = _this$initialConfigur.name, 25800 strategies = _this$initialConfigur.strategies, 25801 defaultStrategy = _this$initialConfigur.defaultStrategy, 25802 configuration = _this$initialConfigur.configuration, 25803 supportedInteractionTypes = _this$initialConfigur.supportedInteractionTypes, 25804 mixins = _this$initialConfigur.mixins, 25805 svgCursor = _this$initialConfigur.svgCursor; 25806 /** 25807 * A unique, identifying tool name 25808 * @type {String} 25809 */ 25810 25811 this.name = name; 25812 /** @type {String} */ 25813 25814 this.mode = 'disabled'; 25815 this.element = undefined; 25816 this.supportedInteractionTypes = supportedInteractionTypes || []; 25817 this.strategies = strategies || {}; 25818 this.defaultStrategy = defaultStrategy || Object.keys(this.strategies)[0] || undefined; 25819 this.activeStrategy = this.defaultStrategy; 25820 25821 if (svgCursor) { 25822 this.svgCursor = svgCursor; 25823 } // Options are set when a tool is added, during a "mode" change, 25824 // or via a tool's option's setter 25825 25826 25827 this._options = {}; // Configuration is set at tool initalization 25828 25829 this._configuration = Object.assign({}, configuration); // `updateOnMouseMove` causes the frame to render on every mouse move when 25830 // the tool is active. This is useful for tools that render large/dynamic 25831 // items to the canvas which can't easily be respresented with an SVG Cursor. 25832 25833 this.updateOnMouseMove = false;
25834 this.hideDefaultCursor = false; // Apply mixins if mixinsArray is not empty. 25835 25836 if (mixins && mixins.length) { 25837 this._applyMixins(mixins); 25838 } 25839 } // 25840 // CONFIGURATION 25841 // 25842 25843 /** 25844 * Config... 25845 * @public 25846 * @type {Object} 25847 * @instance 25848 */ 25849 25850 25851 _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_2___default()(BaseTool, [{ 25852 key: "mergeOptions", 25853 25854 /** 25855 * Merges provided options with existing options. 25856 * 25857 * @public 25858 * @instance 25859 * @param {Object} options - options object to merge with existing options. 25860 * @returns {undefined} 25861 */ 25862 value: function mergeOptions(options) { 25863 this._options = Object.assign({}, this._options, options); 25864 } 25865 /** 25866 * Clears the tools options. 25867 * 25868 * @public 25869 * @instance 25870 * @memberof Tools.Base.BaseTool 25871 * @returns {undefined} 25872 */ 25873 25874 }, { 25875 key: "clearOptions", 25876 value: function clearOptions() { 25877 this._options = {}; 25878 } 25879 /** 25880 * Apply the currently set/active strategy. 25881 * 25882 * @public 25883 * @instance 25884 * @method applyActiveStrategy 25885 * @memberof Tools.Base.BaseTool 25886 * 25887 * @param {*} evt The event that triggered the strategies application 25888 * @returns {*} strategies vary widely; check each specific strategy to find expected return value 25889 */ 25890 25891 }, { 25892 key: "applyActiveStrategy", 25893 value: function applyActiveStrategy(evt) { 25894 return this.strategies[this.activeStrategy](evt, this.configuration); 25895 } 25896 /** 25897 * Iterates over registered mixins; any matching names in the provided `mixinsArray` will 25898 * be merged with this instance. 25899 * 25900 * @private 25901 * @method _applyMixins 25902 * @param {string[]} mixinsArray An array of mixin identifiers (strings). 25903 * @returns {undefined} 25904 */ 25905 25906 }, { 25907 key: "_applyMixins", 25908 value: function _applyMixins(mixinsArray) { 25909 for (var i = 0; i < mixinsArray.length; i++) { 25910 var mixin = _mixins_index_js__WEBPACK_IMPORTED_MODULE_3__["default"]["".concat(mixinsArray[i])]; 25911 25912 if (_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default()(mixin) === 'object') { 25913 Object.assign(this, mixin); 25914 } else { 25915 logger.warn("".concat(this.name, ": mixin ").concat(_mixins_index_js__WEBPACK_IMPORTED_MODULE_3__["default"][i], " does not exist.")); 25916 } 25917 } 25918 } // =================================================================== 25919 // Virtual Methods - Have default behavior but may be overriden. 25920 // =================================================================== 25921 // 25922 // MOUSE 25923 // 25924 25925 /** 25926 * Callback that takes priority if the tool is active, before `MOUSE_DOWN` 25927 * events are processed. Does nothing by default. 25928 * 25929 * @callback BaseTool~preMouseDownCallback 25930 * @param {CornerstoneTools.event:cornerstonetoolsmousedown} evt 25931 * @returns {boolean} consumedEvent - True if function consumed the event. 25932 */ 25933 25934 /** 25935 * Callback that takes priority if the tool is active, after `MOUSE_DOWN` 25936 * events are processed. Does nothing by default. 25937 * 25938 * @callback BaseTool~postMouseDownCallback 25939 * @param {CornerstoneTools.event:cornerstonetoolsmousedown} evt 25940 * @returns {boolean} consumedEvent - True if function consumed the event. 25941 */ 25942 25943 /** 25944 * Callback that is called if the tool is active, after `MOUSE_DOWN` 25945 * events are processed. Does nothing by default. 25946 * 25947 * @virtual 25948 * @param {type} evt 25949 * @returns {boolean} consumedEvent - True if function consumed the event. 25950 */ 25951 25952 /** 25953 * Example implementation: 25954 * 25955 * postMouseDownCallback(evt) { 25956 * return false; 25957 * } 25958 */ 25959 25960 /** 25961 * Callback that takes priority if the tool is active, before `TOUCH_START` 25962 * events are processed. Does nothing by default. 25963 * 25964 * @virtual 25965 * @param {type} evt 25966 * @returns {boolean} consumedEvent - True if function consumed the event. 25967 */ 25968 25969 /** 25970 * Example implementation: 25971 * 25972 * preTouchStartCallback(evt) { 25973 * return false;
25974 * } 25975 */ 25976 25977 /** 25978 * Callback that is called if the tool is active, after `TOUCH_START` 25979 * events are processed. Does nothing by default. 25980 * 25981 * @virtual 25982 * @param {type} evt 25983 * @returns {boolean} consumedEvent - True if function consumed the event. 25984 */ 25985 25986 /** 25987 * Example implementation: 25988 * 25989 * postTouchStartCallback(evt) { 25990 * return false; 25991 * } 25992 */ 25993 25994 }, { 25995 key: "configuration", 25996 get: function get() { 25997 return this._configuration; 25998 }, 25999 set: function set(configuration) { 26000 this._configuration = configuration; 26001 } // 26002 // OPTIONS 26003 // 26004 26005 /** 26006 * Options... 26007 * @readonly 26008 * @instance 26009 */ 26010 26011 }, { 26012 key: "options", 26013 get: function get() { 26014 return this._options; 26015 } 26016 }], [{ 26017 key: "configuration", 26018 get: function get() {} 26019 }]); 26020 26021 return BaseTool; 26022}(); 26023 26024/* harmony default export */ __webpack_exports__["default"] = (BaseTool); 26025 26026/***/ }), 26027
26028/***/ "./tools/brush/BrushTool.js": 26029/*!**********************************!*\ 26030 !*** ./tools/brush/BrushTool.js ***! 26031 \**********************************/ 26032/*! exports provided: default */ 26033/***/ (function(module, __webpack_exports__, __webpack_require__) { 26034 26035"use strict"; 26036__webpack_require__.r(__webpack_exports__); 26037/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return BrushTool; }); 26038/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js"); 26039/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); 26040/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js"); 26041/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); 26042/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @babel/runtime/helpers/possibleConstructorReturn */ "../node_modules/@babel/runtime/helpers/possibleConstructorReturn.js"); 26043/* harmony import */ var _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2__); 26044/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @babel/runtime/helpers/getPrototypeOf */ "../node_modules/@babel/runtime/helpers/getPrototypeOf.js"); 26045/* harmony import */ var _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3__); 26046/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @babel/runtime/helpers/assertThisInitialized */ "../node_modules/@babel/runtime/helpers/assertThisInitialized.js"); 26047/* harmony import */ var _babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4__); 26048/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @babel/runtime/helpers/inherits */ "../node_modules/@babel/runtime/helpers/inherits.js"); 26049/* harmony import */ var _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5__); 26050/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./../../externalModules.js */ "./externalModules.js"); 26051/* harmony import */ var _base_BaseBrushTool_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./../base/BaseBrushTool.js */ "./tools/base/BaseBrushTool.js"); 26052/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./../../stateManagement/toolState.js */ "./stateManagement/toolState.js"); 26053/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./../../store/index.js */ "./store/index.js"); 26054/* harmony import */ var _util_brush_index_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./../../util/brush/index.js */ "./util/brush/index.js"); 26055/* harmony import */ var _util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./../../util/triggerEvent.js */ "./util/triggerEvent.js"); 26056/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../events.js */ "./events.js"); 26057 26058 26059 26060 26061 26062 26063 26064 26065 26066 26067 26068 26069 26070var drawBrushPixels = _util_brush_index_js__WEBPACK_IMPORTED_MODULE_10__["default"].drawBrushPixels, 26071 getCircle = _util_brush_index_js__WEBPACK_IMPORTED_MODULE_10__["default"].getCircle;
26072var brushModule = _store_index_js__WEBPACK_IMPORTED_MODULE_9__["default"].modules.brush; 26073/** 26074 * @public 26075 * @class BrushTool 26076 * @memberof Tools.Brush 26077 * @classdesc Tool for drawing segmentations on an image. 26078 * @extends Tools.Base.BaseBrushTool 26079 */ 26080 26081var BrushTool = 26082/*#__PURE__*/ 26083function (_BaseBrushTool) { 26084 _babel_runtime_helpers_inherits__WEBPACK_IMPORTED_MODULE_5___default()(BrushTool, _BaseBrushTool); 26085 26086 function BrushTool() { 26087 var _this; 26088 26089 var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 26090 26091 _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, BrushTool); 26092 26093 var defaultProps = { 26094 name: 'Brush', 26095 supportedInteractionTypes: ['Mouse', 'Touch'], 26096 strategies: { 26097 overlapping: _overlappingStrategy, 26098 nonOverlapping: _nonOverlappingStrategy 26099 }, 26100 defaultStrategy: 'overlapping', 26101 configuration: { 26102 alwaysEraseOnClick: false 26103 } 26104 }; 26105 _this = _babel_runtime_helpers_possibleConstructorReturn__WEBPACK_IMPORTED_MODULE_2___default()(this, _babel_runtime_helpers_getPrototypeOf__WEBPACK_IMPORTED_MODULE_3___default()(BrushTool).call(this, props, defaultProps)); 26106 _this.touchDragCallback = _this._paint.bind(_babel_runtime_helpers_assertThisInitialized__WEBPACK_IMPORTED_MODULE_4___default()(_this)); 26107 return _this; 26108 } 26109 /** 26110 * Called by the event dispatcher to render the image. 26111 * 26112 * @param {Object} evt - The event. 26113 * @returns {void} 26114 */ 26115 26116 26117 _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(BrushTool, [{ 26118 key: "renderBrush", 26119 value: function renderBrush(evt) { 26120 var eventData = evt.detail; 26121 var viewport = eventData.viewport; 26122 var mousePosition; 26123 26124 if (this._drawing) { 26125 mousePosition = this._lastImageCoords; 26126 } else if (this._mouseUpRender) { 26127 mousePosition = this._lastImageCoords; 26128 this._mouseUpRender = false;
26129 } else { 26130 mousePosition = _store_index_js__WEBPACK_IMPORTED_MODULE_9__["default"].state.mousePositionImage; 26131 } 26132 26133 if (!mousePosition) { 26134 return; 26135 } 26136 26137 var _eventData$image = eventData.image, 26138 rows = _eventData$image.rows, 26139 columns = _eventData$image.columns; 26140 var _mousePosition = mousePosition, 26141 x = _mousePosition.x, 26142 y = _mousePosition.y; 26143 26144 if (x < 0 || x > columns || y < 0 || y > rows) { 26145 return; 26146 } // Draw the hover overlay on top of the pixel data 26147 26148 26149 var radius = brushModule.state.radius; 26150 var context = eventData.canvasContext; 26151 var element = eventData.element; 26152 var drawId = brushModule.state.drawColorId; 26153 26154 var color = this._getBrushColor(drawId); 26155 26156 context.setTransform(1, 0, 0, 1, 0, 0); 26157 var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone; 26158 var circleRadius = radius * viewport.scale; 26159 var mouseCoordsCanvas = cornerstone.pixelToCanvas(element, mousePosition); 26160 context.beginPath(); 26161 context.strokeStyle = color; 26162 context.ellipse(mouseCoordsCanvas.x, mouseCoordsCanvas.y, circleRadius, circleRadius, 0, 0, 2 * Math.PI); 26163 context.stroke(); 26164 } 26165 /** 26166 * Paints the data to the canvas. 26167 * 26168 * @private 26169 * @param {Object} evt The data object associated with the event. 26170 * @returns {void} 26171 */ 26172 26173 }, { 26174 key: "_paint", 26175 value: function _paint(evt) { 26176 this.applyActiveStrategy(evt, this.configuration); 26177 Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_11__["default"])(evt.detail.element, _events_js__WEBPACK_IMPORTED_MODULE_12__["default"].MEASUREMENT_MODIFIED, evt.detail); 26178 _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone.updateImage(evt.detail.element); 26179 } 26180 }]); 26181 26182 return BrushTool; 26183}(_base_BaseBrushTool_js__WEBPACK_IMPORTED_MODULE_7__["default"]); 26184 26185 26186 26187function _overlappingStrategy(evt, configuration) { 26188 var eventData = evt.detail; 26189 var element = eventData.element; 26190 var _eventData$image2 = eventData.image, 26191 rows = _eventData$image2.rows, 26192 columns = _eventData$image2.columns; 26193 var _eventData$currentPoi = eventData.currentPoints.image, 26194 x = _eventData$currentPoi.x, 26195 y = _eventData$currentPoi.y; 26196 var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_8__["getToolState"])(element, _base_BaseBrushTool_js__WEBPACK_IMPORTED_MODULE_7__["default"].getReferencedToolDataName()); 26197 26198 if (!toolState) { 26199 Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_8__["addToolState"])(element, _base_BaseBrushTool_js__WEBPACK_IMPORTED_MODULE_7__["default"].getReferencedToolDataName(), {}); 26200 toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_8__["getToolState"])(element, _base_BaseBrushTool_js__WEBPACK_IMPORTED_MODULE_7__["default"].getReferencedToolDataName()); 26201 } 26202 26203 var toolData = toolState.data; 26204 26205 if (x < 0 || x > columns || y < 0 || y > rows) { 26206 return; 26207 } 26208 26209 var radius = brushModule.state.radius; 26210 var pointerArray = getCircle(radius, rows, columns, x, y); 26211 26212 _drawMainColor(eventData, toolData, pointerArray, configuration); 26213} 26214 26215function _nonOverlappingStrategy(evt, configuration) { 26216 var eventData = evt.detail; 26217 var element = eventData.element; 26218 var _eventData$image3 = eventData.image, 26219 rows = _eventData$image3.rows, 26220 columns = _eventData$image3.columns; 26221 var _eventData$currentPoi2 = eventData.currentPoints.image, 26222 x = _eventData$currentPoi2.x, 26223 y = _eventData$currentPoi2.y; 26224 var toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_8__["getToolState"])(element, _base_BaseBrushTool_js__WEBPACK_IMPORTED_MODULE_7__["default"].getReferencedToolDataName()); 26225 26226 if (!toolState) { 26227 Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_8__["addToolState"])(element, _base_BaseBrushTool_js__WEBPACK_IMPORTED_MODULE_7__["default"].getReferencedToolDataName(), {}); 26228 toolState = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_8__["getToolState"])(element, _base_BaseBrushTool_js__WEBPACK_IMPORTED_MODULE_7__["default"].getReferencedToolDataName()); 26229 } 26230 26231 var toolData = toolState.data; 26232 var segmentationIndex = brushModule.state.drawColorId; 26233 26234 if (x < 0 || x > columns || y < 0 || y > rows) { 26235 return; 26236 } 26237 26238 var radius = brushModule.state.radius; 26239 var pointerArray = getCircle(radius, rows, columns, x, y); 26240 var numberOfColors = _base_BaseBrushTool_js__WEBPACK_IMPORTED_MODULE_7__["default"].getNumberOfColors(); // If there is brush data in this region for other colors, delete it. 26241 26242 for (var i = 0; i < numberOfColors; i++) { 26243 if (i === segmentationIndex) { 26244 continue; 26245 } 26246 26247 if (toolData[i] && toolData[i].pixelData) { 26248 drawBrushPixels(pointerArray, toolData[i], columns, true); 26249 toolData[i].invalidated = true; 26250 } 26251 } 26252 26253 _drawMainColor(eventData, toolData, pointerArray, configuration); 26254} 26255 26256function _drawMainColor(eventData, toolData, pointerArray, configuration) { 26257 var shouldErase = configuration.alwaysEraseOnClick || _isCtrlDown(eventData); 26258 26259 var columns = eventData.image.columns; 26260 var segmentationIndex = brushModule.state.drawColorId; 26261 26262 if (shouldErase && !toolData[segmentationIndex]) { 26263 // Erase command, yet no data yet, just return. 26264 return; 26265 } 26266 26267 if (!toolData[segmentationIndex]) { 26268 toolData[segmentationIndex] = {}; 26269 } 26270 26271 if (!toolData[segmentationIndex].pixelData) { 26272 var enabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_6__["default"].cornerstone.getEnabledElement(eventData.element); 26273 var enabledElementUID = enabledElement.uuid; // Clear cache for this color to avoid flickering. 26274 26275 var imageBitmapCacheForElement = brushModule.getters.imageBitmapCacheForElement(enabledElementUID); 26276 26277 if (imageBitmapCacheForElement) { 26278 imageBitmapCacheForElement[segmentationIndex] = null; 26279 } // Add a new pixelData array.
26280 26281 26282 toolData[segmentationIndex].pixelData = new Uint8ClampedArray(eventData.image.width * eventData.image.height); 26283 } 26284 26285 var toolDataI = toolData[segmentationIndex]; // Draw / Erase the active color. 26286 26287 drawBrushPixels(pointerArray, toolDataI, columns, shouldErase); 26288 toolDataI.invalidated = true; 26289} 26290 26291function _isCtrlDown(eventData) { 26292 return eventData.event && eventData.event.ctrlKey || eventData.ctrlKey; 26293} 26294 26295/***/ }), 26296
26297/***/ "./tools/brush/index.js": 26298/*!******************************!*\ 26299 !*** ./tools/brush/index.js ***! 26300 \******************************/ 26301/*! exports provided: BrushTool, default */ 26302/***/ (function(module, __webpack_exports__, __webpack_require__) { 26303 26304"use strict"; 26305__webpack_require__.r(__webpack_exports__); 26306/* harmony import */ var _BrushTool_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./BrushTool.js */ "./tools/brush/BrushTool.js"); 26307/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "BrushTool", function() { return _BrushTool_js__WEBPACK_IMPORTED_MODULE_0__["default"]; }); 26308 26309 // Named Exports 26310 26311 // Namespace, default export 26312 26313/* harmony default export */ __webpack_exports__["default"] = ({ 26314 BrushTool: _BrushTool_js__WEBPACK_IMPORTED_MODULE_0__["default"] 26315}); 26316 26317/***/ }), 26318
26319/***/ "./tools/cursors/MouseCursor.js": 26320/*!**************************************!*\ 26321 !*** ./tools/cursors/MouseCursor.js ***! 26322 \**************************************/ 26323/*! exports provided: default */ 26324/***/ (function(module, __webpack_exports__, __webpack_require__) { 26325 26326"use strict"; 26327__webpack_require__.r(__webpack_exports__); 26328/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return MouseCursor; }); 26329/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js"); 26330/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); 26331/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js"); 26332/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); 26333/* harmony import */ var _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../stateManagement/toolColors.js */ "./stateManagement/toolColors.js"); 26334/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../store/index.js */ "./store/index.js"); 26335 26336 26337 26338 26339var cursorModule = _store_index_js__WEBPACK_IMPORTED_MODULE_3__["modules"].cursor; 26340/* 26341MACROS - The following keys will have the appropriate value injected when 26342an SVG is requested: 26343 26344- ACTIVE_COLOR => options.activeColor || toolColors.getActiveColor(); 26345- TOOL_COLOR => options.toolColor || toolColors.getToolColor(); 26346- FILL_COLOR => options.fillColor || toolColors.getFillColor(); 26347*/ 26348 26349var MouseCursor = 26350/*#__PURE__*/ 26351function () { 26352 function MouseCursor(iconGroupString, options) { 26353 _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, MouseCursor); 26354 26355 this.iconGroupString = iconGroupString; 26356 this.options = Object.assign({}, cursorModule.getters.defaultOptions(), options); 26357 } 26358 /** 26359 * getIconSVG - Returns an SVG of the icon only. 26360 * 26361 * @param {Object} options An object which overrides default properties 26362 * of the returned SVG. 26363 * @returns {Blob} The SVG of the icon. 26364 */ 26365 26366 26367 _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(MouseCursor, [{ 26368 key: "getIconSVG", 26369 value: function getIconSVG() { 26370 var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 26371 26372 var svgString = this._generateIconSVGString(options); 26373 26374 return new Blob([svgString], { 26375 type: 'image/svg+xml' 26376 }); 26377 } 26378 /** 26379 * getIconSVGString - Returns a string representation of the SVG of the icon only. 26380 * 26381 * @param {Object} options An object which overrides default properties 26382 * of the returned SVG. 26383 * @returns {string} The stringified SVG of the icon. 26384 */ 26385 26386 }, { 26387 key: "getIconSVGString", 26388 value: function getIconSVGString() { 26389 var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 26390 return this._generateIconSVGString(options); 26391 } 26392 /** 26393 * getIconWithPointerSVG - Returns an SVG of the icon + pointer. 26394 * 26395 * @param {Object} options An object which overrides default properties 26396 * of the returned SVG. 26397 * @returns {Blob} The SVG of the icon + pointer.. 26398 */ 26399 26400 }, { 26401 key: "getIconWithPointerSVG", 26402 value: function getIconWithPointerSVG() { 26403 var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 26404 26405 var svgString = this._generateIconWithPointerSVGString(options); 26406 26407 return new Blob([svgString], { 26408 type: 'image/svg+xml' 26409 }); 26410 } 26411 /** 26412 * getIconWithPointerString - Returns a string representation of the SVG 26413 * of the icon + pointer. 26414 * 26415 * @param {Object} options An object which overrides default properties 26416 * of the returned SVG. 26417 * @returns {string} The stringified SVG of the icon + pointer. 26418 */ 26419 26420 }, { 26421 key: "getIconWithPointerString", 26422 value: function getIconWithPointerString() { 26423 var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 26424 return this._generateIconWithPointerSVGString(options); 26425 } 26426 /** 26427 * get mousePoint - Returns the mousePoint as a space seperated string. 26428 * 26429 * @returns {string} The mousePoint. 26430 */ 26431 26432 }, { 26433 key: "_generateIconWithPointerSVGString", 26434 26435 /** 26436 * _generateIconWithPointerSVGString - Generates a string representation of 26437 * the icon + pointer. 26438 * 26439 * @param {Object} options An object which overrides default properties 26440 * of the returned string. 26441 * @returns {string} The SVG as a string. 26442 */ 26443 value: function _generateIconWithPointerSVGString() { 26444 var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 26445 var svgOptions = Object.assign({}, this.options, options); 26446 var mousePointerGroupString = svgOptions.mousePointerGroupString, 26447 iconSize = svgOptions.iconSize,
26448 viewBox = svgOptions.viewBox; 26449 var scale = iconSize / Math.max(viewBox.x, viewBox.y); 26450 var svgSize = 16 + iconSize; 26451 var svgString = "\n <svg\n data-icon=\"cursor\" role=\"img\" xmlns=\"http://www.w3.org/2000/svg\"\n width=\"".concat(svgSize, "\" height=\"").concat(svgSize, "\" viewBox=\"0 0 ").concat(svgSize, " ").concat(svgSize, "\"\n >\n <g>\n ").concat(mousePointerGroupString, "\n </g>\n <g transform=\"translate(16, 16) scale(").concat(scale, ")\">\n ").concat(this.iconGroupString, "\n </g>\n </svg>"); 26452 return this._injectColors(svgString, svgOptions); 26453 } 26454 /** 26455 * _generateIconSVGString - Generates a string representation of the icon. 26456 * 26457 * @param {Object} options An object which overrides default properties 26458 * of the returned string. 26459 * @returns {string} The SVG as a string. 26460 */ 26461 26462 }, { 26463 key: "_generateIconSVGString", 26464 value: function _generateIconSVGString() { 26465 var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 26466 var svgOptions = Object.assign({}, this.options, options); 26467 var iconSize = svgOptions.iconSize,
26468 viewBox = svgOptions.viewBox; 26469 var svgString = "\n <svg\n data-icon=\"cursor\" role=\"img\" xmlns=\"http://www.w3.org/2000/svg\"\n width=\"".concat(iconSize, "\" height=\"").concat(iconSize, "\" viewBox=\"0 0\n ").concat(viewBox.x, " ").concat(viewBox.y, "\"\n >\n ").concat(this.iconGroupString, "\n </svg>"); 26470 return this._injectColors(svgString, svgOptions); 26471 } 26472 /** 26473 * _injectColors - Replaces ACTIVE_COLOR, TOOL_COLOR and FILL_COLOR in 26474 * svgString with their appropriate values. 26475 * 26476 * @param {string} svgString The string to modify. 26477 * @param {Object} options Optional overrides for the colors. 26478 * @returns {string} The string with color values injected. 26479 */ 26480 26481 }, { 26482 key: "_injectColors", 26483 value: function _injectColors(svgString) { 26484 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; 26485 var activeColor = options.activeColor || _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_2__["default"].getActiveColor(); 26486 var toolColor = options.toolColor || _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_2__["default"].getToolColor(); 26487 var fillColor = options.fillColor || _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_2__["default"].getFillColor(); 26488 return svgString.replace(/ACTIVE_COLOR/g, "".concat(activeColor)).replace(/TOOL_COLOR/g, "".concat(toolColor)).replace(/FILL_COLOR/g, "".concat(fillColor)); 26489 } 26490 }, { 26491 key: "mousePoint", 26492 get: function get() { 26493 var mousePoint = this.options.mousePoint; 26494 return "".concat(mousePoint.x, " ").concat(mousePoint.y); 26495 } 26496 }]); 26497 26498 return MouseCursor; 26499}(); 26500 26501 26502 26503/***/ }), 26504
26505/***/ "./tools/cursors/index.js": 26506/*!********************************!*\ 26507 !*** ./tools/cursors/index.js ***! 26508 \********************************/ 26509/*! exports provided: angleCursor, arrowAnnotateCursor, bidirectionalCursor, cobbAngleCursor, circleRoiCursor, ellipticalRoiCursor, freehandMouseCursor, freehandSculpterMouseCursor, lengthCursor, probeCursor, rectangleRoiCursor, textMarkerCursor, crosshairsCursor, eraserCursor, magnifyCursor, panCursor, rotateCursor, stackScrollCursor, wwwcRegionCursor, wwwcCursor, zoomCursor */ 26510/***/ (function(module, __webpack_exports__, __webpack_require__) { 26511 26512"use strict"; 26513__webpack_require__.r(__webpack_exports__); 26514/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "angleCursor", function() { return angleCursor; }); 26515/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "arrowAnnotateCursor", function() { return arrowAnnotateCursor; }); 26516/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bidirectionalCursor", function() { return bidirectionalCursor; }); 26517/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "cobbAngleCursor", function() { return cobbAngleCursor; }); 26518/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "circleRoiCursor", function() { return circleRoiCursor; }); 26519/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ellipticalRoiCursor", function() { return ellipticalRoiCursor; }); 26520/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "freehandMouseCursor", function() { return freehandMouseCursor; }); 26521/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "freehandSculpterMouseCursor", function() { return freehandSculpterMouseCursor; }); 26522/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "lengthCursor", function() { return lengthCursor; }); 26523/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "probeCursor", function() { return probeCursor; }); 26524/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "rectangleRoiCursor", function() { return rectangleRoiCursor; }); 26525/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "textMarkerCursor", function() { return textMarkerCursor; }); 26526/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "crosshairsCursor", function() { return crosshairsCursor; }); 26527/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "eraserCursor", function() { return eraserCursor; }); 26528/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "magnifyCursor", function() { return magnifyCursor; }); 26529/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "panCursor", function() { return panCursor; }); 26530/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "rotateCursor", function() { return rotateCursor; }); 26531/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "stackScrollCursor", function() { return stackScrollCursor; }); 26532/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "wwwcRegionCursor", function() { return wwwcRegionCursor; }); 26533/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "wwwcCursor", function() { return wwwcCursor; }); 26534/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "zoomCursor", function() { return zoomCursor; }); 26535/* harmony import */ var _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./MouseCursor.js */ "./tools/cursors/MouseCursor.js"); 26536 26537/* 26538MACROS: 26539 26540The following keys will have the appropriate value injected by the MouseCursor 26541class when an SVG is requested: 26542 26543- ACTIVE_COLOR => options.activeColor || toolColors.getActiveColor(); 26544- TOOL_COLOR => options.toolColor || toolColors.getToolColor(); 26545- FILL_COLOR => options.fillColor || toolColors.getFillColor(); 26546*/ 26547 26548var angleCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("<path fill=\"ACTIVE_COLOR\" d=\"M1203 544q0 13-10 23l-393 393 393 393q10 10 10 23t-10 23l-50\n 50q-10 10-23 10t-23-10l-466-466q-10-10-10-23t10-23l466-466q10-10 23-10t23\n 10l50 50q10 10 10 23z\"\n />", { 26549 viewBox: { 26550 x: 1792, 26551 y: 1792 26552 } 26553}); 26554var arrowAnnotateCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("<g id=\"arrowAnnotate-group\" fill=\"none\" stroke-width=\"1\" stroke=\"ACTIVE_COLOR\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path id=\"arrowAnnotate-arrow\" d=\"M23,7 l-15,15 M7,17 l0,6 6,0\" stroke-width=\"2\" />\n </g>", { 26555 viewBox: { 26556 x: 24, 26557 y: 24 26558 } 26559}); 26560var bidirectionalCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("<g fill=\"ACTIVE_COLOR\" stroke-width=\"3\" stroke=\"ACTIVE_COLOR\">\n <path d=\"M27.63 3.21L3.12 28.81\"></path>\n <path d=\"M27.63 15.75L15.27 4.43\"></path>\n <path d=\"M16.5 4.28C16.5 4.96 15.95 5.51 15.27 5.51C14.59 5.51 14.03 4.96 14.03 4.28C14.03 3.59 14.59 3.04 15.27 3.04C15.95 3.04 16.5 3.59 16.5 4.28Z\" ></path>\n <path d=\"M28.87 3.19C28.87 3.87 28.31 4.43 27.63 4.43C26.95 4.43 26.4 3.87 26.4 3.19C26.4 2.51 26.95 1.95 27.63 1.95C28.31 1.95 28.87 2.51 28.87 3.19Z\"></path>\n <path d=\"M28.87 15.75C28.87 16.43 28.31 16.99 27.63 16.99C26.95 16.99 26.4 16.43 26.4 15.75C26.4 15.07 26.95 14.51 27.63 14.51C28.31 14.51 28.87 15.07 28.87 15.75Z\"></path>\n <path d=\"M4.73 28.44C4.73 29.12 4.17 29.68 3.49 29.68C2.81 29.68 2.25 29.12 2.25 28.44C2.25 27.76 2.81 27.2 3.49 27.2C4.17 27.2 4.73 27.76 4.73 28.44Z\"></path>\n </g>", { 26561 viewBox: { 26562 x: 48, 26563 y: 48 26564 } 26565}); 26566var cobbAngleCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("<g stroke=\"ACTIVE_COLOR\" stroke-width=\"3\">
26566\n <path d=\"M28.59 2.34L3.82 12.32\"></path>\n <path d=\"M28.59 29.66L3.82 19.68\"></path>\n <path stroke-dasharray=\"2\" fill-opacity=\"0\" d=\"M12.37\n 23.06C12.67 22.36 12.85 21.93 12.92 21.76C14.6 17.8 14.68 13.35 13.15\n 9.33C13.11 9.24 13.02 9 12.88 8.63\">\n </path>\n </g>", { 26567 viewBox: { 26568 x: 32, 26569 y: 32 26570 } 26571}); 26572var circleRoiCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("<circle stroke=\"ACTIVE_COLOR\" fill=\"none\" stroke-width=\"3\" cx=\"16\" cy=\"16\" r=\"14\" />", { 26573 viewBox: { 26574 x: 32, 26575 y: 32 26576 } 26577}); 26578var ellipticalRoiCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("<path stroke=\"ACTIVE_COLOR\" fill=\"none\" stroke-width=\"3\" d=\"M30.74 15.76C30.74 20.99 24.14 25.23 16\n 25.23C7.86 25.23 1.26 20.99 1.26 15.76C1.26 10.54 7.86 6.3 16 6.3C24.14\n 6.3 30.74 10.54 30.74 15.76Z\"\n />", { 26579 viewBox: { 26580 x: 32, 26581 y: 32 26582 } 26583}); 26584var freehandMouseCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("\n <g fill=\"ACTIVE_COLOR\" stroke=\"ACTIVE_COLOR\" stroke-width=\"2\">\n <ellipse ry=\"1\" rx=\"1\" id=\"svg_3\" cy=\"4.240343\" cx=\"14.306499\"/>\n <line id=\"svg_4\" y2=\"3.58462\" x2=\"12.242186\" y1=\"3.997482\" x1=\"13.432202\"/>\n <line id=\"svg_5\" y2=\"3.268901\" x2=\"10.857882\" y1=\"3.608906\" x1=\"12.387902\"/>\n <line id=\"svg_6\" y2=\"3.147471\" x2=\"9.740724\" y1=\"3.293187\" x1=\"10.955026\"/>\n <line id=\"svg_7\" y2=\"3.147471\" x2=\"8.089274\" y1=\"3.196043\" x1=\"9.983585\"/>\n <line id=\"svg_8\" y2=\"3.268901\" x2=\"6.874972\" y1=\"3.123185\" x1=\"8.307848\"/>\n <line id=\"svg_9\" y2=\"3.657478\" x2=\"5.587812\" y1=\"3.220329\" x1=\"7.020688\"/>\n <line id=\"svg_10\" y2=\"4.046054\" x2=\"4.737801\" y1=\"3.560334\" x1=\"5.854959\"/>\n <line id=\"svg_11\" y2=\"4.337487\" x2=\"4.300652\" y1=\"3.997482\" x1=\"4.834945\"/>\n <line id=\"svg_12\" y2=\"4.726063\" x2=\"3.88779\" y1=\"4.191771\" x1=\"4.470655\"/>\n <line id=\"svg_15\" y2=\"5.3575\" x2=\"3.377783\" y1=\"4.604633\" x1=\"3.960648\"/>\n <line id=\"svg_16\" y2=\"6.183226\" x2=\"2.916348\" y1=\"5.138926\" x1=\"3.547785\"/>\n <line id=\"svg_17\" y2=\"6.960379\" x2=\"2.770632\" y1=\"5.867507\" x1=\"3.037779\"/>\n <line id=\"svg_18\" y2=\"7.713246\" x2=\"2.673488\" y1=\"6.741804\" x1=\"2.819204\"/>\n <line id=\"svg_19\" y2=\"8.684687\" x2=\"2.697774\" y1=\"7.616102\" x1=\"2.673488\"/>\n <line id=\"svg_20\" y2=\"9.753273\" x2=\"2.892062\" y1=\"8.611829\" x1=\"2.697774\"/>\n <line id=\"svg_21\" y2=\"10.724714\" x2=\"3.134923\" y1=\"9.534698\" x1=\"2.84349\"/>\n <line id=\"svg_23\" y2=\"11.647583\" x2=\"3.596357\" y1=\"10.578998\" x1=\"3.086351\"/>\n <line id=\"svg_25\" y2=\"12.521881\" x2=\"4.276366\" y1=\"11.501867\" x1=\"3.499213\"/>\n <line id=\"svg_26\" y2=\"13.930471\" x2=\"5.830673\" y1=\"12.376165\" x1=\"4.13065\"/>\n <line id=\"svg_28\" y2=\"14.707624\" x2=\"7.263549\" y1=\"13.881899\" x1=\"5.733528\"/>\n <line id=\"svg_29\" y2=\"15.339061\" x2=\"8.963571\" y1=\"14.61048\" x1=\"7.06926\"/>\n <line id=\"svg_30\" y2=\"15.581921\" x2=\"10.882168\" y1=\"15.314775\" x1=\"8.817855\"/>\n <line id=\"svg_31\" y2=\"15.460491\" x2=\"12.023612\" y1=\"15.581921\" x1=\"10.785024\"/>\n <line id=\"svg_33\" y2=\"15.120487\" x2=\"13.092197\" y1=\"15.484777\" x1=\"11.877895\"/>\n <line id=\"svg_34\" y2=\"14.586194\" x2=\"13.86935\" y1=\"15.217631\" x1=\"12.897909\"/>\n <line id=\"svg_35\" y2=\"13.833327\" x2=\"14.597931\" y1=\"14.756196\" x1=\"13.699348\"/>\n <line id=\"svg_37\" y2=\"12.716169\" x2=\"15.180796\" y1=\"13.881899\" x1=\"14.549359\"/>\n <line id=\"svg_39\" y2=\"11.429009\" x2=\"15.520801\" y1=\"12.813313\" x1=\"15.15651\"/>\n <ellipse ry=\"1\" rx=\"1\" id=\"svg_40\" cy=\"10.967574\" cx=\"15.520801\"/>\n </g>", { 26585 viewBox: { 26586 x: 18, 26587 y: 18 26588 } 26589}); 26590var freehandSculpterMouseCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("<g id=\"icon-freehand-sculpt\" fill=\"none\" stroke-width=\"1.5\" stroke=\"ACTIVE_COLOR\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <line id=\"svg_1\" y2=\"2.559367\" x2=\"10.184807\" y1=\"4.467781\" x1=\"8.81711\"/>\n <line id=\"svg_4\" y2=\"1.493836\" x2=\"11.727442\" y1=\"2.766112\" x1=\"10.089386\"/>\n <line id=\"svg_7\" y2=\"1.080346\" x2=\"13.047428\" y1=\"1.748291\" x1=\"11.345759\"/>\n <line id=\"svg_8\" y2=\"1.000829\" x2=\"14.351511\" y1=\"1.112153\" x1=\"12.77707\"/>\n <line id=\"svg_9\" y2=\"1.350705\" x2=\"15.242104\" y1=\"0.905408\" x1=\"13.969828\"/>\n <line id=\"svg_10\" y2=\"2.098167\" x2=\"15.862339\" y1=\"1.14396\" x1=\"14.955842\"/>\n <line id=\"svg_11\" y2=\"3.195505\" x2=\"16.41896\" y1=\"1.939133\" x1=\"15.766918\"/>\n <line id=\"svg_12\" y2=\"4.292843\" x2=\"16.530284\" y1=\"2.925147\" x1=\"16.387153\"/>\n <line id=\"svg_16\" y2=\"5.644637\" x2=\"16.196311\" y1=\"3.831643\" x1=\"16.593898\"/>\n <line id=\"svg_18\" y2=\"7.266789\" x2=\"15.623787\" y1=\"5.19934\" x1=\"16.275829\"/>\n <line id=\"svg_19\" y2=\"10.813258\" x2=\"14.526449\" y1=\"6.726071\" x1=\"15.766918\"/>\n <line id=\"svg_20\" y2=\"5.056209\" x2=\"8.085552\" y1=\"4.181519\" x1=\"8.976145\"/>\n <line id=\"svg_23\" y2=\"5.326568\" x2=\"7.481221\" y1=\"4.78585\" x1=\"8.403621\"/>\n <line id=\"svg_24\" y2=\"5.565119\" x2=\"6.749662\" y1=\"5.294761\" x1=\"7.624352\"/>\n <line id=\"svg_25\" y2=\"5.994512\" x2=\"5.429675\" y1=\"5.533312\" x1=\"6.956407\"/>\n <line id=\"svg_27\" y2=\"6.551133\" x2=\"4.284627\" y1=\"5.962706\" x1=\"5.572807\"/>\n <line id=\"svg_28\" y2=\"7.584858\" x2=\"3.044158\" y1=\"6.392099\" x1=\"4.427758\"/>\n <line id=\"svg_29\" y2=\"8.84123\" x2=\"2.185372\" y1=\"7.489437\" x1=\"3.219096\"/>\n <line id=\"svg_31\" y2=\"10.606513\" x2=\"1.644654\" y1=\"8.602678\" x1=\"2.280792\"/>\n <line id=\"svg_32\" y2=\"13.214679\" x2=\"1.48562\" y1=\"10.352058\" x1=\"1.724171\"/>\n <line id=\"svg_33\" y2=\"14.375631\" x2=\"1.676461\" y1=\"12.992031\" x1=\"1.453813\"/>\n <line id=\"svg_34\" y2=\"15.298031\" x2=\"2.264889\" y1=\"14.152983\" x1=\"1.517427\"/>\n <line id=\"svg_35\" y2=\"16.172721\" x2=\"3.521261\" y1=\"14.948155\" x1=\"1.915013\"/>\n <line id=\"svg_36\" y2=\"16.824762\" x2=\"5.207027\" y1=\"15.997783\" x1=\"3.28271\"/>\n <line id=\"svg_38\" y2=\"17.063314\" x2=\"7.035924\" y1=\"16.745245\" x1=\"4.968475\"/>\n <line id=\"svg_39\" y2=\"16.888376\" x2=\"9.278311\" y1=\"17.047411\" x1=\"6.733758\"/>\n <line id=\"svg_40\" y2=\"16.284045\" x2=\"10.661911\" y1=\"16.983797\" x1=\"8.992048\"/>\n <line id=\"svg_41\" y2=\"15.313934\" x2=\"11.647925\" y1=\"16.395369\" x1=\"10.455166\"/>\n <line id=\"svg_44\" y2=\"13.898527\" x2=\"12.82478\" y1=\"15.425259\" x1=\"11.504794\"/>\n <line id=\"svg_45\" y2=\"12.037824\" x2=\"14.144766\" y1=\"14.312017\" x1=\"12.522614\"/>
26590\n <line id=\"svg_47\" y2=\"10.59061\" x2=\"14.605966\" y1=\"12.228665\" x1=\"13.953925\"/>\n <ellipse ry=\"1\" rx=\"1\" id=\"svg_48\" cy=\"3.982726\" cx=\"13.460918\"/>\n </g>", { 26591 viewBox: { 26592 x: 18, 26593 y: 18 26594 } 26595}); 26596var lengthCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("<g id=\"length-group\" fill=\"none\" stroke-width=\"1\" stroke=\"ACTIVE_COLOR\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path id=\"length-dashes\" d=\"m22.5,6 -16.5,16.5\" stroke-width=\"3\" stroke-dasharray=\"0.6666,5\" />\n </g>", { 26597 viewBox: { 26598 x: 24, 26599 y: 24 26600 } 26601}); 26602var probeCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("<path fill=\"ACTIVE_COLOR\" d=\"M1152 896q0 106-75 181t-181 75-181-75-75-181 75-181 181-75 181 75\n 75 181zm-256-544q-148 0-273 73t-198 198-73 273 73 273 198 198 273 73 273-73\n 198-198 73-273-73-273-198-198-273-73zm768 544q0 209-103 385.5t-279.5\n 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5\n 385.5-103 385.5 103 279.5 279.5 103 385.5z\"\n />", { 26603 viewBox: { 26604 x: 1792, 26605 y: 1792 26606 } 26607}); 26608var rectangleRoiCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("<path fill=\"ACTIVE_COLOR\" d=\"M1312 256h-832q-66 0-113 47t-47 113v832q0 66 47\n 113t113 47h832q66 0 113-47t47-113v-832q0-66-47-113t-113-47zm288 160v832q0\n 119-84.5 203.5t-203.5 84.5h-832q-119 0-203.5-84.5t-84.5-203.5v-832q0-119\n 84.5-203.5t203.5-84.5h832q119 0 203.5 84.5t84.5 203.5z\"\n />", { 26609 viewBox: { 26610 x: 1792, 26611 y: 1792 26612 } 26613}); 26614var textMarkerCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("<path fill=\"ACTIVE_COLOR\" d=\"M789 559l-170 450q33 0 136.5 2t160.5 2q19 0\n 57-2-87-253-184-452zm-725 1105l2-79q23-7 56-12.5t57-10.5 49.5-14.5 44.5-29\n 31-50.5l237-616 280-724h128q8 14 11 21l205 480q33 78 106 257.5t114 274.5q15\n 34 58 144.5t72 168.5q20 45 35 57 19 15 88 29.5t84 20.5q6 38 6 57 0 5-.5\n 13.5t-.5 12.5q-63 0-190-8t-191-8q-76 0-215 7t-178 8q0-43 4-78l131-28q1 0\n 12.5-2.5t15.5-3.5 14.5-4.5 15-6.5 11-8 9-11\n 2.5-14q0-16-31-96.5t-72-177.5-42-100l-450-2q-26 58-76.5 195.5t-50.5 162.5q0\n 22 14 37.5t43.5 24.5 48.5 13.5 57 8.5 41 4q1 19 1 58 0 9-2 27-58\n 0-174.5-10t-174.5-10q-8 0-26.5 4t-21.5 4q-80 14-188 14z\"\n />", { 26615 viewBox: { 26616 x: 1792, 26617 y: 1792 26618 } 26619}); 26620var crosshairsCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("<path fill=\"ACTIVE_COLOR\" d=\"M1325 1024h-109q-26 0-45-19t-19-45v-128q0-26\n 19-45t45-19h109q-32-108-112.5-188.5t-188.5-112.5v109q0 26-19 45t-45\n 19h-128q-26 0-45-19t-19-45v-109q-108 32-188.5 112.5t-112.5 188.5h109q26\n 0 45 19t19 45v128q0 26-19 45t-45 19h-109q32 108 112.5 188.5t188.5\n 112.5v-109q0-26 19-45t45-19h128q26 0 45 19t19 45v109q108-32\n 188.5-112.5t112.5-188.5zm339-192v128q0 26-19 45t-45 19h-143q-37 161-154.5\n 278.5t-278.5 154.5v143q0 26-19 45t-45 19h-128q-26\n 0-45-19t-19-45v-143q-161-37-278.5-154.5t-154.5-278.5h-143q-26\n 0-45-19t-19-45v-128q0-26 19-45t45-19h143q37-161\n 154.5-278.5t278.5-154.5v-143q0-26 19-45t45-19h128q26 0 45 19t19 45v143q161\n 37 278.5 154.5t154.5 278.5h143q26 0 45 19t19 45z\"\n />", { 26621 viewBox: { 26622 x: 1792, 26623 y: 1792 26624 } 26625}); 26626var eraserCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("<path transform=\"translate(0,1792) scale(1,-1)\" fill=\"ACTIVE_COLOR\" d=\"M960 1408l336-384h-768l-336 384h768zm1013-1077q15\n 34 9.5 71.5t-30.5 65.5l-896 1024q-38 44-96 44h-768q-38\n 0-69.5-20.5t-47.5-54.5q-15-34-9.5-71.5t30.5-65.5l896-1024q38-44 96-44h768q38\n 0 69.5 20.5t47.5 54.5z\"\n />", { 26627 viewBox: { 26628 x: 2048, 26629 y: 1792 26630 } 26631}); 26632var magnifyCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("<path fill=\"ACTIVE_COLOR\" d=\"M508.5 481.6l-129-129c-2.3-2.3-5.3-3.5-8.5-3.5h-10.3C395\n 312 416 262.5 416 208 416 93.1 322.9 0 208 0S0 93.1 0 208s93.1 208 208 208c54.5\n 0 104-21 141.1-55.2V371c0 3.2 1.3 6.2 3.5 8.5l129 129c4.7 4.7 12.3 4.7 17\n 0l9.9-9.9c4.7-4.7 4.7-12.3 0-17zM208 384c-97.3 0-176-78.7-176-176S110.7 32 208\n 32s176 78.7 176 176-78.7 176-176 176z\"\n />", { 26633 viewBox: { 26634 x: 512, 26635 y: 512 26636 } 26637}); 26638var panCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("<path fill=\"ACTIVE_COLOR\" d=\"M1411 541l-355 355 355 355 144-144q29-31 70-14 39 17\n 39 59v448q0 26-19 45t-45 19h-448q-42 0-59-40-17-39 14-69l144-144-355-35
266385-355\n 355 144 144q31 30 14 69-17 40-59 40h-448q-26 0-45-19t-19-45v-448q0-42 40-59\n 39-17 69 14l144 144 355-355-355-355-144 144q-19 19-45 19-12\n 0-24-5-40-17-40-59v-448q0-26 19-45t45-19h448q42 0 59 40 17 39-14 69l-144\n 144 355 355 355-355-144-144q-31-30-14-69 17-40 59-40h448q26 0 45 19t19\n 45v448q0 42-39 59-13 5-25 5-26 0-45-19z\"\n />", { 26639 viewBox: { 26640 x: 1792, 26641 y: 1792 26642 } 26643}); 26644var rotateCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("<path fill=\"ACTIVE_COLOR\" d=\"M1664 256v448q0 26-19 45t-45 19h-448q-42 0-59-40-17-39\n 14-69l138-138q-148-137-349-137-104 0-198.5 40.5t-163.5 109.5-109.5\n 163.5-40.5 198.5 40.5 198.5 109.5 163.5 163.5 109.5 198.5 40.5q119 0\n 225-52t179-147q7-10 23-12 15 0 25 9l137 138q9 8 9.5 20.5t-7.5 22.5q-109\n 132-264 204.5t-327 72.5q-156 0-298-61t-245-164-164-245-61-298 61-298\n 164-245 245-164 298-61q147 0 284.5 55.5t244.5 156.5l130-129q29-31 70-14\n 39 17 39 59z\"\n />", { 26645 viewBox: { 26646 x: 1792, 26647 y: 1792 26648 } 26649}); 26650var stackScrollCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("<path fill=\"ACTIVE_COLOR\" d=\"M24 21v2c0 0.547-0.453 1-1 1h-22c-0.547\n 0-1-0.453-1-1v-2c0-0.547 0.453-1 1-1h22c0.547 0 1 0.453 1 1zM24 13v2c0\n 0.547-0.453 1-1 1h-22c-0.547 0-1-0.453-1-1v-2c0-0.547 0.453-1 1-1h22c0.547\n 0 1 0.453 1 1zM24 5v2c0 0.547-0.453 1-1 1h-22c-0.547\n 0-1-0.453-1-1v-2c0-0.547 0.453-1 1-1h22c0.547 0 1 0.453 1 1z\"\n />", { 26651 viewBox: { 26652 x: 24, 26653 y: 28 26654 } 26655}); 26656var wwwcRegionCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("<path fill=\"ACTIVE_COLOR\" d=\"M1664 416v960q0 119-84.5 203.5t-203.5 84.5h-960q-119\n 0-203.5-84.5t-84.5-203.5v-960q0-119 84.5-203.5t203.5-84.5h960q119 0 203.5\n 84.5t84.5 203.5z\"\n />", { 26657 viewBox: { 26658 x: 1792, 26659 y: 1792 26660 } 26661}); 26662var wwwcCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("<path fill=\"ACTIVE_COLOR\" d=\"M14.5,3.5 a1 1 0 0 1 -11,11 Z\" stroke=\"none\" opacity=\"0.8\" />\n <circle cx=\"9\" cy=\"9\" r=\"8\" fill=\"none\" stroke-width=\"2\" stroke=\"ACTIVE_COLOR\" />", { 26663 viewBox: { 26664 x: 18, 26665 y: 18 26666 } 26667}); 26668var zoomCursor = new _MouseCursor_js__WEBPACK_IMPORTED_MODULE_0__["default"]("<path fill=\"ACTIVE_COLOR\" d=\"M508.5 481.6l-129-129c-2.3-2.3-5.3-3.5-8.5-3.5h-10.3C395\n 312 416 262.5 416 208 416 93.1 322.9 0 208 0S0 93.1 0 208s93.1 208 208 208c54.5\n 0 104-21 141.1-55.2V371c0 3.2 1.3 6.2 3.5 8.5l129 129c4.7 4.7 12.3 4.7 17\n 0l9.9-9.9c4.7-4.7 4.7-12.3 0-17zM208 384c-97.3 0-176-78.7-176-176S110.7 32 208\n 32s176 78.7 176 176-78.7 176-176 176z\"\n />\n <path fill=\"ACTIVE_COLOR\" transform=\"scale(0.22,0.22) translate(1400,0)\" d=\"M1216\n 320q0 26-19 45t-45 19h-128v1024h128q26 0 45 19t19 45-19 45l-256 256q-19\n 19-45 19t-45-19l-256-256q-19-19-19-45t19-45 45-19h128v-1024h-128q-26\n 0-45-19t-19-45 19-45l256-256q19-19 45-19t45 19l256 256q19 19 19 45z\"\n />", { 26669 viewBox: { 26670 x: 640, 26671 y: 512 26672 } 26673}); 26674 26675/***/ }), 26676
26677/***/ "./tools/index.js": 26678/*!************************!*\ 26679 !*** ./tools/index.js ***! 26680 \************************/ 26681/*! exports provided: CrosshairsTool, DoubleTapFitToWindowTool, DragProbeTool, EraserTool, FreehandSculpterMouseTool, MagnifyTool, PanMultiTouchTool, PanTool, ReferenceLinesTool, RotateTool, RotateTouchTool, ScaleOverlayTool, StackScrollMouseWheelTool, StackScrollMultiTouchTool, StackScrollTool, WwwcRegionTool, WwwcTool, ZoomMouseWheelTool, ZoomTool, ZoomTouchPinchTool, default */ 26682/***/ (function(module, __webpack_exports__, __webpack_require__) { 26683 26684"use strict"; 26685__webpack_require__.r(__webpack_exports__); 26686/* harmony import */ var _CrosshairsTool_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./CrosshairsTool.js */ "./tools/CrosshairsTool.js"); 26687/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "CrosshairsTool", function() { return _CrosshairsTool_js__WEBPACK_IMPORTED_MODULE_0__["default"]; }); 26688 26689/* harmony import */ var _DoubleTapFitToWindowTool_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./DoubleTapFitToWindowTool.js */ "./tools/DoubleTapFitToWindowTool.js"); 26690/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "DoubleTapFitToWindowTool", function() { return _DoubleTapFitToWindowTool_js__WEBPACK_IMPORTED_MODULE_1__["default"]; }); 26691 26692/* harmony import */ var _DragProbeTool_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./DragProbeTool.js */ "./tools/DragProbeTool.js"); 26693/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "DragProbeTool", function() { return _DragProbeTool_js__WEBPACK_IMPORTED_MODULE_2__["default"]; }); 26694 26695/* harmony import */ var _EraserTool_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./EraserTool.js */ "./tools/EraserTool.js"); 26696/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "EraserTool", function() { return _EraserTool_js__WEBPACK_IMPORTED_MODULE_3__["default"]; }); 26697 26698/* harmony import */ var _FreehandSculpterMouseTool_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./FreehandSculpterMouseTool.js */ "./tools/FreehandSculpterMouseTool.js"); 26699/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "FreehandSculpterMouseTool", function() { return _FreehandSculpterMouseTool_js__WEBPACK_IMPORTED_MODULE_4__["default"]; }); 26700 26701/* harmony import */ var _MagnifyTool_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./MagnifyTool.js */ "./tools/MagnifyTool.js"); 26702/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "MagnifyTool", function() { return _MagnifyTool_js__WEBPACK_IMPORTED_MODULE_5__["default"]; }); 26703 26704/* harmony import */ var _PanMultiTouchTool_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./PanMultiTouchTool.js */ "./tools/PanMultiTouchTool.js"); 26705/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "PanMultiTouchTool", function() { return _PanMultiTouchTool_js__WEBPACK_IMPORTED_MODULE_6__["default"]; }); 26706 26707/* harmony import */ var _PanTool_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./PanTool.js */ "./tools/PanTool.js"); 26708/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "PanTool", function() { return _PanTool_js__WEBPACK_IMPORTED_MODULE_7__["default"]; }); 26709 26710/* harmony import */ var _ReferenceLinesTool_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./ReferenceLinesTool.js */ "./tools/ReferenceLinesTool.js"); 26711/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ReferenceLinesTool", function() { return _ReferenceLinesTool_js__WEBPACK_IMPORTED_MODULE_8__["default"]; }); 26712 26713/* harmony import */ var _RotateTool_js__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./RotateTool.js */ "./tools/RotateTool.js"); 26714/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "RotateTool", function() { return _RotateTool_js__WEBPACK_IMPORTED_MODULE_9__["default"]; }); 26715 26716/* harmony import */ var _RotateTouchTool_js__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./RotateTouchTool.js */ "./tools/RotateTouchTool.js"); 26717/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "RotateTouchTool", function() { return _RotateTouchTool_js__WEBPACK_IMPORTED_MODULE_10__["default"]; }); 26718 26719/* harmony import */ var _ScaleOverlayTool_js__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ./ScaleOverlayTool.js */ "./tools/ScaleOverlayTool.js"); 26720/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ScaleOverlayTool", function() { return _ScaleOverlayTool_js__WEBPACK_IMPORTED_MODULE_11__["default"]; }); 26721 26722/* harmony import */ var _StackScrollMouseWheelTool_js__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./StackScrollMouseWheelTool.js */ "./tools/StackScrollMouseWheelTool.js"); 26723/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "StackScrollMouseWheelTool", function() { return _StackScrollMouseWheelTool_js__WEBPACK_IMPORTED_MODULE_12__["default"]; }); 26724 26725/* harmony import */ var _StackScrollMultiTouchTool_js__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./StackScrollMultiTouchTool.js */ "./tools/StackScrollMultiTouchTool.js"); 26726/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "StackScrollMultiTouchTool", function() { return _StackScrollMultiTouchTool_js__WEBPACK_IMPORTED_MODULE_13__["default"]; }); 26727 26728/* harmony import */ var _StackScrollTool_js__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ./StackScrollTool.js */ "./tools/StackScrollTool.js"); 26729/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "StackScrollTool", function() { return _StackScrollTool_js__WEBPACK_IMPORTED_MODULE_14__["default"]; }); 26730 26731/* harmony import */ var _WwwcRegionTool_js__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ./WwwcRegionTool.js */ "./tools/WwwcRegionTool.js"); 26732/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "WwwcRegionTool", function() { return _WwwcRegionTool_js__WEBPACK_IMPORTED_MODULE_15__["default"]; }); 26733 26734/* harmony import */ var _WwwcTool_js__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ./WwwcTool.js */ "./tools/WwwcTool.js"); 26735/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "WwwcTool", function() { return _WwwcTool_js__WEBPACK_IMPORTED_MODULE_16__["default"]; }); 26736 26737/* harmony import */ var _ZoomMouseWheelTool_js__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ./ZoomMouseWheelTool.js */ "./tools/ZoomMouseWheelTool.js"); 26738/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ZoomMouseWheelTool", function() { return _ZoomMouseWheelTool_js__WEBPACK_IMPORTED_MODULE_17__["default"]; }); 26739 26740/* harmony import */ var _ZoomTool_js__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ./ZoomTool.js */ "./tools/ZoomTool.js"); 26741/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ZoomTool", function() { return _ZoomTool_js__WEBPACK_IMPORTED_MODULE_18__["default"]; }); 26742 26743/* harmony import */ var _ZoomTouchPinchTool_js__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ./ZoomTouchPinchTool.js */ "./tools/ZoomTouchPinchTool.js"); 26744/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ZoomTouchPinchTool", function() { return _ZoomTouchPinchTool_js__WEBPACK_IMPORTED_MODULE_19__["default"]; }); 26745 26746 26747 26748 26749 26750 26751 26752 26753 26754 26755 26756 26757 26758 26759 26760 26761 26762 26763 26764 26765 // Named Exports 26766 26767 // Namespace, default export 26768 26769/* harmony default export */ __webpack_exports__["default"] = ({ 26770 CrosshairsTool: _CrosshairsTool_js__WEBPACK_IMPORTED_MODULE_0__["default"], 26771 DoubleTapFitToWindowTool: _DoubleTapFitToWindowTool_js__WEBPACK_IMPORTED_MODULE_1__["default"], 26772 DragProbeTool: _DragProbeTool_js__WEBPACK_IMPORTED_MODULE_2__["default"], 26773 EraserTool: _EraserTool_js__WEBPACK_IMPORTED_MODULE_3__["default"], 26774 FreehandSculpterMouseTool: _FreehandSculpterMouseTool_js__WEBPACK_IMPORTED_MODULE_4__["default"], 26775 MagnifyTool: _MagnifyTool_js__WEBPACK_IMPORTED_MODULE_5__["default"], 26776 PanMultiTouchTool: _PanMultiTouchTool_js__WEBPACK_IMPORTED_MODULE_6__["default"], 26777 PanTool: _PanTool_js__WEBPACK_IMPORTED_MODULE_7__["default"], 26778 ReferenceLinesTool: _ReferenceLinesTool_js__WEBPACK_IMPORTED_MODULE_8__["default"], 26779 RotateTool: _RotateTool_js__WEBPACK_IMPORTED_MODULE_9__["default"], 26780 RotateTouchTool: _RotateTouchTool_js__WEBPACK_IMPORTED_MODULE_10__["default"], 26781 ScaleOverlayTool: _ScaleOverlayTool_js__WEBPACK_IMPORTED_MODULE_11__["default"], 26782 StackScrollMouseWheelTool: _StackScrollMouseWheelTool_js__WEBPACK_IMPORTED_MODULE_12__["default"], 26783 StackScrollMultiTouchTool: _StackScrollMultiTouchTool_js__WEBPACK_IMPORTED_MODULE_13__["default"], 26784 StackScrollTool: _StackScrollTool_js__WEBPACK_IMPORTED_MODULE_14__["default"], 26785 WwwcRegionTool: _WwwcRegionTool_js__WEBPACK_IMPORTED_MODULE_15__["default"], 26786 WwwcTool: _WwwcTool_js__WEBPACK_IMPORTED_MODULE_16__["default"], 26787 ZoomMouseWheelTool: _ZoomMouseWheelTool_js__WEBPACK_IMPORTED_MODULE_17__["default"], 26788 ZoomTool: _ZoomTool_js__WEBPACK_IMPORTED_MODULE_18__["default"], 26789 ZoomTouchPinchTool: _ZoomTouchPinchTool_js__WEBPACK_IMPORTED_MODULE_19__["default"] 26790}); 26791 26792/***/ }), 26793
26794/***/ "./tools/referenceLines/calculateReferenceLine.js": 26795/*!********************************************************!*\ 26796 !*** ./tools/referenceLines/calculateReferenceLine.js ***! 26797 \********************************************************/ 26798/*! exports provided: default */ 26799/***/ (function(module, __webpack_exports__, __webpack_require__) { 26800 26801"use strict"; 26802__webpack_require__.r(__webpack_exports__); 26803/* harmony import */ var _util_pointProjector_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../../util/pointProjector.js */ "./util/pointProjector.js"); 26804 26805/** 26806 * Calculates a reference line between two planes by projecting the top left hand corner and bottom right hand corner 26807 * Of the reference image onto the target image. Ideally we would calculate the intersection between the planes but 26808 * That requires a bit more math and this works fine for most cases. 26809 * 26810 * @export 26811 * @public 26812 * @method 26813 * @name calculateReferenceLine 26814 * @param {Object} targetImagePlane The imagePlane on which the reference line will be drawn. 26815 * @param {Object} referenceImagePlane The imagePlane being referenced. 26816 * @returns {Object} The start and end points of the line to be drawn. 26817 */ 26818 26819/* harmony default export */ __webpack_exports__["default"] = (function (targetImagePlane, referenceImagePlane) { 26820 var points = Object(_util_pointProjector_js__WEBPACK_IMPORTED_MODULE_0__["planePlaneIntersection"])(targetImagePlane, referenceImagePlane); 26821 26822 if (!points) { 26823 return; 26824 } 26825 26826 return { 26827 start: Object(_util_pointProjector_js__WEBPACK_IMPORTED_MODULE_0__["projectPatientPointToImagePlane"])(points.start, targetImagePlane), 26828 end: Object(_util_pointProjector_js__WEBPACK_IMPORTED_MODULE_0__["projectPatientPointToImagePlane"])(points.end, targetImagePlane) 26829 }; 26830}); 26831 26832/***/ }), 26833
26834/***/ "./tools/referenceLines/renderActiveReferenceLine.js": 26835/*!***********************************************************!*\ 26836 !*** ./tools/referenceLines/renderActiveReferenceLine.js ***! 26837 \***********************************************************/ 26838/*! exports provided: default */ 26839/***/ (function(module, __webpack_exports__, __webpack_require__) { 26840 26841"use strict"; 26842__webpack_require__.r(__webpack_exports__); 26843/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../../externalModules.js */ "./externalModules.js"); 26844/* harmony import */ var _calculateReferenceLine_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./calculateReferenceLine.js */ "./tools/referenceLines/calculateReferenceLine.js"); 26845/* harmony import */ var _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./../../stateManagement/toolColors.js */ "./stateManagement/toolColors.js"); 26846/* harmony import */ var _util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./../../util/convertToVector3.js */ "./util/convertToVector3.js"); 26847/* harmony import */ var _drawing_index_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./../../drawing/index.js */ "./drawing/index.js"); 26848 26849 26850 26851 26852 26853/** 26854 * Renders the active reference line. 26855 * 26856 * @export @public @method 26857 * @name renderActiveReferenceLine 26858 * @param {Object} context The canvas context. 26859 * @param {Object} eventData The data associated with the event. 26860 * @param {HTMLElement} targetElement The element on which to render the reference line. 26861 * @param {HTMLElement} referenceElement The element referenced by the line. 26862 * @returns {void} 26863 */ 26864 26865/* harmony default export */ __webpack_exports__["default"] = (function (context, eventData, targetElement, referenceElement) { 26866 26867 var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone; 26868 var targetImage = cornerstone.getEnabledElement(targetElement).image; 26869 var referenceImage = cornerstone.getEnabledElement(referenceElement).image; // Make sure the images are actually loaded for the target and reference 26870 26871 if (!targetImage || !referenceImage) { 26872 return; 26873 } 26874 26875 var targetImagePlane = cornerstone.metaData.get('imagePlaneModule', targetImage.imageId); 26876 var referenceImagePlane = cornerstone.metaData.get('imagePlaneModule', referenceImage.imageId); // Make sure the target and reference actually have image plane metadata 26877 26878 if (!targetImagePlane || !referenceImagePlane || !targetImagePlane.rowCosines || !targetImagePlane.columnCosines || !targetImagePlane.imagePositionPatient || !referenceImagePlane.rowCosines || !referenceImagePlane.columnCosines || !referenceImagePlane.imagePositionPatient) { 26879 return; 26880 } // The image planes must be in the same frame of reference 26881 26882 26883 //if (targetImagePlane.frameOfReferenceUID !== referenceImagePlane.frameOfReferenceUID) { 26884 // return; 26885 //} 26886 26887 // if (targetImage.data.string('x0020000d') !== (referenceImage.data.string('x0020000d') )) { 26888 // return; 26889 // } 26890 26891 targetImagePlane.rowCosines = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_3__["default"])(targetImagePlane.rowCosines); 26892 targetImagePlane.columnCosines = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_3__["default"])(targetImagePlane.columnCosines); 26893 targetImagePlane.imagePositionPatient = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_3__["default"])(targetImagePlane.imagePositionPatient); 26894 referenceImagePlane.rowCosines = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_3__["default"])(referenceImagePlane.rowCosines); 26895 referenceImagePlane.columnCosines = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_3__["default"])(referenceImagePlane.columnCosines); 26896 referenceImagePlane.imagePositionPatient = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_3__["default"])(referenceImagePlane.imagePositionPatient); // The image plane normals must be > 30 degrees apart 26897 26898 var targetNormal = targetImagePlane.rowCosines.clone().cross(targetImagePlane.columnCosines); 26899 var referenceNormal = referenceImagePlane.rowCosines.clone().cross(referenceImagePlane.columnCosines); 26900 var angleInRadians = targetNormal.angleTo(referenceNormal); 26901 angleInRadians = Math.abs(angleInRadians); 26902 26903 if (angleInRadians < 0.5) { 26904 // 0.5 radians = ~30 degrees 26905 return; 26906 } 26907 26908 var referenceLine = Object(_calculateReferenceLine_js__WEBPACK_IMPORTED_MODULE_1__["default"])(targetImagePlane, referenceImagePlane); 26909 26910 if (!referenceLine) { 26911 return; 26912 } 26913 26914 var color = _stateManagement_toolColors_js__WEBPACK_IMPORTED_MODULE_2__["default"].getActiveColor(); // Draw the referenceLines 26915 26916 context.setTransform(1, 0, 0, 1, 0, 0); 26917 Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_4__["draw"])(context, function (context) { 26918 Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_4__["drawLine"])(context, eventData.element, referenceLine.start, referenceLine.end, { 26919 color: color 26920 }); 26921 }); 26922}); 26923 26924/***/ }), 26925
26926/***/ "./util/SaveAs.js": 26927/*!************************!*\ 26928 !*** ./util/SaveAs.js ***! 26929 \************************/ 26930/*! exports provided: default */ 26931/***/ (function(module, __webpack_exports__, __webpack_require__) { 26932 26933"use strict"; 26934__webpack_require__.r(__webpack_exports__); 26935/** 26936 * Exports an image of the canvas. 26937 * @export @public @method 26938 * @name saveAs 26939 * 26940 * @param {HTMLElement} element The element to export. 26941 * @param {string} filename The name of the exported image. 26942 * @param {string} [mimetype = 'image/png'] The mimetype of the exported image. 26943 * @returns {void} 26944 */ 26945/* harmony default export */ __webpack_exports__["default"] = (function (element, filename) { 26946 var mimetype = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'image/png'; 26947 var canvas = element.querySelector('canvas'); // If we are using IE, use canvas.msToBlob 26948 26949 if (canvas.msToBlob) { 26950 var blob = canvas.msToBlob(); 26951 return window.navigator.msSaveBlob(blob, filename); 26952 } // Thanks to Ken Fyrstenber 26953 // http://stackoverflow.com/questions/18480474/how-to-save-an-image-from-canvas 26954 26955 26956 var lnk = document.createElement('a'); // The key here is to set the download attribute of the a tag 26957 26958 lnk.download = filename; // Convert canvas content to data-uri for link. When download 26959 // Attribute is set the content pointed to by link will be 26960 // Pushed as 'download' in HTML5 capable browsers 26961 26962 lnk.href = canvas.toDataURL(mimetype, 1); // Create a 'fake' click-event to trigger the download 26963 26964 if (document.createEvent) { 26965 var e = document.createEvent('MouseEvents'); 26966 e.initMouseEvent('click', true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null); 26967 lnk.dispatchEvent(e); 26968 } else if (lnk.fireEvent) { 26969 lnk.fireEvent('onclick'); 26970 } 26971}); 26972 26973/***/ }), 26974
26975/***/ "./util/angleBetweenPoints.js": 26976/*!************************************!*\ 26977 !*** ./util/angleBetweenPoints.js ***! 26978 \************************************/ 26979/*! exports provided: default */ 26980/***/ (function(module, __webpack_exports__, __webpack_require__) { 26981 26982"use strict"; 26983__webpack_require__.r(__webpack_exports__); 26984/** 26985 * Calculates the (interior) angle in degrees from the initial mouse location 26986 * to the current mouse location in relation to the center point. 26987 * @public 26988 * @function angleBetweenPoints 26989 * 26990 * @param {Object} p0 The center point. 26991 * @param {Object} p1 The initial point. 26992 * @param {Object} p2 The final point. 26993 * @returns {Object} { angle, direction } 26994 */ 26995/* harmony default export */ __webpack_exports__["default"] = (function (p0, p1, p2) { 26996 var p12 = Math.sqrt(Math.pow(p0.x - p1.x, 2) + Math.pow(p0.y - p1.y, 2)); 26997 var p13 = Math.sqrt(Math.pow(p0.x - p2.x, 2) + Math.pow(p0.y - p2.y, 2)); 26998 var p23 = Math.sqrt(Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2)); 26999 var angle = Math.acos((Math.pow(p12, 2) + Math.pow(p13, 2) - Math.pow(p23, 2)) / (2 * p12 * p13)) * 180 / Math.PI; // The direction of the angle (> 0 clockwise, < 0 anti-clockwise) 27000 27001 var direction = (p1.x - p0.x) * (p2.y - p0.y) - (p1.y - p0.y) * (p2.x - p0.x); 27002 return { 27003 angle: angle, 27004 direction: direction 27005 }; 27006}); 27007 27008/***/ }), 27009
27010/***/ "./util/brush/drawBrush.js": 27011/*!*********************************!*\ 27012 !*** ./util/brush/drawBrush.js ***! 27013 \*********************************/ 27014/*! exports provided: drawBrushPixels, drawBrushOnCanvas */ 27015/***/ (function(module, __webpack_exports__, __webpack_require__) { 27016 27017"use strict"; 27018__webpack_require__.r(__webpack_exports__); 27019/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "drawBrushPixels", function() { return drawBrushPixels; }); 27020/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "drawBrushOnCanvas", function() { return drawBrushOnCanvas; }); 27021/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../externalModules.js */ "./externalModules.js"); 27022/* harmony import */ var _drawing_index_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../drawing/index.js */ "./drawing/index.js"); 27023 27024 27025/** 27026 * Fills in the brush mask data with new data. 27027 * @export @public @method 27028 * @name drawBrushPixels 27029 * 27030 * @param {Object[]} pointerArray The array of points to draw. 27031 * @param {number[]} toolData The cornerstoneTools annotation to modify. 27032 * @param {number} columns The number of columns in the mask. 27033 * @param {boolean} [shouldErase = false] If true the modified mask pixels will be set to 0, rather than 1. 27034 * @returns {void} 27035 */ 27036 27037function drawBrushPixels(pointerArray, toolData, columns) { 27038 var shouldErase = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; 27039 27040 var getPixelIndex = function getPixelIndex(x, y) { 27041 return y * columns + x; 27042 }; 27043 27044 var pixelData = toolData.pixelData; 27045 pointerArray.forEach(function (point) { 27046 var spIndex = getPixelIndex(point[0], point[1]); 27047 pixelData[spIndex] = shouldErase ? 0 : 1; 27048 }); // If Erased the last pixel, delete the pixelData array. 27049 27050 if (shouldErase && !pixelData.some(function (element) { 27051 return element !== 0; 27052 })) { 27053 delete toolData.pixelData; 27054 } 27055} 27056/** 27057 * Draws the brush data to the canvas. 27058 * @export @public @method 27059 * 27060 * @param {Object[]} pointerArray Array of points to draw. 27061 * @param {Object} context The canvas context. 27062 * @param {string} color The color to draw the pixels. 27063 * @param {HTMLElement} element The element on which the canvas resides. 27064 * @returns {void} 27065 */ 27066 27067 27068function drawBrushOnCanvas(pointerArray, context, color, element) { 27069 var canvasPtTL = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.pixelToCanvas(element, { 27070 x: 0, 27071 y: 0 27072 }); 27073 var canvasPtBR = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.pixelToCanvas(element, { 27074 x: 1, 27075 y: 1 27076 }); 27077 var sizeX = canvasPtBR.x - canvasPtTL.x; 27078 var sizeY = canvasPtBR.y - canvasPtTL.y; 27079 Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_1__["draw"])(context, function (context) { 27080 pointerArray.forEach(function (point) { 27081 var canvasPt = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.pixelToCanvas(element, { 27082 x: point[0], 27083 y: point[1] 27084 }); 27085 var boundingBox = { 27086 left: canvasPt.x, 27087 top: canvasPt.y, 27088 width: sizeX, 27089 height: sizeY 27090 }; 27091 Object(_drawing_index_js__WEBPACK_IMPORTED_MODULE_1__["fillBox"])(context, boundingBox, color); 27092 }); 27093 }); 27094} 27095 27096 27097 27098/***/ }), 27099
27100/***/ "./util/brush/getCircle.js": 27101/*!*********************************!*\ 27102 !*** ./util/brush/getCircle.js ***! 27103 \*********************************/ 27104/*! exports provided: default */ 27105/***/ (function(module, __webpack_exports__, __webpack_require__) { 27106 27107"use strict"; 27108__webpack_require__.r(__webpack_exports__); 27109/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return getCircle; }); 27110/** 27111 * Gets the pixels within the circle. 27112 * @export @public @method 27113 * @name getCircle 27114 * 27115 * @param {number} radius The radius of the circle. 27116 * @param {number} rows The number of rows. 27117 * @param {number} columns The number of columns. 27118 * @param {number} [xCoord = 0] The x-location of the center of the circle. 27119 * @param {number} [yCoord = 0] The y-location of the center of the circle. 27120 * @returns {Array.number[]} Array of pixels contained within the circle. 27121 */ 27122function getCircle(radius, rows, columns) { 27123 var xCoord = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0; 27124 var yCoord = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0; 27125 var x0 = Math.floor(xCoord); 27126 var y0 = Math.floor(yCoord); 27127 27128 if (radius === 1) { 27129 return [[x0, y0]]; 27130 } 27131 27132 var circleArray = []; 27133 var index = 0; 27134 27135 for (var y = -radius; y <= radius; y++) { 27136 var _yCoord = y0 + y; 27137 27138 if (_yCoord > rows || _yCoord < 0) { 27139 continue; 27140 } 27141 27142 for (var x = -radius; x <= radius; x++) { 27143 var _xCoord = x0 + x; 27144 27145 if (_xCoord >= columns || _xCoord < 0) { 27146 continue; 27147 } 27148 27149 if (x * x + y * y < radius * radius) { 27150 circleArray[index++] = [x0 + x, y0 + y]; 27151 } 27152 } 27153 } 27154 27155 return circleArray; 27156} 27157 27158/***/ }), 27159
27160/***/ "./util/brush/index.js": 27161/*!*****************************!*\ 27162 !*** ./util/brush/index.js ***! 27163 \*****************************/ 27164/*! exports provided: default */ 27165/***/ (function(module, __webpack_exports__, __webpack_require__) { 27166 27167"use strict"; 27168__webpack_require__.r(__webpack_exports__); 27169/* harmony import */ var _drawBrush_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./drawBrush.js */ "./util/brush/drawBrush.js"); 27170/* harmony import */ var _getCircle_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./getCircle.js */ "./util/brush/getCircle.js"); 27171 27172 27173/* harmony default export */ __webpack_exports__["default"] = ({ 27174 drawBrushPixels: _drawBrush_js__WEBPACK_IMPORTED_MODULE_0__["drawBrushPixels"], 27175 drawBrushOnCanvas: _drawBrush_js__WEBPACK_IMPORTED_MODULE_0__["drawBrushOnCanvas"], 27176 getCircle: _getCircle_js__WEBPACK_IMPORTED_MODULE_1__["default"] 27177}); 27178 27179/***/ }), 27180
27181/***/ "./util/calculateSUV.js": 27182/*!******************************!*\ 27183 !*** ./util/calculateSUV.js ***! 27184 \******************************/ 27185/*! exports provided: default */ 27186/***/ (function(module, __webpack_exports__, __webpack_require__) { 27187 27188"use strict"; 27189__webpack_require__.r(__webpack_exports__); 27190/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js"); 27191 27192/** 27193 * Calculates a Standardized Uptake Value. 27194 * @export @public @method 27195 * @name calculateSUV 27196 * 27197 * @param {Object} image The image. 27198 * @param {number} storedPixelValue The raw pixel value. 27199 * @param {bool} [skipRescale=fale] 27200 * @returns {number} The SUV. 27201 */ 27202 27203/* harmony default export */ __webpack_exports__["default"] = (function (image, storedPixelValue) { 27204 var skipRescale = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; 27205 var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone; 27206 var patientStudyModule = cornerstone.metaData.get('patientStudyModule', image.imageId); 27207 var seriesModule = cornerstone.metaData.get('generalSeriesModule', image.imageId); 27208 27209 if (!patientStudyModule || !seriesModule) { 27210 return; 27211 } 27212 27213 var modality = seriesModule.modality; // Image must be PET 27214 27215 if (modality !== 'PT') { 27216 return; 27217 } 27218 27219 var modalityPixelValue = skipRescale ? storedPixelValue : storedPixelValue * image.slope + image.intercept; 27220 var patientWeight = patientStudyModule.patientWeight; // In kg 27221 27222 if (!patientWeight) { 27223 return; 27224 } 27225 27226 var petSequenceModule = cornerstone.metaData.get('petIsotopeModule', image.imageId); 27227 27228 if (!petSequenceModule) { 27229 return; 27230 } 27231 27232 var radiopharmaceuticalInfo = petSequenceModule.radiopharmaceuticalInfo; 27233 var startTime = radiopharmaceuticalInfo.radiopharmaceuticalStartTime; 27234 var totalDose = radiopharmaceuticalInfo.radionuclideTotalDose; 27235 var halfLife = radiopharmaceuticalInfo.radionuclideHalfLife; 27236 var seriesAcquisitionTime = seriesModule.seriesTime; 27237 27238 if (!startTime || !totalDose || !halfLife || !seriesAcquisitionTime) { 27239 return; 27240 } 27241 27242 var acquisitionTimeInSeconds = fracToDec(seriesAcquisitionTime.fractionalSeconds || 0) + seriesAcquisitionTime.seconds + seriesAcquisitionTime.minutes * 60 + seriesAcquisitionTime.hours * 60 * 60; 27243 var injectionStartTimeInSeconds = fracToDec(startTime.fractionalSeconds) + startTime.seconds + startTime.minutes * 60 + startTime.hours * 60 * 60; 27244 var durationInSeconds = acquisitionTimeInSeconds - injectionStartTimeInSeconds; 27245 var correctedDose = totalDose * Math.exp(-durationInSeconds * Math.log(2) / halfLife); 27246 var suv = modalityPixelValue * patientWeight / correctedDose * 1000; 27247 return suv; 27248}); 27249/** 27250 * Returns a decimal value given a fractional value. 27251 * @private 27252 * @method 27253 * @name fracToDec 27254 * 27255 * @param {number} fractionalValue The value to convert. 27256 * @returns {number} The value converted to decimal. 27257 */ 27258 27259function fracToDec(fractionalValue) { 27260 return parseFloat(".".concat(fractionalValue)); 27261} 27262 27263/***/ }), 27264
27265/***/ "./util/clip.js": 27266/*!**********************!*\ 27267 !*** ./util/clip.js ***! 27268 \**********************/ 27269/*! exports provided: default, clipToBox */ 27270/***/ (function(module, __webpack_exports__, __webpack_require__) { 27271 27272"use strict"; 27273__webpack_require__.r(__webpack_exports__); 27274/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return clip; }); 27275/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "clipToBox", function() { return clipToBox; }); 27276/** 27277 * Clips a value to an upper and lower bound. 27278 * @export @public @method 27279 * @name clip 27280 * 27281 * @param {number} val The value to clip. 27282 * @param {number} low The lower bound. 27283 * @param {number} high The upper bound. 27284 * @returns {number} The clipped value. 27285 */ 27286function clip(val, low, high) { 27287 return Math.min(Math.max(low, val), high); 27288} 27289/** 27290 * Clips a value within a box. 27291 * @export @public @method 27292 * @name clipToBox 27293 * 27294 * @param {Object} point The point to clip 27295 * @param {Object} box The bounding box to clip to. 27296 * @returns {Object} The clipped point. 27297 */ 27298 27299function clipToBox(point, box) { 27300 // Clip an {x, y} point to a box of size {width, height} 27301 point.x = clip(point.x, 0, box.width); 27302 point.y = clip(point.y, 0, box.height); 27303} 27304 27305/***/ }), 27306
27307/***/ "./util/convertToVector3.js": 27308/*!**********************************!*\ 27309 !*** ./util/convertToVector3.js ***! 27310 \**********************************/ 27311/*! exports provided: default */ 27312/***/ (function(module, __webpack_exports__, __webpack_require__) { 27313 27314"use strict"; 27315__webpack_require__.r(__webpack_exports__); 27316/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return convertToVector3; }); 27317/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js"); 27318 27319/** 27320 * Convert an Array to a cornerstoneMath.Vector3 27321 * @export @public @method 27322 * @name convertToVector3 27323 * 27324 * @param {Array|cornerstoneMath.Vector3} arrayOrVector3 Input array or Vector3 27325 * @returns {cornerstoneMath.Vector3} 27326 */ 27327 27328function convertToVector3(arrayOrVector3) { 27329 var cornerstoneMath = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath; 27330 27331 if (arrayOrVector3 instanceof cornerstoneMath.Vector3) { 27332 return arrayOrVector3; 27333 } 27334 27335 return new cornerstoneMath.Vector3(arrayOrVector3[0], arrayOrVector3[1], arrayOrVector3[2]); 27336} 27337 27338/***/ }), 27339
27340/***/ "./util/copyPoints.js": 27341/*!****************************!*\ 27342 !*** ./util/copyPoints.js ***! 27343 \****************************/ 27344/*! exports provided: default */ 27345/***/ (function(module, __webpack_exports__, __webpack_require__) { 27346 27347"use strict"; 27348__webpack_require__.r(__webpack_exports__); 27349/** 27350 * Returns a copy of the points object. 27351 * @public 27352 * @function copyPoints 27353 * 27354 * @param {Object} points - The object to copy. 27355 * @returns {Object} - The copy. 27356 */ 27357/* harmony default export */ __webpack_exports__["default"] = (function (points) { 27358 var page = _copy(points.page); 27359 27360 var image = _copy(points.image); 27361 27362 var client = _copy(points.client); 27363 27364 var canvas = _copy(points.canvas); 27365 27366 return { 27367 page: page, 27368 image: image, 27369 client: client, 27370 canvas: canvas 27371 }; 27372}); 27373/** 27374 * 27375 * @private 27376 * @function _copy 27377 * 27378 * @param {Object} point - { x, y } 27379 * @returns {Object} { x, y } 27380 */ 27381 27382function _copy() { 27383 var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, 27384 x = _ref.x, 27385 y = _ref.y; 27386 27387 return { 27388 x: x, 27389 y: y 27390 }; 27391} 27392 27393/***/ }), 27394
27395/***/ "./util/debounce.js": 27396/*!**************************!*\ 27397 !*** ./util/debounce.js ***! 27398 \**************************/ 27399/*! exports provided: default */ 27400/***/ (function(module, __webpack_exports__, __webpack_require__) { 27401 27402"use strict"; 27403__webpack_require__.r(__webpack_exports__); 27404/* harmony import */ var _isObject_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./isObject.js */ "./util/isObject.js"); 27405 27406/** 27407 * Creates a debounced function that delays invoking `func` until after `wait` 27408 * milliseconds have elapsed since the last time the debounced function was 27409 * invoked, or until the next browser frame is drawn. The debounced function 27410 * comes with a `cancel` method to cancel delayed `func` invocations and a 27411 * `flush` method to immediately invoke them. Provide `options` to indicate 27412 * whether `func` should be invoked on the leading and/or trailing edge of the 27413 * `wait` timeout. The `func` is invoked with the last arguments provided to the 27414 * debounced function. Subsequent calls to the debounced function return the 27415 * result of the last `func` invocation. 27416 * 27417 * **Note:** If `leading` and `trailing` options are `true`, `func` is 27418 * invoked on the trailing edge of the timeout only if the debounced function 27419 * is invoked more than once during the `wait` timeout. 27420 * 27421 * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred 27422 * until the next tick, similar to `setTimeout` with a timeout of `0`. 27423 * 27424 * If `wait` is omitted in an environment with `requestAnimationFrame`, `func` 27425 * invocation will be deferred until the next frame is drawn (typically about 27426 * 16ms). 27427 * 27428 * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/) 27429 * for details over the differences between `debounce` and `throttle`. 27430 * 27431 * @since 0.1.0 27432 * @category Function 27433 * @param {Function} func The function to debounce. 27434 * @param {number} [wait=0] 27435 * The number of milliseconds to delay; if omitted, `requestAnimationFrame` is 27436 * used (if available). 27437 * @param {Object} [options={}] The options object. 27438 * @param {boolean} [options.leading=false] 27439 * Specify invoking on the leading edge of the timeout. 27440 * @param {number} [options.maxWait] 27441 * The maximum time `func` is allowed to be delayed before it's invoked. 27442 * @param {boolean} [options.trailing=true] 27443 * Specify invoking on the trailing edge of the timeout. 27444 * @returns {Function} Returns the new debounced function. 27445 * @example 27446 * 27447 * // Avoid costly calculations while the window size is in flux. 27448 * jQuery(window).on('resize', debounce(calculateLayout, 150)) 27449 * 27450 * // Invoke `sendMail` when clicked, debouncing subsequent calls. 27451 * jQuery(element).on('click', debounce(sendMail, 300, { 27452 * 'leading': true, 27453 * 'trailing': false 27454 * })) 27455 * 27456 * // Ensure `batchLog` is invoked once after 1 second of debounced calls. 27457 * const debounced = debounce(batchLog, 250, { 'maxWait': 1000 }) 27458 * const source = new EventSource('/stream') 27459 * jQuery(source).on('message', debounced) 27460 * 27461 * // Cancel the trailing debounced invocation. 27462 * jQuery(window).on('popstate', debounced.cancel) 27463 * 27464 * // Check for pending invocations. 27465 * const status = debounced.pending() ? "Pending..." : "Ready" 27466 */ 27467 27468function debounce(func, wait, options) { 27469 var lastArgs, lastThis, maxWait, result, timerId, lastCallTime; 27470 var lastInvokeTime = 0; 27471 var leading = false; 27472 var maxing = false; 27473 var trailing = true; // Bypass `requestAnimationFrame` by explicitly setting `wait=0`. 27474 27475 var useRAF = !wait && wait !== 0 && typeof window.requestAnimationFrame === 'function'; 27476 27477 if (typeof func !== 'function') { 27478 throw new TypeError('Expected a function'); 27479 } 27480 27481 wait = Number(wait) || 0; 27482 27483 if (Object(_isObject_js__WEBPACK_IMPORTED_MODULE_0__["default"])(options)) { 27484 leading = Boolean(options.leading); 27485 maxing = 'maxWait' in options; 27486 maxWait = maxing ? Math.max(Number(options.maxWait) || 0, wait) : maxWait; 27487 trailing = 'trailing' in options ? Boolean(options.trailing) : trailing; 27488 } 27489 27490 function invokeFunc(time) { 27491 var args = lastArgs; 27492 var thisArg = lastThis; 27493 lastArgs = lastThis = undefined; 27494 lastInvokeTime = time; 27495 result = func.apply(thisArg, args); 27496 return result; 27497 } 27498 27499 function startTimer(pendingFunc, wait) { 27500 if (useRAF) { 27501 return window.requestAnimationFrame(pendingFunc); 27502 } 27503 27504 return setTimeout(pendingFunc, wait); 27505 } 27506 27507 function cancelTimer(id) { 27508 if (useRAF) { 27509 return window.cancelAnimationFrame(id); 27510 } 27511 27512 clearTimeout(id); 27513 } 27514 27515 function leadingEdge(time) { 27516 // Reset any `maxWait` timer. 27517 lastInvokeTime = time; // Start the timer for the trailing edge. 27518 27519 timerId = startTimer(timerExpired, wait); // Invoke the leading edge. 27520 27521 return leading ? invokeFunc(time) : result; 27522 } 27523 27524 function remainingWait(time) { 27525 var timeSinceLastCall = time - lastCallTime; 27526 var timeSinceLastInvoke = time - lastInvokeTime; 27527 var timeWaiting = wait - timeSinceLastCall; 27528 return maxing ? Math.min(timeWaiting, maxWait - timeSinceLastInvoke) : timeWaiting; 27529 } 27530 27531 function shouldInvoke(time) { 27532 var timeSinceLastCall = time - lastCallTime; 27533 var timeSinceLastInvoke = time - lastInvokeTime; // Either this is the first call, activity has stopped and we're at the 27534 // trailing edge, the system time has gone backwards and we're treating 27535 // it as the trailing edge, or we've hit the `maxWait` limit. 27536 27537 return lastCallTime === undefined || timeSinceLastCall >= wait || timeSinceLastCall < 0 || maxing && timeSinceLastInvoke >= maxWait; 27538 } 27539 27540 function timerExpired() { 27541 var time = Date.now(); 27542 27543 if (shouldInvoke(time)) { 27544 return trailingEdge(time); 27545 } // Restart the timer. 27546 27547 27548 timerId = startTimer(timerExpired, remainingWait(time)); 27549 } 27550 27551 function trailingEdge(time) { 27552 timerId = undefined; // Only invoke if we have `lastArgs` which means `func` has been 27553 // debounced at least once. 27554 27555 if (trailing && lastArgs) { 27556 return invokeFunc(time); 27557 } 27558 27559 lastArgs = lastThis = undefined; 27560 return result; 27561 } 27562 27563 function cancel() { 27564 if (timerId !== undefined) { 27565 cancelTimer(timerId); 27566 } 27567 27568 lastInvokeTime = 0; 27569 lastArgs = lastCallTime = lastThis = timerId = undefined; 27570 } 27571 27572 function flush() { 27573 return timerId === undefined ? result : trailingEdge(Date.now()); 27574 } 27575 27576 function pending() { 27577 return timerId !== undefined; 27578 } 27579 27580 function debounced() { 27581 var time = Date.now(); 27582 var isInvoking = shouldInvoke(time); 27583 27584 for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { 27585 args[_key] = arguments[_key]; 27586 } 27587 27588 lastArgs = args; 27589 lastThis = this; // eslint-disable-line consistent-this 27590 27591 lastCallTime = time; 27592 27593 if (isInvoking) { 27594 if (timerId === undefined) { 27595 return leadingEdge(lastCallTime); 27596 } 27597 27598 if (maxing) { 27599 // Handle invocations in a tight loop. 27600 timerId = startTimer(timerExpired, wait); 27601 return invokeFunc(lastCallTime); 27602 } 27603 } 27604 27605 if (timerId === undefined) { 27606 timerId = startTimer(timerExpired, wait); 27607 } 27608 27609 return result; 27610 } 27611 27612 debounced.cancel = cancel; 27613 debounced.flush = flush; 27614 debounced.pending = pending; 27615 return debounced; 27616} 27617 27618/* harmony default export */ __webpack_exports__["default"] = (debounce); 27619 27620/***/ }), 27621
27622/***/ "./util/deepmerge.js": 27623/*!***************************!*\ 27624 !*** ./util/deepmerge.js ***! 27625 \***************************/ 27626/*! exports provided: default */ 27627/***/ (function(module, __webpack_exports__, __webpack_require__) { 27628 27629"use strict"; 27630__webpack_require__.r(__webpack_exports__); 27631/* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/typeof */ "../node_modules/@babel/runtime/helpers/typeof.js"); 27632/* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__); 27633 27634 27635var isMergeableObject = function isMergeableObject(val) { 27636 var nonNullObject = val && _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default()(val) === 'object'; 27637 return nonNullObject && Object.prototype.toString.call(val) !== '[object RegExp]' && Object.prototype.toString.call(val) !== '[object Date]'; 27638}; 27639 27640var emptyTarget = function emptyTarget(val) { 27641 return Array.isArray(val) ? [] : {}; 27642}; 27643 27644var cloneIfNecessary = function cloneIfNecessary(value, optionsArgument) { 27645 var clone = optionsArgument && optionsArgument.clone === true; 27646 return clone && isMergeableObject(value) ? deepmerge(emptyTarget(value), value, optionsArgument) : value; 27647}; 27648 27649var defaultArrayMerge = function defaultArrayMerge(target, source, optionsArgument) { 27650 var destination = target.slice(); 27651 source.forEach(function (e, i) { 27652 if (typeof destination[i] === 'undefined') { 27653 destination[i] = cloneIfNecessary(e, optionsArgument); 27654 } else if (isMergeableObject(e)) { 27655 destination[i] = deepmerge(target[i], e, optionsArgument); 27656 } else if (target.indexOf(e) === -1) { 27657 destination.push(cloneIfNecessary(e, optionsArgument)); 27658 } 27659 }); 27660 return destination; 27661}; 27662 27663var mergeObject = function mergeObject(target, source, optionsArgument) { 27664 var destination = {}; 27665 27666 if (isMergeableObject(target)) { 27667 Object.keys(target).forEach(function (key) { 27668 destination[key] = cloneIfNecessary(target[key], optionsArgument); 27669 }); 27670 } 27671 27672 Object.keys(source).forEach(function (key) { 27673 if (!isMergeableObject(source[key]) || !target[key]) { 27674 destination[key] = cloneIfNecessary(source[key], optionsArgument); 27675 } else { 27676 destination[key] = deepmerge(target[key], source[key], optionsArgument); 27677 } 27678 }); 27679 return destination; 27680}; 27681 27682var deepmerge = function deepmerge() { 27683 var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 27684 var source = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; 27685 var optionsArgument = arguments.length > 2 ? arguments[2] : undefined; 27686 var array = Array.isArray(source); 27687 var options = optionsArgument || { 27688 arrayMerge: defaultArrayMerge 27689 }; 27690 var arrayMerge = options.arrayMerge || defaultArrayMerge; 27691 27692 if (array) { 27693 return Array.isArray(target) ? arrayMerge(target, source, optionsArgument) : cloneIfNecessary(source, optionsArgument); 27694 } 27695 27696 return mergeObject(target, source, optionsArgument); 27697}; 27698 27699/* harmony default export */ __webpack_exports__["default"] = (deepmerge); 27700 27701/***/ }), 27702
27703/***/ "./util/ellipse/calculateEllipseStatistics.js": 27704/*!****************************************************!*\ 27705 !*** ./util/ellipse/calculateEllipseStatistics.js ***! 27706 \****************************************************/ 27707/*! exports provided: default */ 27708/***/ (function(module, __webpack_exports__, __webpack_require__) { 27709 27710"use strict"; 27711__webpack_require__.r(__webpack_exports__); 27712/* harmony import */ var _pointInEllipse_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./pointInEllipse.js */ "./util/ellipse/pointInEllipse.js"); 27713 27714/** 27715 * Calculates the statistics of an elliptical region of interest. 27716 * 27717 * @private 27718 * @function calculateEllipseStatistics 27719 * 27720 * @param {number[]} sp - Array of the image data's pixel values. 27721 * @param {Object} ellipse - { top, left, height, width } - An object describing the ellipse. 27722 * @returns {Object} { count, mean, variance, stdDev, min, max } 27723 */ 27724 27725/* harmony default export */ __webpack_exports__["default"] = (function (sp, ellipse) { 27726 var sum = 0; 27727 var sumSquared = 0; 27728 var count = 0; 27729 var index = 0; 27730 var min = null; 27731 var max = null; 27732 27733 for (var y = ellipse.top; y < ellipse.top + ellipse.height; y++) { 27734 for (var x = ellipse.left; x < ellipse.left + ellipse.width; x++) { 27735 var point = { 27736 x: x, 27737 y: y 27738 }; 27739 27740 if (Object(_pointInEllipse_js__WEBPACK_IMPORTED_MODULE_0__["default"])(ellipse, point)) { 27741 if (min === null) { 27742 min = sp[index]; 27743 max = sp[index]; 27744 } 27745 27746 sum += sp[index]; 27747 sumSquared += sp[index] * sp[index]; 27748 min = Math.min(min, sp[index]); 27749 max = Math.max(max, sp[index]); 27750 count++; 27751 } 27752 27753 index++; 27754 } 27755 } 27756 27757 if (count === 0) { 27758 return { 27759 count: count, 27760 mean: 0.0, 27761 variance: 0.0, 27762 stdDev: 0.0, 27763 min: 0.0, 27764 max: 0.0 27765 }; 27766 } 27767 27768 var mean = sum / count; 27769 var variance = sumSquared / count - mean * mean; 27770 return { 27771 count: count, 27772 mean: mean, 27773 variance: variance, 27774 stdDev: Math.sqrt(variance), 27775 min: min, 27776 max: max 27777 }; 27778}); 27779 27780/***/ }), 27781
27782/***/ "./util/ellipse/index.js": 27783/*!*******************************!*\ 27784 !*** ./util/ellipse/index.js ***! 27785 \*******************************/ 27786/*! exports provided: calculateEllipseStatistics, pointInEllipse, default */ 27787/***/ (function(module, __webpack_exports__, __webpack_require__) { 27788 27789"use strict"; 27790__webpack_require__.r(__webpack_exports__); 27791/* harmony import */ var _calculateEllipseStatistics_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./calculateEllipseStatistics.js */ "./util/ellipse/calculateEllipseStatistics.js"); 27792/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "calculateEllipseStatistics", function() { return _calculateEllipseStatistics_js__WEBPACK_IMPORTED_MODULE_0__["default"]; }); 27793 27794/* harmony import */ var _pointInEllipse_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./pointInEllipse.js */ "./util/ellipse/pointInEllipse.js"); 27795/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pointInEllipse", function() { return _pointInEllipse_js__WEBPACK_IMPORTED_MODULE_1__["default"]; }); 27796 27797 27798 // Named 27799 27800 // Default 27801 27802/* harmony default export */ __webpack_exports__["default"] = ({ 27803 calculateEllipseStatistics: _calculateEllipseStatistics_js__WEBPACK_IMPORTED_MODULE_0__["default"], 27804 pointInEllipse: _pointInEllipse_js__WEBPACK_IMPORTED_MODULE_1__["default"] 27805}); 27806 27807/***/ }), 27808
27809/***/ "./util/ellipse/pointInEllipse.js": 27810/*!****************************************!*\ 27811 !*** ./util/ellipse/pointInEllipse.js ***! 27812 \****************************************/ 27813/*! exports provided: default */ 27814/***/ (function(module, __webpack_exports__, __webpack_require__) { 27815 27816"use strict"; 27817__webpack_require__.r(__webpack_exports__); 27818/** 27819 * Returns true if a point is within an ellipse 27820 * @export @public @method 27821 * @name pointInEllipse 27822 * 27823 * @param {Object} ellipse Object defining the ellipse. 27824 * @param {Object} location The location of the point. 27825 * @returns {boolean} True if the point is within the ellipse. 27826 */ 27827/* harmony default export */ __webpack_exports__["default"] = (function (ellipse, location) { 27828 var xRadius = ellipse.width / 2; 27829 var yRadius = ellipse.height / 2; 27830 27831 if (xRadius <= 0.0 || yRadius <= 0.0) { 27832 return false; 27833 } 27834 27835 var center = { 27836 x: ellipse.left + xRadius, 27837 y: ellipse.top + yRadius 27838 }; 27839 /* This is a more general form of the circle equation 27840 * 27841 * X^2/a^2 + Y^2/b^2 <= 1 27842 */ 27843 27844 var normalized = { 27845 x: location.x - center.x, 27846 y: location.y - center.y 27847 }; 27848 var inEllipse = normalized.x * normalized.x / (xRadius * xRadius) + normalized.y * normalized.y / (yRadius * yRadius) <= 1.0; 27849 return inEllipse; 27850}); 27851 27852/***/ }), 27853
27854/***/ "./util/findAndMoveHelpers.js": 27855/*!************************************!*\ 27856 !*** ./util/findAndMoveHelpers.js ***! 27857 \************************************/ 27858/*! exports provided: moveHandleNearImagePoint, findHandleDataNearImagePoint, moveAnnotation */ 27859/***/ (function(module, __webpack_exports__, __webpack_require__) { 27860 27861"use strict"; 27862__webpack_require__.r(__webpack_exports__); 27863/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "moveHandleNearImagePoint", function() { return moveHandleNearImagePoint; }); 27864/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "findHandleDataNearImagePoint", function() { return findHandleDataNearImagePoint; }); 27865/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "moveAnnotation", function() { return moveAnnotation; }); 27866/* harmony import */ var _store_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../store/index.js */ "./store/index.js"); 27867/* harmony import */ var _manipulators_getHandleNearImagePoint_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../manipulators/getHandleNearImagePoint.js */ "./manipulators/getHandleNearImagePoint.js"); 27868/* harmony import */ var _manipulators_index_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./../manipulators/index.js */ "./manipulators/index.js"); 27869 27870 27871 // TODO this should just be in manipulators? They are just manipulator wrappers anyway. 27872 27873/** 27874 * Moves a handle near the image point. 27875 * @public 27876 * @function moveHandleNearImagePoint 27877 * @memberof Util 27878 * 27879 * @param {Event} evt The event. 27880 * @param {*} tool The tool 27881 * @param {Object} toolData The toolData that corresponds to the handle. 27882 * @param {Object} handle The handle to be moved. 27883 * @param {string} interactionType 27884 * @returns {undefined} 27885 */ 27886 27887var moveHandleNearImagePoint = function moveHandleNearImagePoint(evt, tool, toolData, handle, interactionType) { 27888 toolData.active = true; 27889 _store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].isToolLocked = true; 27890 Object(_manipulators_index_js__WEBPACK_IMPORTED_MODULE_2__["moveHandle"])(evt.detail, tool.name, toolData, handle, tool.options, interactionType); 27891 evt.stopImmediatePropagation(); 27892 evt.stopPropagation(); 27893 evt.preventDefault(); 27894 return; 27895}; 27896/** 27897 * Finds the handle near the image point and its corresponding data. 27898 * 27899 * @public 27900 * @function findHandleDataNearImagePoint 27901 * @memberof Util 27902 * 27903 * @param {HTMLElement} element The elment. 27904 * @param {Object} toolState The state of the tool. 27905 * @param {string} toolName The name of the tool the handle corrosponds to. 27906 * @param {Object} coords The coordinates that need to be checked. 27907 * @param {String} [interactionType=mouse] 27908 * @returns {*} 27909 */ 27910 27911 27912var findHandleDataNearImagePoint = function findHandleDataNearImagePoint(element, toolState, toolName, coords) { 27913 var interactionType = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 'mouse'; 27914 27915 for (var i = 0; i < toolState.data.length; i++) { 27916 var data = toolState.data[i]; 27917 var handle = Object(_manipulators_getHandleNearImagePoint_js__WEBPACK_IMPORTED_MODULE_1__["default"])(element, data.handles, coords, interactionType === 'mouse' ? _store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].clickProximity : _store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].touchProximity); 27918 27919 if (handle) { 27920 return { 27921 handle: handle, 27922 data: data 27923 }; 27924 } 27925 } 27926}; 27927/** 27928 * Moves an entire annotation near the click. 27929 * 27930 * @public 27931 * @function moveAnnotation 27932 * @memberof Util 27933 * 27934 * @param {Event} evt The event. 27935 * @param {Object} tool The tool that the annotation belongs to. 27936 * @param {string} tool.name 27937 * @param {Object} [tool.options={}] 27938 * @param {Boolean} [tool.options.preventHandleOutsideImage] 27939 * @param {Boolean} [tool.options.deleteIfHandleOutsideImage] 27940 * @param {Object} annotation The toolData that corresponds to the annotation. 27941 * @param {String} [interactionType=mouse] 27942 * @returns {undefined} 27943 */ 27944 27945 27946var moveAnnotation = function moveAnnotation(evt, tool, annotation) { 27947 var interactionType = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 'mouse'; 27948 var toolOptions = Object.assign({}, { 27949 doneMovingCallback: function doneMovingCallback() { 27950 annotation.active = false;
27951 _store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].isToolLocked = false; 27952 } 27953 }, tool.options); 27954 annotation.active = true; 27955 _store_index_js__WEBPACK_IMPORTED_MODULE_0__["state"].isToolLocked = true; 27956 Object(_manipulators_index_js__WEBPACK_IMPORTED_MODULE_2__["moveAllHandles"])(evt.detail, tool.name, annotation, null, toolOptions, interactionType); 27957 evt.stopImmediatePropagation(); 27958 evt.stopPropagation(); 27959 evt.preventDefault(); 27960 return; 27961}; 27962 27963 27964 27965/***/ }), 27966
27967/***/ "./util/freehand/ClickedLineData.js": 27968/*!******************************************!*\ 27969 !*** ./util/freehand/ClickedLineData.js ***! 27970 \******************************************/ 27971/*! exports provided: default */ 27972/***/ (function(module, __webpack_exports__, __webpack_require__) { 27973 27974"use strict"; 27975__webpack_require__.r(__webpack_exports__); 27976/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return ClickedLineData; }); 27977/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js"); 27978/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); 27979 27980 27981/** 27982 * @public 27983 * @name ClickedLineData 27984 * @classdesc Creates an object containing information about the clicked line. 27985 * @property {number} toolIndex ID of the tool that the line corresponds to. 27986 * @property {Object} handleIndexArray An array of the handle indicies that correspond to the line segment. 27987 */ 27988var ClickedLineData = 27989/**
27990 * Constructs an object containing information about the clicked line. 27991 * @param {number} toolIndex - The ID of the tool the line corresponds to. 27992 * @param {Object} handleIndexArray - An array of the handle indicies that correspond to the line segment. 27993 */ 27994function ClickedLineData(toolIndex, handleIndexArray) { 27995 _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, ClickedLineData); 27996 27997 this.toolIndex = toolIndex; 27998 this.handleIndexArray = handleIndexArray; 27999}; 28000 28001 28002 28003/***/ }), 28004
28005/***/ "./util/freehand/FreehandHandleData.js": 28006/*!*********************************************!*\ 28007 !*** ./util/freehand/FreehandHandleData.js ***! 28008 \*********************************************/ 28009/*! exports provided: default */ 28010/***/ (function(module, __webpack_exports__, __webpack_require__) { 28011 28012"use strict"; 28013__webpack_require__.r(__webpack_exports__); 28014/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return FreehandHandleData; }); 28015/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js"); 28016/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); 28017 28018 28019/** 28020 * @public 28021 * @name FreehandHandleData 28022 * @classdesc Creates a single handle for the freehand tool. 28023 * 28024 * @property {number} x The x position. 28025 * @property {number} y The y position. 28026 * @property {boolean} highlight Whether the handle should be rendered as the highlighted color. 28027 * @property {boolean} active Whether the handle is active. 28028 * @property {Object} lines An array of lines associated with the handle. 28029 */ 28030var FreehandHandleData = 28031/** 28032 * Constructs a a single handle for the freehand tool 28033 * 28034 * @param {Object} position - The position of the handle. 28035 * @param {boolean} highlight - whether the handle should be rendered as the highlighted color. 28036 * @param {boolean} active - whether the handle is active. 28037 */ 28038function FreehandHandleData(position) { 28039 var highlight = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; 28040 var active = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true; 28041 28042 _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, FreehandHandleData); 28043 28044 this.x = position.x; 28045 this.y = position.y; 28046 this.highlight = highlight; 28047 this.active = active; 28048 this.lines = []; 28049}; 28050 28051 28052 28053/***/ }), 28054
28055/***/ "./util/freehand/FreehandLineFinder.js": 28056/*!*********************************************!*\ 28057 !*** ./util/freehand/FreehandLineFinder.js ***! 28058 \*********************************************/ 28059/*! exports provided: default */ 28060/***/ (function(module, __webpack_exports__, __webpack_require__) { 28061 28062"use strict"; 28063__webpack_require__.r(__webpack_exports__); 28064/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return FreehandLineFinder; }); 28065/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/classCallCheck */ "../node_modules/@babel/runtime/helpers/classCallCheck.js"); 28066/* harmony import */ var _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0__); 28067/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/createClass */ "../node_modules/@babel/runtime/helpers/createClass.js"); 28068/* harmony import */ var _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1__); 28069/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../stateManagement/toolState.js */ "./stateManagement/toolState.js"); 28070/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../externalModules.js */ "./externalModules.js"); 28071/* harmony import */ var _ClickedLineData_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./ClickedLineData.js */ "./util/freehand/ClickedLineData.js"); 28072 28073 28074 28075 28076 28077var distanceThreshold = 10; 28078/** 28079 * @public 28080 * @class FreehandLineFinder 28081 * @classdesc Class that finds lines of freehand ROIs based on click proximity. 28082 */ 28083 28084var FreehandLineFinder = 28085/*#__PURE__*/ 28086function () { 28087 /** 28088 * Creates an instance of FreehandLineFinder. 28089 * @param {*} eventData - Data object associated with the event. 28090 * @param {string} toolName - The tool name 28091 * @memberof FreehandLineFinder 28092 */ 28093 function FreehandLineFinder(eventData, toolName) { 28094 _babel_runtime_helpers_classCallCheck__WEBPACK_IMPORTED_MODULE_0___default()(this, FreehandLineFinder); 28095 28096 this._eventData = eventData; 28097 this._toolName = toolName; 28098 } 28099 /** 28100 * Looks for lines near the mouse cursor. 28101 * 28102 * @public 28103 * @method 28104 * @returns {ClickedLineData} Data object corresponding to the clicked line. 28105 */ 28106 28107 28108 _babel_runtime_helpers_createClass__WEBPACK_IMPORTED_MODULE_1___default()(FreehandLineFinder, [{ 28109 key: "findLine", 28110 value: function findLine() { 28111 var closestToolIndex = this.findTool(); 28112 28113 if (closestToolIndex === null) { 28114 return null; 28115 } 28116 28117 var closeLines = this._getCloseLinesInTool(closestToolIndex); 28118 28119 if (closeLines) { 28120 var clickedLineData = this._findCorrectLine(closestToolIndex, closeLines); // Note: clickedLineData may be null if no valid projections are found. 28121 28122 28123 return clickedLineData; 28124 } // Return null if no valid close lines found. 28125 28126 28127 return null; 28128 } 28129 /** 28130 * Looks for tools near the mouse cursor. 28131 * 28132 * @public 28133 * @method 28134 * 28135 * @returns {ClickedLineData} Data object corresponding to the clicked line. 28136 */ 28137 28138 }, { 28139 key: "findTool", 28140 value: function findTool() { 28141 this._toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_2__["getToolState"])(this._eventData.element, this._toolName); 28142 this._mousePoint = this._eventData.currentPoints.canvas; 28143 28144 if (!this._toolData) { 28145 return null; 28146 } 28147 28148 var closestHandle = this._nearestHandleToPointAllTools(); 28149 28150 return closestHandle.toolIndex; 28151 } 28152 /** 28153 * Finds the nearest handle to the mouse cursor for all tools. 28154 * @private 28155 * @method 28156 * @returns {Object} The handle closest to the point. 28157 */ 28158 28159 }, { 28160 key: "_nearestHandleToPointAllTools", 28161 value: function _nearestHandleToPointAllTools() { 28162 var toolData = this._toolData; 28163 var closestHandle = { 28164 toolIndex: null, 28165 handleIndex: null, 28166 distance: Infinity // Some large number 28167 28168 }; 28169 28170 for (var toolIndex = 0; toolIndex < toolData.data.length; toolIndex++) { 28171 var closestHandleForToolI = this._nearestHandleToPoint(toolIndex); 28172 28173 if (closestHandleForToolI === null) { 28174 continue; 28175 } 28176 28177 if (closestHandleForToolI.distance < closestHandle.distance) { 28178 closestHandle = closestHandleForToolI; 28179 } 28180 } 28181 28182 return closestHandle; 28183 } 28184 /**
28185 * Finds the nearest handle to the mouse cursor for a specific tool. 28186 * @private 28187 * @method 28188 * 28189 * @param {number} toolIndex The index of the particular freehand tool. 28190 * @returns {Object} An object containing information about the closest handle. 28191 */ 28192 28193 }, { 28194 key: "_nearestHandleToPoint", 28195 value: function _nearestHandleToPoint(toolIndex) { 28196 var eventData = this._eventData; 28197 var toolData = this._toolData; 28198 var data = toolData.data[toolIndex]; 28199 var points = data.handles.points; 28200 28201 if (points === undefined) { 28202 return null; 28203 } 28204 28205 if (data.visible === false) { 28206 return null; 28207 } 28208 28209 var closest = { 28210 toolIndex: toolIndex, 28211 handleIndex: null, 28212 distance: Infinity // Some large number 28213 28214 }; 28215 28216 for (var i = 0; i < points.length; i++) { 28217 var handleCanvas = _externalModules_js__WEBPACK_IMPORTED_MODULE_3__["default"].cornerstone.pixelToCanvas(eventData.element, points[i]); 28218 var handleDistanceFromMousePoint = _externalModules_js__WEBPACK_IMPORTED_MODULE_3__["default"].cornerstoneMath.point.distance(handleCanvas, this._mousePoint); 28219 28220 if (handleDistanceFromMousePoint < closest.distance) { 28221 closest.handleIndex = i; 28222 closest.distance = handleDistanceFromMousePoint; 28223 } 28224 } 28225 28226 return closest; 28227 } 28228 /** 28229 * Finds all the lines close to the mouse point for a particular tool. 28230 * @private 28231 * @method 28232 * 28233 * @param {number} toolIndex The index of the particular freehand tool. 28234 * @returns {Object} An array of lines close to the mouse point. 28235 */ 28236 28237 }, { 28238 key: "_getCloseLinesInTool", 28239 value: function _getCloseLinesInTool(toolIndex) { 28240 var toolData = this._toolData; 28241 var points = toolData.data[toolIndex].handles.points; 28242 var closeLines = []; 28243 28244 for (var i = 0; i < points.length; i++) { 28245 var nextIndex = FreehandLineFinder.getNextHandleIndex(i, points.length); 28246 28247 var d = this._distanceOfPointfromLine(points[i], points[nextIndex]); 28248 28249 if (d < distanceThreshold) { 28250 closeLines.push([i, nextIndex]); 28251 } 28252 } 28253 28254 return closeLines; 28255 } 28256 /** 28257 * Finds the line the user clicked on from an array of close lines.\ 28258 * @private 28259 * @method 28260 * 28261 * @param {number} toolIndex The index of the particular freehand tool. 28262 * @param {Object} closeLines An array of lines close to the mouse point. 28263 * @returns {ClickedLineData|null} An instance of ClickedLineData containing information about the line, or null if no line is correct. 28264 */ 28265 28266 }, { 28267 key: "_findCorrectLine", 28268 value: function _findCorrectLine(toolIndex, closeLines) { 28269 // Test if any candidate lines can be projected onto by the mousePoint 28270 for (var i = 0; i < closeLines.length; i++) { 28271 if (this._pointProjectsToLineSegment(toolIndex, closeLines[i])) { 28272 return new _ClickedLineData_js__WEBPACK_IMPORTED_MODULE_4__["default"](toolIndex, closeLines[i]); 28273 } 28274 } // No valid line found 28275 28276 28277 return null; 28278 } 28279 /** 28280 * Returns true if the mouse point projects onto the line segment. 28281 * @private 28282 * @method 28283 * 28284 * @param {number} toolIndex The index of the particular freehand tool. 28285 * @param {Object} handleIndexArray An array of indicies corresponding to the line segment. 28286 * @returns {boolean} True if the mouse point projects onto the line segment 28287 */ 28288 28289 }, { 28290 key: "_pointProjectsToLineSegment", 28291 value: function _pointProjectsToLineSegment(toolIndex, handleIndexArray) { 28292 var eventData = this._eventData; 28293 var toolData = this._toolData; 28294 var data = toolData.data[toolIndex]; 28295 var points = data.handles.points; 28296 28297 if (data.handles.points === undefined) { 28298 return; 28299 } 28300 28301 if (data.visible === false) { 28302 return false; 28303 } 28304 28305 var handle1 = points[handleIndexArray[0]]; 28306 var handle2 = points[handleIndexArray[1]]; 28307 var p = FreehandLineFinder.getCanvasPointsFromHandles(handle1, handle2, eventData.element); 28308 var r = FreehandLineFinder.getLineAsVector(p); 28309 28310 var m = this._getLineOriginToMouseAsVector(p); // Project vector m onto r to see if the point is within bounds of line segment 28311 28312 28313 var mProj = (m[0] * r[0] + m[1] * r[1]) / r.magnitude; 28314 28315 if (mProj > 0 && mProj < r.magnitude) { 28316 return true; 28317 } 28318 28319 return false;
28320 } 28321 /** 28322 * Returns the canvas positions from the handle's pixel positions. 28323 * 28324 * @static 28325 * @public 28326 * @method 28327 * @param {FreehandHandleData} handle1 The first handle. 28328 * @param {FreehandHandleData} handle2 The second handle. 28329 * @param {Object} element The element on which the handles reside. 28330 * @returns {Object} An array contsining the handle positions in canvas coordinates. 28331 */ 28332 28333 }, { 28334 key: "_getLineOriginToMouseAsVector", 28335 28336 /** 28337 * Constructs a vector from the direction and magnitude of the line from the the line origin to the mouse cursor. 28338 * @private 28339 * @method 28340 * 28341 * @param {Object} p An array of two points respresenting the line segment. 28342 * @returns {Object} An array containing the x and y components of the vector. 28343 */ 28344 value: function _getLineOriginToMouseAsVector(p) { 28345 var m = [this._mousePoint.x - p[0].x, this._mousePoint.y - p[0].y]; 28346 return m; 28347 } 28348 /** 28349 * Calculates the perpendicular distance of the mouse cursor from a line segment. 28350 * @private 28351 * @method 28352 * 28353 * @param {FreehandHandleData} handle1 The first handle. 28354 * @param {FreehandHandleData} handle2 The first handle. 28355 * @returns {number} The perpendicular distance of the mouse cursor from the line segment. 28356 */ 28357 28358 }, { 28359 key: "_distanceOfPointfromLine", 28360 value: function _distanceOfPointfromLine(handle1, handle2) { 28361 var eventData = this._eventData; 28362 var p1 = _externalModules_js__WEBPACK_IMPORTED_MODULE_3__["default"].cornerstone.pixelToCanvas(eventData.element, handle1); 28363 var p2 = _externalModules_js__WEBPACK_IMPORTED_MODULE_3__["default"].cornerstone.pixelToCanvas(eventData.element, handle2); 28364 var pMouse = this._mousePoint; // Perpendicular distance of point from line: 28365 // = 2* area of triangle(p1,p2,pm) / length of triangle's base |p2 - p1| 28366 28367 var twiceAreaOfTriangle = Math.abs((p2.y - p1.y) * pMouse.x - (p2.x - p1.x) * pMouse.y + p2.x * p1.y - p2.y * p1.x); 28368 var rMagnitude = _externalModules_js__WEBPACK_IMPORTED_MODULE_3__["default"].cornerstoneMath.point.distance(p1, p2); 28369 var d = twiceAreaOfTriangle / rMagnitude; 28370 return d; 28371 } 28372 /** 28373 * Gets the next handl index from a cyclical array of points. 28374 * 28375 * @static 28376 * @public 28377 * @method 28378 * 28379 * @param {number} currentIndex The current index. 28380 * @param {number} length The number of handles in the polygon. 28381 * @returns {number} The index of the next handle. 28382 */ 28383 28384 }], [{ 28385 key: "getCanvasPointsFromHandles", 28386 value: function getCanvasPointsFromHandles(handle1, handle2, element) { 28387 var p = []; // Point r from left to right so that we only have one orientation to test. 28388 28389 if (handle1.x < handle2.x) { 28390 p.push(_externalModules_js__WEBPACK_IMPORTED_MODULE_3__["default"].cornerstone.pixelToCanvas(element, handle1)); 28391 p.push(_externalModules_js__WEBPACK_IMPORTED_MODULE_3__["default"].cornerstone.pixelToCanvas(element, handle2)); 28392 } else { 28393 p.push(_externalModules_js__WEBPACK_IMPORTED_MODULE_3__["default"].cornerstone.pixelToCanvas(element, handle2)); 28394 p.push(_externalModules_js__WEBPACK_IMPORTED_MODULE_3__["default"].cornerstone.pixelToCanvas(element, handle1)); 28395 } 28396 28397 return p; 28398 } 28399 /** 28400 * Converts a line segment to a vector. 28401 * 28402 * @static 28403 * @public 28404 * @method 28405 * @param {Object} p An array of two points respresenting the line segment. 28406 * @returns {Object} An array containing the x and y components of the vector, as well as a magnitude property. 28407 */ 28408 28409 }, { 28410 key: "getLineAsVector", 28411 value: function getLineAsVector(p) { 28412 var r = [p[1].x - p[0].x, p[1].y - p[0].y]; 28413 r.magnitude = _externalModules_js__WEBPACK_IMPORTED_MODULE_3__["default"].cornerstoneMath.point.distance(p[0], p[1]); 28414 return r; 28415 } 28416 }, { 28417 key: "getNextHandleIndex", 28418 value: function getNextHandleIndex(currentIndex, length) { 28419 var nextIndex; 28420 28421 if (currentIndex < length - 1) { 28422 nextIndex = currentIndex + 1; 28423 } else { 28424 nextIndex = 0; 28425 } 28426 28427 return nextIndex; 28428 } 28429 }]); 28430 28431 return FreehandLineFinder; 28432}(); 28433 28434 28435 28436/***/ }), 28437
28438/***/ "./util/freehand/addLine.js": 28439/*!**********************************!*\ 28440 !*** ./util/freehand/addLine.js ***! 28441 \**********************************/ 28442/*! exports provided: default */ 28443/***/ (function(module, __webpack_exports__, __webpack_require__) { 28444 28445"use strict"; 28446__webpack_require__.r(__webpack_exports__); 28447/** 28448 * AddLine - Adds a line to a specifc index of a freehand tool points array. 28449 * 28450 * @param {Object[]} points The array of points. 28451 * @param {Number} insertIndex The index to insert the line. 28452 * @returns {Null} description 28453 */ 28454/* harmony default export */ __webpack_exports__["default"] = (function (points, insertIndex) { 28455 // Add the line from the inserted handle to the handle after 28456 if (insertIndex === points.length - 1) { 28457 points[insertIndex].lines.push(points[0]); 28458 } else { 28459 points[insertIndex].lines.push(points[insertIndex + 1]); 28460 } 28461}); 28462 28463/***/ }), 28464
28465/***/ "./util/freehand/calculateFreehandStatistics.js": 28466/*!******************************************************!*\ 28467 !*** ./util/freehand/calculateFreehandStatistics.js ***! 28468 \******************************************************/ 28469/*! exports provided: default */ 28470/***/ (function(module, __webpack_exports__, __webpack_require__) { 28471 28472"use strict"; 28473__webpack_require__.r(__webpack_exports__); 28474/* harmony import */ var _pointInFreehand_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./pointInFreehand.js */ "./util/freehand/pointInFreehand.js"); 28475 28476/** 28477 * Calculates the statistics of all the pixels within the freehand object. 28478 * @export @public @method 28479 * @name calculateFreehandStatistics 28480 * 28481 * @param {Object} sp An array of the pixel data. 28482 * @param {Object} boundingBox Rectangular box enclosing the polygon. 28483 * @param {Object} dataHandles Data object associated with the tool. 28484 * @returns {Object} Object containing the derived statistics. 28485 */ 28486 28487/* harmony default export */ __webpack_exports__["default"] = (function (sp, boundingBox, dataHandles) { 28488 var statisticsObj = { 28489 count: 0, 28490 mean: 0.0, 28491 variance: 0.0, 28492 stdDev: 0.0 28493 }; 28494 var sum = getSum(sp, boundingBox, dataHandles); 28495 28496 if (sum.count === 0) { 28497 return statisticsObj; 28498 } 28499 28500 statisticsObj.count = sum.count; 28501 statisticsObj.mean = sum.value / sum.count; 28502 statisticsObj.variance = sum.squared / sum.count - statisticsObj.mean * statisticsObj.mean; 28503 statisticsObj.stdDev = Math.sqrt(statisticsObj.variance); 28504 return statisticsObj; 28505}); 28506/** 28507 * Calculates the sum, squared sum and count of all pixels within the polygon. 28508 * @private 28509 * @method 28510 * @name getSum 28511 * 28512 * @param {Object} sp An array of the pixel data. 28513 * @param {Object} boundingBox Rectangular box enclosing the polygon. 28514 * @param {Object} dataHandles Data object associated with the tool. 28515 * @returns {Object} Object containing the sum, squared sum and pixel count. 28516 */ 28517 28518function getSum(sp, boundingBox, dataHandles) { 28519 var sum = { 28520 value: 0, 28521 squared: 0, 28522 count: 0 28523 }; 28524 var index = 0; 28525 28526 for (var y = boundingBox.top; y < boundingBox.top + boundingBox.height; y++) { 28527 for (var x = boundingBox.left; x < boundingBox.left + boundingBox.width; x++) { 28528 var point = { 28529 x: x, 28530 y: y 28531 }; 28532 sumPointIfInFreehand(dataHandles, point, sum, sp[index]); 28533 index++; 28534 } 28535 } 28536 28537 return sum; 28538} 28539/** 28540 * Adds the pixel to the workingSum if it is within the polygon. 28541 * @private 28542 * @method sumPointIfInFreehand 28543 * 28544 * @param {Object} dataHandles Data object associated with the tool. 28545 * @param {Object} point The pixel coordinates. 28546 * @param {Object} workingSum The working sum, squared sum and pixel count. 28547 * @param {Object} pixelValue The pixel value. // @modifies {workingSum} 28548 * @returns {undefined} 28549 */ 28550 28551 28552function sumPointIfInFreehand(dataHandles, point, workingSum, pixelValue) { 28553 if (Object(_pointInFreehand_js__WEBPACK_IMPORTED_MODULE_0__["default"])(dataHandles, point)) { 28554 workingSum.value += pixelValue; 28555 workingSum.squared += pixelValue * pixelValue; 28556 workingSum.count++; 28557 } 28558} 28559 28560/***/ }), 28561
28562/***/ "./util/freehand/freehandArea.js": 28563/*!***************************************!*\ 28564 !*** ./util/freehand/freehandArea.js ***! 28565 \***************************************/ 28566/*! exports provided: default */ 28567/***/ (function(module, __webpack_exports__, __webpack_require__) { 28568 28569"use strict"; 28570__webpack_require__.r(__webpack_exports__); 28571/** 28572 * Calculates the area of a freehand tool polygon. 28573 * @export @public @method 28574 * @name freehandArea 28575 * 28576 * @param {Object} dataHandles Data object associated with the tool. 28577 * @param {Object} scaling Area scaling of image. 28578 * @returns {number} The area of the polygon. 28579 */ 28580/* harmony default export */ __webpack_exports__["default"] = (function (dataHandles, scaling) { 28581 var freeHandArea = 0; 28582 var j = dataHandles.length - 1; // The last vertex is the previous one to the first 28583 28584 scaling = scaling || 1; // If scaling is falsy, set scaling to 1 28585 28586 for (var i = 0; i < dataHandles.length; i++) { 28587 freeHandArea += (dataHandles[j].x + dataHandles[i].x) * (dataHandles[j].y - dataHandles[i].y); 28588 j = i; // Here j is previous vertex to i 28589 } 28590 28591 return Math.abs(freeHandArea * scaling / 2.0); 28592}); 28593 28594/***/ }), 28595
28596/***/ "./util/freehand/freehandIntersect.js": 28597/*!********************************************!*\ 28598 !*** ./util/freehand/freehandIntersect.js ***! 28599 \********************************************/ 28600/*! exports provided: default */ 28601/***/ (function(module, __webpack_exports__, __webpack_require__) { 28602 28603"use strict"; 28604__webpack_require__.r(__webpack_exports__); 28605/** 28606 * Orientation algoritm to determine if two lines cross. 28607 * Credit and details: geeksforgeeks.org/check-if-two-given-line-segments-intersect/ 28608 */ 28609 28610/** 28611 * Determines whether a new handle causes an intersection of the lines of the polygon. 28612 * @public 28613 * @function newHandle 28614 * 28615 * @param {Object} candidateHandle The new handle to check. 28616 * @param {Object} dataHandles data object associated with the tool. 28617 * @returns {boolean} - Whether the new line intersects with any other lines of the polygon. 28618 */ 28619function newHandle(candidateHandle, dataHandles) { 28620 // Check if the proposed line will intersect any existent line 28621 var lastHandleId = dataHandles.length - 1; 28622 var lastHandle = getCoords(dataHandles[lastHandleId]); 28623 var newHandle = getCoords(candidateHandle); 28624 return doesIntersectOtherLines(dataHandles, lastHandle, newHandle, [lastHandleId]); 28625} 28626/** 28627 * Checks if the last line of a polygon will intersect the other lines of the polgyon. 28628 * @public 28629 * @function end 28630 * 28631 * @param {Object} dataHandles data object associated with the tool. 28632 * @returns {boolean} Whether the last line intersects with any other lines of the polygon. 28633 */ 28634 28635 28636function end(dataHandles) { 28637 var lastHandleId = dataHandles.length - 1; 28638 var lastHandle = getCoords(dataHandles[lastHandleId]); 28639 var firstHandle = getCoords(dataHandles[0]); 28640 return doesIntersectOtherLines(dataHandles, lastHandle, firstHandle, [lastHandleId, 0]); 28641} 28642/** 28643 * Checks whether the modification of a handle's position causes intersection of the lines of the polygon. 28644 * @public 28645 * @method modify 28646 * 28647 * @param {Object} dataHandles Data object associated with the tool. 28648 * @param {number} modifiedHandleId The id of the handle being modified. 28649 * @returns {boolean} Whether the modfication causes any intersections. 28650 */ 28651 28652 28653function modify(dataHandles, modifiedHandleId) { 28654 // Check if the modifiedHandle's previous and next lines will intersect any other line in the polygon 28655 var modifiedHandle = getCoords(dataHandles[modifiedHandleId]); // Previous neightbor handle 28656 28657 var neighborHandleId = modifiedHandleId - 1; 28658 28659 if (modifiedHandleId === 0) { 28660 neighborHandleId = dataHandles.length - 1; 28661 } 28662 28663 var neighborHandle = getCoords(dataHandles[neighborHandleId]); 28664 28665 if (doesIntersectOtherLines(dataHandles, modifiedHandle, neighborHandle, [modifiedHandleId, neighborHandleId])) { 28666 return true; 28667 } // Next neightbor handle 28668 28669 28670 if (modifiedHandleId === dataHandles.length - 1) { 28671 neighborHandleId = 0; 28672 } else { 28673 neighborHandleId = modifiedHandleId + 1; 28674 } 28675 28676 neighborHandle = getCoords(dataHandles[neighborHandleId]); 28677 return doesIntersectOtherLines(dataHandles, modifiedHandle, neighborHandle, [modifiedHandleId, neighborHandleId]); 28678} 28679/** 28680 * Checks whether the line (p1,q1) intersects any of the other lines in the polygon. 28681 * @private 28682 * @function doesIntersectOtherLines 28683 * 28684 * @param {Object} dataHandles Data object associated with the tool. 28685 * @param {Object} p1 Coordinates of the start of the line. 28686 * @param {Object} q1 Coordinates of the end of the line. 28687 * @param {Object} ignoredHandleIds Ids of handles to ignore (i.e. lines that share a vertex with the line being tested). 28688 * @returns {boolean} Whether the line intersects any of the other lines in the polygon. 28689 */ 28690 28691 28692function doesIntersectOtherLines(dataHandles, p1, q1, ignoredHandleIds) { 28693 var j = dataHandles.length - 1; 28694 28695 for (var i = 0; i < dataHandles.length; i++) { 28696 if (ignoredHandleIds.indexOf(i) !== -1 || ignoredHandleIds.indexOf(j) !== -1) { 28697 j = i; 28698 continue; 28699 } 28700 28701 var p2 = getCoords(dataHandles[j]); 28702 var q2 = getCoords(dataHandles[i]); 28703 28704 if (doesIntersect(p1, q1, p2, q2)) { 28705 return true; 28706 } 28707 28708 j = i; 28709 } 28710 28711 return false; 28712} 28713/** 28714 * Checks whether the line (p1,q1) intersects the line (p2,q2) via an orientation algorithm. 28715 * @private 28716 * @function doesIntersect 28717 * 28718 * @param {Object} p1 Coordinates of the start of the line 1. 28719 * @param {Object} q1 Coordinates of the end of the line 1. 28720 * @param {Object} p2 Coordinates of the start of the line 2. 28721 * @param {Object} q2 Coordinates of the end of the line 2. 28722 * @returns {boolean} Whether lines (p1,q1) and (p2,q2) intersect. 28723 */ 28724 28725 28726function doesIntersect(p1, q1, p2, q2) { 28727 var result = false;
28728 var orient = [orientation(p1, q1, p2), orientation(p1, q1, q2), orientation(p2, q2, p1), orientation(p2, q2, q1)]; // General Case 28729 28730 if (orient[0] !== orient[1] && orient[2] !== orient[3]) { 28731 return true; 28732 } // Special Cases 28733 28734 28735 if (orient[0] === 0 && onSegment(p1, p2, q1)) { 28736 // If p1, q1 and p2 are colinear and p2 lies on segment p1q1 28737 result = true; 28738 } else if (orient[1] === 0 && onSegment(p1, q2, q1)) { 28739 // If p1, q1 and p2 are colinear and q2 lies on segment p1q1 28740 result = true; 28741 } else if (orient[2] === 0 && onSegment(p2, p1, q2)) { 28742 // If p2, q2 and p1 are colinear and p1 lies on segment p2q2 28743 result = true; 28744 } else if (orient[3] === 0 && onSegment(p2, q1, q2)) { 28745 // If p2, q2 and q1 are colinear and q1 lies on segment p2q2 28746 result = true; 28747 } 28748 28749 return result; 28750} 28751/** 28752 * Returns an object with two properties, x and y, from a heavier FreehandHandleData object. 28753 * @private 28754 * @function getCoords 28755 * 28756 * @param {Object} dataHandle Data object associated with a single handle in the freehand tool. 28757 * @returns {Object} An object containing position propeties x and y. 28758 */ 28759 28760 28761function getCoords(dataHandle) { 28762 return { 28763 x: dataHandle.x, 28764 y: dataHandle.y 28765 }; 28766} 28767/** 28768 * Checks the orientation of 3 points. 28769 * @private 28770 * @function orientation 28771 * 28772 * @param {Object} p First point. 28773 * @param {Object} q Second point. 28774 * @param {Object} r Third point. 28775 * @returns {number} - 0: Colinear, 1: Clockwise, 2: Anticlockwise 28776 */ 28777 28778 28779function orientation(p, q, r) { 28780 var orientationValue = (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y); 28781 28782 if (orientationValue === 0) { 28783 return 0; // Colinear 28784 } 28785 28786 return orientationValue > 0 ? 1 : 2; 28787} 28788/** 28789 * Checks if point q lines on the segment (p,r). 28790 * @private 28791 * @function onSegment 28792 * 28793 * @param {Object} p Point p. 28794 * @param {Object} q Point q. 28795 * @param {Object} r Point r. 28796 * @returns {boolean} - If q lies on line segment (p,r). 28797 */ 28798 28799 28800function onSegment(p, q, r) { 28801 if (q.x <= Math.max(p.x, r.x) && q.x >= Math.min(p.x, r.x) && q.y <= Math.max(p.y, r.y) && q.y >= Math.min(p.y, r.y)) { 28802 return true; 28803 } 28804 28805 return false; 28806} 28807 28808/* harmony default export */ __webpack_exports__["default"] = ({ 28809 newHandle: newHandle, 28810 end: end, 28811 modify: modify 28812}); 28813 28814/***/ }), 28815
28816/***/ "./util/freehand/index.js": 28817/*!********************************!*\ 28818 !*** ./util/freehand/index.js ***! 28819 \********************************/ 28820/*! exports provided: default */ 28821/***/ (function(module, __webpack_exports__, __webpack_require__) { 28822 28823"use strict"; 28824__webpack_require__.r(__webpack_exports__); 28825/* harmony import */ var _calculateFreehandStatistics_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./calculateFreehandStatistics.js */ "./util/freehand/calculateFreehandStatistics.js"); 28826/* harmony import */ var _ClickedLineData_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./ClickedLineData.js */ "./util/freehand/ClickedLineData.js"); 28827/* harmony import */ var _freehandArea_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./freehandArea.js */ "./util/freehand/freehandArea.js"); 28828/* harmony import */ var _FreehandHandleData_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./FreehandHandleData.js */ "./util/freehand/FreehandHandleData.js"); 28829/* harmony import */ var _freehandIntersect_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./freehandIntersect.js */ "./util/freehand/freehandIntersect.js"); 28830/* harmony import */ var _FreehandLineFinder_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./FreehandLineFinder.js */ "./util/freehand/FreehandLineFinder.js"); 28831/* harmony import */ var _insertOrDelete_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./insertOrDelete.js */ "./util/freehand/insertOrDelete.js"); 28832/* harmony import */ var _pointInFreehand_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./pointInFreehand.js */ "./util/freehand/pointInFreehand.js"); 28833/* harmony import */ var _addLine_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./addLine.js */ "./util/freehand/addLine.js"); 28834 28835 28836 28837 28838 28839 28840 28841 28842 28843/* harmony default export */ __webpack_exports__["default"] = ({ 28844 calculateFreehandStatistics: _calculateFreehandStatistics_js__WEBPACK_IMPORTED_MODULE_0__["default"], 28845 ClickedLineData: _ClickedLineData_js__WEBPACK_IMPORTED_MODULE_1__["default"], 28846 freehandArea: _freehandArea_js__WEBPACK_IMPORTED_MODULE_2__["default"], 28847 FreehandHandleData: _FreehandHandleData_js__WEBPACK_IMPORTED_MODULE_3__["default"], 28848 freehandIntersect: _freehandIntersect_js__WEBPACK_IMPORTED_MODULE_4__["default"], 28849 FreehandLineFinder: _FreehandLineFinder_js__WEBPACK_IMPORTED_MODULE_5__["default"], 28850 insertOrDelete: _insertOrDelete_js__WEBPACK_IMPORTED_MODULE_6__["default"], 28851 pointInFreehand: _pointInFreehand_js__WEBPACK_IMPORTED_MODULE_7__["default"], 28852 addLine: _addLine_js__WEBPACK_IMPORTED_MODULE_8__["default"] 28853}); 28854 28855/***/ }), 28856
28857/***/ "./util/freehand/insertOrDelete.js": 28858/*!*****************************************!*\ 28859 !*** ./util/freehand/insertOrDelete.js ***! 28860 \*****************************************/ 28861/*! exports provided: default */ 28862/***/ (function(module, __webpack_exports__, __webpack_require__) { 28863 28864"use strict"; 28865__webpack_require__.r(__webpack_exports__); 28866/* harmony import */ var _FreehandLineFinder_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./FreehandLineFinder.js */ "./util/freehand/FreehandLineFinder.js"); 28867/* harmony import */ var _FreehandHandleData_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./FreehandHandleData.js */ "./util/freehand/FreehandHandleData.js"); 28868/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../stateManagement/toolState.js */ "./stateManagement/toolState.js"); 28869/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../externalModules.js */ "./externalModules.js"); 28870/* harmony import */ var _addLine_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./addLine.js */ "./util/freehand/addLine.js"); 28871 28872 28873 28874 28875 28876/** 28877 * Inserts or deletes a point from a freehand tool. 28878 * @export @public @method 28879 * @name insertOrDelete 28880 * 28881 * @param {Object} evt The event. 28882 * @param {Object} nearby Object containing information about a nearby handle. 28883 * @returns {void} 28884 */ 28885 28886/* harmony default export */ __webpack_exports__["default"] = (function (evt, nearby) { 28887 var eventData = evt.detail; 28888 28889 if (nearby && nearby.handleNearby !== null) { 28890 var deleteInfo = { 28891 toolIndex: nearby.toolIndex, 28892 handleIndex: nearby.handleNearby 28893 }; 28894 28895 _deletePoint.call(this, eventData, deleteInfo); 28896 } else { 28897 var freehandLineFinder = new _FreehandLineFinder_js__WEBPACK_IMPORTED_MODULE_0__["default"](eventData, this.name); 28898 var insertInfo = freehandLineFinder.findLine(); 28899 28900 if (insertInfo) { 28901 _insertPoint.call(this, eventData, insertInfo); 28902 } 28903 } 28904}); 28905/** 28906 * Deletes a point from a freehand tool. 28907 * @private 28908 * @method 28909 * 28910 * @param {Object} eventData The data object associated with the event. 28911 * @param {Object} deleteInfo Object containing information about which point to delete. 28912 * @returns {void} 28913 */ 28914 28915function _deletePoint(eventData, deleteInfo) { 28916 var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_2__["getToolState"])(eventData.element, this.name); 28917 28918 if (toolData === undefined) { 28919 return; 28920 } 28921 28922 var deleteHandle = deleteInfo.handleIndex; 28923 var toolIndex = deleteInfo.toolIndex; // Get the toolData from insertInfo 28924 28925 var data = toolData.data[toolIndex]; 28926 var points = data.handles.points; // Only allow delete if > 3 points 28927 28928 if (points.length <= 3) { 28929 return; 28930 } // Link the line of the previous handle to the one after handles[deleteHandle]; 28931 28932 28933 if (deleteHandle === points.length - 1) { 28934 points[deleteHandle - 1].lines.pop(); 28935 points[deleteHandle - 1].lines.push(points[0]); 28936 } else if (deleteHandle === 0) { 28937 points[points.length - 1].lines.pop(); 28938 points[points.length - 1].lines.push(points[deleteHandle + 1]); 28939 } else { 28940 points[deleteHandle - 1].lines.pop(); 28941 points[deleteHandle - 1].lines.push(points[deleteHandle + 1]); 28942 } // Remove the handle 28943 28944 28945 points.splice(deleteHandle, 1); 28946 data.invalidated = true; 28947 data.active = true; 28948 data.highlight = true; // Force onImageRendered to fire 28949 28950 _externalModules_js__WEBPACK_IMPORTED_MODULE_3__["default"].cornerstone.updateImage(eventData.element); 28951} 28952/** 28953 * Inserts a new point into a freehand tool. 28954 * @private 28955 * @method 28956 * 28957 * @param {Object} eventData - The data object associated with the event. 28958 * @param {Object} insertInfo - Object containing information about where to insert the point. 28959 * @returns {void} 28960 */ 28961 28962 28963function _insertPoint(eventData, insertInfo) { 28964 var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_2__["getToolState"])(eventData.element, this.name); 28965 28966 if (toolData === undefined) { 28967 return; 28968 } // Get the toolData from insertInfo 28969 28970 28971 var data = toolData.data[insertInfo.toolIndex]; 28972 28973 var insertIndex = _getInsertionIndex(insertInfo); 28974 28975 if (insertIndex === Infinity) { 28976 return; 28977 } 28978 28979 var handleData = new _FreehandHandleData_js__WEBPACK_IMPORTED_MODULE_1__["default"](eventData.currentPoints.image); 28980 var points = data.handles.points; // Add the new handle 28981 28982 points.splice(insertIndex, 0, handleData); // Add the line from the previous handle to the inserted handle (note the tool is now one increment longer) 28983 28984 points[insertIndex - 1].lines.pop(); 28985 points[insertIndex - 1].lines.push(eventData.currentPoints.image); 28986 Object(_addLine_js__WEBPACK_IMPORTED_MODULE_4__["default"])(points, insertIndex); 28987 data.active = true; 28988 data.highlight = true; // Force onImageRendered to fire 28989 28990 data.invalidated = true; 28991 _externalModules_js__WEBPACK_IMPORTED_MODULE_3__["default"].cornerstone.updateImage(eventData.element); 28992} 28993/** 28994 * Gets the handle index of a tool in which to insert the new point. 28995 * @private 28996 * @method 28997 * 28998 * @param {Object} insertInfo - Object containing information about where to insert the point. 28999 * @returns {void} 29000 */ 29001 29002 29003function _getInsertionIndex(insertInfo) { 29004 // Get lowest index that isn't zero 29005 var handleIndexArray = insertInfo.handleIndexArray; 29006 var insertIndex = Infinity; 29007 var arrayContainsZero = handleIndexArray.includes(0); 29008 29009 for (var i = 0; i < handleIndexArray.length; i++) { 29010 var index = handleIndexArray[i]; 29011 29012 if (index !== 0 && index < insertIndex) { 29013 insertIndex = index; 29014 } 29015 } // Treat the special case of handleIndexArray === [0,1] || [1,0] 29016 29017 29018 if (arrayContainsZero && insertIndex === 1) { 29019 insertIndex = 0; 29020 } // The insertion index shall be just after the lower index 29021 29022 29023 insertIndex++; 29024 return insertIndex; 29025} 29026 29027/***/ }), 29028
29029/***/ "./util/freehand/pointInFreehand.js": 29030/*!******************************************!*\ 29031 !*** ./util/freehand/pointInFreehand.js ***! 29032 \******************************************/ 29033/*! exports provided: default */ 29034/***/ (function(module, __webpack_exports__, __webpack_require__) { 29035 29036"use strict"; 29037__webpack_require__.r(__webpack_exports__); 29038/** 29039 * Calculates whether "location" is inside the polygon defined by dataHandles 29040 * by counting the number of times a ray originating from "point" crosses the 29041 * edges of the polygon. Odd === inside, Even === outside. 29042 * @export @public @method 29043 * @name pointInFreehand 29044 * 29045 * @param {Object} dataHandles Data object associated with the tool. 29046 * @param {Object} location The coordinates being queried. 29047 * @returns {boolean} True if the location is inside the polygon defined by dataHandles. 29048 */ 29049/* harmony default export */ __webpack_exports__["default"] = (function (dataHandles, location) { 29050 var inROI = false; // Cycle round pairs of points 29051 29052 var j = dataHandles.length - 1; // The last vertex is the previous one to the first 29053 29054 for (var i = 0; i < dataHandles.length; i++) { 29055 if (rayFromPointCrosssesLine(location, dataHandles[i], dataHandles[j])) { 29056 inROI = !inROI; 29057 } 29058 29059 j = i; // Here j is previous vertex to i 29060 } 29061 29062 return inROI; 29063}); 29064/** 29065 * Returns true if the y-position yp is enclosed within y-positions y1 and y2. 29066 * @private 29067 * @method 29068 * @name isEnclosedY 29069 * 29070 * @param {number} yp The y position of point p. 29071 * @param {number} y1 The y position of point 1. 29072 * @param {number} y2 The y position of point 2. 29073 * @returns {boolean} True if the y-position yp is enclosed within y-positions y1 and y2. 29074 */ 29075 29076function isEnclosedY(yp, y1, y2) { 29077 if (y1 < yp && yp < y2 || y2 < yp && yp < y1) { 29078 return true; 29079 } 29080 29081 return false; 29082} 29083/** 29084 * Returns true if the line segment is to the right of the point. 29085 * @private 29086 * @method 29087 * @name isLineRightOfPoint 29088 * 29089 * @param {Object} point The point being queried. 29090 * @param {Object} lp1 The first point of the line segment. 29091 * @param {Object} lp2 The second point of the line segment. 29092 * @returns {boolean} True if the line is to the right of the point. 29093 */ 29094 29095 29096function isLineRightOfPoint(point, lp1, lp2) { 29097 // If both right of point return true 29098 if (lp1.x > point.x && lp2.x > point.x) { 29099 return true; 29100 } // Catch when line is vertical. 29101 29102 29103 if (lp1.x === lp2.x) { 29104 return point.x < lp1.x; 29105 } // Put leftmost point in lp1 29106 29107 29108 if (lp1.x > lp2.x) { 29109 var lptemp = lp1; 29110 lp1 = lp2; 29111 lp2 = lptemp; 29112 } 29113 29114 var lPointY = lineSegmentAtPoint(point, lp1, lp2); // If the lp1.x and lp2.x enclose point.x check gradient of line and see if 29115 // Point is above or below the line to calculate if it inside. 29116 29117 if (Math.sign(lPointY.gradient) * point.y > lPointY.value) { 29118 return true; 29119 } 29120 29121 return false; 29122} 29123/** 29124 * Returns the y value of the line segment at the x value of the point. 29125 * @private 29126 * @method 29127 * @name lineSegmentAtPoint 29128 * 29129 * @param {Object} point The point being queried. 29130 * @param {Object} lp1 The first point of the line segment. 29131 * @param {Object} lp2 The second point of the line segment. 29132 * @returns {Object} An object containing the y value as well as the gradient of the line segment. 29133 */ 29134 29135 29136function lineSegmentAtPoint(point, lp1, lp2) { 29137 var dydx = (lp2.y - lp1.y) / (lp2.x - lp1.x); 29138 var fx = { 29139 value: lp1.x + dydx * (point.x - lp1.x), 29140 gradient: dydx 29141 }; 29142 return fx; 29143} 29144/** 29145 * Returns true if a rightwards ray originating from the point crosses the line defined by handleI and handleJ. 29146 * @private 29147 * @method 29148 * @name rayFromPointCrosssesLine 29149 * 29150 * @param {Object} point The point being queried. 29151 * @param {Object} handleI The first handle of the line segment. 29152 * @param {Object} handleJ The second handle of the line segment. 29153 * @returns {boolean} True if a rightwards ray originating from the point crosses the line defined by handleI and handleJ. 29154 */ 29155 29156 29157function rayFromPointCrosssesLine(point, handleI, handleJ) { 29158 if (isEnclosedY(point.y, handleI.y, handleJ.y) && isLineRightOfPoint(point, handleI, handleJ)) { 29159 return true; 29160 } 29161 29162 return false;
29163} 29164 29165/***/ }), 29166
29167/***/ "./util/getActiveTool.js": 29168/*!*******************************!*\ 29169 !*** ./util/getActiveTool.js ***! 29170 \*******************************/ 29171/*! exports provided: default */ 29172/***/ (function(module, __webpack_exports__, __webpack_require__) { 29173 29174"use strict"; 29175__webpack_require__.r(__webpack_exports__); 29176/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return getActiveTool; }); 29177/* harmony import */ var _store__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../store */ "./store/index.js"); 29178/* harmony import */ var _store_getActiveToolsForElement__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../store/getActiveToolsForElement */ "./store/getActiveToolsForElement.js"); 29179/* harmony import */ var _store_filterToolsUsableWithMultiPartTools__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../store/filterToolsUsableWithMultiPartTools */ "./store/filterToolsUsableWithMultiPartTools.js"); 29180 29181 29182 // Todo: We could simplify this if we only allow one active 29183// Tool per mou
29183se button mask? 29184 29185function getActiveTool(element, buttons) { 29186 var interactionType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'mouse'; 29187 var tools; 29188 29189 if (interactionType === 'touch') { 29190 tools = Object(_store_getActiveToolsForElement__WEBPACK_IMPORTED_MODULE_1__["default"])(element, _store__WEBPACK_IMPORTED_MODULE_0__["getters"].touchTools()); 29191 tools = tools.filter(function (tool) { 29192 return tool.options.isTouchActive; 29193 }); 29194 } else { 29195 // Filter out disabled, enabled, and passive 29196 tools = Object(_store_getActiveToolsForElement__WEBPACK_IMPORTED_MODULE_1__["default"])(element, _store__WEBPACK_IMPORTED_MODULE_0__["getters"].mouseTools()); // Filter out tools that do not match mouseButtonMask 29197 29198 tools = tools.filter(function (tool) { 29199 return Array.isArray(tool.options.mouseButtonMask) && buttons && tool.options.mouseButtonMask.includes(buttons) && tool.options.isMouseActive; 29200 }); 29201 29202 if (_store__WEBPACK_IMPORTED_MODULE_0__["state"].isMultiPartToolActive) { 29203 tools = Object(_store_filterToolsUsableWithMultiPartTools__WEBPACK_IMPORTED_MODULE_2__["default"])(tools); 29204 } 29205 } 29206 29207 if (tools.length === 0) { 29208 return; 29209 } 29210 29211 return tools[0]; 29212} 29213 29214/***/ }), 29215
29216/***/ "./util/getDefault.js": 29217/*!****************************!*\ 29218 !*** ./util/getDefault.js ***! 29219 \****************************/ 29220/*! exports provided: default */ 29221/***/ (function(module, __webpack_exports__, __webpack_require__) { 29222 29223"use strict"; 29224__webpack_require__.r(__webpack_exports__); 29225/** 29226 * Returns the first argument if defined, otherwise returns the second 29227 * 29228 * @param {*} value 29229 * @param {*} defaultValue 29230 * @returns {*} 29231 */ 29232/* harmony default export */ __webpack_exports__["default"] = (function (value, defaultValue) { 29233 return value === undefined ? defaultValue : value; 29234}); 29235 29236/***/ }), 29237
29238/***/ "./util/getKeyFromKeyCode.js": 29239/*!***********************************!*\ 29240 !*** ./util/getKeyFromKeyCode.js ***! 29241 \***********************************/ 29242/*! exports provided: default */ 29243/***/ (function(module, __webpack_exports__, __webpack_require__) { 29244 29245"use strict"; 29246__webpack_require__.r(__webpack_exports__); 29247/** 29248 * Returns a string representation of the a key, given a keycode. Useful for 29249 * hooking up api calls to buttons using external libraries. 29250 * @export @public @method 29251 * @name getKeyFromKeyCode 29252 * 29253 * @param {number} keyCode The keycode to look up. 29254 * @returns {string} The corresponding character. 29255 */ 29256/* harmony default export */ __webpack_exports__["default"] = (function (keyCode) { 29257 return KEY_CODES[keyCode]; 29258}); 29259var KEY_CODES = { 29260 // Numbers - above letter keys 29261 48: '0', 29262 49: '1', 29263 50: '2', 29264 51: '3', 29265 52: '4', 29266 53: '5', 29267 54: '6', 29268 55: '7', 29269 56: '8', 29270 57: '9', 29271 // Numbers - numpad 29272 96: '0', 29273 97: '1', 29274 98: '2', 29275 99: '3', 29276 100: '4', 29277 101: '5', 29278 102: '6', 29279 103: '7', 29280 104: '8', 29281 105: '9', 29282 // Letters 29283 65: 'a', 29284 66: 'b', 29285 67: 'c', 29286 68: 'd', 29287 69: 'e', 29288 70: 'f', 29289 71: 'g', 29290 72: 'h', 29291 73: 'i', 29292 74: 'j', 29293 75: 'k', 29294 76: 'l', 29295 77: 'm', 29296 78: 'n', 29297 79: 'o', 29298 80: 'p', 29299 81: 'q', 29300 82: 'r', 29301 83: 's', 29302 84: 't', 29303 85: 'u', 29304 86: 'v', 29305 87: 'w', 29306 88: 'x', 29307 89: 'y', 29308 90: 'z', 29309 // Function keys 29310 112: 'F1', 29311 113: 'F2', 29312 114: 'F3', 29313 115: 'F4', 29314 116: 'F5', 29315 // Command keys 29316 13: 'RETURN', 29317 8: 'BACKSPACE', 29318 9: 'TAB', 29319 46: 'DELETE', 29320 12: 'DELETE', 29321 27: 'ESCAPE', 29322 20: 'CAPSLOCK', 29323 // Misc - NOTE: There are multiple keycodes for certain characters due to browsers having different mappings. 29324 173: '-', 29325 189: '-', 29326 109: '-', 29327 61: '+', 29328 187: '+', 29329 107: '+', 29330 219: '[', 29331 221: ']', 29332 59: ';', 29333 186: ';', 29334 188: ',', 29335 190: '.', 29336 199: '/' 29337}; 29338 29339/***/ }), 29340
29341/***/ "./util/getLuminance.js": 29342/*!******************************!*\ 29343 !*** ./util/getLuminance.js ***! 29344 \******************************/ 29345/*! exports provided: default */ 29346/***/ (function(module, __webpack_exports__, __webpack_require__) { 29347 29348"use strict"; 29349__webpack_require__.r(__webpack_exports__); 29350/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js"); 29351 29352/** 29353 * Returns the luminance of a region. 29354 * @public 29355 * @function getLuminance 29356 * 29357 * @param {HTMLElement} element The element. 29358 * @param {number} x The x position of the top-left corner of the region. 29359 * @param {number} y The y position of the top-left corner of the region. 29360 * @param {number} width The width of the region. 29361 * @param {number} height The height of the region 29362 * @returns {number[]} The luminance. 29363 */ 29364 29365/* harmony default export */ __webpack_exports__["default"] = (function (element, x, y, width, height) { 29366 if (!element) { 29367 throw new Error('getLuminance: parameter element must not be undefined'); 29368 } 29369 29370 x = Math.round(x); 29371 y = Math.round(y); 29372 var enabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.getEnabledElement(element); 29373 var image = enabledElement.image; 29374 var luminance = []; 29375 var index = 0; 29376 var pixelData = image.getPixelData(); 29377 var spIndex, row, column; 29378 29379 if (image.color) { 29380 for (row = 0; row < height; row++) { 29381 for (column = 0; column < width; column++) { 29382 spIndex = ((row + y) * image.columns + (column + x)) * 4; 29383 var red = pixelData[spIndex]; 29384 var green = pixelData[spIndex + 1]; 29385 var blue = pixelData[spIndex + 2]; 29386 luminance[index++] = 0.2126 * red + 0.7152 * green + 0.0722 * blue; 29387 } 29388 } 29389 } else { 29390 for (row = 0; row < height; row++) { 29391 for (column = 0; column < width; column++) { 29392 spIndex = (row + y) * image.columns + (column + x); 29393 luminance[index++] = pixelData[spIndex] * image.slope + image.intercept; 29394 } 29395 } 29396 } 29397 29398 return luminance; 29399}); 29400 29401/***/ }), 29402
29403/***/ "./util/getMaxSimultaneousRequests.js": 29404/*!********************************************!*\ 29405 !*** ./util/getMaxSimultaneousRequests.js ***! 29406 \********************************************/ 29407/*! exports provided: getDefaultSimultaneousRequests, getMaxSimultaneousRequests, setMaxSimultaneousRequests, getBrowserInfo, isMobileDevice */ 29408/***/ (function(module, __webpack_exports__, __webpack_require__) { 29409 29410"use strict"; 29411__webpack_require__.r(__webpack_exports__); 29412/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getDefaultSimultaneousRequests", function() { return getDefaultSimultaneousRequests; }); 29413/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getMaxSimultaneousRequests", function() { return getMaxSimultaneousRequests; }); 29414/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setMaxSimultaneousRequests", function() { return setMaxSimultaneousRequests; }); 29415/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getBrowserInfo", function() { return getBrowserInfo; }); 29416/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isMobileDevice", function() { return isMobileDevice; }); 29417var configMaxSimultaneousRequests; // Maximum concurrent connections to the same server 29418// Information from http://sgdev-blog.blogspot.fr/2014/01/maximum-concurrent-connection-to-same.html 29419 29420var maxSimultaneousRequests = { 29421 default: 6, 29422 IE: { 29423 9: 6, 29424 10: 8, 29425 default: 8 29426 }, 29427 Firefox: { 29428 default: 6 29429 }, 29430 Opera: { 29431 10: 8, 29432 11: 6, 29433 12: 6, 29434 default: 6 29435 }, 29436 Chrome: { 29437 default: 6 29438 }, 29439 Safari: { 29440 default: 6 29441 } 29442}; // Browser name / version detection 29443// 29444// 29445 29446/** 29447 * Browser name / version detection 29448 * http://stackoverflow.com/questions/2400935/browser-detection-in-javascript 29449 * @export @public @method 29450 * @name getBrowserInfo 29451 * 29452 * @returns {string} The name and version of the browser. 29453 */ 29454 29455function getBrowserInfo() { 29456 var ua = navigator.userAgent; 29457 var M = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || []; 29458 var tem; 29459 29460 if (/trident/i.test(M[1])) { 29461 tem = /\brv[ :]+(\d+)/g.exec(ua) || []; 29462 return "IE ".concat(tem[1] || ''); 29463 } 29464 29465 if (M[1] === 'Chrome') { 29466 tem = ua.match(/\b(OPR|Edge)\/(\d+)/); 29467 29468 if (tem !== null) { 29469 return tem.slice(1).join(' ').replace('OPR', 'Opera'); 29470 } 29471 } 29472 29473 M = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, '-?']; 29474 29475 if ((tem = ua.match(/version\/(\d+)/i)) !== null) { 29476 M.splice(1, 1, tem[1]); 29477 } 29478 29479 return M.join(' '); 29480} 29481/** 29482 * Sets the maximum number of simultaneous requests. 29483 * @export @public @method 29484 * @name setMaxSimultaneousRequests 29485 * 29486 * @param {number} newMaxSimultaneousRequests The value. 29487 * @returns {void} 29488 */ 29489 29490 29491function setMaxSimultaneousRequests(newMaxSimultaneousRequests) { 29492 configMaxSimultaneousRequests = newMaxSimultaneousRequests; 29493} 29494/** 29495 * Returns the maximum number of simultaneous requests. 29496 * @export @public @method 29497 * @name getMaxSimultaneousRequests 29498 * 29499 * @returns {number} The maximum number of simultaneous requests 29500 */ 29501 29502 29503function getMaxSimultaneousRequests() { 29504 if (configMaxSimultaneousRequests) { 29505 return configMaxSimultaneousRequests; 29506 } 29507 29508 return getDefaultSimultaneousRequests(); 29509} 29510/** 29511 * Returns the default number of simultaneous requests. 29512 * @export @public @method 29513 * @name getDefaultSimultaneousRequests 29514 * 29515 * @returns {number} The default number of simultaneous requests. 29516 */ 29517 29518 29519function getDefaultSimultaneousRequests() { 29520 var infoString = getBrowserInfo(); 29521 var info = infoString.split(' '); 29522 var browserName = info[0]; 29523 var browserVersion = info[1]; 29524 var browserData = maxSimultaneousRequests[browserName]; 29525 29526 if (!browserData) { 29527 return maxSimultaneousRequests.default; 29528 } 29529 29530 if (!browserData[browserVersion]) { 29531 return browserData.default; 29532 } 29533 29534 return browserData[browserVersion]; 29535} 29536/** 29537 * Checks if cornerstoneTools is operating on a mobile device. 29538 * @export @public @method 29539 * @name isMobileDevice 29540 * 29541 * @returns {boolean} True if running on a mobile device. 29542 */ 29543 29544 29545function isMobileDevice() { 29546 var pattern = new RegExp('Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini'); 29547 return pattern.test(navigator.userAgent); 29548} 29549 29550 29551 29552/***/ }), 29553
29554/***/ "./util/getPixelSpacing.js": 29555/*!*********************************!*\ 29556 !*** ./util/getPixelSpacing.js ***! 29557 \*********************************/ 29558/*! exports provided: default */ 29559/***/ (function(module, __webpack_exports__, __webpack_require__) { 29560 29561"use strict"; 29562__webpack_require__.r(__webpack_exports__); 29563/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return getPixelSpacing; }); 29564/* harmony import */ var _externalModules__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules */ "./externalModules.js"); 29565 29566function getPixelSpacing(image) { 29567 var imagePlane = _externalModules__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.metaData.get('imagePlaneModule', image.imageId); 29568 29569 if (imagePlane) { 29570 return { 29571 rowPixelSpacing: imagePlane.rowPixelSpacing || imagePlane.rowImagePixelSpacing, 29572 colPixelSpacing: imagePlane.columnPixelSpacing || imagePlane.colImagePixelSpacing 29573 }; 29574 } 29575 29576 return { 29577 rowPixelSpacing: image.rowPixelSpacing, 29578 colPixelSpacing: image.columnPixelSpacing 29579 }; 29580} 29581 29582/***/ }), 29583
29584/***/ "./util/getRGBPixels.js": 29585/*!******************************!*\ 29586 !*** ./util/getRGBPixels.js ***! 29587 \******************************/ 29588/*! exports provided: default */ 29589/***/ (function(module, __webpack_exports__, __webpack_require__) { 29590 29591"use strict"; 29592__webpack_require__.r(__webpack_exports__); 29593/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js"); 29594 29595/** 29596 * Gets pixels of an RGB image. 29597 * @export @public @method 29598 * @name getRGBPixels 29599 * 29600 * @param {HTMLElement} element The element. 29601 * @param {number} x The x position of the top-left corner of the region. 29602 * @param {number} y The y position of the top-left corner of the region. 29603 * @param {number} width The width of the region. 29604 * @param {number} height The height of the region 29605 * @returns {number[]} The pixel data. 29606 */ 29607 29608/* harmony default export */ __webpack_exports__["default"] = (function (element, x, y, width, height) { 29609 if (!element) { 29610 throw new Error('getRGBPixels: parameter element must not be undefined'); 29611 } 29612 29613 x = Math.round(x); 29614 y = Math.round(y); 29615 var enabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.getEnabledElement(element); 29616 var storedPixelData = []; 29617 var index = 0; 29618 var pixelData = enabledElement.image.getPixelData(); 29619 var spIndex, row, column; 29620 29621 if (enabledElement.image.color) { 29622 for (row = 0; row < height; row++) { 29623 for (column = 0; column < width; column++) { 29624 spIndex = ((row + y) * enabledElement.image.columns + (column + x)) * 4; 29625 var red = pixelData[spIndex]; 29626 var green = pixelData[spIndex + 1]; 29627 var blue = pixelData[spIndex + 2]; 29628 var alpha = pixelData[spIndex + 3]; 29629 storedPixelData[index++] = red; 29630 storedPixelData[index++] = green; 29631 storedPixelData[index++] = blue; 29632 storedPixelData[index++] = alpha; 29633 } 29634 } 29635 } 29636 29637 return storedPixelData; 29638}); 29639 29640/***/ }), 29641
29642/***/ "./util/getROITextBoxCoords.js": 29643/*!*************************************!*\ 29644 !*** ./util/getROITextBoxCoords.js ***! 29645 \*************************************/ 29646/*! exports provided: default */ 29647/***/ (function(module, __webpack_exports__, __webpack_require__) { 29648 29649"use strict"; 29650__webpack_require__.r(__webpack_exports__); 29651/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return getROITextBoxCoords; }); 29652/** 29653 * Determine the coordinates that will place the textbox to the right of the 29654 * annotation, taking rotation, hflip, and vflip into account. 29655 * 29656 * @param {Object} viewport - The object that stores rotation, hflip, and vflip. 29657 * @param {Object} handles - The handles of the annotation. 29658 * @returns {Object} - The coordinates for default placement of the textbox 29659 */ 29660function getROITextBoxCoords(viewport, handles) { 29661 var corners = _determineCorners(handles); 29662 29663 var centerX = (corners.left.x + corners.right.x) / 2; 29664 var centerY = (corners.top.y + corners.bottom.y) / 2; 29665 var textBox = {}; 29666 29667 if (viewport.rotation >= 0 && viewport.rotation < 90) { 29668 textBox.x = viewport.hflip ? corners.left.x : corners.right.x; 29669 textBox.y = centerY; 29670 } 29671 29672 if (viewport.rotation >= 90 && viewport.rotation < 180) { 29673 textBox.x = centerX; 29674 textBox.y = viewport.vflip ? corners.bottom.y : corners.top.y; 29675 } 29676 29677 if (viewport.rotation >= 180 && viewport.rotation < 270) { 29678 textBox.x = viewport.hflip ? corners.right.x : corners.left.x; 29679 textBox.y = centerY; 29680 } 29681 29682 if (viewport.rotation >= 270 && viewport.rotation < 360) { 29683 textBox.x = centerX; 29684 textBox.y = viewport.vflip ? corners.top.y : corners.bottom.y; 29685 } 29686 29687 return textBox; 29688} 29689/** 29690 * Determine the handles that have the min/max x and y values. 29691 * 29692 * @param {Object} handles - The handles of the annotation. 29693 * @returns {Object} - The top, left, bottom, and right handles 29694 */ 29695 29696function _determineCorners(handles) { 29697 var handlesLeftToRight = [handles.start, handles.end].sort(_compareX); 29698 var handlesTopToBottom = [handles.start, handles.end].sort(_compareY); 29699 var left = handlesLeftToRight[0]; 29700 var right = handlesLeftToRight[handlesLeftToRight.length - 1]; 29701 var top = handlesTopToBottom[0]; 29702 var bottom = handlesTopToBottom[handlesTopToBottom.length - 1]; 29703 return { 29704 top: top, 29705 left: left, 29706 bottom: bottom, 29707 right: right 29708 }; 29709 29710 function _compareX(a, b) { 29711 return a.x < b.x ? -1 : 1; 29712 } 29713 29714 function _compareY(a, b) { 29715 return a.y < b.y ? -1 : 1; 29716 } 29717} 29718 29719/***/ }), 29720
29721/***/ "./util/isObject.js": 29722/*!**************************!*\ 29723 !*** ./util/isObject.js ***! 29724 \**************************/ 29725/*! exports provided: default */ 29726/***/ (function(module, __webpack_exports__, __webpack_require__) { 29727 29728"use strict"; 29729__webpack_require__.r(__webpack_exports__); 29730/* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/typeof */ "../node_modules/@babel/runtime/helpers/typeof.js"); 29731/* harmony import */ var _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0__); 29732 29733 29734/** 29735 * Checks if `value` is the 29736 * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) 29737 * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) 29738 * 29739 * @since 0.1.0 29740 * @category Lang 29741 * @param {*} value The value to check. 29742 * @returns {boolean} Returns `true` if `value` is an object, else `false`. 29743 * @example 29744 * 29745 * isObject({}) 29746 * // => true 29747 * 29748 * isObject([1, 2, 3]) 29749 * // => true 29750 * 29751 * isObject(Function) 29752 * // => true 29753 * 29754 * isObject(null) 29755 * // => false 29756 */ 29757function isObject(value) { 29758 var type = _babel_runtime_helpers_typeof__WEBPACK_IMPORTED_MODULE_0___default()(value); 29759 29760 return value !== null && (type === 'object' || type === 'function'); 29761} 29762 29763/* harmony default export */ __webpack_exports__["default"] = (isObject); 29764 29765/***/ }), 29766
29767/***/ "./util/lineSegDistance.js": 29768/*!*********************************!*\ 29769 !*** ./util/lineSegDistance.js ***! 29770 \*********************************/ 29771/*! exports provided: default */ 29772/***/ (function(module, __webpack_exports__, __webpack_require__) { 29773 29774"use strict"; 29775__webpack_require__.r(__webpack_exports__); 29776/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js"); 29777 29778/** 29779 * Calculates the distance of a line segment from a point. 29780 * @export @public @method 29781 * @name lineSegDistance 29782 * 29783 * @param {HTMLElement} element The element. 29784 * @param {Object} start The starting position of the line. 29785 * @param {Object} end The end position of the line. 29786 * @param {Object} coords The coordinates of the point. 29787 * @returns {name} The distance between the line and the point. 29788 */ 29789 29790/* harmony default export */ __webpack_exports__["default"] = (function (element, start, end, coords) { 29791 var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone; 29792 var lineSegment = { 29793 start: cornerstone.pixelToCanvas(element, start), 29794 end: cornerstone.pixelToCanvas(element, end) 29795 }; 29796 return _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.lineSegment.distanceToPoint(lineSegment, coords); 29797}); 29798 29799/***/ }), 29800
29801/***/ "./util/logger.js": 29802/*!************************!*\ 29803 !*** ./util/logger.js ***! 29804 \************************/ 29805/*! exports provided: getLogger, enable, disable */ 29806/***/ (function(module, __webpack_exports__, __webpack_require__) { 29807 29808"use strict"; 29809__webpack_require__.r(__webpack_exports__); 29810/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getLogger", function() { return getLogger; }); 29811/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "enable", function() { return enable; }); 29812/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "disable", function() { return disable; }); 29813/* harmony import */ var debug__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! debug */ "../node_modules/debug/src/browser.js"); 29814/* harmony import */ var debug__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(debug__WEBPACK_IMPORTED_MODULE_0__); 29815 29816var BASE_SCOPE = 'cornerstoneTools'; 29817var baseLogger = debug__WEBPACK_IMPORTED_MODULE_0___default()(BASE_SCOPE); // eslint-disable-next-line no-process-env 29818 29819var devMode = "development" === 'development'; // If we're in dev-mode, tell the user how to get logs 29820 29821if (devMode && !baseLogger.enabled) { 29822 // eslint-disable-next-line no-console 29823 console.log('%cCornerstone Tools', 'background: #339955; padding: 4px; font-weight: bold; color: white'); // eslint-disable-next-line no-console 29824 29825 console.info('run %clocalStorage.setItem("debug", "cornerstoneTools")%c to see console output', 'background: #eaeaea; color: #333; font-family: monospace', ''); 29826} 29827/** 29828 * @method debug 29829 * Create's a scoped debuging logger 29830 */ 29831 29832 29833var getLogger = function getLogger(scope) { 29834 var log = baseLogger.extend(scope); 29835 return { 29836 log: log, 29837 // eslint-disable-next-line no-console 29838 warn: devMode ? console.warn.bind(console) : log, 29839 // eslint-disable-next-line no-console 29840 error: console.error.bind(console) 29841 }; 29842}; 29843/** 29844 * @method enable 29845 * @param {string} scope The scope to enabled 29846 * @returns {void} 29847 */ 29848 29849var enable = function enable() { 29850 var scope = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "".concat(BASE_SCOPE, ":*"); 29851 return debug__WEBPACK_IMPORTED_MODULE_0___default.a.enable(scope); 29852}; 29853/** 29854 * @method disable 29855 * @param {string} scope 29856 * @returns {string} The previously enabled scope 29857 */ 29858 29859var disable = function disable() { 29860 return debug__WEBPACK_IMPORTED_MODULE_0___default.a.disable(); 29861}; 29862 29863/***/ }), 29864
29865/***/ "./util/makeUnselectable.js": 29866/*!**********************************!*\ 29867 !*** ./util/makeUnselectable.js ***! 29868 \**********************************/ 29869/*! exports provided: default */ 29870/***/ (function(module, __webpack_exports__, __webpack_require__) { 29871 29872"use strict"; 29873__webpack_require__.r(__webpack_exports__); 29874/** 29875 * A helper function to make an element (and its content) being non selectable. 29876 * @export @public @method 29877 * @name makeUnselectable 29878 * 29879 * @param {HTMLElement} element The element to make unselectable 29880 * @param {Boolean} ignorePointerEvents true to make this element also 29881 * ignore events (e.g. mouse click), false otherwise. 29882 * @returns {void} 29883 */ 29884/* harmony default export */ __webpack_exports__["default"] = (function (element, ignorePointerEvents) { 29885 element.style.webkitUserSelect = 'none'; 29886 element.style.webkitTouchCallout = 'none'; 29887 element.style.mozUserSelect = 'none'; 29888 element.style.msUserSelect = 'none'; 29889 element.style.oUserSelect = 'none'; 29890 element.style.khtmlUserSelect = 'none'; 29891 element.style.userSelect = 'none'; 29892 element.unselectable = 'on'; 29893 29894 element.oncontextmenu = function () { 29895 return false; 29896 }; 29897 29898 if (ignorePointerEvents === true) { 29899 element.style.pointerEvents = 'none'; 29900 } 29901}); 29902 29903/***/ }), 29904
29905/***/ "./util/numbersWithCommas.js": 29906/*!***********************************!*\ 29907 !*** ./util/numbersWithCommas.js ***! 29908 \***********************************/ 29909/*! exports provided: default */ 29910/***/ (function(module, __webpack_exports__, __webpack_require__) { 29911 29912"use strict"; 29913__webpack_require__.r(__webpack_exports__); 29914/** 29915 * Converts a number to a string with comma separators. 29916 * http://stackoverflow.com/questions/2901102/how-to-print-a-number-with-commas-as-thousands-separators-in-javascript 29917 * @export @public @method 29918 * @name numbersWithCommas 29919 * 29920 * @param {number} x The number to convert. 29921 * @returns {string} The pretty-printed number as a string. 29922 */ 29923/* harmony default export */ __webpack_exports__["default"] = (function (x) { 29924 var parts = x.toString().split('.'); 29925 parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ','); 29926 return parts.join('.'); 29927}); 29928 29929/***/ }), 29930
29931/***/ "./util/pointInsideBoundingBox.js": 29932/*!****************************************!*\ 29933 !*** ./util/pointInsideBoundingBox.js ***! 29934 \****************************************/ 29935/*! exports provided: default */ 29936/***/ (function(module, __webpack_exports__, __webpack_require__) { 29937 29938"use strict"; 29939__webpack_require__.r(__webpack_exports__); 29940/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js"); 29941 29942/** 29943 * Returns true if a point is enclosed within a bounding box. 29944 * @export @public @method 29945 * @name pointInsideBoundingBox 29946 * 29947 * @param {Object} handle The handle containing the boundingBox. 29948 * @param {Object} coords The coordinate to check. 29949 * @returns {boolean} True if the point is enclosed within the bounding box. 29950 */ 29951 29952/* harmony default export */ __webpack_exports__["default"] = (function (handle, coords) { 29953 if (!handle.boundingBox) { 29954 return; 29955 } 29956 29957 return _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.point.insideRect(coords, handle.boundingBox); 29958}); 29959 29960/***/ }), 29961
29962/***/ "./util/pointProjector.js": 29963/*!********************************!*\ 29964 !*** ./util/pointProjector.js ***! 29965 \********************************/ 29966/*! exports provided: projectPatientPointToImagePlane, imagePointToPatientPoint, planePlaneIntersection, rotatePoint */ 29967/***/ (function(module, __webpack_exports__, __webpack_require__) { 29968 29969"use strict"; 29970__webpack_require__.r(__webpack_exports__); 29971/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "projectPatientPointToImagePlane", function() { return projectPatientPointToImagePlane; }); 29972/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "imagePointToPatientPoint", function() { return imagePointToPatientPoint; }); 29973/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "planePlaneIntersection", function() { return planePlaneIntersection; }); 29974/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "rotatePoint", function() { return rotatePoint; }); 29975/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js"); 29976/* harmony import */ var _util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../util/convertToVector3.js */ "./util/convertToVector3.js"); 29977 29978 29979/** 29980 * Projects a patient point to an image point 29981 * @export @public @method 29982 * @name projectPatientPointToImagePlane 29983 * 29984 * @param {Object} patientPoint The patient point. 29985 * @param {Object} imagePlane The image plane used for projection. 29986 * @returns {Object} The projected coordinates. 29987 */ 29988 29989function projectPatientPointToImagePlane(patientPoint, imagePlane) { 29990 var rowCosines = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_1__["default"])(imagePlane.rowCosines); 29991 var columnCosines = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_1__["default"])(imagePlane.columnCosines); 29992 var imagePositionPatient = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_1__["default"])(imagePlane.imagePositionPatient); 29993 var point = patientPoint.clone().sub(imagePositionPatient); 29994 var x = rowCosines.dot(point) / imagePlane.columnPixelSpacing; 29995 var y = columnCosines.dot(point) / imagePlane.rowPixelSpacing; 29996 return { 29997 x: x, 29998 y: y 29999 }; 30000} // 30001 30002/** 30003 * Projects an image point to a patient point 30004 * @export @public @method 30005 * @name imagePointToPatientPoint 30006 * 30007 * @param {Object} imagePoint The image point. 30008 * @param {Object} imagePlane The image plane used for projection. 30009 * @returns {Object} The projected coordinates. 30010 */ 30011 30012function imagePointToPatientPoint(imagePoint, imagePlane) { 30013 var rowCosines = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_1__["default"])(imagePlane.rowCosines); 30014 var columnCosines = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_1__["default"])(imagePlane.columnCosines); 30015 var imagePositionPatient = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_1__["default"])(imagePlane.imagePositionPatient); 30016 var x = rowCosines.clone().multiplyScalar(imagePoint.x); 30017 x.multiplyScalar(imagePlane.columnPixelSpacing); 30018 var y = columnCosines.clone().multiplyScalar(imagePoint.y); 30019 y.multiplyScalar(imagePlane.rowPixelSpacing); 30020 var patientPoint = x.add(y); 30021 patientPoint.add(imagePositionPatient); 30022 return patientPoint; 30023} 30024/** 30025 * Returns a rectangle from the imagePlane. 30026 * @export @public @method 30027 * @name getRectangleFromImagePlane 30028 * 30029 * @param {Object} imagePlane The imagePlane. 30030 * @returns {Object} The rect. 30031 */ 30032 30033function getRectangleFromImagePlane(imagePlane) { 30034 // Get the points 30035 var topLeft = imagePointToPatientPoint({ 30036 x: 0, 30037 y: 0 30038 }, imagePlane); 30039 var topRight = imagePointToPatientPoint({ 30040 x: imagePlane.columns, 30041 y: 0 30042 }, imagePlane); 30043 var bottomLeft = imagePointToPatientPoint({ 30044 x: 0, 30045 y: imagePlane.rows 30046 }, imagePlane); 30047 var bottomRight = imagePointToPatientPoint({ 30048 x: imagePlane.columns, 30049 y: imagePlane.rows 30050 }, imagePlane); // Get each side as a vector 30051 30052 var rect = { 30053 top: new _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.Line3(topLeft, top
30053Right), 30054 left: new _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.Line3(topLeft, bottomLeft), 30055 right: new _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.Line3(topRight, bottomRight), 30056 bottom: new _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.Line3(bottomLeft, bottomRight) 30057 }; 30058 return rect; 30059} 30060/** 30061 * Gets all the intersections of a line with a rect. 30062 * @private 30063 * @method 30064 * @name lineRectangleIntersection 30065 * 30066 * @param {Object} line The line to check. 30067 * @param {Object} rect The rect being intersected. 30068 * @returns {Object[]} An array of the intersections. 30069 */ 30070 30071 30072function lineRectangleIntersection(line, rect) { 30073 var intersections = []; 30074 Object.keys(rect).forEach(function (side) { 30075 var segment = rect[side]; 30076 var intersection = line.intersectLine(segment); 30077 30078 if (intersection) { 30079 intersections.push(intersection); 30080 } 30081 }); 30082 return intersections; 30083} 30084/** 30085 * Gets the line of intersection between two planes in patient space. 30086 * @export @public @method 30087 * @name planePlaneIntersection 30088 * 30089 * @param {Object} targetImagePlane The target plane. 30090 * @param {Object} referenceImagePlane The reference plane 30091 * @returns {Object} The intersections. 30092 */ 30093 30094 30095function planePlaneIntersection(targetImagePlane, referenceImagePlane) { 30096 var targetRowCosines = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_1__["default"])(targetImagePlane.rowCosines); 30097 var targetColumnCosines = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_1__["default"])(targetImagePlane.columnCosines); 30098 var targetImagePositionPatient = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_1__["default"])(targetImagePlane.imagePositionPatient); 30099 var referenceRowCosines = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_1__["default"])(referenceImagePlane.rowCosines); 30100 var referenceColumnCosines = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_1__["default"])(referenceImagePlane.columnCosines); 30101 var referenceImagePositionPatient = Object(_util_convertToVector3_js__WEBPACK_IMPORTED_MODULE_1__["default"])(referenceImagePlane.imagePositionPatient); // First, get the normals of each image plane 30102 30103 var targetNormal = targetRowCosines.clone().cross(targetColumnCosines); 30104 var targetPlane = new _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.Plane(); 30105 targetPlane.setFromNormalAndCoplanarPoint(targetNormal, targetImagePositionPatient); 30106 var referenceNormal = referenceRowCosines.clone().cross(referenceColumnCosines); 30107 var referencePlane = new _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.Plane(); 30108 referencePlane.setFromNormalAndCoplanarPoint(referenceNormal, referenceImagePositionPatient); 30109 var originDirection = referencePlane.clone().intersectPlane(targetPlane); 30110 var origin = originDirection.origin; 30111 var direction = originDirection.direction; // Calculate the longest possible length in the reference image plane (the length of the diagonal) 30112 30113 var bottomRight = imagePointToPatientPoint({ 30114 x: referenceImagePlane.columns, 30115 y: referenceImagePlane.rows 30116 }, referenceImagePlane); 30117 var distance = referenceImagePositionPatient.distanceTo(bottomRight); // Use this distance to bound the ray intersecting the two planes 30118 30119 var line = new _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstoneMath.Line3(); 30120 line.start = origin; 30121 line.end = origin.clone().add(direction.multiplyScalar(distance)); // Find the intersections between this line and the reference image plane's four sides 30122 30123 var rect = getRectangleFromImagePlane(referenceImagePlane); 30124 var intersections = lineRectangleIntersection(line, rect); // Return the intersections between this line and the reference image plane's sides 30125 // In order to draw the reference line from the target image. 30126 30127 if (intersections.length !== 2) { 30128 return; 30129 } 30130 30131 return { 30132 start: intersections[0], 30133 end: intersections[1] 30134 }; 30135} 30136/** 30137 * Translate a point using a rotation angle. 30138 * @export @public @method 30139 * @name rotatePoint 30140 * 30141 * @param {Object} point - `{ x, y }` in either pixel or canvas coordinates. 30142 * @param {Object} center - `{ x, y }` in either pixel or canvas coordinates. 30143 * @param {Number} angle - angle in degrees 30144 * @returns {Object} - `{ x, y }` new point translated 30145 */ 30146 30147function rotatePoint(point, center, angle) { 30148 var angleRadians = angle * (Math.PI / 180); // Convert to radians 30149 30150 var rotatedX = Math.cos(angleRadians) * (point.x - center.x) - Math.sin(angleRadians) * (point.y - center.y) + center.x; 30151 var rotatedY = Math.sin(angleRadians) * (point.x - center.x) + Math.
30151cos(angleRadians) * (point.y - center.y) + center.y; 30152 return { 30153 x: rotatedX, 30154 y: rotatedY 30155 }; 30156} 30157 30158/***/ }), 30159
30160/***/ "./util/roundToDecimal.js": 30161/*!********************************!*\ 30162 !*** ./util/roundToDecimal.js ***! 30163 \********************************/ 30164/*! exports provided: default */ 30165/***/ (function(module, __webpack_exports__, __webpack_require__) { 30166 30167"use strict"; 30168__webpack_require__.r(__webpack_exports__); 30169/** 30170 * Rounds a number to the specified precision. 30171 * @export @public @method 30172 * @name roundToDecimal 30173 * 30174 * @param {number} value The value to round. 30175 * @param {number} precision The required precision. 30176 * @returns {number} The rounded number. 30177 */ 30178/* harmony default export */ __webpack_exports__["default"] = (function (value, precision) { 30179 var multiplier = Math.pow(10, precision); 30180 return Math.round(value * multiplier) / multiplier; 30181}); 30182 30183/***/ }), 30184
30185/***/ "./util/scroll.js": 30186/*!************************!*\ 30187 !*** ./util/scroll.js ***! 30188 \************************/ 30189/*! exports provided: default */ 30190/***/ (function(module, __webpack_exports__, __webpack_require__) { 30191 30192"use strict"; 30193__webpack_require__.r(__webpack_exports__); 30194/* harmony import */ var _scrollToIndex_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./scrollToIndex.js */ "./util/scrollToIndex.js"); 30195/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../stateManagement/toolState.js */ "./stateManagement/toolState.js"); 30196/* harmony import */ var _clip_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./clip.js */ "./util/clip.js"); 30197/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./../externalModules.js */ "./externalModules.js"); 30198 30199 30200 30201 30202/** 30203 * Scrolls through the stack. 30204 * @export @public @method 30205 * @name scroll 30206 * 30207 * @param {HTMLElement} element The element to scroll. 30208 * @param {number} images The number of images to scroll through. 30209 * @param {type} [loop = false] Whether to loop the scrolling. 30210 * @param {type} [allowSkipping = true] Whether frames can be skipped. 30211 * @returns {void} 30212 */ 30213 30214/* harmony default export */ __webpack_exports__["default"] = (function (element, images) { 30215 var loop = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; 30216 var allowSkipping = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true; 30217 var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_1__["getToolState"])(element, 'stack'); 30218 30219 if (!toolData || !toolData.data || !toolData.data.length) { 30220 return; 30221 } 30222 30223 var stackData = toolData.data[0]; 30224 30225 if (!stackData.pending) { 30226 stackData.pending = []; 30227 } 30228 30229 var newImageIdIndex = stackData.currentImageIdIndex + images; 30230 30231 if (loop) { 30232 var nbImages = stackData.imageIds.length; 30233 newImageIdIndex %= nbImages; 30234 } else { 30235 newImageIdIndex = Object(_clip_js__WEBPACK_IMPORTED_MODULE_2__["default"])(newImageIdIndex, 0, stackData.imageIds.length - 1); 30236 } 30237 30238 if (allowSkipping) { 30239 Object(_scrollToIndex_js__WEBPACK_IMPORTED_MODULE_0__["default"])(element, newImageIdIndex); 30240 } else { 30241 var pendingEvent = { 30242 index: newImageIdIndex 30243 }; 30244 stackData.pending.push(pendingEvent); 30245 scrollWithoutSkipping(stackData, pendingEvent, element); 30246 } 30247}); 30248/** 30249 * Recursively scrolls the stack until the desired image is reached. 30250 * @private 30251 * @method 30252 * @name scrollWithoutSkipping 30253 * 30254 * @param {type} stackData Data object containing information about the stack. 30255 * @param {Object} pendingEvent The event to process next. 30256 * @param {HTMLElement} element The element being scrolled through. 30257 * @returns {void} 30258 */ 30259 30260function scrollWithoutSkipping(stackData, pendingEvent, element) { 30261 if (stackData.pending[0] === pendingEvent) { 30262 if (stackData.currentImageIdIndex === pendingEvent.index) { 30263 stackData.pending.splice(stackData.pending.indexOf(pendingEvent), 1); 30264 30265 if (stackData.pending.length > 0) { 30266 scrollWithoutSkipping(stackData, stackData.pending[0], element); 30267 } 30268 30269 return; 30270 } 30271 30272 var newImageHandler = function newImageHandler(event) { 30273 var index = stackData.imageIds.indexOf(event.detail.image.imageId); 30274 30275 if (index === pendingEvent.index) { 30276 stackData.pending.splice(stackData.pending.indexOf(pendingEvent), 1); 30277 element.removeEventListener(_externalModules_js__WEBPACK_IMPORTED_MODULE_3__["default"].cornerstone.EVENTS.NEW_IMAGE, newImageHandler); 30278 30279 if (stackData.pending.length > 0) { 30280 scrollWithoutSkipping(stackData, stackData.pending[0], element); 30281 } 30282 } 30283 }; 30284 30285 element.addEventListener(_externalModules_js__WEBPACK_IMPORTED_MODULE_3__["default"].cornerstone.EVENTS.NEW_IMAGE, newImageHandler); 30286 Object(_scrollToIndex_js__WEBPACK_IMPORTED_MODULE_0__["default"])(element, pendingEvent.index); 30287 } 30288} 30289 30290/***/ }), 30291
30292/***/ "./util/scrollToIndex.js": 30293/*!*******************************!*\ 30294 !*** ./util/scrollToIndex.js ***! 30295 \*******************************/ 30296/*! exports provided: default */ 30297/***/ (function(module, __webpack_exports__, __webpack_require__) { 30298 30299"use strict"; 30300__webpack_require__.r(__webpack_exports__); 30301/* harmony import */ var _events_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../events.js */ "./events.js"); 30302/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js"); 30303/* harmony import */ var _stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../stateManagement/toolState.js */ "./stateManagement/toolState.js"); 30304/* harmony import */ var _requestPool_requestPoolManager_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../requestPool/requestPoolManager.js */ "./requestPool/requestPoolManager.js"); 30305/* harmony import */ var _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../stateManagement/loadHandlerManager.js */ "./stateManagement/loadHandlerManager.js"); 30306/* harmony import */ var _util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../util/triggerEvent.js */ "./util/triggerEvent.js"); 30307 30308 30309 30310 30311 30312 30313/** 30314 * Scrolls through the stack to the image index requested. 30315 * @export @public @method 30316 * @name scrollToIndex 30317 * 30318 * @param {type} element The element to scroll through. 30319 * @param {type} newImageIdIndex The target image index. 30320 * @returns {void} 30321 */ 30322 30323/* harmony default export */ __webpack_exports__["default"] = (function (element, newImageIdIndex) { 30324 var toolData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_2__["getToolState"])(element, 'stack'); 30325 30326 if (!toolData || !toolData.data || !toolData.data.length) { 30327 return; 30328 } 30329 30330 var cornerstone = _externalModules_js__WEBPACK_IMPORTED_MODULE_1__["default"].cornerstone; // If we have more than one stack, check if we have a stack renderer defined 30331 30332 var stackRenderer; 30333 30334 if (toolData.data.length > 1) { 30335 var stackRendererData = Object(_stateManagement_toolState_js__WEBPACK_IMPORTED_MODULE_2__["getToolState"])(element, 'stackRenderer'); 30336 30337 if (stackRendererData && stackRendererData.data && stackRendererData.data.length) { 30338 stackRenderer = stackRendererData.data[0]; 30339 } 30340 } 30341 30342 var stackData = toolData.data[0]; // Allow for negative indexing 30343 30344 if (newImageIdIndex < 0) { 30345 newImageIdIndex += stackData.imageIds.length; 30346 } 30347 30348 var startLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_4__["default"].getStartLoadHandler(element); 30349 var endLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_4__["default"].getEndLoadHandler(element); 30350 var errorLoadingHandler = _stateManagement_loadHandlerManager_js__WEBPACK_IMPORTED_MODULE_4__["default"].getErrorLoadingHandler(element); 30351 30352 function doneCallback(image) { 30353 if (stackData.currentImageIdIndex !== newImageIdIndex) { 30354 return; 30355 } // Check if the element is still enabled in Cornerstone, 30356 // If an error is thrown, stop here. 30357 30358 30359 try { 30360 // TODO: Add 'isElementEnabled' to Cornerstone? 30361 cornerstone.getEnabledElement(element); 30362 } catch (error) { 30363 return; 30364 } 30365 30366 if (stackRenderer) { 30367 stackRenderer.currentImageIdIndex = newImageIdIndex; 30368 stackRenderer.render(element, toolData.data); 30369 } else { 30370 cornerstone.displayImage(element, image); 30371 } 30372 30373 if (endLoadingHandler) { 30374 endLoadingHandler(element, image); 30375 } 30376 } 30377 30378 function failCallback(error) { 30379 var imageId = stackData.imageIds[newImageIdIndex]; 30380 30381 if (errorLoadingHandler) { 30382 errorLoadingHandler(element, imageId, error); 30383 } 30384 } 30385 30386 if (newImageIdIndex === stackData.currentImageIdIndex) { 30387 return; 30388 } 30389 30390 if (startLoadingHandler) { 30391 startLoadingHandler(element); 30392 } 30393 30394 var eventData = { 30395 newImageIdIndex: newImageIdIndex, 30396 direction: newImageIdIndex - stackData.currentImageIdIndex 30397 }; 30398 stackData.currentImageIdIndex = newImageIdIndex; 30399 var newImageId = stackData.imageIds[newImageIdIndex]; // Retry image loading in cases where previous image promise 30400 // Was rejected, if the option is set 30401 30402 /* 30403 Const config = stackScroll.getConfiguration(); 30404 TODO: Revisit this. It appears that Core's imageCache is not 30405 keeping rejected promises anywhere, so we have no way to know 30406 if something was previously rejected. 30407 if (config && config.retryLoadOnScroll === true) { 30408 } 30409 */ 30410 // Convert the preventCache value in stack data to a boolean 30411 30412 var preventCache = Boolean(stackData.preventCache); 30413 var imagePromise; 30414 30415 if (preventCache) { 30416 imagePromise = cornerstone.loadImage(newImageId); 30417 } else { 30418 imagePromise = cornerstone.loadAndCacheImage(newImageId); 30419 } 30420 30421 imagePromise.then(doneCallback, failCallback); // Make sure we kick off any changed download request pools 30422 30423 _requestPool_requestPoolManager_js__WEBPACK_IMPORTED_MODULE_3__["default"].startGrabbing(); 30424 Object(_util_triggerEvent_js__WEBPACK_IMPORTED_MODULE_5__["default"])(element, _events_js__WEBPACK_IMPORTED_MODULE_0__["default"].STACK_SCROLL, eventData); 30425}); 30426 30427/***/ }), 30428
30429/***/ "./util/setContextToDisplayFontSize.js": 30430/*!*********************************************!*\ 30431 !*** ./util/setContextToDisplayFontSize.js ***! 30432 \*********************************************/ 30433/*! exports provided: default */ 30434/***/ (function(module, __webpack_exports__, __webpack_require__) { 30435 30436"use strict"; 30437__webpack_require__.r(__webpack_exports__); 30438/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../externalModules.js */ "./externalModules.js"); 30439 30440/** 30441 * Sets the canvas context transformation matrix so it is scaled to show text 30442 * more cleanly even if the image is scaled up. See 30443 * https://github.com/cornerstonejs/cornerstoneTools/wiki/DrawingText 30444 * for more information 30445 * @export @public @function 30446 * @name setContextToDisplayFontSize 30447 * 30448 * @param {HTMLElement} enabledElement The cornerstone enabled element. 30449 * @param {CanvasRenderingContext2D} context The canvas context. 30450 * @param {number} fontSize The font size. 30451 * @returns {Object} {fontSize: number, lineHeight: number, fontScale: number} 30452 */ 30453 30454/* harmony default export */ __webpack_exports__["default"] = (function (enabledElement, context, fontSize) { 30455 var fontScale = 0.1; 30456 _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.setToPixelCoordinateSystem(enabledElement, context, fontScale); // Return the font size to use 30457 30458 var scaledFontSize = fontSize / enabledElement.viewport.scale / fontScale; // TODO: actually calculate this? 30459 30460 var lineHeight = fontSize / enabledElement.viewport.scale / fontScale; 30461 return { 30462 fontSize: scaledFontSize, 30463 lineHeight: lineHeight, 30464 fontScale: fontScale 30465 }; 30466}); 30467 30468/***/ }), 30469
30470/***/ "./util/throttle.js": 30471/*!**************************!*\ 30472 !*** ./util/throttle.js ***! 30473 \**************************/ 30474/*! exports provided: default */ 30475/***/ (function(module, __webpack_exports__, __webpack_require__) { 30476 30477"use strict"; 30478__webpack_require__.r(__webpack_exports__); 30479/* harmony import */ var _debounce_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./debounce.js */ "./util/debounce.js"); 30480/* harmony import */ var _isObject_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./isObject.js */ "./util/isObject.js"); 30481 30482 30483/** 30484 * Creates a throttled function that only invokes `func` at most once per 30485 * every `wait` milliseconds (or once per browser frame). The throttled function 30486 * comes with a `cancel` method to cancel delayed `func` invocations and a 30487 * `flush` method to immediately invoke them. Provide `options` to indicate 30488 * whether `func` should be invoked on the leading and/or trailing edge of the 30489 * `wait` timeout. The `func` is invoked with the last arguments provided to the 30490 * throttled function. Subsequent calls to the throttled function return the 30491 * result of the last `func` invocation. 30492 * 30493 * **Note:** If `leading` and `trailing` options are `true`, `func` is 30494 * invoked on the trailing edge of the timeout only if the throttled function 30495 * is invoked more than once during the `wait` timeout. 30496 * 30497 * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred 30498 * until the next tick, similar to `setTimeout` with a timeout of `0`. 30499 * 30500 * If `wait` is omitted in an environment with `requestAnimationFrame`, `func` 30501 * invocation will be deferred until the next frame is drawn (typically about 30502 * 16ms). 30503 * 30504 * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/) 30505 * for details over the differences between `throttle` and `debounce`. 30506 * 30507 * @since 0.1.0 30508 * @category Function 30509 * @param {Function} func The function to throttle. 30510 * @param {number} [wait=0] 30511 * The number of milliseconds to throttle invocations to; if omitted, 30512 * `requestAnimationFrame` is used (if available). 30513 * @param {Object} [options={}] The options object. 30514 * @param {boolean} [options.leading=true] 30515 * Specify invoking on the leading edge of the timeout. 30516 * @param {boolean} [options.trailing=true] 30517 * Specify invoking on the trailing edge of the timeout. 30518 * @returns {Function} Returns the new throttled function. 30519 * @example 30520 * 30521 * // Avoid excessively updating the position while scrolling. 30522 * jQuery(window).on('scroll', throttle(updatePosition, 100)) 30523 * 30524 * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes. 30525 * const throttled = throttle(renewToken, 300000, { 'trailing': false }) 30526 * jQuery(element).on('click', throttled) 30527 * 30528 * // Cancel the trailing throttled invocation. 30529 * jQuery(window).on('popstate', throttled.cancel) 30530 */ 30531 30532function throttle(func, wait, options) { 30533 var leading = true; 30534 var trailing = true; 30535 30536 if (typeof func !== 'function') { 30537 throw new TypeError('Expected a function'); 30538 } 30539 30540 if (Object(_isObject_js__WEBPACK_IMPORTED_MODULE_1__["default"])(options)) { 30541 leading = 'leading' in options ? Boolean(options.leading) : leading; 30542 trailing = 'trailing' in options ? Boolean(options.trailing) : trailing; 30543 } 30544 30545 return Object(_debounce_js__WEBPACK_IMPORTED_MODULE_0__["default"])(func, wait, { 30546 leading: leading, 30547 trailing: trailing, 30548 maxWait: wait 30549 }); 30550} 30551 30552/* harmony default export */ __webpack_exports__["default"] = (throttle); 30553 30554/***/ }), 30555
30556/***/ "./util/triggerEvent.js": 30557/*!******************************!*\ 30558 !*** ./util/triggerEvent.js ***! 30559 \******************************/ 30560/*! exports provided: default */ 30561/***/ (function(module, __webpack_exports__, __webpack_require__) { 30562 30563"use strict"; 30564__webpack_require__.r(__webpack_exports__); 30565/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "default", function() { return triggerEvent; }); 30566/** 30567 * Triggers a CustomEvent. 30568 * @public 30569 * @method triggerEvent 30570 * 30571 * @param {EventTarget} el The element or EventTarget to trigger the event upon. 30572 * @param {String} type The event type name. 30573 * @param {Object|null} [detail=null] The event data to be sent. 30574 * @returns {Boolean} The return value is false if at least one event listener called preventDefault(). Otherwise it returns true. 30575 */ 30576function triggerEvent(el, type) { 30577 var detail = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null; 30578 var event; // This check is needed to polyfill CustomEvent on IE11- 30579 30580 if (typeof window.CustomEvent === 'function') { 30581 event = new CustomEvent(type, { 30582 detail: detail, 30583 cancelable: true 30584 }); 30585 } else { 30586 event = document.createEvent('CustomEvent'); 30587 event.initCustomEvent(type, true, true, detail); 30588 } 30589 30590 return el.dispatchEvent(event); 30591} 30592 30593/***/ }), 30594
30595/***/ "./util/wait.js": 30596/*!**********************!*\ 30597 !*** ./util/wait.js ***! 30598 \**********************/ 30599/*! exports provided: wait, waitForEnabledElementImageToLoad, default */ 30600/***/ (function(module, __webpack_exports__, __webpack_require__) { 30601 30602"use strict"; 30603__webpack_require__.r(__webpack_exports__); 30604/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "wait", function() { return wait; }); 30605/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "waitForEnabledElementImageToLoad", function() { return waitForEnabledElementImageToLoad; }); 30606/* harmony import */ var _externalModules_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./../externalModules.js */ "./externalModules.js"); 30607 30608/** 30609 * Waits a set amount of time, then resolves. Can be chained off of to delay 30610 * next call in promise chain. 30611 * @public 30612 * @function wait 30613 * @param {number} ms - number in ms to wait 30614 * @returns {Promise} - A promise that resolves when setTimeout elapses 30615 */ 30616 30617var wait = function wait(ms) { 30618 return new Promise(function (resolve) { 30619 return setTimeout(resolve, ms); 30620 }); 30621}; 30622/** 30623 * A promise that returns an EnabledElement who's image has loaded, or 30624 * null if the provided element ceases being an enabledElement before an 30625 * image has been loaded. 30626 * @public 30627 * @function waitForEnabledElementImageToLoad 30628 * 30629 * @param {HTMLElement} element - An element that is an EnabledElement 30630 * @returns {EnabledElement} - The enabled element that has loaded an image 30631 */ 30632 30633function waitForEnabledElementImageToLoad(element) { 30634 try { 30635 var enabledElement = _externalModules_js__WEBPACK_IMPORTED_MODULE_0__["default"].cornerstone.getEnabledElement(element); 30636 30637 if (!enabledElement.image) { 30638 return wait(250).then(function () { 30639 return waitForEnabledElementImageToLoad(element); 30640 }); 30641 } // EnabledElement's image is loaded. 30642 30643 30644 return enabledElement; 30645 } catch (ex) { 30646 // Is no longer, or never was an enabled element, stop polling 30647 return null; 30648 } 30649} 30650/* harmony default export */ __webpack_exports__["default"] = (wait); 30651 30652/***/ }), 30653
30654/***/ "./util/zoom/changeViewportScale.js": 30655/*!******************************************!*\ 30656 !*** ./util/zoom/changeViewportScale.js ***! 30657 \******************************************/ 30658/*! exports provided: default */ 30659/***/ (function(module, __webpack_exports__, __webpack_require__) { 30660 30661"use strict"; 30662__webpack_require__.r(__webpack_exports__); 30663/** 30664 * Changes the scale of the viewport. 30665 * 30666 * @private 30667 * @function changeViewportScale 30668 * 30669 * @param {Object} viewport The viewport to scale. 30670 * @param {number} ticks The change in magnifcation factor. 30671 * @param {Object} scaleLimits The limits in scale. 30672 * @returns {Object} The scaled viewport. 30673 */ 30674/* harmony default export */ __webpack_exports__["default"] = (function (viewport, ticks, scaleLimits) { 30675 var maxScale = scaleLimits.maxScale, 30676 minScale = scaleLimits.minScale; 30677 var pow = 1.7; 30678 var oldFactor = Math.log(viewport.scale) / Math.log(pow); 30679 var factor = oldFactor + ticks; 30680 var scale = Math.pow(pow, factor); 30681 30682 if (maxScale && scale > maxScale) { 30683 viewport.scale = maxScale; 30684 } else if (minScale && scale < minScale) { 30685 viewport.scale = minScale; 30686 } else { 30687 viewport.scale = scale; 30688 } 30689 30690 return viewport; 30691}); 30692 30693/***/ }), 30694
30695/***/ "./util/zoom/correctShift.js": 30696/*!***********************************!*\ 30697 !*** ./util/zoom/correctShift.js ***! 30698 \***********************************/ 30699/*! exports provided: default */ 30700/***/ (function(module, __webpack_exports__, __webpack_require__) { 30701 30702"use strict"; 30703__webpack_require__.r(__webpack_exports__); 30704/** 30705 * Corrects the shift by accountoing for viewport rotation and flips. 30706 * @export @public @method 30707 * @name correctShift 30708 * 30709 * @param {Object} shift The shift to correct. 30710 * @param {Object} viewportOrientation Object containing information on the viewport orientation. 30711 * @returns {Object} The corrected shift. 30712 */ 30713/* harmony default export */ __webpack_exports__["default"] = (function (shift, viewportOrientation) { 30714 var hflip = viewportOrientation.hflip, 30715 vflip = viewportOrientation.vflip, 30716 rotation = viewportOrientation.rotation; // Apply Flips 30717 30718 shift.x *= hflip ? -1 : 1; 30719 shift.y *= vflip ? -1 : 1; // Apply rotations 30720 30721 if (rotation !== 0) { 30722 var angle = rotation * Math.PI / 180; 30723 var cosA = Math.cos(angle); 30724 var sinA = Math.sin(angle); 30725 var newX = shift.x * cosA - shift.y * sinA; 30726 var newY = shift.x * sinA + shift.y * cosA; 30727 shift.x = newX; 30728 shift.y = newY; 30729 } 30730 30731 return shift; 30732}); 30733 30734/***/ }), 30735
30736/***/ "./util/zoom/index.js": 30737/*!****************************!*\ 30738 !*** ./util/zoom/index.js ***! 30739 \****************************/ 30740/*! exports provided: changeViewportScale, correctShift, default */ 30741/***/ (function(module, __webpack_exports__, __webpack_require__) { 30742 30743"use strict"; 30744__webpack_require__.r(__webpack_exports__); 30745/* harmony import */ var _changeViewportScale_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./changeViewportScale.js */ "./util/zoom/changeViewportScale.js"); 30746/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "changeViewportScale", function() { return _changeViewportScale_js__WEBPACK_IMPORTED_MODULE_0__["default"]; }); 30747 30748/* harmony import */ var _correctShift_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./correctShift.js */ "./util/zoom/correctShift.js"); 30749/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "correctShift", function() { return _correctShift_js__WEBPACK_IMPORTED_MODULE_1__["default"]; }); 30750 30751 30752 // Named 30753 30754 // Default 30755 30756/* harmony default export */ __webpack_exports__["default"] = ({ 30757 changeViewportScale: _changeViewportScale_js__WEBPACK_IMPORTED_MODULE_0__["default"], 30758 correctShift: _correctShift_js__WEBPACK_IMPORTED_MODULE_1__["default"] 30759}); 30760 30761/***/ }), 30762
30763/***/ "./version.js": 30764/*!********************!*\ 30765 !*** ./version.js ***! 30766 \********************/ 30767/*! exports provided: default */ 30768/***/ (function(module, __webpack_exports__, __webpack_require__) { 30769 30770"use strict"; 30771__webpack_require__.r(__webpack_exports__); 30772/* harmony default export */ __webpack_exports__["default"] = ('3.16.0'); 30773 30774/***/ })
30774 30775 30776/******/ }); 30777}); 30778//# sourceMappingURL=cornerstoneTools.js.map
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.