Commit Graph
9474 Commits
Author SHA1 Message Date
BFlat 0cb2d5dbd8 Merge pull request #5030 from dotCooCoo/fix/issue-3748-r
Fix #3748: in isolation mode, art outside a clip group's mask can be selected and dragged
2026-11-09 07:46:54 +08:00
BFlat 0b0f8d71eb Merge pull request #5475 from dotCooCoo/fix/spiral-decay-per-wind
Spiral: Decay applies once per full wind
2026-11-09 07:46:47 +08:00
BFlat ecdd36483d Merge pull request #6259 from dotCooCoo/fix/ai-pattern-mask-ids
.ai import: opacity mask art in pattern and brush art takes document ids
2026-11-09 07:46:40 +08:00
BFlat c0887164cc Merge pull request #6258 from dotCooCoo/fix/plugin-clear-cache-test
Plug-ins: clearing every plug-in's cache is tested in a binary of its own
2026-11-09 07:46:33 +08:00
BFlat c8d67344a9 Merge pull request #3968 from dotCooCoo/feat/trace-keep-colors
Image Trace: keepColors traces only the listed palette colors
2026-11-09 07:46:01 +08:00
BFlat 500cda491c Merge pull request #6257 from dotCooCoo/fix/escape-return-tool-docs
Type: docs say Escape returns to the tool whose double-click chose the Type tool
2026-11-09 07:45:45 +08:00
dotCooCoo f064d78678 Merge main into fix/spiral-decay-per-wind 2026-11-08 14:31:04 -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
dotCooCoo 1940d3e529 .ai import: opacity mask art in pattern and brush art takes document ids
A pattern's or a brush's art was copied into the document with new ids,
but the art of an opacity mask inside it kept the ids of the reader that
read the definition. Those ids could repeat ids of objects in the
layers. The mask art now takes document ids, as a symbol's art already
does.
2026-11-08 14:06:24 -08:00
dotCooCoo f9940486a8 Merge main into fix/spiral-decay-per-wind 2026-11-08 14:03:31 -08:00
bflatastic d58000b5df Objects on Path: the stretched-group test allows the spine's rounding 2026-11-09 04:52:48 +07:00
dotCooCoo 987f50619a Merge main into feat/trace-keep-colors 2026-11-08 13:49:11 -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
dotCooCoo 623f7449bc Type: the Escape return target is also cleared when another document or window becomes active
Switching documents, or windows of a document, deactivates the Type tool, which clears the tool its double-click came from, so Escape after a later edit goes to the Selection tool. The field's comment and the two checklist rows now say so.
2026-11-08 13:45:14 -08:00
dotCooCoo b817baca58 Merge main into feat/trace-keep-colors 2026-11-08 13:45:04 -08: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 75ec10cd02 Merge main into fix/issue-3748-r 2026-11-08 13:27:31 -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
dotCooCoo 48fdfeffd8 Type: docs say Escape returns to the tool whose double-click chose the Type tool
Only a double-click on type from another tool records the tool Escape and
Cmd+Enter return to, and the Type tool keeps it until another tool is
chosen. Choosing the Type tool from the toolbar records none, so Escape
goes to the Selection tool. The type and UI checklists and the doc
comments on prev_tool, end_editing and claims_key now say so.

docs/type-parity.md held four copies of the point, area and path type
row, three of them with older Escape wording. They are one row again,
with the Type Orientation sentence that only one copy had.
2026-11-08 13:17:38 -08: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
dotCooCoo e7c381a53f Merge main into fix/issue-3748-r
# Conflicts:
#	crates/doc/src/hit.rs
2026-11-08 13:14:33 -08:00
dotCooCoo 4b665ad13c Plug-ins: clearing every cache is tested in a binary of its own
`plugin.clearCache` without an id empties the cache of every plug-in
installed in the process. In the engine's library tests it could empty
the cache of another storage test running at the same time, and its
`bytesFreed` could count that test's cache. It now runs in
`crates/engine/tests/plugin_clear_cache.rs`, and the library test checks
that clearing one plug-in's cache leaves the other plug-in's cache.

The storage fuzz test starts each case with an empty plug-in store,
deletes the store when the case ends, and installs `fuzz.storage` with
`replace: true`, so the cases that shrink a failure install their
module.

docs/mcp.md says that files `plugin.remove` can't delete stay in the
folder renamed with `.removed` until the plug-in is removed again.
2026-11-08 13:03:31 -08:00
onion3130 eaab4fd516 Trim to hermetic font test only (Source Sans 3, not Inter) 2026-11-09 04:02:29 +07: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
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