Commit Graph
123 Commits
Author SHA1 Message Date
aiongg 934eb71d84 Integration: merge main
crates/engine/src/file_cmds.rs: batch keeps the save-point closure (takes the output path) and also copies the session's authorize hook into each scratch session, as main now does.
crates/raw/src/sensor.rs: both sides cap the memory of retained tiles; kept the existing retained_segment_bytes check (checked multiplication, same limit) and dropped main's duplicate inline loop.
2026-10-22 15:39:51 +00:00
aiongg e846b64262 Integration: #7593 the plain crop round trip carries no deleteCroppedPixels key
The exporter leaves out an unset Crop delete (see the exporters' defaults note), so the imported step has none either.
2026-10-22 15:38:58 +00:00
aiongg 386ebe736b Integration: #8304 #7262 layer_props_tests compare with the optional layer ref 2026-10-22 15:38:50 +00:00
aiongg 87d930997b Integration: #7611 smart brush export refuses steps with refine strokes 2026-10-22 15:38:44 +00:00
aiongg 1dc684a2b6 Integration: track t09
# Conflicts:
#	contributors/people.toml
#	crates/engine/src/atn_cmds/tests.rs
#	crates/engine/src/file_cmds.rs
#	crates/engine/src/jobs.rs
#	docs/gaps.md
#	docs/target-app-parity.md
2026-10-22 15:38:26 +00:00
aiongg 0e80156397 Integration: track t16
Resolutions: CLI usage, flag lists and flag parsing carry both --tiff-compression (t15) and
--jpeg-format (t16); file.saveACopy, batch, imageProcessor and layersToFiles param specs carry
both tiffCompression and jpegFormat; file_cmds keeps tiff_compression_param and
jpeg_format_param; atn_cmds keeps flag_set/applies_at_canvas_bounds (t15) and UNHOLDABLE (t16),
edit.transform uses the pixel_target guard (t15) with layer_ref(p)? (t16); ui-egui open paths
build ImportOptions (t16) and apply raw_defaults (t15); docs headers/rows unioned; atn tests keep
both sides; tr.tsv "Keep Using CPU" kept once.
2026-10-22 15:38:13 +00:00
aiongg 3d1a4d6679 Integration: track t15
# Conflicts:
#	crates/engine/src/atn_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
#	docs/file-format-parity.md
#	docs/ui-parity.md
2026-10-22 15:38:12 +00:00
Dylan M. Taylor dc6057d3f2 security(engine): deduplicate ATN action names in near-linear time
actions.load gave each imported action a unique name with a helper that
restarted suffix numbering at 2 and linearly scanned all accepted names
for every candidate. A file repeating one base name many times caused
cubic comparison work during load.

Replace it with a UniqueNames helper backed by a HashSet for membership
and a per-base-name next-suffix cache, preserving the name, name 2,
name 3 ... sequence and first-match behavior.

Finding: 9c7a5fdb-131e-4687-8175-58d72007b0c5 (CWE-407)
2026-10-22 07:11:54 -04:00
aiongg d3cc3a69fb Integration: #8344 compare the Photo Filter dictionary as bytes (the field is Vec<u8> on main) 2026-10-22 02:30:49 +00:00
aiongg 79ff67c3f2 Merge PR #7249: fix(atn): reject non-replace select.rect modes in .atn export (#7194)
Conflicts:
crates/engine/src/atn_cmds/tests.rs: appended tests, kept both
2026-10-22 02:27:06 +00:00
aiongg ac0e29ca4c Merge PR #7115: fix(atn): map Apply Layer Comp steps by name (#7101)
Conflicts:
docs/gaps.md: header line is ours plus the PR's missing change item (later Last updated date); change-log rows kept both, newest first
docs/file-format-parity.md: same
2026-10-22 02:26:51 +00:00
aiongg d1f5bae8c3 Merge PR #7232: fix(atn): export recorded layer.select with name parameter (#7185)
Conflicts:
crates/engine/src/atn_cmds/tests.rs: appended tests, kept both
2026-10-22 02:26:31 +00:00
aiongg 8a4fe7c607 Merge PR #7656: Refuse .atn export of resolution-only Image Size without keepPrintSize
Conflicts:
crates/engine/src/atn_cmds/tests.rs: appended tests, kept both
2026-10-22 02:26:26 +00:00
aiongg 4eef797fdf Merge PR #7968: fix(atn): a Group Layers step keeps its explicit layer through .atn (#7236)
Conflicts:
crates/engine/src/atn_cmds/tests.rs: appended test helper and tests (two blocks), kept both
2026-10-22 02:25:59 +00:00
aiongg 624c9b743e Merge PR #7262: fix(atn): reject numeric layer references in .atn export (#7248)
crates/engine/src/jobs.rs: kept both Running fields (recorded_by, pre_selected) and both initialisers; main's new_fx_target block and foreign-recording flush kept; after_command takes the PR's pre_selected argument at both call sites.
2026-10-22 02:25:23 +00:00
aiongg b7e01f8bda Merge PR #7591: fix(atn): refuse strict export of canvas-bound selection modifies and placed pattern buckets
crates/engine/src/atn_cmds.rs: no `uncarried` macro arm; the four Select > Modify events (Feather, Expand, Contract, Smooth) use the existing `unless` arm with a new predicate `applies_at_canvas_bounds` (wraps the PR's `flag_set`). Helper fns kept both (`preserves_roundness`, `flag_set`).
crates/engine/src/atn_cmds/tests.rs: both sides' appended tests kept whole.
2026-10-22 02:24:51 +00:00
aiongg 2529a433a0 Merge PR #8371: Fix compound layer property exports in the reference app actions
docs/gaps.md: header line kept from main with the PR's change entry prepended; the PR's change-log row placed above main's 2026-10-21 row.
2026-10-22 02:24:10 +00:00
aiongg 46adea7eb8 Merge PR #8344: Actions: Photo Filter saves to .atn under the name the reference app runs (#8301)
crates/engine/src/atn_cmds.rs (EVENTS): main builds adjustment events with adjustment_event!; kept main's Black & White macro line and used the PR's by-name Photo Filter (empty code) through the same macro, with the PR's comment.
2026-10-22 02:23:59 +00:00
aiongg e41060429d Merge PR #7258: fix(atn): reject off-center radial blur in .atn export (#7234)
crates/engine/src/atn_cmds.rs: kept main's helper block (SMART_BRUSH, Color Range, clipping events) whole and the PR's radial blur consts and fns after it.
crates/engine/src/atn_cmds/tests.rs: kept both sides' tests whole.
2026-10-22 02:23:51 +00:00
aiongg 182116cb6d Merge PR #8324: fix(actions): Hue/Saturation uses the reference app's hue key H in .atn files (#8302, #8308)
crates/engine/src/atn_cmds/tests.rs: both sides appended tests; kept both whole.
2026-10-22 02:23:47 +00:00
aiongg 9d2612fc01 Merge PR #7611: Refuse strict ATN export of Select and Mask with brush strokes
crates/engine/src/atn_cmds.rs: kept main's smartBrushWorkspace/autoCutout/ClrR events and comment; refineSelectionEdge uses the PR's refine_edge_to, which also refuses a step with sampleAllLayers (main's earlier inline check).
crates/engine/src/atn_cmds/tests.rs: kept both sides' tests whole.
2026-10-22 02:23:25 +00:00
aiongg b1cd5e802b Merge PR #8182: fix(actions): .atn export of Image Size with resample none no longer adds a pixel resize (#7189)
crates/engine/src/atn_cmds/tests.rs: both sides appended tests; kept both whole.
2026-10-22 02:23:21 +00:00
aiongg b119da85cb Merge PR #7801: Refuse strict .atn export of an in-place layer duplicate
contributors/people.toml: both sides appended a person; kept both.
2026-10-22 02:23:00 +00:00
aiongg a53c1ed1d7 Merge PR #7759: Actions: a setting the reference app's event cannot hold refuses the step
crates/engine/src/atn_cmds.rs: the filter macro's to guard keeps both checks (pixel_target && !skip && holds_its_settings); kept main's preserves_roundness and the PR's UNHOLDABLE table and holds_its_settings.
crates/engine/src/atn_cmds/tests.rs: kept both sides' tests whole.
2026-10-22 02:22:51 +00:00
aiongg 46b1cda2d6 Merge PR #7621: Play .atn steps that switch to another open document
crates/engine/src/atn_cmds.rs: three hunks, kept both sides (the Mn menu-item mapping and zoom ids from main, the Dcmn offset mapping and document.activate id from the PR); the document.activate arm precedes main's menu-item fallback in select_to.
docs/gaps.md: header line kept from main with the PR's change entry prepended and the date 2026-10-19.
2026-10-22 02:22:50 +00:00
aiongg aa4f03a8ad Merge PR #7571: Refuse strict .atn export of Apply Image with a blending mask
Conflicts:
crates/engine/src/atn_cmds/tests.rs: appended tests, kept both
2026-10-22 02:22:48 +00:00
aiongg a40972d80d Merge PR #7585: Refuse strict .atn export of a mask/channel-targeted Free Transform
Conflicts:
crates/engine/src/atn_cmds/tests.rs: appended tests, kept both
2026-10-22 02:22:32 +00:00
aiongg b66199332f Merge PR #7588: fix(atn): refuse strict export of options the descriptors can't carry
crates/engine/src/atn_cmds.rs: kept this PR's range-checked Kind::Long arm and main's Kind::ExactLong arm; dropped the PR's Group Layers explicit-layer refusal (#7236), as #7968 exports that layer by name.
crates/engine/src/atn_cmds/tests.rs: kept both sides' tests whole; dropped the PR's groupLayers layer:3 refusal case (#7236).
2026-10-22 02:22:30 +00:00
aiongg 1e24b4d743 Merge PR #7593: Refuse .atn export of crops with output size or resolution
crates/engine/src/atn_cmds/tests.rs: both sides appended tests; kept both whole.
2026-10-22 02:22:22 +00:00
aiongg 1cbeb4a784 Merge PR #7590: fix(atn): keep a Transform Selection's interpolation; refuse what the transform descriptor can't carry
Conflicts:
crates/engine/src/atn_cmds/tests.rs: appended tests, kept both
2026-10-22 02:22:16 +00:00
aiongg 3d1f65123e Merge PR #6829: Actions: Shift-click layer select in .atn imports as range select and exports back (#6784) 2026-10-22 02:21:56 +00:00
aiongg 64d042aef5 Integration: Create Clipping Mask also maps the GrpL code and a named-layer target, for #6881 and #4496 2026-10-21 21:56:21 +00:00
aiongg 719fb44d42 Merge PR #6881: Actions: .atn Select Subject, Select and Mask, Color Range, clipping and layer masks, colours map to commands (part of #6745) 2026-10-21 21:56:21 +00:00
aiongg 97a1a67f38 Merge PR #7959: Actions: Emboss saves to and loads from .atn as Photoshop's Embs step (#7946) 2026-10-21 21:55:49 +00:00
bommerts d1c30954aa Fix compound layer property exports for Photoshop actions 2026-10-21 17:08:17 -04:00
JGF a310863330 Actions: Photo Filter saves to .atn under the name Photoshop runs (#8301)
Save Actions wrote Photo Filter steps with the four-char event code PhtF.
Photoshop loads the file but stops on playback ("The command 'Photo
Filter' is not currently available"). The same descriptor runs under the
string event photoFilter (measured by the reporter in Photoshop 27.11 at
8 and 16 bits). PhtF is the adjustment's class, not an event.

- Photo Filter now exports by name (photoFilter), like Black & White,
  Box Blur and Surface Blur since dfe94d6a. The descriptor is unchanged.
- Import still accepts PhtF through LEGACY_CODES, so actions PhotoCraft
  saved before keep loading, and they re-save under the name.
- Tests: Photo Filter joins the by-name/legacy-code test (export id,
  import by name and old code, near misses stay Photoshop steps). A new
  test records the issue's exact step, saves it strictly with nothing
  skipped, loads a Photoshop-authored step and an old PhtF step, re-saves
  both as photoFilter, and plays both the same as a direct run at 8 and
  16 bits. Both tests fail without the fix.
2026-10-21 15:30:15 -04:00
aiongg f6ed54e83e Merge PR #7389: fix(atn): a preset-only Photo Filter step exports its resolved colour (#7235) 2026-10-21 18:15:08 +00:00
aiongg a6702058db Merge PR #7627: Actions: Minimum / Maximum with Preserve: Roundness is no longer exported as Squareness (#7233) 2026-10-21 18:15:02 +00:00
aiongg 8baf2ef75b Merge PR #7751: Actions: a Selective Color step keeps the values of its scalar form 2026-10-21 18:15:00 +00:00
Korg1ch 0c1a59495f test(actions): Hue/Saturation writes and reads hue under H in .atn (#8302, #8308) 2026-10-21 20:46:33 +03: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
Michael HigginsandGitHub 616ab9d56a Merge branch 'storytold:main' into fix/6745-atn-event-mapping 2026-10-21 11:37:25 -04:00
VishnuByrraju c088250481 fix(actions): .atn export of Image Size with resample none no longer adds a pixel resize (#7189) 2026-10-21 12:15:13 +05:30
jonathanwxh-cell c5e25bba8f Merge current main and validate document activation replies 2026-10-21 14:12:39 +08:00
aiongg 375c5e1517 Merge PR #7085: Actions: an imported Crop step in a unit other than pixels is not applied as pixels (#7084) 2026-10-21 05:04:02 +00:00
Higgs32584andClaude Opus 5.5 8fa1217bcc Actions: Add Layer Mask maps only the target layer's mask
A `make` of a `Chnl` whose `At` reference has further items (the mask of
a named layer) was mapped to a layer.layerMask command, which acts on the
target layer. Such a step now stays a kept Photoshop step, reported as
unsupported.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 21:33:02 -04:00
Higgs32584andClaude Opus 5.5 f44bf80b86 Merge upstream main into fix/6745-atn-event-mapping
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 21:19:12 -04:00
404a17e711 Integration: write the .atn defaults Photoshop plays differently, keep resets and both colours (#4496)
The PR stopped writing PhotoCraft's defaults for params a step leaves
out. Checked against Photoshop, that is fine for Fill opacity and mode,
Crop delete, Selective Color method, Channel Mixer monochrome, Paint
Bucket contiguous and Gradient Map reverse/dither, but Photoshop plays
other missing keys differently: Canvas Size anchors top left (PhotoCraft:
centre), Apply Image blends Normal (Multiply), Color Balance turns
preserve luminosity off (on), and a Paint Bucket step without a
tolerance doesn't play at all. Those, and the unverified Hue/Saturation,
Color Balance tone and Save for Web keys, are written again as before.

- `tools.setColors` exported only the foreground of a step that sets
  both colours; such a step now doesn't export (the strict save refuses
  it, as before the PR).
- `kind` on an imported `layer.setAdjustment` made Photoshop's "reset to
  default" (`set` with an empty `T`) a no-op merge; it now joins only
  params that edit something.
- `cargo xtask corpus --atn` (and `--all`) failed on Windows: the Bjango
  archive has a macOS `Icon\r` file tar can't create there; it's skipped.
- `test-corpus --changed` now runs for `atn_cmds` changes, and the
  `ALL` doc comment is back on `ALL`.

Tests: defaults_photoshop_plays_differently_are_written,
set_colors_exports_only_a_single_colour and
adjustment_layer_reset_still_resets fail without this commit; the psd
and engine .atn corpus tests still pass (16 files byte-identical; 513
kept Photoshop steps).

Co-authored-by: Fabio Lissi <3223836+FabioLissi@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 02:28:58 +02: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
seotarek 121002e1b9 fix(atn): guard radial_blur_to with pixel_target and test mask target (#7234) 2026-10-20 22:49:15 +03:00