Commit Graph
3872 Commits
Author SHA1 Message Date
BFlat 8bf4de0a5a Merge pull request #6919 from dotCooCoo/feat/bbox-follows-move-and-draw
Selection: Show Bounding Box While Moving and Drawing shows the box during moves and shape drawing
2026-11-13 00:49:17 +07:00
dotCooCoo 556123e691 3D and Materials: Expand as Wireframes keeps a layer's path guides and cuts Revolve's art for Revolve
A layer expanded to its edges keeps the paths made into guides inside it, as it keeps its ruler
guides. A clipping group with Revolve and Rotate is cut for Revolve, the effect the canvas draws,
so its fills go in one piece and art with more fills than a 3D effect takes still expands.
2026-11-12 09:47:53 -08:00
bflatastic cfce336215 Dashes fitted to corners take a subpath with no segments
An HP-GL wedge of almost no radius drawn with an adaptive line type
(LT-1;EW0.000001,0,0;) leaves a lone moveto. Fitting the dashes to its
corners indexed the empty segment list and panicked while rendering. Such
a subpath now uses the exact plan, which has no runs to fit.

Found by import_fuzz::random_hpgl_instructions_never_panic.
2026-11-13 00:47:30 +07:00
dotCooCoo 369de5bc4c Merge main into fix/read-roots-error-messages 2026-11-12 09:45:21 -08:00
dotCooCoo 4b9a611189 artboard.new: keep sides below 1 pt as given
artboard.new no longer raises a width or height below 1 pt to 1 pt, and artboard.setProps raises only a supplied side, so an edit to a small artboard's name or lock keeps its size.
2026-11-12 09:39:51 -08:00
dotCooCoo 60fd410906 Merge main into fix/type-size-range-error 2026-11-12 09:30:29 -08:00
dotCooCoo 7dd161cc49 Place: DCS files link with their spot plates as spot swatches and separate on their own inks
File › Place with Link reads a DCS 1.0 or 2.0 file (an EPS file whose
header names one EPS program per printing plate) as one linked image of
its plates. Each spot plate adds a spot swatch in the CMYK values the
file gives, and the clipping path the file's composite is drawn through
clips the image. document.open, file.place without link or from bytes,
and links.embed refuse a DCS file and change nothing.

- The screen, composite print and exports show the plates mixed into
  CMYK. Separations Preview and print separations show each plate on
  its own ink; a spot plate prints as its CMYK values when spots print
  as process.
- links.list answers the format DCS, and with dcsTransparency marks the
  DCS images that are transparent or overlap transparent objects (the
  Links panel menu's Show DCS Transparency Interactions).
- swatch.unused leaves out a spot swatch while a DCS image has a plate
  of its ink.
- links.update and links.relink read the plates and the clipping path
  again, and the link shows as modified when one of its plate files
  changes or is gone.
- The plates go on the first plate's pixel grid, grown to hold every
  plate where it prints; a plate of another size or position is
  resampled onto it.
- A file may name 64 plates, a plate file may be 1 GB, and the plates
  together may hold 512 MB of ink amounts. A file naming more plates is
  an error.

Docs: docs/mcp.md, docs/target-app-parity.md, docs/file-format-parity.md.
2026-11-12 09:30:20 -08:00
dotCooCoo 22a19db2cd Merge main into feat/new-document-profiles 2026-11-12 09:29:46 -08:00
dotCooCoo 075fff4c6d Merge main into fix/library-ids-and-save-replies 2026-11-12 09:29:20 -08:00
dotCooCoo fe34c2b818 Merge main into feat/custom-arrowheads 2026-11-12 09:23:20 -08:00
dotCooCoo 87d1f0b3d7 Merge main into fix/transform-effect-scales-raster-effects 2026-11-12 09:23:19 -08:00
dotCooCoo 2d66758ce4 MCP: document.json checks brush art and relative link paths against the read roots
Under --automation-read-root, document.json names a linked image or
placed file in a stored brush's art outside the read roots by its file
name alone, as it does in the layers. A stored brush entry that does not
read as a brush is left out of the reply, and a stored brush library
that is not a list becomes an empty one. A link whose file is inside the
read roots loses its stored relative path when that path leads outside
them, from the folder of the file the document was read from or from the
document's own folder.
2026-11-12 09:19:15 -08:00
dotCooCoo f42b46e5eb Merge main into fix/recovery-held-crashed-areas 2026-11-12 09:00:02 -08:00
dotCooCoo 8d27e53115 Merge main into feat/image-color-mask 2026-11-12 08:56:33 -08:00
dotCooCoo 5a7d445807 Merge main into fix/script-failed-run-keeps-no-place 2026-11-12 08:55:15 -08:00
BFlat 2304b38f19 Merge pull request #6907 from dotCooCoo/feat/art-brush-width-pen-pose
Brushes: Art Brush Options' Width can follow the pen's tilt, bearing and rotation
2026-11-12 23:54:29 +07:00
BFlat dc68ae950c Merge pull request #6912 from dotCooCoo/fix/new-document-side-limit
New Document: file.new and artboard.new take the same largest artboard side
2026-11-12 23:54:11 +07:00
BFlat 6a695a01ec Merge pull request #6847 from dotCooCoo/feat/weed-box-and-lines
Cutting Tools: Weed Box and Lines adds a weed box and weeding lines around art
2026-11-12 23:54:01 +07:00
BFlat a6aac579c0 Merge pull request #6904 from dotCooCoo/feat/ai-editing-data-s6c
.ai save: the editing copy keeps brushes and brushed paths
2026-11-12 23:53:38 +07:00
BFlat e618783377 Merge pull request #6084 from Taha-Mahmoodi/feat/glyph-alternates
Glyphs: alternates keep the word joined (feature values, one-piece shaping, unencoded glyphs)
2026-11-12 23:53:13 +07:00
dotCooCoo 9df4a83f07 Merge main into feat/blend-canvas-easing-handles 2026-11-12 08:46:06 -08:00
dotCooCoo fc1a08edbd Merge main into feat/brushes-ink-wash-library 2026-11-12 08:46:00 -08:00
dotCooCoo 5006ba5a2e Merge main into feat/eps-save-use-artboards 2026-11-12 08:45:42 -08:00
dotCooCoo 766e291e3c Save and Export: notes of what the file loses come before notes on options
Each writer marks its notes as a loss (something of the document that the
file leaves out or that reaches it changed) or as a note on the options
(an option it didn't apply or applied another way while the art reaches
the file as it looks, or something an option turns off). The PDF, SVG,
EPS, legacy .ai, DXF and HP-GL writers return their notes on the options
in a list of their own (`setting_notes`) beside `warnings`, and the
engine's `Encoded` does the same.

The replies of the save and export commands, and of
`clipboard.exportPdf` and `clipboard.exportPng`, list the losses first,
each kind in the order the writers gave them, across every file that
Export for Screens writes. The status bar names the first note, so an
export to lossy WebP of type in a font that isn't installed now names the
fallback-font note instead of the lossy WebP note. A print to a file
keeps the order its notes are given in.
2026-11-12 08:33:57 -08:00
dotCooCoo ff6dac4a5d Shaper: a click on an original shape's outline enters Construction mode
With a Shaper Group or one of its faces selected, a Shaper click within
3 screen pixels of one of the group's original shapes' outlines enters
Construction mode with that shape selected, also where the outline runs
through a merged face. shaper.select takes a tolerance in points
(default 3, at most 1000); hidden and locked shapes are skipped, and a
Shaper Group above the selected one still takes the click.
2026-11-12 08:33:29 -08:00
dotCooCoo a17acb852f Selection: Show Bounding Box While Moving and Drawing shows the box during moves and shape drawing
The new General preference Show Bounding Box While Moving and Drawing
(`boundingBoxWhileMovingAndDrawing`, off by default) keeps the bounding
box and its handles visible during two kinds of drag, with View › Show
Bounding Box on. While a drag moves the selection (a Selection tool
move, an Alt-drag copy, or a shape tool's move by the center point),
the box is drawn where the drag has moved the selection. The box is
measured once when the drag starts and offset by each step's move.
While the Rectangle, Rounded Rectangle, Ellipse, Polygon and Star tools
draw a shape, the box is drawn around the shape. A rotation and a
widget drag still hide the box until the release. The Line Segment
tool, the Pen, the Pencil and the Paintbrush draw no box.

With the preference off, the box hides during a move (#737, for #712)
and while a shape is drawn (#5839), as before. A Selection tool move
with Real-time Drawing off still moves the box with the pointer, and a
shape tool's move by the center point hides it in both modes.

With Real-time Drawing off, the box of a shape being drawn is measured
from the pending preview, in the color of the layer the shape goes on.
A shape being drawn shows no box until a preview step has succeeded,
so a failed preview does not show the box of the selection from before
the drag. The preference's label has a row in every catalog.

Session::deferred_move() is replaced by Session::move_drag_box(), which
returns the moved box, and Session::deferred_transform_box() now also
returns the layer color of the box.

Docs: docs/mcp.md, docs/target-app-parity.md.
2026-11-12 08:28:21 -08:00
BFlat 932830283d Merge pull request #6841 from dotCooCoo/feat/docinfo-spot-color-objects
Document Info: Spot Color Objects lists the objects that use spot colors
2026-11-12 23:10:59 +07:00
BFlat b85f546ace Merge pull request #6893 from dotCooCoo/test/command-sweep-path-keys
Plug-ins: `diffPath` is a file key and Slice Options' `url` is not; the command sweep uses these keys
2026-11-12 23:10:48 +07:00
BFlat cc6509827d Merge pull request #6878 from dotCooCoo/fix/opacity-mask-follows-reshape
Opacity masks: linked masks follow group effects, the Free Transform distort and envelopes
2026-11-12 23:10:24 +07:00
BFlat 3df161a972 Merge pull request #6903 from dotCooCoo/feat/gradient-repeat
Gradients: repeat or reflect a gradient's stops a set number of times
2026-11-12 23:10:02 +07:00
BFlat 4920df33c0 Merge pull request #6885 from dotCooCoo/fix/screens-preset-folder-background
Export for Screens: an export into a preset's folder runs in the background
2026-11-12 23:09:16 +07:00
BFlat a38903aa72 Merge pull request #6900 from dotCooCoo/feat/global-edit-highlight-similar
Global Edit: selecting one object highlights the similar objects before the start
2026-11-12 23:08:32 +07:00
dotCooCoo e54519d6bd Merge main into feat/image-color-mask 2026-11-12 07:51:12 -08:00
dotCooCoo d3b18465f9 New Document: file.new and artboard.new take the same largest artboard side
file.new refused a side over 163,830 pt, while artboard.new took larger
artboards. Both now take each side more than 0 and at most 3,999,856 pt:
the 4,000,000 pt the canvas reaches from the origin, less a 72 pt bleed
on both sides. A side outside that range is refused with an error that
names the limit in points and, when the document's units are not points,
in those units, rounded down so the value shown is accepted.

artboard.new now refuses a supplied width or height of 0 or less instead
of making a 1 pt side, and refuses a size taken from a larger artboard.
Saved and Recent presets are read with sides up to the new limit.

Follows #6643.
2026-11-12 07:45:32 -08:00
dotCooCoo fc8d4472e6 Color management: assigning the working profiles keeps the active color settings
edit.assignProfile replaced the active color context whenever it tagged a
document, even when the profiles it assigned were the working spaces
already in use. The new context has the same settings, but renderers key
their cached effect images on it, so every open document was redrawn and
every cached blur, shadow or glow image was drawn again.

The command now sets the active settings, and raises the open documents'
revisions so they redraw, only when the working spaces it assigns differ
from the active ones, as edit.colorSettings already does.

This also fixes an intermittent failure of the test
canvas::tests::a_drag_over_a_wide_blur_draws_the_blur_from_the_still_frame.
The Document Setup tests assign the working profiles while it runs, and
its drag frames then drew the blur again instead of reusing the still
frame's image.
2026-11-12 07:34:57 -08:00
dotCooCoo 55a80ca480 3D and Materials: Expand as Wireframes looks up swatches for plug-ins after a fill's 3D effect
A live-effect plug-in after a fill's or stroke's 3D effect (Extrude & Bevel,
Inflate, Rotate or Revolve) that links its pieces to a swatch or pattern was
run without the document, so its result was refused and the edges kept the
shape before it. The document now goes to those effects, as it does for the
effects after an object's 3D effect.
2026-11-12 07:31:39 -08:00
dotCooCoo 04fd1b127b Brushes: Art Brush Options' Width can follow the pen's tilt, bearing and rotation
The Width menu now offers Tilt, Bearing and Rotation beside Fixed and
Pressure, each with the second width. Tilt goes from Width with the pen
lying flat to the second width upright; Bearing and Rotation go from
Width at -180 degrees to the second width at 180 degrees, as Scatter
Brush Options' modes do. A stroke drawn without that input is half way
between the two widths. brush.options takes width_mode tilt, bearing
or rotation.
2026-11-12 07:28:26 -08:00
dotCooCoo 2e968acc47 Align: the Align panel aligns and distributes the selected artboards
With the Artboard tool chosen, the Align panel's Align Objects,
Distribute Objects and Distribute Spacing buttons, their UI commands and
the Control bar's Align and Distribute buttons act on the artboards the
tool has selected, as the public page describes:
https://helpx.adobe.com/illustrator/desktop/create-manage-artboards/organize-manage-artboards/align-and-distribute-artboards.html

- artboard.align, artboard.distribute and artboard.distributeSpacing
  move whole artboards with their guides, and with the art inside them
  when Move Artwork with Artboard is on, in one undo step. No undo step
  is recorded when no artboard moves.
- Align To offers Align to Selection and Align to Artboard. Align to
  Artboard keeps the active artboard in place, and the Distribute
  buttons then send the Distribute Spacing value. A locked artboard
  stays where it is. These rules are VectorCraft's own.
- The Control bar shows the Align buttons, the Align To menu and the
  Distribute buttons after the artboard controls while it has room.

Docs: docs/mcp.md, docs/ui-parity.md.
2026-11-12 07:28:16 -08:00
dotCooCoo 63a36fec51 Image Tools: geometry effects keep a color mask
An image with a geometry effect (Transform, for example) is drawn from a
copy of the image, and that copy now keeps the image's color mask. The
canvas and outputs show the masked pixels, and Expand Appearance keeps
the mask on the image it makes.

Test: a_transform_effect_keeps_the_mask.
2026-11-12 07:26:48 -08:00
Taha-Mahmoodi 2d62c35d69 Merge remote-tracking branch 'origin/main' into feat/glyph-alternates
# Conflicts:
#	docs/gaps.md
#	docs/roadmap.md
#	docs/target-app-parity.md
2026-11-12 19:55:05 +04:30
dotCooCoo fd81eae9b5 Type: text.create and the type style commands refuse a size outside 0.1 to 1296 pt
text.create clamped a size above 1296 pt to 1296 without an error, so a
request for 2835 pt type returned 1296 pt type. text.createInPath,
text.setStyle and text.setRangeStyle clamped the same way. Each now
refuses a size outside 0.1 to 1296 pt with "`size` must be from 0.1 to
1296" and changes nothing. Both ends of the range are still taken.

Follows #6643.
2026-11-12 07:20:37 -08:00
dotCooCoo fa0a0753bb Merge main into feat/weed-box-and-lines 2026-11-12 07:20:06 -08:00
dotCooCoo d4bbce8982 MCP: hidden library names follow the platform's path rules
- Outside Windows a `\` stays part of a hidden library's or sent path's
  file name; another platform's absolute path is still split on `\`.
- A hidden relative path is matched after leading `./` and `../` parts
  only when they start the path, so `/work/./data/icon.svg` keeps its
  text.
- `ui.inspect` and `ui.docking` replies are hidden once, so a library
  at the top of the file system shows as `loaded/<file name>` with its
  separator.
2026-11-12 07:17:47 -08:00
dotCooCoo 97b77fe4fd MCP: another platform's absolute path is outside the read roots everywhere
Outside Windows, a path that starts with a drive (`C:`) or a `\` is read
as a name in the working folder, so with the working folder inside a
read root it passed the read check. ui.inspect then kept it in recorded
action steps and replies did not hide it when a request sent it. The
check now counts such a path as outside the read roots wherever the
control channel and the library commands check a path.
2026-11-12 07:17:46 -08:00
dotCooCoo d1f7888ad4 MCP: a hidden library keeps the id it was first shown under
A library loaded from outside a confined client's read roots keeps its
`loaded/<file name>` id for the session, in ui.inspect, ui.docking and
the library commands, so an id taken from an earlier reply still finds
the same library after another library with the same file name is
loaded. swatch.library.copyToUser leaves out `path` when the file is
outside the read roots, as the saves do.

The ids come from the engine's concealed_library_ids, which now reads a
path written with either separator, counts another platform's absolute
path as outside the roots, and keeps each id in the session.
2026-11-12 07:17:46 -08:00
dotCooCoo d1e766173e MCP: a library saved with another platform's absolute path is hidden under a read root
Outside Windows, a library path that starts with a drive or a backslash counts as outside the read roots, since the file access check would read it as a name in the working folder.
2026-11-12 07:17:46 -08:00
dotCooCoo a2c08dec27 MCP: replies hide a library path outside the read roots wherever it appears
Under the read roots, every control reply now shows a hidden library's
id as loaded/<file name> and its path as the file name in every string
and key: status text, dialogs, the command palette query, a script's
report, recorded steps and errors. The id and path are replaced at any
boundary, so a path between spaces, brackets or quotes, followed by a
period or by more path text (<path>.bak), or quoted with escaped
backslashes is hidden too. An occurrence that continues into a longer
path stays only when the request may read that longer path, so a
readable library's id that begins with a hidden one keeps its text.
The libraries hidden after the request ran are hidden, and for a
request that names one, those hidden before it too. A reply with no
path separator in it is not searched. Encoded file data (dataBase64,
pngBase64) is sent unchanged.

Recorded steps in ui.inspect leave out a path outside the read roots
under path, paths, file, files, folder and any param whose name ends in
Path, Paths, File, Files or Folder (diffPath, fontFiles,
destinationFolder), and an absolute path or file: URL outside the roots
under any other param or in any list. The file: scheme is matched in
any case, a URL's %XX escapes are decoded before the check, a file: URL
inside the roots stays, and a file: URL that
names another host is always left out. file_access::is_path_key holds the list of
path params, and testkit's is_path_key uses it.
2026-11-12 07:17:45 -08:00
dotCooCoo d2e21a38bf Actions: recording, step exclusions and set edits keep sets that Load Actions reads
Load Actions refuses an action set file over 8 MiB, with more than 1,000
actions, or with an action of more than 10,000 steps. Several ways of
changing a set could pass those limits, leaving a set that Save Actions
refuses to write.

- While an action records, a command (a batch and Find Objects that
  selects included) whose step would give the action more than 10,000
  steps or its set's file more than 8 MiB does not run, and the recording
  goes on. A stop that playback reaches is left out then. A command whose
  step grows past a limit only as it runs keeps its edit; the status bar
  names the limit and Stop leaves the step out. Stop also leaves out any
  recorded step still past a limit. Steps recorded after an exclusion
  past an action's last step are included.
- An exclusion that would make the set's file larger than 8 MiB changes
  no checkmark; one that keeps the size or shrinks it always works.
- Begin Recording, New Action, Duplicate, renaming an action, Action
  Options, Set Options and New Set refuse a change that would give a set
  more than 1,000 actions or a file larger than 8 MiB. A change that
  leaves a set no further past a limit than it is now is allowed.
- Load Actions refuses a set, .aia sets included, that Save Actions would
  write larger than 8 MiB (a file with less white space, or a set name
  that gets a number added).

The limits are the existing ones from files.rs, and the errors reuse the
existing messages. docs/mcp.md and the commands' params text describe the
new errors.
2026-11-12 07:09:36 -08:00
dotCooCoo 2911958414 Image Tools: live color adjustments and envelope warps keep a color mask
- A live color adjustment recolors a masked image's masked pixels, on the
  canvas and in outputs that apply the adjustment, so the colors the mask
  hides stay hidden. Before, the adjustment recolored the image's own
  pixels and the hidden colors showed again.
- An envelope warp gives each piece of a masked image the image's color
  mask, so the warped image shows its masked pixels.

Tests: a_live_color_adjustment_keeps_the_hidden_colors_hidden and
an_envelope_warp_draws_the_masked_pixels.
2026-11-12 07:09:30 -08:00
Taha-Mahmoodi 7c6f51e8d6 Merge remote-tracking branch 'origin/main' into feat/glyph-alternates 2026-11-12 19:37:53 +04:30