https://gitlab.synchro.net/main/sbbs/-/commit/9702f5ad2884a73ef51a3a35
Modified Files:
src/doors/syncduke/syncduke_io.c
Log Message:
syncduke: aspect-preserve the sixel tier (fit, don't stretch to fill)
The sixel tier sized the encoded frame to out_w x out_h -- the terminal's pixel canvas capped at 640x480 -- and nearest-scaled Duke's native 320x200 into it, which is 4:3 on a tall terminal: the game came out vertically stretched (e.g. encoded 320x240 at >=80x50 instead of ~320x200).
Run the sixel through the same termgfx_geom_fit/center as the JXL tier: fit 320x200 into the real graphics canvas (XTSMGRAPHICS via syncduke_canvas_w/h, not
the rows*16 text-area estimate) preserving 8:5, capped at 640 wide, then encode at 1/scale of that. The displayed sixel is now a constant 640x400 letter-boxed and centered, exactly like SyncDOOM.
Side effects, all good:
- no vertical stretch (keeps 8:5 on tall terminals);
- the prior 80x50/60 over-hang is gone -- a fit is <= canvas by construction,
so the frame can no longer scale past the real ~640x400 SyncTERM canvas;
- ~18% less sixel bandwidth on tall terminals (320x198 vs 320x240).
Both image tiers now share termgfx_geom_fit, lining SyncDuke up with SyncDOOM ahead of wiring Doom to the same helper.
Co-Authored-By: Claude Opus 4.8 <
noreply@anthropic.com>
---
þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net