Files
dtourolle a9271c4850 Make Best one network, and retire Medium and the mixture
Best was a mixture of two experts and a gate, 110 GMAC a megapixel;
Medium a single network at 48 that was softer on real edges. fb-combo
(darkroom-denoise, 20 000 steps from fb-edges2, taught by the mixture
with a quarter of its crops from the edge-rich parts of the frames) is
Medium's shape and holds the mixture's edges on real photographs:
edge PSNR within 0.04-0.06 dB at ISO 1600/6400/25600, more sharpness
kept at all three, the chart's edge 0.89 photosites wide against 0.82.
It is 0.27 dB short on smooth areas at ISO 25600. It becomes Best, and
the methods are Bilinear, Fast and Best.

Saved edits keep their numbers: 2, which was Medium, is now Best, and
3, which was Best, is past the end and reads as the default, Best.
The network ships as mosaic-hq, a new name: the result cache keys a
model by name and size, and this one is byte for byte the old Medium's
size. Its tablet form (A16W16) lost 0.00 dB in simulated QDQ at every
ISO and at most 0.09 dB across the noise bracket.
2026-10-07 06:58:24 -04:00
..

tools/manual — the pictures in docs/manual

record.sh drives the desktop build on a private X server and records the scenes in scenes.py into docs/manual/media/:

tools/manual/record.sh /var/tmp/dr-demo/library              # every scene
tools/manual/record.sh /var/tmp/dr-demo/library develop_zoom # one, and what it needs
tools/manual/record.sh --changed /var/tmp/dr-demo/library    # those whose sources moved
tools/manual/record.sh --check                               # the manual and the scenes agree
tools/manual/record.sh --list

Set DR_LIBRARY_SNAPSHOT to a pristine copy of the library: a recording rates, files and merges, and the snapshot is copied over the library first. Each run starts from a fresh profile under DR_HOME.

Controls by name

The binary is built with --features automation, which lets the app answer "where is the control labelled Exposure?" over the Unix socket named by DR_AUTOMATION (ui/dr-ui/src/automation.rs). No other build has the feature, and a build that has it listens only when the variable is set. The names are the accessible labels a screen reader reads, so a scene says click_on('Select@Button') or slide('Exposure', 24) rather than a pixel, and survives a panel that moves. The pointer itself is still xdotool.

DR_HOME=/var/tmp/x tools/manual/drive.py launch /some/folder   # a feature build in DR_BIN
tools/manual/drive.py labels                 # every name on screen
tools/manual/drive.py click-on 'Settings@Button'
tools/manual/drive.py ids canvas             # things with no name: id:canvas-image
tools/manual/drive.py stop

Grid cells are named by file (_MG_8393@ListItem), rating stars 1 star to 5 stars. What a scene cannot name — a point on the photograph, the crop rectangle's corner — it places relative to something it can (drive.photo(fx, fy), id:move-area).

Scenes and the manual

Each scene in scenes.py declares the pictures it makes, as the manual names them, and the globs of the sources that could change them. --check fails when the manual shows a picture no scene makes, or a scene makes one the manual does not show; it reads two files and runs in CI. --changed re-records a scene when one of its sources, or its own code, has changed since the commit that last touched its pictures.

GIFs are made at 960 px and ten frames a second. A scene whose film does not compress at that size says otherwise in GIF_SIZE, which record.sh reads through scenes.py gif NAME. giant_pano borrows a 500 MB panorama from outside the library (DR_GIANT_DNG, by default /var/tmp/dr-dng/IMG_4181-Pano.dng) and removes it again, so it runs last.

Two things the scripts know that are not obvious: a Slint TouchArea wants a held press, not xdotool's click; and the app is driven on Xvfb rather than the desktop because under XWayland at scale 2 a pointer warp lands at twice the coordinate asked for.