[Gamecube/Wii] added configurable NTSC filter

This commit is contained in:
EkeEke 2014-04-01 20:09:55 +02:00
parent 7dbeddece1
commit 3b95a6eaee
4 changed files with 178 additions and 43 deletions

View File

@ -3,7 +3,7 @@
* *
* Genesis Plus GX configuration file support * Genesis Plus GX configuration file support
* *
* Copyright Eke-Eke (2007-2013) * Copyright Eke-Eke (2007-2014)
* *
* Redistribution and use of this code or any derivative works are permitted * Redistribution and use of this code or any derivative works are permitted
* provided that the following conditions are met: * provided that the following conditions are met:
@ -164,6 +164,13 @@ void config_default(void)
config.gamma = VI_GM_1_0 / 10.0; config.gamma = VI_GM_1_0 / 10.0;
#endif #endif
/* NTSC filter options */
config.ntsc_sharpness = 0.0;
config.ntsc_resolution = 0.0;
config.ntsc_artifacts = 0.0;
config.ntsc_fringing = 0.0;
config.ntsc_bleed = 0.0;
/* controllers options */ /* controllers options */
config.gun_cursor[0] = 1; config.gun_cursor[0] = 1;
config.gun_cursor[1] = 1; config.gun_cursor[1] = 1;

View File

@ -3,7 +3,7 @@
* *
* Genesis Plus GX configuration file support * Genesis Plus GX configuration file support
* *
* Copyright Eke-Eke (2007-2013) * Copyright Eke-Eke (2007-2014)
* *
* Redistribution and use of this code or any derivative works are permitted * Redistribution and use of this code or any derivative works are permitted
* provided that the following conditions are met: * provided that the following conditions are met:
@ -111,6 +111,11 @@ typedef struct
float bgm_volume; float bgm_volume;
float sfx_volume; float sfx_volume;
char lastdir[FILETYPE_MAX][TYPE_RECENT][MAXPATHLEN]; char lastdir[FILETYPE_MAX][TYPE_RECENT][MAXPATHLEN];
float ntsc_sharpness;
float ntsc_resolution;
float ntsc_artifacts;
float ntsc_fringing;
float ntsc_bleed;
} t_config; } t_config;
/* Global data */ /* Global data */

View File

@ -370,9 +370,9 @@ static gui_item items_system[10] =
/* Video options */ /* Video options */
#ifdef HW_RVL #ifdef HW_RVL
static gui_item items_video[13] = static gui_item items_video[18] =
#else #else
static gui_item items_video[11] = static gui_item items_video[16] =
#endif #endif
{ {
{NULL,NULL,"Display: PROGRESSIVE", "Select video mode", 56,132,276,48}, {NULL,NULL,"Display: PROGRESSIVE", "Select video mode", 56,132,276,48},
@ -385,6 +385,11 @@ static gui_item items_video[11] =
{NULL,NULL,"VI Gamma Correction: 1.0", "Adjust video hardware gamma correction", 56,132,276,48}, {NULL,NULL,"VI Gamma Correction: 1.0", "Adjust video hardware gamma correction", 56,132,276,48},
#endif #endif
{NULL,NULL,"NTSC Filter: COMPOSITE", "Enable/disable NTSC software filtering", 56,132,276,48}, {NULL,NULL,"NTSC Filter: COMPOSITE", "Enable/disable NTSC software filtering", 56,132,276,48},
{NULL,NULL,"NTSC Sharpness: 0.0", "Adjust edge contrast enhancement/blurring", 56,132,276,48},
{NULL,NULL,"NTSC Resolution: 0.0", "Adjust image resolution", 56,132,276,48},
{NULL,NULL,"NTSC Artifacts: 0.0", "Adjust artifacts caused by color changes", 56,132,276,48},
{NULL,NULL,"NTSC Color Bleed: 0.0", "Adjust color resolution reduction", 56,132,276,48},
{NULL,NULL,"NTSC Color Fringing: 0.0", "Adjust artifacts caused by brightness changes", 56,132,276,48},
{NULL,NULL,"Borders: OFF", "Enable/disable overscan emulation", 56,132,276,48}, {NULL,NULL,"Borders: OFF", "Enable/disable overscan emulation", 56,132,276,48},
{NULL,NULL,"GG screen: ORIGINAL", "Enable/disable Game Gear extended screen", 56,132,276,48}, {NULL,NULL,"GG screen: ORIGINAL", "Enable/disable Game Gear extended screen", 56,132,276,48},
{NULL,NULL,"Aspect: ORIGINAL (4:3)", "Select display aspect ratio", 56,132,276,48}, {NULL,NULL,"Aspect: ORIGINAL (4:3)", "Select display aspect ratio", 56,132,276,48},
@ -1480,6 +1485,7 @@ static void videomenu ()
int reinit = 0; int reinit = 0;
gui_menu *m = &menu_video; gui_menu *m = &menu_video;
gui_item *items = m->items; gui_item *items = m->items;
int ntsc_offset = 0;
if (config.render == 1) if (config.render == 1)
sprintf (items[0].text,"Display: INTERLACED"); sprintf (items[0].text,"Display: INTERLACED");
@ -1514,39 +1520,60 @@ static void videomenu ()
sprintf (items[VI_OFFSET].text, "NTSC Filter: S-VIDEO"); sprintf (items[VI_OFFSET].text, "NTSC Filter: S-VIDEO");
else if (config.ntsc == 3) else if (config.ntsc == 3)
sprintf (items[VI_OFFSET].text, "NTSC Filter: RGB"); sprintf (items[VI_OFFSET].text, "NTSC Filter: RGB");
else if (config.ntsc == 4)
{
sprintf (items[VI_OFFSET].text, "NTSC Filter: MANUAL");
sprintf(items[VI_OFFSET+1].text, "NTSC Sharpness: %1.2f", config.ntsc_sharpness);
sprintf(items[VI_OFFSET+2].text, "NTSC Resolution: %1.2f", config.ntsc_resolution);
sprintf(items[VI_OFFSET+3].text, "NTSC Artifacts: %1.2f", config.ntsc_artifacts);
sprintf(items[VI_OFFSET+4].text, "NTSC Color Bleed: %1.2f", config.ntsc_bleed);
sprintf(items[VI_OFFSET+5].text, "NTSC Color Fringing: %1.2f", config.ntsc_fringing);
strcpy(items[VI_OFFSET+1].comment, "Adjust edge contrast enhancement/blurring");
strcpy(items[VI_OFFSET+2].comment, "Adjust image resolution");
strcpy(items[VI_OFFSET+3].comment, "Adjust artifacts caused by color changes");
strcpy(items[VI_OFFSET+4].comment, "Adjust color resolution reduction");
strcpy(items[VI_OFFSET+5].comment, "Adjust artifacts caused by brightness changes");
ntsc_offset = 5;
}
else else
sprintf (items[VI_OFFSET].text, "NTSC Filter: OFF"); sprintf (items[VI_OFFSET].text, "NTSC Filter: OFF");
if (config.overscan == 3) strcpy(items[VI_OFFSET+1+ntsc_offset].comment, "Enable/disable overscan emulation");
sprintf (items[VI_OFFSET+1].text, "Borders: FULL"); strcpy(items[VI_OFFSET+2+ntsc_offset].comment, "Enable/disable Game Gear extended screen");
else if (config.overscan == 2) strcpy(items[VI_OFFSET+3+ntsc_offset].comment, "Select display aspect ratio");
sprintf (items[VI_OFFSET+1].text, "Borders: H ONLY"); strcpy(items[VI_OFFSET+4+ntsc_offset].comment, "Adjust display position");
else if (config.overscan == 1) strcpy(items[VI_OFFSET+5+ntsc_offset].comment, "Adjust display scaling");
sprintf (items[VI_OFFSET+1].text, "Borders: V ONLY");
else
sprintf (items[VI_OFFSET+1].text, "Borders: NONE");
sprintf(items[VI_OFFSET+2].text, "GG Screen: %s", config.gg_extra ? "EXTENDED":"ORIGINAL"); if (config.overscan == 3)
sprintf (items[VI_OFFSET+1+ntsc_offset].text, "Borders: FULL");
else if (config.overscan == 2)
sprintf (items[VI_OFFSET+1+ntsc_offset].text, "Borders: H ONLY");
else if (config.overscan == 1)
sprintf (items[VI_OFFSET+1+ntsc_offset].text, "Borders: V ONLY");
else
sprintf (items[VI_OFFSET+1+ntsc_offset].text, "Borders: NONE");
sprintf(items[VI_OFFSET+2+ntsc_offset].text, "GG Screen: %s", config.gg_extra ? "EXTENDED":"ORIGINAL");
if (config.aspect == 1) if (config.aspect == 1)
sprintf (items[VI_OFFSET+3].text,"Aspect: ORIGINAL (4:3)"); sprintf (items[VI_OFFSET+3+ntsc_offset].text,"Aspect: ORIGINAL (4:3)");
else if (config.aspect == 2) else if (config.aspect == 2)
sprintf (items[VI_OFFSET+3].text, "Aspect: ORIGINAL (16:9)"); sprintf (items[VI_OFFSET+3+ntsc_offset].text, "Aspect: ORIGINAL (16:9)");
else else
sprintf (items[VI_OFFSET+3].text, "Aspect: SCALED"); {
sprintf (items[VI_OFFSET+3+ntsc_offset].text, "Aspect: SCALED");
m->max_items++;
}
sprintf (items[VI_OFFSET+4].text, "Screen Position: (%s%02d,%s%02d)", sprintf (items[VI_OFFSET+4+ntsc_offset].text, "Screen Position: (%s%02d,%s%02d)",
(config.xshift < 0) ? "":"+", config.xshift, (config.xshift < 0) ? "":"+", config.xshift,
(config.yshift < 0) ? "":"+", config.yshift); (config.yshift < 0) ? "":"+", config.yshift);
sprintf (items[VI_OFFSET+5].text, "Screen Scaling: (%s%02d,%s%02d)", sprintf (items[VI_OFFSET+5+ntsc_offset].text, "Screen Scaling: (%s%02d,%s%02d)",
(config.xscale < 0) ? "":"+", config.xscale, (config.xscale < 0) ? "":"+", config.xscale,
(config.yscale < 0) ? "":"+", config.yscale); (config.yscale < 0) ? "":"+", config.yscale);
if (config.aspect) m->max_items = VI_OFFSET + 5 + ntsc_offset + (config.aspect == 0);
m->max_items = VI_OFFSET+5;
else
m->max_items = VI_OFFSET+6;
GUI_InitMenu(m); GUI_InitMenu(m);
GUI_SlideMenuTitle(m,strlen("Video ")); GUI_SlideMenuTitle(m,strlen("Video "));
@ -1555,6 +1582,11 @@ static void videomenu ()
{ {
ret = GUI_RunMenu(m); ret = GUI_RunMenu(m);
if (ret > VI_OFFSET)
{
ret += (5 - ntsc_offset);
}
switch (ret) switch (ret)
{ {
case 0: /*** rendering ***/ case 0: /*** rendering ***/
@ -1643,64 +1675,135 @@ static void videomenu ()
#endif #endif
case VI_OFFSET: /*** NTSC filter ***/ case VI_OFFSET: /*** NTSC filter ***/
config.ntsc = (config.ntsc + 1) & 3; config.ntsc = (config.ntsc + 1) % 5;
if (config.ntsc == 1) if (config.ntsc == 1)
{
sprintf (items[VI_OFFSET].text, "NTSC Filter: COMPOSITE"); sprintf (items[VI_OFFSET].text, "NTSC Filter: COMPOSITE");
}
else if (config.ntsc == 2) else if (config.ntsc == 2)
{
sprintf (items[VI_OFFSET].text, "NTSC Filter: S-VIDEO"); sprintf (items[VI_OFFSET].text, "NTSC Filter: S-VIDEO");
}
else if (config.ntsc == 3) else if (config.ntsc == 3)
{
sprintf (items[VI_OFFSET].text, "NTSC Filter: RGB"); sprintf (items[VI_OFFSET].text, "NTSC Filter: RGB");
}
else if (config.ntsc == 4)
{
sprintf (items[VI_OFFSET].text, "NTSC Filter: MANUAL");
strcpy(items[VI_OFFSET+5+1].text, items[VI_OFFSET+1].text);
strcpy(items[VI_OFFSET+5+2].text, items[VI_OFFSET+2].text);
strcpy(items[VI_OFFSET+5+3].text, items[VI_OFFSET+3].text);
strcpy(items[VI_OFFSET+5+4].text, items[VI_OFFSET+4].text);
strcpy(items[VI_OFFSET+5+5].text, items[VI_OFFSET+5].text);
strcpy(items[VI_OFFSET+5+1].comment, items[VI_OFFSET+1].comment);
strcpy(items[VI_OFFSET+5+2].comment, items[VI_OFFSET+2].comment);
strcpy(items[VI_OFFSET+5+3].comment, items[VI_OFFSET+3].comment);
strcpy(items[VI_OFFSET+5+4].comment, items[VI_OFFSET+4].comment);
strcpy(items[VI_OFFSET+5+5].comment, items[VI_OFFSET+5].comment);
sprintf(items[VI_OFFSET+1].text, "NTSC Sharpness: %1.1f", config.ntsc_sharpness);
sprintf(items[VI_OFFSET+2].text, "NTSC Resolution: %1.1f", config.ntsc_resolution);
sprintf(items[VI_OFFSET+3].text, "NTSC Artifacts: %1.1f", config.ntsc_artifacts);
sprintf(items[VI_OFFSET+4].text, "NTSC Color Bleed: %1.1f", config.ntsc_bleed);
sprintf(items[VI_OFFSET+5].text, "NTSC Color Fringing: %1.1f", config.ntsc_fringing);
strcpy(items[VI_OFFSET+1].comment, "Adjust edge contrast enhancement/blurring");
strcpy(items[VI_OFFSET+2].comment, "Adjust image resolution");
strcpy(items[VI_OFFSET+3].comment, "Adjust artifacts caused by color changes");
strcpy(items[VI_OFFSET+4].comment, "Adjust color resolution reduction");
strcpy(items[VI_OFFSET+5].comment, "Adjust artifacts caused by brightness changes");
ntsc_offset = 5;
m->max_items = VI_OFFSET + 10 + (config.aspect == 0);
}
else else
{
sprintf (items[VI_OFFSET].text, "NTSC Filter: OFF"); sprintf (items[VI_OFFSET].text, "NTSC Filter: OFF");
strcpy(items[VI_OFFSET+1].text, items[VI_OFFSET+5+1].text);
strcpy(items[VI_OFFSET+2].text, items[VI_OFFSET+5+2].text);
strcpy(items[VI_OFFSET+3].text, items[VI_OFFSET+5+3].text);
strcpy(items[VI_OFFSET+4].text, items[VI_OFFSET+5+4].text);
strcpy(items[VI_OFFSET+5].text, items[VI_OFFSET+5+5].text);
strcpy(items[VI_OFFSET+1].comment, items[VI_OFFSET+5+1].comment);
strcpy(items[VI_OFFSET+2].comment, items[VI_OFFSET+5+2].comment);
strcpy(items[VI_OFFSET+3].comment, items[VI_OFFSET+5+3].comment);
strcpy(items[VI_OFFSET+4].comment, items[VI_OFFSET+5+4].comment);
strcpy(items[VI_OFFSET+5].comment, items[VI_OFFSET+5+5].comment);
ntsc_offset = 0;
m->max_items = VI_OFFSET + 5 + (config.aspect == 0);
}
break; break;
case VI_OFFSET+1: /*** overscan emulation ***/ case VI_OFFSET+1: /*** NTSC Sharpness ***/
GUI_OptionBox(m,update_bgm,"NTSC Sharpness",(void *)&config.ntsc_sharpness,0.01,-1.0,1.0,0);
sprintf(items[VI_OFFSET+1].text, "NTSC Sharpness: %1.2f", config.ntsc_sharpness);
break;
case VI_OFFSET+2: /*** NTSC Resolution ***/
GUI_OptionBox(m,update_bgm,"NTSC Resolution",(void *)&config.ntsc_resolution,0.01,0.0,1.0,0);
sprintf(items[VI_OFFSET+2].text, "NTSC Resolution: %1.2f", config.ntsc_resolution);
break;
case VI_OFFSET+3: /*** NTSC Artifacts ***/
GUI_OptionBox(m,update_bgm,"NTSC Artifacts",(void *)&config.ntsc_artifacts,0.01,-1.0,0.0,0);
sprintf(items[VI_OFFSET+3].text, "NTSC Artifacts: %1.2f", config.ntsc_artifacts);
break;
case VI_OFFSET+4: /*** NTSC Color Bleed ***/
GUI_OptionBox(m,update_bgm,"NTSC Color Bleed",(void *)&config.ntsc_bleed,0.01,-1.0,1.0,0);
sprintf(items[VI_OFFSET+4].text, "NTSC Color Bleed: %1.2f", config.ntsc_bleed);
break;
case VI_OFFSET+5: /*** NTSC Color Fringing ***/
GUI_OptionBox(m,update_bgm,"NTSC Color Fringing",(void *)&config.ntsc_fringing,0.01,-1.0,1.0,0);
sprintf(items[VI_OFFSET+5].text, "NTSC Color Fringing: %1.2f", config.ntsc_fringing);
break;
case VI_OFFSET+6: /*** overscan emulation ***/
config.overscan = (config.overscan + 1) & 3; config.overscan = (config.overscan + 1) & 3;
if (config.overscan == 3) if (config.overscan == 3)
sprintf (items[VI_OFFSET+1].text, "Borders: FULL"); sprintf (items[VI_OFFSET+ntsc_offset+1].text, "Borders: FULL");
else if (config.overscan == 2) else if (config.overscan == 2)
sprintf (items[VI_OFFSET+1].text, "Borders: H ONLY"); sprintf (items[VI_OFFSET+ntsc_offset+1].text, "Borders: H ONLY");
else if (config.overscan == 1) else if (config.overscan == 1)
sprintf (items[VI_OFFSET+1].text, "Borders: V ONLY"); sprintf (items[VI_OFFSET+ntsc_offset+1].text, "Borders: V ONLY");
else else
sprintf (items[VI_OFFSET+1].text, "Borders: NONE"); sprintf (items[VI_OFFSET+ntsc_offset+1].text, "Borders: NONE");
break; break;
case VI_OFFSET+2: /*** Game Gear extended screen */ case VI_OFFSET+7: /*** Game Gear extended screen */
config.gg_extra ^= 1; config.gg_extra ^= 1;
sprintf(items[VI_OFFSET+2].text, "GG Screen: %s", config.gg_extra ? "EXTENDED":"ORIGINAL"); sprintf(items[VI_OFFSET+ntsc_offset+2].text, "GG Screen: %s", config.gg_extra ? "EXTENDED":"ORIGINAL");
break; break;
case VI_OFFSET+3: /*** aspect ratio ***/ case VI_OFFSET+8: /*** aspect ratio ***/
config.aspect = (config.aspect + 1) % 3; config.aspect = (config.aspect + 1) % 3;
if (config.aspect == 1) if (config.aspect == 1)
sprintf (items[VI_OFFSET+3].text,"Aspect: ORIGINAL (4:3)"); sprintf (items[VI_OFFSET+ntsc_offset+3].text,"Aspect: ORIGINAL (4:3)");
else if (config.aspect == 2) else if (config.aspect == 2)
sprintf (items[VI_OFFSET+3].text, "Aspect: ORIGINAL (16:9)"); sprintf (items[VI_OFFSET+ntsc_offset+3].text, "Aspect: ORIGINAL (16:9)");
else else
sprintf (items[VI_OFFSET+3].text, "Aspect: SCALED"); sprintf (items[VI_OFFSET+ntsc_offset+3].text, "Aspect: SCALED");
if (config.aspect) if (config.aspect)
{ {
/* disable items */ /* disable items */
m->max_items = VI_OFFSET+5; m->max_items = VI_OFFSET + ntsc_offset + 5;
/* reset menu selection */ /* reset menu selection */
if (m->offset > VI_OFFSET) if (m->selected < 2)
{ {
m->offset = VI_OFFSET; m->offset = VI_OFFSET + ntsc_offset + 1;
m->selected = 3; m->selected = 2;
} }
} }
else else
{ {
/* enable items */ /* enable items */
m->max_items = VI_OFFSET+6; m->max_items = VI_OFFSET + ntsc_offset + 6;
} }
break; break;
case VI_OFFSET+4: /*** screen position ***/ case VI_OFFSET+9: /*** screen position ***/
if (system_hw) if (system_hw)
{ {
state[0] = m->arrows[0]->state; state[0] = m->arrows[0]->state;
@ -1718,7 +1821,7 @@ static void videomenu ()
m->arrows[1]->state = state[1]; m->arrows[1]->state = state[1];
m->screenshot = 0; m->screenshot = 0;
strcpy(m->title,"Video Settings"); strcpy(m->title,"Video Settings");
sprintf (items[VI_OFFSET+4].text, "Screen Position: (%s%02d,%s%02d)", sprintf (items[VI_OFFSET+ntsc_offset+4].text, "Screen Position: (%s%02d,%s%02d)",
(config.xshift < 0) ? "":"+", config.xshift, (config.xshift < 0) ? "":"+", config.xshift,
(config.yshift < 0) ? "":"+", config.yshift); (config.yshift < 0) ? "":"+", config.yshift);
} }
@ -1728,7 +1831,7 @@ static void videomenu ()
} }
break; break;
case VI_OFFSET+5: /*** screen scaling ***/ case VI_OFFSET+10: /*** screen scaling ***/
if (system_hw) if (system_hw)
{ {
state[0] = m->arrows[0]->state; state[0] = m->arrows[0]->state;
@ -1746,7 +1849,7 @@ static void videomenu ()
m->arrows[1]->state = state[1]; m->arrows[1]->state = state[1];
m->screenshot = 0; m->screenshot = 0;
strcpy(m->title,"Video Settings"); strcpy(m->title,"Video Settings");
sprintf (items[VI_OFFSET+5].text, "Screen Scaling: (%s%02d,%s%02d)", sprintf (items[VI_OFFSET+ntsc_offset+5].text, "Screen Scaling: (%s%02d,%s%02d)",
(config.xscale < 0) ? "":"+", config.xscale, (config.xscale < 0) ? "":"+", config.xscale,
(config.yscale < 0) ? "":"+", config.yscale); (config.yscale < 0) ? "":"+", config.yscale);
} }

View File

@ -1557,17 +1557,37 @@ void gx_video_Start(void)
switch (config.ntsc) switch (config.ntsc)
{ {
case 1: case 1:
{
sms_ntsc_init(sms_ntsc, &sms_ntsc_composite); sms_ntsc_init(sms_ntsc, &sms_ntsc_composite);
md_ntsc_init(md_ntsc, &md_ntsc_composite); md_ntsc_init(md_ntsc, &md_ntsc_composite);
break; break;
}
case 2: case 2:
{
sms_ntsc_init(sms_ntsc, &sms_ntsc_svideo); sms_ntsc_init(sms_ntsc, &sms_ntsc_svideo);
md_ntsc_init(md_ntsc, &md_ntsc_svideo); md_ntsc_init(md_ntsc, &md_ntsc_svideo);
break; break;
}
case 3: case 3:
{
sms_ntsc_init(sms_ntsc, &sms_ntsc_rgb); sms_ntsc_init(sms_ntsc, &sms_ntsc_rgb);
md_ntsc_init(md_ntsc, &md_ntsc_rgb); md_ntsc_init(md_ntsc, &md_ntsc_rgb);
}
case 4:
{
md_ntsc_setup_t ntsc_custom = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
ntsc_custom.sharpness = config.ntsc_sharpness;
ntsc_custom.resolution = config.ntsc_resolution;
ntsc_custom.artifacts = config.ntsc_artifacts;
ntsc_custom.fringing = config.ntsc_fringing;
ntsc_custom.bleed = config.ntsc_bleed;
sms_ntsc_init(sms_ntsc, (sms_ntsc_setup_t *)&ntsc_custom);
md_ntsc_init(md_ntsc, &ntsc_custom);
break; break;
}
} }
} }