| /* |
| * 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[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; |
| } |
| } |