Commit 729508a2 authored by Alexander Clouter's avatar Alexander Clouter Committed by Solly Ross

added client side pixel format conversion support

parent 24ed0b45
...@@ -128,6 +128,7 @@ use a WebSockets to TCP socket proxy. There is a python proxy included ...@@ -128,6 +128,7 @@ use a WebSockets to TCP socket proxy. There is a python proxy included
* UI and Icons : Chris Gordon * UI and Icons : Chris Gordon
* Original Logo : Michael Sersen * Original Logo : Michael Sersen
* tight encoding : Michael Tinglof (Mercuri.ca) * tight encoding : Michael Tinglof (Mercuri.ca)
* pixel format conversion : [Alexander Clouter](http://www.digriz.org.uk/)
* Included libraries: * Included libraries:
* web-socket-js : Hiroshi Ichikawa (github.com/gimite/web-socket-js) * web-socket-js : Hiroshi Ichikawa (github.com/gimite/web-socket-js)
......
...@@ -412,19 +412,14 @@ var Display; ...@@ -412,19 +412,14 @@ var Display;
// else: No-op -- already done by setSubTile // else: No-op -- already done by setSubTile
}, },
blitImage: function (x, y, width, height, arr, offset) { blitImage: function (x, y, width, height, arr, offset, isRgb) {
if (this._true_color) { if (this._true_color) {
this._bgrxImageData(x, y, this._viewportLoc.x, this._viewportLoc.y, width, height, arr, offset); if (isRgb) {
} else { this._rgbImageData(x, y, this._viewportLoc.x, this._viewportLoc.y, width, height, arr, offset);
this._cmapImageData(x, y, this._viewportLoc.x, this._viewportLoc.y, width, height, arr, offset); } else {
} this._bgrxImageData(x, y, this._viewportLoc.x, this._viewportLoc.y, width, height, arr, offset);
}, }
blitRgbImage: function (x, y , width, height, arr, offset) {
if (this._true_color) {
this._rgbImageData(x, y, this._viewportLoc.x, this._viewportLoc.y, width, height, arr, offset);
} else { } else {
// probably wrong?
this._cmapImageData(x, y, this._viewportLoc.x, this._viewportLoc.y, width, height, arr, offset); this._cmapImageData(x, y, this._viewportLoc.x, this._viewportLoc.y, width, height, arr, offset);
} }
}, },
...@@ -592,10 +587,7 @@ var Display; ...@@ -592,10 +587,7 @@ var Display;
this.fillRect(a.x, a.y, a.width, a.height, a.color); this.fillRect(a.x, a.y, a.width, a.height, a.color);
break; break;
case 'blit': case 'blit':
this.blitImage(a.x, a.y, a.width, a.height, a.data, 0); this.blitImage(a.x, a.y, a.width, a.height, a.data, 0, a.rgb);
break;
case 'blitRgb':
this.blitRgbImage(a.x, a.y, a.width, a.height, a.data, 0);
break; break;
case 'img': case 'img':
if (a.img.complete) { if (a.img.complete) {
......
This diff is collapsed.
...@@ -88,7 +88,7 @@ var UI; ...@@ -88,7 +88,7 @@ var UI;
UI.initSetting('port', port); UI.initSetting('port', port);
UI.initSetting('password', ''); UI.initSetting('password', '');
UI.initSetting('encrypt', (window.location.protocol === "https:")); UI.initSetting('encrypt', (window.location.protocol === "https:"));
UI.initSetting('true_color', true); UI.initSetting('convertColor', false);
UI.initSetting('cursor', !UI.isTouchDevice); UI.initSetting('cursor', !UI.isTouchDevice);
UI.initSetting('shared', true); UI.initSetting('shared', true);
UI.initSetting('view_only', false); UI.initSetting('view_only', false);
...@@ -418,7 +418,7 @@ var UI; ...@@ -418,7 +418,7 @@ var UI;
UI.closeSettingsMenu(); UI.closeSettingsMenu();
} else { } else {
UI.updateSetting('encrypt'); UI.updateSetting('encrypt');
UI.updateSetting('true_color'); UI.updateSetting('convertColor');
if (UI.rfb.get_display().get_cursor_uri()) { if (UI.rfb.get_display().get_cursor_uri()) {
UI.updateSetting('cursor'); UI.updateSetting('cursor');
} else { } else {
...@@ -473,7 +473,7 @@ var UI; ...@@ -473,7 +473,7 @@ var UI;
settingsApply: function() { settingsApply: function() {
//Util.Debug(">> settingsApply"); //Util.Debug(">> settingsApply");
UI.saveSetting('encrypt'); UI.saveSetting('encrypt');
UI.saveSetting('true_color'); UI.saveSetting('convertColor');
if (UI.rfb.get_display().get_cursor_uri()) { if (UI.rfb.get_display().get_cursor_uri()) {
UI.saveSetting('cursor'); UI.saveSetting('cursor');
} }
...@@ -586,7 +586,7 @@ var UI; ...@@ -586,7 +586,7 @@ var UI;
//Util.Debug(">> updateVisualState"); //Util.Debug(">> updateVisualState");
$D('noVNC_encrypt').disabled = connected; $D('noVNC_encrypt').disabled = connected;
$D('noVNC_true_color').disabled = connected; $D('noVNC_convertColor').disabled = connected;
if (UI.rfb && UI.rfb.get_display() && if (UI.rfb && UI.rfb.get_display() &&
UI.rfb.get_display().get_cursor_uri()) { UI.rfb.get_display().get_cursor_uri()) {
$D('noVNC_cursor').disabled = connected; $D('noVNC_cursor').disabled = connected;
...@@ -673,7 +673,7 @@ var UI; ...@@ -673,7 +673,7 @@ var UI;
} }
UI.rfb.set_encrypt(UI.getSetting('encrypt')); UI.rfb.set_encrypt(UI.getSetting('encrypt'));
UI.rfb.set_true_color(UI.getSetting('true_color')); UI.rfb.set_convertColor(UI.getSetting('convertColor'));
UI.rfb.set_local_cursor(UI.getSetting('cursor')); UI.rfb.set_local_cursor(UI.getSetting('cursor'));
UI.rfb.set_shared(UI.getSetting('shared')); UI.rfb.set_shared(UI.getSetting('shared'));
UI.rfb.set_view_only(UI.getSetting('view_only')); UI.rfb.set_view_only(UI.getSetting('view_only'));
......
...@@ -216,18 +216,18 @@ describe('Display/Canvas Helper', function () { ...@@ -216,18 +216,18 @@ describe('Display/Canvas Helper', function () {
data[i * 4 + 2] = checked_data[i * 4]; data[i * 4 + 2] = checked_data[i * 4];
data[i * 4 + 3] = checked_data[i * 4 + 3]; data[i * 4 + 3] = checked_data[i * 4 + 3];
} }
display.blitImage(0, 0, 4, 4, data, 0); display.blitImage(0, 0, 4, 4, data, 0, false);
expect(display).to.have.displayed(checked_data); expect(display).to.have.displayed(checked_data);
}); });
it('should support drawing RGB blit images with true color via #blitRgbImage', function () { it('should support drawing RGB blit images with true color via #blitImage', function () {
var data = []; var data = [];
for (var i = 0; i < 16; i++) { for (var i = 0; i < 16; i++) {
data[i * 3] = checked_data[i * 4]; data[i * 3] = checked_data[i * 4];
data[i * 3 + 1] = checked_data[i * 4 + 1]; data[i * 3 + 1] = checked_data[i * 4 + 1];
data[i * 3 + 2] = checked_data[i * 4 + 2]; data[i * 3 + 2] = checked_data[i * 4 + 2];
} }
display.blitRgbImage(0, 0, 4, 4, data, 0); display.blitImage(0, 0, 4, 4, data, 0, true);
expect(display).to.have.displayed(checked_data); expect(display).to.have.displayed(checked_data);
}); });
...@@ -315,18 +315,18 @@ describe('Display/Canvas Helper', function () { ...@@ -315,18 +315,18 @@ describe('Display/Canvas Helper', function () {
expect(display.fillRect).to.have.been.calledOnce; expect(display.fillRect).to.have.been.calledOnce;
}); });
it('should draw a blit image on type "blit"', function () { it('should draw a blit image on type "blit" with "rgb" set to false', function () {
display.blitImage = sinon.spy(); display.blitImage = sinon.spy();
display.renderQ_push({ type: 'blit', x: 3, y: 4, width: 5, height: 6, data: [7, 8, 9] }); display.renderQ_push({ type: 'blit', x: 3, y: 4, width: 5, height: 6, data: [7, 8, 9], rgb: false });
expect(display.blitImage).to.have.been.calledOnce; expect(display.blitImage).to.have.been.calledOnce;
expect(display.blitImage).to.have.been.calledWith(3, 4, 5, 6, [7, 8, 9], 0); expect(display.blitImage).to.have.been.calledWith(3, 4, 5, 6, [7, 8, 9], 0, false);
}); });
it('should draw a blit RGB image on type "blitRgb"', function () { it('should draw a blit RGB image on type "blit" with "rgb" set to true', function () {
display.blitRgbImage = sinon.spy(); display.blitImage = sinon.spy();
display.renderQ_push({ type: 'blitRgb', x: 3, y: 4, width: 5, height: 6, data: [7, 8, 9] }); display.renderQ_push({ type: 'blit', x: 3, y: 4, width: 5, height: 6, data: [7, 8, 9], rgb: true });
expect(display.blitRgbImage).to.have.been.calledOnce; expect(display.blitImage).to.have.been.calledOnce;
expect(display.blitRgbImage).to.have.been.calledWith(3, 4, 5, 6, [7, 8, 9], 0); expect(display.blitImage).to.have.been.calledWith(3, 4, 5, 6, [7, 8, 9], 0, true);
}); });
it('should copy a region on type "copy"', function () { it('should copy a region on type "copy"', function () {
......
This diff is collapsed.
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
This file is licensed under the 2-Clause BSD license (see LICENSE.txt). This file is licensed under the 2-Clause BSD license (see LICENSE.txt).
Connect parameters are provided in query string: Connect parameters are provided in query string:
http://example.com/?host=HOST&port=PORT&encrypt=1&true_color=1 http://example.com/?host=HOST&port=PORT&encrypt=1&convertColor=1
--> -->
<title>noVNC</title> <title>noVNC</title>
...@@ -154,7 +154,7 @@ ...@@ -154,7 +154,7 @@
<span id="noVNC_settings_menu"> <span id="noVNC_settings_menu">
<ul> <ul>
<li><input id="noVNC_encrypt" type="checkbox"> Encrypt</li> <li><input id="noVNC_encrypt" type="checkbox"> Encrypt</li>
<li><input id="noVNC_true_color" type="checkbox" checked> True Color</li> <li><input id="noVNC_convertColor" type="checkbox" checked> Convert Color</li>
<li><input id="noVNC_cursor" type="checkbox"> Local Cursor</li> <li><input id="noVNC_cursor" type="checkbox"> Local Cursor</li>
<li><input id="noVNC_clip" type="checkbox"> Clip to Window</li> <li><input id="noVNC_clip" type="checkbox"> Clip to Window</li>
<li><input id="noVNC_shared" type="checkbox"> Shared Mode</li> <li><input id="noVNC_shared" type="checkbox"> Shared Mode</li>
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
This file is licensed under the 2-Clause BSD license (see LICENSE.txt). This file is licensed under the 2-Clause BSD license (see LICENSE.txt).
Connect parameters are provided in query string: Connect parameters are provided in query string:
http://example.com/?host=HOST&port=PORT&encrypt=1&true_color=1 http://example.com/?host=HOST&port=PORT&encrypt=1&convertColor=1
--> -->
<title>noVNC</title> <title>noVNC</title>
...@@ -194,7 +194,7 @@ ...@@ -194,7 +194,7 @@
'encrypt': WebUtil.getQueryVar('encrypt', 'encrypt': WebUtil.getQueryVar('encrypt',
(window.location.protocol === "https:")), (window.location.protocol === "https:")),
'repeaterID': WebUtil.getQueryVar('repeaterID', ''), 'repeaterID': WebUtil.getQueryVar('repeaterID', ''),
'true_color': WebUtil.getQueryVar('true_color', true), 'convertColor': WebUtil.getQueryVar('convertColor', true),
'local_cursor': WebUtil.getQueryVar('cursor', true), 'local_cursor': WebUtil.getQueryVar('cursor', true),
'shared': WebUtil.getQueryVar('shared', true), 'shared': WebUtil.getQueryVar('shared', true),
'view_only': WebUtil.getQueryVar('view_only', false), 'view_only': WebUtil.getQueryVar('view_only', false),
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment