diff options
Diffstat (limited to 'src/addons/GifMaker/GifDecoder.gd')
-rw-r--r-- | src/addons/GifMaker/GifDecoder.gd | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/src/addons/GifMaker/GifDecoder.gd b/src/addons/GifMaker/GifDecoder.gd new file mode 100644 index 0000000..08ccaa9 --- /dev/null +++ b/src/addons/GifMaker/GifDecoder.gd @@ -0,0 +1,44 @@ +extends Node +class_name GifDecoder + +func decode_file(path): + var file = File.new() + file.open(path, File.READ) + var bytes = file.get_buffer(file.get_len()) + file.close() + + return decode_data(bytes) + +func decode_block(block: PoolByteArray, start, end): + var string = block.subarray(start, end).get_string_from_utf8() + if string.begins_with('GIF_MAKER::'): + return str2var(string.substr('GIF_MAKER::'.length(), string.length())) + return string + +func decode_data(bytes: PoolByteArray): + var index = 0 + var start = -1 + var end = -1 + var data = [] + + for byte in bytes: + if start != -1 \ + and byte == 0x21: + end = index - 1 + + data.append(decode_block(bytes, start, end)) + start = -1 + end = -1 + + if byte == 0x21 \ + and index < bytes.size() \ + and bytes[index + 1] == 0xFE: + start = index + 2 + + index += 1 + + if end == -1 and start != -1: + end = bytes.size() - 1 + data.append(decode_block(bytes, start, end)) + + return data |