@@ -23,7 +23,7 @@ var SetTransform = require('../../../renderer/canvas/utils/SetTransform');
2323 */
2424var DynamicBitmapTextCanvasRenderer = function ( renderer , src , interpolationPercentage , camera , parentMatrix )
2525{
26- var text = src . text ;
26+ var text = src . _text ;
2727 var textLength = text . length ;
2828
2929 var ctx = renderer . currentContext ;
@@ -38,16 +38,13 @@ var DynamicBitmapTextCanvasRenderer = function (renderer, src, interpolationPerc
3838 var displayCallback = src . displayCallback ;
3939 var callbackData = src . callbackData ;
4040
41- var cameraScrollX = camera . scrollX * src . scrollFactorX ;
42- var cameraScrollY = camera . scrollY * src . scrollFactorY ;
43-
4441 var chars = src . fontData . chars ;
4542 var lineHeight = src . fontData . lineHeight ;
43+ var letterSpacing = src . _letterSpacing ;
4644
4745 var xAdvance = 0 ;
4846 var yAdvance = 0 ;
4947
50- var indexCount = 0 ;
5148 var charCode = 0 ;
5249
5350 var glyph = null ;
@@ -68,7 +65,30 @@ var DynamicBitmapTextCanvasRenderer = function (renderer, src, interpolationPerc
6865 var textureY = textureFrame . cutY ;
6966
7067 var rotation = 0 ;
71- var scale = ( src . fontSize / src . fontData . size ) ;
68+ var scale = 0 ;
69+ var baseScale = ( src . _fontSize / src . fontData . size ) ;
70+
71+ var align = src . _align ;
72+ var currentLine = 0 ;
73+ var lineOffsetX = 0 ;
74+
75+ // Update the bounds - skipped internally if not dirty
76+ src . getTextBounds ( false ) ;
77+
78+ var lineData = src . _bounds . lines ;
79+
80+ if ( align === 1 )
81+ {
82+ lineOffsetX = ( lineData . longest - lineData . lengths [ 0 ] ) / 2 ;
83+ }
84+ else if ( align === 2 )
85+ {
86+ lineOffsetX = ( lineData . longest - lineData . lengths [ 0 ] ) ;
87+ }
88+
89+ ctx . translate ( - src . displayOriginX , - src . displayOriginY ) ;
90+
91+ var roundPixels = camera . roundPixels ;
7292
7393 if ( src . cropWidth > 0 && src . cropHeight > 0 )
7494 {
@@ -77,20 +97,31 @@ var DynamicBitmapTextCanvasRenderer = function (renderer, src, interpolationPerc
7797 ctx . clip ( ) ;
7898 }
7999
80- for ( var index = 0 ; index < textLength ; ++ index )
100+ for ( var i = 0 ; i < textLength ; i ++ )
81101 {
82102 // Reset the scale (in case the callback changed it)
83- scale = ( src . fontSize / src . fontData . size ) ;
103+ scale = baseScale ;
84104 rotation = 0 ;
85105
86- charCode = text . charCodeAt ( index ) ;
106+ charCode = text . charCodeAt ( i ) ;
87107
88108 if ( charCode === 10 )
89109 {
110+ currentLine ++ ;
111+
112+ if ( align === 1 )
113+ {
114+ lineOffsetX = ( lineData . longest - lineData . lengths [ currentLine ] ) / 2 ;
115+ }
116+ else if ( align === 2 )
117+ {
118+ lineOffsetX = ( lineData . longest - lineData . lengths [ currentLine ] ) ;
119+ }
120+
90121 xAdvance = 0 ;
91- indexCount = 0 ;
92122 yAdvance += lineHeight ;
93123 lastGlyph = null ;
124+
94125 continue ;
95126 }
96127
@@ -107,11 +138,9 @@ var DynamicBitmapTextCanvasRenderer = function (renderer, src, interpolationPerc
107138 glyphW = glyph . width ;
108139 glyphH = glyph . height ;
109140
110- x = ( indexCount + glyph . xOffset + xAdvance ) - src . scrollX ;
141+ x = ( glyph . xOffset + xAdvance ) - src . scrollX ;
111142 y = ( glyph . yOffset + yAdvance ) - src . scrollY ;
112143
113- // This could be optimized so that it doesn't even bother drawing it if the x/y is out of range
114-
115144 if ( lastGlyph !== null )
116145 {
117146 var kerningOffset = glyph . kerning [ lastCharCode ] ;
@@ -120,7 +149,7 @@ var DynamicBitmapTextCanvasRenderer = function (renderer, src, interpolationPerc
120149
121150 if ( displayCallback )
122151 {
123- callbackData . index = index ;
152+ callbackData . index = i ;
124153 callbackData . charCode = charCode ;
125154 callbackData . x = x ;
126155 callbackData . y = y ;
@@ -139,10 +168,19 @@ var DynamicBitmapTextCanvasRenderer = function (renderer, src, interpolationPerc
139168 x *= scale ;
140169 y *= scale ;
141170
142- x -= cameraScrollX ;
143- y -= cameraScrollY ;
171+ x += lineOffsetX ;
172+
173+ xAdvance += glyph . xAdvance + letterSpacing ;
174+ lastGlyph = glyph ;
175+ lastCharCode = charCode ;
176+
177+ // Nothing to render or a space? Then skip to the next glyph
178+ if ( glyphW === 0 || glyphH === 0 || charCode === 32 )
179+ {
180+ continue ;
181+ }
144182
145- if ( camera . roundPixels )
183+ if ( roundPixels )
146184 {
147185 x = Math . round ( x ) ;
148186 y = Math . round ( y ) ;
@@ -159,14 +197,8 @@ var DynamicBitmapTextCanvasRenderer = function (renderer, src, interpolationPerc
159197 ctx . drawImage ( image , glyphX , glyphY , glyphW , glyphH , 0 , 0 , glyphW , glyphH ) ;
160198
161199 ctx . restore ( ) ;
162-
163- xAdvance += glyph . xAdvance ;
164- indexCount += 1 ;
165- lastGlyph = glyph ;
166- lastCharCode = charCode ;
167200 }
168201
169- // Restore the context saved in SetTransform
170202 ctx . restore ( ) ;
171203} ;
172204
0 commit comments