What's Changed
- Brushes: one output budget across tracks, tiles and copies (#3594) by @saad-mughal435 in #3731
- Docs: the Shape Builder parity line paraphrases the combine page by @dotCooCoo in #3679
- G4: paragraph Auto Leading drives the Leading field, leading nudge and placeholder fill by @bflatastic in #3733
- G4: hanging punctuation keeps its amounts under Glyph Scaling and burasagari by @bflatastic in #3736
- Docs: the Shape Builder parity lines appear once each by @dotCooCoo in #3737
- Cap the face count of a font collection in enumerate_faces by @Silvertree2010 in #3735
- Plug-ins: heavy filters, allowed at install and run in the background (G17) by @KaboomFox in #3721
- Docs: twelve parity doc lines describe the reference pages without quoting them by @dotCooCoo in #3743
- Windows: a pen's barrel button is the right mouse button with Windows Ink by @dotCooCoo in #3738
- G12: Constrain Angle for the arrow keys, Shift drags and new objects (#394) by @bflatastic in #3745
- Type: OpenType SVG colour fonts draw and export as vector art by @lehni in #3741
- Place: files are read and decoded on a background thread by @dotCooCoo in #3740
- PDF import: keep one tracking value on letters whose file widths round off the installed font's advances by @Taha-Mahmoodi in #3742
- Export for Screens: files are encoded and written on the background thread by @dotCooCoo in #3686
- Restore render depth counters after a caught panic by @Silvertree2010 in #3749
- Simplify: Object › Path › Simplify opens its slider at the Auto-Simplify level for the selection by @Taha-Mahmoodi in #3750
- Artboards: Artboard Options shows a center mark and cross hairs on the canvas by @Taha-Mahmoodi in #3751
- Fix #3705: pastes follow Draw Inside and Draw Behind, and Shift+D no longer sticks in Draw Behind by @Taha-Mahmoodi in #3752
- PDF import: keep a line's glyphs on course when the file's widths are a little off the font's advances by @Taha-Mahmoodi in #3753
- SVG: keep other applications' attributes from import to export by @KaboomFox in #3758
- Cap the input of live Pathfinder effects by @Silvertree2010 in #3757
- Make DXF import symbol-name uniquing linear by @Silvertree2010 in #3760
- Linux: a tablet pen's pressure reaches the tools under X11 and XWayland by @dotCooCoo in #3761
- Stop DXF hatch source-handle loop at first missing handle by @Silvertree2010 in #3762
- Stop tiny DXF spline weights from splitting every span to the cap by @Silvertree2010 in #3763
- Preserve supplied passwords when confirming Save PDF by @dylanmtaylor in #3836
- packaging: use [[ for bash conditional tests (SonarCloud S7688) by @dylanmtaylor in https://github.com//pull/3853
- Packaging: pin the signing client and appimagetool, and check their hashes by @aiongg in #3268
- i18n: every catalog translates "PDF security settings are not an object" by @Taha-Mahmoodi in #3847
- Raise undefinedresult for non-finite EPS arithmetic instead of panicking by @Silvertree2010 in #3771
- Keep ASCII85 output from starting its first line with '%' by @Silvertree2010 in #3858
- Fix quadratic PostScript search in the EPS importer by @Silvertree2010 in #3816
- Charge PostScript filter output to the EPS interpreter budget by @Silvertree2010 in #3810
- Charge and bound EPS image sample planes on import by @Silvertree2010 in #3821
- Charge gstate and currentgstate path copies to the memory budget by @Silvertree2010 in #3822
- Fix quadratic paper layout de-duplication in DXF import by @Silvertree2010 in #3754
- Cap the total array insert copies in a DXF import by @Silvertree2010 in #3789
- Bound DXF import work for nested inserts that produce no nodes by @Silvertree2010 in #3794
- Cap path elements in DXF import across the whole file by @Silvertree2010 in #3800
- Hash PDF page contents without caching a decoded copy per page by @Silvertree2010 in #3806
- Share native-format entries naming the same bytes; cap copies at data by @Silvertree2010 in #3801
- Render opacity masks over the masked object's bounds by @Silvertree2010 in #3777
- Bound offscreen pixels kept alive by nested blending groups by @Silvertree2010 in #3776
- Bring the window forward when Finder opens a file (#3769) by @MarekSpodBiedry in #3845
- Type: a Ctrl/Cmd click away from the type being edited ends its edit by @marcoarnulfo in #3840
- Panels: a double-click on a tab of a group beside another no longer reports an error by @marcoarnulfo in #3830
- Panels: a double-click on the tab strip right of the tabs collapses the group by @marcoarnulfo in #3783
- Threaded text: Convert To Point Type on a frame no longer duplicates its text by @dotCooCoo in #3827
- Fix #3705: art drawn or pasted inside an isolated object in Draw Inside stays in isolation mode by @Taha-Mahmoodi in #3805
- Fix #3766: correct stroke profile flip icons by @MiQ71 in #3798
- Open and Place: a file read in the background waits for a busy tool only during a drag by @dotCooCoo in #3791
- Simplify: with part of a path direct-selected, Object › Path › Simplify refits only the selected runs of segments by @Taha-Mahmoodi in #3814
- Fix text spacing shortcuts for selected type by @MiQ71 in #3823
- Render: live objects in symbol art and opacity masks keep their evaluations between frames by @dotCooCoo in #3795
- Fonts: a family and style split from a PostScript name find the face once it is installed by @fortesnow in #3755
- Type: SVG glyph documents follow the SVG table's coordinate rules by @lehni in #3804
- Type: colour glyphs go with type that effects reshape and Expand Appearance by @lehni in #3803
- SVG: type written as outlines stacks colour glyphs under their run's paint by @lehni in #3808
- Font menu: Font Technology › Variable lists only variable font families by @Taha-Mahmoodi in #3813
- Count Repeats inside symbol art toward the Repeat instance budget by @Silvertree2010 in #3788
- Flatten transparent image pattern tiles in legacy .ai v7 export by @Silvertree2010 in #3770
- i18n: missing translations never fail; xtask ci prints one report by @aiongg in #3856
- i18n(fi): fix package-note spacing and a few Finnish labels by @Janiz-zzz in #3842
- i18n(pl): "Wtyczki i dyski robocze", "Geometryczne linie pomocnicze" by @lewandowskit in #3775
- Fix status-bar coordinates after changing the ruler origin by @haranishi in #2847
- Pencil: Shift held at the press draws a straight line at 45° steps by @marcoarnulfo in #3846
- Libraries panel: show items as icons or in a list by @danngreen in #3854
- Pen tablets: a pen's eraser end selects the Eraser on Linux under X11 and XWayland by @dotCooCoo in #3778
- feat: display point type baselines for node outlines and add hover test by @MajedAlaejem in #3834
- Tools: double-clicking the Line Segment, Arc, Rectangular Grid and Polar Grid tools opens their Tool Options by @Taha-Mahmoodi in #3815
- Artboards: Artboard Options shows video safe areas and sets the pixel aspect ratio that View › Rulers › Show Video Rulers counts the artboard in by @Taha-Mahmoodi in #3831
- Pathfinder: Trap spreads the lighter colour into the darker as an overprinting strip where solid colours meet by @Taha-Mahmoodi in #3785
- Smart Guides: Alt over another object or the artboard shows the selection's distances to it by @Taha-Mahmoodi in #3832
- Type: selected type shows its in and out ports, and the in port threads backwards by @Taha-Mahmoodi in #3817
- Symbols: Window › Symbol Libraries opens symbol libraries whose symbols click into the document's Symbols by @Taha-Mahmoodi in #3833
- Type: the Paragraph panel's Bullets button turns paragraphs into a bulleted list by @dotCooCoo in #3780
- Select: Start Global Edit edits the objects of the same shape together, each in proportion by @Taha-Mahmoodi in #3781
- Docs: one ranked-table row each for G2 and G13 in gaps.md by @bflatastic in #3874
- ci(sonar): stop cancelling main-branch runs so coverage is published by @dylanmtaylor in #3881
- Reject signed hex digits in XML-ID xHH escapes by @Silvertree2010 in #3860
- Fix false font fallback misses during concurrent loading by @FractalEncrypt in #3861
- Type: colour glyphs keep each fill's own colour, also between colours that look alike by @lehni in #3866
- Actions: Create New Set and Set Options… name action sets, and a recording goes into the current set (#3712) by @marcoarnulfo in #3863
- Import: an Illustrator gradient mesh comes in as one connected mesh by @ham9zah in #3811
- fix(stroke): preserve extended dash patterns when editing (#3497) by @Zaxaerith in #3513
- Export for Screens: a document row for an artboard keeps only that artboard's art (#3868) by @bflatastic in #3875
- Type: tests pin colour glyphs in variable fonts, on paths and on the canvas by @lehni in #3873
- SVG: a Preserve Editing SVG reopened from disk saves as the full document again (#3867) by @bflatastic in #3876
- Security: SVG import and export bounds (entity expansion, filter stacks, id probing, font feature tags) by @dylanmtaylor in #3877
- Security: geometry, path edit and tool work bounds by @dylanmtaylor in #3882
- Type: emoji go with type that effects reshape and Expand Appearance by @lehni in #3879
- Fix #3716: a click near an anchor selects without moving the object by @mercuryVM in #3885
- Security: DXF export bounds (layer and style names, flattening, entity count, image size) and import dash patterns by @dylanmtaylor in #3886
- Security: Scribble rows, Outer Glow dilation and CSS export names by @dylanmtaylor in #3889
- Security: export names, linked-file ids, MCP prompt arguments and image encoders by @dylanmtaylor in #3890
- Security: PDF import, print and export bounds; PDF 1.3 encryption notes by @dylanmtaylor in #3884
- Renderer: colour caches key colours with Color::key by @lehni in #3894
- Fix #3724: Window › New Window is greyed out until it opens a window by @mercuryVM in #3892
- Links: resolve stored paths with craft-docpath's resolve_absolute by @aiongg in #3267
- EPS tests: budget tests wait 120 s for the program to stop by @aiongg in #3891
- SVG export: type with small capitals, superscript, subscript or tab leaders is written as outlines (#3869) by @bflatastic in #3896
- G12: ruler guides nudged with art keep to the page's axes at a turned Constrain Angle by @bflatastic in #3898
- Fix clipboard read-policy bypass and FULL lock held during checks (audit automation roots) by @dylanmtaylor in #3897
- Pathfinder Outline: junctions a hair apart are one cut, so no sliver path is left (#3870) by @bflatastic in #3899
- EMF and WMF export: say when type is written as outlines and pattern fills as their tiles (#3850) by @bflatastic in #3902
- Tests: engine tests that add fonts to the shared font database take one lock by @bflatastic in #3906
- PDF export: pattern fills are written as tiling patterns (#3849) by @bflatastic in #3905
- Reject a leading plus sign in page range numbers by @Silvertree2010 in #3904
- Type: images in SVG glyph documents draw with the glyph by @lehni in #3908
- M2.1: prevent click-through on open path fills and support segment toggle (#3405) by @el-j in #3907
- Tests: native-menu tests count menu reads only in runs no other test disturbed by @bflatastic in #3914
- Type: SVG glyphs leave out images of SVG documents by @lehni in #3916
- Fix #3828: New Document › Branding offers Business Card 91 × 55 mm by @Taha-Mahmoodi in #3917
- Type: an SVG glyph's image is an SVG image by its plain href first by @lehni in #3918
- Fix #3586: the PDF pre-open scan reads a file dense with stream keywords in linear time by @Taha-Mahmoodi in #3919
- Fix #3920: a family another thread is loading is found whole, so fallback text never takes the style of its first file by @Taha-Mahmoodi in #3921
- CI: shared gate workflow; FreeBSD nightly and on release by @aiongg in #3772
- G11: Shape Builder pieces: contract the sweep's stubs between two cuts of one path by @bflatastic in #3923
- CI: one test binary per crate, nextest, line tables only by @aiongg in #3855
- Security: Image Trace bounds (mosaic, raster length overflow, auto grouping, stroke tracing) by @dylanmtaylor in #3878
- Security: private temp paths for the signing certificate and test output; web font licences stay inside the checkout by @dylanmtaylor in #3871
- Security: text layout, shaping, font name and embedding bounds by @dylanmtaylor in #3880
- .ai import: an image too large for the editing data's reader opens the file as its PDF part, not with a blank layer (#1479) by @bflatastic in #3927
- ci: move release workflow write permission to job level (SonarCloud S8233) by @dylanmtaylor in #3928
- chore(text): use is_some_and instead of unnecessary map_or (clippy) by @dylanmtaylor in #3929
- Main's CI: an unnecessary map_or, testkit's Unix-only mut, and a shared temp-dir probe by @bflatastic in #3935
- macOS: a tablet pen's pressure reaches the tools (#852) by @bflatastic in #3932
- Security: Affinity import and brush expansion bounds by @dylanmtaylor in #3887
- style: keep paint.rs spot-colour chain under rustfmt's max width by @dylanmtaylor in #3940
- Build: craft-pdf, hayro and krilla at craft-libs main by @aiongg in #3931
- Build: craft-pdf at craft-libs 2eca9b3a, with hayro-postscript from craft-libs by @aiongg in #3957
- Security: document model budgets for live art, clipping runs, placed documents, graph masks and path reading by @dylanmtaylor in #3939
- Security: bounded flattening, plug-in budgets and caches, loaded textures, Revolve paint copies, color book and ICC names by @dylanmtaylor in #3936
- Security: file authority for stored paths, linked files, placed documents, font folders, recovery areas and atomic saves by @dylanmtaylor in #3933
- Security: linear work for shortcut review, gradients, recovery names, include cycles, batch references, DOCX styles, DXF layouts and long strokes by @dylanmtaylor in #3930
- PDF import: the pre-open stream scan doesn't let a "stream" inside a literal string hide the real stream after it by @Taha-Mahmoodi in #3924
- Match !important case-insensitively in SVG import CSS parser by @Silvertree2010 in #3983
- Security: render and PDF export bounds for symbol expansion, dotted guides, blending groups and pinned images by @dylanmtaylor in #3938
- Threaded text: Create Outlines and Expand on a frame no longer duplicate its text by @dotCooCoo in #3977
- Save: a remembered artboard pick follows the artboards it named by @dotCooCoo in #3979
- Fix #3964: Create Outlines, EPS, EMF/WMF and legacy .ai keep the ruby where the canvas draws it by @Taha-Mahmoodi in #3966
- Fix #3799: Alt held at the press draws a straight Pencil line at any angle by @dotCooCoo in #3959
- Print: landscape pages print upright on macOS print queues by @cmain in #3925
- Image Trace: a filled traced path that straightens to no area is left out by @dotCooCoo in #3949
- Select: Same commands for paint, appearance and shape select compound paths by @dotCooCoo in #3943
- Recolor: recolor.colors and recolor.reduce read the art Select All takes when nothing is selected by @dotCooCoo in #3947
- Image Trace: the semi-transparent edge of a cut-out image traces as the color beside it by @dotCooCoo in #3942
- Image Trace: imageTrace.make refuses unknown keys inside params by @dotCooCoo in #3972
- Image Trace: Auto Grouping looks up containing paths in a grid instead of testing every pair by @dotCooCoo in #3970
- MCP: screenshot and render_preview draw edges as a PNG export does by @dotCooCoo in #3981
- MCP: the file tools send paths made absolute against the server's working directory by @dotCooCoo in #3971
- MCP: document.inspect and document.open report the File Info title as fileInfoTitle by @dotCooCoo in #3963
- Render: brush art of symbol instances, inline graphics and repeat copies is kept between frames by @dotCooCoo in #3962
- Render: an unchanged live object or effect art is not walked again for its resources by @dotCooCoo in #3934
- Image Trace: a Preview checkbox chooses whether setting changes trace at once by @dotCooCoo in #3982
- Find Objects: document.find filters by bounds, size and anchor count and can select the matches by @dotCooCoo in #3976
- EPS: Use Artboards also writes a central file with every artboard by @dotCooCoo in #3958
- Recolor: recolor.apply with a color group keeps art linked to the group's global swatches by @dotCooCoo in #3956
- MCP: the trace-and-style prompt's steps run as written by @dotCooCoo in #3948
- Slices: Lock Slices and Hide Slices deselect the slices and keep them deselected by @dotCooCoo in #2841
- Dimension tool: Linear picks show and snap to Smart Guides by @vecteza in #3973
- Open .ai files with their swatches (palette, colour groups, unused inks); Swatches panel keeps the art's swatch after deselecting by @fabian-co in #3941
- Fix #3965: id works as ids of one with nothing selected wherever params take ids?|id? by @Taha-Mahmoodi in #3967
- Arrange: a layer id given to Send to Back and the other selection commands is refused by @dotCooCoo in #3951
- Pencil: the pointer shows a straight-line cursor while Shift or Alt is held before a press by @dotCooCoo in #3984
- MCP: save_file against the running app waits for the save and reports its result by @dotCooCoo in #3969
- PDF export: the hyphen that ends a hyphenated line is written as text by @dotCooCoo in #3988
- Image Trace: pressing and holding the eye button shows the source image by @dotCooCoo in #3989
- Native format: a document is saved pretty-printed only when its pretty-printed JSON is at most 1 MiB by @dotCooCoo in #3997
- Type: the Numbered List button numbers paragraphs 1, 2, 3 by @dotCooCoo in #3960
- Require four hex digits in DXF text \U+XXXX escape by @Silvertree2010 in #3986
- Reject plus signs in logo palette hex parser by @Silvertree2010 in #3991
- MCP docs: export and add_text each have one row by @dotCooCoo in #3998
- Save: option errors name the save command that was run by @dotCooCoo in #3993
- Properties: Blend Options, Merge Live Paint, Width Profile, an effect's Delete icon and Direct-Selected corners by @Taha-Mahmoodi in #3950
- Image Trace: Flat Logo says when it traces a large image at a reduced size by @dotCooCoo in #3944
- Image Trace: Flat Logo traces named colors a few levels off at the image's own size by @dotCooCoo in #3999
- Image Trace: Flat Logo leaves out a traced outline that has no area by @dotCooCoo in #4003
- Reject a leading plus sign in SOURCE_DATE_EPOCH by @Silvertree2010 in #4005
- Docs: G11, G2 and parity tables drop missing items that shipped (Effect Gallery, Relative rounding, Hard/Soft Mix, #834, #937, #722) by @Taha-Mahmoodi in #4006
- Fix #3621: function-based PDF shadings keep their colours instead of a flat grey by @pat26-dotcom in #3671
- Image Trace: Flat Logo finds a bar two pixels wide in its own color by @dotCooCoo in #4008
- MCP docs: start an installed app with the control port by @dotCooCoo in #4009
- Renderer: character strokes are expanded once, not every frame by @lehni in #3996
- Undo groups: an open undo group also groups the edits in a document opened or created before its end by @dotCooCoo in #4016
- test(scriptcheck): table the held-value tests by @vangel76 in #4018
- G11: Shape Builder's edge-source index is a grid, so diagonal hatches are no longer quadratic by @Ronfo2013 in #4021
- MCP: each alias tool names its pair, and ui_screenshot takes max_side by @dotCooCoo in #4022
- Keep the denominator of DXF MTEXT stacked fractions written with ^ by @Silvertree2010 in #4024
- perf(scriptcheck): lex each file once, fewer copies by @vangel76 in #4019
- refactor(scriptcheck): feature enums, split analyze.rs by @vangel76 in #4025
- Keep escaped backslash literal before U+XXXX in DXF MTEXT by @Silvertree2010 in #4000
- Control: requests are answered at full speed while the window is hidden on macOS by @dotCooCoo in #4026
- Escape spaces before x and a separator in XML ids by @Silvertree2010 in #4027
- fix(scriptcheck): same report with and without a loader for scripts without includes by @vangel76 in #4029
- ci(deps): bump Swatinem/rust-cache from 2.9.2 to 2.9.3 in the actions group by @dependabot[bot] in #3812
- Pencil: the closing cursor shows while a stroke is drawn back near its start by @dotCooCoo in #4002
- Shape Builder: rebuild the region map for each document revision by @dotCooCoo in #4030
- i18n(sv): translate 1 new string, use the agreed terms in 148 by @kler in #3421
- Tests: the colour-font PDF test counts only text objects, not the random file ID by @echelon in #4034
- Type: threaded frames do not repeat a continued paragraph's first-line indent or list marker by @dotCooCoo in #4031
- MCP docs: wait for the app window before starting the client, and the full --connect error by @dotCooCoo in #4032
- Shape Builder: a drag picks every region it crosses, however narrow by @dotCooCoo in #4035
- Shape Builder: a line that ends inside a shape stays whole by @dotCooCoo in #4037
- Threaded text: Flatten Transparency on a frame no longer duplicates its text by @dotCooCoo in #4039
- Shape Builder: hover and Alt hover share one region map by @dotCooCoo in #4041
- Shape Builder: uses a Live Paint group's filled faces and stroked edges by @dotCooCoo in #4042
- Reject non-digit array indexes in batch step references by @Silvertree2010 in #4043
- Require two hex digits in SVG href percent escapes by @Silvertree2010 in #4044
- MCP: save_file takes the native save options compress, version and preview by @dotCooCoo in #3955
- Renderer tests: the Arabic alternate-glyph tests take the font lock by @addibble in #4045
- Shortcuts: use the shared craft-keymap crate for the catalogue, overrides, dispatch and .kys import by @aiongg in #3119
New Contributors
- @saad-mughal435 made their first contribution in #3731
- @aiongg made their first contribution in #3268
- @MajedAlaejem made their first contribution in #3834
- @mercuryVM made their first contribution in #3885
- @cmain made their first contribution in #3925
- @vecteza made their first contribution in #3973
- @Ronfo2013 made their first contribution in #4021
- @dependabot[bot] made their first contribution in #3812
Full Changelog: v0.16.0...v0.17.0