Run-length zero compression for RTA.

This commit is contained in:
HikikoMarmy
2025-06-15 00:12:03 +01:00
parent dc2ddb04c4
commit 7963d24393

66
Common/RLEZ.hpp Normal file
View File

@@ -0,0 +1,66 @@
#pragma once
#include <vector>
#include <stdexcept>
#include <cstdint>
namespace RLEZ
{
inline std::vector<uint8_t> Decompress(const std::vector<uint8_t>& input)
{
std::vector<uint8_t> output;
size_t read = 0;
while (read < input.size())
{
uint8_t byte = input[read++];
output.push_back(byte);
if (byte == 0x00)
{
if (read >= input.size())
{
break;
}
uint8_t count = input[read++];
output.insert(output.end(), count, 0x00);
}
}
return output;
}
inline std::vector<uint8_t> Compress(const std::vector<uint8_t>& input)
{
std::vector<uint8_t> output;
size_t i = 0;
while (i < input.size())
{
if (input[i] != 0x00)
{
output.push_back(input[i]);
++i;
}
else
{
// Start of a zero run — count how many consecutive 0x00s
size_t zeroCount = 0;
size_t start = i;
while (i < input.size() && input[i] == 0x00 && zeroCount < 255)
{
++i;
++zeroCount;
}
// Emit zero-run marker and count (DO NOT emit any 0x00s literally)
output.push_back(0x00);
output.push_back(static_cast<uint8_t>(zeroCount));
}
}
return output;
}
}