From 6e630e8987edda58f3ed3635f83f87eeaca78131 Mon Sep 17 00:00:00 2001 From: Bart van Strien Date: Sat, 3 Sep 2011 16:22:21 +0200 Subject: [PATCH] Fix width for getWrap and catch utf8 decoding errors in getWrap and getSize (issues #230 and #244) --- src/modules/graphics/opengl/Font.cpp | 27 +++++++++++++++-------- src/modules/graphics/opengl/wrap_Font.cpp | 23 +++++++++++++++---- 2 files changed, 37 insertions(+), 13 deletions(-) diff --git a/src/modules/graphics/opengl/Font.cpp b/src/modules/graphics/opengl/Font.cpp index 2859ed49b..7b4386eb5 100644 --- a/src/modules/graphics/opengl/Font.cpp +++ b/src/modules/graphics/opengl/Font.cpp @@ -199,13 +199,20 @@ namespace opengl Glyph * g; - utf8::iterator i (line.begin(), line.begin(), line.end()); - utf8::iterator end (line.end(), line.begin(), line.end()); - while (i != end) { - int c = *i++; - g = glyphs[c]; - if (!g) g = addGlyph(c); - temp += static_cast(g->spacing * mSpacing); + try + { + utf8::iterator i (line.begin(), line.begin(), line.end()); + utf8::iterator end (line.end(), line.begin(), line.end()); + while (i != end) { + int c = *i++; + g = glyphs[c]; + if (!g) g = addGlyph(c); + temp += static_cast(g->spacing * mSpacing); + } + } + catch (utf8::invalid_utf8 e) + { + throw love::Exception(e.what()); } return temp; @@ -251,11 +258,13 @@ namespace opengl // on wordwrap, push line to line buffer and clear string builder if (width >= wrap && oldwidth > 0) { - if (width > maxw) - maxw = width; + int realw = width; lines_to_draw.push_back( string_builder.str() ); string_builder.str( "" ); width = static_cast(getWidth( word )); + realw -= width; + if (realw > maxw) + maxw = realw; } string_builder << word << " "; width += width_space; diff --git a/src/modules/graphics/opengl/wrap_Font.cpp b/src/modules/graphics/opengl/wrap_Font.cpp index d7efb23b0..8e6ee6723 100644 --- a/src/modules/graphics/opengl/wrap_Font.cpp +++ b/src/modules/graphics/opengl/wrap_Font.cpp @@ -43,7 +43,14 @@ namespace opengl { Font * t = luax_checkfont(L, 1); const char * str = luaL_checkstring(L, 2); - lua_pushinteger(L, t->getWidth(str)); + try + { + lua_pushinteger(L, t->getWidth(str)); + } + catch (love::Exception & e) + { + return luaL_error(L, e.what()); + } return 1; } @@ -52,10 +59,18 @@ namespace opengl Font * t = luax_checkfont(L, 1); const char * str = luaL_checkstring(L, 2); float wrap = (float) luaL_checknumber(L, 3); - int max_width = 0; - std::vector lines = t->getWrap(str, wrap, &max_width); + int max_width = 0, numlines = 0; + try + { + std::vector lines = t->getWrap(str, wrap, &max_width); + numlines = lines.size(); + } + catch (love::Exception & e) + { + return luaL_error(L, e.what()); + } lua_pushinteger(L, max_width); - lua_pushinteger(L, lines.size()); + lua_pushinteger(L, numlines); return 2; }