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>