From 235ecfbed71986f0be2ecf469a10e1105dcb3c96 Mon Sep 17 00:00:00 2001 From: JosJuice Date: Thu, 9 Apr 2015 17:44:53 +0200 Subject: Return GetNames languages, to avoid hardcoded language lists in callers This makes the code cleaner and also leads to some user-visible changes: The wx game properties will no longer let the user select WAD languages that don't have any names. The Qt game list will now display names using the languages set in the configuration instead of always using English for PAL GC games and Japanese for WADs. If a WAD doesn't have a name in the user's preferred language, English is now selected as a fallback before Japanese. --- Source/Core/DolphinWX/ISOFile.cpp | 96 ++++++++++++++++++++++----------------- 1 file changed, 55 insertions(+), 41 deletions(-) (limited to 'Source/Core/DolphinWX/ISOFile.cpp') diff --git a/Source/Core/DolphinWX/ISOFile.cpp b/Source/Core/DolphinWX/ISOFile.cpp index db1c141de6..5190849435 100644 --- a/Source/Core/DolphinWX/ISOFile.cpp +++ b/Source/Core/DolphinWX/ISOFile.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -37,11 +38,33 @@ #include "DolphinWX/ISOFile.h" #include "DolphinWX/WxUtils.h" -static const u32 CACHE_REVISION = 0x122; +static const u32 CACHE_REVISION = 0x123; #define DVD_BANNER_WIDTH 96 #define DVD_BANNER_HEIGHT 32 +static std::string GetLanguageString(IVolume::ELanguage language, std::map strings) +{ + auto end = strings.end(); + auto it = strings.find(language); + if (it != end) + return it->second; + + // English tends to be a good fallback when the requested language isn't available + if (language != IVolume::ELanguage::LANGUAGE_ENGLISH) + { + it = strings.find(IVolume::ELanguage::LANGUAGE_ENGLISH); + if (it != end) + return it->second; + } + + // If English isn't available either, just pick something + if (!strings.empty()) + return strings.cbegin()->second; + + return ""; +} + GameListItem::GameListItem(const std::string& _rFileName) : m_FileName(_rFileName) , m_emu_state(0) @@ -202,63 +225,37 @@ std::string GameListItem::CreateCacheFilename() std::string GameListItem::GetCompany() const { - if (m_company.empty()) - return "N/A"; - else - return m_company; + return m_company; } -// (-1 = Japanese, 0 = English, etc)? -std::string GameListItem::GetDescription(int _index) const +std::string GameListItem::GetDescription(IVolume::ELanguage language) const { - const u32 index = _index; - - if (index < m_descriptions.size()) - return m_descriptions[index]; - - if (!m_descriptions.empty()) - return m_descriptions[0]; - - return ""; + return GetLanguageString(language, m_descriptions); } -// (-1 = Japanese, 0 = English, etc)? -std::string GameListItem::GetVolumeName(int _index) const +std::string GameListItem::GetDescription() const { - u32 const index = _index; - - if (index < m_volume_names.size() && !m_volume_names[index].empty()) - return m_volume_names[index]; - - if (!m_volume_names.empty()) - return m_volume_names[0]; - - return ""; + return GetDescription(SConfig::GetInstance().m_LocalCoreStartupParameter.GetCurrentLanguage(m_Platform != GAMECUBE_DISC)); } -// (-1 = Japanese, 0 = English, etc)? -std::string GameListItem::GetBannerName(int _index) const +std::string GameListItem::GetVolumeName(IVolume::ELanguage language) const { - u32 const index = _index; - - if (index < m_banner_names.size() && !m_banner_names[index].empty()) - return m_banner_names[index]; - - if (!m_banner_names.empty()) - return m_banner_names[0]; + return GetLanguageString(language, m_volume_names); +} - return ""; +std::string GameListItem::GetBannerName(IVolume::ELanguage language) const +{ + return GetLanguageString(language, m_banner_names); } -// (-1 = Japanese, 0 = English, etc)? -std::string GameListItem::GetName(int _index) const +std::string GameListItem::GetName(IVolume::ELanguage language) const { // Prefer name from banner, fallback to name from volume, fallback to filename - std::string name = GetBannerName(_index); + std::string name = GetBannerName(language); if (name.empty()) - name = GetVolumeName(_index); + name = GetVolumeName(language); if (name.empty()) { @@ -269,6 +266,23 @@ std::string GameListItem::GetName(int _index) const return name; } +std::string GameListItem::GetName() const +{ + return GetName(SConfig::GetInstance().m_LocalCoreStartupParameter.GetCurrentLanguage(m_Platform != GAMECUBE_DISC)); +} + +std::vector GameListItem::GetLanguages() const +{ + std::map language_strings = m_banner_names; + if (m_volume_names.size() > m_banner_names.size()) + language_strings = m_volume_names; + + std::vector languages; + for (std::pair language_string : language_strings) + languages.emplace_back(language_string.first); + return languages; +} + const std::string GameListItem::GetWiiFSPath() const { DiscIO::IVolume *iso = DiscIO::CreateVolumeFromFilename(m_FileName); -- cgit v1.2.3 From ee694e327ada8c42949a3907d6fa222f73f276b0 Mon Sep 17 00:00:00 2001 From: JosJuice Date: Fri, 10 Apr 2015 22:10:49 +0200 Subject: Get rid of banner loaders and move their functionality to volumes Having some data available in banner loaders and some other data data available in volumes gets messy, especially with GetNames(), which is available in both but returns different results depending on which one is used. This change drops support for reading names and descriptions from Wii save data. --- Source/Core/DolphinWX/ISOFile.cpp | 78 ++++++++++----------------------------- 1 file changed, 19 insertions(+), 59 deletions(-) (limited to 'Source/Core/DolphinWX/ISOFile.cpp') diff --git a/Source/Core/DolphinWX/ISOFile.cpp b/Source/Core/DolphinWX/ISOFile.cpp index 5190849435..5e3580ab43 100644 --- a/Source/Core/DolphinWX/ISOFile.cpp +++ b/Source/Core/DolphinWX/ISOFile.cpp @@ -29,7 +29,6 @@ #include "Core/CoreParameter.h" #include "Core/Boot/Boot.h" -#include "DiscIO/BannerLoader.h" #include "DiscIO/CompressedBlob.h" #include "DiscIO/Filesystem.h" #include "DiscIO/Volume.h" @@ -90,7 +89,9 @@ GameListItem::GameListItem(const std::string& _rFileName) else m_Platform = WII_WAD; - m_volume_names = pVolume->GetNames(); + m_names = pVolume->GetNames(); + m_descriptions = pVolume->GetDescriptions(); + m_company = pVolume->GetCompany(); m_Country = pVolume->GetCountry(); m_FileSize = pVolume->GetRawSize(); @@ -101,34 +102,15 @@ GameListItem::GameListItem(const std::string& _rFileName) m_IsDiscTwo = pVolume->IsDiscTwo(); m_Revision = pVolume->GetRevision(); - // check if we can get some info from the banner file too - DiscIO::IFileSystem* pFileSystem = DiscIO::CreateFileSystem(pVolume); + std::vector Buffer = pVolume->GetBanner(&m_ImageWidth, &m_ImageHeight); + u32* pData = Buffer.data(); + m_pImage.resize(m_ImageWidth * m_ImageHeight * 3); - if (pFileSystem != nullptr || m_Platform == WII_WAD) + for (int i = 0; i < m_ImageWidth * m_ImageHeight; i++) { - std::unique_ptr pBannerLoader(DiscIO::CreateBannerLoader(*pFileSystem, pVolume)); - - if (pBannerLoader != nullptr && pBannerLoader->IsValid()) - { - if (m_Platform != WII_WAD) - m_banner_names = pBannerLoader->GetNames(); - m_company = pBannerLoader->GetCompany(); - m_descriptions = pBannerLoader->GetDescriptions(); - - std::vector Buffer = pBannerLoader->GetBanner(&m_ImageWidth, &m_ImageHeight); - u32* pData = &Buffer[0]; - // resize vector to image size - m_pImage.resize(m_ImageWidth * m_ImageHeight * 3); - - for (int i = 0; i < m_ImageWidth * m_ImageHeight; i++) - { - m_pImage[i * 3 + 0] = (pData[i] & 0xFF0000) >> 16; - m_pImage[i * 3 + 1] = (pData[i] & 0x00FF00) >> 8; - m_pImage[i * 3 + 2] = (pData[i] & 0x0000FF) >> 0; - } - } - - delete pFileSystem; + m_pImage[i * 3 + 0] = (pData[i] & 0xFF0000) >> 16; + m_pImage[i * 3 + 1] = (pData[i] & 0x00FF00) >> 8; + m_pImage[i * 3 + 2] = (pData[i] & 0x0000FF) >> 0; } delete pVolume; @@ -154,7 +136,7 @@ GameListItem::GameListItem(const std::string& _rFileName) wxImage Image(m_ImageWidth, m_ImageHeight, &m_pImage[0], true); double Scale = wxTheApp->GetTopWindow()->GetContentScaleFactor(); // Note: This uses nearest neighbor, which subjectively looks a lot - // better for GC banners than smooths caling. + // better for GC banners than smooth scaling. Image.Rescale(DVD_BANNER_WIDTH * Scale, DVD_BANNER_HEIGHT * Scale); #ifdef __APPLE__ m_Bitmap = wxBitmap(Image, -1, Scale); @@ -188,10 +170,9 @@ void GameListItem::SaveToCache() void GameListItem::DoState(PointerWrap &p) { - p.Do(m_volume_names); - p.Do(m_company); - p.Do(m_banner_names); + p.Do(m_names); p.Do(m_descriptions); + p.Do(m_company); p.Do(m_UniqueID); p.Do(m_FileSize); p.Do(m_VolumeSize); @@ -238,48 +219,27 @@ std::string GameListItem::GetDescription() const return GetDescription(SConfig::GetInstance().m_LocalCoreStartupParameter.GetCurrentLanguage(m_Platform != GAMECUBE_DISC)); } -std::string GameListItem::GetVolumeName(IVolume::ELanguage language) const -{ - return GetLanguageString(language, m_volume_names); -} - -std::string GameListItem::GetBannerName(IVolume::ELanguage language) const +std::string GameListItem::GetName(IVolume::ELanguage language) const { - return GetLanguageString(language, m_banner_names); + return GetLanguageString(language, m_names); } -std::string GameListItem::GetName(IVolume::ELanguage language) const +std::string GameListItem::GetName() const { - // Prefer name from banner, fallback to name from volume, fallback to filename - - std::string name = GetBannerName(language); - - if (name.empty()) - name = GetVolumeName(language); - + std::string name = GetName(SConfig::GetInstance().m_LocalCoreStartupParameter.GetCurrentLanguage(m_Platform != GAMECUBE_DISC)); if (name.empty()) { // No usable name, return filename (better than nothing) SplitPath(GetFileName(), nullptr, &name, nullptr); } - return name; } -std::string GameListItem::GetName() const -{ - return GetName(SConfig::GetInstance().m_LocalCoreStartupParameter.GetCurrentLanguage(m_Platform != GAMECUBE_DISC)); -} - std::vector GameListItem::GetLanguages() const { - std::map language_strings = m_banner_names; - if (m_volume_names.size() > m_banner_names.size()) - language_strings = m_volume_names; - std::vector languages; - for (std::pair language_string : language_strings) - languages.emplace_back(language_string.first); + for (std::pair name : m_names) + languages.push_back(name.first); return languages; } -- cgit v1.2.3