Show the photograph the way it was taken
Nothing read EXIF orientation, so every frame from a body held sideways lay on its side — in the grid, in develop, and in the read-only preview. The tag is honoured as part of *reading the file*, at the same standing as a RAW's masked-photosite crop, never as an edit. It lives as a baseline on Framing rather than as a starting value for quarter_turns, which is what keeps four things true: a sideways file opens unmodified, reset returns it to upright rather than to the sensor's scan order, its sidecar stays empty, and the rotate button still moves the image 90° whatever the file underneath it says. Framing::effective composes the baseline with the user's own turns through the group law rather than by adding turns and OR-ing flags. The naive version gets one case wrong — an odd baseline turn plus a user mirror — and gets it wrong quietly, because the result is still a plausible orientation. The composition collapses to a single permutation, so obeying the tag costs nothing per pixel. dr_decode::orientation is a header-only IFD walk, separate from metadata() for the reason the entry points are separate at all: the grid asks once per cell and must not build a rawler decoder to get one tag. CR3 and RAF fall back to the full read, being neither TIFF nor JPEG. Written down as FR-DEV-3h. Known gap: thumbnails cached before this stay sideways. The store is keyed by file and size, and its shards sync — invalidating them would have every client re-download 25 MB a shard, which is not this commit's call to make. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -268,6 +268,15 @@ impl EditGraph {
|
||||
self.framing.rotate_quarters(turns);
|
||||
}
|
||||
|
||||
/// Record how the file stored its pixels, from its EXIF orientation.
|
||||
///
|
||||
/// Set when the image is opened and never by an edit — see
|
||||
/// [`crate::framing::Framing::set_baseline`]. Survives [`Self::reset`],
|
||||
/// so it is safe to call before restoring a sidecar.
|
||||
pub fn set_orientation(&mut self, orientation: dr_types::Orientation) {
|
||||
self.framing.set_baseline(orientation);
|
||||
}
|
||||
|
||||
/// Whether any operation, or the framing, currently changes the image.
|
||||
///
|
||||
/// Asks the framing whether it *edits*, not whether it is active: zoom
|
||||
|
||||
Reference in New Issue
Block a user