summaryrefslogtreecommitdiff
path: root/Source/Core/DolphinQt/GameList/GameFile.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Core/DolphinQt/GameList/GameFile.cpp')
-rw-r--r--Source/Core/DolphinQt/GameList/GameFile.cpp51
1 files changed, 34 insertions, 17 deletions
diff --git a/Source/Core/DolphinQt/GameList/GameFile.cpp b/Source/Core/DolphinQt/GameList/GameFile.cpp
index df363410f3..03c3ddd037 100644
--- a/Source/Core/DolphinQt/GameList/GameFile.cpp
+++ b/Source/Core/DolphinQt/GameList/GameFile.cpp
@@ -24,7 +24,7 @@
#include "DolphinQt/GameList/GameFile.h"
#include "DolphinQt/Utils/Utils.h"
-static const u32 CACHE_REVISION = 0x00A;
+static const u32 CACHE_REVISION = 0x00B; // Last changed in PR 2598
static const u32 DATASTREAM_REVISION = 15; // Introduced in Qt 5.2
static QMap<DiscIO::IVolume::ELanguage, QString> ConvertLocalizedStrings(std::map<DiscIO::IVolume::ELanguage, std::string> strings)
@@ -74,6 +74,20 @@ GameFile::GameFile(const QString& fileName)
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_banner.isNull())
+ {
+ std::unique_ptr<DiscIO::IVolume> volume(DiscIO::CreateVolumeFromFilename(fileName.toStdString()));
+ if (volume != nullptr)
+ {
+ ReadBanner(*volume);
+ if (!m_banner.isNull())
+ SaveToCache();
+ }
+ }
}
else
{
@@ -100,24 +114,10 @@ GameFile::GameFile(const QString& fileName)
QFileInfo info(m_file_name);
m_folder_name = info.absoluteDir().dirName();
- int width, height;
- std::vector<u32> buffer = volume->GetBanner(&width, &height);
- QImage banner(width, height, QImage::Format_RGB888);
- for (int i = 0; i < width * height; i++)
- {
- int x = i % width, y = i / width;
- banner.setPixel(x, y, qRgb((buffer[i] & 0xFF0000) >> 16,
- (buffer[i] & 0x00FF00) >> 8,
- (buffer[i] & 0x0000FF) >> 0));
- }
+ ReadBanner(*volume);
m_valid = true;
-
- if (!banner.isNull())
- {
- m_banner = QPixmap::fromImage(banner);
- SaveToCache();
- }
+ SaveToCache();
}
}
@@ -238,6 +238,23 @@ QString GameFile::CreateCacheFilename()
return fullname;
}
+void GameFile::ReadBanner(const DiscIO::IVolume& volume)
+{
+ int width, height;
+ std::vector<u32> buffer = volume.GetBanner(&width, &height);
+ QImage banner(width, height, QImage::Format_RGB888);
+ for (int i = 0; i < width * height; i++)
+ {
+ int x = i % width, y = i / width;
+ banner.setPixel(x, y, qRgb((buffer[i] & 0xFF0000) >> 16,
+ (buffer[i] & 0x00FF00) >> 8,
+ (buffer[i] & 0x0000FF) >> 0));
+ }
+
+ if (!banner.isNull())
+ m_banner = QPixmap::fromImage(banner);
+}
+
QString GameFile::GetDescription(DiscIO::IVolume::ELanguage language) const
{
return GetLanguageString(language, m_descriptions);