fix(studio): let a session an older build filled heal on the next open

The previous frame stops a session being written, not read: the browser that
reported this still holds the olive develop under the ORF's name, and a reload
would paint it once more. A session photo named like a RAW is that develop and
nothing else — the RAW branch writes none — so the restore path now reads the
parked RAW first and only falls back to such a copy when there is nothing
parked to develop. An ordinary photo's name is left alone.

Measured in Chromium on the built bundle, with the session poisoned and the ORF
parked: a copy named POISON.ORF opens as the re-developed 1600x1197 frame
(mean 167.3,164.2,138) and a copy named POISON.jpg opens as itself.
This commit is contained in:
2026-10-06 07:28:13 +07:00
parent 177f582aab
commit 3d759cc71b
+10 -4
View File
@@ -761,11 +761,17 @@ export function Workspace() {
loadPhoto()
.then(async (photo) => {
if (!alive) return;
if (photo) {
return adoptPhoto(photo.bytes, photo.name, new Blob([photo.bytes as BlobPart], { type: 'image/jpeg' }), true);
}
const show = (row: { name: string; bytes: Uint8Array }) =>
adoptPhoto(row.bytes, row.name, new Blob([row.bytes as BlobPart], { type: 'image/jpeg' }), true);
// A session photo named like a RAW is a develop an older build left
// there — the RAW branch writes none any more — and it carries that
// build's colour, which is how a fixed develop kept opening olive. The
// parked RAW is the copy that is not stale, so it is read first; the
// session's is only shown when nothing is parked to develop.
if (photo && !isRawName(photo.name)) return show(photo);
const parked = await readRaw();
if (!alive || !parked) return;
if (!alive) return;
if (!parked) return photo ? show(photo) : undefined;
const jpeg = await developRaw(parked.bytes);
await adoptPhoto(jpeg, parked.name, new Blob([jpeg as BlobPart], { type: 'image/jpeg' }), true, parked.bytes);
})