Commit Graph
2077 Commits
Author SHA1 Message Date
dotCooCoo 64b1fa5ab2 Docs: describe help-page behavior in our own words
Remove copied sentences from workspace, Actions, symbol and export notes.
Keep source links, command identifiers, UI labels and behavior rules.
2026-11-04 11:45:13 +07:00
dotCooCoo 83d9ed1ee2 Docs: keep removed Type core evidence in the kept row
The duplicate Type core rows carried evidence the kept row did not: recent-font groups (#3515), Fractional Widths per type object, color emoji bitmap fonts, and the threading ports clause (#2572) with its test names. Move it into the kept row's evidence cell.
2026-11-04 11:45:12 +07:00
dotCooCoo cc4b492ef1 docs(type): remove stale duplicate parity rows
Follow CodeRabbit review on VectorCraft #5436; retain one current Type core row per table and one target header.
2026-11-04 11:45:12 +07:00
dotCooCoo 782071d1c7 Docs: reconcile Kashidas and Type options parity 2026-11-04 11:45:11 +07:00
BFlat 15670ca9f3 Merge pull request #4968 from dotCooCoo/feat/ai-editing-data 2026-11-04 11:41:38 +07:00
dotCooCoo 5e4f0720b0 Layers: Layer Options for several rows sends only the settings set in it
With several rows highlighted, Layer Options shows the first row's
settings, and OK sent Show, Lock, Color, Template, Print, Preview and
Dim Images to layer.setProps for every row. Changing one setting gave
every row the first row's values for all of the others as well.

The dialog now records each setting set by one of its controls or by
ui.dialog.set, and for several rows OK sends only those. A setting set
to the value the dialog shows is still sent, so choosing the first row's
color gives every row that color.

When Template changes and Lock and Dim Images are not set in the dialog,
OK does not send them. layer.setProps then locks each row that becomes
a template and dims it to 50%, unless a percentage is set in the dialog,
and unlocks and stops dimming each row that stops being one. When
Template is turned on, the dialog shows that 50%. When Template is set
back to the first row's value, the dialog shows the first row's Lock,
Dim Images and percentage again. A Dim Images percentage set in the
dialog is sent whenever Dim Images is on, also when Template turned it
on.

ui.dialog.set of template now also sets locked and dimImages, as the
Template checkbox does, for one row as well as several. Before, a script
that set template to true and confirmed the dialog left the layer
unlocked and undimmed.

The Dim Images percentage field now has the accessible name "Dim Images
to:", as its checkbox has.
2026-11-04 10:51:43 +07:00
dotCooCoo 46bb91275d Merge main into feat/ai-editing-data 2026-11-03 19:47:02 -08:00
dotCooCoo de78142dd8 Toolbars: Manage Toolbars renames, copies and deletes the toolbars made with New Toolbar
Window › Toolbars › Manage Toolbars… and Manage Toolbars… in the All Tools
drawer's menu open a dialog that lists the toolbars made with New Toolbar.
A name typed for the selected toolbar renames it, + copies the selected
toolbar or, with none selected, makes a new one, and the trash can deletes
it (https://helpx.adobe.com/illustrator/using/tools.html, Manage toolbars).

VectorCraft's own details:
- A rename applies at Enter, when the text box loses focus, or at OK. The
  name follows New Toolbar's rules: not empty, at most 200 characters, and
  not another toolbar's in any case.
- A copy is called "<name> Copy" (then "<name> Copy 2"), shows a little
  below the toolbar it copies and below earlier copies; a new toolbar is
  called "Toolbar N".
- Each change applies at once; deleting also removes the groups torn off
  the toolbar.
- When the typed name is refused, a click on +, the trash can or another
  toolbar is not applied, so the name can be corrected. When the selected
  toolbar is deleted elsewhere while the dialog is open, none is selected.
- Renaming or deleting a toolbar closes the All Tools drawer and a group's
  flyout open on it; a change of case only leaves them open, and the Tools
  panel's flyouts and other toolbars' stay open.
- Each change shows under Window › Toolbars and is kept with the workspace.

New commands: window.toolbar.manage, window.toolbar.rename,
window.toolbar.duplicate and window.toolbar.delete, with catalog rows for
their labels in every language.

Docs: control-protocol.md, gaps.md, target-app-parity.md, ui-parity.md.

Part of #1759
2026-11-04 10:26:01 +07:00
Don Omondi 4f60ee47e8 Fix #2920: an open path in a PDF-compatible .ai opens as drawn
Squashed from #4616 onto main.
2026-11-04 10:25:55 +07:00
dotCooCoo b5c69e25fd Add command to begin recording Actions 2026-11-04 09:43:35 +07:00
dotCooCoo 5e495cf900 .ai import: objects that draw differently from the page come in as its art, and the layers stay
When the layers fail the comparison with the file's own page because some objects draw
differently (an object in another color, or one that only one side draws), the import finds
each top-level object whose bounds hold a patch of such pixels (the smallest one that holds it)
and replaces it with the page's art in its bounds, in the same way as an unread object. It then
compares the layers with the page again. When that comparison passes, the layers stay, and a
warning names the layer or sublayer of each replaced object (`<Layer>` for one without a name)
and how many were replaced on it. Like the warning for unread objects, this warning counts as
a loss, so an export or Save As to the file's own path needs `acknowledgeLoss: true`. A
replaced wrap object keeps its wrap options, and area type is wrapped again around the page's
art. Placed files at their other placement are tried too when the first placement can't be
kept.

The file still comes in as its PDF part, with the same reason, when only edges or type differ,
when a difference lies outside every top-level object, when more than half of the top-level
objects (or more than 64) hold one, when such an object is or holds type or holds a wrap object
inside a group, when the page's type of a text object that stays would be copied into a
replacement, when the page's art can't replace an object for the reasons it can't replace an
unread one, when matching the differences to the objects would take too much work, or when the
second comparison still fails. Trusting the editing data keeps the objects as read.
2026-11-04 09:43:28 +07:00
dotCooCoo 8cf4b90a65 Contextual Task Bar: type on a path offers Type on a Path Options
The task bar offered no Type on a Path item for a selected type on a
path: of the type actions, it showed only Create Outlines. It now also
offers Type on a Path Options, which opens the same dialog as Type ›
Type on a Path › Type on a Path Options, with the selected type's
effect, alignment and spacing filled in. Point and area type keep
their Convert To Area Type and Convert To Point Type buttons.
2026-11-04 09:43:25 +07:00
dotCooCoo 7fe42986c2 Select: the font Same commands take their reference from type that can be selected
Select > Same > Font Family, Font Family & Style, Font Family, Style & Size,
Font Size and the text fill and stroke color commands took the type to match
from the first type found among the selected objects. Type that is hidden or
locked inside a selected group, type on a template layer and type outside the
isolated group could set the reference. They now take it from the type that
Link Block Series starts from, in the same selection order. A selection whose
only type cannot be selected returns "select a text object".
2026-11-04 09:43:21 +07:00
dotCooCoo e3a6ec68fa Docs: describe the New Window source in our own words
The New Window line in docs/target-app-parity.md quoted the help page word for word. It now describes what the page says and keeps the link.
2026-11-04 08:13:58 +07:00
dotCooCoo e03665a215 Window: New Window opens a second view of the current document
Window > New Window was grayed out. It now opens another view of the
current document, with its own zoom, center, rotation, artboard and
Outline or Preview, as a tab of its own. While a document has more than
one view, each tab shows the view's number after the name
("Untitled-1:2"). An edit in one view shows in every view of the
document.

Tile, Cascade, Float in Window, Float All in Windows and Consolidate All
Windows arrange each view as they arrange a document, and Tile and
Cascade are enabled with two views of one document. A new view of a view
in a floating window opens in a floating window too. File > Close and a
tab's close button close the view; the document's last view closes the
document, asking to save it first. Next Document and Previous Document
step through the views in tab order.

Each Tile pane and floating window draws its view in its own Outline or
Preview, and switching views with the Artboard tool targets the artboard
the view shows. A switch to another view of the current document resets
the tool, as a switch to another document does (Session::reset_tool).
Artwork held over another view's tab during a drag switches to that
view, and a drop there moves it.

Fixes #4116
2026-11-04 08:13:58 +07:00
dotCooCoo 1246c62095 DXF: paths of lines and circular arcs export as polylines with bulges
A path made of straight segments and circular arcs (a slot, a D shape,
a rounded rectangle, a pie) was written as one SPLINE, or as a flattened
polyline in R12. It is now one polyline whose vertices carry a bulge
(group 42) for each arc: an LWPOLYLINE in R14 and later, a POLYLINE with
VERTEX entities in R12 and R13, closed when the path is closed. Each run
of cubics on one circle becomes one arc. A path with any other curve
stays a SPLINE, and whole circles, arcs and ellipses keep their CIRCLE,
ARC and ELLIPSE entities.

- The circle test's tolerance is 5e-4 of the smaller of the radius and
  the curve's extent, so a shallow curve that is not circular is no
  longer written as an ARC.
- The drawing extents take each ARC's and each bulge's furthest points.

Part of #1299
2026-11-04 08:12:52 +07:00
dotCooCoo 40175d90c7 Geometry: inverses and conjugates by small affines are no longer refused
A projection now counts as invertible when its determinant, or its
adjugate's determinant, is more than 1e-15 times the largest of the six
products that determinant sums. The adjugate of the adjugate is the map
times a number, so the inverse of a projection that inverts also inverts,
is stored and reads back. The adjugate's cofactors are formed with exact
products, so the inverse of that inverse gives back the original map up
to scale, within 1e-6 of each row's largest entry, and a map whose third
row is the sum of its first two is still refused.

Homography::conjugated and Node::transform_projection judged the affine
map by an absolute determinant of 1e-15, so a scale by 1e-8 left type and
symbol instances in perspective with their old projection. Both now use
Homography::affine_is_invertible, which compares the determinant with
the two products it sums at any scale of the map. An affine map whose
determinant or inverse is not finite, such as a scale by 1e200 or
1e-200, is inverted through Homography::inverse. When the direct product
underflows to a map that is not invertible, as for a projection stored
at a subnormal scale, conjugated forms it again with its powers of two
kept apart.

- crates/geom/src/projective.rs: the_inverse_of_an_invertible_map_is_invertible,
  conjugating_does_not_depend_on_the_scale_of_the_affine,
  conjugating_a_map_at_a_tiny_scale_gives_an_invertible_map
- crates/doc/src/node/tests.rs: a_projection_follows_the_transform_or_is_removed
  covers an invertible scale by 1e-8 and a singular map at that size
2026-11-04 08:12:48 +07:00
dotCooCoo 19edd2bcc9 Docs: replace quoted help-page sentences with plain statements
docs/mcp.md (dataset.import) and docs/gaps.md (Recolor Artwork ›
Assign, Average & Join) quoted sentences from the reference app's help
pages. Each quote is replaced by a plain statement of the behavior, and
each help-page link stays as the source.
2026-11-04 08:12:28 +07:00
dotCooCoo 309b092f72 Remove copied Action Options wording from documentation 2026-11-04 08:12:25 +07:00
dotCooCoo 817bfceda3 Resolve GDEF contour-point ligature carets 2026-11-04 08:12:22 +07:00
dotCooCoo d2c5ea127a Merge commit 'refs/check/4968-main' into feat/ai-editing-data 2026-11-03 13:05:54 -08:00
dotCooCoo dfc25c85e4 Type: move right-to-left characters with Touch Type 2026-11-03 23:57:53 +07:00
dotCooCoo bbbce4318f Add Enclosing Lasso as an optional tool
Squashed from #5362 onto main.
2026-11-03 23:30:06 +07:00
dotCooCoo 63ac1395fd Type: control Kashidas for selected characters 2026-11-03 23:29:52 +07:00
bflatastic 28b87faeee Type on a Path Options: docs say where the Preview checkbox comes from 2026-11-03 22:54:12 +07:00
ruchirguitarandClaude Opus 5.5 f53ebdf7c0 Fix #5360: Type on a Path Options has a Preview checkbox
With Preview on, the selected type on a path follows Effect, Flip, Align
to Path and Spacing while the dialog is open. Cancel puts it back with no
history step; OK keeps the previewed values as one undo step. Preview
starts off. The public pages list no Preview for this dialog, so this is
a VectorCraft choice, recorded as such in the parity docs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 22:53:39 +07:00
NetterSilverandClaude Opus 5.5 2264edd0c9 Lasso picks gradient mesh points instead of dropping the mesh
Fixes #5351

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 22:16:53 +07:00
dotCooCoo 2b63bf1b67 Type: keep composition spacing along the line when characters rotate 2026-11-03 21:38:02 +07:00
dotCooCoo 0f5e4c261a Transform previews typed values in its effect dialog 2026-11-03 21:09:55 +07:00
dotCooCoo 0a9d65175a Docs: record Find Font replacement sources 2026-11-03 21:09:53 +07:00
dotCooCoo e9a3ca2c81 Character style evidence links to help without copied instructions 2026-11-03 21:09:52 +07:00
bflatastic 14b0667e95 Actions: docs describe function keys as they now work (no Replace, keys kept) 2026-11-03 20:27:30 +07:00
dotCooCoo 40ed074cae Actions: New Action asks for the action's name, set, function key and color
Squashed from #5270 onto main.
2026-11-03 20:27:02 +07:00
dotCooCoo 4db6e7b448 Paint: use the document color model for new gradient defaults 2026-11-03 20:18:34 +07:00
ruchirguitarandClaude Opus 5.5 8850b923ce Fix #4924: Text Tweaker ramps or randomises one character attribute letter by letter
A built-in Type Tools add-on (Object › Plug-ins › Type Tools › Text Tweaker…,
`addon.type.textTweaker`): size, baseline shift, rotation, horizontal or vertical
scale, tracking, leading or stroke weight go from a start value to an end value
along a straight ramp, an ease, a bow, a spike or at random with a seed, set as
the Character panel sets them, while the text stays live. One undo step, a
dialog with Preview, catalog rows in all 26 languages, docs/mcp.md and the
parity docs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 20:07:58 +07:00
Brandon Thomas 9933deeebc Merge pull request #5352 from dotCooCoo/docs/assessment-target
Docs: consolidate assessment target metadata
2026-11-03 08:05:33 -05:00
ruchirguitarandClaude Opus 5.5 46f1ddf170 Fix #5236: find PhotoCraft where its Windows installer puts it
Per CodeRabbit on #5327: on Windows Edit Original looked for photocraft.exe
only on the PATH, but PhotoCraft's MSI installs it to ArtCraft\PhotoCraft
under %LOCALAPPDATA%\Programs (per user, the default) or Program Files (for
everyone), neither on the PATH. Look first at the path the installer
registers under App Paths (HKCU, then HKLM; `reg query`, as i18n reads the
locale, which also covers a folder chosen in setup), then those two default
folders, then the PATH. Each candidate must still be an .exe.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 19:57:04 +07:00
ruchirguitarandClaude Opus 5.5 d7aa1c561f Fix #5236: Edit Original is one checkbox, Use System Defaults for Edit Original
Per review on #5327: Preferences › File Handling › Edit Original With (an app
path and Choose…) becomes the checkbox Use System Defaults for Edit Original,
on by default. Off, Edit Original opens a raster image in the app that made
it, PhotoCraft, looked for only where it installs; any other file, or no
PhotoCraft, goes to the system's default app. The preference is a boolean, so
prefs.set over control or MCP can no longer name an executable. The label has
a row in all 26 catalogs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 19:57:04 +07:00
ruchirguitarandClaude Opus 5.5 d11764c117 Fix #5236: Edit Original opens linked files in a chosen app
Preferences › File Handling › Edit Original With picks the app Links
panel › Edit Original opens a linked file in: System Default (as before),
PhotoCraft (found in /Applications or ~/Applications on macOS, on the
PATH elsewhere) or Other Application, with a path field and Choose….

The desktop host's new `open_file_with` service starts only an
application (an .app bundle on macOS, an .exe on Windows, an executable
file elsewhere), with the path as its only argument and never through a
shell. Edit Original still refuses control requests.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-03 19:57:04 +07:00
dotCooCoo 4e75f135e9 Docs: consolidate assessment target metadata 2026-11-03 04:50:29 -08:00
dotCooCoo a870da6c7d .ai import: Effect › Pathfinder on a group opens as a live effect
Squashed from #5150 onto main.
2026-11-03 16:38:47 +07:00
dotCooCoo f62e502f1c .ai import: version 7 pattern definitions come in as pattern swatches
Squashed from #5189 onto main.
2026-11-03 16:38:42 +07:00
dotCooCoo e1ea0ecad1 Type: the caret, a click and the arrow keys reach the characters inside a ligature
Squashed from #5225 onto main.
2026-11-03 16:38:36 +07:00
dotCooCoo 86deb546ad Variables: Import Data Sets reads every column as a variable and replaces the data sets
Squashed from #5151 onto main.
2026-11-03 16:38:29 +07:00
dotCooCoo fbab0bdd43 Type: Find Font's Replace With Font From lists the document's, recent or installed fonts
Squashed from #5217 onto main.
2026-11-03 16:38:24 +07:00
Ahmed Gomaa 1d011ab8ad Render: a compound path's members are assembled once and kept with the node
A compound path was assembled from its members in every frame it was
drawn, and Node::stroke_path grew its buffer by doubling, copying the
path into ever larger buffers for a compound path of many anchors. The
renderer's geometry cache was swept only once it held more than 1,024
entries, so while an object was dragged (a new node, and layer, in
every frame) the old copies stayed alive with all their members.

Now:
- a compound path is drawn from the path the renderer keeps for it in
  its geometry cache, as a plain path already was, and is assembled
  only when the node changes;
- Node::stroke_path sizes a compound path's buffer up front from its
  members' segment counts (the same elements, in the same order);
- unused geometry entries are dropped after a few frames however few
  entries there are.

Tests:
- crates/render/src/tests/memory.rs: the second frame draws the kept
  path and the same pixels as the first and as a new renderer; after a
  five-frame move the renderer no longer holds the compound path drawn
  before it. The test fails without the renderer change.
- crates/doc/src/node/tests.rs: a compound path's path is its members'
  paths in order (open, closed, empty and single-anchor members).

Not timed; vectorcraft-cli perf was not rerun.
2026-11-03 16:03:40 +07:00
Ahmed Gomaa f0e72fb11a Selection: a click on a large compound path is culled by its control points
Every click and hover measured each path and compound path along its
curves to cull it (Node::reach_bounds_with), and a compound path was
then assembled whole to test its outline and fill. For a compound path
of thousands of members that took milliseconds per click.

Hit testing now culls paths and compound paths by the box of their
control points (which holds the curves), grown by their strokes' reach,
so the box is never smaller than the reach box it replaces. A compound
path's outline and fill are tested against only the members whose
control box, grown by the tolerance, holds the point: a member outside
that box is farther than the tolerance and winds zero times round the
point. Painted strokes still follow the whole compound path (alignment,
dashes, width profiles) and are measured along all of it, as before.

Tests (crates/doc/src/hit/tests.rs):
- a 2,000-member compound path hits exactly as the whole-path test did,
  at random points, on and next to anchors and on the edges of the
  members' boxes, for both fill rules, in Outline view and with Object
  Selection by Path Only;
- wide strokes painting past the control points are still hit, for a
  path and a compound path;
- the cull box holds the reach box for paths and compound paths.

Measured in a debug test build (one run, machine not idle): a click on
a 20,000-member compound path went from about 18 ms to about 1 ms.
vectorcraft-cli perf was not rerun.
2026-11-03 16:03:40 +07:00
dotCooCoo 84db6a54a0 Type: discard queued font wheel turns after text selection changes 2026-11-03 16:03:40 +07:00
dotCooCoo 89f3d79eec Type: clarify stable font wheel ordering 2026-11-03 16:03:40 +07:00
dotCooCoo 2a95625b99 Type: step font families with the mouse wheel
Apply wheel steps over the closed family fields in Character, Properties and Control, preserving event order and one undo step per effective notch. Document the supported controls and the application choices. Fixes #5253.
2026-11-03 16:03:40 +07:00