32 lines
590 B
GDScript3
32 lines
590 B
GDScript3
|
|
@tool
|
||
|
|
extends RefCounted
|
||
|
|
|
||
|
|
class LSBLZWBitPacker:
|
||
|
|
var bit_index: int = 0
|
||
|
|
var stream: int = 0
|
||
|
|
|
||
|
|
var chunks: PackedByteArray = PackedByteArray([])
|
||
|
|
|
||
|
|
func put_byte():
|
||
|
|
chunks.append(stream & 0xff)
|
||
|
|
bit_index -= 8
|
||
|
|
stream >>= 8
|
||
|
|
|
||
|
|
func write_bits(value: int, bits_count: int) -> void:
|
||
|
|
value &= (1 << bits_count) - 1
|
||
|
|
value <<= bit_index
|
||
|
|
stream |= value
|
||
|
|
bit_index += bits_count
|
||
|
|
while bit_index >= 8:
|
||
|
|
put_byte()
|
||
|
|
|
||
|
|
func pack() -> PackedByteArray:
|
||
|
|
if bit_index != 0:
|
||
|
|
put_byte()
|
||
|
|
return chunks
|
||
|
|
|
||
|
|
func reset() -> void:
|
||
|
|
bit_index = 0
|
||
|
|
stream = 0
|
||
|
|
chunks = PackedByteArray([])
|