Commit Graph
3508 Commits
Author SHA1 Message Date
David MannandClaude Opus 5.5 a1b56b2d72 Address CodeRabbit review: a layered Duotone writes its real merged image, for #4935
A Duotone PSD opens flattened from its merged image (its layer records are
not read back), but with Maximize Compatibility off a layered Duotone was
saved with the white placeholder, so reopening it showed white. Its merged
image is now always written, like a document without layer records.

Test: a_layered_duotone_keeps_its_image_without_maximize_compatibility.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 21:04:36 +02:00
David MannandClaude Opus 5.5 45c7b57b6a Address CodeRabbit review: render smart filters with unmodeled settings stay verbatim, for #6160
Clouds, Difference Clouds, Fibers and Lens Flare opened as editable smart
filters even when their descriptor held an extra or repeated setting, a
value of another type (a long centre, a unit seed), an RGBC colour with
extra keys or out of 0-255, or a Lens Flare enum of another type. A
re-save rebuilt the item without it. They now need exactly the keys and
value types Photoshop writes; anything else stays a psd.unsupportedFilter
and round-trips byte for byte, as main's newer filters do with only_keys.

Test: render_filters_with_settings_we_dont_model_stay_verbatim (30 cases).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 21:04:36 +02:00
David MannandClaude Opus 5.5 30c420761d Merge remote-tracking branch 'origin/main' into integration-batch-5
Conflicts with main's smart-filter and layer-style work, both sides kept:
- smart_map: main's 27 more filters and this batch's Clouds, Difference
  Clouds, Fibers and Lens Flare (45 known); the item colours are written for
  Pointillize, Tiles and the three coloured render filters.
- layer_style: main's new Stroke default (1 px inside black) with this
  batch's Overprint.
- psd_export: main's verbatim unknown adjustments with this batch's unpadded
  Gradient Map check.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 19:50:16 +02:00
aiongg 68348dcafc Merge pull request #8271 from aiongg/integration-8
Integration batch: 86 PRs on main
2026-10-21 11:02:54 -04: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
David Mann b68b64ccb5 Merge PR #6160: feat(psd): editable Render smart filters (Clouds, Difference Clouds, Fibers, Lens Flare)
# Conflicts:
#	docs/file-format-parity.md
2026-10-21 11:37:14 +02:00
David Mann 86811ddeee Merge PR #6002: Stroke: keep Overprint (overprint)
# Conflicts:
#	crates/engine/src/layer_style.rs
#	crates/ui-egui/src/layer_style.rs
#	docs/file-format-parity.md
2026-10-21 11:36:58 +02:00
David Mann d276fce259 Merge PR #8081: fix(psd): pad Gradient Map blocks (#8070) 2026-10-21 11:30:21 +02:00
David Mann a492716367 Merge PR #5990: Bevel & Emboss: keep the Gloss Contour's Anti-aliased (antialiasGloss) 2026-10-21 11:29:05 +02:00
David Mann 213eaa260d Merge PR #5407: Support .act color tables end to end (swatches + Color Table dialog) 2026-10-21 11:28:43 +02:00
David Mann b16910427c Merge PR #4935: PSD Duotone: read and write the ink block (names, colours, curves) 2026-10-21 11:28:32 +02:00
David Mann 27b8d133d8 Merge PR #4771: Fix mixed-order layered TIFF type geometry and unsafe text fallback 2026-10-21 11:28:23 +02:00
David Mann 4cfb576ee0 Merge PR #4496: .atn: a pinned corpus of real action sets, with byte-exact and load/save/reload tests (#219) 2026-10-21 11:28:19 +02:00
f5543e85fc Integration: merge main, resolve conflicts (#5407)
main added the GPU adapter strings (#1885) at the end of every
translation table, where this PR adds the Color Table strings. Both
blocks are kept.

Co-authored-by: abdul-karim-mia <97598943+abdul-karim-mia@users.noreply.github.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 11:23:09 +02:00
Dylan M. Taylor 04d0212c7a Merge pull request #6448 from dylanmtaylor/ci/shared-nix-workflow
ci: switch to shared nix workflow from craft-common-actions
2026-10-21 03:40:26 -04:00
aiongg abd0582add Integration: the Type units test makes its type after the resolution change, for #7125
#7125 keeps existing type's pixel size across Image Size, so the #6491 test's 12 pt layer, made before the change to 144 ppi, became 6 pt. The test now creates its layer at 144 ppi; its assertions are unchanged.
2026-10-21 05:04:04 +00:00
aiongg 194dfcf0ec Integration: Clear History resets the History Brush source and Undo brings it back, for #3534 and #3536 2026-10-21 05:04:04 +00:00
aiongg c5176efd93 Integration: a scale beyond f32 range is refused, not clamped, for #7048
Main's 3f216a0cd1 rejects numeric overflow before document edits; #7048's test predates it and expected 1e39 to clamp to 150 %.
2026-10-21 05:04:04 +00: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 a2c56f960f Integration: gaps.md preferences count from the regenerated scorecard, for #6208 and #6211 2026-10-21 05:04:04 +00:00
aiongg 8e04e6f21e Integration: regenerate docs/scorecard.md for the batch 2026-10-21 05:04:04 +00:00
aiongg cb8bea1636 Merge PR #7044: Conditional Mode Change: "gray" as a single source mode matches Grayscale (#7042)
# Conflicts:
#	crates/engine/src/file_cmds/tests.rs
2026-10-21 05:04:04 +00:00
aiongg 1d567a115f Merge PR #7015: Actions: deleting an action removes its function key (#7014)
# Conflicts:
#	crates/engine/src/actions_cmds.rs
2026-10-21 05:04:04 +00:00
aiongg 2a1ac6a6fb Merge PR #6208: Preferences: Save in Background off saves in the foreground (#6207)
# Conflicts:
#	docs/gaps.md
#	docs/scorecard.md
2026-10-21 05:04:04 +00:00
aiongg 050caf9ecd Merge PR #6681: Content-Aware Move: live preview for large selections (TOOL-213-4, #6680)
# Conflicts:
#	docs/gaps.md
#	docs/scorecard.md
#	docs/target-app-parity.md
2026-10-21 05:04:04 +00: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
aiongg f163e3ce0b Merge PR #6211: Zoom tool: hold to zoom continuously with Animated Zoom on (#6210)
# Conflicts:
#	docs/gaps.md
#	docs/scorecard.md
#	docs/ui-parity.md
2026-10-21 05:04:03 +00:00
aiongg 1a5d22ca94 Merge PR #6708: Paths: the path selected in the Paths panel is drawn on the canvas (#6550)
# Conflicts:
#	crates/ui-egui/src/vector_ui.rs
2026-10-21 05:04:03 +00:00
aiongg fc371711e6 Merge PR #5847: Shapes: Density and Feather on shape layers (#5846)
# Conflicts:
#	docs/scorecard.md
#	docs/target-app-parity.md
#	docs/ui-parity.md
2026-10-21 05:04:03 +00:00
aiongg cd710ca898 Merge PR #5622: Filters: Lens Correction, Adaptive Wide Angle and Camera Raw Filter respect locks on smart objects (#5621)
# Conflicts:
#	crates/engine/src/lens_cmds.rs
2026-10-21 05:04:02 +00:00
aiongg 34c5e7d49e Merge PR #3536: History: set the History Brush source from the panel (history.setSource) (#2966)
# Conflicts:
#	crates/engine/src/commands.rs
#	crates/ops/src/lib.rs
2026-10-21 05:04:02 +00:00
aiongg c23a6c9b90 Merge PR #6206: Performance: a cancelled Gaussian Blur job stops within budget (#6205)
# Conflicts:
#	docs/gaps.md
2026-10-21 05:04:02 +00: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
aiongg 3d233afd31 Merge PR #7028: Transform Selection: an unknown reference point is an error (#7027) 2026-10-21 05:04:02 +00:00
aiongg 4699d3605c Merge PR #7026: Automation: place and layer/data-set export by index keep the active document (#7025) 2026-10-21 05:04:01 +00:00
aiongg 7db7f847c4 Merge PR #7024: Automation: doc.save rejects a bad quality instead of ignoring or clamping it (#7023) 2026-10-21 05:04:01 +00:00
aiongg 26844944b9 Merge PR #7005: Keyboard Shortcuts: switching sets keeps action function keys (#7004) 2026-10-21 05:04:01 +00:00
aiongg de03dd43f1 Merge PR #6861: CLI batch: skip shell-only Save and view steps inside played action sets (#6860) 2026-10-21 05:04:01 +00:00
aiongg 1637ae25e1 Merge PR #6805: Droplets: carry the actions that Conditional steps call (#6804) 2026-10-21 05:04:01 +00:00
aiongg 9d5bf2a82c Merge PR #6773: Actions: renaming an action updates the Conditional steps that call it (#6772) 2026-10-21 05:04:01 +00:00
aiongg dc8b8834e0 Merge PR #5889: Image: Bitmap dialog with Output resolution and per-method settings (#5559) 2026-10-21 05:04:01 +00:00
aiongg 40895532aa Merge PR #5840: Export As: Resample menu, incl. Nearest Neighbor (#5838)
# Conflicts:
#	docs/scorecard.md
2026-10-21 05:04:01 +00:00
aiongg 5ec2b90f1b Merge PR #7771: Save for Web: later slices cover earlier ones, covered slices split into pieces (#7770) 2026-10-21 05:03:49 +00:00
aiongg c633674b6d Integration: one smart-filter count (41 plus Hue/Saturation, Perspective Warp, Filter Gallery and Camera Raw) in the parity doc and FILE-215-2, for #6317 2026-10-21 01:21:19 +00:00
aiongg 47488dff8e Integration: recount KNOWN smart filters (41), for #6317 2026-10-21 01:21:06 +00:00
aiongg bfce71cddd Integration: name #6317's test item pixelate_item (measured_item is taken), for #6317 2026-10-21 01:18:45 +00:00
aiongg af3dff34a6 Merge PR #6317: PSD: Mezzotint and Color Halftone smart filters open and save like Photoshop (#6316)
# Conflicts:
#	crates/io/src/smart_map.rs
#	docs/file-format-parity.md
#	docs/scorecard.md
#	scorecard/file_compat.toml
2026-10-21 01:18:35 +00:00
aiongg 3fee618fd6 Integration: recount KNOWN smart filters (39), for #6305 2026-10-21 01:18:16 +00:00
aiongg bc248fbcec Integration: name #6305's range check long_in_range and its test item measured_named_item (int_in and measured_item are taken), for #6305 2026-10-21 01:18:07 +00:00
aiongg 2c87bd630b Merge PR #6305: PSD: Offset and Custom smart filters open and save like Photoshop (#6304)
# Conflicts:
#	crates/io/src/smart_map.rs
#	docs/file-format-parity.md
#	docs/scorecard.md
#	scorecard/file_compat.toml
2026-10-21 01:17:09 +00:00