mirror of
https://github.com/love2d/love.git
synced 2026-08-20 20:49:54 +02:00
Fail gracefully on a utf-8 decoding error (bug #244)
This commit is contained in:
@@ -149,24 +149,32 @@ namespace opengl
|
|||||||
glTranslatef(ceil(x), ceil(y), 0.0f);
|
glTranslatef(ceil(x), ceil(y), 0.0f);
|
||||||
glRotatef(LOVE_TODEG(angle), 0, 0, 1.0f);
|
glRotatef(LOVE_TODEG(angle), 0, 0, 1.0f);
|
||||||
glScalef(sx, sy, 1.0f);
|
glScalef(sx, sy, 1.0f);
|
||||||
utf8::iterator<std::string::iterator> i (text.begin(), text.begin(), text.end());
|
try
|
||||||
utf8::iterator<std::string::iterator> end (text.end(), text.begin(), text.end());
|
{
|
||||||
while (i != end) {
|
utf8::iterator<std::string::iterator> i (text.begin(), text.begin(), text.end());
|
||||||
int g = *i++;
|
utf8::iterator<std::string::iterator> end (text.end(), text.begin(), text.end());
|
||||||
if (g == '\n') { // wrap newline, but do not print it
|
while (i != end) {
|
||||||
glTranslatef(-dx, floor(getHeight() * getLineHeight() + 0.5f), 0);
|
int g = *i++;
|
||||||
dx = 0.0f;
|
if (g == '\n') { // wrap newline, but do not print it
|
||||||
continue;
|
glTranslatef(-dx, floor(getHeight() * getLineHeight() + 0.5f), 0);
|
||||||
|
dx = 0.0f;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
Glyph * glyph = glyphs[g];
|
||||||
|
if (!glyph) glyph = addGlyph(g);
|
||||||
|
glPushMatrix();
|
||||||
|
// 1.25 is magic line height for true type fonts
|
||||||
|
if (type == FONT_TRUETYPE) glTranslatef(0, floor(getHeight() / 1.25f + 0.5f), 0);
|
||||||
|
glCallList(glyph->list);
|
||||||
|
glPopMatrix();
|
||||||
|
glTranslatef(static_cast<GLfloat>(glyph->spacing), 0, 0);
|
||||||
|
dx += glyph->spacing;
|
||||||
}
|
}
|
||||||
Glyph * glyph = glyphs[g];
|
}
|
||||||
if (!glyph) glyph = addGlyph(g);
|
catch (utf8::invalid_utf8 e)
|
||||||
glPushMatrix();
|
{
|
||||||
// 1.25 is magic line height for true type fonts
|
|
||||||
if (type == FONT_TRUETYPE) glTranslatef(0, floor(getHeight() / 1.25f + 0.5f), 0);
|
|
||||||
glCallList(glyph->list);
|
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
glTranslatef(static_cast<GLfloat>(glyph->spacing), 0, 0);
|
throw love::Exception(e.what());
|
||||||
dx += glyph->spacing;
|
|
||||||
}
|
}
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -759,7 +759,14 @@ namespace opengl
|
|||||||
float angle = (float)luaL_optnumber(L, 4, 0.0f);
|
float angle = (float)luaL_optnumber(L, 4, 0.0f);
|
||||||
float sx = (float)luaL_optnumber(L, 5, 1.0f);
|
float sx = (float)luaL_optnumber(L, 5, 1.0f);
|
||||||
float sy = (float)luaL_optnumber(L, 6, sx);
|
float sy = (float)luaL_optnumber(L, 6, sx);
|
||||||
instance->print(str, x, y, angle, sx, sy);
|
try
|
||||||
|
{
|
||||||
|
instance->print(str, x, y, angle, sx, sy);
|
||||||
|
}
|
||||||
|
catch (love::Exception e)
|
||||||
|
{
|
||||||
|
return luaL_error(L, "Decoding error: %s", e.what());
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -779,7 +786,14 @@ namespace opengl
|
|||||||
return luaL_error(L, "Incorrect alignment: %s", str);
|
return luaL_error(L, "Incorrect alignment: %s", str);
|
||||||
}
|
}
|
||||||
|
|
||||||
instance->printf(str, x, y, wrap, align);
|
try
|
||||||
|
{
|
||||||
|
instance->printf(str, x, y, wrap, align);
|
||||||
|
}
|
||||||
|
catch (love::Exception e)
|
||||||
|
{
|
||||||
|
return luaL_error(L, "Decoding error: %s", e.what());
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user