Skip to content

Commit 656b7e3

Browse files
committed
Allowed Bitmap Text fonts to be trimmed within a texture atlas with or without padding
1 parent 26404bb commit 656b7e3

4 files changed

Lines changed: 85 additions & 27 deletions

File tree

v3/src/checksum.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
var CHECKSUM = {
2-
build: '391befc0-6692-11e7-b6f4-cbbce538a3f5'
2+
build: '4012e3b0-66ab-11e7-b482-e336f0d78b42'
33
};
44
module.exports = CHECKSUM;

v3/src/gameobjects/bitmaptext/ParseXMLBitmapFont.js

Lines changed: 55 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,6 @@ function getValue (node, attribute)
33
return parseInt(node.getAttribute(attribute), 10);
44
}
55

6-
// "azo-fire":
7-
// {
8-
// "frame": {"x":2,"y":2,"w":1020,"h":376},
9-
// "rotated": false,
10-
// "trimmed": true,
11-
// "spriteSourceSize": {"x":1,"y":1,"w":1020,"h":376},
12-
// "sourceSize": {"w":1024,"h":512},
13-
// "pivot": {"x":0.5,"y":0.5}
14-
// },
15-
166
var ParseXMLBitmapFont = function (xml, xSpacing, ySpacing, frame)
177
{
188
if (xSpacing === undefined) { xSpacing = 0; }
@@ -31,24 +21,59 @@ var ParseXMLBitmapFont = function (xml, xSpacing, ySpacing, frame)
3121

3222
var x = 0;
3323
var y = 0;
24+
var cx = 0;
25+
var cy = 0;
26+
var adjustForTrim = (frame !== undefined && frame.trimmed);
3427

35-
if (frame && frame.trim)
28+
if (adjustForTrim)
3629
{
37-
30+
var top = frame.height;
31+
var left = frame.width;
3832
}
3933

34+
var diff = 0;
35+
4036
for (var i = 0; i < letters.length; i++)
4137
{
4238
var node = letters[i];
4339

4440
var charCode = getValue(node, 'id');
41+
var gx = getValue(node, 'x');
42+
var gy = getValue(node, 'y');
4543
var gw = getValue(node, 'width');
4644
var gh = getValue(node, 'height');
4745

46+
// Handle frame trim issues
47+
48+
if (adjustForTrim)
49+
{
50+
// if (gx + gw > frame.width)
51+
// {
52+
// diff = frame.width - (gx + gw);
53+
// gw -= diff;
54+
// }
55+
56+
// if (gy + gh > frame.height)
57+
// {
58+
// diff = frame.height - (gy + gh);
59+
// gh -= diff;
60+
// }
61+
62+
if (gx < left)
63+
{
64+
left = gx;
65+
}
66+
67+
if (gy < top)
68+
{
69+
top = gy;
70+
}
71+
}
72+
4873
data.chars[charCode] =
4974
{
50-
x: x + getValue(node, 'x'),
51-
y: y + getValue(node, 'y'),
75+
x: gx,
76+
y: gy,
5277
width: gw,
5378
height: gh,
5479
centerX: Math.floor(gw / 2),
@@ -61,6 +86,22 @@ var ParseXMLBitmapFont = function (xml, xSpacing, ySpacing, frame)
6186
};
6287
}
6388

89+
if (adjustForTrim && top !== 0 && left !== 0)
90+
{
91+
// console.log('top and left', top, left, frame.x, frame.y);
92+
93+
// Now we know the top and left coordinates of the glyphs in the original data
94+
// so we can work out how much to adjust the glyphs by
95+
96+
for (var code in data.chars)
97+
{
98+
var glyph = data.chars[code];
99+
100+
glyph.x -= frame.x;
101+
glyph.y -= frame.y;
102+
}
103+
}
104+
64105
var kernings = xml.getElementsByTagName('kerning');
65106

66107
for (i = 0; i < kernings.length; i++)

v3/src/gameobjects/bitmaptext/static/BitmapTextCanvasRenderer.js

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,12 @@ var BitmapTextCanvasRenderer = function (renderer, src, interpolationPercentage,
6464
}
6565

6666
ctx.save();
67-
ctx.translate(src.x - cameraScrollX, src.y - cameraScrollY);
67+
ctx.translate((src.x - cameraScrollX) + src.frame.x, (src.y - cameraScrollY) + src.frame.y);
6868
ctx.rotate(src.rotation);
6969
ctx.scale(src.scaleX, src.scaleY);
7070

71+
// ctx.fillStyle = 'rgba(255,0,255,0.5)';
72+
7173
for (var index = 0; index < textLength; ++index)
7274
{
7375
charCode = text.charCodeAt(index);
@@ -106,16 +108,23 @@ var BitmapTextCanvasRenderer = function (renderer, src, interpolationPercentage,
106108
x *= scale;
107109
y *= scale;
108110

111+
xAdvance += glyph.xAdvance;
112+
indexCount += 1;
113+
lastGlyph = glyph;
114+
lastCharCode = charCode;
115+
116+
// Nothing to render or a space? Then skip to the next glyph
117+
if (glyphW === 0 || glyphH === 0 || charCode === 32)
118+
{
119+
continue;
120+
}
121+
109122
ctx.save();
110123
ctx.translate(x, y);
111124
ctx.scale(scale, scale);
125+
// ctx.fillRect(0, 0, glyphW, glyphH);
112126
ctx.drawImage(image, glyphX, glyphY, glyphW, glyphH, 0, 0, glyphW, glyphH);
113127
ctx.restore();
114-
115-
xAdvance += glyph.xAdvance;
116-
indexCount += 1;
117-
lastGlyph = glyph;
118-
lastCharCode = charCode;
119128
}
120129

121130
ctx.restore();

v3/src/gameobjects/bitmaptext/static/BitmapTextWebGLRenderer.js

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ var BitmapTextWebGLRenderer = function (renderer, gameObject, interpolationPerce
5959
var renderTarget = gameObject.renderTarget;
6060

6161
tempMatrix.applyITRS(
62-
gameObject.x - cameraScrollX, gameObject.y - cameraScrollY,
62+
(srcX - cameraScrollX) + textureFrame.x, (srcY - cameraScrollY) + textureFrame.y,
6363
-gameObject.rotation,
6464
gameObject.scaleX, gameObject.scaleY
6565
);
@@ -88,6 +88,7 @@ var BitmapTextWebGLRenderer = function (renderer, gameObject, interpolationPerce
8888
for (var index = 0; index < textLength; ++index)
8989
{
9090
charCode = text.charCodeAt(index);
91+
9192
if (charCode === 10)
9293
{
9394
xAdvance = 0;
@@ -98,6 +99,7 @@ var BitmapTextWebGLRenderer = function (renderer, gameObject, interpolationPerce
9899
}
99100

100101
glyph = chars[charCode];
102+
101103
if (!glyph)
102104
{
103105
continue;
@@ -116,6 +118,17 @@ var BitmapTextWebGLRenderer = function (renderer, gameObject, interpolationPerce
116118
x += (kerningOffset !== undefined) ? kerningOffset : 0;
117119
}
118120

121+
xAdvance += glyph.xAdvance;
122+
indexCount += 1;
123+
lastGlyph = glyph;
124+
lastCharCode = charCode;
125+
126+
// Nothing to render or a space? Then skip to the next glyph
127+
if (glyphW === 0 || glyphH === 0 || charCode === 32)
128+
{
129+
continue;
130+
}
131+
119132
xw = x + glyphW * scale;
120133
yh = y + glyphH * scale;
121134
tx0 = x * mva + y * mvc + mve;
@@ -163,11 +176,6 @@ var BitmapTextWebGLRenderer = function (renderer, gameObject, interpolationPerce
163176
vertexBuffer[vertexOffset++] = umax;
164177
vertexBuffer[vertexOffset++] = vmin;
165178
vertexBuffer[vertexOffset++] = alpha;
166-
167-
xAdvance += glyph.xAdvance;
168-
indexCount += 1;
169-
lastGlyph = glyph;
170-
lastCharCode = charCode;
171179
}
172180
};
173181

0 commit comments

Comments
 (0)