Mercurial > hg > orthanc-webviewer
annotate WebApplication/viewer.js @ 243:c654c98ed3e8 OrthancWebViewer-2.3
closing OrthancWebViewer-2.3
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Mon, 25 May 2020 14:08:50 +0200 |
parents | b0910ae2ace5 |
children | 81f16c5667ba |
rev | line source |
---|---|
0 | 1 /** |
2 * Orthanc - A Lightweight, RESTful DICOM Store | |
122 | 3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics |
0 | 4 * Department, University Hospital of Liege, Belgium |
159
5dc54316d68b
shared copyright with osimis
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
126
diff
changeset
|
5 * Copyright (C) 2017 Osimis, Belgium |
0 | 6 * |
7 * This program is free software: you can redistribute it and/or | |
8 * modify it under the terms of the GNU Affero General Public License | |
9 * as published by the Free Software Foundation, either version 3 of | |
10 * the License, or (at your option) any later version. | |
11 * | |
12 * This program is distributed in the hope that it will be useful, but | |
13 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 * Affero General Public License for more details. | |
16 * | |
17 * You should have received a copy of the GNU Affero General Public License | |
18 * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
19 **/ | |
20 | |
21 | |
126
f99adade8b77
Fixed rendering of 16bpp images if values are < 0 or >= 32768
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
22 // Set the default compression |
0 | 23 var compression = 'jpeg95'; |
160 | 24 var isFirst = true; |
126
f99adade8b77
Fixed rendering of 16bpp images if values are < 0 or >= 32768
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
25 //var compression = 'deflate'; |
0 | 26 |
27 | |
28 // Prevent the access to IE | |
29 if(navigator.appVersion.indexOf("MSIE ") != -1) | |
30 { | |
31 alert("Please use Mozilla Firefox or Google Chrome. Microsoft Internet Explorer is not supported."); | |
32 } | |
33 | |
34 | |
35 function ResizeCornerstone() | |
36 { | |
37 $('#dicomImage').height($(window).height() - $('#slider').parent().height()); | |
38 var element = $('#dicomImage').get(0); | |
39 cornerstone.resize(element, true); | |
40 } | |
41 | |
42 | |
43 function SetWindowing(center, width) | |
44 { | |
45 var element = $('#dicomImage').get(0); | |
46 var viewport = cornerstone.getViewport(element); | |
47 viewport.voi.windowCenter = center; | |
48 viewport.voi.windowWidth = width; | |
49 cornerstone.setViewport(element, viewport); | |
50 UpdateViewportInformation(); | |
51 } | |
52 | |
53 | |
54 function SetFullWindowing() | |
55 { | |
56 var element = $('#dicomImage').get(0); | |
57 var viewport = cornerstone.getViewport(element); | |
58 var image = cornerstone.getEnabledElement(element).image; | |
59 | |
60 if (image.color) { | |
61 // Ignore color images | |
62 return; | |
63 } | |
64 | |
65 var minValue = image.minPixelValue; | |
66 var maxValue = image.maxPixelValue; | |
67 if (minValue == undefined || | |
68 maxValue == undefined || | |
69 minValue == maxValue) { | |
70 return; | |
71 } | |
72 | |
73 if (image.slope != undefined && | |
74 image.intercept != undefined) { | |
75 minValue = minValue * image.slope + image.intercept; | |
76 maxValue = maxValue * image.slope + image.intercept; | |
77 } | |
78 | |
79 viewport.voi.windowCenter = (minValue + maxValue) / 2.0; | |
80 viewport.voi.windowWidth = (maxValue - minValue) / 2.0; | |
81 cornerstone.setViewport(element, viewport); | |
82 UpdateViewportInformation(); | |
83 } | |
84 | |
85 | |
86 function SetDefaultWindowing() | |
87 { | |
88 var element = $('#dicomImage').get(0); | |
89 var viewport = cornerstone.getViewport(element); | |
90 var image = cornerstone.getEnabledElement(element).image; | |
91 | |
92 viewport.voi.windowCenter = image.windowCenter; | |
93 viewport.voi.windowWidth = image.windowWidth; | |
94 cornerstone.setViewport(element, viewport); | |
95 UpdateViewportInformation(); | |
96 } | |
97 | |
98 | |
99 function SetBoneWindowing() | |
100 { | |
101 SetWindowing(300, 2000); | |
102 } | |
103 | |
104 | |
105 function SetLungWindowing() | |
106 { | |
107 SetWindowing(-600, 1600); | |
108 } | |
109 | |
110 | |
111 function UpdateViewportInformation() | |
112 { | |
113 var element = $('#dicomImage').get(0); | |
114 var viewport = cornerstone.getViewport(element); | |
115 | |
116 $('#bottomleft').text('WW/WL:' + Math.round(viewport.voi.windowWidth) + '/' + Math.round(viewport.voi.windowCenter)); | |
117 $('#bottomright').text('Zoom: ' + viewport.scale.toFixed(2) + 'x'); | |
118 } | |
119 | |
120 | |
121 function ToggleSeriesInformation() | |
122 { | |
123 $('#topright').toggle(); | |
124 } | |
125 | |
126 | |
127 function ToggleInterpolation() | |
128 { | |
129 var element = $('#dicomImage').get(0); | |
130 var viewport = cornerstone.getViewport(element); | |
131 if (viewport.pixelReplication === true) { | |
132 viewport.pixelReplication = false; | |
133 } else { | |
134 viewport.pixelReplication = true; | |
135 } | |
136 cornerstone.setViewport(element, viewport); | |
137 } | |
138 | |
139 | |
140 function ToggleInversion() | |
141 { | |
142 var element = $('#dicomImage').get(0); | |
143 var viewport = cornerstone.getViewport(element); | |
144 if (viewport.invert === true) { | |
145 viewport.invert = false; | |
146 } else { | |
147 viewport.invert = true; | |
148 } | |
149 cornerstone.setViewport(element, viewport); | |
150 } | |
151 | |
152 | |
153 function DownloadInstance(instance) | |
154 { | |
155 // http://stackoverflow.com/a/3749395/881731 | |
156 var hiddenIFrameID = 'hiddenDownloader', | |
157 iframe = document.getElementById(hiddenIFrameID); | |
158 if (iframe === null) { | |
159 iframe = document.createElement('iframe'); | |
160 iframe.id = hiddenIFrameID; | |
161 iframe.style.display = 'none'; | |
162 document.body.appendChild(iframe); | |
163 } | |
164 iframe.src = '../../instances/' + instance + '/file'; | |
165 } | |
166 | |
167 | |
168 function AdjustZoom() | |
169 { | |
170 var element = $('#dicomImage').get(0); | |
171 cornerstone.fitToWindow(element); | |
172 } | |
173 | |
174 | |
175 function ZoomIn() | |
176 { | |
177 var element = $('#dicomImage').get(0); | |
178 var viewport = cornerstone.getViewport(element); | |
179 viewport.scale /= 0.5; | |
180 cornerstone.setViewport(element, viewport); | |
181 UpdateViewportInformation(); | |
182 } | |
183 | |
184 | |
185 function ZoomOut() | |
186 { | |
187 var element = $('#dicomImage').get(0); | |
188 var viewport = cornerstone.getViewport(element); | |
189 viewport.scale *= 0.5; | |
190 cornerstone.setViewport(element, viewport); | |
191 UpdateViewportInformation(); | |
192 } | |
193 | |
194 | |
195 | |
196 (function (cornerstone) { | |
197 'use strict'; | |
198 | |
199 function PrintRange(pixels) | |
200 { | |
201 var a = Infinity; | |
202 var b = -Infinity; | |
203 | |
204 for (var i = 0, length = pixels.length; i < length; i++) { | |
205 if (pixels[i] < a) | |
206 a = pixels[i]; | |
207 if (pixels[i] > b) | |
208 b = pixels[i]; | |
209 } | |
210 | |
211 console.log(a + ' ' + b); | |
212 } | |
213 | |
214 function ChangeDynamics(pixels, source1, target1, source2, target2) | |
215 { | |
216 var scale = (target2 - target1) / (source2 - source1); | |
217 var offset = (target1) - scale * source1; | |
218 | |
219 for (var i = 0, length = pixels.length; i < length; i++) { | |
220 pixels[i] = scale * pixels[i] + offset; | |
221 } | |
222 } | |
223 | |
224 | |
225 function getPixelDataDeflate(image) { | |
226 // Decompresses the base64 buffer that was compressed with Deflate | |
227 var s = pako.inflate(window.atob(image.Orthanc.PixelData)); | |
228 var pixels = null; | |
229 | |
230 if (image.color) { | |
231 var buf = new ArrayBuffer(s.length / 3 * 4); // RGB32 | |
232 pixels = new Uint8Array(buf); | |
233 var index = 0; | |
234 for (var i = 0, length = s.length; i < length; i += 3) { | |
235 pixels[index++] = s[i]; | |
236 pixels[index++] = s[i + 1]; | |
237 pixels[index++] = s[i + 2]; | |
238 pixels[index++] = 255; // Alpha channel | |
239 } | |
126
f99adade8b77
Fixed rendering of 16bpp images if values are < 0 or >= 32768
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
240 } else{ |
f99adade8b77
Fixed rendering of 16bpp images if values are < 0 or >= 32768
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
241 var buf = new ArrayBuffer(s.length * 2); // uint16_t or int16_t |
f99adade8b77
Fixed rendering of 16bpp images if values are < 0 or >= 32768
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
242 |
f99adade8b77
Fixed rendering of 16bpp images if values are < 0 or >= 32768
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
243 if (image.Orthanc.IsSigned) { |
f99adade8b77
Fixed rendering of 16bpp images if values are < 0 or >= 32768
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
244 pixels = new Int16Array(buf); |
f99adade8b77
Fixed rendering of 16bpp images if values are < 0 or >= 32768
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
245 } else { |
f99adade8b77
Fixed rendering of 16bpp images if values are < 0 or >= 32768
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
246 pixels = new Uint16Array(buf); |
f99adade8b77
Fixed rendering of 16bpp images if values are < 0 or >= 32768
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
247 } |
f99adade8b77
Fixed rendering of 16bpp images if values are < 0 or >= 32768
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
248 |
0 | 249 var index = 0; |
250 for (var i = 0, length = s.length; i < length; i += 2) { | |
251 var lower = s[i]; | |
252 var upper = s[i + 1]; | |
253 pixels[index] = lower + upper * 256; | |
254 index++; | |
255 } | |
256 } | |
257 | |
258 return pixels; | |
259 } | |
260 | |
261 | |
262 // http://stackoverflow.com/a/11058858/881731 | |
263 function str2ab(str) { | |
264 var buf = new ArrayBuffer(str.length); | |
265 var pixels = new Uint8Array(buf); | |
266 for (var i = 0, strLen=str.length; i<strLen; i++) { | |
267 pixels[i] = str.charCodeAt(i); | |
268 } | |
269 return pixels; | |
270 } | |
271 | |
272 function getPixelDataJpeg(image) { | |
273 var jpegReader = new JpegImage(); | |
274 var jpeg = str2ab(window.atob(image.Orthanc.PixelData)); | |
275 jpegReader.parse(jpeg); | |
276 var s = jpegReader.getData(image.width, image.height); | |
277 var pixels = null; | |
278 | |
279 if (image.color) { | |
280 var buf = new ArrayBuffer(s.length / 3 * 4); // RGB32 | |
281 pixels = new Uint8Array(buf); | |
282 var index = 0; | |
283 for (var i = 0, length = s.length; i < length; i += 3) { | |
284 pixels[index++] = s[i]; | |
285 pixels[index++] = s[i + 1]; | |
286 pixels[index++] = s[i + 2]; | |
287 pixels[index++] = 255; // Alpha channel | |
288 } | |
289 } else { | |
126
f99adade8b77
Fixed rendering of 16bpp images if values are < 0 or >= 32768
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
290 var buf = new ArrayBuffer(s.length * 2); // uint16_t or int16_t |
f99adade8b77
Fixed rendering of 16bpp images if values are < 0 or >= 32768
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
291 |
f99adade8b77
Fixed rendering of 16bpp images if values are < 0 or >= 32768
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
292 if (image.Orthanc.IsSigned) { |
f99adade8b77
Fixed rendering of 16bpp images if values are < 0 or >= 32768
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
293 pixels = new Int16Array(buf); |
f99adade8b77
Fixed rendering of 16bpp images if values are < 0 or >= 32768
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
294 } else { |
f99adade8b77
Fixed rendering of 16bpp images if values are < 0 or >= 32768
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
295 pixels = new Uint16Array(buf); |
f99adade8b77
Fixed rendering of 16bpp images if values are < 0 or >= 32768
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
296 } |
f99adade8b77
Fixed rendering of 16bpp images if values are < 0 or >= 32768
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
297 |
0 | 298 var index = 0; |
299 for (var i = 0, length = s.length; i < length; i++) { | |
300 pixels[index] = s[i]; | |
301 index++; | |
302 } | |
303 | |
304 if (image.Orthanc.Stretched) { | |
305 ChangeDynamics(pixels, 0, image.Orthanc.StretchLow, 255, image.Orthanc.StretchHigh); | |
306 } | |
307 } | |
308 | |
309 return pixels; | |
310 } | |
311 | |
312 | |
313 function getOrthancImage(imageId) { | |
314 var result = null; | |
315 | |
316 $.ajax({ | |
317 type: 'GET', | |
318 url: '../instances/' + compression + '-' + imageId, | |
319 dataType: 'json', | |
320 cache: true, | |
321 async: false, | |
322 success: function(image) { | |
323 image.imageId = imageId; | |
324 if (image.color) | |
325 image.render = cornerstone.renderColorImage; | |
326 else | |
327 image.render = cornerstone.renderGrayscaleImage; | |
328 | |
160 | 329 if (isFirst) { |
330 if (image.Orthanc.PhotometricInterpretation == "MONOCHROME1") { | |
331 image.invert = true; | |
332 } else { | |
333 image.invert = false; | |
334 } | |
335 | |
336 isFirst = false; | |
337 } | |
338 | |
0 | 339 image.getPixelData = function() { |
340 if (image.Orthanc.Compression == 'Deflate') | |
341 return getPixelDataDeflate(this); | |
342 | |
343 if (image.Orthanc.Compression == 'Jpeg') | |
344 return getPixelDataJpeg(this); | |
345 | |
346 // Unknown compression | |
347 return null; | |
348 } | |
349 | |
350 result = image; | |
351 }, | |
352 error: function() { | |
104
83d4afba88ff
display error messages
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
99
diff
changeset
|
353 alert('Error: This image is not supported by the Web viewer.'); |
0 | 354 return null; |
355 } | |
356 }); | |
357 | |
358 var deferred = $.Deferred(); | |
359 deferred.resolve(result); | |
360 return deferred; | |
361 } | |
362 | |
363 // register our imageLoader plugin with cornerstone | |
364 cornerstone.registerImageLoader('', getOrthancImage); | |
365 | |
366 }(cornerstone)); | |
367 | |
368 | |
369 $(document).ready(function() { | |
370 $('#open-toolbar').button({ | |
371 icons: { primary: 'ui-icon-custom-orthanc' }, | |
372 text: false | |
373 }); | |
374 | |
2
c919d488471f
throbber to reflect the receiving of instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
375 $('#unstable').tooltip(); |
c919d488471f
throbber to reflect the receiving of instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
376 |
0 | 377 var series = window.url('?series', window.location.search); |
378 if (series == null) | |
379 return; | |
380 | |
381 console.log('Displaying series: ' + series); | |
382 var instances = [ ]; | |
383 | |
384 $.ajax({ | |
385 type: 'GET', | |
386 url: '../series/' + series, | |
387 dataType: 'json', | |
388 cache: false, | |
389 async: false, | |
390 success: function(volume) { | |
99
46ec13a1177c
use of ordered-slices
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
391 if (volume.Slices.length != 0) { |
46ec13a1177c
use of ordered-slices
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
71
diff
changeset
|
392 instances = volume.Slices; |
71
9bb7caee0509
Fix for old versions of jQuery
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
19
diff
changeset
|
393 $('#topright').html(volume.PatientID + '<br/>' + |
9bb7caee0509
Fix for old versions of jQuery
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
19
diff
changeset
|
394 volume.PatientName + '<br/>' + |
9bb7caee0509
Fix for old versions of jQuery
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
19
diff
changeset
|
395 volume.StudyDescription + '<br/>' + |
9bb7caee0509
Fix for old versions of jQuery
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
19
diff
changeset
|
396 volume.SeriesDescription + '<br/>'); |
0 | 397 } |
104
83d4afba88ff
display error messages
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
99
diff
changeset
|
398 }, |
83d4afba88ff
display error messages
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
99
diff
changeset
|
399 failure: function() { |
83d4afba88ff
display error messages
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
99
diff
changeset
|
400 alert('Error: This image is not supported by the Web viewer.'); |
0 | 401 } |
402 }); | |
403 | |
404 if (instances.length == 0) | |
405 { | |
406 console.log('No image in this series'); | |
407 return; | |
408 } | |
409 | |
410 | |
2
c919d488471f
throbber to reflect the receiving of instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
411 $.ajax({ |
c919d488471f
throbber to reflect the receiving of instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
412 type: 'GET', |
19 | 413 url: '../is-stable-series/' + series, |
2
c919d488471f
throbber to reflect the receiving of instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
414 dataType: 'json', |
c919d488471f
throbber to reflect the receiving of instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
415 cache: false, |
c919d488471f
throbber to reflect the receiving of instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
416 async: true, |
19 | 417 success: function(stable) { |
418 if (!stable) { | |
2
c919d488471f
throbber to reflect the receiving of instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
419 $('#unstable').show(); |
c919d488471f
throbber to reflect the receiving of instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
420 } |
c919d488471f
throbber to reflect the receiving of instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
421 } |
c919d488471f
throbber to reflect the receiving of instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
422 }); |
c919d488471f
throbber to reflect the receiving of instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
423 |
c919d488471f
throbber to reflect the receiving of instances
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
424 |
0 | 425 var currentImageIndex = 0; |
426 | |
427 // updates the image display | |
428 function updateTheImage(imageIndex) { | |
429 return cornerstone.loadAndCacheImage(instances[imageIndex]).then(function(image) { | |
430 currentImageIndex = imageIndex; | |
431 var viewport = cornerstone.getViewport(element); | |
432 cornerstone.displayImage(element, image, viewport); | |
433 }); | |
434 } | |
435 | |
436 // image enable the element | |
437 var element = $('#dicomImage').get(0); | |
438 cornerstone.enable(element); | |
439 | |
440 // set event handlers | |
441 /*function onImageRendered(e, eventData) { | |
442 $('#topright').text('Render Time:' + eventData.renderTimeInMs + ' ms'); | |
443 } | |
444 $(element).on('CornerstoneImageRendered', onImageRendered);*/ | |
445 | |
446 // load and display the image | |
447 var imagePromise = updateTheImage(0); | |
448 | |
449 // add handlers for mouse events once the image is loaded. | |
450 imagePromise.then(function() { | |
451 viewport = cornerstone.getViewport(element); | |
452 UpdateViewportInformation(); | |
453 | |
454 // add event handlers to pan image on mouse move | |
455 $('#dicomImage').mousedown(function (e) { | |
456 var lastX = e.pageX; | |
457 var lastY = e.pageY; | |
458 var mouseButton = e.which; | |
459 | |
460 $(toolbar).hide(); | |
461 | |
462 $(document).mousemove(function (e) { | |
463 var deltaX = e.pageX - lastX, | |
464 deltaY = e.pageY - lastY; | |
465 lastX = e.pageX; | |
466 lastY = e.pageY; | |
467 | |
468 if (mouseButton == 1) { | |
469 var viewport = cornerstone.getViewport(element); | |
470 viewport.voi.windowWidth += (deltaX / viewport.scale); | |
471 viewport.voi.windowCenter += (deltaY / viewport.scale); | |
472 cornerstone.setViewport(element, viewport); | |
473 UpdateViewportInformation(); | |
474 } | |
475 else if (mouseButton == 2) { | |
476 var viewport = cornerstone.getViewport(element); | |
477 viewport.translation.x += (deltaX / viewport.scale); | |
478 viewport.translation.y += (deltaY / viewport.scale); | |
479 cornerstone.setViewport(element, viewport); | |
480 } | |
481 else if (mouseButton == 3) { | |
482 var viewport = cornerstone.getViewport(element); | |
483 viewport.scale += (deltaY / 100); | |
484 cornerstone.setViewport(element, viewport); | |
485 UpdateViewportInformation(); | |
486 } | |
487 }); | |
488 | |
489 $(document).mouseup(function (e) { | |
490 $(document).unbind('mousemove'); | |
491 $(document).unbind('mouseup'); | |
492 }); | |
493 }); | |
494 | |
495 $('#dicomImage').on('mousewheel DOMMouseScroll', function (e) { | |
496 // Firefox e.originalEvent.detail > 0 scroll back, < 0 scroll forward | |
497 // chrome/safari e.originalEvent.wheelDelta < 0 scroll back, > 0 scroll forward | |
498 if (e.originalEvent.wheelDelta < 0 || e.originalEvent.detail > 0) { | |
499 currentImageIndex ++; | |
500 if (currentImageIndex >= instances.length) { | |
501 currentImageIndex = instances.length - 1; | |
502 } | |
503 } else { | |
504 currentImageIndex --; | |
505 if (currentImageIndex < 0) { | |
506 currentImageIndex = 0; | |
507 } | |
508 } | |
509 | |
510 updateTheImage(currentImageIndex); | |
511 $('#slider').slider("option", "value", currentImageIndex); | |
512 | |
513 //prevent page fom scrolling | |
514 return false; | |
515 }); | |
516 }); | |
517 | |
518 | |
519 $('#slider').slider({ | |
520 min: 0, | |
521 max: instances.length - 1, | |
522 slide: function(event, ui) { | |
523 updateTheImage(ui.value); | |
524 } | |
525 }); | |
526 | |
527 var toolbar = $.jsPanel({ | |
528 position: { top: 50, left: 10 }, | |
529 size: { width: 155, height: 200 }, | |
530 content: $('#toolbar-content').clone().show(), | |
531 controls: { buttons: 'none' }, | |
532 title: '<a target="_blank" href="http://www.orthanc-server.com/"><img src="images/orthanc-logo.png" /></a>' | |
533 }); | |
534 | |
535 $('#open-toolbar').click(function() { | |
536 toolbar.toggle(); | |
537 }); | |
538 | |
539 $(toolbar).hide(); | |
540 | |
541 $('.toolbar-view', toolbar).buttonset() | |
542 .children().first().button({ | |
543 icons: { primary: 'ui-icon-info' }, | |
544 text: false | |
545 }).click(ToggleSeriesInformation).next().button({ | |
546 icons: { primary: 'ui-icon-custom-inversion' }, | |
547 text: false | |
548 }).click(ToggleInversion).next().button({ | |
549 icons: { primary: 'ui-icon-custom-interpolation' }, | |
550 text: false | |
551 }).click(ToggleInterpolation).next().button({ | |
552 icons: { primary: 'ui-icon-circle-triangle-s' }, | |
553 text: false | |
554 }).click(function() { | |
555 DownloadInstance(instances[currentImageIndex]); | |
556 }); | |
557 | |
558 $('.toolbar-zoom', toolbar).buttonset() | |
559 .children().first().button({ | |
560 icons: { primary: 'ui-icon-image' }, | |
561 text: false | |
562 }).click(AdjustZoom).next().button({ | |
563 icons: { primary: 'ui-icon-zoomin' }, | |
564 text: false | |
565 }).click(ZoomIn).next().button({ | |
566 icons: { primary: 'ui-icon-zoomout' }, | |
567 text: false | |
568 }).click(ZoomOut); | |
569 | |
570 $('.toolbar-windowing', toolbar).buttonset() | |
571 .children().first().button({ | |
572 icons: { primary: 'ui-icon-custom-default' }, | |
573 text: false | |
574 }).click(SetDefaultWindowing).next().button({ | |
575 icons: { primary: 'ui-icon-custom-stretch' }, | |
576 text: false | |
577 }).click(SetFullWindowing).next().button({ | |
578 icons: { primary: 'ui-icon-custom-lung' }, | |
579 text: false | |
580 }).click(SetLungWindowing).next().button({ | |
581 icons: { primary: 'ui-icon-custom-bone' }, | |
582 text: false | |
583 }).click(SetBoneWindowing); | |
584 | |
585 | |
586 function SetCompression(c) | |
587 { | |
588 compression = c; | |
589 cornerstone.imageCache.purgeCache(); | |
590 updateTheImage(currentImageIndex); | |
591 cornerstone.invalidateImageId(instances[currentImageIndex]); | |
592 } | |
593 | |
594 $('.toolbar-quality', toolbar).buttonset() | |
595 .children().first().button({ | |
596 label: 'L' | |
597 }).click(function() { | |
598 SetCompression('jpeg80'); | |
599 }).next().button({ | |
600 label: 'M' | |
601 }).click(function() { | |
602 SetCompression('jpeg95'); | |
603 }).next().button({ | |
604 label: 'H' | |
605 }).click(function() { | |
606 SetCompression('deflate'); | |
607 }); | |
608 | |
609 | |
610 ResizeCornerstone(); | |
611 $(window).resize(function(e) { | |
612 if (!$(e.target).hasClass('jsPanel')) // Ignore toolbar resizing | |
613 { | |
614 ResizeCornerstone(); | |
615 } | |
616 }); | |
617 | |
618 }); |