A clipping path that is a group clips by its visible members only. A
geometry effect on a hidden member made clicks inside the clip group
count the group's type by its glyph outlines, where they count it by its
frame when nothing has an effect.
Clicks now ask `effects::reshaped_clip_outline`, which gives a region
only when an object the clipping path clips by has a geometry effect.
`clip_outline` uses the same function.
The geometry effects of a clipping path's own fills and strokes stay live when the clipping path has a fill or stroke, so they reshape it after the geometry effects of the clip group and of the groups around it.
Both .ai writers now write a graph that the .ai reader reads back as the
same graph with its records, so a saved graph opens again live, with its
table, type, axes and settings: %_Gs, the Gb, Gy, Gd, Ga/GA, Gz, Gc and
GC records, the graph's group with each series' group followed by a Go
tag, and %_GS (the published .ai file format specification, section 17
and appendix A). The records are the ones the reader in
crates/eps/src/import/ai/read/graph.rs (#7311) reads, in the form it
reads them.
The shared encoder in crates/eps/src/ai_graph.rs decides first whether
the reader keeps the graph whole: a column, stacked column, line or area
graph with a legend, settings the records carry, a table of 1 to 10,000
categories and 1 to 256 series with finite values, labels of at most 255
bytes without control characters, and art the reader attaches the graph
to. Any other graph is written as its art, with the existing warning, as
is a graph whose art the editing writer's object limit cuts short.
Tick-mark counts of 0 are written as 1, the count the reader keeps for
both.
Bar, stacked bar, scatter, pie and radar graphs, stacked column and area
graphs whose series marks carry a stroke their legend swatch lacks, and
line graphs with markers are still written as their art, with the
warning.
While a document's composite fonts are lent, type naming a composite font
the document does not define is set as in a missing font, even when the
front document or the document a placed document sits in defines one of
that name. A document that defines no composite font gets an empty scope
too, so a document in the back, a tiled window, a thumbnail or an export
made while another document is in front no longer borrows the front
document's definitions. A temporary document drawn while a document draws
keeps that document's fonts, and type laid out with nothing lent still uses
the registered ones.
- FontDb::composite_font looks only in the latest loan of the database.
- lend_composite_fonts lends an empty set at the top level when the
database holds composite fonts; lend_document_composite_fonts also lends
one inside another loan, for placed documents, back-document measuring
and threaded reflow on open.
- A loan that leaves out a registered font gets its own generation, so
layouts made with that font are not reused under it.
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.
docs/mcp.md said that for both learn.markStep and learn.resetProgress a
missing, non-string or unknown `tutorial` is an error. learn.resetProgress
takes no params and clears the progress without reading `tutorial`
(crates/ui-egui/src/panels/learn.rs), so the sentence now names the
tutorial errors under learn.markStep alone, and the rule that an error
changes nothing stays with them.
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.
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.
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.
The Vietnamese row's message column said "all" while the same cell counts messages without a Vietnamese row. It now says dialogs and tooltips are complete and messages are partial, as the Indonesian row does. The row and the evidence line in docs/target-app-parity.md give the catalog's current counts: 1,750 @msg and 49 @msgplural rows, with 1,875 messages in the untranslated report.
The Indonesian and Bosnian rows now give the catalog counts and the
untranslated-report gaps measured on main at 676f0524cc: Indonesian has
6,825 rows (1,036 @msg) and lacks 60 menu strings and 2,508 scanned
messages; Bosnian has 6,887 rows (1,144 @msg) and lacks 97 menu strings
and 2,416 scanned messages.