Commit Graph
2475 Commits
Author SHA1 Message Date
Martin BallandClaude Opus 5.5 dd39514ef0 Merge origin/main into craft-i18n-cutover
Keeps the deletion of the in-repo catalogs; #12357's Layer Via Copy/Cut
rows are in craft-i18n.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 22:28:32 +00:00
David Mann 40c310dfa3 Merge pull request #5224 from augrclk/fix/brush-spacing-row
Brush Settings: combine the Spacing checkbox and percentage header
2026-11-08 19:22:06 +01:00
Martin BallandClaude Opus 5.5 9dd39df78d feat(i18n): look up translations through the craft-i18n crate
The i18n module becomes a thin Lang wrapper over craft_i18n::I18n and the
catalogs embedded from craft-i18n. Plurals use trn_plain and PhotoCraft
keeps its own fmt; @id rows come only from PhotoCraft's own rows that keep
the label's shape. Detection, PHOTOCRAFT_LOCALE, tag bounds and the 35
offered languages are unchanged.

Serbian: sr, sr-RS, sr-Cyrl-RS and sr-ME reach sr-latn, the only Serbian
catalog, and a saved interface.language "sr" migrates to "sr-latn".

The menu completeness test becomes a report that never fails, and
`cargo xtask i18n-coverage` is replaced by `cargo xtask i18n-report`, which
reads CRAFT_I18N_DIR through the crate. Docs describe the new system.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 16:16:46 +00:00
David Mann 32ce08364b Merge pull request #9991 from ljkx/feat/raw-xmp-crop
Camera Raw sidecars: apply the crop, stop reporting RawFileName (#9985)
2026-11-08 16:55:43 +01:00
David Mann 2ffe5d1008 Merge pull request #12102 from Bobderto/fix/12085-zoom-menu-centre
Zoom tool menu: keep the view centre for Zoom In and Out
2026-11-08 16:51:19 +01:00
David Mann 848fa306f5 Merge pull request #12255 from SBaksa/patch-history-names
Patch: History names as the tool's (fixes #12117)
2026-11-08 15:25:52 +01:00
David Mann 85971ce95f Merge remote-tracking branch 'origin/main' into pr-5224
# Conflicts:
#	crates/ui-egui/src/panels/brush_panel/tests.rs
#	crates/ui-egui/src/panels/brush_sections/tests.rs
#	docs/brush-parity.md
#	docs/gaps.md
2026-11-08 14:51:51 +01:00
SBaksa 28d2d9095d History and plug-in names: trim the fillers and blank padding at the ends too
trim_name drops white space, ZWNJ/ZWJ and the blank characters (Braille blank, Hangul fillers,
invisible operators, tag and other default-ignorable blanks) from both ends. A variation or
Mongolian free variation selector or CGJ that belongs to a kept character stays, and so do Hangul
filler jamo that complete a syllable. History names use the same trim as plug-in names.
2026-11-08 22:40:53 +11:00
David Mann 320d285e1a Merge pull request #9887 from Firstbober/feat/indexed-color-matte
feat: add Indexed Color Matte options
2026-11-08 12:20:27 +01:00
David Mann 60ad38d4ae Merge pull request #5250 from augrclk/fix/brush-scatter-axes-header
Brush Settings: place Both Axes on the Scatter header
2026-11-08 12:19:26 +01:00
David Mann 342760093e Merge pull request #10823 from ljkx/fix/gradient-stop-drag-off
Gradient stops dragged off the bar are removed in every stop editor (#10742)
2026-11-08 12:16:52 +01:00
Triwarr 2d16a609ea Merge remote-tracking branch 'origin/main' into pdf
# Conflicts:
#	docs/scorecard.md
2026-11-08 03:48:47 +01:00
David Mann fda05f7b02 Regenerate docs/scorecard.md (merge queue)
On main + #10448, so main's gate stays green after the merge.
2026-11-08 03:45:37 +01:00
517d0a9eea Merge origin/main into #9887 (Indexed Color Matte)
Keeps main's Fade preview path in filter_preview.rs and passes the PR's
tool colours to the non-Fade preview; catalogs keep both sides' rows.

Co-Authored-By: Firstbober <firstbober@tutanota.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 03:23:31 +01:00
David Mann 9da3cda6a7 Merge origin/main into feat/raw-xmp-crop
# Conflicts:
#	docs/file-format-parity.md
2026-11-08 02:56:35 +01:00
David Mann ce7706f041 Merge remote-tracking branch 'origin/main' into pr-5224
# Conflicts:
#	crates/ui-egui/src/panels/brush_panel/tests.rs
#	crates/ui-egui/src/panels/brush_sections/tests.rs
#	docs/brush-parity.md
#	docs/gaps.md
2026-11-08 02:49:33 +01:00
David Mann 4da02a98a6 Merge pull request #9975 from ljkx/feat/cli-metadata-option
CLI: --metadata none|all leaves document XMP out of convert, run --out and batch exports (#9466)
2026-11-08 02:40:35 +01:00
960bd438e3 Merge origin/main into PR #5250 (Both Axes on the Scatter header)
Co-Authored-By: augrclk <augrclk@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 02:37:20 +01:00
David Mann 8c6f5d538e Merge origin/main into fix/gradient-stop-drag-off (#10823)
# Conflicts:
#	docs/ui-parity.md
2026-11-08 02:33:41 +01:00
David Mann 0059bd597e Merge pull request #3498 from davidmann4/feat/auto-219-8-panel-command-check
xtask: check that every panel button routes through a command id (#3495)
2026-11-08 01:48:45 +01:00
David Mann 5c1b628973 Merge pull request #9970 from ljkx/feat/photo-filter-last-settings
Photo Filter opens at its last settings (#9879)
2026-11-08 01:40:42 +01:00
David Mann 100997baaa Merge origin/main into feat/raw-xmp-crop
# Conflicts:
#	crates/ui-egui/src/dialogs/camera_raw_ui/open.rs
#	crates/ui-egui/src/dialogs/camera_raw_ui/sidecar.rs
#	docs/file-format-parity.md
2026-11-08 01:36:16 +01:00
50b877645f Merge origin/main into feat/cli-metadata-option (#9975)
Conflicts with main's --no-maximize-compatibility (#8064) in the CLI
export args, output mapping and dev-dependencies, and in the
file-format parity status line and revision history: both sides kept.

Co-Authored-By: ljkx <ljkx@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 01:26:47 +01:00
Triwarr 0525197133 Merge remote-tracking branch 'origin/main' into pdf
# Conflicts:
#	docs/scorecard.md
2026-11-08 01:09:29 +01:00
47e14b5da2 Photo Filter keeps only Preserve Luminosity from its last OK (#9970)
#9970 reopened Image > Adjustments > Photo Filter... at the filter, colour,
density and Preserve Luminosity of its last OK. Measured in the reference
application: after OK at 60, 70 and 74 %, with a preset or with Color and a
custom colour, it reopens every time at Warming Filter (85), the orange
swatch and 25 %; only Preserve Luminosity carries over (off after an OK with
it off, on after an OK with it on). Opening now starts from the neutral
settings and takes just that one value from the last OK; Alt still reopens
at all the last settings (#8900). Tests and the ui-parity row follow the
measured behaviour.

Co-Authored-By: ljkx <177671075+ljkx@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-08 00:30:59 +01:00
David Mann 15be79be5e Merge pull request #9058 from Gotya-OFFCIAL/raw-hasselblad-3fr
raw: decode Hasselblad 3FR/FFF (X2D II 100C, uncompressed)
2026-11-08 00:29:05 +01:00
David Mann 2da9714b74 Merge origin/main into feat/photo-filter-last-settings
# Conflicts:
#	crates/ui-egui/src/panels/smart_ui.rs
#	docs/ui-parity.md
2026-11-08 00:16:29 +01:00
David Mann 49eabafbcb Merge pull request #11238 from NaufalDzz/layer-filter-find-layers
Select › Find Layers opens the Layers panel's Name filter (#10884)
2026-11-08 00:13:30 +01:00
David Mann 6d5254d319 Merge pull request #12134 from hectorviov/fix/atn-droplet-print-gradient-tool
Actions: map Create Droplet and cover the Gradient tool's recorded steps (#10710)
2026-11-08 00:01:17 +01:00
c751712a53 Merge origin/main into PR #5250 (Both Axes on the Scatter header)
Main added Brush Tip Shape Angle/Roundness tests and doc rows at the same places as
this PR's Scatter header tests and rows; both sides are kept, and the doc status
lines name both changes.

Co-Authored-By: augrclk <augrclk@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 23:45:02 +01:00
David Mann 977f80dc42 Merge origin/main into PR #9058 (raw: Hasselblad 3FR/FFF)
# Conflicts:
#	docs/gaps.md
2026-11-07 23:30:32 +01:00
David Mann 27ea4eddbc Merge pull request #5269 from augrclk/fix/brush-tip-geometry-layout
Brush Settings: align Angle and Roundness left of the tip widget
2026-11-07 23:23:49 +01:00
c951b80e27 Merge origin/main into fix/gradient-stop-drag-off (#10823)
#10797 landed the Gradient Map drag-off and a shared off_strip() on main.
Conflicts resolved to main's Gradient Map code and main's off_strip(): a
stop comes off the bar dragged up or down, as measured in the reference
application, so the PR's directional stop_dragged_off() is dropped and
Layer Style's Gradient Overlay uses off_strip() too.

Co-Authored-By: ljkx <ljkx@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 22:17:30 +01:00
David MannandClaude Opus 5.5 c5ebcd9dc7 Regenerate docs/scorecard.md
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 21:12:31 +01:00
David MannandClaude Opus 5.5 b6ab68ea3b Merge main into 3498
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 21:08:48 +01:00
8bf381f2d9 Find Layers: keep the Name text on every run path; no focus for a hidden filter row (#11238)
CodeRabbit found three things after the last fix-up:
- `engine.execute` and action steps without `name` replied `selected: []`
  while the panel listed the layers its kept Name text matches. `run` now
  fills in the panel's Name text for every path, as the menu did.
- With Filter Options > Hide, Find Layers left a focus request that took
  the caret once the row was shown again. In the reference application the
  row stays hidden and showing it later does not focus the field, so the
  request is only made for a drawn row.
- The control protocol said the selection never changes; the Name filter
  deselects a selected layer it hides (#10879). The doc now says so and
  describes each entry point and the reply.

Tests for the first two fail without the fix.

Co-Authored-By: NaufalDzz <NaufalDzz@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 20:24:22 +01:00
Triwarr d297dd3a2d PDF: validate --pdf-dpi, band the raster conversion, complete the notices
- --pdf-dpi now rejects zero, negative, NaN and infinite values at parse time (unit-tested) instead of silently falling back to 300 DPI.
- The RGBA8 raster is converted and written in 256-row bands with a cancellation check per band, so the f32 buffer no longer duplicates a whole page; the pixel-memory estimate charges the retained raster instead of that buffer.
- docs/file-format-parity.md: the 2026-11-07 revision row is inside the revision table.
- NOTICE now reproduces the Hayro MIT notice, the Foxit/PDFium BSD-3-Clause text, Adobe's CMaps BSD-3-Clause text and the CC0 statement for the ICC profile; package.ps1 ships NOTICE and ATTRIBUTION.md in both installers.
2026-11-07 20:12:46 +01:00
Triwarr 060d35265a PDF: keep the raster importer clippy-clean and refresh the scorecard
- Iterate the page sizes with their index instead of indexing the vector (clippy::needless_range_loop).
- Fix the .ai dispatch test's module path.
- Regenerate docs/scorecard.md after the merge (10 of 197 settings).
2026-11-07 19:46:18 +01:00
Triwarr ca92d936c0 PDF: import raster pages through craft-pdf instead of PDFium
- craft-pdf (the shared Rust/Hayro reader in craft-libs, rev c5a1cbf) renders each page; no shared library is loaded or shipped, and every desktop platform works.
- Raster pages only: editable text/vector import and the pdf_text/pdf_vectors options are removed (they can return later through craft-pdf's interpret device). Page geometry, artboards, page range, budgets, cancellation and warnings are kept; the effective DPI now respects craft-pdf's 8192 px side and 64M px page limits.
- Drops pdfium-render, the PDFium download in CI, the build-script copy and the packaging/licence staging; records the Hayro/fonts/CMaps/ICC assets in ATTRIBUTION.md and NOTICE.
- \.ai\ files starting with %PDF- now take the PDF importer, matching the comment.
- Attribution, architecture and file-format-parity docs updated.
2026-11-07 19:41:22 +01:00
ba3ea95007 raw: honour ActiveArea in Hasselblad 3FR/FFF (PR #9058)
The decoder set the active area and the crop to the whole plane and never
read ActiveArea, so a file with masked borders and no DefaultCrop developed
with the borders in. Read ActiveArea like the DNG path, use it as the
initial crop, and place DefaultCrop relative to it as DNG does. Also give
3FR/FFF its own row in the camera raw table instead of "embedded preview
only".

Co-Authored-By: Gotya-OFFCIAL <Gotya-OFFCIAL@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 19:39:30 +01:00
David Mann 0f0e76c44b Merge remote-tracking branch 'origin/main' into pr-11238
# Conflicts:
#	crates/ui-egui/src/panels/layer_filter_ui.rs
#	docs/control-protocol.md
2026-11-07 19:37:29 +01:00
David Mann b8b539c845 Merge origin/main into PR #9058 (raw: Hasselblad 3FR/FFF) 2026-11-07 19:37:23 +01:00
David Mann 9a079c811f Merge remote-tracking branch 'origin/main' into pr-8485-merge
# Conflicts:
#	docs/ui-parity.md
2026-11-07 19:28:44 +01:00
David Mann e6ba4aca42 Merge pull request #5845 from devius/ka-language
i18n: Georgian (ka) interface language
2026-11-07 19:19:01 +01:00
David MannandClaude Opus 5.5 7c0cc59ca3 Merge main into feat/auto-219-8-panel-command-check
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 19:13:19 +01:00
David Mann f8ab0858e7 Merge pull request #9604 from dotCooCoo/feat/equalize-entire-image
Equalize: with a selection, choose the selected area only or the entire image based on it
2026-11-07 19:12:42 +01:00
David Mann 7d18bc5217 Merge pull request #11675 from hnoerenberg/feat/reset-transform-smart-object-11662
feat: Layer > Smart Objects > Reset Transform (#11662)
2026-11-07 18:51:10 +01:00
74570b1f53 PR #8485: regenerate the scorecard after merging main
main added preferences since the PR's last merge, so the toolColors field now
makes it 10 of 195 settings that do nothing (was 10 of 194 on main); the
ui-parity preference row follows the scorecard.

Co-Authored-By: GyoJoong Kum <david32123kr@gmail.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 18:02:02 +01:00
Hector VillarrealandClaude Opus 5.5 67da143139 Actions: map Create Droplet; cover the Gradient tool's steps (#10710)
Create Droplet (CrtD) loads as file.automate.createDroplet for the form
the droplet plays the same way (a Folder destination with Override
Action "Save As"), plays, and saves back as recorded; subfolders, Save
and Close, custom naming, an error log or suppressed dialogs keep the
Photoshop step. The Gradient tool's Make + Set of a gradient fill layer
already map since #10771; a test now covers that recorded form. Print
stays a kept step: its two recorded steps would print twice.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 10:55:16 -06:00
David Mann 7892e148b2 Merge origin/main into PR #5250 (Both Axes on the Scatter header)
Main moved brush_sections.rs to panels/, its tests to brush_sections/tests.rs and
split widgets.rs into modules. The PR's tests now live in brush_sections/tests.rs and
scrub_label_within is crate-visible from widgets/scrub.rs; both doc status lines and
history rows keep both sides.
2026-11-07 17:30:24 +01:00