Subj : src/doors/syncconquer/door/door_io.c To : Git commit to main/sbbs/master From : Rob Swindell (on Debian Linux) Date : Fri Jul 17 2026 02:53:44 https://gitlab.synchro.net/main/sbbs/-/commit/44e5ea5042f6098243ea2a83 Modified Files: src/doors/syncconquer/door/door_io.c Log Message: syncconquer: sixel-tier dirty-rect rendering (partial-sixel backend) Extend the Phase-2 dirty-rect path to the sixel tier -- the non-JXL fallback population: xterm / mlterm / wezterm / Windows Terminal, plus a no-JXL SyncTERM. The framebuffer differ + coalescer are hoisted out of the WITH_JXL guard into a shared dr_diff_coalesce() that both backends call; only the per-tier emit differs. Sixel can only be placed at a character cell (unlike a pixel-exact JXL blob), so each coalesced box is snapped OUT to cell boundaries and its top-left cell is addressed with the cursor, then re-emitted as its own partial sixel that composites over the frame the client still holds. The box height is rounded up to a 6-px sixel band to dodge SF #258 (SyncTERM mis-decodes a partial last band). On SyncTERM the palette registers persist from the prior full frame so boxes ship palette-less; other sixel terminals reset registers per image, so each box re-sends the palette. Same data//dirtyrect flag and ~1.5s live re-check as the JXL path, and the same full-frame fallback on a large or over-fragmented change -- so it is never worse than a full frame. The saving scales with the static (unchanged) fraction: largest on a built-up map, near zero on a sparse animating scene. The ratio is lower than JXL's because sixel is cell-snapped and compresses locally rather than globally, and it is smallest on a huge canvas (Windows Terminal) where every box inflates and the palette re-sends per box. Live-tested in Windows Terminal (sixel tier): composites cleanly, frame size swings down with map development. Co-Authored-By: Claude Opus 4.8 (1M context) --- þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net .