mirror of
https://github.com/Nexoniarz/YAPF.git
synced 2026-11-03 04:54:26 +00:00
JavaScript port decodes YAPF 2; VS Code and Figma open every file
yapf.js: decodeTexture (container, yapf-sum checks, code books with context decoding, 16-bit / float planes, GPU block tiles), BC1-BC7 / BC6H block decoding and textureToRGBA for display. Matches the C library on 417 generated files (surfaces bit-exact) and survives fuzzing with clean YapfErrors; fixtures in bindings/js/test-data keep it checked. VS Code preview: pickers for mip, face, layer, frame and slice; storage, normal-map convention and version in the info bar. Figma import: textures converted to 8-bit, 8-bit images stay exact. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DVrVthWN8GsmgHGUhhsCYm
This commit is contained in:
parent
fdbd0a6b8f
commit
0ba1f0af17
23 changed files with 1751 additions and 66 deletions
|
|
@ -53,5 +53,39 @@ for (let i = 0; i < 2000; i++) {
|
|||
}
|
||||
check(threwOnTruncation, 'truncated files are rejected');
|
||||
|
||||
/* Version 2 fixtures written by the C library: every surface and the
|
||||
* preview must match what C decodes (FNV-1a hashes in v2-expected.json). */
|
||||
const fnv = (u8) => { let h = 2166136261; for (const v of u8) h = Math.imul(h ^ v, 16777619) >>> 0; return h; };
|
||||
const dataDir = path.join(__dirname, 'test-data');
|
||||
const expected = JSON.parse(fs.readFileSync(path.join(dataDir, 'v2-expected.json'), 'utf8'));
|
||||
for (const [name, want] of Object.entries(expected)) {
|
||||
const bytes = fs.readFileSync(path.join(dataDir, name));
|
||||
let tex = null;
|
||||
try { tex = YAPF.decodeTexture(bytes); } catch (e) { check(false, `${name}: ${e.message}`); continue; }
|
||||
const got = tex.surfaces.map((s) => fnv(new Uint8Array(s.buffer, s.byteOffset, s.byteLength)));
|
||||
check(JSON.stringify(got) === JSON.stringify(want.surfaces), `${name}: surfaces match the C decoder`);
|
||||
if (want.preview0 !== null) {
|
||||
const view = YAPF.textureToRGBA(tex, 0, 0);
|
||||
/* float previews may differ by 1 in rounding; compare only exact kinds */
|
||||
if (tex.payload === 1 ? tex.format !== 0x47 && tex.format !== 0x48 : tex.sample < 2)
|
||||
check(fnv(view.rgba) === want.preview0, `${name}: preview matches the C library`);
|
||||
}
|
||||
/* damage must be caught by the checksums */
|
||||
const broken = Uint8Array.from(bytes);
|
||||
broken[broken.length - 3] ^= 0x10;
|
||||
let code = null;
|
||||
try { YAPF.decodeTexture(broken); } catch (e) { code = e.code; }
|
||||
check(code === 'checksum', `${name}: a damaged byte is reported as a checksum error`);
|
||||
}
|
||||
{ /* v1 decode() reads 8-bit v2 files and names what it cannot read */
|
||||
const cube = YAPF.decode(fs.readFileSync(path.join(dataDir, 'v2-cube-mips.yapf')));
|
||||
check(cube.mipLevels === 7 && cube.width === 64, 'decode() reads face 0 of a v2 cube');
|
||||
let msg = '';
|
||||
try { YAPF.decode(fs.readFileSync(path.join(dataDir, 'v2-bc7-encoded.yapf'))); } catch (e) { msg = e.message; }
|
||||
check(/decodeTexture/.test(msg), 'decode() points GPU-block files to decodeTexture');
|
||||
const yapfSum = (t) => YAPF.checksum(new TextEncoder().encode(t));
|
||||
check(yapfSum('') === 0xd7550ed0 && yapfSum('YAPF') === 0xc8cc41d4, 'yapf-sum test vectors');
|
||||
}
|
||||
|
||||
console.log(`${tests} tests, ${fails} failures`);
|
||||
process.exit(fails ? 1 : 0);
|
||||
|
|
|
|||
Loading…
Reference in a new issue