From b6e95a1225ccc6146553246973281b8eb52a7bdd Mon Sep 17 00:00:00 2001 From: retro-wertz Date: Mon, 4 Sep 2017 19:20:27 +0800 Subject: [PATCH] palette: Allow loading external palette file --- src/drivers/libretro/libretro.c | 21 +++++++++++++++++++-- src/general.c | 7 ++----- src/palette.c | 2 +- src/palette.h | 1 + 4 files changed, 23 insertions(+), 8 deletions(-) diff --git a/src/drivers/libretro/libretro.c b/src/drivers/libretro/libretro.c index 19f04d6..d5230b0 100644 --- a/src/drivers/libretro/libretro.c +++ b/src/drivers/libretro/libretro.c @@ -197,6 +197,7 @@ FILE *FCEUD_UTF8fopen(const char *n, const char *m) /*palette for FCEU*/ #define MAXPAL 28 /* max # of palettes in array + 2 for "default" and "raw" */ +int external_palette_exist = 0; struct st_palettes { char name[32]; @@ -728,7 +729,7 @@ void retro_set_controller_port_device(unsigned a, unsigned b) void retro_set_environment(retro_environment_t cb) { static const struct retro_variable vars[] = { - { "fceumm_palette", "Color Palette; default|asqrealc|loopy|quor|chris|matt|pasofami|crashman|mess|zaphod-cv|zaphod-smb|vs-drmar|vs-cv|vs-smb|nintendo-vc|yuv-v3|unsaturated-final|sony-cxa2025as-us|pal|bmf-final2|bmf-final3|smooth-fbx|composite-direct-fbx|pvm-style-d93-fbx|ntsc-hardware-fbx|nes-classic-fbx-fs|nescap|wavebeam|raw" }, + { "fceumm_palette", "Color Palette; default|asqrealc|loopy|quor|chris|matt|pasofami|crashman|mess|zaphod-cv|zaphod-smb|vs-drmar|vs-cv|vs-smb|nintendo-vc|yuv-v3|unsaturated-final|sony-cxa2025as-us|pal|bmf-final2|bmf-final3|smooth-fbx|composite-direct-fbx|pvm-style-d93-fbx|ntsc-hardware-fbx|nes-classic-fbx-fs|nescap|wavebeam|raw|custom" }, { "fceumm_nospritelimit", "No Sprite Limit; disabled|enabled" }, { "fceumm_overclocking", "Overclocking; disabled|2x-Postrender|2x-VBlank" }, #ifdef PSP @@ -809,10 +810,21 @@ static void retro_set_custom_palette (void) { uint8_t i,r,g,b; + ipalette = 0; use_raw_palette = false; - if (current_palette == 0) /* default palette */ + if (current_palette == 0 || current_palette > MAXPAL) { + if (current_palette > MAXPAL) + { + if (external_palette_exist) + ipalette = 1; + else + { + FCEU_PrintError("nes.pal not found in system directory.\n"); + FCEU_PrintError("Using default palette instead.\n"); + } + } FCEU_ResetPalette(); /* Do palette reset*/ return; } @@ -996,6 +1008,8 @@ static void check_variables(bool startup) current_palette = 27; else if (!strcmp(var.value, "raw")) current_palette = MAXPAL; + else if (!strcmp(var.value, "custom")) + current_palette = MAXPAL+1; if (current_palette != orig_value) retro_set_custom_palette(); @@ -1798,6 +1812,9 @@ bool retro_load_game(const struct retro_game_info *game) FCEUI_SetInput(0, SI_GAMEPAD, &JSReturn[0], 0); FCEUI_SetInput(1, SI_GAMEPAD, &JSReturn[0], 0); + FCEU_LoadGamePalette(); /* check and load external palette nes.pal... */ + external_palette_exist = ipalette; /* save status if found or not */ + retro_set_custom_palette(); FCEUD_SoundToggle(); diff --git a/src/general.c b/src/general.c index b516df8..6071015 100644 --- a/src/general.c +++ b/src/general.c @@ -82,13 +82,10 @@ char *FCEU_MakeFName(int type, int id1, char *cd1) sprintf(tmp, "%s"PSS "disksys.rom", BaseDirectory); break; case FCEUMKF_PALETTE: - if (odirs[FCEUIOD_MISC]) - sprintf(tmp, "%s"PSS "%s.pal", odirs[FCEUIOD_MISC], FileBase); - else - sprintf(tmp, "%s"PSS "gameinfo"PSS "%s.pal", BaseDirectory, FileBase); + sprintf(tmp, "%s"PSS "nes.pal", BaseDirectory); break; case FCEUMKF_FDS: - sprintf(tmp, "%s"PSS "%s.sav", SaveDirectory, FileBase); + sprintf(tmp, "%s"PSS "%s.sav", SaveDirectory, FileBase); break; default: break; diff --git a/src/palette.c b/src/palette.c index f24145f..7ed6147 100644 --- a/src/palette.c +++ b/src/palette.c @@ -182,7 +182,7 @@ static void CalculatePalette(void) { WritePalette(); } -static int ipalette = 0; +int ipalette = 0; void FCEU_LoadGamePalette(void) { uint8 ptmp[192]; diff --git a/src/palette.h b/src/palette.h index 2dbda31..3ca03b5 100644 --- a/src/palette.h +++ b/src/palette.h @@ -6,6 +6,7 @@ typedef struct { } pal; extern pal *palo; +extern int ipalette; void FCEU_ResetPalette(void); void FCEU_ResetPalette(void);