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() 81