mirror of
https://github.com/libretro/RetroArch
synced 2025-04-10 15:45:19 +00:00
(MaterialUI) DPI changes should now be applied on-the-fly
This commit is contained in:
parent
74fc2ecb37
commit
2ca1b01fcc
@ -409,6 +409,74 @@ end:
|
|||||||
string_list_free(list);
|
string_list_free(list);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void mui_font(menu_handle_t *menu)
|
||||||
|
{
|
||||||
|
int font_size;
|
||||||
|
char mediapath[PATH_MAX_LENGTH], fontpath[PATH_MAX_LENGTH];
|
||||||
|
settings_t *settings = config_get_ptr();
|
||||||
|
|
||||||
|
menu_display_ctl(MENU_DISPLAY_CTL_FONT_SIZE, &font_size);
|
||||||
|
|
||||||
|
fill_pathname_join(mediapath, settings->assets_directory, "glui", sizeof(mediapath));
|
||||||
|
fill_pathname_join(fontpath, mediapath, "Roboto-Regular.ttf", sizeof(fontpath));
|
||||||
|
|
||||||
|
if (!menu_display_init_main_font(menu, fontpath, font_size))
|
||||||
|
RARCH_WARN("Failed to load font.");
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool mui_layout(menu_handle_t *menu, mui_handle_t *mui)
|
||||||
|
{
|
||||||
|
void *fb_buf;
|
||||||
|
static float old_scale_factor = 0.0f;
|
||||||
|
float scale_factor;
|
||||||
|
int new_font_size;
|
||||||
|
unsigned width, height, new_header_height;
|
||||||
|
|
||||||
|
video_driver_get_size(&width, &height);
|
||||||
|
|
||||||
|
/* Mobiles platforms may have very small display metrics coupled to a high
|
||||||
|
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. */
|
||||||
|
menu_display_ctl(MENU_DISPLAY_CTL_GET_DPI, &scale_factor);
|
||||||
|
|
||||||
|
if (old_scale_factor == scale_factor)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
old_scale_factor = scale_factor;
|
||||||
|
|
||||||
|
new_header_height = scale_factor / 3;
|
||||||
|
new_font_size = scale_factor / 9;
|
||||||
|
|
||||||
|
mui->shadow_height = scale_factor / 36;
|
||||||
|
mui->scrollbar_width = scale_factor / 36;
|
||||||
|
mui->tabs_height = scale_factor / 3;
|
||||||
|
mui->line_height = scale_factor / 3;
|
||||||
|
mui->margin = scale_factor / 9;
|
||||||
|
mui->icon_size = scale_factor / 3;
|
||||||
|
|
||||||
|
menu_display_ctl(MENU_DISPLAY_CTL_SET_HEADER_HEIGHT, &new_header_height);
|
||||||
|
menu_display_ctl(MENU_DISPLAY_CTL_SET_FONT_SIZE, &new_font_size);
|
||||||
|
|
||||||
|
/* we assume the average glyph aspect ratio is close to 3:4 */
|
||||||
|
mui->glyph_width = new_font_size * 3/4;
|
||||||
|
|
||||||
|
mui_font(menu);
|
||||||
|
|
||||||
|
menu_display_ctl(MENU_DISPLAY_CTL_FONT_BUF, &fb_buf);
|
||||||
|
|
||||||
|
if (fb_buf) /* calculate a more realistic ticker_limit */
|
||||||
|
{
|
||||||
|
driver_t *driver = driver_get_ptr();
|
||||||
|
unsigned m_width = driver->font_osd_driver->get_message_width(fb_buf, "a", 1, 1);
|
||||||
|
|
||||||
|
if (m_width)
|
||||||
|
mui->glyph_width = m_width;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
static void mui_render(void)
|
static void mui_render(void)
|
||||||
{
|
{
|
||||||
float delta_time, dt;
|
float delta_time, dt;
|
||||||
@ -757,6 +825,9 @@ static void mui_frame(void)
|
|||||||
title[0] = '\0';
|
title[0] = '\0';
|
||||||
title_buf[0] = '\0';
|
title_buf[0] = '\0';
|
||||||
|
|
||||||
|
if (mui_layout(menu, mui))
|
||||||
|
return;
|
||||||
|
|
||||||
video_driver_get_size(&width, &height);
|
video_driver_get_size(&width, &height);
|
||||||
|
|
||||||
menu_display_ctl(MENU_DISPLAY_CTL_SET_VIEWPORT, NULL);
|
menu_display_ctl(MENU_DISPLAY_CTL_SET_VIEWPORT, NULL);
|
||||||
@ -889,6 +960,7 @@ static void mui_frame(void)
|
|||||||
mui_draw_cursor(mui, &white_bg[0], mouse_x, mouse_y, width, height);
|
mui_draw_cursor(mui, &white_bg[0], mouse_x, mouse_y, width, height);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
menu_display_restore_clear_color();
|
menu_display_restore_clear_color();
|
||||||
menu_display_ctl(MENU_DISPLAY_CTL_UNSET_VIEWPORT, NULL);
|
menu_display_ctl(MENU_DISPLAY_CTL_UNSET_VIEWPORT, NULL);
|
||||||
}
|
}
|
||||||
@ -906,65 +978,7 @@ static void mui_allocate_white_texture(mui_handle_t *mui)
|
|||||||
TEXTURE_FILTER_NEAREST);
|
TEXTURE_FILTER_NEAREST);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void mui_font(menu_handle_t *menu)
|
|
||||||
{
|
|
||||||
int font_size;
|
|
||||||
char mediapath[PATH_MAX_LENGTH], fontpath[PATH_MAX_LENGTH];
|
|
||||||
settings_t *settings = config_get_ptr();
|
|
||||||
|
|
||||||
menu_display_ctl(MENU_DISPLAY_CTL_FONT_SIZE, &font_size);
|
|
||||||
|
|
||||||
fill_pathname_join(mediapath, settings->assets_directory, "glui", sizeof(mediapath));
|
|
||||||
fill_pathname_join(fontpath, mediapath, "Roboto-Regular.ttf", sizeof(fontpath));
|
|
||||||
|
|
||||||
if (!menu_display_init_main_font(menu, fontpath, font_size))
|
|
||||||
RARCH_WARN("Failed to load font.");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void mui_layout(menu_handle_t *menu, mui_handle_t *mui)
|
|
||||||
{
|
|
||||||
void *fb_buf;
|
|
||||||
float scale_factor;
|
|
||||||
int new_font_size;
|
|
||||||
unsigned width, height, new_header_height;
|
|
||||||
|
|
||||||
video_driver_get_size(&width, &height);
|
|
||||||
|
|
||||||
/* Mobiles platforms may have very small display metrics coupled to a high
|
|
||||||
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. */
|
|
||||||
menu_display_ctl(MENU_DISPLAY_CTL_GET_DPI, &scale_factor);
|
|
||||||
|
|
||||||
new_header_height = scale_factor / 3;
|
|
||||||
new_font_size = scale_factor / 9;
|
|
||||||
|
|
||||||
mui->shadow_height = scale_factor / 36;
|
|
||||||
mui->scrollbar_width = scale_factor / 36;
|
|
||||||
mui->tabs_height = scale_factor / 3;
|
|
||||||
mui->line_height = scale_factor / 3;
|
|
||||||
mui->margin = scale_factor / 9;
|
|
||||||
mui->icon_size = scale_factor / 3;
|
|
||||||
|
|
||||||
menu_display_ctl(MENU_DISPLAY_CTL_SET_HEADER_HEIGHT, &new_header_height);
|
|
||||||
menu_display_ctl(MENU_DISPLAY_CTL_SET_FONT_SIZE, &new_font_size);
|
|
||||||
|
|
||||||
/* we assume the average glyph aspect ratio is close to 3:4 */
|
|
||||||
mui->glyph_width = new_font_size * 3/4;
|
|
||||||
|
|
||||||
mui_font(menu);
|
|
||||||
|
|
||||||
menu_display_ctl(MENU_DISPLAY_CTL_FONT_BUF, &fb_buf);
|
|
||||||
|
|
||||||
if (fb_buf) /* calculate a more realistic ticker_limit */
|
|
||||||
{
|
|
||||||
driver_t *driver = driver_get_ptr();
|
|
||||||
unsigned m_width = driver->font_osd_driver->get_message_width(fb_buf, "a", 1, 1);
|
|
||||||
|
|
||||||
if (m_width)
|
|
||||||
mui->glyph_width = m_width;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void *mui_init(void)
|
static void *mui_init(void)
|
||||||
{
|
{
|
||||||
|
@ -161,7 +161,7 @@ bool menu_display_font_flush_block(void *data, const void *font_data)
|
|||||||
(const struct font_renderer*)font_data;
|
(const struct font_renderer*)font_data;
|
||||||
menu_handle_t *menu = (menu_handle_t*)data;
|
menu_handle_t *menu = (menu_handle_t*)data;
|
||||||
menu_display_t *disp = menu_display_get_ptr();
|
menu_display_t *disp = menu_display_get_ptr();
|
||||||
if (!font_driver || !font_driver->flush)
|
if (!font_driver || !font_driver->flush || !disp || !disp->font.buf)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
font_driver->flush(disp->font.buf);
|
font_driver->flush(disp->font.buf);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user