A fill or stroke row that the Appearance commands gave a graph label, its
object opacity, and the characters the Eyedropper gave it lasted only
until the graph was drawn again: the graph stored nothing for a label's
rows, and the Eyedropper's character attributes were not stored.
- The graph keeps, for value axis numbers, category labels and legend
labels, the paint, weight, opacity and blend mode of a label's topmost
visible fill and stroke row, their order and place relative to the
Characters row, and the label's object opacity and blend mode
(labelStyles valuesRows, categoriesRows, legendRows). Every label of
the kind gets those rows when the graph is drawn again, with a placed
gradient fitted to each label.
- Every appearance.* command stores them, and so do graphicStyle.apply
and redefine and the paint, stroke, gradient and transparency edits
aimed at a row, even when the label already showed them.
transparency.set without a row and object.setProps store only the
object opacity and blend mode. With several labels of a kind, the last
one edited wins.
- appearance.copyFrom onto all of a label's text stores the character
attributes it applied and, from type, the paragraph attributes; a
transparency pick stores the object opacity and blend mode, and
append stores the rows.
- paint.setFill and paint.setStroke store a character fill or stroke
only when the characters take the paint (the whole label, or all of
its text highlighted with the Type tool); aimed at a row, they store
the row.
- Document Color Mode and swatch edits reach the kept rows.
Docs: docs/mcp.md, the commands' params text, docs/target-app-parity.md.
A command now counts as taking a file or folder when its params
description (with the commands its `…` entries name) or its schema takes
a file key as a param. A word in the description's prose or result no
longer counts; a description whose keys are not known keeps the text
scan. The code of the call-time scan of arguments is unchanged, but it
reads the changed exemption tables. The confined run is unchanged.
- NOT_FILES drops seven entries that named no param of their command
(object.setLiveShape path, path.reverse paths, object.pathfinder.options
paths, object.maskImage path, imageTrace.make paths,
svgInteractivity.info files, addon.cleanup.rejoin paths). A top-level
`path` to object.setLiveShape or object.maskImage, `paths` to
path.reverse, imageTrace.make or addon.cleanup.rejoin, and `files` to
svgInteractivity.info are now refused.
- Image Trace's path fidelity setting is exempt only inside `params` and
`savedPreset` of imageTrace.make and imageTrace.makeAndExpand, so a
call with it is no longer refused.
- every_command_is_sorted checks that each exemption names a param its
command takes, and that each nested exemption starts at one.
- effect.expandAsWireframes is reviewed as allowed and
stroke.arrowheads.list as refused.
stops and stop flattened the path twice, once for the points and once
for its length, and stop did both before rejecting an index past the
last object. place validated the path with attachable_path first, and
transform measured the old and new paths up to three times each.
A private Measured value now holds the flattened first subpath with its
length and closed flag, and path_length, stops, stop and transform use
it. stop returns None for an out-of-range index without measuring, and
a move of the group measures no path.
attachable_path now uses path_length, so a path whose length overflows
to infinity is no longer offered as one objects can attach to when
placement cannot measure it.
A Smooth drag along the middle of a curved segment smoothed nothing when
neither of the segment's anchors was within the reach, and paths of two
anchors were never smoothed.
- path.smoothRegion searches each curved segment where it can come
within the reach, halving it down to pieces no longer than half the
reach, and adds an anchor in the middle of each stretch in reach; the
existing reach split then cuts the segment where the drag enters and
leaves the reach. A drag that only grazes a curve finds the place on
it nearest the drag. The search is bounded per drag and shared
equally by the segments in reach.
- Paths of two anchors are smoothed, open or closed.
- Alt with the Paintbrush smooths a selected two-anchor curve; a
two-anchor straight line still gets the closed stroke. Both sides use
one segment_is_straight test.
Part of #2224
While the Smooth tool drags with a path selected that it can smooth, a
dashed outline shows the band its release smooths: every point within
the tool's radius (12 screen pixels) of the drag, round at both ends.
Alt smoothing with the Pencil, Paintbrush and Blob Brush shows the same
band. A selection with no path the tool can change shows none.
- The band is kept in squares eight radii wide, and each step of the
drag adds its area only to the squares it reaches. A piece of a
square's outline along a side is left out only where the square
across holds band area.
- A drag segment too long for the squares (a jump drawn zoomed out and
viewed zoomed in) keeps its band near each end in the squares and
shows the rest as the two sides of its band. A step that cannot be
added whole is added one segment at a time.
- A coarser grid of cells lists the squares and long segments, so a new
one is checked only against those near it, and an outline is made
again only where the band near it changed.
- After a zoom change mid-drag the band is outlined again a few hundred
points per frame, and the work on long segments stops for the frame
after a fixed budget. Tools report unfinished overlays with
Tool::overlays_pending, and the canvas then draws again on the next
frame, so the band covers the whole drag even while the pointer holds
still.
A threaded story measured each type-on-a-path frame, and each area frame
whose lines align to the center, the bottom or justify vertically, with
the whole rest of the story. A story of 1,500 one-line paragraphs through
40 such frames was laid out over about 2.1 million bytes while the frames
were measured.
- Area type without Shrink Text to Fit now takes the paragraph probe for
every vertical alignment. A reflow pass that places less text is
undone, so when the final layout stops before the last paragraph break
measured, every pass placed the same lines as with the whole rest.
- Type on a path takes it when its line starts at the start bracket: no
Dynamic Text, Optical Margin Alignment or Roman Hanging Punctuation,
the first paragraph aligned Left, Justify Left or Auto, and vertical
type or no right-to-left text in the rest of the story. The story is
scanned for right-to-left text once per distribution.
- Shrink Text to Fit, the other path settings and a share that ends in
the story's last paragraph are still measured with the whole rest.
The same 40 frames are now measured over 21,035 bytes (aligned to the
center) and 20,583 bytes (paths aligned Left). Each frame's share is
unchanged: the tests compare every slice with the whole-rest result for
both distribution entry points, across alignments, frame shapes, wraps,
path settings, right-to-left text, styles, lists and seeded stories.