A selected image offers Remove Background in the Contextual Task Bar, Properties'
Quick Actions and the Control bar, as the reference app does. A click runs it at
once with its defaults, as one undo step; Object > Plug-ins > Image Tools keeps
the dialog with Preview.
A function an earlier run of a named engine defined was reported without
a line, column or file when it threw in a later run. The realm now gives
each source a tag that stays the same from run to run (Realm::error_tag,
Realm::script_tag), and no two sources share one once the tags run out.
Each named engine keeps the source maps of its runs' scripts, included
files and $.evalFile files, within 8 MiB, dropping the oldest first, and
an error in kept code is reported at that file, line and column. The
report's name and the console line keep the calling run's name. For an
earlier script given as source, file is that run's name.
Docs: docs/mcp.md (Script engines), script.run params text,
docs/target-app-parity.md.
The 3D and Materials row of docs/target-app-parity.md names Revolve
(Classic) with its options and surfaces among what ships, and its
evidence names the tests that cover it.
`__savePresetAs` makes OK save a preset instead of writing the PDF or
printing. ui.dialog.set now accepts it only while Save Preset... has
added the field, so a request cannot add it and confirm in one step.
text.tabs.set takes a list of more than 256 stops when every paragraph it
targets already holds at least that many, so a paragraph loaded with more
stops can lose them one at a time (the Tabs panel's Delete Tab). Any
other list of more than 256 stops is still refused, counted as supplied
before stops at one position merge.
Docs: docs/mcp.md.
When a dynamic symbol is redefined or edited, each instance kept every
appearance change whose path still named an object, even when that
object is now one that draws no fill or stroke of its own (an image, a
blend, a mesh) or a symbol instance given a gradient or pattern fill.
symbol.instance.setAppearance refuses such a paint, but the change stayed
on the instance and still counted as a color the document uses.
Fitting the changes to the new art now also clears a fill or stroke the
object at that path does not draw, and drops a change left empty.
Coordinates outside -32,768 to 32,767 plotter units (about 82 cm from the origin) are written as they are, with a warning that older devices may not read them. HP-GL/2 plots are not checked against this range.
ui.dialog.set took every field whose name starts with `__`, so a control
request (or MCP's answer_dialog, which goes through it) could rewrite the
`__command` and `__params` of a confirmation or the generic parameter
dialog, a plug-in command dialog's `__command`, or the paste a swatch
conflict waits to finish, after a person opened the dialog. The person's
OK then ran something else.
A `__` field is now settable only when it is a control of that kind of
dialog: a section or tab shown, a link between two fields, a name or
search being typed (for example Save PDF's `__section`, Transform Each's
`__constrain`, the Preferences `__search`). Every other `__` field, held
or not, is refused with "the `<kind>` dialog cannot set protected field
`<field>`". The request sets no field, and with `action: "confirm"` OK
does not run. Flags a button sets together with other fields are refused
too: the style dialogs' `__reset*`, Artboard Options' `__fit`,
`__sizeChoice`, `__refx` and `__refy`, and Scribble's `__scribbleSetting`.
Recolor's Merge takes a row listed twice in the selection once, and
Randomize keeps a seed at u64::MAX instead of overflowing it.
Docs: docs/control-protocol.md, docs/mcp.md, docs/target-app-parity.md.
Effect > Refresh Deferred Effects looked up the objects asked for, the
stages reached, the objects drawn whole and the inputs that ran with
Vec::contains, and counted each target stage by scanning every deferred
record. Asking whether a stage stays deferred and replacing a stage's
records when it runs also scanned every record.
Deferrals::refresh now keeps the objects asked for and the objects drawn
whole in sets, and Refresh's ids, retried, visited and touched and
Pass.ran and seen are sets. The deferred records are kept in a BTreeMap
by the order they were made in, with an index by stage and input key, so
holds, State::remove, settle and the refresh's reconciliation and count
look at the records of the stages concerned only. The targets, counts,
records kept and their order, marks and revision are unchanged.
Docs: docs/target-app-parity.md.