Commit Graph
7728 Commits
Author SHA1 Message Date
dotCooCoo fbab0bdd43 Type: Find Font's Replace With Font From lists the document's, recent or installed fonts
Squashed from #5217 onto main.
2026-11-03 16:38:24 +07:00
dotCooCoo af17c648c0 Find Font: Change and Change All add no undo step when no text changes
Squashed from #5204 onto main.
2026-11-03 16:38:17 +07:00
BFlat 93a0dd11cf Merge pull request #5262 from thisisgomaa/perf/compound-path-geom-cache
Render: a compound path's members are assembled once and kept with the node
2026-11-03 16:36:11 +07:00
BFlat eb57f92125 Merge pull request #5261 from thisisgomaa/perf/hit-test-culls-by-control-bounds
Selection: a click on a large compound path is culled by its control points
2026-11-03 16:35:55 +07:00
BFlat c859ebd2cc Merge pull request #5331 from dotCooCoo/feat/font-field-scroll-preview
Type: step font families with the mouse wheel
2026-11-03 16:35:38 +07:00
BFlat 17e9d28fb1 Merge pull request #5275 from dotCooCoo/feat/objects-on-path-spacing
Objects on Path: the Space widget spaces the attached objects along the path
2026-11-03 16:35:22 +07:00
BFlat e361ddf5f9 Merge pull request #5332 from ham9zah/feat/path-type-bracket-reach
Path type brackets: 8 px reach, hover highlight, and the nearest of a bracket and a port takes the press
2026-11-03 16:35:05 +07:00
BFlat f6087351e6 Merge pull request #5326 from dotCooCoo/docs/feature-status-records
Update SVG, type, recoloring, and symbol feature records
2026-11-03 16:34:45 +07:00
BFlat cdb7634b5a Merge pull request #5328 from dotCooCoo/fix/select-same-nonempty-text
Exclude empty runs from matching text selections
2026-11-03 16:34:29 +07:00
BFlat 32acec9309 Merge pull request #5325 from dotCooCoo/fix/svg-decoded-id-selector
Preserve SVG styles with encoded attribute selectors
2026-11-03 16:34:13 +07:00
BFlat e91da37341 Merge pull request #5256 from dotCooCoo/fix/arrange-tile-review
Window: Tile with one document open leaves the documents under their tabs
2026-11-03 16:33:57 +07:00
BFlat 11a95d708f Merge pull request #5295 from dotCooCoo/feat/arrange-d
Window: with Open Documents As Tabs cleared, new documents open in windows
2026-11-03 16:33:42 +07:00
BFlat 41016cd261 Merge pull request #5286 from dotCooCoo/feat/arrange-c
Window: drag a document tab out to float it, and a window back to dock it
2026-11-03 16:33:26 +07:00
BFlat 9b34748543 Merge pull request #5278 from dotCooCoo/feat/arrange-b
Window: Float in Window, Float All in Windows and Cascade float documents
2026-11-03 16:33:09 +07:00
BFlat 4085f9083f Merge pull request #5255 from dotCooCoo/feat/char-style-options-color-opentype
Character Styles: Style Options sets character color and OpenType features
2026-11-03 16:32:52 +07:00
BFlat 8c52832b8a Merge pull request #5234 from dotCooCoo/fix/dropped-press-cancels-tool
Canvas: a dropped press cancels the tool's drag instead of ending it
2026-11-03 16:32:35 +07:00
BFlat e2d7988b02 Merge pull request #5268 from dotCooCoo/fix/release-frame-moves
Canvas: moves after the button-up do not join a stroke
2026-11-03 16:32:18 +07:00
BFlat 3c854c7289 Merge pull request #5277 from dotCooCoo/fix/measure-shift-snap
Measure: a Shift-drag snaps its end point on its 45° step
2026-11-03 16:32:02 +07:00
BFlat ee46dea2d4 Merge pull request #5257 from dotCooCoo/fix/text-setstyle-stroke
Type: text.setStyle sets the text's stroke as well as its fill
2026-11-03 16:31:45 +07:00
BFlat b3bfb3ae56 Merge pull request #5276 from dotCooCoo/fix/keymap-iso-key
Fix #4559: shortcuts can use the ISO key next to left Shift
2026-11-03 16:31:30 +07:00
BFlat 1c47e8386e Merge pull request #5288 from storytold/fix/sec-dxf-import-budgets
DXF import: budget dash patterns, copied text and names, and block items looked at
2026-11-03 16:31:13 +07:00
BFlat aa5f7ece8e Merge pull request #5299 from storytold/fix/sec-icc-duplicate-tags
ICC: refuse a profile whose tag table lists a tag twice
2026-11-03 16:30:57 +07:00
BFlat 8e9e79afc7 Merge pull request #5305 from storytold/fix/sec-export-settings-no-passwords
Export for Screens: keep PDF passwords out of remembered settings
2026-11-03 16:30:42 +07:00
BFlat 6b53f115a4 Merge pull request #5307 from storytold/fix/sec-flatten-overlap-index
Flatten Transparency: group overlapping objects without comparing every open pair
2026-11-03 16:30:27 +07:00
BFlat 2aba975488 Merge pull request #5301 from storytold/fix/sec-clipboard-png-side
Clipboard: leave out the PNG of art too large to scale to 4096 pixels
2026-11-03 16:30:11 +07:00
BFlat 05a189b8e8 Merge pull request #5323 from JonRC/fix/eps-currentfile-executed-file
Fix #5321: `currentfile` in a file being run is that file
2026-11-03 16:29:55 +07:00
BFlat 431958668b Merge pull request #5319 from JonRC/fix/eps-known-composite-key
Fix #5318: `known` answers false for keys no dictionary holds
2026-11-03 16:29:40 +07:00
BFlat 18b2acd426 Merge pull request #5317 from JonRC/fix/eps-encoding-resources
Fix #5316: StandardEncoding and ISOLatin1Encoding are Encoding resources
2026-11-03 16:29:24 +07:00
BFlat 8e4a865bd6 Merge pull request #5306 from storytold/fix/sec-place-queue-scope
Place: the place cursor reads its files within the roots it was loaded in
2026-11-03 16:29:13 +07:00
BFlat 1836abe4cb Merge pull request #5303 from storytold/fix/sec-thread-reflow-unique-frames
Threaded text: a frame listed twice flows the story once
2026-11-03 16:28:57 +07:00
BFlat 44ecfcc655 Merge pull request #5293 from storytold/fix/sec-brush-mask-root-symbol
Brushes: leave out an opacity mask whose root symbol draws a brushed stroke
2026-11-03 16:28:42 +07:00
BFlat 139fb217f4 Merge pull request #5329 from cybermaxwel/fix/zh-hans-luminosity-20261103
Fix Simplified Chinese translation of Luminosity
2026-11-03 16:28:24 +07:00
Ahmed Gomaa 1d011ab8ad Render: a compound path's members are assembled once and kept with the node
A compound path was assembled from its members in every frame it was
drawn, and Node::stroke_path grew its buffer by doubling, copying the
path into ever larger buffers for a compound path of many anchors. The
renderer's geometry cache was swept only once it held more than 1,024
entries, so while an object was dragged (a new node, and layer, in
every frame) the old copies stayed alive with all their members.

Now:
- a compound path is drawn from the path the renderer keeps for it in
  its geometry cache, as a plain path already was, and is assembled
  only when the node changes;
- Node::stroke_path sizes a compound path's buffer up front from its
  members' segment counts (the same elements, in the same order);
- unused geometry entries are dropped after a few frames however few
  entries there are.

Tests:
- crates/render/src/tests/memory.rs: the second frame draws the kept
  path and the same pixels as the first and as a new renderer; after a
  five-frame move the renderer no longer holds the compound path drawn
  before it. The test fails without the renderer change.
- crates/doc/src/node/tests.rs: a compound path's path is its members'
  paths in order (open, closed, empty and single-anchor members).

Not timed; vectorcraft-cli perf was not rerun.
2026-11-03 16:03:40 +07:00
Ahmed Gomaa f0e72fb11a Selection: a click on a large compound path is culled by its control points
Every click and hover measured each path and compound path along its
curves to cull it (Node::reach_bounds_with), and a compound path was
then assembled whole to test its outline and fill. For a compound path
of thousands of members that took milliseconds per click.

Hit testing now culls paths and compound paths by the box of their
control points (which holds the curves), grown by their strokes' reach,
so the box is never smaller than the reach box it replaces. A compound
path's outline and fill are tested against only the members whose
control box, grown by the tolerance, holds the point: a member outside
that box is farther than the tolerance and winds zero times round the
point. Painted strokes still follow the whole compound path (alignment,
dashes, width profiles) and are measured along all of it, as before.

Tests (crates/doc/src/hit/tests.rs):
- a 2,000-member compound path hits exactly as the whole-path test did,
  at random points, on and next to anchors and on the edges of the
  members' boxes, for both fill rules, in Outline view and with Object
  Selection by Path Only;
- wide strokes painting past the control points are still hit, for a
  path and a compound path;
- the cull box holds the reach box for paths and compound paths.

Measured in a debug test build (one run, machine not idle): a click on
a 20,000-member compound path went from about 18 ms to about 1 ms.
vectorcraft-cli perf was not rerun.
2026-11-03 16:03:40 +07:00
dotCooCoo 84db6a54a0 Type: discard queued font wheel turns after text selection changes 2026-11-03 16:03:40 +07:00
dotCooCoo 2b29a680f3 Objects on Path: the Space widget spaces the attached objects along the path
With one Objects on Path group of two or more objects selected, the
Selection and Objects on Path tools show a square Space widget beyond the
last object, ahead along the path. Dragging it moves the last object
along the path, around its bends, as far as the pointer moves along it,
and the objects between follow evenly while the first one stays. With
Alt (Option on macOS) the objects spread from both ends toward or away
from the center of an open path, or of the first anchor of a closed one.
The distance between the objects shows next to the pointer in the
document's units; the drag is one undo step, and Escape cancels it.

- object.objectsOnPath.options takes spacing (points, or "auto", the
  default even spread) and start (points from the first anchor). A
  spacing the path has no room for is drawn smaller and kept, so a
  longer path brings it back. Older files read as Auto.
- Moving the group, Pivot, Rotate, path edits, copies and saving keep
  the Space. Scaling, rotating or shearing the group keeps the first
  and last objects where the transform takes them on the new path, live
  shapes included; a value that cannot be kept that way scales with the
  path's length.
- The Rotate All widget follows the first object when Space moves it.

Behavior: https://helpx.adobe.com/illustrator/desktop/manage-objects/arrange-objects/rearrange-and-edit-objects-on-a-path.html
and https://helpx.adobe.com/illustrator/using/objects-on-path.html.
2026-11-03 16:03:40 +07:00
ham9zah 2bc284aa25 Path type brackets: 8 px reach, hover highlight, and the nearest of a bracket and a port takes the press
Squashed from #5332 onto main.
2026-11-03 16:03:40 +07:00
dotCooCoo 2b6cbfda5d Update SVG, type, recoloring, and symbol feature records 2026-11-03 16:03:40 +07:00
dotCooCoo c633e09d3a Exclude empty runs from matching text selections 2026-11-03 16:03:40 +07:00
dotCooCoo 449dd5f5ed Preserve SVG styles with encoded attribute selectors 2026-11-03 16:03:40 +07:00
dotCooCoo 012ac29d15 Window: Tile with one document open leaves the documents under their tabs
Squashed from #5256 onto main.
2026-11-03 16:03:40 +07:00
dotCooCoo a9048ddfab Type: leave wheel input to replacement Artboard controls 2026-11-03 16:03:40 +07:00
dotCooCoo 80f51a62da Type: stop hidden font fields from capturing wheel input 2026-11-03 16:03:40 +07:00
dotCooCoo 89f3d79eec Type: clarify stable font wheel ordering 2026-11-03 16:03:40 +07:00
dotCooCoo 13ede29a5e Type: route font wheel input before scroll smoothing 2026-11-03 16:03:40 +07:00
dotCooCoo 2a95625b99 Type: step font families with the mouse wheel
Apply wheel steps over the closed family fields in Character, Properties and Control, preserving event order and one undo step per effective notch. Document the supported controls and the application choices. Fixes #5253.
2026-11-03 16:03:40 +07:00
dotCooCoo 4b683c3a98 Window: with Open Documents As Tabs cleared, new documents open in windows
Preferences > User Interface > Open Documents As Tabs was stored but did
nothing. With the box cleared, each document opened or created afterwards
opens in a floating window of its own, at the next cascade place, as
Window > Arrange > Float in Window floats it. Documents already open, and
documents open when the app starts, keep their tabs; checking the box
again leaves floating documents in their windows.

The engine records the preference on each document as it opens
(DocState::opened_as_tab), and the UI finds new documents by uid, so a
command batch that closes and opens documents, or changes the preference
between opening them, places each one as the preference was when it
opened.
2026-11-03 16:03:39 +07:00
dotCooCoo ca8aba6d6a Window: drag a document tab out to float it, and a window back to dock it
A document tab dragged more than 24 pt above or below the tab strip
floats its document in a window under the pointer and makes it the
current document (window.arrange.floatInWindow takes index and at for
this). A shorter drag, or one along the strip, leaves the tabs as they
are. A document window dragged by its title bar onto the tab strip goes
back under the tabs; the strip shows an outline while a window is over
it. A desktop document window is an OS window, so it has the document's
tab at its top: dragging that tab moves the window, and dropping it on
the main window's tab strip docks it (window.arrange.consolidateAllWindows
takes index for one document).

A document floated again opens where it is asked to, not where its last
window was.
2026-11-03 16:03:39 +07:00
dotCooCoo 2c0ef0f24e Window: Float in Window, Float All in Windows and Cascade float documents
Window > Arrange > Float in Window (window.arrange.floatInWindow) moves
the current document out of the tab strip into a floating window of its
own, and Float All in Windows (window.arrange.floatAllInWindows), a new
item, does so for every tabbed document. Cascade (window.arrange.cascade)
floats every document and stacks the windows from the upper left of the
document area to its lower right, 30 pt apart, in tab order. On the
desktop each window is an OS window; on the web and on Wayland it is a
window inside the app's window, as floating panels are. While the
control channel is attached, the windows also open inside the app's
window, so ui.click, ui.drag and ui.screenshot reach them.

The current document's window holds the canvas. The other windows, and
the main window while the current document floats, draw their documents
as Tile's panes do, and a press in one makes its document the current
one. A document's OS window that takes the keyboard focus makes its
document the current one, and keys typed there run the main window's
shortcuts. Closing a window closes its document, asking to save unsaved
changes. Consolidate All Windows brings floating documents back under
the tabs, and Tile brings them back into its grid.

Cascade is enabled with two or more documents, Float in Window while the
current document is tabbed, Float All in Windows while any document is
tabbed, and Consolidate All Windows while documents are tiled or
floating. ui.inspect reports the floating documents.
2026-11-03 16:03:39 +07:00
dotCooCoo c79fd5c132 Character Styles: Style Options leaves Figure unset for figure tags no menu entry matches
A style whose features turn on pnum or lnum alone, or pair a figure tag with
one the shown entry turns off (onum with lnum, tnum with pnum), showed a Figure
entry that does not match its tags. Choosing that entry then left the field
unchanged, so the tags could not be cleared. Figure now opens unset for these
lists, and choosing Default Figure writes -tnum, -onum, -pnum and -lnum.
2026-11-03 16:03:39 +07:00