49 lines
1.4 KiB
Python
49 lines
1.4 KiB
Python
import xml.etree.ElementTree as ET
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
def convert_bmfont_xml(xml_path, output_path):
|
|
tree = ET.parse(xml_path)
|
|
root = tree.getroot()
|
|
|
|
# --- Read font info ---
|
|
info = root.find("info")
|
|
common = root.find("common")
|
|
page = root.find("pages/page")
|
|
|
|
font_size = info.attrib.get("size", "0")
|
|
tex_width = common.attrib.get("scaleW", "0")
|
|
tex_height = common.attrib.get("scaleH", "0")
|
|
texture_name = Path(page.attrib["file"]).stem
|
|
|
|
lines = []
|
|
lines.append(f"texture {texture_name} {tex_width} {tex_height}")
|
|
lines.append(f"size {font_size}")
|
|
|
|
# --- Glyphs ---
|
|
chars = root.find("chars")
|
|
for ch in chars.findall("char"):
|
|
code = ch.attrib["id"]
|
|
x = ch.attrib["x"]
|
|
y = ch.attrib["y"]
|
|
w = ch.attrib["width"]
|
|
h = ch.attrib["height"]
|
|
xoff = ch.attrib["xoffset"]
|
|
yoff = ch.attrib["yoffset"]
|
|
xadv = ch.attrib["xadvance"]
|
|
|
|
lines.append(f"c {code} {x} {y} {w} {h} {xoff} {yoff} {xadv}")
|
|
|
|
# --- Write output ---
|
|
with open(output_path, "w", encoding="utf-8") as f:
|
|
f.write("\n".join(lines))
|
|
|
|
print(f"Written: {output_path}")
|
|
|
|
if __name__ == "__main__":
|
|
if len(sys.argv) != 3:
|
|
print("Usage: python fnt2font.py input.fnt output.txt")
|
|
sys.exit(1)
|
|
|
|
convert_bmfont_xml(sys.argv[1], sys.argv[2])
|