A gradient stop's process plates print beside the tint of the spot swatch
that the stop itself links to. A painted live effect could return a stop
with `plates` and no link, or a link to a process swatch or Registration,
and the result was drawn with plates that no plate ever prints.
- The painted-output decoder refuses `plates` on a stop with no `swatch`
(absent or null). The gradient's own `swatch` does not link its stops.
- The reference check refuses `plates` on a stop linked to a swatch that
is not a spot swatch. It runs again on a cached result, so a result is
refused once its swatch stops being a spot swatch. A missing swatch
keeps the error that names the swatch.
- Either fault refuses the whole result, and `lastError` names the
stop's `plates`. Plates on a stop linked to a spot swatch, all-zero
ones included, are kept. Filter and importer output keep clamping and
unlinking plates as before.
Docs: docs/plugins.md, docs/target-app-parity.md. The new message has a
row in every complete message catalog.
show_hidden_characters_lays_out_only_type_that_changed retries its two
frames when another test changes the fonts or the hyphenation exceptions
between them. Every retry set the same text, which after the first
attempt is no edit, so the object kept its marks and the test failed
with "the edited object is laid out again". Each attempt now sets
different text.
* CI: FreeBSD builds with two jobs
The nightly FreeBSD run has been killed for memory (exit 137) while
compiling the workspace's test targets, on both architectures, every
night since at least 9 November. Two rustc processes at a time fit in
the VM's 12 GB.
* CI: one FreeBSD build job at a time
With two jobs the engine and ui-egui test builds were still killed when
they compiled together.
The panel collected the objects for its nested rows from the document
as it is between commands, where the art of the stored brushes is not
set, so rows whose owner is a brush found no object and drew a blank
thumbnail. When an id is not found otherwise, the panel now sets that
art on a copy of the document, as links.list does, and collects the
objects from it. A recheck of the files at the same revision keeps the
objects collected before.
A computed name such as o[key], where key's toString returns a rope,
is flattened into a copy that only native code held. A getter or
setter that started a collection dropped that copy from the heap
estimate, so the live heap could pass the limit by one name per
nested access. Indexed reads, ++ and -- on an indexed property, and
Object.defineProperty now keep the converted name reachable while the
accessor runs.
The Japanese row in docs/localization-parity.md said every message is
translated, and the Japanese catalog line in docs/target-app-parity.md
said 38 messages were missing, one of them waiting on #7214, which has
merged. On main the untranslated report lists 98 messages without a
Japanese row, 77 of which every complete-message language lacks. Both
lines now give the counted rows and the report's count, and name the
open pull requests that translate part of them.
A block's line took the tallest ascent and deepest descent of its
characters, or the height of the stack's em boxes, whichever was larger.
The top block line's characters reach above the stack by their ascent
past the em box, and the bottom line's below it by their descent, so with
a wide Line Gap the line was too short for them. The line's ascent and
descent now also take in each character's reach from its own block line's
baseline.
- Outline Stroke on a graph's strokes, including Object > Expand with
Stroke on, adjusts the bounds the graph keeps, the same way
Create Outlines on its labels does. Before, the stroke outlines
changed the bounds of the art without type, and the next redraw
stretched the plot by the width the outlines added.
- A graph that keeps `placedArt` and has no art other than type left
is no longer measured on the bounds of all its art. A label edit on
such a graph moved and stretched the plot at the next redraw; the
plot now stays where it is.
- A redraw no longer measures a move or scale on art that has no width
or no height now, such as a graph left with one axis line. Before,
the plot collapsed to no width.
- A clipping group in a graph that holds type is measured on its clip
when the clip does not depend on type, so moving art outside the clip
does not change the bounds. Blends, envelopes and repeats are
measured whole, as they are drawn.
- The doc crate's helper is named `graph_art_without_type` and sits
with the file's other free functions.
- docs/mcp.md lists Outline Stroke and states that moving an outlined
label, a swatch, an axis or a tick mark on its own can move or scale
the plot, and that a graph left with only labels, or with art that
has no width or height, does not follow a move.
- Tests: a scale of the graph made before outlining a label, a move of
a graph opened from `.ai` after its label is restyled and moved,
Outline Stroke after a move, a graph left with only its labels or
with one line, and clipping groups holding type.
A WMF without a placeable box picks its scale from the map mode its
drawing records are played in. Lines and shapes drawn under R2_NOP or
R2_XORPEN, and PATBLT records the reader does not fill, no longer count,
with the mix mode saved and restored with SAVEDC and RESTOREDC.
An open stroke that reaches far outside the picture is left out before
it joins the strokes waiting to be joined, so the strokes drawn before
it are still added.
A fill in a glyph's clip marked the clip as filled before the fill was
added. When the fill painted nothing (a palette index past the palette,
or a radial gradient that draws no circle), the next glyph painted in
the same clip became the clip's only child, and closing the clip kept
that glyph on its own, so it drew outside the clip.
The clip is now marked filled only when the fill adds the clip's first
child, and a fill that adds nothing leaves the mark as it was.
A clip group with a fill or stroke of its own and no geometry effect is
baked through bake_pieces, which baked the clipping path like any other
member instead of applying the geometry effects in it as the canvas clips
by it. A compound clipping path whose member has a Transform effect with
copies then baked into nested compound paths, and SVG, PDF and the other
exports dropped the moved member and its copies from the clip.
bake_pieces now applies with_clip_effects_applied to the clipping path
first, as the plain clip group route already does. Clipping type keeps
its own handling.