Note
FreeBSD aarch64 is dropped from this release. We had to cut releases, and we cannot build this target within the 5-hour CI limit for any of the Craft apps, so we are dropping it for now. This is a known blocker, flagged for a future fix in storytold/craft-common-actions#39. FreeBSD x86_64 and every other platform are included.
What's Changed
- Fix lag when dragging a floating selection with the Move tool by @robertoffmoura in #6318
- Open GIMP XCF files: layers, groups, masks, blend modes, channels and selection by @diegochagas in #2945
- Layers Panel: flyout, options and thumbnail sizes (part 1/3) by @abc2cb in #3289
- Layers Panel: Smart Filters mask follows thumbnail size, sub-rows stay compact (part 2/3) by @abc2cb in #3974
- Fill layers: match masks in creation and Pattern Fill preview (part 3/3) by @abc2cb in #3975
- Integration batch: #8229, David's follow-ups and 85 FredApps-approved PRs on main by @aiongg in #8355
- Vanishing Point: perspective clone samples without allocating per pixel (#7491) by @jlange91 in #7772
- Actions: a background filter's step is recorded only by the recording it started in (#7289) by @Korg1ch in #7784
- Camera raw: a developed raw keeps its EXIF (RW2 included), so File Info shows its Camera Data (#6957) by @Korg1ch in #7791
- Displace on a Smart Object: the map is embedded in the smart filter, so it displaces (#7423) by @Korg1ch in #7799
- feat(ui): search font input field sticky on scroll (#7792) by @peppepol in #7821
- Free Transform: a result over the pixel limit says so, not "not enough memory" (#7807) by @odgrim in #7837
- Free Transform: a result may take what Memory Usage allows, not 2^30 px (#7807) by @odgrim in #7838
- Scale layer-effect noise by coverage so it follows the glow by @Silvertree2010 in #7846
- Shortcuts: Ctrl+F4 closes the document beside Ctrl+W (Windows/Linux) by @bommerts in #7870
- Lock Slices: Slice Select can't select a locked slice, and both slice tools say why (#7865) by @Korg1ch in #7898
- Slice Select: the selected slice's handles resize it (#7863) by @Korg1ch in #7902
- Filter Gallery › Halftone Pattern: a tone-keeping screen at 45° by @andeecollard in #7904
- Smart Blur: 3.5× faster at radius 12 with identical output (#7921) by @wanikhawar in #7924
- Fixed Size marquee: Width and Height in any length unit (#7910) by @Korg1ch in #7928
- Light themes outline the slider knob (UI-217-11, #7927) by @Korg1ch in #7941
- Note tool: a selected note shows its author and colour in the options bar (#7940) by @Korg1ch in #7951
- Actions: Emboss saves to and loads from .atn as Photoshop's Embs step (#7946) by @Korg1ch in #7959
- Fix File Info showing 1/1 s for exposures just under one second by @Silvertree2010 in #7963
- Slice Select gets its own icon: the Slice knife with a pointer (#7859) by @Korg1ch in #7966
- perf(raster): tile content bounds compare rows in blocks (P32, #211) by @xsvm in #7980
- Windows on ARM: auto picks DirectX 12 for Qualcomm graphics (#7537) by @Higgs32584 in #8004
- Open: a file without type never waits for the font scan (#7332) by @Higgs32584 in #8005
- automation: edit.installedProfiles is no host-path command by @Elvis33LE in #8009
- fix(liquify): keep frozen pixels stable near mask boundaries (#7989) by @Sir-Starch in #8012
- Codecs: Fix corrupted CMYK JPEG exports (#8008) by @Sir-Starch in #8042
- Pencil: align 1 px click snapping with the line walker (#4895) by @Sir-Starch in #8053
- fix(psd): pad Gradient Map blocks (#8070) by @Sir-Starch in #8081
- CodeRabbit follow-ups for the #8095 batch by @davidmann4 in #8096
- PSD layer comps: an entry without enab inherits the previous visibility, as in Photoshop (#8093) by @Korg1ch in #8098
- Integration batch: 8 PRs on main by @davidmann4 in #8229
- Content-Aware Move: live preview for large selections (TOOL-213-4, #6680) by @davidmann4 in #6681
- Actions that start with Deselect play on when nothing is selected by @Higgs32584 in #6801
- A layer that doesn't fit in GPU memory no longer breaks GPU drawing: older pages are freed and the layer is retried by @Higgs32584 in #6813
- HEIF: honour the nclx colour description; HLG/PQ HEICs open as linear BT.2020 32-bit (#6752) by @Higgs32584 in #6873
- test(ui): a toolbar click with no prior hover picks the tool (part of #2603) by @Higgs32584 in #6907
- Background redraw: keep the last finished composites, so a solo's restore uploads instead of recompositing (part of #6528) by @Higgs32584 in #6908
- Web: one press per tap, so menus open again on touch (#2095) by @Higgs32584 in #6910
- Shortcuts: custom bindings on PageUp/PageDown (and other multi-word keys) fire again (#6827) by @00xJS in #6912
- Selections don't mark a document modified (#6865) by @Higgs32584 in #6919
- Actions: record File › Export › Export As and replay it with its settings (#7207) by @Korg1ch in #7219
- Brushes: folders with search matches can be collapsed while searching by @nrq6993-a11y in #7270
- macOS: keep the bundle's Dock icon after the window opens by @nrq6993-a11y in #7271
- Keyboard Shortcuts: Shift is recorded when capturing a shortcut by @nrq6993-a11y in #7303
- Freeform Pen: ⇧ constrains freehand strokes to straight 45° lines by @nrq6993-a11y in #7304
- Color panel: RGB slider mode (#7172) by @nrq6993-a11y in #7317
- test(engine): make the define-brush mask allocation fail on its own (fail-after-one) (#212) by @wwewtech in #7353
- Content-Aware Fill workspace: an erased sampling area previews as an error, and a failed OK keeps it open (#7384) by @Korg1ch in #7385
- fix(atn): a preset-only Photo Filter step exports its resolved colour (#7235) by @wwewtech in #7389
- Auto-Blend Layers: turn the Background into a layer before masking it by @Higgs32584 in #7397
- Menu bar: Alt held through a shortcut no longer takes the keyboard, so Enter reaches the dialog (#7481) by @Korg1ch in #7572
- Presets: an Export As preset survives a damaged sibling set (test for #6906) by @00xJS in #7576
- Preserve saved PCraft previews when manifest replacement fails by @jonathanwxh-cell in #7580
- Actions: stop when a Save step's document is closed by a Save Document script (#7367) by @Higgs32584 in #7587
- Toolbar: colour chips stay centred when the tools scroll (#7316) by @hectorviov in #7595
- Studio: the floating Properties card has the Adjustments tab (#7265) by @HEOJUNFO in #7617
- Flatpak: a second launch hands its files to the running PhotoCraft over a Unix socket (#1540) by @diegochagas in #7626
- Actions: Minimum / Maximum with Preserve: Roundness is no longer exported as Squareness (#7233) by @Korg1ch in #7627
- Show Technique and Range in the glow Layer Style pages (#6698) by @hectorviov in #7636
- Open the selection menu on a Quick Selection right-click (#7268) by @hectorviov in #7640
- Carry on an open path from its end with the Pen (#6593) by @hectorviov in #7647
- Move typed text with a drag from just outside it (#5956) by @hectorviov in #7653
- Move tool: a selection lifts up to a pixel's own coverage (#7655) by @hectorviov in #7661
- perf(format): reuse .pcraft writers between document saves by @reneleonhardt in #7694
- fix(actions): preserve effective Stroke width in ATN export by @PerchAnton in #7696
- fix(actions): refuse lossy fractional Ripple ATN export by @PerchAnton in #7708
- Painting symmetry: canvas edits move the axis with the pixels (#7732) by @davidmann4 in #7733
- Actions: a Selective Color step keeps the values of its scalar form by @Hamza0101 in #7751
- Perspective Crop: Color Sampler points move with the image (#7760) by @davidmann4 in #7762
- Lasso: a short straight segment places a vertex instead of closing the outline by @Hamza0101 in #7769
- Save for Web: later slices cover earlier ones, covered slices split into pieces (#7770) by @davidmann4 in #7771
- Copy: text selected in an error notice is copied, not the layer (#7807) by @odgrim in #7839
- feat(toolbar): select grouped tools using press-drag-release by @Ni-zav in #2324
- scorecard: five rows catch up with work already on main by @davidmann4 in #3516
- .atn: a pinned corpus of real action sets, with byte-exact and load/save/reload tests (#219) by @FabioLissi in #4496
- fix(screen-picker): cancel queued requests without stale replies by @Ni-zav in #4762
- Fix mixed-order layered TIFF type geometry and unsafe text fallback by @TheSeanLavery in #4771
- PSD Duotone: read and write the ink block (names, colours, curves) by @switch87 in #4935
- Support .act color tables end to end (swatches + Color Table dialog) by @abdul-karim-mia in #5407
- IO: open .psd through the PSD reader, not codecs (#5258) by @vbasky in #5436
- Layers: Group Layers creates the group collapsed (#5571) by @wanikhawar in #5581
- Warp: apply a large layer's warp in the background, with progress and Esc to cancel (#1015) by @ianswope in #5590
- Move tool: ΔX/ΔY readout beside the pointer while dragging (#5727) by @Higgs32584 in #5729
- Export As: Resample menu, incl. Nearest Neighbor (#5838) by @davidmann4 in #5840
- Shapes: Density and Feather on shape layers (#5846) by @davidmann4 in #5847
- Displace: OK asks for the displacement map, as in Photoshop (#5806) by @Higgs32584 in #5855
- Image: Bitmap dialog with Output resolution and per-method settings (#5559) by @davidmann4 in #5889
- Text: apply anti-alias mode shaping when rasterizing type (#5902) by @nrq6993-a11y in #5907
- BMP export: Indexed Color documents save as palette BMPs by @Sir-Starch in #5928
- Bevel & Emboss: keep the Gloss Contour's Anti-aliased (antialiasGloss) by @varanus-salvator in #5990
- Stroke: keep Overprint (overprint) by @varanus-salvator in #6002
- Zoom tool menu: Zoom In and Zoom Out last, as in Photoshop (#6005) by @wstock in #6028
- refactor: share hsb conversions between photocraft-color and the color picker by @osaidahmed in #6146
- feat(psd): editable Render smart filters (Clouds, Difference Clouds, Fibers, Lens Flare) by @the-unknown in #6160
- Performance: a cancelled Gaussian Blur job stops within budget (#6205) by @davidmann4 in #6206
- Preferences: Save in Background off saves in the foreground (#6207) by @davidmann4 in #6208
- Zoom tool: hold to zoom continuously with Animated Zoom on (#6210) by @davidmann4 in #6211
- Tools: each painting tool's brush persists across launches; restored tool options are clamped (#6212) by @davidmann4 in #6213
- GPU: pin the keep-overlap ordering with a tile-growth regression test by @Elvis33LE in #6243
- PSD: parameterless smart filters (Blur, Sharpen, Find Edges, Solarize…) open and save like Photoshop (#6296) by @davidmann4 in #6297
- PSD: Surface Blur, Smart Blur and Radial Blur smart filters open and save like Photoshop (#6298) by @davidmann4 in #6299
- PSD: Offset and Custom smart filters open and save like Photoshop (#6304) by @davidmann4 in #6305
- PSD: Mezzotint and Color Halftone smart filters open and save like Photoshop (#6316) by @davidmann4 in #6317
- New Document: Color Profile, the working space or another profile of the mode (#321) by @Higgs32584 in #6363
- PSD: Perspective Warp smart filters open and save like Photoshop (#6268) by @davidmann4 in #6397
- Artboards: layers outside the boards stay visible over the pasteboard (#5712) by @Higgs32584 in #6410
- Survive a lost window GPU device: draw nothing, save unsaved work for recovery, close (#3438, #1215) by @00xJS in #6464
- fix(ui): preserve shape stroke settings at zero width by @denstu473 in #6472
- Type: commit the edit when another layer or document becomes active (#6483) by @wanikhawar in #6509
- Canvas overlays stay visible while panning (#6592) by @wanikhawar in #6629
- Tab in Full Screen Mode shows the menu bar and panels; leaving Full Screen restores them as before (#6760) by @MarekSpodBiedry in #6830
- Actions: .atn Select Subject, Select and Mask, Color Range, clipping and layer masks, colours map to commands (part of #6745) by @Higgs32584 in #6881
- Tests: generated large-file fixtures and a P20 number (#5107) by @davidmann4 in #5109
- security: prevent script injection in fuzz workflow (SonarCloud S7630) by @dylanmtaylor in #8370
- test: non-blocking sleep in async test loop (SonarCloud rust:S7488) by @dylanmtaylor in #8373
- security: enforce HTTPS on curl downloads (SonarCloud S6506) by @dylanmtaylor in #8369
- ci: pin GitHub Actions to full commit SHA (SonarCloud S7637) by @dylanmtaylor in #8368
- refactor(atn): build the clipping-mask and three adjustment events with macros (SonarCloud duplication gate) by @zuujiscom in #8401
- Smart Filters: distinct editors, shared disclosure and stable alpha by @abc2cb in #3283
- README: the app icon above the title by @bflatastic in #8514
- security: cap uncached pattern conversion by @dylanmtaylor in #8452
- security: bound dense mask working set by @dylanmtaylor in #8450
- security: bound XCF copied layer metadata by @dylanmtaylor in #8448
- security: bound PDN layer-name copies by @dylanmtaylor in #8446
- security: bound cumulative retained RAW tile memory by @dylanmtaylor in #8445
- security: cap lossless-JPEG Huffman table builds by @dylanmtaylor in #8444
- security: apply caller limits to RAW preview decoding by @dylanmtaylor in #8443
- security: interpolate RAW gain maps per pixel, not per full row by @dylanmtaylor in #8442
- security: position RW2 bit cursor in constant time by @dylanmtaylor in #8441
- security: reject tiled Sony cRAW and cap row references by @dylanmtaylor in #8440
- security: bound TIFF structure-dump output by @dylanmtaylor in #8439
- security: admit HEIF coded image size, not just transformed by @dylanmtaylor in #8438
- security: admit deep-EXR output size and validate chunks before indexing by @dylanmtaylor in #8437
- security: budget Cryptomatte per-pixel pair capacity by @dylanmtaylor in #8436
- security: bound inverse-curve and CLUT interpolation work by @dylanmtaylor in #8435
- security: compute auto-slice coverage per band, not per cell by @dylanmtaylor in #8434
- security: check filter-effects padding length before scanning by @dylanmtaylor in #8433
- security: bound Affinity raw child-slot traversal work by @dylanmtaylor in #8432
- security: index Affinity live-corner radii by record by @dylanmtaylor in #8431
- security: index Affinity object fields for O(1) lookup by @dylanmtaylor in #8430
- security: validate corpus paths and bound symlink traversal in xtask by @dylanmtaylor in #8428
- security: count GIF frame delays with a map by @dylanmtaylor in #8427
- security: convert spelling offsets in a single pass by @dylanmtaylor in #8426
- security: stop quadratic rescans in XMP value scanning by @dylanmtaylor in #8425
- security: dedup Cryptomatte keys and cache stream lists by @dylanmtaylor in #8424
- security: deduplicate ATN action names in near-linear time by @dylanmtaylor in #8423
- security: index FITS header keywords for O(1) lookup by @dylanmtaylor in #8422
- security: index XCF parasite names for duplicate replacement by @dylanmtaylor in #8421
- security: index comp IDs in PSD layer-comp import by @dylanmtaylor in #8420
- security: bound RAW metadata array reads by @dylanmtaylor in #8409
- security: bound nested automation playback by @dylanmtaylor in #8408
- security: encode printer names in IPP requests by @dylanmtaylor in #8407
- ci(freebsd): run the photocraft-gpu tests one at a time by @zuujiscom in #8470
- Fixes #8519 quick export honours extension by @benandez in #8535
- Format the quick export test (#8535) by @aiongg in #8562
- Backlog batch: 271 reviewed contributor PRs by @aiongg in #8577
- Fix Fixed Size marquee drag positioning, building on #6026 by @bsabiston in #8309
- fix(ui): pin the document tabs' » button to the strip's right end (part of #8290) by @Korg1ch in #8315
- fix(actions): Hue/Saturation uses Photoshop's hue key H in .atn files (#8302, #8308) by @Korg1ch in #8324
- New Document: labels show the arrow, not a text cursor (#8331) by @bommerts in #8345
- Compose: effect maps that don't fit in the effect cache are built over the render rect, not rebuilt whole on every render (#8330) by @ianswope in #8372
- i18n(pt-br): translate 131 runtime labels that still showed in English by @s17sh70x2jfl031ag in #8097
- Save: a tab whose file another save writes over is detached and marked unsaved (#6597) by @VishnuByrraju in #8105
- Open/Save: refuse file names that aren't valid Unicode instead of rewriting them (#6601) by @VishnuByrraju in #8107
- Alt held during a drag is no menu-bar tap, so Enter commits Free Transform (#8113) by @Korg1ch in #8119
- Liquify: keep short strokes whole so undo removes only the last by @Silvertree2010 in #8128
- Compose: tone and hue-range lookups truncate instead of calling floor by @xsvm in #8135
- Fix tooltip text in scrub_label function by @coolvitto in #8137
- Panels: the dock can be dragged as wide as the window allows, not only 520 points (#7896) by @Korg1ch in #8141
- Quick Export: preserve floating-point EXR output (#7562) by @jonathanwxh-cell in #8142
- Compose: adjustment layers blend back and round without per-sample calls by @xsvm in #8143
- fix(psd): an edited type layer updates the Photoshop-era Txt2 objects too (#6971) by @VishnuByrraju in #8146
- fix(ui): grey out Select and Mask in the options bar without a selection (#7520) by @VishnuByrraju in #8152
- fix(ui): Browse… buttons for dialog folder and plug-in path fields (#7942, #7531) by @VishnuByrraju in #8154
- fix(info): Info panel CMYK uses the Color Picker's colour-managed conversion (#8101) by @VishnuByrraju in #8155
- fix(swatches): a CMYK swatch keeps its inks as the foreground (#7474) by @VishnuByrraju in #8158
- fix(ui): menu titles switch on hover at the very top screen edge (#7702) by @VishnuByrraju in #8159
- feat(ui): Brushes tab preview-size slider for grid cells and list rows (#7256) by @VishnuByrraju in #8162
- Layers panel: mark adjustment layers kept as imported but not rendered (#6541) by @VishnuByrraju in #8173
- fix(actions): .atn export of Image Size with resample none no longer adds a pixel resize (#7189) by @VishnuByrraju in #8182
- fix(paths): the Work Path is drawn only while selected or a path tool is active (#6551) by @VishnuByrraju in #8186
- fix(ui): a unit after a range bound in a params doc no longer resets the dialog range (part of #7598) by @VishnuByrraju in #8187
- docs(parity): Crop rows in ui-parity.md match the code and the scorecard (#6562) by @VishnuByrraju in #8188
- Preferences: the theme swatch star no longer grows the row on hover by @nikolainyegaard in #8190
- Warp: a surface drag commits exactly as previewed, now under test (#7885) by @Higgs32584 in #8201
- Preferences: list the languages alphabetically by their own name by @nikolainyegaard in #8203
- Color Lookup lists the LUTs in a Preferences folder (#6558) by @JuanAntonioRC in #8219
- UI: Control-click opens the right-click menus on macOS by @BrianMonks in #8221
- Alt + wheel zooms while Alt is held, even when the modifier state misses it (#8049) by @Higgs32584 in #8223
- Plug-ins: a reduced live preview scales the settings a manifest marks "unit": "px" (#7524) by @Higgs32584 in #8232
- Add interactive drag positioning to print preview by @FartmanAndBurps in #8236
- Clipboard: a panic while reading the clipboard is reported, not a crash (refs #7582) by @Higgs32584 in #8237
- CPU canvas: a large document shows its own pixels at 100% (#7568) by @Higgs32584 in #8238
- Keep Batch results when the action saves and then closes the document by @jonathanwxh-cell in #8242
- Pen: ⌥/Alt-drag grabs the last anchor's incoming handle too (#6077) by @adi-1108 in #8243
- Object Selection: preserve Shift/Alt from mouse-down by @Ebenezer-03 in #8244
- fix(engine): Remove Background looks for the subject in the layer, not the canvas (#8235) by @adi-1108 in #8245
- docs(architecture): drop references to the removed rust-framework-options.md by @adi-1108 in #8252
- test(codecs): cover exact TGA packet and encoder input boundaries by @adi-1108 in #8253
- test(io): cover PSD palette boundaries and bitmap row packing by @adi-1108 in #8256
- test(algo): cover deinterlace choices and NTSC signal limits by @adi-1108 in #8257
- test(algo): cover Custom convolution bounds, padding and depth semantics by @adi-1108 in #8258
- Dialogs: Preferences' title no longer sits against an inner outline (#8199) by @nathanZW in #8265
- contributors: add adi-1108 by @adi-1108 in #8269
- docs(support): Canvas Size added a white border around my photo by @reynold-hu in #8270
- test(ui): cover tool memory persistence by @ManiProjs in #8284
- Keyboard Shortcuts: the dialog switches sets through the engine too (#8286) by @davidmann4 in #8287
- fix(ui): Free Transform corners show the diagonal resize arrow on wide or tall boxes by @steinluiz in #8296
- MCP stdio: a line that is not UTF-8 gets a parse error instead of ending the session by @xsvm in #8318
- Layers: per-layer XMP metadata (layer.xmpMetadata), stored as Photoshop stores it by @ingling in #8367
- fix(atn): reject non-replace select.rect modes in .atn export (#7194) by @seotarek in #7249
- Fix: add missing Chinese translations for "Up" and "To" by @langrain in #7273
- Auto-Blend Layers: mask and blend the whole layers, past the canvas too by @Higgs32584 in #7395
- Camera Raw: choose the demosaic method when a raw opens by @Unemars in #7417
- Camera Raw: the full-resolution preview of a raw open shows the raw-stage sliders by @Unemars in #7421
- CLI convert: refuse to write over the input file unless --in-place by @wanikhawar in #7454
- Refuse strict .atn export of Apply Image with a blending mask by @Silvertree2010 in #7571
- Move tool: moving selected pixels shrinks the selection, transform controls and snapping to them (#7538) by @hectorviov in #7574
- Refuse strict .atn export of a mask/channel-targeted Free Transform by @Silvertree2010 in #7585
- fix(atn): keep a Transform Selection's interpolation; refuse what the transform descriptor can't carry by @FinnNk in #7590
- fix(atn): refuse strict export of canvas-bound selection modifies and placed pattern buckets by @FinnNk in #7591
- Refuse .atn export of crops with output size or resolution by @Silvertree2010 in #7593
- Lasso tools: the outline is solid until the selection is made (#7495) by @hectorviov in #7605
- Refuse strict ATN export of Select and Mask with brush strokes by @Silvertree2010 in #7611
- Previous / Next / First / Last Brush commands (, . ⇧, ⇧.) by @Cl4VD3 in #7614
- Fade the alpha channel or Quick Mask an edit changed (#7382) by @hectorviov in #7624
- Record one action call when playback pauses for a step dialog by @Silvertree2010 in #7637
- Map the bevel's shading through its gloss contour, not its light (#7360) by @hectorviov in #7638
- Refuse .atn export of resolution-only Image Size without keepPrintSize by @Silvertree2010 in #7656
- Preferences: Zoom Resizes Windows resizes floating document windows, and the Zoom tool shows it as Resize Windows to Fit (#204) by @KLBMinhLong in #7662
- File Info: print a slow shutter speed as the fraction a camera writes… by @ashsajal1 in #7665
- Export As: show the size the file will have (#6595) by @hectorviov in #7677
- fix(actions): refuse lossy fractional Crystallize ATN export by @PerchAnton in #7721
- Actions: a setting Photoshop's event cannot hold refuses the step by @Hamza0101 in #7759
- fix(ui): guides draw over the Puppet Warp, Perspective Warp and Vanishing Point previews (#7781) by @switch87 in #7798
- Guides: show the X or Y position beside the pointer while dragging by @hodd1444 in #7800
- Refuse strict .atn export of an in-place layer duplicate by @ksaxena149 in #7801
- Add a draggable center diagram for Radial Blur Zoom by @brianblakely in #7808
- Preferences › Raw Defaults › Resolution: a developed raw opens at it (#7789) by @Korg1ch in #7811
- PNG: correct sTER eye-order names without changing stored bytes by @danielcamposramos in #7815
- Don't paint from the sampled point when Alt is released mid-press by @Silvertree2010 in #7825
- Print: an IPv6 print server is parsed as a host, not split on its last colon by @erikerikerik in #7831
- Print: the no-listener test takes a port the OS says is free, not port 1 by @erikerikerik in #7835
- Brush: with airbrush build-up on, number keys set Flow and Shift+number sets Opacity (#7785) by @MarekSpodBiedry in #7853
- fix(touch) double tap jitter by @RaincloudTheDragon in #7871
- Save As JPEG: JPEG Options dialog (quality 0–12, Baseline / Optimized / Progressive) (FILE-215-19) by @Higgs32584 in #7883
- Slice Select: Delete deletes the selected slice, not the layer (#7862) by @Korg1ch in #7894
- Liquify: Alt-drag brush resize keeps the brush in place and no longer paints a dab (#7884) by @Korg1ch in #7919
- Create Rectangle and the other shape dialogs: right-click Width or Height to pick their unit (#7786) by @Korg1ch in #7922
- perf(liquify): parallel dab nodes and source read, P30 −13–15 %, same pixels by @xsvm in #7930
- Layers: the pointer over a thumbnail shows what ⌘-click loads, with the +/−/× badge (#7824) by @Korg1ch in #7932
- fix(transform): keep artboard paper below child previews by @chiharumurabayashi-stack in #7943
- Type: hovering a served font fetches it after a short rest, not as the pointer passes by @kuvshin888 in #7947
- Align: a lone layer in an artboard aligns to that artboard by @NaufalDzz in #7956
- Fix dropdown menus opening behind modal dialogs on macOS trackpad tap (#7113) by @beterhans in #7957
- Decode numeric character references in File Info XMP text by @Silvertree2010 in #7976
- Preferences: say Rendering Mode applies at next launch, next to it by @NaufalDzz in #7979
- fix(geom): reject extreme warp split indices without overflow by @Lucenx9 in #8010
- perf(raster): read 16- and 32-bit rows into RGBA with the colour model resolved per row by @xsvm in #8013
- Keep previous crop length when normalizing rounds to zero by @Silvertree2010 in #8021
- Keep '#' inside quoted .cube TITLE when parsing by @Silvertree2010 in #8023
- Snapping: artboard edges and centres are snap targets (#8016) by @tessillustrations-droid in #8029
- Layers panel: a group's layers indent past the group (#8017) by @tessillustrations-droid in #8030
- fix(format): make Windows native-save publication durable by @denstu473 in #8034
- Page Up/Down, Home and End scroll the canvas, as in Photoshop (#8057) by @Korg1ch in #8068
- Write DOMAIN_MIN/DOMAIN_MAX in the .cube writer by @Silvertree2010 in #8083
- Preferences › File Handling: Do not append "copy" to filename when saving a copy (#8080) by @Korg1ch in #8085
- fix(liquify): include cubic overshoot in source reads by @yongjip in #8087
- fix(type): resolve exact PostScript names in type.create by @Gabrieljr42 in #8088
- Reject '+' signs in color picker hex field by @Silvertree2010 in #8091
- Compose: Color Balance works out each channel's curve once, not per pixel by @xsvm in #8109
- Layers panel: a click on the empty space below the layers deselects them (#8100) by @Korg1ch in #8114
- Find small objects in large documents with the Object Finder by @Silvertree2010 in #6692
- macOS: Beep When Done plays the system alert sound (NSBeep) instead of a terminal bell (#6537) by @marcoarnulfo in #6726
- Puppet warp: Delete and Backspace remove the selected pin by @sarseev in #6754
- Puppet warp: Fix discrepancy between preview and the final state by @sarseev in #6786
- Intel Iris Xe on DX12: no more red blocks in brush previews and tool icons (#6790) by @Higgs32584 in #6791
- Type: paragraph direction buttons in the Paragraph panel and options … by @tareqziad1998 in #6793
- feat(ui): System Info shows the graphics card's own memory by @FinnNk in #6794
- docs(contributors): add Gotix-eg to people.toml by @Gotix-eg in #6824
- Actions: Shift-click layer select in .atn imports as range select and exports back (#6784) by @MarekSpodBiedry in #6829
- Title bar: only the primary button starts a window drag (#6729) by @MarekSpodBiedry in #6833
- Object Finder: hovering with an empty active layer shows the status-bar hint (#6549) by @MarekSpodBiedry in #6835
- fix(file): treat zero or negative width/height as unconstrained in fitImage by @rudrakshagarwal4200-ai in #6841
- Disable Convert to Smart Object for layers that are already smart objects by @Silvertree2010 in #6880
- Reorder Layer Comps through dragging and context actions (#6498) by @vbasky in #6891
- fix: detect dominant foregrounds with Object Finder by @euisuh in #6896
- GPU fallback: Retry GPU after an error rebuilds the GPU canvas now, no restart (#6577) by @00xJS in #6897
- perf(camera-raw): develop the preview off the UI thread (#5964) by @fjamesprice in #6909
- fix(engine): preserve Background layer on Merge Layers by @dangphuc2470 in #6925
- Crop tool: switching tools drops an untouched ratio-fitted frame instead of cropping by @mroxso in #6936
- Color Picker: update the colour on press, not on release (#6937) by @mroxso in #6942
- docs(xtask): point the layers help text at docs/architecture.md by @HyperionBurn in #6946
- Color panel: keep hex/RGB readout visible in short docks (#6885) by @nrq6993-a11y in #6963
- feat(i18n): add Hindi (hi) language catalog and locale resolution by @theshubh77 in #6974
- Relink to File: ask for the file (menu bar and layer context menu) by @Tungtono in #6994
- Save: ask before replacing a file that an added or lowercased extension names by @dotCooCoo in #7051
- Layer Style: keep gradient overlay colours when reopening the dialog (#7031) by @nrq6993-a11y in #7072
- test(cli): pin photocraft-cli argument parsing before the clap port (#7071) by @1Git2Clone in #7099
- Presets: the damaged-set test also covers Export As presets by @dotCooCoo in #7109
- docs: fix subject-verb agreement in downloads section by @Jazz1-6 in #7112
- fix(atn): map Apply Layer Comp steps by name (#7101) by @denstu473 in #7115
- perf(type): refresh type layers without cloning the document (#7092) by @nicolasfalesy in #7142
- i18n(pl): translate the 14 counted status messages missing from Polish by @Korg1ch in #7150
- Type: register craft fonts of every script, not only the Japanese ones by @dotCooCoo in #7152
- i18n(id): translate the 14 counted status messages missing from Indonesian by @Korg1ch in #7159
- i18n(ko): translate the 14 counted status messages missing from Korean by @Korg1ch in #7160
- i18n(zh-hans): translate the 14 counted status messages missing from Simplified Chinese by @Korg1ch in #7161
- fix(ui): right-click an Adaptive Wide Angle constraint for its orientation menu, as in Photoshop by @Korg1ch in #7167
- Open EXR Parts: the menu asks for a file and shows the parts dialog (#7169) by @RehanKhatkar in #7174
- Layer effects in Dissolve mode speckle, as in Photoshop (#6995) by @Korg1ch in #7204
- Corrective Camera Raw - fix(import/camera-raw): preserve document identity across asynchronous opens and re-develop by @ametadot in #7215
- Liquify: zoom the preview with the zoom keys, a trackpad pinch and ×1.1 wheel notches (#7210) by @Korg1ch in #7227
- fix(atn): export recorded layer.select with name parameter (#7185) by @seotarek in #7232
- Save As on Linux: the one file type offered gives the name its extension by @erikerikerik in #7240
- Layer Export As: the dialog opens with the layer's size, not the document's by @erikerikerik in #7241
- A second launch that sets only environment overrides keeps its own process by @erikerikerik in #7242
- fix(atn): reject off-center radial blur in .atn export (#7234) by @seotarek in #7258
- test(io): SVG text-transform test can't pass without a font (#4806) by @ahmed0magdy in #7260
- fix(atn): reject numeric layer references in .atn export (#7248) by @seotarek in #7262
- Auto-Blend Layers: Seamless Tones and Colors turns on gain compensation by @Higgs32584 in #7396
- i18n(cs): bring the Czech catalog up to date by @Losminek in #7511
- Marching ants in device pixels, like Photoshop's (#7489) by @wanikhawar in #7530
- fix(atn): refuse strict export of options the descriptors can't carry by @FinnNk in #7588
- i18n(tr): comprehensive review, terminology refinement, and industry-standard UI consistency overhaul by @yeniufuklar-com in #5731
- fix(format): ignore accidental ZIP directory signatures in comments by @0x6Ason in #5877
- Fix Exposure value-field steps when decimals are set (#5914) by @nrq6993-a11y in #5927
- fix(ui): ensure turning View -> Snap off disables all snapping (#5782) by @seotarek in #5936
- History panel: scroll to the current state on document change (#5909) by @nrq6993-a11y in #5940
- Type: Create warped text button in the options bar, as in Photoshop (#5911) by @Fazmin in #5951
- Raw: the Nikon D4 white level follows the sample depth (#5978) by @odgrim in https://github.com/storytold/photocraft/pull/5980
- Raw: a Nikon maker note's ColorSpace sets the preview colour space (#5987) by @odgrim in https://github.com/storytold/photocraft/pull/5988
- Text: admit the rasterizer's peak working bytes (#4979) by @saad-mughal435 in https://github.com/storytold/photocraft/pull/6001
- fix(ui): keep Clone Stamp source preview crisp when zoomed in by @vanvo in https://github.com/storytold/photocraft/pull/6042
- fix(compose): stop effect noise from painting empty blur tails by @jonathanwxh-cell in https://github.com/storytold/photocraft/pull/6112
- chore: remove unused deps and dead code by @osaidahmed in https://github.com/storytold/photocraft/pull/6136
- File Info: Photoshop field order and labels (#6125, #6126) by @mroxso in https://github.com/storytold/photocraft/pull/6150
- Title bar: a window move the window manager finished no longer blocks the next move or resize (#5725) by @giang17 in https://github.com/storytold/photocraft/pull/6158
- Free Transform: picking another tool or layer applies a background commit (#5665, #5667) by @dark13b in https://github.com/storytold/photocraft/pull/6186
- Free Transform: a rotated sprite's soft edge keeps its colour instead of a light border by @marcoarnulfo in https://github.com/storytold/photocraft/pull/6224
- Separate shortcut capture checks from native snapshot rendering by @IanHollow in https://github.com/storytold/photocraft/pull/6227
- Paths panel: rename a path in place, and name the Work Path when saving it by @marcoarnulfo in https://github.com/storytold/photocraft/pull/6252
- fix(compose): interior effects see the backdrop through a Normal layer's fill by @marcoarnulfo in https://github.com/storytold/photocraft/pull/6253
- fix(ui): Paths panel footer: cut-off hover highlight and scroll jiggle (part of #6238) by @ArchersIntel in https://github.com/storytold/photocraft/pull/6263
- Codecs: save Cineon (.cin) film frames by @marcoarnulfo in https://github.com/storytold/photocraft/pull/6265
- Type: ⌥ on a paragraph-box handle resizes the block symmetrically by @VladimirPozdnyakov in https://github.com/storytold/photocraft/pull/6269
- i18n(ru): translate the dynamic labels the Russian catalog was missing by @pavlenkosa in https://github.com/storytold/photocraft/pull/6283
- Smart Filters: Delete/Backspace removes the selected filter, not its smart object (#4751) by @marcoarnulfo in https://github.com/storytold/photocraft/pull/6295
- Guides: a guide let go over either ruler is removed, not only off the canvas (#6286) by @theoabw in https://github.com/storytold/photocraft/pull/6328
- Make brush cursors follow pen orientation and projection by @jonathanwxh-cell in https://github.com/storytold/photocraft/pull/6380
- Print: Functions › Bleed (corner crop marks on the trim line) by @cortezsilvano-bot in https://github.com/storytold/photocraft/pull/6389
- Contributors: add Marco Arnulfo by @marcoarnulfo in https://github.com/storytold/photocraft/pull/6390
- fix(raw): size bigtiff long8, slong8 and ifd8 entries as 8 bytes by @osaidahmed in https://github.com/storytold/photocraft/pull/6409
- Save for Web: Width, Height, Percent and Resample in Image Size, linked in proportion (#6388) by @marcoarnulfo in https://github.com/storytold/photocraft/pull/6415
- fix(engine): keep the rendering of smart filters that cannot be reproduced by @osaidahmed in https://github.com/storytold/photocraft/pull/6433
- fix(engine): convert the background and match mask depth where they were missed by @osaidahmed in https://github.com/storytold/photocraft/pull/6440
- Tests: every GPU test holds gpu_lock (fixes STATUS_ACCESS_VIOLATION crashes on Windows) by @LochLogic in https://github.com/storytold/photocraft/pull/6445
- Hand tool: hold Ctrl/Cmd to zoom in, Alt to zoom out (#6434) by @wanikhawar in https://github.com/storytold/photocraft/pull/6452
- Type options: drag the "T" icon to change the font size, as in Photoshop (#6437) by @marcoarnulfo in https://github.com/storytold/photocraft/pull/6453
- fix(engine): match smart object re-renders to the document's mode and depth by @osaidahmed in https://github.com/storytold/photocraft/pull/6455
- perf(quantize): Indexed Color palette build 8× faster, bit for bit the same by @nicolasfalesy in https://github.com/storytold/photocraft/pull/6456
- fix(engine): keep comps, slices and variables when converting to a smart object by @osaidahmed in https://github.com/storytold/photocraft/pull/6457
- fix(photocraft):
--control 0logs the port actually bound (#6427) by @wanikhawar in https://github.com/storytold/photocraft/pull/6468 - Ctrl+Space and Alt+Space zoom the image under an open dialog by @marcoarnulfo in https://github.com/storytold/photocraft/pull/6480
- Shapes: the Color panel, Swatches and Gradients fill the selected shape (#5568) by @jsnapoli1 in https://github.com/storytold/photocraft/pull/6484
- Layer Comps: double-clicking a comp's name renames it in place by @marcoarnulfo in https://github.com/storytold/photocraft/pull/6508
- fix(print): preserve WinAnsi characters in PDF labels by @aqibmohd271 in https://github.com/storytold/photocraft/pull/6661
- Don't pan the canvas when a dialog's title bar is dragged (#6810) by @MarekSpodBiedry in https://github.com/storytold/photocraft/pull/6826
- Hue/Saturation: hue tracks and spectrum bars use full-strength sRGB hues, one shared hue_color (#6540) by @MarekSpodBiedry in https://github.com/storytold/photocraft/pull/6837
- fix(compose): resolve Dissolve coverage across adjustment, effects, a… by @Ni-zav in https://github.com/storytold/photocraft/pull/3193
- Moving a shape keeps its rendering: Artboards to Files matches Photoshop by @fabianghe in https://github.com/storytold/photocraft/pull/3330
- Move tool: show all six Align icons and an icon menu for Distribute (#3490) by @vangel76 in https://github.com/storytold/photocraft/pull/3532
- Type: wire Recent Fonts into the font menu (#204) by @reynold-hu in https://github.com/storytold/photocraft/pull/3559
- M11: ten more acceptance tasks (21-30) in a second file for FILE-216-6 by @reynold-hu in https://github.com/storytold/photocraft/pull/3565
- Control protocol: document.pixel / document.sampleColor reply ranges (#3666) by @dottedt in https://github.com/storytold/photocraft/pull/3775
- feat(ui): nest light and dark themes into submenus by @seotarek in https://github.com/storytold/photocraft/pull/3868
- feat(layer-style): expose Bevel & Emboss highlight and shadow shading by @Ni-zav in https://github.com/storytold/photocraft/pull/3921
- feat(ui): Free Transform 3x3 reference point widget and projective homography pivot snapping by @Gotix-eg in https://github.com/storytold/photocraft/pull/3926
- SVG import: set text in an installed font when the named ones are missing by @przemyslvw in https://github.com/storytold/photocraft/pull/4219
- Codecs: open uncompressed DICOM single-frame images (#1048) by @vbasky in https://github.com/storytold/photocraft/pull/4315
- Layer Style: user contour library with New…, Load/Replace/Save Contours (#4391) by @vangel76 in https://github.com/storytold/photocraft/pull/4392
- i18n: complete the French (fr) UI translation (1,041 entries) by @Atalantis in https://github.com/storytold/photocraft/pull/4474
- Codecs: PCX runs may cross plane boundaries within a scanline by @webdevtodayjason in https://github.com/storytold/photocraft/pull/4567
- Codecs: open Amiga IFF/ILBM bitmaps read-only by @vbasky in https://github.com/storytold/photocraft/pull/4713
- Deselect layers when clicking the pasteboard with Move Auto-Select by @Ni-zav in https://github.com/storytold/photocraft/pull/4991
- fix(i18n): Italian Screen blend mode is "Scherma", not "Schermo" by @LorenzoFasolino in https://github.com/storytold/photocraft/pull/5062
- docs(perf): how to measure one scenario and read its numbers by @LorenzoFasolino in https://github.com/storytold/photocraft/pull/5064
- i18n: translate missing Simplified Chinese tool labels by @linheyang in https://github.com/storytold/photocraft/pull/5131
- Type tool: click a path to start type on it (TYPE-218-1, #218) by @zolyy in https://github.com/storytold/photocraft/pull/5180
- Brush Settings: disable Wetness/Mix controls outside Mixer Brush by @augrclk in https://github.com/storytold/photocraft/pull/5199
- Brush Pose: preserve independent Tilt X/Y overrides by @augrclk in https://github.com/storytold/photocraft/pull/5317
- Brush Settings: expose section lock names, state and focus by @augrclk in https://github.com/storytold/photocraft/pull/5365
- Credit Abdul karim mia in contributors by @abdul-karim-mia in https://github.com/storytold/photocraft/pull/5372
- fix(pen): an unclosed path stays with its document (#5373) by @vanvo in https://github.com/storytold/photocraft/pull/5412
- fix(format): serialise directory bundle saves with a bundle-wide lock by @FinnNk in https://github.com/storytold/photocraft/pull/5421
- Actions panel menu: Load Actions and the rest of the commands (#5021) by @vbasky in https://github.com/storytold/photocraft/pull/5443
- feat(tiff): a tiffCompression option for scripted TIFF saves by @FinnNk in https://github.com/storytold/photocraft/pull/5470
- Value fields: the mouse wheel steps them, as in Photoshop (#5473) by @wanikhawar in https://github.com/storytold/photocraft/pull/5529
- Keep Free Transform preview colors consistent with the canvas by @jonathanwxh-cell in https://github.com/storytold/photocraft/pull/5545
- fix(ui): keep Character and Paragraph defaults editable before typing by @alloutflo in https://github.com/storytold/photocraft/pull/5566
- Workspace: list saved workspaces in Window › Workspace and the switcher (storytold/photocraft#5610) by @nrq6993-a11y in https://github.com/storytold/photocraft/pull/5631
- Animated WebP: every frame loads into video layers (#1198) by @LloydNicholson in https://github.com/storytold/photocraft/pull/5635
- Layer Mask Display Options: set the layer mask rubylith's colour and opacity by @Trade-Mottoes in https://github.com/storytold/photocraft/pull/5644
- Affinity import: budget decoded pixels across the document by @midasmatterhorn in https://github.com/storytold/photocraft/pull/5738
- Lab: adjustment results are whole samples, as Photoshop stores them (lab8 curves passes) by @timothydaly1 in https://github.com/storytold/photocraft/pull/5771
- 32-bit Hue/Saturation as Photoshop does it: unclipped saturation and Colorize (two rgb32 oracles pass) by @timothydaly1 in https://github.com/storytold/photocraft/pull/5781
- Auto-Blend Layers: blend a layer the canvas crops to all-overlap (#5745) by @Higgs32584 in https://github.com/storytold/photocraft/pull/5816
- Shapes: rounded corners on live triangles, polygons and stars (TOOL-214-12) by @bazmarth in https://github.com/storytold/photocraft/pull/5834
- fix(codecs): respect uncompressed DDS row pitch by @0x6Ason in https://github.com/storytold/photocraft/pull/5864
- Menus: Chinese, Japanese and Korean labels get access keys, "文件(F)" (#5863) by @Higgs32584 in https://github.com/storytold/photocraft/pull/5882
- Pen options bar: Make Selection in Path mode (#5703) by @Higgs32584 in https://github.com/storytold/photocraft/pull/5888
- Add hex color input to shape Fill and Stroke popovers by @EuanTop in https://github.com/storytold/photocraft/pull/6201
- Prevent clipboard centering overflow and incorrect paste placement by @vbasky in https://github.com/storytold/photocraft/pull/4585
- Build each crate's integration tests as one binary by @aiongg in https://github.com/storytold/photocraft/pull/8644
- Use chrono instead of hand-rolled UTC conversion by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8234
New Contributors
- @robertoffmoura made their first contribution in #6318
- @andeecollard made their first contribution in #7904
- @varanus-salvator made their first contribution in #5990
- @benandez made their first contribution in #8535
- @bsabiston made their first contribution in #8309
- @VishnuByrraju made their first contribution in #8105
- @nikolainyegaard made their first contribution in #8190
- @BrianMonks made their first contribution in #8221
- @FartmanAndBurps made their first contribution in #8236
- @adi-1108 made their first contribution in #8243
- @Ebenezer-03 made their first contribution in #8244
- @nathanZW made their first contribution in #8265
- @ManiProjs made their first contribution in #8284
- @steinluiz made their first contribution in #8296
- @langrain made their first contribution in #7273
- @Cl4VD3 made their first contribution in #7614
- @ashsajal1 made their first contribution in #7665
- @ksaxena149 made their first contribution in #7801
- @brianblakely made their first contribution in #7808
- @danielcamposramos made their first contribution in #7815
- @erikerikerik made their first contribution in #7831
- @RaincloudTheDragon made their first contribution in #7871
- @chiharumurabayashi-stack made their first contribution in #7943
- @NaufalDzz made their first contribution in #7956
- @beterhans made their first contribution in #7957
- @Lucenx9 made their first contribution in #8010
- @tessillustrations-droid made their first contribution in #8029
- @yongjip made their first contribution in #8087
- @Gabrieljr42 made their first contribution in #8088
- @sarseev made their first contribution in #6754
- @tareqziad1998 made their first contribution in #6793
- @rudrakshagarwal4200-ai made their first contribution in #6841
- @euisuh made their first contribution in #6896
- @fjamesprice made their first contribution in #6909
- @dangphuc2470 made their first contribution in #6925
- @HyperionBurn made their first contribution in #6946
- @theshubh77 made their first contribution in #6974
- @Tungtono made their first contribution in #6994
- @Jazz1-6 made their first contribution in #7112
- @RehanKhatkar made their first contribution in #7174
- @ametadot made their first contribution in #7215
- @Fazmin made their first contribution in #5951
- @vanvo made their first contribution in https://github.com/storytold/photocraft/pull/6042
- @giang17 made their first contribution in https://github.com/storytold/photocraft/pull/6158
- @dark13b made their first contribution in https://github.com/storytold/photocraft/pull/6186
- @IanHollow made their first contribution in https://github.com/storytold/photocraft/pull/6227
- @ArchersIntel made their first contribution in https://github.com/storytold/photocraft/pull/6263
- @VladimirPozdnyakov made their first contribution in https://github.com/storytold/photocraft/pull/6269
- @pavlenkosa made their first contribution in https://github.com/storytold/photocraft/pull/6283
- @theoabw made their first contribution in https://github.com/storytold/photocraft/pull/6328
- @cortezsilvano-bot made their first contribution in https://github.com/storytold/photocraft/pull/6389
- @LochLogic made their first contribution in https://github.com/storytold/photocraft/pull/6445
- @jsnapoli1 made their first contribution in https://github.com/storytold/photocraft/pull/6484
- @aqibmohd271 made their first contribution in https://github.com/storytold/photocraft/pull/6661
- @Atalantis made their first contribution in https://github.com/storytold/photocraft/pull/4474
- @linheyang made their first contribution in https://github.com/storytold/photocraft/pull/5131
- @zolyy made their first contribution in https://github.com/storytold/photocraft/pull/5180
- @alloutflo made their first contribution in https://github.com/storytold/photocraft/pull/5566
- @EuanTop made their first contribution in https://github.com/storytold/photocraft/pull/6201
Full Changelog: v0.12.0...v0.13.0