1 
  2 /**
  3  * @class Drawable是可绘制图像的包装。
  4  * @param {Object} properties 创建对象的属性参数。可包含此类所有可写属性。
  5  * @module hilo/view/Drawable
  6  * @requires hilo/core/Hilo
  7  * @requires hilo/core/Class
  8  * @property {Object} image 要绘制的图像。即可被CanvasRenderingContext2D.drawImage使用的对象类型,可以是HTMLImageElement、HTMLCanvasElement、HTMLVideoElement等对象。
  9  * @property {array} rect 要绘制的图像的矩形区域。
 10  */
 11 var Drawable = Class.create(/** @lends Drawable.prototype */{
 12     constructor: function Drawable(properties){
 13         this.init(properties);
 14     },
 15 
 16     image: null,
 17     rect: null,
 18 
 19     /**
 20      * 初始化可绘制对象。
 21      * @param {Object} properties 要初始化的属性。
 22      */
 23     init: function(properties){
 24         var me = this, oldImage = me.image;
 25         if(Drawable.isDrawable(properties)){
 26             me.image = properties;
 27         }else{
 28             Hilo.copy(me, properties, true);
 29         }
 30 
 31         var image = me.image;
 32         if(typeof image === 'string'){
 33             if(oldImage && image === oldImage.getAttribute('src')){
 34                 image = me.image = oldImage;
 35             }else{
 36                 me.image = null;
 37                 //load image dynamically
 38                 var img = new Image();
 39                 img.onload = function(){
 40                     img.onload = null;
 41                     me.init(img);
 42                 };
 43                 img.src = image;
 44                 return;
 45             }
 46         }
 47 
 48         if(image && !me.rect) me.rect = [0, 0, image.width, image.height];
 49     },
 50 
 51     Statics: /** @lends Drawable */{
 52         /**
 53          * 判断参数elem指定的元素是否可包装成Drawable对象。
 54          * @param {Object} elem 要测试的对象。
 55          * @return {Boolean} 如果是可包装成Drawable对象则返回true,否则为false。
 56          */
 57         isDrawable: function(elem){
 58             return (elem instanceof HTMLImageElement) || 
 59                    (elem instanceof HTMLCanvasElement) ||
 60                    (elem instanceof HTMLVideoElement);
 61         }
 62     }
 63 });