Commit Graph
8129 Commits
Author SHA1 Message Date
BFlat 2f565dd212 Merge pull request #5580 from dotCooCoo/fix/kerning-mixed-modes
Type: Kerning menu lists Auto and Optical for mixed kerning modes
2026-11-04 18:52:45 +07:00
BFlat 4443c594e9 Merge pull request #5579 from dotCooCoo/fix/prefs-reapply-keeps-render-threads
Preferences: a Render Threads change before the first UI pass restarts the canvas renderer
2026-11-04 18:52:30 +07:00
BFlat edbe4d42bb Merge pull request #5576 from dotCooCoo/fix/pattern-done-gives-back-lent-type-tool
Type: Done during a Cmd press does not save empty point type
2026-11-04 18:52:15 +07:00
BFlat 9af799cf8b Merge pull request #5575 from dotCooCoo/fix/backquote-at-release
Canvas: a drag's release reads Backtick as it was at the button-up
2026-11-04 18:52:05 +07:00
BFlat 0476998117 Merge pull request #5572 from dotCooCoo/fix/optical-arabic-test-craft-fonts-guard
Tests: skip the Arabic Optical kerning test without craft-fonts
2026-11-04 18:51:49 +07:00
BFlat f21b3c4b13 Merge pull request #5571 from dotCooCoo/fix/direct-marquee-long-path
Direct Selection: a marquee over a long path tests its segments without building a path for each
2026-11-04 18:51:34 +07:00
BFlat 38521de60b Merge pull request #5570 from dotCooCoo/fix/hide-others-locked-layer-and-guides
Object: Unselected Artwork keeps groups that hold a selected layer or a locked guide
2026-11-04 18:51:19 +07:00
BFlat 75a961c282 Merge pull request #5569 from dotCooCoo/fix/ai-incomplete-brush-object-counted
.ai import: a brush object without a name counts as a brush left out
2026-11-04 18:51:04 +07:00
BFlat 5ddf7c2948 Merge pull request #5568 from dotCooCoo/fix/held-escape-after-tools-cancel
Shortcuts: a held Escape that cancels a Tools or ruler move skips the tool
2026-11-04 18:50:52 +07:00
BFlat d15b10f054 Merge pull request #5567 from dotCooCoo/fix/node-render-anti-alias
Render: node renders follow the anti-aliasing option
2026-11-04 18:50:36 +07:00
BFlat fcc3620050 Merge pull request #5566 from dotCooCoo/fix/select-same-text-skips-template-layers
Select: the font Same commands skip type on a template sublayer
2026-11-04 18:50:21 +07:00
dotCooCoo f11df30d23 Type: Kerning menu lists Auto and Optical for mixed kerning modes
A selection that mixed kerning modes left the Kerning dropdown without
its Auto and Optical entries, so one mode could not be set on all of
it. The menu now lists both entries with neither checked.
2026-11-04 18:29:03 +07:00
dotCooCoo 4a9ccc6fe3 Preferences: a Render Threads change before the first UI pass restarts the canvas renderer
The first UI pass applies the saved preferences again (#4837) by removing
the record of what was last applied. A Render Threads change made by a
control request between an earlier tick and that pass was then applied
with no previous value to compare, so the canvas renderer kept its old
thread count. The pass now forces the theme refresh and keeps the
record, so the thread change still restarts the renderer.
2026-11-04 18:29:00 +07:00
dotCooCoo c220c500e9 Type: Done during a Cmd press does not save empty point type
Done (pattern editing), Stop Editing Opacity Mask and Exit Isolation
Mode end the Type tool's edit first, so point type a click placed and
left empty is discarded. While a Cmd/Ctrl press had lent a selection
tool, the Type tool was not the active tool, its edit was not ended,
and the empty point type was saved into the pattern tile or the mask.

The lent tool is now given back first. A drag the lent tool started is
kept as its own step, with its last position applied when Real-time
Drawing and Editing is off.
2026-11-04 18:28:56 +07:00
dotCooCoo 1600696aea Canvas: a drag's release reads Backtick as it was at the button-up
A press or release of Backtick, or a window focus loss, that came after
the mouse button went up in the same frame changed whether the drag
committed a pattern-only transform. The release now takes Backtick's
state at the button-up from the frame's ordered input events.
2026-11-04 18:28:53 +07:00
dotCooCoo 5ebb6796fe Tests: skip the Arabic Optical kerning test without craft-fonts
optical_pair_after_rtl_separate_mark_uses_base_outline sets Noto Sans
Arabic, which is not in assets/fonts. Without CRAFT_FONTS_DIR the font
database returns a fallback face, so the test checked that face instead.
The test now skips when Noto Sans Arabic is missing, as the Shippori
Mincho tests in the same file do.
2026-11-04 18:28:50 +07:00
dotCooCoo c24c06ef7f Direct Selection: a marquee over a long path tests its segments without building a path for each
The marquee's segment test built a two-anchor path for every segment and ran
hit::intersects_rect on it. It now skips a segment whose anchors and handles
all lie past one side of the marquee, and tests the rest directly with the same
bounds and edge checks, so it selects the same segments.

A marquee over 10,000 anchors, press to release (anchor_bench, median of 7):
one open path of 200,000 anchors 84.9 ms -> 24.1 ms, 2,000 closed paths of 50
anchors 27.5 ms -> 13.5 ms, one closed path of 50,000 anchors 14.6 ms -> 8.5 ms.
2026-11-04 18:28:47 +07:00
dotCooCoo e67277ebe7 Hide: Unselected Artwork keeps groups that hold a selected layer or a locked guide
A layer nested in a group whose art was all locked counted for nothing,
so the group was hidden or locked with the layer inside it. The selected
layer now counts as selected itself.

While Lock Guides was on, a guide path that was locked itself, or sat in
a locked object, was not kept, so the group around it was hidden. Guide
paths inside locked objects are now kept too.
2026-11-04 18:28:44 +07:00
dotCooCoo 55dc5bb4a5 .ai import: a brush object without a name counts as a brush left out
A plug-in object that names a brush kind but ends before the brush's
name was dropped without a trace. When it was the file's only brush
object, the document kept the default brushes and showed no note. It is
now counted with the other brushes that can't be read, so the file gets
the Brushes panel note and no default brushes.
2026-11-04 18:28:40 +07:00
dotCooCoo 67cc383d77 Shortcuts: a held Escape that cancels a Tools or ruler move skips the tool
Holding Escape to cancel a floating Tools panel move or a ruler-origin
drag no longer passes its key repeats to the active tool or to the
other Escape actions (pattern edit, isolation, a flyout) once the
cancel frame has passed. The repeats are skipped until Escape is
released or pressed again. Tests hold Escape through both cancels in
each screen mode.
2026-11-04 18:28:37 +07:00
dotCooCoo 4c51f853c1 Render: node renders follow the anti-aliasing option
render_node_with and render_node_thumbnail_with drew into a new context
without setting its aliasing threshold, so AntiAlias::None still gave
smooth edges. Both now set the threshold from the options, as a page
render does.
2026-11-04 18:28:35 +07:00
dotCooCoo abc2201664 Select: the font Same commands skip type on a template sublayer
Squashed from #5566 onto main.
2026-11-04 18:28:32 +07:00
BFlat 8cac1b8802 Merge pull request #4517 from dotCooCoo/fix/document-color-mode-converts-effects-and-graphs
Document Color Mode: convert reusable paints and restore them with Undo
2026-11-04 18:24:51 +07:00
BFlat 74ccfdde05 Merge pull request #5563 from dotCooCoo/fix/many-anchors-editing
Render: a long stroke is outlined only near the view after an edit
2026-11-04 18:24:32 +07:00
BFlat 3c3ff35e8a Merge pull request #5564 from dotCooCoo/fix/hidden-group-floating-reply
Panels: showing a hidden floating group returns its window's panels
2026-11-04 18:24:17 +07:00
BFlat 093d90844d Merge pull request #5537 from dotCooCoo/fix/textedit-reject-bad-offsets
Type: text commands refuse negative or fractional byte offsets
2026-11-04 18:24:00 +07:00
BFlat 23e7e5011e Merge pull request #5558 from dotCooCoo/fix/i18n-term-tests-match-words
i18n: leading and Tracking term checks match whole words in the right label
2026-11-04 18:21:20 +07:00
dotCooCoo f0f19077df Document Color Mode: convert reusable paints and restore them with Undo
Squashed from #4517 onto main.
2026-11-04 16:55:43 +07:00
dotCooCoo 3fbdf72231 Docs: the long-stroke line names the strokes of path objects 2026-11-04 16:55:30 +07:00
dotCooCoo 8d0f251c37 Examples: anchor_bench's doc comment says what the example prints 2026-11-04 16:55:30 +07:00
dotCooCoo d6190e79e0 Render: a filter layer's offscreen culls art and crops long strokes to its own area
On a multithreaded context, a drop shadow or glow drawn through a filter
layer is drawn into an offscreen that covers the art plus the blur's
spread, but its frame kept the view's visible rect. Art outside the view
but within the spread was culled, so it cast no shadow, and a long stroke
was outlined only near the view, so its far parts no longer fed the blur.
The offscreen's frame now takes its visible rect from its own area, and
the frame of content kept from an earlier split takes the window it is
drawn over.
2026-11-04 16:55:30 +07:00
dotCooCoo 676cc0ee8e Render: a long stroke is outlined only near the view after an edit
The renderer outlined the whole stroke of an edited path on every frame,
so dragging one anchor of a path with many anchors re-outlined every
segment. A stroke line of more than 1,024 elements without dashes or a
width profile is now outlined only for the segments within the stroke's
reach of the view, inflated by the view's own size on each side. The
cached outline keeps that region, and a frame outside it outlines the
stroke again. Closed subpaths that a wide stroke crosses over stay whole,
and a cut closed subpath is walked from a removed segment so no cut lands
where it starts and ends. The pixels are the same.

At 1600 x 1200, the frame after one anchor moves takes 28 to 30 ms
instead of 103 ms on an open path of 200,000 anchors, and 10 ms instead
of 30 ms on a closed path of 50,000 anchors (the new anchor_bench
example: cargo run --release -p vectorcraft-engine --example anchor_bench).
2026-11-04 16:55:30 +07:00
dotCooCoo af604625b3 Panels: showing a hidden floating group returns its window's panels
`window.panel` on a panel whose group was hidden returned the whole
layout and every floating panel in every window. It now returns
`{floating}` with the panels of the restored panel's window, as it
does when it shows a panel that already floats.
2026-11-04 16:55:26 +07:00
dotCooCoo e3a55b97fd Type: Text Tweaker leaves byte offsets to range_of
Remove Text Tweaker's own start and end check: range_of already refuses
a bad offset given with an id, and like the other type commands Text
Tweaker now ignores start and end without one. The test's "2" case
gets an id so it still reaches the check, and docs/mcp.md lists
addon.type.textTweaker with the commands that refuse such offsets.
2026-11-04 16:55:22 +07:00
dotCooCoo 595db10900 Type: refuse negative or fractional byte offsets in text commands
text.startList read a negative or fractional `at` as the end of the
text, so it could remove a typed list marker there and start a list.
The `start` and `end` of text.editRange, text.getRange,
text.setRangeStyle and the type shortcut commands given an `id` read
such values as the start or end of the text.

These now return "`at` must be a whole number" (naming the key) and
change nothing. Omitted or null keys keep their defaults, and 2.0 is
read as 2.
2026-11-04 16:55:22 +07:00
dotCooCoo 1d459796ad i18n: term checks match whole words and the Info row's Tracking label
The Leading check now matches each word of the Leading field as a whole
word in languages that separate words with spaces, so a longer word such
as "liderlik" no longer stands in for "lider". Chinese, Japanese and
other unspaced scripts keep substring matching.

The Info row check now looks for the whole Tracking name in the label in
front of {tracking}, after taking out a Kerning or Leading name that
contains it. A word of the name found in the Size label, or a Kerning
label that contains the Tracking name, no longer passes.

The Czech Auto Leading row uses the singular "proklad", as the Leading
field does.
2026-11-04 16:55:19 +07:00
BFlat f8841a2b21 Merge pull request #5481 from dotCooCoo/fix/ai-os18-e
.ai import: objects come in bound to their variables
2026-11-04 16:47:44 +07:00
BFlat 1295f92b14 Merge pull request #5561 from byoungyoon/fix-5555-web-paste-twice
Fix #5555: Cmd+V pastes once on the web
2026-11-04 16:45:15 +07:00
BFlat 75ad1299cd Merge pull request #5562 from storytold/fix/stale-endpoint-port-race
Single instance: the stale-endpoint test connects to no freed port
2026-11-04 16:44:36 +07:00
dotCooCoo a7acf43cb1 .ai import: objects come in bound to their variables
Squashed from #5481 onto main.
2026-11-04 16:33:25 +07:00
byoungyoonandClaude Opus 5.5 c82a1eb0e8 Fix #5555: Cmd+V pastes once on the web
eframe's web runner reports a Cmd+V press both as the key press and, with the
clipboard's text, as a Paste event; the app pasted on each (egui's window
integration sends only the Paste). The web shell now drops the paste key's
press when a Paste is in the same frame's input; its release stays for
PasteChord, and a Cmd+V with no text on the clipboard keeps its press.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 16:33:24 +07:00
bflatastic 1e3553843d Single instance: the stale-endpoint test connects to no freed port
The test bound a port, freed it and then connected to it as a gone app.
Tests run in parallel, so another test's listener could take that port
meanwhile and accept this connection in place of its own client's,
whose connection was then reset when the listener closed: the cause of
the intermittent tcp_connection_is_closed_after_junk failures on
Windows. The gone app is now a listener that closes without a greeting.
2026-11-04 16:08:43 +07:00
BFlat 61a236fe57 Merge pull request #5046 from dotCooCoo/fix/ai-os11-brushes
.ai import: brushes come in from the editing data
2026-11-04 16:05:29 +07:00
BFlat a2b06808b0 Merge pull request #5553 from dotCooCoo/feat/global-edit-control-bar
Control bar: the Global Edit Options dropdown shows while Start Global Edit can run
2026-11-04 16:05:03 +07:00
BFlat 59232854cd Merge pull request #5552 from dotCooCoo/fix/pdf-open-reads-once
PDF/.ai import: the file is read and checked once when it opens
2026-11-04 16:04:48 +07:00
BFlat 1421e4959d Merge pull request #5554 from dotCooCoo/feat/ai-blend-spacing
.ai import: blends keep their Specified Distance and Smooth Color spacing
2026-11-04 16:04:32 +07:00
BFlat da5eb0a0b7 Merge pull request #5551 from dotCooCoo/fix/stylistic-sets-feature-variations
Type: list stylistic sets whose lookups come from FeatureVariations
2026-11-04 16:04:16 +07:00
BFlat 9f852496c2 Merge pull request #5556 from dotCooCoo/fix/png-row-reader-room
Images: a PNG read a row at a time counts all of the reader's buffers
2026-11-04 16:04:00 +07:00
dotCooCoo 322f1c24db .ai import: brushes come in from the editing data
Squashed from #5046 onto main.
2026-11-04 15:41:24 +07:00
dotCooCoo f4469e16d6 Control bar: the Global Edit Options dropdown shows while Start Global Edit can run
While Select > Start Global Edit can run, the Control bar shows a Global Edit
Options dropdown after Recolor Artwork. It opens the Properties panel's Global
Edit Options (Match: Appearance, Size; On Artboards; Include Objects On
Canvas; Result(s)), so both set the same options, and it is off while Global
Edit is on, as the Properties dropdown is. The bar leaves it out when no room
is left for it.

Public reference:
https://helpx.adobe.com/illustrator/desktop/manage-objects/edit-objects/edit-similar-objects.html

The dropdown takes room ahead of the inline X/Y/W/H fields, so the ruler-origin
tests that read X/Y from the Control bar draw it 1700 px wide.
2026-11-04 15:41:15 +07:00