diff options
author | Craig Robbins <kde.psych@gmail.com> | 2015-03-07 15:09:27 +1000 |
---|---|---|
committer | Craig Robbins <kde.psych@gmail.com> | 2015-03-07 20:51:07 +1000 |
commit | 5698e2baf8008b11706a4bbc4d62c8b584703834 (patch) | |
tree | da8342a56189914ed288e85e74c581cef54a7988 | |
parent | ffdf8dedb74e59e39a2686a0d7da3740f4f3b2a1 (diff) | |
download | minetest-5698e2baf8008b11706a4bbc4d62c8b584703834.tar.gz minetest-5698e2baf8008b11706a4bbc4d62c8b584703834.tar.bz2 minetest-5698e2baf8008b11706a4bbc4d62c8b584703834.zip |
Fix Android text bug (no text displaying)
-rw-r--r-- | src/game.cpp | 4 | ||||
-rw-r--r-- | src/gettext.h | 16 | ||||
-rw-r--r-- | src/util/string.cpp | 131 | ||||
-rw-r--r-- | src/util/string.h | 8 |
4 files changed, 79 insertions, 80 deletions
diff --git a/src/game.cpp b/src/game.cpp index 87ee081be..be8d4e679 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -4175,7 +4175,9 @@ inline void Game::limitFps(FpsControl *fps_timings, f32 *dtime) fps_timings->last_time = time; } - +// Note: This will free (using delete[])! \p msg. If you want to use it later, +// pass a copy of it to this function +// Note: \p msg must be allocated using new (not malloc()) void Game::showOverlayMessage(const wchar_t *msg, float dtime, int percent, bool draw_clouds) { diff --git a/src/gettext.h b/src/gettext.h index dce45fa3a..8235efa8a 100644 --- a/src/gettext.h +++ b/src/gettext.h @@ -23,31 +23,31 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "config.h" // for USE_GETTEXT #if USE_GETTEXT -#include <libintl.h> + #include <libintl.h> #else -#define gettext(String) String + #define gettext(String) String #endif #define _(String) gettext(String) -#define gettext_noop(String) String -#define N_(String) gettext_noop (String) +#define gettext_noop(String) (String) +#define N_(String) gettext_noop((String)) #ifdef _MSC_VER -void init_gettext(const char *path, const std::string &configured_language, int argc, char** argv); +void init_gettext(const char *path, const std::string &configured_language, + int argc, char** argv); #else void init_gettext(const char *path, const std::string &configured_language); #endif -extern const wchar_t *narrow_to_wide_c(const char *mbs); -extern std::wstring narrow_to_wide(const std::string &mbs); +extern wchar_t *narrow_to_wide_c(const char *str); // You must free the returned string! +// The returned string is allocated using new inline const wchar_t *wgettext(const char *str) { return narrow_to_wide_c(gettext(str)); } -// Gettext under MSVC needs this strange way. Just don't ask... inline std::wstring wstrgettext(const std::string &text) { const wchar_t *tmp = wgettext(text.c_str()); diff --git a/src/util/string.cpp b/src/util/string.cpp index c48abe835..651293bfe 100644 --- a/src/util/string.cpp +++ b/src/util/string.cpp @@ -22,9 +22,9 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "numeric.h" #include "log.h" +#include "sha1.h" #include "base64.h" #include "hex.h" -#include "sha1.h" #include "../porting.h" #include <algorithm> @@ -32,12 +32,35 @@ with this program; if not, write to the Free Software Foundation, Inc., #include <iomanip> #include <map> +static bool parseHexColorString(const std::string &value, video::SColor &color); +static bool parseNamedColorString(const std::string &value, video::SColor &color); + + +// You must free the returned string! +// The returned string is allocated using new +wchar_t *narrow_to_wide_c(const char *str) +{ + wchar_t* nstr = 0; #if defined(_WIN32) -#include <windows.h> // MultiByteToWideChar + int nResult = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR) str, -1, 0, 0); + if (nResult == 0) { + errorstream<<"gettext: MultiByteToWideChar returned null"<<std::endl; + } else { + nstr = new wchar_t[nResult]; + MultiByteToWideChar(CP_UTF8, 0, (LPCSTR) str, -1, (WCHAR *) nstr, nResult); + } +#else + size_t len = strlen(str); + nstr = new wchar_t[len+1]; + + std::wstring intermediate = narrow_to_wide(str); + memset(nstr, 0, (len + 1) * sizeof(wchar_t)); + memcpy(nstr, intermediate.c_str(), len * sizeof(wchar_t)); #endif -static bool parseHexColorString(const std::string &value, video::SColor &color); -static bool parseNamedColorString(const std::string &value, video::SColor &color); + return nstr; +} + #ifdef __ANDROID__ @@ -63,84 +86,55 @@ int wctomb(char *s, wchar_t wc) int mbtowc(wchar_t *pwc, const char *s, size_t n) { - if (s == NULL || *s == '\0') - return -1; + std::wstring intermediate = narrow_to_wide(s); - const wchar_t *tmp = narrow_to_wide_c(s); - bool success = tmp[0] != '\0'; + if (intermediate.length() > 0) { + *pwc = intermediate[0]; + return 1; + } + else { + return -1; + } +} - if (success) - *pwc = tmp[0]; +std::wstring narrow_to_wide(const std::string &mbs) { + size_t wcl = mbs.size(); - delete tmp; + std::wstring retval = L""; - return success ? 1 : -1; -} + for (unsigned int i = 0; i < wcl; i++) { + if (((unsigned char) mbs[i] >31) && + ((unsigned char) mbs[i] < 127)) { -// You must free the returned string! -const wchar_t *narrow_to_wide_c(const char *mbs) -{ - size_t mbl = strlen(mbs); - wchar_t *wcs = new wchar_t[mbl + 1]; - - size_t i, dest_i = 0; - for (i = 0; i < mbl; i++) { - if (((unsigned char) mbs[i] > 31) && - ((unsigned char) mbs[i] < 127)) { - wcs[dest_i++] = wide_chars[(unsigned char) mbs[i] - 32]; + retval += wide_chars[(unsigned char) mbs[i] -32]; } //handle newline else if (mbs[i] == '\n') { - wcs[dest_i++] = L'\n'; + retval += L'\n'; } } - wcs[dest_i] = '\0'; - - return wcs; -} -#else - -// You must free the returned string! -const wchar_t *narrow_to_wide_c(const char *mbs) -{ - wchar_t *wcs = NULL; -#if defined(_WIN32) - int nResult = MultiByteToWideChar(CP_UTF8, 0, (LPCSTR) mbs, -1, 0, 0); - if (nResult == 0) { - errorstream << "gettext: MultiByteToWideChar returned null" << std::endl; - } else { - wcs = new wchar_t[nResult]; - MultiByteToWideChar(CP_UTF8, 0, (LPCSTR) mbs, -1, (WCHAR *) wcs, nResult); - } -#else - size_t wcl = mbstowcs(NULL, mbs, 0); - if (wcl == (size_t) -1) - return NULL; - wcs = new wchar_t[wcl + 1]; - size_t l = mbstowcs(wcs, mbs, wcl); - assert(l != (size_t) -1); // Should never happen if the last call worked - wcs[l] = '\0'; -#endif - - return wcs; + return retval; } -#endif +#else // not Android -std::wstring narrow_to_wide(const std::string& mbs) +std::wstring narrow_to_wide(const std::string &mbs) { size_t wcl = mbs.size(); Buffer<wchar_t> wcs(wcl + 1); - size_t l = mbstowcs(*wcs, mbs.c_str(), wcl); - if (l == (size_t)(-1)) + size_t len = mbstowcs(*wcs, mbs.c_str(), wcl); + if (len == (size_t)(-1)) return L"<invalid multibyte string>"; - wcs[l] = 0; + wcs[len] = 0; return *wcs; } +#endif + #ifdef __ANDROID__ -std::string wide_to_narrow(const std::wstring& wcs) { + +std::string wide_to_narrow(const std::wstring &wcs) { size_t mbl = wcs.size()*4; std::string retval = ""; @@ -165,17 +159,18 @@ std::string wide_to_narrow(const std::wstring& wcs) { return retval; } -#else -std::string wide_to_narrow(const std::wstring& wcs) + +#else // not Android + +std::string wide_to_narrow(const std::wstring &wcs) { - size_t mbl = wcs.size()*4; + size_t mbl = wcs.size() * 4; SharedBuffer<char> mbs(mbl+1); - size_t l = wcstombs(*mbs, wcs.c_str(), mbl); - if(l == (size_t)(-1)) { + size_t len = wcstombs(*mbs, wcs.c_str(), mbl); + if (len == (size_t)(-1)) return "Character conversion failed!"; - } else - mbs[l] = 0; + mbs[len] = 0; return *mbs; } @@ -188,7 +183,7 @@ std::string wide_to_narrow(const std::wstring& wcs) // compatibility with password-less players). std::string translatePassword(std::string playername, std::wstring password) { - if(password.length() == 0) + if (password.length() == 0) return ""; std::string slt = playername + wide_to_narrow(password); diff --git a/src/util/string.h b/src/util/string.h index 388184ca4..dc520e3a8 100644 --- a/src/util/string.h +++ b/src/util/string.h @@ -36,11 +36,13 @@ struct FlagDesc { u32 flag; }; + // You must free the returned string! -const wchar_t *narrow_to_wide_c(const char *mbs); +// The returned string is allocated using new +wchar_t *narrow_to_wide_c(const char *str); -std::wstring narrow_to_wide(const std::string& mbs); -std::string wide_to_narrow(const std::wstring& wcs); +std::wstring narrow_to_wide(const std::string &mbs); +std::string wide_to_narrow(const std::wstring &wcs); std::string translatePassword(std::string playername, std::wstring password); std::string urlencode(std::string str); std::string urldecode(std::string str); |