| #!/usr/bin/env python3 |
| |
| import argparse |
| import os |
| import re |
| |
| def format_hex(data): |
| return ', '.join(['0x{:02x}'.format(x) for x in data]) |
| |
| if __name__ == '__main__': |
| parser = argparse.ArgumentParser() |
| parser.add_argument('--base-path', action='append', type=str) |
| parser.add_argument('--inline-data', action='store_true', help='embed data as an array in assets.cpp') |
| parser.add_argument('files', nargs='+', type=str, help='input files') |
| args = parser.parse_args() |
| |
| bin_out = open('assets.bin', 'wb') |
| cpp_out = open('assets.cpp', 'w') |
| hpp_out = open('assets.hpp', 'w') |
| |
| hpp_out.write('#pragma once\n\n') |
| hpp_out.write('#include "engine/asset.hpp"\n\n') |
| |
| cpp_out.write('#include <cstdint>\n\n') |
| cpp_out.write('#include "assets.hpp"\n\n') |
| cpp_out.write('extern const uint8_t _binary_assets_bin_start[];\n\n') |
| |
| for file in args.files: |
| offset = bin_out.tell() |
| length = os.stat(file).st_size |
| |
| # tidy up name |
| name = file |
| for base_path in args.base_path: |
| if file.startswith(base_path): |
| name = os.path.relpath(file, base_path) |
| |
| name = os.path.splitext(name)[0] |
| name = name.replace('../', '') |
| name = re.sub('[^0-9A-Za-z_]', '_', name) |
| |
| bin_out.write(open(file, 'rb').read()) |
| hpp_out.write('extern const blit::Asset asset_{};\n'.format(name)) |
| |
| cpp_out.write('const blit::Asset asset_{}(_binary_assets_bin_start + {}, {});\n'.format(name, offset, length)) |
| |
| |
| if args.inline_data: |
| bin_out.close() |
| bin_out = open('assets.bin', 'rb') |
| |
| data = bin_out.read(); |
| |
| cpp_out.write('\nconst uint8_t _binary_assets_bin_start[] = {\n\t'); |
| cpp_out.write(format_hex(data)) |
| cpp_out.write('};\n'); |