Author: cazfi Date: Thu Jan 22 20:01:23 2015 New Revision: 27775 URL: http://svn.gna.org/viewcvs/freeciv?rev=27775&view=rev Log: Added more utility functions for handling utf8 to sdl2-client.
See patch #5726 Modified: trunk/client/gui-sdl2/gui_string.c trunk/client/gui-sdl2/gui_string.h Modified: trunk/client/gui-sdl2/gui_string.c URL: http://svn.gna.org/viewcvs/freeciv/trunk/client/gui-sdl2/gui_string.c?rev=27775&r1=27774&r2=27775&view=diff ============================================================================== --- trunk/client/gui-sdl2/gui_string.c (original) +++ trunk/client/gui-sdl2/gui_string.c Thu Jan 22 20:01:23 2015 @@ -258,11 +258,45 @@ } /************************************************************************** + Create utf8_str struct with ptsize font. + Font will be loaded or aliased with existing font of that size. + pInTextString must be allocated in memory (MALLOC/fc_calloc) +**************************************************************************/ +utf8_str *create_utf8_str(char *in_text, size_t n_alloc, Uint16 ptsize) +{ + utf8_str *str = fc_calloc(1, sizeof(utf8_str)); + + if (!ptsize) { + str->ptsize = theme_default_font_size(theme); + } else { + str->ptsize = ptsize; + } + + if ((str->font = load_font(str->ptsize)) == NULL) { + log_error("create_utf8_str(): load_font failed"); + FC_FREE(str); + + return NULL; + } + + str->style = TTF_STYLE_NORMAL; + str->bgcol = (SDL_Color) {0, 0, 0, 0}; + str->fgcol = *get_theme_color(COLOR_THEME_TEXT); + str->render = 2; + + /* pInTextString must be allocated in memory (MALLOC/fc_calloc) */ + str->text = in_text; + str->n_alloc = n_alloc; + + return str; +} + +/************************************************************************** Convert char array to SDL_String16. Pointer to target string is needed as parameter, but also returned for convenience. **************************************************************************/ -SDL_String16 * copy_chars_to_string16(SDL_String16 *pString, - const char *pCharString) +SDL_String16 *copy_chars_to_string16(SDL_String16 *pString, + const char *pCharString) { size_t n; @@ -282,6 +316,32 @@ convertcopy_to_utf16(pString->text, pString->n_alloc, pCharString); return pString; +} + +/************************************************************************** + Convert char array to utf8_str. Pointer to target string is needed + as parameter, but also returned for convenience. +**************************************************************************/ +utf8_str *copy_chars_to_utf8_str(utf8_str *pstr, const char *pchars) +{ + size_t n; + + fc_assert_ret_val(pstr != NULL, NULL); + fc_assert_ret_val(pchars != NULL, NULL); + + n = (strlen(pchars) + 1) * 2; + + if (n > pstr->n_alloc) { + /* allocated more if this is only a small increase on before: */ + size_t n1 = (3 * pstr->n_alloc) / 2; + + pstr->n_alloc = (n > n1) ? n : n1; + pstr->text = fc_realloc(pstr->text, pstr->n_alloc); + } + + fc_snprintf(pstr->text, pstr->n_alloc, "%s", pchars); + + return pstr; } /************************************************************************** Modified: trunk/client/gui-sdl2/gui_string.h URL: http://svn.gna.org/viewcvs/freeciv/trunk/client/gui-sdl2/gui_string.h?rev=27775&r1=27774&r2=27775&view=diff ============================================================================== --- trunk/client/gui-sdl2/gui_string.h (original) +++ trunk/client/gui-sdl2/gui_string.h Thu Jan 22 20:01:23 2015 @@ -79,6 +79,8 @@ SDL_Rect str16size(SDL_String16 *pString16); void change_ptsize16(SDL_String16 *pString, Uint16 new_ptsize); +utf8_str *create_utf8_str(char *in_text, size_t n_alloc, Uint16 ptsize); +utf8_str *copy_chars_to_utf8_str(utf8_str *pstr, const char *pchars); bool convert_utf8_str_to_const_surface_width(utf8_str *pstr, int width); int write_utf8(SDL_Surface *dest, Sint16 x, Sint16 y, @@ -101,8 +103,10 @@ #define str16len(pString16) str16size(pString16).w #define str16height(pString16) str16size(pString16).h +#define utf8_str_height(pstr) utf8_str_size(pstr).h + /* - * here we use ordinary free( ... ) becouse check is made + * here we use ordinary free( ... ) because check is made * on start. */ #define FREESTRING16( pString16 ) \ @@ -115,7 +119,27 @@ } \ } while (FALSE) +/* + * here we use ordinary free( ... ) because check is made + * on start. + */ +#define FREEUTF8STR( pstr ) \ + do { \ + if (pstr != NULL) { \ + FC_FREE(pstr->text); \ + unload_font(pstr->ptsize); \ + free(pstr); \ + pstr = NULL; \ + } \ +} while (FALSE) + #define create_str16_from_char(pInCharString, iPtsize) \ - copy_chars_to_string16(create_string16(NULL, 0,iPtsize), pInCharString) + copy_chars_to_string16(create_string16(NULL, 0, iPtsize), pInCharString) + +#define create_utf8_from_char(string_in, ptsize) \ + (string_in) == NULL ? \ + create_utf8_str(NULL, 0, ptsize) : \ + copy_chars_to_utf8_str(create_utf8_str(NULL, 0, ptsize), string_in) + #endif /* FC__GUISTRING_H */ _______________________________________________ Freeciv-commits mailing list Freeciv-commits@gna.org https://mail.gna.org/listinfo/freeciv-commits