Commit Graph
10572 Commits
Author SHA1 Message Date
BFlat 54092a0a01 Merge pull request #6462 from dotCooCoo/feat/plugin-call-commands
Plug-ins: an API level 2 plug-in calls the commands its manifest lists
2026-11-11 04:37:37 +07:00
BFlat 3c82854a46 Merge pull request #6463 from dotCooCoo/fix/test262-skip-by-code
Tests: test262 skips a test only when its code uses a missing built-in
2026-11-11 04:26:50 +07:00
BFlat 77f2198d1c Merge pull request #5035 from dotCooCoo/fix/undo-history-follows-memory-r
Undo: the history keeps steps within a quarter of installed memory on every desktop OS
2026-11-11 04:25:52 +07:00
BFlat a730f81e33 Merge pull request #6461 from dotCooCoo/fix/compound-member-copy-cut
Edit: Copy and Cut of a whole compound member take only that member
2026-11-11 04:17:12 +07:00
BFlat 7bac831948 Merge pull request #6458 from dotCooCoo/fix/mesh-keeps-shape
Fix #2752: a gradient mesh keeps the outline of the path it is made from
2026-11-11 04:17:03 +07:00
BFlat df6eac95ed Merge pull request #6453 from ruchirguitar/fix/6388-ai-variable-font-instance
G9: .ai save names a variable font instance's design space (#6388)
2026-11-11 03:48:00 +07:00
dotCooCoo adb8ce5552 Tests: test262 skips a test only when its code uses a missing built-in
The interpreter runs skipped every test with a missing built-in's name
anywhere in a string literal, so a test that only mentions Boolean in
a message or in text data was never run. A string now counts when it
is the name alone (a property key such as this["Map"]), or when the
test or an included harness file can run strings as code (eval,
Function or a constructor property, by name or by string key).
Identifiers and property names count as before, and a source that does
not tokenize as ES5 is still skipped.

At tc39/test262 d53ebc8b, language/types/string/S8.4_A6.1.js and
S8.4_A6.2.js now run and pass: the language run goes from 2,459 tests
(205 skipped) to 2,461 (203 skipped), and the failure lists are
unchanged.
2026-11-10 12:44:42 -08:00
dotCooCoo f42b03f392 Plug-ins: a call reads no file, whatever param names it
A call whose arguments hold a file or folder key at any depth, such as an
effect's textureImage.path, is refused before the command runs; the walk
keeps its own stack. Each call also runs with automation file access
confined to no roots, so every checked read or write a command makes is
refused, whichever param carried the path.
2026-11-10 12:41:46 -08:00
dotCooCoo 99826f274c Edit: a copied compound member keeps the compound's isolated blending 2026-11-10 12:36:18 -08:00
dotCooCoo d1f5af011f Fix #2752: a gradient mesh keeps the outline of the path it is made from
Create Gradient Mesh, a Mesh tool click and Object > Expand of a gradient
to a mesh gave each border edge one cubic fitted between two mesh points
and picked the corners from the bounding box, so the border cut off
corners and curves: 49 pt off a five-point star, 54 pt off a notch.

- The border follows the outline of the largest subpath by length; border
  points sit on it and an edge with no anchor inside is the exact piece
  of its segment.
- Where no single cubic follows a run within 0.1 pt (a thousandth of the
  size on a small outline), a mesh line goes through an anchor, the
  sharpest corner first; at most 256 lines each way. Rectangles and
  ellipses keep the rows and columns asked for.
- Smooth runs keep their end tangents; border handles are no longer made
  collinear.
- To Center and To Edge highlight placement accounts for the extra lines
  (for_path_shaded, also used for gradient fills).
- Non-finite points give no mesh; a degenerate outline keeps the old
  bounding-box mesh.

Holes of a compound path are still left out, as before.

Docs: docs/target-app-parity.md.
2026-11-10 12:33:20 -08:00
dotCooCoo c8d0cdf6a1 Undo: the open documents' histories share one budget of a quarter of installed memory
`Session::history_budget` (default `default_history_budget()`) caps the
memory the undo steps of all open documents keep together. After each
command, tool edit, interaction commit, direct edit, framed script run
and closed undo group, `Session::trim_histories` drops the oldest steps
of any document first, undo steps before redo steps. Each document keeps
its last eight undo steps and next eight redo steps, and a held history
keeps all of its steps. While a script runs or an undo group is open,
no steps are dropped, so a canceled group leaves the other documents'
steps in place. Closing a document frees its share. The steps are not
counted again while neither the budget nor any history changed. Each
document's own `byte_budget` stays as its ceiling.
2026-11-10 12:31:14 -08:00
dotCooCoo 668b3fa3d7 Edit: a copied member keeps its compound's gradient, and Clear leaves no empty compound
A compound member copied or cut on its own now keeps the compound's
gradient fitted where it was: an unplaced gradient is pinned to the
compound's bounds, measured once per compound.

Clear that deletes every anchor or segment of every member of a compound
path now removes the compound too, as Cut does, instead of leaving an
empty compound in the layer.

The edit.copy and edit.clear descriptions, docs/mcp.md and the progress
line now say that selecting the compound copies it whole, that isolation
mode takes each member as itself, and how a compound of one and Paste in
Front with the copied member still selected behave.
2026-11-10 12:25:30 -08:00
dotCooCoo b99aac6e89 Plug-ins: American spelling of canceled in the command-call text 2026-11-10 12:12:01 -08:00
ruchirguitar f537559f81 Merge remote-tracking branch 'origin/main' into fix/6388-ai-variable-font-instance
# Conflicts:
#	docs/gaps.md
2026-11-11 01:35:57 +05:30
BFlat 34d0227a61 Merge pull request #6454 from dotCooCoo/fix/js-identifier-tables
JavaScript: identifiers follow Unicode's ID_Start and ID_Continue properties
2026-11-11 03:05:32 +07:00
dotCooCoo 085609e398 Merge main into feat/plugin-call-commands 2026-11-10 12:01:07 -08:00
ruchirguitarandClaude Opus 5.5 163ce1731b G9: .ai font set keys on version too; test /5 (#6388)
Two installed versions of one font are two fonts of the set, so each
keeps its own /5. The generated variable test font now has a version
(name ID 5), and the test checks each variable record writes it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 01:30:11 +05:30
dotCooCoo 9689f79eca Plug-ins: a call with nothing to make it fails the run
vc_call returning -11 (from the start function, or in a run that can't make
calls) now fails the run like every other code, so a plug-in that ignores
it can't report success for a call that never ran. Calls are allowed once
the module has loaded, so a start-function call gets -11 instead of
trapping.
2026-11-10 11:58:08 -08:00
BFlat 6622a3ea30 Merge pull request #6451 from slafebre/fix/6429-dash-fields-commit-on-blur
#6429: a value typed in a Stroke popup sticks when a click outside closes it
2026-11-11 02:57:28 +07:00
BFlat fa13af4b8f Merge pull request #6353 from Messhias/feat/g5-brush-lib-game-trails
G5: built-in Game Trails brush library
2026-11-11 02:53:07 +07:00
dotCooCoo 5a81c1caba Plug-ins: a failed calling run keeps the trace handed in for Image Trace
A run that calls imageTrace.make used to take the trace the app handed in
for the command, and a failed run did not give it back. The trace is now
set aside while the run goes and handed back after it.
2026-11-10 11:49:27 -08:00
BFlat 2caa5670dd Merge pull request #6446 from slafebre/fix/6419-assign-profile-panel
Fix #6419: Edit › Assign Profile… and Color Settings… scroll to the Color Settings
2026-11-11 02:47:51 +07:00
BFlat 6a83f3a268 Merge pull request #6452 from dotCooCoo/fix/glyph-bounds-width-keeps-font-size
Docs: with glyph bounds, the font size follows the vertical scale
2026-11-11 02:36:28 +07:00
dotCooCoo c6c57a80ef Merge main into feat/plugin-call-commands 2026-11-10 11:26:41 -08:00
dotCooCoo 1f8423c2a9 Edit: Copy and Cut of a whole compound member take only that member
A compound-path member selected on its own, whole with Direct Selection
or with Group Selection, is now copied as an ordinary path instead of
promoting the selection to its compound. Cut removes the same objects
Copy takes, so the other members stay a compound path, a compound of
one included. The compound is still taken whole when every member is
selected whole, or when the compound itself is selected.

A copied member or piece takes the compound's paint, opacity, blending
mode, opacity mask, pixel alignment and fill rule.

Tests that pinned the earlier rule from #786 now check the new one.
2026-11-10 11:26:35 -08:00
dotCooCoo 811c21e7c2 Plug-ins: calls need doc.read, and an edit in progress is kept before a calling run
A command's result describes the document, so a plug-in without doc.read
gets -6 for every call, whether or not the id names a command. A run that
calls commands commits an edit still in progress first and prepares its
input again when that changed the document or the selection.
2026-11-10 11:26:10 -08:00
BFlat 437794f033 Merge pull request #6450 from dotCooCoo/fix/3d-extrude-limits
3D: Extrude & Bevel and Inflate build detailed shapes they refused as too complex
2026-11-11 02:20:21 +07:00
dotCooCoo 7d01ebf2fd JavaScript: check identifier characters against every Unicode 16 code point
- A new test walks every code point from U+0000 to U+10FFFF, surrogates
  left out, and compares the start and part checks with Unicode Standard
  Annex #31's general-category definition of ID_Start and ID_Continue,
  written out in the test. The test also checks the set sizes against the
  totals in Unicode 16.0's DerivedCoreProperties (141,269 and 144,541).
- The Other_ID_Continue test covers every code point of the property,
  U+136A to U+1370 and the zero width non-joiner and joiner included.
- The zero width non-joiner and joiner are part of the Other_ID_Continue
  list in chars.rs instead of a separate case.
2026-11-10 11:19:34 -08:00
BFlat 5861a719fe Merge pull request #6449 from dotCooCoo/fix/script-run-keeps-file-scope
Scripts: a framed run keeps the file-access roots it started under
2026-11-11 02:18:21 +07:00
Sven Lafebre 40368e77e0 #6429: the Appearance popup's last frame puts surrender_focus_on back however it ends
A drop guard restores egui's app-wide option, so a panic in the popup's panel
(caught by the app's guard) no longer leaves presses ending every field's edit.
2026-11-10 20:15:44 +01:00
dotCooCoo 36cd83cc40 Merge main into fix/js-identifier-tables 2026-11-10 11:06:55 -08:00
dotCooCoo b86497b1e4 JavaScript: identifiers take every Unicode ID_Start and ID_Continue character, and no others
is_id_start now accepts the Other_ID_Start characters (U+1885, U+1886,
U+2118, U+212E, U+309B, U+309C), and is_id_part the Other_ID_Continue
characters (U+00B7, U+0387, U+1369 to U+1371, U+19DA, U+30FB, U+FF65),
as Unicode's ID_Start and ID_Continue properties and the ECMAScript
Names and Keywords clause define them. Letters, marks, digits and
connectors that are Pattern_Syntax are refused, which replaces the
U+2E2F special case. Escaped identifier characters go through the same
check. A supplementary letter right after a number is now the
"identifier starts immediately after numeric literal" error.

Letter categories still come from Unicode 16.0, so characters assigned
in later versions are not identifier characters yet.

Docs: docs/mcp.md, docs/target-app-parity.md.
2026-11-10 11:06:32 -08:00
Fabio William Conceição 9dc15b8f1f G5: built-in Game Trails brush library
Add Speed Line, Dash Trail, Burst Ray and Zigzag as original art brushes so motion and impact strokes are one library click away.
2026-11-10 19:04:40 +00:00
BFlat d2402b75bf Merge pull request #6425 from Hassan1305/feat-4936-edit-custom-dictionary
#4936: Edit › Edit Custom Dictionary… dialog
2026-11-11 02:01:47 +07:00
ruchirguitar 971800c92c Merge remote-tracking branch 'origin/main' into fix/6388-ai-variable-font-instance
# Conflicts:
#	docs/file-format-parity.md
#	docs/gaps.md
2026-11-11 00:31:15 +05:30
dotCooCoo a5d09c13f0 Docs: with glyph bounds, the font size follows the vertical scale
docs/mcp.md and docs/target-app-parity.md said that a width or height
typed with Measure Type by Glyph Bounds on changes the font size by the
scale. The font size follows the vertical scale only: a width typed
alone, out of proportion, changes the horizontal scale and keeps the
font size, and a height typed alone changes the horizontal scale the
other way. A new test checks both.
2026-11-10 10:57:34 -08:00
Sven Lafebre 332e8fe15c #6429: a value typed in a Stroke popup sticks when a click outside closes it
The Properties panel's Stroke link and the Appearance panel's Stroke: row open
the Stroke panel as a popup. A click outside closed it without drawing it
again, so the dash field (or any other field in it) never saw itself lose the
keyboard, and what was typed went back. A popup closing while one of its
fields has the keyboard now draws once more first: the field lets go of the
keyboard to the click and commits, as it does in a panel. The Appearance
popup closes on the press, before it is a click, so for that last frame a
press is what lets go of the keyboard. Escape still drops what was typed.
2026-11-10 19:57:24 +01:00
Sven Lafebre 2dd63e7240 Fix #6419: document the Separations Preview panel's Color Settings section functions 2026-11-10 19:55:53 +01:00
ruchirguitarandClaude Opus 5.5 405062084d G9: .ai save names a variable font instance's design space (#6388)
A variable font's CoolTypeFont record in the text document now carries
/4 (its design vector, one 16.16 value per fvar axis) and /5 (its
version string), and the font set keys on name plus design vector, so a
named instance or a run's own axis setting no longer opens at the
font's default instance. Static fonts are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 00:25:12 +05:30
dotCooCoo 7940eefb04 Plug-ins: only an effect or command id naming a plug-in refuses a call
A call was refused when any string in its arguments started with plugin., so a filter could not create text such as "plugin.example". Only the values of effect, effects, id (effect.apply's other name for effect), command and commands count now, at any depth.
2026-11-10 10:49:06 -08:00
dotCooCoo a900653c9c 3D: Inflate limits the work of filling its grid
Inflate's grid clipped every ring of the outline in each cell the
outline crosses and tested every edge for each cell's center, so its
work grew with the outline's points times the cells: a comb of 4,000
teeth (16,002 points) took 1.1 to 1.3 s and one of 16,000 teeth 8.8 to
9.1 s. Inflate now counts that work (the edge index's entries, the edges
its queries look at and the ring points its cells clip) and refuses the
shape with "The 3D surface is too complex; simplify the shape" once it
passes 268,435,456, VectorCraft's own value (about 0.65 s). The index
takes at most 16,777,216 entries (64 MiB). Each row's inside test reads
the sorted crossings of its line, and a cell clips only the rings whose
bounds meet it, so a 65,536-point circle inflates in 0.66 s instead of
1.0 to 1.2 s.

The effects test of a stroke past the limits uses 40,000 corners, so its
outline passes the 65,536 points a solid takes.

Docs: docs/three-d.md, docs/mcp.md.
2026-11-10 10:43:24 -08:00
dotCooCoo af0d01308f Scripts: a framed run keeps the file-access roots it started under
A script.run that a control request started in the app's frames was
advanced by later frames, which run unconfined, so its vc.run file
commands could read and write outside the caller's automation roots.
The job now keeps the file-access scope of its script.run and runs
each slice in it, as background opening and the folder walker do.
2026-11-10 10:39:48 -08:00
dotCooCoo a068f8d065 Plug-ins: a plug-in may call text.setPathHandle
main added text.setPathHandle, which moves a handle of type on a path's path in the document. Commands a plug-in may call are listed one by one, so it goes in the allowed list.
2026-11-10 10:31:51 -08:00
BFlat 3776100ba6 Merge pull request #5560 from MarekSpodBiedry/issue-5534
Crop Image: cut plain raster images from their pixels instead of re-rendering (#5534)
2026-11-11 01:21:59 +07:00
BFlat 82944dd7b5 Merge pull request #5559 from MarekSpodBiedry/issue-5349
Step a blank Stroke Weight from 0.25 pt (#5349)
2026-11-11 01:17:35 +07:00
dotCooCoo f51a9dc16d Merge main into feat/plugin-call-commands 2026-11-10 10:16:48 -08:00
dotCooCoo f921a6923d Plug-ins: an API level 2 plug-in calls the commands its manifest lists
A filter at plug-in API level 2 with the new `commands` permission names
the commands it may run in its manifest's `commandAllowlist` and runs
them with `env.vc_call`, reading each result with `env.vc_call_result`.
Each call runs through Session::execute on the run's document and sees
what earlier calls changed; the calls and the filter's output are one
undo step, and a run that fails, is cancelled or makes a failed call
leaves the documents, their history and the session state the commands
change as they were.

Commands that touch files, the clipboard, preferences, the view,
scripts, actions, plug-ins, open documents or the undo history are never
callable, and every other command must be listed as allowed in
cmd/plugin_call/reviewed.rs, so a new command is refused until placed.
Calls are capped at 1,000 a run, 8 MiB a call and 64 MiB a run, and each
costs instructions from the run's budget. plugin.install refuses a
manifest that lists a refused command and reports unknown ids;
plugin.inspect lists both, and the approval dialog lists the commands.

Refs #2186
2026-11-10 10:16:28 -08:00
dotCooCoo 382d352da1 Merge main into fix/3d-extrude-limits 2026-11-10 10:15:04 -08:00
Sven Lafebre 64fb4d4554 Fix #6419: Edit › Assign Profile… and Color Settings… scroll to the Color Settings
Both commands show the Separations Preview panel (#4542), whose Color Settings
section, with the Assign row, comes after the plates and Proof Setup. A
floated panel fits its content only up to 320 points, so the section opened
out of sight and the panel looked like the wrong one. The commands now leave a
one-shot flag that scrolls the section into view, without animation, the next
time the panel draws. Window › Separations Preview and edits made in the panel
leave the scroll alone.
2026-11-10 19:14:48 +01:00
dotCooCoo 6484e72dff 3D: Extrude & Bevel and Inflate build detailed shapes they refused as too complex
Each Extrude & Bevel and Inflate solid now takes up to 65,536 outline
points (was 2,048) and 163,840 faces (was 32,768), VectorCraft's own
limits, as Revolve's. Before any point is sampled, the outline's lines
and curves are counted with each curve's tolerance pieces, and the faces
the walls, bevels and caps (Extrude) or the sides (Inflate) need. When
they do not fit, every curve takes fewer pieces, down to 4; a shape that
does not fit at 4 is refused with the existing surface error before any
face is built. The subpath count is capped at the point limit too. The
error texts are unchanged.

A closed path of 2,000 curves now extrudes with a bevel and inflates,
and paths of 5,000 and 10,000 curves build at the default settings.

Docs: docs/three-d.md, docs/mcp.md, docs/target-app-parity.md.
2026-11-10 10:14:22 -08:00