diff --git a/romsel_dsimenutheme/arm9/include/startborderpal.h b/romsel_dsimenutheme/arm9/include/startborderpal.h index 4693984e22..35979066ad 100644 --- a/romsel_dsimenutheme/arm9/include/startborderpal.h +++ b/romsel_dsimenutheme/arm9/include/startborderpal.h @@ -185,6 +185,11 @@ const unsigned short bmpPal_topSmallFont[16][4] {0x7C1F, 0xC8BC, 0xCC7E, 0xD8DE} // 15: fuschia }; +const unsigned short progressBarColors[16] +{ + 0xCE0C, 0x8137, 0x8C1F, 0xFE3F, 0x825F, 0x839E, 0x83F5, 0x83E0, 0x9E80, 0xC769, 0xFAE6, 0xF960, 0xC800, 0xE811, 0xF41A, 0xC81F +}; + #endif // START_BORDER_PAL_H //}}BLOCK(start_border0) diff --git a/romsel_dsimenutheme/arm9/source/graphics/Texture.cpp b/romsel_dsimenutheme/arm9/source/graphics/Texture.cpp index 655234bdb7..761ed174bf 100644 --- a/romsel_dsimenutheme/arm9/source/graphics/Texture.cpp +++ b/romsel_dsimenutheme/arm9/source/graphics/Texture.cpp @@ -4,6 +4,8 @@ #include "common/lodepng.h" #include +extern bool useTwlCfg; + Texture::Texture(const std::string &filePath, const std::string &fallback) : _paletteLength(0), _texLength(0), _texCmpLength(0), _texHeight(0), _texWidth(0), _type(TextureType::Unknown) { std::string pngPath; @@ -241,6 +243,26 @@ void Texture::applyBitmapEffect(Texture::BitmapEffect effect) { } } +void Texture::applyUserPaletteFile(const std::string &filePath, Texture::PaletteEffect fallbackEffect) { + if (_type & TextureType::Paletted) { + FILE *file = fopen(filePath.c_str(), "rb"); + if (file) { + u16 *pal = _palette.get(); + int offset = ((useTwlCfg ? *(u8*)0x02000444 : PersonalData->theme) * _paletteLength); + fseek(file, sizeof(u16) * offset, SEEK_SET); + fread(pal, sizeof(u16), _paletteLength, file); + fclose(file); + // swap palette bytes + for (int i = 0; i < _paletteLength; i++) { + pal[i] = (pal[i] << 8 & 0xFF00) | pal[i] >> 8; + } + } + else { + fallbackEffect(_palette.get(), _paletteLength); + } + } +} + u16 Texture::bmpToDS(u16 val) { // Return 0 for #ff00ff if ((val & 0x7FFF) == 0x7C1F) @@ -267,6 +289,13 @@ u16 Texture::bmpToDS(u16 val) { } } +bool Texture::exists(const std::string &filePath) { + for (const char *extension : extensions) { + if (access((filePath + extension).c_str(), F_OK) == 0) return true; + } + return false; +} + void Texture::copy(u16 *dst, bool vram) const { switch(_type) { case TextureType::PalettedGrf: diff --git a/romsel_dsimenutheme/arm9/source/graphics/Texture.h b/romsel_dsimenutheme/arm9/source/graphics/Texture.h index ef573ba06b..94a5249b90 100644 --- a/romsel_dsimenutheme/arm9/source/graphics/Texture.h +++ b/romsel_dsimenutheme/arm9/source/graphics/Texture.h @@ -61,6 +61,7 @@ class Texture void applyPaletteEffect(PaletteEffect effect); void applyBitmapEffect(BitmapEffect effect); + void applyUserPaletteFile(const std::string &filePath, PaletteEffect fallbackEffect); static u16 bmpToDS(u16 val); @@ -77,6 +78,8 @@ class Texture TextureType type() const { return _type; } + static bool exists(const std::string &filePath); + void copy(u16 *dst, bool vram) const; private: diff --git a/romsel_dsimenutheme/arm9/source/graphics/ThemeConfig.cpp b/romsel_dsimenutheme/arm9/source/graphics/ThemeConfig.cpp index 96590fcc47..0dc9835db2 100644 --- a/romsel_dsimenutheme/arm9/source/graphics/ThemeConfig.cpp +++ b/romsel_dsimenutheme/arm9/source/graphics/ThemeConfig.cpp @@ -7,10 +7,8 @@ #include #include -ThemeConfig::ThemeConfig() : ThemeConfig(false) {} - // Magic numbers derived from default dark theme -ThemeConfig::ThemeConfig(bool _3dsDefaults) +ThemeConfig::ThemeConfig() : _startBorderRenderY(81), _startBorderSpriteW(32), _startBorderSpriteH(80), _startTextRenderY(143), _titleboxRenderY(85), _titleboxMaxLines(4), _titleboxTextY(30), _titleboxTextW(240), _titleboxTextLarge(true), _bubbleTipRenderY(80), _bubbleTipRenderX(122), _bubbleTipSpriteH(8), _bubbleTipSpriteW(11), @@ -18,9 +16,20 @@ ThemeConfig::ThemeConfig(bool _3dsDefaults) _volumeRenderY(4), _volumeRenderX(16), _batteryRenderY(5), _batteryRenderX(235), _usernameRenderY(3), _usernameRenderX(28), _usernameRenderXDS(4), _dateRenderY(5), _dateRenderX(162), _timeRenderY(5), _timeRenderX(200), // _photoRenderY(24), _photoRenderX(179), - _startTextUserPalette(true), _startBorderUserPalette(true), _buttonArrowUserPalette(true), _movingArrowUserPalette(true), - _launchDotsUserPalette(true), _dialogBoxUserPalette(true), _usernameUserPalette(true), + _bipsUserPalette(false), _boxUserPalette(false), _boxEmptyUserPalette(false), _boxFullUserPalette(false), + _braceUserPalette(false), _bubbleUserPalette(false), _buttonArrowUserPalette(true), _cornerButtonUserPalette(false), + _cursorUserPalette(false), _dialogBoxUserPalette(true), _folderUserPalette(false), _launchDotsUserPalette(true), + _movingArrowUserPalette(true), _progressUserPalette(true), _scrollWindowUserPalette(false), _smallCartUserPalette(false), + _startBorderUserPalette(true), _startTextUserPalette(true), _wirelessIconsUserPalette(false), + _iconA26UserPalette(false), _iconCOLUserPalette(false), _iconGBUserPalette(false), _iconGBAUserPalette(false), + _iconGBAModeUserPalette(false), _iconGGUserPalette(false), _iconIMGUserPalette(false), _iconINTUserPalette(false), + _iconM5UserPalette(false), _iconManualUserPalette(false), _iconMDUserPalette(false), _iconNESUserPalette(false), + _iconNGPUserPalette(false), _iconPCEUserPalette(false), _iconPLGUserPalette(false), _iconSettingsUserPalette(false), + _iconSGUserPalette(false), _iconSMSUserPalette(false), _iconSNESUserPalette(false), _iconUnknownUserPalette(false), + _iconWSUserPalette(false), + _usernameUserPalette(true), _progressBarUserPalette(true), _purpleBatteryAvailable(false), _renderPhoto(true), _darkLoading(false), _playStartupJingle(false), _startupJingleDelayAdjust(0), + _progressBarColor(0x7C00), _fontPalette1(0x0000), _fontPalette2(0xDEF7), _fontPalette3(0xC631), _fontPalette4(0xA108), _fontPaletteTitlebox1(0x0000), _fontPaletteTitlebox2(0xDEF7), _fontPaletteTitlebox3(0xC631), _fontPaletteTitlebox4(0xA108), _fontPaletteDialog1(0x0000), _fontPaletteDialog2(0xDEF7), _fontPaletteDialog3(0xC631), _fontPaletteDialog4(0xA108), @@ -28,21 +37,9 @@ ThemeConfig::ThemeConfig(bool _3dsDefaults) _fontPaletteUsername1(0x0000), _fontPaletteUsername2(0xDEF7), _fontPaletteUsername3(0xC631), _fontPaletteUsername4(0xA108), _fontPaletteDateTime1(0x0000), _fontPaletteDateTime2(0xDEF7), _fontPaletteDateTime3(0xC631), _fontPaletteDateTime4(0xA108) { - // hack to reassign 3ds defaults - if (_3dsDefaults) { - _startBorderRenderY = 92; - _startBorderSpriteH = 64; - _titleboxRenderY = 96; - _bubbleTipRenderX = 125; - _bubbleTipRenderY = 98; - _bubbleTipSpriteH = 7; - _bubbleTipSpriteW = 7; - _renderPhoto = false; - - _titleboxMaxLines = 3; - _titleboxTextY = 55; - _titleboxTextW = 200; - _titleboxTextLarge = false; + if (ms().theme == TWLSettings::ETheme3DS) { + _startBorderUserPalette = false; + _dialogBoxUserPalette = false; } if (ms().theme == TWLSettings::EThemeSaturn || ms().theme == TWLSettings::EThemeHBL) { @@ -104,13 +101,51 @@ void ThemeConfig::loadConfig() { _timeRenderY = getInt(themeConfig, "TimeRenderY", _timeRenderY); _timeRenderX = getInt(themeConfig, "TimeRenderX", _timeRenderX); - _startTextUserPalette = getInt(themeConfig, "StartTextUserPalette", _startTextUserPalette); - _startBorderUserPalette = getInt(themeConfig, "StartBorderUserPalette", _startBorderUserPalette); + _bipsUserPalette = getInt(themeConfig, "BipsUserPalette", _bipsUserPalette); + _boxUserPalette = getInt(themeConfig, "BoxUserPalette", _boxUserPalette); + _boxEmptyUserPalette = getInt(themeConfig, "BoxEmptyUserPalette", _boxEmptyUserPalette); + _boxFullUserPalette = getInt(themeConfig, "BoxFullUserPalette", _boxFullUserPalette); + _braceUserPalette = getInt(themeConfig, "BraceUserPalette", _braceUserPalette); + _bubbleUserPalette = getInt(themeConfig, "BubbleUserPalette", _bubbleUserPalette); _buttonArrowUserPalette = getInt(themeConfig, "ButtonArrowUserPalette", _buttonArrowUserPalette); - _movingArrowUserPalette = getInt(themeConfig, "MovingArrowUserPalette", _movingArrowUserPalette); - _launchDotsUserPalette = getInt(themeConfig, "LaunchDotsUserPalette", _launchDotsUserPalette); + _cornerButtonUserPalette = getInt(themeConfig, "CornerButtonUserPalette", _cornerButtonUserPalette); + _cursorUserPalette = getInt(themeConfig, "CursorUserPalette", _cursorUserPalette); _dialogBoxUserPalette = getInt(themeConfig, "DialogBoxUserPalette", _dialogBoxUserPalette); + _folderUserPalette = getInt(themeConfig, "FolderUserPalette", _folderUserPalette); + _launchDotsUserPalette = getInt(themeConfig, "LaunchDotsUserPalette", _launchDotsUserPalette); + _movingArrowUserPalette = getInt(themeConfig, "MovingArrowUserPalette", _movingArrowUserPalette); + _progressUserPalette = getInt(themeConfig, "ProgressUserPalette", _progressUserPalette); + _scrollWindowUserPalette = getInt(themeConfig, "ScrollWindowUserPalette", _scrollWindowUserPalette); + _smallCartUserPalette = getInt(themeConfig, "SmallCartUserPalette", _smallCartUserPalette); + _startBorderUserPalette = getInt(themeConfig, "StartBorderUserPalette", _startBorderUserPalette); + _startTextUserPalette = getInt(themeConfig, "StartTextUserPalette", _startTextUserPalette); + _wirelessIconsUserPalette = getInt(themeConfig, "WirelessIconsUserPalette", _wirelessIconsUserPalette); + + _iconA26UserPalette = getInt(themeConfig, "IconA26UserPalette", _iconA26UserPalette); + _iconCOLUserPalette = getInt(themeConfig, "IconCOLUserPalette", _iconCOLUserPalette); + _iconGBUserPalette = getInt(themeConfig, "IconGBUserPalette", _iconGBUserPalette); + _iconGBAUserPalette = getInt(themeConfig, "IconGBAUserPalette", _iconGBAUserPalette); + _iconGBAModeUserPalette = getInt(themeConfig, "IconGBAModeUserPalette", _iconGBAModeUserPalette); + _iconGGUserPalette = getInt(themeConfig, "IconGGUserPalette", _iconGGUserPalette); + _iconIMGUserPalette = getInt(themeConfig, "IconIMGUserPalette", _iconIMGUserPalette); + _iconINTUserPalette = getInt(themeConfig, "IconINTUserPalette", _iconINTUserPalette); + _iconM5UserPalette = getInt(themeConfig, "IconM5UserPalette", _iconM5UserPalette); + _iconManualUserPalette = getInt(themeConfig, "IconManualUserPalette", _iconManualUserPalette); + _iconMDUserPalette = getInt(themeConfig, "IconMDUserPalette", _iconMDUserPalette); + _iconNESUserPalette = getInt(themeConfig, "IconNESUserPalette", _iconNESUserPalette); + _iconNGPUserPalette = getInt(themeConfig, "IconNGPUserPalette", _iconNGPUserPalette); + _iconPCEUserPalette = getInt(themeConfig, "IconPCEUserPalette", _iconPCEUserPalette); + _iconPLGUserPalette = getInt(themeConfig, "IconPLGUserPalette", _iconPLGUserPalette); + _iconSettingsUserPalette = getInt(themeConfig, "IconSettingsUserPalette", _iconSettingsUserPalette); + _iconSGUserPalette = getInt(themeConfig, "IconSGUserPalette", _iconSGUserPalette); + _iconSMSUserPalette = getInt(themeConfig, "IconSMSUserPalette", _iconSMSUserPalette); + _iconSNESUserPalette = getInt(themeConfig, "IconSNESUserPalette", _iconSNESUserPalette); + _iconUnknownUserPalette = getInt(themeConfig, "IconUnknownUserPalette", _iconUnknownUserPalette); + _iconWSUserPalette = getInt(themeConfig, "IconWSUserPalette", _iconWSUserPalette); + _usernameUserPalette = getInt(themeConfig, "UsernameUserPalette", _usernameUserPalette); + _progressBarUserPalette = getInt(themeConfig, "ProgressBarUserPalette", _progressBarUserPalette); + _purpleBatteryAvailable = getInt(themeConfig, "PurpleBatteryAvailable", _purpleBatteryAvailable); _rotatingCubesRenderY = getInt(themeConfig, "RotatingCubesRenderY", _rotatingCubesRenderY); _renderPhoto = getInt(themeConfig, "RenderPhoto", _renderPhoto); @@ -118,6 +153,7 @@ void ThemeConfig::loadConfig() { _playStartupJingle = getInt(themeConfig, "PlayStartupJingle", _playStartupJingle); _startupJingleDelayAdjust = getInt(themeConfig, "StartupJingleDelayAdjust", _startupJingleDelayAdjust); + _progressBarColor = getInt(themeConfig, "ProgressBarColor", _progressBarColor); _fontPalette1 = getInt(themeConfig, "FontPalette1", _fontPalette1); _fontPalette2 = getInt(themeConfig, "FontPalette2", _fontPalette2); diff --git a/romsel_dsimenutheme/arm9/source/graphics/ThemeConfig.h b/romsel_dsimenutheme/arm9/source/graphics/ThemeConfig.h index a80ea7664a..bc23c92248 100644 --- a/romsel_dsimenutheme/arm9/source/graphics/ThemeConfig.h +++ b/romsel_dsimenutheme/arm9/source/graphics/ThemeConfig.h @@ -53,19 +53,55 @@ class ThemeConfig { // int _photoRenderY; // int _photoRenderX; - bool _startTextUserPalette; - bool _startBorderUserPalette; + bool _bipsUserPalette; + bool _boxUserPalette; + bool _boxEmptyUserPalette; + bool _boxFullUserPalette; + bool _braceUserPalette; + bool _bubbleUserPalette; bool _buttonArrowUserPalette; - bool _movingArrowUserPalette; - bool _launchDotsUserPalette; + bool _cornerButtonUserPalette; + bool _cursorUserPalette; bool _dialogBoxUserPalette; + bool _folderUserPalette; + bool _launchDotsUserPalette; + bool _movingArrowUserPalette; + bool _progressUserPalette; + bool _scrollWindowUserPalette; + bool _smallCartUserPalette; + bool _startBorderUserPalette; + bool _startTextUserPalette; + bool _wirelessIconsUserPalette; + bool _iconA26UserPalette; + bool _iconCOLUserPalette; + bool _iconGBUserPalette; + bool _iconGBAUserPalette; + bool _iconGBAModeUserPalette; + bool _iconGGUserPalette; + bool _iconIMGUserPalette; + bool _iconINTUserPalette; + bool _iconM5UserPalette; + bool _iconManualUserPalette; + bool _iconMDUserPalette; + bool _iconNESUserPalette; + bool _iconNGPUserPalette; + bool _iconPCEUserPalette; + bool _iconPLGUserPalette; + bool _iconSettingsUserPalette; + bool _iconSGUserPalette; + bool _iconSMSUserPalette; + bool _iconSNESUserPalette; + bool _iconUnknownUserPalette; + bool _iconWSUserPalette; bool _usernameUserPalette; + bool _progressBarUserPalette; + bool _purpleBatteryAvailable; - bool _renderPhoto; bool _darkLoading; bool _playStartupJingle; int _startupJingleDelayAdjust; + u16 _progressBarColor; u16 _fontPalette1; u16 _fontPalette2; @@ -94,7 +130,6 @@ class ThemeConfig { public: ThemeConfig(); - ThemeConfig(bool _3dsDefaults); virtual ~ThemeConfig() = default; void loadConfig(); @@ -141,20 +176,56 @@ class ThemeConfig { // int photoRenderY() const { return _photoRenderY; } // int photoRenderX() const { return _photoRenderX; } - bool startTextUserPalette() const { return _startTextUserPalette; } - bool startBorderUserPalette() const { return _startBorderUserPalette; } + bool bipsUserPalette() const { return _bipsUserPalette; } + bool boxUserPalette() const { return _boxUserPalette; } + bool boxEmptyUserPalette() const { return _boxEmptyUserPalette; } + bool boxFullUserPalette() const { return _boxFullUserPalette; } + bool braceUserPalette() const { return _braceUserPalette; } + bool bubbleUserPalette() const { return _bubbleUserPalette; } bool buttonArrowUserPalette() const { return _buttonArrowUserPalette; } - bool movingArrowUserPalette() const { return _movingArrowUserPalette; } - bool launchDotsUserPalette() const { return _launchDotsUserPalette; } + bool cornerButtonUserPalette() const { return _cornerButtonUserPalette; } + bool cursorUserPalette() const { return _cursorUserPalette; } bool dialogBoxUserPalette() const { return _dialogBoxUserPalette; } + bool folderUserPalette() const { return _folderUserPalette; } + bool launchDotsUserPalette() const { return _launchDotsUserPalette; } + bool movingArrowUserPalette() const { return _movingArrowUserPalette; } + bool progressUserPalette() const { return _progressUserPalette; } + bool scrollWindowUserPalette() const { return _scrollWindowUserPalette; } + bool smallCartUserPalette() const { return _smallCartUserPalette; } + bool startBorderUserPalette() const { return _startBorderUserPalette; } + bool startTextUserPalette() const { return _startTextUserPalette; } + bool wirelessIconsUserPalette() const { return _wirelessIconsUserPalette; } + bool iconA26UserPalette() const { return _iconA26UserPalette; } + bool iconCOLUserPalette() const { return _iconCOLUserPalette; } + bool iconGBUserPalette() const { return _iconGBUserPalette; } + bool iconGBAUserPalette() const { return _iconGBAUserPalette; } + bool iconGBAModeUserPalette() const { return _iconGBAModeUserPalette; } + bool iconGGUserPalette() const { return _iconGGUserPalette; } + bool iconIMGUserPalette() const { return _iconIMGUserPalette; } + bool iconINTUserPalette() const { return _iconINTUserPalette; } + bool iconM5UserPalette() const { return _iconM5UserPalette; } + bool iconManualUserPalette() const { return _iconManualUserPalette; } + bool iconMDUserPalette() const { return _iconMDUserPalette; } + bool iconNESUserPalette() const { return _iconNESUserPalette; } + bool iconNGPUserPalette() const { return _iconNGPUserPalette; } + bool iconPCEUserPalette() const { return _iconPCEUserPalette; } + bool iconPLGUserPalette() const { return _iconPLGUserPalette; } + bool iconSettingsUserPalette() const { return _iconSettingsUserPalette; } + bool iconSGUserPalette() const { return _iconSGUserPalette; } + bool iconSMSUserPalette() const { return _iconSMSUserPalette; } + bool iconSNESUserPalette() const { return _iconSNESUserPalette; } + bool iconUnknownUserPalette() const { return _iconUnknownUserPalette; } + bool iconWSUserPalette() const { return _iconWSUserPalette; } bool usernameUserPalette() const { return _usernameUserPalette; } - bool purpleBatteryAvailable() const { return _purpleBatteryAvailable; } + bool progressBarUserPalette() const { return _progressBarUserPalette; } + bool purpleBatteryAvailable() const { return _purpleBatteryAvailable; } bool renderPhoto() const { return _renderPhoto; } bool darkLoading() const { return _darkLoading; } bool playStartupJingle() const { return _playStartupJingle; } int startupJingleDelayAdjust() const { return _startupJingleDelayAdjust; } + u16 progressBarColor() const { return _progressBarColor; } u16 fontPalette1() const { return _fontPalette1; } u16 fontPalette2() const { return _fontPalette2; } diff --git a/romsel_dsimenutheme/arm9/source/graphics/ThemeTextures.cpp b/romsel_dsimenutheme/arm9/source/graphics/ThemeTextures.cpp index 7119ab8b32..809467b711 100644 --- a/romsel_dsimenutheme/arm9/source/graphics/ThemeTextures.cpp +++ b/romsel_dsimenutheme/arm9/source/graphics/ThemeTextures.cpp @@ -213,13 +213,6 @@ void ThemeTextures::reloadPalDialogBox() { } } -inline bool textureExists(std::string textureName) { - return (access((textureName + ".grf").c_str(), F_OK) == 0 - || access((textureName + ".png").c_str(), F_OK) == 0 - || access((textureName + ".bmp").c_str(), F_OK) == 0 - ); -} - void ThemeTextures::loadBackgrounds() { // 0: Top, 1: Bottom, 2: Bottom Bubble, 3: Moving, 4: MovingLeft, 5: MovingRight @@ -240,21 +233,19 @@ void ThemeTextures::loadBackgrounds() { } // DSi Theme if (ms().macroMode) { - if (textureExists((std::string) TFN_BG_BOTTOMBG_MACRO)) { + if (Texture::exists(TFN_BG_BOTTOMBG_MACRO)) { _backgroundTextures.emplace_back(TFN_BG_BOTTOMBG_MACRO, TFN_FALLBACK_BG_BOTTOMBG); } else { _backgroundTextures.emplace_back(TFN_BG_BOTTOMBG, TFN_FALLBACK_BG_BOTTOMBG); } - if (textureExists((std::string)TFN_BG_BOTTOMBUBBLEBG_MACRO) - || textureExists((std::string)TFN_FALLBACK_BG_BOTTOMBUBBLEBG_MACRO) - ) { + if (Texture::exists(TFN_BG_BOTTOMBUBBLEBG_MACRO)) { _backgroundTextures.emplace_back(TFN_BG_BOTTOMBUBBLEBG_MACRO, TFN_FALLBACK_BG_BOTTOMBUBBLEBG_MACRO); } else { _backgroundTextures.emplace_back(TFN_BG_BOTTOMBUBBLEBG, TFN_FALLBACK_BG_BOTTOMBUBBLEBG); } - if (ms().theme == TWLSettings::EThemeDSi && textureExists((std::string)TFN_BG_BOTTOMMOVINGBG_MACRO)) { + if (ms().theme == TWLSettings::EThemeDSi && Texture::exists(TFN_BG_BOTTOMMOVINGBG_MACRO)) { _backgroundTextures.emplace_back(TFN_BG_BOTTOMMOVINGBG_MACRO, TFN_FALLBACK_BG_BOTTOMMOVINGBG); } else { _backgroundTextures.emplace_back(TFN_BG_BOTTOMMOVINGBG, TFN_FALLBACK_BG_BOTTOMMOVINGBG); @@ -396,6 +387,8 @@ void ThemeTextures::load3DSTheme() { _startBorderTexture = std::make_unique(TFN_GRF_CURSOR, TFN_FALLBACK_GRF_CURSOR); _dialogBoxTexture = std::make_unique(TFN_GRF_DIALOGBOX, TFN_FALLBACK_GRF_DIALOGBOX); + applyUserPaletteToAllGrfTextures(); + if (ms().colorMode == 1) { applyGrayscaleToAllGrfTextures(); } @@ -452,18 +445,7 @@ void ThemeTextures::loadDSiTheme() { _manualIconTexture = std::make_unique(TFN_GRF_ICON_MANUAL, TFN_FALLBACK_GRF_ICON_MANUAL); // Apply the DSi palette shifts - if (tc().startTextUserPalette()) - _startTextTexture->applyPaletteEffect(effectDSiStartTextPalettes); - if (tc().startBorderUserPalette()) - _startBorderTexture->applyPaletteEffect(effectDSiStartBorderPalettes); - if (tc().buttonArrowUserPalette()) - _buttonArrowTexture->applyPaletteEffect(effectDSiArrowButtonPalettes); - if (tc().movingArrowUserPalette()) - _movingArrowTexture->applyPaletteEffect(effectDSiArrowButtonPalettes); - if (tc().launchDotsUserPalette()) - _launchDotTexture->applyPaletteEffect(effectDSiArrowButtonPalettes); - if (tc().dialogBoxUserPalette()) - _dialogBoxTexture->applyPaletteEffect(effectDSiArrowButtonPalettes); + applyUserPaletteToAllGrfTextures(); if (ms().colorMode == 1) { applyGrayscaleToAllGrfTextures(); @@ -1360,6 +1342,89 @@ ITCM_CODE void ThemeTextures::drawDateTimeMacro(const char *str, int posX, int p } } +void ThemeTextures::applyUserPaletteToAllGrfTextures() { + if (_bipsTexture && tc().bipsUserPalette()) + _bipsTexture->applyUserPaletteFile(TFN_PALETTE_BIPS, effectDSiArrowButtonPalettes); + if (_boxTexture && tc().boxUserPalette()) + _boxTexture->applyUserPaletteFile(TFN_PALETTE_BOX, effectDSiArrowButtonPalettes); + if (_braceTexture && tc().braceUserPalette()) + _braceTexture->applyUserPaletteFile(TFN_PALETTE_BRACE, effectDSiArrowButtonPalettes); + if (_bubbleTexture && tc().bubbleUserPalette()) + _bubbleTexture->applyUserPaletteFile(TFN_PALETTE_BUBBLE, effectDSiArrowButtonPalettes); + if (_buttonArrowTexture && tc().buttonArrowUserPalette()) + _buttonArrowTexture->applyUserPaletteFile(TFN_PALETTE_BUTTON_ARROW, effectDSiArrowButtonPalettes); + if (_cornerButtonTexture && tc().cornerButtonUserPalette()) + _cornerButtonTexture->applyUserPaletteFile(TFN_PALETTE_CORNERBUTTON, effectDSiArrowButtonPalettes); + if (_dialogBoxTexture && tc().dialogBoxUserPalette()) + _dialogBoxTexture->applyUserPaletteFile(TFN_PALETTE_DIALOGBOX, effectDSiArrowButtonPalettes); + if (_folderTexture && tc().folderUserPalette()) + _folderTexture->applyUserPaletteFile(TFN_PALETTE_FOLDER, effectDSiArrowButtonPalettes); + if (_launchDotTexture && tc().launchDotsUserPalette()) + _launchDotTexture->applyUserPaletteFile(TFN_PALETTE_LAUNCH_DOT, effectDSiArrowButtonPalettes); + if (_movingArrowTexture && tc().movingArrowUserPalette()) + _movingArrowTexture->applyUserPaletteFile(TFN_PALETTE_MOVING_ARROW, effectDSiArrowButtonPalettes); + if (_progressTexture && tc().progressUserPalette()) + _progressTexture->applyUserPaletteFile(TFN_PALETTE_PROGRESS, effectDSiArrowButtonPalettes); + if (_scrollWindowTexture && tc().scrollWindowUserPalette()) + _scrollWindowTexture->applyUserPaletteFile(TFN_PALETTE_SCROLL_WINDOW, effectDSiArrowButtonPalettes); + if (_smallCartTexture && tc().smallCartUserPalette()) + _smallCartTexture->applyUserPaletteFile(TFN_PALETTE_SMALL_CART, effectDSiArrowButtonPalettes); + if (_startBorderTexture && (tc().startBorderUserPalette() || tc().cursorUserPalette())) // same texture variable, different images in dsi/3ds themes + _startBorderTexture->applyUserPaletteFile(TFN_PALETTE_START_BORDER, effectDSiStartBorderPalettes); + if (_startTextTexture && tc().startTextUserPalette()) + _startTextTexture->applyUserPaletteFile(TFN_PALETTE_START_TEXT, effectDSiStartTextPalettes); + if (_wirelessIconsTexture && tc().wirelessIconsUserPalette()) + _wirelessIconsTexture->applyUserPaletteFile(TFN_PALETTE_WIRELESSICONS, effectDSiArrowButtonPalettes); + + if (_boxEmptyTexture && tc().boxUserPalette()) + _boxEmptyTexture->applyUserPaletteFile(TFN_PALETTE_BOX_EMPTY, effectDSiArrowButtonPalettes); + if (_boxFullTexture && tc().boxUserPalette()) + _boxFullTexture->applyUserPaletteFile(TFN_PALETTE_BOX_EMPTY, effectDSiArrowButtonPalettes); + + if (_iconA26Texture && tc().iconA26UserPalette()) + _iconA26Texture->applyUserPaletteFile(TFN_PALETTE_ICON_A26, effectDSiArrowButtonPalettes); + if (_iconCOLTexture && tc().iconCOLUserPalette()) + _iconCOLTexture->applyUserPaletteFile(TFN_PALETTE_ICON_COL, effectDSiArrowButtonPalettes); + if (_iconGBTexture && tc().iconGBUserPalette()) + _iconGBTexture->applyUserPaletteFile(TFN_PALETTE_ICON_GB, effectDSiArrowButtonPalettes); + if (_iconGBATexture && tc().iconGBAUserPalette()) + _iconGBATexture->applyUserPaletteFile(TFN_PALETTE_ICON_GBA, effectDSiArrowButtonPalettes); + if (_iconGBAModeTexture && tc().iconGBAModeUserPalette()) + _iconGBAModeTexture->applyUserPaletteFile(TFN_PALETTE_ICON_GBAMODE, effectDSiArrowButtonPalettes); + if (_iconGGTexture && tc().iconGGUserPalette()) + _iconGGTexture->applyUserPaletteFile(TFN_PALETTE_ICON_GG, effectDSiArrowButtonPalettes); + if (_iconIMGTexture && tc().iconIMGUserPalette()) + _iconIMGTexture->applyUserPaletteFile(TFN_PALETTE_ICON_IMG, effectDSiArrowButtonPalettes); + if (_iconINTTexture && tc().iconINTUserPalette()) + _iconINTTexture->applyUserPaletteFile(TFN_PALETTE_ICON_INT, effectDSiArrowButtonPalettes); + if (_iconM5Texture && tc().iconM5UserPalette()) + _iconM5Texture->applyUserPaletteFile(TFN_PALETTE_ICON_M5, effectDSiArrowButtonPalettes); + if (_manualIconTexture && tc().iconManualUserPalette()) + _manualIconTexture->applyUserPaletteFile(TFN_PALETTE_ICON_MANUAL, effectDSiArrowButtonPalettes); + if (_iconMDTexture && tc().iconMDUserPalette()) + _iconMDTexture->applyUserPaletteFile(TFN_PALETTE_ICON_MD, effectDSiArrowButtonPalettes); + if (_iconNESTexture && tc().iconNESUserPalette()) + _iconNESTexture->applyUserPaletteFile(TFN_PALETTE_ICON_NES, effectDSiArrowButtonPalettes); + if (_iconNGPTexture && tc().iconNGPUserPalette()) + _iconNGPTexture->applyUserPaletteFile(TFN_PALETTE_ICON_NGP, effectDSiArrowButtonPalettes); + if (_iconPCETexture && tc().iconPCEUserPalette()) + _iconPCETexture->applyUserPaletteFile(TFN_PALETTE_ICON_PCE, effectDSiArrowButtonPalettes); + if (_iconPLGTexture && tc().iconPLGUserPalette()) + _iconPLGTexture->applyUserPaletteFile(TFN_PALETTE_ICON_PLG, effectDSiArrowButtonPalettes); + if (_settingsIconTexture && tc().iconSettingsUserPalette()) + _settingsIconTexture->applyUserPaletteFile(TFN_PALETTE_ICON_SETTINGS, effectDSiArrowButtonPalettes); + if (_iconSGTexture && tc().iconSGUserPalette()) + _iconSGTexture->applyUserPaletteFile(TFN_PALETTE_ICON_SG, effectDSiArrowButtonPalettes); + if (_iconSMSTexture && tc().iconSMSUserPalette()) + _iconSMSTexture->applyUserPaletteFile(TFN_PALETTE_ICON_SMS, effectDSiArrowButtonPalettes); + if (_iconSNESTexture && tc().iconSNESUserPalette()) + _iconSNESTexture->applyUserPaletteFile(TFN_PALETTE_ICON_SNES, effectDSiArrowButtonPalettes); + if (_iconUnknownTexture && tc().iconUnknownUserPalette()) + _iconUnknownTexture->applyUserPaletteFile(TFN_PALETTE_ICON_UNK, effectDSiArrowButtonPalettes); + if (_iconWSTexture && tc().iconWSUserPalette()) + _iconWSTexture->applyUserPaletteFile(TFN_PALETTE_ICON_WS, effectDSiArrowButtonPalettes); +} + void ThemeTextures::applyGrayscaleToAllGrfTextures() { if (_bipsTexture) { @@ -1424,6 +1489,12 @@ void ThemeTextures::applyGrayscaleToAllGrfTextures() { _boxEmptyTexture->applyPaletteEffect(effectGrayscalePalette); } + if (_iconA26Texture) { + _iconA26Texture->applyPaletteEffect(effectGrayscalePalette); + } + if (_iconCOLTexture) { + _iconCOLTexture->applyPaletteEffect(effectGrayscalePalette); + } if (_iconGBTexture) { _iconGBTexture->applyPaletteEffect(effectGrayscalePalette); } @@ -1436,33 +1507,45 @@ void ThemeTextures::applyGrayscaleToAllGrfTextures() { if (_iconGGTexture) { _iconGGTexture->applyPaletteEffect(effectGrayscalePalette); } + if (_iconIMGTexture) { + _iconIMGTexture->applyPaletteEffect(effectGrayscalePalette); + } + if (_iconINTTexture) { + _iconINTTexture->applyPaletteEffect(effectGrayscalePalette); + } + if (_iconM5Texture) { + _iconM5Texture->applyPaletteEffect(effectGrayscalePalette); + } if (_iconMDTexture) { _iconMDTexture->applyPaletteEffect(effectGrayscalePalette); } if (_iconNESTexture) { _iconNESTexture->applyPaletteEffect(effectGrayscalePalette); } - if (_iconSMSTexture) { - _iconSMSTexture->applyPaletteEffect(effectGrayscalePalette); + if (_iconNGPTexture) { + _iconNGPTexture->applyPaletteEffect(effectGrayscalePalette); } - if (_iconSNESTexture) { - _iconSNESTexture->applyPaletteEffect(effectGrayscalePalette); + if (_iconPCETexture) { + _iconPCETexture->applyPaletteEffect(effectGrayscalePalette); } if (_iconPLGTexture) { _iconPLGTexture->applyPaletteEffect(effectGrayscalePalette); } - if (_iconA26Texture) { - _iconA26Texture->applyPaletteEffect(effectGrayscalePalette); + if (_iconSGTexture) { + _iconSGTexture->applyPaletteEffect(effectGrayscalePalette); } - if (_iconINTTexture) { - _iconINTTexture->applyPaletteEffect(effectGrayscalePalette); + if (_iconSMSTexture) { + _iconSMSTexture->applyPaletteEffect(effectGrayscalePalette); } - if (_iconPCETexture) { - _iconPCETexture->applyPaletteEffect(effectGrayscalePalette); + if (_iconSNESTexture) { + _iconSNESTexture->applyPaletteEffect(effectGrayscalePalette); } if (_iconUnknownTexture) { _iconUnknownTexture->applyPaletteEffect(effectGrayscalePalette); } + if (_iconWSTexture) { + _iconWSTexture->applyPaletteEffect(effectGrayscalePalette); + } } u16 *ThemeTextures::bmpImageBuffer() { return _bmpImageBuffer; } diff --git a/romsel_dsimenutheme/arm9/source/graphics/ThemeTextures.h b/romsel_dsimenutheme/arm9/source/graphics/ThemeTextures.h index 92c16b0aa4..1c67c4f821 100644 --- a/romsel_dsimenutheme/arm9/source/graphics/ThemeTextures.h +++ b/romsel_dsimenutheme/arm9/source/graphics/ThemeTextures.h @@ -78,6 +78,7 @@ class ThemeTextures void clearTopScreen(); static void videoSetup(); private: + void applyUserPaletteToAllGrfTextures(); void applyGrayscaleToAllGrfTextures(); void loadBubbleImage(const Texture& tex, int sprW, int sprH); diff --git a/romsel_dsimenutheme/arm9/source/graphics/fontHandler.cpp b/romsel_dsimenutheme/arm9/source/graphics/fontHandler.cpp index 716e4a274e..91888f3ce1 100644 --- a/romsel_dsimenutheme/arm9/source/graphics/fontHandler.cpp +++ b/romsel_dsimenutheme/arm9/source/graphics/fontHandler.cpp @@ -104,15 +104,30 @@ void fontInit() { tc().fontPaletteOverlay2(), tc().fontPaletteOverlay3(), tc().fontPaletteOverlay4(), - tc().usernameUserPalette() ? bmpPal_topSmallFont[themeColor][0] : tc().fontPaletteUsername1(), - tc().usernameUserPalette() ? bmpPal_topSmallFont[themeColor][1] : tc().fontPaletteUsername2(), - tc().usernameUserPalette() ? bmpPal_topSmallFont[themeColor][2] : tc().fontPaletteUsername3(), - tc().usernameUserPalette() ? bmpPal_topSmallFont[themeColor][3] : tc().fontPaletteUsername4(), + tc().fontPaletteUsername1(), + tc().fontPaletteUsername2(), + tc().fontPaletteUsername3(), + tc().fontPaletteUsername4(), tc().fontPaletteDateTime1(), tc().fontPaletteDateTime2(), tc().fontPaletteDateTime3(), tc().fontPaletteDateTime4(), }; + if (tc().usernameUserPalette()) { + FILE *file = fopen((TFN_PALETTE_USERNAME).c_str(), "rb"); + if (file) { + fseek(file, themeColor * 4 * sizeof(u16), SEEK_SET); + fread(palette + 16, sizeof(u16), 4, file); + fclose(file); + // swap palette bytes + for (int i = 0; i < 4; i++) { + palette[16 + i] = (palette[16 + i] << 8 & 0xFF00) | palette[16 + i] >> 8; + } + } + else { + tonccpy(palette + 16, bmpPal_topSmallFont + themeColor, 4 * sizeof(u16)); + } + } if (ms().colorMode == 1) { for (uint i = 0; i < sizeof(palette) / sizeof(palette[0]); i++) { palette[i] = convertVramColorToGrayscale(palette[i]); diff --git a/romsel_dsimenutheme/arm9/source/graphics/graphics.cpp b/romsel_dsimenutheme/arm9/source/graphics/graphics.cpp index 83af652aa4..ef5a620630 100644 --- a/romsel_dsimenutheme/arm9/source/graphics/graphics.cpp +++ b/romsel_dsimenutheme/arm9/source/graphics/graphics.cpp @@ -45,6 +45,7 @@ #include "launchDots.h" #include "queueControl.h" #include "sound.h" +#include "startborderpal.h" //#include "ndma.h" #include "ThemeConfig.h" #include "themefilenames.h" @@ -139,6 +140,7 @@ bool showRshoulder = false; bool showProgressIcon = false; bool showProgressBar = false; int progressBarLength = 0; +extern bool useTwlCfg; int progressAnimNum = 0; int progressAnimDelay = 0; @@ -1000,7 +1002,8 @@ void vBlankHandler() { barXpos += ms().rtl() ? -12 : 12; barYpos += 12; } - int fillColor = ms().colorMode == 1 ? convertVramColorToGrayscale(RGB15(0, 0, 31)) : RGB15(0, 0, 31); + int fillColor = tc().progressBarUserPalette() ? progressBarColors[(useTwlCfg ? *(u8*)0x02000444 : PersonalData->theme)] : tc().progressBarColor(); + if (ms().colorMode == 1) fillColor = convertVramColorToGrayscale(fillColor); if (ms().rtl()) { glBoxFilled(barXpos, barYpos, barXpos-192, barYpos+5, tc().darkLoading() ? RGB15(6, 6, 6) : RGB15(23, 23, 23)); if (progressBarLength > 0) { diff --git a/romsel_dsimenutheme/arm9/source/graphics/themefilenames.h b/romsel_dsimenutheme/arm9/source/graphics/themefilenames.h index eda2250339..37d9a98bd4 100644 --- a/romsel_dsimenutheme/arm9/source/graphics/themefilenames.h +++ b/romsel_dsimenutheme/arm9/source/graphics/themefilenames.h @@ -161,6 +161,53 @@ #define TFN_FONT_DATE_TIME TFN_UI_DIRECTORY"/font/date_time.nftr" #define TFN_FONT_USERNAME TFN_UI_DIRECTORY"/font/username.nftr" +#define TFN_PALETTE_BIPS TFN_UI_DIRECTORY"/palettes/bips.bin" +#define TFN_PALETTE_BOX TFN_UI_DIRECTORY"/palettes/box.bin" + +#define TFN_PALETTE_BOX_FULL TFN_UI_DIRECTORY"/palettes/box_full.bin" +#define TFN_PALETTE_BOX_EMPTY TFN_UI_DIRECTORY"/palettes/box_empty.bin" +#define TFN_PALETTE_CURSOR TFN_UI_DIRECTORY"/palettes/cursor.bin" + +#define TFN_PALETTE_BRACE TFN_UI_DIRECTORY"/palettes/brace.bin" +#define TFN_PALETTE_BUBBLE TFN_UI_DIRECTORY"/palettes/bubble.bin" +#define TFN_PALETTE_BUTTON_ARROW TFN_UI_DIRECTORY"/palettes/button_arrow.bin" +#define TFN_PALETTE_CORNERBUTTON TFN_UI_DIRECTORY"/palettes/cornerbutton.bin" +#define TFN_PALETTE_DIALOGBOX TFN_UI_DIRECTORY"/palettes/dialogbox.bin" +#define TFN_PALETTE_FOLDER TFN_UI_DIRECTORY"/palettes/folder.bin" +#define TFN_PALETTE_ICON_GB TFN_UI_DIRECTORY"/palettes/icon_gb.bin" +#define TFN_PALETTE_ICON_GBA TFN_UI_DIRECTORY"/palettes/icon_gba.bin" +#define TFN_PALETTE_ICON_GBAMODE TFN_UI_DIRECTORY"/palettes/icon_gbamode.bin" +#define TFN_PALETTE_ICON_GG TFN_UI_DIRECTORY"/palettes/icon_gg.bin" +#define TFN_PALETTE_ICON_MD TFN_UI_DIRECTORY"/palettes/icon_md.bin" +#define TFN_PALETTE_ICON_NES TFN_UI_DIRECTORY"/palettes/icon_nes.bin" +#define TFN_PALETTE_ICON_SETTINGS TFN_UI_DIRECTORY"/palettes/icon_settings.bin" +#define TFN_PALETTE_ICON_MANUAL TFN_UI_DIRECTORY"/palettes/icon_manual.bin" +#define TFN_PALETTE_ICON_SG TFN_UI_DIRECTORY"/palettes/icon_sg.bin" +#define TFN_PALETTE_ICON_SMS TFN_UI_DIRECTORY"/palettes/icon_sms.bin" +#define TFN_PALETTE_ICON_SNES TFN_UI_DIRECTORY"/palettes/icon_snes.bin" +#define TFN_PALETTE_ICON_PLG TFN_UI_DIRECTORY"/palettes/icon_plg.bin" +#define TFN_PALETTE_ICON_A26 TFN_UI_DIRECTORY"/palettes/icon_a26.bin" +#define TFN_PALETTE_ICON_COL TFN_UI_DIRECTORY"/palettes/icon_col.bin" +#define TFN_PALETTE_ICON_M5 TFN_UI_DIRECTORY"/palettes/icon_m5.bin" +#define TFN_PALETTE_ICON_INT TFN_UI_DIRECTORY"/palettes/icon_int.bin" +#define TFN_PALETTE_ICON_PCE TFN_UI_DIRECTORY"/palettes/icon_pce.bin" +#define TFN_PALETTE_ICON_WS TFN_UI_DIRECTORY"/palettes/icon_ws.bin" +#define TFN_PALETTE_ICON_NGP TFN_UI_DIRECTORY"/palettes/icon_ngp.bin" +#define TFN_PALETTE_ICON_CPC TFN_UI_DIRECTORY"/palettes/icon_cpc.bin" +#define TFN_PALETTE_ICON_VID TFN_UI_DIRECTORY"/palettes/icon_vid.bin" +#define TFN_PALETTE_ICON_IMG TFN_UI_DIRECTORY"/palettes/icon_img.bin" +#define TFN_PALETTE_ICON_UNK TFN_UI_DIRECTORY"/palettes/icon_unk.bin" +#define TFN_PALETTE_LAUNCH_DOT TFN_UI_DIRECTORY"/palettes/launch_dot.bin" +#define TFN_PALETTE_MOVING_ARROW TFN_UI_DIRECTORY"/palettes/moving_arrow.bin" +#define TFN_PALETTE_PROGRESS TFN_UI_DIRECTORY"/palettes/progress.bin" +#define TFN_PALETTE_SCROLL_WINDOW TFN_UI_DIRECTORY"/palettes/scroll_window.bin" +#define TFN_PALETTE_SMALL_CART TFN_UI_DIRECTORY"/palettes/small_cart.bin" +#define TFN_PALETTE_START_BORDER TFN_UI_DIRECTORY"/palettes/start_border.bin" +#define TFN_PALETTE_START_TEXT TFN_UI_DIRECTORY"/palettes/start_text.bin" +#define TFN_PALETTE_WIRELESSICONS TFN_UI_DIRECTORY"/palettes/wirelessicons.bin" + +#define TFN_PALETTE_USERNAME TFN_UI_DIRECTORY"/palettes/username.bin" + // We need fallbacks, because unlike akmenu, a bad GRF file could crash the theme // Leaving the user with no way to fix it well.