Fixed Zero Run Length Compression

This commit is contained in:
HikikoMarmy
2025-06-15 23:08:40 +01:00
parent fffbc95b87
commit 8f93287ada

View File

@@ -6,61 +6,60 @@
namespace RLEZ
{
inline std::vector<uint8_t> Decompress(const std::vector<uint8_t>& input)
{
std::vector<uint8_t> output;
size_t read = 0;
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);
while( read < input.size() )
{
uint8_t byte = input[ read++ ];
output.push_back( byte );
if (byte == 0x00)
{
if (read >= input.size())
{
break;
}
if( byte == 0x00 )
{
if( read >= input.size() )
{
break;
}
uint8_t count = input[read++];
output.insert(output.end(), count, 0x00);
}
}
uint8_t count = input[ read++ ];
output.insert( output.end(), count, 0x00 );
}
}
return output;
}
return output;
}
inline std::vector<uint8_t> Compress(const std::vector<uint8_t>& input)
{
std::vector<uint8_t> output;
size_t i = 0;
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() )
{
if( input[ i ] != 0x00 )
{
output.push_back( input[ i ] );
++i;
}
else
{
size_t zeroCount = 0;
i++;
while (i < input.size() && input[i] == 0x00 && zeroCount < 255)
{
++i;
++zeroCount;
}
// Count all proceeding 00's
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));
}
}
output.push_back( 0x00 );
output.push_back( static_cast< uint8_t >( zeroCount ) );
}
}
return output;
}
return output;
}
}