Commit Graph
12373 Commits
Author SHA1 Message Date
BFlat e74c2d04df Merge pull request #7083 from dotCooCoo/fix/simplify-line-keeps-tangent
Simplify: a refitted curve becomes a line only when its joins stay smooth
2026-11-13 23:31:37 +07:00
BFlat 4c072b320c Merge pull request #7136 from dotCooCoo/fix/command-batch-artboards
Artboards: a batch's Fit to Artwork Bounds step fits every selected artboard
2026-11-13 23:31:28 +07:00
BFlat 538e471783 Merge pull request #7163 from dotCooCoo/feat/live-paint-bucket-cursor
Live Paint: the bucket shows a filled bucket over a face and a brush over an edge
2026-11-13 23:31:19 +07:00
BFlat d3bb35ff61 Merge pull request #7154 from dotCooCoo/fix/3d-walls-depth-sort
3D: fill walls and dashed or profiled strokes draw in depth order where they overlap
2026-11-13 23:31:09 +07:00
BFlat b7a9bd6e29 Merge pull request #7169 from dotCooCoo/fix/join-coincident-one-pass
Join: merge a run of coincident anchors in one pass over the path
2026-11-13 23:31:00 +07:00
BFlat 9395fb9cec Merge pull request #7160 from dotCooCoo/fix/svg-image-orientation
SVG import: raster images follow their EXIF or TIFF orientation
2026-11-13 23:16:49 +07:00
BFlat ebd7568b69 Merge pull request #7124 from dotCooCoo/fix/control-bar-trailing-separator
Control bar: no separator is left at the end of the bar when the controls after it are hidden
2026-11-13 23:15:28 +07:00
BFlat 1af96f4e25 Merge pull request #7166 from dotCooCoo/fix/test-temp-folder-cleanup
Tests: ui-egui tests remove the temp folders they make
2026-11-13 23:15:19 +07:00
BFlat 43d0b50760 Merge pull request #7157 from dotCooCoo/fix/remove-anchors-one-pass
Paths: Remove Anchor Points removes many anchors of a subpath in one pass
2026-11-13 23:15:10 +07:00
BFlat 4cad65c603 Merge pull request #7150 from dotCooCoo/fix/thread-frame-measure-needed-paragraphs
Type: a threaded story measures each frame with the paragraphs it needs
2026-11-13 23:15:01 +07:00
BFlat dad9116ef7 Merge pull request #7156 from dotCooCoo/fix/justify-after-last-tab
Justify: a line with a tab spreads the text after its last tab to the edge
2026-11-13 23:14:52 +07:00
BFlat 39940f5568 Merge pull request #7133 from dotCooCoo/fix/font-menu-scrollbar-test-flaky
Tests: the font menu scroll bar test lists fonts of its own
2026-11-13 23:14:43 +07:00
BFlat f97e81afd7 Merge pull request #7159 from dotCooCoo/fix/delete-cut-per-subpath-anchors
Paths: Delete, Cut and Cut Path read each subpath's own selected anchors
2026-11-13 23:14:36 +07:00
BFlat cb061d6a2c Merge pull request #7085 from dotCooCoo/feat/learn-next-up
Learn: View more opens a tutorial's practice sample, and Next Up shows the next tutorial
2026-11-13 23:05:29 +07:00
BFlat 6326acb122 Merge pull request #7070 from dotCooCoo/feat/recolor-prominent-colors
Recolor Artwork: the Prominent Colors bar weighs the art's colors
2026-11-13 23:05:19 +07:00
BFlat 25553f21fe Merge pull request #7123 from dotCooCoo/fix/actions-insert-menu-item-ui-commands
Actions: Insert Menu Item adds Object › Align and View menu commands
2026-11-13 23:05:00 +07:00
BFlat e0e97e8ed1 Merge pull request #7153 from dotCooCoo/fix/blend-spine-binary-search
Blend: find the spine segment for an arc length with a binary search
2026-11-13 23:04:50 +07:00
BFlat be99b8895d Merge pull request #7155 from dotCooCoo/fix/hindi-message-terms
i18n: Hindi messages keep their English meaning and the catalog's terms
2026-11-13 23:04:40 +07:00
BFlat 508c1b658e Merge pull request #7096 from dotCooCoo/feat/ai-save-envelopes
PDF/.ai save: envelopes stay editable when the file is reopened
2026-11-13 23:04:30 +07:00
BFlat d26413c3fb Merge pull request #7117 from dotCooCoo/fix/smooth-tool-smooths
Smooth tool: each drag smooths the path under it, and repeated drags keep smoothing
2026-11-13 23:04:21 +07:00
BFlat de93bef121 Merge pull request #7101 from dotCooCoo/fix/eyedropper-series-opacity
Eyedropper: a pick that leaves a series mark's row without paint replaces the stored transparency
2026-11-13 23:04:12 +07:00
BFlat f525bd742e Merge pull request #7147 from dotCooCoo/fix/script-file-name
Scripts: $.fileName names the file of the code that reads it
2026-11-13 23:04:04 +07:00
BFlat dd8f8ed2bd Merge pull request #7115 from dotCooCoo/fix/settle-keeps-preview-warnings
Edit: settling an interaction keeps the warning of the preview it applies
2026-11-13 23:03:55 +07:00
BFlat ada78a07ba Merge pull request #7114 from dotCooCoo/feat/group-effect-after-members
Effects: a group's geometry effects reshape what its members draw
2026-11-13 23:03:46 +07:00
BFlat 0cc04afd57 Merge pull request #7161 from dotCooCoo/fix/script-xml-heap-limit
Scripts: E4X operations count their temporary storage against the heap limit
2026-11-13 23:03:38 +07:00
BFlat 2d91c860a7 Merge pull request #7087 from dotCooCoo/feat/every-line-composer-shaped-area
Type: the Every-line Composer sets mixed sizes in shaped and wrapped area type
2026-11-13 23:03:29 +07:00
BFlat c68b2775e4 Merge pull request #7125 from dotCooCoo/fix/plugin-install-checks-first
Plug-ins: plugin.install writes nothing to the store until the module is checked
2026-11-13 23:02:12 +07:00
BFlat f239944df0 Merge pull request #7107 from dotCooCoo/fix/measured-arclen-coincident-quad
Paths: a quadratic segment whose points coincide measures zero length instead of NaN
2026-11-13 23:02:03 +07:00
BFlat b17a62be34 Merge pull request #7109 from dotCooCoo/fix/painted-fx-brush-reach
Effects: culling a painted piece leaves room for its own brush art
2026-11-13 23:01:55 +07:00
BFlat c8bf38c6a1 Merge pull request #7092 from dotCooCoo/fix/dimension-guide-line-snap
Dimension tool: a point on a Smart Guide stays on the guide
2026-11-13 23:01:45 +07:00
BFlat 714e3a3821 Merge pull request #7135 from dotCooCoo/fix/docs-paragraph-style-options-rows
Docs: Paragraph Style Options rows name the dialog and its seven sections
2026-11-13 23:01:36 +07:00
BFlat cd1feada31 Merge pull request #7132 from dotCooCoo/fix/ui-docs-brush-libraries
Docs: `ui-parity.md` names all nine built-in brush libraries
2026-11-13 23:01:27 +07:00
BFlat 017db27090 Merge pull request #7131 from dotCooCoo/fix/flatten-grouping-sweep-meets
Flatten: grouping sweeps skip boxes that a box already holds or cannot join
2026-11-13 23:01:18 +07:00
BFlat dc5c3aa444 Merge pull request #7119 from dotCooCoo/perf/pathops-overlap-sweep
Path ops: Offset Path sweeps long, low paths along their length
2026-11-13 23:01:08 +07:00
BFlat 7372d7ee5e Merge pull request #7081 from dotCooCoo/fix/svg-rtl-text-anchor
SVG: right-to-left text with text-anchor start or end opens at its directional edge
2026-11-13 23:00:55 +07:00
BFlat 02445d5f02 Merge pull request #7130 from dotCooCoo/fix/eps-image-samples-once
EPS: an image drawn more than once writes its samples once
2026-11-13 23:00:45 +07:00
BFlat 0455c12162 Merge pull request #7127 from dotCooCoo/fix/thread-empty-last-paragraph-style
Type: a threaded frame's empty last paragraph keeps a format given to it
2026-11-13 23:00:36 +07:00
BFlat e9459df52b Merge pull request #7099 from jmverges/fix/7097-top-object-split-curve
Envelopes: a top object's side that is one split curve follows its parameter
2026-11-13 23:00:21 +07:00
dotCooCoo 5f78e1fca7 Merge main into fix/simplify-line-keeps-tangent 2026-11-13 07:41:05 -08:00
dotCooCoo fdbe4ea32d Merge main into fix/command-batch-artboards 2026-11-13 07:36:48 -08:00
BFlat 77970c6924 Merge pull request #7082 from dotCooCoo/fix/smooth-resets-anchor-selection
Smooth tool: smoothing a path deselects its direct-selected anchors
2026-11-13 22:26:18 +07:00
BFlat 45acda45fe Merge pull request #7084 from dotCooCoo/feat/message-rows-id-nl-da-bg
i18n: Dutch translates status and error messages
2026-11-13 22:26:08 +07:00
dotCooCoo 8b990de004 Join: merge a run of coincident anchors in one pass over the path
Join removed each merged anchor from the path's anchor list as it went,
which moved every anchor after it, so a long selected run in front of
many other anchors took time quadratic in the path's length. It also
looked up each anchor's selection in the selected-anchor set.

Join now marks the merged anchors and removes them in one pass at the
end, reading the selection from one flag per anchor. Each corner or
smooth conversion sees the same neighbors as before, so the resulting
anchors are unchanged. Anchor::smooth_between holds the smoothing that
SubPath::smooth_anchor applies.

Tests compare the new merge bit for bit with the old one on 30,000
generated paths, and count the anchors moved when 300,000 selected
anchors in front of 300,000 others merge: each of the others moves
once.
2026-11-13 07:25:49 -08:00
BFlat 5fcfb0ce6e Merge pull request #7086 from dotCooCoo/feat/library-charstyle-menu
Libraries: a character style's menu offers Apply, Add to Character Styles, Rename and Delete
2026-11-13 22:24:41 +07:00
dotCooCoo 2361d2cb1b 3D: caps stay last when overlapping faces form a depth cycle
- When the faces that overlap form a cycle of depth orders, the order
  broke the cycle only after drawing every face with nothing to wait
  for, so a cap could be drawn before the walls and they painted over
  it. A face drawn last now keeps its place: no face moves across it.
- A face with a corner at or past the eye, which the perspective
  projection holds just in front of the eye, no longer gets a plane,
  so its depth is not measured on a plane its drawing does not match.
- docs/three-d.md states the masked member rule in Groups as the
  Fills and strokes section does, and docs/target-app-parity.md cites
  the Inflate test by its name.
2026-11-13 07:23:56 -08:00
BFlat 7fb0a5b51b Merge pull request #7088 from dotCooCoo/fix/panel-drags-primary-button
Panels: item drags start only with the primary button, as Layers does
2026-11-13 22:23:19 +07:00
dotCooCoo 07522fb4e6 Tests: ui-egui tests remove the temp folders they make
Place, taskbar, opening, Save Options, Missing Fonts and one control
test left their folders in the system temp folder after every run.
Other opening and control tests removed theirs only at the end of a
passing test, so a failing one left its folder.

- A test-only Folder guard (crate::tests_folder) removes its folder
  with everything in it when dropped, also when the test panics, as
  the find-files tests' Tree guard does (#6948).
- The opening and control tests that made their own folders use it.
- Each Place test gets its own folder instead of one shared per-process
  folder, so one test's cleanup cannot remove another's files.
- The Missing Fonts helper no longer removes and remakes the folder
  vectorcraft_testkit::temp_dir made, which keeps it owner-only on Unix.
- vectorcraft_testkit::temp_dir is unchanged.
2026-11-13 07:14:08 -08:00
dotCooCoo 7f18643ada Type: measuring a threaded frame copies its own text once
Each measurement of a frame's share started from a copy of the whole frame, its own runs included, and then replaced the runs. The frame is now copied once without its own text, and each measurement copies that. A test counts the frame text copied to measure frames that already hold text.
2026-11-13 07:12:59 -08:00
dotCooCoo fb9160be7a Paths: Delete, Cut and Cut Path read each subpath's own selected anchors
Clear, path.deleteAnchors, Cut, Copy and Cut Path scanned every selected
anchor or segment of a path once for each of its subpaths, so a path with
thousands of subpaths took time that grew with the square of their count.
The selection sets are ordered by subpath, so a new helper, subpath_refs,
reads one subpath's entries with a range lookup instead. The results are
unchanged.

With one selected interior anchor on each of 8,000 open subpaths of one
path, Clear took a median of 74 ms of thread CPU time before and 3 ms
after (release build, five runs each; the timings are noisy because the
CPU was shared and loaded).

Tests in delete_path_pieces.rs check exact surviving subpaths and their
order for anchor and segment selections across open and closed subpaths,
an untouched subpath, references to missing subpaths and indexes, one
Undo/Redo step and a second Clear, and Cut Path on several subpaths.
2026-11-13 06:58:01 -08:00
dotCooCoo ccb14182e9 Plug-ins: plugin.install approves from the grant it checks again, and others wait for its store writes
Without a plug-in store, plugin.install read the process grant once
for its later check and again for its approval. A grant another session
recorded between the two reads approved the module; when that session
revoked it before the install, the check saw the grant it first read
and the install recorded the revoked grant again. The approval now comes
from the first read.

plugin.install published the plug-in before it wrote the module and its
grant to the Plug-ins folder. A plugin.remove in another session in
between removed the plug-in, its file and its grant, and the install then
wrote both back, so the plug-in loaded with its grant at the next launch.
A session attaching the folder in between loaded the old version, which
kept running while the folder held the new one. plugin.remove, loads of
the stored plug-ins and loads of a plug-ins folder now wait until an
install has written the folder, and an install waits for them.

Docs: docs/plugins.md, docs/target-app-parity.md.
2026-11-13 06:56:24 -08:00