Commit Graph
1954 Commits
Author SHA1 Message Date
BFlat 400a3b7f91 Merge pull request #6469 from dotCooCoo/fix/3d-expand-keeps-curves
3D: expanded solids keep the art's curves in caps and the walls' cap edges
2026-11-11 06:32:32 +07:00
dotCooCoo 6c84c92907 3D: a beveled cap and its walls draw their shared edge as the same curves
A cap inset by a bevel fitted each run of sampled edges along one curve
as a whole, while the wall next to it fitted each sampled edge by itself.
The two outlines lay up to 0.25 pt apart on an 800 pt circle, which left
a gap or an overlap between the cap and the wall.

An inset outline is now fitted one sampled edge at a time in the cap as
well, so both faces draw the same curves. Caps that are not inset keep
one cubic for each curve of the art.

Test: solid::tests::a_beveled_cap_and_its_walls_share_their_curves.
Docs: docs/three-d.md, docs/target-app-parity.md.
2026-11-10 14:36:28 -08:00
dotCooCoo e105548fdb Docs: the 3D curves entry names the edges that stay straight
The progress entry said caps and the walls' cap edges are cubics without
its limits. It now lists the cases three-d.md describes: an edge of a
twisted wall that is cut into pieces, a piece of curve that does not fit
after 8 halvings, and the curves past 1,048,576 for one solid.
2026-11-10 14:29:15 -08:00
BFlat 349385fd56 Merge pull request #6418 from dotCooCoo/fix/3d-more-object-kinds
3D: effects build from clipping groups, blends and symbol instances
2026-11-11 05:13:37 +07:00
BFlat 3cb6f44c9b Merge pull request #6464 from dotCooCoo/fix/issue-6382
Fix #6382: PDF export says how a page longer than 200 inches is written
2026-11-11 04:46:38 +07:00
dotCooCoo f259c2372a 3D: expanded solids keep the art's curves in caps and the walls' cap edges
Extrude & Bevel (both kinds) and Rotate wrote every face as straight
segments between sample points, so Expand Appearance and the exports
gave a corner at every sample. Sampling now records the curve each
polygon edge follows, and a facet carries an outline of cubics rebuilt
from it: exact without perspective, within 0.001 pt with it, and within
the sampling tolerance for bevel insets. Caps, Rotate's face and the
wall and bevel edges that meet a cap keep curves; interior bevel edges,
edges a twist cuts and edges past 1,048,576 curves stay straight.
Inflate's faces stay polygons.

Docs: docs/three-d.md, docs/target-app-parity.md.
2026-11-10 13:43:05 -08:00
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 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
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 a960ba0d08 PDF export: pages that exported before keep exporting
- PDF 1.3 and 1.4 files, PDF/X-1a, PDF/X-3, PDF/X-4 and PDF/A-2b at
  PDF 1.4 among them, write a page longer than 14,400 pt in points
  again, now with a warning that apps that keep to the limit cut it to
  200 in. Only a page that failed with
  "PDF writer error: Limit(TooLargeFloat)" gets the new error: one
  whose size or art needs a real number past 32,767, the most PDF 1.4
  holds. Whole numbers are written as integers, so a page of whole
  points past 32,767 is written as before.
- A page whose side is past 32,767 pt and not a whole number of points
  is refused before the thumbnails are drawn and the transparency is
  flattened.
- A PDF 1.5 file written as PDF 1.6 for a long page keeps PDF 1.5's
  encryption (128-bit RC4), which the Save PDF dialog shows.
- A long page whose short side would be under 3 units at its UserUnit
  (ISO 32000-1, Annex C.2), such as 50 m x 4 mm, gets a smaller
  UserUnit that keeps the short side at 3 units, with a warning.
- The warnings give a page's size rounded up, as the error does.

A page of 14,400 pt or less is written as before. The new warning has
rows in every complete catalog. Docs: docs/mcp.md,
docs/target-app-parity.md and the document.exportPdf params.
2026-11-10 12:31:53 -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
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
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
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
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
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
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
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
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
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
HassanKhan ab466f20a7 Merge remote-tracking branch 'upstream/main' into feat-4936-edit-custom-dictionary
# Conflicts:
#	docs/target-app-parity.md
2026-11-10 23:12:28 +05:00
MarekSpodBiedry 90a8912027 Merge remote-tracking branch 'origin/main' into review-5560
# Conflicts:
#	docs/target-app-parity.md
2026-11-10 18:36:27 +01:00
jmvergesandClaude Opus 5.5 3995dc79e4 docs: envelopes of type held to the page, and visibility bindings
The file-format revision row for #3179 says that the page check weighs
a live envelope of type as the art it draws, that layers used though
they don't draw as the page leave envelopes of type their drawn art,
and that a slot bound to a visibility variable keeps it too, and lists
the new tests. The parity assessment's evidence says the same, and
the change gets its row and status entry there.

Part of #3179.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-10 17:26:29 +00:00
jmvergesandClaude Opus 5.5 47b20b4366 .ai import: envelopes of type open live where they draw as their drawn art
An envelope whose contents hold type kept its drawn art, with the type
hidden, because the type is laid out from the text document only after
the layers are read. It now waits for that, as warped type does: once
its text slots hold their type, the envelope is made of that type and
drawn by VectorCraft's own rule, and where it draws as the drawn art the
file saves (the same check and budget as other envelopes) it takes the
drawn art's place, with the type visible and editable in Edit Contents.
The hidden copy of the type goes.

As other live envelopes are, it is held to the page: when the layers
with it don't draw as the page, its drawn art and hidden type are put
back. A .ai whose layers would open alone, without its PDF part, now
waits on the PDF part when an envelope of type is in them; where none
opens live, the layers open alone as before. Layers built without a page
leave envelopes of type their drawn art.

Elsewhere it keeps its drawn art and hidden type, with the note: type in
a font that isn't available, a slot without made type (threaded, bound
to a text variable, a wrap object, type a look draws), an envelope that
doesn't read, no check left, or one that draws differently. Envelopes in
a symbol's or a pattern's art keep their drawn art.

Part of #3179.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-10 17:26:19 +00:00
HassanKhan 9ab5c033b1 Merge remote-tracking branch 'upstream/main' into feat-4936-edit-custom-dictionary
# Conflicts:
#	docs/roadmap.md
#	docs/target-app-parity.md
2026-11-10 21:48:55 +05:00
HassanKhan bc3d23bb50 Merge remote-tracking branch 'upstream/main' into feat-4936-edit-custom-dictionary
# Conflicts:
#	docs/gaps.md
#	docs/roadmap.md
#	docs/target-app-parity.md
#	docs/type-parity.md
2026-11-10 21:13:30 +05:00
makesomethingshit a96f442e8c #6369: Reconcile roadmap and parity notes with main 2026-11-11 00:47:14 +09:00
makesomethingshit 0d198483f6 #6369: Merge main and preserve halftone preview notes 2026-11-11 00:00:30 +09:00
Fabio William Conceição 710e14a33a G5: built-in Game HUD graphic style library 2026-11-10 14:26:37 +00:00
BFlat 207091564e Merge pull request #6349 from juliusvaart/5421-line-arrowhead
Stroke: Line Arrow arrowhead (part of #5421)
2026-11-10 20:19:01 +07:00
makesomethingshit 129ef8a83b #6369: Merge main and retain halftone roadmap evidence 2026-11-10 22:05:29 +09:00
ruchirguitarandFredApps 243bdb3f63 Fix #5713: resizable icon flyouts and bottom-aligned panel footers (#5973)
* Fix #5713: resize icon flyouts and anchor panel footers

* Fix #5713: reconcile parity evidence with upstream docs

* Fix #5713: keep Actions rows above the pinned footer

* Fix #5713: align documentation dates and regression claims

* Fix #5713: keep short Glyphs grids above the footer

* Fix #5713: pin craft-ui host minimum-size correction

---------

Co-authored-by: FredApps <153173854+FredApps@users.noreply.github.com>
2026-11-10 13:40:55 +01:00
HassanKhan c88828d877 Merge remote-tracking branch 'upstream/main' into feat-4936-edit-custom-dictionary
# Conflicts:
#	docs/gaps.md
#	docs/roadmap.md
#	docs/target-app-parity.md
2026-11-10 16:59:20 +05:00
makesomethingshit 3eea6f1475 #6369: Clarify halftone preview documentation 2026-11-10 20:54:35 +09:00
dotCooCoo 2fb8c9e516 Merge main into fix/undo-history-follows-memory-r 2026-11-10 03:33:23 -08:00
jmverges 636c7951f9 Merge main into fix/3179-envelope-type-note
# Conflicts:
#	docs/file-format-parity.md
2026-11-10 11:00:42 +00:00
Julius van der Vaart c65613aaf0 Merge branch 'main' of github.com:storytold/vectorcraft into 5421-line-arrowhead
# Conflicts:
#	docs/target-app-parity.md
2026-11-10 11:56:48 +01:00