With a mixed selection and the Appearance panel's active row, paint.invert
and paint.complement recolor each object's row equal to the active one,
but remembered the color at the active row's index in the first object in
paint order, which can be another row. They now remember the row they
recolor there, as the gradient and freeform edits do.
The params text of paint.setFill, paint.setStroke, paint.invert,
paint.complement, paint.lastColor, paint.lastGradient, stroke.setAdvanced,
paint.editGradient, paint.setGradientGeom and the paint.freeform edits now
lists `aligned`. docs/mcp.md names paint.lastColor and paint.lastGradient,
which take the same rows as paint.setFill, and docs/target-app-parity.md
gets a line for the rows of a design's art.
With a graph design's art given first and an item without aligned, the
art is left out, but paint.invert and paint.complement remembered the
art's unchanged color as the last color. They now read the first object
they recolor.
paint.setFill, paint.setStroke, paint.invert and paint.complement with an
item, stroke.set, stroke.setAdvanced, paint.editGradient,
paint.setGradientGeom and the paint.freeform edits read an item given with
aligned: true and the art of a graph design in a series first as a row of
the art's stack, as appearance.setItem and transparency.set do. Each other
object edits the row equal to it and an object without one is left as it
is. A row the art does not have, a row of the other kind, or a row no
other object has is an error, also when the art is the only object given,
and the document and its undo history stay as they are. Without stroke,
the gradient commands edit the kind of the art's row.
The objects and ids the commands report, a gradient spanning the
selection, and the last color and last gradient count only the objects
whose row was edited.
A trace handed in for imageTrace.make or imageTrace.makeAndExpand was
matched by its object, image, pixels and settings alone, so a trace made
in one document could stand in for the command in another open document
with the same image and settings. The trace's inputs now carry the
document's uid: TraceRun::current is false in any other document, and the
commands there drop the trace handed in and trace their own image, as one
undo step.
Test: a_trace_run_applies_only_in_its_own_document.
Document::symbol_art_bounds measured a symbol's art without the
document, so an instance of another symbol in that art counted as the
20 x 20 square. It now measures the art through SymbolBoxes, so a nested
instance takes its own symbol's art, and an inline graphic of the outer
symbol is sized by it and follows it when that symbol changes.
- The inline resolve order also follows the instances that size a
symbol's art, so a symbol is measured after the type in the art of
the symbols it holds is laid out again.
- A symbol whose art reaches itself through an instance and an inline
graphic is an empty slot. Only instances that the measurement uses
count, so one a clipping path hides adds no dependency.
- A missing symbol, a symbol without art, a symbol that holds an
instance of itself, and nesting 32 deep still measure as the square.
- SymbolBoxes finds symbols through a name index built once, and the
inline resolve pass and inline_art_bounds share one index, instead
of scanning the symbol list for each lookup.