Fail gracefully on a utf-8 decoding error (bug #244)

This commit is contained in:
Bart van Strien
2011-06-24 01:18:48 +02:00
parent a012a4408e
commit b90771d44a
2 changed files with 40 additions and 18 deletions
+24 -16
View File
@@ -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();
} }
+16 -2
View File
@@ -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;
} }