This commit is contained in:
2025-02-26 14:49:25 +07:00
commit 1c1d9c4474
6403 changed files with 1953774 additions and 0 deletions

View File

@@ -0,0 +1,214 @@
/**
* Application GUI.
*/
// Default window level presets.
dwv.tool.defaultpresets = {};
// Default window level presets for CT.
dwv.tool.defaultpresets.CT = {
"mediastinum": {"center": 40, "width": 400},
"lung": {"center": -500, "width": 1500},
"bone": {"center": 500, "width": 2000}
};
// decode query
dwv.utils.decodeQuery = dwv.utils.base.decodeQuery;
// Window
dwv.gui.getWindowSize = function () {
return { 'width': ($(window).width()), 'height': ($(window).height() - 147) };
};
// Progress
dwv.gui.displayProgress = dwv.gui.base.displayProgress;
// get element
dwv.gui.getElement = dwv.gui.base.getElement;
// refresh
dwv.gui.refreshElement = function (element) {
if( $(element)[0].nodeName.toLowerCase() === 'select' ) {
$(element).selectmenu('refresh');
}
else {
$(element).enhanceWithin();
}
};
// Slider
dwv.gui.Slider = dwv.gui.base.Slider;
// Tags table
dwv.gui.DicomTags = dwv.gui.base.DicomTags;
// Toolbox
dwv.gui.Toolbox = function (app)
{
this.setup = function (/*list*/)
{
var mainFieldset = document.createElement("fieldset");
mainFieldset.className = "mainfieldset";
mainFieldset.setAttribute("data-role", "controlgroup");
mainFieldset.setAttribute("data-type", "horizontal");
var toolFieldset = document.createElement("fieldset");
toolFieldset.className = "toolfieldset";
toolFieldset.setAttribute("data-role", "controlgroup");
toolFieldset.setAttribute("data-type", "horizontal");
toolFieldset.setAttribute("style", "padding-right:10px;");
mainFieldset.appendChild(toolFieldset);
var node = app.getElement("toolbar");
node.appendChild(mainFieldset);
dwv.gui.refreshElement(node);
};
this.display = function (/*bool*/)
{
// does nothing...
};
this.initialise = function (list)
{
// not wonderful: first one should be scroll...
if ( list[0] === false ) {
var inputScroll = app.getElement("scrollLi");
inputScroll.parentNode.style.display = "none";
inputScroll.checked = false;
var inputZoom = app.getElement("zoomLi");
inputZoom.checked = true;
}
// refresh
$("input[type='radio']").checkboxradio("refresh");
var node = app.getElement("toolfieldset");
dwv.gui.refreshElement(node);
};
};
// Window/level
dwv.gui.WindowLevel = function (app)
{
this.setup = function ()
{
var input = document.createElement("input");
input.id = "wlLi";
input.className = "wlLi";
input.name = "radio-choice";
input.type = "radio";
input.value = "WindowLevel";
input.onclick = app.onChangeTool;
var label = document.createElement("label");
label.setAttribute("for", "wlLi");
var image = document.createElement("img");
image.src = "../../resources/img/contrast-64.png";
image.title = dwv.i18n("tool.WindowLevel.name");
label.appendChild(image);
var node = app.getElement("toolfieldset");
$(node).controlgroup("container").append(input);
$(node).controlgroup("container").append(label);
dwv.gui.refreshElement(node);
};
this.display = function (/*bool*/)
{
// does nothing...
};
this.initialise = function ()
{
// clear previous
$(".presetSelect").remove();
$(".presetLabel").remove();
// create preset select
var select = dwv.html.createHtmlSelect("presetSelect",
app.getViewController().getWindowLevelPresetsNames(), "wl.presets", true);
select.onchange = app.onChangeWindowLevelPreset;
select.title = "Select w/l preset.";
select.setAttribute("data-inline","true");
// label as span (otherwise creates new line)
var span = document.createElement("span");
span.className = "presetLabel";
span.appendChild(document.createTextNode(dwv.i18n("basics.presets") + ": "));
var node = app.getElement("mainfieldset");
node.appendChild(span);
node.appendChild(select);
dwv.gui.refreshElement(node);
};
};
// Zoom
dwv.gui.ZoomAndPan = function (app)
{
this.setup = function ()
{
var input = document.createElement("input");
input.id = "zoomLi";
input.className = "zoomLi";
input.name = "radio-choice";
input.type = "radio";
input.value = "ZoomAndPan";
input.onclick = app.onChangeTool;
var label = document.createElement("label");
label.setAttribute("for", "zoomLi");
var image = document.createElement("img");
image.src = "../../ext/jquery-mobile/images/icons-png/search-white.png";
image.title = dwv.i18n("tool.ZoomAndPan.name");
label.appendChild(image);
var node = app.getElement("toolfieldset");
$(node).controlgroup("container").append(input);
$(node).controlgroup("container").append(label);
dwv.gui.refreshElement(node);
};
this.display = function (/*bool*/)
{
// does nothing...
};
};
// Scroll
dwv.gui.Scroll = function (app)
{
this.setup = function ()
{
var input = document.createElement("input");
input.id = "scrollLi";
input.className = "scrollLi";
input.name = "radio-choice";
input.checked = "checked";
input.type = "radio";
input.value = "Scroll";
input.onclick = app.onChangeTool;
var label = document.createElement("label");
label.setAttribute("for", "scrollLi");
var image = document.createElement("img");
image.src = "../../ext/jquery-mobile/images/icons-png/bars-white.png";
image.title = dwv.i18n("tool.Scroll.name");
label.appendChild(image);
var node = app.getElement("toolfieldset");
$(node).controlgroup("container").append(input);
$(node).controlgroup("container").append(label);
dwv.gui.refreshElement(node);
};
this.display = function (/*bool*/)
{
// does nothing...
};
};
//Reset
dwv.gui.appendResetHtml = function (app)
{
var button = document.createElement("button");
button.className = "resetLi";
button.value = "reset";
button.onclick = app.onDisplayReset;
button.appendChild(document.createTextNode(dwv.i18n("basics.reset")));
button.setAttribute("class","ui-btn ui-btn-inline");
var node = app.getElement("mainfieldset");
node.appendChild(button);
dwv.gui.refreshElement(node);
};

View File

@@ -0,0 +1,51 @@
/**
* Application launcher.
*/
// start app function
function startApp() {
// main application
var myapp = new dwv.App();
// initialise the application
myapp.init({
"containerDivId": "dwv",
"fitToWindow": true,
"gui": ["tool"],
"tools": ["Scroll", "ZoomAndPan", "WindowLevel"],
"isMobile": true
});
dwv.gui.appendResetHtml(myapp);
}
// Image decoders (for web workers)
dwv.image.decoderScripts = {
"jpeg2000": "../../decoders/pdfjs/decode-jpeg2000.js",
"jpeg-lossless": "../../decoders/rii-mango/decode-jpegloss.js",
"jpeg-baseline": "../../decoders/pdfjs/decode-jpegbaseline.js"
};
// status flags
var domContentLoaded = false;
var i18nInitialised = false;
// launch when both DOM and i18n are ready
function launchApp() {
if ( domContentLoaded && i18nInitialised ) {
startApp();
}
}
// i18n ready?
dwv.i18nOnInitialised( function () {
i18nInitialised = true;
launchApp();
});
// check browser support
dwv.browser.check();
// initialise i18n
dwv.i18nInitialise();
// DOM ready?
$(document).ready( function() {
domContentLoaded = true;
launchApp();
});

View File

@@ -0,0 +1,129 @@
<!DOCTYPE html>
<html>
<head>
<title>DICOM Web Viewer</title>
<meta charset="UTF-8">
<meta name="description" content="DICOM Web Viewer (DWV) simple version">
<meta name="keywords" content="DICOM,HTML5,JavaScript,medical,imaging,DWV">
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
<link type="text/css" rel="stylesheet" href="../../css/style.css" />
<link type="text/css" rel="stylesheet" href="../../ext/jquery-mobile/jquery.mobile-1.4.5.min.css" />
<!-- mobile web app -->
<meta name="mobile-web-app-capable" content="yes" />
<link rel="shortcut icon" sizes="16x16" href="../../resources/icons/dwv-16.png" />
<link rel="shortcut icon" sizes="60x60" href="../../resources/icons/dwv-60.png" />
<link rel="shortcut icon" sizes="128x128" href="../../resources/icons/dwv-128.png" />
<!-- apple specific -->
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black" />
<link rel="apple-touch-icon" sizes="16x16" href="../../resources/icons/dwv-16.png" />
<link rel="apple-touch-icon" sizes="60x60" href="../../resources/icons/dwv-60.png" />
<link rel="apple-touch-icon" sizes="128x128" href="../../resources/icons/dwv-128.png" />
<!-- Third party (dwv) -->
<script type="text/javascript" src="../../ext/modernizr/modernizr.js"></script>
<script type="text/javascript" src="../../ext/i18next/i18next.min.js"></script>
<script type="text/javascript" src="../../ext/i18next/i18nextXHRBackend.min.js"></script>
<script type="text/javascript" src="../../ext/i18next/i18nextBrowserLanguageDetector.min.js"></script>
<!-- Third party (viewer) -->
<script type="text/javascript" src="../../ext/jquery/jquery-2.1.4.min.js"></script>
<script type="text/javascript" src="../../ext/jquery-mobile/jquery.mobile-1.4.5.min.js"></script>
<!-- decoders -->
<script type="text/javascript" src="../../decoders/pdfjs/jpx.js"></script>
<script type="text/javascript" src="../../decoders/pdfjs/util.js"></script>
<script type="text/javascript" src="../../decoders/pdfjs/arithmetic_decoder.js"></script>
<script type="text/javascript" src="../../decoders/pdfjs/jpg.js"></script>
<script type="text/javascript" src="../../decoders/rii-mango/lossless-min.js"></script>
<!-- Local -->
<script type="text/javascript" src="../../src/app/application.js"></script>
<script type="text/javascript" src="../../src/app/drawController.js"></script>
<script type="text/javascript" src="../../src/app/infoController.js"></script>
<script type="text/javascript" src="../../src/app/toolboxController.js"></script>
<script type="text/javascript" src="../../src/app/viewController.js"></script>
<script type="text/javascript" src="../../src/dicom/dicomParser.js"></script>
<script type="text/javascript" src="../../src/dicom/dictionary.js"></script>
<script type="text/javascript" src="../../src/gui/filter.js"></script>
<script type="text/javascript" src="../../src/gui/generic.js"></script>
<script type="text/javascript" src="../../src/gui/help.js"></script>
<script type="text/javascript" src="../../src/gui/html.js"></script>
<script type="text/javascript" src="../../src/gui/info.js"></script>
<script type="text/javascript" src="../../src/gui/layer.js"></script>
<script type="text/javascript" src="../../src/gui/loader.js"></script>
<script type="text/javascript" src="../../src/gui/style.js"></script>
<script type="text/javascript" src="../../src/gui/tools.js"></script>
<script type="text/javascript" src="../../src/gui/undo.js"></script>
<script type="text/javascript" src="../../src/image/decoder.js"></script>
<script type="text/javascript" src="../../src/image/dicomBufferToView.js"></script>
<script type="text/javascript" src="../../src/image/domReader.js"></script>
<script type="text/javascript" src="../../src/image/filter.js"></script>
<script type="text/javascript" src="../../src/image/geometry.js"></script>
<script type="text/javascript" src="../../src/image/image.js"></script>
<script type="text/javascript" src="../../src/image/luts.js"></script>
<script type="text/javascript" src="../../src/image/view.js"></script>
<script type="text/javascript" src="../../src/io/filesLoader.js"></script>
<script type="text/javascript" src="../../src/io/urlsLoader.js"></script>
<script type="text/javascript" src="../../src/io/memoryLoader.js"></script>
<script type="text/javascript" src="../../src/io/dicomDataLoader.js"></script>
<script type="text/javascript" src="../../src/io/jsonTextLoader.js"></script>
<script type="text/javascript" src="../../src/io/rawImageLoader.js"></script>
<script type="text/javascript" src="../../src/io/rawVideoLoader.js"></script>
<script type="text/javascript" src="../../src/math/matrix.js"></script>
<script type="text/javascript" src="../../src/math/bucketQueue.js"></script>
<script type="text/javascript" src="../../src/math/point.js"></script>
<script type="text/javascript" src="../../src/math/scissors.js"></script>
<script type="text/javascript" src="../../src/math/shapes.js"></script>
<script type="text/javascript" src="../../src/math/stats.js"></script>
<script type="text/javascript" src="../../src/math/vector.js"></script>
<script type="text/javascript" src="../../src/tools/draw.js"></script>
<script type="text/javascript" src="../../src/tools/drawCommands.js"></script>
<script type="text/javascript" src="../../src/tools/ellipse.js"></script>
<script type="text/javascript" src="../../src/tools/filter.js"></script>
<script type="text/javascript" src="../../src/tools/livewire.js"></script>
<script type="text/javascript" src="../../src/tools/rectangle.js"></script>
<script type="text/javascript" src="../../src/tools/roi.js"></script>
<script type="text/javascript" src="../../src/tools/ruler.js"></script>
<script type="text/javascript" src="../../src/tools/scroll.js"></script>
<script type="text/javascript" src="../../src/tools/toolbox.js"></script>
<script type="text/javascript" src="../../src/tools/undo.js"></script>
<script type="text/javascript" src="../../src/tools/windowLevel.js"></script>
<script type="text/javascript" src="../../src/tools/zoomPan.js"></script>
<script type="text/javascript" src="../../src/utils/browser.js"></script>
<script type="text/javascript" src="../../src/utils/i18n.js"></script>
<script type="text/javascript" src="../../src/utils/listen.js"></script>
<script type="text/javascript" src="../../src/utils/progress.js"></script>
<script type="text/javascript" src="../../src/utils/string.js"></script>
<script type="text/javascript" src="../../src/utils/uri.js"></script>
<script type="text/javascript" src="../../src/utils/thread.js"></script>
<!-- Launch the app -->
<script type="text/javascript" src="appgui.js"></script>
<script type="text/javascript" src="applauncher.js"></script>
</head>
<body>
<!-- Main page -->
<div data-role="page" data-theme="b">
<!-- Main content -->
<div data-role="content">
<!-- DWV -->
<div id="dwv">
<!-- Toolbar -->
<div class="toolbar"></div>
<!-- Layer Container -->
<div class="layerContainer">
<canvas class="imageLayer">Only for HTML5 compatible browsers...</canvas>
</div><!-- /layerContainer -->
</div><!-- /dwv -->
</div><!-- /content -->
</div><!-- /page -->
</body>
</html>