Follow-up to the 256×256-tiling reversal — the residual boundary seams on ≥2×2-tile textures are gone. Decoding the file header revealed the exact layout (no oracle capture needed): 0x00 44 base header 0x1c 4 tile count = ceil(w/256) * ceil(h/256) 0x2c tiles*4 BE-u32 absolute offset of each row-major 256×256 tile <off> 16 per-tile header, then tile_w*tile_h*4 A8R8G8B8 pixels The old seams came from ignoring the offset table and the 16-byte per-tile header (contiguous-packing drifted 16 bytes per tile). Small textures decoded before only by luck: one tile puts pixels at 44+4+16 = 64, the old type-1 "header size". Now the 8AX title background, the prselect_win1 window frame, and preff04 all decode pixel-perfect (verified against the title screen). - t8ad.rs: parse() walks the offset table; dropped detile_256 + the header-size-by-type table. Non-tilecount entries (field != ceil*ceil) return None (likely DXT/other, deferred). New multi-tile round-trip test. - sylpheed-cli: pak textures decodes via parse(); XDUMPHDR=1 dumps the base header + offset table for RE. Removed the now-obsolete XTILE/XSCORE/XDESTRIP experiment knobs and the reconstruct_tiles/TV-sweep helpers. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
7.2 KiB
7.2 KiB