res2c.py (3839B)
1 #!/usr/bin/env python3 2 # -*- coding: utf-8 -*- 3 4 # DISTRHO Plugin Framework (DPF) 5 # Copyright (C) 2012-2019 Filipe Coelho <falktx@falktx.com> 6 # 7 # Permission to use, copy, modify, and/or distribute this software for any purpose with 8 # or without fee is hereby granted, provided that the above copyright notice and this 9 # permission notice appear in all copies. 10 # 11 # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD 12 # TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN 13 # NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL 14 # DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER 15 # IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 16 # CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17 18 import os, sys 19 20 # ----------------------------------------------------- 21 22 def res2c(namespace, filenames): 23 24 fdH = open("%s.hpp" % namespace, "w") 25 fdH.write("/* (Auto-generated binary data file). */\n") 26 fdH.write("\n") 27 fdH.write("#ifndef BINARY_%s_HPP\n" % namespace.upper()) 28 fdH.write("#define BINARY_%s_HPP\n" % namespace.upper()) 29 fdH.write("\n") 30 fdH.write("namespace %s\n" % namespace) 31 fdH.write("{\n") 32 33 fdC = open("%s.cpp" % namespace, "w") 34 fdC.write("/* (Auto-generated binary data file). */\n") 35 fdC.write("\n") 36 fdC.write("#include \"%s.hpp\"\n" % namespace) 37 fdC.write("\n") 38 39 tempIndex = 1 40 41 for filename in filenames: 42 shortFilename = filename.rsplit(os.sep, 1)[-1].split(".", 1)[0] 43 shortFilename = shortFilename.replace("-", "_").replace("@","_") 44 45 resData = open(filename, 'rb').read() 46 47 print("Generating data for \"%s\"" % (filename)) 48 49 fdH.write(" extern const unsigned char* %sData;\n" % shortFilename) 50 fdH.write(" const unsigned int %sDataSize = %i;\n" % (shortFilename, len(resData))) 51 52 if tempIndex != len(filenames): 53 fdH.write("\n") 54 55 fdC.write("static const unsigned char temp_%s_%i[] = {\n" % (shortFilename, tempIndex)) 56 57 curColumn = 1 58 fdC.write(" ") 59 60 for data in resData: 61 if curColumn == 0: 62 fdC.write(" ") 63 64 fdC.write(" %3u," % data) 65 66 if curColumn > 20: 67 fdC.write("\n ") 68 curColumn = 1 69 else: 70 curColumn += 1 71 72 fdC.write("};\n") 73 fdC.write("const unsigned char* %s::%sData = (const unsigned char*)temp_%s_%i;\n" % (namespace, shortFilename, shortFilename, tempIndex)) 74 75 if tempIndex != len(filenames): 76 fdC.write("\n") 77 78 tempIndex += 1 79 80 fdH.write("}\n") 81 fdH.write("\n") 82 fdH.write("#endif // BINARY_%s_HPP\n" % namespace.upper()) 83 fdH.write("\n") 84 fdH.close() 85 86 fdC.write("\n") 87 fdC.close() 88 89 # ----------------------------------------------------- 90 91 if __name__ == '__main__': 92 if len(sys.argv) not in (3, 4): 93 print("Usage: %s <namespace> <resource-folder> [output-folder=$CWD]" % sys.argv[0]) 94 quit() 95 96 namespace = sys.argv[1].replace("-","_") 97 resFolder = sys.argv[2] 98 outFolder = sys.argv[3] if len(sys.argv) == 4 else None 99 100 if not os.path.exists(resFolder): 101 print("Folder '%s' does not exist" % resFolder) 102 quit() 103 104 if outFolder is not None and not os.path.exists(outFolder): 105 print("Output folder '%s' does not exist" % outFolder) 106 quit() 107 108 # find resource files 109 resFiles = [] 110 111 for root, dirs, files in os.walk(resFolder): 112 for name in files: 113 resFiles.append(os.path.abspath(os.path.join(root, name))) 114 115 resFiles.sort() 116 117 if outFolder is not None: 118 os.chdir(outFolder) 119 120 # create code now 121 res2c(namespace, resFiles)