mirror of
https://github.com/cuberite/libdeflate.git
synced 2025-08-03 17:56:17 -04:00

Reduce the memory usage of compression levels 1-9 by using the condensed offset slot map instead of the full one.
42 lines
1.4 KiB
Python
Executable File
42 lines
1.4 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
#
|
|
# This script generates the deflate_offset_slot[] array, which is a condensed
|
|
# map from offsets to offset slots.
|
|
|
|
DEFLATE_OFFSET_SLOT_BASE = [
|
|
1 , 2 , 3 , 4 , 5 , 7 , 9 , 13 ,
|
|
17 , 25 , 33 , 49 , 65 , 97 , 129 , 193 ,
|
|
257 , 385 , 513 , 769 , 1025 , 1537 , 2049 , 3073 ,
|
|
4097 , 6145 , 8193 , 12289 , 16385 , 24577 ,
|
|
]
|
|
|
|
DEFLATE_EXTRA_OFFSET_BITS = [
|
|
0 , 0 , 0 , 0 , 1 , 1 , 2 , 2 ,
|
|
3 , 3 , 4 , 4 , 5 , 5 , 6 , 6 ,
|
|
7 , 7 , 8 , 8 , 9 , 9 , 10 , 10 ,
|
|
11 , 11 , 12 , 12 , 13 , 13 ,
|
|
]
|
|
|
|
offset_slot_map = [0] * 512
|
|
|
|
for offset_slot, offset_base in enumerate(DEFLATE_OFFSET_SLOT_BASE):
|
|
num_extra_bits = DEFLATE_EXTRA_OFFSET_BITS[offset_slot]
|
|
offset_end = offset_base + (1 << num_extra_bits)
|
|
if offset_base <= 256:
|
|
for offset in range(offset_base, offset_end):
|
|
offset_slot_map[offset] = offset_slot
|
|
else:
|
|
for offset in range(offset_base, offset_end, 128):
|
|
offset_slot_map[256 + ((offset - 1) >> 7)] = offset_slot
|
|
|
|
print('static const u8 deflate_offset_slot_map[512] = {')
|
|
for i in range(0, len(offset_slot_map), 16):
|
|
print('\t', end='')
|
|
for j, v in enumerate(offset_slot_map[i:i+16]):
|
|
print(f'{v},', end='')
|
|
if j == 15:
|
|
print('')
|
|
else:
|
|
print(' ', end='')
|
|
print('};')
|