missing rotation in _rgbImageData

This commit is contained in:
Gerrit Brehmer 2019-12-19 15:47:42 +01:00
parent 9c6bad2bc1
commit beff7f4e08
2 changed files with 76 additions and 27 deletions

View File

@ -629,14 +629,63 @@ export default class Display {
_rgbImageData(x, y, width, height, arr, offset) { _rgbImageData(x, y, width, height, arr, offset) {
const img = this._drawCtx.createImageData(width, height); const img = this._drawCtx.createImageData(width, height);
const data = img.data; const data = img.data;
if (this._rotate === 'right') {
let j = offset;
for (let yv = 0; yv < height; yv++) {
for (let xv = 0; xv < width; xv++) {
let doff = ((xv * height) + (width - yv - 1)) * 4;
data[doff] = arr[j];
data[doff + 1] = arr[j + 1];
data[doff + 2] = arr[j + 2];
data[doff + 3] = 255; // Alpha
j += 3;
}
}
} else if (this._rotate === 'left') {
let j = offset;
for (let yv = height - 1; yv >= 0; yv--) {
for (let xv = width - 1; xv >= 0; xv--) {
let doff = ((xv * height) + (width - yv - 1)) * 4; //((height - xv - 1) + (width * yv)) * 4;
data[doff] = arr[j];
data[doff + 1] = arr[j + 1];
data[doff + 2] = arr[j + 2];
data[doff + 3] = 255; // Alpha
j += 3;
}
}
} else if (this._rotate === 'double') {
let length = width * height * 4;
for (let i = 4, j = offset; i <= length; i += 4, j += 3) {
data[length - i] = arr[j];
data[length - i + 1] = arr[j + 1];
data[length - i + 2] = arr[j + 2];
data[length - i + 3] = 255; // Alpha
}
} else {
for (let i = 0, j = offset; i < width * height * 4; i += 4, j += 3) { for (let i = 0, j = offset; i < width * height * 4; i += 4, j += 3) {
data[i] = arr[j]; data[i] = arr[j];
data[i + 1] = arr[j + 1]; data[i + 1] = arr[j + 1];
data[i + 2] = arr[j + 2]; data[i + 2] = arr[j + 2];
data[i + 3] = 255; // Alpha data[i + 3] = 255; // Alpha
} }
this._drawCtx.putImageData(img, x, y); }
this._damage(x, y, img.width, img.height); let x0 = x;
let y0 = y;
if (this._rotate === 'right') {
let a = x0;
x0 = this._fb_width - y0 - 1 - height;
y0 = a;
} else if (this._rotate === 'left') {
let a = y0;
y0 = this._fb_height - x0 - 1 - width;
x0 = a;
} else if (this._rotate === 'double') {
y0 = this._fb_height - y0 - 1 - height;
x0 = this._fb_width - x0 - 1 - width;
}
this._drawCtx.putImageData(img, x0, y0);
this._damage(x0, y0, img.width, img.height);
} }
_bgrxImageData(x, y, width, height, arr, offset) { _bgrxImageData(x, y, width, height, arr, offset) {
@ -644,10 +693,10 @@ export default class Display {
const data = img.data; const data = img.data;
if (this._rotate === 'right') { if (this._rotate === 'right') {
var j = offset; let j = offset;
for (var yv = 0; yv < height; yv++) { for (let yv = 0; yv < height; yv++) {
for (var xv = 0; xv < width; xv++) { for (let xv = 0; xv < width; xv++) {
var doff = ((xv * height) + (width - yv - 1)) * 4; let doff = ((xv * height) + (width - yv - 1)) * 4;
data[doff] = arr[j + 2]; data[doff] = arr[j + 2];
data[doff + 1] = arr[j + 1]; data[doff + 1] = arr[j + 1];
data[doff + 2] = arr[j]; data[doff + 2] = arr[j];
@ -656,10 +705,10 @@ export default class Display {
} }
} }
} else if (this._rotate === 'left') { } else if (this._rotate === 'left') {
var j = offset; let j = offset;
for (var yv = height - 1; yv >= 0; yv--) { for (let yv = height - 1; yv >= 0; yv--) {
for (var xv = width - 1; xv >= 0; xv--) { for (let xv = width - 1; xv >= 0; xv--) {
var doff = ((xv * height) + (width - yv - 1)) * 4; //((height - xv - 1) + (width * yv)) * 4; let doff = ((xv * height) + (width - yv - 1)) * 4; //((height - xv - 1) + (width * yv)) * 4;
data[doff] = arr[j + 2]; data[doff] = arr[j + 2];
data[doff + 1] = arr[j + 1]; data[doff + 1] = arr[j + 1];
data[doff + 2] = arr[j]; data[doff + 2] = arr[j];
@ -668,29 +717,29 @@ export default class Display {
} }
} }
} else if (this._rotate === 'double') { } else if (this._rotate === 'double') {
var length = width * height * 4; let length = width * height * 4;
for (var i = 4, j = offset; i <= length; i += 4, j += 4) { for (let i = 4, j = offset; i <= length; i += 4, j += 4) {
data[length - i] = arr[j + 2]; data[length - i] = arr[j + 2];
data[length - i + 1] = arr[j + 1]; data[length - i + 1] = arr[j + 1];
data[length - i + 2] = arr[j]; data[length - i + 2] = arr[j];
data[length - i + 3] = 255; // Alpha data[length - i + 3] = 255; // Alpha
} }
} else { } else {
for (var i = 0, j = offset; i < width * height * 4; i += 4, j += 4) { for (let i = 0, j = offset; i < width * height * 4; i += 4, j += 4) {
data[i] = arr[j + 2]; data[i] = arr[j + 2];
data[i + 1] = arr[j + 1]; data[i + 1] = arr[j + 1];
data[i + 2] = arr[j]; data[i + 2] = arr[j];
data[i + 3] = 255; // Alpha data[i + 3] = 255; // Alpha
} }
} }
var x0 = x; let x0 = x;
var y0 = y; let y0 = y;
if (this._rotate === 'right') { if (this._rotate === 'right') {
var a = x0; let a = x0;
x0 = this._fb_width - y0 - 1 - height; x0 = this._fb_width - y0 - 1 - height;
y0 = a; y0 = a;
} else if (this._rotate === 'left') { } else if (this._rotate === 'left') {
var a = y0; let a = y0;
y0 = this._fb_height - x0 - 1 - width; y0 = this._fb_height - x0 - 1 - width;
x0 = a; x0 = a;
} else if (this._rotate === 'double') { } else if (this._rotate === 'double') {

View File

@ -1,6 +1,6 @@
{ {
"name": "@gbrehmer/novnc", "name": "@gbrehmer/novnc",
"version": "1.1.0-patch14", "version": "1.1.0-patch15",
"description": "An HTML5 VNC client", "description": "An HTML5 VNC client",
"browser": "lib/rfb", "browser": "lib/rfb",
"directories": { "directories": {