From 3e08c33c352b3d28c75e818fe601904a26d03d0f Mon Sep 17 00:00:00 2001 From: Thierry Crozat Date: Wed, 12 Oct 2016 22:32:36 +0100 Subject: GUI: Add checkbox and config option to enable/disable graphics filtering --- base/commandLine.cpp | 6 ++++++ base/main.cpp | 2 ++ engines/engine.cpp | 11 +++++++++- gui/options.cpp | 24 +++++++++++++++++++++ gui/options.h | 1 + gui/themes/default.inc | 6 ++++++ gui/themes/scummclassic.zip | Bin 126490 -> 126628 bytes gui/themes/scummclassic/classic_layout.stx | 3 +++ gui/themes/scummclassic/classic_layout_lowres.stx | 3 +++ gui/themes/scummmodern.zip | Bin 1646030 -> 1646168 bytes gui/themes/scummmodern/scummmodern_layout.stx | 3 +++ .../scummmodern/scummmodern_layout_lowres.stx | 3 +++ 12 files changed, 61 insertions(+), 1 deletion(-) diff --git a/base/commandLine.cpp b/base/commandLine.cpp index c2b4ea765f..8be2057338 100644 --- a/base/commandLine.cpp +++ b/base/commandLine.cpp @@ -80,6 +80,8 @@ static const char HELP_STRING[] = " -g, --gfx-mode=MODE Select graphics scaler (1x,2x,3x,2xsai,super2xsai,\n" " supereagle,advmame2x,advmame3x,hq2x,hq3x,tv2x,\n" " dotmatrix)\n" + " --filtering Force filtered graphics mode\n" + " --no-filtering Force unfiltered graphics mode\n" " --gui-theme=THEME Select GUI theme\n" " --themepath=PATH Path to where GUI themes are stored\n" " --list-themes Display list of all usable GUI themes\n" @@ -178,6 +180,7 @@ void registerDefaults() { // Graphics ConfMan.registerDefault("fullscreen", false); + ConfMan.registerDefault("filtering", false); ConfMan.registerDefault("aspect_ratio", false); ConfMan.registerDefault("gfx_mode", "normal"); ConfMan.registerDefault("render_mode", "default"); @@ -441,6 +444,9 @@ Common::String parseCommandLine(Common::StringMap &settings, int argc, const cha DO_OPTION_BOOL('f', "fullscreen") END_OPTION + + DO_LONG_OPTION_BOOL("filtering") + END_OPTION #ifdef ENABLE_EVENTRECORDER DO_LONG_OPTION_INT("disable-display") diff --git a/base/main.cpp b/base/main.cpp index 7807ddff7d..ca3a764f3a 100644 --- a/base/main.cpp +++ b/base/main.cpp @@ -290,6 +290,8 @@ static void setupGraphics(OSystem &system) { system.setFeatureState(OSystem::kFeatureAspectRatioCorrection, ConfMan.getBool("aspect_ratio")); if (ConfMan.hasKey("fullscreen")) system.setFeatureState(OSystem::kFeatureFullscreenMode, ConfMan.getBool("fullscreen")); + if (ConfMan.hasKey("filtering")) + system.setFeatureState(OSystem::kFeatureFilteringMode, ConfMan.getBool("filtering")); system.endGFXTransaction(); // When starting up launcher for the first time, the user might have specified diff --git a/engines/engine.cpp b/engines/engine.cpp index 68d9e8fde6..aac9c8c717 100644 --- a/engines/engine.cpp +++ b/engines/engine.cpp @@ -223,7 +223,7 @@ void initCommonGFX(bool defaultTo1XScaler) { g_system->setGraphicsMode(gfxMode.c_str()); // HACK: For OpenGL modes, we will still honor the graphics scale override - if (defaultTo1XScaler && (gfxMode.equalsIgnoreCase("opengl_linear") || gfxMode.equalsIgnoreCase("opengl_nearest"))) + if (defaultTo1XScaler && gfxMode.equalsIgnoreCase("opengl")) g_system->resetGraphicsScale(); } } @@ -242,6 +242,10 @@ void initCommonGFX(bool defaultTo1XScaler) { // (De)activate fullscreen mode as determined by the config settings if (gameDomain && gameDomain->contains("fullscreen")) g_system->setFeatureState(OSystem::kFeatureFullscreenMode, ConfMan.getBool("fullscreen")); + + // (De)activate filtering mode as determined by the config settings + if (gameDomain && gameDomain->contains("filtering")) + g_system->setFeatureState(OSystem::kFeatureFilteringMode, ConfMan.getBool("filtering")); } // Please leave the splash screen in working order for your releases, even if they're commercial. @@ -364,6 +368,11 @@ void initGraphics(int width, int height, bool defaultTo1xScaler, const Graphics: GUI::MessageDialog dialog(_("Could not apply fullscreen setting.")); dialog.runModal(); } + + if (gfxError & OSystem::kTransactionFilteringFailed) { + GUI::MessageDialog dialog(_("Could not apply filtering setting.")); + dialog.runModal(); + } } diff --git a/gui/options.cpp b/gui/options.cpp index 1f6683d388..4f8dbc20f9 100644 --- a/gui/options.cpp +++ b/gui/options.cpp @@ -135,6 +135,7 @@ void OptionsDialog::init() { _renderModePopUp = 0; _renderModePopUpDesc = 0; _fullscreenCheckbox = 0; + _filteringCheckbox = 0; _aspectCheckbox = 0; _enableAudioSettings = false; _midiTabId = 0; @@ -243,6 +244,12 @@ void OptionsDialog::open() { _fullscreenCheckbox->setState(ConfMan.getBool("fullscreen", _domain)); #endif // GUI_ONLY_FULLSCREEN + // Filtering setting + if (g_system->hasFeature(OSystem::kFeatureFilteringMode)) + _filteringCheckbox->setState(ConfMan.getBool("filtering", _domain)); + else + _filteringCheckbox->setVisible(false); + // Aspect ratio setting if (_guioptions.contains(GUIO_NOASPECT)) { _aspectCheckbox->setState(false); @@ -353,11 +360,14 @@ void OptionsDialog::close() { bool graphicsModeChanged = false; if (_fullscreenCheckbox) { if (_enableGraphicSettings) { + if (ConfMan.getBool("filtering", _domain) != _filteringCheckbox->getState()) + graphicsModeChanged = true; if (ConfMan.getBool("fullscreen", _domain) != _fullscreenCheckbox->getState()) graphicsModeChanged = true; if (ConfMan.getBool("aspect_ratio", _domain) != _aspectCheckbox->getState()) graphicsModeChanged = true; + ConfMan.setBool("filtering", _filteringCheckbox->getState(), _domain); ConfMan.setBool("fullscreen", _fullscreenCheckbox->getState(), _domain); ConfMan.setBool("aspect_ratio", _aspectCheckbox->getState(), _domain); @@ -384,6 +394,7 @@ void OptionsDialog::close() { ConfMan.set("render_mode", Common::getRenderModeCode((Common::RenderMode)_renderModePopUp->getSelectedTag()), _domain); } else { ConfMan.removeKey("fullscreen", _domain); + ConfMan.removeKey("filtering", _domain); ConfMan.removeKey("aspect_ratio", _domain); ConfMan.removeKey("gfx_mode", _domain); ConfMan.removeKey("render_mode", _domain); @@ -399,6 +410,9 @@ void OptionsDialog::close() { g_system->setFeatureState(OSystem::kFeatureAspectRatioCorrection, ConfMan.getBool("aspect_ratio", _domain)); if (ConfMan.hasKey("fullscreen")) g_system->setFeatureState(OSystem::kFeatureFullscreenMode, ConfMan.getBool("fullscreen", _domain)); + if (ConfMan.hasKey("filtering")) + g_system->setFeatureState(OSystem::kFeatureFilteringMode, ConfMan.getBool("filtering", _domain)); + OSystem::TransactionError gfxError = g_system->endGFXTransaction(); // Since this might change the screen resolution we need to give @@ -441,6 +455,12 @@ void OptionsDialog::close() { message += "\n"; message += _("the fullscreen setting could not be changed"); } + + if (gfxError & OSystem::kTransactionFilteringFailed) { + ConfMan.setBool("filtering", g_system->getFeatureState(OSystem::kFeatureFilteringMode), _domain); + message += "\n"; + message += _("the filtering setting could not be changed"); + } // And display the error GUI::MessageDialog dialog(message); @@ -633,6 +653,7 @@ void OptionsDialog::setGraphicSettingsState(bool enabled) { _gfxPopUp->setEnabled(enabled); _renderModePopUpDesc->setEnabled(enabled); _renderModePopUp->setEnabled(enabled); + _filteringCheckbox->setEnabled(enabled); #ifndef GUI_ENABLE_KEYSDIALOG _fullscreenCheckbox->setEnabled(enabled); if (_guioptions.contains(GUIO_NOASPECT)) @@ -785,6 +806,9 @@ void OptionsDialog::addGraphicControls(GuiObject *boss, const Common::String &pr // Fullscreen checkbox _fullscreenCheckbox = new CheckboxWidget(boss, prefix + "grFullscreenCheckbox", _("Fullscreen mode")); + + // Filtering checkbox + _filteringCheckbox = new CheckboxWidget(boss, prefix + "grFilteringCheckbox", _("Filter graphics"), _("Use linear filtering when scaling graphics")); // Aspect ratio checkbox _aspectCheckbox = new CheckboxWidget(boss, prefix + "grAspectCheckbox", _("Aspect ratio correction"), _("Correct aspect ratio for 320x200 games")); diff --git a/gui/options.h b/gui/options.h index 03dbdac492..802a503fd3 100644 --- a/gui/options.h +++ b/gui/options.h @@ -114,6 +114,7 @@ private: StaticTextWidget *_gfxPopUpDesc; PopUpWidget *_gfxPopUp; CheckboxWidget *_fullscreenCheckbox; + CheckboxWidget *_filteringCheckbox; CheckboxWidget *_aspectCheckbox; StaticTextWidget *_renderModePopUpDesc; PopUpWidget *_renderModePopUp; diff --git a/gui/themes/default.inc b/gui/themes/default.inc index 07e596163d..8524a7728f 100644 --- a/gui/themes/default.inc +++ b/gui/themes/default.inc @@ -834,6 +834,9 @@ const char *defaultXML1 = "" "" +"" "" "" "" @@ -2370,6 +2373,9 @@ const char *defaultXML1 = "" "" +"" "" "" "" diff --git a/gui/themes/scummclassic.zip b/gui/themes/scummclassic.zip index eb0ded5162..300e2ce087 100644 Binary files a/gui/themes/scummclassic.zip and b/gui/themes/scummclassic.zip differ diff --git a/gui/themes/scummclassic/classic_layout.stx b/gui/themes/scummclassic/classic_layout.stx index c67631ad22..ea5d3268c4 100644 --- a/gui/themes/scummclassic/classic_layout.stx +++ b/gui/themes/scummclassic/classic_layout.stx @@ -259,6 +259,9 @@ + diff --git a/gui/themes/scummclassic/classic_layout_lowres.stx b/gui/themes/scummclassic/classic_layout_lowres.stx index 212ef7c451..7f43c7b1e1 100644 --- a/gui/themes/scummclassic/classic_layout_lowres.stx +++ b/gui/themes/scummclassic/classic_layout_lowres.stx @@ -257,6 +257,9 @@ + diff --git a/gui/themes/scummmodern.zip b/gui/themes/scummmodern.zip index 0b8b771bf6..0968f06b40 100644 Binary files a/gui/themes/scummmodern.zip and b/gui/themes/scummmodern.zip differ diff --git a/gui/themes/scummmodern/scummmodern_layout.stx b/gui/themes/scummmodern/scummmodern_layout.stx index bb182c9dbb..a0a4e41f14 100644 --- a/gui/themes/scummmodern/scummmodern_layout.stx +++ b/gui/themes/scummmodern/scummmodern_layout.stx @@ -273,6 +273,9 @@ + diff --git a/gui/themes/scummmodern/scummmodern_layout_lowres.stx b/gui/themes/scummmodern/scummmodern_layout_lowres.stx index 2ca89ce734..13ec698b85 100644 --- a/gui/themes/scummmodern/scummmodern_layout_lowres.stx +++ b/gui/themes/scummmodern/scummmodern_layout_lowres.stx @@ -255,6 +255,9 @@ + -- cgit v1.2.3