Support animated icons in asset packs

This commit is contained in:
Willy-JL
2023-02-10 08:53:34 +00:00
parent 1a9f098936
commit 2b7f3797ee
3 changed files with 93 additions and 22 deletions
+49 -21
View File
@@ -43,12 +43,51 @@ def convert_bmx(img: "Image.Image | pathlib.Path") -> bytes:
return data
def pack_anim(src: pathlib.Path, dst: pathlib.Path):
if not (src / "meta.txt").is_file():
return
dst.mkdir(parents=True, exist_ok=True)
for frame in src.iterdir():
if not frame.is_file():
continue
if frame.name == "meta.txt":
shutil.copyfile(src / "meta.txt", dst / "meta.txt")
continue
elif frame.name.startswith("frame_"):
(dst / frame.with_suffix(".bm").name).write_bytes(convert_bm(frame))
def pack_icon_animated(src: pathlib.Path, dst: pathlib.Path):
if not (src / "frame_rate").is_file():
return
dst.mkdir(parents=True, exist_ok=True)
frame_count = 0
frame_rate = None
size = None
for frame in src.iterdir():
if not frame.is_file():
continue
if frame.name == "frame_rate":
frame_rate = int((src / "frame_rate").read_text())
continue
elif frame.name.startswith("frame_"):
frame_count += 1
if not size:
size = Image.open(frame).size
(dst / frame.with_suffix(".bm").name).write_bytes(convert_bm(frame))
(dst / "meta").write_bytes(struct.pack("<IIII", *size, frame_rate, frame_count))
def pack_icon_static(src: pathlib.Path, dst: pathlib.Path):
dst.parent.mkdir(parents=True, exist_ok=True)
dst.with_suffix(".bmx").write_bytes(convert_bmx(src))
def pack(
input: "str | pathlib.Path", output: "str | pathlib.Path", logger: typing.Callable
):
input = pathlib.Path(input)
output = pathlib.Path(output)
output.mkdir(parents=True, exist_ok=True)
for source in input.iterdir():
if source == output:
continue
@@ -66,8 +105,6 @@ def pack(
except Exception:
pass
packed.mkdir(parents=True, exist_ok=True)
if (source / "Anims/manifest.txt").exists():
(packed / "Anims").mkdir(parents=True, exist_ok=True)
shutil.copyfile(
@@ -76,30 +113,21 @@ def pack(
for anim in (source / "Anims").iterdir():
if not anim.is_dir():
continue
(packed / "Anims" / anim.name).mkdir(parents=True, exist_ok=True)
for frame in anim.iterdir():
if not frame.is_file():
continue
if frame.name == "meta.txt":
shutil.copyfile(
frame, packed / "Anims" / anim.name / "meta.txt"
)
elif frame.name.startswith("frame_"):
(
packed / "Anims" / anim.name / frame.with_suffix(".bm").name
).write_bytes(convert_bm(frame))
pack_anim(anim, packed / "Anims" / anim.name)
if (source / "Icons").is_dir():
for icons in (source / "Icons").iterdir():
if not icons.is_dir():
continue
(packed / "Icons" / icons.name).mkdir(parents=True, exist_ok=True)
for icon in icons.iterdir():
if not icon.is_file():
continue
(
packed / "Icons" / icons.name / icon.with_suffix(".bmx").name
).write_bytes(convert_bmx(icon))
if icon.is_dir():
pack_icon_animated(
icon, packed / "Icons" / icons.name / icon.name
)
elif icon.is_file():
pack_icon_static(
icon, packed / "Icons" / icons.name / icon.name
)
if __name__ == "__main__":