From f43be22e2d7ecf385a4b3f791a75f3a4654b2cac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Higor=20Eur=C3=ADpedes?= Date: Wed, 15 Jul 2015 18:01:13 -0300 Subject: [PATCH 1/7] (GLUI) Turn font loading failure into an error --- menu/drivers/glui.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/menu/drivers/glui.c b/menu/drivers/glui.c index 91567e9699..8ccba200d3 100644 --- a/menu/drivers/glui.c +++ b/menu/drivers/glui.c @@ -725,7 +725,7 @@ static void glui_font(menu_handle_t *menu) font_path = settings->video.font_enable ? settings->video.font_path : NULL; if (!menu_display_init_main_font(menu, font_path, menu->display.font.size)) - RARCH_WARN("Failed to load font."); + RARCH_ERR("Failed to load font."); } static void glui_context_reset(void) From eb406c7a91092eaa3398fc8e53bc5612b54d07d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Higor=20Eur=C3=ADpedes?= Date: Wed, 15 Jul 2015 18:13:13 -0300 Subject: [PATCH 2/7] (GLUI) Add more appropriate glui->ticker_limit calculation --- menu/drivers/glui.c | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/menu/drivers/glui.c b/menu/drivers/glui.c index 8ccba200d3..ce5910b9c4 100644 --- a/menu/drivers/glui.c +++ b/menu/drivers/glui.c @@ -505,8 +505,20 @@ static void glui_allocate_white_texture(glui_handle_t *glui) TEXTURE_BACKEND_OPENGL, TEXTURE_FILTER_NEAREST); } +static void glui_font(menu_handle_t *menu) +{ + settings_t *settings = config_get_ptr(); + const char *font_path = NULL; + + font_path = settings->video.font_enable ? settings->video.font_path : NULL; + + if (!menu_display_init_main_font(menu, font_path, menu->display.font.size)) + RARCH_ERR("Failed to load font."); +} + static void glui_layout(menu_handle_t *menu, glui_handle_t *glui) { + menu_display_t *disp = menu_display_get_ptr(); float scale_factor, glyph_width; unsigned width, height; video_driver_get_size(&width, &height); @@ -528,6 +540,17 @@ static void glui_layout(menu_handle_t *menu, glui_handle_t *glui) /* we assume the average glyph aspect ratio is close to 3:4 */ glyph_width = menu->display.font.size * 3/4; glui->ticker_limit = (width/2) / glyph_width; + + glui_font(menu); + + if (disp && disp->font.buf) /* calculate a more realistic ticker_limit */ + { + driver_t *driver = driver_get_ptr(); + int m_width = driver->font_osd_driver->get_message_width(disp->font.buf, "M", 1, 1); + + if (m_width) + glui->ticker_limit = (width / 2) / m_width - 2; + } } static void *glui_init(void) @@ -717,17 +740,6 @@ static void glui_populate_entries(const char *path, menu->scroll_y = glui_get_scroll(); } -static void glui_font(menu_handle_t *menu) -{ - settings_t *settings = config_get_ptr(); - const char *font_path = NULL; - - font_path = settings->video.font_enable ? settings->video.font_path : NULL; - - if (!menu_display_init_main_font(menu, font_path, menu->display.font.size)) - RARCH_ERR("Failed to load font."); -} - static void glui_context_reset(void) { glui_handle_t *glui = NULL; @@ -740,7 +752,6 @@ static void glui_context_reset(void) glui = (glui_handle_t*)menu->userdata; glui_layout(menu, glui); - glui_font(menu); glui_context_bg_destroy(glui); glui_allocate_white_texture(glui); From 9b019dbc1ed7985408fbfd4cdb08bfbf67278d00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Higor=20Eur=C3=ADpedes?= Date: Wed, 15 Jul 2015 18:50:36 -0300 Subject: [PATCH 3/7] (GLUI) Always query dpi --- menu/drivers/glui.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/menu/drivers/glui.c b/menu/drivers/glui.c index ce5910b9c4..0c85ced9f3 100644 --- a/menu/drivers/glui.c +++ b/menu/drivers/glui.c @@ -527,11 +527,7 @@ static void glui_layout(menu_handle_t *menu, glui_handle_t *glui) resolution, so we should be dpi aware to ensure the entries hitboxes are big enough. On desktops, we just care about readability, with every widget size proportional to the display width. */ -#ifdef RARCH_MOBILE scale_factor = menu_display_get_dpi(); -#else - scale_factor = width / 7.5; -#endif glui->line_height = scale_factor / 3; glui->margin = scale_factor / 6; From 615b8b39f1a9e96886801ae0e7f04505860a12f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Higor=20Eur=C3=ADpedes?= Date: Wed, 15 Jul 2015 18:56:24 -0300 Subject: [PATCH 4/7] (GLUI) Cleanup glui_render_menu_list() --- menu/drivers/glui.c | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/menu/drivers/glui.c b/menu/drivers/glui.c index 0c85ced9f3..9874de7af4 100644 --- a/menu/drivers/glui.c +++ b/menu/drivers/glui.c @@ -331,33 +331,29 @@ static void glui_render_menu_list(glui_handle_t *glui, { bool entry_selected; menu_entry_t entry; - char message[PATH_MAX_LENGTH]; - char entry_title_buf[PATH_MAX_LENGTH]; - char type_str_buf[PATH_MAX_LENGTH]; + char label_str[PATH_MAX_LENGTH]; + char value_str[PATH_MAX_LENGTH]; int y = disp->header_height - menu->scroll_y + (glui->line_height * i); if (y > (int)height || ((y + (int)glui->line_height) < 0)) continue; - message[0] = '\0'; - entry_title_buf[0] = '\0'; - type_str_buf[0] = '\0'; + label_str[0] = '\0'; + value_str[0] = '\0'; menu_entries_get(i, &entry); entry_selected = entries->navigation.selection_ptr == i; - menu_animation_ticker_line(entry_title_buf, glui->ticker_limit, + menu_animation_ticker_line(label_str, glui->ticker_limit, frame_count / 40, entry.path, entry_selected); - menu_animation_ticker_line(type_str_buf, glui->ticker_limit, + menu_animation_ticker_line(value_str, glui->ticker_limit, frame_count / 40, entry.value, entry_selected); - strlcpy(message, entry_title_buf, sizeof(message)); - - glui_blit_line(glui->margin, y, message, + glui_blit_line(glui->margin, y, label_str, entry_selected ? hover_color : normal_color, TEXT_ALIGN_LEFT); - glui_blit_line(width - glui->margin, y, type_str_buf, + glui_blit_line(width - glui->margin, y, value_str, entry_selected ? hover_color : normal_color, TEXT_ALIGN_RIGHT); } } From 06838d044f9d806e1371240c2d1db0247c5c9af5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Higor=20Eur=C3=ADpedes?= Date: Wed, 15 Jul 2015 19:27:19 -0300 Subject: [PATCH 5/7] (GLUI) Create glui_render_label_value() --- menu/drivers/glui.c | 35 ++++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/menu/drivers/glui.c b/menu/drivers/glui.c index 9874de7af4..3f4e1e9606 100644 --- a/menu/drivers/glui.c +++ b/menu/drivers/glui.c @@ -308,6 +308,22 @@ static void glui_render(void) menu_entries_set_start(menu->scroll_y / glui->line_height); } +static void glui_render_label_value(glui_handle_t *glui, int y, unsigned width, + uint64_t index, uint32_t color, bool selected, const char *label, const char *value) +{ + char label_str[PATH_MAX_LENGTH]; + char value_str[PATH_MAX_LENGTH]; + + label_str[0] = '\0'; + value_str[0] = '\0'; + + menu_animation_ticker_line(label_str, glui->ticker_limit, index, label, selected); + menu_animation_ticker_line(value_str, glui->ticker_limit, index, value, selected); + + glui_blit_line(glui->margin, y, label_str, color, TEXT_ALIGN_LEFT); + glui_blit_line(width - glui->margin, y, value_str, color, TEXT_ALIGN_RIGHT); +} + static void glui_render_menu_list(glui_handle_t *glui, menu_handle_t *menu, uint32_t normal_color, @@ -331,30 +347,19 @@ static void glui_render_menu_list(glui_handle_t *glui, { bool entry_selected; menu_entry_t entry; - char label_str[PATH_MAX_LENGTH]; - char value_str[PATH_MAX_LENGTH]; + int y = disp->header_height - menu->scroll_y + (glui->line_height * i); if (y > (int)height || ((y + (int)glui->line_height) < 0)) continue; - label_str[0] = '\0'; - value_str[0] = '\0'; - menu_entries_get(i, &entry); entry_selected = entries->navigation.selection_ptr == i; - menu_animation_ticker_line(label_str, glui->ticker_limit, - frame_count / 40, entry.path, entry_selected); - menu_animation_ticker_line(value_str, glui->ticker_limit, - frame_count / 40, entry.value, entry_selected); - - glui_blit_line(glui->margin, y, label_str, - entry_selected ? hover_color : normal_color, TEXT_ALIGN_LEFT); - - glui_blit_line(width - glui->margin, y, value_str, - entry_selected ? hover_color : normal_color, TEXT_ALIGN_RIGHT); + glui_render_label_value(glui, y, width, frame_count / 40, + entry_selected ? hover_color : normal_color, entry_selected, + entry.path, entry.value); } } From b217bbad2459b650e044788f5be57564246ecbbf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Higor=20Eur=C3=ADpedes?= Date: Wed, 15 Jul 2015 20:00:56 -0300 Subject: [PATCH 6/7] (menu_animation) Create menu_animation_ticker_generic --- menu/drivers/glui.c | 6 ++-- menu/drivers/rgui.c | 6 ++-- menu/drivers/rmenu.c | 6 ++-- menu/drivers/rmenu_xui.cpp | 2 +- menu/drivers/xmb.c | 4 +-- menu/menu_animation.c | 70 ++++++++++++++++++++++---------------- menu/menu_animation.h | 7 ++-- 7 files changed, 57 insertions(+), 44 deletions(-) diff --git a/menu/drivers/glui.c b/menu/drivers/glui.c index 3f4e1e9606..a54a0ce9fc 100644 --- a/menu/drivers/glui.c +++ b/menu/drivers/glui.c @@ -317,8 +317,8 @@ static void glui_render_label_value(glui_handle_t *glui, int y, unsigned width, label_str[0] = '\0'; value_str[0] = '\0'; - menu_animation_ticker_line(label_str, glui->ticker_limit, index, label, selected); - menu_animation_ticker_line(value_str, glui->ticker_limit, index, value, selected); + menu_animation_ticker_str(label_str, glui->ticker_limit, index, label, selected); + menu_animation_ticker_str(value_str, glui->ticker_limit, index, value, selected); glui_blit_line(glui->margin, y, label_str, color, TEXT_ALIGN_LEFT); glui_blit_line(width - glui->margin, y, value_str, color, TEXT_ALIGN_RIGHT); @@ -430,7 +430,7 @@ static void glui_frame(void) glui_render_quad(gl, 0, 0, width, disp->header_height, 0.2, 0.2, 0.2, 1); - menu_animation_ticker_line(title_buf, glui->ticker_limit, + menu_animation_ticker_str(title_buf, glui->ticker_limit, frame_count / 100, title, true); glui_blit_line(width / 2, 0, title_buf, title_color, TEXT_ALIGN_CENTER); diff --git a/menu/drivers/rgui.c b/menu/drivers/rgui.c index 6b707d2105..3fc25e3be1 100644 --- a/menu/drivers/rgui.c +++ b/menu/drivers/rgui.c @@ -466,7 +466,7 @@ static void rgui_render(void) menu_entries_get_title(title, sizeof(title)); - menu_animation_ticker_line(title_buf, RGUI_TERM_WIDTH - 10, + menu_animation_ticker_str(title_buf, RGUI_TERM_WIDTH - 10, frame_count / RGUI_TERM_START_X, title, true); hover_color = HOVER_COLOR(settings); @@ -527,9 +527,9 @@ static void rgui_render(void) menu_entry_get_value(i, entry_value, sizeof(entry_value)); menu_entry_get_path(i, entry_path, sizeof(entry_path)); - menu_animation_ticker_line(entry_title_buf, RGUI_TERM_WIDTH - (entry_spacing + 1 + 2), + menu_animation_ticker_str(entry_title_buf, RGUI_TERM_WIDTH - (entry_spacing + 1 + 2), frame_count / RGUI_TERM_START_X, entry_path, entry_selected); - menu_animation_ticker_line(type_str_buf, entry_spacing, + menu_animation_ticker_str(type_str_buf, entry_spacing, frame_count / RGUI_TERM_START_X, entry_value, entry_selected); diff --git a/menu/drivers/rmenu.c b/menu/drivers/rmenu.c index 5cbeb3d511..b70529018f 100644 --- a/menu/drivers/rmenu.c +++ b/menu/drivers/rmenu.c @@ -171,7 +171,7 @@ static void rmenu_render(void) menu_entries_get_title(title, sizeof(title)); - menu_animation_ticker_line(title_buf, RMENU_TERM_WIDTH, + menu_animation_ticker_str(title_buf, RMENU_TERM_WIDTH, frame_count / 15, title, true); font_parms.x = POSITION_EDGE_MIN + POSITION_OFFSET; @@ -206,9 +206,9 @@ static void rmenu_render(void) menu_entry_get_value(i, entry_value, sizeof(entry_value)); menu_entry_get_path(i, entry_path, sizeof(entry_path)); - menu_animation_ticker_line(entry_title_buf, RMENU_TERM_WIDTH - (entry_spacing + 1 + 2), + menu_animation_ticker_str(entry_title_buf, RMENU_TERM_WIDTH - (entry_spacing + 1 + 2), frame_count / 15, entry_path, entry_selected); - menu_animation_ticker_line(type_str_buf, entry_spacing, + menu_animation_ticker_str(type_str_buf, entry_spacing, frame_count / 15, entry_value, entry_selected); snprintf(message, sizeof(message), "%c %s", diff --git a/menu/drivers/rmenu_xui.cpp b/menu/drivers/rmenu_xui.cpp index 8d2535de59..4ca06b9dd7 100644 --- a/menu/drivers/rmenu_xui.cpp +++ b/menu/drivers/rmenu_xui.cpp @@ -560,7 +560,7 @@ static void rmenu_xui_render(void) menu_entries_get_title(title, sizeof(title)); mbstowcs(strw_buffer, title, sizeof(strw_buffer) / sizeof(wchar_t)); XuiTextElementSetText(m_menutitle, strw_buffer); - menu_animation_ticker_line(title, RXUI_TERM_WIDTH - 3, (unsigned int)frame_count / 15, title, true); + menu_animation_ticker_str(title, RXUI_TERM_WIDTH - 3, (unsigned int)frame_count / 15, title, true); } if (XuiHandleIsValid(m_menutitle)) diff --git a/menu/drivers/xmb.c b/menu/drivers/xmb.c index 5c93536bdd..e08491f32b 100644 --- a/menu/drivers/xmb.c +++ b/menu/drivers/xmb.c @@ -1388,7 +1388,7 @@ static void xmb_draw_items(xmb_handle_t *xmb, gl_t *gl, ticker_limit = 70; } - menu_animation_ticker_line(name, ticker_limit, + menu_animation_ticker_str(name, ticker_limit, frame_count / 20, entry.path, (i == current)); @@ -1398,7 +1398,7 @@ static void xmb_draw_items(xmb_handle_t *xmb, gl_t *gl, xmb->margins.screen.top + node->y + xmb->margins.label.top, 1, node->label_alpha, TEXT_ALIGN_LEFT); - menu_animation_ticker_line(value, 35, + menu_animation_ticker_str(value, 35, frame_count / 20, entry.value, (i == current)); diff --git a/menu/menu_animation.c b/menu/menu_animation.c index 3b801166ea..8a9e627d8b 100644 --- a/menu/menu_animation.c +++ b/menu/menu_animation.c @@ -545,8 +545,42 @@ bool menu_animation_update(menu_animation_t *anim, float dt) return true; } +void menu_animation_ticker_generic(uint64_t idx, int max_width, + int *offset, int *width) +{ + int ticker_period, phase, phase_left_stop; + int phase_left_moving, phase_right_stop; + int left_offset, right_offset; + + *offset = 0; + + if (*width <= max_width) + return; + + ticker_period = 2 * (*width - max_width) + 4; + phase = idx % ticker_period; + + phase_left_stop = 2; + phase_left_moving = phase_left_stop + (*width - max_width); + phase_right_stop = phase_left_moving + 2; + + left_offset = phase - phase_left_stop; + right_offset = (*width - max_width) - (phase - phase_right_stop); + + if (phase < phase_left_stop) + *offset = 0; + else if (phase < phase_left_moving) + *offset = -left_offset; + else if (phase < phase_right_stop) + *offset = -(*width - max_width); + else + *offset = -right_offset; + + *width = max_width; +} + /** - * menu_animation_ticker_line: + * menu_animation_ticker_str: * @s : buffer to write new message line to. * @len : length of buffer @input. * @idx : Index. Will be used for ticker logic. @@ -556,14 +590,12 @@ bool menu_animation_update(menu_animation_t *anim, float dt) * Take the contents of @str and apply a ticker effect to it, * and write the results in @s. **/ -void menu_animation_ticker_line(char *s, size_t len, uint64_t idx, +void menu_animation_ticker_str(char *s, size_t len, uint64_t idx, const char *str, bool selected) { - unsigned ticker_period, phase, phase_left_stop; - unsigned phase_left_moving, phase_right_stop; - unsigned left_offset, right_offset; - size_t str_len = strlen(str); menu_animation_t *anim = menu_animation_get_ptr(); + int str_len = strlen(str); + int offset = 0; if (str_len <= len) { @@ -578,31 +610,9 @@ void menu_animation_ticker_line(char *s, size_t len, uint64_t idx, return; } - /* Wrap long strings in options with some kind of ticker line. */ - ticker_period = 2 * (str_len - len) + 4; - phase = idx % ticker_period; + menu_animation_ticker_generic(idx, len, &offset, &str_len); - phase_left_stop = 2; - phase_left_moving = phase_left_stop + (str_len - len); - phase_right_stop = phase_left_moving + 2; - - left_offset = phase - phase_left_stop; - right_offset = (str_len - len) - (phase - phase_right_stop); - - /* Ticker period: - * [Wait at left (2 ticks), - * Progress to right(type_len - w), - * Wait at right (2 ticks), - * Progress to left]. - */ - if (phase < phase_left_stop) - strlcpy(s, str, len + 1); - else if (phase < phase_left_moving) - strlcpy(s, str + left_offset, len + 1); - else if (phase < phase_right_stop) - strlcpy(s, str + str_len - len, len + 1); - else - strlcpy(s, str + right_offset, len + 1); + strlcpy(s, str - offset, str_len + 1); anim->is_active = true; } diff --git a/menu/menu_animation.h b/menu/menu_animation.h index 8d337afccd..48dd715e06 100644 --- a/menu/menu_animation.h +++ b/menu/menu_animation.h @@ -135,7 +135,7 @@ bool menu_animation_update( float dt); /** - * menu_animation_ticker_line: + * menu_animation_ticker_str: * @s : buffer to write new message line to. * @len : length of buffer @input. * @idx : Index. Will be used for ticker logic. @@ -145,9 +145,12 @@ bool menu_animation_update( * Take the contents of @str and apply a ticker effect to it, * and write the results in @s. **/ -void menu_animation_ticker_line(char *s, size_t len, uint64_t tick, +void menu_animation_ticker_str(char *s, size_t len, uint64_t tick, const char *str, bool selected); +void menu_animation_ticker_generic(uint64_t idx, int max_width, + int *offset, int *width); + menu_animation_t *menu_animation_get_ptr(void); void menu_animation_update_time(menu_animation_t *anim); From ec00f709f70b1588850af0ac380094a11255a4c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Higor=20Eur=C3=ADpedes?= Date: Wed, 15 Jul 2015 20:55:43 -0300 Subject: [PATCH 7/7] (GLUI) Give more room to labels when possible --- menu/drivers/glui.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/menu/drivers/glui.c b/menu/drivers/glui.c index a54a0ce9fc..290e6e1503 100644 --- a/menu/drivers/glui.c +++ b/menu/drivers/glui.c @@ -313,11 +313,17 @@ static void glui_render_label_value(glui_handle_t *glui, int y, unsigned width, { char label_str[PATH_MAX_LENGTH]; char value_str[PATH_MAX_LENGTH]; + int label_limit = glui->ticker_limit; + int value_len = strlen(value); label_str[0] = '\0'; value_str[0] = '\0'; - menu_animation_ticker_str(label_str, glui->ticker_limit, index, label, selected); + /* resize label boundary to fit more on the screen */ + if (value_len + 2 < glui->ticker_limit) + label_limit += (int)glui->ticker_limit - (value_len + 2); + + menu_animation_ticker_str(label_str, label_limit, index, label, selected); menu_animation_ticker_str(value_str, glui->ticker_limit, index, value, selected); glui_blit_line(glui->margin, y, label_str, color, TEXT_ALIGN_LEFT);