| @@ -0,0 +1,128 @@ | |||||
| #!/usr/bin/env python | |||||
| import os, numpy, sys | |||||
| import Image | |||||
| # ----------------------------------------------------- | |||||
| def png2rgba(namespace, filenames): | |||||
| fdH = open("%s.hpp" % namespace, "w") | |||||
| fdH.write("/* (Auto-generated binary data file). */\n") | |||||
| fdH.write("\n") | |||||
| fdH.write("#ifndef BINARY_%s_HPP\n" % namespace.upper()) | |||||
| fdH.write("#define BINARY_%s_HPP\n" % namespace.upper()) | |||||
| fdH.write("\n") | |||||
| fdH.write("namespace %s\n" % namespace) | |||||
| fdH.write("{\n") | |||||
| fdC = open("%s.cpp" % namespace, "w") | |||||
| fdC.write("/* (Auto-generated binary data file). */\n") | |||||
| fdC.write("\n") | |||||
| fdC.write("#include \"%s.hpp\"\n" % namespace) | |||||
| fdC.write("\n") | |||||
| tempIndex = 1 | |||||
| for filename in filenames: | |||||
| shortFilename = filename.rsplit(os.sep, 1)[-1].split(".", 1)[0] | |||||
| shortFilename = shortFilename.replace("-", "_") | |||||
| png = Image.open(filename) | |||||
| pngNumpy = numpy.array(png) | |||||
| pngData = pngNumpy.tolist() | |||||
| pngData.reverse() | |||||
| height = len(pngData) | |||||
| for dataBlock in pngData: | |||||
| width = len(dataBlock) | |||||
| channels = len(dataBlock[0]) | |||||
| break | |||||
| else: | |||||
| print("Invalid image found, cannot continue!") | |||||
| quit() | |||||
| if channels not in (3, 4): | |||||
| print("Invalid image channel count, cannot continue!") | |||||
| quit() | |||||
| print("Generating data for \"%s\" using '%s' type" % (filename, "GL_BGR" if channels == 3 else "GL_BGRA")) | |||||
| #print(" Width: %i" % width) | |||||
| #print(" Height: %i" % height) | |||||
| #print(" DataSize: %i" % (width * height * channels)) | |||||
| fdH.write(" extern const char* %sData;\n" % shortFilename) | |||||
| fdH.write(" const unsigned int %sDataSize = %i;\n" % (shortFilename, width * height * channels)) | |||||
| fdH.write(" const unsigned int %sWidth = %i;\n" % (shortFilename, width)) | |||||
| fdH.write(" const unsigned int %sHeight = %i;\n" % (shortFilename, height)) | |||||
| if tempIndex != len(filenames): | |||||
| fdH.write("\n") | |||||
| fdC.write("static const unsigned char temp%i[] = {\n" % tempIndex) | |||||
| curColumn = 1 | |||||
| fdC.write(" ") | |||||
| for dataBlock in pngData: | |||||
| if curColumn == 0: | |||||
| fdC.write(" ") | |||||
| for data in dataBlock: | |||||
| if channels == 3: | |||||
| r, g, b = data | |||||
| fdC.write(" %3u, %3u, %3u," % (b, g, r)) | |||||
| else: | |||||
| r, g, b, a = data | |||||
| #a -= 100 | |||||
| #if a < 0: a = 0 | |||||
| fdC.write(" %3u, %3u, %3u, %3u," % (b, g, r, a)) | |||||
| if curColumn > 20: | |||||
| fdC.write("\n ") | |||||
| curColumn = 1 | |||||
| else: | |||||
| curColumn += 1 | |||||
| fdC.write("};\n") | |||||
| fdC.write("const char* %s::%sData = (const char*)temp%i;\n" % (namespace, shortFilename, tempIndex)) | |||||
| if tempIndex != len(filenames): | |||||
| fdC.write("\n") | |||||
| tempIndex += 1 | |||||
| fdH.write("}\n") | |||||
| fdH.write("\n") | |||||
| fdH.write("#endif // BINARY_%s_HPP\n" % namespace.upper()) | |||||
| fdH.write("\n") | |||||
| fdH.close() | |||||
| fdC.write("\n") | |||||
| fdC.close() | |||||
| # ----------------------------------------------------- | |||||
| if __name__ == '__main__': | |||||
| if len(sys.argv) != 3: | |||||
| print("Usage: %s <namespace> <artwork-folder>" % sys.argv[0]) | |||||
| quit() | |||||
| namespace = sys.argv[1] | |||||
| artFolder = sys.argv[2] | |||||
| if not os.path.exists(artFolder): | |||||
| print("Folder '%s' does not exist" % artFolder) | |||||
| quit() | |||||
| # find png files | |||||
| pngFiles = [] | |||||
| for root, dirs, files in os.walk(artFolder): | |||||
| for name in [name for name in files if name.lower().endswith(".png")]: | |||||
| pngFiles.append(os.path.join(root, name)) | |||||
| pngFiles.sort() | |||||
| # create code now | |||||
| png2rgba(namespace, pngFiles) | |||||