File > Place reads a Word 97-2003 document (a compound file named .doc,
or one that holds a WordDocument stream) and sets its main text as area
type, as it does for .rtf and .docx files. The text comes from the
piece table, in 16-bit Unicode or compressed 8-bit pieces. Formatting
is resolved from the style sheet's default font, the paragraph style,
the character style and the direct character and paragraph properties,
and keeps the same properties the .docx reader maps.
Table cells are separated by tabs and each row is a paragraph, and a
field places as its result. Hidden and deleted text, pictures, headers,
footers, notes, comments and text boxes are left out, and the reply's
warnings name each kind of content left out or changed once. Word 6.0
and Word 95 documents, encrypted documents and documents last saved
with fast save are refused, and so are structures that lie outside
their streams.
The compound file is read with the cfb crate (MIT), which adds one
package to Cargo.lock.
The stop drop now checks Escape the way the indent-marker drop does, so Escape in the release frame leaves the stops as they were after a plain drag, a Ctrl-drag (Command on macOS) of all the stops, or a drag off the ruler.
In the Tabs panel, a stop dragged on the ruler with Ctrl held (Command on
macOS) moves every stop by the same distance, set in one text.tabs.set and
one undo step. The stops keep their order, alignment, leaders and Align On,
and the ruler draws them at their new positions during the drag.
Ctrl is read when the drag starts, as the Left Indent marker reads it. A drag
that would take the leftmost stop below 0 leaves it at 0, and one that would
take the rightmost past 100,000 pt leaves it at 100,000 pt, keeping the
spacing of the others. A Ctrl-drag released off the ruler deletes only the
dragged stop, as a plain drag does. A plain drag still moves one stop.
The Brazilian Portuguese catalog was marked complete under the tests, but 174 strings that the
German, French, Italian and Spanish catalogs already translate still fell back to English: smart
object and smart-filter editors, print presets and Japanese paper names, dimension lines and text,
the gutter, workspace names, swatch names and canvas messages.
Rows follow the catalog's vocabulary (dimension = cota, swatch = amostra, artboard = Mesa de
Trabalho, gutter = medianiz, line weight = espessura da linha) and are appended after the existing
entries; placeholders, ellipses and colons are unchanged. The parity doc records the new count
(6,126) with the commit it was measured on, following the rule in "How it is measured".
An open blend shows a <Spine> row below its key objects, where Release
leaves the spine. A click selects the blend (Shift/Cmd toggles it), so
Direct Selection edits the spine on the canvas; a locked blend's row
selects nothing, and the row is left out while searching or filtering.
EPS export wrote every gradient with a spot color stop in process
colors. A gradient of tints of one spot color and paper white is now
written in that ink's Separation space, at Level 2 and 3. At Level 3, a
gradient that mixes a spot color with CMYK or gray colors, or two spot
colors, is written in a DeviceN space of the process inks its stops use
and the spot inks, each spot ink with the CMYK equivalent its Separation
space has. An off-center midpoint is a stop with the inks halfway
between its two stops. Paper white is an exact white, whether or not
the stop is linked to a process swatch.
These gradients are still written in process colors, each with its own
warning: a mix with other inks at Level 2; a mix with RGB or Lab colors
in an RGB export (a CMYK export converts those stops to CMYK first); a
DeviceN space that would need more than 32 colorants or a spot ink named
Cyan, Magenta, Yellow, Black, All or None; and a Perceptual gradient.
The old warning for every spot gradient has been removed.
The header lists two or more spot colors with each %%+ line right after
the comment it continues: %%DocumentCustomColors and %%CMYKCustomColor
were interleaved, so a DSC reader took the second ink's name as part of
the first ink's %%CMYKCustomColor.
Cmd/Ctrl held with the Pen lends the last-used selection tool (Direct
Selection until one is chosen), which already moved anchors, straight
segments and curves of the path being drawn, one undo step each, and
handed the path back to the Pen.
With the Selection tool used last, the lent tool hit-tested the
bounding box even though the canvas hides it while anchors are selected
on their own, as the end anchor of a path being drawn is. Over the
path it showed a resize pointer, and the drag scaled the path by a
handle nobody could see: a flat path did nothing at all.
The Selection tool's handles now take the pointer only while the box is
shown (View > Show Bounding Box, no anchors selected on their own), so
the lent Selection tool moves the path being drawn.
Tests: select::tests::hidden_box_handles_take_no_press_while_anchors_are_selected,
tests::draw2::pen_cmd_drag_edits_anchors_and_segments_and_goes_on_drawing.
On a Wayland session Linux Display Server's default, Automatic, opened
the window on native Wayland. winit 0.30 doesn't bind the Wayland tablet
protocol, and KWin (since Plasma 6.3) and Mutter turn no tablet input
into pointer input, so the pen moved only the compositor's cursor and
the app got no motion or presses. Only X11 (XWayland) When a Pen Is
Attached, which users had to find and choose, sent the window through
XWayland, where the pen works as a mouse with its pressure.
Automatic now opens the window through XWayland when a pen is attached
as the app starts, as PhotoCraft does by default.
VECTORCRAFT_NATIVE_WAYLAND=1 keeps the window on Wayland, like
PhotoCraft's PHOTOCRAFT_NATIVE_WAYLAND. The X11 choice is unchanged.
- A radial gradient from a spot swatch to a CMYK color is written as a
DeviceN shading (ShadingType 3) of Yellow and the spot ink.
- A Lab spot color used as a flat fill and in a mixed gradient is
written as one Separation space with the Lab alternate, which the
DeviceN space names under /Colorants.
- docs/roadmap.md lists the gradients that still export without the
spot ink: mixed spot/process gradients in SVG and PDF gradients with
RGB or Lab stops. docs/target-app-parity.md also notes that a
Perceptual gradient is written to PDF as an image.
A linear or radial gradient whose stops mix a spot color with process
colors, or two spot colors, was written in process colors with a
warning. It is now written as a DeviceN shading of the process inks
its stops use and its spot inks, so each spot ink separates onto its
own plate. An off-center midpoint becomes a stop with the inks halfway
between its two stops. A gradient that mixes a spot color with RGB or
Lab colors is still written without the spot ink, with a warning that
says so.
Filled rectangles are drawn on whole pixels, but the gradient chip is a
mesh, which was drawn at its exact position. At a fractional position or
display scale the Gradient button under the Fill/Stroke proxy sat up to
half a pixel off the Color and None buttons beside it. gradient_chip now
rounds its rect to pixels first, which also lines it up wherever else a
gradient chip sits next to a color chip.
A stored projection whose determinant is not finite is read back as the
same map divided by the largest magnitude in its w row, the scale the
overflow branch of conjugated already uses, so points that overflowed at
the stored scale draw: the identity with every entry 1e308 maps (2, 2)
to (2, 2). The overflow branch of inverse scales the map so that the
largest of the products its determinant sums is near 1, so a map with
large entries and a small w row, such as a scale by 1e305 with a move
by -3.9e307, is still inverted and read back.
The two overflow tests in persp_text.rs build their stored projections
with a w row of 1, so they still overflow after the read-back.
Homography::from_array accepted nine finite numbers only when det().abs()
was above 1e-15. With large entries the determinant can be inf - inf, so a
valid stored projection was rejected on reading and its type drew flat, or
it can overflow to inf, so a projection that cannot be inverted was
accepted.
When the determinant is not finite, inverse() now inverts a copy divided
by a power of two (largest entry between 0.5 and 1), and treats that copy
as not invertible when its determinant is at most 1e-15 times the largest
of the six products it sums. from_array and the overflow path of
conjugated accept such a map only when that inverse exists. Maps with a
finite determinant are judged as before.
Follows #4912.
The backdrop behind a modal dialog took clicks with Sense::click(), which
egui makes focusable, so Tab stopped on it. It now senses clicks without
taking the keyboard focus.
The Tab tests now check that Tab reaches a known control in each region
instead of only that some widget took the focus: the title bar's three
caption buttons, a control inside each dialog, a Tools panel button and a
floating strip's Put back in the toolbar button, and the isolation bar's
back button. The dialog test also checks that Tab skips the backdrop.
The reply's index came from the last object the effect was added to, while
its item came from the first selected object (or the first target for an
explicit item). When those objects held different numbers of effects on the
row, the reply named no effect of that object. The index is now read from
that object's effect list.
Each action set now has an id of its own, assigned when the set is made
(Default Actions, New Set, Begin Recording on an empty panel) and when it
is loaded from the saved preferences. The id is not saved.
The question Delete Selection asks about sets holds their ids, and
ui.actionSet.delete takes ids in place of all: OK deletes the asked sets
wherever they are now, and deletes nothing when one of them no longer
exists. Before, the question matched sets by the list of names, so with
two sets of the same name, or a new set made under the asked one's name
while the question was open, OK could delete a set it did not ask about.
ui.actionSet.delete runs while a dialog is open, from the control channel or MCP. An open
Set Options or Batch dialog for a deleted set now closes, and one for a later set has its set
index lowered so that OK renames or batches the same set.
The Delete Selection question now carries the names of all sets as they
were when it asked (`all`). `ui.actionSet.delete` deletes nothing unless
the panel's sets still have exactly those names in that order, so a set
with a repeated name that moves into the asked index is not deleted.
Shift-click on a set's name selects the sets from the current one to it
also while an action in the current set is selected.
The question Delete Selection asks now passes the names of the sets it
names along with their indexes. ui.actionSet.delete deletes nothing and
returns an error when the set at an index no longer has that name, so a
set deleted or added above them while the question is open does not
make OK delete a different set. An index above the platform's usize
range is refused as "no such action set" instead of wrapping on 32-bit
builds.
Delete Selection in the Actions panel (the bottom bar's trash and the
panel menu's new Delete) now deletes the selected action set with its
actions and keeps the other sets, after asking. A selected action is
still deleted at once. Shift-click on a set's name selects the sets from
the current one to it, and one question deletes them together. Default
Actions and the last set can be deleted; New Set still works on the
empty panel.
ui.actionSet.delete {sets?: [index]} does the deletion: an index past
the last set is an error before anything is deleted, a recording into a
deleted set stops, and a recording into a later set stays in its set.
Undo does not restore a deleted set.
Recolor Artwork opened with Preserve White and Black on and Grays off
every time, so clearing them had to be repeated on each use. OK on art
now keeps the three checkboxes in the UI state (recolor_preserve, saved
with the other remembered dialog fields), and the dialog opens with
them. Cancel leaves them as the last OK set them.
tool.setOption kept any finite rotate, while the Objects on Path Tool
Options dialog shows Rotate clamped to -360 to 360 and saves the value
it was given, so a rotate of 450 showed as 360 and the next attach used
450. The tool now clamps rotate to -360 to 360, and attach clamps the
saved rotate it falls back to the same way.
Double-clicking the Objects on Path tool opens Objects on Path Tool
Options: a nine-point Pivot grid, a Rotate field, Reset (the center and
0) and Save. Save sets the tool's options, which last across tool
switches and are saved with the preferences. The tool sends them with
each attach, and object.objectsOnPath.attach without pivot or rotate
uses them, so they apply to the objects attached next; groups attached
before keep theirs.
addon.pathtools.divideDashes cuts the selected paths (or only their
direct-selected segments) into separate open paths of a dash length
measured along the curve, with an optional gap (gap pieces dropped
unless removeGaps is false) and Fit to Corners and Ends; pieces keep
the path's appearance, one undo step, at most 100000 pieces. Geometry
in vectorcraft-pathops; dialog with unit fields and Preview; tests,
sweep cases, catalog rows and docs.
addon.arrange.groupOverlapping groups the selected top-level objects
whose visual bounds overlap or touch, chains included (union-find over a
sweep along x, at most 20000 objects), only within one layer or group.
Each group takes its frontmost member's stacking place; one undo step,
all groups made in one pass over the tree. Menu item, tests, sweep case,
catalog rows and docs.
Create Gradient Mesh and a Mesh tool click estimated each border edge's
handles from the surface's derivatives, so the mesh's border cut across a
curved outline: a 1x1 mesh over a 400 x 300 pt ellipse came out up to
7 pt off it, with corners at its four mesh points. Each border edge now
takes the handles of the cubic that best fits the outline between its
points, and handles where two border edges meet along a side stay
collinear.
Deleting a mesh line (Alt-click with the Mesh tool) joined the two edges
on either side with a straight line, which turned the ellipse's border
into a diamond. The joined edge now keeps the outer handles, grown back
to the length they had before the line split the edge.
While Caps Lock is on, the tools whose pointer General > Use Precise
Cursors changes show the crosshair, and the saved preference does not
change. The desktop app reads the lock state on macOS, Windows and
Linux X11 and passes each change to the new view.capsLock command. A
change to view.capsLock or usePreciseCursors through app.run refreshes
the canvas pointer. The view.preciseCursors command is labeled Use
Precise Cursors, so command search finds it by the preference's name.
Character panel > Language sets the selected characters' language;
text.setFormat and text.setRangeStyle take `language` by name or tag
(unknown: an error), and character styles carry it. Document Setup's
language list gains Hindi, Marathi, Gujarati, Bengali, Punjabi, Tamil,
Telugu, Kannada, Malayalam, Odia and Urdu, with catalog rows; the
Digits menu's numeral names move to a digits context, as Hindi is now
also a language name.
Characters get a language (CharStyle::language, a BCP 47 tag of one of
Document Setup's languages; none for the default, English: USA, saved
only when set). The shaper sets it on the HarfRust buffer, so fonts use
their language forms (OpenType locl): Turkish keeps fi apart and the dot
on its i. Runs in different languages are shaped apart. New type takes
the document's language.