What's Changed
- Package: never overwrite one link's copy with another, list a missing link once by @softwaregames1 in #9185
- Fix CPU pixel grid stroke width on HiDPI displays by @ssh-den in #9199
- Image Rotation › Arbitrary turns unlinked layer masks (#9201) by @davidmann4 in #9203
- fix(cms): ignore tags inside .look XML comments (#9109) by @DuBearte in #9210
- fix(cms): headerless .3dl tables read on at least the 12-bit scale (#9121) by @DuBearte in #9215
- fix(engine): turn a shape's gradient stroke with the canvas (#9239) by @davidmann4 in #9240
- fix(ui): Hue/Saturation's spectrum bars stretch with the panel (#9242) by @DuBearte in #9250
- fix(ui): a swatch click recolours selected type and shapes with any tool (#9238) by @hectorviov in #9253
- feat: New Document can start as an artboard (#9086) by @DuBearte in #9258
- Crop: in Full Screen Mode Match Canvas is the black pasteboard (#9294) by @davidmann4 in #9295
- Crop and Straighten Photos processes only the selection (#9297) by @davidmann4 in #9298
- fix(algo): Dehaze leaves no bright halo beside dark objects (#9273) by @DuBearte in #9316
- fix(engine): defined and imported patterns survive a restart (#9317) by @hectorviov in #9318
- Paste: centre pixels copied from another document (#8945) by @DuBearte in #9353
- feat(ui): Browse… for the folders of Image Processor and Batch (#9357) by @hectorviov in #9360
- Tests: the smart filter stack-cache test runs in its own binary (#9376) by @davidmann4 in #9377
- Reveal All: ignore erased, fully transparent pixels (#9379) by @davidmann4 in #9380
- SVG: text reads each font file once instead of once per glyph (#9406) by @davidmann4 in #9407
- Export Data Sets as Files keeps outputs in the chosen folder (#9420) by @davidmann4 in #9422
- Plug-ins: refuse a manifest that declares a parameter twice (#9441) by @davidmann4 in #9442
- Engine: assets_dir's doc comment back on assets_dir (#9390) by @davidmann4 in #9391
- fix(atn): preserve unsupported event kinds by @justinjohn0306 in #8509
- Kept composites follow the text gamma and free their memory; GPU timing survives an OOM retry (#8520, #8521) by @davidmann4 in #8522
- Fix layout benchmark setup for preserved Smart Objects by @bommerts in #8664
- Regression tests for eight fixes merged without one by @skylartaylor in #8690
- Refuse .pcraft manifests with too many JSON values before parsing by @Silvertree2010 in #8893
- ora: test that Soft Light exports as svg:soft-light by @switch87 in #9028
- Filter Gallery: ⌘+ / ⌘− / ⌘0 / ⌘1 zoom the preview, stepping like Liquify's by @andeecollard in #9107
- Channels panel: drag alpha channels to reorder them (#9163) by @hectorviov in #9168
- fix(ui): Save for Web reopens on the preview tab chosen last (#9174) by @hectorviov in #9178
- Codecs: save Amiga IFF (.iff) as 24-bit ILBM by @dotCooCoo in #9080
- fix(cms): read UTF-16 LUT files by their byte-order mark by @bercedev in #9129
- fix(ui): Properties Transform shows a shape's path, not its stroke by @hectorviov in #9181
- contributors: credit VoiceLessQ by display name by @VoiceLessQ in #9264
- Contributors: add my name (erenova) by @erenova in #9369
- ci(deps): bump the actions group across 1 directory with 3 updates by @dependabot[bot] in #8979
- Security: pin and verify the Windows signing client (#2936) by @Erica4fr in #3938
- Migrate PhotoCraft to egui 0.37 by @skylartaylor in #9363
- feat(updates): add startup self-update prompt modal by @dylanmtaylor in #9322
- build: pin craft-update to craft-libs main (495e597) by @dylanmtaylor in #9548
- chore(deps): refresh safe dependency bumps by @skylartaylor in #9558
- chore: resolve SonarCloud maintainability issues by @dylanmtaylor in #9044
- Integration batch 8: 37 reviewed community PRs on main by @davidmann4 in #9386
- Crop tool: right-click on a pending crop opens its menu: presets, overlays, Cancel and Crop (#6561) by @marcoarnulfo in #6620
- codecs: read and write TIFF extra samples (spot and alpha channels) by @jasallen in #7415
- perf(photomerge): track multiband timing and peak memory by @ersoynarin-code in #7873
- PSD: type on a path opens on its path and saves back into the file's Txt2 (#7962) by @Higgs32584 in #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 #8402
- Menu bar: Space no longer opens File › New after Alt+zoom, finishing #6256's fix (#7688) by @artman67 in #8679
- fix(io): DDS export writes the document's alpha channel by @FinnNk in #8776
- Fix stacked brush-tip artifacts in hard-round presets by @wanikhawar in #8846
- PSD: recognise Photoshop's
MTrnmerged-transparency marker by @jasallen in #8877 - PSD: spot channels in Photoshop's polarity; PSDs from earlier PhotoCraft versions keep their ink by @jasallen in #8885
- fix(#9098): preserve PSD byte order in layered TIFF text descriptors by @ronibalthazar in #9128
- Rebuild the Histogram panel by @mathildalabs in #9139
- Layered TIFF: write Photoshop's global layer mask block (#9095) by @hectorviov in #9148
- fix(cms): Resolve .cube files with a 1D shaper and a 3D table load (#9177) by @hectorviov in #9183
- fix(ui): the font menu opens on the current family's recent row (#9160) by @hectorviov in #9197
- fix(ui): Bevel & Emboss Highlight and Shadow Mode are separate dropdowns (#9368) by @hectorviov in #9370
- raw: a non-finite black level no longer panics the AHD demosaic by @vangel76 in #9446
- raw: grouped 10/12/14-bit unpack, single-strip buffer kept, in-place undelta by @vangel76 in #9449
- raw: block-wise final encode stage for the default rendering by @vangel76 in #9452
- raw: develop_half, a fused half-size preview develop (part of #9433) by @vangel76 in #9454
- Add optional local models for subject matting and object selection by @mighty-programmer in #1199
- Art History Brush in the Y-group flyout by @mvanhorn in #1610
- Add intermediate UI scale presets between 100% and 125% by @WebWork-rrs in #3316
- History panel: New Snapshot dialog and the first snapshot (#2966) by @itsF4LCON in #3567
- Mixer Brush: render mixed paint during the stroke and commit the live result by @durtyrobbin in #3627
- Integrations: wire Allow Agent Control and Control Port (#204) by @Erica4fr in #4097
- Interface: Animation Effects follows the system setting, or is on or off by @JeremyYao in #4573
- Camera Raw: Calibration panel, Auto, raw sidecars and live Camera Raw Defaults (FILE-215-11) by @FabioLissi in #5128
- perf(algo): Content-Aware Scale 2x faster, within its P28 budget (#211) by @SckraT in #5236
- Blend mode keys: Shift+Alt+letter picks a mode, as in Photoshop by @paulou-jpg in #5478
- Mode dropdowns for Clone Stamp, Pattern Stamp, History Brush, Healing and Paint Bucket by @paulou-jpg in #5504
- fix(zoom): Restore smooth wheel zoom by @sn-o-w in #5547
- perf(camera-raw): develop the preview's per-pixel stages on the GPU (#6916) by @fjamesprice in #6923
- feature: gradient paint to the shape tools, any shape can have a gradient stroke. by @deniskhud in #7203
- Brush: large tips rasterize, accumulate and composite in parallel by @Unemars in #7218
- Crop: Content-Aware Fill keeps the pixels a non-deleting crop hid (#8060) by @Higgs32584 in #8179
- fix(xtask): derive scorecard corpus counts from pinned manifests by @Lucenx9 in #8658
- io: TIFF alpha and spot channels, with PSD output unchanged by @jasallen in #8878
- fix(ui): Type options bar alignment follows the target paragraph by @hectorviov in #9179
- Panels: move onto craft-ui's shared docking by @aiongg in #9366
- Panels: review follow-ups to the shared docking and egui 0.37 merges by @aiongg in #9575
- lint: clear new-code S8855/S8856/S8862/S1612/S7688/S7679 findings by @dylanmtaylor in #9576
- Panels: remove the old dock's drawing code by @aiongg in #9583
- Preserve locale-aware CJK fonts and migration regressions after #9363 by @skylartaylor in #9518
- refactor: lower cognitive complexity in styles apply, affinity text read and warp identity by @dylanmtaylor in #9577
- ci: require nextest 0.9.150 by @skylartaylor in #9749
- refactor: shared module layout (craft-contrib#20) by @aiongg in #9758
- perf(selection): window marquee and lasso feather masks by @wanikhawar in #9794
- Expand, Contract and Border: crop to the selection, up to 40× faster on small selections by @wanikhawar in #9697
- refactor(selection): take the feather reach from the blur by @aiongg in #9802
- fix(ui): dropdown menus grow back after a search with no matches by @aiongg in #9849
- perf(save): faster .pcraft and PSD saves, byte-identical output by @Silvertree2010 in #9877
- Integration batch: 22 PRs on main by @aiongg in #9880
- Crop: X with a ratio preset turns the frame instead of shrinking it (#7057) by @davidmann4 in #7058
- Tests: the effect-map deadlock watchdog waits 120 s for each render, not for all 101 by @dotCooCoo in #9340
- Actions: save and read the Lab Lightness channel as Lght (#9384) by @davidmann4 in #9385
- Preferences: the Generator checkbox reads Enable Generator, as in the reference application (#9392) by @davidmann4 in #9393
- Color panel: the Color Wheel fits the panel at its default height (#9394) by @davidmann4 in #9395
- SVG: an embedded data-URL SVG gets the nesting-depth check (#9397) by @davidmann4 in #9398
- XML: deeply nested ORA, KRA, Camera Raw XMP, .kys and layer XMP are an error, not a crash (#9419) by @davidmann4 in #9421
- Automation: refuse every Windows device name in request paths (#9424) by @davidmann4 in #9425
- Automation: refuse to replace a non-image file in the write root (#9439) by @davidmann4 in #9445
- Plug-ins: refuse a code section with no functions but many bytes instead of panicking (#9679) by @davidmann4 in #9680
- CMYK: the test reference keeps a fully covered type pixel's ink exact (#9688) by @davidmann4 in #9689
- History: History Options with Allow Non-Linear History and undoable visibility changes (#2966) by @davidmann4 in #3535
- PSD save: choose PSB by the encoded size, not the raw estimate (#5285) by @davidmann4 in #5287
- Channels: CMYK channels duplicate, load, split and merge as tone, not ink (#5787) by @davidmann4 in #5789
- Compose: Transparency Shapes Layer off blends a layer's alpha as Fill in the special eight (#5692) by @davidmann4 in #5837
- PSD: Frame layers keep their stroke (#4381) by @davidmann4 in #5890
- PSD: Diffuse, Trace Contour, Crystallize and Pointillize smart filters open and save like Photoshop (#6302) by @davidmann4 in #6303
- Paths: making a selection from a path deselects the path (#6079) by @davidmann4 in #6353
- Color Lookup: PSD save keeps a .3dl/.look LUT file as loaded (#6544) by @davidmann4 in #6723
- Paste: a drawing copied as SVG markup pastes its pixels by @dotCooCoo in #7154
- Autosave: replace a recovery sidecar in one step, so a listing never misses or doubles it (#9034) by @davidmann4 in #9036
- Integration batch: 21 PRs on main by @davidmann4 in #9775
- feat(type): add editable font size, leading and tracking preset menus by @Ni-zav in #3558
- fix(app): add missing supported file formats to Save As file picker (#3400) by @buivanvu94 in #3609
- Layers: New Group dialog and modifiers; new layers go into an open group and join its clip group by @SckraT in #4329
- feat(transform): show distort and skew cursor indicators when holding Ctrl/Cmd by @catursurapam in #5405
- Font menu: favourites, recent fonts, class and similar-font filters, live preview by @D-monized in #6526
- PSD/PSB open without reading the whole file: channel data read as decoded, in bands into tiles (#5106) by @ptrinh in #6583
- perf(compression): Use zlib-rs with runtime detection by @reneleonhardt in #7689
- fix(codecs): check header dimensions against the file size before allocating by @FinnNk in #8704
- fix(ui): Remove Tool trail tints all a stroke removes; brush trails follow hardness (#8916) by @hnoerenberg in #8923
- fix(io): preserve Halftone Pattern smart filters in PSD/PSB by @denstu473 in #9031
- perf(gpu): NVIDIA's own memory on Linux, so many-layer documents stay off the CPU budget penalty (#5973) by @VishnuByrraju in #9042
- Batch: folder sources take every format PhotoCraft opens by @dotCooCoo in #9097
- Color panel: the cube modes warn when a colour can't print (#8672) by @hectorviov in #9154
- feat: Artboard from Layers takes a size of your own (#9087) by @DuBearte in #9262
- feat: type on a path follows its path when the path is edited (#9114) by @DuBearte in #9321
- fix(ui): Select and Mask starts from its defaults unless Remember Settings is on (#9423) by @hectorviov in #9444
- raw: AHD demosaic with reused planar scratch, about 1.6x fewer instructions by @vangel76 in #9450
- raw: develop the default rendering band by band, without the f32 RGB frame by @vangel76 in #9455
- fix(ui): Camera Raw's Color Mixer Hue tracks show the neighbouring hues by @hectorviov in #9601
- Free Transform: show the live W/H readout in the ruler unit (#9400) by @NaufalDzz in #9678
- paint.stroke: fill: true fills the enclosed region (#3659) by @dottedt in #3779
- Windows installation policy: PhotoCraft by @Jeremy8776 in #9756
- Perf: cliff rows for the CPU compositor, Advanced Blending, adjustment toggles, over-budget and huge documents (#7494) by @brennanMKE in #9565
- Enforce Rust coding standards via Clippy by @dylanmtaylor in #9770
- Render path: one place records why a view left the GPU (#9328) by @brennanMKE in #9566
- xtask perf: a baseline knows how trustworthy it is (#7494) by @brennanMKE in #9564
- refactor: split oversized filter, adjustment, crop and effect builders by @osaidahmed in #6463
New Contributors
- @softwaregames1 made their first contribution in #9185
- @ssh-den made their first contribution in #9199
- @DuBearte made their first contribution in #9210
- @bercedev made their first contribution in #9129
- @VoiceLessQ made their first contribution in #9264
- @erenova made their first contribution in #9369
- @dependabot[bot] made their first contribution in #8979
- @jasallen made their first contribution in #7415
- @mathildalabs made their first contribution in #9139
- @mighty-programmer made their first contribution in #1199
- @WebWork-rrs made their first contribution in #3316
- @durtyrobbin made their first contribution in #3627
- @JeremyYao made their first contribution in #4573
- @sn-o-w made their first contribution in #5547
- @deniskhud made their first contribution in #7203
- @catursurapam made their first contribution in #5405
- @D-monized made their first contribution in #6526
- @ptrinh made their first contribution in #6583
- @hnoerenberg made their first contribution in #8923
Full Changelog: v0.16.0...v0.17.0