The reference app's help says Smart Guides cannot be used while Snap to
Grid or Pixel Preview is on, even with the menu command selected. The
Selection tool's move already leaves Smart Guides out under Snap to
Grid, but the canvas still drew the Object Highlighting outline under
the pointer with either view on.
The hover outline now draws only with Smart Guides and Object
Highlighting on and with Snap to Grid and Pixel Preview off.
A drop shadow draws its object moved by the shadow's offset, Effect ›
Rasterize draws it on the pixels of its image, and a pattern draws its
tile on the pixels of the tile's image and, in pattern editing mode,
draws copies of the tile moved by the tile's size. Four tests draw type
through each of these: a shadow whose offset (3.4, 45.3 pt) is not a
whole number of pixels, a Rasterize at 36 ppi whose image lies on the
canvas's pixel grid, a pattern swatch that shows copies of the tile
80.25 pixels away, and the copies pattern editing mode draws around the
tile. In each, None, Crisp and Strong type give every pixel the share
edge_coverage defines from the pixel Sharp type gets there.
The new each_method_takes_the_share helper holds that check.
A placed document draws its art in its own coordinates, and a layer
that multiplies and holds art that blends is drawn offscreen over a
copy of the art below it. Two tests check that type in either is drawn
on the pixels of the page or the export: None, Crisp and Strong type
in a placed document, and None type in such a layer. In a placed
document shown at half and at twice its size, each method gives every
pixel on the canvas the share edge_coverage defines, and None type has
hard edges in a supersampled export. In such a layer, None type has
hard edges in a supersampled export wherever the layer's pixels start.
The share check of each_method_draws_the_share_of_each_pixel_it_defines
moves into the off_the_share helper, which the placed-document test
uses too.
Over a folder, action.batch named each source file's output after the
file without its extension. Two files with the same name, such as a.svg
and sub/a.svg with includeSubdirs, got the same Export for Screens
folder, Override Save path and Folder destination file. The second
file's output replaced the first's, and the batch reported no failure.
Batch now adds -2, -3... to the name of each later file whose name was
already used, compared without case, as it does for data set names. The
numbers follow the order the batch processes the files. With the Folder
destination, a.svg and a.ai in one folder now give a.svg and a-2.ai.
Docs: docs/mcp.md, docs/target-app-parity.md.
Reset Panel ended its undo step with end_undo_group, which closes the
open undo group of every document. An undo group open in another
document, such as an MCP batch, was closed by a reset in this one, and
inside an undo group already open in this document the reset closed
that group too.
Reset Panel now opens its own group only when the active document has
none open, and closes only that group. Inside an open undo group the
reset is part of that group's step.
The decoder's pixel buffers are capped by the image's size and the
raster allowance. When they need more, File › Open and Place now say
the image is too large to draw, as they do when its size alone is
over the allowance, instead of saying the file can't be read. Damaged
and cut-short files keep their messages.
Match the public shortcut reference: Alt while dragging converts horizontal and vertical, with snapping on the new axis; guide.move accepts vertical on the index form.
Co-authored-by: Cursor <cursoragent@cursor.com>
`Renderer::draw_type_edges` let its offscreen drawing grow to
`u16::MAX` pixels a side, the size at which vello_cpu panics. In a
frame drawn coarser than the output, a thin strip of type could take
more than 32,768 output pixels a side while staying within the pixel
budget.
The offscreen drawing now uses the frame's own pixels when the
output's would be more than `MAX_RASTER_SIDE` a side, and type whose
offscreen drawing would still be larger than that is drawn as Sharp,
as `fx.rs` limits its offscreen rasters to `MAX_RASTER_SIDE`.
The doc comments of `TypeEdgeEntry` and `Renderer::draw_type_edges`
said that a later frame draws the kept pixels again, which reads as
drawing the type offscreen again. They now say that the renderer places
the kept pixels without drawing the type offscreen, and that it draws
the type offscreen again after a pan that brings more of it into view.
Crisp and Strong type was drawn offscreen twice in every frame, and
None type once, with no cache, so a pan or a drag drew the type
offscreen again.
The renderer now keeps those pixels per object and ink plane, within a
128 MiB budget. It places the kept pixels in a frame, without drawing
the type offscreen, while the object, the output's zoom and rotation,
the method, the edge smoothing and what the type reads are unchanged,
the output has moved by whole pixels, and the kept pixels hold every
pixel the frame needs. After a pan that brings more of the type into
view, the renderer draws the type offscreen again.
docs/file-format-parity.md counts 26 formats opened or placed, Targa
and JPEG XL among them. clipboard.importImage's params text names
Targa, which main reads by its header, beside JPEG XL. The Georgian
and Traditional Chinese catalogs, which now translate every status
and error message, get the three JPEG XL messages.
Targa files (#2765) and JPEG XL images both open and place.
OPEN_EXTS and PLACE_EXTS list both, and UNASSOCIATED_EXTS keeps main's
four Targa extensions and adds jxl. The open_file row and the Glass
textures paragraph in docs/mcp.md, and the Glass's Load Texture line
in docs/target-app-parity.md, name both formats.
PNG, PDF, EPS, legacy `.ai`, packaged zips and saved `.vectorcraft` files
record the wall-clock time they were made in, so the same commands run twice
gave different bytes although the pixels matched (#2880):
PDF /CreationDate and /ModDate D:20261018155816 vs D:20261018155817
PNG the `Creation Time` tEXt entry
.vectorcraft one byte of the stored date
SVG carries no time, and already repeated
`metadata::output_time` is the time a file records: `SOURCE_DATE_EPOCH` when it
holds a non-negative whole number of seconds, else the clock, as the
reproducible-builds specification defines it. A date a command is given
(`file.new {created}`, a save's `modified`) still wins over the variable, and a
blank, negative or non-numeric value is ignored so that an export is never
refused over the environment.
`metadata::now_unix` keeps the real clock and now has exactly two callers, both
of which must not be pinnable from the environment: the recovery heartbeat, and
the seed PDF encryption draws on.
A .ai saved without PDF compatibility has only a placeholder page in
its PDF part. document.open reads such a file from its editing data,
but with `pages` given it failed with "the file holds only a
placeholder page", even for "1" on a file of one page.
When `pages` names every page of the file, document.open now reads
the editing data as it does without `pages`.
Docs: docs/mcp.md.
#2784 made zh-hant a language that translates every status and error message while #2930 added the shared parameter-check errors to the others; main's shared_param_check_errors_are_translated failed on zh-hant.