预览一致性修复

This commit is contained in:
tianmo committed 2026-09-11 00:33:43 +08:00
1 parent 11b1c95d98
commit f0c7e27552
7 files changed
+189 -36

No files matched your search

+13
View File
@@ -12,6 +12,7 @@ const frames=versions.map(version=>{
html+=script(fs.readFileSync(path.join(root,'lib',version,'spine-canvas.js'),'utf8'));
html+=script(`(async()=>{try{
const image=new Image();image.src='data:image/png;base64,${fs.readFileSync(path.join(dir,'spineboy.png')).toString('base64')}';await image.decode();
await modules['./spine-webgl-rasterizer.js'].prepareTexture(image,await (await fetch(image.src)).blob());
const text=${JSON.stringify(fs.readFileSync(path.join(dir,'spineboy.atlas'),'utf8'))};
const texture=new (spine.CanvasTexture||spine.canvas.CanvasTexture)(image);let atlas;
if(spine.TextureAtlas.length<=1){atlas=new spine.TextureAtlas(text);for(const page of atlas.pages){if(page.setTexture)page.setTexture(texture);else page.texture=texture}}
@@ -33,6 +34,18 @@ const frames=versions.map(version=>{
renderer.draw(skeleton);const pixels=ctx.getImageData(0,0,400,400).data;
if(mode===0)normal=pixels;else{let changed=0;for(let i=0;i<pixels.length;i+=4)if(Math.abs(pixels[i]-normal[i])>3)changed++;if(changed<100)throw Error('Slot multiply did not change image');}
}
let black;
for(const tint of [[0,0,0],[0.25,0.5,0.75]]){
ctx.setTransform(1,0,0,1,0,0);ctx.fillStyle='#1e1e1e';ctx.fillRect(0,0,400,400);
const scale=320/Math.max(size.x,size.y);ctx.translate(200,200);ctx.scale(scale,-scale);ctx.translate(-offset.x-size.x/2,-offset.y-size.y/2);
modules['./spine-background.js'].drawCheckerboard(ctx,400,400);
for(const slot of skeleton.slots)slot.data.blendMode=0;
[skeleton.color.r,skeleton.color.g,skeleton.color.b]=tint;
renderer.draw(skeleton);const pixels=ctx.getImageData(0,0,400,400).data;
if(tint[0]===0)black=pixels;
else{let checked=0,wrong=0;for(let i=0;i<pixels.length;i+=4)for(let c=0;c<3;c++)if(normal[i+c]-black[i+c]>30){checked++;const expected=black[i+c]+(normal[i+c]-black[i+c])*tint[c];if(Math.abs(pixels[i+c]-expected)>5)wrong++;}
if(checked<100||wrong>checked*0.01)throw Error('Vertex tint mismatch: '+wrong+'/'+checked);}
}
renderer.premultipliedAlpha=true;renderer.draw(skeleton);renderer.dispose();
parent.postMessage({version,result:'PASS'},'*');
}catch(error){parent.postMessage({version,error:error.stack},'*')}})();`);