1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- #!/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 "include/core/SkTypes.h"\n')
- # Write the resources.
- index = 0
- for f in args.input:
- out('alignas({1:d}) static const uint8_t resource{0: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()
|