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 namespace RLEZ
{ {
inline std::vector<uint8_t> Decompress(const std::vector<uint8_t>& input) inline std::vector<uint8_t> Decompress( const std::vector<uint8_t> &input )
{ {
std::vector<uint8_t> output; std::vector< uint8_t > output;
size_t read = 0; size_t read = 0;
while (read < input.size()) while( read < input.size() )
{ {
uint8_t byte = input[read++]; uint8_t byte = input[ read++ ];
output.push_back(byte); output.push_back( byte );
if (byte == 0x00) if( byte == 0x00 )
{ {
if (read >= input.size()) if( read >= input.size() )
{ {
break; break;
} }
uint8_t count = input[read++]; uint8_t count = input[ read++ ];
output.insert(output.end(), count, 0x00); output.insert( output.end(), count, 0x00 );
} }
} }
return output; return output;
} }
inline std::vector<uint8_t> Compress(const std::vector<uint8_t>& input) inline std::vector<uint8_t> Compress( const std::vector<uint8_t> &input )
{ {
std::vector<uint8_t> output; std::vector< uint8_t > output;
size_t i = 0; size_t i = 0;
while (i < input.size()) while( i < input.size() )
{ {
if (input[i] != 0x00) if( input[ i ] != 0x00 )
{ {
output.push_back(input[i]); output.push_back( input[ i ] );
++i; ++i;
} }
else else
{ {
// Start of a zero run — count how many consecutive 0x00s size_t zeroCount = 0;
size_t zeroCount = 0; i++;
size_t start = i;
while (i < input.size() && input[i] == 0x00 && zeroCount < 255) // Count all proceeding 00's
{ while( i < input.size() && input[ i ] == 0x00 && zeroCount < 255 )
++i; {
++zeroCount; ++i;
} ++zeroCount;
}
// Emit zero-run marker and count (DO NOT emit any 0x00s literally) output.push_back( 0x00 );
output.push_back(0x00); output.push_back( static_cast< uint8_t >( zeroCount ) );
output.push_back(static_cast<uint8_t>(zeroCount)); }
} }
}
return output; return output;
} }
} }