Merge pull request #5706 from JosJuice/more-gamelist-speedup-followup
More follow-up for the gamelist speedup PR
This commit is contained in:
commit
951f6400fb
|
@ -14,6 +14,8 @@
|
|||
namespace fs = std::experimental::filesystem;
|
||||
#define HAS_STD_FILESYSTEM
|
||||
#else
|
||||
#include <cstring>
|
||||
#include "Common/CommonFuncs.h"
|
||||
#include "Common/FileUtil.h"
|
||||
#endif
|
||||
|
||||
|
@ -55,11 +57,10 @@ std::vector<std::string> DoFileSearch(const std::vector<std::string>& directorie
|
|||
return true;
|
||||
if (entry.isDirectory)
|
||||
return false;
|
||||
std::string name = entry.virtualName;
|
||||
std::transform(name.begin(), name.end(), name.begin(), ::tolower);
|
||||
return std::any_of(exts.begin(), exts.end(), [&](const std::string& ext) {
|
||||
const std::string& name = entry.virtualName;
|
||||
return name.length() >= ext.length() &&
|
||||
name.compare(name.length() - ext.length(), ext.length(), ext) == 0;
|
||||
strcasecmp(name.c_str() + name.length() - ext.length(), ext.c_str()) == 0;
|
||||
});
|
||||
});
|
||||
}
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
|
||||
namespace DiscIO
|
||||
{
|
||||
// Increment CACHE_REVISION (ISOFile.cpp & GameFile.cpp) if the enum below is modified
|
||||
// Increment CACHE_REVISION (GameListCtrl.cpp) if the enum below is modified
|
||||
enum class BlobType
|
||||
{
|
||||
PLAIN,
|
||||
|
|
|
@ -16,7 +16,7 @@ bool IsNTSC(Region region)
|
|||
return region == Region::NTSC_J || region == Region::NTSC_U || region == Region::NTSC_K;
|
||||
}
|
||||
|
||||
// Increment CACHE_REVISION (ISOFile.cpp & GameFile.cpp) if the code below is modified
|
||||
// Increment CACHE_REVISION (GameListCtrl.cpp) if the code below is modified
|
||||
|
||||
Country TypicalCountryForRegion(Region region)
|
||||
{
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
|
||||
namespace DiscIO
|
||||
{
|
||||
// Increment CACHE_REVISION (ISOFile.cpp & GameFile.cpp) if these enums are modified
|
||||
// Increment CACHE_REVISION (GameListCtrl.cpp) if these enums are modified
|
||||
|
||||
enum class Platform
|
||||
{
|
||||
|
|
|
@ -80,6 +80,8 @@ public:
|
|||
wxProgressDialog* dialog;
|
||||
};
|
||||
|
||||
static constexpr u32 CACHE_REVISION = 2; // Last changed in PR 5687
|
||||
|
||||
static bool sorted = false;
|
||||
|
||||
static int CompareGameListItems(const GameListItem* iso1, const GameListItem* iso2,
|
||||
|
|
|
@ -125,7 +125,6 @@ private:
|
|||
} m_image_indexes;
|
||||
|
||||
// Actual backing GameListItems are maintained in a background thread and cached to file
|
||||
static constexpr u32 CACHE_REVISION = 2; // Last changed in PR 5687
|
||||
std::list<std::shared_ptr<GameListItem>> m_cached_files;
|
||||
// Locks the list, not the contents
|
||||
std::mutex m_cache_mutex;
|
||||
|
|
|
@ -90,8 +90,9 @@ GameListItem::GameListItem(const std::string& filename)
|
|||
m_disc_number = volume->GetDiscNumber().value_or(0);
|
||||
m_revision = volume->GetRevision().value_or(0);
|
||||
|
||||
std::vector<u32> buffer = volume->GetBanner(&m_banner.width, &m_banner.height);
|
||||
ReadVolumeBanner(&m_banner.buffer, buffer, m_banner.width, m_banner.height);
|
||||
auto& banner = m_volume_banner;
|
||||
std::vector<u32> buffer = volume->GetBanner(&banner.width, &banner.height);
|
||||
ReadVolumeBanner(&banner.buffer, buffer, banner.width, banner.height);
|
||||
|
||||
m_valid = true;
|
||||
}
|
||||
|
@ -113,18 +114,17 @@ GameListItem::GameListItem(const std::string& filename)
|
|||
// A bit like the Homebrew Channel icon, except there can be multiple files
|
||||
// in a folder with their own icons. Useful for those who don't want to have
|
||||
// a Homebrew Channel-style folder structure.
|
||||
if (SetWxBannerFromPngFile(path + name + ".png"))
|
||||
if (SetWxBannerFromPNGFile(path + name + ".png"))
|
||||
return;
|
||||
|
||||
// Homebrew Channel icon. Typical for DOLs and ELFs,
|
||||
// but can be also used with volumes.
|
||||
if (SetWxBannerFromPngFile(path + "icon.png"))
|
||||
// Homebrew Channel icon. The most typical icon format for DOLs and ELFs.
|
||||
if (SetWxBannerFromPNGFile(path + "icon.png"))
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Volume banner. Typical for everything that isn't a DOL or ELF.
|
||||
SetWxBannerFromRaw(m_banner);
|
||||
SetWxBannerFromRaw(m_volume_banner);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -196,12 +196,12 @@ void GameListItem::DoState(PointerWrap& p)
|
|||
p.Do(m_blob_type);
|
||||
p.Do(m_revision);
|
||||
p.Do(m_disc_number);
|
||||
m_banner.DoState(p);
|
||||
m_volume_banner.DoState(p);
|
||||
m_emu_state.DoState(p);
|
||||
p.Do(m_custom_name);
|
||||
if (p.GetMode() == PointerWrap::MODE_READ)
|
||||
{
|
||||
SetWxBannerFromRaw(m_banner);
|
||||
SetWxBannerFromRaw(m_volume_banner);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -227,7 +227,7 @@ void GameListItem::ReadVolumeBanner(std::vector<u8>* image, const std::vector<u3
|
|||
}
|
||||
}
|
||||
|
||||
bool GameListItem::SetWxBannerFromPngFile(const std::string& path)
|
||||
bool GameListItem::SetWxBannerFromPNGFile(const std::string& path)
|
||||
{
|
||||
if (!File::Exists(path))
|
||||
return false;
|
||||
|
@ -242,13 +242,13 @@ bool GameListItem::SetWxBannerFromPngFile(const std::string& path)
|
|||
|
||||
void GameListItem::SetWxBannerFromRaw(const Banner& banner)
|
||||
{
|
||||
if (banner.empty())
|
||||
return;
|
||||
|
||||
// Need to make explicit copy as wxImage uses reference counting for copies combined with only
|
||||
// taking a pointer, not the content, when given a buffer to its constructor.
|
||||
if (!banner.empty())
|
||||
{
|
||||
m_banner_wx.Create(banner.width, banner.height, false);
|
||||
std::memcpy(m_banner_wx.GetData(), banner.buffer.data(), banner.buffer.size());
|
||||
}
|
||||
m_banner_wx.Create(banner.width, banner.height, false);
|
||||
std::memcpy(m_banner_wx.GetData(), banner.buffer.data(), banner.buffer.size());
|
||||
}
|
||||
|
||||
bool GameListItem::BannerChanged()
|
||||
|
@ -256,27 +256,27 @@ bool GameListItem::BannerChanged()
|
|||
// 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_platform == DiscIO::Platform::WII_DISC || m_platform == DiscIO::Platform::WII_WAD) &&
|
||||
m_banner.empty())
|
||||
{
|
||||
auto& banner = m_pending.banner;
|
||||
std::vector<u32> buffer =
|
||||
DiscIO::Volume::GetWiiBanner(&banner.width, &banner.height, m_title_id);
|
||||
if (buffer.size())
|
||||
{
|
||||
ReadVolumeBanner(&banner.buffer, buffer, banner.width, banner.height);
|
||||
// Only reach here if m_banner was empty, so don't need to explicitly compare to see if
|
||||
// different
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
|
||||
if (!m_volume_banner.empty())
|
||||
return false;
|
||||
if (m_platform != DiscIO::Platform::WII_DISC && m_platform != DiscIO::Platform::WII_WAD)
|
||||
return false;
|
||||
|
||||
auto& banner = m_pending.volume_banner;
|
||||
std::vector<u32> buffer = DiscIO::Volume::GetWiiBanner(&banner.width, &banner.height, m_title_id);
|
||||
if (!buffer.size())
|
||||
return false;
|
||||
|
||||
ReadVolumeBanner(&banner.buffer, buffer, banner.width, banner.height);
|
||||
// We only reach here if m_volume_banner was empty, so we don't need to explicitly
|
||||
// compare to see if they are different
|
||||
return true;
|
||||
}
|
||||
|
||||
void GameListItem::BannerCommit()
|
||||
{
|
||||
m_banner = std::move(m_pending.banner);
|
||||
SetWxBannerFromRaw(m_banner);
|
||||
m_volume_banner = std::move(m_pending.volume_banner);
|
||||
SetWxBannerFromRaw(m_volume_banner);
|
||||
}
|
||||
|
||||
std::string GameListItem::GetDescription(DiscIO::Language language) const
|
||||
|
|
|
@ -94,7 +94,8 @@ private:
|
|||
void ReadVolumeBanner(std::vector<u8>* image, const std::vector<u32>& buffer, int width,
|
||||
int height);
|
||||
// Outputs to m_banner_wx
|
||||
bool SetWxBannerFromPngFile(const std::string& path);
|
||||
bool SetWxBannerFromPNGFile(const std::string& path);
|
||||
// Outputs to m_banner_wx
|
||||
void SetWxBannerFromRaw(const Banner& banner);
|
||||
|
||||
// IMPORTANT: Nearly all data members must be save/restored in DoState.
|
||||
|
@ -120,7 +121,7 @@ private:
|
|||
u16 m_revision{};
|
||||
u8 m_disc_number{};
|
||||
|
||||
Banner m_banner{};
|
||||
Banner m_volume_banner{};
|
||||
EmuState m_emu_state{};
|
||||
// Overridden name from TitleDatabase
|
||||
std::string m_custom_name{};
|
||||
|
@ -133,7 +134,7 @@ private:
|
|||
struct
|
||||
{
|
||||
EmuState emu_state;
|
||||
Banner banner;
|
||||
Banner volume_banner;
|
||||
std::string custom_name;
|
||||
} m_pending{};
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue