Commit Graph
1422 Commits
Author SHA1 Message Date
Chad ElliottandClaude Opus 5.5 a31a43670b fix(lightroom): content duplicates start from import defaults; Show in Library skips Recently Deleted (#2589)
A catalog photo whose bytes match another library photo got the generic develop defaults, so a raw
with no white balance or lens setting in the catalog lost its as-shot white balance and embedded
lens corrections and rendered unlike a file import. It now gets the import defaults (camera
defaults plus the default preset), as a file import does, before the catalog's settings go on top.

Show in Library selected the lowest mapped photo id, which can be a master left in Recently Deleted
whose new virtual copy the import added; All Photos doesn't show it. It now selects the lowest
mapped photo not in Recently Deleted, and the button is left out when there is none.

Tests: a content-duplicate raw with no catalog settings equals its camera defaults (as-shot WB,
lens profile on); Show in Library skips a trashed mapped photo and offers nothing when only
trashed or vanished ids are mapped.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 23:56:50 -05:00
Chad ElliottandClaude Opus 5.5 7c74ae0ac3 Issue #2589: a content duplicate starts from the file, not from the other photo's record
The new record for a catalog photo whose bytes match another library photo copied that whole
record and reset a few fields, so the other photo's edits, history, versions, ratings and written
metadata (title, keywords, face regions) carried over, from a trashed photo too. It now starts as a
new photo and takes only what the bytes determine: format, size, kind, capture time, camera EXIF,
GPS, focus point, content hash, embedded lens data and preview-only state. The catalog's own
settings and metadata apply on top as before.

Tests: the duplicate test gives the other photo edits, history, a version, a title, keywords and a
Local baseline and checks none reach the new record; a reimport after a master and its virtual copy
were trashed counts each once.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 23:56:50 -05:00
Chad ElliottandClaude Opus 5.5 de9b0a8951 Issue #2589: a Lightroom import never creates a photo already in Recently Deleted
A catalog photo whose file matched a photo in Recently Deleted by content was cloned with the trashed
record's `deleted` flag (and its virtual-copy fields), so it landed in Recently Deleted while the report
counted it as imported. A new virtual copy of a trashed master did the same. Both are now live records,
as Create Virtual Copy already does.

Catalog photos matched by path to a trashed photo stay there (the Lightroom import's OnDeleted::Skip,
#706); the report counts them as `inRecentlyDeleted` and the result window says so in one line.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-29 23:56:50 -05:00
Dylan M. Taylor 6774d1419f refactor(ui-egui): replace wildcard imports with explicit lists 2026-10-28 03:24:18 +00:00
Dylan M. Taylor 5b5ddc3904 fix(engine): import denoise model and gpu names explicitly 2026-10-28 03:24:18 +00:00
Dylan M. Taylor c9d44f7804 style(engine): expand module imports explicitly 2026-10-28 03:24:18 +00:00
Dylan M. Taylor 4d8369b091 test(engine): factor complex regression scenarios 2026-10-28 03:24:18 +00:00
Dylan M. Taylor 9e1483388f refactor(import): separate Lightroom collection staging 2026-10-28 03:24:18 +00:00
Dylan M. Taylor e8f52cc07e refactor(print): define blit rectangles 2026-10-28 03:24:18 +00:00
Dylan M. Taylor 33252920e3 refactor(denoise): model installation requests 2026-10-28 03:24:18 +00:00
Dylan M. Taylor 694b237f0a refactor(faces): model crop and plane shift inputs 2026-10-28 03:24:18 +00:00
Dylan M. Taylor 2f42ff8944 refactor(pipeline): group pixel finish parameters 2026-10-28 03:24:18 +00:00
aiongg 07bc2008d9 Merge pull request #3045 from dotCooCoo/fix/local-skips-windows-hidden-folders
Local: skip offscreen folder widgets and show browsed hidden paths
2026-10-27 13:47:10 -04:00
aiongg 94ea495bdb Merge pull request #3020 from dotCooCoo/fix/windows-hard-link-write-target
Originals: on Windows a hard link to an original counts as that original
2026-10-27 13:46:50 -04:00
NetterSilverandClaude Opus 5.5 3ce8dbc55b Drop copies and libm calls from 8-bit export encoding
- finish_8bit/finish_deep hand back the render itself when there is no
  output sharpening and no watermark. Before, every export cloned the
  image (~100 MB at 24 MP) and output_sharpen built a ~290 MB float copy
  of it even for SharpenFor::None, all on one thread.
- Output sharpening's box blurs run row-parallel (par_rows); each pixel
  is computed as before.
- The parallel JPEG encoder converts each band's rows to YCbCr inside the
  band's task instead of first filling whole-image planes (~290 MB for
  4:4:4 at 24 MP, written once and read back).
- fdct_quant rounds with plain arithmetic (round_i16) instead of
  f32::round, a libm call per coefficient without SSE4.1; it equals
  `x.round() as i16` for all 2^32 inputs.

Output is byte-identical (pinned by encoded_bytes_are_pinned and
sharpened_pixels_are_pinned, whose hashes come from main).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 15:43:41 +01:00
dotCooCoo d826e79fa2 Skip offscreen Local rows and share hidden-folder checks
Reuse cached folder listings through Arc and allow tests to inject Local places.
Show browsed folders below hidden ancestors as session roots. Apply the same
hidden-entry checks to folder walks, browsing, import scanning, and Local.
2026-10-26 22:36:11 -07:00
dotCooCoo 0c7640f7d3 Reject unavailable Windows file identities in strict comparisons
Return an error when either file index is zero. Keep the resolved-path fallback for lenient comparisons. Test both unknown-identity orderings and distinguish identity lookup failures from known-original refusals.

Merge main at 662df66f.
2026-10-26 20:28:34 -07:00
skylar taylor-barrick 662df66f1c Preserve queued file drops across dialogs and restore Flatpak sources (#2975) 2026-10-27 03:50:41 +01:00
aiongg 8d8994ec87 refactor(lightcraft-engine): split cmd/library.rs into cmd/library/ 2026-10-26 21:39:56 +00:00
aiongg ff614cbe43 refactor(lightcraft-engine): split import.rs into import/ 2026-10-26 21:39:56 +00:00
aiongg 39d6a8d668 refactor(lightcraft-engine): split rename.rs into rename/ 2026-10-26 21:39:55 +00:00
aiongg 8942984c35 refactor(lightcraft-engine): split denoise.rs into denoise/ 2026-10-26 21:39:55 +00:00
aiongg 21304db29b refactor(lightcraft-engine): split media.rs into media/ 2026-10-26 21:08:55 +00:00
aiongg 50509093b6 refactor(lightcraft-engine): split camera_preview.rs into camera_preview/ 2026-10-26 21:08:55 +00:00
aiongg e3c594cab8 refactor(lightcraft-engine): split export.rs into export/ 2026-10-26 21:08:55 +00:00
aiongg 9b197d8215 refactor(lightcraft-engine): split files.rs into files/ 2026-10-26 21:08:55 +00:00
aiongg 658f3c26d5 refactor(lightcraft-engine): move denoise gpu_tests to denoise/gpu_tests.rs 2026-10-26 21:05:53 +00:00
aiongg 7707047684 refactor(lightcraft-engine): move media thumbnail_hash_tests to media/thumbnail_hash_tests.rs 2026-10-26 21:05:53 +00:00
aiongg d151df0149 style: cargo fmt the moved test modules 2026-10-26 18:30:36 +00:00
aiongg 73adafbae0 refactor(lightcraft-engine): move tests_slide_template.rs to slide_template/tests.rs 2026-10-26 18:28:42 +00:00
aiongg 9cc8a1c765 refactor(lightcraft-engine): move tests_*.rs to tests/ 2026-10-26 18:24:54 +00:00
aiongg c579f226ab refactor(lightcraft-engine): move print/compose.rs tests to crates/engine/src/print/compose/tests.rs 2026-10-26 18:15:58 +00:00
aiongg e6b0b386a7 refactor(lightcraft-engine): move print/layout.rs tests to crates/engine/src/print/layout/tests.rs 2026-10-26 18:15:57 +00:00
aiongg 41064fabb5 refactor(lightcraft-engine): move crs.rs tests to crates/engine/src/crs/tests.rs 2026-10-26 18:15:57 +00:00
aiongg a3ec3eadef refactor(lightcraft-engine): move rename.rs tests to crates/engine/src/rename/tests.rs 2026-10-26 18:15:57 +00:00
aiongg 89083b6c77 refactor(lightcraft-engine): move camera_preview.rs tests to crates/engine/src/camera_preview/tests.rs 2026-10-26 18:15:56 +00:00
aiongg 68abc4d4ce refactor(lightcraft-engine): move slideshow.rs tests to crates/engine/src/slideshow/tests.rs 2026-10-26 18:15:55 +00:00
aiongg c0fe58a144 refactor(lightcraft-engine): move demo.rs tests to crates/engine/src/demo/tests.rs 2026-10-26 18:15:55 +00:00
aiongg 102fa85a9c refactor(lightcraft-engine): move files.rs tests to crates/engine/src/files/tests.rs 2026-10-26 18:15:55 +00:00
aiongg a70d39eacd refactor(lightcraft-engine): move slide_overlay.rs tests to crates/engine/src/slide_overlay/tests.rs 2026-10-26 18:15:54 +00:00
aiongg 34f15b567f refactor(lightcraft-engine): move lightroom_sqlite.rs tests to crates/engine/src/lightroom_sqlite/tests.rs 2026-10-26 18:15:53 +00:00
aiongg 698ca5a884 refactor(lightcraft-engine): move lightroom_catalog.rs tests to crates/engine/src/lightroom_catalog/tests.rs 2026-10-26 18:15:53 +00:00
aiongg 619f346e74 refactor(lightcraft-engine): move apple_photos.rs tests to crates/engine/src/apple_photos/tests.rs 2026-10-26 18:15:52 +00:00
aiongg 6cf21f552a refactor(lightcraft-engine): move crs_masks.rs tests to crates/engine/src/crs_masks/tests.rs 2026-10-26 18:15:52 +00:00
aiongg 47adb933db refactor(lightcraft-engine): move smart.rs tests to crates/engine/src/smart/tests.rs 2026-10-26 18:15:52 +00:00
aiongg 50116167a6 refactor(lightcraft-engine): move export.rs tests to crates/engine/src/export/tests.rs 2026-10-26 18:15:51 +00:00
aiongg 858046cc4f refactor(lightcraft-engine): move media.rs tests to crates/engine/src/media/tests.rs 2026-10-26 18:15:50 +00:00
aiongg 728f223ee5 refactor(lightcraft-engine): move crates/engine/src/segment/mod.rs to crates/engine/src/segment.rs 2026-10-26 18:15:08 +00:00
aiongg 15030abbb5 refactor(lightcraft-engine): move crates/engine/src/print/mod.rs to crates/engine/src/print.rs 2026-10-26 18:15:08 +00:00
aiongg 1ebee97353 refactor(lightcraft-engine): move crates/engine/src/cmd/mod.rs to crates/engine/src/cmd.rs 2026-10-26 18:15:07 +00:00