Hilo/docs/api-en/code/renderer/DOMRenderer.js
2016-12-14 14:40:55 +08:00

173 lines
5.2 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* Hilo
* Copyright 2015 alibaba.com
* Licensed under the MIT License
*/
/**
* @class DomRenderer The DomRenderer, all the visual object is drawing using dom element.The stage will create different renderer depend on the canvas and renderType properties, developer need not use this class directly.
* @augments Renderer
* @param {Object} properties The properties to create a renderer, contains all writeable props of this class.
* @module hilo/renderer/DOMRenderer
* @requires hilo/core/Class
* @requires hilo/core/Hilo
* @requires hilo/renderer/Renderer
* @requires hilo/view/Drawable
*/
var DOMRenderer = (function(){
return Class.create({
Extends: Renderer,
constructor: function(properties){
DOMRenderer.superclass.constructor.call(this, properties);
},
renderType:'dom',
/**
* @private
* @see Renderer#startDraw
*/
startDraw: function(target){
//prepare drawable
var drawable = (target.drawable = target.drawable || new Drawable());
drawable.domElement = drawable.domElement || createDOMDrawable(target, drawable);
return true;
},
/**
* @private
* @see Renderer#draw
*/
draw: function(target){
var parent = target.parent,
targetElem = target.drawable.domElement,
currentParent = targetElem.parentNode;
if(parent){
var parentElem = parent.drawable.domElement;
if(parentElem != currentParent){
parentElem.appendChild(targetElem);
}
//fix image load bug
if(!target.width && !target.height){
var rect = target.drawable.rect;
if(rect && (rect[2] || rect[3])){
target.width = rect[2];
target.height = rect[3];
}
}
}
else if(target === this.stage && !currentParent){
targetElem.style.overflow = 'hidden';
this.canvas.appendChild(targetElem);
}
},
/**
* @private
* @see Renderer#transform
*/
transform: function(target){
Hilo.setElementStyleByView(target);
if(target === this.stage){
var style = this.canvas.style,
oldScaleX = target._scaleX,
oldScaleY = target._scaleY,
scaleX = target.scaleX,
scaleY = target.scaleY;
if((!oldScaleX && scaleX != 1) || (oldScaleX && oldScaleX != scaleX)){
target._scaleX = scaleX;
style.width = scaleX * target.width + "px";
}
if((!oldScaleY && scaleY != 1) || (oldScaleY && oldScaleY != scaleY)){
target._scaleY = scaleY;
style.height = scaleY * target.height + "px";
}
}
},
/**
* @private
* @see Renderer#remove
*/
remove: function(target){
var drawable = target.drawable;
var elem = drawable && drawable.domElement;
if(elem){
var parentElem = elem.parentNode;
if(parentElem){
parentElem.removeChild(elem);
}
}
},
/**
* @private
* @see Renderer#hide
*/
hide: function(target){
var elem = target.drawable && target.drawable.domElement;
if(elem) elem.style.display = 'none';
},
/**
* @private
* @see Renderer#resize
*/
resize: function(width, height){
var style = this.canvas.style;
style.width = width + 'px';
style.height = height + 'px';
if(style.position != "absolute") {
style.position = "relative";
}
}
});
/**
* Create a dom element, you can set the tagName propertysuch as canvas and div.
* @param {Object} view A visual object.
* @param {Object} imageObj The image object to render, include the image propertiy and other associated properties, such as rect.
* @return {HTMLElement} The created dom element.
* @private
*/
function createDOMDrawable(view, imageObj){
var tag = view.tagName || "div",
img = imageObj.image,
w = view.width || (img && img.width),
h = view.height || (img && img.height),
elem = Hilo.createElement(tag), style = elem.style;
if(view.id) elem.id = view.id;
style.position = "absolute";
style.left = (view.left || 0) + "px";
style.top = (view.top || 0) + "px";
style.width = w + "px";
style.height = h + "px";
if(tag == "canvas"){
elem.width = w;
elem.height = h;
if(img){
var ctx = elem.getContext("2d");
var rect = imageObj.rect || [0, 0, w, h];
ctx.drawImage(img, rect[0], rect[1], rect[2], rect[3],
(view.x || 0), (view.y || 0),
(view.width || rect[2]),
(view.height || rect[3]));
}
}else{
style.opacity = view.alpha != undefined ? view.alpha : 1;
if(view === this.stage || view.clipChildren) style.overflow = "hidden";
if(img && img.src){
style.backgroundImage = "url(" + img.src + ")";
var bgX = view.rectX || 0, bgY = view.rectY || 0;
style.backgroundPosition = (-bgX) + "px " + (-bgY) + "px";
}
}
return elem;
}
})();