1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 20:47:45 +00:00

LibCompress: Refactor LZMA model property decoding into a static helper

This commit is contained in:
Tim Schumacher 2023-03-14 02:36:03 +01:00 committed by Andreas Kling
parent 52d9fc92f1
commit 04f69de7f1
2 changed files with 26 additions and 19 deletions

View file

@ -39,7 +39,7 @@ Optional<u64> LzmaHeader::uncompressed_size() const
return uncompressed_size;
}
ErrorOr<void> LzmaHeader::decode_model_properties(u8& literal_context_bits, u8& literal_pos_bits, u8& pos_bits) const
ErrorOr<LzmaModelProperties> LzmaHeader::decode_model_properties(u8 input_bits)
{
// "Decodes the following values from the encoded model properties field:
//
@ -50,34 +50,35 @@ ErrorOr<void> LzmaHeader::decode_model_properties(u8& literal_context_bits, u8&
//
// Encoded using `((pb * 5 + lp) * 9 + lc)`."
u8 input_bits = m_model_properties;
if (input_bits >= (9 * 5 * 5))
return Error::from_string_literal("Encoded model properties value is larger than the highest possible value");
literal_context_bits = input_bits % 9;
u8 literal_context_bits = input_bits % 9;
input_bits /= 9;
VERIFY(literal_context_bits >= 0 && literal_context_bits <= 8);
literal_pos_bits = input_bits % 5;
u8 literal_position_bits = input_bits % 5;
input_bits /= 5;
VERIFY(literal_position_bits >= 0 && literal_position_bits <= 4);
pos_bits = input_bits;
u8 position_bits = input_bits;
VERIFY(position_bits >= 0 && position_bits <= 4);
return {};
return LzmaModelProperties {
.literal_context_bits = literal_context_bits,
.literal_position_bits = literal_position_bits,
.position_bits = position_bits,
};
}
ErrorOr<LzmaDecompressorOptions> LzmaHeader::as_decompressor_options() const
{
u8 literal_context_bits { 0 };
u8 literal_position_bits { 0 };
u8 position_bits { 0 };
auto model_properties = TRY(decode_model_properties(m_encoded_model_properties));
TRY(decode_model_properties(literal_context_bits, literal_position_bits, position_bits));
return LzmaDecompressorOptions {
.literal_context_bits = literal_context_bits,
.literal_position_bits = literal_position_bits,
.position_bits = position_bits,
return Compress::LzmaDecompressorOptions {
.literal_context_bits = model_properties.literal_context_bits,
.literal_position_bits = model_properties.literal_position_bits,
.position_bits = model_properties.position_bits,
.dictionary_size = dictionary_size(),
.uncompressed_size = uncompressed_size(),
};