Skip to content

Commit be02c80

Browse files
committed
Origin and canvas renderer work again now. Fix phaserjs#4108
1 parent 5dbfbae commit be02c80

1 file changed

Lines changed: 55 additions & 23 deletions

File tree

src/gameobjects/bitmaptext/dynamic/DynamicBitmapTextCanvasRenderer.js

Lines changed: 55 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ var SetTransform = require('../../../renderer/canvas/utils/SetTransform');
2323
*/
2424
var 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

Comments
 (0)