from PIL import Image import re import sys import os if (len(sys.argv) < 2): print(f"Error: usage python {sys.argv[0]} {{file.fnt}}") with open(sys.argv[1]) as f: fnt_data = f.read() font_name: str = os.path.basename(sys.argv[1]).split(".")[0] img_file_relative_path: str = re.findall(r"file=\"(\w+[^\"]+)\"", fnt_data)[0] img_file_absolute_path: str = sys.argv[1][0:sys.argv[1].rfind("/") + 1] + img_file_relative_path image = Image.open(img_file_absolute_path) width, height = image.size pixels = list(image.getdata()) pixels = [pixels[i * width:(i + 1) * width] for i in range(height)] characteres: list[list[int]] = [None for i in range(128)] for id, x, y, width, height, xoffset, yoffset, xadvance in re.findall( r"id=(\d+) x=(\d+) y=(\d+) width=(\d+) height=(\d+) xoffset=(-?\d+) yoffset=(-?\d+) xadvance=(\d+)", fnt_data): id, x, y, width, height, xoffset, yoffset, xadvance = int(id), int(x), int( y), int(width), int(height), int(xoffset), int(yoffset), int(xadvance) bitmap: list[str] = [] for line in pixels[y:y + height]: tmp: str = "" for r, g, b, a in line[x:x + width]: tmp += "#" if a else " " bitmap.append(tmp) characteres[id] = [height, width, yoffset, bitmap] string: str = f"""\ #pragma once #include #include "font.h" struct font {font_name}_font[] = {{\\\ """ for charactere in characteres: if (charactere is not None): height, width, yoffset, bitmap = charactere string += f""" {{ .width = {width}, .height = {height}, .yoffset = {yoffset}, .bitmap = "{"".join(bitmap)}", }},\ """ else: string += f""" {{ .width = 0, .height = 0, .yoffset = 0, .bitmap = NULL, }},\ """ string += "\n};" if not os.path.exists("./headers/fonts"): os.makedirs("./headers/fonts") with open(f"./headers/fonts/{font_name}.h", "w") as f: f.write(string)