A Transform effect whose result would pass the geometry budget (2 million
anchors or 8 million lines drawn) is left out and the art stays where it
was, but the raster effects listed before it still scaled and moved with
it: before a Transform effect that scales the art 1000 times, a Drop
Shadow's offset grew 1000 times and its blur went to the 1000 pt limit
around art that had not moved, and Expand kept those values.
The geometry pass now notes each Transform effect that moves the art once
and that it leaves out, in the Carry it already returns, and
Carry::hide_skipped hides those effects in the list the raster effects
are read from. The canvas (a path's own effects and its fills' and
strokes'), its bounds, bake (SVG and PDF export), shape art, Expand,
Expand Appearance and Outline Stroke use it, and a fill's Transform
effect inside a piece no longer scales the effects before it when the
budget leaves it out. The budget itself is unchanged.
A path drawn as its own art inside a group whose geometry effects run
after its members' own read its object effects whole. The reshaping pass
now notes a Transform effect that no path in the art took past the
budget, and the member's art hides it before its raster effects are read.
The bounds skip the extra geometry pass when no raster effect could
follow a Transform effect, and painted_reach runs it once for both
measurements.
A right-click on a selection that holds a path (a path, a group of
paths, a compound path, or anchors selected with Direct Selection) lists
Smooth…, after Join and Average… and the anchor entries when those are
listed. It opens the slider that Object › Path › Smooth opens, which
previews the result until OK keeps it as one undo step. With nothing,
only type or a group of type selected, Smooth… is not listed.
Docs: docs/mcp.md, docs/target-app-parity.md.
Where a band border in a gradient or a shaded area runs at a slant, its
pixels form a staircase whose steps are two or more pixels long. When one
piece of outline also runs along a sharp edge in the image, that piece as
a whole is not the contour of a smooth area, and the outline kept a
corner at every step, so the border was traced as a series of right-angle
steps.
subpixel::outline now reads a run of three or more edges of 1 to 8 px,
each turning one way where it starts and the other where it ends, with no
junction on it, as a staircase when the run's own cracks pass
subpixel::low_contrast. A run is cut at any step whose own cracks show half
of the step between the two colors or more. Its edges are steps, as
one-pixel steps already were: no corner where two of them meet, and one
point at the middle of each, moved by the mean of its cracks' shifts. The
corner where a run meets an edge that is not a step stays, so a straight
edge longer than 8 px next to a staircase stays straight. Two one-pixel
steps inside a run are read as part of the slope and do not make a notch.
Longer steps, staircases along a sharp edge and Black and White traces
keep their corners. The runs are the same from either side of the border.
On gradient and photo inputs most traces take fewer anchors. Some rows get
worse: 6 Colors on gradient and photo leaves a gap of 0.9 px (was 1.2) and
an overlap of 1.0 px (was 0.8), High Fidelity Photo with Gradients on a
blurred input takes 50 anchors (was 47), and on a synthetic 800 px photo
the 95th percentile of High Fidelity Photo's pixel difference rises from
6.33 to 6.67 and 16 Colors leaves 2 staircases of 2 px steps or more where
it left none.
Docs: docs/target-app-parity.md, docs/image-trace-quality.md.
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.
An app that does not send the image back wrote the window capture to
vectorcraft-window-<pid>.png directly in the system's temporary folder.
On a shared Unix temporary folder another user could put a link at
that name, and the app would then overwrite the file it points to. A
failed read also left the file behind.
The capture now goes to window.png in a new folder made for it inside
the temporary folder (owner-only on Unix; a name that is taken is
skipped). The folder is removed after the read, also when the app or
the read fails.