mirror of
https://github.com/storytold/photocraft.git
synced 2026-10-30 12:57:28 -06:00
* PSD plane shuffles in bands; the document histogram computes off the UI thread interleave/deinterleave walked every pixel of a 20 MP image on one thread during PSD open and save. Both now split the rows into one band per core (the file's own par_map/bands helpers) and merge the band results in order: 20 MP RGB u16 interleave 152 -> 101 ms, deinterleave 461 -> 160 ms (2.9x); f32 rgba 329/730 -> 220/396 ms. Behaviour is pinned by a parity test against the sequential reference at odd pixel counts (band boundaries), all depths, with a missing plane in the mix. The Histogram panel computed its payload inline in the frame every 250 ms while stale - a 41.5 ms UI-thread stall measured on a 24 MP document, on top of brush work. compute_histograms now runs on a worker thread; the panel keeps showing the previous histogram with the existing cached-data warning until the result lands, and a stale result cannot overwrite a newer revision. Pinned by a panel test that drives one egui frame and asserts the job is scheduled, delivers off thread and respects revisions. * Histogram panel: compute inline when no thread can be spawned; drop the benchmark test std::thread spawn fails on wasm32 (and can fail natively), which left hist_job waiting on a disconnected receiver forever. Without a worker the histogram is now computed inline and delivered through the same channel, a disconnected job is cleared, and the perf span is measured in the worker. Removes the dead t0 and the wall-clock benchmark test; adds a dead-worker test. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Brandon Thomas <echelon@gmail.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>