A clip path is left out only when it is one rectangle around the whole
picture. One figure through a box's four corners that runs back over its
edges encloses less than the box, and the objects under such a clip are no
longer imported unclipped.
Only a pie with Legends in Wedges picks its legend labels' fill, white on
dark wedges. Paint visits and swatch mappings now leave its default black
legend fill out only for such a pie; other graphs draw the kept fill, so
it is visited and mapped like the other label fills. A color mode change
still leaves the default black legend fill as the default, so turning on
Legends in Wedges later keeps the white labels on dark wedges.
The next redraw of a graph compared the bounds of all its generated art,
labels included, with the bounds stored at the last generation, and took
any difference for a move or scale of the graph. Label edits that change
the size of the type (a new size, an indent, a legend size) changed those
bounds without a move, so the plot shifted and stretched when the graph
was drawn again.
The spec now also stores the bounds of the art without type
(`placedArt`), and moves and scales are measured on those. Graphs saved
without them are measured on the whole bounds as before. Moving one
label with Direct Selection no longer moves or stretches the plot at the
next redraw.
A CMYK or grayscale TIFF reads its alpha from the first extra sample whose
ExtraSamples value is 1 or 2, wherever it comes among the extra samples, at
8 and 16 bits, chunky or planar. TIFF 6.0 gives each extra sample its own
ExtraSamples value, in order, and asks readers to skip extra samples they do
not use.
- A CMYK file with alpha after an unspecified extra sample was kept as
opaque inks; it is now shown as RGB with its alpha.
- A grayscale file with alpha after an unspecified extra sample opened
opaque.
- A six-sample CMYK file whose ExtraSamples tag lists only an unspecified
value no longer reads that sample as transparency.
- A white-is-zero grayscale file with an alpha channel opens; it failed to
read before.
Consider Open Filled Paths as Closed decided whether an open path was
filled from its top fill row only. A path whose top fill is None over a
painted lower fill stayed open, and one whose only painted fill was
hidden or at 0% opacity closed. The region map, merge inputs and the
Clicking Stroke Splits the Path cut now use Appearance::has_drawn_fill,
so any shown, painted fill row above 0% opacity counts, as the canvas
paints it.
The Shape Builder's Live Paint face and edge filters had the same
top-row check; they now use has_drawn_fill and has_drawn_stroke, so a
face or edge is taken when one of its rows draws.
livePaint.info reported only the top fill of each face and the top
stroke and weight of each edge, so a lower row that draws under an
unpainted top row was not visible to a client. Each face and edge now
also carries `appearance`: every fill and stroke row, bottom first, as
{index, kind, paint, opacity, visible, width (strokes only), drawn}.
`drawn` follows Expand's rule row by row: the part is shown with an
opacity above 0, and the row is shown, has paint and an opacity above
0, and a stroke has a weight above 0. The existing `fill`, `stroke`,
`width`, `bounds`, `sources`, `gapOptions` and `gaps` fields are
unchanged.
The params text no longer says the group defaults to the selection:
the command takes `group`, or `id` when `group` is left out, and
returns an error without either.
The artboard commands that take `index` or `indices`, a replayed
`selectedArtboards`, the artboard Align and Distribute commands
(`artboard`, `activeArtboard`), `edit.newDocumentFromState` and Paste in
Place, in Front and in Back now report a value that is not a whole number
with "`<key>` must be a whole number" or "`<key>` must contain whole
numbers", naming the key. A whole number that names no artboard or state
keeps `no such artboard`, `no history state N` or the paste range message.
- A null artboard `index` is `missing index`, as for other required keys.
- An `indices` value that is not a list, an empty list and a malformed
entry each have their own message naming the key.
- `edit.newDocumentFromState` still uses the current state for an omitted
or null `index`.
- Paste checks the form of both `artboard` and `artboards` before either
range.
Docs: docs/mcp.md, docs/target-app-parity.md.
A stroke whose only setting that depends on direction is a gradient along or
across the stroke now goes through the same edge fitting as dashed strokes, so
each cut edge runs the way its source path does and the gradient keeps its
direction.
The reader keeps at most 200,000 objects from one file and stops reading
there. A picture that reaches that count now carries a warning that any
objects after them were not read, and objects dropped past the import's own
object limit carry a warning too.
#7592 documented brush.freehand's brush as optional, so the shortcut editor took it for a
command that runs without params and listed it, and listed_commands_run_from_a_key_without_a_missing_param
fails on main: a key press can't give the stroke's points. It joins NEEDS_A_PARAM with the
other commands that need a point.
With the Selection tool, the note that ligatures are off while the text is
tracked read only the first run of the first selected frame. It now shows
when any character the panel reads has Standard Ligatures on, tracking
outside the shaper's limits and no explicit liga or clig tag, including
the runs of later frames of a selected threaded story, locked or hidden.
The panel's other controls already read those runs through
character::shared; a new any_style helper walks the same styles. The
panel's commands still change only the selected frames.
When a closed key path now starts where its stroke gradient steps between
two stops of one color linked to different swatches, the gradient's new
first stop takes the swatch link of the stop after the step instead of
the one before it.
Type that the editing copy writes as its outlines (mirrored type, type in
a clip or symbol, type the text document can't hold) put its Text Wrap
Options on the group of glyph outlines. The reader then wrapped area type
around the glyph shapes instead of the type's bounds, so the wrap region
changed when the file was opened.
The group now ends with an unpainted closed rectangle at the type's
geometric bounds, with the type's lock and hidden state, that carries the
wrap options; the group keeps the type's name and has no options of its
own. The `.ai` reader already reads an unpainted path with its own
options (`text_wrap` in crates/eps/src/import/ai/read/document.rs), and
wrap resolution descends into a group without options. The rectangle
counts toward the object limit; without room for it the options are left
out with the limit's warning. Type without finite bounds gets no
rectangle, as it had no wrap region before saving.
A clip path is left out only when it is one rectangle around the whole
picture. Two open figures along the top and bottom of a box enclose nothing,
and the objects under such a clip are no longer imported unclipped.
Reset Panel records no undo step when it changes nothing, so the character and paragraph tests that reset a second document first give its type a value away from the panel's defaults.
Strokes drawn one after another with the same pen join into one path only
when the pen is opaque. A translucent stroke keeps its own opacity, so where
two of them overlap both show.
Items filled with the same pattern brush share its tile, and the tile's
average color is now worked out once per tile instead of once per item.
Finding the blend pixels and settling them onto a side took about 85% of
color quantize on a 16 MP raster, all of it on one thread. The k-means
palette step works on at most 32,768 histogram bins and took under 1%.
- own_colours_among and settled work through bands of about 65,536
pixels with layers::parallel_map (one thread on wasm32) and join the
results in row order. settled reads every pixel's neighbors from the
labels as they were before any change, as before, without copying
them.
- settled_wide settles groups of its 7-column strips apart; each strip
already started from empty buffers.
- A picture with no pixels returns before any band or strip is made.
The output does not change.