DISTRHO Plugin Framework
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

158 lines
4.8KB

  1. #!/usr/bin/env python
  2. import os, numpy, sys
  3. import Image
  4. # -----------------------------------------------------
  5. formats = {
  6. 2: "GL_LUMINANCE",
  7. 3: "GL_BGR",
  8. 4: "GL_BGRA"
  9. }
  10. def png2rgba(namespace, filenames):
  11. fdH = open("%s.hpp" % namespace, "w")
  12. fdH.write("/* (Auto-generated binary data file). */\n")
  13. fdH.write("\n")
  14. fdH.write("#ifndef BINARY_%s_HPP\n" % namespace.upper())
  15. fdH.write("#define BINARY_%s_HPP\n" % namespace.upper())
  16. fdH.write("\n")
  17. fdH.write("namespace %s\n" % namespace)
  18. fdH.write("{\n")
  19. fdC = open("%s.cpp" % namespace, "w")
  20. fdC.write("/* (Auto-generated binary data file). */\n")
  21. fdC.write("\n")
  22. fdC.write("#include \"%s.hpp\"\n" % namespace)
  23. fdC.write("\n")
  24. tempIndex = 1
  25. for filename in filenames:
  26. shortFilename = filename.rsplit(os.sep, 1)[-1].split(".", 1)[0]
  27. shortFilename = shortFilename.replace("-", "_")
  28. png = Image.open(filename)
  29. pngNumpy = numpy.array(png)
  30. pngData = pngNumpy.tolist()
  31. #pngData.reverse()
  32. height = len(pngData)
  33. for dataBlock in pngData:
  34. width = len(dataBlock)
  35. if isinstance(dataBlock[0], int):
  36. channels = 2
  37. else:
  38. channels = len(dataBlock[0])
  39. break
  40. else:
  41. print("Invalid image found, cannot continue!")
  42. quit()
  43. if channels not in formats.keys():
  44. print("Invalid image channel count, cannot continue!")
  45. quit()
  46. print("Generating data for \"%s\" using '%s' type" % (filename, formats[channels]))
  47. #print(" Width: %i" % width)
  48. #print(" Height: %i" % height)
  49. #print(" DataSize: %i" % (width * height * channels))
  50. fdH.write(" extern const char* %sData;\n" % shortFilename)
  51. fdH.write(" const unsigned int %sDataSize = %i;\n" % (shortFilename, width * height * channels))
  52. fdH.write(" const unsigned int %sWidth = %i;\n" % (shortFilename, width))
  53. fdH.write(" const unsigned int %sHeight = %i;\n" % (shortFilename, height))
  54. if tempIndex != len(filenames):
  55. fdH.write("\n")
  56. fdC.write("static const unsigned char temp_%s_%i[] = {\n" % (shortFilename, tempIndex))
  57. curColumn = 1
  58. fdC.write(" ")
  59. for dataBlock in pngData:
  60. if curColumn == 0:
  61. fdC.write(" ")
  62. for data in dataBlock:
  63. if channels == 2:
  64. fdC.write(" %3u," % data)
  65. elif channels == 3:
  66. r, g, b = data
  67. fdC.write(" %3u, %3u, %3u," % (b, g, r))
  68. else:
  69. r, g, b, a = data
  70. if filename in ("artwork/claw1.png",
  71. "artwork/claw2.png",
  72. "artwork/run1.png",
  73. "artwork/run2.png",
  74. "artwork/run3.png",
  75. "artwork/run4.png",
  76. "artwork/scratch1.png",
  77. "artwork/scratch2.png",
  78. "artwork/sit.png",
  79. "artwork/tail.png"):
  80. if r == 255:
  81. a -= 38
  82. if a < 0: a = 0
  83. #a = 0
  84. #else:
  85. #r = g = b = 255
  86. fdC.write(" %3u, %3u, %3u, %3u," % (b, g, r, a))
  87. if curColumn > 20:
  88. fdC.write("\n ")
  89. curColumn = 1
  90. else:
  91. curColumn += 1
  92. fdC.write("};\n")
  93. fdC.write("const char* %s::%sData = (const char*)temp_%s_%i;\n" % (namespace, shortFilename, shortFilename, tempIndex))
  94. if tempIndex != len(filenames):
  95. fdC.write("\n")
  96. tempIndex += 1
  97. fdH.write("}\n")
  98. fdH.write("\n")
  99. fdH.write("#endif // BINARY_%s_HPP\n" % namespace.upper())
  100. fdH.write("\n")
  101. fdH.close()
  102. fdC.write("\n")
  103. fdC.close()
  104. # -----------------------------------------------------
  105. if __name__ == '__main__':
  106. if len(sys.argv) != 3:
  107. print("Usage: %s <namespace> <artwork-folder>" % sys.argv[0])
  108. quit()
  109. namespace = sys.argv[1]
  110. artFolder = sys.argv[2]
  111. if not os.path.exists(artFolder):
  112. print("Folder '%s' does not exist" % artFolder)
  113. quit()
  114. # find png files
  115. pngFiles = []
  116. for root, dirs, files in os.walk(artFolder):
  117. for name in [name for name in files if name.lower().endswith(".png")]:
  118. pngFiles.append(os.path.join(root, name))
  119. pngFiles.sort()
  120. # create code now
  121. png2rgba(namespace, pngFiles)