mirror of
https://github.com/libretro/RetroArch
synced 2025-04-02 16:20:39 +00:00
(RGUI) Allow selection of thumbnail downscaling method
This commit is contained in:
parent
7ba6ffdfbe
commit
bd56e1e29c
@ -752,6 +752,8 @@ static const unsigned menu_timedate_style = 5;
|
|||||||
|
|
||||||
static const bool xmb_vertical_thumbnails = false;
|
static const bool xmb_vertical_thumbnails = false;
|
||||||
|
|
||||||
|
static unsigned rgui_thumbnail_downscaler = RGUI_THUMB_SCALE_POINT;
|
||||||
|
|
||||||
#ifdef IOS
|
#ifdef IOS
|
||||||
static const bool ui_companion_start_on_boot = false;
|
static const bool ui_companion_start_on_boot = false;
|
||||||
#else
|
#else
|
||||||
|
@ -1654,6 +1654,7 @@ static struct config_uint_setting *populate_settings_uint(settings_t *settings,
|
|||||||
SETTING_UINT("menu_thumbnails", &settings->uints.menu_thumbnails, true, menu_thumbnails_default, false);
|
SETTING_UINT("menu_thumbnails", &settings->uints.menu_thumbnails, true, menu_thumbnails_default, false);
|
||||||
SETTING_UINT("menu_timedate_style", &settings->uints.menu_timedate_style, true, menu_timedate_style, false);
|
SETTING_UINT("menu_timedate_style", &settings->uints.menu_timedate_style, true, menu_timedate_style, false);
|
||||||
SETTING_UINT("rgui_menu_color_theme", &settings->uints.menu_rgui_color_theme, true, rgui_color_theme, false);
|
SETTING_UINT("rgui_menu_color_theme", &settings->uints.menu_rgui_color_theme, true, rgui_color_theme, false);
|
||||||
|
SETTING_UINT("rgui_thumbnail_downscaler", &settings->uints.menu_rgui_thumbnail_downscaler, true, rgui_thumbnail_downscaler, false);
|
||||||
#ifdef HAVE_LIBNX
|
#ifdef HAVE_LIBNX
|
||||||
SETTING_UINT("split_joycon_p1", &settings->uints.input_split_joycon[0], true, 0, false);
|
SETTING_UINT("split_joycon_p1", &settings->uints.input_split_joycon[0], true, 0, false);
|
||||||
SETTING_UINT("split_joycon_p2", &settings->uints.input_split_joycon[1], true, 0, false);
|
SETTING_UINT("split_joycon_p2", &settings->uints.input_split_joycon[1], true, 0, false);
|
||||||
|
@ -403,6 +403,7 @@ typedef struct settings
|
|||||||
unsigned menu_timedate_style;
|
unsigned menu_timedate_style;
|
||||||
unsigned menu_thumbnails;
|
unsigned menu_thumbnails;
|
||||||
unsigned menu_left_thumbnails;
|
unsigned menu_left_thumbnails;
|
||||||
|
unsigned menu_rgui_thumbnail_downscaler;
|
||||||
unsigned menu_dpi_override_value;
|
unsigned menu_dpi_override_value;
|
||||||
unsigned menu_entry_normal_color;
|
unsigned menu_entry_normal_color;
|
||||||
unsigned menu_entry_hover_color;
|
unsigned menu_entry_hover_color;
|
||||||
|
@ -1117,6 +1117,8 @@ MSG_HASH(MENU_ENUM_LABEL_LEFT_THUMBNAILS,
|
|||||||
"left thumbnails")
|
"left thumbnails")
|
||||||
MSG_HASH(MENU_ENUM_LABEL_XMB_VERTICAL_THUMBNAILS,
|
MSG_HASH(MENU_ENUM_LABEL_XMB_VERTICAL_THUMBNAILS,
|
||||||
"xmb_vertical_thumbnails")
|
"xmb_vertical_thumbnails")
|
||||||
|
MSG_HASH(MENU_ENUM_LABEL_MENU_RGUI_THUMBNAIL_DOWNSCALER,
|
||||||
|
"rgui_thumbnail_downscaler")
|
||||||
MSG_HASH(MENU_ENUM_LABEL_THUMBNAILS_DIRECTORY,
|
MSG_HASH(MENU_ENUM_LABEL_THUMBNAILS_DIRECTORY,
|
||||||
"thumbnails_directory")
|
"thumbnails_directory")
|
||||||
MSG_HASH(MENU_ENUM_LABEL_THUMBNAILS_UPDATER_LIST,
|
MSG_HASH(MENU_ENUM_LABEL_THUMBNAILS_UPDATER_LIST,
|
||||||
|
@ -2934,6 +2934,22 @@ MSG_HASH(
|
|||||||
MENU_ENUM_LABEL_VALUE_XMB_VERTICAL_THUMBNAILS,
|
MENU_ENUM_LABEL_VALUE_XMB_VERTICAL_THUMBNAILS,
|
||||||
"Thumbnails Vertical Disposition"
|
"Thumbnails Vertical Disposition"
|
||||||
)
|
)
|
||||||
|
MSG_HASH(
|
||||||
|
MENU_ENUM_LABEL_VALUE_MENU_RGUI_THUMBNAIL_DOWNSCALER,
|
||||||
|
"Thumbnail Downscaling Method"
|
||||||
|
)
|
||||||
|
MSG_HASH(
|
||||||
|
MENU_ENUM_LABEL_VALUE_RGUI_THUMB_SCALE_POINT,
|
||||||
|
"Nearest Neighbour (Fast)"
|
||||||
|
)
|
||||||
|
MSG_HASH(
|
||||||
|
MENU_ENUM_LABEL_VALUE_RGUI_THUMB_SCALE_BILINEAR,
|
||||||
|
"Bilinear"
|
||||||
|
)
|
||||||
|
MSG_HASH(
|
||||||
|
MENU_ENUM_LABEL_VALUE_RGUI_THUMB_SCALE_SINC,
|
||||||
|
"Sinc/Lanczos3 (Slow)"
|
||||||
|
)
|
||||||
MSG_HASH(
|
MSG_HASH(
|
||||||
MENU_ENUM_LABEL_VALUE_THUMBNAILS_DIRECTORY,
|
MENU_ENUM_LABEL_VALUE_THUMBNAILS_DIRECTORY,
|
||||||
"Thumbnails"
|
"Thumbnails"
|
||||||
|
@ -53,6 +53,7 @@
|
|||||||
/* Thumbnail additions */
|
/* Thumbnail additions */
|
||||||
#include <streams/file_stream.h>
|
#include <streams/file_stream.h>
|
||||||
#include "../../tasks/tasks_internal.h"
|
#include "../../tasks/tasks_internal.h"
|
||||||
|
#include <gfx/scaler/scaler.h>
|
||||||
|
|
||||||
#define RGUI_TERM_START_X(width) (width / 21)
|
#define RGUI_TERM_START_X(width) (width / 21)
|
||||||
#define RGUI_TERM_START_Y(height) (height / 9)
|
#define RGUI_TERM_START_Y(height) (height / 9)
|
||||||
@ -422,6 +423,7 @@ typedef struct
|
|||||||
char *thumbnail_path;
|
char *thumbnail_path;
|
||||||
char *thumbnail_playlist;
|
char *thumbnail_playlist;
|
||||||
uint32_t thumbnail_queue_size;
|
uint32_t thumbnail_queue_size;
|
||||||
|
struct scaler_ctx image_scaler;
|
||||||
} rgui_t;
|
} rgui_t;
|
||||||
|
|
||||||
#define THUMB_MAX_WIDTH 320
|
#define THUMB_MAX_WIDTH 320
|
||||||
@ -589,14 +591,12 @@ static void request_thumbnail(rgui_t *rgui, const char *path)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool downscale_thumbnail(struct texture_image *image_src, struct texture_image *image_dst)
|
static bool downscale_thumbnail(rgui_t *rgui, struct texture_image *image_src, struct texture_image *image_dst)
|
||||||
{
|
{
|
||||||
uint32_t x_ratio, y_ratio;
|
settings_t *settings = config_get_ptr();
|
||||||
unsigned x_src, y_src;
|
|
||||||
unsigned x_dst, y_dst;
|
|
||||||
static const float display_aspect_ratio = (float)THUMB_MAX_WIDTH / (float)THUMB_MAX_HEIGHT;
|
|
||||||
|
|
||||||
/* Determine output dimensions */
|
/* Determine output dimensions */
|
||||||
|
static const float display_aspect_ratio = (float)THUMB_MAX_WIDTH / (float)THUMB_MAX_HEIGHT;
|
||||||
float aspect_ratio = (float)image_src->width / (float)image_src->height;
|
float aspect_ratio = (float)image_src->width / (float)image_src->height;
|
||||||
if (aspect_ratio > display_aspect_ratio)
|
if (aspect_ratio > display_aspect_ratio)
|
||||||
{
|
{
|
||||||
@ -620,19 +620,65 @@ static bool downscale_thumbnail(struct texture_image *image_src, struct texture_
|
|||||||
if (!image_dst->pixels)
|
if (!image_dst->pixels)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
/* Perform nearest neighbour resampling */
|
/* Determine scaling method */
|
||||||
x_ratio = ((image_src->width << 16) / image_dst->width);
|
if (settings->uints.menu_rgui_thumbnail_downscaler == RGUI_THUMB_SCALE_POINT)
|
||||||
y_ratio = ((image_src->height << 16) / image_dst->height);
|
|
||||||
|
|
||||||
for (y_dst = 0; y_dst < image_dst->height; y_dst++)
|
|
||||||
{
|
{
|
||||||
y_src = (y_dst * y_ratio) >> 16;
|
uint32_t x_ratio, y_ratio;
|
||||||
for (x_dst = 0; x_dst < image_dst->width; x_dst++)
|
unsigned x_src, y_src;
|
||||||
|
unsigned x_dst, y_dst;
|
||||||
|
|
||||||
|
/* Perform nearest neighbour resampling
|
||||||
|
* > Fastest method, minimal performance impact */
|
||||||
|
x_ratio = ((image_src->width << 16) / image_dst->width);
|
||||||
|
y_ratio = ((image_src->height << 16) / image_dst->height);
|
||||||
|
|
||||||
|
for (y_dst = 0; y_dst < image_dst->height; y_dst++)
|
||||||
{
|
{
|
||||||
x_src = (x_dst * x_ratio) >> 16;
|
y_src = (y_dst * y_ratio) >> 16;
|
||||||
image_dst->pixels[(y_dst * image_dst->width) + x_dst] = image_src->pixels[(y_src * image_src->width) + x_src];
|
for (x_dst = 0; x_dst < image_dst->width; x_dst++)
|
||||||
|
{
|
||||||
|
x_src = (x_dst * x_ratio) >> 16;
|
||||||
|
image_dst->pixels[(y_dst * image_dst->width) + x_dst] = image_src->pixels[(y_src * image_src->width) + x_src];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Perform either bilinear or sinc (Lanczos3) resampling
|
||||||
|
* using libretro-common scaler
|
||||||
|
* > Better quality, but substantially higher performance
|
||||||
|
* impact - although not an issue on desktop-class
|
||||||
|
* hardware */
|
||||||
|
rgui->image_scaler.in_width = image_src->width;
|
||||||
|
rgui->image_scaler.in_height = image_src->height;
|
||||||
|
rgui->image_scaler.in_stride = image_src->width * sizeof(uint32_t);
|
||||||
|
rgui->image_scaler.in_fmt = SCALER_FMT_ARGB8888;
|
||||||
|
|
||||||
|
rgui->image_scaler.out_width = image_dst->width;
|
||||||
|
rgui->image_scaler.out_height = image_dst->height;
|
||||||
|
rgui->image_scaler.out_stride = image_dst->width * sizeof(uint32_t);
|
||||||
|
rgui->image_scaler.out_fmt = SCALER_FMT_ARGB8888;
|
||||||
|
|
||||||
|
rgui->image_scaler.scaler_type = (settings->uints.menu_rgui_thumbnail_downscaler == RGUI_THUMB_SCALE_SINC) ?
|
||||||
|
SCALER_TYPE_SINC : SCALER_TYPE_BILINEAR;
|
||||||
|
|
||||||
|
/* This reset is redundant, since scaler_ctx_gen_filter()
|
||||||
|
* calls it - but do it anyway in case the
|
||||||
|
* scaler_ctx_gen_filter() internals ever change... */
|
||||||
|
scaler_ctx_gen_reset(&rgui->image_scaler);
|
||||||
|
if(!scaler_ctx_gen_filter(&rgui->image_scaler))
|
||||||
|
{
|
||||||
|
/* Could be leftovers if scaler_ctx_gen_filter()
|
||||||
|
* fails, so reset just in case... */
|
||||||
|
scaler_ctx_gen_reset(&rgui->image_scaler);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
scaler_ctx_scale(&rgui->image_scaler, image_dst->pixels, image_src->pixels);
|
||||||
|
/* Reset again - don't want to leave anything hanging around
|
||||||
|
* if the user switches back to nearest neighbour scaling */
|
||||||
|
scaler_ctx_gen_reset(&rgui->image_scaler);
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -668,7 +714,7 @@ static void process_thumbnail(rgui_t *rgui, struct texture_image *image_src)
|
|||||||
/* Downscale thumbnail if it exceeds maximum size limits */
|
/* Downscale thumbnail if it exceeds maximum size limits */
|
||||||
if ((image_src->width > THUMB_MAX_WIDTH) || (image_src->height > THUMB_MAX_HEIGHT))
|
if ((image_src->width > THUMB_MAX_WIDTH) || (image_src->height > THUMB_MAX_HEIGHT))
|
||||||
{
|
{
|
||||||
if (!downscale_thumbnail(image_src, &image_resampled))
|
if (!downscale_thumbnail(rgui, image_src, &image_resampled))
|
||||||
return;
|
return;
|
||||||
image = &image_resampled;
|
image = &image_resampled;
|
||||||
}
|
}
|
||||||
|
@ -6119,6 +6119,10 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, menu_displaylist
|
|||||||
MENU_ENUM_LABEL_XMB_VERTICAL_THUMBNAILS,
|
MENU_ENUM_LABEL_XMB_VERTICAL_THUMBNAILS,
|
||||||
PARSE_ONLY_BOOL, false) == 0)
|
PARSE_ONLY_BOOL, false) == 0)
|
||||||
count++;
|
count++;
|
||||||
|
if (menu_displaylist_parse_settings_enum(menu, info,
|
||||||
|
MENU_ENUM_LABEL_MENU_RGUI_THUMBNAIL_DOWNSCALER,
|
||||||
|
PARSE_ONLY_UINT, false) == 0)
|
||||||
|
count++;
|
||||||
|
|
||||||
if (count == 0)
|
if (count == 0)
|
||||||
menu_entries_append_enum(info->list,
|
menu_entries_append_enum(info->list,
|
||||||
|
@ -383,6 +383,14 @@ enum menu_toggle_reason
|
|||||||
MENU_TOGGLE_REASON_MESSAGE
|
MENU_TOGGLE_REASON_MESSAGE
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum rgui_thumbnail_scaler
|
||||||
|
{
|
||||||
|
RGUI_THUMB_SCALE_POINT = 0,
|
||||||
|
RGUI_THUMB_SCALE_BILINEAR,
|
||||||
|
RGUI_THUMB_SCALE_SINC,
|
||||||
|
RGUI_THUMB_SCALE_LAST
|
||||||
|
};
|
||||||
|
|
||||||
typedef uintptr_t menu_texture_item;
|
typedef uintptr_t menu_texture_item;
|
||||||
|
|
||||||
typedef struct menu_display_ctx_clearcolor
|
typedef struct menu_display_ctx_clearcolor
|
||||||
|
@ -786,6 +786,36 @@ static void setting_get_string_representation_uint_rgui_menu_color_theme(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void setting_get_string_representation_uint_rgui_thumbnail_scaler(
|
||||||
|
rarch_setting_t *setting,
|
||||||
|
char *s, size_t len)
|
||||||
|
{
|
||||||
|
if (!setting)
|
||||||
|
return;
|
||||||
|
|
||||||
|
switch (*setting->value.target.unsigned_integer)
|
||||||
|
{
|
||||||
|
case RGUI_THUMB_SCALE_POINT:
|
||||||
|
strlcpy(s,
|
||||||
|
msg_hash_to_str(
|
||||||
|
MENU_ENUM_LABEL_VALUE_RGUI_THUMB_SCALE_POINT),
|
||||||
|
len);
|
||||||
|
break;
|
||||||
|
case RGUI_THUMB_SCALE_BILINEAR:
|
||||||
|
strlcpy(s,
|
||||||
|
msg_hash_to_str(
|
||||||
|
MENU_ENUM_LABEL_VALUE_RGUI_THUMB_SCALE_BILINEAR),
|
||||||
|
len);
|
||||||
|
break;
|
||||||
|
case RGUI_THUMB_SCALE_SINC:
|
||||||
|
strlcpy(s,
|
||||||
|
msg_hash_to_str(
|
||||||
|
MENU_ENUM_LABEL_VALUE_RGUI_THUMB_SCALE_SINC),
|
||||||
|
len);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void setting_get_string_representation_uint_xmb_icon_theme(
|
static void setting_get_string_representation_uint_xmb_icon_theme(
|
||||||
rarch_setting_t *setting,
|
rarch_setting_t *setting,
|
||||||
char *s, size_t len)
|
char *s, size_t len)
|
||||||
@ -8741,6 +8771,25 @@ static bool setting_append_list(
|
|||||||
menu_settings_list_current_add_range(list, list_info, 0, 3, 1, true, true);
|
menu_settings_list_current_add_range(list, list_info, 0, 3, 1, true, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (string_is_equal(settings->arrays.menu_driver, "rgui"))
|
||||||
|
{
|
||||||
|
CONFIG_UINT(
|
||||||
|
list, list_info,
|
||||||
|
&settings->uints.menu_rgui_thumbnail_downscaler,
|
||||||
|
MENU_ENUM_LABEL_MENU_RGUI_THUMBNAIL_DOWNSCALER,
|
||||||
|
MENU_ENUM_LABEL_VALUE_MENU_RGUI_THUMBNAIL_DOWNSCALER,
|
||||||
|
rgui_thumbnail_downscaler,
|
||||||
|
&group_info,
|
||||||
|
&subgroup_info,
|
||||||
|
parent_group,
|
||||||
|
general_write_handler,
|
||||||
|
general_read_handler);
|
||||||
|
(*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
|
||||||
|
(*list)[list_info->index - 1].get_string_representation =
|
||||||
|
&setting_get_string_representation_uint_rgui_thumbnail_scaler;
|
||||||
|
menu_settings_list_current_add_range(list, list_info, 0, RGUI_THUMB_SCALE_LAST-1, 1, true, true);
|
||||||
|
}
|
||||||
|
|
||||||
if (string_is_equal(settings->arrays.menu_driver, "xmb") || string_is_equal(settings->arrays.menu_driver, "ozone"))
|
if (string_is_equal(settings->arrays.menu_driver, "xmb") || string_is_equal(settings->arrays.menu_driver, "ozone"))
|
||||||
{
|
{
|
||||||
CONFIG_UINT(
|
CONFIG_UINT(
|
||||||
|
@ -883,6 +883,7 @@ enum msg_hash_enums
|
|||||||
MENU_LABEL(THUMBNAILS),
|
MENU_LABEL(THUMBNAILS),
|
||||||
MENU_LABEL(LEFT_THUMBNAILS),
|
MENU_LABEL(LEFT_THUMBNAILS),
|
||||||
MENU_LABEL(XMB_VERTICAL_THUMBNAILS),
|
MENU_LABEL(XMB_VERTICAL_THUMBNAILS),
|
||||||
|
MENU_LABEL(MENU_RGUI_THUMBNAIL_DOWNSCALER),
|
||||||
MENU_LABEL(TIMEDATE_ENABLE),
|
MENU_LABEL(TIMEDATE_ENABLE),
|
||||||
MENU_LABEL(TIMEDATE_STYLE),
|
MENU_LABEL(TIMEDATE_STYLE),
|
||||||
MENU_LABEL(BATTERY_LEVEL_ENABLE),
|
MENU_LABEL(BATTERY_LEVEL_ENABLE),
|
||||||
@ -1943,6 +1944,10 @@ enum msg_hash_enums
|
|||||||
MENU_ENUM_LABEL_VALUE_THUMBNAIL_MODE_SCREENSHOTS,
|
MENU_ENUM_LABEL_VALUE_THUMBNAIL_MODE_SCREENSHOTS,
|
||||||
MENU_ENUM_LABEL_VALUE_THUMBNAIL_MODE_TITLE_SCREENS,
|
MENU_ENUM_LABEL_VALUE_THUMBNAIL_MODE_TITLE_SCREENS,
|
||||||
|
|
||||||
|
MENU_ENUM_LABEL_VALUE_RGUI_THUMB_SCALE_POINT,
|
||||||
|
MENU_ENUM_LABEL_VALUE_RGUI_THUMB_SCALE_BILINEAR,
|
||||||
|
MENU_ENUM_LABEL_VALUE_RGUI_THUMB_SCALE_SINC,
|
||||||
|
|
||||||
/* Callback strings */
|
/* Callback strings */
|
||||||
MENU_ENUM_LABEL_CB_CORE_CONTENT_DIRS_LIST,
|
MENU_ENUM_LABEL_CB_CORE_CONTENT_DIRS_LIST,
|
||||||
MENU_ENUM_LABEL_CB_CORE_CONTENT_DOWNLOAD,
|
MENU_ENUM_LABEL_CB_CORE_CONTENT_DOWNLOAD,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user