From 8ff6f506351cc946b1309f59c2ab460ddaaca02f Mon Sep 17 00:00:00 2001 From: Leon Styhre Date: Sun, 11 Aug 2024 12:32:04 +0200 Subject: [PATCH] Changed ScreenSaver to use TextComponent instead of using Font facilities directly --- es-app/src/Screensaver.cpp | 50 ++++++++++++-------------------------- es-app/src/Screensaver.h | 8 +++--- 2 files changed, 18 insertions(+), 40 deletions(-) diff --git a/es-app/src/Screensaver.cpp b/es-app/src/Screensaver.cpp index 3c466842a..cb5202cd0 100644 --- a/es-app/src/Screensaver.cpp +++ b/es-app/src/Screensaver.cpp @@ -54,6 +54,7 @@ Screensaver::Screensaver() void Screensaver::startScreensaver(bool generateMediaList) { ViewController::getInstance()->pauseViewVideos(); + mGameOverlay = std::make_unique("", Font::get(FONT_SIZE_SMALL), 0xFFFFFFFF); mScreensaverType = Settings::getInstance()->getString("ScreensaverType"); // In case there is an invalid entry in the es_settings.xml file. @@ -67,13 +68,6 @@ void Screensaver::startScreensaver(bool generateMediaList) mFallbackScreensaver = false; mOpacity = 0.0f; - // Keep a reference to the default fonts, so they don't keep getting destroyed/recreated. - if (mGameOverlayFont.empty()) { - mGameOverlayFont.push_back(Font::get(FONT_SIZE_SMALL)); - mGameOverlayFont.push_back(Font::get(FONT_SIZE_MEDIUM)); - mGameOverlayFont.push_back(Font::get(FONT_SIZE_LARGE)); - } - // Set mPreviousGame which will be used to avoid showing the same game again during // the random selection. if ((mScreensaverType == "slideshow" || mScreensaverType == "video") && mCurrentGame != nullptr) @@ -196,6 +190,7 @@ void Screensaver::stopScreensaver() { mImageScreensaver.reset(); mVideoScreensaver.reset(); + mGameOverlay.reset(); mScreensaverActive = false; mDimValue = 1.0f; @@ -203,9 +198,6 @@ void Screensaver::stopScreensaver() mTextFadeIn = 0; mSaturationAmount = 1.0f; - if (mGameOverlay) - mGameOverlay.reset(); - ViewController::getInstance()->startViewVideos(); } @@ -298,8 +290,7 @@ void Screensaver::renderScreensaver() if (Settings::getInstance()->getBool("ScreensaverSlideshowScanlines")) mRenderer->shaderPostprocessing(Renderer::Shader::SCANLINES); if (Settings::getInstance()->getBool("ScreensaverSlideshowGameInfo") && - !Settings::getInstance()->getBool("ScreensaverSlideshowCustomImages") && - mGameOverlay) { + !Settings::getInstance()->getBool("ScreensaverSlideshowCustomImages")) { mRenderer->setMatrix(mRenderer->getIdentity()); if (mGameOverlayRectangleCoords.size() == 4) { mRenderer->drawRect( @@ -311,7 +302,7 @@ void Screensaver::renderScreensaver() mGameOverlay.get()->setColor(0xFFFFFF00 | mTextFadeIn); if (mTextFadeIn > 50) - mGameOverlayFont.at(0)->renderTextCache(mGameOverlay.get()); + mGameOverlay->render(trans); if (mTextFadeIn < 255) mTextFadeIn = glm::clamp(mTextFadeIn + 2 + mTextFadeIn / 6, 0, 255); } @@ -340,7 +331,7 @@ void Screensaver::renderScreensaver() if (shaders != 0) mRenderer->shaderPostprocessing(shaders, videoParameters); - if (Settings::getInstance()->getBool("ScreensaverVideoGameInfo") && mGameOverlay) { + if (Settings::getInstance()->getBool("ScreensaverVideoGameInfo")) { mRenderer->setMatrix(mRenderer->getIdentity()); if (mGameOverlayRectangleCoords.size() == 4) { mRenderer->drawRect( @@ -352,7 +343,7 @@ void Screensaver::renderScreensaver() mGameOverlay.get()->setColor(0xFFFFFF00 | mTextFadeIn); if (mTextFadeIn > 50) - mGameOverlayFont.at(0)->renderTextCache(mGameOverlay.get()); + mGameOverlay->render(trans); if (mTextFadeIn < 255) mTextFadeIn = glm::clamp(mTextFadeIn + 2 + mTextFadeIn / 6, 0, 255); } @@ -689,8 +680,8 @@ void Screensaver::generateOverlayInfo() if (mGameName == "" || mSystemName == "") return; - float posX {mRenderer->getScreenWidth() * 0.023f}; - float posY {mRenderer->getScreenHeight() * 0.02f}; + const float posX {mRenderer->getScreenWidth() * 0.023f}; + const float posY {mRenderer->getScreenHeight() * 0.02f}; const bool favoritesOnly { (mScreensaverType == "video" && @@ -707,28 +698,17 @@ void Screensaver::generateOverlayInfo() const std::string systemName {Utils::String::toUpper(mSystemName)}; const std::string overlayText {gameName + "\n" + systemName}; - mGameOverlay = std::unique_ptr( - mGameOverlayFont.at(0)->buildTextCache(overlayText, posX, posY, 0xFFFFFFFF)); + mGameOverlay->setText(overlayText); + mGameOverlay->setPosition(posX, posY); - float textSizeX {0.0f}; - float textSizeY {mGameOverlayFont[0].get()->sizeText(overlayText).y}; + // Setting the Y size to zero makes the text area expand vertically as needed. + mGameOverlay->setSize(mGameOverlay->getSize().x, 0.0f); - // There is a weird issue with sizeText() where the X size value is returned - // as too large if there are two rows in a string and the second row is longer - // than the first row. Possibly it's the newline character that is somehow - // injected in the size calculation. Regardless, this workaround is working - // fine for the time being. - if (mGameOverlayFont[0].get()->sizeText(gameName).x > - mGameOverlayFont[0].get()->sizeText(systemName).x) - textSizeX = mGameOverlayFont[0].get()->sizeText(gameName).x; - else - textSizeX = mGameOverlayFont[0].get()->sizeText(systemName).x; - - float marginX {mRenderer->getScreenWidth() * 0.01f}; + const float marginX {mRenderer->getScreenWidth() * 0.01f}; mGameOverlayRectangleCoords.clear(); mGameOverlayRectangleCoords.push_back(posX - marginX); mGameOverlayRectangleCoords.push_back(posY); - mGameOverlayRectangleCoords.push_back(textSizeX + marginX * 2.0f); - mGameOverlayRectangleCoords.push_back(textSizeY); + mGameOverlayRectangleCoords.push_back(mGameOverlay->getSize().x + marginX * 2.0f); + mGameOverlayRectangleCoords.push_back(mGameOverlay->getSize().y); } diff --git a/es-app/src/Screensaver.h b/es-app/src/Screensaver.h index a5fd13057..a1cc025d1 100644 --- a/es-app/src/Screensaver.h +++ b/es-app/src/Screensaver.h @@ -12,8 +12,8 @@ #include "Window.h" #include "components/ImageComponent.h" +#include "components/TextComponent.h" #include "components/VideoComponent.h" -#include "resources/Font.h" class Screensaver : public Window::Screensaver { @@ -54,6 +54,8 @@ private: std::vector mCustomFilesInventory; std::unique_ptr mImageScreensaver; std::unique_ptr mVideoScreensaver; + std::unique_ptr mGameOverlay; + std::vector mGameOverlayRectangleCoords; FileData* mCurrentGame; FileData* mPreviousGame; @@ -73,10 +75,6 @@ private: unsigned char mRectangleFadeIn; unsigned char mTextFadeIn; float mSaturationAmount; - - std::unique_ptr mGameOverlay; - std::vector> mGameOverlayFont; - std::vector mGameOverlayRectangleCoords; }; #endif // ES_APP_SCREENSAVER_H