An object with an opacity mask draws offscreen over the bounds the
renderer gives it. For a live object (a blend, envelope or repeat) those
bounds took in effects in symbol art and brush art inside it, but not a
path's own effects, so with Clip off the drop shadows of a blend's steps
were cut off at the steps' bounds and did not draw where the mask art
leaves them uncovered. The bounds now also take in how far each path's
own effects paint past it.
Effects apply in the order they are listed, so a Drop Shadow, glow, blur,
Feather or pixel filter listed before a Transform effect paints art that
the Transform effect then transforms. VectorCraft drew such an
effect at its own distances around the transformed art: a square scaled
to 200% kept a 10 pt shadow offset. Now the effect follows the Transform
effects after it, with Scale Strokes & Effects on or off: its sizes scale
by the mean scale, and a Drop Shadow's offset turns, reflects and scales
with the art. Effects listed after the Transform effect keep their values,
and Transform Objects off changes nothing.
- raster_effects reads each raster effect through the Transform effects
after it, so the canvas, export and the redraw region use the followed
values.
- Where the geometry effects are applied and removed (Expand Appearance,
baking for export, evaluated groups), the raster effects that remain
carry the same transformation, hidden ones included.
- A Transform effect that makes copies or moves at random leaves the
raster effects before it as they are. Rasterize and SVG filters keep
their options.
Docs: the Transform effect's params text, docs/target-app-parity.md.
The drag chose its place from the point of the path nearest the pointer, but counted each point as
farther by half its distance along the path from the last one. On an open path that turns back on
itself, the object then stayed at its place while the pointer was over another object's ring 10 pt
away. The drag now uses the point nearest the pointer. Where the path passes as near the pointer
more than once, as where it runs back over itself, the drag follows the part nearest along the path
to where it was.
Type in a font found by name with a predefined non-Unicode CMap, such as
`/Ryumin-Light-83pv-RKSJ-H findfont` or a `composefont` with `GBK-EUC-H`,
opened as Latin-1 letters (`ú{A` for 日本A) in a font whose style carried
the CMap name (`Light-83pv-RKSJ-H`). Only Unicode CMaps were split off the
font name, and `composefont` failed with `undefinedresource` for the others.
- The predefined CMap decoder used by legacy `.ai` type moves to
`import/predefined_cmap.rs`, and EPS import decodes these CMaps' codes
with it (Shift-JIS, EUC, GBK, Big Five, UHC and the other public CMaps).
- A font name splits at a predefined CMap unless an installed face has
the whole name. A CMap that can't be read gives a warning.
- Type over a vertical CMap (`-V`) is set as vertical type, and each code
moves the point one em down the column, the default `DW2`
displacement.
- Every show operator sets decoded type with the same spacing and shaping
as other fonts found by name.
- Decoding a string counts against the import's memory budget.
A grayscale or 1-bit image colorized with a spot color now counts as a
Spot Color Object. A gradient whose stops are all at an opacity of 0
draws nothing, so its spot stops no longer list the object.
- A custom arrowhead path allows at most 4,096 subpaths; stroke.set
refuses a longer one and reading drops it.
- A symbol whose shapes cannot be united or clipped is listed in
skipped instead of becoming a head that misses part of its art.
- The arrowheads file is refused when its document unpacks to more
than 64 MB.
- Edit Arrowheads creates the starter file only when none exists and
otherwise opens the file unchanged.
- After a save to the arrowheads file, the heads are read back from
the written file.
- The plug-in argument check accepts path under startArrow.Custom and
endArrow.Custom in stroke.set.
- A custom head's menu preview is scaled to fit its box, and rows
outside the visible part of the menu do not render previews.
In a full parallel `cargo test -p vectorcraft-ui-egui` run, other tests
add and remove composite fonts in the process-wide font database and
remove plug-ins from the plug-in registry. Two tests failed when that
happened between their reads, and passed when run alone.
- `font_menu::tests::the_scroll_bar_leaves_the_stars_clear` starred
`FontDb::global().families()`, but the menu lists the composite fonts
first, so the top rows had no star. The test now turns on the starred
filter and counts the rows it listed.
- `tests::nativemenu::the_menu_bar_is_inert_while_a_file_dialog_is_open`
required every menu row from before the dialog to be back afterwards.
A row may now be missing only when the composite font or plug-in it
names is gone from the database or the registry.
- Four font menu tests took the first families from
`menu_family_list()`, which can be a composite font that is removed
before the frames run. They take them from the families that stay
listed. The variable-filter test checks that every family listed
before the click is listed again, instead of comparing two frames.
An image's own fill or stroke with Outline Object now follows the outline of
the image's pixels that are at least 50% opaque, traced from the alpha and
fitted with curves, instead of the image's frame. An image without
transparency, one whose pixels can't be read, one of more than 64 megapixels
or whose decoded pixels take more than 256 MB, and one whose outline would
need more than 100,000 anchor points keep the frame. An image with no pixel
at least half opaque gives nothing to paint. Images of more than 4 megapixels
are traced from their alpha averaged down to 4 megapixels, and an averaged
pixel that covers a pixel at least half opaque stays at least half opaque, so
thin opaque lines stay in the outline. Each outline is traced once for its
pixels, kept for the next redraw while those pixels are loaded, and dropped
after them; a second thread that needs the same outline waits for the trace.
- vectorcraft-trace: `decode_alpha` reads an image's alpha, and
`opaque_outline` traces it as Black and White mode at threshold 128.
- vectorcraft-effects: the reshaped image art uses it for rows whose first
effect is Outline Object; Convert to Shape rows keep the frame.
- Docs: docs/mcp.md, the Outline Object params text and an evidence line in
docs/target-app-parity.md. docs/mcp.md also says that Use Preview Bounds
takes in the shapes an image's fills and strokes paint.
Opening or placing an image whose orientation turns it a quarter
(EXIF or TIFF Orientation 5 to 8) stored the pixels turned but kept
the resolution as stored, so a photo at 300 x 150 ppi came in at the
wrong width and height. XResolution counts pixels in the ImageWidth
direction of the stored image (TIFF 6.0,
https://www.itu.int/itudoc/itu-t/com16/tiff-fx/docs/tiff6.pdf; EXIF
uses the same tag, CIPA DC-008-2012,
https://www.cipa.jp/std/documents/e/DC-008-2012_E.pdf), so a quarter
turn now swaps the axes, in the size Open and Place use and in the
stored image, with jxlread::oriented_resolution as JPEG XL does.
Three kinds of TIFF did not follow their Orientation tag:
- grayscale TIFFs with extra samples and 1-bit CCITT Group 3 TIFFs
were not turned;
- a CMYK TIFF with its inks together was turned but stored as RGB,
losing its inks, and one with a plane per ink did not open
("Planar TIFF with CMYK color type is not supported").
They now turn as the other images do, and a CMYK TIFF keeps its inks,
8 bits each, written again with the turned resolution.
In the text document of a .ai's editing copy, a character's fill (key
53) or stroke (key 54) is a paint with a colour under key 0 and, under
key 5, the name of an art style of the editing data. For a pattern
swatch, key 0 is black and the pattern is only in that style: a style
of one paint (/SimpleStyle) that paints with `(name) ... [matrix] p`.
The reader took key 0 alone, so type painted with a pattern came in
black.
The art style reader now keeps the pattern of a style that is one
paint, and the import places it as a path's pattern fill would be (its
matrix in art space; the files' own pages tile such type with it), by
the style's name. A run whose fill or stroke is on and names such a
style takes the pattern, in the type's text space, so its tiles stay
where the document has them. A pattern the file doesn't define or can't
place, a key 5 that isn't a string, and a style of any other paint keep
the colour as before.
A style that also has filters gives no pattern for type, and a pattern that
can't be placed in the type's text space keeps the colour. A .ai saved
again writes such type as outlines with a warning, as it already does for
any type with pattern paint (#5965).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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.