mirror of
https://github.com/izzy2lost/dolphin.git
synced 2026-06-19 01:16:48 -07:00
RVZ: Make m_rvz a template parameter
Needed for the next commit.
This commit is contained in:
@@ -207,8 +207,9 @@ std::unique_ptr<BlobReader> CreateBlobReader(const std::string& filename)
|
||||
case WBFS_MAGIC:
|
||||
return WbfsFileReader::Create(std::move(file), filename);
|
||||
case WIA_MAGIC:
|
||||
case RVZ_MAGIC:
|
||||
return WIAFileReader::Create(std::move(file), filename);
|
||||
case RVZ_MAGIC:
|
||||
return RVZFileReader::Create(std::move(file), filename);
|
||||
default:
|
||||
if (auto directory_blob = DirectoryBlobReader::Create(filename))
|
||||
return std::move(directory_blob);
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
|
||||
namespace DiscIO
|
||||
{
|
||||
enum class WIACompressionType : u32;
|
||||
enum class WIARVZCompressionType : u32;
|
||||
|
||||
// Increment CACHE_REVISION (GameFileCache.cpp) if the enum below is modified
|
||||
enum class BlobType
|
||||
@@ -176,9 +176,9 @@ bool ConvertToGCZ(BlobReader* infile, const std::string& infile_path,
|
||||
bool ConvertToPlain(BlobReader* infile, const std::string& infile_path,
|
||||
const std::string& outfile_path, CompressCB callback = nullptr,
|
||||
void* arg = nullptr);
|
||||
bool ConvertToWIA(BlobReader* infile, const std::string& infile_path,
|
||||
const std::string& outfile_path, bool rvz, WIACompressionType compression_type,
|
||||
int compression_level, int chunk_size, CompressCB callback = nullptr,
|
||||
void* arg = nullptr);
|
||||
bool ConvertToWIAOrRVZ(BlobReader* infile, const std::string& infile_path,
|
||||
const std::string& outfile_path, bool rvz,
|
||||
WIARVZCompressionType compression_type, int compression_level,
|
||||
int chunk_size, CompressCB callback = nullptr, void* arg = nullptr);
|
||||
|
||||
} // namespace DiscIO
|
||||
|
||||
+173
-111
File diff suppressed because it is too large
Load Diff
@@ -25,7 +25,7 @@ namespace DiscIO
|
||||
class FileSystem;
|
||||
class VolumeDisc;
|
||||
|
||||
enum class WIACompressionType : u32
|
||||
enum class WIARVZCompressionType : u32
|
||||
{
|
||||
None = 0,
|
||||
Purge = 1,
|
||||
@@ -35,17 +35,18 @@ enum class WIACompressionType : u32
|
||||
Zstd = 5,
|
||||
};
|
||||
|
||||
std::pair<int, int> GetAllowedCompressionLevels(WIACompressionType compression_type);
|
||||
std::pair<int, int> GetAllowedCompressionLevels(WIARVZCompressionType compression_type);
|
||||
|
||||
constexpr u32 WIA_MAGIC = 0x01414957; // "WIA\x1" (byteswapped to little endian)
|
||||
constexpr u32 RVZ_MAGIC = 0x015A5652; // "RVZ\x1" (byteswapped to little endian)
|
||||
|
||||
class WIAFileReader : public BlobReader
|
||||
template <bool RVZ>
|
||||
class WIARVZFileReader : public BlobReader
|
||||
{
|
||||
public:
|
||||
~WIAFileReader();
|
||||
~WIARVZFileReader();
|
||||
|
||||
static std::unique_ptr<WIAFileReader> Create(File::IOFile file, const std::string& path);
|
||||
static std::unique_ptr<WIARVZFileReader> Create(File::IOFile file, const std::string& path);
|
||||
|
||||
BlobType GetBlobType() const override;
|
||||
|
||||
@@ -60,11 +61,10 @@ public:
|
||||
bool SupportsReadWiiDecrypted() const override;
|
||||
bool ReadWiiDecrypted(u64 offset, u64 size, u8* out_ptr, u64 partition_data_offset) override;
|
||||
|
||||
static ConversionResultCode ConvertToWIA(BlobReader* infile, const VolumeDisc* infile_volume,
|
||||
File::IOFile* outfile, bool rvz,
|
||||
WIACompressionType compression_type,
|
||||
int compression_level, int chunk_size,
|
||||
CompressCB callback, void* arg);
|
||||
static ConversionResultCode Convert(BlobReader* infile, const VolumeDisc* infile_volume,
|
||||
File::IOFile* outfile, WIARVZCompressionType compression_type,
|
||||
int compression_level, int chunk_size, CompressCB callback,
|
||||
void* arg);
|
||||
|
||||
private:
|
||||
using SHA1 = std::array<u8, 20>;
|
||||
@@ -209,7 +209,7 @@ private:
|
||||
u64 m_data_offset = 0;
|
||||
};
|
||||
|
||||
explicit WIAFileReader(File::IOFile file, const std::string& path);
|
||||
explicit WIARVZFileReader(File::IOFile file, const std::string& path);
|
||||
bool Initialize(const std::string& path);
|
||||
bool HasDataOverlap() const;
|
||||
|
||||
@@ -306,15 +306,10 @@ private:
|
||||
u64* bytes_written, u64* offset_out);
|
||||
|
||||
static void SetUpCompressor(std::unique_ptr<Compressor>* compressor,
|
||||
WIACompressionType compression_type, int compression_level,
|
||||
WIARVZCompressionType compression_type, int compression_level,
|
||||
WIAHeader2* header_2);
|
||||
static bool TryReuse(std::map<ReuseID, GroupEntry>* reusable_groups,
|
||||
std::mutex* reusable_groups_mutex, OutputParametersEntry* entry);
|
||||
static void RVZPack(const u8* in, OutputParametersEntry* out, u64 bytes_per_chunk, size_t chunks,
|
||||
u64 total_size, u64 data_offset, u64 in_offset, bool allow_junk_reuse,
|
||||
bool compression, const FileSystem* file_system);
|
||||
static void RVZPack(const u8* in, OutputParametersEntry* out, u64 size, u64 data_offset,
|
||||
bool allow_junk_reuse, bool compression, const FileSystem* file_system);
|
||||
static ConversionResult<OutputParameters>
|
||||
ProcessAndCompress(CompressThreadState* state, CompressParameters parameters,
|
||||
const std::vector<PartitionEntry>& partition_entries,
|
||||
@@ -322,7 +317,7 @@ private:
|
||||
std::map<ReuseID, GroupEntry>* reusable_groups,
|
||||
std::mutex* reusable_groups_mutex, u64 chunks_per_wii_group,
|
||||
u64 exception_lists_per_chunk, bool compressed_exception_lists,
|
||||
bool compression, bool rvz);
|
||||
bool compression);
|
||||
static ConversionResultCode Output(std::vector<OutputParametersEntry>* entries,
|
||||
File::IOFile* outfile,
|
||||
std::map<ReuseID, GroupEntry>* reusable_groups,
|
||||
@@ -332,25 +327,8 @@ private:
|
||||
u32 total_groups, u64 iso_size, CompressCB callback,
|
||||
void* arg);
|
||||
|
||||
static void PushBack(std::vector<u8>* vector, const u8* begin, const u8* end)
|
||||
{
|
||||
const size_t offset_in_vector = vector->size();
|
||||
vector->resize(offset_in_vector + (end - begin));
|
||||
std::copy(begin, end, vector->data() + offset_in_vector);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
static void PushBack(std::vector<u8>* vector, const T& x)
|
||||
{
|
||||
static_assert(std::is_trivially_copyable_v<T>);
|
||||
|
||||
const u8* x_ptr = reinterpret_cast<const u8*>(&x);
|
||||
PushBack(vector, x_ptr, x_ptr + sizeof(T));
|
||||
}
|
||||
|
||||
bool m_valid;
|
||||
bool m_rvz;
|
||||
WIACompressionType m_compression_type;
|
||||
WIARVZCompressionType m_compression_type;
|
||||
|
||||
File::IOFile m_file;
|
||||
Chunk m_cached_chunk;
|
||||
@@ -382,4 +360,7 @@ private:
|
||||
static constexpr u32 RVZ_VERSION_READ_COMPATIBLE = 0x00020000;
|
||||
};
|
||||
|
||||
using WIAFileReader = WIARVZFileReader<false>;
|
||||
using RVZFileReader = WIARVZFileReader<true>;
|
||||
|
||||
} // namespace DiscIO
|
||||
|
||||
@@ -139,7 +139,8 @@ void ConvertDialog::AddToBlockSizeComboBox(int size)
|
||||
m_block_size->setCurrentIndex(m_block_size->count() - 1);
|
||||
}
|
||||
|
||||
void ConvertDialog::AddToCompressionComboBox(const QString& name, DiscIO::WIACompressionType type)
|
||||
void ConvertDialog::AddToCompressionComboBox(const QString& name,
|
||||
DiscIO::WIARVZCompressionType type)
|
||||
{
|
||||
m_compression->addItem(name, static_cast<int>(type));
|
||||
}
|
||||
@@ -227,7 +228,7 @@ void ConvertDialog::OnFormatChanged()
|
||||
{
|
||||
case DiscIO::BlobType::GCZ:
|
||||
m_compression->setEnabled(true);
|
||||
AddToCompressionComboBox(QStringLiteral("Deflate"), DiscIO::WIACompressionType::None);
|
||||
AddToCompressionComboBox(QStringLiteral("Deflate"), DiscIO::WIARVZCompressionType::None);
|
||||
break;
|
||||
case DiscIO::BlobType::WIA:
|
||||
case DiscIO::BlobType::RVZ:
|
||||
@@ -237,15 +238,22 @@ void ConvertDialog::OnFormatChanged()
|
||||
// i18n: %1 is the name of a compression method (e.g. LZMA)
|
||||
const QString slow = tr("%1 (slow)");
|
||||
|
||||
AddToCompressionComboBox(tr("No Compression"), DiscIO::WIACompressionType::None);
|
||||
AddToCompressionComboBox(tr("No Compression"), DiscIO::WIARVZCompressionType::None);
|
||||
|
||||
if (format == DiscIO::BlobType::WIA)
|
||||
AddToCompressionComboBox(QStringLiteral("Purge"), DiscIO::WIACompressionType::Purge);
|
||||
AddToCompressionComboBox(slow.arg(QStringLiteral("bzip2")), DiscIO::WIACompressionType::Bzip2);
|
||||
AddToCompressionComboBox(slow.arg(QStringLiteral("LZMA")), DiscIO::WIACompressionType::LZMA);
|
||||
AddToCompressionComboBox(slow.arg(QStringLiteral("LZMA2")), DiscIO::WIACompressionType::LZMA2);
|
||||
AddToCompressionComboBox(QStringLiteral("Purge"), DiscIO::WIARVZCompressionType::Purge);
|
||||
|
||||
AddToCompressionComboBox(slow.arg(QStringLiteral("bzip2")),
|
||||
DiscIO::WIARVZCompressionType::Bzip2);
|
||||
|
||||
AddToCompressionComboBox(slow.arg(QStringLiteral("LZMA")), DiscIO::WIARVZCompressionType::LZMA);
|
||||
|
||||
AddToCompressionComboBox(slow.arg(QStringLiteral("LZMA2")),
|
||||
DiscIO::WIARVZCompressionType::LZMA2);
|
||||
|
||||
if (format == DiscIO::BlobType::RVZ)
|
||||
{
|
||||
AddToCompressionComboBox(QStringLiteral("Zstandard"), DiscIO::WIACompressionType::Zstd);
|
||||
AddToCompressionComboBox(QStringLiteral("Zstandard"), DiscIO::WIARVZCompressionType::Zstd);
|
||||
m_compression->setCurrentIndex(m_compression->count() - 1);
|
||||
}
|
||||
|
||||
@@ -269,7 +277,7 @@ void ConvertDialog::OnCompressionChanged()
|
||||
m_compression_level->clear();
|
||||
|
||||
const auto compression_type =
|
||||
static_cast<DiscIO::WIACompressionType>(m_compression->currentData().toInt());
|
||||
static_cast<DiscIO::WIARVZCompressionType>(m_compression->currentData().toInt());
|
||||
|
||||
const std::pair<int, int> range = DiscIO::GetAllowedCompressionLevels(compression_type);
|
||||
|
||||
@@ -299,8 +307,8 @@ void ConvertDialog::Convert()
|
||||
{
|
||||
const DiscIO::BlobType format = static_cast<DiscIO::BlobType>(m_format->currentData().toInt());
|
||||
const int block_size = m_block_size->currentData().toInt();
|
||||
const DiscIO::WIACompressionType compression =
|
||||
static_cast<DiscIO::WIACompressionType>(m_compression->currentData().toInt());
|
||||
const DiscIO::WIARVZCompressionType compression =
|
||||
static_cast<DiscIO::WIARVZCompressionType>(m_compression->currentData().toInt());
|
||||
const int compression_level = m_compression_level->currentData().toInt();
|
||||
const bool scrub = m_scrub->isChecked();
|
||||
|
||||
@@ -477,10 +485,10 @@ void ConvertDialog::Convert()
|
||||
case DiscIO::BlobType::WIA:
|
||||
case DiscIO::BlobType::RVZ:
|
||||
good = std::async(std::launch::async, [&] {
|
||||
const bool good =
|
||||
DiscIO::ConvertToWIA(blob_reader.get(), original_path, dst_path.toStdString(),
|
||||
format == DiscIO::BlobType::RVZ, compression, compression_level,
|
||||
block_size, &CompressCB, &progress_dialog);
|
||||
const bool good = DiscIO::ConvertToWIAOrRVZ(
|
||||
blob_reader.get(), original_path, dst_path.toStdString(),
|
||||
format == DiscIO::BlobType::RVZ, compression, compression_level, block_size,
|
||||
&CompressCB, &progress_dialog);
|
||||
progress_dialog.Reset();
|
||||
return good;
|
||||
});
|
||||
|
||||
@@ -16,7 +16,7 @@ class QComboBox;
|
||||
|
||||
namespace DiscIO
|
||||
{
|
||||
enum class WIACompressionType : u32;
|
||||
enum class WIARVZCompressionType : u32;
|
||||
}
|
||||
|
||||
namespace UICommon
|
||||
@@ -39,7 +39,7 @@ private slots:
|
||||
|
||||
private:
|
||||
void AddToBlockSizeComboBox(int size);
|
||||
void AddToCompressionComboBox(const QString& name, DiscIO::WIACompressionType type);
|
||||
void AddToCompressionComboBox(const QString& name, DiscIO::WIARVZCompressionType type);
|
||||
void AddToCompressionLevelComboBox(int level);
|
||||
|
||||
bool ShowAreYouSureDialog(const QString& text);
|
||||
|
||||
Reference in New Issue
Block a user