Commit Graph
9264 Commits
Author SHA1 Message Date
dotCooCoo eb30d6ef78 Tests: the torn-off strip test checks the palette windows were shown first
The drawer opens and closes before the strip and the toolbar, so the
test fails when the palette windows were already hidden, and opens again
at the end. The test checks the floating strip is the Pen group's and
the custom toolbar is Mine, shown.
2026-11-09 00:34:34 +07:00
dotCooCoo 5f0d3addf7 Tests: a torn-off strip or a new toolbar leaves the palette windows shown
The hidden-toolbar test now expects exactly one show command when the
flyout stops drawing, and the comment at palette_window_levels names
the All Tools drawer.
2026-11-09 00:34:34 +07:00
dotCooCoo f8977285cc .ai import: the editing-copy paragraph appears once
docs/file-format-parity.md held 17 copies of the paragraph under
"Illustrator's private editing data", and they disagreed about what
import reads. The section now holds one copy with every clause from
the others: a filled clipping path keeps its fill, with the exceptions
for multi-layer masks and compound clipping paths whose subpaths paint
differently; paths with an Art brush; the spot colors in brush art and
their limits; symbols defined before the art styles section; and the
Type on a Path options of type on a path. Each clause was checked
against crates/eps/src/import.
2026-11-09 00:34:29 +07:00
dotCooCoo cca9a42c6c Effects: Effect › SVG Filters applies the document's SVG filters as live effects
Squashed from #6200 onto main.
2026-11-09 00:34:23 +07:00
dotCooCoo b9aacded51 Tests: placed gradient tests check the whole gradient after Transform and Free Distort
The baked Transform and Free Distort tests now compare each placed
gradient's start, end, aspect and focal point with the expected values
within a tolerance, and the Transform test adds a turn with a scale.
2026-11-09 00:34:12 +07:00
dotCooCoo 732434b4e5 Effects: placed gradients move with Transform and Free Distort effects
A gradient placed with the Gradient tool stayed where it was when the
object's Transform or Free Distort effect moved, turned or scaled the
outline, so the shape slid across its own gradient.

The Transform effect now maps placed gradients by its own transform,
and each of its copies takes them as many times as it takes the
transform. Under Free Distort, each path's placed gradients move and
scale from the path's bounds before the effect to its bounds after it.
This change does not alter gradients fitted to the object.

The canvas, Expand Appearance and export, Pathfinder and compound
shapes, groups, a fill's or stroke's own effects, and Object › Expand
of a gradient fill apply the same rule. In a group, the own fills and
strokes of the group, of the groups inside it and of a symbol's art
follow it too, and images and symbol instances that a group's
Transform effect moves take the placed gradients of their own fills
and strokes along. A group whose path keeps its shape because the
effect would pass the geometry budget keeps its own gradients in
place.

This changes how existing documents draw: a gradient placed on a path,
or on an image's or symbol instance's own fill, inside a group with a
Transform effect now moves with it. Before, only the gradients of type
moved (#2214).

How gradients follow each effect is VectorCraft's own rule. The
Distort & Transform help page describes what the effects do to the
object:
https://helpx.adobe.com/illustrator/desktop/manage-objects/reshape-transform-objects/distort-and-transform-effects-in-illustrator.html
2026-11-09 00:34:12 +07:00
dotCooCoo 332e115b68 Plug-ins: the bulk memory fuzz generators follow the paint generators
Moves the bulk memory case types, strategies and their test after arb_paint, so they no longer share the lines after output where other fuzz generators are added.
2026-11-09 00:31:14 +07:00
dotCooCoo 44432a4310 Plug-ins: the fuzz test generates bulk memory operations
plugin_fuzz now builds plug-ins whose run executes memory.fill,
memory.copy (overlapping ranges included), memory.init followed by
data.drop, and data.drop followed by memory.init. Lengths and offsets
are sampled at zero, small, page and mebibyte sizes, at an exact end,
one before and one past it, with copy sources and destinations and init
memory and segment offsets chosen separately. Fill and copy can repeat
up to about one fuel slice of copying.

Each case runs directly under the default budget, a small fixed budget
or one near its estimated cost. A run must trap exactly when a range
leaves memory or the data segment (empty once dropped), and must finish
when it is in bounds and has ample fuel; otherwise it may hit the
instruction budget. The same plug-in then runs through plugin.run: a
failed run leaves the document unchanged and the document still renders
and exports.

bulk_memory_cases_reach_their_instruction checks that each operation's
module contains its instruction and traps on a small out-of-bounds case.
2026-11-09 00:31:14 +07:00
dotCooCoo 51bab66409 Envelopes: document how a straight segment's handles count in the top object corner test
A top object's corner test treats a straight segment as having its
handles a third of the way along it, so an anchor between two straight
segments is a corner only when it turns out of the outline. docs/mcp.md
and the doc comment now say so, and a new test covers an inward anchor
between straight segments. The bulging-curve corner test checks against
a fixed point instead of the same nearest-point routine the code uses.
2026-11-09 00:31:07 +07:00
dotCooCoo ed6c0d434f Envelopes: a top object's corners keep their saved anchors when reflected
Saved corners from an .ai file stay on the same anchors when the
envelope is reflected, as they already did when it was moved or
rotated. A reflected outline runs counter-clockwise; the corners were
then mapped as if the outline had been drawn the other way round, no
longer fit it, and were found again from the outline.

On a tie between two corner anchors, or two nearest outline points,
the one met first along the outline in the order it was drawn wins,
for outlines drawn counter-clockwise too.

The docs state the corner rule in full: a handle 0.01 pt long or
shorter makes an anchor a corner whichever way it turns; otherwise its
tangent unit vectors must differ by 0.01 or more in x or y and turn
out of the outline. Content spreads evenly along a segment without
handles.
2026-11-09 00:31:07 +07:00
dotCooCoo 75a328f8b1 Docs: a top object's corner anchor needs a short handle or an outward turn
An anchor with a handle shorter than 0.01 pt counts as a corner of a top
object whichever way it turns; only an anchor whose tangents differ must
turn out of the outline. docs/mcp.md and the progress line in
docs/target-app-parity.md now say so.
2026-11-09 00:31:07 +07:00
dotCooCoo 63dfcba8ba Envelopes: a top object's sides share the content by control polygon length
A top-object envelope splits its outline into four sides at four corners
and maps the content onto the Coons patch of those sides. The sides
shared out the content by length, and the corners were the anchors or
curve points nearest the bounding box corners.

Each piece of a side between anchors and corners now takes a share of the
content's width or height in proportion to the length of its control
polygon, spread along the piece by its curve parameter. A straight
segment spreads it evenly by length. A rounded rectangle stays close to
the identity, and the content follows the curves of a side whose segments
differ in size.

Each corner is now the nearest anchor to its bounding box corner among
the sharp anchors that point out of the outline and lie within 47.5% of
the box's width and height from that corner. A handle shorter than
0.01 pt, or tangent unit vectors that differ by 0.01 or more in x or y,
makes an anchor sharp, and the first one along the outline wins a tie.
Without such an anchor, the corner is the outline's nearest point to the
box corner, moved onto the end anchor of its segment within 0.5% of the
segment's parameter. Envelopes opened from .ai files keep the corners the
file saves.

These are VectorCraft's own rules. Existing top-object envelopes redraw by
them. Gradient meshes made from a path keep their sides measured by length.

- crates/doc/src/live/mesh.rs: Coons::from_top_object and the corner
  search, used for top-object envelopes.
- EnvelopeKind::TopObject gains an optional `corners` field (anchor
  indices); the .ai importer fills it from the mesh's corners.
- Params text of object.envelope.makeWithTopObject, docs/mcp.md
  (Envelopes) and a progress line in docs/target-app-parity.md.
2026-11-09 00:31:06 +07:00
dotCooCoo be0e9347b8 Path ops: Merge finds every fill's faces in a few contour passes instead of one per fill
Squashed from #6191 onto main.
2026-11-09 00:30:43 +07:00
dotCooCoo b5e6f6e80f Plug-ins: Safe Mode starts without plug-ins, offered after a launch stops while one loads
Squashed from #6185 onto main.
2026-11-09 00:30:24 +07:00
dotCooCoo bf1145edd5 JavaScript: vectorcraft-js runs ES5 scripts with a garbage-collected heap and execution limits
Squashed from #6178 onto main.
2026-11-09 00:29:52 +07:00
dotCooCoo 581ced3213 Transform: Align to Pixel Grid keeps an object's horizontal and vertical edges on the pixel grid
Squashed from #6169 onto main.
2026-11-09 00:29:28 +07:00
dotCooCoo b568977af4 Asset Export: 3D objects export as USDA, USDZ, glTF or OBJ meshes
Squashed from #6168 onto main.
2026-11-09 00:29:05 +07:00
dotCooCoo 657a99b629 Actions: Load Actions… reads action sets saved as .aia files
Squashed from #6149 onto main.
2026-11-09 00:28:25 +07:00
dotCooCoo f74c7e8056 Path ops: region building lists the shapes covering each region instead of a flag per shape
Squashed from #6144 onto main.
2026-11-09 00:28:12 +07:00
dotCooCoo f2e6c6d219 .ai save: the editing copy keeps symbols and their instances
Squashed from #6136 onto main.
2026-11-09 00:28:03 +07:00
dotCooCoo 1d007bc3c8 Artboard tool: buttons on the selected artboard's edges add an artboard beside it
Squashed from #6111 onto main.
2026-11-09 00:27:52 +07:00
dotCooCoo fb413b39f3 Title bar: a Linux and BSD preference uses the app bar where the desktop draws the frame
Squashed from #6101 onto main.
2026-11-09 00:27:21 +07:00
dotCooCoo e9ee87b7cd i18n: error messages in every catalog keep true, false, null and the keys they name
Squashed from #6100 onto main.
2026-11-09 00:27:03 +07:00
dotCooCoo c0a8ebb70f Graphs: graphic styles and Default and Swap Fill and Stroke update a series' stored paint
Squashed from #6094 onto main.
2026-11-09 00:26:44 +07:00
dotCooCoo a409f34ebe .ai import: placed PDF and .ai pages open as placed documents
Squashed from #6083 onto main.
2026-11-09 00:26:34 +07:00
dotCooCoo 434c032f9e Symbols: Direct Selection sets the solid fill and stroke of one object in a dynamic instance
Squashed from #5962 onto main.
2026-11-09 00:26:11 +07:00
dotCooCoo 122b10143c Layers: a document opened after a close keeps its thumbnail jobs
Closing a document told the worker to forget every row whose document was
not open at that moment. The worker keeps that test until it is idle, so
while a job still ran, a document opened afterward had its rows dropped
and they stayed without thumbnails. The worker now forgets only the
documents that closed.
2026-11-09 00:25:58 +07:00
dotCooCoo cd8e98c6cd DXF: a CNC / CAM preset sets the export options for cutting software
Squashed from #5500 onto main.
2026-11-09 00:25:53 +07:00
dotCooCoo d61a7abc96 Save: include a PDF in new native files by default
Squashed from #5320 onto main.
2026-11-09 00:25:34 +07:00
dotCooCoo f5be571d47 .ai import: Bas Relief opens with its settings
Squashed from #5227 onto main.
2026-11-09 00:25:27 +07:00
BFlat 0b0d2f0ab7 Merge pull request #5557 from dotCooCoo/fix/vertical-path-upright-glyphs
Type: upright glyphs on a vertical path face the path's start, so ligatures read in order
2026-11-09 01:19:05 +08:00
BFlat d4e9d0d6f4 Merge pull request #5518 from dotCooCoo/feat/open-heic-files
File formats: HEIC and HEIF images open and place
2026-11-09 01:18:45 +08:00
BFlat 6ff760dbb1 Merge pull request #5395 from dotCooCoo/fix/toolbar-left-panel-docking
Workspace: add an option to keep Tools beside the canvas with left-side panels
2026-11-09 01:18:27 +08:00
BFlat 96d15708b2 Merge pull request #5313 from dotCooCoo/feat/marquee-selection-qol
Selection QoL: marquee modes with visible feedback
2026-11-09 01:18:09 +08:00
BFlat 1ba7b826b7 Merge pull request #5220 from dotCooCoo/feat/document-info-pattern-objects
Document Info: Pattern Objects lists the objects painted with patterns
2026-11-09 01:17:48 +08:00
BFlat ca24db3e96 Merge pull request #5211 from dotCooCoo/fix/brand-mark-under-desktop-frame
Title bar: the app bar shows no brand mark under the desktop's own frame
2026-11-09 01:17:32 +08:00
BFlat 2cbe9209a2 Merge pull request #5202 from dotCooCoo/fix/family-escape-restores-options
Drawing tools: Escape on an arc, spiral or grid drag puts back the options it changed
2026-11-09 01:17:21 +08:00
BFlat be3285ff7d Merge pull request #5196 from dotCooCoo/fix/perspective-snap-mixed-depths
Perspective grid: Snap to Grid moves objects at every depth by one plane offset
2026-11-09 01:17:03 +08:00
BFlat d360c35d8c Merge pull request #5041 from dotCooCoo/feat/function-keys-cut-copy-paste-r
Shortcuts: F2, F3 and F4 also cut, copy and paste on Windows and Linux
2026-11-09 01:16:47 +08:00
BFlat 41b996b299 Merge pull request #5040 from dotCooCoo/feat/typed-markers-distinct-bullets-r
Type: typed `+`, `#` and `>` start lists with a hollow circle, square and dash
2026-11-09 01:16:32 +08:00
BFlat d6ec81bc82 Merge pull request #5039 from dotCooCoo/feat/typed-lists-preference-r
Type: add a VectorCraft preference for typed list detection
2026-11-09 01:16:16 +08:00
BFlat 0cdec14ccc Merge pull request #5034 from dotCooCoo/fix/image-cache-follows-memory-r
Render: the decoded-image cache can grow to a quarter of installed memory on every desktop OS
2026-11-09 01:15:58 +08:00
BFlat 7feb683ca6 Merge pull request #5027 from dotCooCoo/feat/type-orientation-follows-thread-r
Type: Type Orientation is a setting of the whole thread
2026-11-09 01:15:39 +08:00
BFlat 7d7d6f8d21 Merge pull request #5025 from dotCooCoo/fix/paragraph-reset-panel-mojikumi-tabs-r
Paragraph: Reset Panel also resets the Mojikumi Set and tab stops
2026-11-09 01:15:22 +08:00
BFlat 0121890cba Merge pull request #5023 from dotCooCoo/feat/wheel-ctrl-scrolls-sideways-r
Canvas: a General option makes Cmd/Ctrl-wheel scroll the canvas sideways
2026-11-09 01:15:04 +08:00
BFlat 970150b01a Merge pull request #5015 from dotCooCoo/fix/batch-save-close-data-sets
Actions: Batch over data sets keeps Save and Close and warns when each data set saves over one file
2026-11-09 01:14:45 +08:00
BFlat 8e1a35daa2 Merge pull request #4058 from dotCooCoo/feat/trace-expand-by-color
Image Trace: Expand can group the traced paths by color
2026-11-09 01:14:26 +08:00
BFlat 8cd371e1fc Merge pull request #3995 from dotCooCoo/feat/document-compare-image
Document: document.compare measures how far an artboard's render is from an image
2026-11-09 01:14:08 +08:00
BFlat 90506ff84e Merge pull request #3946 from dotCooCoo/feat/flat-logo-named-colors-only
Image Trace: Flat Logo can trace only the named colors, without a white of its own
2026-11-09 01:13:52 +08:00
BFlat 38a019a47e Merge pull request #2642 from dotCooCoo/fix/one-text-variable-per-object
Variables: a second text variable on one type object is refused
2026-11-09 01:13:32 +08:00