PhotoCraft v0.17.0
- Package: never overwrite one link's copy with another, list a missing link once by @softwaregames1 in https://github.com/storytold/photocraft/pull/9185
- Fix CPU pixel grid stroke width on HiDPI displays by @ssh-den in https://github.com/storytold/photocraft/pull/9199
- Image Rotation › Arbitrary turns unlinked layer masks (#9201) by @davidmann4 in https://github.com/storytold/photocraft/pull/9203
- fix(cms): ignore tags inside .look XML comments (#9109) by @DuBearte in https://github.com/storytold/photocraft/pull/9210
- fix(cms): headerless .3dl tables read on at least the 12-bit scale (#9121) by @DuBearte in https://github.com/storytold/photocraft/pull/9215
- fix(engine): turn a shape's gradient stroke with the canvas (#9239) by @davidmann4 in https://github.com/storytold/photocraft/pull/9240
- fix(ui): Hue/Saturation's spectrum bars stretch with the panel (#9242) by @DuBearte in https://github.com/storytold/photocraft/pull/9250
- fix(ui): a swatch click recolours selected type and shapes with any tool (#9238) by @hectorviov in https://github.com/storytold/photocraft/pull/9253
- feat: New Document can start as an artboard (#9086) by @DuBearte in https://github.com/storytold/photocraft/pull/9258
- Crop: in Full Screen Mode Match Canvas is the black pasteboard (#9294) by @davidmann4 in https://github.com/storytold/photocraft/pull/9295
- Crop and Straighten Photos processes only the selection (#9297) by @davidmann4 in https://github.com/storytold/photocraft/pull/9298
- fix(algo): Dehaze leaves no bright halo beside dark objects (#9273) by @DuBearte in https://github.com/storytold/photocraft/pull/9316
- fix(engine): defined and imported patterns survive a restart (#9317) by @hectorviov in https://github.com/storytold/photocraft/pull/9318
- Paste: centre pixels copied from another document (#8945) by @DuBearte in https://github.com/storytold/photocraft/pull/9353
- feat(ui): Browse… for the folders of Image Processor and Batch (#9357) by @hectorviov in https://github.com/storytold/photocraft/pull/9360
- Tests: the smart filter stack-cache test runs in its own binary (#9376) by @davidmann4 in https://github.com/storytold/photocraft/pull/9377
- Reveal All: ignore erased, fully transparent pixels (#9379) by @davidmann4 in https://github.com/storytold/photocraft/pull/9380
- SVG: text reads each font file once instead of once per glyph (#9406) by @davidmann4 in https://github.com/storytold/photocraft/pull/9407
- Export Data Sets as Files keeps outputs in the chosen folder (#9420) by @davidmann4 in https://github.com/storytold/photocraft/pull/9422
- Plug-ins: refuse a manifest that declares a parameter twice (#9441) by @davidmann4 in https://github.com/storytold/photocraft/pull/9442
- Engine: assets_dir's doc comment back on assets_dir (#9390) by @davidmann4 in https://github.com/storytold/photocraft/pull/9391
- fix(atn): preserve unsupported event kinds by @justinjohn0306 in https://github.com/storytold/photocraft/pull/8509
- Kept composites follow the text gamma and free their memory; GPU timing survives an OOM retry (#8520, #8521) by @davidmann4 in https://github.com/storytold/photocraft/pull/8522
- Fix layout benchmark setup for preserved Smart Objects by @bommerts in https://github.com/storytold/photocraft/pull/8664
- Regression tests for eight fixes merged without one by @skylartaylor in https://github.com/storytold/photocraft/pull/8690
- Refuse .pcraft manifests with too many JSON values before parsing by @Silvertree2010 in https://github.com/storytold/photocraft/pull/8893
- ora: test that Soft Light exports as svg:soft-light by @switch87 in https://github.com/storytold/photocraft/pull/9028
- Filter Gallery: ⌘+ / ⌘− / ⌘0 / ⌘1 zoom the preview, stepping like Liquify's by @andeecollard in https://github.com/storytold/photocraft/pull/9107
- Channels panel: drag alpha channels to reorder them (#9163) by @hectorviov in https://github.com/storytold/photocraft/pull/9168
- fix(ui): Save for Web reopens on the preview tab chosen last (#9174) by @hectorviov in https://github.com/storytold/photocraft/pull/9178
- Codecs: save Amiga IFF (.iff) as 24-bit ILBM by @dotCooCoo in https://github.com/storytold/photocraft/pull/9080
- fix(cms): read UTF-16 LUT files by their byte-order mark by @bercedev in https://github.com/storytold/photocraft/pull/9129
- fix(ui): Properties Transform shows a shape's path, not its stroke by @hectorviov in https://github.com/storytold/photocraft/pull/9181
- contributors: credit VoiceLessQ by display name by @VoiceLessQ in https://github.com/storytold/photocraft/pull/9264
- Contributors: add my name (erenova) by @erenova in https://github.com/storytold/photocraft/pull/9369
- ci(deps): bump the actions group across 1 directory with 3 updates by @dependabot[bot] in https://github.com/storytold/photocraft/pull/8979
- Security: pin and verify the Windows signing client (#2936) by @Erica4fr in https://github.com/storytold/photocraft/pull/3938
- Migrate PhotoCraft to egui 0.37 by @skylartaylor in https://github.com/storytold/photocraft/pull/9363
- feat(updates): add startup self-update prompt modal by @dylanmtaylor in https://github.com/storytold/photocraft/pull/9322
- build: pin craft-update to craft-libs main (495e597) by @dylanmtaylor in https://github.com/storytold/photocraft/pull/9548
- chore(deps): refresh safe dependency bumps by @skylartaylor in https://github.com/storytold/photocraft/pull/9558
- chore: resolve SonarCloud maintainability issues by @dylanmtaylor in https://github.com/storytold/photocraft/pull/9044
- Integration batch 8: 37 reviewed community PRs on main by @davidmann4 in https://github.com/storytold/photocraft/pull/9386
- Crop tool: right-click on a pending crop opens its menu: presets, overlays, Cancel and Crop (#6561) by @marcoarnulfo in https://github.com/storytold/photocraft/pull/6620
- codecs: read and write TIFF extra samples (spot and alpha channels) by @jasallen in https://github.com/storytold/photocraft/pull/7415
- perf(photomerge): track multiband timing and peak memory by @ersoynarin-code in https://github.com/storytold/photocraft/pull/7873
- PSD: type on a path opens on its path and saves back into the file's Txt2 (#7962) by @Higgs32584 in https://github.com/storytold/photocraft/pull/8175
- Raw: open lossy DNGs (floating-point JPEG XL raw data), and fall back to the JPEG XL preview, not the tiny thumbnail (fixes #8125) by @SBaksa in https://github.com/storytold/photocraft/pull/8402
- Menu bar: Space no longer opens File › New after Alt+zoom, finishing #6256's fix (#7688) by @artman67 in https://github.com/storytold/photocraft/pull/8679
- fix(io): DDS export writes the document's alpha channel by @FinnNk in https://github.com/storytold/photocraft/pull/8776
- Fix stacked brush-tip artifacts in hard-round presets by @wanikhawar in https://github.com/storytold/photocraft/pull/8846
- PSD: recognise Photoshop's
MTrnmerged-transparency marker by @jasallen in https://github.com/storytold/photocraft/pull/8877 - PSD: spot channels in Photoshop's polarity; PSDs from earlier PhotoCraft versions keep their ink by @jasallen in https://github.com/storytold/photocraft/pull/8885
- fix(#9098): preserve PSD byte order in layered TIFF text descriptors by @ronibalthazar in https://github.com/storytold/photocraft/pull/9128
- Rebuild the Histogram panel by @mathildalabs in https://github.com/storytold/photocraft/pull/9139
- Layered TIFF: write Photoshop's global layer mask block (#9095) by @hectorviov in https://github.com/storytold/photocraft/pull/9148
- fix(cms): Resolve .cube files with a 1D shaper and a 3D table load (#9177) by @hectorviov in https://github.com/storytold/photocraft/pull/9183
- fix(ui): the font menu opens on the current family's recent row (#9160) by @hectorviov in https://github.com/storytold/photocraft/pull/9197
- fix(ui): Bevel & Emboss Highlight and Shadow Mode are separate dropdowns (#9368) by @hectorviov in https://github.com/storytold/photocraft/pull/9370
- raw: a non-finite black level no longer panics the AHD demosaic by @vangel76 in https://github.com/storytold/photocraft/pull/9446
- raw: grouped 10/12/14-bit unpack, single-strip buffer kept, in-place undelta by @vangel76 in https://github.com/storytold/photocraft/pull/9449
- raw: block-wise final encode stage for the default rendering by @vangel76 in https://github.com/storytold/photocraft/pull/9452
- raw: develop_half, a fused half-size preview develop (part of #9433) by @vangel76 in https://github.com/storytold/photocraft/pull/9454
- Add optional local models for subject matting and object selection by @mighty-programmer in https://github.com/storytold/photocraft/pull/1199
- Art History Brush in the Y-group flyout by @mvanhorn in https://github.com/storytold/photocraft/pull/1610
- Add intermediate UI scale presets between 100% and 125% by @WebWork-rrs in https://github.com/storytold/photocraft/pull/3316
- History panel: New Snapshot dialog and the first snapshot (#2966) by @itsF4LCON in https://github.com/storytold/photocraft/pull/3567
- Mixer Brush: render mixed paint during the stroke and commit the live result by @durtyrobbin in https://github.com/storytold/photocraft/pull/3627
- Integrations: wire Allow Agent Control and Control Port (#204) by @Erica4fr in https://github.com/storytold/photocraft/pull/4097
- Interface: Animation Effects follows the system setting, or is on or off by @JeremyYao in https://github.com/storytold/photocraft/pull/4573
- Camera Raw: Calibration panel, Auto, raw sidecars and live Camera Raw Defaults (FILE-215-11) by @FabioLissi in https://github.com/storytold/photocraft/pull/5128
- perf(algo): Content-Aware Scale 2x faster, within its P28 budget (#211) by @SckraT in https://github.com/storytold/photocraft/pull/5236
- Blend mode keys: Shift+Alt+letter picks a mode, as in Photoshop by @paulou-jpg in https://github.com/storytold/photocraft/pull/5478
- Mode dropdowns for Clone Stamp, Pattern Stamp, History Brush, Healing and Paint Bucket by @paulou-jpg in https://github.com/storytold/photocraft/pull/5504
- fix(zoom): Restore smooth wheel zoom by @sn-o-w in https://github.com/storytold/photocraft/pull/5547
- perf(camera-raw): develop the preview's per-pixel stages on the GPU (#6916) by @fjamesprice in https://github.com/storytold/photocraft/pull/6923
- feature: gradient paint to the shape tools, any shape can have a gradient stroke. by @deniskhud in https://github.com/storytold/photocraft/pull/7203
- Brush: large tips rasterize, accumulate and composite in parallel by @Unemars in https://github.com/storytold/photocraft/pull/7218
- Crop: Content-Aware Fill keeps the pixels a non-deleting crop hid (#8060) by @Higgs32584 in https://github.com/storytold/photocraft/pull/8179
- fix(xtask): derive scorecard corpus counts from pinned manifests by @Lucenx9 in https://github.com/storytold/photocraft/pull/8658
- io: TIFF alpha and spot channels, with PSD output unchanged by @jasallen in https://github.com/storytold/photocraft/pull/8878
- fix(ui): Type options bar alignment follows the target paragraph by @hectorviov in https://github.com/storytold/photocraft/pull/9179
- Panels: move onto craft-ui's shared docking by @aiongg in https://github.com/storytold/photocraft/pull/9366
- Panels: review follow-ups to the shared docking and egui 0.37 merges by @aiongg in https://github.com/storytold/photocraft/pull/9575
- lint: clear new-code S8855/S8856/S8862/S1612/S7688/S7679 findings by @dylanmtaylor in https://github.com/storytold/photocraft/pull/9576
- Panels: remove the old dock's drawing code by @aiongg in https://github.com/storytold/photocraft/pull/9583
- Preserve locale-aware CJK fonts and migration regressions after #9363 by @skylartaylor in https://github.com/storytold/photocraft/pull/9518
- refactor: lower cognitive complexity in styles apply, affinity text read and warp identity by @dylanmtaylor in https://github.com/storytold/photocraft/pull/9577
- ci: require nextest 0.9.150 by @skylartaylor in https://github.com/storytold/photocraft/pull/9749
- refactor: shared module layout (craft-contrib#20) by @aiongg in https://github.com/storytold/photocraft/pull/9758
- perf(selection): window marquee and lasso feather masks by @wanikhawar in https://github.com/storytold/photocraft/pull/9794
- Expand, Contract and Border: crop to the selection, up to 40× faster on small selections by @wanikhawar in https://github.com/storytold/photocraft/pull/9697
- refactor(selection): take the feather reach from the blur by @aiongg in https://github.com/storytold/photocraft/pull/9802
- fix(ui): dropdown menus grow back after a search with no matches by @aiongg in https://github.com/storytold/photocraft/pull/9849
- perf(save): faster .pcraft and PSD saves, byte-identical output by @Silvertree2010 in https://github.com/storytold/photocraft/pull/9877
- Integration batch: 22 PRs on main by @aiongg in https://github.com/storytold/photocraft/pull/9880
- Crop: X with a ratio preset turns the frame instead of shrinking it (#7057) by @davidmann4 in https://github.com/storytold/photocraft/pull/7058
- Tests: the effect-map deadlock watchdog waits 120 s for each render, not for all 101 by @dotCooCoo in https://github.com/storytold/photocraft/pull/9340
- Actions: save and read the Lab Lightness channel as Lght (#9384) by @davidmann4 in https://github.com/storytold/photocraft/pull/9385
- Preferences: the Generator checkbox reads Enable Generator, as in the reference application (#9392) by @davidmann4 in https://github.com/storytold/photocraft/pull/9393
- Color panel: the Color Wheel fits the panel at its default height (#9394) by @davidmann4 in https://github.com/storytold/photocraft/pull/9395
- SVG: an embedded data-URL SVG gets the nesting-depth check (#9397) by @davidmann4 in https://github.com/storytold/photocraft/pull/9398
- XML: deeply nested ORA, KRA, Camera Raw XMP, .kys and layer XMP are an error, not a crash (#9419) by @davidmann4 in https://github.com/storytold/photocraft/pull/9421
- Automation: refuse every Windows device name in request paths (#9424) by @davidmann4 in https://github.com/storytold/photocraft/pull/9425
- Automation: refuse to replace a non-image file in the write root (#9439) by @davidmann4 in https://github.com/storytold/photocraft/pull/9445
- Plug-ins: refuse a code section with no functions but many bytes instead of panicking (#9679) by @davidmann4 in https://github.com/storytold/photocraft/pull/9680
- CMYK: the test reference keeps a fully covered type pixel's ink exact (#9688) by @davidmann4 in https://github.com/storytold/photocraft/pull/9689
- History: History Options with Allow Non-Linear History and undoable visibility changes (#2966) by @davidmann4 in https://github.com/storytold/photocraft/pull/3535
- PSD save: choose PSB by the encoded size, not the raw estimate (#5285) by @davidmann4 in https://github.com/storytold/photocraft/pull/5287
- Channels: CMYK channels duplicate, load, split and merge as tone, not ink (#5787) by @davidmann4 in https://github.com/storytold/photocraft/pull/5789
- Compose: Transparency Shapes Layer off blends a layer's alpha as Fill in the special eight (#5692) by @davidmann4 in https://github.com/storytold/photocraft/pull/5837
- PSD: Frame layers keep their stroke (#4381) by @davidmann4 in https://github.com/storytold/photocraft/pull/5890
- PSD: Diffuse, Trace Contour, Crystallize and Pointillize smart filters open and save like Photoshop (#6302) by @davidmann4 in https://github.com/storytold/photocraft/pull/6303
- Paths: making a selection from a path deselects the path (#6079) by @davidmann4 in https://github.com/storytold/photocraft/pull/6353
- Color Lookup: PSD save keeps a .3dl/.look LUT file as loaded (#6544) by @davidmann4 in https://github.com/storytold/photocraft/pull/6723
- Paste: a drawing copied as SVG markup pastes its pixels by @dotCooCoo in https://github.com/storytold/photocraft/pull/7154
- Autosave: replace a recovery sidecar in one step, so a listing never misses or doubles it (#9034) by @davidmann4 in https://github.com/storytold/photocraft/pull/9036
- Integration batch: 21 PRs on main by @davidmann4 in https://github.com/storytold/photocraft/pull/9775
- feat(type): add editable font size, leading and tracking preset menus by @Ni-zav in https://github.com/storytold/photocraft/pull/3558
- fix(app): add missing supported file formats to Save As file picker (#3400) by @buivanvu94 in https://github.com/storytold/photocraft/pull/3609
- Layers: New Group dialog and modifiers; new layers go into an open group and join its clip group by @SckraT in https://github.com/storytold/photocraft/pull/4329
- feat(transform): show distort and skew cursor indicators when holding Ctrl/Cmd by @catursurapam in https://github.com/storytold/photocraft/pull/5405
- Font menu: favourites, recent fonts, class and similar-font filters, live preview by @D-monized in https://github.com/storytold/photocraft/pull/6526
- PSD/PSB open without reading the whole file: channel data read as decoded, in bands into tiles (#5106) by @ptrinh in https://github.com/storytold/photocraft/pull/6583
- perf(compression): Use zlib-rs with runtime detection by @reneleonhardt in https://github.com/storytold/photocraft/pull/7689
- fix(codecs): check header dimensions against the file size before allocating by @FinnNk in https://github.com/storytold/photocraft/pull/8704
- fix(ui): Remove Tool trail tints all a stroke removes; brush trails follow hardness (#8916) by @hnoerenberg in https://github.com/storytold/photocraft/pull/8923
- fix(io): preserve Halftone Pattern smart filters in PSD/PSB by @denstu473 in https://github.com/storytold/photocraft/pull/9031
- perf(gpu): NVIDIA's own memory on Linux, so many-layer documents stay off the CPU budget penalty (#5973) by @VishnuByrraju in https://github.com/storytold/photocraft/pull/9042
- Batch: folder sources take every format PhotoCraft opens by @dotCooCoo in https://github.com/storytold/photocraft/pull/9097
- Color panel: the cube modes warn when a colour can't print (#8672) by @hectorviov in https://github.com/storytold/photocraft/pull/9154
- feat: Artboard from Layers takes a size of your own (#9087) by @DuBearte in https://github.com/storytold/photocraft/pull/9262
- feat: type on a path follows its path when the path is edited (#9114) by @DuBearte in https://github.com/storytold/photocraft/pull/9321
- fix(ui): Select and Mask starts from its defaults unless Remember Settings is on (#9423) by @hectorviov in https://github.com/storytold/photocraft/pull/9444
- raw: AHD demosaic with reused planar scratch, about 1.6x fewer instructions by @vangel76 in https://github.com/storytold/photocraft/pull/9450
- raw: develop the default rendering band by band, without the f32 RGB frame by @vangel76 in https://github.com/storytold/photocraft/pull/9455
- fix(ui): Camera Raw's Color Mixer Hue tracks show the neighbouring hues by @hectorviov in https://github.com/storytold/photocraft/pull/9601
- Free Transform: show the live W/H readout in the ruler unit (#9400) by @NaufalDzz in https://github.com/storytold/photocraft/pull/9678
- paint.stroke: fill: true fills the enclosed region (#3659) by @dottedt in https://github.com/storytold/photocraft/pull/3779
- Windows installation policy: PhotoCraft by @Jeremy8776 in https://github.com/storytold/photocraft/pull/9756
- Perf: cliff rows for the CPU compositor, Advanced Blending, adjustment toggles, over-budget and huge documents (#7494) by @brennanMKE in https://github.com/storytold/photocraft/pull/9565
- Enforce Rust coding standards via Clippy by @dylanmtaylor in https://github.com/storytold/photocraft/pull/9770
- Render path: one place records why a view left the GPU (#9328) by @brennanMKE in https://github.com/storytold/photocraft/pull/9566
- xtask perf: a baseline knows how trustworthy it is (#7494) by @brennanMKE in https://github.com/storytold/photocraft/pull/9564
- refactor: split oversized filter, adjustment, crop and effect builders by @osaidahmed in https://github.com/storytold/photocraft/pull/6463
- @softwaregames1 made their first contribution in https://github.com/storytold/photocraft/pull/9185
- @ssh-den made their first contribution in https://github.com/storytold/photocraft/pull/9199
- @DuBearte made their first contribution in https://github.com/storytold/photocraft/pull/9210
- @bercedev made their first contribution in https://github.com/storytold/photocraft/pull/9129
- @VoiceLessQ made their first contribution in https://github.com/storytold/photocraft/pull/9264
- @erenova made their first contribution in https://github.com/storytold/photocraft/pull/9369
- @dependabot[bot] made their first contribution in https://github.com/storytold/photocraft/pull/8979
- @jasallen made their first contribution in https://github.com/storytold/photocraft/pull/7415
- @mathildalabs made their first contribution in https://github.com/storytold/photocraft/pull/9139
- @mighty-programmer made their first contribution in https://github.com/storytold/photocraft/pull/1199
- @WebWork-rrs made their first contribution in https://github.com/storytold/photocraft/pull/3316
- @durtyrobbin made their first contribution in https://github.com/storytold/photocraft/pull/3627
- @JeremyYao made their first contribution in https://github.com/storytold/photocraft/pull/4573
- @sn-o-w made their first contribution in https://github.com/storytold/photocraft/pull/5547
- @deniskhud made their first contribution in https://github.com/storytold/photocraft/pull/7203
- @catursurapam made their first contribution in https://github.com/storytold/photocraft/pull/5405
- @D-monized made their first contribution in https://github.com/storytold/photocraft/pull/6526
- @ptrinh made their first contribution in https://github.com/storytold/photocraft/pull/6583
- @hnoerenberg made their first contribution in https://github.com/storytold/photocraft/pull/8923
Full Changelog: https://github.com/storytold/photocraft/compare/v0.16.0...v0.17.0
PhotoCraft v0.16.0
- Reuse filled-shape effect maps while moving styled groups by @kotulsky in https://github.com/storytold/photocraft/pull/8993
- fix(ui-egui): a click on the bottom layer's Smart Filters selects them again (#8764) by @drunkeninja42 in https://github.com/storytold/photocraft/pull/8974
- security(paint): cap spaced steps and procedural primitives by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8957
- i18n(zh-hans): translate status messages and preview labels by @IgnatAi401 in https://github.com/storytold/photocraft/pull/8872
- perf(liquify): reuse interpolation taps and bound render buffers by @yongjip in https://github.com/storytold/photocraft/pull/8855
- perf(mcp): move command list rows instead of cloning by @yongjip in https://github.com/storytold/photocraft/pull/8844
- Codecs: warn when DPX or Cineon saves drop bits by @przemyslvw in https://github.com/storytold/photocraft/pull/8793
- fix(type): type.edit with new text keeps the styles of unchanged text by @FinnNk in https://github.com/storytold/photocraft/pull/8766
- perf(text): rasterise each text colour only over its own glyphs by @FinnNk in https://github.com/storytold/photocraft/pull/8716
- fix(engine): refuse partial Color Balance and Hue/Saturation ATN exports by @FinnNk in https://github.com/storytold/photocraft/pull/8701
- fix(geom): reject non-finite affine inverses by @Lucenx9 in https://github.com/storytold/photocraft/pull/8651
- Crop default mode: moving the image under the box snaps (#8580) by @wanikhawar in https://github.com/storytold/photocraft/pull/8622
- fix(engine): select files correctly in Windows Explorer by @ZFzuofeng in https://github.com/storytold/photocraft/pull/8518
- Fix EngineData format_real emitting a bare trailing dot by @Silvertree2010 in https://github.com/storytold/photocraft/pull/8486
- fix(app): no unused screen picker code on FreeBSD by @zuujiscom in https://github.com/storytold/photocraft/pull/8469
- fix(ui): restore extras when showing the grid by @skylartaylor in https://github.com/storytold/photocraft/pull/8962
- fix(text): lay out a variable font's named instance from its PostScri… by @jturnbach in https://github.com/storytold/photocraft/pull/8909
- Fix XCF import with short linked-layer property lengths by @wanikhawar in https://github.com/storytold/photocraft/pull/8865
- Soft Light: dark backdrops follow Photoshop's W3C curve (#8804) by @switch87 in https://github.com/storytold/photocraft/pull/8817
- fix(actions): a recorded Layers-panel drag keeps its drop target by name by @FinnNk in https://github.com/storytold/photocraft/pull/8781
- fix(gpu): rebuild the GPU canvas after an out-of-memory error by @FinnNk in https://github.com/storytold/photocraft/pull/8774
- Layers: show effect row names through tl! by @hai5656a in https://github.com/storytold/photocraft/pull/8754
- Black & White: keep 32-bit superwhites (#8537) by @HEOJUNFO in https://github.com/storytold/photocraft/pull/8748
- feat(guides): New Guide Layout takes lengths with units by @FinnNk in https://github.com/storytold/photocraft/pull/8719
- Write the Levels and Curves composite channel as Chnl.Cmps in .atn export by @mercuryVM in https://github.com/storytold/photocraft/pull/8686
- fix(cms): reject malformed hex data in .look LUTs by @Lucenx9 in https://github.com/storytold/photocraft/pull/8657
- Accept all-caps possessives in spell check by @Silvertree2010 in https://github.com/storytold/photocraft/pull/8628
- Reject non-hex characters in engine hex color parser by @Silvertree2010 in https://github.com/storytold/photocraft/pull/8541
- test(panic_hunt): give the panic-counting self-test its own deadline by @zuujiscom in https://github.com/storytold/photocraft/pull/8473
- Puppet Warp pins go where they are dragged, without snapping by @paulou-jpg in https://github.com/storytold/photocraft/pull/8217
- test(liquify): expand freeze-boundary regression coverage by @yongjip in https://github.com/storytold/photocraft/pull/8082
- fix(layers): keep blend mode, Opacity, locks and Fill visible but greyed with no layer selected (#8880) by @MarekSpodBiedry in https://github.com/storytold/photocraft/pull/8904
- fix(curves): 32-bit Curves continue past 0..1 like Photoshop by @FinnNk in https://github.com/storytold/photocraft/pull/8782
- fix(codecs): WebP export keeps the resolution by @FinnNk in https://github.com/storytold/photocraft/pull/8775
- PSD: write pattern transparency where Photoshop keeps it (#8054) by @Higgs32584 in https://github.com/storytold/photocraft/pull/8756
- fix(ui): cap text fields and oversized text events by @FinnNk in https://github.com/storytold/photocraft/pull/8722
- fix(export): report skipped layers in doc_export_layers (#8491) by @bommerts in https://github.com/storytold/photocraft/pull/8713
- Slice tool: Style offers Fixed Ratio and Fixed Size (#8360) by @MatRanc in https://github.com/storytold/photocraft/pull/8638
- Lost window device: quitting goes through while recovery can't be saved by @MatRanc in https://github.com/storytold/photocraft/pull/8620
- Fix pasted shape group bounds and effects across documents by @kotulsky in https://github.com/storytold/photocraft/pull/8992
- fix(io): preserve custom-domain Color Lookup LUTs by @ronibalthazar in https://github.com/storytold/photocraft/pull/8879
- i18n(tr): fix mistranslations, inconsistencies and untranslated rows by @batuhangozegu in https://github.com/storytold/photocraft/pull/8871
- IPP: preserve printer metadata across attribute groups by @ronibalthazar in https://github.com/storytold/photocraft/pull/8828
- Levels, Curves and the other adjustments: ⌥ plus the shortcut opens the dialog at its last settings (#8900) by @marcoarnulfo in https://github.com/storytold/photocraft/pull/8969
- fix(atn): keep Photoshop's other transform interpolation modes on import by @FinnNk in https://github.com/storytold/photocraft/pull/8698
- fix(contributors): drop a duplicate people.toml table by @echelon in https://github.com/storytold/photocraft/pull/9009
- Curves: the graph grows with the Properties panel and a resizable dialog (#8984) by @switch87 in https://github.com/storytold/photocraft/pull/8998
- Perspective Crop: the swap button swaps W and H (#7059) by @davidmann4 in https://github.com/storytold/photocraft/pull/7060
- Keep shape fill and stroke alpha through PSD round-trip (#6180) by @vbasky in https://github.com/storytold/photocraft/pull/6868
- Color pickers: pick on press and follow small drags (#7793) by @hodd1444 in https://github.com/storytold/photocraft/pull/7822
- fix(actions): match Selective Color ATN export to command parsing by @PerchAnton in https://github.com/storytold/photocraft/pull/7681
- Auto-Align: a locked layer becomes the reference instead of being moved (#7080) by @davidmann4 in https://github.com/storytold/photocraft/pull/7081
- Paste: keep the pasted image on the canvas (#6759) by @marmitoTH in https://github.com/storytold/photocraft/pull/6798
- PSD smart filters: Sharpen, Dust & Scratches and Hue/Saturation stay editable (#6267) by @Higgs32584 in https://github.com/storytold/photocraft/pull/6401
- Isolate live distortion tools per document (#5115) by @vbasky in https://github.com/storytold/photocraft/pull/5447
- fix(format): report a failed directory flush after a save instead of ignoring it by @FinnNk in https://github.com/storytold/photocraft/pull/5420
- fix(automation): release idle headless TCP server ports by @Ni-zav in https://github.com/storytold/photocraft/pull/3914
- Crop: Delete Cropped Pixels keeps type and smart objects whole (#7116) by @davidmann4 in https://github.com/storytold/photocraft/pull/7117
- PSD: keep Photoshop 2026 Light adjustment layers verbatim and warn (#6542) by @Higgs32584 in https://github.com/storytold/photocraft/pull/6815
- perf: skip redundant smart object resamples and per-pixel reads by @osaidahmed in https://github.com/storytold/photocraft/pull/6406
- New Document: category tabs and preset cards show a pointer, not a text cursor by @SiFuMax09 in https://github.com/storytold/photocraft/pull/3647
- Make magnetic lasso edge direction polarity-independent by @imSlicedBread in https://github.com/storytold/photocraft/pull/3415
- Integration batch: 44 PRs on main by @davidmann4 in https://github.com/storytold/photocraft/pull/8663
- perf(camera-raw): exposure with all scopes under its 10 ms budget (P36), same output by @nicolasfalesy in https://github.com/storytold/photocraft/pull/8465
- fix(atn): export Black & White adjustment layers with Photoshop's BanW class (#8481) by @Arian100 in https://github.com/storytold/photocraft/pull/8527
- perf(gpu): layer pages that just miss the budget borrow the effect-map share, P60/P61 10× faster on integrated GPUs by @nicolasfalesy in https://github.com/storytold/photocraft/pull/8547
- feat(styles): import and export .asl layer style libraries (#1051) by @echelon in https://github.com/storytold/photocraft/pull/4049
- Options bar: the same tool options in every theme (#4178) by @DeWarePeb in https://github.com/storytold/photocraft/pull/4221
- Keep adjustment clipping visible in compact Properties panels by @bommerts in https://github.com/storytold/photocraft/pull/5248
- PSD: Distort smart filters and Invert open and save like Photoshop by @abc2cb in https://github.com/storytold/photocraft/pull/5249
- fix(gpu): catch validation errors in watched compositor work by @geduful in https://github.com/storytold/photocraft/pull/5370
- UI: split shape options and gradient stop helpers into reusable pieces (no behaviour change) by @Skyfuller1303 in https://github.com/storytold/photocraft/pull/5452
- Add opt-out startup release checks and manual update status by @ZhuanTou33212 in https://github.com/storytold/photocraft/pull/5485
- Plug-ins: wire Enable Generator (Image Assets needs it) by @reynold-hu in https://github.com/storytold/photocraft/pull/5598
- PSD smart objects: keep Photoshop's Cylinder warp when re-rendered (#4112) by @alvarohn in https://github.com/storytold/photocraft/pull/5769
- perf(doc): share the XMP packet, Duotone PSD data and unsupported adjustment bytes between snapshots by @FinnNk in https://github.com/storytold/photocraft/pull/5815
- Color: a picked colour recolours the selected type and shapes by @bazmarth in https://github.com/storytold/photocraft/pull/5842
- Preferences: old settings files take Shift-to-switch-tools on (#5647) by @Higgs32584 in https://github.com/storytold/photocraft/pull/5878
- fix(compose): prevent outside stroke from bleeding into opaque character interior (#5861) by @seotarek in https://github.com/storytold/photocraft/pull/5937
- Raw: charge the retained tile intermediates together (#4959) by @saad-mughal435 in https://github.com/storytold/photocraft/pull/6041
- Color panel: Photoshop's panel-menu modes, the same in every theme (#6000) by @wanikhawar in https://github.com/storytold/photocraft/pull/6055
- Fix legacy PSD point-text placement after font resolution by @bogusyogi in https://github.com/storytold/photocraft/pull/6094
- feat(type): area type, text that wraps inside a closed path or shape by @SillySilk in https://github.com/storytold/photocraft/pull/6230
- Selection: ⇧ mid-drag locks a selection-tool move to the axis (#6231) by @mroxso in https://github.com/storytold/photocraft/pull/6254
- fix(engine): honor lock all on layer mask commands by @osaidahmed in https://github.com/storytold/photocraft/pull/6352
- fix(ui): confirm opening damaged PSD/PSB documents by @DavidBonnier in https://github.com/storytold/photocraft/pull/6658
- perf(canvas): skip occluded checker on CPU textures by @hogawish in https://github.com/storytold/photocraft/pull/6966
- Eyedropper: a large sampling ring that reads on any colour (#6973) by @mroxso in https://github.com/storytold/photocraft/pull/7021
- fix(atn): import a recorded Save As with its destination (#7102) by @ijasonwhite in https://github.com/storytold/photocraft/pull/7202
- Gradient Overlay: add Method selector and retain editable source stops by @oRE-o in https://github.com/storytold/photocraft/pull/7335
- photocraft-cli run: refuse an --out that is the input file unless --in-place (#7437) by @wanikhawar in https://github.com/storytold/photocraft/pull/7455
- gpu, docs: fix timing test skip guard and document Windows ARM64 build on RTX Spark by @mweinbach in https://github.com/storytold/photocraft/pull/7840
- Menu bar: a held Alt's auto-repeat doesn't re-arm the Alt tap by @Cl4VD3 in https://github.com/storytold/photocraft/pull/7849
- CLI: reject ignored or conflicting mcp/serve launch options by @wanikhawar in https://github.com/storytold/photocraft/pull/8035
- GPU compositor: build its pipelines in parallel; DX12 startup 13.2 s -> 7.3 s (part of #6419) by @00xJS in https://github.com/storytold/photocraft/pull/8118
- fix(automation): doc.replaceSmartObject replaces Smart Object contents from the read root (#8061) by @VishnuByrraju in https://github.com/storytold/photocraft/pull/8150
- fix(actions): strict .atn export keeps Apply Image's flat source fields (#7197) by @VishnuByrraju in https://github.com/storytold/photocraft/pull/8180
- Image Assets: optionally keep a transparent artboard's full size by @IbrahimOezhan in https://github.com/storytold/photocraft/pull/8254
- Keep the CPU canvas sharp at 100% zoom by @bommerts in https://github.com/storytold/photocraft/pull/8354
- fix(ui-egui): expand layer visibility eye hitbox and render sunken well (#8467) by @kobaltgit in https://github.com/storytold/photocraft/pull/8496
- fix(actions): accept Photoshop stringID blend modes (#8454) by @justinjohn0306 in https://github.com/storytold/photocraft/pull/8502
- security(io): charge sparse layers, shape caches and shared decodes by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8955
- CMYK: Dissolve and post-adjustment rounding match the RGB compositor (#9033) by @davidmann4 in https://github.com/storytold/photocraft/pull/9035
- security(engine): bound script, batch, adjustment, import and export work by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8954
- Make Crystallize 4x and Pointillize 3x faster on 24 MP layers by @excited-raccoon in https://github.com/storytold/photocraft/pull/6200
- perf(retouch): releasing a Blur/Smudge/Dodge stroke takes its live pixels by @wanikhawar in https://github.com/storytold/photocraft/pull/7281
- perf(seam): the shrink proxy drops its original-column map, same pixels (−15 % at 24 MP) by @ebosido444-ai in https://github.com/storytold/photocraft/pull/8526
- PSD export: embed a linked file only when it is an image PhotoCraft can open by @davidmann4 in https://github.com/storytold/photocraft/pull/9161
- CLI integration batch: clap for photocraft-cli and the desktop app (#7071) by @aiongg in https://github.com/storytold/photocraft/pull/9167
- refactor(cli): split photocraft-cli into modules, no behaviour change (#7071) by @1Git2Clone in https://github.com/storytold/photocraft/pull/8295
- refactor(cli): typed errors with thiserror instead of String (#7071) by @1Git2Clone in https://github.com/storytold/photocraft/pull/8213
- Segmentation: anti-aliasing the full-resolution mask skips runs far from its edge by @xsvm in https://github.com/storytold/photocraft/pull/8554
- fix(cli): help after a mistake, and mcp/serve option notes in --help (#7071) by @1Git2Clone in https://github.com/storytold/photocraft/pull/9194
- fix(ui): keep repeated Tab presses in text editing by @denstu473 in https://github.com/storytold/photocraft/pull/9030
- ui: highlight menu rows while dragging with the button held by @bfenty in https://github.com/storytold/photocraft/pull/9112
- fix(ui): centre size-changing filter previews on the CPU canvas by @FinnNk in https://github.com/storytold/photocraft/pull/8994
- fix(ui): show a filter dialog's preview on the CPU canvas by @FinnNk in https://github.com/storytold/photocraft/pull/8978
- raster: translated surfaces share one rebuilt tile however many threads build it by @aiongg in https://github.com/storytold/photocraft/pull/9230
- JPEG: open 12-bit and arithmetic-coded files through craft-jpeg (#4934, #5003) by @aiongg in https://github.com/storytold/photocraft/pull/9195
- security(affinity): charge archive names, failed reads, corner arrays, attachments, pages and font names by @dylanmtaylor in https://github.com/storytold/photocraft/pull/9257
- fix(ui): Liquify, Content-Aware Fill, Filter Gallery and Adaptive Wide Angle are modal, like Camera Raw by @wanikhawar in https://github.com/storytold/photocraft/pull/9061
- Autosave: a recovery listing judges each key once, so an autosave in progress isn't listed twice by @aiongg in https://github.com/storytold/photocraft/pull/9324
- @drunkeninja42 made their first contribution in https://github.com/storytold/photocraft/pull/8974
- @IgnatAi401 made their first contribution in https://github.com/storytold/photocraft/pull/8872
- @ZFzuofeng made their first contribution in https://github.com/storytold/photocraft/pull/8518
- @hai5656a made their first contribution in https://github.com/storytold/photocraft/pull/8754
- @paulou-jpg made their first contribution in https://github.com/storytold/photocraft/pull/8217
- @MatRanc made their first contribution in https://github.com/storytold/photocraft/pull/8638
- @ronibalthazar made their first contribution in https://github.com/storytold/photocraft/pull/8879
- @batuhangozegu made their first contribution in https://github.com/storytold/photocraft/pull/8871
- @marmitoTH made their first contribution in https://github.com/storytold/photocraft/pull/6798
- @SiFuMax09 made their first contribution in https://github.com/storytold/photocraft/pull/3647
- @Arian100 made their first contribution in https://github.com/storytold/photocraft/pull/8527
- @geduful made their first contribution in https://github.com/storytold/photocraft/pull/5370
- @ZhuanTou33212 made their first contribution in https://github.com/storytold/photocraft/pull/5485
- @alvarohn made their first contribution in https://github.com/storytold/photocraft/pull/5769
- @bogusyogi made their first contribution in https://github.com/storytold/photocraft/pull/6094
- @SillySilk made their first contribution in https://github.com/storytold/photocraft/pull/6230
- @DavidBonnier made their first contribution in https://github.com/storytold/photocraft/pull/6658
- @hogawish made their first contribution in https://github.com/storytold/photocraft/pull/6966
- @ijasonwhite made their first contribution in https://github.com/storytold/photocraft/pull/7202
- @oRE-o made their first contribution in https://github.com/storytold/photocraft/pull/7335
- @mweinbach made their first contribution in https://github.com/storytold/photocraft/pull/7840
- @IbrahimOezhan made their first contribution in https://github.com/storytold/photocraft/pull/8254
- @kobaltgit made their first contribution in https://github.com/storytold/photocraft/pull/8496
- @justinjohn0306 made their first contribution in https://github.com/storytold/photocraft/pull/8502
Full Changelog: https://github.com/storytold/photocraft/compare/v0.15.1...v0.16.0
PhotoCraft v0.15.1
- fix(psd): keep pattern budget charges on parse failure by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8767
- fix(algo): avoid repeated copies of duplicate EXIF text by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8771
- fix(paint): validate gray tile dimensions safely by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8772
- fix(text): bound untrusted font and PSD text processing by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8768
- Select and Mask: tool edits as select.refineEdge params (engine, part 1 of 2) by @wanikhawar in https://github.com/storytold/photocraft/pull/8783
- fix(cms): confirm ICC profile identity by bytes, not the 64-bit hash … by @jturnbach in https://github.com/storytold/photocraft/pull/8863
- fix(vector): bound hostile geometry and raster work by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8769
- fix: restrict droplet shim permissions, explain test range (SonarCloud) by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8870
- Linked files: resolve stored paths with craft-docpath's resolve_absolute by @aiongg in https://github.com/storytold/photocraft/pull/8032
- CI: no debug info for dependencies, nextest in xtask ci, long sweeps spread over days by @aiongg in https://github.com/storytold/photocraft/pull/8915
- security(affinity): bound shared-object expansion work and metadata by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8938
- release: the git-sources gate moves into craft-common-actions (storytold/craft-common-actions#78) by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8952
- packaging: use [[ for bash conditional tests (SonarCloud S7688) by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8914
- CI: the Linux gate runs through the suite's shared gate workflow by @aiongg in https://github.com/storytold/photocraft/pull/8951
- security(raster,doc): tile counts, shared rebuilt tiles, slice merge index by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8953
- security(ipp): total reply deadline, resumable chunk walk by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8956
- security: bisect table/stop lookups; charge ICC curves; bound PSD/RAW buffers by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8959
- security(algo): bound working sets sized by caller-controlled extents by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8946
- security(compose): bound dense working sets and nested Blend If evaluation by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8949
- Tests: missing translations don't fail; xtask ci lists them by @aiongg in https://github.com/storytold/photocraft/pull/8964
- security(codecs): bound truncated JPEG recovery; count WebP frame ICC copies by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8947
- security(plugins): host keys, band count, start fuel, FIFO open by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8958
- security(gpu,ui-egui): bound clipped group planning; pattern swatch sampling by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8960
- CI: cargo xtask ci is the gate, and the workflow runs it by @aiongg in https://github.com/storytold/photocraft/pull/8970
- xtask: the panic hunt without nextest builds with the HEIF decoder by @aiongg in https://github.com/storytold/photocraft/pull/8980
- ci(sonar): stop cancelling main-branch runs so coverage is published by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8990
- deps: roxmltree 0.21 in photocraft-io and photocraft-engine by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8973
- packaging(macos): retry stapling when Apple's ticket lookup drops by @echelon in https://github.com/storytold/photocraft/pull/8995
Full Changelog: https://github.com/storytold/photocraft/compare/v0.14.0...v0.15.1
PhotoCraft v0.14.0
[!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.
- Automation: tighten workspace checks for export, linked files and dialogs by @aiongg in https://github.com/storytold/photocraft/pull/8680
- View › Extras (Cmd+H) hides the Move tool's transform controls by @mercuryVM in https://github.com/storytold/photocraft/pull/6705
- fix(raster): prevent overflow in strided row sampling by @Lucenx9 in https://github.com/storytold/photocraft/pull/8668
- security: index slice IDs in PSD slices parser by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8417
- security: preflight PCX and XPM allocations by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8405
- security: harden native temporary and recovery files by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8406
- security: admit embedded SVG raster images by header size by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8504
- security: stop double decompression of gzip-compressed SVG by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8505
- @mercuryVM made their first contribution in https://github.com/storytold/photocraft/pull/6705
Full Changelog: https://github.com/storytold/photocraft/compare/v0.13.0...v0.14.0
PhotoCraft v0.13.0
- Fix lag when dragging a floating selection with the Move tool by @robertoffmoura in https://github.com/storytold/photocraft/pull/6318
- Open GIMP XCF files: layers, groups, masks, blend modes, channels and selection by @diegochagas in https://github.com/storytold/photocraft/pull/2945
- Layers Panel: flyout, options and thumbnail sizes (part 1/3) by @abc2cb in https://github.com/storytold/photocraft/pull/3289
- Layers Panel: Smart Filters mask follows thumbnail size, sub-rows stay compact (part 2/3) by @abc2cb in https://github.com/storytold/photocraft/pull/3974
- Fill layers: match masks in creation and Pattern Fill preview (part 3/3) by @abc2cb in https://github.com/storytold/photocraft/pull/3975
- Integration batch: #8229, David's follow-ups and 85 FredApps-approved PRs on main by @aiongg in https://github.com/storytold/photocraft/pull/8355
- Vanishing Point: perspective clone samples without allocating per pixel (#7491) by @jlange91 in https://github.com/storytold/photocraft/pull/7772
- Actions: a background filter's step is recorded only by the recording it started in (#7289) by @Korg1ch in https://github.com/storytold/photocraft/pull/7784
- Camera raw: a developed raw keeps its EXIF (RW2 included), so File Info shows its Camera Data (#6957) by @Korg1ch in https://github.com/storytold/photocraft/pull/7791
- Displace on a Smart Object: the map is embedded in the smart filter, so it displaces (#7423) by @Korg1ch in https://github.com/storytold/photocraft/pull/7799
- feat(ui): search font input field sticky on scroll (#7792) by @peppepol in https://github.com/storytold/photocraft/pull/7821
- Free Transform: a result over the pixel limit says so, not "not enough memory" (#7807) by @odgrim in https://github.com/storytold/photocraft/pull/7837
- Free Transform: a result may take what Memory Usage allows, not 2^30 px (#7807) by @odgrim in https://github.com/storytold/photocraft/pull/7838
- Scale layer-effect noise by coverage so it follows the glow by @Silvertree2010 in https://github.com/storytold/photocraft/pull/7846
- Shortcuts: Ctrl+F4 closes the document beside Ctrl+W (Windows/Linux) by @bommerts in https://github.com/storytold/photocraft/pull/7870
- Lock Slices: Slice Select can't select a locked slice, and both slice tools say why (#7865) by @Korg1ch in https://github.com/storytold/photocraft/pull/7898
- Slice Select: the selected slice's handles resize it (#7863) by @Korg1ch in https://github.com/storytold/photocraft/pull/7902
- Filter Gallery › Halftone Pattern: a tone-keeping screen at 45° by @andeecollard in https://github.com/storytold/photocraft/pull/7904
- Smart Blur: 3.5× faster at radius 12 with identical output (#7921) by @wanikhawar in https://github.com/storytold/photocraft/pull/7924
- Fixed Size marquee: Width and Height in any length unit (#7910) by @Korg1ch in https://github.com/storytold/photocraft/pull/7928
- Light themes outline the slider knob (UI-217-11, #7927) by @Korg1ch in https://github.com/storytold/photocraft/pull/7941
- Note tool: a selected note shows its author and colour in the options bar (#7940) by @Korg1ch in https://github.com/storytold/photocraft/pull/7951
- Actions: Emboss saves to and loads from .atn as Photoshop's Embs step (#7946) by @Korg1ch in https://github.com/storytold/photocraft/pull/7959
- Fix File Info showing 1/1 s for exposures just under one second by @Silvertree2010 in https://github.com/storytold/photocraft/pull/7963
- Slice Select gets its own icon: the Slice knife with a pointer (#7859) by @Korg1ch in https://github.com/storytold/photocraft/pull/7966
- perf(raster): tile content bounds compare rows in blocks (P32, #211) by @xsvm in https://github.com/storytold/photocraft/pull/7980
- Windows on ARM: auto picks DirectX 12 for Qualcomm graphics (#7537) by @Higgs32584 in https://github.com/storytold/photocraft/pull/8004
- Open: a file without type never waits for the font scan (#7332) by @Higgs32584 in https://github.com/storytold/photocraft/pull/8005
- automation: edit.installedProfiles is no host-path command by @Elvis33LE in https://github.com/storytold/photocraft/pull/8009
- fix(liquify): keep frozen pixels stable near mask boundaries (#7989) by @Sir-Starch in https://github.com/storytold/photocraft/pull/8012
- Codecs: Fix corrupted CMYK JPEG exports (#8008) by @Sir-Starch in https://github.com/storytold/photocraft/pull/8042
- Pencil: align 1 px click snapping with the line walker (#4895) by @Sir-Starch in https://github.com/storytold/photocraft/pull/8053
- fix(psd): pad Gradient Map blocks (#8070) by @Sir-Starch in https://github.com/storytold/photocraft/pull/8081
- CodeRabbit follow-ups for the #8095 batch by @davidmann4 in https://github.com/storytold/photocraft/pull/8096
- PSD layer comps: an entry without enab inherits the previous visibility, as in Photoshop (#8093) by @Korg1ch in https://github.com/storytold/photocraft/pull/8098
- Integration batch: 8 PRs on main by @davidmann4 in https://github.com/storytold/photocraft/pull/8229
- Content-Aware Move: live preview for large selections (TOOL-213-4, #6680) by @davidmann4 in https://github.com/storytold/photocraft/pull/6681
- Actions that start with Deselect play on when nothing is selected by @Higgs32584 in https://github.com/storytold/photocraft/pull/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 https://github.com/storytold/photocraft/pull/6813
- HEIF: honour the nclx colour description; HLG/PQ HEICs open as linear BT.2020 32-bit (#6752) by @Higgs32584 in https://github.com/storytold/photocraft/pull/6873
- test(ui): a toolbar click with no prior hover picks the tool (part of #2603) by @Higgs32584 in https://github.com/storytold/photocraft/pull/6907
- Background redraw: keep the last finished composites, so a solo's restore uploads instead of recompositing (part of #6528) by @Higgs32584 in https://github.com/storytold/photocraft/pull/6908
- Web: one press per tap, so menus open again on touch (#2095) by @Higgs32584 in https://github.com/storytold/photocraft/pull/6910
- Shortcuts: custom bindings on PageUp/PageDown (and other multi-word keys) fire again (#6827) by @00xJS in https://github.com/storytold/photocraft/pull/6912
- Selections don't mark a document modified (#6865) by @Higgs32584 in https://github.com/storytold/photocraft/pull/6919
- Actions: record File › Export › Export As and replay it with its settings (#7207) by @Korg1ch in https://github.com/storytold/photocraft/pull/7219
- Brushes: folders with search matches can be collapsed while searching by @nrq6993-a11y in https://github.com/storytold/photocraft/pull/7270
- macOS: keep the bundle's Dock icon after the window opens by @nrq6993-a11y in https://github.com/storytold/photocraft/pull/7271
- Keyboard Shortcuts: Shift is recorded when capturing a shortcut by @nrq6993-a11y in https://github.com/storytold/photocraft/pull/7303
- Freeform Pen: ⇧ constrains freehand strokes to straight 45° lines by @nrq6993-a11y in https://github.com/storytold/photocraft/pull/7304
- Color panel: RGB slider mode (#7172) by @nrq6993-a11y in https://github.com/storytold/photocraft/pull/7317
- test(engine): make the define-brush mask allocation fail on its own (fail-after-one) (#212) by @wwewtech in https://github.com/storytold/photocraft/pull/7353
- Content-Aware Fill workspace: an erased sampling area previews as an error, and a failed OK keeps it open (#7384) by @Korg1ch in https://github.com/storytold/photocraft/pull/7385
- fix(atn): a preset-only Photo Filter step exports its resolved colour (#7235) by @wwewtech in https://github.com/storytold/photocraft/pull/7389
- Auto-Blend Layers: turn the Background into a layer before masking it by @Higgs32584 in https://github.com/storytold/photocraft/pull/7397
- Menu bar: Alt held through a shortcut no longer takes the keyboard, so Enter reaches the dialog (#7481) by @Korg1ch in https://github.com/storytold/photocraft/pull/7572
- Presets: an Export As preset survives a damaged sibling set (test for #6906) by @00xJS in https://github.com/storytold/photocraft/pull/7576
- Preserve saved PCraft previews when manifest replacement fails by @jonathanwxh-cell in https://github.com/storytold/photocraft/pull/7580
- Actions: stop when a Save step's document is closed by a Save Document script (#7367) by @Higgs32584 in https://github.com/storytold/photocraft/pull/7587
- Toolbar: colour chips stay centred when the tools scroll (#7316) by @hectorviov in https://github.com/storytold/photocraft/pull/7595
- Studio: the floating Properties card has the Adjustments tab (#7265) by @HEOJUNFO in https://github.com/storytold/photocraft/pull/7617
- Flatpak: a second launch hands its files to the running PhotoCraft over a Unix socket (#1540) by @diegochagas in https://github.com/storytold/photocraft/pull/7626
- Actions: Minimum / Maximum with Preserve: Roundness is no longer exported as Squareness (#7233) by @Korg1ch in https://github.com/storytold/photocraft/pull/7627
- Show Technique and Range in the glow Layer Style pages (#6698) by @hectorviov in https://github.com/storytold/photocraft/pull/7636
- Open the selection menu on a Quick Selection right-click (#7268) by @hectorviov in https://github.com/storytold/photocraft/pull/7640
- Carry on an open path from its end with the Pen (#6593) by @hectorviov in https://github.com/storytold/photocraft/pull/7647
- Move typed text with a drag from just outside it (#5956) by @hectorviov in https://github.com/storytold/photocraft/pull/7653
- Move tool: a selection lifts up to a pixel's own coverage (#7655) by @hectorviov in https://github.com/storytold/photocraft/pull/7661
- perf(format): reuse .pcraft writers between document saves by @reneleonhardt in https://github.com/storytold/photocraft/pull/7694
- fix(actions): preserve effective Stroke width in ATN export by @PerchAnton in https://github.com/storytold/photocraft/pull/7696
- fix(actions): refuse lossy fractional Ripple ATN export by @PerchAnton in https://github.com/storytold/photocraft/pull/7708
- Painting symmetry: canvas edits move the axis with the pixels (#7732) by @davidmann4 in https://github.com/storytold/photocraft/pull/7733
- Actions: a Selective Color step keeps the values of its scalar form by @Hamza0101 in https://github.com/storytold/photocraft/pull/7751
- Perspective Crop: Color Sampler points move with the image (#7760) by @davidmann4 in https://github.com/storytold/photocraft/pull/7762
- Lasso: a short straight segment places a vertex instead of closing the outline by @Hamza0101 in https://github.com/storytold/photocraft/pull/7769
- Save for Web: later slices cover earlier ones, covered slices split into pieces (#7770) by @davidmann4 in https://github.com/storytold/photocraft/pull/7771
- Copy: text selected in an error notice is copied, not the layer (#7807) by @odgrim in https://github.com/storytold/photocraft/pull/7839
- feat(toolbar): select grouped tools using press-drag-release by @Ni-zav in https://github.com/storytold/photocraft/pull/2324
- scorecard: five rows catch up with work already on main by @davidmann4 in https://github.com/storytold/photocraft/pull/3516
- .atn: a pinned corpus of real action sets, with byte-exact and load/save/reload tests (#219) by @FabioLissi in https://github.com/storytold/photocraft/pull/4496
- fix(screen-picker): cancel queued requests without stale replies by @Ni-zav in https://github.com/storytold/photocraft/pull/4762
- Fix mixed-order layered TIFF type geometry and unsafe text fallback by @TheSeanLavery in https://github.com/storytold/photocraft/pull/4771
- PSD Duotone: read and write the ink block (names, colours, curves) by @switch87 in https://github.com/storytold/photocraft/pull/4935
- Support .act color tables end to end (swatches + Color Table dialog) by @abdul-karim-mia in https://github.com/storytold/photocraft/pull/5407
- IO: open .psd through the PSD reader, not codecs (#5258) by @vbasky in https://github.com/storytold/photocraft/pull/5436
- Layers: Group Layers creates the group collapsed (#5571) by @wanikhawar in https://github.com/storytold/photocraft/pull/5581
- Warp: apply a large layer's warp in the background, with progress and Esc to cancel (#1015) by @ianswope in https://github.com/storytold/photocraft/pull/5590
- Move tool: ΔX/ΔY readout beside the pointer while dragging (#5727) by @Higgs32584 in https://github.com/storytold/photocraft/pull/5729
- Export As: Resample menu, incl. Nearest Neighbor (#5838) by @davidmann4 in https://github.com/storytold/photocraft/pull/5840
- Shapes: Density and Feather on shape layers (#5846) by @davidmann4 in https://github.com/storytold/photocraft/pull/5847
- Displace: OK asks for the displacement map, as in Photoshop (#5806) by @Higgs32584 in https://github.com/storytold/photocraft/pull/5855
- Image: Bitmap dialog with Output resolution and per-method settings (#5559) by @davidmann4 in https://github.com/storytold/photocraft/pull/5889
- Text: apply anti-alias mode shaping when rasterizing type (#5902) by @nrq6993-a11y in https://github.com/storytold/photocraft/pull/5907
- BMP export: Indexed Color documents save as palette BMPs by @Sir-Starch in https://github.com/storytold/photocraft/pull/5928
- Bevel & Emboss: keep the Gloss Contour's Anti-aliased (antialiasGloss) by @varanus-salvator in https://github.com/storytold/photocraft/pull/5990
- Stroke: keep Overprint (overprint) by @varanus-salvator in https://github.com/storytold/photocraft/pull/6002
- Zoom tool menu: Zoom In and Zoom Out last, as in Photoshop (#6005) by @wstock in https://github.com/storytold/photocraft/pull/6028
- refactor: share hsb conversions between photocraft-color and the color picker by @osaidahmed in https://github.com/storytold/photocraft/pull/6146
- feat(psd): editable Render smart filters (Clouds, Difference Clouds, Fibers, Lens Flare) by @the-unknown in https://github.com/storytold/photocraft/pull/6160
- Performance: a cancelled Gaussian Blur job stops within budget (#6205) by @davidmann4 in https://github.com/storytold/photocraft/pull/6206
- Preferences: Save in Background off saves in the foreground (#6207) by @davidmann4 in https://github.com/storytold/photocraft/pull/6208
- Zoom tool: hold to zoom continuously with Animated Zoom on (#6210) by @davidmann4 in https://github.com/storytold/photocraft/pull/6211
- Tools: each painting tool's brush persists across launches; restored tool options are clamped (#6212) by @davidmann4 in https://github.com/storytold/photocraft/pull/6213
- GPU: pin the keep-overlap ordering with a tile-growth regression test by @Elvis33LE in https://github.com/storytold/photocraft/pull/6243
- PSD: parameterless smart filters (Blur, Sharpen, Find Edges, Solarize…) open and save like Photoshop (#6296) by @davidmann4 in https://github.com/storytold/photocraft/pull/6297
- PSD: Surface Blur, Smart Blur and Radial Blur smart filters open and save like Photoshop (#6298) by @davidmann4 in https://github.com/storytold/photocraft/pull/6299
- PSD: Offset and Custom smart filters open and save like Photoshop (#6304) by @davidmann4 in https://github.com/storytold/photocraft/pull/6305
- PSD: Mezzotint and Color Halftone smart filters open and save like Photoshop (#6316) by @davidmann4 in https://github.com/storytold/photocraft/pull/6317
- New Document: Color Profile, the working space or another profile of the mode (#321) by @Higgs32584 in https://github.com/storytold/photocraft/pull/6363
- PSD: Perspective Warp smart filters open and save like Photoshop (#6268) by @davidmann4 in https://github.com/storytold/photocraft/pull/6397
- Artboards: layers outside the boards stay visible over the pasteboard (#5712) by @Higgs32584 in https://github.com/storytold/photocraft/pull/6410
- Survive a lost window GPU device: draw nothing, save unsaved work for recovery, close (#3438, #1215) by @00xJS in https://github.com/storytold/photocraft/pull/6464
- fix(ui): preserve shape stroke settings at zero width by @denstu473 in https://github.com/storytold/photocraft/pull/6472
- Type: commit the edit when another layer or document becomes active (#6483) by @wanikhawar in https://github.com/storytold/photocraft/pull/6509
- Canvas overlays stay visible while panning (#6592) by @wanikhawar in https://github.com/storytold/photocraft/pull/6629
- Tab in Full Screen Mode shows the menu bar and panels; leaving Full Screen restores them as before (#6760) by @MarekSpodBiedry in https://github.com/storytold/photocraft/pull/6830
- Actions: .atn Select Subject, Select and Mask, Color Range, clipping and layer masks, colours map to commands (part of #6745) by @Higgs32584 in https://github.com/storytold/photocraft/pull/6881
- Tests: generated large-file fixtures and a P20 number (#5107) by @davidmann4 in https://github.com/storytold/photocraft/pull/5109
- security: prevent script injection in fuzz workflow (SonarCloud S7630) by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8370
- test: non-blocking sleep in async test loop (SonarCloud rust:S7488) by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8373
- security: enforce HTTPS on curl downloads (SonarCloud S6506) by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8369
- ci: pin GitHub Actions to full commit SHA (SonarCloud S7637) by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8368
- refactor(atn): build the clipping-mask and three adjustment events with macros (SonarCloud duplication gate) by @zuujiscom in https://github.com/storytold/photocraft/pull/8401
- Smart Filters: distinct editors, shared disclosure and stable alpha by @abc2cb in https://github.com/storytold/photocraft/pull/3283
- README: the app icon above the title by @bflatastic in https://github.com/storytold/photocraft/pull/8514
- security: cap uncached pattern conversion by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8452
- security: bound dense mask working set by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8450
- security: bound XCF copied layer metadata by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8448
- security: bound PDN layer-name copies by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8446
- security: bound cumulative retained RAW tile memory by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8445
- security: cap lossless-JPEG Huffman table builds by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8444
- security: apply caller limits to RAW preview decoding by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8443
- security: interpolate RAW gain maps per pixel, not per full row by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8442
- security: position RW2 bit cursor in constant time by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8441
- security: reject tiled Sony cRAW and cap row references by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8440
- security: bound TIFF structure-dump output by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8439
- security: admit HEIF coded image size, not just transformed by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8438
- security: admit deep-EXR output size and validate chunks before indexing by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8437
- security: budget Cryptomatte per-pixel pair capacity by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8436
- security: bound inverse-curve and CLUT interpolation work by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8435
- security: compute auto-slice coverage per band, not per cell by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8434
- security: check filter-effects padding length before scanning by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8433
- security: bound Affinity raw child-slot traversal work by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8432
- security: index Affinity live-corner radii by record by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8431
- security: index Affinity object fields for O(1) lookup by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8430
- security: validate corpus paths and bound symlink traversal in xtask by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8428
- security: count GIF frame delays with a map by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8427
- security: convert spelling offsets in a single pass by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8426
- security: stop quadratic rescans in XMP value scanning by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8425
- security: dedup Cryptomatte keys and cache stream lists by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8424
- security: deduplicate ATN action names in near-linear time by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8423
- security: index FITS header keywords for O(1) lookup by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8422
- security: index XCF parasite names for duplicate replacement by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8421
- security: index comp IDs in PSD layer-comp import by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8420
- security: bound RAW metadata array reads by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8409
- security: bound nested automation playback by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8408
- security: encode printer names in IPP requests by @dylanmtaylor in https://github.com/storytold/photocraft/pull/8407
- ci(freebsd): run the photocraft-gpu tests one at a time by @zuujiscom in https://github.com/storytold/photocraft/pull/8470
- Fixes #8519 quick export honours extension by @benandez in https://github.com/storytold/photocraft/pull/8535
- Format the quick export test (#8535) by @aiongg in https://github.com/storytold/photocraft/pull/8562
- Backlog batch: 271 reviewed contributor PRs by @aiongg in https://github.com/storytold/photocraft/pull/8577
- Fix Fixed Size marquee drag positioning, building on #6026 by @bsabiston in https://github.com/storytold/photocraft/pull/8309
- fix(ui): pin the document tabs' » button to the strip's right end (part of #8290) by @Korg1ch in https://github.com/storytold/photocraft/pull/8315
- fix(actions): Hue/Saturation uses Photoshop's hue key H in .atn files (#8302, #8308) by @Korg1ch in https://github.com/storytold/photocraft/pull/8324
- New Document: labels show the arrow, not a text cursor (#8331) by @bommerts in https://github.com/storytold/photocraft/pull/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 https://github.com/storytold/photocraft/pull/8372
- i18n(pt-br): translate 131 runtime labels that still showed in English by @s17sh70x2jfl031ag in https://github.com/storytold/photocraft/pull/8097
- Save: a tab whose file another save writes over is detached and marked unsaved (#6597) by @VishnuByrraju in https://github.com/storytold/photocraft/pull/8105
- Open/Save: refuse file names that aren't valid Unicode instead of rewriting them (#6601) by @VishnuByrraju in https://github.com/storytold/photocraft/pull/8107
- Alt held during a drag is no menu-bar tap, so Enter commits Free Transform (#8113) by @Korg1ch in https://github.com/storytold/photocraft/pull/8119
- Liquify: keep short strokes whole so undo removes only the last by @Silvertree2010 in https://github.com/storytold/photocraft/pull/8128
- Compose: tone and hue-range lookups truncate instead of calling floor by @xsvm in https://github.com/storytold/photocraft/pull/8135
- Fix tooltip text in scrub_label function by @coolvitto in https://github.com/storytold/photocraft/pull/8137
- Panels: the dock can be dragged as wide as the window allows, not only 520 points (#7896) by @Korg1ch in https://github.com/storytold/photocraft/pull/8141
- Quick Export: preserve floating-point EXR output (#7562) by @jonathanwxh-cell in https://github.com/storytold/photocraft/pull/8142
- Compose: adjustment layers blend back and round without per-sample calls by @xsvm in https://github.com/storytold/photocraft/pull/8143
- fix(psd): an edited type layer updates the Photoshop-era Txt2 objects too (#6971) by @VishnuByrraju in https://github.com/storytold/photocraft/pull/8146
- fix(ui): grey out Select and Mask in the options bar without a selection (#7520) by @VishnuByrraju in https://github.com/storytold/photocraft/pull/8152
- fix(ui): Browse… buttons for dialog folder and plug-in path fields (#7942, #7531) by @VishnuByrraju in https://github.com/storytold/photocraft/pull/8154
- fix(info): Info panel CMYK uses the Color Picker's colour-managed conversion (#8101) by @VishnuByrraju in https://github.com/storytold/photocraft/pull/8155
- fix(swatches): a CMYK swatch keeps its inks as the foreground (#7474) by @VishnuByrraju in https://github.com/storytold/photocraft/pull/8158
- fix(ui): menu titles switch on hover at the very top screen edge (#7702) by @VishnuByrraju in https://github.com/storytold/photocraft/pull/8159
- feat(ui): Brushes tab preview-size slider for grid cells and list rows (#7256) by @VishnuByrraju in https://github.com/storytold/photocraft/pull/8162
- Layers panel: mark adjustment layers kept as imported but not rendered (#6541) by @VishnuByrraju in https://github.com/storytold/photocraft/pull/8173
- fix(actions): .atn export of Image Size with resample none no longer adds a pixel resize (#7189) by @VishnuByrraju in https://github.com/storytold/photocraft/pull/8182
- fix(paths): the Work Path is drawn only while selected or a path tool is active (#6551) by @VishnuByrraju in https://github.com/storytold/photocraft/pull/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 https://github.com/storytold/photocraft/pull/8187
- docs(parity): Crop rows in ui-parity.md match the code and the scorecard (#6562) by @VishnuByrraju in https://github.com/storytold/photocraft/pull/8188
- Preferences: the theme swatch star no longer grows the row on hover by @nikolainyegaard in https://github.com/storytold/photocraft/pull/8190
- Warp: a surface drag commits exactly as previewed, now under test (#7885) by @Higgs32584 in https://github.com/storytold/photocraft/pull/8201
- Preferences: list the languages alphabetically by their own name by @nikolainyegaard in https://github.com/storytold/photocraft/pull/8203
- Color Lookup lists the LUTs in a Preferences folder (#6558) by @JuanAntonioRC in https://github.com/storytold/photocraft/pull/8219
- UI: Control-click opens the right-click menus on macOS by @BrianMonks in https://github.com/storytold/photocraft/pull/8221
- Alt + wheel zooms while Alt is held, even when the modifier state misses it (#8049) by @Higgs32584 in https://github.com/storytold/photocraft/pull/8223
- Plug-ins: a reduced live preview scales the settings a manifest marks "unit": "px" (#7524) by @Higgs32584 in https://github.com/storytold/photocraft/pull/8232
- Add interactive drag positioning to print preview by @FartmanAndBurps in https://github.com/storytold/photocraft/pull/8236
- Clipboard: a panic while reading the clipboard is reported, not a crash (refs #7582) by @Higgs32584 in https://github.com/storytold/photocraft/pull/8237
- CPU canvas: a large document shows its own pixels at 100% (#7568) by @Higgs32584 in https://github.com/storytold/photocraft/pull/8238
- Keep Batch results when the action saves and then closes the document by @jonathanwxh-cell in https://github.com/storytold/photocraft/pull/8242
- Pen: ⌥/Alt-drag grabs the last anchor's incoming handle too (#6077) by @adi-1108 in https://github.com/storytold/photocraft/pull/8243
- Object Selection: preserve Shift/Alt from mouse-down by @Ebenezer-03 in https://github.com/storytold/photocraft/pull/8244
- fix(engine): Remove Background looks for the subject in the layer, not the canvas (#8235) by @adi-1108 in https://github.com/storytold/photocraft/pull/8245
- docs(architecture): drop references to the removed rust-framework-options.md by @adi-1108 in https://github.com/storytold/photocraft/pull/8252
- test(codecs): cover exact TGA packet and encoder input boundaries by @adi-1108 in https://github.com/storytold/photocraft/pull/8253
- test(io): cover PSD palette boundaries and bitmap row packing by @adi-1108 in https://github.com/storytold/photocraft/pull/8256
- test(algo): cover deinterlace choices and NTSC signal limits by @adi-1108 in https://github.com/storytold/photocraft/pull/8257
- test(algo): cover Custom convolution bounds, padding and depth semantics by @adi-1108 in https://github.com/storytold/photocraft/pull/8258
- Dialogs: Preferences' title no longer sits against an inner outline (#8199) by @nathanZW in https://github.com/storytold/photocraft/pull/8265
- contributors: add adi-1108 by @adi-1108 in https://github.com/storytold/photocraft/pull/8269
- docs(support): Canvas Size added a white border around my photo by @reynold-hu in https://github.com/storytold/photocraft/pull/8270
- test(ui): cover tool memory persistence by @ManiProjs in https://github.com/storytold/photocraft/pull/8284
- Keyboard Shortcuts: the dialog switches sets through the engine too (#8286) by @davidmann4 in https://github.com/storytold/photocraft/pull/8287
- fix(ui): Free Transform corners show the diagonal resize arrow on wide or tall boxes by @steinluiz in https://github.com/storytold/photocraft/pull/8296
- MCP stdio: a line that is not UTF-8 gets a parse error instead of ending the session by @xsvm in https://github.com/storytold/photocraft/pull/8318
- Layers: per-layer XMP metadata (layer.xmpMetadata), stored as Photoshop stores it by @ingling in https://github.com/storytold/photocraft/pull/8367
- fix(atn): reject non-replace select.rect modes in .atn export (#7194) by @seotarek in https://github.com/storytold/photocraft/pull/7249
- Fix: add missing Chinese translations for "Up" and "To" by @langrain in https://github.com/storytold/photocraft/pull/7273
- Auto-Blend Layers: mask and blend the whole layers, past the canvas too by @Higgs32584 in https://github.com/storytold/photocraft/pull/7395
- Camera Raw: choose the demosaic method when a raw opens by @Unemars in https://github.com/storytold/photocraft/pull/7417
- Camera Raw: the full-resolution preview of a raw open shows the raw-stage sliders by @Unemars in https://github.com/storytold/photocraft/pull/7421
- CLI convert: refuse to write over the input file unless --in-place by @wanikhawar in https://github.com/storytold/photocraft/pull/7454
- Refuse strict .atn export of Apply Image with a blending mask by @Silvertree2010 in https://github.com/storytold/photocraft/pull/7571
- Move tool: moving selected pixels shrinks the selection, transform controls and snapping to them (#7538) by @hectorviov in https://github.com/storytold/photocraft/pull/7574
- Refuse strict .atn export of a mask/channel-targeted Free Transform by @Silvertree2010 in https://github.com/storytold/photocraft/pull/7585
- fix(atn): keep a Transform Selection's interpolation; refuse what the transform descriptor can't carry by @FinnNk in https://github.com/storytold/photocraft/pull/7590
- fix(atn): refuse strict export of canvas-bound selection modifies and placed pattern buckets by @FinnNk in https://github.com/storytold/photocraft/pull/7591
- Refuse .atn export of crops with output size or resolution by @Silvertree2010 in https://github.com/storytold/photocraft/pull/7593
- Lasso tools: the outline is solid until the selection is made (#7495) by @hectorviov in https://github.com/storytold/photocraft/pull/7605
- Refuse strict ATN export of Select and Mask with brush strokes by @Silvertree2010 in https://github.com/storytold/photocraft/pull/7611
- Previous / Next / First / Last Brush commands (, . ⇧, ⇧.) by @Cl4VD3 in https://github.com/storytold/photocraft/pull/7614
- Fade the alpha channel or Quick Mask an edit changed (#7382) by @hectorviov in https://github.com/storytold/photocraft/pull/7624
- Record one action call when playback pauses for a step dialog by @Silvertree2010 in https://github.com/storytold/photocraft/pull/7637
- Map the bevel's shading through its gloss contour, not its light (#7360) by @hectorviov in https://github.com/storytold/photocraft/pull/7638
- Refuse .atn export of resolution-only Image Size without keepPrintSize by @Silvertree2010 in https://github.com/storytold/photocraft/pull/7656
- Preferences: Zoom Resizes Windows resizes floating document windows, and the Zoom tool shows it as Resize Windows to Fit (#204) by @KLBMinhLong in https://github.com/storytold/photocraft/pull/7662
- File Info: print a slow shutter speed as the fraction a camera writes… by @ashsajal1 in https://github.com/storytold/photocraft/pull/7665
- Export As: show the size the file will have (#6595) by @hectorviov in https://github.com/storytold/photocraft/pull/7677
- fix(actions): refuse lossy fractional Crystallize ATN export by @PerchAnton in https://github.com/storytold/photocraft/pull/7721
- Actions: a setting Photoshop's event cannot hold refuses the step by @Hamza0101 in https://github.com/storytold/photocraft/pull/7759
- fix(ui): guides draw over the Puppet Warp, Perspective Warp and Vanishing Point previews (#7781) by @switch87 in https://github.com/storytold/photocraft/pull/7798
- Guides: show the X or Y position beside the pointer while dragging by @hodd1444 in https://github.com/storytold/photocraft/pull/7800
- Refuse strict .atn export of an in-place layer duplicate by @ksaxena149 in https://github.com/storytold/photocraft/pull/7801
- Add a draggable center diagram for Radial Blur Zoom by @brianblakely in https://github.com/storytold/photocraft/pull/7808
- Preferences › Raw Defaults › Resolution: a developed raw opens at it (#7789) by @Korg1ch in https://github.com/storytold/photocraft/pull/7811
- PNG: correct sTER eye-order names without changing stored bytes by @danielcamposramos in https://github.com/storytold/photocraft/pull/7815
- Don't paint from the sampled point when Alt is released mid-press by @Silvertree2010 in https://github.com/storytold/photocraft/pull/7825
- Print: an IPv6 print server is parsed as a host, not split on its last colon by @erikerikerik in https://github.com/storytold/photocraft/pull/7831
- Print: the no-listener test takes a port the OS says is free, not port 1 by @erikerikerik in https://github.com/storytold/photocraft/pull/7835
- Brush: with airbrush build-up on, number keys set Flow and Shift+number sets Opacity (#7785) by @MarekSpodBiedry in https://github.com/storytold/photocraft/pull/7853
- fix(touch) double tap jitter by @RaincloudTheDragon in https://github.com/storytold/photocraft/pull/7871
- Save As JPEG: JPEG Options dialog (quality 0–12, Baseline / Optimized / Progressive) (FILE-215-19) by @Higgs32584 in https://github.com/storytold/photocraft/pull/7883
- Slice Select: Delete deletes the selected slice, not the layer (#7862) by @Korg1ch in https://github.com/storytold/photocraft/pull/7894
- Liquify: Alt-drag brush resize keeps the brush in place and no longer paints a dab (#7884) by @Korg1ch in https://github.com/storytold/photocraft/pull/7919
- Create Rectangle and the other shape dialogs: right-click Width or Height to pick their unit (#7786) by @Korg1ch in https://github.com/storytold/photocraft/pull/7922
- perf(liquify): parallel dab nodes and source read, P30 −13–15 %, same pixels by @xsvm in https://github.com/storytold/photocraft/pull/7930
- Layers: the pointer over a thumbnail shows what ⌘-click loads, with the +/−/× badge (#7824) by @Korg1ch in https://github.com/storytold/photocraft/pull/7932
- fix(transform): keep artboard paper below child previews by @chiharumurabayashi-stack in https://github.com/storytold/photocraft/pull/7943
- Type: hovering a served font fetches it after a short rest, not as the pointer passes by @kuvshin888 in https://github.com/storytold/photocraft/pull/7947
- Align: a lone layer in an artboard aligns to that artboard by @NaufalDzz in https://github.com/storytold/photocraft/pull/7956
- Fix dropdown menus opening behind modal dialogs on macOS trackpad tap (#7113) by @beterhans in https://github.com/storytold/photocraft/pull/7957
- Decode numeric character references in File Info XMP text by @Silvertree2010 in https://github.com/storytold/photocraft/pull/7976
- Preferences: say Rendering Mode applies at next launch, next to it by @NaufalDzz in https://github.com/storytold/photocraft/pull/7979
- fix(geom): reject extreme warp split indices without overflow by @Lucenx9 in https://github.com/storytold/photocraft/pull/8010
- perf(raster): read 16- and 32-bit rows into RGBA with the colour model resolved per row by @xsvm in https://github.com/storytold/photocraft/pull/8013
- Keep previous crop length when normalizing rounds to zero by @Silvertree2010 in https://github.com/storytold/photocraft/pull/8021
- Keep '#' inside quoted .cube TITLE when parsing by @Silvertree2010 in https://github.com/storytold/photocraft/pull/8023
- Snapping: artboard edges and centres are snap targets (#8016) by @tessillustrations-droid in https://github.com/storytold/photocraft/pull/8029
- Layers panel: a group's layers indent past the group (#8017) by @tessillustrations-droid in https://github.com/storytold/photocraft/pull/8030
- fix(format): make Windows native-save publication durable by @denstu473 in https://github.com/storytold/photocraft/pull/8034
- Page Up/Down, Home and End scroll the canvas, as in Photoshop (#8057) by @Korg1ch in https://github.com/storytold/photocraft/pull/8068
- Write DOMAIN_MIN/DOMAIN_MAX in the .cube writer by @Silvertree2010 in https://github.com/storytold/photocraft/pull/8083
- Preferences › File Handling: Do not append "copy" to filename when saving a copy (#8080) by @Korg1ch in https://github.com/storytold/photocraft/pull/8085
- fix(liquify): include cubic overshoot in source reads by @yongjip in https://github.com/storytold/photocraft/pull/8087
- fix(type): resolve exact PostScript names in type.create by @Gabrieljr42 in https://github.com/storytold/photocraft/pull/8088
- Reject '+' signs in color picker hex field by @Silvertree2010 in https://github.com/storytold/photocraft/pull/8091
- Compose: Color Balance works out each channel's curve once, not per pixel by @xsvm in https://github.com/storytold/photocraft/pull/8109
- Layers panel: a click on the empty space below the layers deselects them (#8100) by @Korg1ch in https://github.com/storytold/photocraft/pull/8114
- Find small objects in large documents with the Object Finder by @Silvertree2010 in https://github.com/storytold/photocraft/pull/6692
- macOS: Beep When Done plays the system alert sound (NSBeep) instead of a terminal bell (#6537) by @marcoarnulfo in https://github.com/storytold/photocraft/pull/6726
- Puppet warp: Delete and Backspace remove the selected pin by @sarseev in https://github.com/storytold/photocraft/pull/6754
- Puppet warp: Fix discrepancy between preview and the final state by @sarseev in https://github.com/storytold/photocraft/pull/6786
- Intel Iris Xe on DX12: no more red blocks in brush previews and tool icons (#6790) by @Higgs32584 in https://github.com/storytold/photocraft/pull/6791
- Type: paragraph direction buttons in the Paragraph panel and options … by @tareqziad1998 in https://github.com/storytold/photocraft/pull/6793
- feat(ui): System Info shows the graphics card's own memory by @FinnNk in https://github.com/storytold/photocraft/pull/6794
- docs(contributors): add Gotix-eg to people.toml by @Gotix-eg in https://github.com/storytold/photocraft/pull/6824
- Actions: Shift-click layer select in .atn imports as range select and exports back (#6784) by @MarekSpodBiedry in https://github.com/storytold/photocraft/pull/6829
- Title bar: only the primary button starts a window drag (#6729) by @MarekSpodBiedry in https://github.com/storytold/photocraft/pull/6833
- Object Finder: hovering with an empty active layer shows the status-bar hint (#6549) by @MarekSpodBiedry in https://github.com/storytold/photocraft/pull/6835
- fix(file): treat zero or negative width/height as unconstrained in fitImage by @rudrakshagarwal4200-ai in https://github.com/storytold/photocraft/pull/6841
- Disable Convert to Smart Object for layers that are already smart objects by @Silvertree2010 in https://github.com/storytold/photocraft/pull/6880
- Reorder Layer Comps through dragging and context actions (#6498) by @vbasky in https://github.com/storytold/photocraft/pull/6891
- fix: detect dominant foregrounds with Object Finder by @euisuh in https://github.com/storytold/photocraft/pull/6896
- GPU fallback: Retry GPU after an error rebuilds the GPU canvas now, no restart (#6577) by @00xJS in https://github.com/storytold/photocraft/pull/6897
- perf(camera-raw): develop the preview off the UI thread (#5964) by @fjamesprice in https://github.com/storytold/photocraft/pull/6909
- fix(engine): preserve Background layer on Merge Layers by @dangphuc2470 in https://github.com/storytold/photocraft/pull/6925
- Crop tool: switching tools drops an untouched ratio-fitted frame instead of cropping by @mroxso in https://github.com/storytold/photocraft/pull/6936
- Color Picker: update the colour on press, not on release (#6937) by @mroxso in https://github.com/storytold/photocraft/pull/6942
- docs(xtask): point the layers help text at docs/architecture.md by @HyperionBurn in https://github.com/storytold/photocraft/pull/6946
- Color panel: keep hex/RGB readout visible in short docks (#6885) by @nrq6993-a11y in https://github.com/storytold/photocraft/pull/6963
- feat(i18n): add Hindi (hi) language catalog and locale resolution by @theshubh77 in https://github.com/storytold/photocraft/pull/6974
- Relink to File: ask for the file (menu bar and layer context menu) by @Tungtono in https://github.com/storytold/photocraft/pull/6994
- Save: ask before replacing a file that an added or lowercased extension names by @dotCooCoo in https://github.com/storytold/photocraft/pull/7051
- Layer Style: keep gradient overlay colours when reopening the dialog (#7031) by @nrq6993-a11y in https://github.com/storytold/photocraft/pull/7072
- test(cli): pin photocraft-cli argument parsing before the clap port (#7071) by @1Git2Clone in https://github.com/storytold/photocraft/pull/7099
- Presets: the damaged-set test also covers Export As presets by @dotCooCoo in https://github.com/storytold/photocraft/pull/7109
- docs: fix subject-verb agreement in downloads section by @Jazz1-6 in https://github.com/storytold/photocraft/pull/7112
- fix(atn): map Apply Layer Comp steps by name (#7101) by @denstu473 in https://github.com/storytold/photocraft/pull/7115
- perf(type): refresh type layers without cloning the document (#7092) by @nicolasfalesy in https://github.com/storytold/photocraft/pull/7142
- i18n(pl): translate the 14 counted status messages missing from Polish by @Korg1ch in https://github.com/storytold/photocraft/pull/7150
- Type: register craft fonts of every script, not only the Japanese ones by @dotCooCoo in https://github.com/storytold/photocraft/pull/7152
- i18n(id): translate the 14 counted status messages missing from Indonesian by @Korg1ch in https://github.com/storytold/photocraft/pull/7159
- i18n(ko): translate the 14 counted status messages missing from Korean by @Korg1ch in https://github.com/storytold/photocraft/pull/7160
- i18n(zh-hans): translate the 14 counted status messages missing from Simplified Chinese by @Korg1ch in https://github.com/storytold/photocraft/pull/7161
- fix(ui): right-click an Adaptive Wide Angle constraint for its orientation menu, as in Photoshop by @Korg1ch in https://github.com/storytold/photocraft/pull/7167
- Open EXR Parts: the menu asks for a file and shows the parts dialog (#7169) by @RehanKhatkar in https://github.com/storytold/photocraft/pull/7174
- Layer effects in Dissolve mode speckle, as in Photoshop (#6995) by @Korg1ch in https://github.com/storytold/photocraft/pull/7204
- Corrective Camera Raw - fix(import/camera-raw): preserve document identity across asynchronous opens and re-develop by @ametadot in https://github.com/storytold/photocraft/pull/7215
- Liquify: zoom the preview with the zoom keys, a trackpad pinch and ×1.1 wheel notches (#7210) by @Korg1ch in https://github.com/storytold/photocraft/pull/7227
- fix(atn): export recorded layer.select with name parameter (#7185) by @seotarek in https://github.com/storytold/photocraft/pull/7232
- Save As on Linux: the one file type offered gives the name its extension by @erikerikerik in https://github.com/storytold/photocraft/pull/7240
- Layer Export As: the dialog opens with the layer's size, not the document's by @erikerikerik in https://github.com/storytold/photocraft/pull/7241
- A second launch that sets only environment overrides keeps its own process by @erikerikerik in https://github.com/storytold/photocraft/pull/7242
- fix(atn): reject off-center radial blur in .atn export (#7234) by @seotarek in https://github.com/storytold/photocraft/pull/7258
- test(io): SVG text-transform test can't pass without a font (#4806) by @ahmed0magdy in https://github.com/storytold/photocraft/pull/7260
- fix(atn): reject numeric layer references in .atn export (#7248) by @seotarek in https://github.com/storytold/photocraft/pull/7262
- Auto-Blend Layers: Seamless Tones and Colors turns on gain compensation by @Higgs32584 in https://github.com/storytold/photocraft/pull/7396
- i18n(cs): bring the Czech catalog up to date by @Losminek in https://github.com/storytold/photocraft/pull/7511
- Marching ants in device pixels, like Photoshop's (#7489) by @wanikhawar in https://github.com/storytold/photocraft/pull/7530
- fix(atn): refuse strict export of options the descriptors can't carry by @FinnNk in https://github.com/storytold/photocraft/pull/7588
- i18n(tr): comprehensive review, terminology refinement, and industry-standard UI consistency overhaul by @yeniufuklar-com in https://github.com/storytold/photocraft/pull/5731
- fix(format): ignore accidental ZIP directory signatures in comments by @0x6Ason in https://github.com/storytold/photocraft/pull/5877
- Fix Exposure value-field steps when decimals are set (#5914) by @nrq6993-a11y in https://github.com/storytold/photocraft/pull/5927
- fix(ui): ensure turning View -> Snap off disables all snapping (#5782) by @seotarek in https://github.com/storytold/photocraft/pull/5936
- History panel: scroll to the current state on document change (#5909) by @nrq6993-a11y in https://github.com/storytold/photocraft/pull/5940
- Type: Create warped text button in the options bar, as in Photoshop (#5911) by @Fazmin in https://github.com/storytold/photocraft/pull/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
- @robertoffmoura made their first contribution in https://github.com/storytold/photocraft/pull/6318
- @andeecollard made their first contribution in https://github.com/storytold/photocraft/pull/7904
- @varanus-salvator made their first contribution in https://github.com/storytold/photocraft/pull/5990
- @benandez made their first contribution in https://github.com/storytold/photocraft/pull/8535
- @bsabiston made their first contribution in https://github.com/storytold/photocraft/pull/8309
- @VishnuByrraju made their first contribution in https://github.com/storytold/photocraft/pull/8105
- @nikolainyegaard made their first contribution in https://github.com/storytold/photocraft/pull/8190
- @BrianMonks made their first contribution in https://github.com/storytold/photocraft/pull/8221
- @FartmanAndBurps made their first contribution in https://github.com/storytold/photocraft/pull/8236
- @adi-1108 made their first contribution in https://github.com/storytold/photocraft/pull/8243
- @Ebenezer-03 made their first contribution in https://github.com/storytold/photocraft/pull/8244
- @nathanZW made their first contribution in https://github.com/storytold/photocraft/pull/8265
- @ManiProjs made their first contribution in https://github.com/storytold/photocraft/pull/8284
- @steinluiz made their first contribution in https://github.com/storytold/photocraft/pull/8296
- @langrain made their first contribution in https://github.com/storytold/photocraft/pull/7273
- @Cl4VD3 made their first contribution in https://github.com/storytold/photocraft/pull/7614
- @ashsajal1 made their first contribution in https://github.com/storytold/photocraft/pull/7665
- @ksaxena149 made their first contribution in https://github.com/storytold/photocraft/pull/7801
- @brianblakely made their first contribution in https://github.com/storytold/photocraft/pull/7808
- @danielcamposramos made their first contribution in https://github.com/storytold/photocraft/pull/7815
- @erikerikerik made their first contribution in https://github.com/storytold/photocraft/pull/7831
- @RaincloudTheDragon made their first contribution in https://github.com/storytold/photocraft/pull/7871
- @chiharumurabayashi-stack made their first contribution in https://github.com/storytold/photocraft/pull/7943
- @NaufalDzz made their first contribution in https://github.com/storytold/photocraft/pull/7956
- @beterhans made their first contribution in https://github.com/storytold/photocraft/pull/7957
- @Lucenx9 made their first contribution in https://github.com/storytold/photocraft/pull/8010
- @tessillustrations-droid made their first contribution in https://github.com/storytold/photocraft/pull/8029
- @yongjip made their first contribution in https://github.com/storytold/photocraft/pull/8087
- @Gabrieljr42 made their first contribution in https://github.com/storytold/photocraft/pull/8088
- @sarseev made their first contribution in https://github.com/storytold/photocraft/pull/6754
- @tareqziad1998 made their first contribution in https://github.com/storytold/photocraft/pull/6793
- @rudrakshagarwal4200-ai made their first contribution in https://github.com/storytold/photocraft/pull/6841
- @euisuh made their first contribution in https://github.com/storytold/photocraft/pull/6896
- @fjamesprice made their first contribution in https://github.com/storytold/photocraft/pull/6909
- @dangphuc2470 made their first contribution in https://github.com/storytold/photocraft/pull/6925
- @HyperionBurn made their first contribution in https://github.com/storytold/photocraft/pull/6946
- @theshubh77 made their first contribution in https://github.com/storytold/photocraft/pull/6974
- @Tungtono made their first contribution in https://github.com/storytold/photocraft/pull/6994
- @Jazz1-6 made their first contribution in https://github.com/storytold/photocraft/pull/7112
- @RehanKhatkar made their first contribution in https://github.com/storytold/photocraft/pull/7174
- @ametadot made their first contribution in https://github.com/storytold/photocraft/pull/7215
- @Fazmin made their first contribution in https://github.com/storytold/photocraft/pull/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: https://github.com/storytold/photocraft/compare/v0.12.0...v0.13.0
PhotoCraft v0.12.0
From docs/scorecard.md (done / partial / missing):
| Area | v0.11.1 | v0.12.0 |
|---|---|---|
| Tools | 33 / 11 / 0 | 36 / 8 / 0 |
| File compatibility | 7 / 14 / 6 | 9 / 12 / 6 |
| Type | 4 / 3 / 2 | 5 / 3 / 1 |
| Workspace and UI | 13 / 6 / 4 | 13 / 7 / 3 |
| Open bugs | 29 / 2 / 1 | 31 / 1 / 0 |
- Now done: Content-Aware Move with a coarse-then-exact preview for large selections; shape Density/Feather and mask Density/Feather in Properties; Export As Nearest Neighbor resample; large-file fixtures (20 MP, 150 layers, 2 GB PSD, 4 GB PSB); Warp Text opens with the layer's warp and previews live; retouch-tool mask/channel targeting tests; selection modifiers pressed before the drag.
- Moved up: Alt+wheel zoom (missing → partial); live stroke preview now covers Pattern Stamp, Background Eraser and Color Replacement; Smart Filters map 41 filters to PSD (was 14); tool options and per-tool brushes persist across restarts.
- Settings that do nothing: 24 of 171 (was 25 of 169).
- Performance: no change to the 2026-10-05 baseline (3 within budget, 22 over). Added scenarios P20, P62 and P63 (2 GB PSD, 4–5 GB PSB, 3.1 GP New Document), not run yet.
- Corpus floors: unchanged.
FreeBSD aarch64 is not in this release: the shared release pipeline dropped it for every Craft app until it builds in time (storytold/craft-common-actions#40). FreeBSD x86_64 is included.
- docs: add SonarCloud and CodeRabbit badges to README by @dylanmtaylor in https://github.com/storytold/photocraft/pull/7429
- Skip CodeRabbit reviews on Dependabot PRs by @echelon in https://github.com/storytold/photocraft/pull/7991
- Codecs: save DDS textures, uncompressed or BC1–BC3, with optional mipmaps (#1327) by @guillehr2 in https://github.com/storytold/photocraft/pull/5993
- Integration batch: 26 PRs from the known-issues list (#7973) on main by @aiongg in https://github.com/storytold/photocraft/pull/8094
- Group all selected layers from the Layers panel footer by @carterwsmith in https://github.com/storytold/photocraft/pull/7225
- Web: start when the server already inflated the app's gzip part (Apache mod_mime_magic) (#7639) by @Korg1ch in https://github.com/storytold/photocraft/pull/7683
- Give a new type layer a full Txt2 object and its own frame by @Silvertree2010 in https://github.com/storytold/photocraft/pull/7773
- Choose the graphics adapter on multi-GPU Linux machines (#1885) by @readtedium in https://github.com/storytold/photocraft/pull/7813
- Print: Portrait and Landscape in the Print dialog on Windows by @ToastyStoemp in https://github.com/storytold/photocraft/pull/7847
- Indexed GIF opens in Indexed Color with its colour table, as in Photoshop (#7886) by @Korg1ch in https://github.com/storytold/photocraft/pull/7892
- Preserve near-black ICC colors on the GPU canvas by @ha1des in https://github.com/storytold/photocraft/pull/7964
- fix(ui): wire video menu pickers/dialogs and fix Timeline Stop playback by @onicafe in https://github.com/storytold/photocraft/pull/3223
- Large documents: a gigapixel New Document draws without freezing (#4017) by @davidmann4 in https://github.com/storytold/photocraft/pull/5111
- perf(retouch): row-parallel Blur/Sharpen dabs, 2.6-3.3x faster strokes (#5426) by @JuanAntonioRC in https://github.com/storytold/photocraft/pull/5499
- Preserve editable clipboard contents when native reads fail by @jonathanwxh-cell in https://github.com/storytold/photocraft/pull/5587
- Snap: View › Snap off also disables smart-guide snapping (#5782) by @nrq6993-a11y in https://github.com/storytold/photocraft/pull/5803
- Batch: Format "Same" saves camera raws as PSD instead of failing (#5799) by @Higgs32584 in https://github.com/storytold/photocraft/pull/5857
- fix(tablet): support stylus barrel button and brush resize on Windows (#5905, #5364) by @Anim86 in https://github.com/storytold/photocraft/pull/6195
- Reveal newly created selections after hiding Extras by @jonathanwxh-cell in https://github.com/storytold/photocraft/pull/6222
- Windows: PhotoCraft starts without Windows.Data.Pdf.dll (#5884) by @Higgs32584 in https://github.com/storytold/photocraft/pull/6395
- macOS: list fonts activated outside the font folders (#6683) by @odgrim in https://github.com/storytold/photocraft/pull/6693
- fix(ui): disable Batch without a recorded action by @Elements2720 in https://github.com/storytold/photocraft/pull/6711
- Windows: maximized window lets an auto-hidden taskbar show (#4845) by @Higgs32584 in https://github.com/storytold/photocraft/pull/6878
- Pen: a finished path keeps its anchor squares on screen (#6884) by @Higgs32584 in https://github.com/storytold/photocraft/pull/6920
- Mixer Brush: Clean Brush empties the brush, and the automatic Load and Clean can be switched off by @dotCooCoo in https://github.com/storytold/photocraft/pull/6939
- Brushes: accept .abr files up to 1 GiB by @dgliwa in https://github.com/storytold/photocraft/pull/7180
- GPU startup: Auto on Windows leaves Vulkan out when an Intel adapter is present (#4) by @dotCooCoo in https://github.com/storytold/photocraft/pull/7217
- fix(psd): an edited type layer keeps its Txt2 object instead of a bare stub (#6968) by @Higgs32584 in https://github.com/storytold/photocraft/pull/7220
- Paragraph panel: grey the justify buttons on point text (#7713) by @hectorviov in https://github.com/storytold/photocraft/pull/7728
- Integration batch: 9 PRs on main by @aiongg in https://github.com/storytold/photocraft/pull/8095
- PSD: save Indexed Color, Bitmap and Duotone documents in their own mode by @switch87 in https://github.com/storytold/photocraft/pull/4816
- PSD: render constant RGB noise gradient fills by @Elvis33LE in https://github.com/storytold/photocraft/pull/6272
- perf(compose, gpu): many-layer composites, P60/P61 on the GPU 111 -> 28 ms by @ArintonAkos in https://github.com/storytold/photocraft/pull/7566
- perf(compose): Reuse bounded scratch and tone tables by @reneleonhardt in https://github.com/storytold/photocraft/pull/7693
- PSB save: 8-byte-length global blocks use the 8B64 signature, so Photoshop opens the file (#7937) by @Korg1ch in https://github.com/storytold/photocraft/pull/7948
- Type: keep superscript and subscript when a text layer is re-rendered (#5645) by @vangel76 in https://github.com/storytold/photocraft/pull/5807
- PSD: read split ("quilt") warps of placed layers, so Replace Contents keeps their curvature (#4398) by @thangnm93 in https://github.com/storytold/photocraft/pull/6913
- ci: switch to shared nix workflow from craft-common-actions by @dylanmtaylor in https://github.com/storytold/photocraft/pull/6448
- Integration batch: 86 PRs on main by @aiongg in https://github.com/storytold/photocraft/pull/8271
- PSD: read colours stored as HSB (#6774) by @davidmann4 in https://github.com/storytold/photocraft/pull/6775
- Apply Image: write into the targeted layer mask (#6780) by @davidmann4 in https://github.com/storytold/photocraft/pull/6781
- Droplets: carry the actions that Conditional steps call (#6804) by @davidmann4 in https://github.com/storytold/photocraft/pull/6805
- Guides: ruler guide snapping rebuilds its targets when snap options change (#6858) by @davidmann4 in https://github.com/storytold/photocraft/pull/6859
- CLI batch: skip shell-only Save and view steps inside played action sets (#6860) by @davidmann4 in https://github.com/storytold/photocraft/pull/6861
- Image Size: Resolution with Resample on keeps the print size in physical units (#6979) by @davidmann4 in https://github.com/storytold/photocraft/pull/6980
- Control: ui.set rejects zoom, rotation, center and dockWidth beyond f32 range (#6988) by @davidmann4 in https://github.com/storytold/photocraft/pull/6989
- Channels: Multichannel conversion keeps the targeted channel (#7002) by @davidmann4 in https://github.com/storytold/photocraft/pull/7003
- Keyboard Shortcuts: switching sets keeps action function keys (#7004) by @davidmann4 in https://github.com/storytold/photocraft/pull/7005
- Timeline: a longer duration moves a work area that reached the old end (#7006) by @davidmann4 in https://github.com/storytold/photocraft/pull/7008
- Crop: Color Samplers scale with a W x H crop (#7012) by @davidmann4 in https://github.com/storytold/photocraft/pull/7013
- Actions: deleting an action removes its function key (#7014) by @davidmann4 in https://github.com/storytold/photocraft/pull/7015
- Automation: doc.save rejects a bad quality instead of ignoring or clamping it (#7023) by @davidmann4 in https://github.com/storytold/photocraft/pull/7024
- Automation: place and layer/data-set export by index keep the active document (#7025) by @davidmann4 in https://github.com/storytold/photocraft/pull/7026
- Transform Selection: an unknown reference point is an error (#7027) by @davidmann4 in https://github.com/storytold/photocraft/pull/7028
- Lens Correction: smart filters keep the exact focal length (#7029) by @davidmann4 in https://github.com/storytold/photocraft/pull/7030
- Match Zoom: matched views stay within each document's zoom range (#7036) by @davidmann4 in https://github.com/storytold/photocraft/pull/7037
- Crop: the turn readout never shows -0.0° or -180.0° (#7040) by @davidmann4 in https://github.com/storytold/photocraft/pull/7041
- Conditional Mode Change: "gray" as a single source mode matches Grayscale (#7042) by @davidmann4 in https://github.com/storytold/photocraft/pull/7044
- Layer Style: gradient overlay and stroke scale stay within 10-150 % (#7047) by @davidmann4 in https://github.com/storytold/photocraft/pull/7048
- Perspective Crop: a drag without area leaves no crop box (#7061) by @davidmann4 in https://github.com/storytold/photocraft/pull/7062
- PSD: Hue/Saturation export writes each triplet in its own slot (#7065) by @davidmann4 in https://github.com/storytold/photocraft/pull/7066
- Merge to HDR Pro and merged duplicates: the Background layer is a real Background (#7078) by @davidmann4 in https://github.com/storytold/photocraft/pull/7079
- Actions: an imported Crop step in a unit other than pixels is not applied as pixels (#7084) by @davidmann4 in https://github.com/storytold/photocraft/pull/7085
- Crop / Canvas Size: extending keeps the Background's hidden pixels (#7086) by @davidmann4 in https://github.com/storytold/photocraft/pull/7087
- Crop: in default mode, box Undo/Redo keeps the box in place (#7088) by @davidmann4 in https://github.com/storytold/photocraft/pull/7089
- Image Size: type keeps its pixel size when the resolution changes (#7124) by @davidmann4 in https://github.com/storytold/photocraft/pull/7125
- Perspective Crop: switching documents drops the pending box (#7130) by @davidmann4 in https://github.com/storytold/photocraft/pull/7131
- Crop: a refused crop keeps the frame for fixing (#7133) by @davidmann4 in https://github.com/storytold/photocraft/pull/7134
- Perspective Crop: W and H follow the Point/Pica Size preference (#7135) by @davidmann4 in https://github.com/storytold/photocraft/pull/7136
- Image: Trim and merged Duplicate report an error on documents over 2^30 px (#7223) by @davidmann4 in https://github.com/storytold/photocraft/pull/7224
- Crop: a W x H crop on an Indexed Color document resamples with Nearest Neighbor (#7722) by @davidmann4 in https://github.com/storytold/photocraft/pull/7723
- Crop: Undo/Redo grey out when the frame has no step left (#7730) by @davidmann4 in https://github.com/storytold/photocraft/pull/7731
- Crop: a lost Straighten release no longer hijacks the next drag (#7745) by @davidmann4 in https://github.com/storytold/photocraft/pull/7746
- Brush smoothing: catch-up compares the pose too, not only the position (#7747) by @davidmann4 in https://github.com/storytold/photocraft/pull/7748
- Crop: a typed ratio fits from the frame the edit started with (#7752) by @davidmann4 in https://github.com/storytold/photocraft/pull/7753
- Layer Style: a new Stroke is 1 px inside black, as in Photoshop (#7765) by @davidmann4 in https://github.com/storytold/photocraft/pull/7766
- History: panel menu, Step Forward/Backward and Clear History (#2966) by @davidmann4 in https://github.com/storytold/photocraft/pull/3534
- History: set the History Brush source from the panel (history.setSource) (#2966) by @davidmann4 in https://github.com/storytold/photocraft/pull/3536
- Pattern Stamp and Background Eraser draw live; Spot Healing shows its heal area (TOOL-213-7, #3754) by @davidmann4 in https://github.com/storytold/photocraft/pull/3759
- Performance: brush dab on a CMYK document within budget (#5108) by @davidmann4 in https://github.com/storytold/photocraft/pull/5110
- Filters: Lens Correction, Adaptive Wide Angle and Camera Raw Filter respect locks on smart objects (#5621) by @davidmann4 in https://github.com/storytold/photocraft/pull/5622
- Layer masks: From Transparency and Mask All Objects convert the Background and match the document depth (#5679) by @davidmann4 in https://github.com/storytold/photocraft/pull/5680
- Fill layers: reject non-finite gradient angles and pattern angle/phase (#5752) by @davidmann4 in https://github.com/storytold/photocraft/pull/5753
- Paint: Lock Transparency blends source-atop on semi-transparent pixels (#5783) by @davidmann4 in https://github.com/storytold/photocraft/pull/5784
- PSD Multichannel: alpha channels are stored as-is, not as ink (#5790) by @davidmann4 in https://github.com/storytold/photocraft/pull/5791
- Effects: Gradient Overlay transparency follows Smoothness, midpoints and method (#1954) by @davidmann4 in https://github.com/storytold/photocraft/pull/5887
- PSD: Smart Sharpen and Dust & Scratches smart filters open and save like Photoshop (#6300) by @davidmann4 in https://github.com/storytold/photocraft/pull/6301
- PSD: Wind, Extrude and Tiles smart filters open and save like Photoshop (#6314) by @davidmann4 in https://github.com/storytold/photocraft/pull/6315
- Move tool: Ctrl-hover shows the distance to another layer (#4946) by @davidmann4 in https://github.com/storytold/photocraft/pull/6357
- PSD: Hue/Saturation smart filters open and save like Photoshop (#6267) by @davidmann4 in https://github.com/storytold/photocraft/pull/6398
- Layers: toggling a clipped adjustment damages only its base (#6535) by @davidmann4 in https://github.com/storytold/photocraft/pull/6640
- Hue/Saturation: the Lightness track runs black, grey, white (#6539) by @davidmann4 in https://github.com/storytold/photocraft/pull/6644
- Shortcuts: a command shortcut leaves the focused menu bar and runs (#6573) by @davidmann4 in https://github.com/storytold/photocraft/pull/6707
- Paths: Delete Path on a shape layer's path row deletes the layer (#6552) by @davidmann4 in https://github.com/storytold/photocraft/pull/6719
- Paths: drag a path row onto the Trash to delete it (#6553) by @davidmann4 in https://github.com/storytold/photocraft/pull/6721
- PSD: open an adjustment layer of an unknown type as an unsupported adjustment (#6575) by @davidmann4 in https://github.com/storytold/photocraft/pull/6722
- PSD: layered TIFF byte-order conversion reads the class of Idnt/indx references (#6764) by @davidmann4 in https://github.com/storytold/photocraft/pull/6765
- Fit Image: a width or height of 0 leaves that side unconstrained (#6766) by @davidmann4 in https://github.com/storytold/photocraft/pull/6767
- Actions: renaming an action updates the Conditional steps that call it (#6772) by @davidmann4 in https://github.com/storytold/photocraft/pull/6773
- Auto-Align: warp layer masks as masks, keeping what lies outside revealed (#6776) by @davidmann4 in https://github.com/storytold/photocraft/pull/6777
- PSD: layered TIFF byte-order conversion swaps every smart filter section (#6802) by @davidmann4 in https://github.com/storytold/photocraft/pull/6803
- Type: paragraph box handles are picked at the unsnapped press (#6819) by @davidmann4 in https://github.com/storytold/photocraft/pull/6822
- Stamp Down keeps the lower layer's clipping, label and link (#6999) by @davidmann4 in https://github.com/storytold/photocraft/pull/7001
- Crop: W x H x Resolution follows the Point/Pica Size preference (#7038) by @davidmann4 in https://github.com/storytold/photocraft/pull/7039
- Crop: Straighten is one box Undo step (#7127) by @davidmann4 in https://github.com/storytold/photocraft/pull/7128
- @guillehr2 made their first contribution in https://github.com/storytold/photocraft/pull/5993
- @readtedium made their first contribution in https://github.com/storytold/photocraft/pull/7813
- @ToastyStoemp made their first contribution in https://github.com/storytold/photocraft/pull/7847
- @Anim86 made their first contribution in https://github.com/storytold/photocraft/pull/6195
- @Elements2720 made their first contribution in https://github.com/storytold/photocraft/pull/6711
- @ArintonAkos made their first contribution in https://github.com/storytold/photocraft/pull/7566
- @thangnm93 made their first contribution in https://github.com/storytold/photocraft/pull/6913
Full Changelog: https://github.com/storytold/photocraft/compare/v0.11.1...v0.12.0
PhotoCraft v0.11.1
- perf(canvas): a Properties-panel adjustment drag refreshes only the view, 4.2× faster (#6839) by @skylartaylor in https://github.com/storytold/photocraft/pull/7155
- Linux: Reveal never hands xdg-open a file (#7166) by @Higgs32584 in https://github.com/storytold/photocraft/pull/7168
- Stack Mode: Kurtosis and Skewness give the same bits on Windows and Linux by @dotCooCoo in https://github.com/storytold/photocraft/pull/7126
- Content-Aware Fill workspace, as Photoshop's by @Unemars in https://github.com/storytold/photocraft/pull/2376
- perf(stack): one loop per statistic, up to 2.2× faster, bit for bit the same by @nicolasfalesy in https://github.com/storytold/photocraft/pull/7118
- Trap: refuse locked layers (#5623) by @davidmann4 in https://github.com/storytold/photocraft/pull/5624
- Lens Flare: don't darken 32-bit pixels above 1.0 (#5785) by @davidmann4 in https://github.com/storytold/photocraft/pull/5786
- Duotone: view and flat export clamp ink density like the Multichannel conversion (#6854) by @davidmann4 in https://github.com/storytold/photocraft/pull/6855
- Custom filter: in CMYK a positive offset brightens (#7076) by @davidmann4 in https://github.com/storytold/photocraft/pull/7077
- Measurement Scale: large pixel lengths print their real value (#7016) by @davidmann4 in https://github.com/storytold/photocraft/pull/7017
- Clamp filter.cameraRaw exposure to its documented -5..5 range by @Silvertree2010 in https://github.com/storytold/photocraft/pull/6876
- fix(engine): check the define-brush tip size multiply before reserving (wasm32) by @wwewtech in https://github.com/storytold/photocraft/pull/6902
- Ignore a leading UTF-8 BOM in variable data set CSV import by @Silvertree2010 in https://github.com/storytold/photocraft/pull/6485
- fix(engine): flip and rotate presets turn about the selection's bounds, as Free Transform does (#6928) by @Korg1ch in https://github.com/storytold/photocraft/pull/6967
- Actions: a Paint Bucket step keeps its explicit colour through .atn (#7199) by @Korg1ch in https://github.com/storytold/photocraft/pull/7208
- EXR: the ACEScg preference applies to every way of opening a file (#6782) by @davidmann4 in https://github.com/storytold/photocraft/pull/6783
- Type: Paste Lorem Ipsum inserts into the type layer named by "layer" (#5659) by @davidmann4 in https://github.com/storytold/photocraft/pull/5660
- Place Scale Marker: lay out the label in points, not pixels (#5754) by @davidmann4 in https://github.com/storytold/photocraft/pull/5755
- Fix generator spaced size keeping size text in asset file name by @Silvertree2010 in https://github.com/storytold/photocraft/pull/6628
- Stamp Visible fills an empty active pixel layer instead of adding another (#6785) by @MarekSpodBiedry in https://github.com/storytold/photocraft/pull/6828
- test(type): PostScript names guessed apart from their installed family resolve exactly by @FinnNk in https://github.com/storytold/photocraft/pull/5471
- GPU: a group's effect cache follows its vector mask and children's Blend If (#5706) by @davidmann4 in https://github.com/storytold/photocraft/pull/5707
- Pencil: a 1 px line paints the same pixels whichever end it starts from, at any Smoothing (#6336) by @Higgs32584 in https://github.com/storytold/photocraft/pull/6341
- Twirl, Pinch and Spherize fill the inscribed ellipse (#5643) by @Higgs32584 in https://github.com/storytold/photocraft/pull/5871
- Reject out-of-range leading, baseline shift and scales in type styles by @Silvertree2010 in https://github.com/storytold/photocraft/pull/6196
- Snapping: layer targets ignore the selection, so a moved selection snaps to guides and the document (#6290) by @davidmann4 in https://github.com/storytold/photocraft/pull/6355
- Krita: uncompressed tiles are read as interleaved pixels (#7082) by @davidmann4 in https://github.com/storytold/photocraft/pull/7083
- Fix GPU startup requests exceeding adapter limits by @Bortlesboat in https://github.com/storytold/photocraft/pull/6050
- Paste: an image pastes with Ctrl+V whichever key is let go first (#6329) by @Higgs32584 in https://github.com/storytold/photocraft/pull/6360
- fix(linux): file dialog probe sees a portal with no FileChooser backend (#5739) by @nicolasfalesy in https://github.com/storytold/photocraft/pull/6422
- Reject notes.set moves that make the popup non-finite by @Silvertree2010 in https://github.com/storytold/photocraft/pull/6174
- Document tab says "Quick Mask" in Quick Mask mode, as in Photoshop by @arnav-hiwarkar in https://github.com/storytold/photocraft/pull/6660
- Preset Manager: renaming or deleting a brush keeps the current preset and names consistent (#5681) by @davidmann4 in https://github.com/storytold/photocraft/pull/5682
- PSD: layer_tree_max_depth hoists layers under unclosed dividers past the cap (#5758) by @davidmann4 in https://github.com/storytold/photocraft/pull/5759
- Swatches: the .ase reader refuses files with more than 10,000 groups by @dotCooCoo in https://github.com/storytold/photocraft/pull/5811
- fix(io): exclude transparent palette entries for opaque PNG pixels by @0x6Ason in https://github.com/storytold/photocraft/pull/5869
- perf(psd): 8-bit merged composite unmattes through a table, not a division per sample (#5694) by @xsvm in https://github.com/storytold/photocraft/pull/6029
- Menus: rows scrolled out of view no longer open their submenus (#5896, #6225) by @davidmann4 in https://github.com/storytold/photocraft/pull/6356
- Check unclamped transform dimensions against the pixel budget by @denstu473 in https://github.com/storytold/photocraft/pull/6493
- Remove tool: every queued stroke is tinted in full (#6555) by @davidmann4 in https://github.com/storytold/photocraft/pull/6642
- Keep Color Sampler points on their pixel after flips and turns by @Silvertree2010 in https://github.com/storytold/photocraft/pull/6720
- Upload 16-bit layer masks as R16Float instead of R32Float by @Silvertree2010 in https://github.com/storytold/photocraft/pull/6845
- fix(ui): distinct Elliptical Marquee and Quick Selection icons (#6875) by @Higgs32584 in https://github.com/storytold/photocraft/pull/6917
- OpenRaster: layer locks no longer change silently on save (#7018) by @davidmann4 in https://github.com/storytold/photocraft/pull/7019
- fix(ui): Ctrl/Cmd-drag in the Navigator zooms to the drawn rectangle, as in Photoshop (#6872) by @Korg1ch in https://github.com/storytold/photocraft/pull/7140
- Menus: one checkmark column keeps every label aligned (#5705) by @davidmann4 in https://github.com/storytold/photocraft/pull/5809
- fix(codecs): keep EXR color channels within one layer by @0x6Ason in https://github.com/storytold/photocraft/pull/5866
- Focus font search when opening the picker by @carterwsmith in https://github.com/storytold/photocraft/pull/7222
- Assign Profile and Convert to Profile: Preview, as in Photoshop; "Black Point Compensation" spelled out by @ingling in https://github.com/storytold/photocraft/pull/6825
- Korean: consistent terms in the Gradient Editor, Object Selection messages and shortcut hints by @junhyun-dev in https://github.com/storytold/photocraft/pull/6882
- docs: write product name as PhotoCraft in engine docs, LUT export header and image sources by @wwewtech in https://github.com/storytold/photocraft/pull/5454
- Saving onto a dangling symlink writes through to its target (#6605) by @mroxso in https://github.com/storytold/photocraft/pull/6649
- Document tabs: keep whole names, hide what doesn't fit, list every document in the » menu by @marcoarnulfo in https://github.com/storytold/photocraft/pull/4525
- Translate the brush size and hardness shortcut rows in every language (#6742) by @MarekSpodBiedry in https://github.com/storytold/photocraft/pull/6831
- i18n(uk): translate color picker titles and rasterization warnings by @PerchAnton in https://github.com/storytold/photocraft/pull/6153
- Tests: fix the flaky file-lock tests and the occasional portal_save hang by @echelon in https://github.com/storytold/photocraft/pull/7418
- Fix nested Free Transform preview isolation by @driftee in https://github.com/storytold/photocraft/pull/7280
- Open Photoshop guides stored in a JPEG's APP13 resources (#7300) by @MarekSpodBiedry in https://github.com/storytold/photocraft/pull/7348
- Centre stacked ruler digits and the Properties W/H/X/Y labels (#7314) by @MarekSpodBiedry in https://github.com/storytold/photocraft/pull/7349
- Esc leaves full screen with the Crop tool showing its default frame (#7315) by @MarekSpodBiedry in https://github.com/storytold/photocraft/pull/7350
- Crop and Straighten Photos keeps Duotone inks and is disabled for Indexed Color (#7354) by @davidmann4 in https://github.com/storytold/photocraft/pull/7355
- Tool Presets: + saves only the current tool's options (#7356) by @davidmann4 in https://github.com/storytold/photocraft/pull/7357
- Canvas Size: growing the canvas re-renders PSD fill layers (#7362) by @davidmann4 in https://github.com/storytold/photocraft/pull/7363
- Rotate Canvas Arbitrary: keep the angle at full precision, so rotated crops land on the pixel (#7369) by @davidmann4 in https://github.com/storytold/photocraft/pull/7370
- Image Rotation: Arbitrary keeps Color Sampler points on their pixel (#7372) by @davidmann4 in https://github.com/storytold/photocraft/pull/7373
- Spot Healing Brush trail is Photoshop's dark half-opaque tint (#7342) by @wanikhawar in https://github.com/storytold/photocraft/pull/7374
- Crop: Esc and Enter go to an open options bar popup first (#7386) by @davidmann4 in https://github.com/storytold/photocraft/pull/7388
- Refuse strict ATN export of Close with an explicit document target by @Silvertree2010 in https://github.com/storytold/photocraft/pull/7393
- Save Actions ATN files atomically so a failed write keeps the old file by @Silvertree2010 in https://github.com/storytold/photocraft/pull/7403
- Raw tone curve: no NaN between a knot at black and the next one by @Unemars in https://github.com/storytold/photocraft/pull/7416
- Camera Raw histogram: spikes run off the top, as in Photoshop's Camera Raw by @Unemars in https://github.com/storytold/photocraft/pull/7419
- Keep fractional translation-only Free Transform on .atn import by @Silvertree2010 in https://github.com/storytold/photocraft/pull/7401
- Integration batch: 19 PRs on main by @aiongg in https://github.com/storytold/photocraft/pull/7405
- fix(svg): budget rasterised fallback layers across imports by @Ni-zav in https://github.com/storytold/photocraft/pull/5671
- Retouch: bound every stroke command before its dense buffers (#4961, #6110) by @saad-mughal435 in https://github.com/storytold/photocraft/pull/5992
- Help › Search: typed letters go to the field, not to menu mnemonics (fixes #5996) by @itsF4LCON in https://github.com/storytold/photocraft/pull/6030
- Image Size: Indexed Color resamples with Nearest Neighbor only (fixes #6019) by @itsF4LCON in https://github.com/storytold/photocraft/pull/6035
- Type: Korean paragraph text wraps between words, not syllables (fixes #5959) by @itsF4LCON in https://github.com/storytold/photocraft/pull/6038
- Window › Arrange: tiles keep their documents, and every tile has rulers (fixes #6017) by @itsF4LCON in https://github.com/storytold/photocraft/pull/6039
- Replace Color: the sample eyedropper is armed when the dialog opens (fixes #6279) by @itsF4LCON in https://github.com/storytold/photocraft/pull/6335
- Smart filters: an edited filter's dialog previews again (fixes #6324) by @itsF4LCON in https://github.com/storytold/photocraft/pull/6338
- Replace Color: a Result swatch whose Color Picker sets the sliders (fixes #6278) by @itsF4LCON in https://github.com/storytold/photocraft/pull/6344
- File › Open: a file type filter per format (fixes #6337) by @itsF4LCON in https://github.com/storytold/photocraft/pull/6346
- Type: the text caret shows on a white background (part of #6085) by @itsF4LCON in https://github.com/storytold/photocraft/pull/6366
- Brush: the Dual Brush tip keeps its proportion at tiny main sizes (#4809) by @davidmann4 in https://github.com/storytold/photocraft/pull/6399
- Automation: a control token authenticates in either letter case (#6425) by @switch87 in https://github.com/storytold/photocraft/pull/6476
- Desktop: a control/automation flag without its value is a usage error (#6429) by @mroxso in https://github.com/storytold/photocraft/pull/6499
- Engine: reject numeric overflow before document edits by @PerchAnton in https://github.com/storytold/photocraft/pull/6502
- Character and Paragraph panels: size, leading, baseline shift and indents follow the Type units preference by @marcoarnulfo in https://github.com/storytold/photocraft/pull/6505
- Refuse Affinity spot colours nested more than 4 levels deep by @jonathanwxh-cell in https://github.com/storytold/photocraft/pull/6506
- Integration batch: 11 PRs on main by @aiongg in https://github.com/storytold/photocraft/pull/7432
- Native format: refuse a .pcraft with out-of-range numbers when it is opened (#6862) by @davidmann4 in https://github.com/storytold/photocraft/pull/6863
- Render Video: GIF frame delay follows timelines under 1 fps (#7045) by @davidmann4 in https://github.com/storytold/photocraft/pull/7046
- Perspective Crop and Rotate Arbitrary keep the Background opaque (#7138) by @davidmann4 in https://github.com/storytold/photocraft/pull/7139
- perf(camera-raw): Shadows/Highlights 1.5× faster, bit for bit the same by @nicolasfalesy in https://github.com/storytold/photocraft/pull/7141
- Count tool: deleting an earlier count group keeps the active group (#5653) by @davidmann4 in https://github.com/storytold/photocraft/pull/5654
- Count: reject unknown groups instead of adding markers to the wrong group by @chrisgleissner in https://github.com/storytold/photocraft/pull/6003
- fix(path): validate Make Selection options and guard selection state by @Ni-zav in https://github.com/storytold/photocraft/pull/6046
- Plug-ins: running a filter plug-in respects layer locks (#6770) by @davidmann4 in https://github.com/storytold/photocraft/pull/6771
- Object Selection: enclosed background gaps stay unselected, only object-like holes fill (#6556) by @MarekSpodBiedry in https://github.com/storytold/photocraft/pull/6834
- perf(canvas): report how long the GPU spends on a composite by @skylartaylor in https://github.com/storytold/photocraft/pull/7275
- Color panel field fills its group in a custom workspace too by @aiongg in https://github.com/storytold/photocraft/pull/7477
- ci: configure Dependabot for Cargo and GitHub Actions by @dylanmtaylor in https://github.com/storytold/photocraft/pull/7475
- Preferences: the settings fill the resized dialog, buttons at the bottom (#7420) by @skylartaylor in https://github.com/storytold/photocraft/pull/7462
- Tests: the slow-job frame loop test waits for the worker's progress message by @dotCooCoo in https://github.com/storytold/photocraft/pull/7424
- Tests: the authentication deadline test writes its first line before the deadline starts by @dotCooCoo in https://github.com/storytold/photocraft/pull/7428
- Font menu: hovering a font no longer grows its row and makes the list jump (#7406) by @Korg1ch in https://github.com/storytold/photocraft/pull/7425
- Font field: ↑/↓ step through the fonts after a pick, as in Photoshop (#7407) by @Korg1ch in https://github.com/storytold/photocraft/pull/7426
- Fix clipped ancestors in nested transform previews by @driftee in https://github.com/storytold/photocraft/pull/7438
- file.saveACopy refuses the document's own file without "overwrite" (#7437) by @wanikhawar in https://github.com/storytold/photocraft/pull/7456
- Replacing selected type keeps its size by @hodd1444 in https://github.com/storytold/photocraft/pull/7457
- Fade: restore uniformly inverted layer masks (#7383) by @Ni-zav in https://github.com/storytold/photocraft/pull/7463
- Remove: cancel queued strokes when the paint target changes (#7380) by @Ni-zav in https://github.com/storytold/photocraft/pull/7464
- Fix/7381 action worker failure 20261018t2254jkt by @Ni-zav in https://github.com/storytold/photocraft/pull/7465
- Make .pcraft reload f64 coordinates bit-exact by @Silvertree2010 in https://github.com/storytold/photocraft/pull/7498
- perf(canvas): composite and upload an inline filter preview once (#7490) by @wanikhawar in https://github.com/storytold/photocraft/pull/7501
- fix(shortcuts): plain , and ; bindings follow the typed character on AZERTY by @Byxis in https://github.com/storytold/photocraft/pull/7521
- image.crop: accept whole-number float targetWidth/targetHeight (#7551) by @davidmann4 in https://github.com/storytold/photocraft/pull/7552
- Filters: normalize nonpositive explicit tile sizes (#7493) by @bommerts in https://github.com/storytold/photocraft/pull/7554
- Perspective Crop: draw the crop quad's side of the horizon (#7557) by @davidmann4 in https://github.com/storytold/photocraft/pull/7558
- Refuse strict .atn export of plain events whose target is not the layer pixels by @Silvertree2010 in https://github.com/storytold/photocraft/pull/7564
- Print: the last print's settings survive a relaunch, as in Photoshop (#7410) by @Korg1ch in https://github.com/storytold/photocraft/pull/7526
- Type: right-click on committed text opens the type layer menu (#7324) by @jlange91 in https://github.com/storytold/photocraft/pull/7430
- Save for Web and Quick Export: "All" keeps the photo's EXIF by @marcoarnulfo in https://github.com/storytold/photocraft/pull/7471
- Curves: Cmd/Ctrl-click on the image adds a point at the pixel's tone by @marcoarnulfo in https://github.com/storytold/photocraft/pull/7473
- Preferences: Enable Gestures off ignores touch-screen pinch and twist (#204) by @KLBMinhLong in https://github.com/storytold/photocraft/pull/7478
- Edit: Copy with no selection keeps fill and adjustment layers (#2344) by @odgrim in https://github.com/storytold/photocraft/pull/7497
- Lens Blur: an alpha channel as the depth map source, as in Photoshop (#7400) by @Korg1ch in https://github.com/storytold/photocraft/pull/7508
- docs: add user docs in docs/user by @itrycodinganditsbad in https://github.com/storytold/photocraft/pull/3951
- Save: keep the replaced file's metadata by @skylartaylor in https://github.com/storytold/photocraft/pull/7206
- Integration batch: 12 PRs on main by @aiongg in https://github.com/storytold/photocraft/pull/7569
- Smart Filters: deleting the last filter removes its filter mask (#5619) by @davidmann4 in https://github.com/storytold/photocraft/pull/5620
- Image > Adjustments: locked smart objects refuse new smart filters (#5655) by @davidmann4 in https://github.com/storytold/photocraft/pull/5656
- Brush smoothing: the lagging brush keeps the pressure of where it is (#5713) by @Higgs32584 in https://github.com/storytold/photocraft/pull/5726
- Menu bar: zooming with Alt+scroll, then holding Space to pan, no longer opens New Document by @artman67 in https://github.com/storytold/photocraft/pull/6256
- fix(engine): refuse a Content-Aware Fill with nothing to sample instead of filling black (#6532) by @Korg1ch in https://github.com/storytold/photocraft/pull/6670
- Presets: refuse renaming a group to a name another group has (#6768) by @davidmann4 in https://github.com/storytold/photocraft/pull/6769
- Image Size: a gradient fill's centre offset stays a fraction of the frame (#6778) by @davidmann4 in https://github.com/storytold/photocraft/pull/6779
- Mesh warp: about twice as fast, same pixels (tiles encoded in parallel, direct in-bounds reads) (#1015) by @ianswope in https://github.com/storytold/photocraft/pull/6800
- Transform: drop a fill layer's cached render when its frame changes (#6808) by @davidmann4 in https://github.com/storytold/photocraft/pull/6809
- Artboards to Files: paths, notes, slices and marks move with the board (#7010) by @davidmann4 in https://github.com/storytold/photocraft/pull/7011
- Video: Interpret Footage and New Video Layer from File reject an invalid frame rate (#5657) by @davidmann4 in https://github.com/storytold/photocraft/pull/5658
- PNG: keep a stereo file's sTER pairing on save (#6063) by @mroxso in https://github.com/storytold/photocraft/pull/6285
- fix(actions): flush pending recorded steps on save (#7193) by @seotarek in https://github.com/storytold/photocraft/pull/7244
- Show File Name In Title: hide the file name from the title bar (#5037) by @mroxso in https://github.com/storytold/photocraft/pull/5129
- Actions: Photoshop Shadows/Highlights steps play (#5830) by @Higgs32584 in https://github.com/storytold/photocraft/pull/5854
- Free Transform: show a flip as -100 % on the flipped axis (#7749) by @davidmann4 in https://github.com/storytold/photocraft/pull/7750
- Type: formatting commands respect Lock All (#7718) by @davidmann4 in https://github.com/storytold/photocraft/pull/7720
- Docs: install the CLI and register it with MCP clients by @KnottyDyes in https://github.com/storytold/photocraft/pull/7663
- refactor: use photocraft-color's srgb transfer functions in algo and proof simulation by @osaidahmed in https://github.com/storytold/photocraft/pull/7604
- Layers: ⌘-click on the Background thumbnail is a plain click, as in Photoshop by @Unemars in https://github.com/storytold/photocraft/pull/7165
- Minimum / Maximum: CMYK spreads paper white with Maximum, ink with Minimum (#7074) by @davidmann4 in https://github.com/storytold/photocraft/pull/7075
- Export and import saved tool presets (#6560) by @vbasky in https://github.com/storytold/photocraft/pull/6889
- Fix live gradient fill scale limits to match OG program by @nanopink in https://github.com/storytold/photocraft/pull/6797
- Histogram: count the document's pixels, not a blurred thumbnail (#6538) by @davidmann4 in https://github.com/storytold/photocraft/pull/6724
- Affinity: bound compound geometry expansion and reject cycles by @PerchAnton in https://github.com/storytold/photocraft/pull/6486
- Color Settings: the working-space menus list the installed profiles of their space (#6323) by @Higgs32584 in https://github.com/storytold/photocraft/pull/6359
- Scripts: Flatten All Layer Effects bakes with the document's Global Light and patterns (#5719) by @davidmann4 in https://github.com/storytold/photocraft/pull/5720
- Gradient Overlay: repaint the whole layer when a stroke moves its frame (#4053) by @davidmann4 in https://github.com/storytold/photocraft/pull/5340
- Add Liquify's Show Backdrop Use and Mode (#7609) by @hectorviov in https://github.com/storytold/photocraft/pull/7644
- Actions: Smart Blur quality uses Photoshop's SBQL/SBQM/SBQH codes (#6312) by @davidmann4 in https://github.com/storytold/photocraft/pull/6313
- Color Lookup: warn when it opens without its usable table (part of #1763) by @ahmedhosnypro in https://github.com/storytold/photocraft/pull/6322
- Crop: a preset picked in Tool Presets fits the frame to its ratio (#7143) by @davidmann4 in https://github.com/storytold/photocraft/pull/7144
- Actions: a function key can take Shift and Command (#7646) by @hectorviov in https://github.com/storytold/photocraft/pull/7674
- perf(photomerge): build multi-band bands in bounded batches (#7758) by @wanikhawar in https://github.com/storytold/photocraft/pull/7763
- Guides: colours follow Crop, Canvas Size and rotations (#7724) by @davidmann4 in https://github.com/storytold/photocraft/pull/7725
- Keep arbitrary canvas rotation interpolation in ATN export by @Silvertree2010 in https://github.com/storytold/photocraft/pull/7630
- Type: a click inside the paragraph box off the glyphs moves the caret by @zrsix1 in https://github.com/storytold/photocraft/pull/7606
- Presets: Migrate Presets reads tool presets like the launch loader (#7375) by @davidmann4 in https://github.com/storytold/photocraft/pull/7376
- fix(linux): keep crash-recovery autosaves in $XDG_STATE_HOME, out of the config folder (#6612) by @Korg1ch in https://github.com/storytold/photocraft/pull/6941
- Hide the Hyphenate checkbox until layout hyphenates (#6710) by @vbasky in https://github.com/storytold/photocraft/pull/6869
- Disable Save for Web while a Free Transform is pending (#6737) by @MarekSpodBiedry in https://github.com/storytold/photocraft/pull/6832
- Layer Mask Properties: the Feather slider has fine steps near 0 px, as in Photoshop (#6545) by @marcoarnulfo in https://github.com/storytold/photocraft/pull/6727
- GPU canvas: redraw mip levels of 128 px or less whole; fixes AMD Vulkan corruption after partial updates (#6418) by @00xJS in https://github.com/storytold/photocraft/pull/6438
- Free Transform: W and H take a typed length in percent view (#6284) by @davidmann4 in https://github.com/storytold/photocraft/pull/6293
- fix(engine): keep layer-based slices when duplicating a document by @osaidahmed in https://github.com/storytold/photocraft/pull/6133
- refactor(engine): drop the second damage pass after single-edit duplicates and pastes by @FinnNk in https://github.com/storytold/photocraft/pull/5880
- Tools: Sample All Layers is each tool's own, as in Photoshop (#5524) by @wanikhawar in https://github.com/storytold/photocraft/pull/5570
- Actions: Apply Layer Comp is recorded by the comp's name, so it plays in any document (#7181) by @Korg1ch in https://github.com/storytold/photocraft/pull/7790
- Reject exporting a partial Play Action call to .atn by @Silvertree2010 in https://github.com/storytold/photocraft/pull/7602
- refactor(algo): route the splitmix64 copies through one function by @osaidahmed in https://github.com/storytold/photocraft/pull/7603
- Explain the Memory Usage budget and GPU caps (#6546) by @vbasky in https://github.com/storytold/photocraft/pull/6892
- Actions: export Box Blur, Surface Blur, Flatten Image and Black & White under ids Photoshop runs (#6330) by @davidmann4 in https://github.com/storytold/photocraft/pull/6331
- Home screen: fit the card and stack the buttons in a narrow window by @TaylorBurke in https://github.com/storytold/photocraft/pull/5774
- perf(codecs): Avoid redundant PNG filter passes by @reneleonhardt in https://github.com/storytold/photocraft/pull/7690
- Crop: a ui.pointer click on the frame leaves it alone (#7740) by @davidmann4 in https://github.com/storytold/photocraft/pull/7741
- Apply background jobs to the layers they started on by @Silvertree2010 in https://github.com/storytold/photocraft/pull/7620
- Print: Save as PDF gets a Browse… button (#5328) by @Higgs32584 in https://github.com/storytold/photocraft/pull/7586
- Reveal All: one History step named "Reveal All" (#7145) by @davidmann4 in https://github.com/storytold/photocraft/pull/7147
- Crop: Enter during a drag ends the drag (#7055) by @davidmann4 in https://github.com/storytold/photocraft/pull/7056
- fix(psd): make packbits::decode_into crate-private and overflow-safe by @FinnNk in https://github.com/storytold/photocraft/pull/6950
- Content-Aware Fill: preview at full resolution so it matches the result (#6530) by @MarekSpodBiedry in https://github.com/storytold/photocraft/pull/6838
- Actions: loading a set renames each Play target once (#6806) by @davidmann4 in https://github.com/storytold/photocraft/pull/6807
- Preferences: a wrongly typed value resets only that field (#6611) by @davidmann4 in https://github.com/storytold/photocraft/pull/6641
- Guides: Ctrl/Cmd drags a guide with every tool that moves guides, and the cursor shows it (#6288) by @davidmann4 in https://github.com/storytold/photocraft/pull/6294
- PSD save: check the Background's opacity without copying the canvas by @persi-man in https://github.com/storytold/photocraft/pull/5998
- Flatpak on Wayland: say why a paste finds nothing, and how to paste anyway (#5031) by @nicolasfalesy in https://github.com/storytold/photocraft/pull/5279
- fix(engine): apply document-wide image and colour conversions to stored video frames (#4956) by @MarekSpodBiedry in https://github.com/storytold/photocraft/pull/5078
- Crop: a turned crop rotates only what the frame keeps (#5006) by @davidmann4 in https://github.com/storytold/photocraft/pull/5007
- Toolbar: Edit Toolbar, Quick Mask and Screen Mode in every theme by @marcoarnulfo in https://github.com/storytold/photocraft/pull/4680
- Layered TIFF: Photoshop opened only the composite of a many-layer file (PSB-style layer data) by @llduyll10 in https://github.com/storytold/photocraft/pull/5514
- docs: regenerate the scorecard after today's landings by @echelon in https://github.com/storytold/photocraft/pull/7829
- Integration batch: 8 PRs on main by @aiongg in https://github.com/storytold/photocraft/pull/7823
- Limit blend-mode hover refreshes to the visible canvas region by @jonathanwxh-cell in https://github.com/storytold/photocraft/pull/5413
- perf: chisel bevel size changes, CPU passes on threads and GPU fields share their sharp edges (results unchanged) by @xsvm in https://github.com/storytold/photocraft/pull/5477
- PSD: keep guide resources 1092/1097 only while they match the guides (#5966) by @bramheerink in https://github.com/storytold/photocraft/pull/5976
- Brushes: importing an .abr file numbers repeated brush names in linear time by @dotCooCoo in https://github.com/storytold/photocraft/pull/5984
- fix(perf): validate regression minimum threshold by @ersoynarin-code in https://github.com/storytold/photocraft/pull/6193
- perf(io): Interleave PSD pixels in the final buffer by @reneleonhardt in https://github.com/storytold/photocraft/pull/7691
- perf(raster): Avoid redundant default pixel work by @reneleonhardt in https://github.com/storytold/photocraft/pull/7692
- perf(text): rasterize a type layer's pixels on all cores, bit for bit the same by @ebosido444-ai in https://github.com/storytold/photocraft/pull/7022
- @Silvertree2010 made their first contribution in https://github.com/storytold/photocraft/pull/6876
- @Bortlesboat made their first contribution in https://github.com/storytold/photocraft/pull/6050
- @arnav-hiwarkar made their first contribution in https://github.com/storytold/photocraft/pull/6660
- @denstu473 made their first contribution in https://github.com/storytold/photocraft/pull/6493
- @ingling made their first contribution in https://github.com/storytold/photocraft/pull/6825
- @junhyun-dev made their first contribution in https://github.com/storytold/photocraft/pull/6882
- @driftee made their first contribution in https://github.com/storytold/photocraft/pull/7280
- @aiongg made their first contribution in https://github.com/storytold/photocraft/pull/7405
- @saad-mughal435 made their first contribution in https://github.com/storytold/photocraft/pull/5992
- @chrisgleissner made their first contribution in https://github.com/storytold/photocraft/pull/6003
- @hodd1444 made their first contribution in https://github.com/storytold/photocraft/pull/7457
- @Byxis made their first contribution in https://github.com/storytold/photocraft/pull/7521
- @jlange91 made their first contribution in https://github.com/storytold/photocraft/pull/7430
- @KLBMinhLong made their first contribution in https://github.com/storytold/photocraft/pull/7478
- @odgrim made their first contribution in https://github.com/storytold/photocraft/pull/7497
- @artman67 made their first contribution in https://github.com/storytold/photocraft/pull/6256
- @osaidahmed made their first contribution in https://github.com/storytold/photocraft/pull/7604
- @nanopink made their first contribution in https://github.com/storytold/photocraft/pull/6797
- @hectorviov made their first contribution in https://github.com/storytold/photocraft/pull/7644
- @zrsix1 made their first contribution in https://github.com/storytold/photocraft/pull/7606
- @TaylorBurke made their first contribution in https://github.com/storytold/photocraft/pull/5774
- @bramheerink made their first contribution in https://github.com/storytold/photocraft/pull/5976
- @ersoynarin-code made their first contribution in https://github.com/storytold/photocraft/pull/6193
- @ebosido444-ai made their first contribution in https://github.com/storytold/photocraft/pull/7022
Full Changelog: https://github.com/storytold/photocraft/compare/v0.10.0...v0.11.1
PhotoCraft v0.10.0
From docs/scorecard.md (done / partial / missing):
- Tools: 29 / 13 / 1 → 33 / 11 / 0. Done: per-control pressure curves, image files as brush tips, Pen Shift 45° constraints, arrow-key nudges bundled into one History state.
- File compatibility: 7 / 13 / 7 → 7 / 14 / 6; PDF save went from missing to partial (one flattened page with ICC).
- Corpus floors raised: Photoshop oracles 145 → 188 / 256, psd-tools 236 → 249 / 309, io corpus 146 → 148 / 170 (round-trip floors unchanged).
- Reliability: never-crash lints on 30 of 30 crates (was 28 of 28).
- Workspace and UI: unchanged at 13 / 6 / 4; settings that do nothing 26 of 168 (157 before, after new settings landed).
- Performance: two new scenarios tracked (P60/P61, layer opacity and visibility among 150 layers), not run yet; budgets met unchanged at 3 (baseline 2026-10-05).
- Keep channel pastes transactional when memory allocation fails by @vbasky in https://github.com/storytold/photocraft/pull/4588
- Bound selection sampling and report layer-buffer allocation failures by @vbasky in https://github.com/storytold/photocraft/pull/4594
- Gradient Map is driven by the W3C luminosity, as in Photoshop by @timothydaly1 in https://github.com/storytold/photocraft/pull/5018
- fix(layers): merging layers keeps pixels that lie outside the canvas (#5067) by @MarekSpodBiedry in https://github.com/storytold/photocraft/pull/5124
- Map .atn duplicate-into-new-document (Mk) to layer.duplicate by @abdul-karim-mia in https://github.com/storytold/photocraft/pull/5371
- Text: non-finite numbers and negative indices from PSD files are sanitized (#4429) by @vangel76 in https://github.com/storytold/photocraft/pull/4433
- feat(commands): find the Elliptical Marquee by 'ellipse' or 'marquee' by @switch87 in https://github.com/storytold/photocraft/pull/5140
- Linux: a virtual keyboard claiming BTN_TOOL_PEN no longer sends the window through Xwayland (#5284) by @dutraroberto in https://github.com/storytold/photocraft/pull/5295
- Fix/scale marker rollback layer state 4975 by @shmuelbiller1 in https://github.com/storytold/photocraft/pull/5391
- affinity: decoded layers are admitted against an aggregate pixel budget (#4960) by @lu123bing in https://github.com/storytold/photocraft/pull/5266
- ICC parser: checked arithmetic on offsets and counts from the file (#4976) by @Higgs32584 in https://github.com/storytold/photocraft/pull/5227
- GPU compositor: pattern textures are freed on close, when idle and over a budget (#4971) by @Higgs32584 in https://github.com/storytold/photocraft/pull/5232
- Performance: the lower-stack cache follows an edit up the stack (P9 / P11, #5286) by @davidmann4 in https://github.com/storytold/photocraft/pull/5288
- Expose shared Smart Object instances in inspection and replacement results by @jonathanwxh-cell in https://github.com/storytold/photocraft/pull/4832
- Free Transform: solid pixel stretch (edge-repeat sampling, selected-pixel bounds) (#3773) by @itrycodinganditsbad in https://github.com/storytold/photocraft/pull/3867
- feat(engine): layer.list, a read-only listing of the layer tree by @switch87 in https://github.com/storytold/photocraft/pull/5148
- PSD import: flat fallback respects the decode budget; checked sizes (#5200, #5202) by @vangel76 in https://github.com/storytold/photocraft/pull/5206
- Actions: record layer selections by name and display the target by @GamerWil26 in https://github.com/storytold/photocraft/pull/2441
- Color Balance: fold the tones into one Levels per channel (#3423) by @davidmann4 in https://github.com/storytold/photocraft/pull/5339
- IO: smart-object source sizes from WebP/GIF/BMP/EXR headers, not a full decode by @vangel76 in https://github.com/storytold/photocraft/pull/5216
- Compose: build effect-map layer identity once per render, not per tile (#4437) by @vangel76 in https://github.com/storytold/photocraft/pull/4438
- fix(brush): preserve Dual Brush tip spacing and scale its size with the primary brush by @Ni-zav in https://github.com/storytold/photocraft/pull/4856
- Font preview test: skip installed fonts whose Arabic glyphs are blank (#5259) by @zkm in https://github.com/storytold/photocraft/pull/5261
- ui: remove the title-bar Discord button by @mroxso in https://github.com/storytold/photocraft/pull/1737
- fix(windows): prefer WARP over GL to avoid black window (#5191) by @mjohnson7cd in https://github.com/storytold/photocraft/pull/5309
- fix(ui): make Preferences modal resizable on desktop by @Ni-zav in https://github.com/storytold/photocraft/pull/5170
- Color Range: sample colours outside the active selection (#5244) by @switch87 in https://github.com/storytold/photocraft/pull/5296
- fix(transform): keep masked objects visible during transform (#5239) by @mjohnson7cd in https://github.com/storytold/photocraft/pull/5319
- Canvas: themes without a dot pattern draw no dots texture (#4542) by @Higgs32584 in https://github.com/storytold/photocraft/pull/5093
- fix(ui): remove empty right column from Curves dialog by @VanTan666 in https://github.com/storytold/photocraft/pull/5160
- Frame tool: take type, shape and smart object layers into the frame (#4435) by @MarekSpodBiedry in https://github.com/storytold/photocraft/pull/4441
- perf(gpu): keep the DX12 mip scratch textures for Intel adapters only by @FinnNk in https://github.com/storytold/photocraft/pull/5354
- Display profile notice: one card for all displays without a usable profile by @nicolasfalesy in https://github.com/storytold/photocraft/pull/5312
- Type: hovering a font previews it with the Character section shown too (#5152) by @prekabreki in https://github.com/storytold/photocraft/pull/5222
- Number fields: centre the number in its box (#5150) by @prekabreki in https://github.com/storytold/photocraft/pull/5226
- fix(ui): Color Picker hex field accepts repeated pastes by @Pharbi in https://github.com/storytold/photocraft/pull/5398
- Edit › Menus: Menus, Keyboard Shortcuts, Preferences, Save and Exit can't be hidden (#5096) by @vangel76 in https://github.com/storytold/photocraft/pull/5183
- perf(ui): the Info panel composites its Color Sampler readouts once per revision (#4528) by @FinnNk in https://github.com/storytold/photocraft/pull/4753
- Show feathering in layer mask views by @imSlicedBread in https://github.com/storytold/photocraft/pull/5342
- fix(ui): give the Quick Selection tool its own icon (#5116) by @mroxso in https://github.com/storytold/photocraft/pull/5184
- fix(puppet-warp): drop open Puppet Warp and other distort sessions when the active document changes (#5092) by @MarekSpodBiedry in https://github.com/storytold/photocraft/pull/5123
- fix(ui): swatches touch with no padding, as in Photoshop (#5103) by @sabbirshawon in https://github.com/storytold/photocraft/pull/5253
- fix(ui): show brush tip thumbnails while dragging presets by @VanTan666 in https://github.com/storytold/photocraft/pull/5203
- Interface: hide the Home screen's recent files (#4382) by @vangel76 in https://github.com/storytold/photocraft/pull/4387
- Large document: large damage over the GPU budget redraws in the background; open warms layer bounds (#4024) by @syncroot in https://github.com/storytold/photocraft/pull/5083
- Layer styles: editing effects no longer re-enables a disabled effect list (#3648) by @notdezzi in https://github.com/storytold/photocraft/pull/3799
- Actions: a recorded File › Save of a flat file saves the file it is played on (#3531) by @vangel76 in https://github.com/storytold/photocraft/pull/3537
- fix(ui): guides draw over the Free Transform preview, under its box (#5086) by @sabbirshawon in https://github.com/storytold/photocraft/pull/5214
- Undo and redo Camera Raw adjustments from the keyboard. by @vbasky in https://github.com/storytold/photocraft/pull/4136
- Fix custom-frame maximization with a top taskbar by @FredApps in https://github.com/storytold/photocraft/pull/5237
- Start Free Transform after placing an image from the file picker by @jonathanwxh-cell in https://github.com/storytold/photocraft/pull/5390
- raster: a shifted surface copies in one pass per row without pre-filled tiles by @Elvis33LE in https://github.com/storytold/photocraft/pull/2667
- i18n(it): translate the 103 labels other catalogs added since #3742 by @fabiodalez-dev in https://github.com/storytold/photocraft/pull/4860
- History panel: the trash deletes the selected snapshot (#5324) by @davidmann4 in https://github.com/storytold/photocraft/pull/5325
- ACEScg: File Handling option opens colour-less EXR renders in the ACES working space by @Elvis33LE in https://github.com/storytold/photocraft/pull/4908
- Layer Style: Bevel & Emboss Technique dropdown (#5147) by @vangel76 in https://github.com/storytold/photocraft/pull/5181
- feat(ui): Darken and Lighten Interface (Ctrl/Cmd+Shift+F1, F2) by @FinnNk in https://github.com/storytold/photocraft/pull/3709
- Actions: Button Mode by @Zer0C00L01 in https://github.com/storytold/photocraft/pull/5213
- Embedded Profile Mismatch: profile names on the choices, and Remember this choice by @texjer in https://github.com/storytold/photocraft/pull/5208
- Posterize: 16-bit documents bin the 16-bit sample, as Photoshop does (two oracles pass) by @timothydaly1 in https://github.com/storytold/photocraft/pull/5267
- Groups: a pass-through clipping base with an adjustment renders isolated (passthrough_clipping_mask_adjustment passes) by @timothydaly1 in https://github.com/storytold/photocraft/pull/5272
- Threshold: split on Photoshop's luminosity of whole samples (threshold_rgb, threshold_16bits_rgb pass) by @timothydaly1 in https://github.com/storytold/photocraft/pull/5263
- Masks: feathers blur with exactly the feather's variance (mask-parameters-no-real-channel passes) by @timothydaly1 in https://github.com/storytold/photocraft/pull/5163
- 32-bit: legacy Brightness/Contrast, Channel Mixer, Photo Filter and B&W tint unclipped, as in Photoshop by @timothydaly1 in https://github.com/storytold/photocraft/pull/5011
- Free Transform: the box is the selection, and the marching ants follow it (#5297) by @Higgs32584 in https://github.com/storytold/photocraft/pull/5337
- Layers panel: filter-type dropdown with Kind, Name and Mode (#5048) by @zkm in https://github.com/storytold/photocraft/pull/5268
- Batch: Include All Subfolders (AUTO-219-5, #3753) by @davidmann4 in https://github.com/storytold/photocraft/pull/3758
- fix(ui): remember the selected tool between launches (Photoshop parity) by @david419kr in https://github.com/storytold/photocraft/pull/5043
- Brushes: import an image file as a brush tip (#3279) by @vangel76 in https://github.com/storytold/photocraft/pull/3292
- Brush Settings: a response curve per dynamic control (#3294) by @vangel76 in https://github.com/storytold/photocraft/pull/3302
- Pen tool: Shift constrains segments and handles to 45° (TOOL-214-10, #3751) by @davidmann4 in https://github.com/storytold/photocraft/pull/3756
- Levels: whole levels at every step and Photoshop's shadow toe (levels_rgb + stack oracle pass) by @timothydaly1 in https://github.com/storytold/photocraft/pull/5143
- Layers panel: Clip Thumbnails to Layer Bounds (#4281) by @badaaif in https://github.com/storytold/photocraft/pull/4312
- Lab: adjustment layers composite on the stored L, a and b (seven Lab oracles pass) by @timothydaly1 in https://github.com/storytold/photocraft/pull/5171
- feature(ui): added brushes panel dockable with floating option (#4262) by @peppepol in https://github.com/storytold/photocraft/pull/4603
- Modern Brightness/Contrast: Photoshop's brightness curve (six oracles pass) by @timothydaly1 in https://github.com/storytold/photocraft/pull/4722
- Resize cursors turn with the box and with a rotated or flipped view by @deadmeu in https://github.com/storytold/photocraft/pull/5188
- CMYK: Brightness/Contrast curves each ink, as Photoshop does by @timothydaly1 in https://github.com/storytold/photocraft/pull/4930
- CMYK: adjustment layers composite on the document's own inks (14 oracles pass) by @timothydaly1 in https://github.com/storytold/photocraft/pull/4945
- CMYK: Hue/Saturation and Color Balance keep the black ink by @timothydaly1 in https://github.com/storytold/photocraft/pull/5000
- fix(ui): snap distorted corners to visible guides by @zenjabba in https://github.com/storytold/photocraft/pull/3928
- feat(psd): editable Filter Gallery smart filters (Chrome) by @the-unknown in https://github.com/storytold/photocraft/pull/3426
- Curvature Pen: edit finished paths (drag, add, smooth/corner) with an adaptive cursor by @bazmarth in https://github.com/storytold/photocraft/pull/5197
- Blur Gallery: Iris Blur's pins and handles on the image (#3373) by @timothydaly1 in https://github.com/storytold/photocraft/pull/3822
- Posterize and Threshold commands use the 16-bit rules on 16-bit layers (fixes main) by @echelon in https://github.com/storytold/photocraft/pull/5711
- Shapes: on-canvas corner radius widgets for live rectangles (TOOL-214-12) by @bazmarth in https://github.com/storytold/photocraft/pull/5276
- Crop tool: Content-Aware fill of the area a rotated or extended crop uncovers (#3823) by @davidmann4 in https://github.com/storytold/photocraft/pull/3827
- Add Shift+scroll snap zoom to Photoshop zoom ladder levels by @cwshields in https://github.com/storytold/photocraft/pull/3695
- Menu bar from the keyboard: Alt / F10 focus, Alt+letter, underlined mnemonics (#4988) by @FabioLissi in https://github.com/storytold/photocraft/pull/5091
- Shortcuts: a command can answer a second key (F2/F3/F4, Shift+F7, Cmd++) (#3665) by @davidmann4 in https://github.com/storytold/photocraft/pull/3746
- feat(ui): select guides, the guide context menu and Edit Selected Guides by @FinnNk in https://github.com/storytold/photocraft/pull/3734
- Export As: exact pixel size, named presets, and profile options by @Zer0C00L01 in https://github.com/storytold/photocraft/pull/5344
- Arrow-key nudges: a run of nudges is one History state, with Tools preferences (#2259) by @Sir-Starch in https://github.com/storytold/photocraft/pull/2764
- Blur Gallery: Tilt-Shift and Spin Blur on the image (#3373) by @timothydaly1 in https://github.com/storytold/photocraft/pull/3829
- i18n(es): complete dynamic UI translations by @gorevyoneticisi in https://github.com/storytold/photocraft/pull/4306
- Vector: bound flattening memory, keep over-budget dashes, cheaper edge build (#5195) by @vangel76 in https://github.com/storytold/photocraft/pull/5204
- fix: limit Render Video timeline and GIF staging allocations by @Ni-zav in https://github.com/storytold/photocraft/pull/5670
- fix(export): prompt for a Render Video output directory (#3365) by @Ni-zav in https://github.com/storytold/photocraft/pull/3378
- fix(ui): avoid overflow when allocating layer style instance IDs by @Ni-zav in https://github.com/storytold/photocraft/pull/4884
- fix(doc): variable definitions follow layer id remapping on copy and load by @mroxso in https://github.com/storytold/photocraft/pull/5023
- fix(raw): reject truncated or oversized Deflate tiles in DNG import (#4977) by @MarekSpodBiedry in https://github.com/storytold/photocraft/pull/5072
- fix(history): count fill caches and smart filter masks in undo memory (#4972) by @MarekSpodBiedry in https://github.com/storytold/photocraft/pull/5075
- fix(ui): keep the close prompt up when a Save Document script edits the document after saving (#4953) by @MarekSpodBiedry in https://github.com/storytold/photocraft/pull/5081
- fix(geom): clamp huge sizes in Rect::from_xywh instead of wrapping, and saturate TileCoord::rect by @saadkhantareen in https://github.com/storytold/photocraft/pull/5161
- Fix integer overflow in clipped warp bounds by @Skyfuller1303 in https://github.com/storytold/photocraft/pull/5451
- fix(linux): install the AppImage menu entry when AppImageLauncher skips it by @nrq6993-a11y in https://github.com/storytold/photocraft/pull/5551
- FITS: clamp 32-bit saves to 0..1 and warn, so they reopen as saved (#5627) by @davidmann4 in https://github.com/storytold/photocraft/pull/5628
- Properties / New Document: tiny sizes in physical units no longer resize the document (#5661) by @davidmann4 in https://github.com/storytold/photocraft/pull/5662
- fix(psd): write the layer block after a kept merged-transparency marker by @FinnNk in https://github.com/storytold/photocraft/pull/5673
- Options bar: Brush and Eraser size go to 5000 px in every theme (#5708) by @davidmann4 in https://github.com/storytold/photocraft/pull/5709
- Smart Objects: Curves preview no longer zooms in on a reduced proxy (#5766) by @Higgs32584 in https://github.com/storytold/photocraft/pull/5779
- Fix Nikon NEF lossy levels, packed decoding and metadata crops by @optimalbytee in https://github.com/storytold/photocraft/pull/3238
- Curves: apply to masks, alpha, and Quick Mask (#5335) by @vbasky in https://github.com/storytold/photocraft/pull/5448
- perf(ui): bound transform outlines and stabilize perspective clipping by @LabDennis in https://github.com/storytold/photocraft/pull/5699
- fix(heif): a grid's ICC profile is inherited from its tiles by @sidney in https://github.com/storytold/photocraft/pull/5553
- fix(ui): expose toolbar column toggle in all themes by @Ni-zav in https://github.com/storytold/photocraft/pull/3538
- Double-clicking the empty workspace shows File › Open (#5367) by @Daktyl198 in https://github.com/storytold/photocraft/pull/5429
- fix(ui): a held arrow key keeps stepping the focused value field (#5474) by @JuanAntonioRC in https://github.com/storytold/photocraft/pull/5497
- fix(ui): ⇧ marquee square keeps equal sides on the pixel grid (#5472) by @sabbirshawon in https://github.com/storytold/photocraft/pull/5506
- fix(engine): validate bounded extended filter parameters by @0x6Ason in https://github.com/storytold/photocraft/pull/5586
- Guide Layout: the disabled Rows field no longer turns Rows on (#5625) by @davidmann4 in https://github.com/storytold/photocraft/pull/5626
- Fix filter preview live during drag by @agent-346022 in https://github.com/storytold/photocraft/pull/5549
- Fix #5414: Keep created paths visible and editable by @Ahmeddouhm in https://github.com/storytold/photocraft/pull/5424
- fix(ui): widen tool-options drag targets by @haranishi in https://github.com/storytold/photocraft/pull/5135
- fix(cms): write the product name as PhotoCraft in built-in profile descriptions by @wwewtech in https://github.com/storytold/photocraft/pull/5614
- Format five files on main (fmt break from #5448, #5670, #5135) by @tanish2k09 in https://github.com/storytold/photocraft/pull/5873
- Document layerFilter in the ui_set MCP schema by @FredApps in https://github.com/storytold/photocraft/pull/5776
- i18n(hu): align six rows with the catalog conventions by @Skaywalker in https://github.com/storytold/photocraft/pull/5434
- UI: centre text vertically in shared text fields by @stevanmarjanovic in https://github.com/storytold/photocraft/pull/5550
- fix(ui): the Move tool keeps Photoshop's arrow pointer by @midasmatterhorn in https://github.com/storytold/photocraft/pull/5814
- fix(pen): keep unfinished paths in their original document by @Ni-zav in https://github.com/storytold/photocraft/pull/5460
- Drag and drop: PhotoCraft comes to the front after a drop (#5687) by @Higgs32584 in https://github.com/storytold/photocraft/pull/5894
- Options bar: Show Transform Controls in every theme (#5740) by @vangel76 in https://github.com/storytold/photocraft/pull/5802
- Preserve Layers scroll per document (#5522) by @FredApps in https://github.com/storytold/photocraft/pull/5540
- Rulers: Alt-drag makes a guide of the other orientation (#5698) by @Higgs32584 in https://github.com/storytold/photocraft/pull/5885
- Adjustment layers: a live preview is never coarser than the screen (#5764) by @Higgs32584 in https://github.com/storytold/photocraft/pull/5778
- UI: unsaved-changes buttons show every key in one style (#5564) by @nrq6993-a11y in https://github.com/storytold/photocraft/pull/5603
- macOS: a bundled app keeps its own Dock icon (#5849) by @Higgs32584 in https://github.com/storytold/photocraft/pull/5879
- Title bar: dialogs no longer stop the window dragging on macOS (#5826) by @Higgs32584 in https://github.com/storytold/photocraft/pull/5860
- fix(path): Shift locks a Direct Selection anchor drag to 45° (#5475) by @JuanAntonioRC in https://github.com/storytold/photocraft/pull/5498
- Type: keep text selection highlight visible while Command/Ctrl is held by @safvanedge in https://github.com/storytold/photocraft/pull/5542
- Filter dialogs: a Random button for seeds (#5710) by @Higgs32584 in https://github.com/storytold/photocraft/pull/5886
- Brushes: dragging a preset to the list's edge scrolls the list (#5741) by @Higgs32584 in https://github.com/storytold/photocraft/pull/5862
- fix(ui): smart filter adjustments open their own editor on double-click by @midasmatterhorn in https://github.com/storytold/photocraft/pull/5812
- Canvas: no scroll glide with Enable Animations off (#5721) by @Higgs32584 in https://github.com/storytold/photocraft/pull/5883
- Scaling around reference point no longer snaps center of image to ref… by @stevanmarjanovic in https://github.com/storytold/photocraft/pull/5510
- Type: a scaled type layer keeps its size when the Character fields show it (#5717) by @davidmann4 in https://github.com/storytold/photocraft/pull/5718
- fix(ui): restore previous tool when committing or canceling text edit (#5527) by @safvanedge in https://github.com/storytold/photocraft/pull/5528
- File › Scripts › Browse: reject Photoshop ExtendScript (#5406) by @vbasky in https://github.com/storytold/photocraft/pull/5435
- Channels: load the targeted layer mask as selection by @envy-ai in https://github.com/storytold/photocraft/pull/5562
- Type: Swap and Default Colors recolour the selected text (#5690) by @davidmann4 in https://github.com/storytold/photocraft/pull/5808
- Image Size, Canvas Size: points and picas follow the Point/Pica Size preference (#5756) by @davidmann4 in https://github.com/storytold/photocraft/pull/5757
- Pen and Path Selection: Delete deletes the finished work path (#5702) by @Higgs32584 in https://github.com/storytold/photocraft/pull/5732
- Layer Style: drag on the image to move a drop or inner shadow (#5701) by @Higgs32584 in https://github.com/storytold/photocraft/pull/5893
- Free Transform: shapes and paths stay on whole pixels (#5751) by @Higgs32584 in https://github.com/storytold/photocraft/pull/5841
- Snapping: snap edges of Marquees / Object Selection box / shapes while repositioning with Spacebar by @WendelVolm in https://github.com/storytold/photocraft/pull/5748
- Move: Show Transform Controls frames every selected layer by @bazmarth in https://github.com/storytold/photocraft/pull/5917
- Warp: a thin layer stretched and bent keeps its curve on commit (#5793) by @vangel76 in https://github.com/storytold/photocraft/pull/5810
- Dialogs: a close box in the title bar cancels like Cancel (#5496) by @davidmann4 in https://github.com/storytold/photocraft/pull/5505
- Commit text editing when selecting a Layers-panel row (#5584) by @FredApps in https://github.com/storytold/photocraft/pull/5612
- Info panel: show guide coordinates while dragging outside the canvas (#5728) by @nrq6993-a11y in https://github.com/storytold/photocraft/pull/5768
- fix(ui): brush outline matches the stroke on Wayland at fractional scales by @wanikhawar in https://github.com/storytold/photocraft/pull/5796
- Raw: measure the Nikon D90 image area (4288x2848 at (10, 10)) by @vbasky in https://github.com/storytold/photocraft/pull/4323
- Codecs: open Cineon (.cin) film frames read-only by @vbasky in https://github.com/storytold/photocraft/pull/4691
- PSD: write tiff blocks without copies, inflate merged ZIP once by @vangel76 in https://github.com/storytold/photocraft/pull/5221
- Content-Aware Fill: no ghost edges or object colour around thin removed objects by @switch87 in https://github.com/storytold/photocraft/pull/5290
- Select Subject: keep subject parts coloured like the backdrop, leave enclosed gaps open by @diegochagas in https://github.com/storytold/photocraft/pull/4462
- perf: keep effect-cache pins and History snapshots inside the memory budgets by @FinnNk in https://github.com/storytold/photocraft/pull/5336
- TIFF: read and write CIE Lab* (CIELab, ICCLab); Lab documents stay Lab by @switch87 in https://github.com/storytold/photocraft/pull/4949
- PSD: cap pattern memory across a parse, reject mixed-depth pattern channels (#5198) by @vangel76 in https://github.com/storytold/photocraft/pull/5207
- DNG: decode lossy (JPEG-compressed) DNG tiles (FILE-215-11) by @FabioLissi in https://github.com/storytold/photocraft/pull/5112
- PSD: a smart object's filter mask shows when the file opens by @timothydaly1 in https://github.com/storytold/photocraft/pull/5005
- File > Save As / Save a Copy / CLI can write PDF (#3401) by @vbasky in https://github.com/storytold/photocraft/pull/3441
- CI: fix the tests that keep main red, and ship the wasm as compressed parts (#5926, #5302) by @zuujiscom in https://github.com/storytold/photocraft/pull/5941
- fix(compose): serialize effect identity cache misses by @skylartaylor in https://github.com/storytold/photocraft/pull/6060
- psd: write PSB foreign-order long-key blocks with the correct big-endian length by @midasmatterhorn in https://github.com/storytold/photocraft/pull/5600
- ci: add comfortable runtime limits to unbounded jobs by @skylartaylor in https://github.com/storytold/photocraft/pull/5931
- CI: run clippy, layers and scorecard checks before the tests (#6119) by @davidmann4 in https://github.com/storytold/photocraft/pull/6124
- Quick Mask: ⌘I inverts the whole mask, unstored black included (#6095) by @zuujiscom in https://github.com/storytold/photocraft/pull/6108
- Pen: Auto Add/Delete on the path being drawn (#6140) by @wanikhawar in https://github.com/storytold/photocraft/pull/6172
- Dependencies: require ruzstd 0.9.1 for RUSTSEC-2026-0344 (#4952) by @Higgs32584 in https://github.com/storytold/photocraft/pull/5225
- Control channel: connections must authenticate within 10 s, however active (#4965) by @Higgs32584 in https://github.com/storytold/photocraft/pull/5229
- Check deep EXR tile count tables against max_alloc by @jonathanwxh-cell in https://github.com/storytold/photocraft/pull/5632
- Clip groups: Release Clipping Mask takes the layers above; merges keep clipping; Delete Hidden settles by @tanish2k09 in https://github.com/storytold/photocraft/pull/5868
- Paste Layer Style carries Blend If and channels; align to an active selection with several layers by @tanish2k09 in https://github.com/storytold/photocraft/pull/5881
- Paste Layer Style: a group's Pass Through lands on other layers as Normal by @tanish2k09 in https://github.com/storytold/photocraft/pull/6310
- Keyboard Shortcuts: Accept and Go to Conflict / Undo Changes, and reserved keys (K4a) by @tanish2k09 in https://github.com/storytold/photocraft/pull/5349
- Layers panel: blend mode, Opacity, Fill and locks change every selected layer; Photoshop's History names by @tanish2k09 in https://github.com/storytold/photocraft/pull/5856
- CI: run the tests with cargo nextest (#6117) by @davidmann4 in https://github.com/storytold/photocraft/pull/6118
- CI: run only the font tests in the craft-fonts pass (#6120) by @davidmann4 in https://github.com/storytold/photocraft/pull/6127
- Low-Latency Drawing preference (vsync off, opt-in), plus present-mode overrides for testers (#1343) by @tanish2k09 in https://github.com/storytold/photocraft/pull/5274
- Shortcuts without the UI: shell commands and tools in the engine, reserved keys, set files by @tanish2k09 in https://github.com/storytold/photocraft/pull/5801
- Free Transform: New Layer applies the transform first; tests for switching tool, layer or New Layer (#5665, #5667) by @tanish2k09 in https://github.com/storytold/photocraft/pull/5859
- Follow-ups to #5801 and #5859: precheck docs and tests, translated refusals, stranded-backup test by @tanish2k09 in https://github.com/storytold/photocraft/pull/6365
- Security: enforce the automation read boundary on stored smart-filter params by @skylartaylor in https://github.com/storytold/photocraft/pull/5684
- PSD: recover available layers when merged image data is damaged by @PerchAnton in https://github.com/storytold/photocraft/pull/6170
- ci: delegate FreeBSD workflow to craft-common-actions and add nix check by @dylanmtaylor in https://github.com/storytold/photocraft/pull/6381
- CI: cut wall time, starting with the Windows test job by @1Git2Clone in https://github.com/storytold/photocraft/pull/2933
- Canvas textures fit the device's texture limit; GPU tests use the app's device and the GPU lock by @tanish2k09 in https://github.com/storytold/photocraft/pull/5954
- perf(gpu): cap the GPU memory budgets by a discrete GPU's own memory by @FinnNk in https://github.com/storytold/photocraft/pull/5234
- GPU memory: discrete cards aren't charged for the document; GPU Memory preference; GPU Memory Full status by @tanish2k09 in https://github.com/storytold/photocraft/pull/5973
- GPU memory follow-ups: indicator after device loss and document switches, notice wording by @tanish2k09 in https://github.com/storytold/photocraft/pull/6458
- Save As on Linux: the file type picked sets the extension (#6121, #4328, #4394) by @zuujiscom in https://github.com/storytold/photocraft/pull/6151
- Tests: canvas_16f and rotation preview run on the app's wgpu device by @tanish2k09 in https://github.com/storytold/photocraft/pull/6454
- Windows/Linux: open files in the running PhotoCraft instead of a second instance (#3708) by @bommerts in https://github.com/storytold/photocraft/pull/3755
- perf(camera-raw): Shadows/Highlights 1.9× faster, bit for bit the same (#5964) by @nicolasfalesy in https://github.com/storytold/photocraft/pull/6247
- Histogram: scale bar heights to the tallest bin instead of the 251st smallest by @midasmatterhorn in https://github.com/storytold/photocraft/pull/6638
- fix(linux): avoid duplicate AppImage desktop launcher when managed by AM / AppMan (#6392) by @Korg1ch in https://github.com/storytold/photocraft/pull/6394
- Paragraph text: a word wider than the box breaks at the box edge (#6694) by @diegochagas in https://github.com/storytold/photocraft/pull/6696
- Pen: the path in progress stays visible while panning with Space by @marcoarnulfo in https://github.com/storytold/photocraft/pull/6625
- Crop tool: custom ratios keep three decimals, 1.414 : 1 no longer becomes 1.4 : 1 by @marcoarnulfo in https://github.com/storytold/photocraft/pull/6503
- fix(codecs): respect PAM ENDHDR line boundaries by @0x6Ason in https://github.com/storytold/photocraft/pull/5874
- docs(cli): write product name as PhotoCraft in USAGE and description by @wwewtech in https://github.com/storytold/photocraft/pull/5449
- fix(engine): prevent colliding artboard export filenames by @PerchAnton in https://github.com/storytold/photocraft/pull/6655
- docs: write product name as PhotoCraft in crate module docs by @wwewtech in https://github.com/storytold/photocraft/pull/5455
- docs: write product name as PhotoCraft in package descriptions and comments by @wwewtech in https://github.com/storytold/photocraft/pull/5615
- perf(testkit): RSS sampler reads /proc/self/statm, not smaps, on Linux by @xsvm in https://github.com/storytold/photocraft/pull/5399
- test(io): cover mixed-region CMYK TIFF composites by @0x6Ason in https://github.com/storytold/photocraft/pull/5588
- fix(io): preserve linear grayscale profiles for selected EXR parts by @0x6Ason in https://github.com/storytold/photocraft/pull/5867
- fix(io): honor version-aware OpenRaster group isolation by @0x6Ason in https://github.com/storytold/photocraft/pull/5872
- fix(io): color-manage grayscale WebP exports by @0x6Ason in https://github.com/storytold/photocraft/pull/5875
- Unsaved-changes prompt: the default answer takes keyboard focus, so arrows and Enter work by @marcoarnulfo in https://github.com/storytold/photocraft/pull/6466
- fix: open new solid fill picker by @Ni-zav in https://github.com/storytold/photocraft/pull/5166
- Color Picker: Only Web Colors snaps every edit (#4995) by @vbasky in https://github.com/storytold/photocraft/pull/5442
- fix(ui): reset caret blink phase on navigation and typing (#5511) by @safvanedge in https://github.com/storytold/photocraft/pull/5512
- fix(engine): reserve the define-brush tip buffer fallibly (#212) by @wwewtech in https://github.com/storytold/photocraft/pull/5469
- Bound shared numeric input before text layout by @harrisonoconnorhover in https://github.com/storytold/photocraft/pull/2258
- README: install on Gentoo from the ::snakebyte overlay by @switch87 in https://github.com/storytold/photocraft/pull/1149
- Face detection: libfacedetection's CNN in pure Rust, and image.detectFaces by @switch87 in https://github.com/storytold/photocraft/pull/4513
- fix(engine): list the document's layers when a layer id or name is unknown by @switch87 in https://github.com/storytold/photocraft/pull/5133
- Layers panel and title: Arabic and Hebrew names read right to left (#5159) by @Higgs32584 in https://github.com/storytold/photocraft/pull/5385
- fix(web): enable Place Embedded with browser file picker by @zi-ger in https://github.com/storytold/photocraft/pull/5585
- chore: fix workspace Clippy warnings by @VanTan666 in https://github.com/storytold/photocraft/pull/5190
- README: put Community packages after the Get started status note (follow-up to #1149) by @tanish2k09 in https://github.com/storytold/photocraft/pull/6886
- Filters: the live preview is never coarser than the screen (fixes #6326) by @itsF4LCON in https://github.com/storytold/photocraft/pull/6351
- fix(io): keep transforms on imported SVG text by @ahmed0magdy in https://github.com/storytold/photocraft/pull/5334
- GPU composite: lower-stack cache chunks have no texture view by @mcsantiago in https://github.com/storytold/photocraft/pull/5423
- Text: break paragraph lines at the horizontally scaled width (#5565) by @nrq6993-a11y in https://github.com/storytold/photocraft/pull/5611
- Engine: load each persisted preset set independently (#5602) by @nrq6993-a11y in https://github.com/storytold/photocraft/pull/5616
- Targa: RLE packets end with their scanline (fixes #6382) by @itsF4LCON in https://github.com/storytold/photocraft/pull/6386
- perf(stack): Stack Mode 8–17× faster, deterministic Entropy by @nicolasfalesy in https://github.com/storytold/photocraft/pull/6462
- PSD type: clamp warp bend and distortion before the f32 cast (#6856) by @davidmann4 in https://github.com/storytold/photocraft/pull/6857
- Linked smart objects: don't refresh a document while a background job runs on it (#4973) by @MarekSpodBiedry in https://github.com/storytold/photocraft/pull/5074
- Close All, Close Others and Quit ask again about documents dirtied during the prompt (#4954) by @MarekSpodBiedry in https://github.com/storytold/photocraft/pull/5079
- fix(windows): keep crash-recovery autosaves out of the roaming profile (#5648) by @Korg1ch in https://github.com/storytold/photocraft/pull/6412
- Save: ask before overwriting a file another app changed (#6596) by @zuujiscom in https://github.com/storytold/photocraft/pull/6652
- fix(automation): refuse a group/world-readable control-token file (#4966) by @wwewtech in https://github.com/storytold/photocraft/pull/5459
- perf(panorama): Photomerge 4× faster, bit for bit the same by @nicolasfalesy in https://github.com/storytold/photocraft/pull/6489
- Fix the build: restore export_presets in load_presets_json (#5344 x #5616) by @00xJS in https://github.com/storytold/photocraft/pull/6906
- algo: gate the recorded-hash test's helpers with the test by @Hamza0101 in https://github.com/storytold/photocraft/pull/7053
- Quick Export: Same Folder asks before replacing the document's own file (#6599) by @zuujiscom in https://github.com/storytold/photocraft/pull/6632
- Opening a file that is already open shows its tab instead of a second copy by @marcoarnulfo in https://github.com/storytold/photocraft/pull/6630
- Duotone: ink curve points must be finite (#7049) by @davidmann4 in https://github.com/storytold/photocraft/pull/7050
- Save: refuse to replace a read-only file (#6600) by @davidmann4 in https://github.com/storytold/photocraft/pull/6643
- Image Assets: two layers naming the same file no longer overwrite each other (#6614) by @zuujiscom in https://github.com/storytold/photocraft/pull/6668
- Desktop app:
photocraft --helpprints usage; unknown options are usage errors (#6431) by @wanikhawar in https://github.com/storytold/photocraft/pull/6435 - Logging: a second launch leaves the running instance's log alone (#6432) by @switch87 in https://github.com/storytold/photocraft/pull/6478
- Follow linked paths only on this computer or the document's share by @skylartaylor in https://github.com/storytold/photocraft/pull/7149
- CI: run panic_hunt in the Linux test job by @1Git2Clone in https://github.com/storytold/photocraft/pull/2863
- Web: Place Embedded and canvas drops place images (#5749) by @Higgs32584 in https://github.com/storytold/photocraft/pull/5817
- Print through CUPS over IPP and the print portal: File › Print works in the Flatpak by @diegochagas in https://github.com/storytold/photocraft/pull/3017
- Package: report its paths with
/on Windows too by @skylartaylor in https://github.com/storytold/photocraft/pull/7184 - Release 0.10.0 by @echelon in https://github.com/storytold/photocraft/pull/7192
- @dutraroberto made their first contribution in https://github.com/storytold/photocraft/pull/5295
- @lu123bing made their first contribution in https://github.com/storytold/photocraft/pull/5266
- @zkm made their first contribution in https://github.com/storytold/photocraft/pull/5261
- @Pharbi made their first contribution in https://github.com/storytold/photocraft/pull/5398
- @sabbirshawon made their first contribution in https://github.com/storytold/photocraft/pull/5253
- @notdezzi made their first contribution in https://github.com/storytold/photocraft/pull/3799
- @david419kr made their first contribution in https://github.com/storytold/photocraft/pull/5043
- @badaaif made their first contribution in https://github.com/storytold/photocraft/pull/4312
- @the-unknown made their first contribution in https://github.com/storytold/photocraft/pull/3426
- @cwshields made their first contribution in https://github.com/storytold/photocraft/pull/3695
- @gorevyoneticisi made their first contribution in https://github.com/storytold/photocraft/pull/4306
- @saadkhantareen made their first contribution in https://github.com/storytold/photocraft/pull/5161
- @nrq6993-a11y made their first contribution in https://github.com/storytold/photocraft/pull/5551
- @LabDennis made their first contribution in https://github.com/storytold/photocraft/pull/5699
- @sidney made their first contribution in https://github.com/storytold/photocraft/pull/5553
- @Daktyl198 made their first contribution in https://github.com/storytold/photocraft/pull/5429
- @JuanAntonioRC made their first contribution in https://github.com/storytold/photocraft/pull/5497
- @Ahmeddouhm made their first contribution in https://github.com/storytold/photocraft/pull/5424
- @midasmatterhorn made their first contribution in https://github.com/storytold/photocraft/pull/5814
- @envy-ai made their first contribution in https://github.com/storytold/photocraft/pull/5562
- @WendelVolm made their first contribution in https://github.com/storytold/photocraft/pull/5748
- @wanikhawar made their first contribution in https://github.com/storytold/photocraft/pull/5796
- @PerchAnton made their first contribution in https://github.com/storytold/photocraft/pull/6170
- @1Git2Clone made their first contribution in https://github.com/storytold/photocraft/pull/2933
- @ahmed0magdy made their first contribution in https://github.com/storytold/photocraft/pull/5334
- @mcsantiago made their first contribution in https://github.com/storytold/photocraft/pull/5423
- @00xJS made their first contribution in https://github.com/storytold/photocraft/pull/6906
- @Hamza0101 made their first contribution in https://github.com/storytold/photocraft/pull/7053
Full Changelog: https://github.com/storytold/photocraft/compare/v0.9.0...v0.10.0
PhotoCraft v0.9.0
- Use craft-print for system printing by @skylartaylor in https://github.com/storytold/photocraft/pull/3872
- Tests: allow-list language-invariant bit-depth labels, add missing tr/hu 'Enable animations' (#4359) by @vangel76 in https://github.com/storytold/photocraft/pull/4362
- feat(automation): allow Crop and Straighten Photos through automation (#1052) by @buivanvu94 in https://github.com/storytold/photocraft/pull/3917
- Pencil: no 8-bit dither on aliased strokes, one flat colour at partial opacity by @cloudalister in https://github.com/storytold/photocraft/pull/3990
- Preserve grayscale appearance in profileless exports by @jonathanwxh-cell in https://github.com/storytold/photocraft/pull/3978
- Save As: a saved .pcraft manifest reports the file it was saved under by @switch87 in https://github.com/storytold/photocraft/pull/3571
- Selection: lasso polygons scan only the edges that cross each row by @xsvm in https://github.com/storytold/photocraft/pull/3959
- Fix group transform bounds with active pixel selections by @jonathanwxh-cell in https://github.com/storytold/photocraft/pull/3970
- fix(color): validate RGB working profiles atomically by @zenjabba in https://github.com/storytold/photocraft/pull/3924
- Load and save Photoshop Actions (.atn) (#4356, #219) by @FabioLissi in https://github.com/storytold/photocraft/pull/4434
- feat(engine): recolor vector shape layer fill with Alt+Backspace and Cmd+Backspace by @Gotix-eg in https://github.com/storytold/photocraft/pull/3925
- fix(ui): default the Move tool Auto-Select target to Group by @mroxso in https://github.com/storytold/photocraft/pull/4093
- fix(gpu): preflight compositor uniform buffer limits by @zenjabba in https://github.com/storytold/photocraft/pull/3931
- Properties: a new adjustment or fill layer brings Properties to the front (#4028) by @marcoarnulfo in https://github.com/storytold/photocraft/pull/4079
- Actions panel: set folders, dialog toggle, Insert Stop (#219) by @FabioLissi in https://github.com/storytold/photocraft/pull/4456
- Delete with several layers selected deletes them, not the active layer's targeted mask (#4025) by @marcoarnulfo in https://github.com/storytold/photocraft/pull/4078
- Fix multi-layer Delete and Move drags on a locked Background by @vbasky in https://github.com/storytold/photocraft/pull/4109
- File Handling: wire Maximize PSD and PSB File Compatibility (#204) by @Erica4fr in https://github.com/storytold/photocraft/pull/3955
- View: Esc leaves full screen modes (part of #4116) by @FredApps in https://github.com/storytold/photocraft/pull/4145
- .atn: map the remaining frequent Photoshop events (#219) by @FabioLissi in https://github.com/storytold/photocraft/pull/4465
- Windows: keep full screen and maximized apart; never restore full screen by @aweussom in https://github.com/storytold/photocraft/pull/4396
- Make channel filter previews match the committed edit by @jonathanwxh-cell in https://github.com/storytold/photocraft/pull/3979
- .atn: Place, Open, Image Size in percent, Paint Bucket and Insert Conditional (#219) by @FabioLissi in https://github.com/storytold/photocraft/pull/4470
- Quantize the colour field when Only Web Colors is on. by @vbasky in https://github.com/storytold/photocraft/pull/4138
- fix(ui): cancel unfinished Polygonal Lasso when switching tools by @Ni-zav in https://github.com/storytold/photocraft/pull/4021
- fix(ui): reject rotation angles outside f32 range by @Ni-zav in https://github.com/storytold/photocraft/pull/4044
- fix(move): no trail when dragging a shape past the canvas edge (#3946) by @alonfaraj in https://github.com/storytold/photocraft/pull/4069
- Resolve every pattern name before a batch delete removes any of them. by @vbasky in https://github.com/storytold/photocraft/pull/4132
- Brush cursor: the tip's centre mark follows Show Crosshair in Brush Tip by @Furash in https://github.com/storytold/photocraft/pull/4105
- Brush Settings: toggle switch rows without losing smoothing settings by @augrclk in https://github.com/storytold/photocraft/pull/4463
- Color Table: keep the transparent index inside the palette (#4186) by @davidmann4 in https://github.com/storytold/photocraft/pull/4187
- Stylus: a light Windows pen tap is pressure 0, not a full-pressure click by @Furash in https://github.com/storytold/photocraft/pull/4072
- Filters on a type layer: ask to rasterize or convert to a Smart Object instead of greying out by @marcoarnulfo in https://github.com/storytold/photocraft/pull/4333
- i18n(hu): informal address in the rows added on merge by @Skaywalker in https://github.com/storytold/photocraft/pull/4334
- Italian: native-speaker review of the UI catalog by @lucAmbr0 in https://github.com/storytold/photocraft/pull/4290
- Color Picker: CMYK foreground fills a CMYK document with the picked inks (#4196) by @vangel76 in https://github.com/storytold/photocraft/pull/4339
- Codecs: open and save DPX frames (#1049) by @przemyslvw in https://github.com/storytold/photocraft/pull/4104
- Brush: CMYK foreground paints the picked inks into a CMYK document (#4344) by @vangel76 in https://github.com/storytold/photocraft/pull/4347
- Paint Bucket and Edit > Stroke: a CMYK foreground writes the picked inks (#4351) by @vangel76 in https://github.com/storytold/photocraft/pull/4352
- perf(raster): moved fills keep sharing one copy-on-write tile by @SckraT in https://github.com/storytold/photocraft/pull/4414
- perf(compose): stop sweeping the bounds cache on every call once it i… by @SckraT in https://github.com/storytold/photocraft/pull/4415
- perf(engine): move layers without a second document clone by @SckraT in https://github.com/storytold/photocraft/pull/4422
- perf(compose): read PHOTOCRAFT_FX_NOCACHE once by @SckraT in https://github.com/storytold/photocraft/pull/4423
- perf(engine): read selection coverage per row when mixing edits back by @SckraT in https://github.com/storytold/photocraft/pull/4424
- Layer Style: OK keeps an Inner Glow's Center source (#4152) by @davidmann4 in https://github.com/storytold/photocraft/pull/4120
- Layers panel: double-clicking an effect row opens that layer's Layer Style (#4157) by @davidmann4 in https://github.com/storytold/photocraft/pull/4131
- Keep Liquify undo and redo working while a numeric field is focused. by @vbasky in https://github.com/storytold/photocraft/pull/4134
- Draw the Free Transform rotate arrow instead of hiding the pointer. by @vbasky in https://github.com/storytold/photocraft/pull/4139
- Snap 1 px pencil clicks to the pixel the aliased tip paints. by @vbasky in https://github.com/storytold/photocraft/pull/4140
- Image Size and Canvas Size: no silent resize of large documents in physical units (#4162) by @davidmann4 in https://github.com/storytold/photocraft/pull/4163
- Exposure: the slider keeps fractional stops (#4164) by @davidmann4 in https://github.com/storytold/photocraft/pull/4165
- Shape tools: the click-to-open-dialog tolerance is the same on HiDPI displays (#4205) by @davidmann4 in https://github.com/storytold/photocraft/pull/4207
- Rotate View: the image follows the pointer in a flipped view (#4226) by @davidmann4 in https://github.com/storytold/photocraft/pull/4227
- Brush resize HUD: horizontal is size and vertical is hardness in a rotated view (#4228) by @davidmann4 in https://github.com/storytold/photocraft/pull/4229
- feat(codecs): support full X11 rgb.txt color names in XPM by @Ni-zav in https://github.com/storytold/photocraft/pull/4263
- feat(codecs): add XPM2 plain-text image import support by @Ni-zav in https://github.com/storytold/photocraft/pull/4264
- Docs: refresh gaps.md against main (#4412) by @vangel76 in https://github.com/storytold/photocraft/pull/4413
- Docs: refresh target-app-parity and file-format-parity against main (#4417) by @vangel76 in https://github.com/storytold/photocraft/pull/4418
- Clone Stamp and History Brush: releasing a stroke commits the live pixels by @xsvm in https://github.com/storytold/photocraft/pull/4019
- Stylus: a pen held still is not a press-and-hold right click by @Furash in https://github.com/storytold/photocraft/pull/4106
- Refresh Liquify's zoomed preview when a stroke is undone. by @vbasky in https://github.com/storytold/photocraft/pull/4135
- fix(selection): avoid panics when sampling incomplete region masks by @Ni-zav in https://github.com/storytold/photocraft/pull/4045
- Type: Space inserts a space while editing type by @Hevarh1 in https://github.com/storytold/photocraft/pull/4224
- fix(algo): reject oversized Magic Eraser masks without overflow by @Ni-zav in https://github.com/storytold/photocraft/pull/4043
- fix(selection): validate Magic Wand pixel buffers before indexing by @Ni-zav in https://github.com/storytold/photocraft/pull/4046
- feat(ui): the shaped brush cursor turns and flips with the view by @FinnNk in https://github.com/storytold/photocraft/pull/4233
- Affinity import: pie shapes with huge angles no longer hang the reader by @dotCooCoo in https://github.com/storytold/photocraft/pull/4054
- Affinity: rectangles keep per-corner radii and straight corners (#1606) by @callmeBalloch in https://github.com/storytold/photocraft/pull/4055
- feat(ui): spring-loaded tool letters (#2672) by @FinnNk in https://github.com/storytold/photocraft/pull/4238
- Quick Selection: cut window sizes in parallel, cancel the larger ones once one is kept (-37% on 24 MP strokes, identical masks) by @syncroot in https://github.com/storytold/photocraft/pull/4062
- PSD: a zero-length annotation entry no longer hangs the import (#4149) by @davidmann4 in https://github.com/storytold/photocraft/pull/4117
- Swatches: reject colour values beyond f32 range so presets survive a restart (#4150) by @davidmann4 in https://github.com/storytold/photocraft/pull/4118
- Compose: the effect cache follows Transparency Shapes Layer and Blend If (#4151) by @davidmann4 in https://github.com/storytold/photocraft/pull/4119
- Auto-Select: honour layer mask density when picking layers (#4153) by @davidmann4 in https://github.com/storytold/photocraft/pull/4121
- Find and Replace Text: backward Change/Find moves past the replaced text (#4154) by @davidmann4 in https://github.com/storytold/photocraft/pull/4122
- Liquify, Puppet Warp and Perspective Warp: refuse locked smart objects (#4155) by @davidmann4 in https://github.com/storytold/photocraft/pull/4123
- Count tool: Marker Size and Label Size fields take effect (#4156) by @davidmann4 in https://github.com/storytold/photocraft/pull/4124
- Layers panel: show the lock icon for every lock (#4158) by @davidmann4 in https://github.com/storytold/photocraft/pull/4159
- Automation: reject an invalid document index instead of using the active document (#4160) by @davidmann4 in https://github.com/storytold/photocraft/pull/4161
- Paint Bucket and Gradient: validate opacity like the Magic Eraser (#4167) by @davidmann4 in https://github.com/storytold/photocraft/pull/4168
- Video layers: edits keep the timeline work area (#4170) by @davidmann4 in https://github.com/storytold/photocraft/pull/4171
- Warp: move only the selected part of a linked mask (#4175) by @davidmann4 in https://github.com/storytold/photocraft/pull/4176
- Contours (.shc): keep long names valid and readable (#4177) by @davidmann4 in https://github.com/storytold/photocraft/pull/4179
- Global Light: reject angles beyond f32 range instead of storing NaN (#4181) by @davidmann4 in https://github.com/storytold/photocraft/pull/4182
- Tests: set the Move tool's Auto-Select target to Layer in the layout_perf clicks (#4056) by @FabioLissi in https://github.com/storytold/photocraft/pull/4548
- feat: resize Save for Web previews and custom palette editing for Gif export by @TheDankness in https://github.com/storytold/photocraft/pull/4129
- Tests: GPU startup marker tests wait while another test's child process holds the lock by @dotCooCoo in https://github.com/storytold/photocraft/pull/4251
- Control: a transport that gives up knows whether the command was dispatched (#3662) by @marcoarnulfo in https://github.com/storytold/photocraft/pull/4256
- Canvas: a tool drag past the edge auto-scrolls the view (#4183) by @jonathanwxh-cell in https://github.com/storytold/photocraft/pull/4257
- fix(linux): respect GNOME's default light appearance (#4216) by @Ni-zav in https://github.com/storytold/photocraft/pull/4289
- Brush Settings: Brush Tip Shape lines up with the other section names (#4282) by @dhiorns15 in https://github.com/storytold/photocraft/pull/4294
- Properties: the Studio-layout themes show it for every layer (#4246) by @dhiorns15 in https://github.com/storytold/photocraft/pull/4299
- Give numeric type controls translated accessible names by @grlessa in https://github.com/storytold/photocraft/pull/4310
- Free Transform: unlinking W and H frees the handles too (#4174) by @dhiorns15 in https://github.com/storytold/photocraft/pull/4322
- fix(ui): make clickable tab, checkbox, and radio labels non-selectable (#3972) by @Korg1ch in https://github.com/storytold/photocraft/pull/4331
- fix(ui): use a linear gradient ramp glyph for the Gradient tool icon (#4172) by @Korg1ch in https://github.com/storytold/photocraft/pull/4335
- fix(ui): add Brushes button at top of Brush Settings control list (#4265) by @Korg1ch in https://github.com/storytold/photocraft/pull/4354
- fix(ui): keep brush settings section lock icons permanently visible (#4278) by @Korg1ch in https://github.com/storytold/photocraft/pull/4300
- Layers: Fill and the Paint Bucket edit an adjustment layer's mask when its icon is targeted (#4298) by @dhiorns15 in https://github.com/storytold/photocraft/pull/4308
- Object Selection: hover preview of the object it would select (Object Finder) (#4087) by @FredApps in https://github.com/storytold/photocraft/pull/4095
- feat(ui): add GRD import option to gradient map preset picker by @xtellarvoid in https://github.com/storytold/photocraft/pull/4337
- Type: every text edit respects Lock All (#4188) by @davidmann4 in https://github.com/storytold/photocraft/pull/4189
- Color Sampler: keep the CMYK readout in range on 32-bit documents (#4191) by @davidmann4 in https://github.com/storytold/photocraft/pull/4192
- Layer Comps: the warning icon clears only its own comp (#4197) by @davidmann4 in https://github.com/storytold/photocraft/pull/4198
- fix(type): key font menu caches on the shared engine's fonts (flaky font menu tests) by @bommerts in https://github.com/storytold/photocraft/pull/4200
- Vector masks: validate feather like pixel masks (#4201) by @davidmann4 in https://github.com/storytold/photocraft/pull/4202
- Shapes: a rectangle with a negative size extends from its origin like the other shapes (#4203) by @davidmann4 in https://github.com/storytold/photocraft/pull/4204
- Cryptomatte: decode the .blue/.alpha rank of every channel set (#4208) by @davidmann4 in https://github.com/storytold/photocraft/pull/4209
- EXR: an unnamed part can be opened by the name the part list gives it (#4210) by @davidmann4 in https://github.com/storytold/photocraft/pull/4211
- Bitmap mode: validate the halftone screen angle (#4214) by @davidmann4 in https://github.com/storytold/photocraft/pull/4215
- Find Edges and Solarize: treat CMYK values as ink (#4222) by @davidmann4 in https://github.com/storytold/photocraft/pull/4223
- fix(compose): paint interior effects over the layer's blend mode (#3996) by @alonfaraj in https://github.com/storytold/photocraft/pull/4231
- feat(ui): add hamburger menu to the Brush Settings panel (#4272) by @Sir-Starch in https://github.com/storytold/photocraft/pull/4358
- Simplify the raster stale-block filter for clippy's nonminimal_bool by @persi-man in https://github.com/storytold/photocraft/pull/4314
- Save for Web and Export As remember their settings across restarts (FILE-215-18) by @reynold-hu in https://github.com/storytold/photocraft/pull/4184
- fix(layer-picker): include text bounds in right-click layer selection (#4259) by @Ni-zav in https://github.com/storytold/photocraft/pull/4288
- Gradients: Photoshop's interpolation method for Gradient Overlay, gradient Stroke and the Gradient tool by @MrCloudy2 in https://github.com/storytold/photocraft/pull/4292
- fix(type): the Type tool's canvas pick skips text in hidden groups (#4320) by @FredApps in https://github.com/storytold/photocraft/pull/4332
- Smart Objects Warp: mesh knots span the contents on a skewed placement (#4113) by @vangel76 in https://github.com/storytold/photocraft/pull/4341
- Type: faux bold keeps antialiased edges at small sizes (#4130) by @vangel76 in https://github.com/storytold/photocraft/pull/4360
- Free Transform: refuse outputs over a pixel budget instead of building them by @itrycodinganditsbad in https://github.com/storytold/photocraft/pull/4293
- feat(ui): developer tile grid overlay (ui.set {"tileGrid": true}) by @deadmeu in https://github.com/storytold/photocraft/pull/4217
- Camera Raw Filter: save and load settings as .xmp by @FredApps in https://github.com/storytold/photocraft/pull/4279
- feat(ui): Photoshop's type formatting keys while editing text by @FinnNk in https://github.com/storytold/photocraft/pull/4239
- fix(io): read CS2 placed layers that carry only a PlLd block (#2465) by @Kartik8Dwivedi in https://github.com/storytold/photocraft/pull/4268
- Pen: show a close cue when hovering the first anchor (#4193) by @vangel76 in https://github.com/storytold/photocraft/pull/4361
- Type tool: spelling suggestions in the edit menu (#4370) by @vangel76 in https://github.com/storytold/photocraft/pull/4375
- Menus keep clear of a panel that covers a maximized window (X11) (#3737) by @FredApps in https://github.com/storytold/photocraft/pull/4380
- feat(codecs): open DDS textures, uncompressed and BC1-BC3 (#1327) by @marcoarnulfo in https://github.com/storytold/photocraft/pull/4255
- Color panel: the spectrum field in every theme (#4367) by @itsF4LCON in https://github.com/storytold/photocraft/pull/4399
- macOS: big brushes keep a native outline too, and big cursor bitmaps rasterise 7x faster (#1343) by @tanish2k09 in https://github.com/storytold/photocraft/pull/4401
- Save As: offer ICO, GIF and BMP in the file type list (#4357) by @itsF4LCON in https://github.com/storytold/photocraft/pull/4405
- Recent files: a saved document is listed, as an opened one is (#4400) by @itsF4LCON in https://github.com/storytold/photocraft/pull/4411
- Paths: curves stay smooth when zoomed in (#4084) by @dhiorns15 in https://github.com/storytold/photocraft/pull/4445
- Toolbar: click and hold on Change Screen Mode opens its modes (#4444) by @dhiorns15 in https://github.com/storytold/photocraft/pull/4464
- Puppet Warp: ⌘Z / ⌘⇧Z undo and redo pin edits (#4440) by @itsF4LCON in https://github.com/storytold/photocraft/pull/4479
- Crop tool: the drawing crosshair, not the move cursor, inside the untouched default frame by @marcoarnulfo in https://github.com/storytold/photocraft/pull/4481
- Clone Source: clip the overlay to a shaped brush tip (#4372) by @vangel76 in https://github.com/storytold/photocraft/pull/4376
- The wheel steps the options bar's Mode dropdown for Brush, Pencil and Gradient (#2061) by @megaDon101 in https://github.com/storytold/photocraft/pull/4447
- Pen: Auto Add/Delete anchors on the active path (#4144) by @bazmarth in https://github.com/storytold/photocraft/pull/4540
- Save As: on Windows, picking another file type changes the extension (#4394) by @dhiorns15 in https://github.com/storytold/photocraft/pull/4407
- Toolbar: no tooltips over an open tool flyout (#4450) by @dhiorns15 in https://github.com/storytold/photocraft/pull/4469
- Free Transform: apply a large layer's warp in the background, with progress and Esc to cancel (#1015) by @ianswope in https://github.com/storytold/photocraft/pull/4218
- Toolbar: a press outside a tool flyout closes it (#4460) by @dhiorns15 in https://github.com/storytold/photocraft/pull/4480
- Replace Color: a canvas eyedropper picks the From colour (#4143) by @mroxso in https://github.com/storytold/photocraft/pull/4247
- Allow toolbar tool shortcuts to be remapped by @RavoxX in https://github.com/storytold/photocraft/pull/4194
- Fix macOS system dialog localization by @Minischatten in https://github.com/storytold/photocraft/pull/4261
- Engine: reject unknown params for layer.hideLayers/showLayers, opt-in registry check (#4336) by @vangel76 in https://github.com/storytold/photocraft/pull/4364
- Preserve HDR and signed colors in 32-bit text rasterization by @jonathanwxh-cell in https://github.com/storytold/photocraft/pull/4379
- Type: fall back to installed Indic fonts for document text (#4383) by @vangel76 in https://github.com/storytold/photocraft/pull/4386
- Raw: treat DNG samples piled up below the stated white level as clipped by @marcoarnulfo in https://github.com/storytold/photocraft/pull/4389
- Content-Aware Move: live preview of the result (#4385) by @vangel76 in https://github.com/storytold/photocraft/pull/4393
- Swatches: an RGB group with the exact primaries and secondaries (#4302) by @FredApps in https://github.com/storytold/photocraft/pull/4409
- SVG: a group clipped by one path opens as editable shapes with a vector mask (#4266) by @itsF4LCON in https://github.com/storytold/photocraft/pull/4425
- Compose: key the vector-mask cache by content, not a temporary's address (#4426) by @vangel76 in https://github.com/storytold/photocraft/pull/4428
- Actions: record File › Save a Copy and play it back as a copy (#4373) by @itsF4LCON in https://github.com/storytold/photocraft/pull/4390
- Compose: no overflow or unbounded allocation on hostile coordinates (#4427) by @vangel76 in https://github.com/storytold/photocraft/pull/4431
- Smart Filters: select a filter, drag or ⌥-drag it onto another smart object (#4271) by @itsF4LCON in https://github.com/storytold/photocraft/pull/4371
- Add Krita (.kra) import with layers by @scottcampbelldata in https://github.com/storytold/photocraft/pull/4388
- i18n(sr): add a Serbian (Latin, Ekavian) UI catalog by @Dejan-Port in https://github.com/storytold/photocraft/pull/4436
- feat(ui): Linux caption buttons follow the desktop layout, style and icon theme by @sssehnsuchttt in https://github.com/storytold/photocraft/pull/4439
- Themes: Soft Dark and Soft Light (#4368) by @vangel76 in https://github.com/storytold/photocraft/pull/4378
- Type: type on a path, glyphs follow the curve (#4365) by @vangel76 in https://github.com/storytold/photocraft/pull/4377
- panic_hunt: don't fuzz the print commands into a real printer by @FabioLissi in https://github.com/storytold/photocraft/pull/4467
- Fix main: gate rayon in the tile grid overlay so the web build compiles by @echelon in https://github.com/storytold/photocraft/pull/4694
- Align tighter camera JPEGs for RAW colour fitting by @optimalbytee in https://github.com/storytold/photocraft/pull/4598
- Check peak RAW development memory and bound AHD scratch by @optimalbytee in https://github.com/storytold/photocraft/pull/4597
- Content-Aware Fill: no tinted blotch in a smooth gradient by @switch87 in https://github.com/storytold/photocraft/pull/4708
- Composited CMYK documents now export as CMYK TIFF and JPEG with their profile (#2220) by @KnottyDyes in https://github.com/storytold/photocraft/pull/4199
- Open Canon CR3 as labelled camera JPEG previews by @optimalbytee in https://github.com/storytold/photocraft/pull/4595
- Sample every visible layer in Content-Aware Fill by default. by @vbasky in https://github.com/storytold/photocraft/pull/4133
- Resize the Liquify brush with Alt+right-drag by @vbasky in https://github.com/storytold/photocraft/pull/4707
- Free Transform: the live preview feathers a linked layer mask by @marcoarnulfo in https://github.com/storytold/photocraft/pull/4581
- perf: reuse sampled composite across channel visibility toggles by @Ni-zav in https://github.com/storytold/photocraft/pull/4080
- Fix main: Serbian translations for the Soft themes by @echelon in https://github.com/storytold/photocraft/pull/4727
- Save for Web: no matte by default, as Photoshop's scripted export (#4115) by @itsF4LCON in https://github.com/storytold/photocraft/pull/4578
- Load Files into Stack: Photoshop's dialog with a Source Files list and the align option (#4671, #4696) by @itsF4LCON in https://github.com/storytold/photocraft/pull/4705
- Edit › Transform › Rotate and Skew no longer scale (#3941) by @vbasky in https://github.com/storytold/photocraft/pull/3986
- Open: warn about type in fonts that aren't installed (#4559) by @dhiorns15 in https://github.com/storytold/photocraft/pull/4576
- Status bar: wrap fullscreen zoom scrubbing at horizontal edges by @arthurdeka in https://github.com/storytold/photocraft/pull/3983
- Screen color picker: no DX12 crash, and the overlay can be left on Windows (#4443) by @zuujiscom in https://github.com/storytold/photocraft/pull/4704
- Add timeline playback to Save for Web previews by @jonathanwxh-cell in https://github.com/storytold/photocraft/pull/4703
- Free Transform: H and V skew fields in the options bar by @dhiorns15 in https://github.com/storytold/photocraft/pull/4699
- Channels: drag a channel onto New, Delete or Load Selection (#4689) by @dhiorns15 in https://github.com/storytold/photocraft/pull/4693
- Fit Image: the dialog is as narrow as its few fields by @marcoarnulfo in https://github.com/storytold/photocraft/pull/4692
- Move tool: the curved rotate arrow just outside its transform controls (#4658) by @itsF4LCON in https://github.com/storytold/photocraft/pull/4687
- perf(select): reuse run-table buffer in Feather horizontal pass by @rgoza1996 in https://github.com/storytold/photocraft/pull/4632
- Reject negative PSD style-sheet indexes by @vbasky in https://github.com/storytold/photocraft/pull/4631
- Keep the scrollbar thumb visible by @vbasky in https://github.com/storytold/photocraft/pull/4630
- Translate Turkish Amount as Miktar by @vbasky in https://github.com/storytold/photocraft/pull/4629
- Use a half-filled circle for adjustment thumbnails by @vbasky in https://github.com/storytold/photocraft/pull/4628
- Indent layer effects under their layer by @vbasky in https://github.com/storytold/photocraft/pull/4627
- Remove the dead gap between popup menu rows by @vbasky in https://github.com/storytold/photocraft/pull/4624
- Show (C)ancel on the unsaved-changes prompt by @vbasky in https://github.com/storytold/photocraft/pull/4622
- Apply Image: source layer, Scale and Offset in the dialog by @itrycodinganditsbad in https://github.com/storytold/photocraft/pull/4574
- feat(vector): add shape from selection with simplify tolerance (#214) by @seotarek in https://github.com/storytold/photocraft/pull/3954
- Channels: clicking RGB hides the alpha channel overlay by @marcoarnulfo in https://github.com/storytold/photocraft/pull/4564
- Fix: Preview pixelation in Sharpen filters by @AvrazAkraye in https://github.com/storytold/photocraft/pull/3936
- Brushes: a New Brush Preset dialog for every way of making a preset (#4490) by @itsF4LCON in https://github.com/storytold/photocraft/pull/4563
- fix(ui): expose custom paper dimensions in Print Settings by @zenjabba in https://github.com/storytold/photocraft/pull/3893
- Play real Photoshop action sets: TrueGrit .atn mappings and fixes (#4356, #219) by @VegaEX in https://github.com/storytold/photocraft/pull/4698
- New Document: blank presets follow the picked orientation and physical unit by @marcoarnulfo in https://github.com/storytold/photocraft/pull/4686
- Checkboxes: a pressed box shows it, as in Photoshop (#4476) by @dhiorns15 in https://github.com/storytold/photocraft/pull/4553
- fix(clipboard): prompt to save new documents containing pasted pixels by @Ni-zav in https://github.com/storytold/photocraft/pull/4683
- perf(text): applying preferences no longer waits for the system font scan (#4519) by @FinnNk in https://github.com/storytold/photocraft/pull/4679
- perf(ui): Channels thumbnails skip selection-only steps and reuse their textures (#4518) by @FinnNk in https://github.com/storytold/photocraft/pull/4678
- perf(engine): Fill, Stroke and Clear keep tiles the selection doesn't reach (#4517) by @FinnNk in https://github.com/storytold/photocraft/pull/4677
- Screen color picker: Esc, right-click and any click always end it (#4291) by @dhiorns15 in https://github.com/storytold/photocraft/pull/4636
- PSD save: keep the Lr16/Lr32 padding outside the block length by @marcoarnulfo in https://github.com/storytold/photocraft/pull/4663
- Filter dialogs: the preview keeps square pixels by @marcoarnulfo in https://github.com/storytold/photocraft/pull/4655
- Update Japanese translations in ja.tsv by @coolvitto in https://github.com/storytold/photocraft/pull/4651
- Cursors: the pen tools show their icon, and Caps Lock swaps it for the crosshair (#4639) by @dhiorns15 in https://github.com/storytold/photocraft/pull/4650
- Hue/Saturation: colour ranges apply in full to dull colours by @marcoarnulfo in https://github.com/storytold/photocraft/pull/4645
- Free Transform / Warp: Photoshop's Bicubic (Keys −0.75) and a reduction prefilter by @MrCloudy2 in https://github.com/storytold/photocraft/pull/4635
- Codecs: FITS keeps long CONTINUE strings intact on open and save by @webdevtodayjason in https://github.com/storytold/photocraft/pull/4633
- Layers panel: shape layers show a shape badge on their thumbnail (#4584) by @Higgs32584 in https://github.com/storytold/photocraft/pull/4619
- Brushes: Photoshop's measured round tip (hardness falloff and reach) by @MrCloudy2 in https://github.com/storytold/photocraft/pull/4617
- Gradient options bar: the swatch covers its checkerboard at half-pixel offsets by @marcoarnulfo in https://github.com/storytold/photocraft/pull/4616
- Layers panel menus: highlight the item a press-drag is over (#4601) by @itsF4LCON in https://github.com/storytold/photocraft/pull/4607
- Fill keys: Alt/Cmd+Backspace recolour the text of a type layer by @marcoarnulfo in https://github.com/storytold/photocraft/pull/4606
- Layers: right-clicking a layer-mask thumbnail opens the mask menu by @marcoarnulfo in https://github.com/storytold/photocraft/pull/4605
- Background Eraser: one pass clears the whole stroke by @itrycodinganditsbad in https://github.com/storytold/photocraft/pull/4552
- fix(engine): a pasted smart object keeps its PSD-embedded linked source (#3584) by @dottedt in https://github.com/storytold/photocraft/pull/3608
- CMYK: Invert, Posterize and Threshold on the inks; 16-bit Lab Invert keeps greys neutral by @timothydaly1 in https://github.com/storytold/photocraft/pull/3930
- fix(ui): click and hold on a toolbar button selects its tool (#4453) by @mjohnson7cd in https://github.com/storytold/photocraft/pull/4544
- OpenRaster: never overwrite an .ora with less than the document has (#3806) by @timothydaly1 in https://github.com/storytold/photocraft/pull/3881
- fix(ui): floating panel groups get an opaque title strip in Studio themes (#4509) by @mjohnson7cd in https://github.com/storytold/photocraft/pull/4543
- Fix main: duplicate Japanese rows and missing Serbian mask strings by @echelon in https://github.com/storytold/photocraft/pull/4793
- fix(text): preserve hyphenated PSD font identity on reopen by @zenjabba in https://github.com/storytold/photocraft/pull/3878
- feat(gpu): composite Blend If on the GPU (#4395) by @FinnNk in https://github.com/storytold/photocraft/pull/4541
- Pen: a close-path pointer over the first anchor (#4596) by @itsF4LCON in https://github.com/storytold/photocraft/pull/4612
- Color: Dot Gain 20%-compatible default working gray, as in Photoshop by @MrCloudy2 in https://github.com/storytold/photocraft/pull/4610
- perf(engine): Edit › Copy shares whole tiles instead of rebuilding them (#4516) by @FinnNk in https://github.com/storytold/photocraft/pull/4621
- Select › Sky: a white or grey backdrop that reaches the bottom is not sky by @switch87 in https://github.com/storytold/photocraft/pull/4638
- Properties: Align and Distribute with the Background in a multiple selection (#4608) by @itsF4LCON in https://github.com/storytold/photocraft/pull/4637
- Layers: Add vector mask makes the mask from the selected path and targets it by @marcoarnulfo in https://github.com/storytold/photocraft/pull/4740
- Handle signed coordinate limits in the Offset filter by @jonathanwxh-cell in https://github.com/storytold/photocraft/pull/4738
- perf(ui): Duotone and live-adjust display documents are built once per snapshot (#4527) by @FinnNk in https://github.com/storytold/photocraft/pull/4736
- Layers panel: clicking a row's lock icon unlocks the layer by @marcoarnulfo in https://github.com/storytold/photocraft/pull/4734
- perf(raster): mode and depth conversion keep shared tiles shared (#4531) by @FinnNk in https://github.com/storytold/photocraft/pull/4725
- feat(ui): bidirectional hover highlighting between Layers panel and canvas by @safvanedge in https://github.com/storytold/photocraft/pull/4719
- Filters: ⌘Z steps the open dialog's settings instead of the document by @marcoarnulfo in https://github.com/storytold/photocraft/pull/4715
- Keep close gradient stops on the CPU by @vbasky in https://github.com/storytold/photocraft/pull/4712
- perf(camera-raw): convert both previews in parallel bands (#4682) by @nicolasfalesy in https://github.com/storytold/photocraft/pull/4757
- perf(algo): filters read the selection once per tile when mixing it back (#4533) by @FinnNk in https://github.com/storytold/photocraft/pull/4754
- fix(batch): skip recorded Quick Export steps when writing batch output by @Ni-zav in https://github.com/storytold/photocraft/pull/4747
- fix(type): preserve keyboard focus when searching for fonts by @Ni-zav in https://github.com/storytold/photocraft/pull/4745
- feat(export): offer ICO in Export As with dimension validation by @Ni-zav in https://github.com/storytold/photocraft/pull/4744
- Fix print fuzzing and Windows crop GPU test fixtures by @Skyfuller1303 in https://github.com/storytold/photocraft/pull/4726
- feat(print): Printer menu lists the system's printers (file.printers) by @isaiahoadeoye-star in https://github.com/storytold/photocraft/pull/4748
- i18n(pt-br): fix 12 Brazilian Portuguese strings by @s17sh70x2jfl031ag in https://github.com/storytold/photocraft/pull/4796
- feat(new-document): add ISO B3 and B4 print presets by @Ni-zav in https://github.com/storytold/photocraft/pull/4784
- i18n(ru): fix counted status agreement and font weight labels by @VanTan666 in https://github.com/storytold/photocraft/pull/4787
- fix(input): support precision trackpad pinch zoom on Linux by @Ni-zav in https://github.com/storytold/photocraft/pull/4786
- Brush Settings: disable minimum inputs when Control is Off by @augrclk in https://github.com/storytold/photocraft/pull/4775
- Brush: the Mode dropdown shows in every theme, not only Pro by @marcoarnulfo in https://github.com/storytold/photocraft/pull/4537
- Channels: Channel Options dialog to make alpha channels spot colours (#3761) by @bommerts in https://github.com/storytold/photocraft/pull/3784
- fix(macos): default generated droplets to a user directory by @Ni-zav in https://github.com/storytold/photocraft/pull/4746
- fix(clipboard): paste JPEG, BMP and other non-PNG images on Wayland (#2546) by @nicolasfalesy in https://github.com/storytold/photocraft/pull/4752
- fix(format): contain directory-bundle symlinks without slow autosaves by @shmuelbiller1 in https://github.com/storytold/photocraft/pull/3942
- Scorecard: Smart Object corner skew and perspective is done (FILE-215-6, #426) by @FabioLissi in https://github.com/storytold/photocraft/pull/5094
- docs: credit Ufuk Efe in people.toml (#3809) by @yeniufuklar-com in https://github.com/storytold/photocraft/pull/5056
- Save for Web: JPEG chroma is full (4:4:4) above quality 50, as in Photoshop by @switch87 in https://github.com/storytold/photocraft/pull/4823
- Flat export: a Lab document with one layer isn't reported as flattened by @switch87 in https://github.com/storytold/photocraft/pull/4853
- TIFF: save uncompressed by default, like Photoshop by @marcoarnulfo in https://github.com/storytold/photocraft/pull/4491
- fix(segment): stop push/relabel looping forever on unreachable nodes by @LloydNicholson in https://github.com/storytold/photocraft/pull/4869
- PSD: a version 3 Photo Filter colour is XYZ relative to the D50 white (#4940) by @mroxso in https://github.com/storytold/photocraft/pull/4987
- Validate merged PSD channel indices before decoding by @Ni-zav in https://github.com/storytold/photocraft/pull/4994
- fix(psd): reserve imported layer IDs when allocating section dividers by @Ni-zav in https://github.com/storytold/photocraft/pull/4885
- fix(canvas): open small images at 100%, not at the display scale by @jyrkive in https://github.com/storytold/photocraft/pull/5089
- Brush Settings: no section title above the options pane (#3477) by @Higgs32584 in https://github.com/storytold/photocraft/pull/5017
- Save: a name without an extension gets the suggested one (#5039) by @mroxso in https://github.com/storytold/photocraft/pull/5049
- A file dropped on the canvas applies the open Free Transform and is placed at once by @marcoarnulfo in https://github.com/storytold/photocraft/pull/4849
- fix(ui): an open Free Transform box takes Zoom tool drags and clicks by @marcoarnulfo in https://github.com/storytold/photocraft/pull/4808
- Shapes: test that the options bar Fill swatch recolours the shape just drawn (#3997) by @itsF4LCON in https://github.com/storytold/photocraft/pull/4510
- Alerts: Enter is OK, but not the Enter that raised the alert (#4872) by @itsF4LCON in https://github.com/storytold/photocraft/pull/4880
- Toolbar: clicking a tool's button again closes its open flyout (#4932) by @dhiorns15 in https://github.com/storytold/photocraft/pull/4937
- Themes: default light theme to Pro Light to preserve the Pro layout (#5016) by @Sir-Starch in https://github.com/storytold/photocraft/pull/5029
- i18n(ru): translate dynamic selection, theme and measurement labels by @VanTan666 in https://github.com/storytold/photocraft/pull/4838
- Smart Filters: Delete removes the selected filter, not its smart object by @marcoarnulfo in https://github.com/storytold/photocraft/pull/4764
- Canvas: the CPU canvas shows crisp pixels when zoomed in by @marcoarnulfo in https://github.com/storytold/photocraft/pull/4825
- Layer Style applies an open Free Transform first, so its preview shows by @marcoarnulfo in https://github.com/storytold/photocraft/pull/4835
- fix(gradient): options-bar Opacity updates the live gradient layer (#5012) by @alonfaraj in https://github.com/storytold/photocraft/pull/5045
- Fix: native gesture fallback dedupe by @Ni-zav in https://github.com/storytold/photocraft/pull/5080
- Keep applied guide layouts visible after preview closes by @jonathanwxh-cell in https://github.com/storytold/photocraft/pull/5084
- Type options: the wheel over the font menu steps through the families (#3350) by @vangel76 in https://github.com/storytold/photocraft/pull/3524
- Navigator: one zoom row as in Photoshop: the percentage, Zoom Out, the slider and Zoom In (#4840) by @itsF4LCON in https://github.com/storytold/photocraft/pull/4854
- fix(ui): display uppercase hex values in the color picker by @Ni-zav in https://github.com/storytold/photocraft/pull/4859
- Pen: a new path joins the selected path instead of replacing the Work Path (#4721) by @itsF4LCON in https://github.com/storytold/photocraft/pull/4730
- Brush import: Dual Brush spacing comes from its tip (#4809) by @dhiorns15 in https://github.com/storytold/photocraft/pull/4889
- Fix Color Balance Preserve Luminosity with multiple midtone sliders by @Ni-zav in https://github.com/storytold/photocraft/pull/4990
- PNG: a whole-ppi pHYs reads back whole (300 ppi stays 300) by @switch87 in https://github.com/storytold/photocraft/pull/4857
- io: a tagged CMYK file's merged image reads through its own profile by @timothydaly1 in https://github.com/storytold/photocraft/pull/4948
- perf(raster): moving a layer no longer stores tiles of only the default pixel by @deadmeu in https://github.com/storytold/photocraft/pull/4844
- perf(gpu): closing a document frees what the compositor holds for it (#4529) by @FinnNk in https://github.com/storytold/photocraft/pull/4772
- Direct Selection: arrow keys nudge the selected anchors by @marcoarnulfo in https://github.com/storytold/photocraft/pull/4500
- Brushes: preset card size numbers stay clear of the tips (#4454) by @dhiorns15 in https://github.com/storytold/photocraft/pull/4485
- Shortcuts: ⌥⇧⌘N makes a new layer without the dialog (#4794) by @dhiorns15 in https://github.com/storytold/photocraft/pull/4807
- Brush Settings: use an amount slider for Hue Jitter by @augrclk in https://github.com/storytold/photocraft/pull/4874
- Keep custom title bar draggable while dialogs are open by @imSlicedBread in https://github.com/storytold/photocraft/pull/4913
- Assign Profile: list only profiles of the document's colour mode (#4951) by @Higgs32584 in https://github.com/storytold/photocraft/pull/5020
- Symmetry: Transform Symmetry gets commit/cancel buttons and its own cursors (#4495) by @dhiorns15 in https://github.com/storytold/photocraft/pull/4508
- Layers: Ctrl+Alt+G releases the clipping mask when pressed again, as in Photoshop by @OctaNebula in https://github.com/storytold/photocraft/pull/4927
- UI fonts: draw a variable CJK fallback at Regular, not Thin (#4820) by @dhiorns15 in https://github.com/storytold/photocraft/pull/4830
- Smart Filters: drag a filter up or down its stack to reorder it by @abc2cb in https://github.com/storytold/photocraft/pull/4897
- New Document: a custom background colour, from Custom… or the swatch beside the menu (#4789) by @itsF4LCON in https://github.com/storytold/photocraft/pull/4801
- Polygonal Lasso: drop the polygon on a document switch by @avdyliisni9-png in https://github.com/storytold/photocraft/pull/5015
- fix(ui): Match Color's preview reads the Source document (#4851) by @kavishkashehan726-sudo in https://github.com/storytold/photocraft/pull/4886
- Control: list and answer the unsaved-changes prompt (#4920) by @dhiorns15 in https://github.com/storytold/photocraft/pull/4924
- fix(ui): show a magnifier cursor for the Zoom tool on Windows (#3735) by @bommerts in https://github.com/storytold/photocraft/pull/3783
- Preset panels: the footer stays in view in a short dock group (#4790) by @dhiorns15 in https://github.com/storytold/photocraft/pull/4824
- perf(ui): the Navigator draws the GPU canvas's texture instead of a CPU thumbnail (#4518) by @FinnNk in https://github.com/storytold/photocraft/pull/4701
- Filters: Photoshop's Blur More kernel, Find Edges strength and Polar Coordinates direction by @MrCloudy2 in https://github.com/storytold/photocraft/pull/4652
- perf(compose): the shape stroke split cache keeps to a byte budget and empties on Purge (#4530) by @FinnNk in https://github.com/storytold/photocraft/pull/4774
- fix(gpu): invalidate pattern cache for default and format changes by @haranishi in https://github.com/storytold/photocraft/pull/5013
- Text: binary-search the run lookup and probe smcp once per layout (#4430) by @vangel76 in https://github.com/storytold/photocraft/pull/4432
- Palette PNGs open in Indexed Color mode with their colour table by @marcoarnulfo in https://github.com/storytold/photocraft/pull/4817
- fix(compose): redraw shapes crossing canvas bounds and include vector bounds in damage (#3946) by @seotarek in https://github.com/storytold/photocraft/pull/4493
- Distort: a quad dragged past the horizon draws only its front side, in the preview and the result (#4863) by @itsF4LCON in https://github.com/storytold/photocraft/pull/4870
- Select › Color Range: Skin Tones by @switch87 in https://github.com/storytold/photocraft/pull/4473
- Give Image Statistics a source-file dialog and stack mode selector by @jonathanwxh-cell in https://github.com/storytold/photocraft/pull/4778
- Pen: Ctrl/Cmd edits the path being drawn in place (#4022) by @bazmarth in https://github.com/storytold/photocraft/pull/4526
- Fix Export As freeze on large layered PSDs by @StopCodeToTrain in https://github.com/storytold/photocraft/pull/5104
- Preferences › Interface: Photoshop's Appearance / Presentation / Options layout (#2532) by @davidmann4 in https://github.com/storytold/photocraft/pull/2589
- Web: show the brush preset storage banner only while a change is unsaved by @kuvshin888 in https://github.com/storytold/photocraft/pull/4918
- Curves: points outside 0..255 are refused, as the message says by @switch87 in https://github.com/storytold/photocraft/pull/4868
- Clip Fill source reads to the canvas before allocating by @vbasky in https://github.com/storytold/photocraft/pull/4590
- Report allocation failures when clearing a color channel by @vbasky in https://github.com/storytold/photocraft/pull/4589
- Channels: keep the cached composite across view-only changes by @persi-man in https://github.com/storytold/photocraft/pull/4915
- info: adjustment layers are reported with the params their command takes by @switch87 in https://github.com/storytold/photocraft/pull/4871
- Preserve the document when Fade cannot allocate pixel buffers by @vbasky in https://github.com/storytold/photocraft/pull/4593
- feat(select): preserve existing mask metadata and allow explicit target in refineEdge by @seotarek in https://github.com/storytold/photocraft/pull/4499
- perf(paint): sampled tips share their samples, so cloning brush settings is cheap (#4534) by @FinnNk in https://github.com/storytold/photocraft/pull/4798
- fix(gpu): require consent to persist CPU recovery by @Ni-zav in https://github.com/storytold/photocraft/pull/3539
- Smart Objects › Export Contents: another extension exports the contents in that format by @switch87 in https://github.com/storytold/photocraft/pull/4847
- fix(window): reopen at the saved window position instead of re-centri… by @kavishkashehan726-sudo in https://github.com/storytold/photocraft/pull/4850
- Count document patterns in history budgets by @jonathanwxh-cell in https://github.com/storytold/photocraft/pull/5105
- info: a smart object embedded in a PSD is reported as embedded by @switch87 in https://github.com/storytold/photocraft/pull/4843
- Layer locks: locking the pixels clears the transparency lock, as in Photoshop (#4892) by @itsF4LCON in https://github.com/storytold/photocraft/pull/4898
- Swatches: importing an .ase file numbers repeated group names in linear time by @dotCooCoo in https://github.com/storytold/photocraft/pull/5087
- Layers: Cmd/Ctrl-click New Layer adds the layer below the current one by @seanhellwig in https://github.com/storytold/photocraft/pull/4475
- Docs: document the engine.commands reply shape (#3684) by @davidmann4 in https://github.com/storytold/photocraft/pull/3750
- perf(engine): lasso and polygon selections rasterise only the rows they span (#4532) by @FinnNk in https://github.com/storytold/photocraft/pull/4773
- Replace Color: Localized Color Clusters (points, localized, range) by @switch87 in https://github.com/storytold/photocraft/pull/4477
- perf: encode and quantize canvas pixels in parallel (display_color, Buffer::to_rgba8) by @nicolasfalesy in https://github.com/storytold/photocraft/pull/4768
- Puppet Warp: a linked layer mask moves with the pixels (#4910) by @DeWarePeb in https://github.com/storytold/photocraft/pull/4989
- fix(type): missing-font checks follow layout's PostScript resolution; split hyphenless style suffixes by @kijoong-kim in https://github.com/storytold/photocraft/pull/608
- Layer: Duplicate Layer to a new document, as in Photoshop by @abdul-karim-mia in https://github.com/storytold/photocraft/pull/4805
- History: jump to a state in one step (history.selectState) (#2966) by @davidmann4 in https://github.com/storytold/photocraft/pull/3533
- Wrap Clone Stamp strokes and sampling in Pattern Preview by @jonathanwxh-cell in https://github.com/storytold/photocraft/pull/4997
- Brush: remember the last selected brush across restarts (split from #2516) by @siraxe in https://github.com/storytold/photocraft/pull/3472
- Large document: full CPU canvas redraws run in the background, visible part first (#4024) by @ianswope in https://github.com/storytold/photocraft/pull/5001
- PSD: Backgrounds survive a round trip through PhotoCraft by @MrCloudy2 in https://github.com/storytold/photocraft/pull/3560
- fix(psd): prioritize 16-bit and 32-bit global layer blocks over compatibility section (#4928) by @Sir-Starch in https://github.com/storytold/photocraft/pull/4950
- fix(segment): let Remove Background's cancel stop Select Subject's min cuts by @LloydNicholson in https://github.com/storytold/photocraft/pull/4878
- Speed up Blur/Sharpen convolution while preserving exact output by @jonathanwxh-cell in https://github.com/storytold/photocraft/pull/4511
- Add filename templates to Batch export by @jonathanwxh-cell in https://github.com/storytold/photocraft/pull/4466
- Profile prompts on open: one file at a time, before it opens, and the answer goes to that file by @kayrockscreenprinting in https://github.com/storytold/photocraft/pull/3471
- Blur Gallery: Field Blur pins on the image (#3373) by @timothydaly1 in https://github.com/storytold/photocraft/pull/3801
- i18n(de): translate the labels that were still English (344 entries) and fix three display bugs by @DomiLuebben in https://github.com/storytold/photocraft/pull/4008
- Auto-Blend Stack Images: a depth map by depth from focus, for Lens Blur by @ragtux in https://github.com/storytold/photocraft/pull/2073
- PSD: parallel RLE for the merged image; layer channels decode and gather on all cores by @Elvis33LE in https://github.com/storytold/photocraft/pull/2754
- Speed up large-radius Unsharp Mask with guarded FFT convolution by @optimalbytee in https://github.com/storytold/photocraft/pull/2987
- Decode Panasonic RW2 RawFormat 3/4 (vendor-compressed sensor data) by @Gotya-OFFCIAL in https://github.com/storytold/photocraft/pull/3286
- Rulers: drag the zero point from the ruler corner, double-click resets it (#2955) by @davidmann4 in https://github.com/storytold/photocraft/pull/3505
- TIFF: write and read EXIF as the file's own Exif and GPS directories by @switch87 in https://github.com/storytold/photocraft/pull/4876
- fix(gpu): contain errors in unwatched compositor work by @haranishi in https://github.com/storytold/photocraft/pull/4894
- Deep EXR: open cropped renders on their full display-window stage by @Elvis33LE in https://github.com/storytold/photocraft/pull/4907
- Stroke layer effect: the outer edge stays round at wide sizes (#3646) by @dottedt in https://github.com/storytold/photocraft/pull/3650
- Stroke latency trace: PHOTOCRAFT_STROKE_TRACE times each frame of a brush stroke (#1343) by @tanish2k09 in https://github.com/storytold/photocraft/pull/4403
- Share native Windows driver settings and RGB printing through craft-print by @skylartaylor in https://github.com/storytold/photocraft/pull/4599
- Print on Windows: printer list, driver Print Settings, GDI printing by @Moiztermind in https://github.com/storytold/photocraft/pull/3013
- docs: write product name as PhotoCraft in development guide by @wwewtech in https://github.com/storytold/photocraft/pull/5228
- docs: drop stale missing-tool rows, only Art History Brush is missing by @LorenzoFasolino in https://github.com/storytold/photocraft/pull/5063
- Docs: oracle floor, open issues, workspace size and layer filters match main (#5376) by @Higgs32584 in https://github.com/storytold/photocraft/pull/5382
- PSD import: ResolutionInfo is pixels per inch whatever the display unit by @Zer0C00L01 in https://github.com/storytold/photocraft/pull/5280
- fix(prefs): preserve selected themes during legacy migration by @VanTan666 in https://github.com/storytold/photocraft/pull/5179
- Color Range presets: weigh dark colours like Photoshop (#5243) by @switch87 in https://github.com/storytold/photocraft/pull/5293
- Reject clipboard origins that cannot form a new document by @vbasky in https://github.com/storytold/photocraft/pull/4586
- Return channel copy allocation errors while keeping the clipboard by @vbasky in https://github.com/storytold/photocraft/pull/4587
- Check selection modification limits before reading the canvas mask by @vbasky in https://github.com/storytold/photocraft/pull/4591
- Background: an opacity, fill, blend mode or Select and Mask layer mask makes it Layer 0 by @switch87 in https://github.com/storytold/photocraft/pull/4837
- Fibers: fill an empty layer, as Photoshop does (#5241) by @switch87 in https://github.com/storytold/photocraft/pull/5289
- Object Selection: say so when the sampled layer is empty (#5246) by @switch87 in https://github.com/storytold/photocraft/pull/5298
- layer.setProps: refuse opacity and fill outside 0..1 (#5242) by @switch87 in https://github.com/storytold/photocraft/pull/5291
- test(engine): add Color Range fuzziness 0 exact-match test (TOOL-214-3) by @nicolasfalesy in https://github.com/storytold/photocraft/pull/3581
- panic_hunt: count panics that Session::execute contains (#4982) by @prekabreki in https://github.com/storytold/photocraft/pull/5219
- Drop shadow: knocked out beneath the whole shape when the layer's mode blends with it by @Deeev201 in https://github.com/storytold/photocraft/pull/5304
- Layer masks: Reveal Selection drops the selection, as Photoshop does by @abc2cb in https://github.com/storytold/photocraft/pull/5251
- PSD: Mt16/Mt32 blocks mark the merged image's transparency (no spurious Transparency channel) by @timothydaly1 in https://github.com/storytold/photocraft/pull/5178
- IO: ABR fit and gradient bake check their own bounds (io audit S1) by @vangel76 in https://github.com/storytold/photocraft/pull/5218
- Tests: bad-layer-id checks use an id that can't exist (#3343) by @vangel76 in https://github.com/storytold/photocraft/pull/3351
- fix(format): keep and list committed autosave bundles whose sidecar was never written (#4967) by @MarekSpodBiedry in https://github.com/storytold/photocraft/pull/5076
- @cloudalister made their first contribution in https://github.com/storytold/photocraft/pull/3990
- @FabioLissi made their first contribution in https://github.com/storytold/photocraft/pull/4434
- @marcoarnulfo made their first contribution in https://github.com/storytold/photocraft/pull/4079
- @aweussom made their first contribution in https://github.com/storytold/photocraft/pull/4396
- @Furash made their first contribution in https://github.com/storytold/photocraft/pull/4105
- @augrclk made their first contribution in https://github.com/storytold/photocraft/pull/4463
- @lucAmbr0 made their first contribution in https://github.com/storytold/photocraft/pull/4290
- @przemyslvw made their first contribution in https://github.com/storytold/photocraft/pull/4104
- @Hevarh1 made their first contribution in https://github.com/storytold/photocraft/pull/4224
- @dotCooCoo made their first contribution in https://github.com/storytold/photocraft/pull/4054
- @syncroot made their first contribution in https://github.com/storytold/photocraft/pull/4062
- @TheDankness made their first contribution in https://github.com/storytold/photocraft/pull/4129
- @xtellarvoid made their first contribution in https://github.com/storytold/photocraft/pull/4337
- @persi-man made their first contribution in https://github.com/storytold/photocraft/pull/4314
- @deadmeu made their first contribution in https://github.com/storytold/photocraft/pull/4217
- @megaDon101 made their first contribution in https://github.com/storytold/photocraft/pull/4447
- @bazmarth made their first contribution in https://github.com/storytold/photocraft/pull/4540
- @RavoxX made their first contribution in https://github.com/storytold/photocraft/pull/4194
- @Minischatten made their first contribution in https://github.com/storytold/photocraft/pull/4261
- @Dejan-Port made their first contribution in https://github.com/storytold/photocraft/pull/4436
- @sssehnsuchttt made their first contribution in https://github.com/storytold/photocraft/pull/4439
- @zuujiscom made their first contribution in https://github.com/storytold/photocraft/pull/4704
- @rgoza1996 made their first contribution in https://github.com/storytold/photocraft/pull/4632
- @AvrazAkraye made their first contribution in https://github.com/storytold/photocraft/pull/3936
- @VegaEX made their first contribution in https://github.com/storytold/photocraft/pull/4698
- @webdevtodayjason made their first contribution in https://github.com/storytold/photocraft/pull/4633
- @Higgs32584 made their first contribution in https://github.com/storytold/photocraft/pull/4619
- @safvanedge made their first contribution in https://github.com/storytold/photocraft/pull/4719
- @isaiahoadeoye-star made their first contribution in https://github.com/storytold/photocraft/pull/4748
- @VanTan666 made their first contribution in https://github.com/storytold/photocraft/pull/4787
- @jyrkive made their first contribution in https://github.com/storytold/photocraft/pull/5089
- @OctaNebula made their first contribution in https://github.com/storytold/photocraft/pull/4927
- @avdyliisni9-png made their first contribution in https://github.com/storytold/photocraft/pull/5015
- @haranishi made their first contribution in https://github.com/storytold/photocraft/pull/5013
- @StopCodeToTrain made their first contribution in https://github.com/storytold/photocraft/pull/5104
- @seanhellwig made their first contribution in https://github.com/storytold/photocraft/pull/4475
- @DeWarePeb made their first contribution in https://github.com/storytold/photocraft/pull/4989
- @abdul-karim-mia made their first contribution in https://github.com/storytold/photocraft/pull/4805
- @wwewtech made their first contribution in https://github.com/storytold/photocraft/pull/5228
- @LorenzoFasolino made their first contribution in https://github.com/storytold/photocraft/pull/5063
- @Zer0C00L01 made their first contribution in https://github.com/storytold/photocraft/pull/5280
- @Deeev201 made their first contribution in https://github.com/storytold/photocraft/pull/5304
Full Changelog: https://github.com/storytold/photocraft/compare/v0.8.2...v0.9.0
PhotoCraft v0.8.2
- Adopt shared docking while preserving panel controls and workspaces by @skylartaylor in https://github.com/storytold/photocraft/pull/3097
- GPU composite: reuse unchanged lower-stack chunks for property edits by @Elvis33LE in https://github.com/storytold/photocraft/pull/1169
- Design: bounded GPU stack prefix reuse for property edits by @Elvis33LE in https://github.com/storytold/photocraft/pull/1164
- feat(ui): allow disabling Studio canvas background dots by @Ni-zav in https://github.com/storytold/photocraft/pull/2317
- File Info shows Camera Data from EXIF/XMP (#2424) by @itrycodinganditsbad in https://github.com/storytold/photocraft/pull/2692
- fix(canvas): update Move transform-control cursors on first hover by @Ni-zav in https://github.com/storytold/photocraft/pull/2887
- Releasing a brush stroke no longer freezes: the commit takes the pixels the live stroke already drew (P32: 136 ms → 0.8 ms) by @tanish2k09 in https://github.com/storytold/photocraft/pull/2131
- fix(brush): interpolate pen pressure across Shift-click connecting strokes by @Ni-zav in https://github.com/storytold/photocraft/pull/2890
- fix(transform): commit Free Transform on an outside click by @Ni-zav in https://github.com/storytold/photocraft/pull/2909
- app.save: encode on the save worker, not the UI thread (#2488) by @ahmedhosnypro in https://github.com/storytold/photocraft/pull/2517
- fix(shortcuts): reject malformed bindings and correctly display Plus by @Ni-zav in https://github.com/storytold/photocraft/pull/3006
- Favorite themes from the appearance button's right-click menu by @luniiya in https://github.com/storytold/photocraft/pull/2445
- Render Video: animated GIFs keep their transparency (#3061) by @fabianghe in https://github.com/storytold/photocraft/pull/3162
- fix(type): exclude text inside hidden groups from automatic hit testing by @Ni-zav in https://github.com/storytold/photocraft/pull/3173
- Enhanced Controls: wire Zoom with Trackpad Pinch (#204) by @reynold-hu in https://github.com/storytold/photocraft/pull/2577
- Units & Rulers: wire the Type units preference (#204) by @reynold-hu in https://github.com/storytold/photocraft/pull/2587
- fix(type): use the correct line at soft-wrap caret boundaries by @Ni-zav in https://github.com/storytold/photocraft/pull/3174
- fix(masks): preserve off-canvas alpha in From Transparency by @Ni-zav in https://github.com/storytold/photocraft/pull/3177
- Rulers: keep tick marks and labels out of the origin corner by @arthurdeka in https://github.com/storytold/photocraft/pull/2617
- fix(psd): Improve interoperability and decoding by @reneleonhardt in https://github.com/storytold/photocraft/pull/1955
- fix(layers): remap linked-layer groups when copying between documents by @Ni-zav in https://github.com/storytold/photocraft/pull/3178
- Brush HUD: wire Vary Round Brush Hardness and Brush Preview Color (#204) by @reynold-hu in https://github.com/storytold/photocraft/pull/2640
- fix(history): preserve an empty layer selection across undo and redo by @Ni-zav in https://github.com/storytold/photocraft/pull/3179
- Auto-Align Layers: register focus and exposure brackets by intensity when there is nothing to match by @ragtux in https://github.com/storytold/photocraft/pull/2065
- Double-clicking a mask thumbnail in the Layers panel now opens that mask's settings by @Lyraedan in https://github.com/storytold/photocraft/pull/2654
- fix(layers): select Shift ranges in visible panel row order (#3041) by @Ni-zav in https://github.com/storytold/photocraft/pull/3180
- Auto-Blend Stack Images: fuse the merged layer per pyramid level by region energy, with halo control by @ragtux in https://github.com/storytold/photocraft/pull/2044
- fix(io): preserve group fill opacity in OpenRaster exports by @Ni-zav in https://github.com/storytold/photocraft/pull/3181
- Control channel: input methods reject bad params instead of using defaults (#2449) by @itrycodinganditsbad in https://github.com/storytold/photocraft/pull/2656
- fix(vector): pivot explicit path transforms on target layer (#3062) by @Ni-zav in https://github.com/storytold/photocraft/pull/3183
- General: wire Beep When Done for finished background jobs (#204) by @reynold-hu in https://github.com/storytold/photocraft/pull/2658
- fix(vector): preserve scaled live-line thickness during endpoint edits by @Ni-zav in https://github.com/storytold/photocraft/pull/3184
- fix(actions): avoid replaying Browse script edits twice by @Ni-zav in https://github.com/storytold/photocraft/pull/3190
- i18n test: scan past small test modules; translate what it was missing by @herzer in https://github.com/storytold/photocraft/pull/2660
- fix(masks): bake feathered coverage when applying a layer mask by @Ni-zav in https://github.com/storytold/photocraft/pull/3191
- Type: wire Font Preview Size for the font menu samples (#204) by @reynold-hu in https://github.com/storytold/photocraft/pull/2668
- fix(video): retain original footage for Restore Frame and Show Altered Video by @Ni-zav in https://github.com/storytold/photocraft/pull/3192
- Improve zoomed Liquify preview detail by @Elvis33LE in https://github.com/storytold/photocraft/pull/2715
- fix(compose): preserve Dissolve coverage for adjustments, styles and clipping by @Ni-zav in https://github.com/storytold/photocraft/pull/3195
- Color Replacement tool on the toolbar (#1045) by @itrycodinganditsbad in https://github.com/storytold/photocraft/pull/2719
- fix(shapes): preserve transformed outline on unchanged live geometry edits by @Ni-zav in https://github.com/storytold/photocraft/pull/3197
- Crop tool: New / Delete Crop Preset saves and removes user presets (#1919) by @davidmann4 in https://github.com/storytold/photocraft/pull/2723
- Test Move layer edges across bit depths and view modes by @Skyfuller1303 in https://github.com/storytold/photocraft/pull/2738
- fix(type): preserve formatting for trailing empty paragraphs by @Ni-zav in https://github.com/storytold/photocraft/pull/3198
- Keep custom crop ratio fields editable by @imSlicedBread in https://github.com/storytold/photocraft/pull/3209
- raw: fit non-DNG colour to the camera's embedded JPEG by @switch87 in https://github.com/storytold/photocraft/pull/2135
- Add Anchor Point and Delete Anchor Point tools (#1044) by @itrycodinganditsbad in https://github.com/storytold/photocraft/pull/2756
- fix(crop): stabilize resizing and apply ratio changes immediately by @TheTeslak in https://github.com/storytold/photocraft/pull/3206
- Layers panel: load a fallback font for layer names in other scripts (#2275) by @itrycodinganditsbad in https://github.com/storytold/photocraft/pull/2758
- Type: ⇧⌘> / ⇧⌘< change the type size (and work on Nordic/German layouts) by @Simonfalentinolesen in https://github.com/storytold/photocraft/pull/2402
- CLI: batch plays an action from an Actions set with the whole set loaded (#2786) by @vangel76 in https://github.com/storytold/photocraft/pull/2792
- Droplets: carry the actions their Play Action steps call (#2794) by @vangel76 in https://github.com/storytold/photocraft/pull/2800
- Spot Healing: Content-Aware dab no longer scans every patch in full (#2771) by @vangel76 in https://github.com/storytold/photocraft/pull/2805
- Layers: double-click a shape layer's thumbnail to pick its fill colour (#2812) by @vangel76 in https://github.com/storytold/photocraft/pull/2820
- TGA: targa options asks for 24 or 32 bits/pixel, same as in Photoshop by @Matty-PW in https://github.com/storytold/photocraft/pull/2760
- Tools: remember tool options between launches (#2814) by @vangel76 in https://github.com/storytold/photocraft/pull/2822
- Options bar: Reset Tool and Reset All Tools (#2825) by @vangel76 in https://github.com/storytold/photocraft/pull/2830
- Free Transform: right-click menu with the transform modes, rotate and flip (#2832) by @vangel76 in https://github.com/storytold/photocraft/pull/2840
- Channels: Edit › Transform works on a targeted alpha channel (#2835) by @vangel76 in https://github.com/storytold/photocraft/pull/2845
- Free Transform: themed rotate cursor and live angle/size/offset readout (#1767) by @itrycodinganditsbad in https://github.com/storytold/photocraft/pull/2809
- Move tool: drag a marquee from an empty spot to select the layers it touches (#2844) by @vangel76 in https://github.com/storytold/photocraft/pull/2852
- View: Pattern Preview tiles the document around the canvas (#1067) by @davidmann4 in https://github.com/storytold/photocraft/pull/2803
- Tools: Freeform Pen and Curvature Pen (#1054) by @vangel76 in https://github.com/storytold/photocraft/pull/2856
- Tools: Horizontal and Vertical Type Mask (#1055) by @vangel76 in https://github.com/storytold/photocraft/pull/2861
- Speed up large feathered mask refreshes by @Elvis33LE in https://github.com/storytold/photocraft/pull/2417
- Tools: Artboard tool (#2858) by @vangel76 in https://github.com/storytold/photocraft/pull/2862
- Tools: Perspective Crop (#1043) by @vangel76 in https://github.com/storytold/photocraft/pull/2864
- Actions: toggle, reorder and delete single steps (#2855) by @vangel76 in https://github.com/storytold/photocraft/pull/2866
- Text fields: drag-selecting in a single-line field follows the pointer's x (#1946) by @davidmann4 in https://github.com/storytold/photocraft/pull/2821
- perf: repeated Select Subject answers from the last mask (#2865) by @vangel76 in https://github.com/storytold/photocraft/pull/2870
- Dropdowns: press, drag onto an option and release to choose it (#2735) by @LloydNicholson in https://github.com/storytold/photocraft/pull/2854
- perf: Select › Modify › Feather/Smooth on 24 MP within budget (#2873) by @vangel76 in https://github.com/storytold/photocraft/pull/2882
- Refine gradient stop controls in Properties and Gradient Editor by @Skyfuller1303 in https://github.com/storytold/photocraft/pull/2859
- perf: duplicating a layer recomposites only where the copy draws (#2883) by @vangel76 in https://github.com/storytold/photocraft/pull/2884
- Status bar: buttons sit inside the bar with centred labels (#2823) by @davidmann4 in https://github.com/storytold/photocraft/pull/2876
- perf: keep resident GPU tiles and convert 32-bit tiles directly for brush dabs on large documents (#2900) by @vangel76 in https://github.com/storytold/photocraft/pull/2902
- Themes: Photoshop's light-gray and light Pro brightness levels (#2661) by @ngrafton2006 in https://github.com/storytold/photocraft/pull/2892
- scorecard: twenty rows describe work that is already in the tree by @Erica4fr in https://github.com/storytold/photocraft/pull/2894
- perf: marquee selections on large documents are built row by row (#2888) by @vangel76 in https://github.com/storytold/photocraft/pull/2907
- Tools: Frame tool (#2914) by @vangel76 in https://github.com/storytold/photocraft/pull/2915
- Add Photoshop-style guide layout dialog and live preview by @Skyfuller1303 in https://github.com/storytold/photocraft/pull/2930
- perf: pasting a layer recomposites only where it draws (#2901) by @vangel76 in https://github.com/storytold/photocraft/pull/2917
- Image Size: Photoshop's resampling, measured by @Unemars in https://github.com/storytold/photocraft/pull/2451
- Toolbar: Pro themes draw tool glyphs at two thirds of the button (#2665) by @ngrafton2006 in https://github.com/storytold/photocraft/pull/2932
- MCP bridge: reconnect before idle sockets die, retry reads, actionable timeouts (#2487) by @ahmedhosnypro in https://github.com/storytold/photocraft/pull/2507
- Dropdowns: type a letter to jump to an item, Enter to choose (#1481) by @davidmann4 in https://github.com/storytold/photocraft/pull/2948
- Layers: right-click an effect row for the layer style menu (#2846) by @davidmann4 in https://github.com/storytold/photocraft/pull/2950
- Smart Objects: linked smart objects follow their files while open by @KattKnight in https://github.com/storytold/photocraft/pull/2510
- Place: wire Always Create Smart Objects When Placing (#204) by @reynold-hu in https://github.com/storytold/photocraft/pull/2543
- Preferences: wire Tools › Show Transformation Values (#204) by @timothydaly1 in https://github.com/storytold/photocraft/pull/2953
- Channels: keep RGB off while an alpha or mask is shown, and select from that channel. by @Desayuno64 in https://github.com/storytold/photocraft/pull/2555
- Tools: wire Enable Flick Panning for the Hand tool (#204) by @davidmann4 in https://github.com/storytold/photocraft/pull/2964
- app.open: open directory .pcraft through the automation read root (#2490) by @ahmedhosnypro in https://github.com/storytold/photocraft/pull/2581
- Layers: Pattern Fill dialog for new and edited pattern fill layers (#2908) by @davidmann4 in https://github.com/storytold/photocraft/pull/2979
- Layer Style: contour picker and Contour Editor (#2912) by @vangel76 in https://github.com/storytold/photocraft/pull/2949
- Type: wire Show Font Names in English (#204) by @davidmann4 in https://github.com/storytold/photocraft/pull/2981
- Text fields: right-click edit menu (#2921) by @vangel76 in https://github.com/storytold/photocraft/pull/2952
- control: allow requests that operate an open Camera Raw dialog by @harrisonoconnorhover in https://github.com/storytold/photocraft/pull/2988
- Pixel grid: fade the line colour across mid-tones instead of flipping at one luma by @Jeremy8776 in https://github.com/storytold/photocraft/pull/2990
- Tests: the marquee ellipse check walks several dash periods of the curve by @ahmedhosnypro in https://github.com/storytold/photocraft/pull/3018
- Fix Shape Stroke controls, popup interactions and paint colours by @optimalbytee in https://github.com/storytold/photocraft/pull/3019
- Fix canvas context menus closing immediately on trackpad taps by @zi-ger in https://github.com/storytold/photocraft/pull/3029
- 8-bit documents: soft, low-flow brush strokes are dithered instead of banded by @tanish2k09 in https://github.com/storytold/photocraft/pull/3237
- fix(ui): reduced suffix spacing width in the value field to prevent overflow (#3040) by @peppepol in https://github.com/storytold/photocraft/pull/3084
- Rulers: remember View › Rulers for new documents; guides as f64 (#2918) by @vangel76 in https://github.com/storytold/photocraft/pull/2954
- Mirror the shell for right-to-left UI languages (DIST-220-4) by @MathMattTech in https://github.com/storytold/photocraft/pull/3114
- Type: Edit › Paste, Copy and Select › All work on the text being typed (#2893) by @vangel76 in https://github.com/storytold/photocraft/pull/2960
- New Document: presets follow Units & Rulers › Preset Resolutions (#204) by @paulo-vc in https://github.com/storytold/photocraft/pull/3126
- Dialogs: the live dialog stays in front of older ones (stuck stacked profile prompts) by @kayrockscreenprinting in https://github.com/storytold/photocraft/pull/3140
- Window menu: list the open documents, the active one checked (#2991) by @brennanMKE in https://github.com/storytold/photocraft/pull/3147
- fix(ui): respect explicit dropdown defaults in schema dialogs (#3056) by @buivanvu94 in https://github.com/storytold/photocraft/pull/3149
- PSD: don't inflate an over-budget ZIP merged image at parse time (#2926) by @vangel76 in https://github.com/storytold/photocraft/pull/2967
- i18n(es): native-style review of the Spanish catalog (Dodge/Burn swap, Photoshop terminology, formal register) by @diegozpy in https://github.com/storytold/photocraft/pull/3154
- Type tool: right-click menu while editing text (#2968) by @vangel76 in https://github.com/storytold/photocraft/pull/2969
- Preserve HDR range in float adjustments and stack statistics by @grlessa in https://github.com/storytold/photocraft/pull/2592
- Speed up large Content-Aware Scale operations by @Elvis33LE in https://github.com/storytold/photocraft/pull/2596
- fix(zoom): Alt-click with the Zoom tool on desktops that take Alt+cli… by @kavishkashehan726-sudo in https://github.com/storytold/photocraft/pull/3164
- Select and Mask: live preview in Photoshop's view modes (#1754) by @vangel76 in https://github.com/storytold/photocraft/pull/2970
- Five exact-output speedups: dense Extrude 160s to 0.39s by @excited-raccoon in https://github.com/storytold/photocraft/pull/2685
- fix(ui): respect native desktop scale under Auto UI scaling (#1278) by @dylanmtaylor in https://github.com/storytold/photocraft/pull/3165
- fix: macOS Monterey crash on Intel Iris Pro (disable wgpu indirect validation) by @mjohnson7cd in https://github.com/storytold/photocraft/pull/3171
- fix(engine): allow targeting layer mask and vector mask via channel.target (#2458) by @buivanvu94 in https://github.com/storytold/photocraft/pull/2705
- Tools: Convert Point tool in the Pen flyout (#3204) by @Sir-Starch in https://github.com/storytold/photocraft/pull/3211
- fix(ui): unchanged Custom Proof Setup replaces active document proof profile (#3055) by @buivanvu94 in https://github.com/storytold/photocraft/pull/3213
- PSD: cap the layer tree in psd_to_document; layered TIFF checks group depth (#2940) by @vangel76 in https://github.com/storytold/photocraft/pull/2975
- Type menu: Anti-Alias › None first and checked; checks follow the edited layer (#2983) by @vangel76 in https://github.com/storytold/photocraft/pull/2984
- fix(ui): Global Light opens with stale values and overwrites document setting (#3054) by @buivanvu94 in https://github.com/storytold/photocraft/pull/3217
- Color Sampler tool (#1046) by @roaldosulejmani in https://github.com/storytold/photocraft/pull/2753
- Clip the checker under rounded colour swatches to their corners (#3208) by @myangaa1 in https://github.com/storytold/photocraft/pull/3363
- ci: refactor workflows to use storytold/craft-common-actions by @dylanmtaylor in https://github.com/storytold/photocraft/pull/3432
- Speed up Tilt-Shift with existing per-level halo trimming by @optimalbytee in https://github.com/storytold/photocraft/pull/2880
- Select and Mask: Refine Edge Brush (#2972) by @vangel76 in https://github.com/storytold/photocraft/pull/2989
- Layers: Combine Shapes merges the selected shape layers (#2400) by @davidmann4 in https://github.com/storytold/photocraft/pull/2906
- Move dock tabs between groups individually by @imSlicedBread in https://github.com/storytold/photocraft/pull/3239
- Add built-in rainbow gradient presets by @Myosh1 in https://github.com/storytold/photocraft/pull/2916
- Native brush outline and crosshair cursors on macOS, X11 and Wayland (#1343) by @tanish2k09 in https://github.com/storytold/photocraft/pull/3243
- Menus: a submenu stays open while the pointer heads for it (#1218) by @brennanMKE in https://github.com/storytold/photocraft/pull/3251
- i18n(pt-br): complete Brazilian Portuguese catalog (+782 missing UI, filter, and tool strings) by @onicafe in https://github.com/storytold/photocraft/pull/3254
- Zoom and Hand tools: right-click the canvas for the view menu (#3242) by @LloydNicholson in https://github.com/storytold/photocraft/pull/3255
- Quick Mask: an empty start and Select All stay apart (#2743) by @itrycodinganditsbad in https://github.com/storytold/photocraft/pull/2922
- raw: charge the lossless-JPEG intermediate and segment-sized buffers against max_alloc (#2925) by @switch87 in https://github.com/storytold/photocraft/pull/3194
- Prevent white flash when opening the screen color picker by @imSlicedBread in https://github.com/storytold/photocraft/pull/3256
- Add FITS read/write (astronomy images) by @dmoulton in https://github.com/storytold/photocraft/pull/2956
- ui: keep the Color panel knob in the corner it was dragged to by @switch87 in https://github.com/storytold/photocraft/pull/3275
- Rulers: stay level and fully ticked on a rotated view; guides turn with the image (#3233) by @vangel76 in https://github.com/storytold/photocraft/pull/3282
- ui: Dust & Scratches previews at full resolution, as it applies by @switch87 in https://github.com/storytold/photocraft/pull/3287
- Open several files in name order, keeping it for background opens (#3248) by @myangaa1 in https://github.com/storytold/photocraft/pull/3293
- GPU canvas: price the display textures before building them (#2934) by @vangel76 in https://github.com/storytold/photocraft/pull/3299
- Move tool: double-click type on the canvas to edit it (#1132) by @LloydNicholson in https://github.com/storytold/photocraft/pull/3300
- Free Transform: right-click W or H to pick their unit (#3235) by @dhiorns15 in https://github.com/storytold/photocraft/pull/3301
- Type: variable font axis sliders; optical size follows the type size (#2985) by @vangel76 in https://github.com/storytold/photocraft/pull/2996
- Tests: panic_hunt reruns a timed-out command before calling it hung (#2994) by @vangel76 in https://github.com/storytold/photocraft/pull/2997
- Cycle Color Lookup LUTs with keyboard and wheel by @imSlicedBread in https://github.com/storytold/photocraft/pull/3304
- Fix/3144 taskbar maximized by @axlecoffee in https://github.com/storytold/photocraft/pull/3308
- File Handling: wire Image Previews to embed a PSD thumbnail (#204) by @davidmann4 in https://github.com/storytold/photocraft/pull/2971
- Select and Mask: Output To New Document, with or without a layer mask (#2998) by @vangel76 in https://github.com/storytold/photocraft/pull/3007
- Inspect: report each layer's vector mask by @KnottyDyes in https://github.com/storytold/photocraft/pull/2980
- Pen: Alt breaks a handle while drawing, and close-drag pulls out the first anchor's handles (#3306) by @vangel76 in https://github.com/storytold/photocraft/pull/3314
- Type: Warp on live type takes the warp styles and stays editable, no prompt (#3004) by @vangel76 in https://github.com/storytold/photocraft/pull/3008
- feat(ui): Motion Blur and other filter angles get the angle dial (#3152) by @Kartik8Dwivedi in https://github.com/storytold/photocraft/pull/3407
- Free Transform: ⌘-drag of a corner scales editable type instead of distorting it (#3010) by @vangel76 in https://github.com/storytold/photocraft/pull/3012
- Color panel: HSB on sRGB values, like Photoshop (#3323) by @LloydNicholson in https://github.com/storytold/photocraft/pull/3327
- fix(shapes): options bar Fill/Stroke edit the selected shape by @alonfaraj in https://github.com/storytold/photocraft/pull/3370
- Installed ICC profiles in the profile menus, and Mirror in Print by @Moiztermind in https://github.com/storytold/photocraft/pull/3011
- Window: a window saved while minimized reopens at the minimum size, not 160 × 64 by @KattKnight in https://github.com/storytold/photocraft/pull/3380
- i18n: translate the Select and Mask dialog labels (#3014) by @vangel76 in https://github.com/storytold/photocraft/pull/3015
- Color: honour the EXIF sRGB tag on open; wire Ignore EXIF Profile Tag (#204) by @timothydaly1 in https://github.com/storytold/photocraft/pull/3026
- Linux: say so when no file dialog can open (#3354); read ldconfig on non-English systems by @DomiLuebben in https://github.com/storytold/photocraft/pull/3397
- fix(paint): respect Lock All on layer masks (#3094) by @Sir-Starch in https://github.com/storytold/photocraft/pull/3111
- Transform: Distort, Perspective and Warp keep shape layers live (#3009) by @vangel76 in https://github.com/storytold/photocraft/pull/3025
- fix(gradient): respect Lock All on Gradient Fills (#3093) by @Sir-Starch in https://github.com/storytold/photocraft/pull/3120
- fix(ui): focus and select hex field when color picker opens (#3375) by @buivanvu94 in https://github.com/storytold/photocraft/pull/3408
- Type: scan system fonts off the UI thread (#3021) by @vangel76 in https://github.com/storytold/photocraft/pull/3030
- fix(type): respect Lock All on text edits (#3092) by @Sir-Starch in https://github.com/storytold/photocraft/pull/3132
- fix(type): return caret after normalized CRLF insertion (#3074) by @Sir-Starch in https://github.com/storytold/photocraft/pull/3138
- Toolbox: make the colour swap arrow clearer by @Jeremy8776 in https://github.com/storytold/photocraft/pull/3416
- fix(type): navigate adjacent line with large leading (#3066) by @Sir-Starch in https://github.com/storytold/photocraft/pull/3141
- fix(ui): drop doubled options-bar borders reintroduced in UI.9 by @rafi612 in https://github.com/storytold/photocraft/pull/3425
- Transform Path: Distort, Perspective and Warp apply to paths (#3027) by @vangel76 in https://github.com/storytold/photocraft/pull/3032
- fix(crop): unlock Background when extending canvas (#3081) by @Sir-Starch in https://github.com/storytold/photocraft/pull/3158
- Fix Camera Raw preview color management by @imSlicedBread in https://github.com/storytold/photocraft/pull/3427
- fix(mode): restore indexed pixels after clearing transparency (#3080) by @Sir-Starch in https://github.com/storytold/photocraft/pull/3153
- Marquee: Single Row/Column Marquee History step names (#3031) by @vangel76 in https://github.com/storytold/photocraft/pull/3035
- fix(cli): skip recorded view and save steps in batch (#3058) by @Sir-Starch in https://github.com/storytold/photocraft/pull/3143
- Properties: a new adjustment or fill layer shows its settings, not its mask (#3369) by @davidmann4 in https://github.com/storytold/photocraft/pull/3429
- fix(filters): process untouched Reveal All masks (#3082) by @Sir-Starch in https://github.com/storytold/photocraft/pull/3156
- Keep the Color panel selected when switching themes (#3371) by @prekabreki in https://github.com/storytold/photocraft/pull/3433
- fix(history): read locked history sources (#3076) by @Sir-Starch in https://github.com/storytold/photocraft/pull/3186
- automation: refuse edit.installedProfiles, it scans the OS profile folders by @Sir-Starch in https://github.com/storytold/photocraft/pull/3763
- Keep transform controls with moved selected pixels (#3402) by @prekabreki in https://github.com/storytold/photocraft/pull/3436
- SVG: warn when text has no font to use (fixes the FreeBSD svg test) by @diegochagas in https://github.com/storytold/photocraft/pull/3168
- Crop tool: switching to another tool commits the pending crop (#3368) by @davidmann4 in https://github.com/storytold/photocraft/pull/3451
- fix(warp): Perspective Warp moves only the selected part of a linked … by @kavishkashehan726-sudo in https://github.com/storytold/photocraft/pull/3148
- Paths: Stroke Path with any brush-based tool and Simulate Pressure (#2978) by @vangel76 in https://github.com/storytold/photocraft/pull/3039
- fix(image): arbitrary canvas rotation moves position-locked children in groups (#3078) by @buivanvu94 in https://github.com/storytold/photocraft/pull/3155
- i18n(cs): translate the dynamic labels the Czech catalog was missing by @Losminek in https://github.com/storytold/photocraft/pull/3454
- Artboard tool: '+' buttons add a board beside the selected one; ⇧ keeps proportions (#3033) by @vangel76 in https://github.com/storytold/photocraft/pull/3046
- fix(transform): identity transform makes feathered selection edges translucent (#3079) by @buivanvu94 in https://github.com/storytold/photocraft/pull/3159
- Let the Actions step list grow with its panel by @kotulsky in https://github.com/storytold/photocraft/pull/3460
- Layers: clip groups follow New Layer, Arrange, Reorder and Delete (#2203) by @timothydaly1 in https://github.com/storytold/photocraft/pull/3090
- Type Mask: Shift/Alt at commit add to or subtract from the selection; no Layers row for the working text (#3036) by @vangel76 in https://github.com/storytold/photocraft/pull/3069
- Quick-export each selected layer as a separate PNG by @kotulsky in https://github.com/storytold/photocraft/pull/3462
- scorecard: FILE-216-5 save-path tests are in the tree by @davidmann4 in https://github.com/storytold/photocraft/pull/3476
- Actions: a command that runs other commands is recorded once (#3067) by @vangel76 in https://github.com/storytold/photocraft/pull/3072
- Type: triple-click selects a line, quadruple a paragraph, five clicks all text (#3493) by @davidmann4 in https://github.com/storytold/photocraft/pull/3496
- Layers: the New Layer dialog (Layer › New › Layer…, ⇧⌘N) by @timothydaly1 in https://github.com/storytold/photocraft/pull/3104
- Color Picker: no bigger than Photoshop's (532 × 376 points, was 682 × 437), buttons sized to their labels by @kayrockscreenprinting in https://github.com/storytold/photocraft/pull/3500
- Artboards: a board moved past the canvas origin grows the canvas left/up (#3070) by @vangel76 in https://github.com/storytold/photocraft/pull/3073
- Optimise computed brush coverage and native raster row writes by @optimalbytee in https://github.com/storytold/photocraft/pull/3098
- fix(crop): the crop box's own Undo/Redo (#3145) by @dottedt in https://github.com/storytold/photocraft/pull/3510
- Freeform Pen: Alt-clicks draw straight segments; Cmd/Ctrl is Direct Selection with the new pens (#3085) by @vangel76 in https://github.com/storytold/photocraft/pull/3087
- test(gradient): guard the on-canvas midpoint diamond drag (#3172) by @dottedt in https://github.com/storytold/photocraft/pull/3512
- Actions: Last Filter is recorded as the filter it repeated (#3089) by @vangel76 in https://github.com/storytold/photocraft/pull/3091
- Content-Aware Move: Transform On Drop (#3071) by @vangel76 in https://github.com/storytold/photocraft/pull/3095
- Numeric fields: typed units, scrubby labels, double-click reset (#3099) by @vangel76 in https://github.com/storytold/photocraft/pull/3100
- Keep fitted Camera Raw colour during tuning and crop Nikon D5100 borders by @optimalbytee in https://github.com/storytold/photocraft/pull/3201
- Preserve surrounding whitespace in OpenRaster layer names by @imSlicedBread in https://github.com/storytold/photocraft/pull/3207
- Tests: one GPU harness at a time in every GPU test binary (WARP crash) by @dhiorns15 in https://github.com/storytold/photocraft/pull/3212
- Content-Aware Scale: transform box with live preview (#3096) by @vangel76 in https://github.com/storytold/photocraft/pull/3103
- automation: doc.place reads a file through the read root (#2810) by @switch87 in https://github.com/storytold/photocraft/pull/3215
- Layers panel: Shift+Plus/Minus cycle blend modes; effects dropped on the Trash are deleted (#3102) by @vangel76 in https://github.com/storytold/photocraft/pull/3106
- Moving type keeps its rendering: Artboards to Files no longer drops PSD text by @fabianghe in https://github.com/storytold/photocraft/pull/3218
- Shortcuts: layout-independent brush keys, Photoshop's German keys plus a fallback for all layouts (#3109) by @vangel76 in https://github.com/storytold/photocraft/pull/3112
- Liquify: the brush fades to nothing at its edge at every Density (#2606) by @dhiorns15 in https://github.com/storytold/photocraft/pull/3241
- test(paint): pin the retouch dab footprint to the Full Size ring by @switch87 in https://github.com/storytold/photocraft/pull/3258
- Layers panel: a mask dragged onto the Trash asks to apply or delete it (#3113) by @vangel76 in https://github.com/storytold/photocraft/pull/3118
- PNG export: Indexed Color keeps the document resolution (#3047) by @vangel76 in https://github.com/storytold/photocraft/pull/3271
- Layers panel: dragging the vector mask to the Trash asks to delete just the mask (#3119) by @vangel76 in https://github.com/storytold/photocraft/pull/3125
- Interface: an Enable Animations preference (#3273) by @vangel76 in https://github.com/storytold/photocraft/pull/3276
- Edit > Copy takes a targeted layer mask, so masks travel between layers and documents (#2928) by @vbasky in https://github.com/storytold/photocraft/pull/3267
- automation: export layers, data sets and CSVs through the granted roots (#3216) by @switch87 in https://github.com/storytold/photocraft/pull/3230
- Type: fall back to installed Khmer, Lao and Burmese fonts (#218) by @RaccoonPie-314 in https://github.com/storytold/photocraft/pull/3259
- Curves: pencil mode, Smooth and Edit points (#3088) by @vangel76 in https://github.com/storytold/photocraft/pull/3108
- fix(io): smooth PSD gradients no longer overshoot their stops (#3028) by @Sir-Starch in https://github.com/storytold/photocraft/pull/3285
- Codecs: decode PNM straight into the budgeted output buffer (#2938) by @vangel76 in https://github.com/storytold/photocraft/pull/3291
- Properties: Curves adjustment layers get the black/gray/white eyedroppers (#3110) by @vangel76 in https://github.com/storytold/photocraft/pull/3115
- Format: admit the declared .pcraft canvas before loading it (#2935) by @vangel76 in https://github.com/storytold/photocraft/pull/3295
- fix(format): persist the Save As filename in .pcraft manifests (#3312) by @Ni-zav in https://github.com/storytold/photocraft/pull/3319
- Levels: black, gray and white point eyedroppers (#3116) by @vangel76 in https://github.com/storytold/photocraft/pull/3128
- Puppet Warp: the mesh follows the object outline (#3105) by @vangel76 in https://github.com/storytold/photocraft/pull/3117
- Clone Source: W/H link and overlay blend modes (#3298) by @vangel76 in https://github.com/storytold/photocraft/pull/3310
- Vanishing Point: on-canvas plane editor with Create/Edit Plane, grid and paste (#3122) by @vangel76 in https://github.com/storytold/photocraft/pull/3133
- Let
[shrink the brush to 1 px (#3229) by @myangaa1 in https://github.com/storytold/photocraft/pull/3332 - MCP: command_batch says it is not atomic, and the docs explain recovery by @KnottyDyes in https://github.com/storytold/photocraft/pull/3338
- New Document: a real Recent category of recently created documents (#3131) by @vangel76 in https://github.com/storytold/photocraft/pull/3135
- Group effects follow their children's effects, not just their pixels (#3274) by @alexanderalber in https://github.com/storytold/photocraft/pull/3326
- Format: reopening a .pcraft shares deduplicated tiles again (#3315) by @vangel76 in https://github.com/storytold/photocraft/pull/3339
- fix(presets): never overwrite preset or actions files that failed to load by @tms-h in https://github.com/storytold/photocraft/pull/3346
- fix(engine): create new layer masks at the document depth by @piero-83 in https://github.com/storytold/photocraft/pull/3359
- feat(api): add file path to document.inspect by @Mr-Pearce in https://github.com/storytold/photocraft/pull/3398
- Ctrl-click shape and path thumbnails to load selections by @kotulsky in https://github.com/storytold/photocraft/pull/3449
- fix(selection): scope Color Range to the active selection (#3313) by @Ni-zav in https://github.com/storytold/photocraft/pull/3366
- Layer › Duplicate Layer… asks for the copy's name and destination document (#3348) by @prekabreki in https://github.com/storytold/photocraft/pull/3440
- Copy takes every selected layer, Paste recreates them (#2478) by @DomiLuebben in https://github.com/storytold/photocraft/pull/3394
- Fix GIMP hole heading name and location by @philipzae in https://github.com/storytold/photocraft/pull/3517
- Commands check an explicit "layer" instead of whichever layer is active by @fabianghe in https://github.com/storytold/photocraft/pull/3466
- Brush cursor: shaped tips trace their outline (split from #2516) by @siraxe in https://github.com/storytold/photocraft/pull/3467
- perf: Edit > Clear works tile by tile on large selections (#3463) by @itrycodinganditsbad in https://github.com/storytold/photocraft/pull/3482
- Autosave: best-effort cleanup after commit; sweep orphaned recovery bundles (#3489) by @vangel76 in https://github.com/storytold/photocraft/pull/3502
- Raw: open monochrome LinearRaw DNGs (1 sample per pixel) (#3497) by @davidmann4 in https://github.com/storytold/photocraft/pull/3503
- PSD gradients: read the interpolation method Photoshop writes; add Smooth by @MrCloudy2 in https://github.com/storytold/photocraft/pull/3442
- CI: restore tests, catalogs, and web size gate by @skylartaylor in https://github.com/storytold/photocraft/pull/3923
- Color Balance: Photoshop's per-channel levels and gamma curves by @MrCloudy2 in https://github.com/storytold/photocraft/pull/3443
- Save: show save progress as Saving NN% in the status bar and tab title (#3389) by @davidmann4 in https://github.com/storytold/photocraft/pull/3485
- Warp presets: Photoshop's Bezier control grids instead of approximations by @MrCloudy2 in https://github.com/storytold/photocraft/pull/3444
- Brush and Pencil: hold ~ to erase, and Clear mode (#3439) by @itsF4LCON in https://github.com/storytold/photocraft/pull/3465
- Content-Aware tools: faster, cancellable at once, same pixels (P21, P22, P49) by @Unemars in https://github.com/storytold/photocraft/pull/3395
- fix(io): a fresh Metrics type layer writes no empty Txt2 stub (#3514) by @dottedt in https://github.com/storytold/photocraft/pull/3529
- Brush: show the smoothing string from brush to pointer (#3479) by @vangel76 in https://github.com/storytold/photocraft/pull/3526
- Security: verify AppImage build inputs by @skylartaylor in https://github.com/storytold/photocraft/pull/2270
- History panel: snapshots (camera button, snapshot rows, history.*Snapshot) (#2966) by @itsF4LCON in https://github.com/storytold/photocraft/pull/3545
- feat(ui): Photoshop's New Guide: units and colour by @FinnNk in https://github.com/storytold/photocraft/pull/3553
- Tools: Shift key switches tools by default, as in Photoshop (#3525) by @vangel76 in https://github.com/storytold/photocraft/pull/3528
- Use Fontconfig for Linux font discovery (#2330) by @Sir-Starch in https://github.com/storytold/photocraft/pull/2961
- Use each XRandR output's ICC profile in the screen picker by @Sir-Starch in https://github.com/storytold/photocraft/pull/2962
- Support automatic monitor ICC profiles on Linux X11 by @Sir-Starch in https://github.com/storytold/photocraft/pull/2963
- Security: harden document exports and automation inputs by @skylartaylor in https://github.com/storytold/photocraft/pull/2269
- Animated GIF: every frame loads into video layers (#572) by @Sir-Starch in https://github.com/storytold/photocraft/pull/2999
- GPU memory budget: read installed RAM on Windows by @dhiorns15 in https://github.com/storytold/photocraft/pull/3189
- fix(ui): correct the clipping-mask indicator orientation by @Skyfuller1303 in https://github.com/storytold/photocraft/pull/3037
- Windows installer: refuse Windows 7 and 8 with a clear message (#2310) by @dhiorns15 in https://github.com/storytold/photocraft/pull/3261
- Format: index ZIP entries by name and use crc32fast (#3474) by @vangel76 in https://github.com/storytold/photocraft/pull/3488
- psd: harden the standalone binary parsers (fuzz + property tests, gradient/swatch correctness) by @agent-346022 in https://github.com/storytold/photocraft/pull/3542
- Add Vietnamese localization by @duydev in https://github.com/storytold/photocraft/pull/2636
- Linux: StartupWMClass is the window's app id by @atoslins in https://github.com/storytold/photocraft/pull/3481
- M11: ten more MCP acceptance tasks (11-20) for FILE-216-6 by @reynold-hu in https://github.com/storytold/photocraft/pull/3562
- fix(ui): don't reopen floating Brush Settings on restart by @Ni-zav in https://github.com/storytold/photocraft/pull/3570
- M11: six rounding-out acceptance tasks (31-36) by @reynold-hu in https://github.com/storytold/photocraft/pull/3568
- Options bar: the Gradient tool's controls show in every theme (#3601) by @vangel76 in https://github.com/storytold/photocraft/pull/3607
- fix(ui): one eliding label for fixed-width chrome, so translations can't overrun (#3580) by @dottedt in https://github.com/storytold/photocraft/pull/3616
- test(ui): marquee shift+alt before the drag intersects the selection (#208) by @agent-346022 in https://github.com/storytold/photocraft/pull/3624
- Crop tool: a resized frame snaps its handle, not the pointer (#3638) by @davidmann4 in https://github.com/storytold/photocraft/pull/3640
- fix(transform): keep nearest-neighbor previews on original texels by @Ni-zav in https://github.com/storytold/photocraft/pull/3688
- fix(engine): image.canvasSize rejects unlisted anchors instead of landing between two (#2946) by @agent-346022 in https://github.com/storytold/photocraft/pull/3572
- Edit › Transform › Skew: corners and sides move along one axis, like Photoshop (#3437) by @kayrockscreenprinting in https://github.com/storytold/photocraft/pull/3590
- PSD: alpha channel resources count the merged transparency; 13-byte DisplayInfo by @MrCloudy2 in https://github.com/storytold/photocraft/pull/3577
- Glows: Photoshop's precise ramp; centre-source glows inverted after the contour by @MrCloudy2 in https://github.com/storytold/photocraft/pull/3578
- Canvas: wheel/pinch zoom over the pasteboard keeps the image in view (#3720) by @FredApps in https://github.com/storytold/photocraft/pull/3731
- Select: open the Save Selection and Load Selection dialogs (#3713) by @itrycodinganditsbad in https://github.com/storytold/photocraft/pull/3738
- Toolbar: the colour chips sit right under the tools again by @Unemars in https://github.com/storytold/photocraft/pull/3745
- Fix: video frames to layers working using folder dialog request (#3513) by @peppepol in https://github.com/storytold/photocraft/pull/3718
- Menus: keep clear of the taskbar when Wayland hides the window position (#3737) by @FredApps in https://github.com/storytold/photocraft/pull/3739
- i18n(it): translate the dynamic labels the Italian catalog was missing by @fabiodalez-dev in https://github.com/storytold/photocraft/pull/3742
- Chisel bevels: Photoshop's facet slope and ramp ends by @MrCloudy2 in https://github.com/storytold/photocraft/pull/3595
- Character panel: OpenType feature buttons (TYPE-218-5, #3752) by @davidmann4 in https://github.com/storytold/photocraft/pull/3757
- Brush: symmetric live strokes update only what changed (#3593) by @xsvm in https://github.com/storytold/photocraft/pull/3605
- Move: an unlinked layer mask moves alone when targeted (#3604) by @vangel76 in https://github.com/storytold/photocraft/pull/3611
- fix(ui): drag a document tab off the strip to float it in its own window (#3733) by @bommerts in https://github.com/storytold/photocraft/pull/3785
- fix(web): keep the canvas steady during preset saves by @zenjabba in https://github.com/storytold/photocraft/pull/3805
- UI: drag to reorder swatch groups and preset folders (#3658) by @dottedt in https://github.com/storytold/photocraft/pull/3828
- Keep transform preview visible while panning (#3610) by @Sir-Starch in https://github.com/storytold/photocraft/pull/3843
- perf: draw marching ants as one mesh instead of a line shape per dash by @JameEnder in https://github.com/storytold/photocraft/pull/3846
- Fail CLI run when recorded action playback fails by @jonathanwxh-cell in https://github.com/storytold/photocraft/pull/3861
- Guides: Shift-drag out of a ruler lands on the nearest ruler tick (#3770) by @n-delic in https://github.com/storytold/photocraft/pull/3796
- fix(engine): a PSD type layer names the installed font, not an invented one (#3556) by @dottedt in https://github.com/storytold/photocraft/pull/3564
- Actions: replay tests for crop, filters, selections and styled text on a second document (AUTO-219-4) by @reynold-hu in https://github.com/storytold/photocraft/pull/3566
- feat(psd): Gradient Map stops in CMYK, Lab, Gray and HSB import and round-trip by @echelon in https://github.com/storytold/photocraft/pull/4033
- feat(save): File › Save keeps a JPEG's quality and a WebP's lossy/lossless encoding (#2399) by @echelon in https://github.com/storytold/photocraft/pull/4032
- PSD: descriptor ids warp, list and time are written as strings, as Photoshop writes them by @echelon in https://github.com/storytold/photocraft/pull/4039
- fix(liquify): pointer speed no longer changes the warp (continuous dab spacing) by @echelon in https://github.com/storytold/photocraft/pull/4047
- Update Japanese translations by @coolvitto in https://github.com/storytold/photocraft/pull/3892
- UI: unify plain text inputs on one text_field widget (#3789) by @dottedt in https://github.com/storytold/photocraft/pull/3896
- Layer › Export As exports every selected layer or artboard (#3629) by @fabianghe in https://github.com/storytold/photocraft/pull/3909
- UI: Photoshop-style in-dialog preview for the generic filter dialogs (#3769) by @dottedt in https://github.com/storytold/photocraft/pull/3877
- fix(ui): allow selecting shapes and editing color with path selection (#3915) by @seotarek in https://github.com/storytold/photocraft/pull/3932
- PSD type layers: TySh bounds, AntiAlias numbers and version info written as Photoshop writes them by @echelon in https://github.com/storytold/photocraft/pull/4041
- PSD: rasterized fill and smart layers stay rasterized after save and reopen by @echelon in https://github.com/storytold/photocraft/pull/4034
- Dismiss Home when closing a document tab (#3981) by @vbasky in https://github.com/storytold/photocraft/pull/3984
- fix(ui): show a paint-bucket cursor for the Paint Bucket tool (#3968) by @MarekSpodBiedry in https://github.com/storytold/photocraft/pull/3989
- fix(ui): Open layer color choices from the visibility icon by @Ni-zav in https://github.com/storytold/photocraft/pull/4001
- fix(ui): Make checkbox labels nonselectable and show pointer cursors by @Ni-zav in https://github.com/storytold/photocraft/pull/4002
- fix(ui): keep filter jobs polling on idle Linux by @rozaqabdul656 in https://github.com/storytold/photocraft/pull/3961
- Add WebP and optional quality to Batch export dialogs by @zenjabba in https://github.com/storytold/photocraft/pull/3956
- feat(compose): Lab documents evaluate Invert, Posterize, Threshold, Brightness/Contrast and Gradient Map on L, a, b by @echelon in https://github.com/storytold/photocraft/pull/4038
- PSD: composite_rgba8 checks the output budget and converts planes fallibly (#3639) by @vangel76 in https://github.com/storytold/photocraft/pull/3651
- PSD: don't preallocate knots from untrusted path length counts (#3635) by @vangel76 in https://github.com/storytold/photocraft/pull/3654
- PSD: bound the zero padding of undersized pattern channels (#3652) by @vangel76 in https://github.com/storytold/photocraft/pull/3686
- PSD: cap descriptor list/object preallocation from untrusted counts (#3636) by @vangel76 in https://github.com/storytold/photocraft/pull/3699
- fix(engine): Displace smart filter ignores its mapPath displacement map (#3670) by @horknfbr in https://github.com/storytold/photocraft/pull/3676
- PSD: smart object Trnf frames the custom warp's control points, not the source rect (#3671) by @horknfbr in https://github.com/storytold/photocraft/pull/3677
- feat(io): import Photoshop Displace smart filters with their embedded map (#3673) by @horknfbr in https://github.com/storytold/photocraft/pull/3680
- Gradient Map: edit color stops on the ramp by @arthurdeka in https://github.com/storytold/photocraft/pull/3982
- Free Transform: a layer's style shows while the box is open, drawn from the transformed layer (#3653) by @kayrockscreenprinting in https://github.com/storytold/photocraft/pull/3696
- fix(algo): mesh warps filter their source when shrinking, so thin lines don't alias (#3672) by @horknfbr in https://github.com/storytold/photocraft/pull/3678
- feat(io): open Krita .kra composites as editable raster documents (#3692) by @Ni-zav in https://github.com/storytold/photocraft/pull/3700
- fix(psd): Multichannel alpha channels stay alpha; a save keeps resources and global blocks by @echelon in https://github.com/storytold/photocraft/pull/4031
- fix(layers): identify the Background by structure, never by its English name by @echelon in https://github.com/storytold/photocraft/pull/4036
- Codecs: refuse implausible PNG/WebP headers before allocating (#3691) by @vangel76 in https://github.com/storytold/photocraft/pull/3706
- PSD: avoid cloning layer data when padding and presize the output buffer (#3687) by @vangel76 in https://github.com/storytold/photocraft/pull/3707
- Codecs: bound the TIFF IFD walk by a file-size entry budget (#3683) by @vangel76 in https://github.com/storytold/photocraft/pull/3711
- Select the Normal RGB blend kernel once per buffer by @Streetblock in https://github.com/storytold/photocraft/pull/3715
- Allow empty vector masks in downsampled preview proxies by @Streetblock in https://github.com/storytold/photocraft/pull/3716
- feat(codecs): decode legacy PCX images and palettes (#3692) by @Ni-zav in https://github.com/storytold/photocraft/pull/3701
- fix(text): scale faux bold dilation with glyph scaling (#3705) by @nicolasfalesy in https://github.com/storytold/photocraft/pull/3719
- Answer a repeat auth with "already authenticated" (#3668) by @itrycodinganditsbad in https://github.com/storytold/photocraft/pull/3723
- Codecs: integer fast paths for Image::convert (#3717) by @vangel76 in https://github.com/storytold/photocraft/pull/3729
- automation: say why a command is disabled in engine.commands (#3664) by @itrycodinganditsbad in https://github.com/storytold/photocraft/pull/3740
- feat: Photoshop's layer and selection keys (Ctrl+, toggle, Ctrl+, /, Ctrl+Alt+2, Ctrl+Alt+Backspace, Tab rename, Alt-click thumbnail) by @FinnNk in https://github.com/storytold/photocraft/pull/3710
- View: remember Extras, Show and Snap To across restarts (#3762) by @bommerts in https://github.com/storytold/photocraft/pull/3787
- fix(automation): warn when text falls back from a missing font (#3391) by @buivanvu94 in https://github.com/storytold/photocraft/pull/3630
- Satin: Distance 0 draws as 1 px, as in Photoshop by @MrCloudy2 in https://github.com/storytold/photocraft/pull/3744
- Type: editing text keeps its ligatures and OpenType alternates (#3617) by @davidmann4 in https://github.com/storytold/photocraft/pull/3747
- Brushes: Photoshop's texture Height/Subtract modes, Brightness and Contrast (#3340) by @davidmann4 in https://github.com/storytold/photocraft/pull/3749
- Camera raw colour fit: read a Sony Adobe RGB preview as Adobe RGB, not sRGB by @Madcat71 in https://github.com/storytold/photocraft/pull/3760
- Shadows/Highlights: Photoshop's, measured by @Unemars in https://github.com/storytold/photocraft/pull/3765
- Black & White: tint like the Color blend mode, as in Photoshop by @MrCloudy2 in https://github.com/storytold/photocraft/pull/3780
- Hue/Saturation: Photoshop's saturation curve, lightness order and Colorize lightness by @MrCloudy2 in https://github.com/storytold/photocraft/pull/3781
- History: add history.undo and history.redo aliases (#3675) by @dottedt in https://github.com/storytold/photocraft/pull/3786
- Fix straight-path anchor insertion at the hit position by @jonathanwxh-cell in https://github.com/storytold/photocraft/pull/3856
- Preserve signed HDR colors during surface transforms by @jonathanwxh-cell in https://github.com/storytold/photocraft/pull/3857
- Brushes: drag a brush folder into another folder (#2014) by @davidmann4 in https://github.com/storytold/photocraft/pull/3851
- Keep CMYK ink values when flattening and merging (#3778) by @itrycodinganditsbad in https://github.com/storytold/photocraft/pull/3855
- Type: wire missingGlyphProtection (script fallback toggle) by @reynold-hu in https://github.com/storytold/photocraft/pull/3863
- io: read version 3 Photo Filter colour as XYZ, not Lab (#3777) by @itrycodinganditsbad in https://github.com/storytold/photocraft/pull/3790
- Workspace: wire Enable Narrow Options Bar (#204) by @reynold-hu in https://github.com/storytold/photocraft/pull/3870
- Selective Color (Absolute): scale by the room the ink has, as in Photoshop by @MrCloudy2 in https://github.com/storytold/photocraft/pull/3793
- Shift Edge moves by a fraction of a pixel so the slider does not snap by @Desayuno64 in https://github.com/storytold/photocraft/pull/3800
- Image > Mode > 32 Bits/Channel: convert to linear light, as Photoshop does by @MrCloudy2 in https://github.com/storytold/photocraft/pull/3792
- Engine: Flatten All Layer Effects keeps layer and vector masks (#3804) by @dottedt in https://github.com/storytold/photocraft/pull/3835
- fix(gpu): flush every 1000 passes so deep stacks don't pile into one command buffer by @JameEnder in https://github.com/storytold/photocraft/pull/3844
- perf(gpu): a duplicated layer's texture starts as a copy of its source by @JameEnder in https://github.com/storytold/photocraft/pull/3848
- perf: the Navigator redraws only the area an edit changed by @JameEnder in https://github.com/storytold/photocraft/pull/3845
- perf: edits, undo and redo recomposite only where added or removed layers draw by @JameEnder in https://github.com/storytold/photocraft/pull/3847
- Remove tool: Create a new layer, and Remove after each stroke off by @diegochagas in https://github.com/storytold/photocraft/pull/3808
- Workspace: wire Auto-Collapse Iconic Panels (#204) by @reynold-hu in https://github.com/storytold/photocraft/pull/3880
- Camera Raw on raw opens: Clarity, Texture and Dehaze in linear light, measured by @Unemars in https://github.com/storytold/photocraft/pull/3815
- Layer styles: Photoshop's measured contour presets; Satin's contour lookup by @MrCloudy2 in https://github.com/storytold/photocraft/pull/3803
- fix(smart-object): keep pixels when rasterizing smart object layer by @Gotix-eg in https://github.com/storytold/photocraft/pull/3873
- PSD: write kept 8B64 blocks as 8BIM so Photoshop opens PSB-derived files by @MrCloudy2 in https://github.com/storytold/photocraft/pull/3743
- fix(io): preserve indexed BMP color tables (#3802) by @Sir-Starch in https://github.com/storytold/photocraft/pull/3869
- feat: Photoshop's tool keys (arrows turn the brush, Shift-click new type, Space+F canvas colour) by @FinnNk in https://github.com/storytold/photocraft/pull/3725
- PSD type: read styles from the run's sheets and place text at its Txt2 frame (#3795, #1317) by @FredApps in https://github.com/storytold/photocraft/pull/3819
- Merged and stamped layers keep their content bounds in CMYK and Lab by @dgliwa in https://github.com/storytold/photocraft/pull/3886
- Preserve surviving channel targets and visibility on deletion by @jonathanwxh-cell in https://github.com/storytold/photocraft/pull/3887
- Layers: Merge Group for a selected group (#3832) by @FredApps in https://github.com/storytold/photocraft/pull/3888
- test(cms): validate profile-specific CMYK endpoints by @FredApps in https://github.com/storytold/photocraft/pull/3890
- Count video footage in history memory budgets by @jonathanwxh-cell in https://github.com/storytold/photocraft/pull/3894
- Mix filtered selection edges with premultiplied alpha by @jonathanwxh-cell in https://github.com/storytold/photocraft/pull/3895
- Color: convert input-only embedded profiles to the working space on open (#3876) by @HEOJUNFO in https://github.com/storytold/photocraft/pull/3900
- Format: check pattern sizes on load (#3478) by @vangel76 in https://github.com/storytold/photocraft/pull/3484
- Format: overflow-safe blob decode and bounds-checked ZIP reads (#3486) by @vangel76 in https://github.com/storytold/photocraft/pull/3501
- Fuzz: ignore the same build leftovers in every fuzz crate by @s17sh70x2jfl031ag in https://github.com/storytold/photocraft/pull/3585
- HEIF: move the heic-rs pin from 0.1.1 to 0.1.4 by @s17sh70x2jfl031ag in https://github.com/storytold/photocraft/pull/3637
- Codecs: decode only the requested EXR part (#3721) by @vangel76 in https://github.com/storytold/photocraft/pull/3722
- Codecs: decode JPEG and CCITT G3/G4 compressed TIFF (#3712) by @vangel76 in https://github.com/storytold/photocraft/pull/3727
- fix(linux): avoid duplicate AppImage desktop launcher (#3623) by @Korg1ch in https://github.com/storytold/photocraft/pull/3641
- ops: count selection masks in history pixel budget by @Streetblock in https://github.com/storytold/photocraft/pull/3614
- Verify PngSuite archives and cached corpus files by @zenjabba in https://github.com/storytold/photocraft/pull/3973
- feat: Alt+Cancel → Reset for opt-in command dialogs by @seandellis in https://github.com/storytold/photocraft/pull/3871
- i18n(tr): add Turkish UI translation catalog by @yeniufuklar-com in https://github.com/storytold/photocraft/pull/3809
- i18n: add Hungarian (hu) UI translation by @Skaywalker in https://github.com/storytold/photocraft/pull/3831
- Release workflow: pass the Azure signing secrets by @echelon in https://github.com/storytold/photocraft/pull/3794
- Fix main: wasm size cap, Windows Export As test, filter preview window (scope and a crash), CLI duplicate font warnings by @echelon in https://github.com/storytold/photocraft/pull/4147
- Web: wasm back under the 24 MiB gate with ~1 MiB headroom (25.38 → 24.17 MB) by @bommerts in https://github.com/storytold/photocraft/pull/4253
- @skylartaylor made their first contribution in https://github.com/storytold/photocraft/pull/3097
- @herzer made their first contribution in https://github.com/storytold/photocraft/pull/2660
- @Skyfuller1303 made their first contribution in https://github.com/storytold/photocraft/pull/2738
- @imSlicedBread made their first contribution in https://github.com/storytold/photocraft/pull/3209
- @TheTeslak made their first contribution in https://github.com/storytold/photocraft/pull/3206
- @Simonfalentinolesen made their first contribution in https://github.com/storytold/photocraft/pull/2402
- @Matty-PW made their first contribution in https://github.com/storytold/photocraft/pull/2760
- @ngrafton2006 made their first contribution in https://github.com/storytold/photocraft/pull/2892
- @KattKnight made their first contribution in https://github.com/storytold/photocraft/pull/2510
- @timothydaly1 made their first contribution in https://github.com/storytold/photocraft/pull/2953
- @Desayuno64 made their first contribution in https://github.com/storytold/photocraft/pull/2555
- @peppepol made their first contribution in https://github.com/storytold/photocraft/pull/3084
- @MathMattTech made their first contribution in https://github.com/storytold/photocraft/pull/3114
- @paulo-vc made their first contribution in https://github.com/storytold/photocraft/pull/3126
- @diegozpy made their first contribution in https://github.com/storytold/photocraft/pull/3154
- @grlessa made their first contribution in https://github.com/storytold/photocraft/pull/2592
- @dylanmtaylor made their first contribution in https://github.com/storytold/photocraft/pull/3165
- @mjohnson7cd made their first contribution in https://github.com/storytold/photocraft/pull/3171
- @myangaa1 made their first contribution in https://github.com/storytold/photocraft/pull/3363
- @Myosh1 made their first contribution in https://github.com/storytold/photocraft/pull/2916
- @onicafe made their first contribution in https://github.com/storytold/photocraft/pull/3254
- @dmoulton made their first contribution in https://github.com/storytold/photocraft/pull/2956
- @axlecoffee made their first contribution in https://github.com/storytold/photocraft/pull/3308
- @KnottyDyes made their first contribution in https://github.com/storytold/photocraft/pull/2980
- @Kartik8Dwivedi made their first contribution in https://github.com/storytold/photocraft/pull/3407
- @Moiztermind made their first contribution in https://github.com/storytold/photocraft/pull/3011
- @DomiLuebben made their first contribution in https://github.com/storytold/photocraft/pull/3397
- @Losminek made their first contribution in https://github.com/storytold/photocraft/pull/3454
- @dottedt made their first contribution in https://github.com/storytold/photocraft/pull/3510
- @RaccoonPie-314 made their first contribution in https://github.com/storytold/photocraft/pull/3259
- @tms-h made their first contribution in https://github.com/storytold/photocraft/pull/3346
- @piero-83 made their first contribution in https://github.com/storytold/photocraft/pull/3359
- @Mr-Pearce made their first contribution in https://github.com/storytold/photocraft/pull/3398
- @philipzae made their first contribution in https://github.com/storytold/photocraft/pull/3517
- @agent-346022 made their first contribution in https://github.com/storytold/photocraft/pull/3542
- @duydev made their first contribution in https://github.com/storytold/photocraft/pull/2636
- @atoslins made their first contribution in https://github.com/storytold/photocraft/pull/3481
- @FredApps made their first contribution in https://github.com/storytold/photocraft/pull/3731
- @fabiodalez-dev made their first contribution in https://github.com/storytold/photocraft/pull/3742
- @JameEnder made their first contribution in https://github.com/storytold/photocraft/pull/3846
- @jonathanwxh-cell made their first contribution in https://github.com/storytold/photocraft/pull/3861
- @n-delic made their first contribution in https://github.com/storytold/photocraft/pull/3796
- @seotarek made their first contribution in https://github.com/storytold/photocraft/pull/3932
- @horknfbr made their first contribution in https://github.com/storytold/photocraft/pull/3676
- @nicolasfalesy made their first contribution in https://github.com/storytold/photocraft/pull/3719
- @Madcat71 made their first contribution in https://github.com/storytold/photocraft/pull/3760
- @Gotix-eg made their first contribution in https://github.com/storytold/photocraft/pull/3873
- @dgliwa made their first contribution in https://github.com/storytold/photocraft/pull/3886
- @s17sh70x2jfl031ag made their first contribution in https://github.com/storytold/photocraft/pull/3585
- @Korg1ch made their first contribution in https://github.com/storytold/photocraft/pull/3641
- @seandellis made their first contribution in https://github.com/storytold/photocraft/pull/3871
- @yeniufuklar-com made their first contribution in https://github.com/storytold/photocraft/pull/3809
- @Skaywalker made their first contribution in https://github.com/storytold/photocraft/pull/3831
Full Changelog: https://github.com/storytold/photocraft/compare/v0.7.0...v0.8.2