Subj : src/doors/syncduke/syncduke_io.c To : Git commit to main/sbbs/master From : Rob Swindell (on Debian Linux) Date : Sun Jun 28 2026 00:21:31 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 --- þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net .