Commit Graph
10785 Commits
Author SHA1 Message Date
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 1bca14355d Merge pull request #6031 from mockydevs/fix/eps-cid-fonts
EPS import: CID-keyed fonts draw the glyphs of the CIDFonts the file carries
2026-11-09 17:29:02 +08:00
Drew Dibble d8472b2acc Canvas redraw: a trace object's source in each version; review follow-ups
Review of #6290.

- An Image Trace object's hidden source image counts as shown in each
  version by that version's own first member: an edit that puts it
  first again (undoing Send to Back on a traced shape), or a new source
  image in its place, redraws where it shows. Tested with an image
  source on screen with the objects' views.
- A shape of an Image Trace object in Outline view is left out by the
  rule every object is (node_checks::left_out), so the drawing and the
  measure of an edit can't disagree.
- The renderer keeps the brush library's key from its first measure of
  3D art until the library changes; the test says so, and that a change
  lets it go.
- The test of a 3D effect that builds nothing covers it on a fill and
  on a stroke, without effects of the object's own (exactly as without
  it) and under a raster effect.

On the commit before, "Canvas: a 3D effect on a fill that builds nothing
draws without it": it needs no effect of the object's own. A 3D effect
on a fill or stroke that builds nothing overflowed the stack on its own
too. With a raster effect, the object now draws from its art, where
without the 3D effect it draws as a path, whose raster effects are
clipped to the path's own geometry, cutting off the item's Roughen
spikes: the new drawing is the one that keeps them.
2026-11-09 02:18:53 -07:00
adambelis 585621a661 Blend: the spine keeps only the subpath it samples
Spine stored a full clone of the blend's PathData but only ever read its
first subpath. Store that SubPath instead, which drops the extra
allocation and makes the field's purpose clear. Document the field and
the two cases where Spine::new returns None.
2026-11-09 10:06:49 +01: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
Don Omondi f71c6aaf5b EPS import: CIDFonts only named, over a Unicode CMap, set their characters as live type
A CMap name of the public Unicode CMap form (UniJIS-UCS2-H, UniGB-UTF16-H
and similar) is understood without being defined in the file, so type in a
CIDFont the file only names decodes to its Unicode characters and is set as
live type.
2026-11-09 03:48:35 -05:00
Don Omondi dc00c31a24 EPS import: CMap mappings to base fonts' codes and glyph names draw their glyphs
bfchar and bfrange mappings are kept in the CMap and carried over by
usecmap. A code mapped to a character code draws that code in the base font
usefont named; a code mapped to a glyph name draws that glyph.
2026-11-09 03:48:35 -05:00
Don Omondi eb8b8b2850 EPS import: kshow runs its procedure between the characters of live type
Between each two characters the kshow procedure runs with the two codes and
the current point after the first, in any font, not only Type 3 fonts. Where
it moves the current point the next character follows, kept as tracking.
2026-11-09 03:48:35 -05:00
Don Omondi fde5a5fbef EPS import: CID-keyed fonts draw the glyphs of the CIDFonts the file carries
Adds composefont, the CIDInit and FontSetInit procedure sets and the CMap
operators, so EPS with CID-keyed fonts (as pdftops -level3 writes) opens.
Type 0 fonts with FMapType 9 decode their codes through the CMap's codespace
ranges and CID mappings, and the Identity CMaps are predefined.
2026-11-09 03:48:35 -05:00
Don Omondi 6854529b83 EPS import: CID-keyed fonts in a FontSet's CFF data draw their glyphs
Each CID-keyed font in a FontSet's CFF data is defined as a CIDFont named by
the CFF Name INDEX, with its glyphs found by CID through the charset and
FDSelect, so a composefont over it draws its type.
2026-11-09 03:48:35 -05:00
Don Omondi 1b7c648da6 EPS import: embedded Type 1 fonts draw and space their type with their own glyphs
An embedded Type 1 font's eexec part is decrypted and its charstrings read,
so its glyphs and widths are used instead of the installed or fallback
font's. Codes are decoded through the font's Encoding, so fonts that place
glyphs at low codes no longer lose their type.
2026-11-09 03:48:35 -05:00
Don Omondi 7a25b86a75 EPS import: Type 42 fonts take their characters and widths from the font they carry; show spacing kept as tracking
A plain Type 42 font now maps each code to its character through its glyph
names, or through the glyph its CharStrings give it in the font's own
character map or post names, instead of reading the code as Latin-1. The
font's own widths move the current point, charpath outlines its glyphs, and
the show operators' spacing and the embedded widths are kept on live type as
tracking. Type shown under nulldevice no longer appears.
2026-11-09 03:48:35 -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 939e4d3f70 Merge pull request #6291 from dotCooCoo/fix/update-dialogs-block-input
Updates: the update dialogs hold the keyboard and floating windows, and updates wait for running work
2026-11-09 16:21:02 +08: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 5a9611446a Merge pull request #6289 from dotCooCoo/fix/new-document-field-names
New Document: screen readers hear each Preset Details field's name
2026-11-09 15:49:38 +08:00
BFlat 4c37ca8597 Merge pull request #6019 from mockydevs/fix/eps-memory-cap
EPS import: an image's transient data stops counting against the memory budget
2026-11-09 15:45:18 +08:00
Drew Dibble d5d04f8684 Canvas: a 3D effect on a fill that builds nothing draws without it
An object with an effect of its own (Drop Shadow, Roughen) and a 3D
effect on its fill or stroke that builds nothing (Revolve after
Roughen, a solid too complex) overflowed the stack when drawn, on the
canvas and in Object › Rasterize: the art made for the object kept the
item's 3D effect, so drawing it drew it as an object with effects again,
and that art again, without end.

That art now leaves out the 3D effects on its fills and strokes when
none built anything, as a group's or layer's own are left to the art of
each fill or stroke. The fill draws as without the effect; with a raster
effect the object draws from that art, so its edges differ a little
from the same object without the 3D effect, drawn as a path.
2026-11-09 00:44:21 -07: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 8b52066f13 Updates: the update dialogs hold the keyboard and floating windows, and updates wait for running work
The update prompt and the modal result window were not treated as
modal: Delete, a tool key and Copy reached the document behind them,
and a floating panel's window kept taking keys. The shortcut handler,
modal_open, the IME route and the return from a held tool key now stop
for them as they do for a dialog. When a check at startup opens the
prompt while a floating document's OS window has the keyboard, the
main window takes it. The Updated notice is not modal.

An update now starts installing, and a ready update closes the app,
only when no save or export, file opening, plug-in filter, Image Trace
or action playback is running, no dialog or file dialog is open, and
no tool is dragging or computing an edit. Clicking the update button
during one of these shows the existing note "Save or close your open
work first; the update restarts the app."
2026-11-08 23:37:57 -08:00
Drew Dibble 3617c678b7 Canvas redraw: what the renderer leaves out measured as nothing, alike
Review of #6290.

- An edit is measured as the renderer draws: an object it leaves out
  (hidden, a template layer or guide the view hides, drawn hidden, the
  instance a symbol is edited from) is measured as nothing, by one
  predicate the renderer and the measure share (node_checks::left_out,
  before culling).
- An Image Trace object's members are compared one by one again, its
  hidden source image, which some views draw, counted as shown: moving
  the source redraws where it was and is, and recoloring a traced shape
  redraws only the shape.
- The renderer checks the brush library between frames only while it
  keeps bounds measured with brushed strokes in 3D art.
- Tests: the sweep of 3D art's bounds counted while the art is held,
  and Fit to Artwork Bounds' menu answer kept for a revision.
2026-11-09 00:29:06 -07:00
dotCooCoo 0efd9a9ccc Merge main into fix/plugin-grant-app-approval 2026-11-08 23:26:53 -08:00
BFlat 09f82b95ce Merge pull request #6288 from dotCooCoo/fix/plugins-pixels-omitted-note
Plug-ins: docs limit the 64 MiB decoder note to non-CMYK images
2026-11-09 15:20:18 +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
BFlat fe56acd3c9 Merge pull request #6287 from vecteza/fix/tools-dock-side-type
Workspace: window.panel.dock rejects a Tools side that isn't text
2026-11-09 15:02:02 +08:00
dotCooCoo 004805172a Docs: cite the Safe Mode regression for the plug-in grant entry 2026-11-08 23:00:11 -08:00
dotCooCoo 26522b27b5 New Document: screen readers hear each Preset Details field's name
The fields under Preset Details had captions drawn above them but no accessible name. Each field is now named by its caption, and the units dropdown beside Width is named Units. Preset Name is also named in More Settings.
2026-11-08 23:00:08 -08:00
Don Omondi 1d9833f7de Merge remote-tracking branch 'upstream/main' into fix/eps-memory-cap
# Conflicts:
#	docs/file-format-parity.md
2026-11-09 01:53:05 -05:00
BFlat a4279323c9 Merge pull request #6078 from ruchirguitar/fix/3380-split-deleted-paths
M2.1: split ordinary path objects after deletion
2026-11-09 14:50:26 +08:00
BFlat 977ce06c10 Merge pull request #6018 from mockydevs/fix/eps-sampled-function-shading
EPS import: sampled functions interpolate between their samples (function shadings no longer come in as flat blocks)
2026-11-09 14:45:38 +08:00
HassanKhan f3bad1682c Merge remote-tracking branch 'upstream/main' into feat-4936-spell-check
Language per character rows in docs/type-parity.md: spelling is no longer listed as not yet done, and the hyphenation note names the languages that still lack it.
2026-11-09 11:42:44 +05:00
dotCooCoo d7f017e889 Plug-ins: docs limit the 64 MiB decoder note to non-CMYK images
The image decoder limit in rgba_pixels does not apply to CMYK images, which cmyk_rgba reads. Keep the separate case of a TIFF the host rejects as too large.
2026-11-08 22:38:51 -08:00
dotCooCoo a13cc6008f Merge main into fix/plugin-stale-grant 2026-11-08 22:18:36 -08: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 950d149e45 Plug-ins: test that run and mcp need the start-up flag for allowHeavy 2026-11-08 22:16:35 -08:00
ruchirguitarandCursor e342a1ce0c M2.1: merge main and keep path-deletion evidence (#3380)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-11-09 11:43:22 +05:30
dotCooCoo 2d81576747 Merge main into fix/plugin-read-only-input-held-once 2026-11-08 22:10:47 -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
BFlat 4bde73708e Merge pull request #6215 from ruchirguitar/SidePanelCollapseArrow
Add collapse-to-icons arrows to floating panels and rail flyouts
2026-11-09 14:09:43 +08:00
vecteza 2336e52e2e Workspace: window.panel.dock rejects a Tools side that isn't text
side: 5 (or true, or a list) docked Tools on the side it docked at last;
it is now an error like any other side but left/right/Start/End, and leaves
the panel where it is. null still means the last side.
2026-11-09 11:06:10 +05:00
dotCooCoo cd7dd5f3cc Merge main into fix/plugin-stale-grant 2026-11-08 22:03:18 -08:00
BFlat 17aec531d1 Merge pull request #6284 from dotCooCoo/fix/new-document-name-caption
New Document: the name field is labeled Document Name
2026-11-09 14:02:12 +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