forked from cornerstonejs/cornerstone
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathenable.js
92 lines (76 loc) · 2.67 KB
/
enable.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
import { addEnabledElement } from './enabledElements.js';
import resize from './resize.js';
import drawImageSync from './internal/drawImageSync.js';
import requestAnimationFrame from './internal/requestAnimationFrame.js';
import webGL from './webgl/index.js';
import triggerEvent from './triggerEvent.js';
/**
* This module is responsible for enabling an element to display images with cornerstone
*/
function hasImageOrLayers (enabledElement) {
return enabledElement.image !== undefined || enabledElement.layers.length;
}
/**
* Enable an HTML Element for use in Cornerstone
*
* @param {HTMLElement} element An HTML Element enabled for Cornerstone
* @param {Object} options Options for the enabledElement
*
* @return {void}
*/
export default function (element, options) {
if (element === undefined) {
throw new Error('enable: parameter element cannot be undefined');
}
// If this enabled element has the option set for WebGL, we should
// Check if this device actually supports it
if (options && options.renderer && options.renderer.toLowerCase() === 'webgl') {
if (webGL.renderer.isWebGLAvailable()) {
// If WebGL is available on the device, initialize the renderer
// And return the renderCanvas from the WebGL rendering path
webGL.renderer.initRenderer();
options.renderer = 'webgl';
} else {
// If WebGL is not available on this device, we will fall back
// To using the Canvas renderer
console.error('WebGL not available, falling back to Canvas renderer');
delete options.renderer;
}
}
const canvas = document.createElement('canvas');
element.appendChild(canvas);
const enabledElement = {
element,
canvas,
image: undefined, // Will be set once image is loaded
invalid: false, // True if image needs to be drawn, false if not
needsRedraw: true,
options,
layers: [],
data: {},
renderingTools: {}
};
addEnabledElement(enabledElement);
resize(element, true);
/**
* Draw the image immediately
*
* @param {DOMHighResTimeStamp} timestamp The current time for when requestAnimationFrame starts to fire callbacks
* @returns {void}
*/
function draw (timestamp) {
if (enabledElement.canvas === undefined) {
return;
}
const eventDetails = {
enabledElement,
timestamp
};
triggerEvent(enabledElement.element, 'CornerstonePreRender', eventDetails);
if (enabledElement.needsRedraw && hasImageOrLayers(enabledElement)) {
drawImageSync(enabledElement, enabledElement.invalid);
}
requestAnimationFrame(draw);
}
draw();
}