Commit Graph
8694 Commits
Author SHA1 Message Date
dotCooCoo 64c38d29c7 Reuse hit result for Direct Selection cursor 2026-11-06 11:31:21 +07:00
BFlat 17e56e3dc9 Merge pull request #5874 from dotCooCoo/fix/new-art-basic-boolean-param
Reject invalid New Art Basic parameters
2026-11-06 12:31:07 +08:00
dotCooCoo 8a730bab6b Reject invalid New Art Basic parameters 2026-11-06 11:15:35 +07:00
BFlat 3c7d9e1f90 Merge pull request #5873 from dotCooCoo/perf/long-path-hover
Speed up hover hits on long plain paths
2026-11-06 12:14:58 +08:00
dotCooCoo 0416f115e0 Speed up hover hits on long plain paths 2026-11-06 11:00:14 +07:00
BFlat ad747b15f7 Merge pull request #5872 from dotCooCoo/fix/guide-lock-boolean-param
Reject invalid Guide Lock parameters
2026-11-06 11:56:38 +08:00
dotCooCoo b26bd3d472 Reject invalid Guide Lock parameters 2026-11-06 10:41:08 +07:00
BFlat 56c1033820 Merge pull request #5871 from dotCooCoo/fix/ai-symbol-reader-shares-budgets
.ai import: symbol, pattern and brush definitions share the file's blend and envelope limits
2026-11-06 11:40:23 +08:00
dotCooCoo 49583ef632 .ai import: symbol, pattern and brush definitions share the file's blend and envelope limits
Each definition's reader started with fresh blend layout and envelope
check budgets, so a file with many symbols, patterns or brush art
sections got those limits again for every definition. The reader of a
definition now takes the import's remaining budgets and hands back what
is left after reading, whether the definition is kept or not.
2026-11-06 10:28:08 +07:00
BFlat 1e0efa77d1 Merge pull request #5869 from dotCooCoo/fix/transparency-grid-boolean-param
Reject invalid Transparency Grid parameters
2026-11-06 11:27:54 +08:00
dotCooCoo 398131b9cc Reject invalid Transparency Grid parameters 2026-11-06 10:12:42 +07:00
BFlat 2628ee3069 Merge pull request #5868 from dotCooCoo/perf/transform-many-lookups
Reuse selected object locations for large transforms
2026-11-06 11:10:32 +08:00
dotCooCoo 48a3710fae Reuse selected object locations for large transforms 2026-11-06 09:58:43 +07:00
BFlat 83f9b2953f Merge pull request #5867 from dotCooCoo/fix/slice-toggle-boolean-params
Reject invalid Slice toggle parameters
2026-11-06 10:58:17 +08:00
dotCooCoo b4a4f2aa4f Reject invalid Slice toggle parameters 2026-11-06 09:42:35 +07:00
BFlat f7fe3a0f43 Merge pull request #5866 from dotCooCoo/fix/char-strokes-scale-reuse
Rebuild fitted text geometry after scaling
2026-11-06 10:37:39 +08:00
dotCooCoo 25da816a08 Rebuild fitted text geometry after scaling 2026-11-06 09:37:22 +07:00
BFlat ac5a3c5163 Merge pull request #5865 from dotCooCoo/perf/char-strokes-move
Reuse text outlines across moves
2026-11-06 10:06:39 +08:00
dotCooCoo a723f7359a Reuse text outlines across moves 2026-11-06 08:51:36 +07:00
BFlat be3845d1f0 Merge pull request #5863 from mockydevs/feat/properties-artboard-transform-5219
Properties: Edit Artboards shows a Transform section above the artboard options (#5219)
2026-11-06 09:48:10 +08:00
BFlat 6d40518ce4 Merge pull request #5864 from storytold/fix/cmd-box-test-texture-delta
Tests: the Cmd bounding box test clears its texture delta
2026-11-06 09:47:55 +08:00
Don Omondi ae3490d3ba Properties: Edit Artboards shows a Transform section above the artboard options (#5219)
With the Artboard tool, the Properties panel now starts with a Transform
section: the reference point shared with the Transform panel and the
Control bar, the active artboard's X and Y (of that point), W and H with
the Constrain Width and Height Proportions link, its preset and
orientation, and Move and Scale Artwork with Artboard. The Artboards
section follows with the name, Artboard Options and Fill. A new W or H
now keeps the reference point in place, as in the Transform panel.
2026-11-06 08:34:46 +07:00
bflatastic 138bab6fd3 Tests: the Cmd bounding box test clears its texture delta
The render worker's frame can land in any of its frames, and dropping a
delta that is not empty panics.
2026-11-06 08:34:25 +07:00
BFlat 177005bf34 Merge pull request #5861 from mockydevs/fix/value-field-drag-4088
Scrubby labels: the Control bar's Stroke: and Opacity: links scrub their fields (#4088)
2026-11-06 09:22:22 +08:00
BFlat 56dadef444 Merge pull request #5862 from storytold/fix/canvas-tests-render-on-this-thread
Tests: two canvas tests render on their own thread
2026-11-06 09:22:07 +08:00
Don Omondi e1439bfe33 Scrubby labels: the Control bar's Stroke: and Opacity: links scrub their fields (#4088)
The Control bar's Stroke: and Opacity: and the Properties panel's Stroke
are links to their panels, so a drag on them did nothing while every
other field label scrubbed its field. A drag on such a link now scrubs
the field after it (same steps and modifiers, one undo step, Escape
cancels); a click still opens the panel, and the link's text is not
selected by the drag.
2026-11-06 08:11:10 +07:00
bflatastic cc0575f15d Tests: two canvas tests render on their own thread
A document's first frame goes to the render worker, and these read the
texture right after it, so under load it had not landed yet.
2026-11-06 08:10:45 +07:00
BFlat f3a8815e9a Merge pull request #5860 from mockydevs/fix/variable-library-keeps-bindings
Variables: Load Variable Library keeps a bound text variable the library declares (#4136)
2026-11-06 08:58:05 +08:00
Don Omondi 97697420f9 Variables: Load Variable Library keeps a bound text variable the library declares (#4136)
Loading a variable library deleted every variable of the document with its
bindings, including a text variable of the same name that the library
declares. Text made dynamic and then given a library's variable name lost its
binding, so selecting the library's data sets changed nothing. Such a
variable now stays bound, and the library's data sets change its text; other
variables are deleted as before.
2026-11-06 07:45:21 +07:00
BFlat 67089b9034 Merge pull request #5859 from mockydevs/fix/inner-glow-image-pixels
Effects: an image's Inner Glow follows its visible pixels, not its frame (#5308)
2026-11-06 08:43:58 +08:00
BFlat 4b8f63f2f8 Merge pull request #5858 from mockydevs/feat/quick-actions-repeat-options
Properties: Quick Actions has Repeat Options for a selected repeat (#5181)
2026-11-06 08:43:47 +08:00
BFlat 36574b7bbb Merge pull request #5857 from mockydevs/fix/intertwine-seam
Intertwine: the object brought over leaves no hairline of the one below (#5337)
2026-11-06 08:43:33 +08:00
BFlat 6e11583fb7 Merge pull request #5856 from simonhull/perf/image-tiles
Images: an image zoomed in on has its colours made only for the tiles in view (#4155)
2026-11-06 08:43:22 +08:00
BFlat 4264504ada Merge pull request #5855 from kk376/fix/svg-clippath-child-clip
SVG import: clip path on clipPath children clips child silhouettes before union (#5841)
2026-11-06 08:43:05 +08:00
BFlat 467bc3209c Merge pull request #5854 from mockydevs/feat/blend-spine-multi-select
Blend spine: Shift-click picks several spine points, which drag together (#5285)
2026-11-06 08:42:48 +08:00
Don Omondi 283c0d12bb Effects: an image's Inner Glow follows its visible pixels, not its frame (#5308)
Inner Glow clipped to the art's outline and bled in from outside it; for a
placed image that outline is the frame, so a PNG with transparent areas
glowed along the frame's edge, over pixels that don't show. For an image the
glow is now cast by its pixels' alpha (everything around them, blurred, or
the pixels themselves with Center) and kept to where the image shows, as
much as it shows.
2026-11-06 07:25:10 +07:00
Don Omondi 1f7f341c21 Properties: Quick Actions has Repeat Options for a selected repeat (#5181)
One selected radial, grid or mirror repeat (or one object of its source
art in isolation mode) shows a Repeat Options button in the Properties
panel's Quick Actions. It runs Object › Repeat › Options, opening the
Repeat Options dialog with the repeat's current values.
2026-11-06 07:23:39 +07:00
Don Omondi f987c2bbb0 Intertwine: the object brought over leaves no hairline of the one below (#5337)
The area an Intertwine member is drawn over another in was exactly the
overlap face, so its edge lay on the edge of the member below. Both edges
were anti-aliased, and the member below showed through as a thin line along
them. The area now reaches 2 pt past the face into the parts where only the
raised member paints (where drawing it again changes nothing), so its edge
lies inside that member.
2026-11-06 07:23:35 +07:00
Simon Hull c15383c510 Images: an image zoomed in on has its colours made only for the tiles in view (#4155)
From about 50% zoom on the file of #4155, the pixels drawn are the full 141-megapixel photo,
and in a CMYK document they were separated into ink planes (or colorized, or proofed) whole
for every view: 8 to 9 s of white canvas a zoom step.

When the pixels drawn are larger than a 1,024-pixel tile, their colours are made again for the
frame and part of them is out of view, only the tiles in view are made, each kept under its own
key (`ImageKey::tile`), and drawn together as one pixmap so their edges don't show. The colours
are made pixel by pixel, so the result is the same as for the whole image. CMYK images painting
their own inks are still made whole.

Zooming in to 50%, 100% and 200% on that file went from 9.0, 8.6 and 8.7 s to 0.78, 0.05 and
0.05 s (M3 Pro, one run each), with the same pixels on screen.
2026-11-06 07:23:32 +07:00
Kushagra Kumar 316f0d6213 SVG import: clip path on clipPath children clips child silhouettes before union (#5841)
Squashed from #5855 onto main.
2026-11-06 07:23:31 +07:00
Don Omondi dfe628e906 Blend spine: Shift-click picks several spine points, which drag together (#5285)
Direct Selection kept only one picked point of a blend's spine. Shift-click
now adds a point of the same spine or takes it away, and dragging any picked
point moves them all. object.blend.spine.moveAnchor takes `with`, the other
points to move by as much, with the key objects on them, in one undo step.
2026-11-06 07:23:19 +07:00
BFlat a402a48a3a Merge pull request #5852 from mockydevs/fix/svg-text-length
SVG import: textLength and lengthAdjust fit text to its length (#5842)
2026-11-06 07:37:56 +08:00
BFlat 4ae875bb96 Merge pull request #5851 from mockydevs/feat/direct-selection-cmd-bounding-box
Direct Selection: Cmd/Ctrl held lends the Selection tool and shows its bounding box (#3901)
2026-11-06 07:37:41 +08:00
BFlat 0c5cd535c2 Merge pull request #5850 from mockydevs/fix/join-tool-trim-crossing
Join tool: scrubbing the ends of two crossing paths trims them and joins the paths at the crossing (#5844)
2026-11-06 07:37:25 +08:00
BFlat e33d30bcee Merge pull request #5849 from mockydevs/fix/svg-clippath-union
SVG import: a clipPath's children clip to their union, each under its own clip-rule (#5840)
2026-11-06 07:37:10 +08:00
BFlat 4d5a05d58e Merge pull request #5853 from storytold/fix/first-frame-test-placed-generation
Tests: the first-frame worker test tolerates another test's placed document
2026-11-06 07:36:55 +08:00
Don Omondi 8236a8e006 SVG import: textLength and lengthAdjust fit text to its length (#5842)
SVG text with a textLength came in at its natural width. Following
SVG 1.1 §10.9.1, the characters of each text or tspan with a textLength
are now fitted to it: by spacing them out (lengthAdjust="spacing", the
default), which becomes kerning, or by stretching them
(spacingAndGlyphs), which becomes horizontal scale (kept within
1–10000%). Inner elements are fitted first; vertical text is spaced out
only, with a warning for spacingAndGlyphs. Negative lengths are ignored.
2026-11-06 05:38:51 +07:00
Don Omondi 483de72dbb Direct Selection: Cmd/Ctrl held lends the Selection tool and shows its bounding box (#3901)
Squashed from #5851 onto main.
2026-11-06 05:33:00 +07:00
Don Omondi b976de560d Join tool: scrubbing the ends of two crossing paths trims them and joins the paths at the crossing (#5844)
The Join tool drew a segment between the open ends of two crossing paths
instead of trimming what overhangs the crossing. path.joinScrub now looks for
two crossing open subpaths whose overhanging ends the scrub runs over, cuts
both at the crossing and joins the kept parts there with a corner, in one undo
step. Without a crossing the endpoint join is unchanged.
2026-11-06 05:32:24 +07:00
Don Omondi 446c3f071f SVG import: a clipPath's children clip to their union, each under its own clip-rule (#5840)
A clipPath with several children was imported as one compound path under
the first child's fill rule, so children wound in opposite directions
cancelled where they overlapped, and an even-odd child after a non-zero
one lost its hole. SVG 1.1 §14.3.5 defines the clip as the union of the
children's silhouettes, each computed on its own.

A clipPath with several children now comes in as a group of them as the
clip group's clipping path, each child keeping its own rule; a group
clips to the union of its members. One child imports as before.
2026-11-06 05:32:19 +07:00