Savestate thumbnails reimplementation

This commit is contained in:
Jean-André Santoni 2016-12-01 02:43:53 +01:00
parent d00566b018
commit 2fc592bbe6
9 changed files with 170 additions and 54 deletions

View File

@ -37,6 +37,9 @@ static int action_cancel_pop_default(const char *path,
menu_entries_pop_stack(&new_selection_ptr, 0, 1);
menu_navigation_ctl(MENU_NAVIGATION_CTL_SET_SELECTION, &new_selection_ptr);
menu_driver_ctl(RARCH_MENU_CTL_UPDATE_SAVESTATE_THUMBNAIL_PATH, NULL);
menu_driver_ctl(RARCH_MENU_CTL_UPDATE_SAVESTATE_THUMBNAIL_IMAGE, NULL);
return 0;
}

View File

@ -1456,6 +1456,7 @@ static bool mui_load_image(void *userdata, void *data, enum menu_image_type type
menu_display_allocate_white_texture();
break;
case MENU_IMAGE_THUMBNAIL:
case MENU_IMAGE_SAVESTATE_THUMBNAIL:
break;
}
@ -1873,4 +1874,6 @@ menu_ctx_driver_t menu_ctx_mui = {
NULL,
NULL,
mui_osk_ptr_at_pos,
NULL,
NULL
};

View File

@ -166,10 +166,14 @@ typedef struct xmb_handle
float x;
float alpha;
uintptr_t thumbnail;
uintptr_t savestate_thumbnail;
float thumbnail_width;
float thumbnail_height;
float savestate_thumbnail_width;
float savestate_thumbnail_height;
char background_file_path[PATH_MAX_LENGTH];
char thumbnail_file_path[PATH_MAX_LENGTH];
char savestate_thumbnail_file_path[PATH_MAX_LENGTH];
struct
{
@ -585,7 +589,7 @@ static void xmb_draw_icon(
}
static void xmb_draw_thumbnail(xmb_handle_t *xmb, float *color,
unsigned width, unsigned height)
unsigned width, unsigned height, float w, float h, uintptr_t texture)
{
settings_t *settings = config_get_ptr();
unsigned i;
@ -594,7 +598,7 @@ static void xmb_draw_thumbnail(xmb_handle_t *xmb, float *color,
struct video_coords coords;
math_matrix_4x4 mymat;
float shadow[16];
float y = xmb->margins.screen.top + xmb->icon.size + xmb->thumbnail_height;
float y = xmb->margins.screen.top + xmb->icon.size + h;
float x = xmb->margins.screen.left + xmb->icon.spacing.horizontal +
xmb->icon.spacing.horizontal*4 - xmb->icon.size / 4;
@ -612,11 +616,11 @@ static void xmb_draw_thumbnail(xmb_handle_t *xmb, float *color,
coords.tex_coord = NULL;
coords.lut_tex_coord = NULL;
draw.width = xmb->thumbnail_width;
draw.height = xmb->thumbnail_height;
draw.width = w;
draw.height = h;
draw.coords = &coords;
draw.matrix_data = &mymat;
draw.texture = xmb->thumbnail;
draw.texture = texture;
draw.prim_type = MENU_DISPLAY_PRIM_TRIANGLESTRIP;
draw.pipeline.id = 0;
@ -862,10 +866,6 @@ static void xmb_update_thumbnail_path(void *data, unsigned i)
menu_driver_ctl(RARCH_MENU_CTL_PLAYLIST_GET, &playlist);
depth = xmb_list_get_size(xmb, MENU_LIST_PLAIN);
if (depth > 1 && !string_is_equal(entry.label, "state_slot"))
return;
if (playlist)
{
playlist_get_index(playlist, i,
@ -879,34 +879,6 @@ static void xmb_update_thumbnail_path(void *data, unsigned i)
}
}
if (settings->savestate_thumbnail_enable
&& string_is_equal(entry.label, "state_slot"))
{
char path[PATH_MAX_LENGTH] = {0};
if (settings->state_slot > 0)
snprintf(path, sizeof(path), "%s%d",
global->name.savestate, settings->state_slot);
else if (settings->state_slot < 0)
fill_pathname_join_delim(path,
global->name.savestate, "auto", '.', sizeof(path));
else
strlcpy(path, global->name.savestate, sizeof(path));
strlcat(path, file_path_str(FILE_PATH_PNG_EXTENSION), sizeof(path));
if (path_file_exists(path))
{
strlcpy(xmb->thumbnail_file_path, path,
sizeof(xmb->thumbnail_file_path));
return;
}
else
{
xmb->thumbnail_file_path[0] = '\0';
xmb->thumbnail = 0;
}
}
fill_pathname_join(
xmb->thumbnail_file_path,
settings->directory.thumbnails,
@ -928,7 +900,7 @@ static void xmb_update_thumbnail_path(void *data, unsigned i)
}
/* Look for thumbnail file with this scrubbed filename */
if (tmp)
if (tmp)
{
char tmp_new[PATH_MAX_LENGTH];
@ -944,26 +916,93 @@ static void xmb_update_thumbnail_path(void *data, unsigned i)
sizeof(xmb->thumbnail_file_path));
}
static void xmb_update_savestate_thumbnail_path(void *data, unsigned i)
{
menu_entry_t entry;
char *tmp = NULL;
char *scrub_char_pointer = NULL;
settings_t *settings = config_get_ptr();
global_t *global = global_get_ptr();
xmb_handle_t *xmb = (xmb_handle_t*)data;
playlist_t *playlist = NULL;
const char *core_name = NULL;
if (!xmb)
return;
entry.path[0] = '\0';
entry.label[0] = '\0';
entry.sublabel[0] = '\0';
entry.value[0] = '\0';
entry.rich_label[0] = '\0';
entry.enum_idx = MSG_UNKNOWN;
entry.entry_idx = 0;
entry.idx = 0;
entry.type = 0;
entry.spacing = 0;
menu_entry_get(&entry, 0, i, NULL, true);
menu_driver_ctl(RARCH_MENU_CTL_PLAYLIST_GET, &playlist);
if (settings->savestate_thumbnail_enable
&& (string_is_equal(entry.label, "state_slot")
|| string_is_equal(entry.label, "loadstate")
|| string_is_equal(entry.label, "savestate")))
{
char path[PATH_MAX_LENGTH] = {0};
if (settings->state_slot > 0)
snprintf(path, sizeof(path), "%s%d",
global->name.savestate, settings->state_slot);
else if (settings->state_slot < 0)
fill_pathname_join_delim(path,
global->name.savestate, "auto", '.', sizeof(path));
else
strlcpy(path, global->name.savestate, sizeof(path));
strlcat(path, file_path_str(FILE_PATH_PNG_EXTENSION), sizeof(path));
if (path_file_exists(path))
{
strlcpy(xmb->savestate_thumbnail_file_path, path,
sizeof(xmb->savestate_thumbnail_file_path));
return;
}
else
xmb->savestate_thumbnail_file_path[0] = '\0';
}
else
xmb->savestate_thumbnail_file_path[0] = '\0';
}
static void xmb_update_thumbnail_image(void *data)
{
xmb_handle_t *xmb = (xmb_handle_t*)data;
if (!xmb)
return;
if (path_file_exists(xmb->thumbnail_file_path))
{
#if 0
RARCH_LOG("path: %s\n", xmb->thumbnail_file_path);
#endif
task_push_image_load(xmb->thumbnail_file_path,
MENU_ENUM_LABEL_CB_MENU_THUMBNAIL,
menu_display_handle_thumbnail_upload, NULL);
}
else if (xmb->depth == 1)
xmb->thumbnail = 0;
}
static void xmb_update_savestate_thumbnail_image(void *data)
{
xmb_handle_t *xmb = (xmb_handle_t*)data;
if (!xmb)
return;
if (path_file_exists(xmb->savestate_thumbnail_file_path))
task_push_image_load(xmb->savestate_thumbnail_file_path,
MENU_ENUM_LABEL_CB_MENU_SAVESTATE_THUMBNAIL,
menu_display_handle_savestate_thumbnail_upload, NULL);
else
xmb->savestate_thumbnail = 0;
}
static void xmb_selection_pointer_changed(
xmb_handle_t *xmb, bool allow_animations)
{
@ -1009,11 +1048,15 @@ static void xmb_selection_pointer_changed(
{
ia = xmb->items.active.alpha;
iz = xmb->items.active.zoom;
if (!string_is_equal(xmb_thumbnails_ident(), "OFF"))
depth = xmb_list_get_size(xmb, MENU_LIST_PLAIN);
if (!string_is_equal(xmb_thumbnails_ident(), "OFF") && depth == 1)
{
xmb_update_thumbnail_path(xmb, i);
xmb_update_thumbnail_image(xmb);
}
xmb_update_savestate_thumbnail_path(xmb, i);
xmb_update_savestate_thumbnail_image(xmb);
}
if ( (!allow_animations)
@ -1781,6 +1824,7 @@ static void xmb_populate_entries(void *data,
menu_driver_ctl(RARCH_MENU_CTL_UNSET_PREVENT_POPULATE, NULL);
if (!string_is_equal(xmb_thumbnails_ident(), "OFF"))
xmb_update_thumbnail_image(xmb);
xmb_update_savestate_thumbnail_image(xmb);
return;
}
@ -2117,7 +2161,8 @@ static void xmb_draw_items(xmb_handle_t *xmb,
if (string_is_empty(entry_value))
{
if (!string_is_equal(xmb_thumbnails_ident(), "OFF") && xmb->thumbnail)
if (xmb->savestate_thumbnail ||
(!string_is_equal(xmb_thumbnails_ident(), "OFF") && xmb->thumbnail))
ticker_limit = 40;
else
ticker_limit = 70;
@ -2515,8 +2560,15 @@ static void xmb_frame(void *data)
menu_display_rotate_z(&rotate_draw);
menu_display_blend_begin();
if (!string_is_equal(xmb_thumbnails_ident(), "OFF") && xmb->thumbnail)
xmb_draw_thumbnail(xmb, &coord_white[0], width, height);
if (xmb->savestate_thumbnail)
xmb_draw_thumbnail(xmb, &coord_white[0], width, height,
xmb->savestate_thumbnail_width, xmb->savestate_thumbnail_height,
xmb->savestate_thumbnail);
else if (xmb->thumbnail
&& !string_is_equal(xmb_thumbnails_ident(), "OFF"))
xmb_draw_thumbnail(xmb, &coord_white[0], width, height,
xmb->thumbnail_width, xmb->thumbnail_height,
xmb->thumbnail);
/* Clock image */
menu_display_set_alpha(coord_white, MIN(xmb->alpha, 1.00f));
@ -2723,6 +2775,7 @@ static void xmb_layout_ps3(xmb_handle_t *xmb, int width)
xmb->margins.screen.top = (256+32) * scale_factor;
xmb->thumbnail_width = 460.0 * scale_factor;
xmb->savestate_thumbnail_width= 460.0 * scale_factor;
xmb->cursor.size = 64.0;
xmb->icon.spacing.horizontal = 200.0 * scale_factor;
@ -2775,6 +2828,7 @@ static void xmb_layout_psp(xmb_handle_t *xmb, int width)
xmb->margins.screen.top = (256+32) * scale_factor;
xmb->thumbnail_width = 460.0 * scale_factor;
xmb->savestate_thumbnail_width= 460.0 * scale_factor;
xmb->cursor.size = 64.0;
xmb->icon.spacing.horizontal = 250.0 * scale_factor;
@ -3072,6 +3126,16 @@ static bool xmb_load_image(void *userdata, void *data, enum menu_image_type type
TEXTURE_FILTER_MIPMAP_LINEAR, &xmb->thumbnail);
}
break;
case MENU_IMAGE_SAVESTATE_THUMBNAIL:
{
struct texture_image *img = (struct texture_image*)data;
xmb->savestate_thumbnail_height = xmb->savestate_thumbnail_width
* (float)img->height / (float)img->width;
video_driver_texture_unload(&xmb->savestate_thumbnail);
video_driver_texture_load(data,
TEXTURE_FILTER_MIPMAP_LINEAR, &xmb->savestate_thumbnail);
}
break;
}
return true;
@ -3263,6 +3327,7 @@ static void xmb_context_reset(void *data)
if (!string_is_equal(xmb_thumbnails_ident(), "OFF"))
xmb_update_thumbnail_image(xmb);
xmb_update_savestate_thumbnail_image(xmb);
}
static void xmb_navigation_clear(void *data, bool pending_push)
@ -3800,4 +3865,6 @@ menu_ctx_driver_t menu_ctx_xmb = {
xmb_update_thumbnail_path,
xmb_update_thumbnail_image,
xmb_osk_ptr_at_pos,
xmb_update_savestate_thumbnail_path,
xmb_update_savestate_thumbnail_image
};

View File

@ -668,6 +668,22 @@ void menu_display_handle_thumbnail_upload(void *task_data,
free(user_data);
}
void menu_display_handle_savestate_thumbnail_upload(void *task_data,
void *user_data, const char *err)
{
menu_ctx_load_image_t load_image_info;
struct texture_image *img = (struct texture_image*)task_data;
load_image_info.data = img;
load_image_info.type = MENU_IMAGE_SAVESTATE_THUMBNAIL;
menu_driver_ctl(RARCH_MENU_CTL_LOAD_IMAGE, &load_image_info);
image_texture_free(img);
free(img);
free(user_data);
}
void menu_display_handle_wallpaper_upload(void *task_data,
void *user_data, const char *err)
{

View File

@ -249,6 +249,9 @@ void menu_display_handle_wallpaper_upload(void *task_data,
void menu_display_handle_thumbnail_upload(void *task_data,
void *user_data, const char *err);
void menu_display_handle_savestate_thumbnail_upload(void *task_data,
void *user_data, const char *err);
void menu_display_push_quad(
unsigned width, unsigned height,
const float *colors, int x1, int y1,

View File

@ -963,6 +963,24 @@ bool menu_driver_ctl(enum rarch_menu_ctl_state state, void *data)
menu_driver_ctx->update_thumbnail_image(menu_userdata);
}
break;
case RARCH_MENU_CTL_UPDATE_SAVESTATE_THUMBNAIL_PATH:
{
size_t selection;
if (!menu_navigation_ctl(MENU_NAVIGATION_CTL_GET_SELECTION, &selection))
return false;
if (!menu_driver_ctx || !menu_driver_ctx->update_savestate_thumbnail_path)
return false;
menu_driver_ctx->update_savestate_thumbnail_path(menu_userdata, selection);
}
break;
case RARCH_MENU_CTL_UPDATE_SAVESTATE_THUMBNAIL_IMAGE:
{
if (!menu_driver_ctx || !menu_driver_ctx->update_savestate_thumbnail_image)
return false;
menu_driver_ctx->update_savestate_thumbnail_image(menu_userdata);
}
break;
default:
case RARCH_MENU_CTL_NONE:
break;

View File

@ -55,7 +55,8 @@ enum menu_image_type
{
MENU_IMAGE_NONE = 0,
MENU_IMAGE_WALLPAPER,
MENU_IMAGE_THUMBNAIL
MENU_IMAGE_THUMBNAIL,
MENU_IMAGE_SAVESTATE_THUMBNAIL
};
enum menu_environ_cb
@ -145,7 +146,9 @@ enum rarch_menu_ctl_state
RARCH_MENU_CTL_OSK_PTR_AT_POS,
RARCH_MENU_CTL_BIND_INIT,
RARCH_MENU_CTL_UPDATE_THUMBNAIL_PATH,
RARCH_MENU_CTL_UPDATE_THUMBNAIL_IMAGE
RARCH_MENU_CTL_UPDATE_THUMBNAIL_IMAGE,
RARCH_MENU_CTL_UPDATE_SAVESTATE_THUMBNAIL_PATH,
RARCH_MENU_CTL_UPDATE_SAVESTATE_THUMBNAIL_IMAGE
};
enum menu_settings_type
@ -276,6 +279,8 @@ typedef struct menu_ctx_driver
void (*update_thumbnail_path)(void *data, unsigned i);
void (*update_thumbnail_image)(void *data);
int (*osk_ptr_at_pos)(void *data, int x, int y);
void (*update_savestate_thumbnail_path)(void *data, unsigned i);
void (*update_savestate_thumbnail_image)(void *data);
} menu_ctx_driver_t;
typedef struct menu_ctx_load_image

View File

@ -657,8 +657,8 @@ static int setting_handler(rarch_setting_t *setting, unsigned action)
if (setting->action_left)
{
int ret = setting->action_left(setting, false);
menu_driver_ctl(RARCH_MENU_CTL_UPDATE_THUMBNAIL_PATH, NULL);
menu_driver_ctl(RARCH_MENU_CTL_UPDATE_THUMBNAIL_IMAGE, NULL);
menu_driver_ctl(RARCH_MENU_CTL_UPDATE_SAVESTATE_THUMBNAIL_PATH, NULL);
menu_driver_ctl(RARCH_MENU_CTL_UPDATE_SAVESTATE_THUMBNAIL_IMAGE, NULL);
return ret;
}
break;
@ -666,8 +666,8 @@ static int setting_handler(rarch_setting_t *setting, unsigned action)
if (setting->action_right)
{
int ret = setting->action_right(setting, false);
menu_driver_ctl(RARCH_MENU_CTL_UPDATE_THUMBNAIL_PATH, NULL);
menu_driver_ctl(RARCH_MENU_CTL_UPDATE_THUMBNAIL_IMAGE, NULL);
menu_driver_ctl(RARCH_MENU_CTL_UPDATE_SAVESTATE_THUMBNAIL_PATH, NULL);
menu_driver_ctl(RARCH_MENU_CTL_UPDATE_SAVESTATE_THUMBNAIL_IMAGE, NULL);
return ret;
}
break;

View File

@ -1476,6 +1476,7 @@ enum msg_hash_enums
MENU_ENUM_LABEL_CB_LAKKA_DOWNLOAD,
MENU_ENUM_LABEL_CB_LAKKA_LIST,
MENU_ENUM_LABEL_CB_MENU_THUMBNAIL,
MENU_ENUM_LABEL_CB_MENU_SAVESTATE_THUMBNAIL,
MENU_ENUM_LABEL_CB_MENU_WALLPAPER,
MENU_ENUM_LABEL_CB_THUMBNAILS_UPDATER_DOWNLOAD,
MENU_ENUM_LABEL_CB_THUMBNAILS_UPDATER_LIST,