object.expand.info reported a gradient (and a fill) to expand for any
type whose characters have a gradient fill. Expand outlines type first,
and each outline then holds the run's gradient on its own box, so a
gradient that repeats or reflects in more than 256 runs across every
outline stays a gradient: the dialog enabled options that changed
nothing.
- The query now measures the paths type.createOutlines makes of the
glyphs, ruby glyphs and underline and strikethrough bars, each with
its run's paint, and reports a gradient when one of them expands. It
lays the text out only when a run has a gradient fill, stops at the
first outline that expands, and does not change the document. Type in
symbol art, blends and repeats goes through the same check.
- docs/mcp.md says when gradient is false; docs/target-app-parity.md
gets an evidence line.
PDF export without a PDF/X or PDF/A standard writes pages longer than
200 in at full size in points instead of with a UserUnit scale.
longPagesInPoints is now on by default in PdfSettings, the built-in
presets and the Save PDF dialog. Turning it off writes such a page with a
UserUnit from PDF 1.6 on, as before. PDF/A-2b files keep the UserUnit,
and .ai saves keep it unless longPagesInPoints: true is passed.
Docs: params text, docs/mcp.md, docs/target-app-parity.md.
Three repairs in crates/pathops/src/addons/cleanup.rs grew with the square
of the input. Each now gives the same results as before, bit for bit.
- Collinear anchors: removing an anchor called Vec::remove, so a straight
run of n anchors took O(n^2) moves. The repair now tests each anchor once
against the nearest kept neighbors, with the same test order, neighbors
and stop rule, and moves the kept anchors into place once.
- Nearly Coincident Anchors (near_point_groups): every pair of anchors in
touching grid cells was compared, so a cluster of A anchors cost O(A^2)
checks. Groups now grow one anchor at a time and look only at anchors no
group has taken, by exact position, skipping quarter-cell squares that
lie out of reach.
- Rejoin Path Pieces (rejoin): every pair of ends within the gap was listed
and sorted, O(P^2 log P) for P pieces meeting at one place. Each end now
finds its first partner in the same order (turn, distance, then end
order), searching by direction among the ends still free, and two ends
that are each other's first partner meet.
Tests compare each repair with a copy of the old algorithm on generated
and focused inputs, count the work on dense cases (20,000-anchor runs,
4,000-anchor clusters, 2,000 pieces meeting at one point), and check Health
Check, Show and Fix on a 5,001-anchor path.
With one Objects on Path group selected and an object chosen with its
Select/Move widget, Detach in the Properties panel's Objects on Path
Options section takes that object out of the group
(`object.objectsOnPath.detach {member?}`). The object goes just above
the group in the Layers panel, stays where it is drawn and is selected
alone. The other objects move up the path in their order: Auto Space
spreads them evenly again, and a Space value and the start are kept.
The group and its path stay with one object or none left. Hidden or
locked objects and groups are refused, and Detach is one undo step.
When the group is itself on another group's path, the object goes
above the outer group so it does not join that path.
Docs: docs/mcp.md, docs/target-app-parity.md. Detach and its undo name
have rows in every catalog, and the new message in the complete-message
catalogs.