summaryrefslogtreecommitdiff
path: root/src/addons/GifMaker/godot-gdgifexporter/gdgifexporter/gif-lzw/lsbbitunpacker.gd
diff options
context:
space:
mode:
Diffstat (limited to 'src/addons/GifMaker/godot-gdgifexporter/gdgifexporter/gif-lzw/lsbbitunpacker.gd')
-rw-r--r--src/addons/GifMaker/godot-gdgifexporter/gdgifexporter/gif-lzw/lsbbitunpacker.gd41
1 files changed, 41 insertions, 0 deletions
diff --git a/src/addons/GifMaker/godot-gdgifexporter/gdgifexporter/gif-lzw/lsbbitunpacker.gd b/src/addons/GifMaker/godot-gdgifexporter/gdgifexporter/gif-lzw/lsbbitunpacker.gd
new file mode 100644
index 0000000..9f8507f
--- /dev/null
+++ b/src/addons/GifMaker/godot-gdgifexporter/gdgifexporter/gif-lzw/lsbbitunpacker.gd
@@ -0,0 +1,41 @@
+extends Reference
+
+
+class LSBLZWBitUnpacker:
+ var chunk_stream: PoolByteArray
+ var bit_index: int = 0
+ var byte: int
+ var byte_index: int = 0
+
+ func _init(_chunk_stream: PoolByteArray):
+ chunk_stream = _chunk_stream
+ self.get_byte()
+
+ func get_bit(value: int, index: int) -> int:
+ return (value >> index) & 1
+
+ func set_bit(value: int, index: int) -> int:
+ return value | (1 << index)
+
+ func get_byte():
+ byte = chunk_stream[byte_index]
+ byte_index += 1
+ bit_index = 0
+
+ func read_bits(bits_count: int) -> int:
+ var result: int = 0
+ var result_bit_index: int = 0
+
+ for _i in range(bits_count):
+ if self.get_bit(byte, bit_index) == 1:
+ result = self.set_bit(result, result_bit_index)
+ result_bit_index += 1
+ bit_index += 1
+
+ if bit_index == 8:
+ self.get_byte()
+
+ return result
+
+ func remove_bits(bits_count: int) -> void:
+ self.read_bits(bits_count)