From 3815a9150f4c9368c634cbefc77d9dd9cd495aa6 Mon Sep 17 00:00:00 2001 From: Erik Ziegler Date: Fri, 8 May 2015 15:36:40 +0200 Subject: [PATCH] SaveAs tool and example --- dist/cornerstoneTools.js | 49 ++++++++++++++++++++ dist/cornerstoneTools.min.js | 4 +- examples/index.html | 1 + examples/saveAs/index.html | 87 ++++++++++++++++++++++++++++++++++++ src/imageTools/saveImage.js | 45 +++++++++++++++++++ 5 files changed, 184 insertions(+), 2 deletions(-) create mode 100755 examples/saveAs/index.html create mode 100644 src/imageTools/saveImage.js diff --git a/dist/cornerstoneTools.js b/dist/cornerstoneTools.js index 7b9affe20..17dc9c5f5 100644 --- a/dist/cornerstoneTools.js +++ b/dist/cornerstoneTools.js @@ -2250,6 +2250,55 @@ var cornerstoneTools = (function ($, cornerstone, cornerstoneMath, cornerstoneTo // End Source; src/imageTools/rectangleRoi.js +// Begin Source: src/imageTools/saveImage.js +var cornerstoneTools = (function ($, cornerstone, cornerstoneTools) { + + "use strict"; + + if(cornerstoneTools === undefined) { + cornerstoneTools = {}; + } + + function saveAs(element, filename) + { + var canvas = $(element).find("canvas").get(0); + + // Thanks to Ken Fyrstenber + // http://stackoverflow.com/questions/18480474/how-to-save-an-image-from-canvas + var lnk = document.createElement('a'), + e; + + /// the key here is to set the download attribute of the a tag + lnk.download = filename; + + /// convert canvas content to data-uri for link. When download + /// attribute is set the content pointed to by link will be + /// pushed as "download" in HTML5 capable browsers + lnk.href = canvas.toDataURL(); + + /// create a "fake" click-event to trigger the download + if (document.createEvent) { + + e = document.createEvent("MouseEvents"); + e.initMouseEvent("click", true, true, window, + 0, 0, 0, 0, 0, false, false, false, + false, 0, null); + + lnk.dispatchEvent(e); + + } else if (lnk.fireEvent) { + + lnk.fireEvent("onclick"); + } + } + + cornerstoneTools.saveAs = saveAs; + + return cornerstoneTools; +}($, cornerstone, cornerstoneTools)); + +// End Source; src/imageTools/saveImage.js + // Begin Source: src/imageTools/wwwc.js var cornerstoneTools = (function ($, cornerstone, cornerstoneTools) { diff --git a/dist/cornerstoneTools.min.js b/dist/cornerstoneTools.min.js index affcccd0e..789e76ced 100644 --- a/dist/cornerstoneTools.min.js +++ b/dist/cornerstoneTools.min.js @@ -1,3 +1,3 @@ /*! cornerstoneTools - v0.6.2 - 2015-05-21 | (c) 2014 Chris Hafey | https://github.com/chafey/cornerstoneTools */ -var cornerstoneTools=function(a,b,c){"use strict";function d(c){if(!("mousewheel"===c.originalEvent.type&&0===c.originalEvent.wheelDeltaY||"DOMMouseScroll"===c.originalEvent.type&&1===c.originalEvent.axis)){var d=c.currentTarget,e=b.pageToPixel(d,c.pageX,c.pageY);c=window.event||c;var f=c.wheelDelta||-c.detail||-c.originalEvent.detail,g=Math.max(-1,Math.min(1,f)),h={element:d,viewport:b.getViewport(d),image:b.getEnabledElement(d).image,direction:g,pageX:c.pageX,pageY:c.pageY,imageX:e.x,imageY:e.y};a(d).trigger("CornerstoneToolsMouseWheel",h)}}function e(b){a(b).on(g,d)}function f(b){a(b).unbind(g,d)}void 0===c&&(c={});var g="mousewheel DOMMouseScroll";return c.mouseWheelInput={enable:e,disable:f},c}($,cornerstone,cornerstoneTools),cornerstoneTools=function(a,b,c,d){"use strict";function e(b){a(b.element).trigger("CornerstoneToolsMouseDownActivate",b)}function f(f){function g(e){var f={page:c.point.pageToPoint(e),image:b.pageToPixel(i,e.pageX,e.pageY)},g={page:c.point.subtract(f.page,k.page),image:c.point.subtract(f.image,k.image)},h={which:n,viewport:b.getViewport(i),image:b.getEnabledElement(i).image,element:i,startPoints:j,lastPoints:k,currentPoints:f,deltaPoints:g};return a(l.element).trigger("CornerstoneToolsMouseDrag",h),k=d.copyPoints(f),d.pauseEvent(e)}function h(d){var e={page:c.point.pageToPoint(d),image:b.pageToPixel(i,d.pageX,d.pageY)},f={page:c.point.subtract(e.page,k.page),image:c.point.subtract(e.image,k.image)},m={event:d,which:n,viewport:b.getViewport(i),image:b.getEnabledElement(i).image,element:i,startPoints:j,lastPoints:k,currentPoints:e,deltaPoints:f},o=jQuery.Event("CornerstoneToolsMouseUp",m);a(l.element).trigger(o,m),a(document).off("mousemove",g),a(document).off("mouseup",h)}var i=(f.data,f.currentTarget),j={page:c.point.pageToPoint(f),image:b.pageToPixel(i,f.pageX,f.pageY)},k=d.copyPoints(j),l={event:f,which:f.which,viewport:b.getViewport(i),image:b.getEnabledElement(i).image,element:i,startPoints:j,lastPoints:k,currentPoints:j,deltaPoints:{x:0,y:0}},m=jQuery.Event("CornerstoneToolsMouseDown",l);if(a(l.element).trigger(m,l),m.isImmediatePropagationStopped()===!1&&e(l)===!0)return d.pauseEvent(f);var n=f.which;return a(document).on("mousemove",g),a(document).on("mouseup",h),d.pauseEvent(f)}function g(e){var f=(e.data,e.currentTarget),g={page:c.point.pageToPoint(e),image:b.pageToPixel(f,e.pageX,e.pageY)},h=d.copyPoints(g),i=e.which,j={page:c.point.pageToPoint(e),image:b.pageToPixel(f,e.pageX,e.pageY)},k={page:c.point.subtract(j.page,h.page),image:c.point.subtract(j.image,h.image)},l={which:i,viewport:b.getViewport(f),image:b.getEnabledElement(f).image,element:f,startPoints:g,lastPoints:h,currentPoints:j,deltaPoints:k};a(f).trigger("CornerstoneToolsMouseMove",l),h=d.copyPoints(j)}function h(b){a(b).on("mousedown",f),a(b).on("mousemove",g)}function i(b){a(b).off("mousedown",f),a(b).off("mousemove",g)}return void 0===d&&(d={}),d.mouseInput={enable:h,disable:i},d}($,cornerstone,cornerstoneMath,cornerstoneTools),cornerstoneTools=function(a,b,c){"use strict";function d(b){var c={activate:function(c,d,e){a(c).off("CornerstoneToolsMouseDownActivate",b);var f={mouseButtonMask:d,options:e};a(c).on("CornerstoneToolsMouseDownActivate",f,b)},disable:function(c){a(c).off("CornerstoneToolsMouseDownActivate",b)},enable:function(c){a(c).off("CornerstoneToolsMouseDownActivate",b)},deactivate:function(c){a(c).off("CornerstoneToolsMouseDownActivate",b)}};return c}return void 0===c&&(c={}),c.simpleMouseButtonTool=d,c}($,cornerstone,cornerstoneTools),coordsData,cornerstoneTools=function(a,b,c,d){"use strict";function e(e){function f(b){var c=e.createNewMeasurement(b);d.addToolState(b.element,e.toolType,c),a(b.element).off("CornerstoneToolsMouseMove",h),d.moveHandle(b,c.handles.end,function(){d.anyHandlesOutsideImage(b,c.handles)&&d.removeToolState(b.element,e.toolType,c),a(b.element).on("CornerstoneToolsMouseMove",h)})}function g(a,b){return d.isMouseButtonEnabled(b.which,a.data.mouseButtonMask)?(f(b),!1):void 0}function h(a,c){if(d.toolCoordinates.setCoords(c),0===c.which){var f=d.getToolState(c.element,e.toolType);if(void 0!==f){for(var g=!1,h=0;he)return a.handles[d]}}function j(b,c){function f(){d.anyHandlesOutsideImage(c,g.handles)&&d.removeToolState(c.element,e.toolType,g),a(c.element).on("CornerstoneToolsMouseMove",h)}var g;if(d.isMouseButtonEnabled(c.which,b.data.mouseButtonMask)){var j,k=c.startPoints.image,l=d.getToolState(b.currentTarget,e.toolType);if(void 0!==l)for(j=0;je)return a.handles[d]}}function k(b,c){function g(){d.anyHandlesOutsideImage(c,h.handles)&&d.removeToolState(c.element,e.toolType,h),a(c.element).on("CornerstoneToolsMouseMove",i)}var h;if(d.isMouseButtonEnabled(c.which,b.data.mouseButtonMask)){var k,l=c.startPoints.image,m=d.getToolState(b.currentTarget,e.toolType);if(void 0!==m)for(k=0;ke)return a.handles[d]}}function j(b,c){function f(){d.anyHandlesOutsideImage(c,g.handles)&&d.removeToolState(c.element,e.toolType,g),a(c.element).on("CornerstoneToolsTouchDrag",h)}var g,j,k=c.startPoints.image,l=d.getToolState(b.currentTarget,e.toolType);if(void 0!==l)for(j=0;je?!0:(d.start=a.handles.start2,d.end=a.handles.end2,e=c.lineSegment.distanceToPoint(d,b),5>e)}function g(a,c){var e=d.getToolState(a.currentTarget,h);if(void 0!==e){var g=c.canvasContext.canvas.getContext("2d");b.setToPixelCoordinateSystem(c.enabledElement,g);for(var i,j=0;jk&&(f=k,h=a)}),h!==j.currentImageIdIndex&&-1!==h&&void 0!==j.imageIds[h]&&b.loadAndCacheImage(j.imageIds[h]).then(function(a){var c=b.getViewport(e);j.currentImageIdIndex=h,b.displayImage(e,a,c)})}}})}}function e(b,c){a(c.element).off("CornerstoneToolsMouseDrag",g),a(c.element).off("CornerstoneToolsMouseUp",e)}function f(b,f){return c.isMouseButtonEnabled(f.which,b.data.mouseButtonMask)?(a(f.element).on("CornerstoneToolsMouseDrag",g),a(f.element).on("CornerstoneToolsMouseUp",e),d(b,f),!1):void 0}function g(a,b){return d(a,b),!1}function h(d,e,g){var h={mouseButtonMask:e};c.addToolState(d,j,{synchronizationContext:g}),a(d).off("CornerstoneToolsMouseDown",f),a(d).on("CornerstoneToolsMouseDown",h,f),b.updateImage(d)}function i(c){a(c).off("CornerstoneToolsMouseDown",f),b.updateImage(c)}void 0===c&&(c={});var j="crosshairs";return c.crosshairs={enable:h,disable:i},c}($,cornerstone,cornerstoneTools),cornerstoneTools=function(a,b,c,d){"use strict";function e(a){var b={visible:!0,handles:{start:{x:a.currentPoints.image.x,y:a.currentPoints.image.y,highlight:!0,active:!1},end:{x:a.currentPoints.image.x,y:a.currentPoints.image.y,highlight:!0,active:!0}}};return b}function f(a,b){var d={left:Math.min(a.handles.start.x,a.handles.end.x),top:Math.min(a.handles.start.y,a.handles.end.y),width:Math.abs(a.handles.start.x-a.handles.end.x),height:Math.abs(a.handles.start.y-a.handles.end.y)},e=c.rect.distanceToPoint(d,b);return 5>e}function g(a,b){var c=a.width/2,d=a.height/2;if(0>=c||0>=d)return!1;var e={x:a.left+c,y:a.top+d},f={x:b.x-e.x,y:b.y-e.y},g=f.x*f.y/(c*c)+f.y*f.y/(d*d)<=1;return g}function h(a,b){for(var c=0,d=0,e=0,f=0,h=b.top;h=c.left&&b.x<=c.left+c.width&&b.y>=c.top&&b.y<=c.top+c.height&&(d=!0),d}function g(a,b){var d={left:Math.min(a.handles.start.x,a.handles.end.x),top:Math.min(a.handles.start.y,a.handles.end.y),width:Math.abs(a.handles.start.x-a.handles.end.x),height:Math.abs(a.handles.start.y-a.handles.end.y)},e=c.rect.distanceToPoint(d,b);return 5>e}function h(a,c){var e=d.getToolState(a.currentTarget,i);if(void 0!==e){var f=c.canvasContext.canvas.getContext("2d");b.setToPixelCoordinateSystem(c.enabledElement,f);var g=d.toolColors.getToolColor();f.save();var h=e.data[0],j={left:Math.min(h.handles.start.x,h.handles.end.x),top:Math.min(h.handles.start.y,h.handles.end.y),width:Math.abs(h.handles.start.x-h.handles.end.x),height:Math.abs(h.handles.start.y-h.handles.end.y)};f.beginPath(),d.drawHandles(f,c,h.handles,g),f.stroke(),f.beginPath(),f.strokeStyle="transparent",f.save(),f.setTransform(1,0,0,1,0,0),f.rect(0,0,f.canvas.clientWidth,f.canvas.clientHeight),f.restore(),f.rect(j.width+j.left,j.top,-j.width,j.height),f.restore(),f.stroke(),f.fillStyle="rgba(0,0,0,0.7)",f.fill(),f.closePath(),f.beginPath(),f.strokeStyle=g,f.lineWidth=2.5/c.viewport.scale,f.setLineDash([4]),f.strokeRect(j.left,j.top,j.width,j.height),f.restore()}}void 0===d&&(d={});var i="highlight",j=!0;return d.highlight=d.mouseButtonRectangleTool({createNewMeasurement:e,onImageRendered:h,pointNearTool:g,pointInsideRect:f,toolType:i},j),d.highlightTouch=d.touchTool({createNewMeasurement:e,onImageRendered:h,pointNearTool:g,pointInsideRect:f,toolType:i},j),d}($,cornerstone,cornerstoneMath,cornerstoneTools),cornerstoneTools=function(a,b,c,d){"use strict";function e(a){var b={visible:!0,handles:{start:{x:a.currentPoints.image.x,y:a.currentPoints.image.y,highlight:!0,active:!1},end:{x:a.currentPoints.image.x,y:a.currentPoints.image.y,highlight:!0,active:!0}}};return b}function f(a,b){var d={start:a.handles.start,end:a.handles.end},e=c.lineSegment.distanceToPoint(d,b);return 25>e}function g(a,c){var e=d.getToolState(a.currentTarget,h);if(void 0!==e){var g=c.canvasContext.canvas.getContext("2d");b.setToPixelCoordinateSystem(c.enabledElement,g);for(var i,j=0;je}function g(a,b){for(var c=0,d=0,e=0,f=0,g=b.top;gn?1:-1};g=jQuery.Event("CornerstoneToolsTouchPinch",o),a(o.element).trigger(g,o);break;case"touch":if(i={page:c.point.pageToPoint(f.gesture.touches[0]),image:b.pageToPixel(h,f.gesture.touches[0].pageX,f.gesture.touches[0].pageY)},k={event:f,viewport:b.getViewport(h),image:b.getEnabledElement(h).image,element:h,startPoints:i,lastPoints:j,currentPoints:i,deltaPoints:{x:0,y:0}},g=jQuery.Event("CornerstoneToolsDragStart",k),a(k.element).trigger(g,k),j=d.copyPoints(i),g.isImmediatePropagationStopped()===!1&&e(k)===!0)return d.pauseEvent(f);break;case"drag":p={page:c.point.pageToPoint(f.gesture.touches[0]),image:b.pageToPixel(h,f.gesture.touches[0].pageX,f.gesture.touches[0].pageY)},q={page:c.point.subtract(p.page,j.page),image:c.point.subtract(p.image,j.image)},l={viewport:b.getViewport(h),image:b.getEnabledElement(h).image,element:h,startPoints:i,lastPoints:j,currentPoints:p,deltaPoints:q},a(k.element).trigger("CornerstoneToolsTouchDrag",l),j=d.copyPoints(p);break;case"dragend":var p={page:c.point.pageToPoint(f.gesture.touches[0]),image:b.pageToPixel(h,f.gesture.touches[0].pageX,f.gesture.touches[0].pageY)},q={page:c.point.subtract(p.page,j.page),image:c.point.subtract(p.image,j.image)};return l={event:f,viewport:b.getViewport(h),image:b.getEnabledElement(h).image,element:h,startPoints:i,lastPoints:j,currentPoints:p,deltaPoints:q},g=jQuery.Event("CornerstoneToolsDragEnd",l),a(k.element).trigger(g,l),d.pauseEvent(f)}}function g(b){var c={transform_always_block:!0,transform_min_scale:.01,drag_block_horizontal:!0,drag_block_vertical:!0,drag_min_distance:0};a(b).hammer(c).on("touch drag transform dragstart dragend",f)}function h(b){a(b).hammer().off("touch drag transform dragstart dragend",f)}void 0===d&&(d={});var i,j,k,l,m=1;return d.touchInput={enable:g,disable:h},d}($,cornerstone,cornerstoneMath,cornerstoneTools),cornerstoneTools=function(a,b,c,d){"use strict";function e(a,b){var d=a.image,e={left:0,top:0,width:d.width,height:d.height},f=!1;for(var g in b){var h=b[g];c.point.insideRect(h,e)===!1&&(f=!0)}return f}return void 0===d&&(d={}),d.anyHandlesOutsideImage=e,d}($,cornerstone,cornerstoneMath,cornerstoneTools),cornerstoneTools=function(a,b,c){"use strict";function d(a,b,c,d){a.strokeStyle=d;var f=e/b.viewport.scale;for(var g in c){var h=c[g];(h.active||h.highlight)&&(a.beginPath(),a.lineWidth=h.active?2/b.viewport.scale:.5/b.viewport.scale,a.arc(h.x,h.y,f,0,2*Math.PI),a.stroke())}}void 0===c&&(c={});var e=6;return c.drawHandles=d,c}($,cornerstone,cornerstoneTools),cornerstoneTools=function(a,b,c,d){"use strict";function e(a,b,d){var e=h/d;for(var f in a){var g=a[f],i=c.point.distance(b,g);if(e>=i)return g}return void 0}function f(a){for(var b in a){var c=a[b];if(c.active===!0)return c}return void 0}function g(a,b,c){var d=f(a),g=e(a,b,c);return d!==g?(void 0!==g&&(g.active=!0),void 0!==d&&(d.active=!1),!0):!1}void 0===d&&(d={});var h=6;return d.handleActivator=g,d}($,cornerstone,cornerstoneMath,cornerstoneTools),cornerstoneTools=function(a,b,c){"use strict";function d(c,d,e,f){function g(a,c){d.x=c.currentPoints.image.x,d.y=c.currentPoints.image.y,f&&(d.x<0&&(d.x=0),d.x>c.image.width&&(d.x=c.image.width),d.y<0&&(d.y=0),d.y>c.image.height&&(d.y=c.image.height)),b.updateImage(i)}function h(){d.eactive=!1,a(i).off("CornerstoneToolsMouseDrag",g),a(i).off("CornerstoneToolsMouseUp",h),b.updateImage(i),e()}var i=c.element;a(i).on("CornerstoneToolsMouseDrag",g),a(i).on("CornerstoneToolsMouseUp",h)}return void 0===c&&(c={}),c.moveHandle=d,c}($,cornerstone,cornerstoneTools),cornerstoneTools=function(a,b,c){"use strict";function d(c,d,e){function f(a,c){var e=c;d.x=e.currentPoints.image.x,d.y=e.currentPoints.image.y,b.updateImage(h)}function g(){d.eactive=!1,a(h).off("CornerstoneToolsTouchDrag",f),a(h).off("CornerstoneToolsDragEnd",g),b.updateImage(h),e()}var h=c.element;a(h).on("CornerstoneToolsTouchDrag",f),a(h).on("CornerstoneToolsDragEnd",g)}return void 0===c&&(c={}),c.touchmoveHandle=d,c}($,cornerstone,cornerstoneTools),cornerstoneTools=function(a,b,c,d){"use strict";function e(d,e,f,g,h){function i(a,c){for(var d in e.handles){var f=e.handles[d];f.x+=c.deltaPoints.image.x,f.y+=c.deltaPoints.image.y,h&&(f.x<0&&(f.x=0),f.x>c.image.width&&(f.x=c.image.width),f.y<0&&(f.y=0),f.y>c.image.height&&(f.y=c.image.height))}return b.updateImage(l),!1}function j(d,h){if(e.moving=!1,a(l).off("CornerstoneToolsMouseDrag",i),a(l).off("CornerstoneToolsMouseUp",j),g===!0){var k=h.image,m=!1,n={top:0,left:0,width:k.width,height:k.height};for(var o in e.handles){var p=e.handles[o];c.point.insideRect(p,n)===!1&&(m=!0)}if(m){for(var q=-1,r=0;rm)){var n=c.referenceLines.calculateReferenceLine(i,j),o=c.toolColors.getActiveColor();a.beginPath(),a.strokeStyle=o,a.lineWidth=1/d.viewport.scale,a.moveTo(n.start.x,n.start.y),a.lineTo(n.end.x,n.end.y),a.stroke()}}}}return void 0===c&&(c={}),void 0===c.referenceLines&&(c.referenceLines={}),c.referenceLines.renderActiveReferenceLine=d,c}($,cornerstone,cornerstoneTools),cornerstoneTools=function(a,b,c){"use strict";function d(a,d){if(void 0===a)throw"playClip: element must not be undefined";void 0===d&&(d=30);var e=c.getToolState(a,"stack");if(void 0!==e&&void 0!==e.data&&0!==e.data.length){var g,h=e.data[0],i=c.getToolState(a,f);void 0===i||0===i.data.length?(g={intervalId:void 0,framesPerSecond:d,lastFrameTimeStamp:void 0,frameRate:0},c.addToolState(a,f,g)):(g=i.data[0],g.framesPerSecond=d),void 0===g.intervalId&&(g.intervalId=setInterval(function(){var c=h.currentImageIdIndex;if(g.framesPerSecond>0?c++:c--,c>=h.imageIds.length&&(c=0),0>c&&(c=h.imageIds.length-1),c!==h.currentImageIdIndex){var d=b.getViewport(a);b.loadAndCacheImage(h.imageIds[c]).then(function(e){h.currentImageIdIndex=c,b.displayImage(a,e,d)})}},1e3/Math.abs(g.framesPerSecond)))}}function e(a){var b,d=c.getToolState(a,f);void 0!==d&&0!==d.data.length&&(b=d.data[0],clearInterval(b.intervalId),b.intervalId=void 0)}void 0===c&&(c={});var f="playClip";return c.playClip=d,c.stopClip=e,c}($,cornerstone,cornerstoneTools),cornerstoneTools=function(a,b,c){"use strict";function d(a){var e=c.getToolState(a,"stack");if(void 0!==e&&void 0!==e.data&&0!==e.data.length){var f=c.getToolState(a,g);if(void 0!==f){var h=f.data[0],i=e.data[0];if(h.enabled!==!1){var j=h.prefetchImageIdIndex+1;if(j=Math.min(i.imageIds.length-1,j),j=Math.max(0,j),j===h.prefetchImageIdIndex)return void(h.enabled=!1);h.prefetchImageIdIndex=j;var k=i.imageIds[j],l=b.loadAndCacheImage(k);l.done(function(){h.enabled!==!1&&setTimeout(function(){d(a)},1)})}}}}function e(a){var b=c.getToolState(a,g);void 0===b?(b={prefetchImageIdIndex:-1,enabled:!0},c.addToolState(a,g,b)):b.data[0].enabled=!0,d(a)}function f(a){var b=c.getToolState(a,g);void 0!==b&&(b.data[0].enabled=!1)}void 0===c&&(c={});var g="stackPrefetch";return c.stackPrefetch={enable:e,disable:f},c}($,cornerstone,cornerstoneTools),cornerstoneTools=function(a,b,c){"use strict";function d(a,d){var e=c.getToolState(a,"stack");if(void 0!==e&&void 0!==e.data&&0!==e.data.length){var f=e.data[0],g=f.currentImageIdIndex+d;if(g=Math.min(f.imageIds.length-1,g),g=Math.max(0,g),g!==f.currentImageIdIndex){var h=b.getViewport(a);b.loadAndCacheImage(f.imageIds[g]).then(function(c){f=e.data[0],f.newImageIdIndex!==g&&(f.currentImageIdIndex=g,b.displayImage(a,c,h))})}}}function e(b,c){a(c.element).off("CornerstoneToolsMouseDrag",g),a(c.element).off("CornerstoneToolsMouseUp",e)}function f(b,d){if(c.isMouseButtonEnabled(d.which,b.data.mouseButtonMask)){var f={deltaY:0,options:b.data.options};return a(d.element).on("CornerstoneToolsMouseDrag",f,g),a(d.element).on("CornerstoneToolsMouseUp",e),b.stopImmediatePropagation(),!1}}function g(d,e){d.data.deltaY+=e.deltaPoints.page.y;var f=c.getToolState(e.element,"stack");if(void 0!==f&&void 0!==f.data&&0!==f.data.length){var g=f.data[0],h=a(e.element).height()/g.imageIds.length;if(void 0!==d.data.options&&void 0!==d.data.options.stackScrollSpeed&&(h=d.data.options.stackScrollSpeed),d.data.deltaY>=h||d.data.deltaY<=-h){var i=d.data.deltaY/h,j=d.data.deltaY%h,k=Math.round(i);d.data.deltaY=j;var l=g.currentImageIdIndex+k;if(l=Math.min(g.imageIds.length-1,l),l=Math.max(0,l),l!==g.currentImageIdIndex){g.currentImageIdIndex=l;var m=b.getViewport(e.element);b.loadAndCacheImage(g.imageIds[l]).then(function(a){var c=f.data[0];c.currentImageIdIndex===l&&b.displayImage(e.element,a,m)})}}return!1}}function h(a,b){var c=-b.direction;d(b.element,c)}function i(a){var d=a.originalEvent.detail,e={deltaY:0};e.deltaY+=d.deltaPoints.page.y;var f=c.getToolState(d.element,"stack");if(void 0!==f&&void 0!==f.data&&0!==f.data.length){var g=f.data[0];if(e.deltaY>=3||e.deltaY<=-3){var h=e.deltaY/3,i=e.deltaY%3,j=Math.round(h);e.deltaY=i;var k=g.currentImageIdIndex+j;if(k=Math.min(g.imageIds.length-1,k),k=Math.max(0,k),k!==g.currentImageIdIndex){g.currentImageIdIndex=k;var l=b.getViewport(d.element);b.loadAndCacheImage(g.imageIds[k]).then(function(a){b.displayImage(d.element,a,l)})}}return!1}}void 0===c&&(c={});return c.stackScroll=c.simpleMouseButtonTool(f),c.stackScrollWheel=c.mouseWheelTool(h),c.stackScrollTouchDrag=c.touchDragTool(i),c}($,cornerstone,cornerstoneTools),cornerstoneTools=function(a,b,c){"use strict";function d(){function a(a,c,d){var f=b.getEnabledElement(a);e.hasOwnProperty(f.image.imageId)===!1&&(e[f.image.imageId]={});var g=e[f.image.imageId];g.hasOwnProperty(c)===!1&&(g[c]={data:[]});var h=g[c];h.data.push(d)}function c(a,c){var d=b.getEnabledElement(a);if(e.hasOwnProperty(d.image.imageId)===!1)return void 0;var f=e[d.image.imageId];if(f.hasOwnProperty(c)===!1)return void 0;var g=f[c];return g}function d(a){var c=b.getEnabledElement(a);return e.hasOwnProperty(c.image.imageId)===!1?void 0:void delete e[c.image.imageId]}var e={},f={get:c,add:a,clear:d};return f}void 0===c&&(c={});var e=d();return c.newImageIdSpecificToolStateManager=d,c.globalImageIdSpecificToolStateManager=e,c}($,cornerstone,cornerstoneTools),cornerstoneTools=function(a,b,c){"use strict";function d(a,c){function d(d,e,g){if(!(a.indexOf(e)>=0))return c.add(d,e,g);b.getEnabledElement(d);f.hasOwnProperty(e)===!1&&(f[e]={data:[]});var h=f[e];h.data.push(g)}function e(b,d){if(a.indexOf(d)>=0){f.hasOwnProperty(d)===!1&&(f[d]={data:[]});var e=f[d];return e}return c.get(b,d)}var f={},g={get:e,add:d};return g}function e(a){var b=c.getElementToolStateManager(a);void 0===b&&(b=c.globalImageIdSpecificToolStateManager);var d=["stack","stackScroll","playClip","volume","slab","referenceLines","crosshairs"],e=c.newStackSpecificToolStateManager(d,b);f.push(e),c.setElementToolStateManager(a,e)}void 0===c&&(c={});var f=[];return c.newStackSpecificToolStateManager=d,c.addStackStateManager=e,c}($,cornerstone,cornerstoneTools),cornerstoneTools=function(a,b,c){"use strict";function d(a,c){function d(d,e,g){if(!(a.indexOf(e)>=0))return c.add(d,e,g);b.getEnabledElement(d);f.hasOwnProperty(e)===!1&&(f[e]={data:[]});var h=f[e];h.data.push(g)}function e(b,d){if(a.indexOf(d)>=0){f.hasOwnProperty(d)===!1&&(f[d]={data:[]});var e=f[d];return e}return c.get(b,d)}var f={},g={get:e,add:d};return g}function e(a,b){b=b||["timeSeries"];var d=c.getElementToolStateManager(a);void 0===d&&(d=c.globalImageIdSpecificToolStateManager);var e=c.newTimeSeriesSpecificToolStateManager(b,d);f.push(e),c.setElementToolStateManager(a,e)}void 0===c&&(c={});var f=[];return c.newTimeSeriesSpecificToolStateManager=d,c.addTimeSeriesStateManager=e,c}($,cornerstone,cornerstoneTools),cornerstoneTools=function(a,b,c){"use strict";function d(){function a(a){e=a}function b(){return e}function c(a){f=a}function d(){return f}var e="white",f="greenyellow",g={setToolColor:a,getToolColor:b,setActiveColor:c,getActiveColor:d};return g}return void 0===c&&(c={}),c.toolColors=d(),c}($,cornerstone,cornerstoneTools),cornerstoneTools=function(a,b,c){"use strict";function d(){function a(a){c=a.currentPoints.image}function b(){return c}var c="",d={setCoords:a,getCoords:b};return d}return void 0===c&&(c={}),c.toolCoordinates=d(),c}($,cornerstone,cornerstoneTools),cornerstoneTools=function(a,b,c){"use strict";function d(a){var d=b.getEnabledElement(a);return void 0===d.toolStateManager&&(d.toolStateManager=c.globalImageIdSpecificToolStateManager),d.toolStateManager}function e(a,b,c){var e=d(a);e.add(a,b,c)}function f(a,b){var c=d(a);return c.get(a,b)}function g(a,b,c){for(var e=d(a),f=e.get(a,b),g=-1,h=0;hf&&(l=f,m=a)}),m!==k.currentImageIdIndex&&-1!==m&&b.loadAndCacheImage(k.imageIds[m]).then(function(a){var c=b.getViewport(f);k.currentImageIdIndex=m,d.displayImage(f,a,c)})}}return void 0===c&&(c={}),c.stackImagePositionSynchronizer=d,c}($,cornerstone,cornerstoneTools),cornerstoneTools=function(a,b,c){"use strict";function d(c,d){function e(b){j=!0,a.each(i,function(a,c){d(g,b,c)}),j=!1}function f(a){j!==!0&&e(a.currentTarget)}var g=this,h=[],i=[],j=!1;this.addSource=function(b){var d=h.indexOf(b);-1===d&&(h.push(b),a(b).on(c,f),e(b))},this.addTarget=function(a){var b=i.indexOf(a);-1===b&&(i.push(a),d(g,a,a))},this.add=function(a){g.addSource(a),g.addTarget(a)},this.removeSource=function(b){var d=h.indexOf(b);-1!==d&&(h.splice(d,1),a(b).off(c,f),e(b))},this.removeTarget=function(a){var b=i.indexOf(a);-1!==b&&(i.splice(b,1),d(g,a,a))},this.remove=function(a){g.removeTarget(a),g.removeSource(a)},this.getSourceElements=function(){return h},this.displayImage=function(a,c,d){j=!0,b.displayImage(a,c,d),j=!1},this.setViewport=function(a,c){j=!0,b.setViewport(a,c),j=!1}}return void 0===c&&(c={}),c.Synchronizer=d,c}($,cornerstone,cornerstoneTools),cornerstoneTools=function(a,b,c){"use strict";function d(a,c,d){d!==c&&b.updateImage(d)}return void 0===c&&(c={}),c.updateImageSynchronizer=d,c}($,cornerstone,cornerstoneTools),cornerstoneTools=function(a,b,c){"use strict";function d(a,c,d){if(d!==c){var e=b.getViewport(c),f=b.getViewport(d);(f.voi.windowWidth!==e.voi.windowWidth||f.voi.windowCenter!==e.voi.windowCenter||f.invert!==e.invert)&&(f.voi.windowWidth=e.voi.windowWidth,f.voi.windowCenter=e.voi.windowCenter,f.invert=e.invert,a.setViewport(d,f))}}return void 0===c&&(c={}),c.wwwcSynchronizer=d,c}($,cornerstone,cornerstoneTools),cornerstoneTools=function(a,b,c){"use strict";function d(a){var c=[];a.timeSeries.stacks.forEach(function(d){b.loadAndCacheImage(d.imageIds[a.imageIdIndex]).then(function(b){var d=Math.round(a.handles.end.x)+Math.round(a.handles.end.y)*b.width,e=b.getPixelData()[d];c.push(e)})}),a.lineSample.set(c)}function e(a){var b=c.getToolState(a.element,"timeSeries");if(void 0!==b&&void 0!==b.data&&0!==b.data.length){var e=b.data[0],f={timeSeries:e,lineSample:new c.LineSampleMeasurement,imageIdIndex:e.stacks[e.currentStackIndex].currentImageIdIndex,visible:!0,handles:{end:{x:a.currentPoints.image.x,y:a.currentPoints.image.y,highlight:!0,active:!0}}};return d(f),c.MeasurementManager.add(f),f}}function f(a,d){var e=c.getToolState(a.currentTarget,g);if(void 0!==e){var f=d.canvasContext.canvas.getContext("2d");b.setToPixelCoordinateSystem(d.enabledElement,f);for(var h="white",i=0;i=g.stacks.length&&(j=0),0>j&&(j=g.stacks.length-1)):(j=Math.min(g.stacks.length-1,j),j=Math.max(0,j)),j!==g.currentStackIndex){var k=b.getViewport(a),l=g.stacks[j];b.loadAndCacheImage(l.imageIds[i]).then(function(c){g.currentImageIdIndex!==i&&(l.currentImageIdIndex=i,g.currentStackIndex=j,b.displayImage(a,c,k))})}}}void 0===c&&(c={});return c.incrementTimePoint=d,c}($,cornerstone,cornerstoneTools),cornerstoneTools=function(a,b,c){"use strict";function d(a,b){if(void 0===a)throw"playClip: element must not be undefined";void 0===b&&(b=30);var d=c.getToolState(a,"timeSeries");if(void 0!==d&&void 0!==d.data&&0!==d.data.length){var e,g=d.data[0],h=c.getToolState(a,f);void 0===h||0===h.data.length?(e={intervalId:void 0,framesPerSecond:b,lastFrameTimeStamp:void 0,frameRate:0},c.addToolState(a,f,e)):(e=h.data[0],e.framesPerSecond=b),void 0===e.intervalId&&(e.intervalId=setInterval(function(){g.stacks[g.currentStackIndex].currentImageIdIndex,g.currentStackIndex;e.framesPerSecond>0?c.incrementTimePoint(a,1,!0):c.incrementTimePoint(a,-1,!0)},1e3/Math.abs(e.framesPerSecond)))}}function e(a){var b,d=c.getToolState(a,f);void 0!==d&&0!==d.data.length&&(b=d.data[0],clearInterval(b.intervalId),b.intervalId=void 0)}void 0===c&&(c={});var f="timeSeriesPlayer";return c.timeSeriesPlayer={start:d,stop:e},c}($,cornerstone,cornerstoneTools),cornerstoneTools=function(a,b,c){"use strict";function d(b,c){a(c.element).off("CornerstoneToolsMouseDrag",f),a(c.element).off("CornerstoneToolsMouseUp",d)}function e(b,e){if(c.isMouseButtonEnabled(e.which,b.data.mouseButtonMask)){var g={deltaY:0,options:b.data.options};return a(e.element).on("CornerstoneToolsMouseDrag",g,f),a(e.element).on("CornerstoneToolsMouseUp",d),b.stopImmediatePropagation(),!1}}function f(b,d){b.data.deltaY+=d.deltaPoints.page.y;var e=c.getToolState(d.element,"timeSeries");if(void 0!==e&&void 0!==e.data&&0!==e.data.length){var f=e.data[0],g=a(d.element).height()/f.stacks.length;if(void 0!==b.data.options&&void 0!==b.data.options.timeSeriesScrollSpeed&&(g=b.data.options.timeSeriesScrollSpeed),b.data.deltaY>=g||b.data.deltaY<=-g){var h=Math.round(b.data.deltaY/g),i=b.data.deltaY%g;c.incrementTimePoint(d.element,h),b.data.deltaY=i}return!1}}function g(a,b){var d=-b.direction;c.incrementTimePoint(b.element,d)}function h(a){var b=a.originalEvent.detail,d={deltaY:0};d.deltaY+=b.deltaPoints.page.y;var e=c.getToolState(b.element,"stack");if(void 0!==e&&void 0!==e.data&&0!==e.data.length){if(d.deltaY>=3||d.deltaY<=-3){var f=d.deltaY/3,g=d.deltaY%3;c.setTimePoint(d.element,f),d.deltaY=g}return!1}}void 0===c&&(c={});return c.timeSeriesScroll=c.simpleMouseButtonTool(e),c.timeSeriesScrollWheel=c.mouseWheelTool(g),c.timeSeriesScrollTouchDrag=c.touchDragTool(h),c}($,cornerstone,cornerstoneTools),cornerstoneTools=function(a,b,c){"use strict";function d(a,b){var c=Math.pow(10,b);return Math.round(a*c)/c}return void 0===c&&(c={}),c.roundToDecimal=d,c}($,cornerstone,cornerstoneTools),cornerstoneTools=function(a,b,c,d){"use strict";function e(a){var b=c.point.copy(a.page),d=c.point.copy(a.image);return{page:b,image:d}}return void 0===d&&(d={}),d.copyPoints=e,d}($,cornerstone,cornerstoneMath,cornerstoneTools),cornerstoneTools=function(a){"use strict";function b(a,b,c,d,e){var f=.5522848,g=d/2*f,h=e/2*f,i=b+d,j=c+e,k=b+d/2,l=c+e/2;a.beginPath(),a.moveTo(b,l),a.bezierCurveTo(b,l-h,k-g,c,k,c),a.bezierCurveTo(k+g,c,i,l-h,i,l),a.bezierCurveTo(i,l+h,k+g,j,k,j),a.bezierCurveTo(k-g,j,b,l+h,b,l),a.closePath(),a.stroke()}return void 0===a&&(a={}),a.drawEllipse=b,a}(cornerstoneTools),cornerstoneTools=function(a,b,c){"use strict";function d(a,b){var c=1<e)return a.handles[d]}}function j(b,c){function f(){d.anyHandlesOutsideImage(c,g.handles)&&d.removeToolState(c.element,e.toolType,g),a(c.element).on("CornerstoneToolsMouseMove",h)}var g;if(d.isMouseButtonEnabled(c.which,b.data.mouseButtonMask)){var j,k=c.startPoints.image,l=d.getToolState(b.currentTarget,e.toolType);if(void 0!==l)for(j=0;je)return a.handles[d]}}function k(b,c){function g(){d.anyHandlesOutsideImage(c,h.handles)&&d.removeToolState(c.element,e.toolType,h),a(c.element).on("CornerstoneToolsMouseMove",i)}var h;if(d.isMouseButtonEnabled(c.which,b.data.mouseButtonMask)){var k,l=c.startPoints.image,m=d.getToolState(b.currentTarget,e.toolType);if(void 0!==m)for(k=0;ke)return a.handles[d]}}function j(b,c){function f(){d.anyHandlesOutsideImage(c,g.handles)&&d.removeToolState(c.element,e.toolType,g),a(c.element).on("CornerstoneToolsTouchDrag",h)}var g,j,k=c.startPoints.image,l=d.getToolState(b.currentTarget,e.toolType);if(void 0!==l)for(j=0;je?!0:(d.start=a.handles.start2,d.end=a.handles.end2,e=c.lineSegment.distanceToPoint(d,b),5>e)}function g(a,c){var e=d.getToolState(a.currentTarget,h);if(void 0!==e){var g=c.canvasContext.canvas.getContext("2d");b.setToPixelCoordinateSystem(c.enabledElement,g);for(var i,j=0;jk&&(f=k,h=a)}),h!==j.currentImageIdIndex&&-1!==h&&void 0!==j.imageIds[h]&&b.loadAndCacheImage(j.imageIds[h]).then(function(a){var c=b.getViewport(e);j.currentImageIdIndex=h,b.displayImage(e,a,c)})}}})}}function e(b,c){a(c.element).off("CornerstoneToolsMouseDrag",g),a(c.element).off("CornerstoneToolsMouseUp",e)}function f(b,f){return c.isMouseButtonEnabled(f.which,b.data.mouseButtonMask)?(a(f.element).on("CornerstoneToolsMouseDrag",g),a(f.element).on("CornerstoneToolsMouseUp",e),d(b,f),!1):void 0}function g(a,b){return d(a,b),!1}function h(d,e,g){var h={mouseButtonMask:e};c.addToolState(d,j,{synchronizationContext:g}),a(d).off("CornerstoneToolsMouseDown",f),a(d).on("CornerstoneToolsMouseDown",h,f),b.updateImage(d)}function i(c){a(c).off("CornerstoneToolsMouseDown",f),b.updateImage(c)}void 0===c&&(c={});var j="crosshairs";return c.crosshairs={enable:h,disable:i},c}($,cornerstone,cornerstoneTools),cornerstoneTools=function(a,b,c,d){"use strict";function e(a){var b={visible:!0,handles:{start:{x:a.currentPoints.image.x,y:a.currentPoints.image.y,highlight:!0,active:!1},end:{x:a.currentPoints.image.x,y:a.currentPoints.image.y,highlight:!0,active:!0}}};return b}function f(a,b){var d={left:Math.min(a.handles.start.x,a.handles.end.x),top:Math.min(a.handles.start.y,a.handles.end.y),width:Math.abs(a.handles.start.x-a.handles.end.x),height:Math.abs(a.handles.start.y-a.handles.end.y)},e=c.rect.distanceToPoint(d,b);return 5>e}function g(a,b){var c=a.width/2,d=a.height/2;if(0>=c||0>=d)return!1;var e={x:a.left+c,y:a.top+d},f={x:b.x-e.x,y:b.y-e.y},g=f.x*f.y/(c*c)+f.y*f.y/(d*d)<=1;return g}function h(a,b){for(var c=0,d=0,e=0,f=0,h=b.top;h=c.left&&b.x<=c.left+c.width&&b.y>=c.top&&b.y<=c.top+c.height&&(d=!0),d}function g(a,b){var d={left:Math.min(a.handles.start.x,a.handles.end.x),top:Math.min(a.handles.start.y,a.handles.end.y),width:Math.abs(a.handles.start.x-a.handles.end.x),height:Math.abs(a.handles.start.y-a.handles.end.y)},e=c.rect.distanceToPoint(d,b);return 5>e}function h(a,c){var e=d.getToolState(a.currentTarget,i);if(void 0!==e){var f=c.canvasContext.canvas.getContext("2d");b.setToPixelCoordinateSystem(c.enabledElement,f);var g=d.toolColors.getToolColor();f.save();var h=e.data[0],j={left:Math.min(h.handles.start.x,h.handles.end.x),top:Math.min(h.handles.start.y,h.handles.end.y),width:Math.abs(h.handles.start.x-h.handles.end.x),height:Math.abs(h.handles.start.y-h.handles.end.y)};f.beginPath(),d.drawHandles(f,c,h.handles,g),f.stroke(),f.beginPath(),f.strokeStyle="transparent",f.save(),f.setTransform(1,0,0,1,0,0),f.rect(0,0,f.canvas.clientWidth,f.canvas.clientHeight),f.restore(),f.rect(j.width+j.left,j.top,-j.width,j.height),f.restore(),f.stroke(),f.fillStyle="rgba(0,0,0,0.7)",f.fill(),f.closePath(),f.beginPath(),f.strokeStyle=g,f.lineWidth=2.5/c.viewport.scale,f.setLineDash([4]),f.strokeRect(j.left,j.top,j.width,j.height),f.restore()}}void 0===d&&(d={});var i="highlight",j=!0;return d.highlight=d.mouseButtonRectangleTool({createNewMeasurement:e,onImageRendered:h,pointNearTool:g,pointInsideRect:f,toolType:i},j),d.highlightTouch=d.touchTool({createNewMeasurement:e,onImageRendered:h,pointNearTool:g,pointInsideRect:f,toolType:i},j),d}($,cornerstone,cornerstoneMath,cornerstoneTools),cornerstoneTools=function(a,b,c,d){"use strict";function e(a){var b={visible:!0,handles:{start:{x:a.currentPoints.image.x,y:a.currentPoints.image.y,highlight:!0,active:!1},end:{x:a.currentPoints.image.x,y:a.currentPoints.image.y,highlight:!0,active:!0}}};return b}function f(a,b){var d={start:a.handles.start,end:a.handles.end},e=c.lineSegment.distanceToPoint(d,b);return 25>e}function g(a,c){var e=d.getToolState(a.currentTarget,h);if(void 0!==e){var g=c.canvasContext.canvas.getContext("2d");b.setToPixelCoordinateSystem(c.enabledElement,g);for(var i,j=0;je}function g(a,b){for(var c=0,d=0,e=0,f=0,g=b.top;gn?1:-1};g=jQuery.Event("CornerstoneToolsTouchPinch",o),a(o.element).trigger(g,o);break;case"touch":if(i={page:c.point.pageToPoint(f.gesture.touches[0]),image:b.pageToPixel(h,f.gesture.touches[0].pageX,f.gesture.touches[0].pageY)},k={event:f,viewport:b.getViewport(h),image:b.getEnabledElement(h).image,element:h,startPoints:i,lastPoints:j,currentPoints:i,deltaPoints:{x:0,y:0}},g=jQuery.Event("CornerstoneToolsDragStart",k),a(k.element).trigger(g,k),j=d.copyPoints(i),g.isImmediatePropagationStopped()===!1&&e(k)===!0)return d.pauseEvent(f);break;case"drag":p={page:c.point.pageToPoint(f.gesture.touches[0]),image:b.pageToPixel(h,f.gesture.touches[0].pageX,f.gesture.touches[0].pageY)},q={page:c.point.subtract(p.page,j.page),image:c.point.subtract(p.image,j.image)},l={viewport:b.getViewport(h),image:b.getEnabledElement(h).image,element:h,startPoints:i,lastPoints:j,currentPoints:p,deltaPoints:q},a(k.element).trigger("CornerstoneToolsTouchDrag",l),j=d.copyPoints(p);break;case"dragend":var p={page:c.point.pageToPoint(f.gesture.touches[0]),image:b.pageToPixel(h,f.gesture.touches[0].pageX,f.gesture.touches[0].pageY)},q={page:c.point.subtract(p.page,j.page),image:c.point.subtract(p.image,j.image)};return l={event:f,viewport:b.getViewport(h),image:b.getEnabledElement(h).image,element:h,startPoints:i,lastPoints:j,currentPoints:p,deltaPoints:q},g=jQuery.Event("CornerstoneToolsDragEnd",l),a(k.element).trigger(g,l),d.pauseEvent(f)}}function g(b){var c={transform_always_block:!0,transform_min_scale:.01,drag_block_horizontal:!0,drag_block_vertical:!0,drag_min_distance:0};a(b).hammer(c).on("touch drag transform dragstart dragend",f)}function h(b){a(b).hammer().off("touch drag transform dragstart dragend",f)}void 0===d&&(d={});var i,j,k,l,m=1;return d.touchInput={enable:g,disable:h},d}($,cornerstone,cornerstoneMath,cornerstoneTools),cornerstoneTools=function(a,b,c,d){"use strict";function e(a,b){var d=a.image,e={left:0,top:0,width:d.width,height:d.height},f=!1;for(var g in b){var h=b[g];c.point.insideRect(h,e)===!1&&(f=!0)}return f}return void 0===d&&(d={}),d.anyHandlesOutsideImage=e,d}($,cornerstone,cornerstoneMath,cornerstoneTools),cornerstoneTools=function(a,b,c){"use strict";function d(a,b,c,d){a.strokeStyle=d;var f=e/b.viewport.scale;for(var g in c){var h=c[g];(h.active||h.highlight)&&(a.beginPath(),a.lineWidth=h.active?2/b.viewport.scale:.5/b.viewport.scale,a.arc(h.x,h.y,f,0,2*Math.PI),a.stroke())}}void 0===c&&(c={});var e=6;return c.drawHandles=d,c}($,cornerstone,cornerstoneTools),cornerstoneTools=function(a,b,c,d){"use strict";function e(a,b,d){var e=h/d;for(var f in a){var g=a[f],i=c.point.distance(b,g);if(e>=i)return g}return void 0}function f(a){for(var b in a){var c=a[b];if(c.active===!0)return c}return void 0}function g(a,b,c){var d=f(a),g=e(a,b,c);return d!==g?(void 0!==g&&(g.active=!0),void 0!==d&&(d.active=!1),!0):!1}void 0===d&&(d={});var h=6;return d.handleActivator=g,d}($,cornerstone,cornerstoneMath,cornerstoneTools),cornerstoneTools=function(a,b,c){"use strict";function d(c,d,e,f){function g(a,c){d.x=c.currentPoints.image.x,d.y=c.currentPoints.image.y,f&&(d.x<0&&(d.x=0),d.x>c.image.width&&(d.x=c.image.width),d.y<0&&(d.y=0),d.y>c.image.height&&(d.y=c.image.height)),b.updateImage(i)}function h(){d.eactive=!1,a(i).off("CornerstoneToolsMouseDrag",g),a(i).off("CornerstoneToolsMouseUp",h),b.updateImage(i),e()}var i=c.element;a(i).on("CornerstoneToolsMouseDrag",g),a(i).on("CornerstoneToolsMouseUp",h)}return void 0===c&&(c={}),c.moveHandle=d,c}($,cornerstone,cornerstoneTools),cornerstoneTools=function(a,b,c){"use strict";function d(c,d,e){function f(a,c){var e=c;d.x=e.currentPoints.image.x,d.y=e.currentPoints.image.y,b.updateImage(h)}function g(){d.eactive=!1,a(h).off("CornerstoneToolsTouchDrag",f),a(h).off("CornerstoneToolsDragEnd",g),b.updateImage(h),e()}var h=c.element;a(h).on("CornerstoneToolsTouchDrag",f),a(h).on("CornerstoneToolsDragEnd",g)}return void 0===c&&(c={}),c.touchmoveHandle=d,c}($,cornerstone,cornerstoneTools),cornerstoneTools=function(a,b,c,d){"use strict";function e(d,e,f,g,h){function i(a,c){for(var d in e.handles){var f=e.handles[d];f.x+=c.deltaPoints.image.x,f.y+=c.deltaPoints.image.y,h&&(f.x<0&&(f.x=0),f.x>c.image.width&&(f.x=c.image.width),f.y<0&&(f.y=0),f.y>c.image.height&&(f.y=c.image.height))}return b.updateImage(l),!1}function j(d,h){if(e.moving=!1,a(l).off("CornerstoneToolsMouseDrag",i),a(l).off("CornerstoneToolsMouseUp",j),g===!0){var k=h.image,m=!1,n={top:0,left:0,width:k.width,height:k.height};for(var o in e.handles){var p=e.handles[o];c.point.insideRect(p,n)===!1&&(m=!0)}if(m){for(var q=-1,r=0;rm)){var n=c.referenceLines.calculateReferenceLine(i,j),o=c.toolColors.getActiveColor();a.beginPath(),a.strokeStyle=o,a.lineWidth=1/d.viewport.scale,a.moveTo(n.start.x,n.start.y),a.lineTo(n.end.x,n.end.y),a.stroke()}}}}return void 0===c&&(c={}),void 0===c.referenceLines&&(c.referenceLines={}),c.referenceLines.renderActiveReferenceLine=d,c}($,cornerstone,cornerstoneTools),cornerstoneTools=function(a,b,c){"use strict";function d(a,d){if(void 0===a)throw"playClip: element must not be undefined";void 0===d&&(d=30);var e=c.getToolState(a,"stack");if(void 0!==e&&void 0!==e.data&&0!==e.data.length){var g,h=e.data[0],i=c.getToolState(a,f);void 0===i||0===i.data.length?(g={intervalId:void 0,framesPerSecond:d,lastFrameTimeStamp:void 0,frameRate:0},c.addToolState(a,f,g)):(g=i.data[0],g.framesPerSecond=d),void 0===g.intervalId&&(g.intervalId=setInterval(function(){var c=h.currentImageIdIndex;if(g.framesPerSecond>0?c++:c--,c>=h.imageIds.length&&(c=0),0>c&&(c=h.imageIds.length-1),c!==h.currentImageIdIndex){var d=b.getViewport(a);b.loadAndCacheImage(h.imageIds[c]).then(function(e){h.currentImageIdIndex=c,b.displayImage(a,e,d)})}},1e3/Math.abs(g.framesPerSecond)))}}function e(a){var b,d=c.getToolState(a,f);void 0!==d&&0!==d.data.length&&(b=d.data[0],clearInterval(b.intervalId),b.intervalId=void 0)}void 0===c&&(c={});var f="playClip";return c.playClip=d,c.stopClip=e,c}($,cornerstone,cornerstoneTools),cornerstoneTools=function(a,b,c){"use strict";function d(a){var e=c.getToolState(a,"stack");if(void 0!==e&&void 0!==e.data&&0!==e.data.length){var f=c.getToolState(a,g);if(void 0!==f){var h=f.data[0],i=e.data[0];if(h.enabled!==!1){var j=h.prefetchImageIdIndex+1;if(j=Math.min(i.imageIds.length-1,j),j=Math.max(0,j),j===h.prefetchImageIdIndex)return void(h.enabled=!1);h.prefetchImageIdIndex=j;var k=i.imageIds[j],l=b.loadAndCacheImage(k);l.done(function(){h.enabled!==!1&&setTimeout(function(){d(a)},1)})}}}}function e(a){var b=c.getToolState(a,g);void 0===b?(b={prefetchImageIdIndex:-1,enabled:!0},c.addToolState(a,g,b)):b.data[0].enabled=!0,d(a)}function f(a){var b=c.getToolState(a,g);void 0!==b&&(b.data[0].enabled=!1)}void 0===c&&(c={});var g="stackPrefetch";return c.stackPrefetch={enable:e,disable:f},c}($,cornerstone,cornerstoneTools),cornerstoneTools=function(a,b,c){"use strict";function d(a,d){var e=c.getToolState(a,"stack");if(void 0!==e&&void 0!==e.data&&0!==e.data.length){var f=e.data[0],g=f.currentImageIdIndex+d;if(g=Math.min(f.imageIds.length-1,g),g=Math.max(0,g),g!==f.currentImageIdIndex){var h=b.getViewport(a);b.loadAndCacheImage(f.imageIds[g]).then(function(c){f=e.data[0],f.newImageIdIndex!==g&&(f.currentImageIdIndex=g,b.displayImage(a,c,h))})}}}function e(b,c){a(c.element).off("CornerstoneToolsMouseDrag",g),a(c.element).off("CornerstoneToolsMouseUp",e)}function f(b,d){if(c.isMouseButtonEnabled(d.which,b.data.mouseButtonMask)){var f={deltaY:0,options:b.data.options};return a(d.element).on("CornerstoneToolsMouseDrag",f,g),a(d.element).on("CornerstoneToolsMouseUp",e),b.stopImmediatePropagation(),!1}}function g(d,e){d.data.deltaY+=e.deltaPoints.page.y;var f=c.getToolState(e.element,"stack");if(void 0!==f&&void 0!==f.data&&0!==f.data.length){var g=f.data[0],h=a(e.element).height()/g.imageIds.length;if(void 0!==d.data.options&&void 0!==d.data.options.stackScrollSpeed&&(h=d.data.options.stackScrollSpeed),d.data.deltaY>=h||d.data.deltaY<=-h){var i=d.data.deltaY/h,j=d.data.deltaY%h,k=Math.round(i);d.data.deltaY=j;var l=g.currentImageIdIndex+k;if(l=Math.min(g.imageIds.length-1,l),l=Math.max(0,l),l!==g.currentImageIdIndex){g.currentImageIdIndex=l;var m=b.getViewport(e.element);b.loadAndCacheImage(g.imageIds[l]).then(function(a){var c=f.data[0];c.currentImageIdIndex===l&&b.displayImage(e.element,a,m)})}}return!1}}function h(a,b){var c=-b.direction;d(b.element,c)}function i(a){var d=a.originalEvent.detail,e={deltaY:0};e.deltaY+=d.deltaPoints.page.y;var f=c.getToolState(d.element,"stack");if(void 0!==f&&void 0!==f.data&&0!==f.data.length){var g=f.data[0];if(e.deltaY>=3||e.deltaY<=-3){var h=e.deltaY/3,i=e.deltaY%3,j=Math.round(h);e.deltaY=i;var k=g.currentImageIdIndex+j;if(k=Math.min(g.imageIds.length-1,k),k=Math.max(0,k),k!==g.currentImageIdIndex){g.currentImageIdIndex=k;var l=b.getViewport(d.element);b.loadAndCacheImage(g.imageIds[k]).then(function(a){b.displayImage(d.element,a,l)})}}return!1}}void 0===c&&(c={});return c.stackScroll=c.simpleMouseButtonTool(f),c.stackScrollWheel=c.mouseWheelTool(h),c.stackScrollTouchDrag=c.touchDragTool(i),c}($,cornerstone,cornerstoneTools),cornerstoneTools=function(a,b,c){"use strict";function d(){function a(a,c,d){var f=b.getEnabledElement(a);e.hasOwnProperty(f.image.imageId)===!1&&(e[f.image.imageId]={});var g=e[f.image.imageId];g.hasOwnProperty(c)===!1&&(g[c]={data:[]});var h=g[c];h.data.push(d)}function c(a,c){var d=b.getEnabledElement(a);if(e.hasOwnProperty(d.image.imageId)===!1)return void 0;var f=e[d.image.imageId];if(f.hasOwnProperty(c)===!1)return void 0;var g=f[c];return g}function d(a){var c=b.getEnabledElement(a);return e.hasOwnProperty(c.image.imageId)===!1?void 0:void delete e[c.image.imageId]}var e={},f={get:c,add:a,clear:d};return f}void 0===c&&(c={});var e=d();return c.newImageIdSpecificToolStateManager=d,c.globalImageIdSpecificToolStateManager=e,c}($,cornerstone,cornerstoneTools),cornerstoneTools=function(a,b,c){"use strict";function d(a,c){function d(d,e,g){if(!(a.indexOf(e)>=0))return c.add(d,e,g);b.getEnabledElement(d);f.hasOwnProperty(e)===!1&&(f[e]={data:[]});var h=f[e];h.data.push(g)}function e(b,d){if(a.indexOf(d)>=0){f.hasOwnProperty(d)===!1&&(f[d]={data:[]});var e=f[d];return e}return c.get(b,d)}var f={},g={get:e,add:d};return g}function e(a){var b=c.getElementToolStateManager(a);void 0===b&&(b=c.globalImageIdSpecificToolStateManager);var d=["stack","stackScroll","playClip","volume","slab","referenceLines","crosshairs"],e=c.newStackSpecificToolStateManager(d,b);f.push(e),c.setElementToolStateManager(a,e)}void 0===c&&(c={});var f=[];return c.newStackSpecificToolStateManager=d,c.addStackStateManager=e,c}($,cornerstone,cornerstoneTools),cornerstoneTools=function(a,b,c){"use strict";function d(a,c){function d(d,e,g){if(!(a.indexOf(e)>=0))return c.add(d,e,g);b.getEnabledElement(d);f.hasOwnProperty(e)===!1&&(f[e]={data:[]});var h=f[e];h.data.push(g)}function e(b,d){if(a.indexOf(d)>=0){f.hasOwnProperty(d)===!1&&(f[d]={data:[]});var e=f[d];return e}return c.get(b,d)}var f={},g={get:e,add:d};return g}function e(a,b){b=b||["timeSeries"];var d=c.getElementToolStateManager(a);void 0===d&&(d=c.globalImageIdSpecificToolStateManager);var e=c.newTimeSeriesSpecificToolStateManager(b,d);f.push(e),c.setElementToolStateManager(a,e)}void 0===c&&(c={});var f=[];return c.newTimeSeriesSpecificToolStateManager=d,c.addTimeSeriesStateManager=e,c}($,cornerstone,cornerstoneTools),cornerstoneTools=function(a,b,c){"use strict";function d(){function a(a){e=a}function b(){return e}function c(a){f=a}function d(){return f}var e="white",f="greenyellow",g={setToolColor:a,getToolColor:b,setActiveColor:c,getActiveColor:d};return g}return void 0===c&&(c={}),c.toolColors=d(),c}($,cornerstone,cornerstoneTools),cornerstoneTools=function(a,b,c){"use strict";function d(){function a(a){c=a.currentPoints.image}function b(){return c}var c="",d={setCoords:a,getCoords:b};return d}return void 0===c&&(c={}),c.toolCoordinates=d(),c}($,cornerstone,cornerstoneTools),cornerstoneTools=function(a,b,c){"use strict";function d(a){var d=b.getEnabledElement(a);return void 0===d.toolStateManager&&(d.toolStateManager=c.globalImageIdSpecificToolStateManager),d.toolStateManager}function e(a,b,c){var e=d(a);e.add(a,b,c)}function f(a,b){var c=d(a);return c.get(a,b)}function g(a,b,c){for(var e=d(a),f=e.get(a,b),g=-1,h=0;hf&&(l=f,m=a)}),m!==k.currentImageIdIndex&&-1!==m&&b.loadAndCacheImage(k.imageIds[m]).then(function(a){var c=b.getViewport(f);k.currentImageIdIndex=m,d.displayImage(f,a,c)})}}return void 0===c&&(c={}),c.stackImagePositionSynchronizer=d,c}($,cornerstone,cornerstoneTools),cornerstoneTools=function(a,b,c){"use strict";function d(c,d){function e(b){j=!0,a.each(i,function(a,c){d(g,b,c)}),j=!1}function f(a){j!==!0&&e(a.currentTarget)}var g=this,h=[],i=[],j=!1;this.addSource=function(b){var d=h.indexOf(b);-1===d&&(h.push(b),a(b).on(c,f),e(b))},this.addTarget=function(a){var b=i.indexOf(a);-1===b&&(i.push(a),d(g,a,a))},this.add=function(a){g.addSource(a),g.addTarget(a)},this.removeSource=function(b){var d=h.indexOf(b);-1!==d&&(h.splice(d,1),a(b).off(c,f),e(b))},this.removeTarget=function(a){var b=i.indexOf(a);-1!==b&&(i.splice(b,1),d(g,a,a))},this.remove=function(a){g.removeTarget(a),g.removeSource(a)},this.getSourceElements=function(){return h},this.displayImage=function(a,c,d){j=!0,b.displayImage(a,c,d),j=!1},this.setViewport=function(a,c){j=!0,b.setViewport(a,c),j=!1}}return void 0===c&&(c={}),c.Synchronizer=d,c}($,cornerstone,cornerstoneTools),cornerstoneTools=function(a,b,c){"use strict";function d(a,c,d){d!==c&&b.updateImage(d)}return void 0===c&&(c={}),c.updateImageSynchronizer=d,c}($,cornerstone,cornerstoneTools),cornerstoneTools=function(a,b,c){"use strict";function d(a,c,d){if(d!==c){var e=b.getViewport(c),f=b.getViewport(d);(f.voi.windowWidth!==e.voi.windowWidth||f.voi.windowCenter!==e.voi.windowCenter||f.invert!==e.invert)&&(f.voi.windowWidth=e.voi.windowWidth,f.voi.windowCenter=e.voi.windowCenter,f.invert=e.invert,a.setViewport(d,f))}}return void 0===c&&(c={}),c.wwwcSynchronizer=d,c}($,cornerstone,cornerstoneTools),cornerstoneTools=function(a,b,c){"use strict";function d(a){var c=[];a.timeSeries.stacks.forEach(function(d){b.loadAndCacheImage(d.imageIds[a.imageIdIndex]).then(function(b){var d=Math.round(a.handles.end.x)+Math.round(a.handles.end.y)*b.width,e=b.getPixelData()[d];c.push(e)})}),a.lineSample.set(c)}function e(a){var b=c.getToolState(a.element,"timeSeries");if(void 0!==b&&void 0!==b.data&&0!==b.data.length){var e=b.data[0],f={timeSeries:e,lineSample:new c.LineSampleMeasurement,imageIdIndex:e.stacks[e.currentStackIndex].currentImageIdIndex,visible:!0,handles:{end:{x:a.currentPoints.image.x,y:a.currentPoints.image.y,highlight:!0,active:!0}}};return d(f),c.MeasurementManager.add(f),f}}function f(a,d){var e=c.getToolState(a.currentTarget,g);if(void 0!==e){var f=d.canvasContext.canvas.getContext("2d");b.setToPixelCoordinateSystem(d.enabledElement,f);for(var h="white",i=0;i=g.stacks.length&&(j=0),0>j&&(j=g.stacks.length-1)):(j=Math.min(g.stacks.length-1,j),j=Math.max(0,j)),j!==g.currentStackIndex){var k=b.getViewport(a),l=g.stacks[j];b.loadAndCacheImage(l.imageIds[i]).then(function(c){g.currentImageIdIndex!==i&&(l.currentImageIdIndex=i,g.currentStackIndex=j,b.displayImage(a,c,k))})}}}void 0===c&&(c={});return c.incrementTimePoint=d,c}($,cornerstone,cornerstoneTools),cornerstoneTools=function(a,b,c){"use strict";function d(a,b){if(void 0===a)throw"playClip: element must not be undefined";void 0===b&&(b=30);var d=c.getToolState(a,"timeSeries");if(void 0!==d&&void 0!==d.data&&0!==d.data.length){var e,g=d.data[0],h=c.getToolState(a,f);void 0===h||0===h.data.length?(e={intervalId:void 0,framesPerSecond:b,lastFrameTimeStamp:void 0,frameRate:0},c.addToolState(a,f,e)):(e=h.data[0],e.framesPerSecond=b),void 0===e.intervalId&&(e.intervalId=setInterval(function(){g.stacks[g.currentStackIndex].currentImageIdIndex,g.currentStackIndex;e.framesPerSecond>0?c.incrementTimePoint(a,1,!0):c.incrementTimePoint(a,-1,!0)},1e3/Math.abs(e.framesPerSecond)))}}function e(a){var b,d=c.getToolState(a,f);void 0!==d&&0!==d.data.length&&(b=d.data[0],clearInterval(b.intervalId),b.intervalId=void 0)}void 0===c&&(c={});var f="timeSeriesPlayer";return c.timeSeriesPlayer={start:d,stop:e},c}($,cornerstone,cornerstoneTools),cornerstoneTools=function(a,b,c){"use strict";function d(b,c){a(c.element).off("CornerstoneToolsMouseDrag",f),a(c.element).off("CornerstoneToolsMouseUp",d)}function e(b,e){if(c.isMouseButtonEnabled(e.which,b.data.mouseButtonMask)){var g={deltaY:0,options:b.data.options};return a(e.element).on("CornerstoneToolsMouseDrag",g,f),a(e.element).on("CornerstoneToolsMouseUp",d),b.stopImmediatePropagation(),!1}}function f(b,d){b.data.deltaY+=d.deltaPoints.page.y;var e=c.getToolState(d.element,"timeSeries");if(void 0!==e&&void 0!==e.data&&0!==e.data.length){var f=e.data[0],g=a(d.element).height()/f.stacks.length;if(void 0!==b.data.options&&void 0!==b.data.options.timeSeriesScrollSpeed&&(g=b.data.options.timeSeriesScrollSpeed),b.data.deltaY>=g||b.data.deltaY<=-g){var h=Math.round(b.data.deltaY/g),i=b.data.deltaY%g;c.incrementTimePoint(d.element,h),b.data.deltaY=i}return!1}}function g(a,b){var d=-b.direction;c.incrementTimePoint(b.element,d)}function h(a){var b=a.originalEvent.detail,d={deltaY:0};d.deltaY+=b.deltaPoints.page.y;var e=c.getToolState(b.element,"stack");if(void 0!==e&&void 0!==e.data&&0!==e.data.length){if(d.deltaY>=3||d.deltaY<=-3){var f=d.deltaY/3,g=d.deltaY%3;c.setTimePoint(d.element,f),d.deltaY=g}return!1}}void 0===c&&(c={});return c.timeSeriesScroll=c.simpleMouseButtonTool(e),c.timeSeriesScrollWheel=c.mouseWheelTool(g),c.timeSeriesScrollTouchDrag=c.touchDragTool(h),c}($,cornerstone,cornerstoneTools),cornerstoneTools=function(a,b,c){"use strict";function d(a,b){var c=Math.pow(10,b);return Math.round(a*c)/c}return void 0===c&&(c={}),c.roundToDecimal=d,c}($,cornerstone,cornerstoneTools),cornerstoneTools=function(a,b,c,d){"use strict";function e(a){var b=c.point.copy(a.page),d=c.point.copy(a.image);return{page:b,image:d}}return void 0===d&&(d={}),d.copyPoints=e,d}($,cornerstone,cornerstoneMath,cornerstoneTools),cornerstoneTools=function(a){"use strict";function b(a,b,c,d,e){var f=.5522848,g=d/2*f,h=e/2*f,i=b+d,j=c+e,k=b+d/2,l=c+e/2;a.beginPath(),a.moveTo(b,l),a.bezierCurveTo(b,l-h,k-g,c,k,c),a.bezierCurveTo(k+g,c,i,l-h,i,l),a.bezierCurveTo(i,l+h,k+g,j,k,j),a.bezierCurveTo(k-g,j,b,l+h,b,l),a.closePath(),a.stroke()}return void 0===a&&(a={}),a.drawEllipse=b,a}(cornerstoneTools),cornerstoneTools=function(a,b,c){"use strict";function d(a,b){var c=1<cornerstoneTools Examples
  • highlight - rectangular highlight tool
  • timeSeries - time series tool
  • Tool Management - Clearing unwanted tool data
  • +
  • Save Image - example of using the saveAs function to download an element

  • diff --git a/examples/saveAs/index.html b/examples/saveAs/index.html new file mode 100755 index 000000000..b5478a0b8 --- /dev/null +++ b/examples/saveAs/index.html @@ -0,0 +1,87 @@ + + + + + + + + + + + + + +
    + + +
    +
    + + + +
    +
    +
    +
    +
    +
    +
    + +
    + + + + + + + + + + + + + + + + + + diff --git a/src/imageTools/saveImage.js b/src/imageTools/saveImage.js new file mode 100644 index 000000000..334f7f537 --- /dev/null +++ b/src/imageTools/saveImage.js @@ -0,0 +1,45 @@ +var cornerstoneTools = (function ($, cornerstone, cornerstoneTools) { + + "use strict"; + + if(cornerstoneTools === undefined) { + cornerstoneTools = {}; + } + + function saveAs(element, filename) + { + var canvas = $(element).find("canvas").get(0); + + // Thanks to Ken Fyrstenber + // http://stackoverflow.com/questions/18480474/how-to-save-an-image-from-canvas + var lnk = document.createElement('a'), + e; + + /// the key here is to set the download attribute of the a tag + lnk.download = filename; + + /// convert canvas content to data-uri for link. When download + /// attribute is set the content pointed to by link will be + /// pushed as "download" in HTML5 capable browsers + lnk.href = canvas.toDataURL(); + + /// create a "fake" click-event to trigger the download + if (document.createEvent) { + + e = document.createEvent("MouseEvents"); + e.initMouseEvent("click", true, true, window, + 0, 0, 0, 0, 0, false, false, false, + false, 0, null); + + lnk.dispatchEvent(e); + + } else if (lnk.fireEvent) { + + lnk.fireEvent("onclick"); + } + } + + cornerstoneTools.saveAs = saveAs; + + return cornerstoneTools; +}($, cornerstone, cornerstoneTools));