Index: tools/embed_resources.py |
diff --git a/tools/embed_resources.py b/tools/embed_resources.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..56d59822025c64181ed2d0ae8051f4a8e3732d50 |
--- /dev/null |
+++ b/tools/embed_resources.py |
@@ -0,0 +1,80 @@ |
+#!/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() |