Index: remoting/tools/build/shader_to_header.py |
diff --git a/remoting/tools/build/shader_to_header.py b/remoting/tools/build/shader_to_header.py |
new file mode 100755 |
index 0000000000000000000000000000000000000000..309c58c88d984e23a085784484bfca2bd0acaadb |
--- /dev/null |
+++ b/remoting/tools/build/shader_to_header.py |
@@ -0,0 +1,96 @@ |
+#!/usr/bin/python |
+# Copyright 2016 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+"""Helper script to inline files as const char[] into a C header file. |
+ |
+Example: |
+ |
+Input file in_a.vert: |
+1" |
+2 |
+3\ |
+ |
+Input file in_b.frag: |
+4 |
+5 |
+6 |
+ |
+shader_to_header.py "output.h" "in_a.vert" "in_b.frag" will generate this: |
+ |
+#ifndef OUTPUT_H_BSGN3bbEMBDD0ucC |
+#define OUTPUT_H_BSGN3bbEMBDD0ucC |
+ |
+const char kInAVert[] = "1\"\n2\n3\\\n"; |
+ |
+const char kInBFrag[] = "4\n5\n6\n"; |
+ |
+#endif // OUTPUT_H_BSGN3bbEMBDD0ucC |
+ |
+ |
+""" |
+ |
+import os.path |
+import random |
+import string |
+import sys |
+ |
+RANDOM_STRING_LENGTH = 16 |
+STRING_CHARACTERS = (string.ascii_uppercase + |
+ string.ascii_lowercase + |
+ string.digits) |
+ |
+def random_str(): |
+ return ''.join(random.choice(STRING_CHARACTERS) |
Lambros
2016/06/06 21:17:46
drive-by:
How much do we trust Python's 'random'
|
+ for _ in range(RANDOM_STRING_LENGTH)) |
+ |
+ |
+def escape_text(line): |
+ # encode('string-escape') doesn't escape double quote so you need to manually |
+ # escape it. |
+ return line.encode('string-escape').replace('"', '\\"') |
+ |
+ |
+def main(): |
+ if len(sys.argv) < 3: |
+ print 'Usage: shader_to_header.py <output-file> <input-files...>' |
+ return 1 |
+ |
+ output_path = sys.argv[1] |
+ include_guard = (os.path.basename(output_path).upper().replace('.', '_') + |
+ '_' + random_str()) |
+ |
+ with open(output_path, 'w') as output_file: |
+ output_file.write('#ifndef ' + include_guard + '\n' + |
+ '#define ' + include_guard + '\n\n') |
+ |
+ existing_names = set() |
+ argc = len(sys.argv) |
+ for i in xrange(2, argc): |
+ input_path = sys.argv[i] |
+ |
+ with open(input_path, 'r') as input_file: |
+ # hello_world.vert -> kHelloWorldVert |
+ const_name = ('k' + os.path.basename(input_path).title() |
+ .replace('_', '').replace('.', '')) |
+ if const_name in existing_names: |
+ print >> sys.stderr, ('Error: Constant name ' + const_name + |
+ ' is already used by a previous file. Files with the same' + |
+ ' name can\'t be inlined into the same header.') |
+ return 1 |
+ |
+ existing_names.add(const_name) |
+ text = input_file.read() |
+ |
+ inlined = ('const char ' + const_name + '[] = "' + escape_text(text) + |
+ '";\n\n'); |
+ output_file.write(inlined) |
+ |
+ output_file.write('#endif // ' + include_guard + '\n') |
+ |
+ return 0 |
+ |
+ |
+if __name__ == '__main__': |
+ sys.exit(main()) |