From 209eed35edf2ecb54c7a093c1857b27931f77f68 Mon Sep 17 00:00:00 2001 From: Vicki Pfau Date: Mon, 17 Aug 2020 20:17:39 -0700 Subject: [PATCH] mGUI: Add status indicators for fast-forward and mute --- CHANGES | 1 + include/mgba-util/gui/font.h | 2 ++ res/font-new.png | Bin 15988 -> 15982 bytes src/feature/gui/gui-config.c | 10 ++++++++++ src/feature/gui/gui-runner.c | 32 +++++++++++++++++++++++++++----- src/util/gui/font-metrics.c | 2 ++ 6 files changed, 42 insertions(+), 5 deletions(-) diff --git a/CHANGES b/CHANGES index fdbc08eca..fe8365057 100644 --- a/CHANGES +++ b/CHANGES @@ -3,6 +3,7 @@ Features: - e-Reader card scanning - Add WebP and APNG recording - Add mute option in homebrew ports + - Add status indicators for fast-forward and mute in homebrew ports - Support for unlicensed Pokemon Jade/Diamond Game Boy mapper - Support for unlicensed BBD Game Boy mapper - Support for unlicensed Hitek Game Boy mapper diff --git a/include/mgba-util/gui/font.h b/include/mgba-util/gui/font.h index 3ace00071..7f1ba34ce 100644 --- a/include/mgba-util/gui/font.h +++ b/include/mgba-util/gui/font.h @@ -53,6 +53,8 @@ enum GUIIcon { GUI_ICON_BUTTON_TRIANGLE, GUI_ICON_BUTTON_SQUARE, GUI_ICON_BUTTON_HOME, + GUI_ICON_STATUS_FAST_FORWARD, + GUI_ICON_STATUS_MUTE, GUI_ICON_MAX, }; diff --git a/res/font-new.png b/res/font-new.png index 2204bebd9c7ace6529c6c89a342c6c06f38f6163..66389c44ba175afffcab086cc531a878c51c08d4 100644 GIT binary patch literal 15982 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, "autosave", true); #endif + mCoreConfigSetDefaultIntValue(&runner->config, "showOSD", true); mCoreConfigLoad(&runner->config); mCoreConfigGetIntValue(&runner->config, "logLevel", &logger.logLevel); @@ -430,6 +431,12 @@ void mGUIRun(struct mGUIRunner* runner, const char* path) { mCoreLoadState(runner->core, 0, SAVESTATE_SCREENSHOT | SAVESTATE_RTC); } + int showOSD = true; + mCoreConfigGetIntValue(&runner->config, "showOSD", &showOSD); + + int drawFps = false; + mCoreConfigGetIntValue(&runner->config, "fpsCounter", &drawFps); + bool running = true; #ifndef DISABLE_THREADING @@ -503,16 +510,29 @@ void mGUIRun(struct mGUIRunner* runner, const char* path) { runner->core->setKeys(runner->core, keys); runner->core->runFrame(runner->core); if (runner->drawFrame) { - int drawFps = false; - mCoreConfigGetIntValue(&runner->config, "fpsCounter", &drawFps); - runner->params.drawStart(); runner->drawFrame(runner, false); - if (drawFps) { + if (showOSD || drawFps) { if (runner->params.guiPrepare) { runner->params.guiPrepare(); } - GUIFontPrintf(runner->params.font, 0, GUIFontHeight(runner->params.font), GUI_ALIGN_LEFT, 0x7FFFFFFF, "%.2f fps", runner->fps); + if (drawFps) { + GUIFontPrintf(runner->params.font, 0, GUIFontHeight(runner->params.font), GUI_ALIGN_LEFT, 0x7FFFFFFF, "%.2f fps", runner->fps); + } + if (showOSD) { + unsigned origin = runner->params.width - GUIFontHeight(runner->params.font) / 2; + unsigned w; + if (fastForward || (heldKeys & (1 << mGUI_INPUT_FAST_FORWARD_HELD))) { + GUIFontDrawIcon(runner->params.font, origin, GUIFontHeight(runner->params.font) / 2, GUI_ALIGN_RIGHT, 0, 0x7FFFFFFF, GUI_ICON_STATUS_FAST_FORWARD); + GUIFontIconMetrics(runner->params.font, GUI_ICON_STATUS_FAST_FORWARD, &w, NULL); + origin -= w + GUIFontHeight(runner->params.font) / 2; + } + if (runner->core->opts.mute) { + GUIFontDrawIcon(runner->params.font, origin, GUIFontHeight(runner->params.font) / 2, GUI_ALIGN_RIGHT, 0, 0x7FFFFFFF, GUI_ICON_STATUS_MUTE); + GUIFontIconMetrics(runner->params.font, GUI_ICON_STATUS_MUTE, &w, NULL); + origin -= w + GUIFontHeight(runner->params.font) / 2; + } + } if (runner->params.guiFinish) { runner->params.guiFinish(); } @@ -603,6 +623,8 @@ void mGUIRun(struct mGUIRunner* runner, const char* path) { if (runner->unpaused) { runner->unpaused(runner); } + mCoreConfigGetIntValue(&runner->config, "fpsCounter", &drawFps); + mCoreConfigGetIntValue(&runner->config, "showOSD", &showOSD); } mLOG(GUI_RUNNER, DEBUG, "Shutting down..."); if (runner->gameUnloaded) { diff --git a/src/util/gui/font-metrics.c b/src/util/gui/font-metrics.c index 99bc2daf6..1a7b3f539 100644 --- a/src/util/gui/font-metrics.c +++ b/src/util/gui/font-metrics.c @@ -152,4 +152,6 @@ const struct GUIIconMetric defaultIconMetrics[] = { [GUI_ICON_BUTTON_TRIANGLE] = { 34, 34, 12, 11 }, [GUI_ICON_BUTTON_SQUARE] = { 50, 34, 12, 11 }, [GUI_ICON_BUTTON_HOME] = { 66, 34, 12, 11 }, + [GUI_ICON_STATUS_FAST_FORWARD] = { 2, 50, 12, 12 }, + [GUI_ICON_STATUS_MUTE] = { 17, 50, 14, 12 }, };