Commit Graph
238 Commits
Author SHA1 Message Date
aiongg a4dc70c07b Integration: sort modules, merge duplicated checklist and gap rows from the combined tracks 2026-10-31 02:42:54 +00:00
aiongg ee0a627536 Merge track r3-t10
# Conflicts:
#	crates/engine/src/cmd/masks.rs
#	crates/ui-egui/locales/de.json
#	crates/ui-egui/locales/es.json
#	crates/ui-egui/locales/fr.json
#	crates/ui-egui/locales/ja.json
#	crates/ui-egui/locales/ka.json
#	crates/ui-egui/locales/pt-br.json
#	crates/ui-egui/locales/ru.json
#	crates/ui-egui/locales/uk.json
#	crates/ui-egui/locales/zh-hant.json
#	docs/gaps.md
#	docs/parity-checklist.md
#	docs/whats-new.md
2026-10-31 02:31:38 +00:00
aiongg e05c4f7e7c Merge track r3-t08
# Conflicts:
#	crates/meta/README.md
#	crates/ui-egui/locales/cs.json
#	crates/ui-egui/locales/de.json
#	crates/ui-egui/locales/es.json
#	crates/ui-egui/locales/fi.json
#	crates/ui-egui/locales/fr.json
#	crates/ui-egui/locales/id-formats.json
#	crates/ui-egui/locales/id.json
#	crates/ui-egui/locales/it.json
#	crates/ui-egui/locales/ja.json
#	crates/ui-egui/locales/ka-formats.json
#	crates/ui-egui/locales/ka.json
#	crates/ui-egui/locales/pl.json
#	crates/ui-egui/locales/pt-br.json
#	crates/ui-egui/locales/ru.json
#	crates/ui-egui/locales/sv-formats.json
#	crates/ui-egui/locales/sv.json
#	crates/ui-egui/locales/uk.json
#	crates/ui-egui/locales/vi.json
#	crates/ui-egui/locales/zh-hans.json
#	crates/ui-egui/locales/zh-hant.json
#	crates/ui-egui/src/panels/grid.rs
#	crates/ui-egui/tests/it/main.rs
#	docs/gaps.md
#	docs/library-shortcuts.md
#	docs/parity-checklist.md
#	docs/raw-parity.md
#	docs/user/guides/export-photos.md
#	docs/whats-new.md
2026-10-31 02:31:16 +00:00
aiongg 1f111b5e80 Merge track r3-t07
# Conflicts:
#	crates/engine/src/tests/libops.rs
#	docs/gaps.md
#	docs/parity-checklist.md
#	docs/whats-new.md
2026-10-31 02:30:21 +00:00
aiongg 0fa59f8846 Merge track r3-t05
# Conflicts:
#	crates/ui-egui/locales/cs-formats.json
#	crates/ui-egui/locales/cs.json
#	crates/ui-egui/locales/de-formats.json
#	crates/ui-egui/locales/de.json
#	crates/ui-egui/locales/es-formats.json
#	crates/ui-egui/locales/es.json
#	crates/ui-egui/locales/fi-formats.json
#	crates/ui-egui/locales/fi.json
#	crates/ui-egui/locales/fr-formats.json
#	crates/ui-egui/locales/fr.json
#	crates/ui-egui/locales/id-formats.json
#	crates/ui-egui/locales/id.json
#	crates/ui-egui/locales/it-formats.json
#	crates/ui-egui/locales/it.json
#	crates/ui-egui/locales/ja-formats.json
#	crates/ui-egui/locales/ja.json
#	crates/ui-egui/locales/ka-formats.json
#	crates/ui-egui/locales/ka.json
#	crates/ui-egui/locales/pl-formats.json
#	crates/ui-egui/locales/pl.json
#	crates/ui-egui/locales/pt-br-formats.json
#	crates/ui-egui/locales/pt-br.json
#	crates/ui-egui/locales/ru-formats.json
#	crates/ui-egui/locales/ru.json
#	crates/ui-egui/locales/sv-formats.json
#	crates/ui-egui/locales/sv.json
#	crates/ui-egui/locales/uk-formats.json
#	crates/ui-egui/locales/uk.json
#	crates/ui-egui/locales/vi-formats.json
#	crates/ui-egui/locales/vi.json
#	crates/ui-egui/locales/zh-hans-formats.json
#	crates/ui-egui/locales/zh-hans.json
#	crates/ui-egui/locales/zh-hant-formats.json
#	crates/ui-egui/locales/zh-hant.json
#	docs/gaps.md
#	docs/parity-checklist.md
#	docs/whats-new.md
2026-10-31 02:30:12 +00:00
aiongg 5e56e9536b Merge track r3-t04
# Conflicts:
#	docs/gaps.md
#	docs/parity-checklist.md
#	docs/whats-new.md
2026-10-31 02:30:01 +00:00
aiongg 67b636329a Merge track r3-t03
# Conflicts:
#	crates/ui-egui/src/tests/drop_import.rs
#	crates/ui-egui/tests/it/main.rs
#	docs/gaps.md
#	docs/parity-checklist.md
#	docs/whats-new.md
2026-10-31 02:29:52 +00:00
aiongg 46982a5c4f Merge track r3-t02
# Conflicts:
#	docs/gaps.md
#	docs/parity-checklist.md
#	docs/whats-new.md
2026-10-31 02:29:22 +00:00
aiongg 3af32798f3 Merge PR #2821: LR-META-LOCATION: reject malformed typed GPS coordinates
crates/engine/src/cmd/library.rs: kept main's split; the PR's parse_gps changes and tests are ported to crates/engine/src/cmd/library/gps.rs.
docs/gaps.md, docs/parity-checklist.md: both sides kept (header items, rows, LR-META-LOCATION note).
2026-10-31 02:10:49 +00:00
aiongg 5062acc601 Merge PR #2421: fix(windows): add opt-in DirectComposition workaround for VRR flicker
apps/lightcraft/src/main.rs: kept main's split; hunks ported (clear_color, compose_window, with_transparent); test moved to tests.rs
crates/ui-egui/src/panels/settings.rs: deleted on main; checkbox ported to dialogs/settings/performance.rs
crates/ui-egui/src/state.rs: compose_window field and default ported to state/settings.rs
crates/ui-egui/locales/*.json: main's file plus the new key
docs/gaps.md, docs/parity-checklist.md: main's header and rows plus the PR's additions; duplicated header line and blank lines dropped
2026-10-31 02:10:21 +00:00
aiongg bfb9572eb1 Merge PR #2529: LR-MAP-TRACKLOG: Decode XML character references in GPX
docs/gaps.md, docs/whats-new.md, docs/parity-checklist.md: both sides' header items, entries and rows kept.
2026-10-31 02:10:14 +00:00
aiongg 847fc7558d Merge PR #3027: LR-PROF-CAMERACOLOR: docs count 9 bundled camera profiles, not 5 2026-10-31 02:09:51 +00:00
aiongg b28ef86773 Merge PR #2724: fix(codecs): validate JPEG ICC APP2 chunk sequences
Conflicts: docs/gaps.md header merged (newer date, both change lists), rows kept; other docs unioned
2026-10-31 02:09:46 +00:00
aiongg 5a7a1b2ad9 Merge PR #2964: LR-IMP-ADD-DIALOG: handle rename sequence exhaustion
crates/engine/src/import.rs, cmd/library.rs: main split these files; kept main's side here and ported the PR's hunks to import/job.rs, cmd/library/import.rs and cmd/library/specs.rs (module doc stays in import.rs).
docs: headers keep main's newer date plus the PR's item; the PR's row additions applied to main's rows; revision rows and What's New entries kept, one heading per date.
2026-10-31 02:09:36 +00:00
aiongg c03c567f5e Merge PR #2732: LR-EDIT-OPTICS-PROFILE: Sony ILCE-6700 in-file distortion
docs/gaps.md: main's header, gap 9 and revision rows kept; gap 8 row and header carry the ILCE-6700 mention; the PR's revision row added.
2026-10-31 02:08:57 +00:00
aiongg 035d4d5dcb Merge PR #2977: LR-META-EXIF-FULL: reject malformed EXIF clocks
docs/gaps.md, docs/parity-checklist.md, docs/whats-new.md: both sides kept; the PR's sentences added to main's rows and entries.
docs/xmp-interop.md: capture-time paragraph combines both sides.
The PR's test file crates/engine/src/tests_import.rs landed in crates/engine/src/tests/import.rs (moved on main).
2026-10-31 02:08:25 +00:00
aiongg 82ba9ee4f9 Merge PR #2796: docs: gap 9 — the CI gate runs the tests on Linux x64; macOS, Windows and the GPU tests still don't
ROADMAP.md: header keeps main's text plus the gap 9 phrase; item 7 keeps the #329 link, item 8 from the PR; revision rows union
docs/gaps.md: header keeps main's text plus the gap 9 phrase; row 8 keeps the #329 link, row 9 from the PR
2026-10-31 02:08:21 +00:00
aiongg 9e732c2233 Merge PR #3298: Issue #3272: AI masks are enlarged along the photo's edges, no outline under a raised Exposure
# Conflicts:
#	docs/gaps.md
#	docs/parity-checklist.md
2026-10-31 02:08:02 +00:00
aiongg e967200f0d Merge PR #2912: Reject incomplete ISO timestamps in metadata and track logs
crates/meta/src/xmp.rs: kept main's 'mod tests;'; the PR's two tests ported to xmp/tests.rs.
docs/gaps.md, docs/parity-checklist.md, docs/whats-new.md: both sides kept; newer date in headers; XMP row and header carry the PR's sentence.
2026-10-31 02:07:55 +00:00
aiongg 36dd2a7d6b Merge PR #2237: LR-IMP-ADD-DIALOG: remembered import thumbnail-size slider
docs/gaps.md, docs/parity-checklist.md: header keeps the newer date plus both sides' items; revision row added newest first.
locales/ru.json: union of keys.
2026-10-31 02:07:51 +00:00
aiongg 72aebe1d72 Merge PR #2781: LR-LIB-VIRTUALCOPY: prevent numbering overflow in copy batches
docs: kept the newer header and both sides' lines (union).
2026-10-31 02:07:39 +00:00
aiongg c0df71dde6 Merge PR #2849: LR-EXP-METADATA: refuse Originals with embedded place names
crates/engine/src/export.rs: main moved the code to export/prepare.rs; hunk ported there by hand
docs/gaps.md, docs/parity-checklist.md: header keeps the newer line, revision rows are the union
2026-10-31 02:07:23 +00:00
aiongg 3f5dd5a92d Merge PR #2021: Fix reference app catalog video classification and filtering
docs/gaps.md, docs/parity-checklist.md: kept main's header and rows, added the PR's video text and revision row.
crates/engine/src/lightroom_catalog.rs: the PR's two tests moved to lightroom_catalog/tests.rs (main split the module).
Dropped the PR's unrelated hunks (slide_overlay.rs, tests_export.rs, raw corpus tests) per the review.
2026-10-31 02:07:23 +00:00
aiongg 78fe857011 Merge PR #2841: Write sidecar keywords as names in dc:subject and paths in lr:hierarchicalSubject
crates/catalog/src/keywords.rs: kept main's 'mod tests;'; PR's test changes ported to keywords/tests.rs.
docs/parity-checklist.md: main's LR-META-XMP / EXIF-FULL rows with the PR's keyword sentence added; revision rows both kept.
2026-10-31 02:07:14 +00:00
aiongg 01c0b1e274 Merge PR #1654: Bound interpolation for extreme brush segments
# Conflicts:
#	docs/gaps.md
#	docs/parity-checklist.md
2026-10-31 02:06:52 +00:00
tylerphotosandCodex 6b1fc20053 LR-IMP-ADD-DIALOG: render import previews when the camera JPEG is too small
Require a covering embedded image only for renderable import candidates. Keep the available camera JPEG for preview-only raws and failed or unavailable render fallbacks; ordinary quick views and grid thumbnails retain their immediate stand-in behavior. Also release import preview state when canceled through the control channel.

Co-Authored-By: Codex <noreply@openai.com>
2026-10-29 11:59:23 -05:00
tylerphotosandCodex 8ab4641011 LR-IMP-ADD-DIALOG: finish import thumbnail sizing review (#2056)
Reconcile with current modules, preserve all locale catalogs, reuse small-source preview jobs, release dismissed review state, and keep exact-entry Escape inside the slider.

Co-Authored-By: Codex <noreply@openai.com>
2026-10-29 07:56:08 -05:00
eliets2 6a7a6fa3cf docs: trim the brush note to what the change does
The gap 24 row, the change-log line and the two document headers now say only
that an extreme brush segment skips its intermediate dabs. They no longer claim
live preview, edge refinement or a mask test count, and the headers no longer
carry the unrelated gap 15 and print-page entries.
2026-10-29 13:59:18 +02:00
eliets2 bf8b5e3584 LR-MASK-BRUSH: skip the interpolation of extreme brush segments
push_dabs clamped the number of intermediate dabs of one brush segment to 1,000,000, so a
finite but extreme segment (a point 10,000,000 px away) still allocated a million dabs. A
segment that would need more than that many now keeps only its endpoints; ordinary
spacing and the segment's end point are unchanged.

Adds oversized_brush_segments_skip_intermediate_dabs, which checks both the extreme case
(2 dabs) and an ordinary feathered-brush segment (21 dabs, end point kept, spacing kept).
The docs record the fix under gap 24 and LR-MASK-BRUSH; the parity status stays partial.
2026-10-29 13:57:51 +02:00
Brain WangandClaude Opus 5.5 f14d166fdf Issue #3272: AI masks are enlarged along the photo's edges, no outline under a raised Exposure
An Object / Describe mask is stored as a model's logit grid (288² over the whole photo,
~20 px cells on a 24 MP export) and was enlarged by bilinear sampling alone, so its edge
spilled 1–2 px onto the background; raising the mask's Exposure turned that strip into a
bright outline in previews and exports (CPU and GPU: the GPU renderer evaluates these
shapes with the same CPU `shape_alpha`).

`sample_seg` now guided-filters the sampled logits by the photo's log luminance where the
grid is coarser than the output: the fast (subsampled) guided filter, a window of 1.5 grid
cells, so a preview and an export put the edge in the same place. Filtering logits, not
coverage, lets the confident side win (the spill goes to ≈ 0, not to a mean of ≈ 0.1).
Pixels whose window is all inside or all outside, and edges the photo has no contrast
across, keep the plain sample exactly. Refine Edges still runs afterwards on the combined
mask and finds the edges in place: no second halo, no tightening.

One implementation: `guided_cross` (Refine Edges, Auto Mask) and the new
`guided_cross_fast` share `guided_coeffs`; the subsampled form uses
`local::guided_fast_step` and a box `resize`, like `local::guided_fast`. `guided_cross`'s
output is unchanged.

Existing AI masks become 1–2 px tighter at a subject's edges, on every process; their
inside, outside and contrast-less edges are unchanged. This lands in place under the
bug-fix rule of docs/process-versions.md (output that is in neither the photo nor the
edit), noted there.

Cost per AI selection (M2 Pro, 12 cores; one shape_alpha, before → after):
24 MP 25.7 → 48.2 ms, heap peak 96.5 → 108.8 MB; 60 MP 64.1 → 109.9 ms, 239.9 → 256.7 MB;
2.7 MP preview 3.1 → 10.6 ms, 11.2 → 26.5 MB.

Tests (a dark disc on a light background, its mask on a 32² grid): ≈ 0 one and two px
outside and ≈ 1 inside, all around (1 px outside was 0.66), bit-identical away from the
edge; with Refine Edges 50 / 100 (was 0.29 outside) and the edge within 1 px of the
unrefined one; the same edge position at 256, 512 and 1024 px; a Prompt mask's window
matches the whole render.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 11:13:04 +08:00
radialmonsterandClaude Opus 5.5 6188590675 Docs: link gap 8 and roadmap priority 7 to lens profile issue #329
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014ti8KemZbjE2ZgHgV1q1BM
2026-10-28 13:58:49 -04:00
Brain Wang 88960dbb0e LR-PROF-CAMERACOLOR: docs count 9 bundled camera profiles, not 5 2026-10-26 10:33:56 +08:00
ronibalthazar a1e1b4cc0e LR-META-EXIF-FULL: reject malformed EXIF clocks 2026-10-25 19:03:33 +00:00
ronibalthazar cff89260f9 LR-IMP-ADD-DIALOG: check rename sequence exhaustion 2026-10-25 17:28:56 +00:00
ronibalthazar 0352b420a7 fix(codecs): validate JPEG ICC APP2 chunk sequences 2026-10-25 14:13:58 +00:00
ronibalthazar 07d1f0ad5d LR-META-XMP: reject incomplete ISO timestamps 2026-10-25 06:35:43 +00:00
Nathaniel Ledford 44cb68b8c1 docs: gap 9 — the CI gate runs the tests on Linux x64; macOS, Windows and the GPU tests still don't 2026-10-25 00:38:38 -04:00
aiongg c3feda15c0 LR-META-INFO: the Info panel shows Selected Photos by default; gaps.md lists its change notes once 2026-10-25 03:36:14 +00:00
aiongg e339afc263 Merge PR #2810: LR-META-INFO: the Info panel can show metadata for the selected photos 2026-10-25 02:25:16 +00:00
ronibalthazarandCodex 650edf66f8 LR-EXP-METADATA: refuse Originals with embedded place names
Co-authored-by: Codex <noreply@openai.com>
2026-10-24 22:27:28 +01:00
j-a-b-r-o-n-iandClaude Opus 5.5 f6c5cab021 LR-META-XMP: write sidecar keywords as names in dc:subject and paths in lr:hierarchicalSubject
Saving a sidecar wrote each keyword's path into dc:subject. A photo
keyworded Places|Italy|Rome got "Places|Italy|Rome" there instead of
"Places", "Italy" and "Rome", after any change with auto-write on, even a
rating. dc:subject is the flat list Lightroom, darktable, digiKam and
exiftool-based tools search, so the photo stopped turning up for "Rome"
in a library shared with them.

keywords::to_file is the inverse of from_file: every level of every
keyword goes to dc:subject, and when any keyword has levels, every
keyword goes to lr:hierarchicalSubject as its path. It applies no export
options (a sidecar is the photo's own record), so from_file reads the
pair back as the same keywords. lr:hierarchicalSubject is now owned, so
it is replaced on save and removed when the photo has no keywords, which
also ends the documented limit where a keyword removed here stayed in
another app's hierarchical list. Sidecars from 0.13 and older (paths in
dc:subject) still read as paths and are written the new way on the next
save.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 15:26:42 -04:00
dotCooCoo cc557e189d KEYC-METADATA: Cmd+Alt+Shift+C / V copy and paste metadata
Copy Metadata and Paste Metadata had no shortcut. They now use
Cmd+Option+Shift+C and Cmd+Option+Shift+V on macOS and
Ctrl+Alt+Shift+C and Ctrl+Alt+Shift+V on Windows and Linux, the keys
Lightroom Classic's keyboard shortcut page lists for copying and
pasting metadata in the Library module. Both keys also work when
Windows and Linux deliver them as clipboard events. The KEYC-METADATA
row now lists the keys LightCraft binds (Cmd+S, the two new keys and
Alt+1 to Alt+9 for keyword sets) and every other key of that table
that is still missing. Gap 28 in docs/gaps.md and the Library keys in
docs/ui-parity.md list the two new keys.
2026-10-24 09:13:54 -07:00
ronibalthazar 4f94e0c592 LR-META-LOCATION: validate typed GPS coordinates 2026-10-24 16:43:10 +01:00
Brandon Thomas 3f1e5c21d6 Merge PR #2775
# Conflicts:
#	docs/gaps.md
#	docs/parity-checklist.md
2026-10-24 10:20:13 -04:00
dotCooCoo 0b1b47ee7b LR-META-INFO: the Info panel can show metadata for the selected photos
With several photos selected, the Info panel offers Show Metadata For:
Target Photo (the default) shows the active photo's values as before,
and Selected Photos shows the values the selected photos share. A text
field or GPS where they differ is empty with a Mixed hint, and
Copyright Status shows Mixed. What is typed there is saved to every selected
photo, and a Mixed field typed in and left empty clears it on all of
them. A field left as it was saves nothing, even when the choice
changes during the edit. The choice is saved with the app settings, and
`view.infoSelectedPhotos {on?}` sets it for an agent.
2026-10-24 07:03:31 -07:00
Julian Zahnow 9710a64ba2 Merge remote-tracking branch 'origin/main' into sony-ilce6700-distortion
# Conflicts:
#	docs/gaps.md
2026-10-24 13:33:21 +02:00
ronibalthazar 745976e95c LR-LIB-VIRTUALCOPY: check numbering before copy creation 2026-10-24 09:38:23 +01:00
ronibalthazar 522ae832ec fix: scope relative-date expiry to referenced albums 2026-10-24 07:28:51 +01:00
ronibalthazar 18c56f03d4 fix: expire relative-date view caches on minute change 2026-10-24 07:02:22 +01:00
francoisgnandClaude Opus 5.5 496291276c Merge PR #2468@218e7451c (its main merge) into round3a-integration
Its code is already in the batch; docs keep the batch's version, headers list
#2468's change entries too.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 05:50:46 +03:00