diff --git a/headers/font.h b/headers/font.h new file mode 100644 index 0000000..d7b7810 --- /dev/null +++ b/headers/font.h @@ -0,0 +1,9 @@ +#pragma once + +#include + +struct font { + uint32_t height; + uint32_t width; + char **bitmap; +}; \ No newline at end of file diff --git a/tools/font_converter.py b/tools/font_converter.py new file mode 100644 index 0000000..6389eef --- /dev/null +++ b/tools/font_converter.py @@ -0,0 +1,68 @@ +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, bitmap] + +string: str = f"""\ +#pragma once + +#include "font.h" + +struct font minecraft_font[] = {{\\\ +""" + +for charactere in characteres: + if (charactere is not None): + height, width, bitmap = charactere + string += f""" + {{ + .width = {width}, + .height = {height}, + .bitmap = "{"".join(bitmap)}", + }},\ + """ + else: + string += f""" + {{ + .width = 0, + .height = 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) \ No newline at end of file