| #!/usr/bin/python |
| import sys |
| import os |
| import os.path |
| import re |
| import array |
| |
| USAGE = """png2c - Embed a PNG in a C header file (like XPM) |
| Usage: png2c [file ..] Convert all the file <file.png> to <file.png.h>""" |
| |
| if len(sys.argv) < 2: |
| print USAGE |
| sys.exit(1) |
| |
| r = re.compile("^([a-zA-Z._][a-zA-Z._0-9]*)[.][pP][nN][gG]$") |
| |
| for path in sys.argv[1:]: |
| filename = os.path.basename(path) |
| m = r.match(filename) |
| # Allow only filenames that make sense |
| # as C variable names |
| if not(m): |
| print "Skipped file (unsuitable filename): " + filename |
| continue |
| |
| # Read PNG file as character array |
| bytes = array.array('B', open(path, "rb").read()) |
| count = len(bytes) |
| |
| # Create the C header |
| text = "/* %s - %d bytes */\n" \ |
| "static const unsigned char %s_png[] = {\n" % (filename, count, m.group(1)) |
| |
| # Iterate the characters, we want |
| # lines like: |
| # 0x01, 0x02, .... (8 values per line maximum) |
| i = 0 |
| count = len(bytes) |
| for byte in bytes: |
| # Every new line starts with two whitespaces |
| if (i % 8) == 0: |
| text += " " |
| # Then the hex data (up to 8 values per line) |
| text += "0x%02x" % (byte) |
| # Separate all but the last values |
| if (i + 1) < count: |
| text += ", " |
| if (i % 8) == 7: |
| text += '\n' |
| i += 1 |
| |
| # Now conclude the C source |
| text += "};\n/* End Of File */\n" |
| |
| open(filename + ".h", 'w').write(text) |