Commit Graph
169 Commits
Author SHA1 Message Date
aiongg f618cdea29 Integration: #8371 the .atn corpus round trip merges the per-property Sets that Save now writes 2026-10-22 15:39:49 +00:00
aiongg 2496742eaa Integration: merge main
Merges main through #3283 (Smart Filters: distinct editors, shared
disclosure and stable alpha).

filter_dialog.rs: main's split of the preview into is_smart_edit,
smart_preview_factor and scale_preview_params is kept. The plug-in branch
from #7524 (plugin_cmds::scale_for_preview scales only declared pixel
lengths) moved into scale_preview_params, so it applies to a plug-in run
on its own and to a plug-in recorded as a smart filter.

smart_ui.rs open_editor: main's smart_filter_dialog::target flow and the
shared adjust/filter dialog opening are kept; the Liquify re-open with
recorded strokes (r4) stays ahead of it. The old per-adjustment
edit_filter call is dropped with main's rewrite.
2026-10-22 15:39:28 +00:00
aiongg f72c3c2187 Integration: track t08
# Conflicts:
#	crates/ui-egui/src/camera_raw_ui.rs
#	crates/ui-egui/src/jobs_ui.rs
#	crates/ui-egui/src/widgets.rs
#	docs/file-format-parity.md
#	docs/gaps.md
2026-10-22 15:38:23 +00:00
aiongg 446b74a8de Integration: track t07
# Conflicts:
#	crates/ui-egui/src/i18n/cs.tsv
#	crates/ui-egui/src/i18n/de.tsv
#	crates/ui-egui/src/i18n/el.tsv
#	crates/ui-egui/src/i18n/es.tsv
#	crates/ui-egui/src/i18n/fr.tsv
#	crates/ui-egui/src/i18n/hu.tsv
#	crates/ui-egui/src/i18n/id.tsv
#	crates/ui-egui/src/i18n/it.tsv
#	crates/ui-egui/src/i18n/ja.tsv
#	crates/ui-egui/src/i18n/ko.tsv
#	crates/ui-egui/src/i18n/nl.tsv
#	crates/ui-egui/src/i18n/pl.tsv
#	crates/ui-egui/src/i18n/pt-br.tsv
#	crates/ui-egui/src/i18n/ru.tsv
#	crates/ui-egui/src/i18n/sr.tsv
#	crates/ui-egui/src/i18n/tr.tsv
#	crates/ui-egui/src/i18n/uk.tsv
#	crates/ui-egui/src/i18n/vi.tsv
#	crates/ui-egui/src/i18n/zh-hans.tsv
#	crates/ui-egui/src/i18n/zh-hant.tsv
#	crates/ui-egui/src/layer_shortcut_tests.rs
2026-10-22 15:38:21 +00:00
aiongg 9c7cc91f82 Integration: track t05
# Conflicts:
#	crates/ui-egui/src/i18n/tr.tsv
#	crates/ui-egui/src/shortcuts.rs
#	docs/ui-parity.md
2026-10-22 15:38:18 +00:00
aiongg 1f0177f23c Integration: track t04
# Conflicts:
#	ATTRIBUTION.md
#	contributors/people.toml
#	crates/ui-egui/src/i18n/cs.tsv
#	crates/ui-egui/src/i18n/de.tsv
#	crates/ui-egui/src/i18n/el.tsv
#	crates/ui-egui/src/i18n/es.tsv
#	crates/ui-egui/src/i18n/fr.tsv
#	crates/ui-egui/src/i18n/hu.tsv
#	crates/ui-egui/src/i18n/id.tsv
#	crates/ui-egui/src/i18n/it.tsv
#	crates/ui-egui/src/i18n/ja.tsv
#	crates/ui-egui/src/i18n/ko.tsv
#	crates/ui-egui/src/i18n/nl.tsv
#	crates/ui-egui/src/i18n/pl.tsv
#	crates/ui-egui/src/i18n/pt-br.tsv
#	crates/ui-egui/src/i18n/ru.tsv
#	crates/ui-egui/src/i18n/sr.tsv
#	crates/ui-egui/src/i18n/tr.tsv
#	crates/ui-egui/src/i18n/uk.tsv
#	crates/ui-egui/src/i18n/vi.tsv
#	crates/ui-egui/src/i18n/zh-hans.tsv
#	crates/ui-egui/src/i18n/zh-hant.tsv
#	docs/gaps.md
2026-10-22 15:38:17 +00:00
aiongg 4d1b922ddf Integration: track t02
# Conflicts:
#	contributors/people.toml
#	crates/engine/src/file_cmds/tests.rs
#	crates/engine/src/print_cmds/tests.rs
#	crates/ui-egui/src/i18n/cs.tsv
#	crates/ui-egui/src/i18n/de.tsv
#	crates/ui-egui/src/i18n/el.tsv
#	crates/ui-egui/src/i18n/es.tsv
#	crates/ui-egui/src/i18n/fr.tsv
#	crates/ui-egui/src/i18n/hu.tsv
#	crates/ui-egui/src/i18n/id.tsv
#	crates/ui-egui/src/i18n/it.tsv
#	crates/ui-egui/src/i18n/ja.tsv
#	crates/ui-egui/src/i18n/ko.tsv
#	crates/ui-egui/src/i18n/nl.tsv
#	crates/ui-egui/src/i18n/pl.tsv
#	crates/ui-egui/src/i18n/pt-br.tsv
#	crates/ui-egui/src/i18n/ru.tsv
#	crates/ui-egui/src/i18n/sr.tsv
#	crates/ui-egui/src/i18n/tr.tsv
#	crates/ui-egui/src/i18n/uk.tsv
#	crates/ui-egui/src/i18n/vi.tsv
#	crates/ui-egui/src/i18n/zh-hans.tsv
#	crates/ui-egui/src/i18n/zh-hant.tsv
2026-10-22 15:38:14 +00:00
aiongg 9172ad7525 Merge PR #7215: Corrective Camera Raw - fix(import/camera-raw): preserve document identity across asynchronous opens and re-develop 2026-10-22 15:37:37 +00:00
aiongg 02c9e32d1d Merge PR #8088: fix(type): resolve exact PostScript names in type.create 2026-10-22 02:26:06 +00:00
aiongg ff2ba37278 Merge PR #8353: Scale shape strokes when resizing for Export As
crates/ui-egui/src/export_dialog.rs: tests appended by both sides; kept both whole.
2026-10-22 02:23:59 +00:00
aiongg d8acd0579a Integration: #7976 bound the ';' search in xml_unescape to 13 bytes
A long run of '&' without a nearby ';' scanned to the end of the string for every '&' (quadratic). Adds a test with a 200k-ampersand description.
2026-10-22 02:23:17 +00:00
aiongg 9a9aab3bb3 Merge PR #7976: Decode numeric character references in File Info XMP text 2026-10-22 02:23:01 +00:00
aiongg 2d74af4c8e Merge PR #7721: fix(actions): refuse lossy fractional Crystallize ATN export
crates/engine/src/atn_cmds.rs: kept main's fields_from/fields_to doc comments and range-checked Kind::Long arm; one ExactLong definition (main's); Ripple Amnt stays ExactLong and Crystallize ClSz becomes ExactLong.
2026-10-22 02:22:59 +00:00
aiongg 4502ff75d6 Merge PR #6457: fix(engine): keep comps, slices and variables when converting to a smart object 2026-10-22 02:22:01 +00:00
aiongg 4484a07a5c Merge PR #6440: fix(engine): convert the background and match mask depth where they were missed 2026-10-22 02:22:00 +00:00
aiongg 4a3d69ac74 Merge PR #6455: fix(engine): match smart object re-renders to the document's mode and depth 2026-10-22 02:21:58 +00:00
aiongg 61adf55731 Merge PR #6433: fix(engine): keep the rendering of smart filters that cannot be reproduced 2026-10-22 02:21:56 +00:00
aiongg 3458eee861 Merge main into #3283
dialogs.rs: main's Displace-map prompt runs before the fallible confirm_command. filter_dialog.rs: main's ask_displace_map uses the new confirm_command signature; SMART_FILTER_SET_PARAMS stays for main's uses; a smart-filter edit without a "layer" param previews the active layer, as the command runs it (main's smart_displace_preview_uses_the_map_document).
2026-10-22 02:16:49 +00:00
aiongg dd83f87d3c Merge PR #5581: Layers: Group Layers creates the group collapsed (#5571) 2026-10-21 21:56:20 +00:00
aiongg 5189019b5b Merge PR #7696: fix(actions): preserve effective Stroke width in ATN export 2026-10-21 21:56:10 +00:00
aiongg c2d5a3fd64 Merge PR #7708: fix(actions): refuse lossy fractional Ripple ATN export 2026-10-21 21:56:10 +00:00
abc2cbandClaude Opus 5.5 6da0673cd1 Merge upstream/main 6d8cbac7 into the Smart Filters branch
Conflicts:
- filter_dialog.rs: preview_document_for_target keeps our proxy scaling
  and `p` clone; main's Bitmap rule (the preview drops Output resolution,
  #5559) is applied to the same `p`.
- hu/sr/tr/vi catalogs: both sides appended rows at the end; kept both, no
  duplicate keys.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 00:14:11 +03:00
bommerts e2a238737d Scale shape strokes when resampling documents (#8341) 2026-10-21 16:15:22 -04:00
aiongg 66e54580b7 Merge PR #7838: Free Transform: a result may take what Memory Usage allows, not 2^30 px (#7807) 2026-10-21 18:15:11 +00:00
aiongg 77557d75f1 Merge PR #8229: Integration batch: 8 PRs on main
# Conflicts:
#	crates/engine/src/layer_style.rs
#	crates/io/src/psd_export.rs
#	crates/io/src/smart_map.rs
#	docs/file-format-parity.md
2026-10-21 15:45:07 +00:00
4decb8dd30 Address CodeRabbit review: .act vs .aco by content, strict corpus walks (#5407, #4496)
- swatches.import with bytes only (no path or format): an .act whose first
  colour is 0, 1, x or 0, 2, x still went to the .aco reader, which ignores
  trailing bytes and returned a handful of junk swatches. At the two .act
  lengths (768/772) an .aco header now counts only when its sections span
  the whole file (new `aco::sections_len`); a Photoshop .aco of exactly
  768 bytes is still an .aco. Test: act_that_starts_like_an_aco_is_still_an_act.
- The .atn corpus tests (psd and engine) skipped unreadable folders and
  entries silently; they now fail with the path.
- act::write doc: the trailer is written when `count` or `transparent` is given.

Co-authored-by: Abdul karim mia <97598943+abdul-karim-mia@users.noreply.github.com>
Co-authored-by: Fabio Lissi <fabio.lissi@gmail.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 14:06:56 +02:00
aiongg b1e408d28f Merge the smart-filter track (#7066 #6398 #6397 #6297 #6299 #6301 #6303 #6315 #6305 #6317)
# Conflicts:
#	docs/file-format-parity.md
2026-10-21 05:04:04 +00:00
aiongg 3a3796af05 Merge PR #6397: PSD: Perspective Warp smart filters open and save like Photoshop (#6268)
# Conflicts:
#	crates/io/src/smart_map.rs
#	docs/file-format-parity.md
#	docs/scorecard.md
#	scorecard/file_compat.toml
2026-10-21 01:07:59 +00:00
aiongg 8c942e481d Merge PR #7224: Image: Trim and merged Duplicate report an error on documents over 2^30 px (#7223) 2026-10-21 01:06:16 +00:00
David MannandClaude Opus 5.5 c9b0bb0cbc Integration: merge main, resolve conflicts (#4496)
fill_to (Paint Bucket export): keep main's `source` alias and explicit
colour (`Usng` = `Clr ` plus `Clr `, #7199) together with the PR's
optional `Tlrn`/`AntA`.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 02:05:34 +02:00
Gabrieljr42 797c7852f9 fix(type): clear retained wght variation when resolving exact face 2026-10-20 21:01:11 -03:00
Gabrieljr42 99a234d2e2 fix(type): resolve exact PostScript names in type.create
type.create stored the font field as a family name, so an exact
PostScript face such as Arial-Black warned and fell back. Resolve
only an exact PostScript match and keep that face's family, weight,
slant, and name. Unknown families still warn.

Fixes #8063

Signed-off-by: Gabrieljr42 <gabrieljunior42566@gmail.com>
2026-10-20 20:34:08 -03:00
David Mann 1b0b3e218c Merge main into fix/6267-psd-hue-sat-sf 2026-10-20 17:13:41 +02:00
David Mann a3196466a3 Merge main into fix/6268-psd-perspective-warp-sf 2026-10-20 17:09:56 +02:00
NetterSilverandClaude Haiku 5.5 afeea2f643 Decode numeric character references in File Info XMP text
Found while testing crates/engine/src/file_cmds.rs:690 (xml_unescape), used by li_values, find_attr and read_file_info

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-20 13:42:22 +00:00
Brian TorresandClaude Opus 5.5 c5ba77e5d9 Free Transform: refuse a result the warp would clip, not only one too large (#7807)
The warp places pixels within +-2^20 px (WARP_REACH) and clamps the rest
away. The byte budget admitted results wider than that (a 2,000,002 px
strip fits 8192 MB), and a plain move past it already emptied the layer
without an error. `warp_output_clipped` says when the result would be cut,
and the budget check refuses it: "would reach past +-1048576 px, the
farthest a transform places pixels". Docstrings for the touched functions.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 12:20:03 -07:00
Brian TorresandClaude Opus 5.5 a5ebdaaa30 Free Transform: a result may take what Memory Usage allows, not 2^30 px (#7807)
The fixed 2^30 px cap refused any transform of a stitched layer past about
1 GP, on any machine. A result is now priced in bytes at its pixel format
(with the alpha the warp adds) against Preferences > Performance > Memory
Usage (default 8192 MB), which Session::apply_prefs sets. The report's
37708 x 35259 px 8-bit result (5072 MB) now transforms: 10.7 s, 6.1 GB on
top of the source. Past the allowance the message names it:
"... (10144 MB), more than the 8192 MB Memory Usage allows (Preferences >
Performance)".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 12:10:35 -07:00
Omar SaidahmedandGitHub 1c74da7baa keep layer-based slices when duplicating a document (#6133) 2026-10-19 13:32:59 -04:00
5c1b9425d1 Gradient Overlay: repaint the whole layer when a stroke moves its frame (#4053) (#5340)
A Gradient Overlay (and gradient strokes, linked patterns, linked bevel
textures) is laid out over the layer's bounds. Painting grows those
bounds, but the stroke commands reported only the stroke as damage, and
the canvas's committed-stroke path repainted only what the live stroke
had not shown. The canvas therefore kept the old gradient around earlier
strokes: one gradient per stroke instead of one over the whole layer.

Session dispatch now grows a command's reported damage by
photocraft_compose::relayout_damage(before, after): the whole composite
of any visible layer whose effects span its frame, when that frame moved.
The canvas adds the same area to a committed live stroke. Strokes inside
the existing bounds and frame-independent effects keep tight damage.

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-19 13:04:52 -04:00
PerchAnton 674bfb697b docs(atn): document Ripple field conversion and test helpers 2026-10-19 16:27:06 +03:00
PerchAnton 9f5559e515 fix(actions): refuse lossy fractional Crystallize ATN export 2026-10-19 14:13:05 +03:00
PerchAnton caca15106e fix(actions): refuse lossy fractional Ripple ATN export 2026-10-19 13:27:37 +03:00
PerchAnton 0acb707fe1 fix(actions): preserve effective Stroke width in ATN export 2026-10-19 12:28:43 +03:00
abc2cbandClaude Opus 5.5 2a81d271b5 Merge upstream/main 4df773e9 into codex/github-smart-filters-usability-20261011
Conflicts and how they were resolved:
- crates/ui-egui/src/canvas.rs (ensure_filter_preview): kept our edit_command(), which
  also covers the Blending Options dialog and checks the target guard; main's
  smart_ui::confirm_command(fields, cmd, params) form (#6324) is the same preview
  (setParams on the proxy) without the guard.
- crates/ui-egui/src/filter_dialog.rs (preview_document_for_target): kept our scaling
  of the smart filters' lengths and the mask feather on the proxy (proxy_document
  already scales cache, placement and mask, so nothing is scaled twice); dropped
  main's run-at-full-size branch for setParams and its now unused
  SMART_FILTER_SET_PARAMS constant.
- crates/ui-egui/src/smart_ui.rs (open_editor): kept our open_editor (target guard,
  adjust_dialog then filter_dialog with reset_fields, then __smartFilter and the
  stored params) over main's edit_filter helper; adjustment edits keep their live
  preview (adjust_preview skips the layer path for __smartFilter), so main's
  __preview removal for __adjust is not needed.

Adapted to main's API: smart_ui::preview_command (main, #6324) now also returns the
Blending Options command for our blending dialog, so the preview window matches its
key.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 18:52:02 +03:00
abc2cbandClaude Opus 5.5 25b79243f1 Smart Filters: document the functions next to the ones the PR changes
CodeRabbit counts the functions around the lines a PR changes, not only the
changed ones, so the PR's docstring coverage stays low (59.49%, threshold 80%)
unless the untouched neighbours are documented too. Comments only; no code
changes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 17:54:43 +03:00
abc2cbandClaude Opus 5.5 79793acefe Smart Filters: document the functions and tests the PR adds
CodeRabbit measured the docstring coverage of the PR at 59.49%, under its 80%
threshold. Add short doc comments saying what each helper does and which
behaviour each test pins. Comments only; no code changes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 17:50:28 +03:00
abc2cb 710c26af41 Merge remote-tracking branch 'upstream/main' into codex/github-smart-filters-usability-20261011
# Conflicts:
#	crates/ui-egui/src/i18n/de.tsv
#	crates/ui-egui/src/i18n/el.tsv
#	crates/ui-egui/src/i18n/es.tsv
#	crates/ui-egui/src/i18n/fr.tsv
#	crates/ui-egui/src/i18n/id.tsv
#	crates/ui-egui/src/i18n/it.tsv
#	crates/ui-egui/src/i18n/ja.tsv
#	crates/ui-egui/src/i18n/ko.tsv
#	crates/ui-egui/src/i18n/nl.tsv
#	crates/ui-egui/src/i18n/pl.tsv
#	crates/ui-egui/src/i18n/pt-br.tsv
#	crates/ui-egui/src/i18n/ru.tsv
#	crates/ui-egui/src/i18n/uk.tsv
#	crates/ui-egui/src/i18n/zh-hans.tsv
#	crates/ui-egui/src/i18n/zh-hant.tsv
2026-10-18 17:03:06 +03:00
aiongg 4127604122 Merge PR #6502: Engine: reject numeric overflow before document edits 2026-10-18 13:15:50 +00:00
Khawar Zamman Wani 087e540c6b Merge origin/main into fix/5571-group-layers-collapsed 2026-10-18 14:27:54 +05:30
denstu473andGitHub 68dfaf1ae6 Check unclamped transform dimensions against the pixel budget (#6493) 2026-10-18 03:34:21 -04:00