Add an option to display images in bgrx mode

This commit is contained in:
DomenGaber 2020-02-04 11:42:40 +01:00
parent eb05b45b70
commit c5513524a5
1 changed files with 39 additions and 1 deletions

View File

@ -72,6 +72,7 @@ export default class Display {
this._scale = 1.0;
this._clipViewport = false;
this._bgrxImgMode = false;
// ===== EVENT HANDLERS =====
@ -102,6 +103,10 @@ export default class Display {
return this._fb_height;
}
set bgrxImgMode(val) {
this._bgrxImgMode = val;
}
// ===== PUBLIC METHODS =====
viewportChangePos(deltaX, deltaY) {
@ -489,6 +494,26 @@ export default class Display {
}
}
blitBgrxImage(x, y, width, height, arr, offset, from_queue) {
if (this._renderQ.length !== 0 && !from_queue) {
// NB(directxman12): it's technically more performant here to use preallocated arrays,
// but it's a lot of extra work for not a lot of payoff -- if we're using the render queue,
// this probably isn't getting called *nearly* as much
const new_arr = new Uint8Array(width * height * 4);
new_arr.set(new Uint8Array(arr.buffer, 0, new_arr.length));
this._renderQ_push({
'type': 'blitBgrx',
'data': new_arr,
'x': x,
'y': y,
'width': width,
'height': height,
});
} else {
this._bgrxImageData(x, y, width, height, arr, offset);
}
}
drawImage(img, x, y) {
this._drawCtx.drawImage(img, x, y);
this._damage(x, y, img.width, img.height);
@ -599,6 +624,15 @@ export default class Display {
this._noVNC_display._scan_renderQ();
}
_get_image_data(image) {
let tmpC = document.createElement('canvas');
let ctx = tmpC.getContext('2d');
tmpC.width = image.width;
tmpC.height = image.height;
ctx.drawImage(image.img, 0, 0, image.width, image.height);
return ctx.getImageData(0, 0, image.width, image.height).data;
}
_scan_renderQ() {
let ready = true;
while (ready && this._renderQ.length > 0) {
@ -631,7 +665,11 @@ export default class Display {
a.width + "x" + a.height + ".");
return;
}
if (this._bgrxImgMode) {
this.blitBgrxImage(a.x, a.y, a.width, a.height, this._get_image_data(a), 0, true)
} else {
this.drawImage(a.img, a.x, a.y);
}
} else {
a.img._noVNC_display = this;
a.img.addEventListener('load', this._resume_renderQ);