1.5.78 release

* EmuFramework: Convert more options to state-less API
* C64.emu: Fix missing return statements in C64System::readConfig()
* Saturn.emu: Add option to skip printing MD5 sum in save file names
This commit is contained in:
Robert Broglia 2024-02-26 01:27:32 -05:00
parent 01c2056c6d
commit b062a726da
14 changed files with 49 additions and 56 deletions

View File

@ -164,16 +164,16 @@ bool C64System::readConfig(ConfigType type, MapIO &io, unsigned key, size_t read
{
case CFGKEY_DEFAULT_MODEL: return readOptionValue(io, readSize, defaultModel, modelIdIsValid);
case CFGKEY_CROP_NORMAL_BORDERS: return readOptionValue(io, readSize, optionCropNormalBorders);
case CFGKEY_DEFAULT_DRIVE_TRUE_EMULATION: readOptionValue(io, readSize, defaultDriveTrueEmulation);
case CFGKEY_DEFAULT_DRIVE_TRUE_EMULATION: return readOptionValue(io, readSize, defaultDriveTrueEmulation);
case CFGKEY_SID_ENGINE: return readOptionValue<uint8_t>(io, readSize, [&](auto v){ setSidEngine(v); });
case CFGKEY_BORDER_MODE: return readOptionValue<uint8_t>(io, readSize, [&](auto v){ setBorderMode(v); });
case CFGKEY_RESID_SAMPLING: return readOptionValue<uint8_t>(io, readSize, [&](auto v){ setReSidSampling(v); });
case CFGKEY_DEFAULT_PALETTE_NAME: return readStringOptionValue(io, readSize, defaultPaletteName);
case CFGKEY_COLOR_SATURATION: readOptionValue<int16_t>(io, readSize, [&](auto v){ setColorSetting(ColorSetting::Saturation, v); });
case CFGKEY_COLOR_CONTRAST: readOptionValue<int16_t>(io, readSize, [&](auto v){ setColorSetting(ColorSetting::Contrast, v); });
case CFGKEY_COLOR_BRIGHTNESS: readOptionValue<int16_t>(io, readSize, [&](auto v){ setColorSetting(ColorSetting::Brightness, v); });
case CFGKEY_COLOR_GAMMA: readOptionValue<int16_t>(io, readSize, [&](auto v){ setColorSetting(ColorSetting::Gamma, v); });
case CFGKEY_COLOR_TINT: readOptionValue<int16_t>(io, readSize, [&](auto v){ setColorSetting(ColorSetting::Tint, v); });
case CFGKEY_COLOR_SATURATION: return readOptionValue<int16_t>(io, readSize, [&](auto v){ setColorSetting(ColorSetting::Saturation, v); });
case CFGKEY_COLOR_CONTRAST: return readOptionValue<int16_t>(io, readSize, [&](auto v){ setColorSetting(ColorSetting::Contrast, v); });
case CFGKEY_COLOR_BRIGHTNESS: return readOptionValue<int16_t>(io, readSize, [&](auto v){ setColorSetting(ColorSetting::Brightness, v); });
case CFGKEY_COLOR_GAMMA: return readOptionValue<int16_t>(io, readSize, [&](auto v){ setColorSetting(ColorSetting::Gamma, v); });
case CFGKEY_COLOR_TINT: return readOptionValue<int16_t>(io, readSize, [&](auto v){ setColorSetting(ColorSetting::Tint, v); });
}
}
else if(type == ConfigType::SESSION)

View File

@ -219,7 +219,7 @@ public:
bool shouldOverwriteExistingState() const;
const auto &contentSearchPath() const { return contentSearchPath_; }
FS::PathString contentSearchPath(std::string_view name) const;
void setContentSearchPath(std::string_view path);
void setContentSearchPath(auto &&path) { contentSearchPath_ = IG_forward(path); }
FS::PathString validSearchPath(const FS::PathString &) const;
static void updateLegacySavePath(IG::ApplicationContext, CStringView path);
auto screenshotDirectory() const { return system().userPath(userScreenshotPath); }
@ -306,8 +306,7 @@ public:
uint8_t videoZoom() const { return optionImageZoom; }
bool setViewportZoom(uint8_t val);
uint8_t viewportZoom() { return optionViewportZoom; }
auto &showOnSecondScreenOption() { return optionShowOnSecondScreen; }
auto &textureBufferModeOption() { return optionTextureBufferMode; }
bool supportsShowOnSecondScreen(ApplicationContext ctx) { return ctx.androidSDK() >= 17; }
void setContentRotation(IG::Rotation);
Rotation contentRotation() const { return contentRotation_; }
void updateVideoContentRotation();
@ -343,7 +342,6 @@ public:
void applyFontSize(Window &win);
IG::FontSettings fontSettings(Window &win) const;
void setShowsTitleBar(bool on);
bool showsTitleBar() const { return optionTitleBar; };
void setLowProfileOSNavMode(Tristate mode);
void setHideOSNavMode(Tristate mode);
void setHideStatusBarMode(Tristate mode);
@ -549,7 +547,9 @@ protected:
int16_t optionFontSize{defaultFontSize};
int8_t optionFrameInterval{1};
Byte1Option optionNotificationIcon;
Byte1Option optionTitleBar;
public:
IG_UseMemberIf(CAN_HIDE_TITLE_BAR, bool, optionTitleBar){true};
protected:
IG_UseMemberIf(Config::NAVIGATION_BAR, Byte1Option, optionLowProfileOSNav);
IG_UseMemberIf(Config::NAVIGATION_BAR, Byte1Option, optionHideOSNav);
IG_UseMemberIf(Config::STATUS_BAR, Tristate, optionHideStatusBar){Tristate::IN_EMU};
@ -560,8 +560,10 @@ protected:
Byte1Option optionImageEffectPixelFormat;
Byte1Option optionImageZoom;
Byte1Option optionViewportZoom;
Byte1Option optionShowOnSecondScreen;
Byte1Option optionTextureBufferMode;
public:
IG_UseMemberIf(Config::BASE_MULTI_WINDOW && Config::BASE_MULTI_SCREEN, bool, optionShowOnSecondScreen){};
Gfx::TextureBufferMode optionTextureBufferMode{};
protected:
Gfx::DrawableConfig windowDrawableConf;
IG::PixelFormat renderPixelFmt;
IG::Rotation contentRotation_{IG::Rotation::ANY};

View File

@ -1,4 +1,4 @@
metadata_version = 1.5.77
metadata_version = 1.5.78
metadata_supportedMIMETypes = application/zip
metadata_supportedFileExtensions = rar 7z
android_metadata_versionCodeExtra = 16
@ -10,7 +10,6 @@ android_metadata_xperiaPlayOptimized = 1
android_metadata_legacyStorage = 1
android_metadata_appExtStorage = 1
android_metadata_adaptiveIconIsMonochrome = 1
ios_metadata_setuidPermissionHelper = 1
pnd_metadata_subcategory = Emulator
pnd_metadata_website = http://www.explusalpha.com
pnd_metadata_license = GPLv3+

View File

@ -59,9 +59,6 @@ void EmuApp::saveConfigFile(FileIO &io)
const auto cfgFileOptions = std::tie
(
#if defined CONFIG_BASE_MULTI_WINDOW && defined CONFIG_BASE_MULTI_SCREEN
optionShowOnSecondScreen,
#endif
#if defined __ANDROID__
optionLowProfileOSNav,
optionHideOSNav,
@ -72,9 +69,7 @@ void EmuApp::saveConfigFile(FileIO &io)
optionImageZoom,
optionViewportZoom,
optionImageEffectPixelFormat,
optionNotificationIcon,
optionTitleBar,
optionTextureBufferMode
optionNotificationIcon
);
std::apply([&](auto &...opt){ (writeOptionValue(io, opt), ...); }, cfgFileOptions);
@ -99,7 +94,12 @@ void EmuApp::saveConfigFile(FileIO &io)
writeOptionValue(io, CFGKEY_WINDOW_PIXEL_FORMAT, windowDrawablePixelFormatOption());
writeOptionValue(io, CFGKEY_VIDEO_COLOR_SPACE, windowDrawableColorSpaceOption());
writeOptionValue(io, CFGKEY_RENDER_PIXEL_FORMAT, renderPixelFormatOption());
writeOptionValueIfNotDefault(io, CFGKEY_TEXTURE_BUFFER_MODE, optionTextureBufferMode, Gfx::TextureBufferMode{});
if(used(optionShowOnSecondScreen))
writeOptionValueIfNotDefault(io, CFGKEY_SHOW_ON_2ND_SCREEN, optionShowOnSecondScreen, false);
writeOptionValueIfNotDefault(io, CFGKEY_SHOW_HIDDEN_FILES, showHiddenFilesInPicker, false);
if(used(optionTitleBar))
writeOptionValueIfNotDefault(io, CFGKEY_TITLE_BAR, optionTitleBar, true);
if constexpr(MOGA_INPUT)
{
if(mogaManagerPtr)
@ -221,9 +221,7 @@ EmuApp::ConfigParams EmuApp::loadConfigFile(IG::ApplicationContext ctx)
case CFGKEY_MENU_ORIENTATION: return readOptionValue(io, size, optionMenuOrientation);
case CFGKEY_IMAGE_ZOOM: return optionImageZoom.readFromIO(io, size);
case CFGKEY_VIEWPORT_ZOOM: return optionViewportZoom.readFromIO(io, size);
#if defined CONFIG_BASE_MULTI_WINDOW && defined CONFIG_BASE_MULTI_SCREEN
case CFGKEY_SHOW_ON_2ND_SCREEN: return optionShowOnSecondScreen.readFromIO(io, size);
#endif
case CFGKEY_SHOW_ON_2ND_SCREEN: return used(optionShowOnSecondScreen) ? readOptionValue(io, size, optionShowOnSecondScreen) : false;
case CFGKEY_IMAGE_EFFECT_PIXEL_FORMAT: return optionImageEffectPixelFormat.readFromIO(io, size);
case CFGKEY_RENDER_PIXEL_FORMAT:
setRenderPixelFormat(readOptionValue<IG::PixelFormat>(io, size, renderPixelFormatIsValid));
@ -234,7 +232,7 @@ EmuApp::ConfigParams EmuApp::loadConfigFile(IG::ApplicationContext ctx)
return true;
case CFGKEY_PAUSE_UNFOCUSED: return used(pauseUnfocused) ? readOptionValue(io, size, pauseUnfocused) : false;
case CFGKEY_NOTIFICATION_ICON: return optionNotificationIcon.readFromIO(io, size);
case CFGKEY_TITLE_BAR: return optionTitleBar.readFromIO(io, size);
case CFGKEY_TITLE_BAR: return used(optionTitleBar) ? readOptionValue(io, size, optionTitleBar) : false;
case CFGKEY_BACK_NAVIGATION:
return readOptionValue(io, size, viewManager.needsBackControl);
case CFGKEY_SYSTEM_ACTIONS_IS_DEFAULT_MENU: return readOptionValue(io, size, systemActionsIsDefaultMenu);
@ -250,7 +248,7 @@ EmuApp::ConfigParams EmuApp::loadConfigFile(IG::ApplicationContext ctx)
#endif
case CFGKEY_MOGA_INPUT_SYSTEM:
return MOGA_INPUT ? readOptionValue<bool>(io, size, [&](auto on){setMogaManagerActive(on, false);}) : false;
case CFGKEY_TEXTURE_BUFFER_MODE: return optionTextureBufferMode.readFromIO(io, size);
case CFGKEY_TEXTURE_BUFFER_MODE: return readOptionValue(io, size, optionTextureBufferMode);
#if defined __ANDROID__
case CFGKEY_LOW_PROFILE_OS_NAV: return optionLowProfileOSNav.readFromIO(io, size);
case CFGKEY_HIDE_OS_NAV: return optionHideOSNav.readFromIO(io, size);

View File

@ -123,15 +123,12 @@ EmuApp::EmuApp(ApplicationInitParams initParams, ApplicationContext &ctx):
vibrationManager_{ctx},
perfHintManager{ctx.performanceHintManager()},
optionNotificationIcon{CFGKEY_NOTIFICATION_ICON, 1, !Config::envIsAndroid},
optionTitleBar{CFGKEY_TITLE_BAR, 1, !CAN_HIDE_TITLE_BAR},
optionLowProfileOSNav{CFGKEY_LOW_PROFILE_OS_NAV, 1, !Config::envIsAndroid},
optionHideOSNav{CFGKEY_HIDE_OS_NAV, 0, !Config::envIsAndroid},
optionShowBluetoothScan{CFGKEY_SHOW_BLUETOOTH_SCAN, 1},
optionImageEffectPixelFormat{CFGKEY_IMAGE_EFFECT_PIXEL_FORMAT, IG::PIXEL_NONE, 0, imageEffectPixelFormatIsValid},
optionImageZoom(CFGKEY_IMAGE_ZOOM, 100, 0, optionImageZoomIsValid),
optionViewportZoom(CFGKEY_VIEWPORT_ZOOM, 100, 0, optionIsValidWithMinMax<50, 100>),
optionShowOnSecondScreen{CFGKEY_SHOW_ON_2ND_SCREEN, 0},
optionTextureBufferMode{CFGKEY_TEXTURE_BUFFER_MODE, 0},
layoutBehindSystemUI{ctx.hasTranslucentSysUI()}
{
if(ctx.registerInstance(initParams))
@ -485,13 +482,13 @@ void EmuApp::mainInitCommon(IG::ApplicationInitParams initParams, IG::Applicatio
[this, appConfig](IG::ApplicationContext ctx, IG::Window &win)
{
renderer.initMainTask(&win, windowDrawableConfig());
if(optionTextureBufferMode.val)
if(optionTextureBufferMode != Gfx::TextureBufferMode::DEFAULT)
{
auto mode = (Gfx::TextureBufferMode)optionTextureBufferMode.val;
auto mode = optionTextureBufferMode;
if(renderer.makeValidTextureBufferMode(mode) != mode)
{
// reset to default if saved non-default mode isn't supported
optionTextureBufferMode.reset();
optionTextureBufferMode = {};
}
}
viewManager.defaultFace = {renderer, fontManager.makeSystem(), fontSettings(win)};
@ -519,7 +516,7 @@ void EmuApp::mainInitCommon(IG::ApplicationInitParams initParams, IG::Applicatio
viewController.placeEmuViews();
});
emuVideo.setRendererTask(renderer.task());
emuVideo.setTextureBufferMode(system(), (Gfx::TextureBufferMode)optionTextureBufferMode.val);
emuVideo.setTextureBufferMode(system(), optionTextureBufferMode);
emuVideoLayer.setRendererTask(renderer.task());
applyRenderPixelFormat();
emuVideoLayer.updateEffect(system(), videoEffectPixelFormat());
@ -582,7 +579,7 @@ void EmuApp::mainInitCommon(IG::ApplicationInitParams initParams, IG::Applicatio
if(e.change == ScreenChange::added)
{
log.info("screen added");
if(showOnSecondScreenOption() && ctx.screens().size() > 1)
if(optionShowOnSecondScreen && ctx.screens().size() > 1)
setEmuViewOnExtraWindow(true, e.screen);
}
else if(e.change == ScreenChange::removed)
@ -642,7 +639,7 @@ void EmuApp::mainInitCommon(IG::ApplicationInitParams initParams, IG::Applicatio
if(backgrounded)
{
showUI();
if(showOnSecondScreenOption() && ctx.screens().size() > 1)
if(optionShowOnSecondScreen && ctx.screens().size() > 1)
{
setEmuViewOnExtraWindow(false, *ctx.screens()[1]);
}
@ -1192,11 +1189,6 @@ FS::PathString EmuApp::contentSearchPath(std::string_view name) const
return FS::uriString(contentSearchPath_, name);
}
void EmuApp::setContentSearchPath(std::string_view path)
{
contentSearchPath_ = path;
}
FS::PathString EmuApp::validSearchPath(const FS::PathString &path) const
{
auto ctx = appContext();
@ -1834,7 +1826,7 @@ void EmuApp::setEmuViewOnExtraWindow(bool on, IG::Screen &screen)
void EmuApp::configureSecondaryScreens()
{
if(showOnSecondScreenOption() && appContext().screens().size() > 1)
if(optionShowOnSecondScreen && appContext().screens().size() > 1)
{
setEmuViewOnExtraWindow(true, *appContext().screens()[1]);
}

View File

@ -60,10 +60,6 @@ void EmuApp::initOptions(IG::ApplicationContext ctx)
if(androidSdk >= 17)
optionNotificationIcon.isConst = true;
}
if(androidSdk < 17)
{
optionShowOnSecondScreen.isConst = true;
}
else
{
optionShowBluetoothScan.initDefault(0);

View File

@ -73,7 +73,7 @@ EmuViewController::EmuViewController(ViewAttachParams viewAttach,
app().onCustomizeNavView(*viewNav);
viewStack.setNavView(std::move(viewNav));
}
viewStack.showNavView(app().showsTitleBar());
viewStack.showNavView(app().optionTitleBar);
emuView.setLayoutInputView(&inputView);
}

View File

@ -158,7 +158,7 @@ GUIOptionView::GUIOptionView(ViewAttachParams attach, bool customMenu):
navView
{
"Title Bar", attach,
app().showsTitleBar(),
app().optionTitleBar,
[this](BoolMenuItem &item)
{
app().setShowsTitleBar(item.flipBoolValue(*this));

View File

@ -208,7 +208,7 @@ VideoOptionView::VideoOptionView(ViewAttachParams attach, bool customMenu):
decltype(textureBufferModeItem) items;
items.emplace_back("Auto (Set optimal mode)", attach, [this](View &view)
{
app().textureBufferModeOption() = 0;
app().optionTextureBufferMode = Gfx::TextureBufferMode::DEFAULT;
auto defaultMode = renderer().makeValidTextureBufferMode();
emuVideo().setTextureBufferMode(system(), defaultMode);
textureBufferMode.setSelected(MenuId{defaultMode});
@ -219,7 +219,7 @@ VideoOptionView::VideoOptionView(ViewAttachParams attach, bool customMenu):
{
items.emplace_back(desc.name, attach, [this](MenuItem &item)
{
app().textureBufferModeOption() = item.id;
app().optionTextureBufferMode = Gfx::TextureBufferMode(item.id.val);
emuVideo().setTextureBufferMode(system(), Gfx::TextureBufferMode(item.id.val));
}, MenuItem::Config{.id = desc.mode});
}
@ -229,7 +229,7 @@ VideoOptionView::VideoOptionView(ViewAttachParams attach, bool customMenu):
textureBufferMode
{
"GPU Copy Mode", attach,
MenuId{renderer().makeValidTextureBufferMode(Gfx::TextureBufferMode(app().textureBufferModeOption().val))},
MenuId{renderer().makeValidTextureBufferMode(app().optionTextureBufferMode)},
textureBufferModeItem
},
frameIntervalItem
@ -702,13 +702,13 @@ VideoOptionView::VideoOptionView(ViewAttachParams attach, bool customMenu):
showOnSecondScreen
{
"External Screen", attach,
(bool)app().showOnSecondScreenOption(),
app().optionShowOnSecondScreen,
"OS Managed", "Emu Content",
[this](BoolMenuItem &item)
{
app().showOnSecondScreenOption() = item.flipBoolValue(*this);
app().optionShowOnSecondScreen = item.flipBoolValue(*this);
if(appContext().screens().size() > 1)
app().setEmuViewOnExtraWindow(app().showOnSecondScreenOption(), *appContext().screens()[1]);
app().setEmuViewOnExtraWindow(app().optionShowOnSecondScreen, *appContext().screens()[1]);
}
},
frameClockItems
@ -973,7 +973,7 @@ void VideoOptionView::loadStockItems()
item.emplace_back(&screenFrameRate);
if(used(secondDisplay))
item.emplace_back(&secondDisplay);
if(used(showOnSecondScreen) && !app().showOnSecondScreenOption().isConst)
if(used(showOnSecondScreen) && app().supportsShowOnSecondScreen(appContext()))
item.emplace_back(&showOnSecondScreen);
}

View File

@ -567,12 +567,15 @@ class CustomSystemOptionView : public SystemOptionView, public MainAppHelper<Cus
}
};
BoolMenuItem saveFilenameType = saveFilenameTypeMenuItem(*this, system());
public:
CustomSystemOptionView(ViewAttachParams attach): SystemOptionView{attach, true}
{
loadStockItems();
item.emplace_back(&biosLanguage);
item.emplace_back(&autoSetRTC);
item.emplace_back(&saveFilenameType);
}
};

View File

@ -86,6 +86,7 @@ enum
CFGKEY_DEFAULT_NTSC_VIDEO_LINES = 287, CFGKEY_DEFAULT_PAL_VIDEO_LINES = 288,
CFGKEY_DEFAULT_SHOW_H_OVERSCAN = 289, CFGKEY_SHOW_H_OVERSCAN = 290,
CFGKEY_DEINTERLACE_MODE = 291, CFGKEY_WIDESCREEN_MODE = 292,
CFGKEY_NO_MD5_FILENAMES = 293
};
struct VideoLineRange

View File

@ -78,6 +78,7 @@ bool SaturnSystem::readConfig(ConfigType type, MapIO &io, unsigned key, size_t r
case CFGKEY_DEFAULT_NTSC_VIDEO_LINES: return readOptionValue(io, readSize, defaultNtscLines, linesAreValid<240>);
case CFGKEY_DEFAULT_PAL_VIDEO_LINES: return readOptionValue(io, readSize, defaultPalLines, linesAreValid<288>);
case CFGKEY_DEFAULT_SHOW_H_OVERSCAN: return readOptionValue(io, readSize, defaultShowHOverscan);
case CFGKEY_NO_MD5_FILENAMES: return readOptionValue(io, readSize, noMD5InFilenames);
}
}
else if(type == ConfigType::SESSION)
@ -110,6 +111,7 @@ void SaturnSystem::writeConfig(ConfigType type, FileIO &io)
writeOptionValueIfNotDefault(io, CFGKEY_DEFAULT_NTSC_VIDEO_LINES, defaultNtscLines, safeNtscLines);
writeOptionValueIfNotDefault(io, CFGKEY_DEFAULT_PAL_VIDEO_LINES, defaultPalLines, safePalLines);
writeOptionValueIfNotDefault(io, CFGKEY_DEFAULT_SHOW_H_OVERSCAN, defaultShowHOverscan, false);
writeOptionValueIfNotDefault(io, CFGKEY_NO_MD5_FILENAMES, noMD5InFilenames, false);
}
else if(type == ConfigType::SESSION)
{

View File

@ -41,7 +41,7 @@ prefix ?= $(IMAGINE_SDK_PLATFORM_PATH)
imaginePkgconfigTemplate := $(IMAGINE_PATH)/pkgconfig/imagine.pc
pkgName := $(libName)
pkgDescription := Game/Multimedia Engine
pkgVersion := 1.5.77
pkgVersion := 1.5.78
LDLIBS := -l$(libName) $(LDLIBS)
ifdef libNameExt
pkgCFlags := -DIMAGINE_CONFIG_H=$(configFilename)

View File

@ -15,7 +15,7 @@
You should have received a copy of the GNU General Public License
along with Imagine. If not, see <http://www.gnu.org/licenses/> */
#define IMAGINE_VERSION_BASE "1.5.77"
#define IMAGINE_VERSION_BASE "1.5.78"
#ifdef NDEBUG
#define IMAGINE_VERSION IMAGINE_VERSION_BASE