diff --git a/libretro-common/include/string/stdstring.h b/libretro-common/include/string/stdstring.h index 845d636948..98f7aecd03 100644 --- a/libretro-common/include/string/stdstring.h +++ b/libretro-common/include/string/stdstring.h @@ -87,7 +87,7 @@ char *string_trim_whitespace_right(char *const s); /* Remove leading and trailing whitespaces */ char *string_trim_whitespace(char *const s); -char *word_wrap(char* buffer, const char *string, int line_width); +char *word_wrap(char* buffer, const char *string, int line_width, bool unicode); RETRO_END_DECLS diff --git a/libretro-common/string/stdstring.c b/libretro-common/string/stdstring.c index ea8d62e70f..88f0ed92fc 100644 --- a/libretro-common/string/stdstring.c +++ b/libretro-common/string/stdstring.c @@ -24,6 +24,7 @@ #include #include +#include char *string_to_upper(char *s) { @@ -144,7 +145,7 @@ char *string_trim_whitespace(char *const s) return s; } -char *word_wrap(char* buffer, const char *string, int line_width) +char *word_wrap(char* buffer, const char *string, int line_width, bool unicode) { unsigned i = 0; unsigned len = (unsigned)strlen(string); @@ -156,20 +157,34 @@ char *word_wrap(char* buffer, const char *string, int line_width) /* copy string until the end of the line is reached */ for (counter = 1; counter <= (unsigned)line_width; counter++) { + const char *character; + unsigned char_len; + unsigned j = i; + + character = utf8skip(&string[i], 1); + char_len = character - &string[i]; + /* check if end of string reached */ - if (i == strlen(string)) + if (i == len) { buffer[i] = 0; return buffer; } - buffer[i] = string[i]; + if (!unicode) + counter += char_len - 1; + + do + { + buffer[i] = string[i]; + char_len--; + i++; + } while(char_len); /* check for newlines embedded in the original input * and reset the index */ - if (buffer[i] == '\n') + if (buffer[j] == '\n') counter = 1; - i++; } /* check for whitespace */ diff --git a/menu/drivers/materialui.c b/menu/drivers/materialui.c index 4b91b800d4..2d18de5f2d 100644 --- a/menu/drivers/materialui.c +++ b/menu/drivers/materialui.c @@ -562,7 +562,7 @@ static void mui_compute_entries_box(mui_handle_t* mui, int width) if (menu_entry_get_sublabel(i, sublabel_str, sizeof(sublabel_str))) { - word_wrap(sublabel_str, sublabel_str, (int)(usable_width / mui->glyph_width2)); + word_wrap(sublabel_str, sublabel_str, (int)(usable_width / mui->glyph_width2), false); lines = mui_count_lines(sublabel_str); } @@ -715,7 +715,7 @@ static void mui_render_label_value(mui_handle_t *mui, mui_node_t *node, if (menu_entry_get_sublabel(i, sublabel_str, sizeof(sublabel_str))) { - word_wrap(sublabel_str, sublabel_str, (int)(usable_width / mui->glyph_width2)); + word_wrap(sublabel_str, sublabel_str, (int)(usable_width / mui->glyph_width2), false); menu_display_draw_text(mui->font2, sublabel_str, mui->margin, diff --git a/menu/drivers/xmb.c b/menu/drivers/xmb.c index 3198c7c4a9..b545efe467 100644 --- a/menu/drivers/xmb.c +++ b/menu/drivers/xmb.c @@ -2328,7 +2328,7 @@ static void xmb_draw_items( label_offset = - xmb->margins.label.top; - word_wrap(entry_sublabel, entry.sublabel, 50); + word_wrap(entry_sublabel, entry.sublabel, 50, true); xmb_draw_text(menu_disp_info, xmb, entry_sublabel, node->x + xmb->margins.screen.left +