Mercurial > hg > pub > prymula > com
diff DPF-Prymula-audioplugins/dpf/utils/png2rgba.py @ 3:84e66ea83026
DPF-Prymula-audioplugins-0.231015-2
author | prymula <prymula76@outlook.com> |
---|---|
date | Mon, 16 Oct 2023 21:53:34 +0200 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DPF-Prymula-audioplugins/dpf/utils/png2rgba.py Mon Oct 16 21:53:34 2023 +0200 @@ -0,0 +1,178 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +# DISTRHO Plugin Framework (DPF) +# Copyright (C) 2012-2019 Filipe Coelho <falktx@falktx.com> +# +# Permission to use, copy, modify, and/or distribute this software for any purpose with +# or without fee is hereby granted, provided that the above copyright notice and this +# permission notice appear in all copies. +# +# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD +# TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN +# NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL +# DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER +# IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +import os, numpy, sys +try: + import Image +except: + from PIL import Image + +# ----------------------------------------------------- + +formats = { + 2: "GL_LUMINANCE", + 3: "GL_BGR", + 4: "GL_BGRA" +} + +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) + if png.getpalette(): + png = png.convert() + + pngNumpy = numpy.array(png) + pngData = pngNumpy.tolist() + #pngData.reverse() + + height = len(pngData) + for dataBlock in pngData: + width = len(dataBlock) + if isinstance(dataBlock[0], int): + channels = 2 + else: + channels = len(dataBlock[0]) + break + else: + print("Invalid image found, cannot continue!") + quit() + + if channels not in formats.keys(): + print("Invalid image channel count, cannot continue!") + quit() + + print("Generating data for \"%s\" using '%s' type" % (filename, formats[channels])) + #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_%s_%i[] = {\n" % (shortFilename, tempIndex)) + + curColumn = 1 + fdC.write(" ") + + for dataBlock in pngData: + if curColumn == 0: + fdC.write(" ") + + for data in dataBlock: + if channels == 2: + fdC.write(" %3u," % data) + + elif 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_%s_%i;\n" % (namespace, shortFilename, 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].replace("-","_") + 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)