OLD | NEW |
(Empty) | |
| 1 #!/usr/bin/python |
| 2 |
| 3 ''' |
| 4 Copyright 2015 Google Inc. |
| 5 |
| 6 Use of this source code is governed by a BSD-style license that can be |
| 7 found in the LICENSE file. |
| 8 ''' |
| 9 |
| 10 import argparse |
| 11 |
| 12 |
| 13 def bytes_from_file(f, chunksize=8192): |
| 14 while True: |
| 15 chunk = f.read(chunksize) |
| 16 if chunk: |
| 17 for b in chunk: |
| 18 yield ord(b) |
| 19 else: |
| 20 break |
| 21 |
| 22 |
| 23 def main(): |
| 24 parser = argparse.ArgumentParser( |
| 25 formatter_class=argparse.RawDescriptionHelpFormatter, |
| 26 description='Convert resource files to embedded read only data.', |
| 27 epilog='''The output (when compiled and linked) can be used as: |
| 28 struct SkEmbeddedResource {const uint8_t* data; const size_t size;}; |
| 29 struct SkEmbeddedHeader {const SkEmbeddedResource* entries; const int count;}; |
| 30 extern "C" SkEmbeddedHeader const NAME;''') |
| 31 parser.add_argument('--align', default=1, type=int, |
| 32 help='minimum alignment (in bytes) of resource data') |
| 33 parser.add_argument('--name', default='_resource', type=str, |
| 34 help='the name of the c identifier to export') |
| 35 parser.add_argument('--input', required=True, type=argparse.FileType('rb'), |
| 36 nargs='+', help='list of resource files to embed') |
| 37 parser.add_argument('--output', required=True, type=argparse.FileType('w'), |
| 38 help='the name of the cpp file to output') |
| 39 args = parser.parse_args() |
| 40 |
| 41 out = args.output.write; |
| 42 out('#include "SkTypes.h"\n') |
| 43 |
| 44 # Write the resources. |
| 45 index = 0 |
| 46 for f in args.input: |
| 47 out('static const uint8_t resource{0:d}[] SK_STRUCT_ALIGN({1:d}) = {{\n' |
| 48 .format(index, args.align)) |
| 49 bytes_written = 0 |
| 50 bytes_on_line = 0 |
| 51 for b in bytes_from_file(f): |
| 52 out(hex(b) + ',') |
| 53 bytes_written += 1 |
| 54 bytes_on_line += 1 |
| 55 if bytes_on_line >= 32: |
| 56 out('\n') |
| 57 bytes_on_line = 0 |
| 58 out('};\n') |
| 59 out('static const size_t resource{0:d}_size = {1:d};\n' |
| 60 .format(index, bytes_written)) |
| 61 index += 1 |
| 62 |
| 63 # Write the resource entries. |
| 64 out('struct SkEmbeddedResource { const uint8_t* d; const size_t s; };\n') |
| 65 out('static const SkEmbeddedResource header[] = {\n') |
| 66 index = 0 |
| 67 for f in args.input: |
| 68 out(' {{ resource{0:d}, resource{0:d}_size }},\n'.format(index)) |
| 69 index += 1 |
| 70 out('};\n') |
| 71 out('static const int header_count = {0:d};\n'.format(index)) |
| 72 |
| 73 # Export the resource header. |
| 74 out('struct SkEmbeddedHeader {const SkEmbeddedResource* e; const int c;};\n') |
| 75 out('extern "C" const SkEmbeddedHeader {0:s} = {{ header, header_count }};\n' |
| 76 .format(args.name)) |
| 77 |
| 78 |
| 79 if __name__ == "__main__": |
| 80 main() |
OLD | NEW |