From d370e2d37f9baa26e546e3542104ed04e1bf8965 Mon Sep 17 00:00:00 2001 From: aliaspider Date: Thu, 19 Mar 2015 23:16:52 +0100 Subject: [PATCH] add a 'raw palette' option that can be decoded by the frontend. --- src/drivers/libretro/libretro.c | 57 +++++++++++++++++++++++++++++---- 1 file changed, 50 insertions(+), 7 deletions(-) diff --git a/src/drivers/libretro/libretro.c b/src/drivers/libretro/libretro.c index 3dc42a9..b97e0c4 100644 --- a/src/drivers/libretro/libretro.c +++ b/src/drivers/libretro/libretro.c @@ -37,6 +37,7 @@ static retro_input_state_t input_cb = NULL; static retro_audio_sample_batch_t audio_batch_cb = NULL; static retro_environment_t environ_cb = NULL; static bool use_overscan; +static bool use_raw_palette; /* emulator-specific variables */ @@ -466,7 +467,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[] = { - { "nes_palette", "Color Palette; asqrealc|loopy|quor|chris|matt|pasofami|crashman|mess|zaphod-cv|zaphod-smb|vs-drmar|vs-cv|vs-smb|nintendo-vc" }, + { "nes_palette", "Color Palette; asqrealc|loopy|quor|chris|matt|pasofami|crashman|mess|zaphod-cv|zaphod-smb|vs-drmar|vs-cv|vs-smb|nintendo-vc|raw" }, { NULL, NULL }, }; @@ -531,12 +532,27 @@ static void emulator_set_custom_palette (void) { uint8 i,r,g,b; + use_raw_palette = false; + if (current_palette == 0) { FCEU_ResetPalette(); /* Do palette reset*/ return; } + if (current_palette == 15) /* raw palette */ + { + use_raw_palette = true; + for (i = 0; i < 64; i++) + { + r = (((i >> 0) & 0xF) * 255) / 15; + g = (((i >> 4) & 0x3) * 255) / 3; + FCEUD_SetPalette( i, r, g, 0); + } + return; + } + + /* Setup this palette*/ for ( i = 0; i < 64; i++ ) @@ -643,6 +659,8 @@ static void check_variables(void) current_palette = 13; else if (strcmp(var.value, "nintendo-vc") == 0) current_palette = 14; + else if (strcmp(var.value, "raw") == 0) + current_palette = 15; if (current_palette != orig_value) emulator_set_custom_palette(); @@ -728,9 +746,21 @@ void retro_run(void) #ifndef PSP pitch = 512; gfx = XBuf; - for (y = 0; y < height; y++) - for ( x = 0; x < width; x++, gfx++) - video_out[y * width + x] = retro_palette[*gfx]; + if (use_raw_palette) + { + extern uint8 PPU[4]; + int deemp = (PPU[1] >> 5) << 2; + for (y = 0; y < height; y++) + for ( x = 0; x < width; x++, gfx++) + video_out[y * width + x] = retro_palette[*gfx & 0x3F] | deemp; + + } + else + { + for (y = 0; y < height; y++) + for ( x = 0; x < width; x++, gfx++) + video_out[y * width + x] = retro_palette[*gfx]; + } #endif } else @@ -741,9 +771,22 @@ void retro_run(void) #ifndef PSP pitch = 512 - 32; gfx = XBuf + 8 + 256 * 8; - for (y = 0; y < height; y++, gfx += 16) - for ( x = 0; x < width; x++, gfx++) - video_out[y * width + x] = retro_palette[*gfx]; + + if (use_raw_palette) + { + extern uint8 PPU[4]; + int deemp = (PPU[1] >> 5) << 2; + for (y = 0; y < height; y++, gfx += 16) + for ( x = 0; x < width; x++, gfx++) + video_out[y * width + x] = retro_palette[*gfx & 0x3F] | deemp; + + } + else + { + for (y = 0; y < height; y++, gfx += 16) + for ( x = 0; x < width; x++, gfx++) + video_out[y * width + x] = retro_palette[*gfx]; + } #endif }