Commit Graph
4066 Commits
Author SHA1 Message Date
Dylan M. Taylor 32e4874569 docs: explain workspace lint inheritance 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
Dylan M. Taylor 96c3190300 chore(clippy): enforce workspace lint rules 2026-10-28 03:24:17 +00:00
Dylan M. Taylor 56b5c8b076 Scan the whole repository again in SonarCloud (#3224)
* Scan the whole repository again in SonarCloud

* Classify the repository's test files as tests in SonarCloud
2026-10-27 23:18:52 -04:00
aiongg 37b2e523ad Merge pull request #3104 from Jeremy8776/feat/install-scope-policy
Windows installation policy: LightCraft
2026-10-27 17:16:18 -04:00
Jeremy 5dea67e348 docs(installer): say that an upgrade reuses the recorded folder even if it was deleted
The restore actions use the recorded folder without checking that it still
exists, so an upgrade creates it again rather than using the default folder.
2026-10-27 21:13:30 +00:00
Jeremy 59d482578a test(installer): cover the compiled folder searches, resolver chains and wizard folder replay
The policy check now reads the compiled AppSearch and RegLocator rows for the
remembered-folder properties (registry root, key, value name and type for both
scopes) and runs the DIR, FOLDER, PATH and legacy exe actions in sequence order
against seeded values, so their precedence and the preset-folder guard cannot
regress. It also replays the wizard folder actions in sequence order (a
remembered folder beats the new-install default, a typed folder beats both) and
requires the machine restore action between the scope page and costing.
2026-10-27 21:13:28 +00:00
aiongg 97eb5fdb83 ci: use storytold/craft-common-actions at the merged installer-policy commit 2026-10-27 20:51:53 +00:00
Jeremy b0485b0427 fix(installer): check the exact architecture-specific machine folder
The pre-signing check matched any folder named Program Files, so it rejected
a valid MSI when Windows resolves Program Files elsewhere, accepted the 64-bit
root for an x86 package and accepted a different app name. Build the expected
folder from the package architecture's resolved root and the policy name.
2026-10-27 19:13:20 +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
Jeremy 79f662a584 fix(installer): resolve the wizard scope and folder correctly
Real msiexec runs (per-user and all-users, silent and wizard) found two defects
that the metadata fixtures cannot see:

- "Only for me" published ALLUSERS=2, so FindRelatedProducts treated the run as
  per-machine and skipped the existing per-user copy. An interactive upgrade
  left two registered products and uninstall left files behind. The page now
  leaves ALLUSERS unset for a per-user choice.
- Windows Installer resolves Program Files once, for the context it started in,
  so choosing "Everyone" in the wizard installed into the user profile with a
  machine-wide registration. The wizard now sets the new-install folder itself
  after the choice (Program Files, Program Files (x86) for 32-bit, or the
  per-user Programs folder). Silent installs are unchanged.

check-install-policy.ps1 now fails if either regresses.
2026-10-27 15:32:29 +00: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
Jeremy ea5db140fb docs(installer): say that silent installs are per-user and when the scope page appears 2026-10-27 12:26:56 +00:00
Jeremy 51ecbfece8 docs(installer): note that the 32-bit all-users folder is Program Files (x86); tidy wording 2026-10-27 12:25:19 +00:00
Jeremy 3d40cf08e7 docs(installer): describe the per-user default install location and scope 2026-10-27 12:09:03 +00:00
Jeremy 148cc09be1 fix(installer): harden install-policy checks and packaging-lint workflow 2026-10-27 12:01:29 +00:00
Jeremy bf86920980 fix(installer): address scope and ARM64 review feedback 2026-10-27 12:01:28 +00:00
Jeremy ea9130676b feat(installer): default to a per-user ArtCraft folder 2026-10-27 12:01:28 +00: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