Brandon Thomas and Claude Opus 5.5
37d9ecf0e9
LR-EDIT-LIGHT-CURVE-REFINESAT: curve Refine Saturation
...
curve.refineSaturation (0..100, default 100 = the curve's own saturation): after the tone
curves, the chroma around luma is rescaled so saturation moves from the curve's towards the
pre-curve value, keeping the curve's tone. CPU (finish::refine_saturation) and GPU twin,
equivalence case, slider under the curve editor, crs:CurveRefineSaturation import.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-10-01 10:06:14 -04:00
Brandon Thomas and Claude Opus 5.5
48efc6df52
LR-EDIT-CALIB: Calibration — shadows tint and R/G/B primary hue/saturation
...
White-preserving primaries matrix (OkLCh hue rotation / chroma scale of each Rec.2020
primary) plus a luminance-preserving green/magenta shadows tint, applied in scene-linear
light before the tone map. CPU (colorops::calibrate) and GPU (finish.wgsl) with an
equivalence case; seven control specs (calibration.*), a settings group, crs: import
(ShadowTint, Red/Green/BlueHue/Saturation) and a Calibration section at the bottom of the
Edit panel.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-10-01 10:01:48 -04:00
Brandon Thomas and Claude Opus 5.5
3ef4eb0687
M9.2: preset files — .lcpreset import/export (groups preserved), XMP presets via crs: mapping
...
- engine presets.rs: .lcpreset JSON format {format: "lightcraft.preset", version, presets[]},
parse_preset_file (.lcpreset file / bare preset / array, or XMP), folder expansion,
Session::add_presets (identical presets skipped, id clashes get fresh user.* ids, built-ins
never replaced).
- crs::preset_from_xmp: crs: fields → partial settings, crs:Name/crs:Group (fallback: file name /
"Imported Presets").
- Commands preset.import {paths} and preset.export {path, ids?, group?}; UI commands
file.importPresets / file.exportPresets (File menu, with native open/save dialogs on desktop),
Presets panel "⋯" menu (Import Presets…, Export User Presets…) and group context menu
(Export Group…).
- Tests: export → import round trip keeps groups/settings, duplicates skipped, clashing ids,
malformed files reported, hand-written XMP preset imports and applies.
- docs/xmp-interop.md: preset file section.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-10-01 01:05:26 -04:00
Brandon Thomas and Claude Opus 5.5
8af27c11b1
M10.8: XMP sidecars — save/read metadata + develop settings, auto-write, crs: interchange
...
- crates/engine/src/sidecar.rs: <stem>.xmp (default) or <file>.xmp next to originals with rating,
label, title, caption, copyright, creator, keywords, capture time/GPS, pick flag + full develop
settings in lc:settings; atomic writes; read on import (sidecar wins for metadata, edits restored)
and via photo.readMetadataFromFile (one undo step); raw/DNG embedded XMP used without a sidecar.
- Commands: photo.saveMetadataToFile (Cmd+S), photo.readMetadataFromFile, library.xmpPreferences
{autoWrite, naming}, library.toggleAutoWriteXmp; prefs persisted in the library's prefs.json.
Auto-write rewrites sidecars after each committed change (not mid-drag; undo/redo too).
- crates/engine/src/crs.rs: crs: develop fields (PV2012 light, WB abs/incremental, presence, HSL,
B&W mix, parametric + point curves, colour grading, sharpening, NR, vignette, grain, optics,
geometry, crop) → partial settings; documented in docs/xmp-interop.md.
- meta: write_xmp_lc for extra lc: properties; crs namespace canonicalised on read (never written).
- Tests: packet round trip, crs mapping with hand-written snippets, save → delete library →
re-import restores edits, auto-write + prefs persistence, foreign sidecar, DNG-embedded XMP.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com >
2026-10-01 00:36:19 -04:00