From 0d13a7d5d73f8f773789a81c8fc176a07db90f16 Mon Sep 17 00:00:00 2001 From: PiMinusMax <121135695+PiMinusMax@users.noreply.github.com> Date: Tue, 13 Oct 2026 10:27:54 +0200 Subject: [PATCH] M5.6: a full-size raw source is no longer copied once more after the colour model `fit` to the source's own size copies the whole picture (`resize` returns a clone). The raw path called it unconditionally, so every full-size decode (an export, and its denoised twin) made a second float RGB buffer: 288 MB and 160 ms at 24 MP, ~390 MB and 225 ms at 33 MP. The JPEG and preview paths in the same file already fit only when the picture is larger than `max_edge`. Co-Authored-By: Claude Opus 5.5 --- crates/engine/src/files.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/crates/engine/src/files.rs b/crates/engine/src/files.rs index dc79b8b31..93ea86a59 100644 --- a/crates/engine/src/files.rs +++ b/crates/engine/src/files.rs @@ -450,7 +450,8 @@ fn load_bytes_now( stages.push(("highlights", t0.elapsed())); colour.apply(&mut img); stages.push(("colour", t0.elapsed())); - let img = fit(&img, max_edge, max_edge, Filter::Box); + // a full-size render keeps the picture (fitting it to its own size would copy it, ~390 MB at 33 MP) + let img = if img.width.max(img.height) > max_edge { fit(&img, max_edge, max_edge, Filter::Box) } else { img }; stages.push(("fit", t0.elapsed())); let img = img.into_oriented(raw.orientation); stages.push(("orient", t0.elapsed()));