2010-04-04 21:46:39 +01:00
|
|
|
function debug(str) {
|
|
|
|
cell = $('debug');
|
|
|
|
cell.innerHTML += str + "\n";
|
|
|
|
cell.scrollTop = cell.scrollHeight;
|
|
|
|
}
|
|
|
|
|
|
|
|
function dirObj(obj, parent, depth) {
|
|
|
|
var msg = "";
|
|
|
|
if (! depth) { depth=0; }
|
|
|
|
if (! parent) { parent= ""; }
|
|
|
|
|
|
|
|
// Print the properties of the passed-in object
|
|
|
|
for (var i in obj) {
|
|
|
|
if ((depth < 2) && (typeof obj[i] == "object")) {
|
|
|
|
// Recurse attributes that are objects
|
|
|
|
msg += dirObj(obj[i], parent + "." + i, depth+1);
|
|
|
|
} else {
|
|
|
|
msg += parent + "." + i + ": " + obj[i] + "\n";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return msg;
|
|
|
|
}
|
|
|
|
|
2010-04-04 22:08:55 +01:00
|
|
|
|
|
|
|
Canvas = {
|
|
|
|
|
|
|
|
c_x : 0,
|
|
|
|
c_y : 0,
|
|
|
|
c_wx : 0,
|
|
|
|
c_wy : 0,
|
2010-04-06 05:54:30 +01:00
|
|
|
ctx : null,
|
2010-04-04 22:08:55 +01:00
|
|
|
|
2010-04-06 05:54:30 +01:00
|
|
|
mouseDown: function (e) {
|
2010-04-04 21:46:39 +01:00
|
|
|
evt = e.event || window.event;
|
|
|
|
e.stop();
|
|
|
|
debug('mouse ' + evt.which + '/' + evt.button + ' down:' +
|
2010-04-04 22:08:55 +01:00
|
|
|
(evt.clientX - Canvas.c_x) + "," + (evt.clientY - Canvas.c_y));
|
|
|
|
},
|
2010-04-04 21:46:39 +01:00
|
|
|
|
2010-04-04 22:08:55 +01:00
|
|
|
mouseUp: function (e) {
|
2010-04-04 21:46:39 +01:00
|
|
|
evt = e.event || window.event;
|
|
|
|
e.stop();
|
|
|
|
debug('mouse ' + evt.which + '/' + evt.button + ' up:' +
|
2010-04-04 22:08:55 +01:00
|
|
|
(evt.clientX - Canvas.c_x) + "," + (evt.clientY - Canvas.c_y));
|
|
|
|
},
|
2010-04-04 21:46:39 +01:00
|
|
|
|
2010-04-04 22:08:55 +01:00
|
|
|
keyDown: function (e) {
|
2010-04-04 21:46:39 +01:00
|
|
|
e.stop();
|
|
|
|
debug("keydown: " + e.key + "(" + e.code + ")");
|
2010-04-04 22:08:55 +01:00
|
|
|
},
|
2010-04-04 21:46:39 +01:00
|
|
|
|
2010-04-04 22:08:55 +01:00
|
|
|
keyUp : function (e) {
|
2010-04-04 21:46:39 +01:00
|
|
|
e.stop();
|
|
|
|
debug("keyup: " + e.key + "(" + e.code + ")");
|
2010-04-04 22:08:55 +01:00
|
|
|
},
|
2010-04-04 21:46:39 +01:00
|
|
|
|
2010-04-04 22:08:55 +01:00
|
|
|
ctxDisable: function (e) {
|
2010-04-04 21:46:39 +01:00
|
|
|
evt = e.event || window.event;
|
|
|
|
/* Stop propagation if inside canvas area */
|
2010-04-04 22:08:55 +01:00
|
|
|
if ((evt.clientX >= Canvas.c_x) && (evt.clientX < (Canvas.c_x + Canvas.c_wx)) &&
|
|
|
|
(evt.clientY >= Canvas.c_y) && (evt.clientY < (Canvas.c_y + Canvas.c_wy))) {
|
2010-04-04 21:46:39 +01:00
|
|
|
e.stop();
|
|
|
|
return false;
|
|
|
|
};
|
2010-04-04 22:08:55 +01:00
|
|
|
},
|
2010-04-04 21:46:39 +01:00
|
|
|
|
|
|
|
|
2010-04-06 19:49:49 +01:00
|
|
|
init: function (id, width, height, keyDown, keyUp, mouseDown, mouseUp) {
|
2010-04-04 22:08:55 +01:00
|
|
|
debug(">> init_canvas");
|
2010-04-04 21:46:39 +01:00
|
|
|
|
2010-04-06 19:49:49 +01:00
|
|
|
Canvas.id = id;
|
|
|
|
|
2010-04-06 05:54:30 +01:00
|
|
|
if (! keyDown) keyDown = Canvas.keyDown;
|
|
|
|
if (! keyUp) keyUp = Canvas.keyUp;
|
|
|
|
if (! mouseDown) mouseDown = Canvas.mouseDown;
|
|
|
|
if (! mouseUp) mouseUp = Canvas.mouseUp;
|
|
|
|
|
2010-04-06 19:49:49 +01:00
|
|
|
var c = $(Canvas.id);
|
2010-04-06 05:54:30 +01:00
|
|
|
c.width = width;
|
|
|
|
c.height = height;
|
|
|
|
document.addEvent('keydown', keyDown);
|
|
|
|
document.addEvent('keyup', keyUp);
|
|
|
|
c.addEvent('mousedown', mouseDown);
|
|
|
|
c.addEvent('mouseup', mouseUp);
|
2010-04-04 21:46:39 +01:00
|
|
|
|
|
|
|
/* Work around right and middle click browser behaviors */
|
2010-04-04 22:08:55 +01:00
|
|
|
document.addEvent('click', Canvas.ctxDisable);
|
|
|
|
document.body.addEvent('contextmenu', Canvas.ctxDisable);
|
2010-04-04 21:46:39 +01:00
|
|
|
|
2010-04-04 22:08:55 +01:00
|
|
|
Canvas.c_x = c.getPosition().x;
|
|
|
|
Canvas.c_y = c.getPosition().y;
|
|
|
|
Canvas.c_wx = c.getSize().x;
|
|
|
|
Canvas.c_wy = c.getSize().y;
|
2010-04-04 21:46:39 +01:00
|
|
|
|
|
|
|
if (! c.getContext) return;
|
2010-04-06 05:54:30 +01:00
|
|
|
Canvas.ctx = c.getContext('2d');
|
2010-04-04 21:46:39 +01:00
|
|
|
|
2010-04-06 19:49:49 +01:00
|
|
|
debug("<< init_canvas");
|
|
|
|
},
|
|
|
|
|
|
|
|
clear: function () {
|
|
|
|
Canvas.ctx.clearRect(0, 0, Canvas.c_wx, Canvas.c_wy);
|
|
|
|
var c = $(Canvas.id);
|
|
|
|
c.width = 640;
|
|
|
|
c.height = 100;
|
|
|
|
},
|
|
|
|
|
|
|
|
draw: function () {
|
2010-04-04 21:46:39 +01:00
|
|
|
/* Border */
|
2010-04-06 05:54:30 +01:00
|
|
|
Canvas.ctx.stroke();
|
|
|
|
Canvas.ctx.rect(0, 0, Canvas.c_wx, Canvas.c_wy);
|
|
|
|
Canvas.ctx.stroke();
|
2010-04-04 21:46:39 +01:00
|
|
|
|
|
|
|
/*
|
|
|
|
// Does not work in firefox
|
|
|
|
var himg = new Image();
|
|
|
|
himg.src = "head_ani2.gif"
|
2010-04-06 05:54:30 +01:00
|
|
|
Canvas.ctx.drawImage(himg, 10, 10);
|
2010-04-04 21:46:39 +01:00
|
|
|
*/
|
|
|
|
|
|
|
|
/* Test array image data */
|
2010-04-06 05:54:30 +01:00
|
|
|
var img = Canvas.ctx.createImageData(50, 50);
|
2010-04-04 21:46:39 +01:00
|
|
|
for (y=0; y< 50; y++) {
|
|
|
|
for (x=0; x< 50; x++) {
|
|
|
|
img.data[(y*50 + x)*4 + 0] = 255 - parseInt((255 / 50) * y);
|
|
|
|
img.data[(y*50 + x)*4 + 1] = parseInt((255 / 50) * y);
|
|
|
|
img.data[(y*50 + x)*4 + 2] = parseInt((255 / 50) * x);
|
|
|
|
img.data[(y*50 + x)*4 + 3] = 255;
|
|
|
|
}
|
|
|
|
}
|
2010-04-06 05:54:30 +01:00
|
|
|
Canvas.ctx.putImageData(img, 100, 100);
|
|
|
|
},
|
|
|
|
|
|
|
|
rfbImage: function(x, y, width, height, arr) {
|
|
|
|
var img = Canvas.ctx.createImageData(width, height);
|
|
|
|
for (var i=0; i < (width * height); i++) {
|
2010-04-06 16:35:25 +01:00
|
|
|
img.data[i*4 + 0] = arr[i*4 + 2];
|
2010-04-06 05:54:30 +01:00
|
|
|
img.data[i*4 + 1] = arr[i*4 + 1];
|
2010-04-06 16:35:25 +01:00
|
|
|
img.data[i*4 + 2] = arr[i*4 + 0];
|
2010-04-06 05:54:30 +01:00
|
|
|
img.data[i*4 + 3] = 255; // Set Alpha
|
|
|
|
}
|
|
|
|
Canvas.ctx.putImageData(img, x, y);
|
|
|
|
|
2010-04-04 21:46:39 +01:00
|
|
|
}
|
|
|
|
|
2010-04-04 22:08:55 +01:00
|
|
|
};
|
|
|
|
|