Commit Graph
2381 Commits
Author SHA1 Message Date
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
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
dotCooCoo e207210745 Merge main into feat/equalize-entire-image 2026-11-07 08:24:11 -08:00
David Mann 6d408847ae Merge pull request #9876 from SvenCarstensen/codex/guide-position-units
Guide dialogs: add Position Tab navigation and preserve exact positions
2026-11-07 16:49:49 +01:00
David Mann e3f3465fe8 Merge pull request #10840 from TrevorBrown-dev/feat/gradient-overlay-drag
Layer Style: a drag on the image moves a Gradient Overlay (#10763)
2026-11-07 16:11:57 +01:00
David Mann f98218cbe8 Merge pull request #10529 from luben93/raw/nef-lossy-after-split-v2
raw: decode Nikon "lossy after split" NEFs
2026-11-07 16:06:23 +01:00
David Mann 0eb51ace19 Merge pull request #8239 from nikolainyegaard/vocab-parity
Labels: match Photoshop's menu, tooltip and spelling conventions
2026-11-07 15:43:52 +01:00
Hartmut Nörenberg 2b68188779 Regenerate the scorecard after merging main 2026-11-07 15:42:23 +01:00
FredApps 0c88c596bf Merge pull request #11684 from RickiNano/fix/windows-pen-eraser-end-2285
Windows: the pen's eraser end selects the Eraser (#2285)
2026-11-07 15:40:37 +01:00
Hartmut Nörenberg 76326721f0 Merge remote-tracking branch 'upstream/main' into feat/reset-transform-smart-object-11662 2026-11-07 15:33:24 +01:00
Hartmut Nörenberg 819e6382fd chore(docs): regenerate the scorecard after the skip-transform-when-placing preference
53917dc17 (#9075, Preferences: Skip Transform when Placing, #8492) added
General::skip_transform_when_placing to crates/engine/src/prefs.rs, so the
prefs audit total in the scorecard is 194, not the 193 the committed file
says (the unread count stays 10). The regeneration in 3c4431945 (#11984)
covered #11322's total of 193 but predated this merge, so every open PR's
gate job fails with "docs/scorecard.md is stale: run cargo xtask scorecard
and commit the result".

This is the committed output of `cargo xtask scorecard` at base 67e3457b0:
the Workspace and UI summary row and the prefs-audit prose, 193 -> 194, two
lines, no source changes. `cargo xtask parity` produces no change here.
2026-11-07 14:55:05 +01:00
David Mann 67e3457b02 Merge pull request #10001 from indy2kro/feat/8064-psd-maximize-compatibility-param
Saves take maximizeCompatibility for a PSD/PSB's merged image (#8064)
2026-11-07 14:44:52 +01:00
Hartmut Nörenberg c5defde144 docs: regenerate parity and scorecard after merging main
From the merged tree: the menu count goes to 662 of 662 live, main's 661
plus the Reset Transform item this PR adds, and the prefs audit counts
193 `Preferences` leaves where the committed scorecard still said 192
because main's #11322 added the pref `group_tools` without regenerating.
Both files are `cargo xtask parity` and `cargo xtask scorecard` output,
not hand-edited.
2026-11-07 14:22:33 +01:00
Hartmut Nörenberg 2c96b71cc4 Merge upstream/main into feat/reset-transform-smart-object-11662
`docs/ui-parity.md`'s status line conflicted: the branch and main each
prepended a clause at the head of the change list, and the branch also
carried the newer `Last updated` date. The merged line keeps main's
toolbar tool-memory clause (#3569) word for word after our Reset
Transform clause (#11662), with one `Change:` header and the later date.
2026-11-07 14:22:32 +01:00
David Mann 3c000ea238 Merge pull request #8307 from midasdf/jp/print-paper-sizes
Print: Japanese paper sizes (はがき・往復はがき・JIS B5/B4・L判)
2026-11-07 14:11:19 +01:00
David MannandClaude Opus 5.5 3c44319455 docs: regenerate the scorecard after #11322 added a setting (#11983)
The prefs audit counts 193 settings since Preferences.groupTools landed;
docs/scorecard.md still said 192, which failed the gate and the Windows
staleness test on main.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 13:56:20 +01:00
David Mann 41aa2b86f5 Merge pull request #3693 from funkvay-star/feat/levels-reset-clipping
Levels: Alt-drag clipping display (#3328)
2026-11-07 13:38:09 +01:00
David Mann 339adcb7bc Merge pull request #11322 from Saloouu/fix/toolbar-groups-survive-restart
Toolbar slots and tool keys keep their last tool across launches (#3569)
2026-11-07 11:55:58 +01:00
Sven Carstensen 2928191557 Merge main and retain guide keyboard and exact-position fixes 2026-11-07 11:54:29 +01:00
Davit Matchakhelidze a9be0ce965 Merge main into ka-language 2026-11-07 12:28:48 +04:00
Hartmut Nörenberg 1475708c14 fix(engine): Reset Transform requires its re-render
Review finding on this PR (#11675, discussion_r4499346688): with the warp now cleared as part of
the reset, a smart object whose stack holds a visible filter this build cannot apply took the
Free Transform path's forgiving branch - `refresh_layer` returns false for that stack,
`refresh_text` drops it on the floor, and `restore_unrendered` put the OLD cache back warped by
the relative map. The step recorded a placement at 100 % with no warp whose pixels still showed
the warp.

The step now insists on the guarded refresh the other smart-object edits use:

- `unapplied_filters` is checked before anything changes, so an unsupported Photoshop filter kept
  verbatim from a PSD names itself in the error and the document is never touched.
- `refresh_or_fail(doc, id)?` runs at the reset boundary, right after `transform_by_map` and
  before the exact map is pinned. It is a cache-warm call in the normal case (same document state
  as the render `transform_by_map` just did), and it refuses an unreadable source or a render that
  fails outright. Because `Session::edit` runs its closure on a copy and returns early on `Err`,
  a refused reset leaves the document, the placement, the warp and the history list exactly as
  they were - the fallback pixels are never accepted.

Regression test `reset_transform_refuses_a_stack_it_cannot_re_render` (red before this commit:
the reset returned Ok) asserts the error names the filter, that transform, warp and filter stack
are unchanged, that no history state was added, and that the same object resets normally once the
unsupported filter is off the stack. The four existing reset tests still pass, so the success
path and its warp clearing are unchanged.

No new dependency; photocraft_io's UNSUPPORTED_FILTER was already re-exported by this module.
2026-11-07 06:17:54 +01:00
David Mann f68e227026 Merge pull request #11780 from davidmann4/i18n-fallback-no-coverage-tests
i18n: no test fails on a missing translation (#11778)
2026-11-07 02:20:37 +01:00
Hartmut Nörenberg efaa011d0e docs: Reset Transform clears the warp
The ui-parity row, its revision entry and the status line said the Warp survives Reset Transform.
It does not: measured against the reference application 2026-11-06 (report in #11675), the warp is
cleared with the rest of the transform, and the object centres on the average of the placement's
four corners. A 2026-11-07 revision row records the correction; the 2026-11-06 entry stays as the
history of what landed when.

cargo xtask parity and scorecard re-run: unchanged (661 of 661 live), so nothing to regenerate.
2026-11-07 02:18:23 +01:00
David Mann 927c63d394 Merge pull request #11022 from Hamza0101/fix/crop-overlay-and-fill-defaults
Crop: Always Show Overlay by default, Fill resets on another open document, and an untouched frame shows only itself (#10894, #10930)
2026-11-07 01:11:21 +01:00
David MannandClaude Opus 5.5 b826eb3650 i18n: no test fails on a missing translation (#11778)
Remove the Azerbaijani menu coverage test (red on main), the crop Fill
label coverage test and the has() loop in the pen path Esc test. A
missing string falls back to English; cargo xtask i18n-coverage lists
the gaps. docs/contributing.md now says tests never require a string to
be translated.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 00:30:56 +01:00
Davit Matchakhelidze 20bbd27c84 Merge upstream main into ka-language 2026-11-07 02:53:58 +04:00
David MannandClaude Opus 5.5 20142544b0 Regenerate docs/scorecard.md after merging main
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 23:03:17 +01:00
David Mann 017c4aab9e Merge remote-tracking branch 'origin/main' into HEAD
# Conflicts:
#	docs/scorecard.md
2026-11-06 22:57:46 +01:00
David Mann 6b0f7762e1 Merge pull request #11671 from davidmann4/integration-batch-20
Integration batch 20: 7 i18n PRs (Thai, Hebrew, Urdu, Tamil, Azerbaijani, Romanian, Korean)
2026-11-06 22:49:42 +01:00
David Mann fd890eaca4 Merge pull request #11669 from davidmann4/feat/crop-task-bar-10890
Crop: Contextual Task Bar under the crop frame, as a reusable task-bar widget (#10890)
2026-11-06 22:49:21 +01:00
David Mann 7ecfccbd64 Merge pull request #11643 from davidmann4/integration-batch-19
Integration batch 19: epic PRs (WIP)
2026-11-06 22:48:55 +01:00
Sven Carstensen 779a27e7fb Limit guide dialog changes to keyboard editing and exact positions 2026-11-06 20:14:37 +01:00
Hartmut Nörenberg 9a7ec924ab docs: regenerate the parity files after merging main
cargo xtask parity and scorecard on the merged tree: 661 of 661 menu items live (Layer 162 of 162, so the Reset Transform row is counted live), and the prefs audit is 10 of 191 now that upstream removed the Enable animations preference.
2026-11-06 20:07:59 +01:00
Cristi RaduandClaude Opus 5.5 20900a5432 Say what an unset maximizeCompatibility does in app.save (#8064)
Unset or null follows Preferences › File Handling: Always and Ask When Saving
write the real merged image, Never the placeholder, and app.save opens no dialog.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 21:07:10 +02:00
Cristi RaduandClaude Opus 5.5 0c449729d7 Say Bitmap, Indexed Color and Duotone keep the merged image (#8064)
The PSD writer always writes the real merged image for those modes (Bitmap and
Indexed are saved without layers; Duotone is exempt), so maximizeCompatibility
false does not give them the placeholder. The MCP params, control protocol and
CLI help now say so.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 21:07:10 +02:00
Cristi RaduandClaude Opus 5.5 a1bb9f003f Saves take maximizeCompatibility for a PSD/PSB's merged image (#8064)
Photoshop's Maximize Compatibility checkbox, for one save: `maximizeCompatibility`
(true or false) on Save, Save As, Save a Copy, `app.save`, serve `doc.save`, MCP
`doc_save`/`doc_export`, Batch, Image Processor and Layers to Files decides the
merged image over Preferences > File Handling > Maximize PSD and PSB File
Compatibility; unset, the preference decides. Anything but a boolean is refused
before anything is written. The CLI takes `--no-maximize-compatibility`.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 21:07:10 +02:00
RickiNano 265fedc687 Merge remote-tracking branch 'origin/main' into fix/windows-pen-eraser-end-2285
# Conflicts:
#	apps/photocraft/src/tablet.rs
#	crates/tablet/Cargo.toml
#	crates/tablet/src/lib.rs
#	crates/tablet/src/windows.rs
#	crates/ui-egui/src/lib.rs
#	crates/ui-egui/src/services.rs
#	docs/hardware-parity.md
2026-11-06 19:53:07 +01:00
RickiNano 1aa85bd796 Windows: the pen's eraser end selects the Eraser (#2285)
The pointer hooks read PEN_FLAG_INVERTED from GetPointerPenInfo and
report the pen end through Services::pen_end, so flipping the pen
switches to the Eraser and the tip restores the previous tool, as on
macOS. A WH_CALLWNDPROC hook beside WH_GETMESSAGE catches
WM_POINTERLEAVE, which Windows documents as sent, not posted.
PEN_FLAG_ERASER alone is an eraser button on the barrel and does not
switch tools.
2026-11-06 19:45:17 +01:00
David MannandClaude Opus 5.5 e078c560ec Address CodeRabbit review: task bar tile, inspect and ui.set merge
- Draw the Crop task bar only on the active document's tile: a click into
  another tile activates its document mid-pass, and the tile drawn after it
  put the new frame's bar on itself for that frame.
- ui.inspect reports the bar hidden (and no rect) as soon as it can't show,
  not only after the next draw.
- ui.set merges panels.task_bar field by field: {"at": [x, y]} keeps a pin,
  {"pinned": true} keeps a dragged place; unknown nested fields are refused.
- Tests for each (each fails with its fix reverted), plus the task bar's
  preset dropdown picking 1 : 1 in sync with the options bar.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 19:41:21 +01:00
David MannandClaude Opus 5.5 5d5519dcac Regenerate docs/scorecard.md after merging main
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 19:41:20 +01:00
Hartmut Nörenberg e5d597f6e7 Merge remote-tracking branch 'upstream/main' into feat/reset-transform-smart-object-11662
# Conflicts:
#	docs/ui-parity.md
2026-11-06 19:36:36 +01:00
David Mann d1d913e7e6 Merge remote-tracking branch 'origin/main' into feat/crop-task-bar-10890 2026-11-06 19:24:17 +01:00
David Mann 670fa8b5f1 Merge remote-tracking branch 'origin/main' into integration-batch-20
# Conflicts:
#	crates/ui-egui/src/prefs/prefs_ui/fields.rs
2026-11-06 19:01:38 +01:00
David MannandClaude Opus 5.5 af0ae88bad Batch: drop #9876 (New Guide unit dropdown) from the batch
The reference application's New Guide dialog has Orientation, Position
(a text field that takes typed units such as "2 cm") and Color, but no
unit dropdown; measured on 2026-11-06. Typed units already work on main,
so the PR only adds something the reference lacks.

This reverts merge 22e03d0bcb.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 18:54:34 +01:00
2ff8f419cb ci: run the GPU tests on lavapipe on Linux and fail if they skip (#7975)
The Linux runner has no GPU, so the GPU tests ran on Mesa llvmpipe over
GL, which can't render Rgba32Float: 57 GPU checks (50 GPU parity, 3
canvas, 2 adjustment preview parity, 2 effect-map recovery) returned
early and passed without comparing anything. A new step after Test
installs mesa-vulkan-drivers and runs the nextest `gpu` group on
lavapipe (Vulkan), reusing Test's build, and fails unless the parity
tests report the Vulkan backend and no test printed a skip.

No code change: photocraft's tests take whatever adapter wgpu returns,
software adapters included. Follows the CI half of lightcraft#1148.

Co-authored-by: FredApps <FredApps@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 18:44:13 +01:00
f23d173933 Add an opt-in WinTab backend for pen pressure on Windows (#11331)
* Add an opt-in WinTab backend for pen pressure on Windows

Windows Ink stays the default. Preferences > Tools > Pen Tablet has a Tablet
input dropdown (Windows Ink (default) / WinTab). WinTab opens a WinTab 1.4
system context on PhotoCraft's window and polls pressure and the eraser end
(tilt on devices that report orientation axes; rotation only with a pen and
driver that report twist) into the stylus feed. The row says to turn Windows
Ink off in the tablet's software utility; the choice applies at next launch.

- crates/tablet: Windows-only wintab/wintab-sys backend. Devices with
  orientation axes use the orientation packet; pressure-only devices open a
  packet without it and report neutral tilt. Leaving is the driver's hardware
  proximity message (WT_PROXIMITY) and the packet's out-of-context status, with
  a long fallback for drivers that never report either. Overlap priority
  follows window focus, and the message hook requests a frame for each WinTab
  message so pressure-only strokes update without cursor movement.
- apps/photocraft: install the backend when the preference is on; poll it at
  the start of each frame; the installed wake repaints the UI.
- ui-egui: TabletPollFn service; the Windows-only Pen Tablet row with the
  Tablet input dropdown and the note.
- engine: tools.tabletInput (windowsInk/winTab), default windowsInk.
- docs: hardware-parity WinTab gap entry, qualifying tilt to orientation axes
  and rotation to twist-reporting pens.

Tested locally on a Wacom tablet with Windows Ink off: pressure, tilt and the
eraser end reach the brush (rotation where the pen reports twist); the default
path is unchanged.

* WinTab: a message that finds the state borrowed is skipped, not a panic in the hook

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

* WinTab: rustfmt

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

* Scorecard: count the Tablet input setting

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

---------

Co-authored-by: FredApps <153173854+FredApps@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 18:39:40 +01:00