function Renderer(options) {
this.version = options.version || 5, this.canvasId = options.canvasId, this.session = options.session,
this.host = options.host, this.canvas = document.getElementById(this.canvasId),
this.connected = !0;
var ngl, path = window.top === window.self ? "" : "../", me = this;
this.gl = this.context = null;
try {
ngl = this.canvas.getContext("webgl", {
premultipliedAlpha: !1,
alpha: !1,
preserveDrawingBuffer: !0
}), ngl && (ngl.viewport(0, 0, ngl.canvas.width, ngl.canvas.height), this.rc_texture = ngl.createTexture(),
ngl.bindTexture(ngl.TEXTURE_2D, this.rc_texture), ngl.texImage2D(ngl.TEXTURE_2D, 0, ngl.RGBA, 1024, 768, 0, ngl.RGBA, ngl.UNSIGNED_SHORT_5_5_5_1, null),
ngl.texParameteri(ngl.TEXTURE_2D, ngl.TEXTURE_MIN_FILTER, ngl.LINEAR), ngl.texParameteri(ngl.TEXTURE_2D, ngl.TEXTURE_WRAP_S, ngl.CLAMP_TO_EDGE),
ngl.texParameteri(ngl.TEXTURE_2D, ngl.TEXTURE_WRAP_T, ngl.CLAMP_TO_EDGE), this.vertexShader = ngl.createShader(ngl.VERTEX_SHADER),
ngl.shaderSource(this.vertexShader, "\n attribute vec4 vert; /// [ [ 304, 672 ], [320, 672], [304,688], [320,688] ] \n uniform vec4 dimensions; /// [ 0, 0, 1024, 768 ] \n varying vec2 vTexCoord; \n \n // set scaling and translation from (-1,1) clipspace to (0,1) tex coords. \n void main() \n { \n // incoming coordinates are 0-dimensions.x, 0-dimensions.y \n vTexCoord.st = vert.xy / dimensions.zw; // [304/1024, 672/768 ] = [0.296875, 0.875] \n gl_Position.xy = (vTexCoord.st - vec2(0.5)) * vec2(2.0,-2.0); // = [ -0.203125, 0.375] * [2.0, -2.0] = [-0.40625, -0.75] \n gl_Position.zw = vec2(0.0,1.0); \n }\n "),
ngl.compileShader(this.vertexShader), this.textureShader = ngl.createShader(ngl.FRAGMENT_SHADER),
ngl.shaderSource(this.textureShader, "\n varying highp vec2 vTexCoord; \n uniform sampler2D uTexture; \n \n void main() \n { \n gl_FragColor = texture2D(uTexture, vTexCoord); \n } \n "),
ngl.compileShader(this.textureShader), this.renderProgram = ngl.createProgram(),
ngl.attachShader(this.renderProgram, this.textureShader), ngl.attachShader(this.renderProgram, this.vertexShader),
ngl.linkProgram(this.renderProgram), this.vertDataPtr = ngl.getAttribLocation(this.renderProgram, "vert"),
this.sizeBufferPtr = ngl.getUniformLocation(this.renderProgram, "dimensions"), this.rectCoords = ngl.createBuffer(),
ngl.bindBuffer(ngl.ARRAY_BUFFER, this.rectCoords), ngl.bufferData(ngl.ARRAY_BUFFER, new Float32Array([ 1, 1, -1, 1, 1, -1, -1, -1 ]), ngl.DYNAMIC_DRAW),
ngl.useProgram(this.renderProgram), ngl.vertexAttribPointer(this.vertDataPtr, 2, ngl.FLOAT, !1, 0, 0),
ngl.enableVertexAttribArray(this.vertDataPtr), ngl.disable(ngl.DEPTH_TEST), this.gl = ngl,
this.context = this.gl);
} catch (e) {
$.log("getWebGLContext failure: " + e.message);
}
if (this.gl || ($.log("webgl not found, using 2d context."), me.context = this.canvas.getContext("2d", {
preserveDrawingBuffer: !0
})), iLOGlobal.ie || window.navigator.userAgent.indexOf("Edge") >= 0) me.decoder = new PseudoWorker(path + "js/worker_decoder.js"); else try {
me.decoder = new Worker(path + "js/worker_decoder.js");
} catch (e) {
e instanceof SecurityError ? $.log("SecurityError: " + e.message) : e instanceof SyntaxError && $.log("SyntaxError: " + e.message),
me.decoder = new PseudoWorker(path + "js/worker_decoder.js");
}
me._terminate = me.decoder.terminate, me.decoder.terminate = function() {
me.connected = !1, me.keyboard.unbind_all(), me._terminate();
}, this.worker = {
kbd_send: function(kcmd) {
me.decoder.postMessage({
func: "kbd_send",
data: kcmd
});
},
mouse_send: function(mcmd) {
me.decoder.postMessage({
func: "mouse_send",
data: mcmd
});
},
call_func: function(func, data) {
me.decoder.postMessage({
func: func,
data: data
});
},
close: function() {
me.decoder.postMessage({
func: "worker_close",
data: {}
});
}
}, me.decoder.postMessage({
func: "init",
data: {
session: me.session,
openCommand: 0,
host: me.host,
version: me.version,
gl: this.gl ? !0 : !1,
ie: iLOGlobal.ie,
path: path
}
}), me.keyboard = new KeyboardMouse({
canvas: me.canvas,
worker: me.worker
}), me.show_text = function(channel, message) {
this.onstatuschange && this.onstatuschange(message);
}, me.post_code = function(code) {
if (this.onstatuschange) {
var lbl = iLO.translateString("IRC.status.POSTCode"), msg = "" + lbl + ":" + code + "";
code.length > 0 && this.onstatuschange(msg, 0);
}
}, me.refresh = function() {}, me.confirm = function(msgbox) {
iLO.confirm(msgbox, function(bool) {
me.worker.call_func(msgbox.callback, bool);
});
}, me.alert = function(msgbox) {
iLO.alert(msgbox, function(bool) {
me.worker.call_func(msgbox.callback, bool);
});
}, me.toast = function(msgbox) {
showIrcToast(msgbox);
}, me.handle_share = function(user, addr) {
var dlgMsg = iLO.translateString("IRC.message.JoinSharedSession", "User {0} at network address {1} would like to join the multi-user session. Allow this?"), noteMsg = iLO.translateString("IRC.message.FeatureNotSupportedWebIrc", "NOTICE: This feature is not supported with the web-based remote console and the request was automatically denied."), msgBox = {
message: dlgMsg + "
" + noteMsg,
messageInserts: [ {
placeHolder: "{0}",
value: user,
valueKey: ""
}, {
placeHolder: "{1}",
value: addr,
valueKey: ""
} ],
closeOnClick: !1,
stayTime: 10
};
iLO.alert(msgBox);
}, this.ready = function() {
me.keyboard.bind_all(), me.onready && me.onready();
}, this.decoder_callback = function(event) {
var data = event.data;
switch (data.operation) {
case "clear":
me.clear();
break;
case "ready":
me.ready();
break;
case "show_text":
me.show_text(data.channel, data.message);
break;
case "post_code":
me.post_code(data.code);
break;
case "set_size":
me.set_size(data.width, data.height);
break;
case "blit_gl":
me.gl.texSubImage2D(me.gl.TEXTURE_2D, 0, data.x0, data.y0, data.w, data.h, me.gl.RGBA, me.gl.UNSIGNED_SHORT_5_5_5_1, data.data);
break;
case "blit_imagedata":
me.imageData || (me.imageData = me.context.createImageData(data.w, data.h)), me.imageData.data.set(data.data),
me.context.putImageData(me.imageData, data.x0, data.y0);
break;
case "render":
me.render(data.x0, data.y0, data.w, data.h);
break;
case "closed":
me.connected = !1, me.keyboard.unbind_all(), me.onclose && me.onclose();
break;
case "confirm":
me.confirm(data.msgBox);
break;
case "handle_share":
me.handle_share(data.user, data.addr);
break;
case "alert":
me.alert(data.msgBox);
break;
case "toast":
me.toast(data.msgBox);
break;
case "health_change":
me.onhealthchange(data.health_state);
break;
case "power_change":
me.onpowerchange(data.power_state);
break;
case "status_change":
me.onstatuschange(data.status);
break;
case "vm_change":
me.onvmchange(data.vm_state);
break;
case "license":
me.onlicensechange(data.license);
break;
default:
console.log("handle this case in decoder_callback: ", data.operation, data);
}
}, this.decoder.addEventListener("message", this.decoder_callback, !1), this.decoder.addEventListener("error", function(evt) {
console.log("Line #" + evt.lineno + " - " + evt.message + " in " + evt.filename, evt);
}, !1), this.close = function() {
this.worker.close();
}, this.width = 300, this.height = 150, this.render = function(x0, y0, w, h) {
me.gl && (me.gl.bufferSubData(me.gl.ARRAY_BUFFER, 0, new Float32Array([ x0, y0, x0 + w, y0, x0, y0 + h, x0 + w, y0 + h ])),
me.gl.drawArrays(me.gl.TRIANGLE_STRIP, 0, 4));
}, this.blit_gl = function(x0, y0, w, h, data) {
this.gl.texSubImage2D(this.gl.TEXTURE_2D, 0, x0, y0, w, h, this.gl.RGBA, this.gl.UNSIGNED_SHORT_5_5_5_1, data);
}, this.set_size = function(width, height) {
if (this.width !== width || this.height !== height) {
if (this.width = width, this.height = height, this.canvas.setAttribute("width", width),
this.canvas.setAttribute("height", height), this.gl) {
var ngl = this.gl;
ngl.viewport(0, 0, width, height), ngl.uniform4f(me.sizeBufferPtr, 0, 0, width, height),
ngl.texImage2D(ngl.TEXTURE_2D, 0, ngl.RGBA, width, height, 0, ngl.RGBA, ngl.UNSIGNED_SHORT_5_5_5_1, null);
}
this.onsizechange && this.onsizechange(width, height), this.clear();
}
}, me.clear = function() {
me.gl ? (me.gl.clearColor(.5, .5, .5, 1), me.gl.clear(me.gl.COLOR_BUFFER_BIT)) : (me.context.fillStyle = "#000",
me.context.fillRect(0, 0, me.width, me.height));
};
}