summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2010-05-27 23:36:18 +0300
committerYohann Ferreira <yohann_dot_ferreira_at_orange_dot_fr>2010-05-27 23:24:59 +0200
commit6c91c7eed18ad377484e7f0edf6eff520f056c13 (patch)
tree1dc0ae52cb45b9393429e7092f6501d4b073179c
parentad34e7cf98b7a4d7096b66c743e4a087d9b432dd (diff)
downloadmana-client-6c91c7eed18ad377484e7f0edf6eff520f056c13.tar.gz
mana-client-6c91c7eed18ad377484e7f0edf6eff520f056c13.tar.bz2
mana-client-6c91c7eed18ad377484e7f0edf6eff520f056c13.tar.xz
mana-client-6c91c7eed18ad377484e7f0edf6eff520f056c13.zip
Fix drawing incorrect utf8 strings issue.
Reviewed-by: Bertram Resolve: Manasource Mantis #143
-rw-r--r--src/gui/truetypefont.cpp11
-rw-r--r--src/utils/stringutils.cpp11
-rw-r--r--src/utils/stringutils.h2
3 files changed, 21 insertions, 3 deletions
diff --git a/src/gui/truetypefont.cpp b/src/gui/truetypefont.cpp
index 3bf1febe..55d1a18a 100644
--- a/src/gui/truetypefont.cpp
+++ b/src/gui/truetypefont.cpp
@@ -26,9 +26,11 @@
#include "resources/image.h"
+#include "utils/stringutils.h"
+
#include <guichan/exception.hpp>
-#define CACHE_SIZE 256
+const unsigned int CACHE_SIZE = 256;
class TextChunk
{
@@ -55,8 +57,10 @@ class TextChunk
sdlCol.r = color.r;
sdlCol.g = color.g;
+ const char* str = getSafeUtf8String(text);
SDL_Surface *surface = TTF_RenderUTF8_Blended(
- font, text.c_str(), sdlCol);
+ font, str, sdlCol);
+ delete[] str;
if (!surface)
{
@@ -175,7 +179,8 @@ int TrueTypeFont::getWidth(const std::string &text) const
}
int w, h;
- TTF_SizeUTF8(mFont, text.c_str(), &w, &h);
+ const char* str = getSafeUtf8String(text);
+ TTF_SizeUTF8(mFont, str, &w, &h);
return w;
}
diff --git a/src/utils/stringutils.cpp b/src/utils/stringutils.cpp
index 01bf0d3c..9fe3de14 100644
--- a/src/utils/stringutils.cpp
+++ b/src/utils/stringutils.cpp
@@ -21,10 +21,13 @@
#include "utils/stringutils.h"
+#include <string.h>
#include <algorithm>
#include <cstdarg>
#include <cstdio>
+const int UTF8_MAX_SIZE = 10;
+
std::string &trim(std::string &str)
{
std::string::size_type pos = str.find_last_not_of(' ');
@@ -164,3 +167,11 @@ const std::string findSameSubstring(const std::string &str1, const std::string &
}
return str1.substr(0, minLength);
}
+
+const char* getSafeUtf8String(std::string text)
+{
+ char* buf = new char[text.size() + UTF8_MAX_SIZE];
+ memcpy(buf, text.c_str(), text.size());
+ memset(buf + text.size(), 0, UTF8_MAX_SIZE);
+ return buf;
+} \ No newline at end of file
diff --git a/src/utils/stringutils.h b/src/utils/stringutils.h
index 5e4718c0..ec82e240 100644
--- a/src/utils/stringutils.h
+++ b/src/utils/stringutils.h
@@ -123,4 +123,6 @@ bool isWordSeparator(char chr);
const std::string findSameSubstring(const std::string &str1, const std::string &str2);
+const char* getSafeUtf8String(std::string text);
+
#endif // UTILS_STRINGUTILS_H