Files
llamamod/tools/text_export.py
T

55 lines
2.0 KiB
Python

#!/usr/bin/env python3
"""TEXT chunk -> PNG pages (+ texinfo.txt) and back.
text_export.py export level.wad outdir # pageNN_fXX.png, texinfo.txt
text_export.py import level.wad outdir new.wad # write modified PNGs back
"""
import glob
import os
import re
import sys
import numpy as np
from PIL import Image
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
import textchunk as T # noqa: E402
import wadtool # noqa: E402
def main():
cmd, wad, out = sys.argv[1:4]
ch = wadtool.read(wad)
tc = wadtool.get(ch, 'TEXT')
t = T.parse(tc[1])
if cmd == 'export':
os.makedirs(out, exist_ok=True)
for i, p in enumerate(t['pages']):
if p['flags'] == 0:
Image.fromarray(p['px']).save(f'{out}/page{i:02d}_f{p["flags"]:02x}.png')
else:
Image.fromarray(T.abgr1555_to_rgba(p['px'])).save(f'{out}/page{i:02d}_f{p["flags"]:02x}.png')
with open(f'{out}/texinfo.txt', 'w') as f:
f.write('# idx flags page clut x0 x1 y0 y1\n')
for i, e in enumerate(T.tex_entries(t['tail'])):
f.write(f'{i} {e[0]:#06x} {e[1]} {e[2]:#04x} {e[3]} {e[4]} {e[5]} {e[6]}\n')
print(f'{len(t["pages"])} pages, {len(T.tex_entries(t["tail"]))} textures -> {out}')
elif cmd == 'import':
for fn in glob.glob(f'{out}/page*.png'):
i = int(re.search(r'page(\d+)', fn).group(1))
p = t['pages'][i]
img = np.asarray(Image.open(fn).convert('RGBA'))
assert img.shape[:2] == (p['h'], p['w']), fn
new = T.rgba_to_abgr1555(img)
# keep unchanged pixels exactly (8->5 bit rounding is not lossless in reverse)
old = T.abgr1555_to_rgba(p['px'])
same = (old == img).all(-1)
p['px'] = np.where(same, p['px'], new).astype(np.uint16)
tc[1] = T.build(t)
wadtool.write(sys.argv[4], ch)
print('written:', sys.argv[4])
if __name__ == '__main__':
main()