Commit Graph
12493 Commits
Author SHA1 Message Date
David Mann eadefc60ae Merge pull request #13283 from RickiNano/fix/13243-line-shift-snap
Line tool: Shift snaps to 0/45/90° with the reference application's end points (#13243)
2026-11-12 19:18:15 +01:00
Alan Rockefeller f75cfd5a56 Clone Stamp and Healing Brush clone from a source set in another open document (#10381)
* Clone Stamp and Healing Brush clone from a source set in another open document

Alt-clicking a clone source in one document and painting in another sampled the
painted document at the source point: a clone source slot held a point and a layer
but not the document. Slots now record the document (and its layer) they were set
in, and painting elsewhere samples that document, as in Photoshop.

- Engine: CloneSource gains `document` (serde default, so older slots read as
  "the document being painted"). Clone Stamp, Healing Brush, the live stroke, the
  Pattern Preview wrap and the brush-tip preview read the source document. Pixels
  are converted to the painted document's colour mode and depth like Edit > Paste
  (no ICC conversion, same as Paste). Current Layer / Current & Below use the
  layer the source was set on (that document's active layer if it was deleted);
  All Layers uses its composite.
- A source whose document was closed is an error asking for a new source, and
  stores no aligned anchor, instead of silently sampling the wrong document.
- cloneSource.set takes an optional `"document": index` (with `source`);
  cloneSource.list and set report each slot's document index.
- UI: the Clone Source panel names the source document (or says it was closed),
  the source crosshair isn't drawn over another document, and the brush preview
  cache includes the source document's revision.

Tests: engine tests for 8/16/32-bit with and without wrap, colour-mode conversion
(Gray > RGB16, RGB > CMYK), sampled layer, Healing Brush, live stroke vs commit,
preview, closed/invalid documents and cloneSource.set/list; a UI test that
Alt-clicks in one document and paints in another.

* Clone test: the aligned stroke past the smaller source document's edge leaves the destination unchanged

Review follow-up: with "aligned": false the stroke sampled inside the source, so it didn't test the edge its comment named, and nothing was asserted.

* Clone Stamp / Healing Brush: an empty Clone Source slot refuses to paint

clone_params fell back to ui.clone_source / ui.clone_offset when the active
slot was empty. Those coordinates carry no document, so after Alt-clicking in
one document and picking an empty slot in another, the stroke read the first
document's coordinates from the second one's pixels.

* fix: reject stale cross-document clone previews

* Clone Source: a copy opened after the source document closed isn't its source

A native copy keeps its document's ID, and a reopened document may keep its ID. A slot set in
a document that was then closed resolved that ID again once a copy was open, and painted from
the copy instead of reporting the closed source (CodeRabbit, clone_source.rs).

Session::close now marks the slots set in the closing document closed (CloneSources::forget_doc,
next to the other per-feature forget_doc calls). A closed slot refuses the stroke and its live
preview with the closed-source error, shows "Source: document closed" in the panel, reports no
`document` in cloneSource.list/set, and draws no overlay or crosshair, whatever document has the
ID now. Setting a new source clears it.
2026-11-12 18:00:54 +01:00
Khawar Zamman Wani aa6f0d1b73 Object Selection: New, Add, Subtract and Intersect mode buttons (#12853) (#13195)
* Object Selection: New, Add, Subtract and Intersect mode buttons (#12853)

The options bar shows the four mode buttons before Object Finder. Clicks and
rectangle drags combine in the bar's mode, with Shift adding, Alt subtracting
and Shift+Alt intersecting (rectangle drags used to subtract with Shift+Alt).
In New mode a click inside the selection deselects and a drag inside moves
the outline, as the marquees do.

* Object Selection: Cmd stays the Move tool inside the selection; update tests for New-mode Deselect

* Object Selection mode tests: a Cmd-drag floats the pixels and lands as Move on the drop

* Object Selection: keep Object Finder off's Quick Selection dab and rectangle

A press inside the selection drags the outline only with Object Finder on;
with it off the click is still a Quick Selection dab and the drag a
rectangle. The dab subtracts with Alt again, including Shift+Alt.

* Object Selection: keep the Indexed/Bitmap alert for a press inside the selection

The New-mode outline gesture skipped finish_object_selection, so a click
deselected and a drag moved the outline without the tool's alert (#12867).
2026-11-12 18:00:25 +01:00
Khawar Zamman Wani 4033472df6 Layers panel: off-screen group rows paint nothing (#13117) (#13127)
* Layers panel: off-screen group rows keep only their disclosure widget (#13117)

A group row scrolled out of view painted its whole row every frame. It now
registers only its disclosure triangle (hit area, click, tooltip, accessibility
label) and returns, like any other off-screen row (#125).

* Add layers_panel_bench: Layers panel frame time with many groups (#13117)

Idle frames of the app in a CPU harness on a document of N collapsed groups
(or plain layers, or expanded groups), with the panel scrolled to the top.

* Layers panel: keep a row whose eye-column menu is open (#13127 review)

The eye column's colour menu is the eye response's own popup, which
resp.context_menu_opened() doesn't see. A group row with it open now stays
whole when scrolled out of view, as egui closes a popup a frame doesn't show.
Also documents the bench example's helpers.

* Layers panel test: an off-screen group row adds no text shapes (#13127 review)
2026-11-12 18:00:04 +01:00
Khawar Zamman Wani ea3bd7e022 Layers panel: skip off-screen Smart Filter rows (#13118) (#13198)
* Layers panel: skip off-screen Smart Filter rows (#13118)

Filter rows scrolled out of the list keep their place but no longer paint,
register widgets or take drops, as effect rows already do. A filter row takes
a reorder drop only where the list shows it, as masks do since #10485, so a
filter released over the panel header no longer lands on a row scrolled
under it. A selected filter stays selected while scrolled away.

* Re-run CI
2026-11-12 17:59:35 +01:00
Khawar Zamman Wani f88fde3db0 Move: frame and snap a dragged group (#13418) (#13429)
* Move: frame and snap a dragged group (#13418)

A group dragged with the Move tool showed only the arrow: the moving box
came from snap::layer_rect, which skips groups, so a selected group got no
Move gesture, no box, no snapping and no Smart Guides.

Measure what the move carries instead: the move targets, a group as the
layers in it (whole, even with a selection), an artboard as its board.
Keep the targets and everything inside them out of the snap targets, so a
group doesn't snap to its own layers' starting edges.

* Rename the group drag test helper so it doesn't clash with drag()

* Move: keep linked layers as snap targets while selected pixels move
2026-11-12 17:58:41 +01:00
Alan Rockefeller dbde10cfb1 Camera Raw: draw over a full-screen (or Wayland maximized) main window instead of freezing (#9069)
Camera Raw's window is an immediate viewport: it takes input and redraws
only while the main window draws a frame. Opened over a full-screen main
window, the new window covers it (Hyprland hands it the full screen, or
the maximized state), the compositor sends the hidden main window no more
frame callbacks, and the dialog freezes: sliders don't move and the app
looks hung until the main window is visible again.

While the main window is full screen, or maximized on Wayland, the dialog
is now drawn over the main window, as the web build already does.
Elsewhere a maximized window keeps Camera Raw in its own window.

Tested on Hyprland 0.56 (Omarchy): Super+F and Super+Alt+F both froze
the dialog before (a control-channel slider change timed out after 60 s
or took 48 s) and respond normally now.
2026-11-12 17:57:40 +01:00
RickiNano 5c03bb70b5 Merge remote-tracking branch 'origin/main' into fix/13243-line-shift-snap 2026-11-12 16:25:53 +01:00
David Mann 7ca5a9c40f Merge pull request #12317 from SBaksa/reset-tool-keeps-options
Reset Tool keeps Patch Structure/Color and Content-Aware Move Mode
2026-11-12 13:51:08 +01:00
David Mann bc778cf4af Merge pull request #13442 from wanikhawar/fix/ellipse-path-menus-13235
Shape tools: Path operations, alignment and arrangement menus
2026-11-12 13:28:08 +01:00
David Mann 1f0bd2f807 Merge pull request #13179 from TrevorBrown-dev/feat/anchor-tools-path-menu-12771
Delete Anchor Point and Convert Point: right-click opens the path menu with the point's entry on top (#12771, #12744)
2026-11-12 13:27:56 +01:00
David Mann 7890f7d6c3 Merge pull request #13352 from RickiNano/fix/13336-rect-radius-range
Rectangle tool: Radius takes 0-150000 px and alerts past it (#13336)
2026-11-12 13:27:44 +01:00
David Mann 4901167120 Merge pull request #13081 from TrevorBrown-dev/fix/delete-anchor-drag-segment-12767
Delete Anchor Point: dragging a segment moves it, as Direct Selection does (#12767)
2026-11-12 13:27:33 +01:00
David Mann e0ad19b0f8 Merge pull request #12235 from hectorviov/fix/perspective-crop-cursors
Perspective Crop: hover cursors say what a press does
2026-11-12 13:27:21 +01:00
David Mann 2b7977accb Merge pull request #9301 from DuBearte/feat/9269-black-white-auto
feat: Black & White Auto (#9269)
2026-11-12 13:27:10 +01:00
David Mann e165933772 Merge pull request #12430 from ljkx/atn-fit-image
Actions: map File › Automate › Fit Image (#10723)
2026-11-12 13:26:58 +01:00
David Mann a037e55a7f Merge pull request #9952 from ashokram-si/feat/jpeg-options-size-readout
JPEG Options: show how big the file will be (FILE-215-19, #7843)
2026-11-12 13:26:45 +01:00
Khawar Zamman Wani 23a0772776 Custom Shape: refuse an operation for a shape that can't be one component
Its parts would all take the operation and change the shape.
2026-11-12 15:39:41 +05:30
ljkx da6f09ce70 docs/atn.md: Fit Image leaves a fitting document unchanged only with limit (Don't Enlarge) 2026-11-12 11:03:28 +01:00
Khawar Zamman Wani 4b16507738 Custom Shape: an operation adds the shape to the active shape layer
shape.create with addTo keeps a component's joined subpaths (holes)
joined, so a custom shape's hole doesn't become a component of its own.
2026-11-12 14:30:25 +05:30
Dylan M. Taylor 74330157cb Use craft-psd for PSD/PSB format code (#13414)
* Use craft-psd from craft-libs; remove crates/psd

* Regenerate the scorecard (28 crate roots)

* Take craft-psd at craft-libs 55d120f2

* Regenerate lockfile for current shared format crates

* Pin shared format crates to current craft-libs main

* Match brush import cap to shared decoder budget

* xtask: update layer fixtures after PSD extraction
2026-11-12 02:53:54 -05:00
Khawar Zamman Wani cc06433f0a Path mode's default Exclude in the custom-shape test; use layer.new.layer 2026-11-12 13:09:59 +05:30
Khawar Zamman Wani 5b5e706f90 Use craft_ui::ComboBox and Id::unique in Path alignment; fix test lifetime 2026-11-12 12:12:16 +05:30
Trevor Brown 5ec4790a8b Merge remote-tracking branch 'upstream/main' into feat/anchor-tools-path-menu-12771 2026-11-12 01:38:51 -05:00
Dylan M. Taylor 21bb9fda63 Use shared crates for raster codecs (#13416)
* Use craft-raster-codecs, craft-dpx, craft-tga, craft-gif and craft-exr for the format code in crates/codecs

* Regenerate lockfile for current shared format crates

* Pin shared format crates to current craft-libs main

* Fix codec module imports for clippy
2026-11-12 01:29:33 -05:00
Khawar Zamman Wani 5bfab0f449 Shape tools: Path operations, alignment and arrangement menus (#13235)
The shape tools' options bar gets Path operations, Path alignment and
Path arrangement after the shape options. The operation is the shape
tools' own setting (New Layer by default, Exclude in Path mode); any
other operation adds the next drag to the active shape layer with
shape.create addTo and op. Reset Tool restores New Layer. Alignment
and arrangement entries stay greyed until the engine can move path
components.
2026-11-12 11:41:46 +05:30
SBaksa cbc942c8cf Merge origin/main into reset-tool-keeps-options 2026-11-12 17:03:05 +11:00
RickiNano 9c85072b0d Merge remote-tracking branch 'origin/main' into fix/13336-rect-radius-range
# Conflicts:
#	crates/ui-egui/src/widgets.rs
2026-11-12 07:02:50 +01:00
Dylan M. Taylor eee667f1d9 Fix Flatpak updates and bump to 0.23.1 (#13322)
* fix(flatpak): allow release checks and self-update helpers

* test: keep Flatpak permission parsing within strict Clippy rules

* chore: bump version to 0.22.1 for the Flatpak update fix

* test: assert paint operations succeed with fallible APIs
2026-11-11 21:30:36 -05:00
David Mann eb3c99d653 Merge pull request #12237 from hectorviov/fix/perspective-crop-field-limits
Perspective Crop: W, H and Resolution clamp to the measured ranges with alerts
2026-11-12 03:01:42 +01:00
David Mann 54cde24340 Merge remote-tracking branch 'origin/main' into fix-9301 2026-11-12 02:45:44 +01:00
David Mann d99b6a832c Merge pull request #13257 from davidmann4/fix/main-red-automation-gpu-group
ci: cap headless GPU backend tests with the nextest gpu group
2026-11-12 02:45:37 +01:00
Trevor BrownandClaude Sonnet 5.5 134d1aecd3 Merge remote-tracking branch 'upstream/main' into fix/delete-anchor-drag-segment-12767
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Model-Effort: Opus 5.5 drove; Opus 5.5 briefed; Sonnet 5.5 wrote at medium
2026-11-11 20:38:09 -05:00
David Mann 82adf56e11 Merge remote-tracking branch 'origin/main' into feat/jpeg-options-size-readout 2026-11-12 02:22:55 +01:00
David Mann de7cb6c0c4 Merge pull request #13234 from Raghav2012Code/fix/13065-pcrop-keep-clicked-corners
fix(ui): a Perspective Crop drag with no area keeps the clicked corners (#13065)
2026-11-12 02:20:01 +01:00
David Mann 3e6d361735 Merge pull request #13215 from TrevorBrown-dev/fix/add-anchor-straight-smooth-12706
Add Anchor Point: an anchor added to a straight segment is smooth, with handles (#12706)
2026-11-12 02:19:45 +01:00
David Mann 35887692ff Merge pull request #13176 from Raghav2012Code/fix/13072-delete-anchor-escape-stage
Delete Anchor Point keeps its path on the first Escape, and leaves a drag alone (#13072)
2026-11-12 02:19:30 +01:00
David Mann b554be38e7 Merge pull request #13303 from NaufalDzz/fix/issue-13244
Line tool: a drag is one History step named "Line Tool" (#13244)
2026-11-12 02:17:52 +01:00
David Mann 9677f2e73a Merge pull request #13020 from slafebre/feat/12054-type-bar-panels-toggle
Type options bar: Toggle Character and Paragraph panels button
2026-11-12 02:17:17 +01:00
David Mann 7755675ce7 Merge pull request #13342 from RickiNano/fix/13308-star-outer-corner-radius
Polygon tool: a rounded star rounds only its outer points (#13308)
2026-11-12 02:16:48 +01:00
Hector Villarreal 6545bfd768 Merge upstream/main into fix/perspective-crop-cursors 2026-11-11 18:52:18 -06:00
Hector Villarreal bed2e22d8e Merge upstream/main into fix/perspective-crop-field-limits 2026-11-11 18:52:17 -06:00
David Mann 2a4e0f4c99 Merge pull request #13378 from storytold/fix/paint-tests-use-stroke-results
paint: two stroke tests check the result the stroke now returns
2026-11-12 01:40:04 +01:00
David Mann 41280a2bcd Merge pull request #12206 from hectorviov/fix/count-options-bar
Count tool options bar: every control from the start in the reference order, tooltips and greying, scrubby size captions (#11765)
2026-11-12 01:36:14 +01:00
David Mann c4ae585613 Merge pull request #13305 from RickiNano/fix/13241-line-tool-defaults
Line tool: Weight 1 px and 5 × 10 px arrowheads by default and after Reset Tool (#13241)
2026-11-12 01:36:02 +01:00
David Mann 6ba21e3475 Merge pull request #13313 from rmsff/fix/freeform-pen-close-tolerance-12830
Freeform Pen: close a stroke only within 3 px of its start on each axis
2026-11-12 01:35:51 +01:00
David Mann 2bb1c3d0c6 Merge pull request #13141 from rmsff/fix/convert-point-drag-segment-12741
Convert Point: drag a segment as Direct Selection does
2026-11-12 01:35:41 +01:00
David Mann ef2a5031c5 Merge pull request #13188 from rmsff/fix/delete-anchor-alt-click-12770
Delete Anchor Point: Alt-click on an anchor selects its whole subpath
2026-11-12 01:35:30 +01:00
David Mann 8c8ba2c978 Merge pull request #13013 from RickiNano/feat/12066-zoom-out-mode
Zoom tool: Zoom In / Zoom Out mode buttons (#12066)
2026-11-12 01:35:18 +01:00
Trevor BrownandClaude Sonnet 5.5 5497091330 Merge remote-tracking branch 'upstream/main' into fix/delete-anchor-drag-segment-12767
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Model-Effort: Opus 5.5 drove; Opus 5.5 briefed; Sonnet 5.5 wrote at medium
2026-11-11 17:54:09 -05:00