WIP - lots of fixes

This commit is contained in:
mattmcclaskey 2023-09-13 05:44:54 -04:00
parent 96001175a6
commit 05735088b7
No known key found for this signature in database
2 changed files with 47 additions and 27 deletions

View File

@ -578,11 +578,11 @@ export default class Display {
img.src = "data: " + mime + ";base64," + Base64.encode(arr); img.src = "data: " + mime + ";base64," + Base64.encode(arr);
rect.img = img; rect.img = img;
} else { } else {
rect.type = 'img_array' rect.type = "_img";
} }
if (rect.inSecondary) { if (rect.inSecondary) {
rect.mime = mime; rect.mime = mime;
rect.arr = arr; rect.src = "data: " + mime + ";base64," + Base64.encode(arr);
} }
this._asyncRenderQPush(rect); this._asyncRenderQPush(rect);
@ -706,43 +706,49 @@ export default class Display {
switch (event.data.eventType) { switch (event.data.eventType) {
case 'rect': case 'rect':
let rect = event.data.rect; let rect = event.data.rect;
let pos = rect.screenLocations[event.data.screenLocationIndex]; //overwrite screen locations when received on the secondary display
if (!pos) { rect.screenLocations = [ rect.screenLocations[event.data.screenLocationIndex] ]
console.log('wtf'); rect.screenLocations[0].screenIndex = 0;
} let pos = rect.screenLocations[0];
switch (rect.type) { switch (rect.type) {
case 'copy': case 'copy':
this.copyImage(rect.oldX, rect.oldY, pos.x, pos.y, rect.width, rect.height, rect.frame_id, true); //this.copyImage(rect.oldX, rect.oldY, pos.x, pos.y, rect.width, rect.height, rect.frame_id, true);
console.log(`Copy Rect: src.x: ${rect.oldX}, src.y: ${rect.oldY}, x: ${pos.x}, y: ${pos.y}, w: ${rect.width}, h: ${rect.height}`)
this._asyncRenderQPush(rect);
break; break;
case 'fill': case 'fill':
this.fillRect(pos.x, pos.y, rect.width, rect.height, rect.color, rect.frame_id, true); this._asyncRenderQPush(rect);
//this.fillRect(pos.x, pos.y, rect.width, rect.height, rect.color, rect.frame_id, true);
break; break;
case 'blit': case 'blit':
this.blitImage(pos.x, pos.y, rect.width, rect.height, rect.data, 0, rect.frame_id, true); this._asyncRenderQPush(rect);
//this.blitImage(pos.x, pos.y, rect.width, rect.height, rect.data, 0, rect.frame_id, true);
break; break;
case 'blitQ': case 'blitQ':
this.blitQoi(pos.x, pos.y, rect.width, rect.height, rect.data, 0, rect.frame_id, true); this._asyncRenderQPush(rect);
//this.blitQoi(pos.x, pos.y, rect.width, rect.height, rect.data, 0, rect.frame_id, true);
break; break;
case 'img': case 'img':
case 'img_arr': case '_img':
rect.img = new Image(); rect.img = new Image();
rect.img.src = "data: " + rect.mime + ";base64," + Base64.encode(rect.arr); rect.img.src = rect.src;
if (!rect.img.complete) { rect.type = 'img';
rect.img.addEventListener('load', function (rect) { this._asyncRenderQPush(rect);
this.drawImage(rect.img, pos.x, pos.y, rect.width, rect.height);
}.bind(this, rect));
} else {
this.drawImage(rect.img, pos.x, pos.y, rect.width, rect.height);
}
break; break;
case 'transparent': case 'transparent':
let imageBmpPromise = createImageBitmap(rect.arr); let imageBmpPromise = createImageBitmap(rect.arr);
imageBmpPromise.then(function(rect, img) { imageBmpPromise.then(function(rect, img) {
this.drawImage(img, pos.x, pos.y, rect.width, rect.height); rect.img.complete = true;
}).bind(this, rect); }).bind(this, rect);
this._asyncRenderQPush(rect);
break; break;
} }
break; break;
case 'frameComplete':
this.flip(event.data.frameId, event.data.rectCnt);
break;
} }
} }
} }
@ -783,7 +789,7 @@ export default class Display {
} }
} }
if (this._asyncFrameQueue[frameIx][1] == this._asyncFrameQueue[frameIx][2].length) { if (this._asyncFrameQueue[frameIx][2].length >= this._asyncFrameQueue[frameIx][1]) {
//frame is complete //frame is complete
this._asyncFrameComplete(frameIx); this._asyncFrameComplete(frameIx);
} }
@ -795,6 +801,7 @@ export default class Display {
return; return;
} else if (rect.frame_id > newestFrameID) { } else if (rect.frame_id > newestFrameID) {
//frame is newer than any frame in the queue, drop old frames //frame is newer than any frame in the queue, drop old frames
Log.Warn("Older Rect Dropped");
this._asyncFrameQueue.shift(); this._asyncFrameQueue.shift();
let rect_cnt = ((rect.type == "flip") ? rect.rect_cnt : 0); let rect_cnt = ((rect.type == "flip") ? rect.rect_cnt : 0);
this._asyncFrameQueue.push([ rect.frame_id, rect_cnt, [ rect ], (rect_cnt == 1), 0, 0 ]); this._asyncFrameQueue.push([ rect.frame_id, rect_cnt, [ rect ], (rect_cnt == 1), 0, 0 ]);
@ -861,12 +868,14 @@ export default class Display {
*/ */
_pushAsyncFrame(force=false) { _pushAsyncFrame(force=false) {
if (this._asyncFrameQueue[0][3] || force) { if (this._asyncFrameQueue[0][3] || force) {
let frame = this._asyncFrameQueue.shift()[2]; let frame = this._asyncFrameQueue[0][2];
let frameId = this._asyncFrameQueue.shift()[0];
if (this._asyncFrameQueue.length < this._maxAsyncFrameQueue) { if (this._asyncFrameQueue.length < this._maxAsyncFrameQueue) {
this._asyncFrameQueue.push([ 0, 0, [], false, 0, 0 ]); this._asyncFrameQueue.push([ 0, 0, [], false, 0, 0 ]);
} }
let transparent_rects = []; let transparent_rects = [];
let secondaryScreenRects = 0;
//render the selected frame //render the selected frame
for (let i = 0; i < frame.length; i++) { for (let i = 0; i < frame.length; i++) {
@ -900,7 +909,10 @@ export default class Display {
if (a.img) { if (a.img) {
a.img = null; a.img = null;
} }
this._screens[screenLocation.screenIndex].channel.postMessage({ eventType: 'rect', rect: a, screenLocationIndex: sI }); if (a.type !== 'flip') {
secondaryScreenRects++;
this._screens[screenLocation.screenIndex].channel.postMessage({ eventType: 'rect', rect: a, screenLocationIndex: sI });
}
} }
} }
} }
@ -917,11 +929,18 @@ export default class Display {
this.drawImage(a.img, a.x, a.y, a.width, a.height); this.drawImage(a.img, a.x, a.y, a.width, a.height);
} }
} else { } else {
secondaryScreenRects++;
this._screens[screenLocation.screenIndex].channel.postMessage({ eventType: 'rect', rect: a, screenLocationIndex: sI }); this._screens[screenLocation.screenIndex].channel.postMessage({ eventType: 'rect', rect: a, screenLocationIndex: sI });
} }
} }
} }
if (secondaryScreenRects > 0) {
for (let i = 1; i < this.screens.length; i++) {
this._screens[i].channel.postMessage({ eventType: 'frameComplete', frameId: frameId, rectCnt: secondaryScreenRects });
}
}
this._flipCnt += 1; this._flipCnt += 1;
if (this._flushing) { if (this._flushing) {

View File

@ -1624,8 +1624,6 @@ export default class RFB extends EventTargetMixin {
} }
_handleControlMessage(event) { _handleControlMessage(event) {
console.log(event);
if (this._isPrimaryDisplay) { if (this._isPrimaryDisplay) {
switch (event.data.eventType) { switch (event.data.eventType) {
case 'register': case 'register':
@ -1649,8 +1647,11 @@ export default class RFB extends EventTargetMixin {
_registerSecondaryDisplay() { _registerSecondaryDisplay() {
if (!this._isPrimaryDisplay) { if (!this._isPrimaryDisplay) {
let screen = this._screenSize().screens[0]; //let screen = this._screenSize().screens[0];
this._display.resize(screen.containerWidth, screen.containerWidth); //
let size = this._screenSize();
this._display.resize(size.screens[0].containerWidth, size.screens[0].containerHeight);
this._display.autoscale(size.screens[0].containerWidth, size.screens[0].containerHeight, size.screens[0].scale);
screen = this._screenSize().screens[0]; screen = this._screenSize().screens[0];