From 05faba73e3fed69a5e118df2cc28d31309089243 Mon Sep 17 00:00:00 2001 From: "Joseph C. Osborn" Date: Fri, 21 Jun 2024 10:07:17 -0700 Subject: [PATCH] Add config values and menu items for viewport bias x/y --- config.def.h | 8 ++++ configuration.c | 6 +++ configuration.h | 6 +++ intl/msg_hash_lbl.h | 18 +++++++++ intl/msg_hash_us.h | 50 +++++++++++++++++++++++ menu/cbs/menu_cbs_sublabel.c | 20 +++++++++ menu/menu_displaylist.c | 18 +++++++++ menu/menu_setting.c | 78 ++++++++++++++++++++++++++++++++++++ msg_hash.h | 6 +++ 9 files changed, 210 insertions(+) diff --git a/config.def.h b/config.def.h index ba04fd8a96..df67372ef1 100644 --- a/config.def.h +++ b/config.def.h @@ -69,6 +69,14 @@ #define DEFAULT_ASPECT_RATIO 1.3333f #endif +#define DEFAULT_VIEWPORT_BIAS_X 0.5 +#define DEFAULT_VIEWPORT_BIAS_Y 0.5 + +#if defined(RARCH_MOBILE) +#define DEFAULT_VIEWPORT_BIAS_PORTRAIT_X 0.5 +#define DEFAULT_VIEWPORT_BIAS_PORTRAIT_Y 0.0 +#endif + #if defined(GEKKO) #define DEFAULT_MOUSE_SCALE 1 #endif diff --git a/configuration.c b/configuration.c index 2371165abf..9e77748bac 100644 --- a/configuration.c +++ b/configuration.c @@ -2255,6 +2255,12 @@ static struct config_float_setting *populate_settings_float( #endif SETTING_FLOAT("video_aspect_ratio", &settings->floats.video_aspect_ratio, true, DEFAULT_ASPECT_RATIO, false); + SETTING_FLOAT("video_viewport_bias_x", &settings->floats.video_viewport_bias_x, true, DEFAULT_VIEWPORT_BIAS_X, false); + SETTING_FLOAT("video_viewport_bias_y", &settings->floats.video_viewport_bias_y, true, DEFAULT_VIEWPORT_BIAS_Y, false); +#if defined(RARCH_MOBILE) + SETTING_FLOAT("video_viewport_bias_portrait_x", &settings->floats.video_viewport_bias_portrait_x, true, DEFAULT_VIEWPORT_BIAS_PORTRAIT_X, false); + SETTING_FLOAT("video_viewport_bias_portrait_y", &settings->floats.video_viewport_bias_portrait_y, true, DEFAULT_VIEWPORT_BIAS_PORTRAIT_Y, false); +#endif SETTING_FLOAT("video_refresh_rate", &settings->floats.video_refresh_rate, true, DEFAULT_REFRESH_RATE, false); SETTING_FLOAT("video_autoswitch_pal_threshold", &settings->floats.video_autoswitch_pal_threshold, true, DEFAULT_AUTOSWITCH_PAL_THRESHOLD, false); SETTING_FLOAT("crt_video_refresh_rate", &settings->floats.crt_video_refresh_rate, true, DEFAULT_CRT_REFRESH_RATE, false); diff --git a/configuration.h b/configuration.h index 0d67a825ff..51b7630bbd 100644 --- a/configuration.h +++ b/configuration.h @@ -375,6 +375,12 @@ typedef struct settings { float placeholder; float video_aspect_ratio; + float video_viewport_bias_x; + float video_viewport_bias_y; +#if defined(RARCH_MOBILE) + float video_viewport_bias_portrait_x; + float video_viewport_bias_portrait_y; +#endif float video_refresh_rate; float video_autoswitch_pal_threshold; float crt_video_refresh_rate; diff --git a/intl/msg_hash_lbl.h b/intl/msg_hash_lbl.h index 24c5102e57..37c934d385 100644 --- a/intl/msg_hash_lbl.h +++ b/intl/msg_hash_lbl.h @@ -4126,6 +4126,24 @@ MSG_HASH( MENU_ENUM_LABEL_VIDEO_ASPECT_RATIO_INDEX, "aspect_ratio_index" ) +MSG_HASH( + MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_X, + "video_viewport_bias_x" + ) +MSG_HASH( + MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_Y, + "video_viewport_bias_y" + ) +#if defined(RARCH_MOBILE) +MSG_HASH( + MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_PORTRAIT_X, + "video_viewport_bias_portrait_x" + ) +MSG_HASH( + MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_PORTRAIT_Y, + "video_viewport_bias_portrait_y" + ) +#endif #if defined(DINGUX) MSG_HASH( MENU_ENUM_LABEL_VIDEO_DINGUX_IPU_KEEP_ASPECT, diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index f1654078ae..9a29da372f 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -2599,6 +2599,56 @@ MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_Y, "Custom viewport offset used for defining the Y-axis position of the viewport.\nThese are ignored if 'Integer Scale' is enabled." ) +MSG_HASH( + MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_X, + "Viewport Anchor Bias X" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_BIAS_X, + "Viewport Anchor Bias X" + ) +MSG_HASH( + MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_Y, + "Viewport Anchor Bias Y" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_BIAS_Y, + "Viewport Anchor Bias Y" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_BIAS_X, + "Custom viewport bias used to offset the viewport horizontally (if wider than content height). 0.0 means far left and 1.0 means far right." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_BIAS_Y, + "Custom viewport bias used to offset the viewport vertically (if taller than content height). 0.0 means top and 1.0 means bottom." + ) +#if defined(RARCH_MOBILE) +MSG_HASH( + MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_PORTRAIT_X, + "Viewport Anchor Bias X (Portrait Orientation)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_BIAS_PORTRAIT_X, + "Viewport Anchor Bias X (Portrait Orientation)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_PORTRAIT_Y, + "Viewport Anchor Bias Y (Portrait Orientation)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_BIAS_PORTRAIT_Y, + "Viewport Anchor Bias Y (Portrait Orientation)" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_BIAS_PORTRAIT_X, + "Custom viewport bias used to offset the viewport horizontally (if wider than content height). 0.0 means far left and 1.0 means far right. (Portrait Orientation)" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_BIAS_PORTRAIT_Y, + "Custom viewport bias used to offset the viewport vertically (if taller than content height). 0.0 means top and 1.0 means bottom. (Portrait Orientation)" + ) +#endif MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_WIDTH, "Custom Aspect Ratio (Width)" diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index 69b73aa6ef..ebe578684a 100644 --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -1251,6 +1251,12 @@ DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_viewport_custom_height, DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_viewport_custom_width, MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_WIDTH) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_viewport_custom_x, MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_X) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_viewport_custom_y, MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_Y) +DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_viewport_bias_x, MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_BIAS_X) +DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_viewport_bias_y, MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_BIAS_Y) +#if defined(RARCH_MOBILE) +DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_viewport_bias_portrait_x, MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_BIAS_PORTRAIT_X) +DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_viewport_bias_portrait_y, MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_BIAS_PORTRAIT_Y) +#endif DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_netplay_use_mitm_server, MENU_ENUM_SUBLABEL_NETPLAY_USE_MITM_SERVER) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_netplay_mitm_server, MENU_ENUM_SUBLABEL_NETPLAY_MITM_SERVER) DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_netplay_custom_mitm_server, MENU_ENUM_SUBLABEL_NETPLAY_CUSTOM_MITM_SERVER) @@ -2570,6 +2576,20 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, case MENU_ENUM_LABEL_VIDEO_ASPECT_RATIO: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_video_aspect_ratio); break; + case MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_X: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_video_viewport_bias_x); + break; + case MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_Y: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_video_viewport_bias_y); + break; +#if defined(RARCH_MOBILE) + case MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_PORTRAIT_X: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_video_viewport_bias_portrait_x); + break; + case MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_PORTRAIT_Y: + BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_video_viewport_bias_portrait_y); + break; +#endif case MENU_ENUM_LABEL_VIDEO_ASPECT_RATIO_INDEX: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_video_aspect_ratio_index); break; diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index a3ad3bd449..aa1daeba56 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -9801,6 +9801,24 @@ unsigned menu_displaylist_build_list( MENU_ENUM_LABEL_VIDEO_SCALE_INTEGER_OVERSCALE, PARSE_ONLY_BOOL, false) == 0) count++; + if (MENU_DISPLAYLIST_PARSE_SETTINGS_ENUM(list, + MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_X, + PARSE_ONLY_FLOAT, false) == 0) + count++; + if (MENU_DISPLAYLIST_PARSE_SETTINGS_ENUM(list, + MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_Y, + PARSE_ONLY_FLOAT, false) == 0) + count++; +#if defined(RARCH_MOBILE) + if (MENU_DISPLAYLIST_PARSE_SETTINGS_ENUM(list, + MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_PORTRAIT_X, + PARSE_ONLY_FLOAT, false) == 0) + count++; + if (MENU_DISPLAYLIST_PARSE_SETTINGS_ENUM(list, + MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_PORTRAIT_Y, + PARSE_ONLY_FLOAT, false) == 0) + count++; +#endif if (MENU_DISPLAYLIST_PARSE_SETTINGS_ENUM(list, MENU_ENUM_LABEL_VIDEO_ASPECT_RATIO_INDEX, PARSE_ONLY_UINT, false) == 0) diff --git a/menu/menu_setting.c b/menu/menu_setting.c index 390bc0c6f6..40d1aedfb7 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -12929,6 +12929,84 @@ static bool setting_append_list( END_SUB_GROUP(list, list_info, parent_group); START_SUB_GROUP(list, list_info, "Aspect", &group_info, &subgroup_info, parent_group); + CONFIG_FLOAT( + list, list_info, + &settings->floats.video_viewport_bias_x, + MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_X, + MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_BIAS_X, + DEFAULT_VIEWPORT_BIAS_X, + "%.2f", + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler); + menu_settings_list_current_add_range(list, list_info, 0.0, 1.0, 0.05, true, true); + (*list)[list_info->index - 1].offset_by = 0; + SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ALLOW_INPUT); + MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, + CMD_EVENT_VIDEO_APPLY_STATE_CHANGES); + SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED); + + CONFIG_FLOAT( + list, list_info, + &settings->floats.video_viewport_bias_y, + MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_Y, + MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_BIAS_Y, + DEFAULT_VIEWPORT_BIAS_Y, + "%.2f", + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler); + menu_settings_list_current_add_range(list, list_info, 0.0, 1.0, 0.05, true, true); + (*list)[list_info->index - 1].offset_by = 0; + SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ALLOW_INPUT); + MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, + CMD_EVENT_VIDEO_APPLY_STATE_CHANGES); + SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED); + +#if defined(RARCH_MOBILE) + CONFIG_FLOAT( + list, list_info, + &settings->floats.video_viewport_bias_portrait_x, + MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_PORTRAIT_X, + MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_BIAS_PORTRAIT_X, + DEFAULT_VIEWPORT_BIAS_PORTRAIT_X, + "%.2f", + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler); + menu_settings_list_current_add_range(list, list_info, 0.0, 1.0, 0.05, true, true); + (*list)[list_info->index - 1].offset_by = 0; + SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ALLOW_INPUT); + MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, + CMD_EVENT_VIDEO_APPLY_STATE_CHANGES); + SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED); + + CONFIG_FLOAT( + list, list_info, + &settings->floats.video_viewport_bias_portrait_y, + MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_PORTRAIT_Y, + MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_BIAS_PORTRAIT_Y, + DEFAULT_VIEWPORT_BIAS_PORTRAIT_Y, + "%.2f", + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler); + menu_settings_list_current_add_range(list, list_info, 0.0, 1.0, 0.05, true, true); + (*list)[list_info->index - 1].offset_by = 0; + SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ALLOW_INPUT); + MENU_SETTINGS_LIST_CURRENT_ADD_CMD(list, list_info, + CMD_EVENT_VIDEO_APPLY_STATE_CHANGES); + SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED); +#endif + CONFIG_UINT( list, list_info, &settings->uints.video_aspect_ratio_idx, diff --git a/msg_hash.h b/msg_hash.h index bcc0e37ec6..d759907560 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -3385,6 +3385,12 @@ enum msg_hash_enums MENU_LABEL(VIDEO_OVERSCAN_CORRECTION_TOP), MENU_LABEL(VIDEO_OVERSCAN_CORRECTION_BOTTOM), MENU_LABEL(VIDEO_ASPECT_RATIO), + MENU_LABEL(VIDEO_VIEWPORT_BIAS_X), + MENU_LABEL(VIDEO_VIEWPORT_BIAS_Y), +#if defined(RARCH_MOBILE) + MENU_LABEL(VIDEO_VIEWPORT_BIAS_PORTRAIT_X), + MENU_LABEL(VIDEO_VIEWPORT_BIAS_PORTRAIT_Y), +#endif MENU_LABEL(VIDEO_FORCE_ASPECT), MENU_LABEL(VIDEO_ASPECT_RATIO_AUTO), MENU_LABEL(VIDEO_ASPECT_RATIO_INDEX),