summaryrefslogtreecommitdiff
path: root/src/utils
diff options
context:
space:
mode:
authorKiritoDv <kiritodev01@gmail.com>2024-03-28 22:19:27 -0600
committerKiritoDv <kiritodev01@gmail.com>2024-03-28 22:19:27 -0600
commit42d95d50fd6f8d41db71ff7f42d1260df84c1c1d (patch)
tree511fa7ace7500edafb8ea1ab87135faa2c8db376 /src/utils
parenta7d7acdc4219d474597960b55fea06b06e1911ad (diff)
WIP Collision factoryfeature/sm64-collision
Diffstat (limited to 'src/utils')
-rw-r--r--src/utils/Decompressor.cpp25
-rw-r--r--src/utils/Decompressor.h6
2 files changed, 19 insertions, 12 deletions
diff --git a/src/utils/Decompressor.cpp b/src/utils/Decompressor.cpp
index c59d867..7c63c09 100644
--- a/src/utils/Decompressor.cpp
+++ b/src/utils/Decompressor.cpp
@@ -43,12 +43,9 @@ DecompressedData Decompressor::AutoDecode(YAML::Node& node, std::vector<uint8_t>
auto offset = node["offset"].as<uint32_t>();
- CompressionType type = Companion::Instance->GetCurrCompressionType();
-
- switch(type) {
- case CompressionType::MIO0:
- {
- auto fileOffset = TranslateAddr(offset, true);
+ switch(Companion::Instance->GetCurrCompressionType()) {
+ case CompressionType::MIO0: {
+ const auto fileOffset = TranslateAddr(offset, true);
offset = ASSET_PTR(offset);
auto decoded = Decode(buffer, fileOffset, CompressionType::MIO0);
@@ -60,15 +57,12 @@ DecompressedData Decompressor::AutoDecode(YAML::Node& node, std::vector<uint8_t>
}
case CompressionType::YAY0:
throw std::runtime_error("Found compressed yay0 segment.\nDecompression of yay0 has not been implemented yet.");
- break;
case CompressionType::YAZ0:
throw std::runtime_error("Found compressed yaz0 segment.\nDecompression of yaz0 has not been implemented yet.");
- break;
- case CompressionType::None:
- {
- auto fileOffset = TranslateAddr(offset);
+ case CompressionType::None: {
+ const auto fileOffset = TranslateAddr(offset);
- auto size = node["size"] ? node["size"].as<size_t>() : manualSize.value_or(buffer.size() - fileOffset);
+ const auto size = node["size"] ? node["size"].as<size_t>() : manualSize.value_or(buffer.size() - fileOffset);
return {
.root = nullptr,
@@ -80,6 +74,13 @@ DecompressedData Decompressor::AutoDecode(YAML::Node& node, std::vector<uint8_t>
throw std::runtime_error("Auto decode could not find a compression type nor uncompressed segment.\nThis is one of those issues that should never really happen.");
}
+DecompressedData Decompressor::AutoDecodeByOffset(uint32_t offset, size_t size, std::vector<uint8_t>& buffer) {
+ YAML::Node node;
+ node["offset"] = offset;
+ node["size"] = size;
+ return AutoDecode(node, buffer);
+}
+
uint32_t Decompressor::TranslateAddr(uint32_t addr, bool baseAddress){
if(IS_SEGMENTED(addr)){
const auto segment = Companion::Instance->GetFileOffsetFromSegmentedAddr(SEGMENT_NUMBER(addr));
diff --git a/src/utils/Decompressor.h b/src/utils/Decompressor.h
index 0cb5a01..093b12c 100644
--- a/src/utils/Decompressor.h
+++ b/src/utils/Decompressor.h
@@ -1,5 +1,6 @@
#pragma once
+#include <BinaryReader.h>
#include <vector>
#include <cstdint>
#include <unordered_map>
@@ -23,12 +24,17 @@ struct DataChunk {
struct DecompressedData {
DataChunk* root;
DataChunk segment;
+
+ LUS::BinaryReader GetReader() const {
+ return LUS::BinaryReader(segment.data, segment.size);
+ }
};
class Decompressor {
public:
static DataChunk* Decode(const std::vector<uint8_t>& buffer, uint32_t offset, CompressionType type);
static DecompressedData AutoDecode(YAML::Node& node, std::vector<uint8_t>& buffer, std::optional<size_t> size = std::nullopt);
+ static DecompressedData AutoDecodeByOffset(uint32_t offset, size_t size, std::vector<uint8_t>& buffer);
static uint32_t TranslateAddr(uint32_t addr, bool baseAddress = false);
static bool IsSegmented(uint32_t addr);