|
- #!/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
-
- if filename in ("artwork/claw1.png",
- "artwork/claw2.png",
- "artwork/run1.png",
- "artwork/run2.png",
- "artwork/run3.png",
- "artwork/run4.png",
- "artwork/scratch1.png",
- "artwork/scratch2.png",
- "artwork/sit.png",
- "artwork/tail.png"):
- if r == 255:
- a -= 38
- if a < 0: a = 0
- #a = 0
- #else:
- #r = g = b = 255
-
- 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)
|