Commit Graph
4050 Commits
Author SHA1 Message Date
Nathaniel Ledford abb3f03154 LR-IMP-ADD-DIALOG: an import's probe opens each file once
The probe asked for a file's size, read it (an open and its own size question), and then asked for its modification time again by path: three round trips to a network share's server for what one open can answer. It now opens the file once and takes the size and the modification time from the open file. What is read, the work-gate weight, and the text of the error for a file that can't be read are unchanged.
2026-10-27 14:04:50 -04: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
aiongg 4a9cad3c15 Merge pull request #3168 from Silvertree2010/perf/export-speed
Speed up full-size exports by removing copies and serial passes
2026-10-27 13:41:52 -04:00
NetterSilverandClaude Opus 5.5 93487af3b3 Cut serial work from raw development and GPU transfers
- RawImage::develop demosaics only the default crop with AHD when there
  is no OpcodeList3 (ahd_window), instead of demosaicing the margin too
  and then copying the crop out of the full picture on one thread.
- Gpu::upload writes through queue.write_buffer_with and copies into
  the staging buffer in parallel parts. create_buffer_init zeroed a
  staging buffer and then copied over it, two single-threaded passes
  over a full-size photo's ~290 MB.
- finish_and_read copies the mapped readback out in parallel parts (one
  thread read the 91 MB of a 24 MP export at ~2 GB/s, ~45 ms).

Output is byte-identical (ahd_window_is_the_crop_of_the_whole,
uploads_read_back_exactly).

Export of a 24 MP ARW to full-size JPEG (examples/export_bench, 75
interleaved runs each on a shared 16-thread Ryzen):
main 802 ms median / 614 ms min -> this branch 647 / 525 (-19.3% / -14.5%).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 15:43:41 +01: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
NetterSilverandClaude Opus 5.5 30d0a37051 Add a single-photo export benchmark
examples/export_bench imports the files given and runs export_photo
(decode, full-size render, encode) N times, forgetting the decoded
original between runs like a batch export does, and prints the median
and minimum wall time. OPT takes export options as app.export JSON,
PHASES=1 times render and encode separately, OUT=dir writes the files
for byte comparisons between builds.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 15:43:41 +01:00
aiongg 3a3e49af53 fix(ui): dropdown menus grow back after a search with no matches (#3154)
* Use craft-ui's dropdown so menus grow back after shrinking

The album picker keeps its choices and search field in a fixed header and scrolls only
the list; combo_box and the print dialog's combos use craft_ui::ComboBox. egui::ComboBox
is now disallowed by clippy.

* chore(deps): craft-libs 60d60d48 (dropdown fixes)

* chore(deps): craft-libs 6af63481 (dropdown fixes)

* chore(deps): craft-libs 4d7b82f7 (dropdown fixes)

* chore(deps): craft-libs 92d392cf (#387 merged)
2026-10-27 10:27:42 -04: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 c9860ea7a3 Merge pull request #3103 from aiongg/layout
refactor: shared module layout (craft-contrib#20)
2026-10-26 21:31:21 -04:00
aiongg 259208948b test: the format-message scan skips only inline test modules 2026-10-26 21:51:51 +00:00
aiongg 69048937d0 docs: update source paths after the layout moves 2026-10-26 21:39:56 +00:00
aiongg 26760e44d2 refactor(lightcraft-ui-egui): split app.rs into app/ 2026-10-26 21:39:56 +00:00
aiongg cb2a922383 refactor(lightcraft-ui-egui): split lib.rs into crate-root modules 2026-10-26 21:39:56 +00:00
aiongg 20c26b83c8 refactor(lightcraft-ui-egui): split dialogs/import.rs into dialogs/import/ 2026-10-26 21:39:56 +00:00
aiongg b0356787e3 refactor(lightcraft-ui-egui): split dialogs/settings.rs into dialogs/settings/ 2026-10-26 21:39:56 +00:00
aiongg 56494a1308 refactor(lightcraft-ui-egui): split dialogs.rs into dialogs/ 2026-10-26 21:39:56 +00:00
aiongg 0896aa86ce refactor(lightcraft-ui-egui): split state.rs into state/ 2026-10-26 21:39:56 +00:00
aiongg db31bf3e59 refactor(lightcraft-ui-egui): split panels/right.rs into panels/right/ 2026-10-26 21:39:56 +00:00
aiongg 8c194d155e refactor(lightcraft-ui-egui): split panels/edit.rs into panels/edit/ 2026-10-26 21:39:56 +00:00
aiongg 4e13f61ba0 refactor(lightcraft-ui-egui): split panels/left.rs into panels/left/ 2026-10-26 21:39:56 +00:00
aiongg 15ece5cbd0 refactor(lightcraft-ui-egui): split menus.rs into menus/ 2026-10-26 21:39:56 +00:00
aiongg 401e047acc refactor(lightcraft-ui-egui): split panels/detail.rs into panels/detail/ 2026-10-26 21:39:56 +00:00
aiongg 2e5597d48a refactor(lightcraft): split main.rs into crate-root modules 2026-10-26 21:39:56 +00:00
aiongg 59d1d6f0f8 refactor(xtask): point the raw corpus test and ci-quick map at the moved sources 2026-10-26 21:39:56 +00:00
aiongg 27abe75572 refactor(xtask): split main.rs into crate-root modules 2026-10-26 21:39:56 +00: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 745111dc6d refactor(lightcraft-ui-egui): move panels/right tests to panels/right/tests.rs 2026-10-26 21:05:54 +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 b17f6cbe93 refactor(lightcraft-ui-egui): move progress.rs to widgets/progress.rs 2026-10-26 20:41:12 +00:00
aiongg 0d3ee604f3 refactor(lightcraft-ui-egui): move text_field.rs to widgets/text_field.rs 2026-10-26 20:41:12 +00:00
aiongg 8a9de1f616 refactor(lightcraft-ui-egui): move rating.rs to widgets/rating.rs 2026-10-26 20:41:12 +00:00
aiongg 204f8ea365 refactor(lightcraft-ui-egui): move button.rs to widgets/button.rs 2026-10-26 20:41:12 +00:00
aiongg 2a4bd99a4d refactor(lightcraft-ui-egui): move date_picker.rs to widgets/date_picker.rs 2026-10-26 20:41:12 +00:00
aiongg 6ea7f1dc55 refactor(lightcraft-ui-egui): move album_picker.rs to widgets/album_picker.rs 2026-10-26 20:41:12 +00:00
aiongg 74836daa84 refactor(lightcraft-ui-egui): move menu_level.rs to menus/menu_level.rs 2026-10-26 20:41:12 +00:00
aiongg 64b6a0e3c2 refactor(lightcraft-ui-egui): move menubar.rs to menus/menubar.rs 2026-10-26 20:41:12 +00:00
aiongg c7171d6834 refactor(lightcraft-ui-egui): move panels/slide_titles.rs to dialogs/settings/slide_titles.rs 2026-10-26 20:41:12 +00:00
aiongg f3d8862239 refactor(lightcraft-ui-egui): move panels/slide_templates.rs to dialogs/settings/slide_templates.rs 2026-10-26 20:41:12 +00:00
aiongg 34daf9dd60 refactor(lightcraft-ui-egui): move panels/slide_overlays.rs to dialogs/settings/slide_overlays.rs 2026-10-26 20:41:12 +00:00