phpldapadmin/application/media/js/dojo-release-1.7.2/dojox/gfx/VectorText.js
2013-03-19 15:55:33 +11:00

362 lines
9.7 KiB
JavaScript

//>>built
define("dojox/gfx/VectorText",["dojo/_base/lang","dojo/_base/declare","dojo/_base/array","dojo/_base/loader","dojo/_base/xhr","./_base","dojox/xml/DomParser","dojox/html/metrics","./matrix"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9){
var _a=function(_b){
var _c;
_5.get({url:_b,sync:true,load:function(_d){
_c=_d;
}});
return _c;
};
_1.getObject("dojox.gfx.VectorText",true);
_1.mixin(_6,{vectorFontFitting:{NONE:0,FLOW:1,FIT:2},defaultVectorText:{type:"vectortext",x:0,y:0,width:null,height:null,text:"",align:"start",decoration:"none",fitting:0,leading:1.5},defaultVectorFont:{type:"vectorfont",size:"10pt",family:null},_vectorFontCache:{},_svgFontCache:{},getVectorFont:function(_e){
if(_6._vectorFontCache[_e]){
return _6._vectorFontCache[_e];
}
return new _6.VectorFont(_e);
}});
return _2("dojox.gfx.VectorFont",null,{_entityRe:/&(quot|apos|lt|gt|amp|#x[^;]+|#\d+);/g,_decodeEntitySequence:function(_f){
if(!_f.match(this._entityRe)){
return;
}
var _10={amp:"&",apos:"'",quot:"\"",lt:"<",gt:">"};
var r,tmp="";
while((r=this._entityRe.exec(_f))!==null){
if(r[1].charAt(1)=="x"){
tmp+=String.fromCharCode(parseInt(r[1].slice(2),16));
}else{
if(!isNaN(parseInt(r[1].slice(1),10))){
tmp+=String.fromCharCode(parseInt(r[1].slice(1),10));
}else{
tmp+=_10[r[1]]||"";
}
}
}
return tmp;
},_parse:function(svg,url){
var doc=_6._svgFontCache[url]||_7.parse(svg);
var f=doc.documentElement.byName("font")[0],_11=doc.documentElement.byName("font-face")[0];
var _12=parseFloat(_11.getAttribute("units-per-em")||1000,10);
var _13={x:parseFloat(f.getAttribute("horiz-adv-x"),10),y:parseFloat(f.getAttribute("vert-adv-y")||0,10)};
if(!_13.y){
_13.y=_12;
}
var _14={horiz:{x:parseFloat(f.getAttribute("horiz-origin-x")||0,10),y:parseFloat(f.getAttribute("horiz-origin-y")||0,10)},vert:{x:parseFloat(f.getAttribute("vert-origin-x")||0,10),y:parseFloat(f.getAttribute("vert-origin-y")||0,10)}};
var _15=_11.getAttribute("font-family"),_16=_11.getAttribute("font-style")||"all",_17=_11.getAttribute("font-variant")||"normal",_18=_11.getAttribute("font-weight")||"all",_19=_11.getAttribute("font-stretch")||"normal",_1a=_11.getAttribute("unicode-range")||"U+0-10FFFF",_1b=_11.getAttribute("panose-1")||"0 0 0 0 0 0 0 0 0 0",_1c=_11.getAttribute("cap-height"),_1d=parseFloat(_11.getAttribute("ascent")||(_12-_14.vert.y),10),_1e=parseFloat(_11.getAttribute("descent")||_14.vert.y,10),_1f={};
var _20=_15;
if(_11.byName("font-face-name")[0]){
_20=_11.byName("font-face-name")[0].getAttribute("name");
}
if(_6._vectorFontCache[_20]){
return;
}
_3.forEach(["alphabetic","ideographic","mathematical","hanging"],function(_21){
var a=_11.getAttribute(_21);
if(a!==null){
_1f[_21]=parseFloat(a,10);
}
});
var _22=parseFloat(doc.documentElement.byName("missing-glyph")[0].getAttribute("horiz-adv-x")||_13.x,10);
var _23={},_24={},g=doc.documentElement.byName("glyph");
_3.forEach(g,function(_25){
var _26=_25.getAttribute("unicode"),_20=_25.getAttribute("glyph-name"),_27=parseFloat(_25.getAttribute("horiz-adv-x")||_13.x,10),_28=_25.getAttribute("d");
if(_26.match(this._entityRe)){
_26=this._decodeEntitySequence(_26);
}
var o={code:_26,name:_20,xAdvance:_27,path:_28};
_23[_26]=o;
_24[_20]=o;
},this);
var _29=doc.documentElement.byName("hkern");
_3.forEach(_29,function(_2a,i){
var k=-parseInt(_2a.getAttribute("k"),10);
var u1=_2a.getAttribute("u1"),g1=_2a.getAttribute("g1"),u2=_2a.getAttribute("u2"),g2=_2a.getAttribute("g2"),gl;
if(u1){
u1=this._decodeEntitySequence(u1);
if(_23[u1]){
gl=_23[u1];
}
}else{
if(_24[g1]){
gl=_24[g1];
}
}
if(gl){
if(!gl.kern){
gl.kern={};
}
if(u2){
u2=this._decodeEntitySequence(u2);
gl.kern[u2]={x:k};
}else{
if(_24[g2]){
gl.kern[_24[g2].code]={x:k};
}
}
}
},this);
_1.mixin(this,{family:_15,name:_20,style:_16,variant:_17,weight:_18,stretch:_19,range:_1a,viewbox:{width:_12,height:_12},origin:_14,advance:_1.mixin(_13,{missing:{x:_22,y:_22}}),ascent:_1d,descent:_1e,baseline:_1f,glyphs:_23});
_6._vectorFontCache[_20]=this;
_6._vectorFontCache[url]=this;
if(_20!=_15&&!_6._vectorFontCache[_15]){
_6._vectorFontCache[_15]=this;
}
if(!_6._svgFontCache[url]){
_6._svgFontCache[url]=doc;
}
},_clean:function(){
var _2b=this.name,_2c=this.family;
_3.forEach(["family","name","style","variant","weight","stretch","range","viewbox","origin","advance","ascent","descent","baseline","glyphs"],function(_2d){
try{
delete this[_2d];
}
catch(e){
}
},this);
if(_6._vectorFontCache[_2b]){
delete _6._vectorFontCache[_2b];
}
if(_6._vectorFontCache[_2c]){
delete _6._vectorFontCache[_2c];
}
return this;
},constructor:function(url){
this._defaultLeading=1.5;
if(url!==undefined){
this.load(url);
}
},load:function(url){
this.onLoadBegin(url.toString());
this._parse(_6._svgFontCache[url.toString()]||_a(url.toString()),url.toString());
this.onLoad(this);
return this;
},initialized:function(){
return (this.glyphs!==null);
},_round:function(n){
return Math.round(1000*n)/1000;
},_leading:function(_2e){
return this.viewbox.height*(_2e||this._defaultLeading);
},_normalize:function(str){
return str.replace(/\s+/g,String.fromCharCode(32));
},_getWidth:function(_2f){
var w=0,_30=0,_31=null;
_3.forEach(_2f,function(_32,i){
_30=_32.xAdvance;
if(_2f[i]&&_32.kern&&_32.kern[_2f[i].code]){
_30+=_32.kern[_2f[i].code].x;
}
w+=_30;
_31=_32;
});
if(_31&&_31.code==" "){
w-=_31.xAdvance;
}
return this._round(w);
},_getLongestLine:function(_33){
var _34=0,idx=0;
_3.forEach(_33,function(_35,i){
var max=Math.max(_34,this._getWidth(_35));
if(max>_34){
_34=max;
idx=i;
}
},this);
return {width:_34,index:idx,line:_33[idx]};
},_trim:function(_36){
var fn=function(arr){
if(!arr.length){
return;
}
if(arr[arr.length-1].code==" "){
arr.splice(arr.length-1,1);
}
if(!arr.length){
return;
}
if(arr[0].code==" "){
arr.splice(0,1);
}
};
if(_1.isArray(_36[0])){
_3.forEach(_36,fn);
}else{
fn(_36);
}
return _36;
},_split:function(_37,_38){
var w=this._getWidth(_37),_39=Math.floor(w/_38),_3a=[],cw=0,c=[],_3b=false;
for(var i=0,l=_37.length;i<l;i++){
if(_37[i].code==" "){
_3b=true;
}
cw+=_37[i].xAdvance;
if(i+1<l&&_37[i].kern&&_37[i].kern[_37[i+1].code]){
cw+=_37[i].kern[_37[i+1].code].x;
}
if(cw>=_39){
var chr=_37[i];
while(_3b&&chr.code!=" "&&i>=0){
chr=c.pop();
i--;
}
_3a.push(c);
c=[];
cw=0;
_3b=false;
}
c.push(_37[i]);
}
if(c.length){
_3a.push(c);
}
return this._trim(_3a);
},_getSizeFactor:function(_3c){
_3c+="";
var _3d=_8.getCachedFontMeasurements(),_3e=this.viewbox.height,f=_3d["1em"],_3f=parseFloat(_3c,10);
if(_3c.indexOf("em")>-1){
return this._round((_3d["1em"]*_3f)/_3e);
}else{
if(_3c.indexOf("ex")>-1){
return this._round((_3d["1ex"]*_3f)/_3e);
}else{
if(_3c.indexOf("pt")>-1){
return this._round(((_3d["12pt"]/12)*_3f)/_3e);
}else{
if(_3c.indexOf("px")>-1){
return this._round(((_3d["16px"]/16)*_3f)/_3e);
}else{
if(_3c.indexOf("%")>-1){
return this._round((_3d["1em"]*(_3f/100))/_3e);
}else{
f=_3d[_3c]||_3d.medium;
return this._round(f/_3e);
}
}
}
}
}
},_getFitFactor:function(_40,w,h,l){
if(!h){
return this._round(w/this._getWidth(_40));
}else{
var _41=this._getLongestLine(_40).width,_42=(_40.length*(this.viewbox.height*l))-((this.viewbox.height*l)-this.viewbox.height);
return this._round(Math.min(w/_41,h/_42));
}
},_getBestFit:function(_43,w,h,_44){
var _45=32,_46=0,_47=_45;
while(_45>0){
var f=this._getFitFactor(this._split(_43,_45),w,h,_44);
if(f>_46){
_46=f;
_47=_45;
}
_45--;
}
return {scale:_46,lines:this._split(_43,_47)};
},_getBestFlow:function(_48,w,_49){
var _4a=[],cw=0,c=[],_4b=false;
for(var i=0,l=_48.length;i<l;i++){
if(_48[i].code==" "){
_4b=true;
}
var tw=_48[i].xAdvance;
if(i+1<l&&_48[i].kern&&_48[i].kern[_48[i+1].code]){
tw+=_48[i].kern[_48[i+1].code].x;
}
cw+=_49*tw;
if(cw>=w){
var chr=_48[i];
while(_4b&&chr.code!=" "&&i>=0){
chr=c.pop();
i--;
}
_4a.push(c);
c=[];
cw=0;
_4b=false;
}
c.push(_48[i]);
}
if(c.length){
_4a.push(c);
}
return this._trim(_4a);
},getWidth:function(_4c,_4d){
return this._getWidth(_3.map(this._normalize(_4c).split(""),function(chr){
return this.glyphs[chr]||{xAdvance:this.advance.missing.x};
},this))*(_4d||1);
},getLineHeight:function(_4e){
return this.viewbox.height*(_4e||1);
},getCenterline:function(_4f){
return (_4f||1)*(this.viewbox.height/2);
},getBaseline:function(_50){
return (_50||1)*(this.viewbox.height+this.descent);
},draw:function(_51,_52,_53,_54,_55){
if(!this.initialized()){
throw new Error("dojox.gfx.VectorFont.draw(): we have not been initialized yet.");
}
var g=_51.createGroup();
if(_52.x||_52.y){
_51.applyTransform({dx:_52.x||0,dy:_52.y||0});
}
var _56=_3.map(this._normalize(_52.text).split(""),function(chr){
return this.glyphs[chr]||{path:null,xAdvance:this.advance.missing.x};
},this);
var _57=_53.size,_58=_52.fitting,_59=_52.width,_5a=_52.height,_5b=_52.align,_5c=_52.leading||this._defaultLeading;
if(_58){
if((_58==_6.vectorFontFitting.FLOW&&!_59)||(_58==_6.vectorFontFitting.FIT&&(!_59||!_5a))){
_58=_6.vectorFontFitting.NONE;
}
}
var _5d,_5e;
switch(_58){
case _6.vectorFontFitting.FIT:
var o=this._getBestFit(_56,_59,_5a,_5c);
_5e=o.scale;
_5d=o.lines;
break;
case _6.vectorFontFitting.FLOW:
_5e=this._getSizeFactor(_57);
_5d=this._getBestFlow(_56,_59,_5e);
break;
default:
_5e=this._getSizeFactor(_57);
_5d=[_56];
}
_5d=_3.filter(_5d,function(_5f){
return _5f.length>0;
});
var cy=0,_60=this._getLongestLine(_5d).width;
for(var i=0,l=_5d.length;i<l;i++){
var cx=0,_61=_5d[i],_62=this._getWidth(_61),lg=g.createGroup();
for(var j=0;j<_61.length;j++){
var _63=_61[j];
if(_63.path!==null){
var p=lg.createPath(_63.path).setFill(_54);
if(_55){
p.setStroke(_55);
}
p.setTransform([_9.flipY,_9.translate(cx,-this.viewbox.height-this.descent)]);
}
cx+=_63.xAdvance;
if(j+1<_61.length&&_63.kern&&_63.kern[_61[j+1].code]){
cx+=_63.kern[_61[j+1].code].x;
}
}
var dx=0;
if(_5b=="middle"){
dx=_60/2-_62/2;
}else{
if(_5b=="end"){
dx=_60-_62;
}
}
lg.setTransform({dx:dx,dy:cy});
cy+=this.viewbox.height*_5c;
}
g.setTransform(_9.scale(_5e));
return g;
},onLoadBegin:function(url){
},onLoad:function(_64){
}});
});