summaryrefslogtreecommitdiff
path: root/Source/Core/DolphinWX/ISOFile.cpp
diff options
context:
space:
mode:
authorJosJuice <josjuice@gmail.com>2015-06-13 20:06:27 +0200
committerJosJuice <josjuice@gmail.com>2015-06-14 12:23:48 +0200
commita7d374bcb99310d3181a796da04eb919d7e65baa (patch)
tree4e2774803947b372f387888238918576c2ac528f /Source/Core/DolphinWX/ISOFile.cpp
parent8793f7c325f7164f0cfe3095f697ef9bf5473344 (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.cpp47
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);