875 lines
29 KiB
JavaScript
875 lines
29 KiB
JavaScript
var imgInc=1, inc = 5,total,frameInc=1;
|
|
var seriesUid;
|
|
var data;
|
|
var state = {translationX : 0,translationY: 0,scale: 0,vflip: false,hflip: false,rotate: 0,invert: false,drag: false};
|
|
var navState = {screenNavImgFactor: 0.15,navigationImgFactor:0.3,scale:0,width:0,height:0,outline:{x:0,y:0,w:0,h:0},drag:false};
|
|
var doMouseWheel = true;
|
|
var loopTimer = null;
|
|
var pixelBuffer = null, lookupObj = null, pixelData = null, tmpCanvas = null, numPixels = 0;
|
|
var windowCenter='',windowWidth,modifiedWC=undefined,modifiedWW=undefined,maxPix=0,minPix=0;
|
|
var mouseLocX;
|
|
var mouseLocY;
|
|
var mousePressed;
|
|
var columns;
|
|
var isSliderLoaded = false;
|
|
var winProgress = 100;
|
|
|
|
jQuery('#ImagePane').ready(function() {
|
|
|
|
var ht = jQuery(window).height();
|
|
jQuery('body').css('height',ht - 3 + 'px' );
|
|
|
|
jQuery('#footer').css("height",(ht-165) + "px");
|
|
jQuery('#trackbar1').css("height",(ht-200) + "px");
|
|
jQuery('#end').css("top",(ht-170) + "px");
|
|
|
|
jQuery("#frameSrc").html(window.location.href);
|
|
jQuery('#studyId').html(getParameter(window.location.href,'study'));
|
|
|
|
parent.window.addEventListener('selection',onTileSelection,false);
|
|
parent.window.addEventListener('ToolSelection',onToolSelection,false);
|
|
parent.window.addEventListener('sync',synchronize,false);
|
|
window.parent.createEvent('selection',{"ImagePane":jQuery('#ImagePane')});
|
|
loadImage();
|
|
loadTextOverlay();
|
|
|
|
var canvasDiv = jQuery('#canvasDiv');
|
|
|
|
canvasDiv.on('mousewheel DOMMouseScroll', function (e) {
|
|
|
|
if(jQuery('body').css('border').indexOf('none')>=0){
|
|
window.parent.createEvent('selection',{"ImagePane":jQuery('#ImagePane')});
|
|
}
|
|
|
|
if(doMouseWheel) {
|
|
if (e.originalEvent.wheelDelta < 0 || e.originalEvent.detail > 0) {
|
|
nextImage();
|
|
} else {
|
|
prevImage();
|
|
}
|
|
}
|
|
//prevent page from scrolling
|
|
return false;
|
|
});
|
|
|
|
jQuery(document).keydown(function(e) {
|
|
if(doMouseWheel) {
|
|
if(e.which == 38 || e.which == 37) {
|
|
prevImage();
|
|
} else if(e.keyCode == 40 || e.keyCode == 39) {
|
|
nextImage();
|
|
}
|
|
}
|
|
if(e.which==46) {
|
|
deleteSelectedMeasurement();
|
|
}
|
|
});
|
|
|
|
|
|
var oy,ny;
|
|
canvasDiv.mousedown(function(e) {
|
|
if(e.which==1) {
|
|
if(jQuery('#tool').text()==='stackImage' && doMouseWheel) {
|
|
oy = e.pageY;
|
|
state.drag = true;
|
|
|
|
jQuery('#canvasDiv').mousemove(function(e1) {
|
|
if(jQuery('#tool').text()==='stackImage' && state.drag) {
|
|
ny = e1.pageY;
|
|
if( (oy-ny) >inc) {
|
|
prevImage();
|
|
oy = ny;
|
|
} else if( (oy-ny) < -(inc)) {
|
|
nextImage();
|
|
oy = ny;
|
|
}
|
|
}
|
|
});
|
|
|
|
jQuery('#canvasDiv').mouseup(function(e2) {
|
|
state.drag = false;
|
|
});
|
|
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
}
|
|
}
|
|
});
|
|
|
|
canvasDiv.click(function(e) {
|
|
window.parent.createEvent('selection',{"ImagePane":jQuery('#ImagePane')});
|
|
});
|
|
|
|
jQuery("#canvasLayer2").dblclick(function(e) {
|
|
toggleResolution();
|
|
});
|
|
|
|
window.addEventListener('resize', resizeCanvas, false);
|
|
jQuery('#tool').html('');
|
|
|
|
loadInstanceText(true,true);
|
|
|
|
if(window.parent.displayScout && (jQuery('#modalityDiv').html().indexOf('CT')>=0 || jQuery('#modalityDiv').html().indexOf('MR')>=0)) {
|
|
Localizer.drawScout();
|
|
}
|
|
|
|
if(window.parent.syncEnabled) {
|
|
window.parent.createEvent('sync',{forUid:jQuery('#forUIDPanel').html(),fromTo:getFromToLoc()});
|
|
}
|
|
loadContextMenu();
|
|
|
|
});
|
|
|
|
jQuery(document).mouseup(function(e) {
|
|
window.parent.createEvent("ToolSelection",{tool:"mouseup"});
|
|
});
|
|
|
|
function loadImage() {
|
|
var src = jQuery('#frameSrc').html();
|
|
seriesUid = getParameter(src,'series');
|
|
var instanceNo = getParameter(src,'instanceNumber');
|
|
imgInc = instanceNo!=null ? parseInt(instanceNo)+1 : 1;
|
|
|
|
var img = jQuery('#' + (seriesUid+"_"+imgInc).replace(/\./g,'_'), window.parent.document).get(0);
|
|
|
|
if(img.src.indexOf('SR_Latest.png')>=0) {
|
|
loadSR(jQuery(img).attr('imgSrc'));
|
|
} else if(img.src.indexOf('pdf.png')>=0) {
|
|
loadPDF(jQuery(img).attr('imgSrc'));
|
|
} else {
|
|
eliminateRawData();
|
|
}
|
|
jQuery('#loadingView', window.parent.document).hide();
|
|
jQuery('iframe',window.parent.document).css('visibility','visible');
|
|
}
|
|
|
|
function eliminateRawData() {
|
|
try {
|
|
showImage(seriesUid + "_" + imgInc);
|
|
} catch(err) {
|
|
if(err=='rawdata') {
|
|
imgInc = imgInc+1;
|
|
eliminateRawData();
|
|
}
|
|
}
|
|
}
|
|
|
|
function showImage(imgSrc,image) {
|
|
var image = imgSrc!=null ? jQuery('#' + imgSrc.replace(/\./g,'_'), window.parent.document).get(0) : image;
|
|
var canvas = document.getElementById('imageCanvas');
|
|
|
|
|
|
var vWidth = canvas.parentNode.offsetWidth;
|
|
var vHeight = canvas.parentNode.offsetHeight;
|
|
|
|
if(vWidth!=0 && vHeight!=0) {
|
|
canvas.width = vWidth;
|
|
canvas.height = vHeight;
|
|
canvas.style.width = vWidth;
|
|
canvas.style.height = vHeight;
|
|
|
|
var top = (canvas.parentNode.offsetHeight-canvas.height) / 2;
|
|
canvas.style.marginTop = parseInt(top) + "px";
|
|
|
|
var left = (canvas.parentNode.offsetWidth - canvas.width) / 2;
|
|
canvas.style.marginLeft = parseInt(left) + "px";
|
|
|
|
var siblings = jQuery(canvas).siblings().not('.preview');
|
|
for(var j=0; j<siblings.length; j++) {
|
|
var tmpCanvas = siblings.get(j);
|
|
if(tmpCanvas != null) {
|
|
tmpCanvas.width = vWidth;
|
|
tmpCanvas.height = vHeight;
|
|
tmpCanvas.style.width = vWidth;
|
|
tmpCanvas.style.height = vHeight;
|
|
tmpCanvas.style.marginTop = parseInt(top) + "px";
|
|
tmpCanvas.style.marginLeft = parseInt(left) + "px";
|
|
}
|
|
};
|
|
}
|
|
|
|
state.scale = Math.min(canvas.width/image.naturalWidth, canvas.height/image.naturalHeight);
|
|
state.translationX = (canvas.width- parseInt(state.scale * image.naturalWidth))/2;
|
|
state.translationY = (canvas.height- parseInt(state.scale * image.naturalHeight))/2;
|
|
showImg(null,image,true);
|
|
}
|
|
|
|
function showImg(imgSrc,img,updatePreview) {
|
|
var image = imgSrc!=null ? jQuery('#'+imgSrc.replace(/\./g,'_'), window.parent.document).get(0) : img;
|
|
if(image.src.indexOf('rawdata.png')>=0) {
|
|
throw 'rawdata';
|
|
return;
|
|
}
|
|
var canvas = document.getElementById('imageCanvas');
|
|
var ctx = canvas.getContext('2d');
|
|
|
|
ctx.save();
|
|
ctx.setTransform(1,0,0,1,0,0);
|
|
ctx.clearRect(0,0,canvas.width,canvas.height);
|
|
|
|
var translate = true;
|
|
if(jQuery("#tool").html()=="move") {
|
|
ctx.translate(state.translationX, state.translationY);
|
|
translate = false;
|
|
}
|
|
|
|
if(state.vflip) {
|
|
ctx.translate(0,canvas.height);
|
|
ctx.scale(1,-1);
|
|
}
|
|
|
|
if(state.hflip) {
|
|
ctx.translate(canvas.width,0);
|
|
ctx.scale(-1,1);
|
|
}
|
|
|
|
if(state.rotate!=0) {
|
|
ctx.translate(canvas.width/2,canvas.height/2);
|
|
ctx.rotate(state.rotate===90 ? Math.PI/2 : state.rotate===180? Math.PI : (Math.PI*3)/2);
|
|
ctx.translate(-canvas.width/2,-canvas.height/2);
|
|
}
|
|
|
|
if(translate) {
|
|
ctx.translate(state.translationX, state.translationY);
|
|
}
|
|
ctx.scale(state.scale,state.scale);
|
|
|
|
ctx.drawImage(image,0,0);
|
|
ctx.restore();
|
|
|
|
if(state.invert) {
|
|
window.parent.doInvert(jQuery('#imageCanvas').get(0),false);
|
|
}
|
|
|
|
if(updatePreview===true) {
|
|
jQuery('#zoomPercent').html('Zoom: ' + parseInt(state.scale * 100) + '%');
|
|
jQuery('#imageSize').html('Image size:' + image.naturalWidth + "x" + image.naturalHeight);
|
|
jQuery('#viewSize').html('View size:' + canvas.width + "x" + canvas.height);
|
|
loadPreview(image);
|
|
}
|
|
}
|
|
|
|
function loadTextOverlay() {
|
|
jQuery('#patName').html(window.parent.pat.pat_Name);
|
|
jQuery('#patID').html(window.parent.pat.pat_ID);
|
|
jQuery("#patGender").html(window.parent.pat.pat_gender);
|
|
|
|
var src = jQuery('#frameSrc').html();
|
|
jQuery('#seriesDesc').html(getParameter(src,'seriesDesc'));
|
|
jQuery('#modalityDiv').html(getParameter(src,'modality'));
|
|
total = parseInt(getParameter(src,'images'));
|
|
jQuery('#totalImages').html(total>1 ? 'Images:' + (imgInc) + '/ ' + total :'Image:' + (imgInc) + '/ ' + total);
|
|
loadSlider();
|
|
|
|
var studyData = JSON.parse(sessionStorage[window.parent.pat.pat_ID]);
|
|
var thisStudy = getParameter(window.location.href,"study");
|
|
|
|
if(studyData!=undefined) {
|
|
for(var st=0;st<studyData.length;st++) {
|
|
var curr_study = studyData[st];
|
|
|
|
if(curr_study["studyUID"]==thisStudy) {
|
|
jQuery('#studyDesc').html(curr_study['studyDesc']);
|
|
jQuery('#studyDate').html(curr_study['studyDate']);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function loadInstanceText(checkForUpdate,autoplay) {
|
|
data = sessionStorage[seriesUid];
|
|
if(data) {
|
|
// try {
|
|
data = JSON.parse(data);
|
|
if(data!=null) {
|
|
data = data[imgInc-1];
|
|
if(data) {
|
|
if(data['imageOrientation']!=undefined && data['imageOrientation']!='') {
|
|
var imgOrient = data['imageOrientation'].split("\\");
|
|
|
|
jQuery('#imgOriRight').html(imgOrient[0]);
|
|
jQuery('#imgOriBottom').html(imgOrient[1]);
|
|
jQuery('#imgOriLeft').html(getOppositeOrientation(imgOrient[0]));
|
|
jQuery('#imgOriTop').html(getOppositeOrientation(imgOrient[1]));
|
|
}
|
|
|
|
if(modifiedWC!=undefined) {
|
|
jQuery("#windowLevel").html('WL: ' + modifiedWC + ' / ' + 'WW: ' + modifiedWW);
|
|
} else if(windowCenter=='') {
|
|
windowCenter = data['windowCenter'];
|
|
windowWidth = data['windowWidth'];
|
|
|
|
if(windowCenter && windowCenter.indexOf('|') >=0) {
|
|
windowCenter = windowCenter.substring(0, windowCenter.indexOf('|'));
|
|
}
|
|
|
|
if(windowWidth && windowWidth.indexOf('|') >=0) {
|
|
windowWidth = windowWidth.substring(0, windowWidth.indexOf('|'));
|
|
}
|
|
jQuery("#windowLevel").html('WL: ' + windowCenter + ' / ' + 'WW: ' + windowWidth);
|
|
}
|
|
|
|
if(data['numberOfFrames'] != undefined && data['numberOfFrames'] != '') {
|
|
jQuery("#totalImages").html('Frames: ' + frameInc + ' / ' + data['numberOfFrames']);
|
|
total = data['numberOfFrames'];
|
|
jQuery('#multiframe').css('visibility','visible');
|
|
|
|
var frmSrc = jQuery('#frameSrc').text();
|
|
frmSrc = frmSrc.substring(0,frmSrc.indexOf("&object"));
|
|
jQuery('#frameSrc').html(frmSrc + "&object=" + data['SopUID']);
|
|
|
|
if(!isSliderLoaded) {
|
|
jQuery("#totalImages").text('Frames:' + frameInc + '/' + data['numberOfFrames']);
|
|
loadSlider();
|
|
isSliderLoaded = true;
|
|
}
|
|
|
|
if(autoplay) {
|
|
var frameTime = parseFloat(data['frameTime']);
|
|
if(frameTime>0.0) {
|
|
doAutoplay(frameTime);
|
|
} else {
|
|
doAutoplay(15); // 15 FPS by default
|
|
}
|
|
}
|
|
} else {
|
|
jQuery('#totalImages').html(total>1 ? 'Images:' + (imgInc) + '/ ' + total :'Image:' + (imgInc) + '/ ' + total);
|
|
jQuery('#multiframe').css('visibility','hidden');
|
|
}
|
|
|
|
var sliceInfo = '';
|
|
|
|
if(data['sliceThickness'] != undefined && data['sliceThickness'] != '') {
|
|
sliceInfo = 'Thick: ' + parseFloat(data['sliceThickness']).toFixed(2) + ' mm ';
|
|
}
|
|
|
|
if(data['sliceLocation'] != undefined && data['sliceLocation'] != '') {
|
|
sliceInfo += 'Loc: ' + parseFloat(data['sliceLocation']).toFixed(2) + ' mm';
|
|
}
|
|
|
|
jQuery('#thickLocationPanel').html(sliceInfo);
|
|
|
|
if(data['frameOfReferenceUID'] != undefined) {
|
|
jQuery('#forUIDPanel').html(data['frameOfReferenceUID']);
|
|
}
|
|
|
|
if(data['refSOPInsUID'] != undefined) {
|
|
jQuery('#refSOPInsUID').html(data['refSOPInsUID']);
|
|
}
|
|
|
|
if(jQuery('#imgType').html()!=data['imageType']) {
|
|
jQuery('#imgType').html(data['imageType']);
|
|
Localizer.toggleLevelLine();
|
|
}
|
|
|
|
jQuery('#imgPosition').html(data['imagePositionPatient']);
|
|
jQuery('#imgOrientation').html(data['imageOrientPatient']);
|
|
jQuery('#pixelSpacing').html(data['pixelSpacing']);
|
|
jQuery('#imgPixelSpacing').html(data['imagerPixelSpacing']);
|
|
} else {
|
|
jQuery('#totalImages').html(total>1 ? 'Images:' + (imgInc) + '/ ' + total :'Image:' + (imgInc) + '/ ' + total);
|
|
}
|
|
} else if(checkForUpdate===true){
|
|
setTimeout("loadInstanceText("+checkForUpdate + "," + autoplay +")",200);
|
|
} else {
|
|
jQuery('#totalImages').html(total>1 ? 'Images:' + (imgInc) + '/ ' + total :'Image:' + (imgInc) + '/ ' + total);
|
|
}
|
|
// } catch(e) {
|
|
// console.log("DICOM attributes not available " + e);
|
|
// jQuery('#totalImages').html(total>1 ? 'Images:' + (imgInc) + '/ ' + total :'Image:' + (imgInc) + '/ ' + total);
|
|
// }
|
|
} else if(checkForUpdate===true) {
|
|
if(window.parent.pat.studyUID==jQuery('#studyId').html()) {
|
|
setTimeout("loadInstanceText("+checkForUpdate + "," + autoplay +")",200);
|
|
}
|
|
} else {
|
|
jQuery('#totalImages').html(total>1 ? 'Images:' + (imgInc) + '/ ' + total :'Image:' + (imgInc) + '/ ' + total);
|
|
}
|
|
setSliderValue();
|
|
jQuery('#serId').html(seriesUid+'_'+imgInc);
|
|
window.parent.setSeriesIdentification();
|
|
|
|
if(window.parent.displayScout && (jQuery('#modalityDiv').html().indexOf('CT')>=0 || jQuery('#modalityDiv').html().indexOf('MR')>=0)) {
|
|
Localizer.drawScout();
|
|
}
|
|
}
|
|
|
|
function nextImage() {
|
|
var isMultiframe = jQuery('#totalImages').html().indexOf('Frame')>=0;
|
|
var iNo = !isMultiframe ? imgInc : frameInc;
|
|
iNo = (iNo+1) <= total ? (iNo+1) : 1;
|
|
loadImg(isMultiframe,iNo);
|
|
imgLoaded();
|
|
|
|
}
|
|
|
|
function prevImage() {
|
|
var isMultiframe = jQuery('#totalImages').html().indexOf('Frame')>=0;
|
|
var iNo = !isMultiframe ? imgInc : frameInc;
|
|
iNo = (iNo-1) >= 1 ? (iNo-1) : total;
|
|
loadImg(isMultiframe,iNo);
|
|
imgLoaded();
|
|
}
|
|
|
|
function loadImg(isMultiframe,iNo) {
|
|
var imgSrc = null;
|
|
|
|
if(window.parent.pat.serverURL.indexOf('wado')>0 && modifiedWC!=undefined && modifiedWW!=undefined && (modifiedWC!=windowCenter || modifiedWW!=windowWidth)) {
|
|
if(!isMultiframe) {
|
|
imgSrc = jQuery('#' + (seriesUid + "_" + iNo).replace(/\./g,'_'), window.parent.document).attr('src');
|
|
this.imgInc = iNo;
|
|
} else {
|
|
imgSrc = jQuery('#' + (getParameter(jQuery('#frameSrc').html(),'object')+"_"+iNo).replace(/\./g,'_'), window.parent.document).attr('src');
|
|
this.frameInc = iNo;
|
|
}
|
|
if(imgSrc.indexOf('windowCenter') >= 0) {
|
|
imgSrc = imgSrc.substring(0, imgSrc.indexOf('&windowCenter='));
|
|
}
|
|
imgSrc += '&windowCenter=' + modifiedWC;
|
|
imgSrc = imgSrc.trim() + '&windowWidth=' + modifiedWW;
|
|
jQuery("#wltmpImg").attr('src',imgSrc);
|
|
jQuery("#wltmpImg").attr("pos",iNo);
|
|
} else {
|
|
if(!isMultiframe) {
|
|
try {
|
|
showImg(seriesUid + "_" + iNo,null,true);
|
|
} catch(err) { // Some times it might be raw data
|
|
if(err=='rawdata') {
|
|
iNo = imgInc;
|
|
loadInstanceText(false,false);
|
|
return;
|
|
}
|
|
}
|
|
this.imgInc = iNo;
|
|
} else {
|
|
imgSrc = getParameter(jQuery('#frameSrc').html(),'object')+"_"+iNo;
|
|
showImg(imgSrc,null,true);
|
|
this.frameInc = iNo;
|
|
}
|
|
}
|
|
}
|
|
|
|
function imgLoaded() {
|
|
loadInstanceText(false, false);
|
|
clearMeasurements();
|
|
if(window.parent.syncEnabled) {
|
|
window.parent.createEvent('sync',{forUid:jQuery('#forUIDPanel').html(),fromTo:getFromToLoc()});
|
|
}
|
|
}
|
|
|
|
|
|
function getParameter(queryString, parameterName) {
|
|
//Add "=" to the parameter name (i.e. parameterName=value);
|
|
var parameterName = parameterName + "=";
|
|
if(queryString.length > 0) {
|
|
//Find the beginning of the string
|
|
var begin = queryString.indexOf(parameterName);
|
|
if(begin != -1) {
|
|
//Add the length (integer) to the beginning
|
|
begin += parameterName.length;
|
|
var end = queryString.indexOf("&", begin);
|
|
if(end == -1) {
|
|
end = queryString.length;
|
|
}
|
|
return unescape(queryString.substring(begin, end));
|
|
}
|
|
|
|
return null;
|
|
}
|
|
}
|
|
|
|
function onTileSelection(e) {
|
|
if(e.detail.ImagePane.is(jQuery('#ImagePane'))) {
|
|
jQuery('body').css('border','1px solid rgb(255, 138, 0)');
|
|
if(window && window.parent.displayScout && jQuery('#tool').text()!='measure') {
|
|
Localizer.hideScoutLine();
|
|
Localizer.drawScout();
|
|
}
|
|
var tool = jQuery('#tool').text();
|
|
jQuery('.toggleOff',window.parent.document).not('#scoutLine').removeClass('toggleOff');
|
|
if(tool!='') {
|
|
jQuery('#'+tool,window.parent.document).addClass('toggleOff');
|
|
}
|
|
if(tool=='measure') {
|
|
init(jQuery('#totalImages').html().indexOf('Frame')>=0 ? frameInc : imgInc);
|
|
}
|
|
} else {
|
|
jQuery('body').css('border','none');
|
|
}
|
|
}
|
|
|
|
function resizeCanvas() { //To resize the canvas on any screen size change
|
|
var height = jQuery(window).height() - 3;
|
|
jQuery('body').css('height',height +"px");
|
|
jQuery('#footer').css("height",(height-195) + "px");
|
|
var width = jQuery(window).width()-3;
|
|
jQuery('body').css('width',width + "px");
|
|
|
|
var imgSrc = seriesUid + "_" + imgInc;
|
|
showImage(imgSrc);
|
|
drawAllShapes();
|
|
}
|
|
|
|
function loadPDF(src) {
|
|
var imgSrc = 'Image.do?serverURL=' + parent.pat.serverURL + '&study=' + getParameter(src,'study') + '&series=' + seriesUid + '&object=' + getParameter(src,'object') + '&rid=' + getParameter(src,'rid');
|
|
var frame = window.parent.getActiveFrame();
|
|
frame.src = imgSrc;
|
|
}
|
|
|
|
function loadSR(src) {
|
|
var imgSrc = 'Image.do?serverURL=' + parent.pat.serverURL + '&study=' + getParameter(src,'study') + '&series=' + seriesUid + '&object=' + getParameter(src,'object');
|
|
imgSrc += '&contentType=text/html';
|
|
var frame = window.parent.getActiveFrame();
|
|
frame.src = imgSrc;
|
|
jQuery(frame).css("background","white");
|
|
}
|
|
|
|
function toggleResolution() {
|
|
if(jQuery('#tool').html()!='measure') {
|
|
var canvas = document.getElementById('imageCanvas');
|
|
var image = getCurrentImage();
|
|
|
|
if(state.scale==1.0) {
|
|
var scaleFac = Math.min(canvas.width/image.naturalWidth, canvas.height/image.naturalHeight);
|
|
state.scale = scaleFac;
|
|
state.translationX = (canvas.width- state.scale * image.naturalWidth)/2;
|
|
state.translationY = (canvas.height- state.scale * image.naturalHeight)/2;
|
|
showImg(null,image);
|
|
} else {
|
|
state.scale = 1.0;
|
|
state.translationX = (canvas.width- state.scale * image.naturalWidth)/2;
|
|
state.translationY = (canvas.height- state.scale * image.naturalHeight)/2;
|
|
showImg(null,image);
|
|
if(jQuery('#tool').html()!="move") {
|
|
activateMove("move");
|
|
}
|
|
}
|
|
jQuery('#zoomPercent').html('Zoom: ' + parseInt(state.scale * 100) + '%');
|
|
drawoutline();
|
|
}
|
|
}
|
|
|
|
String.prototype.replaceAll = function(pcFrom, pcTo){
|
|
var i = this.indexOf(pcFrom);
|
|
var c = this;
|
|
while (i > -1){
|
|
c = c.replace(pcFrom, pcTo);
|
|
i = c.indexOf(pcFrom);
|
|
}
|
|
return c;
|
|
}
|
|
|
|
function parseDicom(imageData,sopUID) {
|
|
var wadoUrl = window.parent.pat.serverURL + "/wado?requestType=WADO&contentType=application/dicom&studyUID=" + window.parent.pat.studyUID + "&seriesUID=" + seriesUid + "&objectUID=" + (imageData!=null ? imageData['SopUID'] : sopUID);
|
|
|
|
var reader = new DicomInputStreamReader();
|
|
|
|
if (!(!(wadoUrl.indexOf('C-GET') >= 0) && !(wadoUrl.indexOf('C-MOVE') >= 0))) {
|
|
var imgSrc = jQuery('#' + (seriesUid + "_" + imgInc).replace(/\./g,'_'), window.parent.document).attr('src');
|
|
/*var urlTmp = "Wado.do?study=" + getParameter(wadoUrl, "studyUID") + "&series=" + getParameter(wadoUrl,"seriesUID")
|
|
+ "&object=" + getParameter(wadoUrl, "objectUID")
|
|
+ "&contentType=application/dicom" + "&retrieveType=" + window.parent.pat.serverURL + "&dicomURL=" + window.parent.pat.dicomURL;*/
|
|
var urlTmp = imgSrc + "&contentType=application/dicom";
|
|
reader.readDicom(urlTmp);
|
|
} else {
|
|
reader.readDicom("DcmStream.do?wadourl="
|
|
+ wadoUrl.replaceAll("&", "_"));
|
|
}
|
|
|
|
var dicomParser = new DicomParser(reader.getInputBuffer(), reader.getReader());
|
|
dicomParser.parseAll();
|
|
imageData = dicomParser.imgData;
|
|
|
|
this.minPix = dicomParser.minPix;
|
|
this.maxPix = dicomParser.maxPix;
|
|
this.pixelBuffer = dicomParser.pixelBuffer;
|
|
this.lookupObj = new LookupTable();
|
|
|
|
lookupObj.setPixelInfo(this.minPix,this.maxPix,imageData['monochrome1']);
|
|
columns = imageData['nativeColumns'];
|
|
return imageData;
|
|
}
|
|
|
|
function renderImg() {
|
|
var canvas = document.getElementById('imageCanvas');
|
|
var ctx = canvas.getContext('2d');
|
|
ctx.save();
|
|
ctx.setTransform(1,0,0,1,0,0);
|
|
ctx.clearRect(0,0,canvas.width,canvas.height);
|
|
|
|
if(state.vflip) {
|
|
ctx.translate(0,canvas.height);
|
|
ctx.scale(1,-1);
|
|
}
|
|
|
|
if(state.hflip) {
|
|
ctx.translate(canvas.width,0);
|
|
ctx.scale(-1,1);
|
|
}
|
|
|
|
if(state.rotate!=0) {
|
|
ctx.translate(canvas.width/2,canvas.height/2);
|
|
ctx.rotate(state.rotate===90 ? Math.PI/2 : state.rotate===180? Math.PI : (Math.PI*3)/2);
|
|
ctx.translate(-canvas.width/2,-canvas.height/2);
|
|
}
|
|
|
|
ctx.translate(state.translationX, state.translationY);
|
|
ctx.scale(state.scale,state.scale);
|
|
|
|
ctx.drawImage(tmpCanvas,0,0);
|
|
ctx.restore();
|
|
}
|
|
|
|
function iterateOverPixels() {
|
|
var canvasIndex = 3, pixelIndex = 0;
|
|
var localData = pixelData.data;
|
|
|
|
lookupObj.calculateLookup();
|
|
var lookupTable=lookupObj.ylookup;
|
|
|
|
while(pixelIndex<numPixels) {
|
|
localData[canvasIndex] = lookupTable[pixelBuffer[pixelIndex++]];
|
|
canvasIndex+=4;
|
|
}
|
|
//tmpCanvas.getContext('2d').putImageData(pixelData,0,0);
|
|
if(state.invert) {
|
|
for (var i = 0; i < pixelData.data.length; i += 4) {
|
|
pixelData.data[i] = pixelData.data[i];
|
|
pixelData.data[i+1] = pixelData.data[i+1];
|
|
pixelData.data[i+2] = pixelData.data[i+2];
|
|
pixelData.data[i+3] = 255 - pixelData.data[i+3];
|
|
}
|
|
tmpCanvas.getContext('2d').putImageData(pixelData,0,0);
|
|
} else {
|
|
tmpCanvas.getContext('2d').putImageData(pixelData,0,0);
|
|
}
|
|
}
|
|
|
|
function doAutoplay(frameTime) {
|
|
if(loopTimer==null) {
|
|
jQuery('#loopSlider',window.parent.document).slider({max:frameTime*2,value: frameTime});
|
|
parent.loopSpeed = frameTime;
|
|
window.parent.document.getElementById('loopChkBox').checked = true;
|
|
doLoop(true);
|
|
}
|
|
}
|
|
|
|
//Preview
|
|
function loadPreview(image) {
|
|
var imageCanvas = document.getElementById("imageCanvas");
|
|
var previewCanvas = document.getElementById("previewCanvas");
|
|
var highlightCanvas = document.getElementById("highlightCanvas");
|
|
navState.width = parseInt(imageCanvas.width*navState.navigationImgFactor);
|
|
navState.height = parseInt(navState.width*image.naturalHeight/image.naturalWidth);
|
|
var scrNavImgWidth = parseInt(imageCanvas.width*navState.screenNavImgFactor);
|
|
navState.scale = scrNavImgWidth/navState.width;
|
|
previewCanvas.width = highlightCanvas.width = getScreenNavImageWidth();
|
|
previewCanvas.height = highlightCanvas.height = getScreenNavImageHeight();
|
|
//context.drawImage(image,0,0,getScreenNavImageWidth(),getScreenNavImageHeight());
|
|
drawPreview(document.getElementById("previewCanvas"), image);
|
|
drawoutline();
|
|
addNavigationListener(highlightCanvas);
|
|
}
|
|
|
|
/**
|
|
* Renders preview image in preview canvase
|
|
* @param canvas Preview canvas
|
|
* @param image Preview image
|
|
*/
|
|
function drawPreview(canvas,image) {
|
|
var context = canvas.getContext('2d');
|
|
context.save();
|
|
context.setTransform(1,0,0,1,0,0);
|
|
context.clearRect(0,0,canvas.width,canvas.height);
|
|
if(state.vflip) {
|
|
context.translate(0,canvas.height);
|
|
context.scale(1,-1);
|
|
}
|
|
if(state.hflip) {
|
|
context.translate(canvas.width,0);
|
|
context.scale(-1,1);
|
|
}
|
|
if(state.rotate!=0) {
|
|
context.translate(canvas.width/2,canvas.height/2);
|
|
context.rotate(state.rotate===90 ? Math.PI/2 : state.rotate===180? Math.PI : (Math.PI*3)/2);
|
|
context.translate(-canvas.width/2,-canvas.height/2);
|
|
}
|
|
context.drawImage(image,0,0,getScreenNavImageWidth(),getScreenNavImageHeight());
|
|
context.restore();
|
|
|
|
if(state.invert) {
|
|
window.parent.doInvert(jQuery('#previewCanvas').get(0),false);
|
|
}
|
|
}
|
|
|
|
function getScreenNavImageWidth() {
|
|
return parseInt(navState.scale*navState.width);
|
|
}
|
|
|
|
function getScreenNavImageHeight() {
|
|
return parseInt(navState.scale*navState.height);
|
|
}
|
|
|
|
function getScreenImageWidth() {
|
|
return parseInt(state.scale*parseInt(jQuery('#imageSize').html().split("x")[0].split(":")[1]));
|
|
}
|
|
|
|
function getScreenImageHeight() {
|
|
return parseInt(state.scale*jQuery('#imageSize').html().split("x")[1]);
|
|
}
|
|
|
|
function addNavigationListener(highlightCanvas) {
|
|
var context = highlightCanvas.getContext('2d');
|
|
var startCoords = [],img = null;
|
|
|
|
jQuery(highlightCanvas).mousedown(function(e) {
|
|
if(e.which==1) {
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
if(e.offsetX>=navState.outline.x && e.offsetX*navState.scale<=navState.outline.x+(navState.outline.w*navState.scale) && e.offsetY>=navState.outline.y && e.offsetY*navState.scale<=navState.outline.y+(navState.outline.h*navState.scale)) {
|
|
navState.drag = true;
|
|
startCoords = [
|
|
e.offsetX - navState.outline.x,
|
|
e.offsetY - navState.outline.y
|
|
];
|
|
jQuery(highlightCanvas).css('cursor','move');
|
|
img = getCurrentImage();
|
|
}
|
|
}
|
|
}).mousemove(function(e1) {
|
|
e1.preventDefault();
|
|
e1.stopPropagation();
|
|
if(navState.drag) {
|
|
var x = e1.offsetX;
|
|
var y = e1.offsetY;
|
|
|
|
navState.outline.x = x-startCoords[0];
|
|
navState.outline.y = y-startCoords[1];
|
|
|
|
context.clearRect(0,0,highlightCanvas.width,highlightCanvas.height);
|
|
context.strokeRect(navState.outline.x,navState.outline.y,navState.outline.w,navState.outline.h);
|
|
|
|
var point = {x:navState.outline.x,y:navState.outline.y};
|
|
var scrImgPoint = navToScaledImgCoords(point);
|
|
state.translationX = -scrImgPoint.x;
|
|
state.translationY = -scrImgPoint.y;
|
|
showImg(null,img,false);
|
|
drawAllShapes();
|
|
}
|
|
}).mouseup(function(e2) {
|
|
e2.preventDefault();
|
|
e2.stopPropagation();
|
|
navState.drag = false;
|
|
jQuery(highlightCanvas).css('cursor','default');
|
|
});
|
|
}
|
|
|
|
function navToScaledImgCoords(point) {
|
|
return {x:point.x * getScreenImageWidth() / getScreenNavImageHeight(),y: point.y * getScreenImageHeight() / getScreenNavImageHeight()};
|
|
}
|
|
|
|
function needPreview(canvasWidth,canvasHeight) {
|
|
return !(state.translationX>=0 && (state.translationX+getScreenImageWidth())<=canvasWidth && state.translationY>=0 && (state.translationY+getScreenImageHeight())<=canvasHeight);
|
|
}
|
|
|
|
function drawoutline() {
|
|
var imageCanvas = document.getElementById("imageCanvas");
|
|
if(needPreview(imageCanvas.width,imageCanvas.height)) {
|
|
var highlightCanvas = document.getElementById('highlightCanvas');
|
|
jQuery('#previewCanvas').show();
|
|
jQuery(highlightCanvas).show();
|
|
var x = -state.translationX * getScreenNavImageWidth()/getScreenImageWidth();
|
|
var y = -state.translationY * getScreenNavImageHeight()/getScreenImageHeight();
|
|
var w = imageCanvas.width * getScreenNavImageWidth()/getScreenImageWidth();
|
|
var h = imageCanvas.height * getScreenNavImageHeight()/getScreenImageHeight();
|
|
if(x<0) {
|
|
x = 0;
|
|
}
|
|
if(y<=0) {
|
|
y =0;
|
|
}
|
|
|
|
if(x+w>highlightCanvas.width) {
|
|
w = highlightCanvas.width-x;
|
|
}
|
|
if(y+h>highlightCanvas.height) {
|
|
h = highlightCanvas.height-y;
|
|
}
|
|
navState.outline = {x:x,y:y,w:w,h:h};
|
|
var context = highlightCanvas.getContext('2d');
|
|
context.clearRect(0,0,highlightCanvas.width,highlightCanvas.height);
|
|
context.strokeStyle="yellow";
|
|
context.strokeRect(x,y,w,h);
|
|
} else {
|
|
jQuery('#previewCanvas').hide();
|
|
jQuery('#highlightCanvas').hide();
|
|
}
|
|
}
|
|
|
|
function loadContextMenu() {
|
|
var queryString = window.location.href;
|
|
var study = getParameter(queryString,'study');
|
|
var data = sessionStorage[study];
|
|
if(data!=undefined) {
|
|
var seriesData = JSON.parse(data);
|
|
var cxtContent = '<ul id="contextmenu1" class="menu"';
|
|
|
|
if(isCompatible()) {
|
|
for(var i=0;i<seriesData.length;i++) {
|
|
var series = seriesData[i];
|
|
// jQuery('#studyDesc').html(series['studyDesc']);
|
|
// jQuery('#studyDate').html(series['studyDate']);
|
|
var seriesDesc = convertSplChars(series['seriesDesc']);
|
|
if(seriesDesc== undefined && seriesDesc==='') {
|
|
seriesDesc = 'UNKNOWN';
|
|
}
|
|
cxtContent+= '<li><a class="cmenuItem" href="#" link="frameContent.html?study=' + study + '&series=' + series['seriesUID'] + '&seriesDesc=' + series['seriesDesc'] + '&images=' + series['totalInstances'] + '&modality='+ series['modality'] + '" onclick="triggerContext(jQuery(this));">' + seriesDesc + ' </a></li>';
|
|
}
|
|
cxtContent+='</ul>';
|
|
} else {
|
|
for(var i=0;i<seriesData.length;i++) {
|
|
var series = seriesData[i];
|
|
// jQuery('#studyDesc').html(series['studyDesc']);
|
|
// jQuery('#studyDate').html(series['studyDate']);
|
|
var seriesDesc = convertSplChars(series['seriesDesc']);
|
|
if(seriesDesc==undefined && seriesDesc==='') {
|
|
seriesDesc = 'UNKNOWN';
|
|
}
|
|
cxtContent +='<li><a href="#" link="frameContent.html?serverURL=';
|
|
cxtContent += getParameter(queryString, 'serverURL');
|
|
cxtContent += '&study=' + study;
|
|
cxtContent += '&series=' + series['seriesUID'];
|
|
cxtContent += '&seriesDesc=' + series['seriesDesc'];
|
|
cxtContent += '&images=' + series['totalInstances'];
|
|
cxtContent += '&modality=' + series['modality'] + '" onclick="triggerContext(jQuery(this));">' + seriesDesc + '</a></li>';
|
|
}
|
|
cxtContent+='</ul>';
|
|
}
|
|
var div = document.createElement("div");
|
|
div.innerHTML = cxtContent;
|
|
document.body.appendChild(div);
|
|
jQuery("#canvasLayer2").contextMenu({menu: 'contextmenu1'});
|
|
} else {
|
|
setTimeout("loadContextMenu", 100);
|
|
}
|
|
}
|
|
|
|
function triggerContext(contextItem) {
|
|
window.location.href = contextItem.attr('link');
|
|
}
|
|
|
|
function getCurrentImage() {
|
|
if(window.parent.pat.serverURL.indexOf('wado')>0 && modifiedWC!=undefined && modifiedWW!=undefined && (modifiedWC!=windowCenter || modifiedWW!=windowWidth)) {
|
|
return jQuery("#wltmpImg").get(0);
|
|
} else {
|
|
var isMultiframe = jQuery('#totalImages').html().indexOf('Frame')>=0;
|
|
var iNo = jQuery('#totalImages').text().split("/")[0].split(":")[1];
|
|
if(!isMultiframe) {
|
|
return jQuery('#' + (seriesUid + "_" + iNo).replace(/\./g,'_'), window.parent.document).get(0);
|
|
} else {
|
|
return jQuery("#" + getParameter(jQuery('#frameSrc').html(),'object').replace(/\./g,'_')+"_"+iNo,window.parent.document).get(0);
|
|
}
|
|
}
|
|
}
|