Commit Graph
4826 Commits
Author SHA1 Message Date
Dylan M. Taylor ac1799db38 web: ?bench runs on demo photos in an unsaved library, never the stored one (#3646)
A navigation link with ?bench opened the first photo of the library in
browser storage and committed Exposure edits to it, finishing at 0 instead
of the photo's own value. ?bench now implies ?store=memory and loads the
generated demo photos, so the benchmark cannot edit stored photos.
2026-11-02 22:50:58 -05:00
06c1b9ae07 Use crw craftlib (#3503)
* CRW-LIB: decode Canon CRW through the shared craft-crw crate

LightCraft decodes Canon CRW (the CIFF raws of the EOS D30, D60, 10D, 300D and the
PowerShot G1/G6) through craft-libs' `craft-crw`, the clean-room decoder derived and
verified on the `clean-room-crw-format-decode` branch and moved there with its frozen
tables and derivation record. `crates/raw/src/vendor/crw.rs` is now the adapter: it maps
the crate's header and samples onto `RawImage` (CFA, levels, active area, orientation,
as-shot white balance, the make/model/time records a CRW keeps instead of Exif) and
converts the capture time through chrono. The dependency is a local path
(`../craft-libs/crates/crw`) until the craft-libs branch merges; then it becomes a git
revision.

Everything LightCraft-side from that branch comes along unchanged: `probe_bytes` fills
metadata gaps from the decoder's records so CRW imports name their camera; the EOS D60
bundled camera profile and its chart-measured dual-illuminant matrices (`chart_table.rs`,
`spectral::Camera` carries its illuminant pair) give the D60 a Kelvin white-balance scale;
CRW joins the JPEG-fitted starting look, the catalog's raw formats and `lightcraft-cli
calibrate`; `RENDER_CACHE_VERSION` 71; the CC0 CRW corpus entries for `cargo xtask corpus`;
coverage, parity, gaps, raw-parity, target-app-parity and ROADMAP updates. The G5 stays
preview-only (the crate refuses it with the reason) and the robustness test keeps its CRW
sample.

What does not come along: the decoder, its tables and `crw_oracle.rs` (now craft-crw's
digest-pinned sample test) and the derivation record, which lives in craft-libs
`crates/crw/clean-room/`. `clean-room/crw/` here keeps only the EOS D60 chart-calibration
document and its capture list, with a README pointing at the record.

Gates: fmt, clippy -D warnings (raw all targets; engine, catalog, cli), lightcraft-raw tests
(475 + 134, the corpus files decoding through the adapter), catalog tests, engine lib tests
(1,300 pass; the two failures, `tests_import::recursive_discovery_…` and
`originals::tests::write_targets_pin_absent_paths_…`, are in files unchanged from main),
`cargo xtask parity`, `assets`, `layers`, `coverage.py --check`.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>

* no message

* no message

* Update documentation after moving code to craft-libs

* Review coment fixes

* CRW: pin craft-crw f3b62ec, a truncated entropy stream is Corrupt

craft-libs #472 makes craft_crw::decode refuse a stream that ends more than
Limits::max_stream_end_fill (64 samples, one block) before the frame does,
instead of filling the rest with predictor values and returning success.
The adapter already maps craft_crw::Error::Corrupt to RawError::Corrupt;
a regression test proves a truncated CRW now fails at this boundary (it
decoded as a flat frame on the old pin) while its header still reads.

Only craft-crw moves; craft-ui/docpath/update/window stay on c5a1cbf.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Code review comment fix

* Add some tests

---------

Co-authored-by: Robert Woldberg <314159+rwoldberg@users.noreply.github.com>
Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
2026-11-02 20:41:34 -05:00
Brandon ThomasandClaude Opus 5.5 32d569ad5d Release 0.18.0
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
v0.18.0
2026-11-02 19:26:25 -05:00
Brandon Thomas ebe2477108 Merge PR #3443: keep unequal margins when merging full settings with linkMargins on
Keep unequal margins when merging full settings with linkMargins on
2026-11-02 01:13:54 -05:00
NetterSilverandClaude Sonnet 5.5 7a7be84e41 test: pin three linked margin keys boundary and wrap merged doc comment
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-02 04:33:24 +00:00
Brandon Thomas 0fad22a286 Merge PR: integration batch 46 (6 community PRs)
Integration batch 46 (6 community PRs)
2026-11-01 22:39:34 -05:00
Brandon Thomas 94bae746ed Merge PR #3563 2026-11-01 22:06:44 -05:00
Brandon Thomas d6a947bea0 Merge PR #3370 2026-11-01 22:06:44 -05:00
Brandon Thomas c37e73137e Merge PR #3442 2026-11-01 22:06:44 -05:00
Brandon Thomas 9e976e1741 Merge PR #3445 2026-11-01 22:06:44 -05:00
Brandon Thomas db30da9e6a Merge PR #3465 2026-11-01 22:06:44 -05:00
Brandon Thomas 6e943e9adc Merge PR #3515 2026-11-01 22:06:44 -05:00
Fridtjof MichelsandClaude Opus 5.5 da558f5b8f LR-VIEW-SURVEY: test that ⌘/Ctrl-click on the active survey photo activates the last one left
Review follow-up (#3563).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-01 22:34:35 +01:00
Fridtjof MichelsandClaude Opus 5.5 3609fe8466 LR-VIEW-SURVEY: the survey ⌘/Ctrl-click test covers a non-active tile and the last photo
Review follow-up (#3563): a plain click on another tile makes it active, a
⌘/Ctrl-click on a selected tile that is not active removes only that one, and
⌘/Ctrl-click on the last photo leaves it in the survey and active.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-01 22:13:54 +01:00
Fridtjof MichelsandClaude Opus 5.5 3e3955bb30 LR-VIEW-SURVEY: ⌘/Ctrl-click on a survey tile takes the photo out of the survey
As in Lightroom Classic, a ⌘/Ctrl-click on a tile in Survey deselects that
photo (library.select, mode toggle), as the hover × does; a plain click still
only makes it active, and the last photo stays so the survey never empties.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-01 21:12:47 +01:00
Brandon ThomasandClaude Opus 5.5 5a09d07530 Release 0.17.0
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
v0.17.0
2026-11-01 13:57:58 -05:00
Dylan M. Taylor 496524ced5 docs: sync Craft App Suite list with ArtCraft Launcher 2026-11-01 12:29:55 -05:00
Chad ElliottandClaude Opus 5.5 fe3b1813b1 docs(gpu): #1050 the skip check also expects the device-memory test, which a software adapter can't run out of
#3419 added a test that holds device memory until an allocation fails; on lavapipe the allocations
never fail, so it skips with the opt-in too.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 23:31:56 -05:00
NetterSilverandClaude Haiku 5.5 50879d4d26 Fix Histogram::percentile returning black when the target truncates to 0
Found while testing crates/raster/src/histogram.rs:171 (Histogram::percentile)

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-01 03:50:13 +00:00
Dylan M. Taylor 07301cbd1e ci: grant packages write permission to release workflow 2026-10-31 23:42:58 -04:00
Chad ElliottandClaude Opus 5.5 15bacc7660 docs(gpu): #1050 the skip-log check catches every GPU skip and logs to a private directory
The check grepped for "no GPU adapter" only, so the ctx unit tests' "no
GPU device" skips (and nn's "no GPU runner here") went unseen. It now
lists every "need":"gpu" line except the expected device-loss one. On
the 2026-10-30 lavapipe logs it shows all 24 GPU skips without the
opt-in (the old grep showed 21) and nothing with it.

The log goes in a new mktemp -d directory instead of a fixed /tmp name
another local user could plant a symlink at.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 22:26:51 -05:00
Chad ElliottandClaude Opus 5.5 21a7d64d46 docs(gpu): #1050 run the GPU tests locally on a software adapter
docs/gpu-pipeline.md says how to run lightcraft-gpu's tests on a machine
without a GPU: LIGHTCRAFT_GPU_ALLOW_SOFTWARE=1 admits Mesa's lavapipe on
Linux and WARP on Windows (Metal on macOS needs nothing), and
LIGHTCRAFT_SKIP_LOG shows whether anything still skipped for want of an
adapter. The comments on the variable and in equivalence.rs no longer
say CI runs them: the platform CI legs of #1148 are not landing.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 22:26:51 -05:00
Chad ElliottandClaude Opus 5.5 fc99d212f6 test(gpu): #1050 opt-in software adapter for the equivalence tests
`Gpu::new` refuses software adapters (llvmpipe / lavapipe, WARP): the CPU
pipeline is faster. CI runners have nothing else, so the CPU <-> GPU
equivalence tests have always skipped there.

`LIGHTCRAFT_GPU_ALLOW_SOFTWARE=1` admits them. The app never sets it and
the default is unchanged. On lavapipe all 134 compared renders stay within
max 1 LSB, mean <= 0.0003 LSB, the same as Metal on an M4 Pro.

The two big-source window tests used a 24 MP (288 MB) source. That is over
lavapipe's 128 MiB storage binding (the WebGPU default), so geometry ran on
the CPU and nothing was uploaded: one test failed and the other passed
without checking anything. They now use 3200 x 3200 (117 MiB): above
RETAIN_SOURCE_BYTES, so the source is still shared, and uploaded on every
adapter.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 22:26:43 -05:00
Dylan M. Taylor c50b74df9c packaging(flatpak): add OCI image build and GHCR publishing helper (#3498) 2026-10-31 18:53:05 -04:00
Brandon Thomas 2987aeef7a Merge pull request #3390 from nledford/flatpak-a11y-bus
LR-BEHAV-ACCESS: the Flatpak may talk to the accessibility bus, so Orca can read LightCraft
2026-10-31 13:11:30 -04:00
NetterSilverandClaude Haiku 5.5 4cb62dcfaa Reject overflowing LIGHTCRAFT_GPU_LIMITS values instead of panicking
Found while testing crates/gpu/src/ctx.rs:768 (parse_limits)

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-31 13:00:19 +00:00
Nathaniel Ledford a26512c39c Docs: the accessibility bus access is untested with Orca 2026-10-31 07:33:54 -04:00
Nathaniel Ledford e845b97d8d LR-BEHAV-ACCESS: the Flatpak may talk to the accessibility bus, so Orca can read LightCraft 2026-10-31 07:33:45 -04:00
NetterSilverandClaude Haiku 5.5 9d4f33a77c Match library search date: token case-insensitively
Found while testing crates/catalog/src/query.rs:178 (token_matches, the "date" branch at :215)

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-31 09:25:18 +00:00
NetterSilverandClaude Haiku 5.5 af4d1f54a7 Keep unequal margins when merging full settings with linkMargins on
Found while testing crates/slideshow/src/settings.rs:233 and :267 (merged)

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-31 08:45:28 +00:00
NetterSilverandClaude Haiku 5.5 7e92c28b23 Reject shutter fractions with a non-positive numerator or denominator
Found while testing crates/catalog/src/model.rs:160 (parse_shutter_seconds)

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-31 08:05:02 +00:00
aiongg c4fd54e0a6 Merge pull request #3430 from aiongg/integration-r3
Integration r3: 178 reviewed PRs
2026-10-31 01:59:18 -04:00
aiongg e80c3e3e13 Merge upstream main into integration-r3 2026-10-31 05:09:34 +00:00
Dylan M. Taylor 8aedfce0dc Merge pull request #3436 from aiongg/docs-tidy
docs: tidy agent, contributor and asset docs
2026-10-31 01:06:30 -04:00
Dylan M. Taylor 24a3033395 Merge pull request #3437 from aiongg/update-result-dialog
Updates: shared check-result dialog from craft-update
2026-10-31 01:06:04 -04:00
aiongg e31f826d5f updates: show check results with craft-update's CheckResultDialog 2026-10-31 04:42:29 +00:00
aiongg da3d2c768c docs: tidy wording 2026-10-31 04:26:44 +00:00
aiongg a9ac47cbce docs: tidy wording 2026-10-31 04:25:37 +00:00
aiongg ffd5a4a22b docs: tidy agent, contributor and asset docs 2026-10-31 04:17:15 +00:00
aiongg 7b6e1114a0 Integration: drop #2707 (multi-select model waits for its stack: #3106, #3107, #3108, #2757) 2026-10-31 03:49:08 +00:00
aiongg 1b5cdc89ca Integration: catalog videos pass the non-media filter (#2021 with the #2135 refusal) 2026-10-31 03:36:11 +00:00
Brandon ThomasandClaude Opus 5.5 cdf00cc84b Release 0.16.0
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
v0.16.0
2026-10-30 23:22:53 -04:00
aiongg 71aaf18818 Integration: GPX attributes use decoded_and_normalized_value (deprecated method fails clippy) 2026-10-31 03:09:09 +00:00
aiongg a4dc70c07b Integration: sort modules, merge duplicated checklist and gap rows from the combined tracks 2026-10-31 02:42:54 +00:00
aiongg ee0a627536 Merge track r3-t10
# Conflicts:
#	crates/engine/src/cmd/masks.rs
#	crates/ui-egui/locales/de.json
#	crates/ui-egui/locales/es.json
#	crates/ui-egui/locales/fr.json
#	crates/ui-egui/locales/ja.json
#	crates/ui-egui/locales/ka.json
#	crates/ui-egui/locales/pt-br.json
#	crates/ui-egui/locales/ru.json
#	crates/ui-egui/locales/uk.json
#	crates/ui-egui/locales/zh-hant.json
#	docs/gaps.md
#	docs/parity-checklist.md
#	docs/whats-new.md
2026-10-31 02:31:38 +00:00
aiongg 56c842d8fe Merge track r3-t09
# Conflicts:
#	docs/parity-checklist.md
#	docs/raw-parity.md
#	docs/ui-parity.md
#	docs/whats-new.md
2026-10-31 02:31:25 +00:00
aiongg e05c4f7e7c Merge track r3-t08
# Conflicts:
#	crates/meta/README.md
#	crates/ui-egui/locales/cs.json
#	crates/ui-egui/locales/de.json
#	crates/ui-egui/locales/es.json
#	crates/ui-egui/locales/fi.json
#	crates/ui-egui/locales/fr.json
#	crates/ui-egui/locales/id-formats.json
#	crates/ui-egui/locales/id.json
#	crates/ui-egui/locales/it.json
#	crates/ui-egui/locales/ja.json
#	crates/ui-egui/locales/ka-formats.json
#	crates/ui-egui/locales/ka.json
#	crates/ui-egui/locales/pl.json
#	crates/ui-egui/locales/pt-br.json
#	crates/ui-egui/locales/ru.json
#	crates/ui-egui/locales/sv-formats.json
#	crates/ui-egui/locales/sv.json
#	crates/ui-egui/locales/uk.json
#	crates/ui-egui/locales/vi.json
#	crates/ui-egui/locales/zh-hans.json
#	crates/ui-egui/locales/zh-hant.json
#	crates/ui-egui/src/panels/grid.rs
#	crates/ui-egui/tests/it/main.rs
#	docs/gaps.md
#	docs/library-shortcuts.md
#	docs/parity-checklist.md
#	docs/raw-parity.md
#	docs/user/guides/export-photos.md
#	docs/whats-new.md
2026-10-31 02:31:16 +00:00
aiongg 1f111b5e80 Merge track r3-t07
# Conflicts:
#	crates/engine/src/tests/libops.rs
#	docs/gaps.md
#	docs/parity-checklist.md
#	docs/whats-new.md
2026-10-31 02:30:21 +00:00
aiongg 8415fd6a90 Merge track r3-t06
# Conflicts:
#	docs/parity-checklist.md
#	docs/whats-new.md
2026-10-31 02:30:12 +00:00
aiongg 0fa59f8846 Merge track r3-t05
# Conflicts:
#	crates/ui-egui/locales/cs-formats.json
#	crates/ui-egui/locales/cs.json
#	crates/ui-egui/locales/de-formats.json
#	crates/ui-egui/locales/de.json
#	crates/ui-egui/locales/es-formats.json
#	crates/ui-egui/locales/es.json
#	crates/ui-egui/locales/fi-formats.json
#	crates/ui-egui/locales/fi.json
#	crates/ui-egui/locales/fr-formats.json
#	crates/ui-egui/locales/fr.json
#	crates/ui-egui/locales/id-formats.json
#	crates/ui-egui/locales/id.json
#	crates/ui-egui/locales/it-formats.json
#	crates/ui-egui/locales/it.json
#	crates/ui-egui/locales/ja-formats.json
#	crates/ui-egui/locales/ja.json
#	crates/ui-egui/locales/ka-formats.json
#	crates/ui-egui/locales/ka.json
#	crates/ui-egui/locales/pl-formats.json
#	crates/ui-egui/locales/pl.json
#	crates/ui-egui/locales/pt-br-formats.json
#	crates/ui-egui/locales/pt-br.json
#	crates/ui-egui/locales/ru-formats.json
#	crates/ui-egui/locales/ru.json
#	crates/ui-egui/locales/sv-formats.json
#	crates/ui-egui/locales/sv.json
#	crates/ui-egui/locales/uk-formats.json
#	crates/ui-egui/locales/uk.json
#	crates/ui-egui/locales/vi-formats.json
#	crates/ui-egui/locales/vi.json
#	crates/ui-egui/locales/zh-hans-formats.json
#	crates/ui-egui/locales/zh-hans.json
#	crates/ui-egui/locales/zh-hant-formats.json
#	crates/ui-egui/locales/zh-hant.json
#	docs/gaps.md
#	docs/parity-checklist.md
#	docs/whats-new.md
2026-10-31 02:30:12 +00:00