mirror of https://github.com/stella-emu/stella.git
Blargg now has knobs! The TV effects settings are now accessible from
the Video Settings UI. Still TODO is add key shortcuts for the various adjustable TV effects (contrast, brightness, etc). git-svn-id: svn://svn.code.sf.net/p/stella/code/trunk@2468 8b62c5a3-ac7e-4cc8-8f21-d9a121418aba
This commit is contained in:
parent
12d0a4732e
commit
3850cb7879
|
@ -121,6 +121,7 @@ template<typename T> inline void BSPF_swap(T& a, T& b) { T tmp = a; a = b; b = t
|
|||
template<typename T> inline T BSPF_abs (T x) { return (x>=0) ? x : -x; }
|
||||
template<typename T> inline T BSPF_min (T a, T b) { return (a<b) ? a : b; }
|
||||
template<typename T> inline T BSPF_max (T a, T b) { return (a>b) ? a : b; }
|
||||
template<typename T> inline T BSPF_clamp (T a, T l, T u) { return (a<l) ? l : (a>u) ? u : a; }
|
||||
|
||||
// Convert integer to string
|
||||
inline string BSPF_toString(int num)
|
||||
|
|
|
@ -66,6 +66,7 @@ OSystem* theOSystem = (OSystem*) NULL;
|
|||
int Cleanup()
|
||||
{
|
||||
theOSystem->logMessage("Cleanup from mainSDL\n", 2);
|
||||
theOSystem->settings().saveConfig();
|
||||
|
||||
if(theOSystem)
|
||||
delete theOSystem;
|
||||
|
|
|
@ -19,22 +19,11 @@
|
|||
|
||||
#include "NTSCFilter.hxx"
|
||||
|
||||
// Limits for the adjustable values.
|
||||
#define FILTER_NTSC_SHARPNESS_MIN -1.0
|
||||
#define FILTER_NTSC_SHARPNESS_MAX 1.0
|
||||
#define FILTER_NTSC_RESOLUTION_MIN -1.0
|
||||
#define FILTER_NTSC_RESOLUTION_MAX 1.0
|
||||
#define FILTER_NTSC_ARTIFACTS_MIN -1.0
|
||||
#define FILTER_NTSC_ARTIFACTS_MAX 1.0
|
||||
#define FILTER_NTSC_FRINGING_MIN -1.0
|
||||
#define FILTER_NTSC_FRINGING_MAX 1.0
|
||||
#define FILTER_NTSC_BLEED_MIN -1.0
|
||||
#define FILTER_NTSC_BLEED_MAX 1.0
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
NTSCFilter::NTSCFilter()
|
||||
: mySetup(atari_ntsc_composite),
|
||||
myCustomSetup(atari_ntsc_composite)
|
||||
myCustomSetup(atari_ntsc_composite),
|
||||
myPreset(PRESET_OFF)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -61,8 +50,9 @@ void NTSCFilter::setTIAPalette(const uInt32* palette)
|
|||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
string NTSCFilter::setPreset(Preset preset)
|
||||
{
|
||||
myPreset = preset;
|
||||
string msg = "disabled";
|
||||
switch(preset)
|
||||
switch(myPreset)
|
||||
{
|
||||
case PRESET_COMPOSITE:
|
||||
mySetup = atari_ntsc_composite;
|
||||
|
@ -91,20 +81,87 @@ string NTSCFilter::setPreset(Preset preset)
|
|||
return msg;
|
||||
}
|
||||
|
||||
#if 0
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void NTSCFilter::updateAdjustables(const atari_ntsc_setup_t& setup)
|
||||
void NTSCFilter::loadConfig(const Settings& settings)
|
||||
{
|
||||
myAdjustables.hue = setup.hue;
|
||||
myAdjustables.saturation = setup.saturation;
|
||||
myAdjustables.contrast = setup.contrast;
|
||||
myAdjustables.brightness = setup.brightness;
|
||||
myAdjustables.sharpness = setup.sharpness;
|
||||
myAdjustables.gamma = setup.gamma;
|
||||
myAdjustables.resolution = setup.resolution;
|
||||
myAdjustables.artifacts = setup.artifacts;
|
||||
myAdjustables.fringing = setup.fringing;
|
||||
myAdjustables.bleed = setup.bleed;
|
||||
myAdjustables.burst_phase = setup.burst_phase;
|
||||
// Load adjustables for custom mode
|
||||
myCustomSetup.hue = BSPF_clamp(settings.getFloat("tv_hue"), -1.0f, 1.0f);
|
||||
myCustomSetup.saturation = BSPF_clamp(settings.getFloat("tv_saturation"), -1.0f, 1.0f);
|
||||
myCustomSetup.contrast = BSPF_clamp(settings.getFloat("tv_contrast"), -1.0f, 1.0f);
|
||||
myCustomSetup.brightness = BSPF_clamp(settings.getFloat("tv_brightness"), -1.0f, 1.0f);
|
||||
myCustomSetup.sharpness = BSPF_clamp(settings.getFloat("tv_sharpness"), -1.0f, 1.0f);
|
||||
myCustomSetup.gamma = BSPF_clamp(settings.getFloat("tv_gamma"), -1.0f, 1.0f);
|
||||
myCustomSetup.resolution = BSPF_clamp(settings.getFloat("tv_resolution"), -1.0f, 1.0f);
|
||||
myCustomSetup.artifacts = BSPF_clamp(settings.getFloat("tv_artifacts"), -1.0f, 1.0f);
|
||||
myCustomSetup.fringing = BSPF_clamp(settings.getFloat("tv_fringing"), -1.0f, 1.0f);
|
||||
myCustomSetup.bleed = BSPF_clamp(settings.getFloat("tv_bleed"), -1.0f, 1.0f);
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void NTSCFilter::saveConfig(Settings& settings) const
|
||||
{
|
||||
// Save adjustables for custom mode
|
||||
settings.setFloat("tv_hue", myCustomSetup.hue);
|
||||
settings.setFloat("tv_saturation", myCustomSetup.saturation);
|
||||
settings.setFloat("tv_contrast", myCustomSetup.contrast);
|
||||
settings.setFloat("tv_brightness", myCustomSetup.brightness);
|
||||
settings.setFloat("tv_sharpness", myCustomSetup.sharpness);
|
||||
settings.setFloat("tv_gamma", myCustomSetup.gamma);
|
||||
settings.setFloat("tv_resolution", myCustomSetup.resolution);
|
||||
settings.setFloat("tv_artifacts", myCustomSetup.artifacts);
|
||||
settings.setFloat("tv_fringing", myCustomSetup.fringing);
|
||||
settings.setFloat("tv_bleed", myCustomSetup.bleed);
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void NTSCFilter::getAdjustables(Adjustable& adjustable, Preset preset)
|
||||
{
|
||||
switch(preset)
|
||||
{
|
||||
case PRESET_COMPOSITE:
|
||||
convertToAdjustable(adjustable, atari_ntsc_composite); break;
|
||||
case PRESET_SVIDEO:
|
||||
convertToAdjustable(adjustable, atari_ntsc_svideo); break;
|
||||
case PRESET_RGB:
|
||||
convertToAdjustable(adjustable, atari_ntsc_rgb); break;
|
||||
case PRESET_BAD:
|
||||
convertToAdjustable(adjustable, atari_ntsc_bad); break;
|
||||
case PRESET_CUSTOM:
|
||||
convertToAdjustable(adjustable, myCustomSetup); break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void NTSCFilter::setCustomAdjustables(Adjustable& adjustable)
|
||||
{
|
||||
#define SCALE_FROM_100(x) ((x/50.0)-1.0)
|
||||
myCustomSetup.hue = SCALE_FROM_100(adjustable.hue);
|
||||
myCustomSetup.saturation = SCALE_FROM_100(adjustable.saturation);
|
||||
myCustomSetup.contrast = SCALE_FROM_100(adjustable.contrast);
|
||||
myCustomSetup.brightness = SCALE_FROM_100(adjustable.brightness);
|
||||
myCustomSetup.sharpness = SCALE_FROM_100(adjustable.sharpness);
|
||||
myCustomSetup.gamma = SCALE_FROM_100(adjustable.gamma);
|
||||
myCustomSetup.resolution = SCALE_FROM_100(adjustable.resolution);
|
||||
myCustomSetup.artifacts = SCALE_FROM_100(adjustable.artifacts);
|
||||
myCustomSetup.fringing = SCALE_FROM_100(adjustable.fringing);
|
||||
myCustomSetup.bleed = SCALE_FROM_100(adjustable.bleed);
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void NTSCFilter::convertToAdjustable(Adjustable& adjustable,
|
||||
const atari_ntsc_setup_t& setup) const
|
||||
{
|
||||
#define SCALE_TO_100(x) (uInt32)(50*(x+1.0))
|
||||
adjustable.hue = SCALE_TO_100(setup.hue);
|
||||
adjustable.saturation = SCALE_TO_100(setup.saturation);
|
||||
adjustable.contrast = SCALE_TO_100(setup.contrast);
|
||||
adjustable.brightness = SCALE_TO_100(setup.brightness);
|
||||
adjustable.sharpness = SCALE_TO_100(setup.sharpness);
|
||||
adjustable.gamma = SCALE_TO_100(setup.gamma);
|
||||
adjustable.resolution = SCALE_TO_100(setup.resolution);
|
||||
adjustable.artifacts = SCALE_TO_100(setup.artifacts);
|
||||
adjustable.fringing = SCALE_TO_100(setup.fringing);
|
||||
adjustable.bleed = SCALE_TO_100(setup.bleed);
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -75,9 +75,19 @@ class NTSCFilter
|
|||
atari_ntsc_init(&myFilter, &mySetup, myTIAPalette);
|
||||
}
|
||||
|
||||
// Get adjustables for the given preset
|
||||
// Values will be scaled to 0 - 100 range, independent of how
|
||||
// they're actually stored internally
|
||||
void getAdjustables(Adjustable& adjustable, Preset preset);
|
||||
|
||||
// Set custom adjustables to given values
|
||||
// Values will be scaled to 0 - 100 range, independent of how
|
||||
// they're actually stored internally
|
||||
void setCustomAdjustables(Adjustable& adjustable);
|
||||
|
||||
// Load and save NTSC-related settings
|
||||
void loadConfig(const Settings& settings);
|
||||
void saveSettings(Settings& settings) const;
|
||||
void saveConfig(Settings& settings) const;
|
||||
|
||||
// Perform Blargg filtering on input buffer, place results in
|
||||
// output buffer
|
||||
|
@ -98,6 +108,11 @@ class NTSCFilter
|
|||
dest_buf, dest_pitch);
|
||||
}
|
||||
|
||||
private:
|
||||
// Convert from atari_ntsc_setup_t values to equivalent adjustables
|
||||
void convertToAdjustable(Adjustable& adjustable,
|
||||
const atari_ntsc_setup_t& setup) const;
|
||||
|
||||
private:
|
||||
// The NTSC filter structure
|
||||
atari_ntsc_t myFilter;
|
||||
|
@ -110,9 +125,8 @@ class NTSCFilter
|
|||
// it is copied to mySetup)
|
||||
atari_ntsc_setup_t myCustomSetup;
|
||||
|
||||
// Contains adjustable settings for the current preset
|
||||
// (including the custom mode)
|
||||
Adjustable myAdjustables;
|
||||
// Current preset in use
|
||||
Preset myPreset;
|
||||
|
||||
// 128 colours by 3 components per colour
|
||||
uInt8 myTIAPalette[128 * 3];
|
||||
|
|
|
@ -1055,8 +1055,6 @@ void EventHandler::handleEvent(Event::Type event, int state)
|
|||
if((myState == S_EMULATE || myState == S_CMDMENU ||
|
||||
myState == S_DEBUGGER) && state)
|
||||
{
|
||||
myOSystem->settings().saveConfig();
|
||||
|
||||
// Go back to the launcher, or immediately quit
|
||||
if(myOSystem->settings().getBool("exitlauncher") ||
|
||||
myOSystem->launcherUsed())
|
||||
|
@ -1074,7 +1072,6 @@ void EventHandler::handleEvent(Event::Type event, int state)
|
|||
{
|
||||
saveKeyMapping();
|
||||
saveJoyMapping();
|
||||
myOSystem->settings().saveConfig();
|
||||
myOSystem->quit();
|
||||
}
|
||||
return;
|
||||
|
|
|
@ -53,6 +53,9 @@ FrameBuffer::FrameBuffer(OSystem* osystem)
|
|||
myMsg.surface = myStatsMsg.surface = NULL;
|
||||
myMsg.surfaceID = myStatsMsg.surfaceID = -1;
|
||||
myMsg.enabled = myStatsMsg.enabled = false;
|
||||
|
||||
// Load NTSC filter settings
|
||||
myNTSCFilter.loadConfig(myOSystem->settings());
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
|
|
|
@ -40,6 +40,7 @@ Settings::Settings(OSystem* osystem)
|
|||
setInternal("video", "soft");
|
||||
|
||||
// OpenGL specific options
|
||||
setInternal("gl_inter", "false");
|
||||
setInternal("gl_aspectn", "90");
|
||||
setInternal("gl_aspectp", "100");
|
||||
setInternal("gl_fsscale", "false");
|
||||
|
@ -60,19 +61,19 @@ Settings::Settings(OSystem* osystem)
|
|||
|
||||
// TV filtering options
|
||||
setInternal("tv_filter", "0");
|
||||
setInternal("tv_inter", "false");
|
||||
setInternal("tv_scanlines", "40");
|
||||
setInternal("tv_scaninter", "true");
|
||||
// TV options when using 'custom' mode
|
||||
setInternal("tv_contrast", "0.0");
|
||||
setInternal("tv_brightness", "0.0");
|
||||
setInternal("tv_hue", "0.0");
|
||||
setInternal("tv_saturation", "0.0");
|
||||
setInternal("tv_gamma", "0.0");
|
||||
setInternal("tv_sharpness", "0.0");
|
||||
setInternal("tv_resolution", "0.0");
|
||||
setInternal("tv_artifacts", "0.0");
|
||||
setInternal("tv_fringing", "0.0");
|
||||
setInternal("tv_bleed", "0.0");
|
||||
setInternal("tv_brightness", "0.0");
|
||||
setInternal("tv_contrast", "0.0");
|
||||
setInternal("tv_saturation", "0.0");
|
||||
setInternal("tv_gamma", "0.0");
|
||||
|
||||
// Sound options
|
||||
setInternal("sound", "true");
|
||||
|
@ -353,6 +354,16 @@ void Settings::usage()
|
|||
<< " -tv_filter <0-5> Set TV effects off (0) or to specified mode (1-5)\n"
|
||||
<< " -tv_scanlines <0-100> Set scanline intensity to percentage (0 disables completely)\n"
|
||||
<< " -tv_scaninter <1|0> Enable interpolated (smooth) scanlines\n"
|
||||
<< " -tv_contrast <value> Set TV effects custom contrast to value 1.0 - 1.0\n"
|
||||
<< " -tv_brightness <value> Set TV effects custom brightness to value 1.0 - 1.0\n"
|
||||
<< " -tv_hue <value> Set TV effects custom hue to value 1.0 - 1.0\n"
|
||||
<< " -tv_saturation <value> Set TV effects custom saturation to value 1.0 - 1.0\n"
|
||||
<< " -tv_gamma <value> Set TV effects custom gamma to value 1.0 - 1.0\n"
|
||||
<< " -tv_sharpness <value> Set TV effects custom sharpness to value 1.0 - 1.0\n"
|
||||
<< " -tv_resolution <value> Set TV effects custom resolution to value 1.0 - 1.0\n"
|
||||
<< " -tv_artifacts <value> Set TV effects custom artifacts to value 1.0 - 1.0\n"
|
||||
<< " -tv_fringing <value> Set TV effects custom fringing to value 1.0 - 1.0\n"
|
||||
<< " -tv_bleed <value> Set TV effects custom bleed to value 1.0 - 1.0\n"
|
||||
<< endl
|
||||
#endif
|
||||
<< " -tia_filter <filter> Use the specified filter in emulation mode\n"
|
||||
|
@ -458,6 +469,10 @@ void Settings::usage()
|
|||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void Settings::saveConfig()
|
||||
{
|
||||
// Ask all subsystems to save their settings
|
||||
if(&(myOSystem->frameBuffer()))
|
||||
myOSystem->frameBuffer().ntsc().saveConfig(*this);
|
||||
|
||||
// Do a quick scan of the internal settings to see if any have
|
||||
// changed. If not, we don't need to save them at all.
|
||||
bool settingsChanged = false;
|
||||
|
|
|
@ -242,7 +242,7 @@ VideoDialog::VideoDialog(OSystem* osystem, DialogContainer* parent,
|
|||
// 2) TV effects options
|
||||
wid.clear();
|
||||
tabID = myTab->addTab(" TV Effects ");
|
||||
xpos = ypos = 5;
|
||||
xpos = ypos = 8;
|
||||
|
||||
// TV Mode
|
||||
items.clear();
|
||||
|
@ -262,6 +262,7 @@ VideoDialog::VideoDialog(OSystem* osystem, DialogContainer* parent,
|
|||
|
||||
// Custom adjustables (using macro voodoo)
|
||||
xpos += 8; ypos += 4;
|
||||
int orig_ypos = ypos;
|
||||
pwidth = lwidth;
|
||||
lwidth = font.getStringWidth("Saturation: ");
|
||||
|
||||
|
@ -277,19 +278,52 @@ VideoDialog::VideoDialog(OSystem* osystem, DialogContainer* parent,
|
|||
myTV ## obj->setFlags(WIDGET_CLEARBG); \
|
||||
ypos += lineHeight + 4
|
||||
|
||||
CREATE_CUSTOM_SLIDERS(Contrast, "Contrast: ");
|
||||
CREATE_CUSTOM_SLIDERS(Bright, "Brightness: ");
|
||||
CREATE_CUSTOM_SLIDERS(Hue, "Hue: ");
|
||||
CREATE_CUSTOM_SLIDERS(Satur, "Saturation: ");
|
||||
CREATE_CUSTOM_SLIDERS(Gamma, "Gamma: ");
|
||||
CREATE_CUSTOM_SLIDERS(Sharp, "Sharpness: ");
|
||||
CREATE_CUSTOM_SLIDERS(Res, "Resolution: ");
|
||||
CREATE_CUSTOM_SLIDERS(Artifacts, "Artifacts: ");
|
||||
CREATE_CUSTOM_SLIDERS(Fringe, "Fringing: ");
|
||||
CREATE_CUSTOM_SLIDERS(Blend, "Blending: ");
|
||||
CREATE_CUSTOM_SLIDERS(Bright, "Brightness: ");
|
||||
CREATE_CUSTOM_SLIDERS(Contrast, "Contrast: ");
|
||||
CREATE_CUSTOM_SLIDERS(Satur, "Saturation: ");
|
||||
CREATE_CUSTOM_SLIDERS(Gamma, "Gamma: ");
|
||||
CREATE_CUSTOM_SLIDERS(Bleed, "Bleeding: ");
|
||||
|
||||
xpos += myTVContrast->getWidth() + myTVContrastLabel->getWidth() + 20;
|
||||
ypos = orig_ypos;
|
||||
|
||||
// Scanline intensity and interpolation
|
||||
myTVScanLabel =
|
||||
new StaticTextWidget(myTab, font, xpos, ypos, font.getStringWidth("Scanline settings:"),
|
||||
fontHeight, "Scanline settings:", kTextAlignLeft);
|
||||
ypos += lineHeight;
|
||||
|
||||
xpos += 20;
|
||||
lwidth = font.getStringWidth("Intensity: ");
|
||||
pwidth = font.getMaxCharWidth() * 6;
|
||||
CREATE_CUSTOM_SLIDERS(ScanIntense, "Intensity: ");
|
||||
|
||||
myTVScanInterpolate = new CheckboxWidget(myTab, font, xpos, ypos,
|
||||
"Interpolation");
|
||||
wid.push_back(myTVScanInterpolate);
|
||||
ypos += lineHeight + 4;
|
||||
|
||||
// Adjustable presets
|
||||
xpos -= 20;
|
||||
int cloneWidth = font.getStringWidth("Clone Bad Adjust") + 20;
|
||||
#define CREATE_CLONE_BUTTON(obj, desc) \
|
||||
myClone ## obj = \
|
||||
new ButtonWidget(myTab, font, xpos, ypos, cloneWidth, buttonHeight,\
|
||||
desc, kClone ## obj ##Cmd); \
|
||||
wid.push_back(myClone ## obj); \
|
||||
ypos += lineHeight + 10
|
||||
|
||||
ypos += lineHeight;
|
||||
CREATE_CLONE_BUTTON(Composite, "Clone Composite");
|
||||
CREATE_CLONE_BUTTON(Svideo, "Clone S-Video");
|
||||
CREATE_CLONE_BUTTON(RGB, "Clone RGB");
|
||||
CREATE_CLONE_BUTTON(Bad, "Clone Bad Adjust");
|
||||
CREATE_CLONE_BUTTON(Custom, "Revert");
|
||||
|
||||
// Add items for tab 2
|
||||
addToFocusList(wid, tabID);
|
||||
|
@ -315,6 +349,39 @@ VideoDialog::VideoDialog(OSystem* osystem, DialogContainer* parent,
|
|||
myPAspectRatioLabel->clearFlags(WIDGET_ENABLED);
|
||||
myGLStretchCheckbox->clearFlags(WIDGET_ENABLED);
|
||||
myUseVSyncCheckbox->clearFlags(WIDGET_ENABLED);
|
||||
|
||||
myTVMode->clearFlags(WIDGET_ENABLED);
|
||||
myTVSharp->clearFlags(WIDGET_ENABLED);
|
||||
myTVSharpLabel->clearFlags(WIDGET_ENABLED);
|
||||
myTVHue->clearFlags(WIDGET_ENABLED);
|
||||
myTVHueLabel->clearFlags(WIDGET_ENABLED);
|
||||
myTVRes->clearFlags(WIDGET_ENABLED);
|
||||
myTVResLabel->clearFlags(WIDGET_ENABLED);
|
||||
myTVArtifacts->clearFlags(WIDGET_ENABLED);
|
||||
myTVArtifactsLabel->clearFlags(WIDGET_ENABLED);
|
||||
myTVFringe->clearFlags(WIDGET_ENABLED);
|
||||
myTVFringeLabel->clearFlags(WIDGET_ENABLED);
|
||||
myTVBleed->clearFlags(WIDGET_ENABLED);
|
||||
myTVBleedLabel->clearFlags(WIDGET_ENABLED);
|
||||
myTVBright->clearFlags(WIDGET_ENABLED);
|
||||
myTVBrightLabel->clearFlags(WIDGET_ENABLED);
|
||||
myTVContrast->clearFlags(WIDGET_ENABLED);
|
||||
myTVContrastLabel->clearFlags(WIDGET_ENABLED);
|
||||
myTVSatur->clearFlags(WIDGET_ENABLED);
|
||||
myTVSaturLabel->clearFlags(WIDGET_ENABLED);
|
||||
myTVGamma->clearFlags(WIDGET_ENABLED);
|
||||
myTVGammaLabel->clearFlags(WIDGET_ENABLED);
|
||||
|
||||
myTVScanLabel->clearFlags(WIDGET_ENABLED);
|
||||
myTVScanIntense->clearFlags(WIDGET_ENABLED);
|
||||
myTVScanIntenseLabel->clearFlags(WIDGET_ENABLED);
|
||||
myTVScanInterpolate->clearFlags(WIDGET_ENABLED);
|
||||
|
||||
myCloneComposite->clearFlags(WIDGET_ENABLED);
|
||||
myCloneSvideo->clearFlags(WIDGET_ENABLED);
|
||||
myCloneRGB->clearFlags(WIDGET_ENABLED);
|
||||
myCloneBad->clearFlags(WIDGET_ENABLED);
|
||||
myCloneCustom->clearFlags(WIDGET_ENABLED);
|
||||
#endif
|
||||
#ifndef WINDOWED_SUPPORT
|
||||
myFullscreenCheckbox->clearFlags(WIDGET_ENABLED);
|
||||
|
@ -362,9 +429,9 @@ void VideoDialog::loadConfig()
|
|||
instance().settings().getString("timing"), "sleep");
|
||||
|
||||
// GL Filter setting
|
||||
// FIXME
|
||||
myGLFilterPopup->setSelected(
|
||||
instance().settings().getString("gl_filter"), "nearest");
|
||||
const string& gl_inter = instance().settings().getBool("gl_inter") ?
|
||||
"linear" : "nearest";
|
||||
myGLFilterPopup->setSelected(gl_inter, "nearest");
|
||||
myGLFilterPopup->setEnabled(gl);
|
||||
|
||||
// GL aspect ratio setting (NTSC and PAL)
|
||||
|
@ -411,8 +478,16 @@ void VideoDialog::loadConfig()
|
|||
// TV Mode
|
||||
myTVMode->setSelected(
|
||||
instance().settings().getString("tv_filter"), "0");
|
||||
handleTVModeChange(instance().settings().getInt("tv_filter") ==
|
||||
(int)NTSCFilter::PRESET_CUSTOM);
|
||||
int preset = instance().settings().getInt("tv_filter");
|
||||
handleTVModeChange((NTSCFilter::Preset)preset);
|
||||
|
||||
// TV Custom adjustables
|
||||
loadTVAdjustables(NTSCFilter::PRESET_CUSTOM);
|
||||
|
||||
// TV scanline intensity and interpolation
|
||||
myTVScanIntense->setValue(instance().settings().getInt("tv_scanlines"));
|
||||
myTVScanIntenseLabel->setLabel(instance().settings().getString("tv_scanlines"));
|
||||
myTVScanInterpolate->setState(instance().settings().getBool("tv_scaninter"));
|
||||
|
||||
myTab->loadConfig();
|
||||
}
|
||||
|
@ -436,7 +511,8 @@ void VideoDialog::saveConfig()
|
|||
instance().settings().setString("timing", myFrameTimingPopup->getSelectedTag());
|
||||
|
||||
// GL Filter setting
|
||||
instance().settings().setString("gl_filter", myGLFilterPopup->getSelectedTag());
|
||||
instance().settings().setBool("gl_inter",
|
||||
myGLFilterPopup->getSelectedTag() == "linear" ? true : false);
|
||||
|
||||
// GL aspect ratio setting (NTSC and PAL)
|
||||
instance().settings().setString("gl_aspectn", myNAspectRatioLabel->getLabel());
|
||||
|
@ -478,8 +554,23 @@ void VideoDialog::saveConfig()
|
|||
// TV Mode
|
||||
instance().settings().setString("tv_filter", myTVMode->getSelectedTag());
|
||||
|
||||
// TV Custom adjustables
|
||||
NTSCFilter::Adjustable adj;
|
||||
adj.hue = myTVHue->getValue();
|
||||
adj.saturation = myTVSatur->getValue();
|
||||
adj.contrast = myTVContrast->getValue();
|
||||
adj.brightness = myTVBright->getValue();
|
||||
adj.sharpness = myTVSharp->getValue();
|
||||
adj.gamma = myTVGamma->getValue();
|
||||
adj.resolution = myTVRes->getValue();
|
||||
adj.artifacts = myTVArtifacts->getValue();
|
||||
adj.fringing = myTVFringe->getValue();
|
||||
adj.bleed = myTVBleed->getValue();
|
||||
instance().frameBuffer().ntsc().setCustomAdjustables(adj);
|
||||
|
||||
|
||||
// TV scanline intensity and interpolation
|
||||
instance().settings().setString("tv_scanlines", myTVScanIntenseLabel->getLabel());
|
||||
instance().settings().setBool("tv_scaninter", myTVScanInterpolate->getState());
|
||||
|
||||
// Finally, issue a complete framebuffer re-initialization
|
||||
instance().createFrameBuffer();
|
||||
|
@ -512,9 +603,15 @@ void VideoDialog::setDefaults()
|
|||
|
||||
myTVMode->setSelected("0", "0");
|
||||
|
||||
// TV scanline intensity and interpolation
|
||||
myTVScanIntense->setValue(40);
|
||||
myTVScanIntenseLabel->setLabel("40");
|
||||
myTVScanInterpolate->setState(true);
|
||||
|
||||
// Make sure that mutually-exclusive items are not enabled at the same time
|
||||
handleFullscreenChange(true);
|
||||
handleTVModeChange(false);
|
||||
handleTVModeChange(NTSCFilter::PRESET_OFF);
|
||||
loadTVAdjustables(NTSCFilter::PRESET_CUSTOM);
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
|
@ -527,18 +624,32 @@ void VideoDialog::handleFullscreenChange(bool enable)
|
|||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void VideoDialog::handleTVModeChange(bool enable)
|
||||
void VideoDialog::handleTVModeChange(NTSCFilter::Preset preset)
|
||||
{
|
||||
bool enable = true, scanenable = true;
|
||||
if(!instance().frameBuffer().type() == kDoubleBuffer)
|
||||
{
|
||||
enable = scanenable = false;
|
||||
myTVMode->setEnabled(enable);
|
||||
}
|
||||
else
|
||||
{
|
||||
enable = preset == NTSCFilter::PRESET_CUSTOM;
|
||||
scanenable = preset != NTSCFilter::PRESET_OFF;
|
||||
}
|
||||
|
||||
myTVSharp->setEnabled(enable);
|
||||
myTVSharpLabel->setEnabled(enable);
|
||||
myTVHue->setEnabled(enable);
|
||||
myTVHueLabel->setEnabled(enable);
|
||||
myTVRes->setEnabled(enable);
|
||||
myTVResLabel->setEnabled(enable);
|
||||
myTVArtifacts->setEnabled(enable);
|
||||
myTVArtifactsLabel->setEnabled(enable);
|
||||
myTVFringe->setEnabled(enable);
|
||||
myTVFringeLabel->setEnabled(enable);
|
||||
myTVBlend->setEnabled(enable);
|
||||
myTVBlendLabel->setEnabled(enable);
|
||||
myTVBleed->setEnabled(enable);
|
||||
myTVBleedLabel->setEnabled(enable);
|
||||
myTVBright->setEnabled(enable);
|
||||
myTVBrightLabel->setEnabled(enable);
|
||||
myTVContrast->setEnabled(enable);
|
||||
|
@ -547,10 +658,47 @@ void VideoDialog::handleTVModeChange(bool enable)
|
|||
myTVSaturLabel->setEnabled(enable);
|
||||
myTVGamma->setEnabled(enable);
|
||||
myTVGammaLabel->setEnabled(enable);
|
||||
myCloneComposite->setEnabled(enable);
|
||||
myCloneSvideo->setEnabled(enable);
|
||||
myCloneRGB->setEnabled(enable);
|
||||
myCloneBad->setEnabled(enable);
|
||||
myCloneCustom->setEnabled(enable);
|
||||
|
||||
myTVScanLabel->setEnabled(scanenable);
|
||||
myTVScanIntense->setEnabled(scanenable);
|
||||
myTVScanIntenseLabel->setEnabled(scanenable);
|
||||
myTVScanInterpolate->setEnabled(scanenable);
|
||||
|
||||
_dirty = true;
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void VideoDialog::loadTVAdjustables(NTSCFilter::Preset preset)
|
||||
{
|
||||
NTSCFilter::Adjustable adj;
|
||||
instance().frameBuffer().ntsc().getAdjustables(adj, (NTSCFilter::Preset)preset);
|
||||
myTVSharp->setValue(adj.sharpness);
|
||||
myTVSharpLabel->setValue(adj.sharpness);
|
||||
myTVHue->setValue(adj.hue);
|
||||
myTVHueLabel->setValue(adj.hue);
|
||||
myTVRes->setValue(adj.resolution);
|
||||
myTVResLabel->setValue(adj.resolution);
|
||||
myTVArtifacts->setValue(adj.artifacts);
|
||||
myTVArtifactsLabel->setValue(adj.artifacts);
|
||||
myTVFringe->setValue(adj.fringing);
|
||||
myTVFringeLabel->setValue(adj.fringing);
|
||||
myTVBleed->setValue(adj.bleed);
|
||||
myTVBleedLabel->setValue(adj.bleed);
|
||||
myTVBright->setValue(adj.brightness);
|
||||
myTVBrightLabel->setValue(adj.brightness);
|
||||
myTVContrast->setValue(adj.contrast);
|
||||
myTVContrastLabel->setValue(adj.contrast);
|
||||
myTVSatur->setValue(adj.saturation);
|
||||
myTVSaturLabel->setValue(adj.saturation);
|
||||
myTVGamma->setValue(adj.gamma);
|
||||
myTVGammaLabel->setValue(adj.gamma);
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void VideoDialog::handleCommand(CommandSender* sender, int cmd,
|
||||
int data, int id)
|
||||
|
@ -585,15 +733,20 @@ void VideoDialog::handleCommand(CommandSender* sender, int cmd,
|
|||
handleFullscreenChange(myFullscreenPopup->getSelectedTag() != "-1");
|
||||
break;
|
||||
|
||||
case kTVModeChanged:
|
||||
handleTVModeChange((NTSCFilter::Preset)atoi(myTVMode->getSelectedTag().c_str()));
|
||||
|
||||
case kTVSharpChanged: myTVSharpLabel->setValue(myTVSharp->getValue());
|
||||
break;
|
||||
case kTVHueChanged: myTVHueLabel->setValue(myTVHue->getValue());
|
||||
break;
|
||||
case kTVResChanged: myTVResLabel->setValue(myTVRes->getValue());
|
||||
break;
|
||||
case kTVArtifactsChanged: myTVArtifactsLabel->setValue(myTVArtifacts->getValue());
|
||||
break;
|
||||
case kTVFringeChanged: myTVFringeLabel->setValue(myTVFringe->getValue());
|
||||
break;
|
||||
case kTVBlendChanged: myTVBlendLabel->setValue(myTVBlend->getValue());
|
||||
case kTVBleedChanged: myTVBleedLabel->setValue(myTVBleed->getValue());
|
||||
break;
|
||||
case kTVBrightChanged: myTVBrightLabel->setValue(myTVBright->getValue());
|
||||
break;
|
||||
|
@ -603,10 +756,18 @@ void VideoDialog::handleCommand(CommandSender* sender, int cmd,
|
|||
break;
|
||||
case kTVGammaChanged: myTVGammaLabel->setValue(myTVGamma->getValue());
|
||||
break;
|
||||
case kTVScanIntenseChanged: myTVScanIntenseLabel->setValue(myTVScanIntense->getValue());
|
||||
break;
|
||||
|
||||
case kTVModeChanged:
|
||||
handleTVModeChange(atoi(myTVMode->getSelectedTag().c_str()) ==
|
||||
(int)NTSCFilter::PRESET_CUSTOM);
|
||||
case kCloneCompositeCmd: loadTVAdjustables(NTSCFilter::PRESET_COMPOSITE);
|
||||
break;
|
||||
case kCloneSvideoCmd: loadTVAdjustables(NTSCFilter::PRESET_SVIDEO);
|
||||
break;
|
||||
case kCloneRGBCmd: loadTVAdjustables(NTSCFilter::PRESET_RGB);
|
||||
break;
|
||||
case kCloneBadCmd: loadTVAdjustables(NTSCFilter::PRESET_BAD);
|
||||
break;
|
||||
case kCloneCustomCmd: loadTVAdjustables(NTSCFilter::PRESET_CUSTOM);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
|
|
@ -49,7 +49,8 @@ class VideoDialog : public Dialog
|
|||
void setDefaults();
|
||||
|
||||
void handleFullscreenChange(bool enable);
|
||||
void handleTVModeChange(bool enable);
|
||||
void handleTVModeChange(NTSCFilter::Preset);
|
||||
void loadTVAdjustables(NTSCFilter::Preset preset);
|
||||
virtual void handleCommand(CommandSender* sender, int cmd, int data, int id);
|
||||
|
||||
private:
|
||||
|
@ -78,18 +79,20 @@ class VideoDialog : public Dialog
|
|||
CheckboxWidget* myCenterCheckbox;
|
||||
CheckboxWidget* myFastSCBiosCheckbox;
|
||||
|
||||
// TV effects options
|
||||
// TV effects adjustables (custom mode)
|
||||
PopUpWidget* myTVMode;
|
||||
SliderWidget* myTVSharp;
|
||||
StaticTextWidget* myTVSharpLabel;
|
||||
SliderWidget* myTVHue;
|
||||
StaticTextWidget* myTVHueLabel;
|
||||
SliderWidget* myTVRes;
|
||||
StaticTextWidget* myTVResLabel;
|
||||
SliderWidget* myTVArtifacts;
|
||||
StaticTextWidget* myTVArtifactsLabel;
|
||||
SliderWidget* myTVFringe;
|
||||
StaticTextWidget* myTVFringeLabel;
|
||||
SliderWidget* myTVBlend;
|
||||
StaticTextWidget* myTVBlendLabel;
|
||||
SliderWidget* myTVBleed;
|
||||
StaticTextWidget* myTVBleedLabel;
|
||||
SliderWidget* myTVBright;
|
||||
StaticTextWidget* myTVBrightLabel;
|
||||
SliderWidget* myTVContrast;
|
||||
|
@ -99,6 +102,19 @@ class VideoDialog : public Dialog
|
|||
SliderWidget* myTVGamma;
|
||||
StaticTextWidget* myTVGammaLabel;
|
||||
|
||||
// TV scanline intensity and interpolation
|
||||
StaticTextWidget* myTVScanLabel;
|
||||
SliderWidget* myTVScanIntense;
|
||||
StaticTextWidget* myTVScanIntenseLabel;
|
||||
CheckboxWidget* myTVScanInterpolate;
|
||||
|
||||
// TV effects adjustables presets (custom mode)
|
||||
ButtonWidget* myCloneComposite;
|
||||
ButtonWidget* myCloneSvideo;
|
||||
ButtonWidget* myCloneRGB;
|
||||
ButtonWidget* myCloneBad;
|
||||
ButtonWidget* myCloneCustom;
|
||||
|
||||
enum {
|
||||
kNAspectRatioChanged = 'VDan',
|
||||
kPAspectRatioChanged = 'VDap',
|
||||
|
@ -107,15 +123,22 @@ class VideoDialog : public Dialog
|
|||
|
||||
kTVModeChanged = 'VDtv',
|
||||
kTVSharpChanged = 'TVsh',
|
||||
kTVHueChanged = 'TVhu',
|
||||
kTVResChanged = 'TVrs',
|
||||
kTVArtifactsChanged = 'TVar',
|
||||
kTVFringeChanged = 'TVfr',
|
||||
kTVBlendChanged = 'TVbl',
|
||||
kTVBleedChanged = 'TVbl',
|
||||
kTVBrightChanged = 'TVbr',
|
||||
kTVContrastChanged = 'TVct',
|
||||
kTVSaturChanged = 'TVsa',
|
||||
kTVGammaChanged = 'TVga',
|
||||
kTVScanChanged = 'TVsc'
|
||||
kTVScanIntenseChanged= 'TVsc',
|
||||
|
||||
kCloneCompositeCmd = 'CLcp',
|
||||
kCloneSvideoCmd = 'CLsv',
|
||||
kCloneRGBCmd = 'CLrb',
|
||||
kCloneBadCmd = 'CLbd',
|
||||
kCloneCustomCmd = 'CLcu'
|
||||
};
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue