mirror of
https://github.com/hiloteam/Hilo.git
synced 2025-12-08 20:35:59 +00:00
173 lines
5.1 KiB
JavaScript
173 lines
5.1 KiB
JavaScript
/**
|
||
* Hilo
|
||
* Copyright 2015 alibaba.com
|
||
* Licensed under the MIT License
|
||
*/
|
||
|
||
/**
|
||
* @class DOM+CSS3渲染器。将可视对象以DOM元素方式渲染出来。舞台Stage会根据参数canvas选择不同的渲染器,开发者无需直接使用此类。
|
||
* @augments Renderer
|
||
* @param {Object} properties 创建对象的属性参数。可包含此类所有可写属性。
|
||
* @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";
|
||
}
|
||
}
|
||
});
|
||
|
||
/**
|
||
* 创建一个可渲染的DOM,可指定tagName,如canvas或div。
|
||
* @param {Object} view 一个可视对象或类似的对象。
|
||
* @param {Object} imageObj 指定渲染的image及相关设置,如绘制区域rect。
|
||
* @return {HTMLElement} 新创建的DOM对象。
|
||
* @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;
|
||
}
|
||
|
||
})();
|