forked from tleunen/pixi-multistyle-text
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpixi-multistyle-text.min.js
1 lines (1 loc) · 3.56 KB
/
pixi-multistyle-text.min.js
1
(function(){function t(t){t=t||{},t.font=t.font||"bold 20pt Arial",t.fill=t.fill||"black",t.stroke=t.stroke||"black",t.strokeThickness=t.strokeThickness||0,t.dropShadow=t.dropShadow||!1,t.dropShadowAngle=t.dropShadowAngle||Math.PI/6,t.dropShadowDistance=t.dropShadowDistance||4,t.dropShadowColor=t.dropShadowColor||"black"}function e(t,e){return{text:t,style:e,width:0,height:0,fontProperties:null}}var o=this,i=o.PIXI;if(i){var s=function(t,e,o){i.Text.call(this,t,o),this.setTextStyles(e)};s.prototype=Object.create(i.Text.prototype),s.prototype.constructor=s,s.prototype.setAlignmentStyle=s.prototype.setStyle=function(t){t=t||{},t.align=t.align||"left",t.wordWrap=t.wordWrap||!1,t.wordWrapWidth=t.wordWrapWidth||100,this.style=t,this.dirty=!0},s.prototype.setTextStyles=function(e){for(var o in e)e.hasOwnProperty(o)&&"number"==typeof e[o].fill&&(e[o].fill=i.utils.hex2string(e[o].fill));e.def||(e.def={}),t(e.def),this.textStyles=e,this.dirty=!0},s.prototype._getTextDataPerLine=function(t){for(var o=[],i=Object.keys(this.textStyles).join("|"),s=new RegExp("</?("+i+")>","g"),n=[Object.assign({},this.textStyles.def)],r=0;r<t.length;r++){for(var h,l=[],a=[];null!==(h=s.exec(t[r]))&&a.push(h););if(a.length){for(var c=0,d=0;d<a.length;d++)a[d].index>c&&l.push(e(t[r].substring(c,a[d].index),n[n.length-1])),"/"==a[d][0][1]?n.length>0&&n.pop():n.push(Object.assign({},n[n.length-1],this.textStyles[a[d][1]])),c=a[d].index+a[d][0].length;c<t[r].length&&l.push({text:t[r].substring(c),style:n[n.length-1]})}else l.push(e(t[r],n[n.length-1]));o.push(l)}return o},s.prototype.updateText=function(){this.texture.baseTexture.resolution=this.resolution;var t,e,o=this.text,i=this.textStyles;this.style.wordWrap&&(o=this.wordWrap(this.text));var s=o.split(/(?:\r\n|\r|\n)/),n=this._getTextDataPerLine(s),r=[],h=[],l=0;for(t=0;t<s.length;t++){var a=0,c=0;for(e=0;e<n[t].length;e++)this.context.font=n[t][e].style.font,n[t][e].width=this.context.measureText(n[t][e].text).width,a+=n[t][e].width,n[t][e].fontProperties=this.determineFontProperties(n[t][e].style.font),n[t][e].height=n[t][e].fontProperties.fontSize+n[t][e].style.strokeThickness,c=Math.max(c,n[t][e].height);r[t]=a,h[t]=c,l=Math.max(l,a)}var d=Object.keys(i).map(function(t){return i[t]}),p=d.reduce(function(t,e){return Math.max(t,e.strokeThickness||0)},0),x=d.reduce(function(t,e){var o=e.dropShadow?e.dropShadowDistance:0;return Math.max(t,o)},0),f=l+p+x,u=Math.max.apply(null,h)*s.length+x;this.canvas.width=(f+this.context.lineWidth)*this.resolution,this.canvas.height=u*this.resolution,this.context.scale(this.resolution,this.resolution),navigator.isCocoonJS&&this.context.clearRect(0,0,this.canvas.width,this.canvas.height),this.context.textBaseline="alphabetic",this.context.lineJoin="round";var g,y;for(t=0;t<n.length;t++){var w=n[t];for(g=0,e=0;e<w.length;e++){var S=w[e].style,k=w[e].text,v=w[e].fontProperties;if(this.context.font=S.font,this.context.strokeStyle=S.stroke,this.context.lineWidth=S.strokeThickness,g+=p/2,y=p/2+t*h[t]+v.ascent,"right"===this.style.align?g+=l-r[t]:"center"===this.style.align&&0===g&&(g+=(l-r[t])/2),"bottom"===S.valign?y+=h[t]-w[e].height-(p-S.strokeThickness)/2:"middle"===S.valign&&(y+=(h[t]-w[e].height)/2-(p-S.strokeThickness)/2),S.dropShadow){this.context.fillStyle=S.dropShadowColor;var T=Math.sin(S.dropShadowAngle)*S.dropShadowDistance,b=Math.cos(S.dropShadowAngle)*S.dropShadowDistance;S.fill&&this.context.fillText(k,g+T,y+b)}this.context.fillStyle=S.fill,S.stroke&&S.strokeThickness&&this.context.strokeText(k,g,y),S.fill&&this.context.fillText(k,g,y),g+=w[e].width,g-=p/2}}this.updateTexture()},i.MultiStyleText=s}}).call(this);