Commit Graph
3441 Commits
Author SHA1 Message Date
Brandon Thomas 273e9078de Merge PR #2969 2026-10-30 15:24:30 -04:00
Brandon Thomas 5693a3aeaa Merge PR #2540 2026-10-30 15:24:30 -04:00
Brandon Thomas bdb146be43 Merge PR #2833 2026-10-30 15:24:30 -04:00
Brandon Thomas ef83f30327 Merge PR #2834 2026-10-30 15:24:30 -04:00
Brandon Thomas 19eb08dc25 Merge PR #2909 2026-10-30 15:24:30 -04:00
Brandon Thomas b7c52c5032 Merge PR #2918 2026-10-30 15:24:30 -04:00
Brandon Thomas 181a580579 Merge PR #3366 2026-10-30 15:24:30 -04:00
Brandon Thomas 9140e8cd38 Merge PR #3267 2026-10-30 15:24:30 -04:00
Max MittelstädtandGPT-6-Luna b25808686d Reject mismatched XML closing tags
Found while testing crates/lensdb/src/xml.rs:77

Co-Authored-By: GPT-6-Luna <noreply@openai.com>
2026-10-30 06:10:13 +00:00
Dylan M. Taylor 445dd3106e Update prompt shows the app icon and accent color instead of a letter (#3362)
UPDATE_APP (native builds; craft-update is a native-only dependency) carries our 128 px icon and accent (#f2a516, its colour in ArtCraft Launcher). The updater, the self-update
helper and craft-update's startup prompt all get them through crate::UPDATE_APP; the
prompt draws the icon, the accent and "by ArtCraft" (craft-update's default developer).

craft-update is pinned to storytold/craft-libs main at 1065653e7 (#434).
Clippy fixes for Rust 1.99 in untouched code (same logic):
- crates/engine/src/cmd/export.rs
- crates/ui-egui/src/dialogs/rules_editor/rules_move.rs
- crates/ui-egui/src/panels/detail.rs
2026-10-30 01:27:49 -04:00
Max MittelstädtandGPT-6-Luna 7ab2575505 Reject ZIP entries with inconsistent decoded sizes
Found while testing crates/geocode/src/unzip.rs:64

Co-Authored-By: GPT-6-Luna <noreply@openai.com>
2026-10-28 16:41:59 +00:00
Dylan M. Taylor 307ecb981d fix(ui-egui): keep the Export dialog's original spacing before the preset row 2026-10-28 04:06:29 +00:00
Dylan M. Taylor 6e54232557 test: factor long UI and MCP scenarios into helpers 2026-10-28 03:25:18 +00:00
Dylan M. Taylor ce3ce07771 refactor(ui-egui): split the top bar and slider widget 2026-10-28 03:25:18 +00:00
Dylan M. Taylor f858578f8c refactor(ui-egui): split the detail view, mask overlay and denoise panel 2026-10-28 03:25:18 +00:00
Dylan M. Taylor 4ed9a5c869 refactor(ui-egui): split the grid cell and context menu 2026-10-28 03:25:18 +00:00
Dylan M. Taylor 620826cac0 refactor(ui-egui): shorten functions that format localized messages 2026-10-28 03:25:18 +00:00
Dylan M. Taylor 7b4236bc8b refactor(ui-egui): pass related arguments as small structs 2026-10-28 03:25:18 +00:00
Dylan M. Taylor b74612513c refactor(ui-egui): split the Export dialog body into sections 2026-10-28 03:24:18 +00:00
Dylan M. Taylor 8c3dd7ebd2 refactor(ui-egui): split dialog frame into title, buttons and confirm 2026-10-28 03:24:18 +00:00
Dylan M. Taylor 335defee47 refactor(ui-egui): one function per dialog body 2026-10-28 03:24:18 +00:00
Dylan M. Taylor 627804c161 refactor(ui-egui): split import finish and print settings 2026-10-28 03:24:18 +00:00
Dylan M. Taylor 63755f8a2e refactor(ui-egui): split the global shortcut dispatcher 2026-10-28 03:24:18 +00:00
Dylan M. Taylor 2f3002bc5c refactor(ui-egui): split preset import and find-missing commands 2026-10-28 03:24:18 +00:00
Dylan M. Taylor 71bf82f7bb refactor(ui-egui): split run_ui_command into parts and per-command functions 2026-10-28 03:24:18 +00: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 ca69e74b62 fix(raw): check opcode byte counts without overflow 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 47839a61db refactor(bench): dispatch specialized render modes 2026-10-28 03:24:18 +00:00
Dylan M. Taylor 9c1ea73116 refactor(gpu): extract neural plan validation 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 de6cb3cd41 refactor(codecs): separate TIFF sample encoders 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 a3da2d1040 refactor(denoise): model Bayer tile regions 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
Dylan M. Taylor 2c7d98b5e2 refactor(raw): separate DNG metadata and opcode parsing 2026-10-28 03:24:18 +00:00
Dylan M. Taylor c1766c016b refactor(scenes): model water lighting parameters 2026-10-28 03:24:18 +00:00
Dylan M. Taylor 38c3232214 refactor(meta): isolate descriptive metadata merging 2026-10-28 03:24:18 +00:00
Dylan M. Taylor 59083081ae fix(sysmem): inherit workspace Clippy denies 2026-10-28 03:24:18 +00:00
Dylan M. Taylor c7ef259f36 refactor(heif): isolate SPS VUI parsing 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
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