Commit Graph
9473 Commits
Author SHA1 Message Date
dotCooCoo 438f1cd8f2 Plug-ins: importer tests use American spelling 2026-11-08 15:35:45 -08:00
dotCooCoo 3a7667a476 Merge main into feat/plugin-importers 2026-11-08 15:19:59 -08:00
dotCooCoo 421189893f Plug-ins: composite fonts stay out of importer filters; base64 size is checked first
File › Open imports .vccomposite files as composite fonts, so an importer
listing that extension no longer shows it under its own filter or in
document.formats. File › Open gets a Composite fonts filter.

document.open refuses dataBase64 that decodes past the importer input
limit before decoding it. A file whose start shows a built-in format
still opens as that format, as it does by path.
2026-11-08 15:18:31 -08:00
BFlat 205f54a7cb Merge pull request #6254 from adambelis/fix/blend-curved-spine-orientation
M2.1: blend Align-to-Path smooth on curved spines
2026-11-09 06:27:53 +08:00
bflatastic 8e45313501 Blend: the spine's ends are its exact end points 2026-11-09 05:06:28 +07:00
bflatastic d58000b5df Objects on Path: the stretched-group test allows the spine's rounding 2026-11-09 04:52:48 +07:00
dotCooCoo ceca6fa796 Merge main into feat/plugin-importers 2026-11-08 13:46:41 -08:00
dotCooCoo d1afb688cf i18n: French rows keep the no-break space before punctuation 2026-11-08 13:46:39 -08:00
bflatastic 863023d7de Blend: a vanished spine tangent takes the curve's direction nearby; the unreachable copy after the loop goes 2026-11-09 04:45:17 +07:00
adambelisandCraft Bot 2709a5191f M2.1: blend Align-to-Path smooth on curved spines
Spine::at_length computed tangents from flattened polyline chords, which
are piecewise constant and jump discretely between chords on curved
spines. Steps oriented to the spine with Align to Path stuttered at
large step counts.

Fix: store the original PathData in Spine and compute the tangent from
the original cubic at the true arc-length position via ParamCurveDeriv,
proportionally mapping flattened arc-length s onto each segment's curve
arclength using anchor_length values, instead of using piecewise-constant
chord directions.

Updated segment-selection condition in Spine::at_length to skip segments
whose flattened end is not greater than start before checking whether s is
within the segment. Preserve the existing final-segment fallback so
at_length(0.0) selects a nonzero segment and uses its tangent.

Added zero-derivative fallback tangent for blend-step sampling to keep
Align to Path from passing a zero tangent to atan2.

Added missing docstrings for Spine::new and Spine::length to satisfy
docstring coverage requirements.

Co-authored-by: Craft Bot <bot@storytold.dev>
2026-11-09 04:42:48 +07:00
adambelisandCraft Bot cb5300415a M2.1: blend Align-to-Path smooth on curved spines
Spine::at_length computed tangents from flattened polyline chords, which
are piecewise constant and jump discretely between chords on curved
spines. Steps oriented to the spine with Align to Path stuttered at
large step counts.

Fix: store the original PathData in Spine and compute the tangent from
the original cubic at the true arc-length position via ParamCurveDeriv,
proportionally mapping flattened arc-length s onto each segment's curve
arclength using anchor_length values, instead of using piecewise-constant
chord directions.

Updated segment-selection condition in Spine::at_length to skip segments
whose flattened end is not greater than start before checking whether s is
within the segment. Preserve the existing final-segment fallback so
at_length(0.0) selects a nonzero segment and uses its tangent.

Added missing docstrings for Spine::new and Spine::length to satisfy
docstring coverage requirements.

Co-authored-by: Craft Bot <bot@storytold.dev>
2026-11-09 04:42:48 +07:00
adambelisandCraft Bot b8d23e280b M2.1: blend Align-to-Path smooth on curved spines
Spine::at_length computed tangents from flattened polyline chords, which
are piecewise constant and jump discretely between chords on curved
spines. Steps oriented to the spine with Align to Path stuttered at
large step counts.

Fix: store the original PathData in Spine and compute the tangent from
the original cubic at the true arc-length position via ParamCurveDeriv,
proportionally mapping flattened arc-length s onto each segment's curve
arclength using anchor_length values, instead of using piecewise-constant
chord directions.

Added missing docstrings for Spine::new and Spine::length to satisfy
docstring coverage requirements.

Co-authored-by: Craft Bot <bot@storytold.dev>
2026-11-09 04:42:48 +07:00
adambelisandCraft Bot 5589049a47 M2.1: blend Align-to-Path smooth on curved spines
Spine::at_length computed tangents from flattened polyline chords, which
are piecewise constant and jump discretely between chords on curved
spines. Steps oriented to the spine with Align to Path stuttered at
large step counts.

Fix: store the original PathData in Spine and compute the tangent from
the original cubic at the true arc-length position via ParamCurveDeriv,
proportionally mapping flattened arc-length s onto each segment's curve
arclength using anchor_length values, instead of using piecewise-constant
chord directions.

Reviewed-by: craft-house-rules

Co-authored-by: Craft Bot <bot@storytold.dev>
2026-11-09 04:42:48 +07:00
Adam Belis 4851736364 M2.x: blend Align-to-Path smooth on curved spines
Spine::at_length computed tangents from flattened polyline chords, which
are piecewise constant and jump discretely between chords on curved
spines. Steps oriented to the spine with Align to Path stuttered at
large step counts.

Store the original PathData in Spine and compute the tangent from the
original cubic at the true arc-length position via ParamCurveDeriv,
instead of flattened chord directions.

Adds a regression test walking 200 samples along a curved spine and
asserting each tangent step stays under 0.1 radians.
2026-11-09 04:42:48 +07:00
BFlat 61dacea80b Merge pull request #6256 from dotCooCoo/fix/svg-filter-export-size-limit
SVG Filters: export writes a filter live only when import can read it back
2026-11-09 05:42:18 +08:00
BFlat cef382f16a Merge pull request #6255 from dotCooCoo/fix/svg-outlined-text-label
SVG export: outlined type keeps its text as an accessible name
2026-11-09 05:42:04 +08:00
BFlat 1f496af57d Merge pull request #6251 from dotCooCoo/fix/3d-export-unit-normals
3D export: Revolve mesh normals are unit length and short walls face out
2026-11-09 05:41:50 +08:00
BFlat 21a55f3d8a Merge pull request #6235 from dotCooCoo/fix/prefs-dialog-cfg-clippy
Preferences: the settings filter builds without a clippy warning on macOS
2026-11-09 05:41:36 +08:00
BFlat ee922537fc Merge pull request #6232 from dotCooCoo/fix/instance-appearance-kinds
Symbols: symbol.instance.setAppearance refuses a fill or stroke an object does not draw
2026-11-09 05:41:21 +08:00
dotCooCoo 83248b9bb4 SVG Filters: export writes a filter live only when import can read it back
SVG export wrote an SVG filter as a live <filter> when its SVG 1.1 form
was at most 64 KB, without counting the region and id it writes into
it. A filter close to the limit came back over it, SVG import dropped
it, and the reopened object had no filter.

Export now leaves room for the id and the measured region, checks the
SVG 1.1 form the way import does, and counts each character past U+00FF
as the character reference Latin-1 output writes. A filter that does not
fit is exported as the other pixel effects are. The SVG 1.1 form and its
check are kept for the filters seen last, as checked filters already
are, so export does not check one filter again for each object.
2026-11-09 04:19:44 +07:00
dotCooCoo 0e7bd10033 SVG export: outlined type keeps its text as an accessible name
Type that SVG text can't draw is written as outlines: vertical type, ruby,
right-to-left text, type on a path with an effect other than Rainbow, an end
bracket, Align to Path, Spacing, hanging punctuation, bullets or inline
graphics. Only glyphs bent along a path gave the outlined group a
`role="img"` and `aria-label`; every other case left screen readers and
search with no text. Each of them now names the group with its text.
Convert to Outlines still writes the paths alone, as before.

Inline graphics' placeholder characters stay out of the name, and empty
type gets none. An object whose id is its name also gets `data-name`, so
opening the file again keeps the name instead of taking the label.
2026-11-09 04:19:41 +07:00
dotCooCoo 61f83dc439 3D export: the revolve normals test checks each wall has triangles
An empty mesh passed the unit-normal, closed and outward checks without
testing a wall. The test now asserts that each revolve makes triangles.
2026-11-09 04:19:38 +07:00
dotCooCoo 88626a9194 3D export: Revolve mesh normals are unit length and short walls face out
Revolve gave each side face a normal as long as its profile edge, and
the mesh kept that length, so the glTF, OBJ and USD files of a revolved
object carried normals of any length (100 for a wall 100 pt tall). A
face whose edge was shorter than about 0.71 pt fell back to its corners'
normal, which turns inward when the profile is drawn the other way, and
its triangles then faced into the solid.

The mesh now scales every given normal to unit length before choosing
between it and the corners' normal.
2026-11-09 04:19:38 +07:00
dotCooCoo ef65f0fed4 Preferences: the settings filter builds without a clippy warning on macOS
Squashed from #6235 onto main.
2026-11-09 04:19:35 +07:00
dotCooCoo 1e21154e4d Symbols: symbol.instance.setAppearance refuses a fill or stroke an object does not draw
Squashed from #6232 onto main.
2026-11-09 04:19:25 +07:00
BFlat d9eb644bc6 Merge pull request #4595 from onion3130/fix/4466-double-click-hermetic
Exit isolation on empty double-click with Direct Selection (#4466)
2026-11-09 05:17:28 +08:00
onion3130 eaab4fd516 Trim to hermetic font test only (Source Sans 3, not Inter) 2026-11-09 04:02:29 +07:00
dotCooCoo 6d87858e2b Merge main into feat/plugin-importers 2026-11-08 13:00:01 -08:00
dotCooCoo 36bca85879 Plug-ins: app.open passes params to the importer File › Open picks
app.open with params and no importer ran file.open with the path alone, so the desktop app ran the importer on its defaults while headless app.open passed the params to document.open. file.open now carries params to the importer that opens the file.

The importer parameters test installs its module with replace from the second pass on, as plugin.install requires. The permission table in docs/plugins.md lists doc.read for filter, effect and exporter.
2026-11-08 12:59:17 -08:00
BFlat f0d5a6622a Merge pull request #5037 from dotCooCoo/feat/list-levels-r
Type: Tab and Shift+Tab move a list item down and up a level
2026-11-09 04:54:52 +08:00
BFlat 13e5704dc9 Merge pull request #3952 from dotCooCoo/feat/trace-ignore-background-only
Image Trace: Ignore Color can leave out only the background
2026-11-09 04:54:36 +08:00
dotCooCoo 7b8d5ba8f5 Type: Tab and Shift+Tab move a list item down and up a level
Squashed from #5037 onto main.
2026-11-09 03:39:05 +07:00
dotCooCoo 0de0cb7cb9 Image Trace: Ignore Color can leave out only the background
Squashed from #3952 onto main.
2026-11-09 03:38:46 +07:00
dotCooCoo d5bb58aad5 Merge main into feat/plugin-importers 2026-11-08 12:38:22 -08:00
dotCooCoo 9518dc0e3a Merge main into feat/plugin-importers 2026-11-08 12:33:17 -08:00
BFlat 74310c6737 Merge pull request #6250 from dotCooCoo/fix/placed-gradient-hidden-children-and-freeform
Effects: hidden layer children and edited freeform gradients follow the Transform and Free Distort effects
2026-11-09 04:31:53 +08:00
BFlat 2cdec30659 Merge pull request #6249 from dotCooCoo/fix/ai-editing-copy-paragraph-once
.ai import: the editing-copy paragraph in the file-format doc appears once again
2026-11-09 04:31:38 +08:00
BFlat 9150f88a83 Merge pull request #6247 from dotCooCoo/feat/ai-path-align-distance
Type: Align to Path moves each character by its own font's metrics
2026-11-09 04:31:23 +08:00
BFlat ba353a22af Merge pull request #6246 from dotCooCoo/feat/plugin-filter-shortcuts
Keyboard Shortcuts: each Object › Plug-ins filter has a row of its own
2026-11-09 04:31:08 +08:00
BFlat 156ccf4b6d Merge pull request #6245 from dotCooCoo/fix/generic-cmyk-swop
Color: Generic CMYK tints gain as CGATS TR 001 gives for SWOP printing
2026-11-09 04:30:52 +08:00
BFlat 85519d5970 Merge pull request #6244 from dotCooCoo/feat/composite-fonts
Type: Composite Fonts… sets each class of character in a font of its own
2026-11-09 04:30:38 +08:00
BFlat 358df585dc Merge pull request #6241 from dotCooCoo/fix/3d-export-triangle-budget
Asset Export: the 3D mesh triangle limit bounds memory across all exported objects
2026-11-09 04:30:20 +08:00
BFlat fddbbe023d Merge pull request #6231 from dotCooCoo/fix/missing-link-relative-path
Links: a missing linked file keeps its relative folder when a moved document is saved
2026-11-09 04:30:06 +08:00
BFlat 0b8fc3c89d Merge pull request #6228 from dotCooCoo/feat/plugin-storage
Plug-ins: a plug-in keeps settings and a cache of its own
2026-11-09 04:29:51 +08:00
BFlat 0b533ae5f8 Merge pull request #6179 from dotCooCoo/fix/ids-param-strict
Commands: an ids list with an entry that is not an id is refused instead of dropping the entry
2026-11-09 04:29:39 +08:00
dotCooCoo 26804fb0c4 Plug-ins: tests hold an importer to its budget and hostile extensions in the manifest fuzz
An import's instruction and time budgets are now host limits on Limits, as a heavy filter's are, so a test can give an importer a small budget. An importer past its instruction or time limit, and a file past the input limit, return their error and leave an open document and its undo history unchanged. The manifest fuzz varies extensions (missing, dotted, mixed-case, repeated, too long and too many).
2026-11-08 12:29:27 -08:00
BFlat 6d506dc9c8 Merge pull request #5143 from dotCooCoo/fix/ai-os7
.ai import: images past 2^25 pixels in the editing data keep the layers
2026-11-09 04:29:23 +08:00
dotCooCoo 4724475e1a Effects: hidden layer children and edited freeform gradients follow the Transform and Free Distort effects
A path that keeps its shape because the effect would pass the geometry
budget holds a group's own placed gradients in place. A hidden path in a
layer, which the layer's bounds leave out, no longer holds them, so the
layer's gradient moves with its visible art. The art's own gradients
follow the same rule.

A freeform gradient whose points were edited keeps its vector fitted to
the bounds, so it did not count as placed and its points stayed behind
under a Transform effect and Free Distort unless another placed gradient
was in the same appearance. Its points now move like a placed gradient.
2026-11-09 03:14:41 +07:00
dotCooCoo c4de0035b2 .ai import: the editing-copy paragraph in the file-format doc appears once again
docs/file-format-parity.md held 35 copies of the paragraph under
"Illustrator's private editing data" after #6202 left one, each copy
carrying a different set of the changes merged since. The section now
holds one copy with every clause from the others: placed PDF and .ai
pages as placed documents, Bas Relief among the single-effect art
styles, Bas Relief's settings block in type's art style, the fill a
clipping path keeps with its exceptions, paths with an Art brush, the
spot colors in brush art, symbols defined before the art styles
section, the Type on a Path options, and the artboards the type of a
PDF's later pages goes to.
2026-11-09 03:14:41 +07:00
dotCooCoo 11f1d228de Type: Align to Path moves each character by its own font's metrics
Align to Path moved the whole line by the largest ascent and descent
among its characters. Each character now moves by its own font, size
and vertical scale. Ascender runs the top of the font's em box along
the path: the ideographic em box that the font's BASE table gives, or
in a Chinese, Japanese or Korean font the one that its typographic or
hhea box, a one-em box-drawing cross or its ideographs give; else an
em box centered on the cap height. Descender runs the bottom of the font's
bounding box along the path, and Center runs a line at half the height
of the top of the font's H along it. In vertical type, Ascender and
Descender move the characters half an em, and Center leaves them on
the path.

Existing documents with Align to Path set to Ascender, Descender or
Center lay their type out at a new distance from the path.
2026-11-09 03:14:41 +07:00