From a4590acde9173de077eb9f55c9bb01859f5b8867 Mon Sep 17 00:00:00 2001 From: parport0 Date: Thu, 11 Jun 2020 15:08:13 +0300 Subject: [PATCH] Add options for moving the on-screen overlay --- configuration.c | 2 ++ configuration.h | 2 ++ input/input_overlay.h | 2 ++ intl/msg_hash_lbl.h | 8 ++++++++ intl/msg_hash_us.c | 8 ++++++++ intl/msg_hash_us.h | 18 ++++++++++++++++++ menu/cbs/menu_cbs_sublabel.c | 8 ++++++++ menu/menu_displaylist.c | 4 ++++ menu/menu_setting.c | 34 ++++++++++++++++++++++++++++++++++ msg_hash.h | 2 ++ retroarch.c | 26 ++++++++++++++++++++------ retroarch.cfg | 4 ++++ tasks/task_overlay.c | 22 +++++++++++++++------- tasks/tasks_internal.h | 2 ++ 14 files changed, 129 insertions(+), 13 deletions(-) diff --git a/configuration.c b/configuration.c index 91f4b33a1a..f43fcf6b02 100644 --- a/configuration.c +++ b/configuration.c @@ -1705,6 +1705,8 @@ static struct config_float_setting *populate_settings_float( #ifdef HAVE_OVERLAY SETTING_FLOAT("input_overlay_opacity", &settings->floats.input_overlay_opacity, true, DEFAULT_INPUT_OVERLAY_OPACITY, false); SETTING_FLOAT("input_overlay_scale", &settings->floats.input_overlay_scale, true, 1.0f, false); + SETTING_FLOAT("input_overlay_center_x", &settings->floats.input_overlay_center_x, true, 0.5f, false); + SETTING_FLOAT("input_overlay_center_y", &settings->floats.input_overlay_center_y, true, 0.5f, false); #endif #ifdef HAVE_MENU SETTING_FLOAT("menu_scale_factor", &settings->floats.menu_scale_factor, true, DEFAULT_MENU_SCALE_FACTOR, false); diff --git a/configuration.h b/configuration.h index ce761b789b..ff75c10806 100644 --- a/configuration.h +++ b/configuration.h @@ -437,6 +437,8 @@ typedef struct settings float input_overlay_opacity; float input_overlay_scale; + float input_overlay_center_x; + float input_overlay_center_y; float slowmotion_ratio; float fastforward_ratio; diff --git a/input/input_overlay.h b/input/input_overlay.h index 655757ca3a..aebf91fbca 100644 --- a/input/input_overlay.h +++ b/input/input_overlay.h @@ -203,6 +203,8 @@ typedef struct size_t size; float overlay_opacity; float overlay_scale; + float overlay_center_x; + float overlay_center_y; struct overlay *overlays; struct overlay *active; } overlay_task_data_t; diff --git a/intl/msg_hash_lbl.h b/intl/msg_hash_lbl.h index 9457ac2868..b17d9ed533 100644 --- a/intl/msg_hash_lbl.h +++ b/intl/msg_hash_lbl.h @@ -1922,6 +1922,14 @@ MSG_HASH( MENU_ENUM_LABEL_OVERLAY_SCALE, "input_overlay_scale" ) +MSG_HASH( + MENU_ENUM_LABEL_OVERLAY_CENTER_X, + "input_overlay_center_x" + ) +MSG_HASH( + MENU_ENUM_LABEL_OVERLAY_CENTER_Y, + "input_overlay_center_y" + ) MSG_HASH( MENU_ENUM_LABEL_PAL60_ENABLE, "pal60_enable" diff --git a/intl/msg_hash_us.c b/intl/msg_hash_us.c index 7fd7d525b9..3ac2835683 100644 --- a/intl/msg_hash_us.c +++ b/intl/msg_hash_us.c @@ -659,6 +659,14 @@ int menu_hash_get_help_us_enum(enum msg_hash_enums msg, char *s, size_t len) snprintf(s, len, "Overlay scale."); break; + case MENU_ENUM_LABEL_OVERLAY_CENTER_X: + snprintf(s, len, + "Overlay X offset."); + break; + case MENU_ENUM_LABEL_OVERLAY_CENTER_Y: + snprintf(s, len, + "Overlay Y offset."); + break; case MENU_ENUM_LABEL_AUDIO_OUTPUT_RATE: snprintf(s, len, "Audio output samplerate."); diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index 1611fd094b..b819bddbe4 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -3055,6 +3055,24 @@ MSG_HASH( "Scale of all UI elements of the overlay." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_OVERLAY_CENTER_X, + "Overlay Offset X" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_OVERLAY_CENTER_X, + "X offset of all UI elements of the overlay." + ) + +MSG_HASH( + MENU_ENUM_LABEL_VALUE_OVERLAY_CENTER_Y, + "Overlay Offset Y" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_OVERLAY_CENTER_Y, + "Y offset of all UI elements of the overlay." + ) + /* Settings > On-Screen Display > Video Layout */ MSG_HASH( diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index f2c3b4a3f5..a0aab21ef8 100644 --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -418,6 +418,8 @@ DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_audio_wasapi_float_format, MENU_ DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_audio_wasapi_sh_buffer_length, MENU_ENUM_SUBLABEL_AUDIO_WASAPI_SH_BUFFER_LENGTH) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_overlay_opacity, MENU_ENUM_SUBLABEL_OVERLAY_OPACITY) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_overlay_scale, MENU_ENUM_SUBLABEL_OVERLAY_SCALE) +DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_overlay_center_x, MENU_ENUM_SUBLABEL_OVERLAY_CENTER_X) +DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_overlay_center_y, MENU_ENUM_SUBLABEL_OVERLAY_CENTER_Y) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_overlay_enable, MENU_ENUM_SUBLABEL_INPUT_OVERLAY_ENABLE) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_overlay_preset, MENU_ENUM_SUBLABEL_OVERLAY_PRESET) #ifdef HAVE_VIDEO_LAYOUT @@ -2351,6 +2353,12 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_OVERLAY_SCALE: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_overlay_scale); break; + case MENU_ENUM_LABEL_OVERLAY_CENTER_X: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_overlay_center_x); + break; + case MENU_ENUM_LABEL_OVERLAY_CENTER_Y: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_overlay_center_y); + break; #ifdef HAVE_VIDEO_LAYOUT case MENU_ENUM_LABEL_VIDEO_LAYOUT_ENABLE: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_video_layout_enable); diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index df68ae5806..7ef556215e 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -6749,6 +6749,8 @@ unsigned menu_displaylist_build_list( {MENU_ENUM_LABEL_OVERLAY_PRESET, PARSE_ONLY_PATH, false }, {MENU_ENUM_LABEL_OVERLAY_OPACITY, PARSE_ONLY_FLOAT, false }, {MENU_ENUM_LABEL_OVERLAY_SCALE, PARSE_ONLY_FLOAT, false }, + {MENU_ENUM_LABEL_OVERLAY_CENTER_X, PARSE_ONLY_FLOAT, false }, + {MENU_ENUM_LABEL_OVERLAY_CENTER_Y, PARSE_ONLY_FLOAT, false }, }; for (i = 0; i < ARRAY_SIZE(build_list); i++) @@ -6763,6 +6765,8 @@ unsigned menu_displaylist_build_list( case MENU_ENUM_LABEL_OVERLAY_PRESET: case MENU_ENUM_LABEL_OVERLAY_OPACITY: case MENU_ENUM_LABEL_OVERLAY_SCALE: + case MENU_ENUM_LABEL_OVERLAY_CENTER_X: + case MENU_ENUM_LABEL_OVERLAY_CENTER_Y: if (input_overlay_enable) build_list[i].checked = true; break; diff --git a/menu/menu_setting.c b/menu/menu_setting.c index 9250bd7570..4cf1769c7c 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -12621,6 +12621,40 @@ static bool setting_append_list( menu_settings_list_current_add_range(list, list_info, 0, 2, 0.01, true, true); SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_CMD_APPLY_AUTO); + CONFIG_FLOAT( + list, list_info, + &settings->floats.input_overlay_center_x, + MENU_ENUM_LABEL_OVERLAY_CENTER_X, + MENU_ENUM_LABEL_VALUE_OVERLAY_CENTER_X, + 0.5f, + "%.2f", + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler); + (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint; + MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_OVERLAY_SET_SCALE_FACTOR); + menu_settings_list_current_add_range(list, list_info, 0, 1, 0.01, true, true); + SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_CMD_APPLY_AUTO); + + CONFIG_FLOAT( + list, list_info, + &settings->floats.input_overlay_center_y, + MENU_ENUM_LABEL_OVERLAY_CENTER_Y, + MENU_ENUM_LABEL_VALUE_OVERLAY_CENTER_Y, + 0.5f, + "%.2f", + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler); + (*list)[list_info->index - 1].action_ok = &setting_action_ok_uint; + MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, CMD_EVENT_OVERLAY_SET_SCALE_FACTOR); + menu_settings_list_current_add_range(list, list_info, 0, 1, 0.01, true, true); + SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_CMD_APPLY_AUTO); + END_SUB_GROUP(list, list_info, parent_group); START_SUB_GROUP(list, list_info, "Onscreen Keyboard Overlay", &group_info, &subgroup_info, parent_group); diff --git a/msg_hash.h b/msg_hash.h index 7f55cc7832..fccb693037 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -1687,6 +1687,8 @@ enum msg_hash_enums MENU_LABEL(NETPLAY_MODE), MENU_LABEL(PERFCNT_ENABLE), MENU_LABEL(OVERLAY_SCALE), + MENU_LABEL(OVERLAY_CENTER_X), + MENU_LABEL(OVERLAY_CENTER_Y), MENU_LABEL(OVERLAY_PRESET), MENU_LABEL(OVERLAY_OPACITY), diff --git a/retroarch.c b/retroarch.c index 31ee35d835..e2ea6cfc1e 100644 --- a/retroarch.c +++ b/retroarch.c @@ -2656,7 +2656,8 @@ static void retroarch_overlay_init(struct rarch_state *p_rarch); static void retroarch_overlay_deinit(struct rarch_state *p_rarch); static void input_overlay_set_alpha_mod(struct rarch_state *p_rarch, input_overlay_t *ol, float mod); -static void input_overlay_set_scale_factor(input_overlay_t *ol, float scale); +static void input_overlay_set_scale_factor(input_overlay_t *ol, float scale, + float center_x, float center_y); static void input_overlay_load_active( struct rarch_state *p_rarch, input_overlay_t *ol, float opacity); @@ -14814,7 +14815,10 @@ bool command_event(enum event_command cmd, void *data) #ifdef HAVE_OVERLAY { float input_overlay_scale = settings->floats.input_overlay_scale; - input_overlay_set_scale_factor(p_rarch->overlay_ptr, input_overlay_scale); + float input_overlay_c_x = settings->floats.input_overlay_center_x; + float input_overlay_c_y = settings->floats.input_overlay_center_y; + input_overlay_set_scale_factor(p_rarch->overlay_ptr, + input_overlay_scale, input_overlay_c_x, input_overlay_c_y); } #endif break; @@ -20687,13 +20691,17 @@ static bool input_overlay_add_inputs(input_overlay_t *ol, * Scales overlay and all its associated descriptors * by a given scaling factor (@scale). **/ -static void input_overlay_scale(struct overlay *ol, float scale) +static void input_overlay_scale(struct overlay *ol, float scale, float center_x, + float center_y) { size_t i; if (ol->block_scale) scale = 1.0f; + ol->center_x = ol->x + center_x * ol->w; + ol->center_y = ol->y + center_y * ol->h; + ol->scale = scale; ol->mod_w = ol->w * scale; ol->mod_h = ol->h * scale; @@ -20746,7 +20754,8 @@ static void input_overlay_set_vertex_geom(input_overlay_t *ol) * * Scales the overlay by a factor of scale. **/ -static void input_overlay_set_scale_factor(input_overlay_t *ol, float scale) +static void input_overlay_set_scale_factor(input_overlay_t *ol, float scale, + float center_x, float center_y) { size_t i; @@ -20754,7 +20763,7 @@ static void input_overlay_set_scale_factor(input_overlay_t *ol, float scale) return; for (i = 0; i < ol->size; i++) - input_overlay_scale(&ol->overlays[i], scale); + input_overlay_scale(&ol->overlays[i], scale, center_x, center_y); input_overlay_set_vertex_geom(ol); } @@ -21228,7 +21237,8 @@ static void input_overlay_loaded(retro_task_t *task, if (ol->iface->enable) ol->iface->enable(ol->iface_data, data->overlay_enable); - input_overlay_set_scale_factor(ol, data->overlay_scale); + input_overlay_set_scale_factor(ol, data->overlay_scale, + data->overlay_center_x, data->overlay_center_y); ol->next_index = (unsigned)((ol->index + 1) % ol->size); ol->state = OVERLAY_STATUS_NONE; @@ -21472,6 +21482,8 @@ static void retroarch_overlay_init(struct rarch_state *p_rarch) const char *path_overlay = settings->paths.path_overlay; float overlay_opacity = settings->floats.input_overlay_opacity; float overlay_scale = settings->floats.input_overlay_scale; + float overlay_center_x = settings->floats.input_overlay_center_x; + float overlay_center_y = settings->floats.input_overlay_center_y; bool load_enabled = input_overlay_enable; #ifdef HAVE_MENU bool overlay_hide_in_menu = settings->bools.input_overlay_hide_in_menu; @@ -21501,6 +21513,8 @@ static void retroarch_overlay_init(struct rarch_state *p_rarch) input_overlay_enable, overlay_opacity, overlay_scale, + overlay_center_x, + overlay_center_y, NULL); } #endif diff --git a/retroarch.cfg b/retroarch.cfg index 6222390cc8..bac9093d3e 100644 --- a/retroarch.cfg +++ b/retroarch.cfg @@ -353,6 +353,10 @@ # Scale of all UI elements of the overlay. # input_overlay_scale = 1.0 +# Center of all UI elements of the overlay. +# input_overlay_center_x = 0.5 +# input_overlay_center_y = 0.5 + #### Input # Path to input remapping file. diff --git a/tasks/task_overlay.c b/tasks/task_overlay.c index e8db07c188..dfc1bc0bb5 100644 --- a/tasks/task_overlay.c +++ b/tasks/task_overlay.c @@ -48,6 +48,8 @@ struct overlay_loader unsigned pos_increment; float overlay_opacity; float overlay_scale; + float overlay_center_x; + float overlay_center_y; config_file_t *conf; char *overlay_path; @@ -699,13 +701,15 @@ static void task_overlay_handler(retro_task_t *task) overlay_task_data_t *data = (overlay_task_data_t*) calloc(1, sizeof(*data)); - data->overlays = loader->overlays; - data->size = loader->size; - data->active = loader->active; - data->hide_in_menu = loader->overlay_hide_in_menu; - data->overlay_enable = loader->overlay_enable; - data->overlay_opacity = loader->overlay_opacity; - data->overlay_scale = loader->overlay_scale; + data->overlays = loader->overlays; + data->size = loader->size; + data->active = loader->active; + data->hide_in_menu = loader->overlay_hide_in_menu; + data->overlay_enable = loader->overlay_enable; + data->overlay_opacity = loader->overlay_opacity; + data->overlay_scale = loader->overlay_scale; + data->overlay_center_x = loader->overlay_center_x; + data->overlay_center_y = loader->overlay_center_y; task_set_data(task, data); } @@ -735,6 +739,8 @@ bool task_push_overlay_load_default( bool input_overlay_enable, float input_overlay_opacity, float input_overlay_scale, + float input_overlay_center_x, + float input_overlay_center_y, void *user_data) { task_finder_data_t find_data; @@ -785,6 +791,8 @@ bool task_push_overlay_load_default( loader->overlay_enable = input_overlay_enable; loader->overlay_opacity = input_overlay_opacity; loader->overlay_scale = input_overlay_scale; + loader->overlay_center_x = input_overlay_center_x; + loader->overlay_center_y = input_overlay_center_y; loader->conf = conf; loader->state = OVERLAY_STATUS_DEFERRED_LOAD; loader->pos_increment = (loader->size / 4) ? (loader->size / 4) : 4; diff --git a/tasks/tasks_internal.h b/tasks/tasks_internal.h index cf8d5e7d62..96a992d5e1 100644 --- a/tasks/tasks_internal.h +++ b/tasks/tasks_internal.h @@ -159,6 +159,8 @@ bool task_push_overlay_load_default( bool input_overlay_enable, float input_overlay_opacity, float input_overlay_scale, + float input_overlay_center_x, + float input_overlay_center_y, void *user_data); #endif