in guacamole-common-js/src/main/webapp/modules/Display.js [1771:2057]
Guacamole.Display.VisibleLayer = function(width, height) {
Guacamole.Layer.apply(this, [width, height]);
/**
* Reference to this layer.
*
* @private
* @type {!Guacamole.Display.Layer}
*/
var layer = this;
/**
* Identifier which uniquely identifies this layer. This is COMPLETELY
* UNRELATED to the index of the underlying layer, which is specific
* to the Guacamole protocol, and not relevant at this level.
*
* @private
* @type {!number}
*/
this.__unique_id = Guacamole.Display.VisibleLayer.__next_id++;
/**
* The opacity of the layer container, where 255 is fully opaque and 0 is
* fully transparent.
*
* @type {!number}
*/
this.alpha = 0xFF;
/**
* X coordinate of the upper-left corner of this layer container within
* its parent, in pixels.
*
* @type {!number}
*/
this.x = 0;
/**
* Y coordinate of the upper-left corner of this layer container within
* its parent, in pixels.
*
* @type {!number}
*/
this.y = 0;
/**
* Z stacking order of this layer relative to other sibling layers.
*
* @type {!number}
*/
this.z = 0;
/**
* The affine transformation applied to this layer container. Each element
* corresponds to a value from the transformation matrix, with the first
* three values being the first row, and the last three values being the
* second row. There are six values total.
*
* @type {!number[]}
*/
this.matrix = [1, 0, 0, 1, 0, 0];
/**
* The parent layer container of this layer, if any.
* @type {Guacamole.Display.VisibleLayer}
*/
this.parent = null;
/**
* Set of all children of this layer, indexed by layer index. This object
* will have one property per child.
*
* @type {!Object.<number, Guacamole.Display.VisibleLayer>}
*/
this.children = {};
// Set layer position
var canvas = layer.getCanvas();
canvas.style.position = "absolute";
canvas.style.left = "0px";
canvas.style.top = "0px";
// Create div with given size
var div = document.createElement("div");
div.appendChild(canvas);
div.style.width = width + "px";
div.style.height = height + "px";
div.style.position = "absolute";
div.style.left = "0px";
div.style.top = "0px";
div.style.overflow = "hidden";
/**
* Superclass resize() function.
* @private
*/
var __super_resize = this.resize;
this.resize = function(width, height) {
// Resize containing div
div.style.width = width + "px";
div.style.height = height + "px";
__super_resize(width, height);
};
/**
* Returns the element containing the canvas and any other elements
* associated with this layer.
*
* @returns {!Element}
* The element containing this layer's canvas.
*/
this.getElement = function() {
return div;
};
/**
* The translation component of this layer's transform.
*
* @private
* @type {!string}
*/
var translate = "translate(0px, 0px)"; // (0, 0)
/**
* The arbitrary matrix component of this layer's transform.
*
* @private
* @type {!string}
*/
var matrix = "matrix(1, 0, 0, 1, 0, 0)"; // Identity
/**
* Moves the upper-left corner of this layer to the given X and Y
* coordinate.
*
* @param {!number} x
* The X coordinate to move to.
*
* @param {!number} y
* The Y coordinate to move to.
*/
this.translate = function(x, y) {
layer.x = x;
layer.y = y;
// Generate translation
translate = "translate("
+ x + "px,"
+ y + "px)";
// Set layer transform
div.style.transform =
div.style.WebkitTransform =
div.style.MozTransform =
div.style.OTransform =
div.style.msTransform =
translate + " " + matrix;
};
/**
* Moves the upper-left corner of this VisibleLayer to the given X and Y
* coordinate, sets the Z stacking order, and reparents this VisibleLayer
* to the given VisibleLayer.
*
* @param {!Guacamole.Display.VisibleLayer} parent
* The parent to set.
*
* @param {!number} x
* The X coordinate to move to.
*
* @param {!number} y
* The Y coordinate to move to.
*
* @param {!number} z
* The Z coordinate to move to.
*/
this.move = function(parent, x, y, z) {
// Set parent if necessary
if (layer.parent !== parent) {
// Maintain relationship
if (layer.parent)
delete layer.parent.children[layer.__unique_id];
layer.parent = parent;
parent.children[layer.__unique_id] = layer;
// Reparent element
var parent_element = parent.getElement();
parent_element.appendChild(div);
}
// Set location
layer.translate(x, y);
layer.z = z;
div.style.zIndex = z;
};
/**
* Sets the opacity of this layer to the given value, where 255 is fully
* opaque and 0 is fully transparent.
*
* @param {!number} a
* The opacity to set.
*/
this.shade = function(a) {
layer.alpha = a;
div.style.opacity = a/255.0;
};
/**
* Removes this layer container entirely, such that it is no longer
* contained within its parent layer, if any.
*/
this.dispose = function() {
// Remove from parent container
if (layer.parent) {
delete layer.parent.children[layer.__unique_id];
layer.parent = null;
}
// Remove from parent element
if (div.parentNode)
div.parentNode.removeChild(div);
};
/**
* Applies the given affine transform (defined with six values from the
* transform's matrix).
*
* @param {!number} a
* The first value in the affine transform's matrix.
*
* @param {!number} b
* The second value in the affine transform's matrix.
*
* @param {!number} c
* The third value in the affine transform's matrix.
*
* @param {!number} d
* The fourth value in the affine transform's matrix.
*
* @param {!number} e
* The fifth value in the affine transform's matrix.
*
* @param {!number} f
* The sixth value in the affine transform's matrix.
*/
this.distort = function(a, b, c, d, e, f) {
// Store matrix
layer.matrix = [a, b, c, d, e, f];
// Generate matrix transformation
matrix =
/* a c e
* b d f
* 0 0 1
*/
"matrix(" + a + "," + b + "," + c + "," + d + "," + e + "," + f + ")";
// Set layer transform
div.style.transform =
div.style.WebkitTransform =
div.style.MozTransform =
div.style.OTransform =
div.style.msTransform =
translate + " " + matrix;
};
};