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.
When a flattened root is a sublayer, its ruler guides were found by
checking whether the sublayer held any and then walking its whole
subtree again to collect them. They are now collected in one descent
through the sublayer and its sublayers, looking at each of their
children once. The guides, their order and the layer each one goes to
are unchanged.
A test-only record of the nodes looked at checks that each one is
looked at once and that the guides keep their paint order.
EMF and WMF import now plays the records with the shared craft-metafile
reader (storytold/craft-libs#778, at the craft-libs rev the SVG, EPS and
DXF crates already use) and maps its picture onto the document here:
paths with their fills, strokes, caps, joins, miter limits and dashes,
clipping groups, images and point type. The EMF and WMF record players in
crates/metafile/src/import and the DIB decoder they used are removed. The
writers are unchanged, and the PICT reader keeps its own player.
What changes for a file being opened, placed or pasted, and for an EPS
file's Windows metafile preview (read when its PostScript can't be):
- An EMF that draws with EMF+ records is read from them. It opened empty,
with a warning that EMF+ is not read. A file with both kinds of record
is read from its EMF+ records too.
- Hatched and pattern brushes fill with the average color of the brush's
tile, translucent where the tile has gaps. Hatches filled with the hatch
color and pattern brushes with gray.
- Translucent fills, strokes and EMF+ text keep their alpha as opacity.
- Text keeps a stretch across from the world transform; it kept only the
turn. Text the file clips to a rectangle is clipped to it, and an
underlined or struck-through font gives underlined or struck-through
type.
- A clip path whose bounding box holds the whole picture is kept unless
it is that rectangle; a diamond or a bow tie around the picture was
dropped.
- Images drawn with SRCAND, SRCPAINT or SRCINVERT are drawn as they look
over white, and images drawn with other raster operations are drawn as
a plain copy. They were left out with a warning.
- Excluded clip rectangles and the other clip region modes are applied.
A clip path combined with RGN_OR, RGN_XOR or RGN_DIFF is ignored
without the warning it gave.
- An image past the reader's size or pixel limits, or one that can't be
decoded, is left out without a warning of its own. A file past the
reader's limits (more than 32 nested clip paths, 200,000 drawn items,
256 MiB held) is read up to that point without a warning.
- An EMF record whose size is not a multiple of 4 ends the file, with the
"ends early" warning.
Tests: an EMF+ only picture imports its fill (it failed before), a dual
EMF+ file draws its translucent EMF+ fill and not its fallback, hatch and
pattern brush colors, clipped and underlined text, excluded clip
rectangles, a shared clipping group, an odd record size, WMF at 1440
units an inch without a placeable header and at its own units with an
inverted box, an EMF without a frame, diamond and bow-tie clips, text with a
stretch, clips nested past the stack and 200,000 clip records; the fuzz
test gains random EMF+ records.