diff options
| author | JosJuice <josjuice@gmail.com> | 2015-06-13 20:06:27 +0200 |
|---|---|---|
| committer | JosJuice <josjuice@gmail.com> | 2015-06-14 12:23:48 +0200 |
| commit | a7d374bcb99310d3181a796da04eb919d7e65baa (patch) | |
| tree | 4e2774803947b372f387888238918576c2ac528f /Source/Core/DolphinWX/ISOFile.cpp | |
| parent | 8793f7c325f7164f0cfe3095f697ef9bf5473344 (diff) | |
Cache games without banners
Games without banners were not cached before, because a banner could
become available at any time, making the cache outdated without it
becoming invalidated. Instead of not caching anything, this change makes
Dolphin check for a banner every time a cache that lacks a banner is read.
This is faster than reading all metadata, because reading a Wii banner
only reads from the game's save file, not the volume and its filesystem.
The cache revision is incremented, because otherwise banners will be
missing if a cache without a banner is created in the new version and
the user switches to an old version and creates a savefile.
Diffstat (limited to 'Source/Core/DolphinWX/ISOFile.cpp')
| -rw-r--r-- | Source/Core/DolphinWX/ISOFile.cpp | 47 |
1 files changed, 31 insertions, 16 deletions
diff --git a/Source/Core/DolphinWX/ISOFile.cpp b/Source/Core/DolphinWX/ISOFile.cpp index a7a4706fad..2ae56e8fb1 100644 --- a/Source/Core/DolphinWX/ISOFile.cpp +++ b/Source/Core/DolphinWX/ISOFile.cpp @@ -34,7 +34,7 @@ #include "DolphinWX/ISOFile.h" #include "DolphinWX/WxUtils.h" -static const u32 CACHE_REVISION = 0x124; +static const u32 CACHE_REVISION = 0x125; // Last changed in PR 2598 #define DVD_BANNER_WIDTH 96 #define DVD_BANNER_HEIGHT 32 @@ -74,6 +74,20 @@ GameListItem::GameListItem(const std::string& _rFileName) if (LoadFromCache()) { m_Valid = true; + + // Wii banners can only be read if there is a savefile, + // so sometimes caches don't contain banners. Let's check + // if a banner has become available after the cache was made. + if (m_pImage.empty()) + { + std::unique_ptr<DiscIO::IVolume> volume(DiscIO::CreateVolumeFromFilename(_rFileName)); + if (volume != nullptr) + { + ReadBanner(*volume); + if (!m_pImage.empty()) + SaveToCache(); + } + } } else { @@ -96,25 +110,12 @@ GameListItem::GameListItem(const std::string& _rFileName) m_disc_number = pVolume->GetDiscNumber(); m_Revision = pVolume->GetRevision(); - std::vector<u32> Buffer = pVolume->GetBanner(&m_ImageWidth, &m_ImageHeight); - u32* pData = Buffer.data(); - 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; - } + ReadBanner(*pVolume); delete pVolume; m_Valid = true; - - // Create a cache file only if we have an image. - // Wii ISOs create their images after you have generated the first savegame - if (!m_pImage.empty()) - SaveToCache(); + SaveToCache(); } } @@ -201,6 +202,20 @@ std::string GameListItem::CreateCacheFilename() return fullname; } +void GameListItem::ReadBanner(const DiscIO::IVolume& volume) +{ + std::vector<u32> Buffer = volume.GetBanner(&m_ImageWidth, &m_ImageHeight); + u32* pData = Buffer.data(); + 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; + } +} + std::string GameListItem::GetDescription(DiscIO::IVolume::ELanguage language) const { return GetLanguageString(language, m_descriptions); |
