mirror of
https://github.com/novnc/noVNC.git
synced 2026-05-30 17:09:38 +00:00
There is often buffered data ahead of the pixel data so we need to take this in account when making sure pixels are opaque.
67 lines
1.8 KiB
JavaScript
67 lines
1.8 KiB
JavaScript
/*
|
|
* noVNC: HTML5 VNC client
|
|
* Copyright (C) 2019 The noVNC Authors
|
|
* Licensed under MPL 2.0 (see LICENSE.txt)
|
|
*
|
|
* See README.md for usage and integration instructions.
|
|
*
|
|
*/
|
|
|
|
export default class RawDecoder {
|
|
constructor() {
|
|
this._lines = 0;
|
|
}
|
|
|
|
decodeRect(x, y, width, height, sock, display, depth) {
|
|
if ((width === 0) || (height === 0)) {
|
|
return true;
|
|
}
|
|
|
|
if (this._lines === 0) {
|
|
this._lines = height;
|
|
}
|
|
|
|
const pixelSize = depth == 8 ? 1 : 4;
|
|
const bytesPerLine = width * pixelSize;
|
|
|
|
if (sock.rQwait("RAW", bytesPerLine)) {
|
|
return false;
|
|
}
|
|
|
|
const curY = y + (height - this._lines);
|
|
const currHeight = Math.min(this._lines,
|
|
Math.floor(sock.rQlen / bytesPerLine));
|
|
const pixels = width * currHeight;
|
|
|
|
let data = sock.rQ;
|
|
let index = sock.rQi;
|
|
|
|
// Convert data if needed
|
|
if (depth == 8) {
|
|
const newdata = new Uint8Array(pixels * 4);
|
|
for (let i = 0; i < pixels; i++) {
|
|
newdata[i * 4 + 0] = ((data[index + i] >> 0) & 0x3) * 255 / 3;
|
|
newdata[i * 4 + 1] = ((data[index + i] >> 2) & 0x3) * 255 / 3;
|
|
newdata[i * 4 + 2] = ((data[index + i] >> 4) & 0x3) * 255 / 3;
|
|
newdata[i * 4 + 3] = 255;
|
|
}
|
|
data = newdata;
|
|
index = 0;
|
|
}
|
|
|
|
// Max sure the image is fully opaque
|
|
for (let i = 0; i < pixels; i++) {
|
|
data[index + i * 4 + 3] = 255;
|
|
}
|
|
|
|
display.blitImage(x, curY, width, currHeight, data, index);
|
|
sock.rQskipBytes(currHeight * bytesPerLine);
|
|
this._lines -= currHeight;
|
|
if (this._lines > 0) {
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
}
|