Commit Graph
196 Commits
Author SHA1 Message Date
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 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 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
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
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
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
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
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
midasdf 218e7451c0 Merge remote-tracking branch 'origin/main' into jp/photo-paper-sizes
# Conflicts:
#	docs/gaps.md
#	docs/parity-checklist.md
2026-10-24 10:08:32 +09:00
francoisgnandClaude Opus 5.5 144d900c21 Merge upstream/main (integration batch 43, #2729, #2737, #2412) into round3a-integration
Conflicts:
- apps/lightcraft/src/native_menu.rs: upstream's item swapping (macOS keys
  given up for real, Help menu not swapped, Settings / Quit tracked) with
  KEY-GRID's keymap-aware rows. `Item.label` stays the text the row shows
  (native_item_presentation), so `Item::native_label` reuses it instead of
  formatting it again; Settings / Quit store theirs through
  display_item_label, as upstream's native_label did. No early return after
  a rebuild (upstream).
- crates/ui-egui/src/i18n.rs: upstream's tests (#2729: one test per check
  across languages, gaps reported, never a failure) plus the batch's two new
  ones (dropped-photos notice, Polish counts); production code as merged.
- grid.rs, keyword_list.rs, masking.rs: the translation tests #2729 removed
  stay removed; the batch's new keyword and segmenter tests stay.
- cmd/library.rs, ui-egui/src/lib.rs: both test modules, each with its
  #[cfg(test)].
- xtask/src/main.rs: #2302's test_selected and upstream's translation_gaps.
- docs: tracker / gap rows take both sides' edits, headers list both sides'
  changes, history rows of both sides newest-first. What's New: one section
  per date, newest first (the batch had 10-22 above 10-23, and second 10-21
  and 10-19 sections); no line lost.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 02:26:48 +03:00
Brandon Thomas 73f1b4906e Merge PR #2622
# Conflicts:
#	docs/gaps.md
2026-10-23 17:21:18 -04:00
Brandon Thomas 1acd2938ea Merge PR #2546
# Conflicts:
#	docs/gaps.md
#	docs/parity-checklist.md
#	docs/whats-new.md
2026-10-23 17:21:18 -04:00
Brandon Thomas bbf9b713f2 Merge PR #2526
# Conflicts:
#	docs/gaps.md
#	docs/parity-checklist.md
#	docs/whats-new.md
2026-10-23 17:21:17 -04:00
francoisgnandClaude Opus 5.5 b840f3f290 Round 3a: Edit In reports an editor that won't open in its result; doc header and history fixes
CodeRabbit on #2689 (head 0d64d9ef3):
- Edit In (#1417) returned an error when the editor failed to open although
  photo.editExternal had already added the copies to the library, so a script
  retrying on ok:false made another set each time. It now succeeds with
  `failed` set (null on success, as open_originals) and a toast saying why.
  Test edit_in_reports_an_editor_that_wont_open_without_failing fails without
  the fix.
- docs/gaps.md, docs/parity-checklist.md: one entry was listed twice on the
  Change line.
- Revision-history rows the batch added now read newest-first (gaps,
  parity-checklist, localization-parity, target-app-parity); upstream's own
  rows are left where they were.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 21:01:46 +03:00
Marco Arnulfo 6c55a76e95 LR-LIB-FILTER: Cmd+L / Ctrl+L (View > Enable Filters) switches the library filter off and on again as it was 2026-10-23 17:38:34 +02:00
francoisgn 309b4f1b57 Merge PR #2685 (review round 9bb072fe4)
# Conflicts:
#	docs/gaps.md
2026-10-23 18:19:48 +03:00
Claude 9bb072fe4a #2672: a stale destination window refuses Create a new library too; tests read confirm's error, not the last toast
Review follow-up on #2685. CodeRabbit: the library-switch check ran for Merge only, so a window left over from before a switch could still make a library from defaults that described the old one; it now covers both choices (new test). The Mac session: on macOS the switch's own notice can replace the error toast before the test reads it, so the stale-window tests check confirm's error directly. docs/gaps.md gap 13 updated with the parity row (CodeRabbit).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AbegtYaPuwqZ81pGfELsFK
2026-10-23 14:37:06 +00:00
SylvainandClaude Sonnet 4.6 7bcf5da99f docs: add gap 30 — multi-select metadata editing UI
The engine already applies photo.setMeta to all selected photos via
targets(), but the Info panel and All Metadata dialog always show a
single photo's values with no mixed-value indication.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-10-22 23:34:56 +02:00
francoisgnandClaude Opus 5.5 7d572918a4 Integration: tracker rows merged from each PR's own change; Frame Rate named for the thing (#1313 vs #2195)
- docs/parity-checklist.md, docs/gaps.md, docs/target-app-parity.md: rows two PRs both
  changed had been kept twice by the doc resolution. Each row is now upstream main's row
  plus every merged PR's own edit (3-way against the PR's merge base), so main's newer
  text is kept (LR-LIB-FLAG #1013, Lanczos-3 in LR-MERGE-HDR / -PANO, LR-EXP-DIM #1620,
  gaps 8 and 10) and the PRs' additions too; LR-BEHAV-LOCALE / -LOCALIZE take main's
  Georgian and #1846's Polish. `cargo xtask parity --write` refreshed the summary.
- #1313 added "Show Frame Rate", a switch; #2195 names switches for what they show
  (menubar::tests::toggles_are_named_for_the_thing_not_show): now "Frame Rate".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 23:19:10 +03:00
francoisgn 5426e5ca66 Merge PR #2072: Export: add Thai glyph fallback only (#2052, partial)
# Conflicts:
#	docs/gaps.md
#	docs/parity-checklist.md
2026-10-22 22:31:16 +03:00
francoisgn b3c5b25b9a Merge PR #2302: Gap 9: cargo xtask ci on every PR (Linux x64); ci --quick; o
# Conflicts:
#	CLAUDE.md
#	docs/gaps.md
#	docs/target-app-parity.md
2026-10-22 22:31:14 +03:00
francoisgn f2ffc34b14 Merge PR #2468: Print: Japanese photo and postcard paper sizes (L判・2L・KG・はがき
# Conflicts:
#	docs/gaps.md
#	docs/parity-checklist.md
2026-10-22 22:28:41 +03:00
francoisgn cd6bc4be6f Merge PR #2513: KEY-GRID: show the cycle shortcut in the View menu (#2500)
# Conflicts:
#	docs/parity-checklist.md
2026-10-22 22:28:41 +03:00
francoisgn b32b4383f5 Merge PR #1074: LR-VIEW-ZOOM: diagnostic overlays render zoom windows; soft
# Conflicts:
#	docs/gaps.md
#	docs/parity-checklist.md
#	docs/ui-parity.md
2026-10-22 22:28:28 +03:00
midasdf 867284656e Merge origin/main into #2468: keep main's work and the Japanese paper sizes
Both sides' revision-history rows and change lines are kept (newest first);
print_view.rs auto-merged, so main's shared context_menu call sits beside the
PR's current_paper()/paper_name() punctuation and alias fixes.

# Conflicts:
#	ROADMAP.md
#	docs/gaps.md
#	docs/parity-checklist.md
2026-10-22 23:37:29 +09:00
tylerphotosandCodex 6677edd107 KEY-GRID: reconcile grid shortcut hints with current main
Preserve upstream menu additions and progress documentation while retaining
the focused grid shortcut and native ownership fix. All eight CI gates, five
Windows regressions and native acceptance passed on this exact merged tree.

Co-Authored-By: Codex <noreply@openai.com>
2026-10-22 07:35:20 -05:00
Alex Chambers 0cfc70b2fa Issue #2052: merge main and limit export fallback to Thai
Keep the existing Inter and CJK export order and the UI font chain.
Defer Arabic export faces until joining and bidirectional ordering exist.
Restore main's headline documents and record remaining text-layout limits.
2026-10-22 13:27:10 +02:00
ronibalthazar 6413bccbfd #2519: read PSD and PSB metadata 2026-10-22 11:20:53 +01:00
ronibalthazar 8d4e6e1e01 LR-META-XMP: preserve foreign namespace collisions 2026-10-22 06:42:11 +01:00
tylerphotosandCodex 48e1cde8b7 KEY-GRID: show live cycle shortcut in View menus
Fixes #2500. Preserve direct menu selection and native accelerator ownership.

Co-Authored-By: Codex <noreply@openai.com>
2026-10-21 22:32:43 -05:00
aiongg 8daa25c4c9 Merge track r2-t04 into next
# Conflicts:
#	ROADMAP.md
#	docs/gaps.md
#	docs/parity-checklist.md
#	docs/target-app-parity.md
#	docs/whats-new.md
2026-10-22 02:53:42 +00:00
aiongg 727e66babe Merge track r2-t03 into next
# Conflicts:
#	docs/gaps.md
#	docs/parity-checklist.md
#	docs/ui-parity.md
#	docs/whats-new.md
2026-10-22 02:53:00 +00:00
aiongg 3300e6dad8 Merge track r2-t01 into next
# Conflicts:
#	docs/gaps.md
#	docs/parity-checklist.md
#	docs/raw/coverage.tsv
#	docs/whats-new.md
2026-10-22 02:49:52 +00:00
aiongg d26c11a676 Merge track r2-t02 into next
# Conflicts:
#	docs/gaps.md
#	docs/parity-checklist.md
#	docs/whats-new.md
2026-10-22 02:42:47 +00:00
aiongg 70e9338085 Merge PR #1040: LR-IMP-FORMATS: decode Minolta MRW
docs/parity-checklist.md: header keeps the newer date; LR-IMP-FORMATS row keeps both sides' changes.
docs/raw-parity.md: header change note names both sides' changes.
docs/raw/coverage.tsv: merged cleanly; same rows as both sides, no duplicates (regenerated on the combined branch).
2026-10-22 02:42:05 +00:00
aiongg 1e99e2e1d9 Merge PR #2386: The Windows x64 installer is verified on Windows 11
Conflicts:
- docs/gaps.md: header keeps both changes; revision rows are the union
- docs/target-app-parity.md: revision rows are the union
2026-10-22 02:41:08 +00:00
aiongg d158d75b59 Merge PR #1917: KEYC-RATING: backslash shows and hides the Filter Bar in the grids
docs/parity-checklist.md: header and revision rows from both sides

docs/ui-parity.md: header keeps the newer dates and both change notes
2026-10-22 02:40:33 +00:00
aiongg 04b099a4f5 Merge PR #1901: LR-EDIT-OPTICS-PROFILE: apply A7CR embedded distortion for corrected full-frame raws
crates/engine/src/camera_preview.rs: LOOK_VERSION keeps both history lines and the higher value.
crates/engine/src/media.rs: RENDER_CACHE_VERSION keeps the higher value.
docs/whats-new.md: both 2026-10-14 entries under one heading.
2026-10-22 02:40:09 +00:00
aiongg c61ad57601 Merge PR #2425: LR-IMP-ADD-DIALOG: preserve album hierarchy in Import Photos
docs/parity-checklist.md: header keeps 2026-10-21 and lists both sides' change notes
2026-10-22 02:39:44 +00:00
aiongg 91c465a29c Merge PR #1165: LR-IMP-FORMATS: folder import finds Sony SR2 and SRF files
docs/parity-checklist.md: LR-IMP-FORMATS row keeps main's DNG/Hasselblad text and adds #1165's SR2/SRF phrase; revision rows are the union
docs/raw-parity.md, docs/gaps.md: revision rows are the union
2026-10-22 02:39:08 +00:00
aiongg 0068d9040b Merge PR #2295: i18n: Indonesian (id) interface language
Conflicts:
- crates/ui-egui/src/i18n.rs, crates/ui-egui/src/menus.rs: language table and commands keep sv, fi and id
- crates/ui-egui/src/panels/keyword_list.rs: code list gains id; Locale::ALL.len() is 17
- docs/localization.md: language list and note links keep every language
- docs/localization-parity.md: header keeps the newer date and both changes; links and revision rows are the union
2026-10-22 02:37:53 +00:00
Bruno-Alumn d15fc0a6ce Merge remote-tracking branch 'upstream/main' into fix/f8-right-panel
# Conflicts:
#	docs/parity-checklist.md
2026-10-21 22:42:18 +00:00
tylerphotosandCodex 4245d50f2f LR-IMP-ADD-DIALOG: reconcile album picker with integrated main (#2425)
Retain both sets of parity revision notes after the upstream integration.
Keep the hierarchical picker and deleted-destination guard unchanged.

Co-Authored-By: Codex <noreply@openai.com>
2026-10-21 17:34:40 -05:00