What's Changed
- perf(canvas): a Properties-panel adjustment drag refreshes only the view, 4.2× faster (#6839) by @skylartaylor in #7155
- Linux: Reveal never hands xdg-open a file (#7166) by @Higgs32584 in #7168
- Stack Mode: Kurtosis and Skewness give the same bits on Windows and Linux by @dotCooCoo in #7126
- Content-Aware Fill workspace, as Photoshop's by @Unemars in #2376
- perf(stack): one loop per statistic, up to 2.2× faster, bit for bit the same by @nicolasfalesy in #7118
- Trap: refuse locked layers (#5623) by @davidmann4 in #5624
- Lens Flare: don't darken 32-bit pixels above 1.0 (#5785) by @davidmann4 in #5786
- Duotone: view and flat export clamp ink density like the Multichannel conversion (#6854) by @davidmann4 in #6855
- Custom filter: in CMYK a positive offset brightens (#7076) by @davidmann4 in #7077
- Measurement Scale: large pixel lengths print their real value (#7016) by @davidmann4 in #7017
- Clamp filter.cameraRaw exposure to its documented -5..5 range by @Silvertree2010 in #6876
- fix(engine): check the define-brush tip size multiply before reserving (wasm32) by @wwewtech in #6902
- Ignore a leading UTF-8 BOM in variable data set CSV import by @Silvertree2010 in #6485
- fix(engine): flip and rotate presets turn about the selection's bounds, as Free Transform does (#6928) by @Korg1ch in #6967
- Actions: a Paint Bucket step keeps its explicit colour through .atn (#7199) by @Korg1ch in #7208
- EXR: the ACEScg preference applies to every way of opening a file (#6782) by @davidmann4 in #6783
- Type: Paste Lorem Ipsum inserts into the type layer named by "layer" (#5659) by @davidmann4 in #5660
- Place Scale Marker: lay out the label in points, not pixels (#5754) by @davidmann4 in #5755
- Fix generator spaced size keeping size text in asset file name by @Silvertree2010 in #6628
- Stamp Visible fills an empty active pixel layer instead of adding another (#6785) by @MarekSpodBiedry in #6828
- test(type): PostScript names guessed apart from their installed family resolve exactly by @FinnNk in #5471
- GPU: a group's effect cache follows its vector mask and children's Blend If (#5706) by @davidmann4 in #5707
- Pencil: a 1 px line paints the same pixels whichever end it starts from, at any Smoothing (#6336) by @Higgs32584 in #6341
- Twirl, Pinch and Spherize fill the inscribed ellipse (#5643) by @Higgs32584 in #5871
- Reject out-of-range leading, baseline shift and scales in type styles by @Silvertree2010 in #6196
- Snapping: layer targets ignore the selection, so a moved selection snaps to guides and the document (#6290) by @davidmann4 in #6355
- Krita: uncompressed tiles are read as interleaved pixels (#7082) by @davidmann4 in #7083
- Fix GPU startup requests exceeding adapter limits by @Bortlesboat in #6050
- Paste: an image pastes with Ctrl+V whichever key is let go first (#6329) by @Higgs32584 in #6360
- fix(linux): file dialog probe sees a portal with no FileChooser backend (#5739) by @nicolasfalesy in #6422
- Reject notes.set moves that make the popup non-finite by @Silvertree2010 in #6174
- Document tab says "Quick Mask" in Quick Mask mode, as in Photoshop by @arnav-hiwarkar in #6660
- Preset Manager: renaming or deleting a brush keeps the current preset and names consistent (#5681) by @davidmann4 in #5682
- PSD: layer_tree_max_depth hoists layers under unclosed dividers past the cap (#5758) by @davidmann4 in #5759
- Swatches: the .ase reader refuses files with more than 10,000 groups by @dotCooCoo in #5811
- fix(io): exclude transparent palette entries for opaque PNG pixels by @0x6Ason in #5869
- perf(psd): 8-bit merged composite unmattes through a table, not a division per sample (#5694) by @xsvm in #6029
- Menus: rows scrolled out of view no longer open their submenus (#5896, #6225) by @davidmann4 in #6356
- Check unclamped transform dimensions against the pixel budget by @denstu473 in #6493
- Remove tool: every queued stroke is tinted in full (#6555) by @davidmann4 in #6642
- Keep Color Sampler points on their pixel after flips and turns by @Silvertree2010 in #6720
- Upload 16-bit layer masks as R16Float instead of R32Float by @Silvertree2010 in #6845
- fix(ui): distinct Elliptical Marquee and Quick Selection icons (#6875) by @Higgs32584 in #6917
- OpenRaster: layer locks no longer change silently on save (#7018) by @davidmann4 in #7019
- fix(ui): Ctrl/Cmd-drag in the Navigator zooms to the drawn rectangle, as in Photoshop (#6872) by @Korg1ch in #7140
- Menus: one checkmark column keeps every label aligned (#5705) by @davidmann4 in #5809
- fix(codecs): keep EXR color channels within one layer by @0x6Ason in #5866
- Focus font search when opening the picker by @carterwsmith in #7222
- Assign Profile and Convert to Profile: Preview, as in Photoshop; "Black Point Compensation" spelled out by @ingling in #6825
- Korean: consistent terms in the Gradient Editor, Object Selection messages and shortcut hints by @junhyun-dev in #6882
- docs: write product name as PhotoCraft in engine docs, LUT export header and image sources by @wwewtech in #5454
- Saving onto a dangling symlink writes through to its target (#6605) by @mroxso in #6649
- Document tabs: keep whole names, hide what doesn't fit, list every document in the » menu by @marcoarnulfo in #4525
- Translate the brush size and hardness shortcut rows in every language (#6742) by @MarekSpodBiedry in #6831
- i18n(uk): translate color picker titles and rasterization warnings by @PerchAnton in #6153
- Tests: fix the flaky file-lock tests and the occasional portal_save hang by @echelon in #7418
- Fix nested Free Transform preview isolation by @driftee in #7280
- Open Photoshop guides stored in a JPEG's APP13 resources (#7300) by @MarekSpodBiedry in #7348
- Centre stacked ruler digits and the Properties W/H/X/Y labels (#7314) by @MarekSpodBiedry in #7349
- Esc leaves full screen with the Crop tool showing its default frame (#7315) by @MarekSpodBiedry in #7350
- Crop and Straighten Photos keeps Duotone inks and is disabled for Indexed Color (#7354) by @davidmann4 in #7355
- Tool Presets: + saves only the current tool's options (#7356) by @davidmann4 in #7357
- Canvas Size: growing the canvas re-renders PSD fill layers (#7362) by @davidmann4 in #7363
- Rotate Canvas Arbitrary: keep the angle at full precision, so rotated crops land on the pixel (#7369) by @davidmann4 in #7370
- Image Rotation: Arbitrary keeps Color Sampler points on their pixel (#7372) by @davidmann4 in #7373
- Spot Healing Brush trail is Photoshop's dark half-opaque tint (#7342) by @wanikhawar in #7374
- Crop: Esc and Enter go to an open options bar popup first (#7386) by @davidmann4 in #7388
- Refuse strict ATN export of Close with an explicit document target by @Silvertree2010 in #7393
- Save Actions ATN files atomically so a failed write keeps the old file by @Silvertree2010 in #7403
- Raw tone curve: no NaN between a knot at black and the next one by @Unemars in #7416
- Camera Raw histogram: spikes run off the top, as in Photoshop's Camera Raw by @Unemars in #7419
- Keep fractional translation-only Free Transform on .atn import by @Silvertree2010 in #7401
- Integration batch: 19 PRs on main by @aiongg in #7405
- fix(svg): budget rasterised fallback layers across imports by @Ni-zav in #5671
- Retouch: bound every stroke command before its dense buffers (#4961, #6110) by @saad-mughal435 in #5992
- Help › Search: typed letters go to the field, not to menu mnemonics (fixes #5996) by @itsF4LCON in #6030
- Image Size: Indexed Color resamples with Nearest Neighbor only (fixes #6019) by @itsF4LCON in #6035
- Type: Korean paragraph text wraps between words, not syllables (fixes #5959) by @itsF4LCON in #6038
- Window › Arrange: tiles keep their documents, and every tile has rulers (fixes #6017) by @itsF4LCON in #6039
- Replace Color: the sample eyedropper is armed when the dialog opens (fixes #6279) by @itsF4LCON in #6335
- Smart filters: an edited filter's dialog previews again (fixes #6324) by @itsF4LCON in #6338
- Replace Color: a Result swatch whose Color Picker sets the sliders (fixes #6278) by @itsF4LCON in #6344
- File › Open: a file type filter per format (fixes #6337) by @itsF4LCON in #6346
- Type: the text caret shows on a white background (part of #6085) by @itsF4LCON in #6366
- Brush: the Dual Brush tip keeps its proportion at tiny main sizes (#4809) by @davidmann4 in #6399
- Automation: a control token authenticates in either letter case (#6425) by @switch87 in #6476
- Desktop: a control/automation flag without its value is a usage error (#6429) by @mroxso in #6499
- Engine: reject numeric overflow before document edits by @PerchAnton in #6502
- Character and Paragraph panels: size, leading, baseline shift and indents follow the Type units preference by @marcoarnulfo in #6505
- Refuse Affinity spot colours nested more than 4 levels deep by @jonathanwxh-cell in #6506
- Integration batch: 11 PRs on main by @aiongg in #7432
- Native format: refuse a .pcraft with out-of-range numbers when it is opened (#6862) by @davidmann4 in #6863
- Render Video: GIF frame delay follows timelines under 1 fps (#7045) by @davidmann4 in #7046
- Perspective Crop and Rotate Arbitrary keep the Background opaque (#7138) by @davidmann4 in #7139
- perf(camera-raw): Shadows/Highlights 1.5× faster, bit for bit the same by @nicolasfalesy in #7141
- Count tool: deleting an earlier count group keeps the active group (#5653) by @davidmann4 in #5654
- Count: reject unknown groups instead of adding markers to the wrong group by @chrisgleissner in #6003
- fix(path): validate Make Selection options and guard selection state by @Ni-zav in #6046
- Plug-ins: running a filter plug-in respects layer locks (#6770) by @davidmann4 in #6771
- Object Selection: enclosed background gaps stay unselected, only object-like holes fill (#6556) by @MarekSpodBiedry in #6834
- perf(canvas): report how long the GPU spends on a composite by @skylartaylor in #7275
- Color panel field fills its group in a custom workspace too by @aiongg in #7477
- ci: configure Dependabot for Cargo and GitHub Actions by @dylanmtaylor in #7475
- Preferences: the settings fill the resized dialog, buttons at the bottom (#7420) by @skylartaylor in #7462
- Tests: the slow-job frame loop test waits for the worker's progress message by @dotCooCoo in #7424
- Tests: the authentication deadline test writes its first line before the deadline starts by @dotCooCoo in #7428
- Font menu: hovering a font no longer grows its row and makes the list jump (#7406) by @Korg1ch in #7425
- Font field: ↑/↓ step through the fonts after a pick, as in Photoshop (#7407) by @Korg1ch in #7426
- Fix clipped ancestors in nested transform previews by @driftee in #7438
- file.saveACopy refuses the document's own file without "overwrite" (#7437) by @wanikhawar in #7456
- Replacing selected type keeps its size by @hodd1444 in #7457
- Fade: restore uniformly inverted layer masks (#7383) by @Ni-zav in #7463
- Remove: cancel queued strokes when the paint target changes (#7380) by @Ni-zav in #7464
- Fix/7381 action worker failure 20261018t2254jkt by @Ni-zav in #7465
- Make .pcraft reload f64 coordinates bit-exact by @Silvertree2010 in #7498
- perf(canvas): composite and upload an inline filter preview once (#7490) by @wanikhawar in #7501
- fix(shortcuts): plain , and ; bindings follow the typed character on AZERTY by @Byxis in #7521
- image.crop: accept whole-number float targetWidth/targetHeight (#7551) by @davidmann4 in #7552
- Filters: normalize nonpositive explicit tile sizes (#7493) by @bommerts in #7554
- Perspective Crop: draw the crop quad's side of the horizon (#7557) by @davidmann4 in #7558
- Refuse strict .atn export of plain events whose target is not the layer pixels by @Silvertree2010 in #7564
- Print: the last print's settings survive a relaunch, as in Photoshop (#7410) by @Korg1ch in #7526
- Type: right-click on committed text opens the type layer menu (#7324) by @jlange91 in #7430
- Save for Web and Quick Export: "All" keeps the photo's EXIF by @marcoarnulfo in #7471
- Curves: Cmd/Ctrl-click on the image adds a point at the pixel's tone by @marcoarnulfo in #7473
- Preferences: Enable Gestures off ignores touch-screen pinch and twist (#204) by @KLBMinhLong in #7478
- Edit: Copy with no selection keeps fill and adjustment layers (#2344) by @odgrim in #7497
- Lens Blur: an alpha channel as the depth map source, as in Photoshop (#7400) by @Korg1ch in #7508
- docs: add user docs in docs/user by @itrycodinganditsbad in #3951
- Save: keep the replaced file's metadata by @skylartaylor in #7206
- Integration batch: 12 PRs on main by @aiongg in #7569
- Smart Filters: deleting the last filter removes its filter mask (#5619) by @davidmann4 in #5620
- Image > Adjustments: locked smart objects refuse new smart filters (#5655) by @davidmann4 in #5656
- Brush smoothing: the lagging brush keeps the pressure of where it is (#5713) by @Higgs32584 in #5726
- Menu bar: zooming with Alt+scroll, then holding Space to pan, no longer opens New Document by @artman67 in #6256
- fix(engine): refuse a Content-Aware Fill with nothing to sample instead of filling black (#6532) by @Korg1ch in #6670
- Presets: refuse renaming a group to a name another group has (#6768) by @davidmann4 in #6769
- Image Size: a gradient fill's centre offset stays a fraction of the frame (#6778) by @davidmann4 in #6779
- Mesh warp: about twice as fast, same pixels (tiles encoded in parallel, direct in-bounds reads) (#1015) by @ianswope in #6800
- Transform: drop a fill layer's cached render when its frame changes (#6808) by @davidmann4 in #6809
- Artboards to Files: paths, notes, slices and marks move with the board (#7010) by @davidmann4 in #7011
- Video: Interpret Footage and New Video Layer from File reject an invalid frame rate (#5657) by @davidmann4 in #5658
- PNG: keep a stereo file's sTER pairing on save (#6063) by @mroxso in #6285
- fix(actions): flush pending recorded steps on save (#7193) by @seotarek in #7244
- Show File Name In Title: hide the file name from the title bar (#5037) by @mroxso in #5129
- Actions: Photoshop Shadows/Highlights steps play (#5830) by @Higgs32584 in #5854
- Free Transform: show a flip as -100 % on the flipped axis (#7749) by @davidmann4 in #7750
- Type: formatting commands respect Lock All (#7718) by @davidmann4 in #7720
- Docs: install the CLI and register it with MCP clients by @KnottyDyes in #7663
- refactor: use photocraft-color's srgb transfer functions in algo and proof simulation by @osaidahmed in #7604
- Layers: ⌘-click on the Background thumbnail is a plain click, as in Photoshop by @Unemars in #7165
- Minimum / Maximum: CMYK spreads paper white with Maximum, ink with Minimum (#7074) by @davidmann4 in #7075
- Export and import saved tool presets (#6560) by @vbasky in #6889
- Fix live gradient fill scale limits to match OG program by @nanopink in #6797
- Histogram: count the document's pixels, not a blurred thumbnail (#6538) by @davidmann4 in #6724
- Affinity: bound compound geometry expansion and reject cycles by @PerchAnton in #6486
- Color Settings: the working-space menus list the installed profiles of their space (#6323) by @Higgs32584 in #6359
- Scripts: Flatten All Layer Effects bakes with the document's Global Light and patterns (#5719) by @davidmann4 in #5720
- Gradient Overlay: repaint the whole layer when a stroke moves its frame (#4053) by @davidmann4 in #5340
- Add Liquify's Show Backdrop Use and Mode (#7609) by @hectorviov in #7644
- Actions: Smart Blur quality uses Photoshop's SBQL/SBQM/SBQH codes (#6312) by @davidmann4 in #6313
- Color Lookup: warn when it opens without its usable table (part of #1763) by @ahmedhosnypro in #6322
- Crop: a preset picked in Tool Presets fits the frame to its ratio (#7143) by @davidmann4 in #7144
- Actions: a function key can take Shift and Command (#7646) by @hectorviov in #7674
- perf(photomerge): build multi-band bands in bounded batches (#7758) by @wanikhawar in #7763
- Guides: colours follow Crop, Canvas Size and rotations (#7724) by @davidmann4 in #7725
- Keep arbitrary canvas rotation interpolation in ATN export by @Silvertree2010 in #7630
- Type: a click inside the paragraph box off the glyphs moves the caret by @zrsix1 in #7606
- Presets: Migrate Presets reads tool presets like the launch loader (#7375) by @davidmann4 in #7376
- fix(linux): keep crash-recovery autosaves in $XDG_STATE_HOME, out of the config folder (#6612) by @Korg1ch in #6941
- Hide the Hyphenate checkbox until layout hyphenates (#6710) by @vbasky in #6869
- Disable Save for Web while a Free Transform is pending (#6737) by @MarekSpodBiedry in #6832
- Layer Mask Properties: the Feather slider has fine steps near 0 px, as in Photoshop (#6545) by @marcoarnulfo in #6727
- GPU canvas: redraw mip levels of 128 px or less whole; fixes AMD Vulkan corruption after partial updates (#6418) by @00xJS in #6438
- Free Transform: W and H take a typed length in percent view (#6284) by @davidmann4 in #6293
- fix(engine): keep layer-based slices when duplicating a document by @osaidahmed in #6133
- refactor(engine): drop the second damage pass after single-edit duplicates and pastes by @FinnNk in #5880
- Tools: Sample All Layers is each tool's own, as in Photoshop (#5524) by @wanikhawar in #5570
- Actions: Apply Layer Comp is recorded by the comp's name, so it plays in any document (#7181) by @Korg1ch in #7790
- Reject exporting a partial Play Action call to .atn by @Silvertree2010 in #7602
- refactor(algo): route the splitmix64 copies through one function by @osaidahmed in #7603
- Explain the Memory Usage budget and GPU caps (#6546) by @vbasky in #6892
- Actions: export Box Blur, Surface Blur, Flatten Image and Black & White under ids Photoshop runs (#6330) by @davidmann4 in #6331
- Home screen: fit the card and stack the buttons in a narrow window by @TaylorBurke in #5774
- perf(codecs): Avoid redundant PNG filter passes by @reneleonhardt in #7690
- Crop: a ui.pointer click on the frame leaves it alone (#7740) by @davidmann4 in #7741
- Apply background jobs to the layers they started on by @Silvertree2010 in #7620
- Print: Save as PDF gets a Browse… button (#5328) by @Higgs32584 in #7586
- Reveal All: one History step named "Reveal All" (#7145) by @davidmann4 in #7147
- Crop: Enter during a drag ends the drag (#7055) by @davidmann4 in #7056
- fix(psd): make packbits::decode_into crate-private and overflow-safe by @FinnNk in #6950
- Content-Aware Fill: preview at full resolution so it matches the result (#6530) by @MarekSpodBiedry in #6838
- Actions: loading a set renames each Play target once (#6806) by @davidmann4 in #6807
- Preferences: a wrongly typed value resets only that field (#6611) by @davidmann4 in #6641
- Guides: Ctrl/Cmd drags a guide with every tool that moves guides, and the cursor shows it (#6288) by @davidmann4 in #6294
- PSD save: check the Background's opacity without copying the canvas by @persi-man in #5998
- Flatpak on Wayland: say why a paste finds nothing, and how to paste anyway (#5031) by @nicolasfalesy in #5279
- fix(engine): apply document-wide image and colour conversions to stored video frames (#4956) by @MarekSpodBiedry in #5078
- Crop: a turned crop rotates only what the frame keeps (#5006) by @davidmann4 in #5007
- Toolbar: Edit Toolbar, Quick Mask and Screen Mode in every theme by @marcoarnulfo in #4680
- Layered TIFF: Photoshop opened only the composite of a many-layer file (PSB-style layer data) by @llduyll10 in #5514
- docs: regenerate the scorecard after today's landings by @echelon in #7829
- Integration batch: 8 PRs on main by @aiongg in #7823
- Limit blend-mode hover refreshes to the visible canvas region by @jonathanwxh-cell in #5413
- perf: chisel bevel size changes, CPU passes on threads and GPU fields share their sharp edges (results unchanged) by @xsvm in #5477
- PSD: keep guide resources 1092/1097 only while they match the guides (#5966) by @bramheerink in #5976
- Brushes: importing an .abr file numbers repeated brush names in linear time by @dotCooCoo in #5984
- fix(perf): validate regression minimum threshold by @ersoynarin-code in #6193
- perf(io): Interleave PSD pixels in the final buffer by @reneleonhardt in #7691
- perf(raster): Avoid redundant default pixel work by @reneleonhardt in #7692
- perf(text): rasterize a type layer's pixels on all cores, bit for bit the same by @ebosido444-ai in #7022
New Contributors
- @Silvertree2010 made their first contribution in #6876
- @Bortlesboat made their first contribution in #6050
- @arnav-hiwarkar made their first contribution in #6660
- @denstu473 made their first contribution in #6493
- @ingling made their first contribution in #6825
- @junhyun-dev made their first contribution in #6882
- @driftee made their first contribution in #7280
- @aiongg made their first contribution in #7405
- @saad-mughal435 made their first contribution in #5992
- @chrisgleissner made their first contribution in #6003
- @hodd1444 made their first contribution in #7457
- @Byxis made their first contribution in #7521
- @jlange91 made their first contribution in #7430
- @KLBMinhLong made their first contribution in #7478
- @odgrim made their first contribution in #7497
- @artman67 made their first contribution in #6256
- @osaidahmed made their first contribution in #7604
- @nanopink made their first contribution in #6797
- @hectorviov made their first contribution in #7644
- @zrsix1 made their first contribution in #7606
- @TaylorBurke made their first contribution in #5774
- @bramheerink made their first contribution in #5976
- @ersoynarin-code made their first contribution in #6193
- @ebosido444-ai made their first contribution in #7022
Full Changelog: v0.10.0...v0.11.1