You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
80 lines
2.5 KiB
80 lines
2.5 KiB
#!/usr/bin/python |
|
|
|
''' |
|
Copyright 2015 Google Inc. |
|
|
|
Use of this source code is governed by a BSD-style license that can be |
|
found in the LICENSE file. |
|
''' |
|
|
|
import argparse |
|
|
|
|
|
def bytes_from_file(f, chunksize=8192): |
|
while True: |
|
chunk = f.read(chunksize) |
|
if chunk: |
|
for b in chunk: |
|
yield ord(b) |
|
else: |
|
break |
|
|
|
|
|
def main(): |
|
parser = argparse.ArgumentParser( |
|
formatter_class=argparse.RawDescriptionHelpFormatter, |
|
description='Convert resource files to embedded read only data.', |
|
epilog='''The output (when compiled and linked) can be used as: |
|
struct SkEmbeddedResource {const uint8_t* data; const size_t size;}; |
|
struct SkEmbeddedHeader {const SkEmbeddedResource* entries; const int count;}; |
|
extern "C" SkEmbeddedHeader const NAME;''') |
|
parser.add_argument('--align', default=1, type=int, |
|
help='minimum alignment (in bytes) of resource data') |
|
parser.add_argument('--name', default='_resource', type=str, |
|
help='the name of the c identifier to export') |
|
parser.add_argument('--input', required=True, type=argparse.FileType('rb'), |
|
nargs='+', help='list of resource files to embed') |
|
parser.add_argument('--output', required=True, type=argparse.FileType('w'), |
|
help='the name of the cpp file to output') |
|
args = parser.parse_args() |
|
|
|
out = args.output.write; |
|
out('#include "SkTypes.h"\n') |
|
|
|
# Write the resources. |
|
index = 0 |
|
for f in args.input: |
|
out('static const uint8_t resource{0:d}[] SK_STRUCT_ALIGN({1:d}) = {{\n' |
|
.format(index, args.align)) |
|
bytes_written = 0 |
|
bytes_on_line = 0 |
|
for b in bytes_from_file(f): |
|
out(hex(b) + ',') |
|
bytes_written += 1 |
|
bytes_on_line += 1 |
|
if bytes_on_line >= 32: |
|
out('\n') |
|
bytes_on_line = 0 |
|
out('};\n') |
|
out('static const size_t resource{0:d}_size = {1:d};\n' |
|
.format(index, bytes_written)) |
|
index += 1 |
|
|
|
# Write the resource entries. |
|
out('struct SkEmbeddedResource { const uint8_t* d; const size_t s; };\n') |
|
out('static const SkEmbeddedResource header[] = {\n') |
|
index = 0 |
|
for f in args.input: |
|
out(' {{ resource{0:d}, resource{0:d}_size }},\n'.format(index)) |
|
index += 1 |
|
out('};\n') |
|
out('static const int header_count = {0:d};\n'.format(index)) |
|
|
|
# Export the resource header. |
|
out('struct SkEmbeddedHeader {const SkEmbeddedResource* e; const int c;};\n') |
|
out('extern "C" const SkEmbeddedHeader {0:s} = {{ header, header_count }};\n' |
|
.format(args.name)) |
|
|
|
|
|
if __name__ == "__main__": |
|
main()
|
|
|