mirror of
https://github.com/konvajs/konva.git
synced 2025-06-28 15:23:44 +08:00
196 lines
6.7 KiB
JavaScript
196 lines
6.7 KiB
JavaScript
(function() {
|
|
Kinetic.Util.addMethods(Kinetic.Layer, {
|
|
_initLayer: function(config) {
|
|
this.nodeType = 'Layer';
|
|
this.createAttrs();
|
|
// call super constructor
|
|
Kinetic.Container.call(this, config);
|
|
|
|
this.canvas = new Kinetic.SceneCanvas();
|
|
this.canvas.getElement().style.position = 'absolute';
|
|
this.hitCanvas = new Kinetic.HitCanvas();
|
|
},
|
|
/**
|
|
* get intersection object that contains shape and pixel data
|
|
* @method
|
|
* @memberof Kinetic.Node.prototype
|
|
*/
|
|
getIntersection: function() {
|
|
var pos = Kinetic.Util._getXY(Array.prototype.slice.call(arguments)),
|
|
p, colorKey, shape;
|
|
|
|
if(this.isVisible() && this.isListening()) {
|
|
p = this.hitCanvas.context.getImageData(pos.x | 0, pos.y | 0, 1, 1).data;
|
|
// this indicates that a hit pixel may have been found
|
|
if(p[3] === 255) {
|
|
colorKey = Kinetic.Util._rgbToHex(p[0], p[1], p[2]);
|
|
shape = Kinetic.Global.shapes[colorKey];
|
|
return {
|
|
shape: shape,
|
|
pixel: p
|
|
};
|
|
}
|
|
// if no shape mapped to that pixel, return pixel array
|
|
else if(p[0] > 0 || p[1] > 0 || p[2] > 0 || p[3] > 0) {
|
|
return {
|
|
pixel: p
|
|
};
|
|
}
|
|
}
|
|
|
|
return null;
|
|
},
|
|
drawScene: function(canvas) {
|
|
var canvas = canvas || this.getCanvas();
|
|
|
|
if(this.getClearBeforeDraw()) {
|
|
canvas.clear();
|
|
}
|
|
|
|
Kinetic.Container.prototype.drawScene.call(this, canvas);
|
|
},
|
|
drawHit: function() {
|
|
var layer = this.getLayer();
|
|
|
|
if(layer && layer.getClearBeforeDraw()) {
|
|
layer.getHitCanvas().clear();
|
|
}
|
|
|
|
Kinetic.Container.prototype.drawHit.call(this);
|
|
},
|
|
/**
|
|
* get layer canvas
|
|
* @method
|
|
* @memberof Kinetic.Node.prototype
|
|
*/
|
|
getCanvas: function() {
|
|
return this.canvas;
|
|
},
|
|
/**
|
|
* get layer hit canvas
|
|
* @method
|
|
* @memberof Kinetic.Node.prototype
|
|
*/
|
|
getHitCanvas: function() {
|
|
return this.hitCanvas;
|
|
},
|
|
/**
|
|
* get layer canvas context
|
|
* @method
|
|
* @memberof Kinetic.Node.prototype
|
|
*/
|
|
getContext: function() {
|
|
return this.getCanvas().getContext();
|
|
},
|
|
/**
|
|
* clear canvas tied to the layer
|
|
* @method
|
|
* @memberof Kinetic.Node.prototype
|
|
*/
|
|
clear: function() {
|
|
this.getCanvas().clear();
|
|
},
|
|
// extenders
|
|
setVisible: function(visible) {
|
|
Kinetic.Node.prototype.setVisible.call(this, visible);
|
|
if(visible) {
|
|
this.getCanvas().element.style.display = 'block';
|
|
this.hitCanvas.element.style.display = 'block';
|
|
}
|
|
else {
|
|
this.getCanvas().element.style.display = 'none';
|
|
this.hitCanvas.element.style.display = 'none';
|
|
}
|
|
},
|
|
setZIndex: function(index) {
|
|
Kinetic.Node.prototype.setZIndex.call(this, index);
|
|
var stage = this.getStage();
|
|
if(stage) {
|
|
stage.content.removeChild(this.getCanvas().element);
|
|
|
|
if(index < stage.getChildren().length - 1) {
|
|
stage.content.insertBefore(this.getCanvas().element, stage.getChildren()[index + 1].getCanvas().element);
|
|
}
|
|
else {
|
|
stage.content.appendChild(this.getCanvas().element);
|
|
}
|
|
}
|
|
},
|
|
moveToTop: function() {
|
|
Kinetic.Node.prototype.moveToTop.call(this);
|
|
var stage = this.getStage();
|
|
if(stage) {
|
|
stage.content.removeChild(this.getCanvas().element);
|
|
stage.content.appendChild(this.getCanvas().element);
|
|
}
|
|
},
|
|
moveUp: function() {
|
|
if(Kinetic.Node.prototype.moveUp.call(this)) {
|
|
var stage = this.getStage();
|
|
if(stage) {
|
|
stage.content.removeChild(this.getCanvas().element);
|
|
|
|
if(this.index < stage.getChildren().length - 1) {
|
|
stage.content.insertBefore(this.getCanvas().element, stage.getChildren()[this.index + 1].getCanvas().element);
|
|
}
|
|
else {
|
|
stage.content.appendChild(this.getCanvas().element);
|
|
}
|
|
}
|
|
}
|
|
},
|
|
moveDown: function() {
|
|
if(Kinetic.Node.prototype.moveDown.call(this)) {
|
|
var stage = this.getStage();
|
|
if(stage) {
|
|
var children = stage.getChildren();
|
|
stage.content.removeChild(this.getCanvas().element);
|
|
stage.content.insertBefore(this.getCanvas().element, children[this.index + 1].getCanvas().element);
|
|
}
|
|
}
|
|
},
|
|
moveToBottom: function() {
|
|
if(Kinetic.Node.prototype.moveToBottom.call(this)) {
|
|
var stage = this.getStage();
|
|
if(stage) {
|
|
var children = stage.getChildren();
|
|
stage.content.removeChild(this.getCanvas().element);
|
|
stage.content.insertBefore(this.getCanvas().element, children[1].getCanvas().element);
|
|
}
|
|
}
|
|
},
|
|
getLayer: function() {
|
|
return this;
|
|
},
|
|
remove: function() {
|
|
var stage = this.getStage(), canvas = this.getCanvas(), element = canvas.element;
|
|
Kinetic.Node.prototype.remove.call(this);
|
|
|
|
if(stage && canvas && Kinetic.Util._isInDocument(element)) {
|
|
stage.content.removeChild(element);
|
|
}
|
|
}
|
|
});
|
|
Kinetic.Util.extend(Kinetic.Layer, Kinetic.Container);
|
|
|
|
// add getters and setters
|
|
Kinetic.Node.addGetterSetter(Kinetic.Layer, 'clearBeforeDraw', true);
|
|
|
|
/**
|
|
* set flag which determines if the layer is cleared or not
|
|
* before drawing
|
|
* @name setClearBeforeDraw
|
|
* @method
|
|
* @memberof Kinetic.Node.prototype
|
|
* @param {Boolean} clearBeforeDraw
|
|
*/
|
|
|
|
/**
|
|
* get flag which determines if the layer is cleared or not
|
|
* before drawing
|
|
* @name getClearBeforeDraw
|
|
* @method
|
|
* @memberof Kinetic.Node.prototype
|
|
*/
|
|
})();
|