From 115edea34ea4ad0ce06e069e6eb9ee6d3dedf329 Mon Sep 17 00:00:00 2001 From: JosJuice Date: Mon, 13 Apr 2020 22:04:16 +0200 Subject: WIA: Add early support for WIA writing --- Source/Core/DolphinQt/ConvertDialog.cpp | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) (limited to 'Source/Core/DolphinQt/ConvertDialog.cpp') diff --git a/Source/Core/DolphinQt/ConvertDialog.cpp b/Source/Core/DolphinQt/ConvertDialog.cpp index 0d01785dc4..831c0ec641 100644 --- a/Source/Core/DolphinQt/ConvertDialog.cpp +++ b/Source/Core/DolphinQt/ConvertDialog.cpp @@ -57,6 +57,7 @@ ConvertDialog::ConvertDialog(QList> fi m_format = new QComboBox; m_format->addItem(QStringLiteral("ISO"), static_cast(DiscIO::BlobType::PLAIN)); m_format->addItem(QStringLiteral("GCZ"), static_cast(DiscIO::BlobType::GCZ)); + m_format->addItem(QStringLiteral("WIA"), static_cast(DiscIO::BlobType::WIA)); if (std::all_of(m_files.begin(), m_files.end(), [](const auto& file) { return file->GetBlobType() == DiscIO::BlobType::PLAIN; })) { @@ -88,7 +89,10 @@ ConvertDialog::ConvertDialog(QList> fi "It takes up more space than any other format.\n\n" "GCZ: A basic compressed format which is compatible with most versions of " "Dolphin and some other programs. It can't efficiently compress junk data " - "(unless removed) or encrypted Wii data.")); + "(unless removed) or encrypted Wii data.\n\n" + "WIA: An advanced compressed format which is compatible with recent versions " + "of Dolphin and a few other programs. It can efficiently compress encrypted " + "Wii data, but not junk data (unless removed).")); info_text->setWordWrap(true); QVBoxLayout* info_layout = new QVBoxLayout; @@ -166,6 +170,13 @@ void ConvertDialog::OnFormatChanged() break; } + case DiscIO::BlobType::WIA: + m_block_size->setEnabled(true); + + // This is the smallest block size supported by WIA. For performance, larger sizes are avoided. + AddToBlockSizeComboBox(0x200000); + + break; default: break; } @@ -224,7 +235,11 @@ void ConvertDialog::Convert() break; case DiscIO::BlobType::GCZ: extension = QStringLiteral(".gcz"); - filter = tr("Compressed GC/Wii images (*.gcz)"); + filter = tr("GCZ GC/Wii images (*.gcz)"); + break; + case DiscIO::BlobType::WIA: + extension = QStringLiteral(".wia"); + filter = tr("WIA GC/Wii images (*.wia)"); break; default: ASSERT(false); @@ -351,6 +366,16 @@ void ConvertDialog::Convert() return good; }); } + else if (format == DiscIO::BlobType::WIA) + { + good = std::async(std::launch::async, [&] { + const bool good = + DiscIO::ConvertToWIA(blob_reader.get(), original_path, dst_path.toStdString(), + block_size, &CompressCB, &progress_dialog); + progress_dialog.Reset(); + return good; + }); + } progress_dialog.GetRaw()->exec(); if (!good.get()) -- cgit v1.2.3 From e8b019ac29a254689c745681e47c0a5f282428d1 Mon Sep 17 00:00:00 2001 From: JosJuice Date: Fri, 17 Apr 2020 20:38:33 +0200 Subject: WIA: Implement compression --- Source/Core/DolphinQt/ConvertDialog.cpp | 88 +++++++++++++++++++++++++++++++-- 1 file changed, 83 insertions(+), 5 deletions(-) (limited to 'Source/Core/DolphinQt/ConvertDialog.cpp') diff --git a/Source/Core/DolphinQt/ConvertDialog.cpp b/Source/Core/DolphinQt/ConvertDialog.cpp index 831c0ec641..e52868039b 100644 --- a/Source/Core/DolphinQt/ConvertDialog.cpp +++ b/Source/Core/DolphinQt/ConvertDialog.cpp @@ -26,6 +26,7 @@ #include "Common/Logging/Log.h" #include "DiscIO/Blob.h" #include "DiscIO/ScrubbedBlob.h" +#include "DiscIO/WIABlob.h" #include "DolphinQt/QtUtils/ModalMessageBox.h" #include "DolphinQt/QtUtils/ParallelProgressDialog.h" #include "UICommon/GameFile.h" @@ -70,9 +71,17 @@ ConvertDialog::ConvertDialog(QList> fi grid_layout->addWidget(new QLabel(tr("Block Size:")), 1, 0); grid_layout->addWidget(m_block_size, 1, 1); + m_compression = new QComboBox; + grid_layout->addWidget(new QLabel(tr("Compression:")), 2, 0); + grid_layout->addWidget(m_compression, 2, 1); + + m_compression_level = new QComboBox; + grid_layout->addWidget(new QLabel(tr("Compression Level:")), 3, 0); + grid_layout->addWidget(m_compression_level, 3, 1); + m_scrub = new QCheckBox; - grid_layout->addWidget(new QLabel(tr("Remove Junk Data (Irreversible):")), 2, 0); - grid_layout->addWidget(m_scrub, 2, 1); + grid_layout->addWidget(new QLabel(tr("Remove Junk Data (Irreversible):")), 4, 0); + grid_layout->addWidget(m_scrub, 4, 1); m_scrub->setEnabled( std::none_of(m_files.begin(), m_files.end(), std::mem_fn(&UICommon::GameFile::IsDatelDisc))); @@ -108,9 +117,12 @@ ConvertDialog::ConvertDialog(QList> fi connect(m_format, QOverload::of(&QComboBox::currentIndexChanged), this, &ConvertDialog::OnFormatChanged); + connect(m_compression, QOverload::of(&QComboBox::currentIndexChanged), this, + &ConvertDialog::OnCompressionChanged); connect(convert_button, &QPushButton::clicked, this, &ConvertDialog::Convert); OnFormatChanged(); + OnCompressionChanged(); } void ConvertDialog::AddToBlockSizeComboBox(int size) @@ -118,6 +130,16 @@ void ConvertDialog::AddToBlockSizeComboBox(int size) m_block_size->addItem(QString::fromStdString(UICommon::FormatSize(size, 0)), size); } +void ConvertDialog::AddToCompressionComboBox(const QString& name, DiscIO::WIACompressionType type) +{ + m_compression->addItem(name, static_cast(type)); +} + +void ConvertDialog::AddToCompressionLevelComboBox(int level) +{ + m_compression_level->addItem(QString::number(level), level); +} + void ConvertDialog::OnFormatChanged() { // Because DVD timings are emulated as if we can't read less than an entire ECC block at once @@ -131,6 +153,9 @@ void ConvertDialog::OnFormatChanged() const DiscIO::BlobType format = static_cast(m_format->currentData().toInt()); m_block_size->clear(); + m_compression->clear(); + + // Populate m_block_size switch (format) { case DiscIO::BlobType::GCZ: @@ -181,7 +206,57 @@ void ConvertDialog::OnFormatChanged() break; } + // Populate m_compression + switch (format) + { + case DiscIO::BlobType::GCZ: + m_compression->setEnabled(true); + AddToCompressionComboBox(QStringLiteral("Deflate"), DiscIO::WIACompressionType::None); + break; + case DiscIO::BlobType::WIA: + { + m_compression->setEnabled(true); + + // 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(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); + + break; + } + default: + m_compression->setEnabled(false); + break; + } + m_block_size->setEnabled(m_block_size->count() > 1); + m_compression->setEnabled(m_compression->count() > 1); +} + +void ConvertDialog::OnCompressionChanged() +{ + m_compression_level->clear(); + + switch (static_cast(m_compression->currentData().toInt())) + { + case DiscIO::WIACompressionType::Bzip2: + case DiscIO::WIACompressionType::LZMA: + case DiscIO::WIACompressionType::LZMA2: + for (int i = 1; i <= 9; ++i) + AddToCompressionLevelComboBox(i); + + m_compression_level->setCurrentIndex(4); + + break; + default: + break; + } + + m_compression_level->setEnabled(m_compression_level->count() > 1); } bool ConvertDialog::ShowAreYouSureDialog(const QString& text) @@ -200,6 +275,9 @@ void ConvertDialog::Convert() { const DiscIO::BlobType format = static_cast(m_format->currentData().toInt()); const int block_size = m_block_size->currentData().toInt(); + const DiscIO::WIACompressionType compression = + static_cast(m_compression->currentData().toInt()); + const int compression_level = m_compression_level->currentData().toInt(); const bool scrub = m_scrub->isChecked(); if (scrub && format == DiscIO::BlobType::PLAIN) @@ -369,9 +447,9 @@ void ConvertDialog::Convert() else if (format == DiscIO::BlobType::WIA) { good = std::async(std::launch::async, [&] { - const bool good = - DiscIO::ConvertToWIA(blob_reader.get(), original_path, dst_path.toStdString(), - block_size, &CompressCB, &progress_dialog); + const bool good = DiscIO::ConvertToWIA( + blob_reader.get(), original_path, dst_path.toStdString(), compression, + compression_level, block_size, &CompressCB, &progress_dialog); progress_dialog.Reset(); return good; }); -- cgit v1.2.3 From e2ae2b3b0b11cc869468bed8a850e2012a68c2d9 Mon Sep 17 00:00:00 2001 From: JosJuice Date: Mon, 4 May 2020 12:41:14 +0200 Subject: Add new file format RVZ based on WIA --- Source/Core/DolphinQt/ConvertDialog.cpp | 51 +++++++++++++++++++++------------ 1 file changed, 32 insertions(+), 19 deletions(-) (limited to 'Source/Core/DolphinQt/ConvertDialog.cpp') diff --git a/Source/Core/DolphinQt/ConvertDialog.cpp b/Source/Core/DolphinQt/ConvertDialog.cpp index e52868039b..120b557c6b 100644 --- a/Source/Core/DolphinQt/ConvertDialog.cpp +++ b/Source/Core/DolphinQt/ConvertDialog.cpp @@ -59,6 +59,7 @@ ConvertDialog::ConvertDialog(QList> fi m_format->addItem(QStringLiteral("ISO"), static_cast(DiscIO::BlobType::PLAIN)); m_format->addItem(QStringLiteral("GCZ"), static_cast(DiscIO::BlobType::GCZ)); m_format->addItem(QStringLiteral("WIA"), static_cast(DiscIO::BlobType::WIA)); + m_format->addItem(QStringLiteral("RVZ"), static_cast(DiscIO::BlobType::RVZ)); if (std::all_of(m_files.begin(), m_files.end(), [](const auto& file) { return file->GetBlobType() == DiscIO::BlobType::PLAIN; })) { @@ -93,15 +94,17 @@ ConvertDialog::ConvertDialog(QList> fi QGroupBox* options_group = new QGroupBox(tr("Options")); options_group->setLayout(options_layout); - QLabel* info_text = - new QLabel(tr("ISO: A simple and robust format which is supported by many programs. " - "It takes up more space than any other format.\n\n" - "GCZ: A basic compressed format which is compatible with most versions of " - "Dolphin and some other programs. It can't efficiently compress junk data " - "(unless removed) or encrypted Wii data.\n\n" - "WIA: An advanced compressed format which is compatible with recent versions " - "of Dolphin and a few other programs. It can efficiently compress encrypted " - "Wii data, but not junk data (unless removed).")); + QLabel* info_text = new QLabel( + tr("ISO: A simple and robust format which is supported by many programs. It takes up more " + "space than any other format.\n\n" + "GCZ: A basic compressed format which is compatible with most versions of Dolphin and " + "some other programs. It can't efficiently compress junk data (unless removed) or " + "encrypted Wii data.\n\n" + "WIA: An advanced compressed format which is compatible with recent versions of Dolphin " + "and a few other programs. It can efficiently compress encrypted Wii data, but not junk " + "data (unless removed).\n\n" + "RVZ: An advanced compressed format which is compatible with recent versions of Dolphin. " + "It can efficiently compress both junk data and encrypted Wii data.")); info_text->setWordWrap(true); QVBoxLayout* info_layout = new QVBoxLayout; @@ -196,6 +199,7 @@ void ConvertDialog::OnFormatChanged() break; } case DiscIO::BlobType::WIA: + case DiscIO::BlobType::RVZ: m_block_size->setEnabled(true); // This is the smallest block size supported by WIA. For performance, larger sizes are avoided. @@ -214,6 +218,7 @@ void ConvertDialog::OnFormatChanged() AddToCompressionComboBox(QStringLiteral("Deflate"), DiscIO::WIACompressionType::None); break; case DiscIO::BlobType::WIA: + case DiscIO::BlobType::RVZ: { m_compression->setEnabled(true); @@ -319,6 +324,10 @@ void ConvertDialog::Convert() extension = QStringLiteral(".wia"); filter = tr("WIA GC/Wii images (*.wia)"); break; + case DiscIO::BlobType::RVZ: + extension = QStringLiteral(".rvz"); + filter = tr("RVZ GC/Wii images (*.rvz)"); + break; default: ASSERT(false); return; @@ -423,8 +432,9 @@ void ConvertDialog::Convert() { std::future good; - if (format == DiscIO::BlobType::PLAIN) + switch (format) { + case DiscIO::BlobType::PLAIN: good = std::async(std::launch::async, [&] { const bool good = DiscIO::ConvertToPlain(blob_reader.get(), original_path, dst_path.toStdString(), @@ -432,9 +442,9 @@ void ConvertDialog::Convert() progress_dialog.Reset(); return good; }); - } - else if (format == DiscIO::BlobType::GCZ) - { + break; + + case DiscIO::BlobType::GCZ: good = std::async(std::launch::async, [&] { const bool good = DiscIO::ConvertToGCZ(blob_reader.get(), original_path, dst_path.toStdString(), @@ -443,16 +453,19 @@ void ConvertDialog::Convert() progress_dialog.Reset(); return good; }); - } - else if (format == DiscIO::BlobType::WIA) - { + break; + + 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(), compression, - compression_level, block_size, &CompressCB, &progress_dialog); + 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); progress_dialog.Reset(); return good; }); + break; } progress_dialog.GetRaw()->exec(); -- cgit v1.2.3 From 1f7c0b636fd0fffbf63892a7e3c2ab0109c33185 Mon Sep 17 00:00:00 2001 From: JosJuice Date: Mon, 4 May 2020 16:01:56 +0200 Subject: RVZ: Add Zstandard as a compression method --- Source/Core/DolphinQt/ConvertDialog.cpp | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) (limited to 'Source/Core/DolphinQt/ConvertDialog.cpp') diff --git a/Source/Core/DolphinQt/ConvertDialog.cpp b/Source/Core/DolphinQt/ConvertDialog.cpp index 120b557c6b..f739de801a 100644 --- a/Source/Core/DolphinQt/ConvertDialog.cpp +++ b/Source/Core/DolphinQt/ConvertDialog.cpp @@ -230,6 +230,11 @@ void ConvertDialog::OnFormatChanged() AddToCompressionComboBox(slow.arg(QStringLiteral("bzip2")), DiscIO::WIACompressionType::Bzip2); AddToCompressionComboBox(slow.arg(QStringLiteral("LZMA")), DiscIO::WIACompressionType::LZMA); AddToCompressionComboBox(slow.arg(QStringLiteral("LZMA2")), DiscIO::WIACompressionType::LZMA2); + if (format == DiscIO::BlobType::RVZ) + { + AddToCompressionComboBox(QStringLiteral("Zstandard"), DiscIO::WIACompressionType::Zstd); + m_compression->setCurrentIndex(m_compression->count() - 1); + } break; } @@ -246,19 +251,16 @@ void ConvertDialog::OnCompressionChanged() { m_compression_level->clear(); - switch (static_cast(m_compression->currentData().toInt())) - { - case DiscIO::WIACompressionType::Bzip2: - case DiscIO::WIACompressionType::LZMA: - case DiscIO::WIACompressionType::LZMA2: - for (int i = 1; i <= 9; ++i) - AddToCompressionLevelComboBox(i); + const auto compression_type = + static_cast(m_compression->currentData().toInt()); - m_compression_level->setCurrentIndex(4); + const std::pair range = DiscIO::GetAllowedCompressionLevels(compression_type); - break; - default: - break; + for (int i = range.first; i <= range.second; ++i) + { + AddToCompressionLevelComboBox(i); + if (i == 5) + m_compression_level->setCurrentIndex(m_compression_level->count() - 1); } m_compression_level->setEnabled(m_compression_level->count() > 1); -- cgit v1.2.3 From 0d433baeb5b0f0fb19d691d2d7b37ed5fc737535 Mon Sep 17 00:00:00 2001 From: JosJuice Date: Mon, 4 May 2020 18:21:49 +0200 Subject: RVZ: Remove PURGE support PURGE isn't especially useful, while requiring some annoying special handling in the file format. If you want no compression, use NONE. If you want fast compression, use Zstandard. --- Source/Core/DolphinQt/ConvertDialog.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'Source/Core/DolphinQt/ConvertDialog.cpp') diff --git a/Source/Core/DolphinQt/ConvertDialog.cpp b/Source/Core/DolphinQt/ConvertDialog.cpp index f739de801a..db801581a0 100644 --- a/Source/Core/DolphinQt/ConvertDialog.cpp +++ b/Source/Core/DolphinQt/ConvertDialog.cpp @@ -226,7 +226,8 @@ void ConvertDialog::OnFormatChanged() const QString slow = tr("%1 (slow)"); AddToCompressionComboBox(tr("No Compression"), DiscIO::WIACompressionType::None); - AddToCompressionComboBox(QStringLiteral("Purge"), DiscIO::WIACompressionType::Purge); + 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); -- cgit v1.2.3 From b06c50ed2e8740b600e546b4d5e7aa097c7a5cb9 Mon Sep 17 00:00:00 2001 From: JosJuice Date: Tue, 5 May 2020 00:43:32 +0200 Subject: RVZ: Support chunk sizes between 32 KiB and 2 MiB WIA doesn't support smaller than 2 MiB. --- Source/Core/DolphinQt/ConvertDialog.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'Source/Core/DolphinQt/ConvertDialog.cpp') diff --git a/Source/Core/DolphinQt/ConvertDialog.cpp b/Source/Core/DolphinQt/ConvertDialog.cpp index db801581a0..1883918d95 100644 --- a/Source/Core/DolphinQt/ConvertDialog.cpp +++ b/Source/Core/DolphinQt/ConvertDialog.cpp @@ -199,12 +199,18 @@ void ConvertDialog::OnFormatChanged() break; } case DiscIO::BlobType::WIA: - case DiscIO::BlobType::RVZ: m_block_size->setEnabled(true); // This is the smallest block size supported by WIA. For performance, larger sizes are avoided. AddToBlockSizeComboBox(0x200000); + break; + case DiscIO::BlobType::RVZ: + m_block_size->setEnabled(true); + + for (int block_size = MIN_BLOCK_SIZE; block_size <= MAX_BLOCK_SIZE; block_size *= 2) + AddToBlockSizeComboBox(block_size); + break; default: break; -- cgit v1.2.3 From 4b74993374348185c304a68b2b159f3cdbb89360 Mon Sep 17 00:00:00 2001 From: JosJuice Date: Sun, 10 May 2020 19:21:05 +0200 Subject: RVZ: Store pseudorandom junk data efficiently --- Source/Core/DolphinQt/ConvertDialog.cpp | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'Source/Core/DolphinQt/ConvertDialog.cpp') diff --git a/Source/Core/DolphinQt/ConvertDialog.cpp b/Source/Core/DolphinQt/ConvertDialog.cpp index 1883918d95..7639c78b8a 100644 --- a/Source/Core/DolphinQt/ConvertDialog.cpp +++ b/Source/Core/DolphinQt/ConvertDialog.cpp @@ -252,6 +252,10 @@ void ConvertDialog::OnFormatChanged() m_block_size->setEnabled(m_block_size->count() > 1); m_compression->setEnabled(m_compression->count() > 1); + + m_scrub->setEnabled(format != DiscIO::BlobType::RVZ); + if (format == DiscIO::BlobType::RVZ) + m_scrub->setChecked(false); } void ConvertDialog::OnCompressionChanged() -- cgit v1.2.3 From 2ec608f0598925c874441ac2bcdfe4af2296bf7c Mon Sep 17 00:00:00 2001 From: JosJuice Date: Wed, 13 May 2020 16:43:59 +0200 Subject: DolphinQt: Set block size to 128 KiB by default --- Source/Core/DolphinQt/ConvertDialog.cpp | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'Source/Core/DolphinQt/ConvertDialog.cpp') diff --git a/Source/Core/DolphinQt/ConvertDialog.cpp b/Source/Core/DolphinQt/ConvertDialog.cpp index 7639c78b8a..a587af0deb 100644 --- a/Source/Core/DolphinQt/ConvertDialog.cpp +++ b/Source/Core/DolphinQt/ConvertDialog.cpp @@ -131,6 +131,12 @@ ConvertDialog::ConvertDialog(QList> fi void ConvertDialog::AddToBlockSizeComboBox(int size) { m_block_size->addItem(QString::fromStdString(UICommon::FormatSize(size, 0)), size); + + // Select 128 KiB by default, or if it is not available, the size closest to it. + // This code assumes that sizes get added to the combo box in increasing order. + constexpr int DEFAULT_SIZE = 0x20000; + if (size <= DEFAULT_SIZE) + m_block_size->setCurrentIndex(m_block_size->count() - 1); } void ConvertDialog::AddToCompressionComboBox(const QString& name, DiscIO::WIACompressionType type) -- cgit v1.2.3 From f2c38c0e67720ece41c317e0c04e80aea7fd3f36 Mon Sep 17 00:00:00 2001 From: JosJuice Date: Sun, 17 May 2020 15:34:50 +0200 Subject: RVZ: Make m_rvz a template parameter Needed for the next commit. --- Source/Core/DolphinQt/ConvertDialog.cpp | 38 ++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 15 deletions(-) (limited to 'Source/Core/DolphinQt/ConvertDialog.cpp') diff --git a/Source/Core/DolphinQt/ConvertDialog.cpp b/Source/Core/DolphinQt/ConvertDialog.cpp index a587af0deb..d7676cc81a 100644 --- a/Source/Core/DolphinQt/ConvertDialog.cpp +++ b/Source/Core/DolphinQt/ConvertDialog.cpp @@ -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(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(m_compression->currentData().toInt()); + static_cast(m_compression->currentData().toInt()); const std::pair range = DiscIO::GetAllowedCompressionLevels(compression_type); @@ -299,8 +307,8 @@ void ConvertDialog::Convert() { const DiscIO::BlobType format = static_cast(m_format->currentData().toInt()); const int block_size = m_block_size->currentData().toInt(); - const DiscIO::WIACompressionType compression = - static_cast(m_compression->currentData().toInt()); + const DiscIO::WIARVZCompressionType compression = + static_cast(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; }); -- cgit v1.2.3