• src/doors/syncretro/syncretro_io.c

    From Rob Swindell (on Debian Linux)@VERT to Git commit to main/sbbs/master on Tue Jul 21 02:32:20 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/321118d1b3d2d329310684ce
    Modified Files:
    src/doors/syncretro/syncretro_io.c
    Log Message:
    syncretro: say "n/a" when the client cannot patch, not "0%"

    The stats bar had three situations and two labels. Patching a frame needs the client to persist its sixel colour registers between images, which is a SyncTERM property, so on any other terminal the dirty-rect share is structurally zero -- and it was reported as "dr 0%", which is also what a SyncTERM client shows when a game happens to move every pixel.

    The comment defending "0%" argued that it tells the reader the feature is on. It does, where patching is possible. Where it is not, it reads as a
    measurement of something that was never attempted.

    ---
    þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net
  • From Rob Swindell (on Debian Linux)@VERT to Git commit to main/sbbs/master on Wed Jul 22 20:38:40 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/7cec42bc19e9d30efe74eafe
    Modified Files:
    src/doors/syncretro/syncretro_io.c
    Log Message:
    syncretro: enable dirty rects on non-SyncTERM terminals

    Drop the SyncTERM-only clause from the dirty gate and emit each
    non-SyncTERM patch with SIXEL_PAL_USED, so a patch carries only its
    handful of used colours instead of the full 256-register palette the
    old code judged "far more than one frame". That judgement was correct
    under the all-or-nothing palette; subsetting overturns it. Patches are self-describing, so they do not depend on the ?1070l register-
    persistence request; band_align (from the prior commit) keeps their
    geometry safe on cell-anchored terminals. SyncTERM keeps zero-palette
    patches unchanged. The stats overlay's "dr n/a" now means only "no
    usable cell grid", not "not SyncTERM".

    Verified headlessly: syncretro build.sh succeeds, and the standalone
    dirty-rect unit test (test_dirty.c) passes. Live foot visual smoke
    testing (confirming dr N% on-screen and no black strips along patch
    bottoms in sparse scenes) is PENDING -- a manual step not yet run.

    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

    ---
    þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net
  • From Rob Swindell (on Debian Linux)@VERT to Git commit to main/sbbs/master on Wed Jul 22 20:38:40 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/8af4cb97e9519e44740fe980
    Modified Files:
    src/doors/syncretro/syncretro_io.c
    Log Message:
    syncretro: subset the non-SyncTERM full-frame palette too

    sr_io_present()'s full-frame path still used the old boolean
    (pal_changed || !sr_input_is_syncterm()), so a non-SyncTERM full frame
    shipped all 256 palette registers even when only a handful of colors
    were in use. The dirty-rect patch path already subsetted to used
    colors (SIXEL_PAL_USED) for non-SyncTERM clients; the full-frame path
    was the one spot left sending the full 256-register table there.

    Switch emit_pal to the tri-state sibling-door pattern: pal_changed ? SIXEL_PAL_FULL : SIXEL_PAL_NONE, then override to SIXEL_PAL_USED when
    the client isn't SyncTERM. On SyncTERM this is byte-identical to
    before (FULL/NONE follow the old pal_changed truthiness exactly);
    non-SyncTERM frames now emit only the colors the frame actually uses,
    matching SyncDuke, SyncDOOM, SyncMOO1, and SyncConquer.

    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

    ---
    þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net