1
0
Fork 0
mirror of https://github.com/zeldaret/oot.git synced 2025-08-24 16:01:26 +00:00
oot/tools/assets/png2raw/test.py
Dragorn421 8411c34b38
wip: New assets system tm
Builds gc-eu-mq-dbg OK from clean after
1) make setup
2) python3 -m tools.assets.extract -j
3) replace 0x80A8E610 with sShadowTex in extracted/gc-eu-mq-dbg/assets/overlays/ovl_En_Jsjutan/sShadowMaterialDL.inc.c
4) make various symbols in extracted data like sTex static
2025-02-05 16:31:29 +01:00

144 lines
5.7 KiB
Python

import unittest
from pathlib import Path
import random
import raw2png
import png2raw
test_dir = Path(__file__).parent / "test_out_folder"
test_dir.mkdir(parents=True, exist_ok=True)
test_pngs_dirs: list[Path] = []
# https://sourceforge.net/p/libpng/code/ci/master/tree/
# git clone https://git.code.sf.net/p/libpng/code libpng-code
libpng_dir = Path("/home/dragorn421/Documents/libpng-code/")
# libpng_dir = None
if libpng_dir:
test_pngs_dirs.extend(
libpng_dir / libpng_pngs_dir
for libpng_pngs_dir in [
Path("contrib/testpngs/"),
Path("contrib/pngsuite/"),
Path("contrib/pngsuite/interlaced/"),
]
)
test_pngs: list[Path] = []
for test_pngs_dir in test_pngs_dirs:
test_pngs.extend(test_pngs_dir.glob("*.png"))
if libpng_dir:
# apparently ffmpeg fails to properly understand this one, so one test falsely fails
# The right pixel is transparent white, ffmpeg says opaque white
test_pngs.remove(libpng_dir / Path("contrib/testpngs/gray-1-linear-tRNS.png"))
# I guess this one is 16 bits per pixel
# The 8-bit intensity of three pixels is off by 1, so it's probably just a rounding difference
test_pngs.remove(libpng_dir / Path("contrib/testpngs/gray-16-sRGB.png"))
# TODO these false fails happen for a lot more pngs from libpng, from a quick look for similar reasons
# -> check and remove them
# test_pngs.extend(Path("/home/dragorn421/Documents/oot/assets").glob("**/*.png"))
# Testing 100 pngs takes 5-6 seconds for me. Definitely need to reduce the amount of pngs being tested
test_pngs = random.sample(test_pngs, 100)
for p in test_pngs:
assert p.is_file(), p
class Tests(unittest.TestCase):
def test_random_rgba32(self):
for rand_i in range(10):
with self.subTest(rand_i=rand_i):
width = random.randint(10, 20)
height = random.randint(10, 20)
image_data = bytearray(random.randbytes(width * height * 4))
file_name = test_dir / f"random_rgba32_{rand_i}.png"
raw2png.write(file_name, width, height, image_data)
with png2raw.Instance(file_name) as inst:
self.assertFalse(inst.is_paletted())
self.assertEqual(inst.get_dimensions(), (width, height))
self.assertEqual(inst.read_to_rgba32(), image_data)
def test_random_paletted(self):
for rand_i in range(10):
with self.subTest(rand_i=rand_i):
width = random.randint(10, 20)
height = random.randint(10, 20)
num_palette = random.randint(1, 256)
palette_data = bytearray(random.randbytes(num_palette * 4))
image_data = bytearray(
b % num_palette for b in random.randbytes(height * width)
)
file_name = test_dir / f"random_paletted_{rand_i}.png"
raw2png.write_paletted(
file_name, width, height, palette_data, num_palette, image_data
)
with png2raw.Instance(file_name) as inst:
self.assertTrue(inst.is_paletted())
self.assertEqual(inst.get_dimensions(), (width, height))
self.assertEqual(inst.get_palette_rgba32(), palette_data)
self.assertEqual(inst.read_palette_indices(), image_data)
def test_rewrite(self):
for file_name in test_pngs:
with self.subTest(file_name=file_name):
# Copy original files to the test folder for easier visual comparison
og_out = test_dir / (file_name.stem + "#OG" + file_name.suffix)
og_out.write_bytes(file_name.read_bytes())
rewrite_out = test_dir / file_name.name
with png2raw.Instance(file_name) as inst:
width, height = inst.get_dimensions()
if inst.is_paletted():
palette_data = inst.get_palette_rgba32()
image_data = inst.read_palette_indices()
self.assertLessEqual(len(palette_data), 256 * 4)
self.assertEqual(len(image_data), height * width)
raw2png.write_paletted(
rewrite_out,
width,
height,
palette_data,
len(palette_data) // 4,
image_data,
)
else:
image_data = inst.read_to_rgba32()
self.assertEqual(len(image_data), height * width * 4)
raw2png.write(rewrite_out, width, height, image_data)
self.assertTrue(rewrite_out.is_file())
import subprocess
og_out_rgba32_bin = og_out.with_suffix(".rgba32.bin")
rewrite_out_rgba32_bin = rewrite_out.with_suffix(".rgba32.bin")
subprocess.run(
"ffmpeg -y -i".split()
+ [str(og_out)]
+ "-f rawvideo -pix_fmt rgba".split()
+ [str(og_out_rgba32_bin)],
capture_output=subprocess.DEVNULL,
)
subprocess.run(
"ffmpeg -y -i".split()
+ [str(rewrite_out)]
+ "-f rawvideo -pix_fmt rgba".split()
+ [str(rewrite_out_rgba32_bin)],
capture_output=subprocess.DEVNULL,
)
self.assertEqual(
og_out_rgba32_bin.read_bytes(), rewrite_out_rgba32_bin.read_bytes()
)
if __name__ == "__main__":
unittest.main()