Commit Graph
2673 Commits
Author SHA1 Message Date
Drew Dibble 78b31831c2 Artboards: Fit to Artwork Bounds' kept answer kept by the document, with the plug-ins and fonts it reads
The answer whether Fit to Artwork Bounds has art to fit moves from a
function-local thread_local to DocState, beside any_empty_artboards, and
drops with the document. It is kept for that version of the document
(held weakly, as any_empty_artboards holds its own) and the artboards
asked about, and measured again when the installed plug-ins, whose
effects draw art, or the installed fonts, which set type drawn by its
effects' art, change: their generations are an explicit input of the
measure. A change of the selection or the view keeps it.

The test counts the measures, as the Delete Empty Artboards check's
does: a later frame, select.set and a view change keep the answer; an
edit, other artboards, and each generation measure again. Taking any
part out of the key fails it.
2026-11-09 15:13:41 -07:00
Drew Dibble 2fcaaedb2d Merge main into type-3d-redraw 2026-11-09 13:20:30 -07:00
HassanKhan ff1079b3ce Auto Spell Check: underline the unknown words of the type on the canvas (part of #4936) 2026-11-09 23:41:41 +05:00
Drew Dibble bd779077e5 Merge main into type-3d-redraw
# Conflicts:
#	crates/ui-egui/src/canvas/tests.rs
#	docs/target-app-parity.md
2026-11-09 09:49:25 -07:00
Fabio William Conceição a668f44780 G5: assert default 9-slice on every UI Frames symbol
Keep the library test aligned with SymbolNineSlice::default() for Panel, Button and Bar.
2026-11-09 16:40:13 +00:00
Fabio William Conceição e5ef855903 G5: size UI Frames so default 9-slice keeps round corners
Button and Bar were shorter than 4x their corner radius, so the default guides cut through the curves on a vertical resize.
2026-11-09 16:29:22 +00:00
Fabio William Conceição bd9b1696e0 G5: built-in UI Frames symbol library with default 9-slice
Add Panel, Button and Bar HUD chrome as a second original symbol library so games can drop resizable UI frames without inventing art each time.
2026-11-09 16:29:22 +00:00
BFlat 9086ff3e96 Merge pull request #6325 from Silvertree2010/fix/h15445-graph-csv-parser-does-not-strip
Strip leading byte-order mark in graph CSV parser
2026-11-09 23:16:56 +07:00
NetterSilverandClaude Haiku 5.5 511bb23999 Strip leading byte-order mark in graph CSV parser
Found while testing crates/engine/src/cmd/graph/data.rs:45-47 (parse_csv)

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-09 15:25:52 +00:00
Fabio William Conceição 0216bd58c5 G5: document gradient, pattern, opacity and blend on a picked part
The MCP guide and the Eyedropper spec still said those were refused for a Direct Selection of a dynamic symbol part.
2026-11-09 13:12:49 +00:00
Fabio William Conceição 6def1c6b04 Merge remote-tracking branch 'upstream/main' into feat/g5-dynamic-symbol-part-appearance
# Conflicts:
#	docs/gaps.md
#	docs/target-app-parity.md
2026-11-09 13:00:35 +00:00
Fabio William Conceição 1ff0fd62fc G5: rustfmt dynamic symbol part paint paths 2026-11-09 12:18:55 +00:00
Fabio William Conceição 1e278a3dff G5: dynamic symbol parts take opacity, blend and non-solid paint
Direct Selection of a path, compound path or type inside a dynamic instance now applies transparency and gradient or pattern fills through the usual paint commands, and the G5 docs catch up on Overlap and Pattern auto corners.
2026-11-09 12:14:14 +00:00
HassanKhan f0a4d59c93 Read the dictionary file whole before trusting it; keep other windows' words on a failed save 2026-11-09 16:23:08 +05:00
HassanKhan 11779d6d46 Merge remote-tracking branch 'upstream/main' into feat-4936-custom-dictionary
# Conflicts:
#	docs/gaps.md
#	docs/roadmap.md
#	docs/target-app-parity.md
2026-11-09 15:04:56 +05:00
HassanKhan a22cbd9d16 Part of #4936: never write over an unreadable dictionary; undo a failed save
- A custom dictionary file that is there but can't be read whole (not a
  file, unreadable, or larger than the 1,000,000 bytes craft-proof reads)
  is not loaded and never written over: attaching it logs why, and every
  add, delete or change is refused with that reason. A missing file is
  still created by the first save.
- When a save fails, the command takes back only its own change, so memory
  and file agree; words the save took in from the file stay.
2026-11-09 15:04:39 +05:00
BFlat ab3cd54310 Merge pull request #6294 from Silvertree2010/fix/h14198-graph-labels-show-0-for-tiny-neg
Show 0 instead of -0 for tiny negative graph labels
2026-11-09 17:29:15 +08:00
BFlat c314ea25b9 Merge pull request #6293 from slafebre/fix/new-art-colorized-image
Follow-up to #6252: a selected colorized image gives new art its fill
2026-11-09 17:05:00 +08:00
HassanKhan 5bef0ed79a Part of #4936: custom dictionary and Ignore All commands
text.spelling.addWord, removeWord and changeWord are Check Spelling's Add
and Edit Custom Dictionary's Add, Delete and Change; text.spelling.dictionary
lists the words. They live in craft-proof, which every language's check
reads. The desktop app and vectorcraft-cli keep them in
`Custom Dictionary.txt` next to the preferences (none without preferences);
elsewhere they last until the app closes.

text.spelling.ignoreAll is Ignore All: the active document's checks skip the
word while it is open; not saved, not undoable, and not a change to the
document's revision.

Behaviour: https://helpx.adobe.com/illustrator/desktop/design-with-text/edit-format-text/check-and-correct-spelling.html
2026-11-09 13:54:08 +05:00
BFlat 036b19402c Merge pull request #6285 from dotCooCoo/fix/plugin-grant-app-approval
Plug-ins: permissions and a heavy budget need a person's approval or a start-up flag
2026-11-09 16:43:58 +08:00
NetterSilverandClaude Haiku 5.5 c147ae843b Show 0 instead of -0 for tiny negative graph labels
Found while testing crates/engine/src/cmd/graph/data.rs:166-172 (fmt_value)

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-09 08:39:21 +00:00
BFlat 1844904504 Merge pull request #6212 from Hassan1305/feat-4936-spell-check
Part of #4936: text.spelling.check lists unknown words, text.spelling.suggest suggests
2026-11-09 16:01:56 +08:00
dotCooCoo eebbe496d4 Merge main into fix/plugin-grant-app-approval 2026-11-08 23:53:57 -08:00
Sven Lafebre 8206f21912 Follow-up to #6252: a selected colorized image gives new art its fill
A grayscale image colorized with a fill color keeps that color outside its
appearance, so the check for art without paint treated it like an uncolorized
image and new art kept its old fill while the Fill proxy showed the color.
Count a colorize paint as paint: the image then loads like any object with a
fill and no stroke.
2026-11-09 08:52:02 +01:00
BFlat 0f2857e1a1 Merge pull request #6286 from dotCooCoo/fix/plugin-stale-grant
Plug-ins: replacing a granted plug-in with one that lists no permissions removes the grant
2026-11-09 15:41:04 +08:00
dotCooCoo 0efd9a9ccc Merge main into fix/plugin-grant-app-approval 2026-11-08 23:26:53 -08:00
BFlat c67cc90036 Merge pull request #6282 from dotCooCoo/fix/plugin-read-only-input-held-once
Plug-ins: a filter's read-only objects stay in its input and failed decodes count
2026-11-09 15:06:39 +08:00
HassanKhan 125ebe1c73 Merge remote-tracking branch 'upstream/main' into feat-4936-spell-check
# Conflicts:
#	docs/gaps.md
#	docs/roadmap.md
#	docs/target-app-parity.md
2026-11-09 12:03:20 +05:00
Drew Dibble b9dbd867f6 Canvas: a 3D effect changed on type or a group redraws where its solid was
When an edit changes an object, the canvas draws again only the area
the object painted before and after it, measured by its cull bounds.
Type and groups with Extrude & Bevel, Inflate or Rotate were measured by
their letters or members, not by the solid the effect draws, which
reaches well past them. Making the solid shallower or turning it left
pieces of the old solid on the canvas outside that area until the view
was drawn again.

An object with a 3D effect is now measured by the effect's art, as the
renderer draws it: with its geometry effects, each object in it with
the raster effects of its own fills and strokes and the art its brushed
strokes draw, grown by the reach of the object's own raster effects.
One function measures that art for every bounds the renderer and
exports take, where three copies of it disagreed.

- The renderer measures the art it draws. What it makes to measure an
  object it holds until the frame ends, with what the art read from
  outside the object (fonts, symbols, color settings), and keeps it
  with the art it draws if it draws the object while that is
  unchanged. Art measured but not drawn (culled, off the view) isn't
  kept. It holds at most as much as it keeps for the art it draws
  (64 MB); past that, an object is made again to draw it. An object
  whose 3D effect builds nothing (Revolve on a group, a solid too
  complex) is measured as it is drawn otherwise, as without a renderer.
  FrameStats::three_d_built counts the 3D art the renderer makes.
- The canvas measures what an edit changed through the renderer that
  drew the frame shown (Renderer::changed). When it draws the part on
  its own thread, it draws it with the art it made to measure it; when
  the render worker draws the frame, or nothing in view changed, that
  art is let go. Under Overprint Preview or Separations Preview, which
  draw copies of the objects, the edit is measured afresh. An object
  the frame doesn't draw (hidden, in a hidden group or layer, or
  hidden by the view) is measured as nothing, before and after, so an
  edit to it builds no solid: changed() without a renderer counts it as
  nothing too, where it measured it. The canvas measures the edit
  before it knows where the frame is drawn: when the worker draws it,
  the solids it built to measure it are built again there.
- Fit to Artwork Bounds, the Artboards panel's check for it and
  per-artboard SVG export measure every artboard through one renderer
  (Renderer::art_bounds_on, Renderer::effect_bounds), which keeps each
  object's bounds for the pass, a group holding 3D art or a hidden
  member included, so each solid is built once: 30 extruded type
  objects over 30 artboards take about 2 ms, where measuring their
  letters took under 1 ms and building each solid for each artboard
  would take 70 ms. Objects with brushed strokes, which culling leaves
  room for and exports don't, are measured on each artboard. The
  Artboard tool's canvas menu keeps whether Fit to Artwork Bounds has
  art to fit for the document's revision, where it measured it on
  every frame it was open.
- Other exports, Object › Rasterize and changed() without a renderer
  build the art on each call, as 3D paths and groups already did.
  Exports and Rasterize now take the solid of 3D type, where they
  cropped it to the letters, and the art its brushed strokes draw, not
  the room culling leaves for it. Rasterize on drawn 3D art measures it
  once while the art is kept.
- A shadow after a 3D effect, on the object or on a fill after the
  fill's own 3D effect, reaches past the solid once; it was counted
  twice.
- With Crop Marks or Vector Halftone, which draw other art, the object
  is measured by that art, as before.
- Culling leaves room for a 3D object's brushed strokes as for any
  object's, and the renderer measures a 3D object again when the brush
  library changes: a brush widened past that room would leave the
  object culled.

A document's first frame builds the solid of every 3D object, those off
the view too, to know whether it reaches into the view: 200 extruded
words with 150 off the view take about 12 ms, where measuring their
letters took 6 ms.

Type whose object effects leave it as it is (Revolve builds no art from
type) is measured by its own box grown to hold its glyphs, as plain
type is; it was measured by its box alone, which needn't hold them.
2026-11-08 23:17:50 -07:00
dotCooCoo c2753c1169 Merge main into fix/plugin-grant-app-approval 2026-11-08 22:17:36 -08:00
dotCooCoo b71b88b6b0 Merge main into fix/plugin-read-only-input-held-once
# Conflicts:
#	docs/plugins.md
2026-11-08 22:10:42 -08:00
dotCooCoo 65ff9df849 Plug-ins: a grant left behind stops counting when its module can't go back
plugin.install and plugin.remove count an entry of grants.json that this
version can't use when it can't be removed. plugin.install stops counting
a grant it can't remove when the old module can't be written back to the
Plug-ins folder.
2026-11-08 22:00:26 -08:00
ruchirguitarandCursor 7690e2e0ad M2.1: merge main again and keep path-deletion evidence (#3380)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-11-09 11:25:37 +05:30
dotCooCoo 1756672a20 Merge main into fix/plugin-stale-grant 2026-11-08 21:32:32 -08:00
dotCooCoo 7177438feb Plug-ins: plugin.install's params text and docs/mcp.md state when a grant is kept
A refused install keeps the grant, a failed write of the module to the
plug-in store leaves the grant in the store, and a stored module that is
disabled or not read in Safe Mode keeps the grant for its id. This
matches docs/plugins.md.
2026-11-08 21:26:13 -08:00
HassanKhan 82181ff0b1 Merge remote-tracking branch 'upstream/main' into feat-4936-spell-check
# Conflicts:
#	crates/engine/src/cmd.rs
#	docs/gaps.md
#	docs/roadmap.md
#	docs/target-app-parity.md
#	docs/type-parity.md
2026-11-09 10:25:12 +05:00
BFlat cc02f7b35e Merge pull request #4379 from dotCooCoo/fix/shape-builder-merge-off-ui-thread
Shape Builder: a large selection merges on another thread
2026-11-09 13:10:54 +08:00
dotCooCoo 391705af50 Merge main into fix/plugin-grant-app-approval 2026-11-08 21:10:29 -08:00
dotCooCoo 9ae57b03c0 Plug-ins: the texts say a grant accepted under the flag stays recorded
A grant accepted under --allow-plugin-grants is written to grants.json like a
person's approval and counts as approved in later sessions and in the desktop
app. The CLI usage text, the plugin.install params text and docs/plugins.md and
docs/mcp.md said only a person's approval in the desktop app records one.
2026-11-08 21:10:26 -08:00
BFlat 1b8f273255 Merge pull request #6277 from dotCooCoo/fix/titlebar-variable-doc
Linux: docs say which VECTORCRAFT_TITLEBAR values take precedence
2026-11-09 13:06:49 +08:00
dotCooCoo 7af608276e Merge main into fix/plugin-stale-grant 2026-11-08 21:00:56 -08:00
dotCooCoo e7c3307f07 Merge main into fix/plugin-grant-app-approval 2026-11-08 20:58:47 -08:00
dotCooCoo 0e1aa5cc2e Plug-ins: a filter's read-only objects stay in its input and failed decodes count
A filter run kept a second copy of every read-only object as JSON values.
The run now keeps where each object is in the input, and checks an output
entry against it by parsing that one object, unless the entry is `{"id": …}`
alone.

An image that reaches the decoder now counts toward the 16 MiB pixel total
even when decoding fails, so broken images use up the same total as images
that decode.

The plugin.run text, docs/mcp.md and the progress line state the paint
order and that rule, and docs/plugins.md states that a CMYK image's pixels
are sRGB. New tests cover the per-image 1 MiB, the 16 MiB pixel total and
the 16 MiB text total at and one past their values, memory-budget failures
before the plug-in starts, images that are not decoded, CMYK images
included, and leading per run.
2026-11-08 20:54:02 -08:00
BFlat a32bd3dc92 Merge pull request #6234 from dotCooCoo/fix/save-screens-unknown-options
Save: the save commands and Export for Screens refuse an unknown option key
2026-11-09 12:49:37 +08:00
BFlat baa7248e76 Merge pull request #5158 from dotCooCoo/fix/ai-os23-2831
.ai import: names that aren't UTF-8 can be read in a legacy code page
2026-11-09 12:46:30 +08:00
dotCooCoo 9e655ae2e6 Merge main into fix/plugin-stale-grant 2026-11-08 20:38:46 -08:00
dotCooCoo 6cce39dd7f Plug-ins: a grant that can't be removed stops counting for the session
When loading the plug-in store can't remove the grant of an id whose stored
module lists no permissions, or can't read grants.json, the entry stays on
disk and still approved the bytes it covers. plugin.install has the same case
when the grant can't be removed and no earlier module can be put back.

The session now keeps those ids and does not count their grants in
plugin.inspect, plugin.install, plugin.reload or a later load of the store. A
successful update of the grant for the id ends that, and so does attaching a
different store.
2026-11-08 20:38:03 -08:00
BFlat 5402f17f15 Merge pull request #6276 from dotCooCoo/fix/plugin-last-error-origin
Plug-ins: lastError keeps a failed run's error, and hit tests follow swatch changes
2026-11-09 12:26:56 +08:00
dotCooCoo 05e3b99bf7 Linux: comments say which VECTORCRAFT_TITLEBAR values take precedence 2026-11-08 20:24:12 -08:00
dotCooCoo fc728b909e Merge main into fix/shape-builder-merge-off-ui-thread 2026-11-08 20:23:21 -08:00