The i18n test that main added for 3D refusals calls validate_three_d_at with this branch's (Option<usize>, usize) position: effect 0 of appearance item 0 is (Some(0), 0).
With Background Save and Background Export on, Package's OK on a dirty
document starts the package once the save's result arrives. That start
ran in background::after's callback, on the frame that applied the
save's result, so the worker took the frame's file access scope. The
desktop frame has no automation roots, so a package asked for by an
automation request confined to its roots could write outside them.
OK now captures the scope in force and starts the deferred package in
it, so the package is checked against the same roots as the save.
A selected warp envelope now shows the points of its surface on a 4x4
grid (8x8 or 16x16 where 4x4 strays more than 0.1% of the warp's
diagonal from it). object.mesh.movePoint, movePoints, addLine,
deletePoint and object.envelope.setMeshPoint accept a warp: the first
edit turns it into a mesh envelope on that grid and applies the edit as
one undo step, so Undo or Escape gives the warp back with its style and
bend. An edit that moves no point leaves the warp and adds no undo
step. A warp that no such grid follows (some version 0 maps) shows no
points and its edits fail without changing anything.
movePoints and setPointColor on a gradient mesh record no undo step
when they change no point.
The dialog stored the scroll area's offered height as its content
height, which is taller than a short section draws. The room it gave a
longer section after a switch then left too little for the rest of the
window, and on a small screen OK and Cancel went below the screen. It now
stores the height the scroll area shows, the smaller of the offered
height and the content's height.
A changed content height also lays the frame out again before it is
shown, so the window is placed at its new size in the frame of the
switch rather than one frame later.
#5748 moved the Pencil's and the Paintbrush's Fidelity to screen pixels, but
docs/ui-parity.md still gave it in points. The Pencil row now gives the
slider's rail, the field and the key steps in px, and says the tool sends
path.freehand the value in points at the current zoom.
The Pencil row also appeared twice, the second copy without the Fidelity
text. The two rows are merged into one.
The comments on FIDELITY_MAX, fidelity_step, fidelity_at and fidelity_from
in the Tool Options dialog name the tool's unit, since the slider is shared
with Smooth and Blob Brush, which stay in points.
In the Touch workspace, a two-finger tap on the canvas now switches
between the Selection tool and the drawing tool chosen last, as the
help page describes. It no longer undoes there; outside Touch a
two-finger tap still undoes, and a three-finger tap still redoes in
every workspace.
- New UI command tool.toggleTouchMode (Switch Selection and Drawing
Modes, {} -> {tool}). From the Selection, Direct Selection, Group
Selection, Magic Wand, Lasso or Perspective Selection tool it chooses
the drawing tool chosen last in the window, or the Pencil tool when
none has been chosen; from any other tool it chooses the Selection
tool. The Hand, Rotate View, Zoom and Print Tiling tools never become
the drawing tool. It adds no undo step.
- These tool lists and Pencil as the first drawing tool are
VectorCraft's own rules.
- The label is in every catalog. Docs: docs/mcp.md, the touch row of
docs/hardware-parity.md and docs/target-app-parity.md.
A new Type preference, Show samples on white (`fontSamplesOnWhite`, off
by default), draws each family's sample in every font menu, and in
Type → Font in the in-window menu bar, in the Light brightness's text
color on a white area, in every interface brightness. A row's white
area is drawn while its sample is still rendering, and leaves 2 pt above
and below it where a highlighted row's color shows. The family names and
the rest of the menu keep the interface's colors. Preferences dims the
checkbox while Enable in-menu font previews is off.
Docs: docs/mcp.md (prefs), docs/target-app-parity.md evidence line.
The Paragraph panel's Mojikumi Set lists None, YakumonoHankaku,
GyomatsuYakumonoHankaku, GyomatsuYakumonoZenkaku and YakumonoZenkaku,
then Line-end Punctuation Half Width, and text.setFormat {mojikumi}
takes yakumonoHankaku, gyomatsuYakumonoHankaku, gyomatsuYakumonoZenkaku
and yakumonoZenkaku besides none and lineEndHalf.
The spacing of each set is VectorCraft's own rule, built on the help
page's one-line description of each set:
- YakumonoHankaku sets every bracket, comma and full stop half width,
takes a quarter em off each side of a middle dot, and puts a quarter
em between Japanese and Latin letters or digits.
- GyomatsuYakumonoHankaku keeps punctuation full width inside a line,
sets an opening bracket starting a line flush and a closing mark
ending it half width, and takes the quarter em after a middle dot
ending a line off.
- GyomatsuYakumonoZenkaku keeps punctuation full width and adds the
quarter em between Japanese and Latin text.
- YakumonoZenkaku sets characters as None does.
Both composers and vertical type measure each line as it is set. A
right-to-left paragraph, whose line ends are measured untrimmed, also
draws them untrimmed, and a right-to-left line that ends between a
Japanese and a Latin character is measured without the quarter em the
set adds there. With a Desired glyph scaling other than 100%, the
space a set takes off before an opening bracket or middle dot, and the
Japanese-Latin space recorded at a line's end, scale with the glyph.
The sets save with the document and paragraph styles; new type and
Reset Panel keep Line-end Punctuation Half Width. SVG export lays type
with middle dots out again for its positioned spans. A .ai save
reports a paragraph with one of the new sets as left out.
Docs: docs/mcp.md, docs/target-app-parity.md, docs/type-parity.md,
docs/gaps.md.
Each font menu kept its own script, kind, Variable and favorites
filters, so a filter chosen in the Character panel's menu was off in
the Control bar's, the Properties panel's, the Glyphs panel's and the
dialogs' menus. The filters now live in one place that every font menu
reads when it is drawn and writes back afterward. A filter chosen in one
menu is on in the others, and their rows are listed by it. The mouse
wheel over a closed family field steps through the families those
shared filters list. The search, highlight and expanded families stay
with each menu. The filters last for the session, as before.
Docs: docs/type-parity.md, docs/target-app-parity.md.
The Layers panel's trash button, rows dropped on it, the panel menu's
Delete Selection, and Delete or Backspace on highlighted rows now run
ui.layerDelete. When a layer or sublayer among the rows holds art
(hidden, locked and nested objects count; guides do not), a confirm
dialog asks first. OK deletes the rows it asked about, by id, in the
document it was asked in, as one undo step; Cancel keeps them. Empty
layers, guide-only layers and object or group rows alone are deleted at
once. layer.delete itself is unchanged and never asks.
The dialog sized its scrolling content from the window's own available
height and an assumed footer height, so it opened short and only grew as
input events drew more frames. It now sizes the content the way
Paragraph Style Options does: from the screen's height less the rest of
the window as drawn last frame, capped at 420 points, with the scroll
area taking that height at once when the section is longer.
The stored content height is the height the scroll area shows after a
short section shrinks it, so going back from a short section to General
keeps OK and Cancel on a small screen.
A 9-slice guide can now be placed outside the symbol's art, by dragging
it past the art's edge in symbol editing mode, by symbol.options
nineSliceGuides, or by a Symbol Options field below 0% or above 100%.
A scaled instance then scales by the cells its art falls in.
- Each guide is a fraction from its edge in -16..16, and the two guides
of an axis keep their order (left + right < 1, top + bottom < 1).
- A guide past an edge cuts the art at that edge, so that side's outer
cell holds no art. With both guides of an axis past opposite edges,
the art scales as a whole along it. With both past the same edge, the
art keeps its size in the outer cell at the other edge.
- Symbol Options shows the guides with three decimals, and OK keeps a
field that was not changed at its exact value.
- Native files keep the guides exactly. SVG and .ai write such an
instance as its placed art, without guides.
Docs: docs/mcp.md, docs/target-app-parity.md, docs/gaps.md.
Catalog rows now read `{{` and `}}` as a literal `{` and `}`, in the
English source and in the translation, as in a Rust format string. A `{`
with no `}` after it is literal text instead of dropping the row.
- The plugin.run errors for an importer, an exporter and a live effect
(`document.open {"importer": ...}` and the like) now show translated
with the plug-in's id and JSON kept, in the 22 catalogs that list them.
Their rows were keyed as `{{"importer"}"}}`, which never matched.
- The test that keys a format string keeps `{{`/`}}` and numbers only real
placeholders, so its expected keys match the runtime text. Two junk
rows it produced for the RTF error (hi, sv) are removed.
With Background Save on, Package's OK started the save of a dirty
document on the worker and then wrote the package whether or not that
save succeeded. With both preferences off, a failed save already stopped
the package, so the result depended on the preferences.
The package now starts only after the save is written, with both
preferences in every combination. With Background Export on, it is still
collected from the document as it was at OK and starts once the save's
result arrives; when the save fails, or asks a question first, no package
is written and the save's error stays in the status bar. With Background
Export off, the dialog shows the save's error.
background::after runs a step on the UI thread once a job's result is
applied.
The refusals of Extrude & Bevel, Revolve, Inflate, Rotate and their
Classic forms (art a 3D effect can't build a solid from, invalid
light, shadow, graphics and surface settings, and Expand as Wireframes
notes) now have an @msg row in every complete-message catalog, as do
the effect names and object kinds the messages name, so the status bar
shows them in the interface language. Parameter keys, numbers and
names keep their English form; command replies stay English.
A value a message quotes in "...", curly quotes or backticks, such as a
symbol's name, is shown as written instead of being looked up as a
message of its own.
A parameter schema's error ("`zoom` must be a number > 0, not -1") was
translated around its requirement, which stayed in English in every
language: only "a number", "a string" and "true or false" had rows.
- Every complete catalog gets a row for each requirement a schema
writes: a number with each kind of range and with a unit, an integer
and its range, a list of names, an object id, a list of object ids,
a color, a point, an object and a list. The bounds, unit and names
stay as the English gives them.
- An enum error no longer matches the `{key}` must be one of {_1} row,
which took `"a", "b", not "c"` as its list and left ", not ..." in
English: a `{path}` must be one of {_1}, not {got} row translates it,
in the complete catalogs and in Bulgarian, Bosnian, Danish,
Indonesian and Dutch.
- A part of a message that starts with `{` or `[` is translated only
when it is an exact message, so "[x, y] (two numbers)" translates and
JSON values, shown cut short or whole, stay as they are.
Docs: docs/mcp.md (Parameter schemas), docs/target-app-parity.md.
File > Open and File > Place read QuickDraw pictures, versions 1 and 2,
from .pct, .pic and .pict files, with or without the file's 512 bytes
of application data; a version 2 picture also opens by its content.
The reader plays the opcodes of Apple's Opcodes in Pictures table on
the metafile player: lines, rectangles, rounded rectangles, ovals,
arcs, polygons and regions become paths, text becomes point type in
the font the picture names, bitmaps, pixel maps and QuickTime JPEG
images become images, and the clip region clips what follows it.
Place puts the picture in one group clipped to its frame. What isn't
read comes back as warnings, and a picture cut short keeps what came
before it. PICT is not written.
Images whose transform flattens them no longer leave their pixel data
in the document. Formats whose signature starts the file are detected
before PICT, which is known by bytes 522 or 10.
Docs: docs/mcp.md, docs/file-format-parity.md, docs/target-app-parity.md.
Version 4 marks sets with Select Object steps, so a build that reads
version 4 but has no select.storedPath accepted a Select Path set and
failed at the step during playback. Sets with Select Path steps now
save as version 5, Load Actions reads versions 1 to 5, and docs/mcp.md
and the file header say so.