55 lines
2.0 KiB
Python
55 lines
2.0 KiB
Python
#!/usr/bin/env python3
|
|
"""TEXT-Chunk -> PNG-Seiten (+ texinfo.txt) und zurück.
|
|
text_export.py export level.wad outdir # pageNN_fXX.png, texinfo.txt
|
|
text_export.py import level.wad outdir neu.wad # geänderte PNGs zurückschreiben
|
|
"""
|
|
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"])} Seiten, {len(T.tex_entries(t["tail"]))} Texturen -> {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)
|
|
# unveränderte Pixel exakt erhalten (Rundung 8->5 Bit verlustfrei rückwärts)
|
|
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('geschrieben:', sys.argv[4])
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|