diff options
author | neonloop | 2021-08-21 00:10:44 +0000 |
---|---|---|
committer | neonloop | 2021-08-21 00:10:44 +0000 |
commit | 41fff233f29b6ee7274f4bf525052dcf0fa56c00 (patch) | |
tree | cfcc8fc9ae57b694d353cba8752a1f8fd99dc78e | |
parent | f89bcd0179f4e07fe403894053c624d4983090c3 (diff) | |
download | picoarch-41fff233f29b6ee7274f4bf525052dcf0fa56c00.tar.gz picoarch-41fff233f29b6ee7274f4bf525052dcf0fa56c00.tar.bz2 picoarch-41fff233f29b6ee7274f4bf525052dcf0fa56c00.zip |
Updates message display and adds loading message to pcsx
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | config.c | 1 | ||||
-rw-r--r-- | core.c | 7 | ||||
-rw-r--r-- | main.c | 15 | ||||
-rw-r--r-- | main.h | 13 | ||||
-rw-r--r-- | menu.c | 3 | ||||
-rw-r--r-- | options.c | 39 | ||||
-rw-r--r-- | overrides.c | 2 | ||||
-rw-r--r-- | overrides.h | 6 | ||||
-rw-r--r-- | overrides/pcsx_rearmed.h | 8 | ||||
-rw-r--r-- | plat.h | 4 | ||||
-rw-r--r-- | plat_linux.c | 3 | ||||
-rw-r--r-- | plat_sdl.c | 39 | ||||
-rw-r--r-- | plat_trimui.c | 3 | ||||
-rw-r--r-- | unzip.c | 3 | ||||
-rw-r--r-- | util.c | 29 | ||||
-rw-r--r-- | util.h | 21 |
17 files changed, 133 insertions, 65 deletions
@@ -6,7 +6,7 @@ SYSROOT = $(shell $(CC) --print-sysroot) PROCS = -j4 -OBJS = libpicofe/input.o libpicofe/in_sdl.o libpicofe/linux/in_evdev.o libpicofe/linux/plat.o libpicofe/fonts.o libpicofe/readpng.o libpicofe/config_file.o config.o core.o menu.o main.o options.o overrides.o scale.o unzip.o +OBJS = libpicofe/input.o libpicofe/in_sdl.o libpicofe/linux/in_evdev.o libpicofe/linux/plat.o libpicofe/fonts.o libpicofe/readpng.o libpicofe/config_file.o config.o core.o menu.o main.o options.o overrides.o scale.o unzip.o util.o BIN = picoarch @@ -4,6 +4,7 @@ #include "main.h" #include "options.h" #include "scale.h" +#include "util.h" typedef enum { CE_TYPE_STR = 0, @@ -13,6 +13,7 @@ #include "overrides.h" #include "plat.h" #include "unzip.h" +#include "util.h" #define PATH_SEPARATOR_CHAR '/' @@ -390,9 +391,11 @@ static bool pa_environment(unsigned cmd, void *data) { break; } case RETRO_ENVIRONMENT_SET_MESSAGE: { /* 6 */ - /* Just warn for now. TODO: Display on the screen */ const struct retro_message *message = (const struct retro_message*)data; - PA_WARN(message->msg); + if (message) { + PA_INFO("%s\n", message->msg); + } + break; } case RETRO_ENVIRONMENT_GET_SYSTEM_DIRECTORY: { /* 9 */ @@ -381,7 +381,7 @@ void handle_emu_action(emu_action action) case EACTION_TOGGLE_FPS: show_fps = !show_fps; /* Force the hud to clear */ - plat_video_set_msg(" "); + plat_video_set_msg(NULL, 0, 0); break; case EACTION_SAVE_STATE: state_write(); @@ -432,6 +432,13 @@ void pa_log(enum retro_log_level level, const char *fmt, ...) { } } +static void show_startup_message(void) { + const struct core_override *override = get_overrides(); + if (override && override->startup_msg) { + plat_video_set_msg(override->startup_msg->msg, 2, override->startup_msg->msec); + } +} + void pa_track_render(void) { renders++; } @@ -454,12 +461,13 @@ static void count_fps(void) vsyncs = 0; renders = 0; nextsec = ticks + 1000; + + snprintf(msg, HUD_LEN, "FPS: %.1f (%.0f)", rendersps, vsyncsps); + plat_video_set_msg(msg, 1, 1100); } } vsyncs++; - snprintf(msg, HUD_LEN, "FPS: %.1f (%.0f)", rendersps, vsyncsps); - plat_video_set_msg(msg); } } @@ -534,6 +542,7 @@ int main(int argc, char **argv) { } #endif + show_startup_message(); do { count_fps(); adjust_audio(); @@ -2,7 +2,6 @@ #define __MAIN_H__ #include <stdbool.h> -#include <string.h> #include "options.h" #include "libretro.h" @@ -30,18 +29,6 @@ extern void* mmenu; extern char save_template_path[MAX_PATH]; #endif - -#define MAX(a, b) (a) > (b) ? (a) : (b) -#define MIN(a, b) (a) < (b) ? (a) : (b) - -static inline bool has_suffix_i(const char *str, const char *suffix) { - const char *p = strrchr(str, suffix[0]); - if (!p) p = str; - return !strcasecmp(p, suffix); -} - -#define array_size(x) (sizeof(x) / sizeof(x[0])) - #ifdef DEBUG_LOGGING #define PA_DEBUG(...) pa_log(RETRO_LOG_DEBUG, __VA_ARGS__) #else @@ -6,6 +6,7 @@ #include "overrides.h" #include "plat.h" #include "scale.h" +#include "util.h" static int drew_alt_bg = 0; @@ -435,7 +436,7 @@ void menu_loop(void) ; /* Force the hud to clear */ - plat_video_set_msg(" "); + plat_video_set_msg(NULL, 0, 0); plat_video_menu_leave(); } @@ -4,6 +4,7 @@ #include "main.h" #include "options.h" #include "overrides.h" +#include "util.h" int show_fps; int limit_frames; @@ -18,36 +19,6 @@ struct core_options core_options; #define MAX_LINE_LEN 52 #define MAX_LINES 3 -static void truncate(char *string, size_t max_len) { - size_t len = strlen(string) + 1; - if (len <= max_len) return; - - strncpy(&string[max_len - 4], "...\0", 4); -} - -static void wrap(char *string, size_t max_len, size_t max_lines) { - char *line = string; - - for (size_t i = 1; i < max_lines; i++) { - char *p = line; - char *prev; - do { - prev = p; - p = strchr(prev+1, ' '); - } while (p && p - line < (int)max_len); - - if (!p && strlen(line) < max_len) break; - - if (prev && prev != line) { - line = prev + 1; - *prev = '\n'; - } - } - truncate(line, max_len); - - return; -} - static int options_default_index(const struct core_option_entry* entry, const char *default_value) { const char *value; if (!default_value) @@ -123,7 +94,7 @@ void options_init(const struct retro_core_option_definition *defs) { } strncpy(entry->desc, desc, len); - truncate(entry->desc, MAX_DESC_LEN); + string_truncate(entry->desc, MAX_DESC_LEN); if (info) { len = strlen(info) + 1; @@ -134,7 +105,7 @@ void options_init(const struct retro_core_option_definition *defs) { return; } strncpy(entry->info, info, len); - wrap(entry->info, MAX_LINE_LEN, MAX_LINES); + string_wrap(entry->info, MAX_LINE_LEN, MAX_LINES); } for (j = 0; def->values[j].value; j++) @@ -240,7 +211,7 @@ void options_init_variables(const struct retro_variable *vars) { return; } strncpy(entry->info, info, len); - wrap(entry->info, MAX_LINE_LEN, MAX_LINES); + string_wrap(entry->info, MAX_LINE_LEN, MAX_LINES); } entry->blocked = CORE_OVERRIDE(override, blocked, false); @@ -264,7 +235,7 @@ void options_init_variables(const struct retro_variable *vars) { if (p && *(p + 1) == ' ') { *p = '\0'; entry->desc = value; - truncate(entry->desc, MAX_DESC_LEN); + string_truncate(entry->desc, MAX_DESC_LEN); p++; p++; } diff --git a/overrides.c b/overrides.c index d8914ce..998110f 100644 --- a/overrides.c +++ b/overrides.c @@ -1,4 +1,3 @@ -#include "main.h" #include "overrides.h" #include "overrides/gambatte.h" #include "overrides/gpsp.h" @@ -6,6 +5,7 @@ #include "overrides/pcsx_rearmed.h" #include "overrides/snes9x2002.h" #include "overrides/snes9x2005.h" +#include "util.h" static const struct core_override overrides[] = { gambatte_overrides, diff --git a/overrides.h b/overrides.h index cba4308..0d378af 100644 --- a/overrides.h +++ b/overrides.h @@ -21,9 +21,15 @@ struct core_override_fast_forward { const char *interval_value; }; +struct core_override_startup_msg { + const char *msg; + const unsigned msec; +}; + struct core_override { const char *core_name; const struct core_override_fast_forward *fast_forward; + const struct core_override_startup_msg *startup_msg; me_bind_action* actions; const size_t action_size; const struct core_override_option* options; diff --git a/overrides/pcsx_rearmed.h b/overrides/pcsx_rearmed.h index 1b463cf..daf0ea6 100644 --- a/overrides/pcsx_rearmed.h +++ b/overrides/pcsx_rearmed.h @@ -181,10 +181,16 @@ const struct core_override_fast_forward pcsx_rearmed_fast_forward = { .interval_key = "pcsx_rearmed_frameskip_interval" }; +const struct core_override_startup_msg pcsx_rearmed_startup_msg = { + .msg = "Loading...", + .msec = 3000, +}; + #define pcsx_rearmed_overrides { \ .core_name = "pcsx_rearmed", \ .fast_forward = &pcsx_rearmed_fast_forward, \ + .startup_msg = &pcsx_rearmed_startup_msg, \ .actions = pcsx_rearmed_ctrl_actions, \ .action_size = array_size(pcsx_rearmed_ctrl_actions), \ - .options = pcsx_rearmed_core_option_overrides \ + .options = pcsx_rearmed_core_option_overrides, \ } @@ -8,7 +8,7 @@ struct audio_frame { int16_t right; }; -#define HUD_LEN 39 +#define HUD_LEN 41 int plat_init(void); void plat_finish(void); @@ -19,7 +19,7 @@ int plat_dump_screen(const char *filename); int plat_load_screen(const char *filename, void *buf, size_t buf_size, int *w, int *h, int *bpp); void plat_video_open(void); -void plat_video_set_msg(const char *new_msg); +void plat_video_set_msg(const char *new_msg, unsigned priority, unsigned msec); void plat_video_process(const void *data, unsigned width, unsigned height, size_t pitch); void plat_video_flip(void); void plat_video_close(void); diff --git a/plat_linux.c b/plat_linux.c index a087ca6..bc57f3c 100644 --- a/plat_linux.c +++ b/plat_linux.c @@ -1,9 +1,10 @@ #include <SDL/SDL.h> -#include "main.h" #include "libretro.h" #include "libpicofe/plat.h" #include "libpicofe/input.h" #include "libpicofe/in_sdl.h" +#include "main.h" +#include "util.h" #define SAMPLE_RATE 48000 @@ -5,6 +5,7 @@ #include "menu.h" #include "plat.h" #include "scale.h" +#include "util.h" static SDL_Surface* screen; @@ -22,6 +23,21 @@ struct audio_state { struct audio_state audio; static char msg[HUD_LEN]; +static unsigned msg_priority = 0; +static unsigned msg_expire = 0; + +static void video_expire_msg(void) +{ + msg[0] = '\0'; + msg_priority = 0; + msg_expire = 0; +} + +static void video_update_msg(void) +{ + if (msg[0] && msg_expire < plat_get_ticks_ms()) + video_expire_msg(); +} static void video_clear_msg(uint16_t *dst, uint32_t h, uint32_t pitch) { @@ -169,29 +185,42 @@ void plat_video_open(void) { } -void plat_video_set_msg(const char *new_msg) +void plat_video_set_msg(const char *new_msg, unsigned priority, unsigned msec) { - snprintf(msg, HUD_LEN, "%s", new_msg); + if (!new_msg) { + video_expire_msg(); + } else if (priority >= msg_priority) { + snprintf(msg, HUD_LEN, "%s", new_msg); + string_truncate(msg, HUD_LEN - 1); + msg_priority = priority; + msg_expire = plat_get_ticks_ms() + msec; + } } void plat_video_process(const void *data, unsigned width, unsigned height, size_t pitch) { + static int had_msg = 0; SDL_LockSurface(screen); - if (msg[0]) + if (had_msg) { video_clear_msg(screen->pixels, screen->h, screen->pitch / SCREEN_BPP); + had_msg = 0; + } scale(width, height, pitch, data, screen->pixels); - if (msg[0]) + if (msg[0]) { video_print_msg(screen->pixels, screen->h, screen->pitch / SCREEN_BPP, msg); + had_msg = 1; + } SDL_UnlockSurface(screen); + + video_update_msg(); } void plat_video_flip(void) { fb_flip(); - msg[0] = 0; } void plat_video_close(void) diff --git a/plat_trimui.c b/plat_trimui.c index f50b2ed..eee7c19 100644 --- a/plat_trimui.c +++ b/plat_trimui.c @@ -1,9 +1,10 @@ #include <SDL/SDL.h> -#include "main.h" #include "libretro.h" #include "libpicofe/plat.h" #include "libpicofe/input.h" #include "libpicofe/in_sdl.h" +#include "main.h" +#include "util.h" #define SAMPLE_RATE 48000 @@ -1,7 +1,10 @@ +#include <stdbool.h> +#include <stdint.h> #include <stdlib.h> #include <string.h> #include "main.h" #include "unzip.h" +#include "util.h" #include "zlib.h" #define HEADER_SIZE 30 @@ -0,0 +1,29 @@ +#include "util.h" + +void string_truncate(char *string, size_t max_len) { + size_t len = strlen(string) + 1; + if (len <= max_len) return; + + strncpy(&string[max_len - 4], "...\0", 4); +} + +void string_wrap(char *string, size_t max_len, size_t max_lines) { + char *line = string; + + for (size_t i = 1; i < max_lines; i++) { + char *p = line; + char *prev; + do { + prev = p; + p = strchr(prev+1, ' '); + } while (p && p - line < (int)max_len); + + if (!p && strlen(line) < max_len) break; + + if (prev && prev != line) { + line = prev + 1; + *prev = '\n'; + } + } + string_truncate(line, max_len); +} @@ -0,0 +1,21 @@ +#ifndef UTIL_H +#define UTIL_H + +#include <stdbool.h> +#include <string.h> + +#define MAX(a, b) (a) > (b) ? (a) : (b) +#define MIN(a, b) (a) < (b) ? (a) : (b) + +#define array_size(x) (sizeof(x) / sizeof(x[0])) + +static inline bool has_suffix_i(const char *str, const char *suffix) { + const char *p = strrchr(str, suffix[0]); + if (!p) p = str; + return !strcasecmp(p, suffix); +} + +void string_truncate(char *string, size_t max_len); +void string_wrap(char *string, size_t max_len, size_t max_lines); + +#endif |