Files
dolphin/Source/Core/DiscIO/WiiSaveBanner.cpp
Tillmann Karras fe6fd2279c WiiSaveBanner: fall back to $userdir/Load/WiiBanners
Unlike custom banners which work as an override, this mechanism works as
a fallback. The use case is if you have games you don't really play but
want to keep around for testing purposes without filling up your NAND
with lots of saves. For ease of use, the directory structure is the same
but only title/$title_hi/$title_lo/data/banner.bin files are
relevant.
2025-07-04 23:15:50 +01:00

82 lines
2.0 KiB
C++

// Copyright 2009 Dolphin Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#include "DiscIO/WiiSaveBanner.h"
#include <fmt/format.h>
#include <iterator>
#include <string>
#include <vector>
#include "Common/ColorUtil.h"
#include "Common/CommonTypes.h"
#include "Common/FileUtil.h"
#include "Common/IOFile.h"
#include "Common/NandPaths.h"
#include "Common/StringUtil.h"
namespace DiscIO
{
constexpr u32 ICON_WIDTH = 48;
constexpr u32 ICON_HEIGHT = 48;
constexpr u32 ICON_SIZE = ICON_WIDTH * ICON_HEIGHT * 2;
WiiSaveBanner::WiiSaveBanner(u64 title_id)
{
constexpr u32 BANNER_SIZE = BANNER_WIDTH * BANNER_HEIGHT * 2;
constexpr size_t MINIMUM_SIZE = sizeof(Header) + BANNER_SIZE + ICON_SIZE;
m_path = Common::GetTitleDataPath(title_id, Common::FromWhichRoot::Configured) + "/banner.bin";
File::IOFile file(m_path, "rb");
if (!file)
{
m_path = Common::GetTitleDataPath(title_id, Common::FromWhichRoot::Banners) + "/banner.bin";
file = File::IOFile(m_path, "rb");
}
if (!file.ReadArray(&m_header, 1))
{
m_header = {};
m_valid = false;
}
else if (file.GetSize() < MINIMUM_SIZE)
{
m_valid = false;
}
}
std::string WiiSaveBanner::GetName() const
{
return UTF16BEToUTF8(m_header.name, std::size(m_header.name));
}
std::string WiiSaveBanner::GetDescription() const
{
return UTF16BEToUTF8(m_header.description, std::size(m_header.description));
}
std::vector<u32> WiiSaveBanner::GetBanner(u32* width, u32* height) const
{
*width = 0;
*height = 0;
File::IOFile file(m_path, "rb");
if (!file.Seek(sizeof(Header), File::SeekOrigin::Begin))
return std::vector<u32>();
std::vector<u16> banner_data(BANNER_WIDTH * BANNER_HEIGHT);
if (!file.ReadArray(banner_data.data(), banner_data.size()))
return std::vector<u32>();
std::vector<u32> image_buffer(BANNER_WIDTH * BANNER_HEIGHT);
Common::Decode5A3Image(image_buffer.data(), banner_data.data(), BANNER_WIDTH, BANNER_HEIGHT);
*width = BANNER_WIDTH;
*height = BANNER_HEIGHT;
return image_buffer;
}
} // namespace DiscIO