transparency.set and object.setProps with isolate, knockout or
knockoutShape on a series group now store them for the series
(groupIsolate, groupKnockout, groupKnockoutShape), and the series group
has them again when the graph is drawn again. Randomize Opacity, Sort
Objects and Global Edit store the opacity they give a series group, so
a redraw no longer puts back an older stored value over it.
A move or copy of an appearance onto a series group whose stored values
differ from its own now counts as a change, so the edit is kept. Tests
cover graphicStyle.redefine of a style linked to a series group.
transparency.set and object.setProps with an object opacity or blend mode,
given a series group picked with Group Selection, set the group's own
opacity and blend mode, and the graph drew its series groups again
without them. The graph now stores them for the series (groupOpacity and
groupBlend) and puts them back on the series group when it is drawn
again. Commands that clear the group's own opacity and blend mode
(appearance.clear, graphicStyle.apply, appearance.transfer onto the
group, graphicStyle.redefine of a linked group) remove what the graph
stores.
A path directly in a graph series lost what these commands gave it when
the graph was drawn again, for example after graph.setData:
- While Global Edit is on in an isolated graph, a match that is a series
path, or a series group whose paths take the edit, now has what
changed on its paths stored for their series: the paint, weight,
opacity and blend mode of the topmost visible fill and stroke, and the
object's opacity and blend mode. The edited match is stored by its own
command as before.
- addon.arrange.randomizeOpacity and addon.arrange.sort with apply
"opacity" now store the object opacity, with the blend mode, of the
series paths whose opacity they change. When they change several
paths of one series, the frontmost of them sets what the graph
stores, as for the other commands.
The graph stores them in the same undo step as the edit. The params
text of addon.arrange.randomizeOpacity and addon.arrange.sort,
docs/mcp.md and docs/target-app-parity.md describe the new behavior.
A 3D effect on a fill or stroke worked on copies of the object's fills
and strokes, and the copies were looked up among the object's items by
identity, so a live-effect plug-in before that 3D effect was given
`_context.item` "object" and a deferred stage there was listed with no
item. The drawn art, the 3D meshes and Expand as Wireframes now pass the
original item, so the plug-in is given `{"fill": i}` or `{"stroke": i}`
as docs/plugins.md describes. The paints of a type's first run still have
no item.
Select > Start Global Edit was enabled for any plain group, so a group
holding type, an image or nothing was offered in the Select menu and the
Properties panel's Quick Actions, the Control bar showed its Global Edit
Options, and starting then refused it. The enabled check now applies the
same support check as starting to every selected object, a group's
contents included.
The answer is kept per document revision and selected object, so the
Control bar, which asks every frame, walks a group once per change.
Docs: docs/mcp.md, docs/target-app-parity.md (a new line; the existing
Global Edit line no longer says the menu item checks only for a group).
A document's composite fonts were lent by writing them into the font
database's shared map, and a second lend of another definition of the same
name was skipped while the first was held. A document drawn in a tiled or
floating window while the front document drew, a document placed in one
that defines the name differently, and an export made while another
document is in front could draw their type in the other document's
definition. Registering the front document's fonts during a render could
also change the definition mid-render.
Lending now applies on the lending thread only: each guard pushes the
document's definitions onto a per-thread stack that lookups read before the
database's own fonts, latest loan first, and removes them when it drops,
also when the thread unwinds. The guard is neither Send nor Sync. Lending no
longer changes the database or its generation; while a thread lends
definitions other than the database's, FontDb::generation gives a number of
its own for them, so kept layouts and render caches made in one document's
definitions are not used for another's.
Delete Artboards, Delete Empty Artboards and Cut Artboard removed the
chosen artboards one at a time, walking every ruler guide and the layer
tree once per artboard. They now share one helper that removes the
artboards in one walk and their guides in one more, leaving the same
artboards, guides and selected guides as before.
Empty Artboards in Artwork Cleanup had its own copy of the one-pass
removal. It now calls the same helper, and its test reads that helper's
walk counter.
264 Hindi rows kept English words in a Hindi sentence ("or", "give",
"see"), dropped the word that names what is wrong ("unknown align" read
as "unknown `left`"), reversed a condition ("not editing an opacity
mask" read as "do not edit an opacity mask"), translated enum values the
command reads in English, broke a list of accepted values
("(vertical|horizontal|free)" read as "(vertical Chhorizontal
Chlorfree)"), or repeated a parameter as a "size: आकार" prefix. Each row
now says what its English says, with parameter names, enum values,
placeholders and value lists unchanged, and "positive" reads धनात्मक.
Two tests check every row: no English connecting word outside
backticks, quotes, braces and brackets, and every `a|b|c` list of an
`@msg` row kept as written.
An object in an opacity mask's art is written with its art style, as on
the layers, so a mask whose art has Offset Path opens from the editing
data with the effect live and draws the masked object as it did. This
covers a hidden art root and masks inside another mask's art.
Geometry effects on mask art that no art style holds, such as Roughen,
are applied to the art written, in the masks of layers, symbols and
pattern tiles. Before, the mask's art was written without them.
The test's second and third wheel turns step to whichever families the
process has loaded at that moment. When another test has loaded a test
font without Latin glyphs, such as Alias Jointest Sans from the Glyphs
panel tests, the turn applies it, missing glyph protection keeps "Hi" in
Source Serif 4, and the assert_ne at the second turn fails. The test now
turns the preference off, as the font menu tests in tests/font_menu.rs
do, so each turn changes the text's font whatever family it reaches.
With downsampling on, each piece of an image bent by a Warp effect was
resampled for its own placed size, so a warp wrote one image XObject for
each size a piece was placed at (four for a 4 x 4 warp that stretches
across, eight for a colorized one with its soft masks). The pieces are
now resampled for the widest and the highest size any piece places the
image at, and all paint that one image. Pieces off the page count too,
and another placement of the same image keeps its own size.
Without downsampling, a colorized image and a CMYK image with a grid
mask no longer key their cache by placed size, so each is decoded and
encoded once for all the sizes it is placed at, as plain images are.