mirror of
https://github.com/gyurix1968/guacamole-client.git
synced 2025-09-07 21:51:23 +00:00
Finished JSDoc of Layer, more cleanup.
This commit is contained in:
@@ -48,6 +48,9 @@ Guacamole.Layer = function(width, height) {
|
|||||||
* @private
|
* @private
|
||||||
*/
|
*/
|
||||||
var display = document.createElement("canvas");
|
var display = document.createElement("canvas");
|
||||||
|
display.style.position = "absolute";
|
||||||
|
display.style.left = "0px";
|
||||||
|
display.style.top = "0px";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The 2D display context of the canvas element backing this Layer.
|
* The 2D display context of the canvas element backing this Layer.
|
||||||
@@ -55,8 +58,19 @@ Guacamole.Layer = function(width, height) {
|
|||||||
*/
|
*/
|
||||||
var displayContext = display.getContext("2d");
|
var displayContext = display.getContext("2d");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The queue of all pending Tasks. Tasks will be run in order, with new
|
||||||
|
* tasks added at the end of the queue and old tasks removed from the
|
||||||
|
* front of the queue (FIFO).
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
var tasks = new Array();
|
var tasks = new Array();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Map of all Guacamole channel masks to HTML5 canvas composite operation
|
||||||
|
* names. Not all channel mask combinations are currently implemented.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
var compositeOperation = {
|
var compositeOperation = {
|
||||||
/* 0x0 NOT IMPLEMENTED */
|
/* 0x0 NOT IMPLEMENTED */
|
||||||
0x1: "destination-in",
|
0x1: "destination-in",
|
||||||
@@ -76,14 +90,6 @@ Guacamole.Layer = function(width, height) {
|
|||||||
0xF: "lighter"
|
0xF: "lighter"
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the canvas element backing this Layer.
|
|
||||||
* @returns {Element} The canvas element backing this Layer.
|
|
||||||
*/
|
|
||||||
this.getCanvas = function() {
|
|
||||||
return display;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Resizes the canvas element backing this Layer without testing the
|
* Resizes the canvas element backing this Layer without testing the
|
||||||
* new size. This function should only be used internally.
|
* new size. This function should only be used internally.
|
||||||
@@ -93,10 +99,6 @@ Guacamole.Layer = function(width, height) {
|
|||||||
* @param {Number} newHeight The new height to assign to this Layer.
|
* @param {Number} newHeight The new height to assign to this Layer.
|
||||||
*/
|
*/
|
||||||
function resize(newWidth, newHeight) {
|
function resize(newWidth, newHeight) {
|
||||||
display.style.position = "absolute";
|
|
||||||
display.style.left = "0px";
|
|
||||||
display.style.top = "0px";
|
|
||||||
|
|
||||||
display.width = newWidth;
|
display.width = newWidth;
|
||||||
display.height = newHeight;
|
display.height = newHeight;
|
||||||
|
|
||||||
@@ -104,19 +106,6 @@ Guacamole.Layer = function(width, height) {
|
|||||||
height = newHeight;
|
height = newHeight;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Changes the size of this Layer to the given width and height. Resizing
|
|
||||||
* is only attempted if the new size provided is actually different from
|
|
||||||
* the current size.
|
|
||||||
*
|
|
||||||
* @param {Number} newWidth The new width to assign to this Layer.
|
|
||||||
* @param {Number} newHeight The new height to assign to this Layer.
|
|
||||||
*/
|
|
||||||
this.resize = function(newWidth, newHeight) {
|
|
||||||
if (newWidth != width || newHeight != height)
|
|
||||||
resize(newWidth, newHeight);
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Given the X and Y coordinates of the upper-left corner of a rectangle
|
* Given the X and Y coordinates of the upper-left corner of a rectangle
|
||||||
* and the rectangle's width and height, resize the backing canvas element
|
* and the rectangle's width and height, resize the backing canvas element
|
||||||
@@ -159,27 +148,6 @@ Guacamole.Layer = function(width, height) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Set to true if this Layer should resize itself to accomodate the
|
|
||||||
* dimensions of any drawing operation, and false (the default) otherwise.
|
|
||||||
*
|
|
||||||
* Note that setting this property takes effect immediately, and thus may
|
|
||||||
* take effect on operations that were started in the past but have not
|
|
||||||
* yet completed. If you wish the setting of this flag to only modify
|
|
||||||
* future operations, you will need to make the setting of this flag an
|
|
||||||
* operation with sync().
|
|
||||||
*
|
|
||||||
* @example
|
|
||||||
* // Set autosize to true for all future operations
|
|
||||||
* layer.sync(function() {
|
|
||||||
* layer.autosize = true;
|
|
||||||
* });
|
|
||||||
*
|
|
||||||
* @type Boolean
|
|
||||||
* @default false
|
|
||||||
*/
|
|
||||||
this.autosize = false;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A container for an task handler. Each operation which must be ordered
|
* A container for an task handler. Each operation which must be ordered
|
||||||
* is associated with a Task that goes into a task queue. Tasks in this
|
* is associated with a Task that goes into a task queue. Tasks in this
|
||||||
@@ -202,6 +170,17 @@ Guacamole.Layer = function(width, height) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If no tasks are pending or running, run the provided handler immediately,
|
||||||
|
* if any. Otherwise, schedule a task to run immediately after all currently
|
||||||
|
* running or pending tasks are complete.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {function} handler The function to call when possible, if any.
|
||||||
|
* @returns {Task} The Task created and added to the queue for future
|
||||||
|
* running, if any, or null if the handler was run
|
||||||
|
* immediately and no Task needed to be created.
|
||||||
|
*/
|
||||||
function scheduleTask(handler) {
|
function scheduleTask(handler) {
|
||||||
|
|
||||||
// If no pending tasks, just call (if available) and exit
|
// If no pending tasks, just call (if available) and exit
|
||||||
@@ -218,6 +197,11 @@ Guacamole.Layer = function(width, height) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Run any Tasks which were pending but are now ready to run and are not
|
||||||
|
* blocked by other Tasks.
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
function handlePendingTasks() {
|
function handlePendingTasks() {
|
||||||
|
|
||||||
// Draw all pending tasks.
|
// Draw all pending tasks.
|
||||||
@@ -229,6 +213,35 @@ Guacamole.Layer = function(width, height) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set to true if this Layer should resize itself to accomodate the
|
||||||
|
* dimensions of any drawing operation, and false (the default) otherwise.
|
||||||
|
*
|
||||||
|
* Note that setting this property takes effect immediately, and thus may
|
||||||
|
* take effect on operations that were started in the past but have not
|
||||||
|
* yet completed. If you wish the setting of this flag to only modify
|
||||||
|
* future operations, you will need to make the setting of this flag an
|
||||||
|
* operation with sync().
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
* // Set autosize to true for all future operations
|
||||||
|
* layer.sync(function() {
|
||||||
|
* layer.autosize = true;
|
||||||
|
* });
|
||||||
|
*
|
||||||
|
* @type Boolean
|
||||||
|
* @default false
|
||||||
|
*/
|
||||||
|
this.autosize = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the canvas element backing this Layer.
|
||||||
|
* @returns {Element} The canvas element backing this Layer.
|
||||||
|
*/
|
||||||
|
this.getCanvas = function() {
|
||||||
|
return display;
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns whether this Layer is ready. A Layer is ready if it has no
|
* Returns whether this Layer is ready. A Layer is ready if it has no
|
||||||
* pending operations and no operations in-progress.
|
* pending operations and no operations in-progress.
|
||||||
@@ -239,6 +252,21 @@ Guacamole.Layer = function(width, height) {
|
|||||||
return tasks.length == 0;
|
return tasks.length == 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Changes the size of this Layer to the given width and height. Resizing
|
||||||
|
* is only attempted if the new size provided is actually different from
|
||||||
|
* the current size.
|
||||||
|
*
|
||||||
|
* @param {Number} newWidth The new width to assign to this Layer.
|
||||||
|
* @param {Number} newHeight The new height to assign to this Layer.
|
||||||
|
*/
|
||||||
|
this.resize = function(newWidth, newHeight) {
|
||||||
|
scheduleTask(function() {
|
||||||
|
if (newWidth != width || newHeight != height)
|
||||||
|
resize(newWidth, newHeight);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Draws the specified image at the given coordinates. The image specified
|
* Draws the specified image at the given coordinates. The image specified
|
||||||
* must already be loaded.
|
* must already be loaded.
|
||||||
@@ -344,6 +372,16 @@ Guacamole.Layer = function(width, height) {
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clear the specified rectangle of image data.
|
||||||
|
*
|
||||||
|
* @param {Number} x The X coordinate of the upper-left corner of the
|
||||||
|
* rectangle to clear.
|
||||||
|
* @param {Number} y The Y coordinate of the upper-left corner of the
|
||||||
|
* rectangle to clear.
|
||||||
|
* @param {Number} w The width of the rectangle to clear.
|
||||||
|
* @param {Number} h The height of the rectangle to clear.
|
||||||
|
*/
|
||||||
this.clearRect = function(x, y, w, h) {
|
this.clearRect = function(x, y, w, h) {
|
||||||
scheduleTask(function() {
|
scheduleTask(function() {
|
||||||
if (autosize != 0) fitRect(x, y, w, h);
|
if (autosize != 0) fitRect(x, y, w, h);
|
||||||
@@ -351,6 +389,18 @@ Guacamole.Layer = function(width, height) {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides the given filtering function with a writable snapshot of
|
||||||
|
* image data and the current width and height of the Layer.
|
||||||
|
*
|
||||||
|
* @param {function} filter A function which accepts an array of image
|
||||||
|
* data (as returned by the canvas element's
|
||||||
|
* display context's getImageData() function),
|
||||||
|
* the width of the Layer, and the height of the
|
||||||
|
* Layer as parameters, in that order. This
|
||||||
|
* function must accomplish its filtering by
|
||||||
|
* modifying the given image data array directly.
|
||||||
|
*/
|
||||||
this.filter = function(filter) {
|
this.filter = function(filter) {
|
||||||
scheduleTask(function() {
|
scheduleTask(function() {
|
||||||
var imageData = displayContext.getImageData(0, 0, width, height);
|
var imageData = displayContext.getImageData(0, 0, width, height);
|
||||||
@@ -359,6 +409,17 @@ Guacamole.Layer = function(width, height) {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the channel mask for future operations on this Layer. The channel
|
||||||
|
* mask is a Guacamole-specific compositing operation identifier with a
|
||||||
|
* single bit representing each of four channels (in order): source image
|
||||||
|
* where destination transparent, source where destination opaque,
|
||||||
|
* destination where source transparent, and destination where source
|
||||||
|
* opaque.
|
||||||
|
*
|
||||||
|
* @param {Number} mask The channel mask for future operations on this
|
||||||
|
* Layer.
|
||||||
|
*/
|
||||||
this.setChannelMask = function(mask) {
|
this.setChannelMask = function(mask) {
|
||||||
scheduleTask(function() {
|
scheduleTask(function() {
|
||||||
displayContext.globalCompositeOperation = compositeOperation[mask];
|
displayContext.globalCompositeOperation = compositeOperation[mask];
|
||||||
|
Reference in New Issue
Block a user