diff --git a/App.tsx b/App.tsx index 87fb30c..8c7b71a 100644 --- a/App.tsx +++ b/App.tsx @@ -189,14 +189,20 @@ export default function App() { const METER_HL_CLARITY = 3; const clampAdj = (v: number) => Math.max(-10, Math.min(10, v)); const meteringActive = mode === 'camera' && meterMode === 'highlight'; + // The overlay is built FROM the adjustments it is laid on, so the preview can + // ask for the pre-edit one while the finger holds the compare. Built from the + // live values it always was, it kept painting the EDITED look back over the + // recipe the peek had swapped in, and neither HIGHLIGHT nor SHADOW (nor EV, + // CONTRAST, CLARITY) ever came back. + const meteringOverlay = (a: ColorAdjustments): Partial => ({ + exposureCompensation: clampAdj((a.exposureCompensation ?? 0) + METER_HL_EV), + highlight: clampAdj((a.highlight ?? 0) + METER_HL_HIGHLIGHT), + shadow: clampAdj((a.shadow ?? 0) + METER_HL_SHADOW), + contrast: clampAdj((a.contrast ?? 0) + METER_HL_CONTRAST), + clarity: clampAdj((a.clarity ?? 0) + METER_HL_CLARITY), + }); const meteringAdj: Partial | undefined = meteringActive - ? { - exposureCompensation: clampAdj((adjustments.exposureCompensation ?? 0) + METER_HL_EV), - highlight: clampAdj((adjustments.highlight ?? 0) + METER_HL_HIGHLIGHT), - shadow: clampAdj((adjustments.shadow ?? 0) + METER_HL_SHADOW), - contrast: clampAdj((adjustments.contrast ?? 0) + METER_HL_CONTRAST), - clarity: clampAdj((adjustments.clarity ?? 0) + METER_HL_CLARITY), - } + ? meteringOverlay(adjustments) : undefined; // Same overlay for the camera EXPORT — the EV dip included: EV is software // only (no hardware AE bias anywhere), so preview and file must both apply it. @@ -1448,7 +1454,7 @@ export default function App() { onCropRectChange={setCropRect} onSessionError={handleCameraSessionError} onExposureChange={(ev) => handleUpdateAdjustments({ exposureCompensation: ev })} - meteringAdjustments={meteringAdj} + meteringAdjustments={meteringActive ? meteringOverlay(shownAdjustments) : undefined} imageAdjustTarget={imageAdjustTarget} onComparePeek={peekArmed ? handleComparePeek : undefined} customWm={customWm}