/**
* Hilo
* Copyright 2015 alibaba.com
* Licensed under the MIT License
*/
/**
*
*
* @class BitmapText support bitmap text function ,but only support single-line text
* @augments Container
* @param {Object} properties the options of create Instance.It can contains all writable property
* @module hilo/view/BitmapText
* @requires hilo/core/Class
* @requires hilo/core/Hilo
* @requires hilo/view/Container
* @requires hilo/view/Bitmap
* @property {Object} glyphs font glyph set of bitmap. format:{letter:{image:img, rect:[0,0,100,100]}}
* @property {Number} letterSpacing spacing of letter. default:0
* @property {String} text content of bitmap text. Not writable,set this value by 'setText'
* @property {String} textAlign property values:left、center、right, default:left,Not writable,set this property by 'setTextAlign'
*/
var BitmapText = Class.create(/** @lends BitmapText.prototype */{
Extends: Container,
constructor: function(properties){
properties = properties || {};
this.id = this.id || properties.id || Hilo.getUid('BitmapText');
BitmapText.superclass.constructor.call(this, properties);
var text = properties.text + '';
if(text){
this.text = '';
this.setText(text);
}
this.pointerChildren = false; //disable user events for single letters
},
glyphs: null,
letterSpacing: 0,
text: '',
textAlign:'left',
/**
* set the content of bitmap text
* @param {String} text content
* @returns {BitmapText} BitmapText Instance,support chained calls
*/
setText: function(text){
var me = this, str = text.toString(), len = str.length;
if(me.text == str) return;
me.text = str;
var i, charStr, charGlyph, charObj, width = 0, height = 0, left = 0;
for(i = 0; i < len; i++){
charStr = str.charAt(i);
charGlyph = me.glyphs[charStr];
if(charGlyph){
left = width + (width > 0 ? me.letterSpacing : 0);
if(me.children[i]){
charObj = me.children[i];
charObj.setImage(charGlyph.image, charGlyph.rect);
}
else{
charObj = me._createBitmap(charGlyph);
me.addChild(charObj);
}
charObj.x = left;
width = left + charGlyph.rect[2];
height = Math.max(height, charGlyph.rect[3]);
}
}
for(i = me.children.length - 1;i >= len;i --){
me._releaseBitmap(me.children[i]);
me.children[i].removeFromParent();
}
me.width = width;
me.height = height;
this.setTextAlign();
return me;
},
_createBitmap:function(cfg){
var bmp;
if(BitmapText._pool.length){
bmp = BitmapText._pool.pop();
bmp.setImage(cfg.image, cfg.rect);
}
else{
bmp = new Bitmap({
image:cfg.image,
rect:cfg.rect
});
}
return bmp;
},
_releaseBitmap:function(bmp){
BitmapText._pool.push(bmp);
},
/**
* set the textAlign of text。
* @param textAlign value of textAlign:left、center、right
* @returns {BitmapText} itmapText Instance,support chained calls
*/
setTextAlign:function(textAlign){
this.textAlign = textAlign||this.textAlign;
switch(this.textAlign){
case "center":
this.pivotX = this.width * .5;
break;
case "right":
this.pivotX = this.width;
break;
case "left":
/* falls through */
default:
this.pivotX = 0;
break;
}
return this;
},
/**
* detect whether can display the string by the currently assigned font provided
* @param {String} str to detect string
* @returns {Boolean} whether can display the string
*/
hasGlyphs: function(str){
var glyphs = this.glyphs;
if(!glyphs) return false;
str = str.toString();
var len = str.length, i;
for(i = 0; i < len; i++){
if(!glyphs[str.charAt(i)]) return false;
}
return true;
},
Statics:/** @lends BitmapText */{
_pool:[],
/**
* easy way to generate a collection of glyphs
* @static
* @param {String} text character text.
* @param {Image} image character image.
* @param {Number} col default:the length of string
* @param {Number} row default:1
* @returns {BitmapText} BitmapText对象本身。链式调用支持。
*/
createGlyphs:function(text, image, col, row){
var str = text.toString();
col = col||str.length;
row = row||1;
var w = image.width/col;
var h = image.height/row;
var glyphs = {};
for(var i = 0, l = text.length;i < l;i ++){
var charStr = str.charAt(i);
glyphs[charStr] = {
image:image,
rect:[w * (i % col), h * Math.floor(i / col), w, h]
};
}
return glyphs;
}
}
});