Commit Graph
44 Commits
Author SHA1 Message Date
Ikki Nishihara ca17e9b627 Merge current main and preserve brush mode picker behavior
Signed-off-by: Ikki Nishihara <223786623+haranishi@users.noreply.github.com>
2026-10-28 15:55:25 +09:00
David MannandClaude Opus 5.5 8aa8e4f0cb Integration: docs status lines follow the revision history
brush-parity.md, gaps.md and ui-parity.md had 2026-10-25 revision rows
under a 2026-10-23/24 "Last updated" header; the headers now carry the
latest row. gaps.md (24 of 171), ui-parity.md and target-app-parity.md
(46 of 149) quoted stale counts of preferences that do nothing; they now
quote the scorecard's 12 of 178. target-app-parity.md still listed the
Camera Raw Calibration panel as missing, which landed on 2026-10-13
(#5128); the row now names per-camera colour for non-DNG cameras, as
gaps.md G14 does.

Found by CodeRabbit on #9386.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-25 21:56:01 +01:00
David MannandClaude Opus 5.5 ca046c72de Merge PR #8846: Fix stacked brush-tip artifacts in hard-round presets
Docs: status lines and revision rows kept from both sides.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-25 15:02:35 +01:00
David Mann f85ff03a26 Merge PR #1610: Art History Brush in the Y-group flyout
# Conflicts:
#	crates/ui-egui/src/retouch_ui.rs
#	docs/brush-parity.md
2026-10-25 12:03:30 +01:00
David MannMatt Van HornFredAppscoderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>Claude Opus 5.5
ce6b831c03 Integration: Art History Brush tolerance, source window, History source (#1610)
- Tolerance defaulted to 50 and averaged alpha into the difference, so an
  ordinary edit (e.g. #c03030 -> #d04848) was never painted back, and a stroke
  that wrote nothing still left an empty History step. Photoshop's default is
  0; the difference is now the larger of the mean colour change and the
  alpha change (the Eraser keeps colour and lowers alpha), and a stroke that
  writes nothing is an error instead of an empty step.
- Each tile copied a source window of tile +- halo per dab: a leftward stroke
  or a curl across x = 64 read empty pixels there (seam), and a size-1000 click
  copied ~5e9 floats (11.9 s). The rotated read stays inside the dab, so it now
  samples the source directly; bilinear reads at pixel centres, so an
  unrotated dab copies the history pixel instead of a 2x2 blend.
- The brush used its own history lookup (state 0 by default): it now takes
  the History Brush's source (history.setSource, snapshots, refusal after a
  canvas size change).
- TOOL-213-20 is partial (8 of 10 styles, Area scales spacing); docs follow.

Co-authored-by: Matt Van Horn <455140+mvanhorn@users.noreply.github.com>
Co-authored-by: FredApps <153173854+FredApps@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-25 11:11:50 +01:00
Khawar Zamman Wani 4cfc219dfb fix(paint): smooth hard-round preset strokes (#8842) 2026-10-23 16:50:08 +05:30
haranishi 11967f554e Merge upstream main into fix/brush-shift-right-blend-4929 2026-10-23 14:51:45 +09:00
2f1eacf391 Integration: merge main, resolve conflicts (#5504)
- algo/paint.rs: main locks transparency with composite_atop; keep that
  for every blend mode, and Clear on a locked layer leaves the pixel.
- paint_mouse.rs: main's Some arm (loads stored tips), the PR's None arm
  (a first-seen tool starts in Normal).
- retouch_ui.rs: main moved the Pattern Stamp params into
  pattern_stamp_params, shared with its live preview; the PR's `mode`
  goes there, so preview and commit agree.
- tool_reset.rs: main's Type keys plus the PR's Paint Bucket mode keys.
- distort_ui.rs (from #5478): main's Delete/Backspace pin branch, then
  tool_keys.
- docs: both sides' history rows and status lines.

Co-authored-by: paulou-jpg <79102098+paulou-jpg@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 19:28:49 +02:00
haranishi dc30d88755 Merge upstream main into fix/brush-shift-right-blend-4929
Keep the brush Mode menu's early return in canvas_buttons ahead of main's
physical right-button handling, keep both sets of control tests, and keep
both notes in docs/brush-parity.md and docs/control-protocol.md.
2026-10-22 12:16:53 +09:00
aiongg 2150493f3c Merge PR #7853: Brush: with airbrush build-up on, number keys set Flow and Shift+number sets Opacity (#7785) 2026-10-22 02:23:21 +00:00
aiongg d1534bbf2c Merge PR #5365: Brush Settings: expose section lock names, state and focus
docs/brush-parity.md: kept main's header and added the PR's change item; the PR's change-log row added.
docs/gaps.md: kept main's header and added the PR's change item; the PR's G4 progress note and change-log row added.
2026-10-22 02:23:09 +00:00
aiongg c08a6ad9cf Merge PR #5317: Brush Pose: preserve independent Tilt X/Y overrides
crates/paint/src/brush_tests.rs: both sides added tests at the same spot; kept main's four smoothing tests and added the PR's three pose_axes tests after them.
docs/brush-parity.md: kept main's header and added the PR's change item.
docs/gaps.md: kept main's header, added the PR's change item; G4 progress notes and the change-log row kept from both sides.
docs/control-protocol.md: kept main's eyedropper line (with the document.sampleColor wording) and added the PR's Brush Pose line before it.
2026-10-22 02:22:51 +00:00
aiongg ae539ac9a9 Merge PR #5199: Brush Settings: disable Wetness/Mix controls outside Mixer Brush
docs/brush-parity.md: kept main's header, added the PR's change item and its newer date.
docs/gaps.md: kept main's header, added the PR's change item; change-log row appended after main's rows.
2026-10-22 02:22:13 +00:00
paulou-jpgandClaude Opus 5.5 b1a939f265 Mode dropdowns for Clone Stamp, Pattern Stamp, History Brush, Healing and Paint Bucket
Photoshop gives these painting tools a Mode in the options bar; here they
always painted in Normal.

- Clone Stamp, Pattern Stamp and History Brush offer the layer modes, and
  Healing its own list (Normal, Multiply, Screen, Darken, Lighten, Color,
  Luminosity). The mode is kept in each tool's own brush, like its size,
  and reaches the live stroke and the commit.
- Paint Bucket: paint.bucket takes "mode" (any blend mode, or "clear" to
  erase the filled area). algo's bucket fill gains a FillMode for it. The
  options bar's Mode has Clear after Dissolve, as the Brush's does.
- A tool's first brush now starts in Normal instead of inheriting the
  previous tool's mode, so a Multiply Brush no longer makes the first
  Clone Stamp stroke multiply.
- The Shift+Alt letter and Shift+Plus/Minus mode keys reach these tools,
  within each tool's menu. Tools with no blend mode (the Erasers, Mixer
  Brush, Dodge, Burn, Sponge) now pass the keys to the selected layers.

Not yet: Healing's Replace mode, and a Mode for Spot Healing, Color
Replacement, Blur, Sharpen and Smudge (they ignore the keys meanwhile).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 01:23:22 -07:00
aiongg 4804148ff9 Merge PR #3759: Pattern Stamp and Background Eraser draw live; Spot Healing shows its heal area (TOOL-213-7, #3754)
# Conflicts:
#	docs/gaps.md
#	docs/target-app-parity.md
2026-10-21 05:04:04 +00:00
MarekSpodBiedry 21a91764bc Brush: with airbrush build-up on, number keys set Flow and Shift+number sets Opacity (#7785) 2026-10-19 22:30:41 +02:00
dotCooCoo 8f971cc79f Mixer Brush: Clean Brush empties the brush, and the automatic Load and Clean can be switched off
The Mixer Brush could not be emptied. MixerState::clean dropped only
the pickup well, paint.mixerBrush refilled the reservoir from the
foreground before every stroke unless loadAfterStroke was false, and
the app always sent the defaults. A stroke on a new layer over an image
always carried the foreground color, and the options bar had no Load
Brush or Clean Brush control.

Cleaning now empties both wells, so a clean brush lays down only the
color it picks up from the canvas. The new commands brush.mixer.load
and brush.mixer.clean load and empty the brush. paint.mixerBrush reads
loadAfterStroke and cleanAfterStroke from the brush and applies them
after the stroke. Both are on by default, and a stroke with both on
paints as before. A stroke whose color differs from the one recorded
by the last stroke, load or clean loads that color first. A load or
clean records the foreground, so choosing a new foreground loads the
reservoir.

The options bar has the Current Brush Load swatch, whose menu holds
Load Brush and Clean Brush, and two toggles for the automatic Load and
Clean. Brush Settings shows the same two options. The new strings have
rows in every catalog.
2026-10-16 22:49:47 -07:00
augrclkandGPT-6 388b7f2a05 Merge upstream main into fix/brush-transfer-mixer-controls
Retain both progress histories and integrate the existing Brush Settings changes with upstream. Preserve the response-curve editor, options-label scrubbing and independent preset regression tests where they overlap.

Co-authored-by: GPT-6 <noreply@openai.com>
2026-10-16 21:01:03 +03:00
augrclkandGPT-6 5e861d68a0 Merge upstream main into fix/brush-settings-lock-accessibility
Retain both progress histories and integrate the existing Brush Settings changes with upstream. Preserve the response-curve editor, options-label scrubbing and independent preset regression tests where they overlap.

Co-authored-by: GPT-6 <noreply@openai.com>
2026-10-16 18:24:44 +03:00
augrclkandGPT-6 ec32464195 Merge upstream main into fix/brush-pose-tilt-axis-overrides
Retain both progress histories and integrate the existing Brush Settings changes with upstream. Preserve the response-curve editor, options-label scrubbing and independent preset regression tests where they overlap.

Co-authored-by: GPT-6 <noreply@openai.com>
2026-10-16 18:23:34 +03:00
David MannandClaude Opus 5.5 91bffdec0b Merge main into feat/tool-213-7-live-retouch
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-15 00:57:30 +02:00
Ivan · VanTan 5ae3ee0ae5 fix(ui): show brush tip thumbnails while dragging presets (#5203)
* fix(ui): show brush tip thumbnails while dragging presets

* test(app): wait for autosave sidecar revision before recovery assertions
2026-10-14 13:08:05 -04:00
David MannandClaude Opus 5.5 0543f25682 Merge main into feat/tool-213-7-live-retouch
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-14 15:07:24 +02:00
Ikki Nishihara 8d72fffb5f Merge upstream main into fix/brush-shift-right-blend-4929
Resolve the docs/brush-parity.md conflict by keeping both sides: the
upstream notes (Hue Jitter amount track, Color Replacement) and the
Brush Shift+right-click Mode picker note, in the header and the change table.
2026-10-14 18:38:51 +09:00
augrclkandGPT-6 25f12c5009 Merge upstream main into PR #5317
Keep both sets of progress notes and preserve the automatic source merge.

Co-authored-by: GPT-6 <noreply@openai.com>
2026-10-14 11:33:35 +03:00
augrclkandGPT-6 b5528efc72 Merge upstream main into PR #5365
Keep both sets of progress notes and preserve the automatic source merge.

Co-authored-by: GPT-6 <noreply@openai.com>
2026-10-14 11:33:34 +03:00
augrclkandGPT-6 16fb0f50e3 Merge upstream main into PR #5199
Keep both sets of progress notes and preserve the automatic source merge.

Co-authored-by: GPT-6 <noreply@openai.com>
2026-10-14 11:33:32 +03:00
LorenzoFasolino d11be6de78 docs: drop stale missing-tool rows, only Art History Brush is missing (#5063)
Task T-0002 del lab artcraft-lab.

File toccati:
   docs/brush-parity.md      | 5 +++--
   docs/gaps.md              | 6 +++---
   docs/target-app-parity.md | 5 +++--
   docs/ui-parity.md         | 7 ++++---
   4 files changed, 13 insertions(+), 10 deletions(-)

Evidenze: artifacts/T-0002/ (nel lab, non in questo repo).
2026-10-14 01:58:18 -04:00
augrclkandGPT-6 61b0f4699f Brush Settings: show keyboard focus on section locks
Co-authored-by: GPT-6 <noreply@openai.com>
2026-10-14 05:12:20 +03:00
augrclkandGPT-6 17abae9741 Brush Settings: expose section lock names and state
Co-authored-by: GPT-6 <noreply@openai.com>
2026-10-14 04:52:47 +03:00
augrclkandGPT-6 811a40bda2 Brush Pose: preserve independent tilt-axis overrides
Keep X/Y flags through ABR import, presets, commands and painting; retain legacy combined inputs and expose both controls with regression coverage.

Co-authored-by: GPT-6 <noreply@openai.com>
2026-10-14 01:47:21 +03:00
augrclkandGPT-6 69cd2abafc Brush Settings: disable Wetness/Mix controls outside Mixer Brush
Pass the active tool to the section renderer and disable the complete
Wetness/Mix Transfer blocks when they do not apply, preserving saved settings.
Cover all themes/tools, disabled input, active edits and real tool-cache swaps
with three regressions, including exact tools.setBrush journal routing.

Addresses the Wetness/Mix tool-applicability subsection of #3825.

Co-authored-by: GPT-6 <noreply@openai.com>
2026-10-13 21:19:24 +03:00
David MannandClaude Opus 5.5 8b9b3a048b Merge origin/main into feat/tool-213-7-live-retouch
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-13 18:40:32 +02:00
f43d019a72 Brush Settings: use an amount slider for Hue Jitter (#4874)
Use the shared percentage row so the jitter amount does not look like a hue selection. Cover the rendered themed track, numeric and pointer edits, neighboring settings and engine journal replay.

Addresses the Hue Jitter appearance item in #3825; other assessment items remain open.

Co-authored-by: augrclk <217665348+augrclk@users.noreply.github.com>
Co-authored-by: GPT-6 <noreply@openai.com>
2026-10-13 12:11:44 -04:00
haranishi 67b7f1208e feat(ui): add Shift+right-click brush mode picker 2026-10-13 20:07:49 +09:00
David MannandClaude Opus 5.5 c951480e99 Merge origin/main into feat/tool-213-7-live-retouch
Background Eraser: main now samples and matches against the pre-stroke pixels (#4552); the
shared dab effect takes the pre-stroke surface so the live preview, whose working areas are
per dab, reads the same pixels as the commit.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-13 12:33:25 +02:00
36112e35d4 Brush Settings: disable minimum inputs when Control is Off (#4775)
Keep configured minimum values across Control changes and cover disabled input, independent controls and reactivation with UI regressions.

Refs #3825 (minimum input state only).

Co-authored-by: augrclk <217665348+augrclk@users.noreply.github.com>
Co-authored-by: GPT-6 <noreply@openai.com>
2026-10-13 02:49:44 -04:00
d3d735c6c7 feat(ui): the shaped brush cursor turns and flips with the view (#4233)
#3467 traces a shaped tip's outline but scales it by the screen radius
alone, so on a rotated or flipped canvas (R, View › Flip Horizontal) the
cursor kept the document's orientation while the stroke did not.

The outline now goes on screen through the view's own axes:
ViewXform::map_vec maps a document vector (pixel aspect, rotation, flip,
zoom), and brush_cursor::tip_axes gives one tip radius along the
document's x and y. A plain view gives the same points as before.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Brandon Thomas <echelon@gmail.com>
2026-10-12 20:16:49 -04:00
David MannandClaude Opus 5.5 dbb2062118 Merge main into feat/tool-213-7-live-retouch
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-13 01:43:25 +02:00
61c52c08db Brush Settings: toggle switch rows without losing smoothing settings (#4463)
Noise, Wet Edges, Build-up, Smoothing and Protect Texture toggle from
anywhere on their row while keeping the selected controls open. Keep
lock clicks independent and expose each switch as one accessible checkbox.

Give Smoothing a default-on enable flag so disabling it preserves the
amount and modes. Old brush JSON stays compatible; toolbar amount edits
and explicit stroke overrides enable it, and ABR imports retain disabled
smoothing values.

Cover row, checkbox, lock and keyboard gestures, old section selections,
command replay, presets, legacy JSON and 8/16/32-bit rendering.

Fixes #4283

Co-authored-by: augrclk <217665348+augrclk@users.noreply.github.com>
Co-authored-by: GPT-6 <noreply@openai.com>
Co-authored-by: Brandon Thomas <echelon@gmail.com>
2026-10-12 19:23:17 -04:00
David Mann 89f4bb51dd Merge remote-tracking branch 'origin/main' into feat/tool-213-7-live-retouch
# Conflicts:
#	docs/brush-parity.md
#	docs/gaps.md
#	docs/scorecard.md
2026-10-12 12:07:03 +02:00
b14037083d Brush and Pencil: hold ~ to erase, and Clear mode (#3439) (#3465)
* Brush and Pencil: hold ~ to erase

Fixes #3439. Holding ~ (the backtick key) with the Brush or Pencil makes
the strokes started while it is held erase, with that tool's own brush,
as in Photoshop; releasing it paints again and the tool never changes.
The key is a Tools › Temporary binding (tools.temporary.erase), so it
can be rebound or removed in Keyboard Shortcuts.

* Brush and Pencil: Clear painting mode, used by ~

Photoshop's Clear joins the Brush's and Pencil's Mode menus, after
Dissolve: chosen there, every stroke erases with that tool's brush until
another mode is picked. Holding ~ now puts the stroke in Clear mode too,
and the Mode menu shows Clear while the key is held. History names the
tool rather than the Eraser. Agents get it as "mode": "clear" on
paint.stroke and paint.pencil.

* Keep the Smoothing doc comment on smoothing_field

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

---------

Co-authored-by: Brandon Thomas <echelon@gmail.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 00:02:42 -04:00
David MannandClaude Opus 5.5 086a82d547 Pattern Stamp and Background Eraser draw live; Spot Healing shows its heal area (TOOL-213-7, #3754)
Pattern Stamp (aligned through LiveRetouch, Impressionist dab by dab) and
Background Eraser now paint during the drag; the release commits exactly the
pixels the live stroke showed (per-pixel tests at 8 and 16 bits). Spot
Healing keeps healing on release and shows a dark overlay while dragging.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-11 23:50:35 +02:00
Brandon ThomasandClaude Opus 5.5 939c8f2c70 Progress docs: target-app parity, gaps, alpha gate, readiness by audience (#2696)
Progress docs per craftrules standards/progress-docs.md: target-app parity (merges parity-estimate.md), gaps, roadmap with alpha gate, readiness by audience (full / mainstream / essentials) with Opus 5.5 hours, and UI, brush, format, hardware and localization parity docs. docs/parity.md is now docs/parity-checklist.md.

The Windows test failure (file_dialog::tests::save_dialogs_remember_where_each_document_was_last_saved) is pre-existing on main: the test hard-codes POSIX paths.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 15:09:04 -04:00