92 Commits
Author SHA1 Message Date
Korg1ch 0c1a59495f test(actions): Hue/Saturation writes and reads hue under H in .atn (#8302, #8308) 2026-10-21 20:46:33 +03:00
Korg1ch e3de56c639 fix(actions): Hue/Saturation uses Photoshop's hue key H in .atn files (#8302, #8308)
The Hst2 adjustment wrote and read hue under 'Hue '; Photoshop's key is 'H   ' (stringID hue, as PhotoCraft's PSD Hue/Saturation smart filter already uses). Exported actions failed in Photoshop with a program error, and Photoshop-recorded actions imported without their hue. Export writes 'H   '; import reads it, and still reads 'Hue ' from PhotoCraft's own older files.
2026-10-21 20:26:44 +03:00
Korg1ch c2ddc8045e test(ui): the tab strip's » button stays at the right end however many tabs fit (#8290) 2026-10-21 20:05:44 +03:00
Korg1ch 4ee0acbb20 fix(ui): pin the document tabs' » button to the strip's right end (#8290)
The overflow button sat right after the last tab that fit, leaving a gap of up to a tab's width at the end of the strip. Photoshop keeps it at the strip's right end; so do both the Pro and the Studio tab strips now.
2026-10-21 20:05:44 +03:00
Korg1ch a6b950c4fc test(actions): Export As is recorded and replayed; a bad recorded step is an error (#7207) 2026-10-21 19:29:16 +03:00
Korg1ch d93458b72b fix(actions): record File › Export › Export As and replay it with its destination and settings (#7207) 2026-10-21 19:29:16 +03:00
Korg1ch 01784f104f test(raw): a developed raw takes the Raw Defaults resolution on every open path; other files keep theirs (#7789) 2026-10-21 18:28:11 +03:00
Korg1ch 699bbd4b85 fix(engine): a developed raw opens at Preferences › Raw Defaults › Resolution (#7789) 2026-10-21 18:28:11 +03:00
Korg1ch 3d3b67b74c test(ui-egui): light themes outline the slider knob at 3:1 (#7927) 2026-10-21 18:28:10 +03:00
Korg1ch 76e4e81e33 fix(ui-egui): outline the slider knob in the light themes (#7927) 2026-10-21 18:28:10 +03:00
Korg1ch bf47df8907 test(ui-egui): Save a Copy suggests the document's own name with the preference on (#8080) 2026-10-21 18:28:09 +03:00
Korg1ch 5f4c636b09 fix(ui-egui): File Handling preference to not append "copy" when saving a copy, as in Photoshop (#8080) 2026-10-21 18:28:09 +03:00
Korg1ch 66ff3bf7eb test(engine): a Displace smart filter keeps its embedded map; an outside new map is refused before it is read (#7423) 2026-10-21 18:26:00 +03:00
Korg1ch d13facdc28 test(ui): slice handles resize their edges; the middle still moves; locked slices keep their size (#7863) 2026-10-21 18:25:43 +03:00
Korg1ch dcfac95286 test(ui): Slice Select and Slice refuse presses while slices are locked (#7865) 2026-10-21 18:25:36 +03:00
Korg1ch 06d55f7adb fix(ui): locked slices can't be selected with Slice Select, and both slice tools say why (#7865) 2026-10-21 18:25:35 +03:00
Korg1ch 3c7ee9eded fix(engine): Displace on a Smart Object embeds its map in the smart filter, as Photoshop does (#7423) 2026-10-21 18:23:45 +03:00
Korg1ch 019eb273cc fix(ui): Slice Select's handles resize the selected slice (#7863) 2026-10-21 18:23:27 +03:00
Korg1ch 4919146079 test(ui-egui): the dock's width range follows the window; 700 is no longer cut to 520 (#7896) 2026-10-21 07:52:48 +03:00
Korg1ch c9cd56e165 fix(ui-egui): the dock can be dragged as wide as the window allows, not only 520 points (#7896) 2026-10-21 07:52:48 +03:00
Korg1ch c41a569dd8 test(ui-egui): Alt pressed during a drag leaves the menu bar alone in either release order (#8113) 2026-10-21 07:33:58 +03:00
Korg1ch 1e93f2cbb7 fix(ui-egui): Alt held during a drag is no menu-bar tap, so Enter commits the transform (#8113) 2026-10-21 07:33:58 +03:00
Korg1ch ee19856487 test(ui-egui): clicking below the layers deselects them; a row still selects (#8100) 2026-10-21 05:28:32 +03:00
Korg1ch 18aa6a199b fix(ui-egui): a click on the empty Layers panel space deselects every layer, as in Photoshop (#8100) 2026-10-21 05:28:31 +03:00
Korg1ch 3d7d62e349 test(io): cmls entries without enab inherit the last visibility or start visible (#8093) 2026-10-21 05:05:56 +03:00
Korg1ch 385d2a7a01 fix(io): a layer comp entry without enab inherits the previous visibility, as Photoshop reads cmls (#8093) 2026-10-21 05:05:55 +03:00
Korg1ch 773fc08763 test(i18n): Simplified Chinese counted messages are translated 2026-10-21 04:17:38 +03:00
Korg1ch 576fd9d353 fix(i18n): translate the 14 counted status messages missing from Simplified Chinese 2026-10-21 04:17:37 +03:00
Korg1ch 322c61c765 test(i18n): Korean counted messages are translated 2026-10-21 04:17:32 +03:00
Korg1ch b0171aa9ee fix(i18n): translate the 14 counted status messages missing from Korean 2026-10-21 04:17:32 +03:00
Korg1ch d0b371f92a test(i18n): Polish counted messages use all three plural forms 2026-10-21 04:17:25 +03:00
Korg1ch fc95c055dc fix(i18n): translate the 14 counted status messages missing from Polish 2026-10-21 04:17:24 +03:00
Korg1ch 9461446919 test(i18n): Indonesian counted messages are translated 2026-10-21 04:17:09 +03:00
Korg1ch dc428e4db6 fix(i18n): translate the 14 counted status messages missing from Indonesian 2026-10-21 04:17:09 +03:00
Korg1ch 53b2e1fc9a test(ui-egui): page keys scroll a zoomed canvas a screen, a step, sideways and to its corners (#8057) 2026-10-21 01:35:08 +03:00
Korg1ch fdbac3ca03 fix(ui-egui): Page Up/Down, Home and End scroll the canvas, as in Photoshop (#8057) 2026-10-21 01:35:08 +03:00
Korg1ch 4d6d735ff9 test(io): developed CR2 and RW2 raws carry their EXIF, without orientation or pixel dimensions (#6957) 2026-10-20 18:28:13 +03:00
Korg1ch 7296d0d8b2 fix(io): a developed camera raw keeps the raw's EXIF for File Info's Camera Data (#6957) 2026-10-20 18:28:13 +03:00
Korg1ch 5f8b124efa test(ui-egui): Slice Select's icon differs from Object Selection's and Slice's (#7859) 2026-10-20 16:27:12 +03:00
Korg1ch 5634b5155a fix(ui-egui): Slice Select gets its own icon, the Slice knife with a pointer (#7859) 2026-10-20 15:50:02 +03:00
Korg1ch 52312331d8 test(engine): Emboss saves as Embs with integer Angl/Hght/Amnt and loads back (#7946) 2026-10-20 14:56:00 +03:00
Korg1ch 38611da546 fix(engine): .atn save and load map Filter › Stylize › Emboss to Photoshop's Embs (#7946) 2026-10-20 14:56:00 +03:00
Korg1ch 9819df5002 test(ui-egui): clicking a note shows its author and colour (#7940) 2026-10-20 13:59:18 +03:00
Korg1ch d26d32cafe fix(ui-egui): a selected note shows its author and colour in the Note options bar (#7940) 2026-10-20 13:59:17 +03:00
Korg1ch 09749739ad test(io): a PSB's lnk2/pths/cinf are written as 8B64 with an 8-byte length (#7937) 2026-10-20 13:38:41 +03:00
Korg1ch c706938bde fix(io): PSB writes 8-byte-length global blocks with the 8B64 signature (#7937) 2026-10-20 13:38:07 +03:00
Korg1ch 4fea6ffda4 test(ui-egui): Fixed Size fields show and take the unit picked on them (#7910) 2026-10-20 12:39:05 +03:00
Korg1ch 53c3ff543b fix(ui-egui): Fixed Size marquee width and height take any length unit (#7910) 2026-10-20 12:39:05 +03:00
Korg1ch 258e17b017 test(ui-egui): ⌘ over a thumbnail shows the load cursor and badge (#7824) 2026-10-20 12:10:41 +03:00
Korg1ch feb0ea6a5b fix(ui-egui): the pointer over a layer thumbnail shows what a ⌘-click loads (#7824) 2026-10-20 12:10:40 +03:00
Korg1ch 295901cf3f test(ui): the shape dialog shows Width and Height in the picked unit and remembers it (#7786) 2026-10-20 11:02:35 +03:00
Korg1ch db2b55f66e fix(ui): Create Rectangle/Ellipse/Triangle/Polygon: right-click Width or Height to pick their unit (#7786) 2026-10-20 11:02:35 +03:00
Korg1ch 4a3f3ba665 test(ui): an Alt+right-drag in the Liquify dialog resizes the brush where it was, with no stroke (#7884) 2026-10-20 10:30:33 +03:00
Korg1ch 24b8b027e9 fix(ui): Liquify's Alt-drag brush resize keeps the brush in place and doesn't paint (#7884) 2026-10-20 10:30:32 +03:00
Korg1ch aede66995d test(ui): Delete and Backspace delete the selected slice; locked and auto slices keep the layer (#7862) 2026-10-20 06:44:12 +03:00
Korg1ch 2c030a300c fix(ui): Delete with Slice Select deletes the selected slice, not the layer (#7862) 2026-10-20 06:44:11 +03:00
Korg1ch e92e5164a8 test(io): an indexed GIF keeps its table and transparent entry; malformed GIFs give no table (#7886) 2026-10-20 06:18:48 +03:00
Korg1ch 04a2169b44 fix(io): an indexed GIF opens in Indexed Color with its colour table (#7886) 2026-10-20 05:45:16 +03:00
Korg1ch ec0fc7cb0e test(atn): strict export refuses Minimum / Maximum with Roundness; Squareness round-trips (#7233) 2026-10-19 21:37:45 +03:00
Korg1ch 59b03f2948 fix(atn): a Minimum / Maximum step with Preserve: Roundness is not exported as Squareness (#7233) 2026-10-19 21:37:21 +03:00
Korg1ch b287a884f4 test(engine): a job applied during a later recording is not recorded there (#7289) 2026-10-19 21:36:24 +03:00
Korg1ch 07b9600561 fix(engine): a background job's step goes only to the recording it was started in (#7289) 2026-10-19 21:36:23 +03:00
Korg1chandBrandon Thomas 990483a95e Actions: Apply Layer Comp is recorded by the comp's name, so it plays in any document (#7181) (#7790)
* fix(engine): record Apply Layer Comp by the comp's name, not its document-local id (#7181)

* test(engine): a recorded Apply Layer Comp applies the comp of that name in another document (#7181)

---------

Co-authored-by: Brandon Thomas <echelon@gmail.com>
2026-10-19 13:44:51 -04:00
Korg1ch 8c2cfdba6a fix(linux): keep crash-recovery autosaves in $XDG_STATE_HOME, out of the config folder (#6612) (#6941)
* fix(linux): keep crash-recovery autosaves in $XDG_STATE_HOME, out of the config folder (#6612)

* test(linux): cover the XDG state recovery folder (#6612)
2026-10-19 13:32:14 -04:00
Korg1ch af0857372b test(web): the boot module tells gzip from wasm the browser already inflated (#7639) 2026-10-19 12:37:55 +03:00
Korg1ch cb1b479452 fix(web): start the app when the server already inflated its gzip part (#7639) 2026-10-19 12:37:54 +03:00
Korg1ch f3fb5781ef Lens Blur: an alpha channel as the depth map source, as in Photoshop (#7400) (#7508)
* fix(filters): Lens Blur reads its depth from an alpha channel, listed in Depth Map › Source as in Photoshop (#7400)

* test(filters): Lens Blur depth from an alpha channel by name or index, its errors, and the Source menu (#7400)
2026-10-18 17:23:32 -04:00
Korg1ch 2a9a35f038 test(menus): Ctrl+Alt+I then Alt up leaves the bar alone and Enter confirms Image Size (#7481) 2026-10-19 00:04:38 +03:00
Korg1ch 8c6166849a fix(menus): Alt held through a shortcut no longer puts the keyboard on the menu bar, so Enter reaches the dialog (#7481) 2026-10-19 00:04:38 +03:00
Korg1ch f8e4a1344f Print: the last print's settings survive a relaunch, as in Photoshop (#7410) (#7526)
* fix(print): the last print's settings are kept in the preferences, so Print opens with them after a relaunch (#7410)

* test(print): the last print's settings survive a relaunch for Print and Print One Copy (#7410)
2026-10-18 16:57:24 -04:00
Korg1ch a4436074c9 Font field: ↑/↓ step through the fonts after a pick, as in Photoshop (#7407) (#7426)
* fix(type): ↑/↓ on the focused font field step through the families after a pick, as in Photoshop (#7407)

* test(type): the font field keeps the focus after a pick and ↑/↓ step the families (#7407)
2026-10-18 16:56:10 -04:00
Korg1ch 9b4648e195 Font menu: hovering a font no longer grows its row and makes the list jump (#7406) (#7425)
* fix(type): font menu rows keep their size when hovered or selected, so the list no longer jumps (#7406)

* test(type): hovering a font row moves no row and keeps the menu width (#7406)
2026-10-18 16:56:04 -04:00
Korg1ch ccdf082c62 test(caf): erased sampling area previews as an error; a failed OK keeps the workspace open (#7384) 2026-10-18 17:49:09 +03:00
Korg1ch f0ef89baf6 fix(caf): an erased sampling area previews as an error, and a failed OK keeps the workspace open (#7384) 2026-10-18 17:48:53 +03:00
Korg1ch 295a28a50b fix(ui): Ctrl/Cmd-drag in the Navigator zooms to the drawn rectangle, as in Photoshop (#6872) (#7140)
* fix(ui): Ctrl/Cmd-drag in the Navigator zooms to the drawn rectangle, as in Photoshop (#6872)

* test(ui): cover the Navigator zoom rectangle (#6872)
2026-10-18 03:34:52 -04:00
Korg1ch 84f326fa25 Actions: a Paint Bucket step keeps its explicit colour through .atn (#7199) (#7208)
* fix(atn): a Paint Bucket step keeps its explicit colour through .atn export and import (#7199)

* test(atn): an explicit Paint Bucket colour survives an .atn round trip (#7199)
2026-10-18 03:07:23 -04:00
Korg1ch f04fc80267 fix(engine): flip and rotate presets turn about the selection's bounds, as Free Transform does (#6928) (#6967)
* fix(engine): flip and rotate presets turn about the selection's bounds, as Free Transform does (#6928)

* test(engine): cover flips and turns about the selection (#6928)
2026-10-18 03:07:18 -04:00
Korg1ch 36d6b669d4 test(engine): Content-Aware Fill with an empty sampling area is refused and changes nothing (#6532) 2026-10-18 09:46:18 +03:00
Korg1ch 0f12ac151f fix(engine): refuse a Content-Aware Fill with nothing to sample instead of filling black (#6532) 2026-10-18 09:19:41 +03:00
Korg1ch cc3ca41c6d test(liquify): zoom keys step the preview, not the canvas; pinch and wheel zoom about the pointer (#7210) 2026-10-18 04:17:32 +03:00
Korg1ch 5ed2a1ff99 fix(liquify): zoom the preview with ⌘+/⌘−/⌘0/⌘1, a trackpad pinch and ×1.1 wheel notches, as in Photoshop (#7210) 2026-10-18 04:17:32 +03:00
Korg1ch 3ee6620935 test(ui): cover the Adaptive Wide Angle constraint menu and the orient op 2026-10-18 03:00:09 +03:00
Korg1ch 7e5a97385e fix(ui): right-click an Adaptive Wide Angle constraint for its orientation menu, as in Photoshop 2026-10-18 03:00:09 +03:00
Korg1ch 00e4423fcc test(compose): Dissolve effects are speckled, tile-independent and match on the GPU (#6995) 2026-10-18 02:57:55 +03:00
Korg1ch e0d90b2896 fix(compose): layer effects in Dissolve mode speckle instead of painting as Normal (#6995) 2026-10-18 02:57:44 +03:00
Korg1ch 4c881326ea fix(windows): keep crash-recovery autosaves out of the roaming profile (#5648) (#6412)
* fix(windows): keep crash-recovery autosaves out of the roaming profile (#5648)

* test(windows): cover the local recovery folder and moving old autosaves (#5648)
2026-10-16 20:19:06 -06:00
Korg1ch 3c75db7a80 fix(linux): avoid duplicate AppImage desktop launcher when managed by AM / AppMan (#6392) (#6394)
* fix(linux): avoid duplicate AppImage desktop launcher when managed by AM / AppMan (#6392)

* test(linux): cover AM / AppMan launcher detection in AppRun smoke test (#6392)
2026-10-16 16:37:17 -06:00
1874214f79 fix(ui): keep brush settings section lock icons permanently visible (#4278) (#4300)
* fix(ui): keep brush settings section lock icons permanently visible (#4278)

* test(ui): verify brush settings locks stay visible and toggle on click (#4278)

* Format the lock-icon test

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 21:00:58 -04:00
Korg1ch 0d6a83e3ce fix(ui): add Brushes button at top of Brush Settings control list (#4265) (#4354)
* fix(ui): add Brushes button at top of Brush Settings control list (#4265)

* test(ui): verify Brushes button at top of Brush Settings opens Brushes panel (#4265)
2026-10-12 20:56:18 -04:00
Korg1ch 4122bc6918 fix(ui): use a linear gradient ramp glyph for the Gradient tool icon (#4172) (#4335)
* fix(ui): use a linear gradient ramp glyph for the Gradient tool icon (#4172)

* test(ui): verify Gradient tool icon rasterizes a left-to-right ramp (#4172)
2026-10-12 20:56:09 -04:00
Korg1ch ec61df6f06 fix(ui): make clickable tab, checkbox, and radio labels non-selectable (#3972) (#4331)
* fix(ui): make clickable tab and radio labels non-selectable with pointing hand cursor (#3972)

* test(ui): verify New Document preset tabs show pointing hand cursor instead of text caret (#3972)
2026-10-12 20:55:47 -04:00
Korg1ch dc35ce7630 fix(linux): avoid duplicate AppImage desktop launcher (#3623) (#3641) 2026-10-12 10:35:47 -04:00