diff --git a/src/modules/graphics/opengl/Font.cpp b/src/modules/graphics/opengl/Font.cpp index 8f6e1531f..18acb6dc2 100644 --- a/src/modules/graphics/opengl/Font.cpp +++ b/src/modules/graphics/opengl/Font.cpp @@ -149,24 +149,32 @@ namespace opengl glTranslatef(ceil(x), ceil(y), 0.0f); glRotatef(LOVE_TODEG(angle), 0, 0, 1.0f); glScalef(sx, sy, 1.0f); - utf8::iterator i (text.begin(), text.begin(), text.end()); - utf8::iterator end (text.end(), text.begin(), text.end()); - while (i != end) { - int g = *i++; - if (g == '\n') { // wrap newline, but do not print it - glTranslatef(-dx, floor(getHeight() * getLineHeight() + 0.5f), 0); - dx = 0.0f; - continue; + try + { + utf8::iterator i (text.begin(), text.begin(), text.end()); + utf8::iterator end (text.end(), text.begin(), text.end()); + while (i != end) { + int g = *i++; + if (g == '\n') { // wrap newline, but do not print it + 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(glyph->spacing), 0, 0); + dx += glyph->spacing; } - 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); + } + catch (utf8::invalid_utf8 e) + { glPopMatrix(); - glTranslatef(static_cast(glyph->spacing), 0, 0); - dx += glyph->spacing; + throw love::Exception(e.what()); } glPopMatrix(); } diff --git a/src/modules/graphics/opengl/wrap_Graphics.cpp b/src/modules/graphics/opengl/wrap_Graphics.cpp index 078f6c2a5..ad2da0495 100644 --- a/src/modules/graphics/opengl/wrap_Graphics.cpp +++ b/src/modules/graphics/opengl/wrap_Graphics.cpp @@ -759,7 +759,14 @@ namespace opengl float angle = (float)luaL_optnumber(L, 4, 0.0f); float sx = (float)luaL_optnumber(L, 5, 1.0f); 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; } @@ -779,7 +786,14 @@ namespace opengl 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; }