Commit Graph
6469 Commits
Author SHA1 Message Date
dotCooCoo c3cd065ef3 Character and Paragraph Styles: Alt-click on New asks for the new style's name
Squashed from #4402 onto main.
2026-10-30 00:15:55 +07:00
dotCooCoo 0ee5fc0a9e Type: Cmd/Ctrl+Shift+U underlines, and Cmd/Ctrl+Alt+Shift+C and H toggle the line composer and hyphenation
Squashed from #4383 onto main.
2026-10-30 00:15:55 +07:00
dotCooCoo 316d28407f Window: Cmd+F6 and Cmd+Shift+F6 go to the next and previous document
Squashed from #4377 onto main.
2026-10-30 00:15:55 +07:00
bflatastic 148517f3eb Artboard labels: one helper for the artboards the Artboard tool labels itself 2026-10-30 00:15:54 +07:00
el-j 7064969327 fix(canvas): resolve clippy wildcard import and rebase conflicts on canvas artboards 2026-10-30 00:15:54 +07:00
el-j 1670fe4c41 fix(canvas): capture Shift from pointer events for artboard label selection 2026-10-30 00:15:54 +07:00
el-j 49a05508ab fix(canvas): allow multi-selecting artboards via Shift-click on canvas label (#4484) 2026-10-30 00:15:54 +07:00
VoiceLessQ 401706ff8b PDF import: each Contents object is read once when naming a refused stream
Pages that share one Contents array made the name of a refused stream read that array once per page, quadratic in a crafted file. Each object is now read once, and a page's own array as before. From the review of #4612.
2026-10-30 00:15:54 +07:00
VoiceLessQ f0865193a8 PDF import: a page's content listed in an array object is named as content
A page's Contents can be an array written as an object of its own (/Contents 6 0 R). Its streams were named "a stream in it": the reference was compared with the stream, not the array's items. From the review of #4603.
2026-10-29 23:39:24 +07:00
Ridzzz0Alam c403ad762f Properties: Properties doesn't offer Offset Path and Simplify for type alone (#2238)
The Quick Actions listed Object › Path's Offset Path and Simplify for every
selection, but both take paths: with type selected, the dialog opened and
could only fail ("Offset Path: select paths"). They are now left out when
every selected object is type, as Lock and Isolate Group are when they can't
run; live type offsets through the Appearance panel's Effect › Path ›
Offset Path, which works on type.
2026-10-29 23:39:21 +07:00
el-j 82e4fc422c perf(effects): reorder pure-translation Transform copies after round-join terminal Offset Path (#4145)
Follow-up to #4345 / #4145 per maintainer guidance from @bflatastic.

- In `crates/effects/src/geometry.rs` & `crates/effects/src/reshape.rs`:
  - Implements `optimize_geometry_effects`: reorders pure-translation Transform effects
    with copies after a terminal round-join Offset Path effect when the effective style is safe
    (NonZero fill and no stroke).
  - Offsetting a union equals the union of offsets for round (Minkowski) offsets; moving
    pure-translation copies after the terminal offset evaluates Offset Path once on the base
    geometry rather than over dozens of multiplied copies, turning O(copies * segments) planar
    sweep explosion into a single fast offset plus lightweight affine copies.
  - Safely commutes across multiple consecutive pure-translation Transform effects.
  - Preserves exact visual geometry by leaving miter, bevel, EvenOdd, stroked, or non-terminal
    effect stacks in their original order.
- Added comprehensive unit and regression tests in `crates/effects/src/tests.rs`.
- Added contributor entry in `contributors/people.toml`.
2026-10-29 23:15:08 +07:00
VoiceLessQ ac3982c68a Windows: keep OpenGL for a GPU without Direct3D 12 and for a named adapter (#4150)
Follow-up to #4600, from its review. A start left OpenGL out whenever
Direct3D 12 listed an adapter, and WARP, its software adapter, is
always listed. So a GPU without a Direct3D 12 driver, which drew
through OpenGL before, now drew on the CPU. An adapter that
WGPU_ADAPTER_NAME named was left out too when it was an OpenGL one.

OpenGL is now listed when Direct3D 12 lists no hardware adapter and
when WGPU_ADAPTER_NAME is set. The Direct3D 12 check takes the shader
compiler the window does (WGPU_DX12_COMPILER, else FXC).
2026-10-29 23:14:58 +07:00
Taha-Mahmoodi 798acba6ca docs: record text copy formatting across documents in type parity checklists 2026-10-29 23:14:47 +07:00
Taha-Mahmoodi 46cc03b50a Fix #4459: retain text properties when copying text across documents 2026-10-29 23:14:47 +07:00
BFlat 8207632afe Merge pull request #4606 from storytold/fix/brush-curves-on-bends
Fix #3926: Art, Scatter and Pattern brush art keeps its curves where the path bends
2026-10-29 23:12:04 +07:00
BFlat c074ca6719 Merge pull request #4605 from VoiceLessQ/fix/3098-trace-off-the-ui-thread
Fix #3098: Image Trace traces off the UI thread, with progress and Cancel
2026-10-29 22:58:45 +07:00
bflatastic 2d92634371 Brushes: bent art keeps its curves (#3926)
Pattern, art and auto-corner brushes used to flatten the art into chords
wherever the path bends, so Expand Brush Strokes left polygons with
hundreds of corner anchors. Each art segment now comes out as cubics
matched to the bent segment's ends and derivatives and halved until they
hold to a quarter of the flattening tolerance (never below the 0.05 pt
the path is flattened to). Anchors stay anchors, lines that stay straight
stay lines, and the halving is capped in depth and in anchors: where the
fit would take more anchors than the chords, or the map gives points that
are not finite, that subpath falls back to the chords, now without the
non-finite points.

A 4-anchor circle tile round a 400 pt circle: 68 anchors a tile -> about 9,
all with handles, 0.04 pt from the bent art against 0.19 for the chords;
stroke_pieces 169 -> 244 us for the 31-tile stroke.
2026-10-29 22:44:12 +07:00
VoiceLessQ 1411a821c1 Fix #3098: Image Trace traces off the UI thread, with progress and Cancel
Tracing a photo or a large image ran inside imageTrace.make on the UI
thread, so the window froze for as long as the trace took, with nothing
to say it was working.

A trace the user asks for (Object > Image Trace > Make and Make and
Expand, the task bar's Image Trace, the Image Trace panel's Trace and
presets) now runs on a thread of its own, as heavy plug-in filters do.
The status bar says so, and after 0.4 s a progress window shows how
many of the image's colors are traced, with Cancel and Continue in
Background (imageTrace.cancelRuns, imageTrace.hideRuns).

The result goes back to the command it was prepared for
(cmd::TraceRun, Traced::hand_in), which takes it only for the same
object, image and settings, so the edit is one undo step as before. A
newer trace of the same object replaces one still running, and a trace
whose image or settings changed meanwhile changes nothing. The control
channel, MCP, scripts and the web trace at once, as before.

The tracer reports its stages and color layers to a callback and stops
when it says so (trace_watched).
2026-10-29 22:39:34 +07:00
BFlat 56340e58d0 Merge pull request #4563 from el-j/perf/svg-unique-single-pass-4555
perf(svg): compute unique ID prefix directly to avoid duplicate document serialization (#4555)
2026-10-29 22:38:15 +07:00
BFlat 21a440e05a Merge pull request #4603 from VoiceLessQ/fix/4366-name-the-refused-stream
PDF import: a refused file says which stream it trips on (refs #4366)
2026-10-29 22:37:56 +07:00
BFlat 2eb71d69ec Merge pull request #4604 from Ridzzz0Alam/fix/3209-svg-css-units
Fix #3209: SVG export writes type sizes and spacing in CSS with px
2026-10-29 22:37:37 +07:00
BFlat 59d67c274d Merge pull request #4600 from VoiceLessQ/fix/4150-windows-input-language-hang
Fix #4150: Windows doesn't start OpenGL unless a start needs it
2026-10-29 22:23:25 +07:00
bflatastic 7fd9313d06 SVG: the placeholder comment names the constant 2026-10-29 22:12:34 +07:00
el-j dc4150d7db perf(svg): compute unique ID prefix via single-pass placeholder replacement (#4555) 2026-10-29 22:12:21 +07:00
VoiceLessQ b96d35139c PDF import: a refused file says which stream it trips on (refs #4366)
Squashed from #4603 onto main.
2026-10-29 22:12:16 +07:00
Ridzzz0Alam e110c6c770 Fix #3209: SVG export writes type sizes and spacing in CSS with px
With Styling set to Internal CSS, Inline Style or Style Entities, font-size
and letter-spacing were written as bare numbers. Only presentation attributes
take a bare number; in CSS a browser drops them, so the type was drawn at its
default size. They are now written in px, SVG's user unit, and presentation
attributes keep bare numbers.
2026-10-29 22:12:07 +07:00
BFlat dcfa67183a Merge pull request #4601 from storytold/fix/pdf-repeated-form-budget
Fix #3569: a PDF that draws one form over and over can't exhaust memory or hang the import
2026-10-29 22:05:36 +07:00
VoiceLessQ 2f9e72b419 Fix #4150: Windows doesn't start OpenGL unless a start needs it
wgpu's OpenGL backend on Windows keeps a hidden window on a helper
thread that pumps no messages (gfx-rs/wgpu#10504). Windows hands an
input-language change to every UI thread of the process and waits for
each, so switching the keyboard to another layout hung the whole app,
even while it drew with Direct3D 12. OpenGL was started on every
Windows start, as the fallback.

A Windows start now lists Direct3D 12 alone. OpenGL is still listed
where it is the fallback: after a start crashed on an adapter or while
listing them (#2243), after a restart that left an adapter out, and when
Direct3D 12 lists no adapter at all (Windows 7). WGPU_BACKEND still
picks the backends as before.
2026-10-29 21:50:02 +07:00
bflatastic a7125f9e9f PDF import: bound the objects an import makes and the form content a page walks (#3569)
A page drawing one form over and over made its art again for every drawing
with no limit (a 1 KB file took 877 MB), and a form decoding to 64 MiB drawn
a thousand times hung. The import now makes at most half the objects a saved
document may hold (2M, 256K on the web), leaving the rest out with a warning,
and the scan reads at most 2 GiB of form content per page before refusing it
as past the reader's limits.
2026-10-29 21:48:36 +07:00
BFlat 71d2f159cf Merge pull request #4592 from storytold/feat/roughen-pucker-sliders
Effects: Roughen, Pucker & Bloat and Tweak show sliders (#4488)
2026-10-29 21:35:33 +07:00
BFlat e256c4c438 Merge pull request #4390 from dotCooCoo/feat/character-field-shortcuts
Character: Cmd/Ctrl+Alt+K highlights the kerning and Cmd/Ctrl+Alt+Shift+F highlights the font name
2026-10-29 21:24:44 +07:00
BFlat 1f20fc71ff Merge pull request #4389 from dotCooCoo/feat/flare-tool-shift-space
Flare: make ray rotation independent of pointer event rate
2026-10-29 21:24:22 +07:00
BFlat ffc07f7d92 Merge pull request #4381 from dotCooCoo/feat/direct-selection-alt-climbs-groups
Direct Selection: a further Alt-click adds the path's group, then the next group up
2026-10-29 21:23:58 +07:00
bflatastic fc180279a6 Effects: Tweak shows Horizontal and Vertical sliders, and its dialog shares Zig Zag's rows (#4488) 2026-10-29 21:06:58 +07:00
bflatastic d0ef81e9f7 Effects: Roughen and Pucker & Bloat show sliders (#4488) 2026-10-29 21:06:58 +07:00
BFlat 087f36d266 Merge pull request #4594 from storytold/i18n/turkish-place
i18n: Turkish "Place" is the command (Yerleştir), not the noun (Yer)
2026-10-29 21:01:19 +07:00
BFlat f9db013ae7 Merge pull request #4591 from storytold/i18n/turkish-open
Fix #4564: Turkish "Open" reads "Aç" on buttons; the Arc tool's open arc keeps "Açık"
2026-10-29 21:01:02 +07:00
BFlat eb5a992ca5 Merge pull request #4589 from Ridzzz0Alam/fix/2033-eps-fallback-layers
Fix #2033: An EPS whose layers can't be used keeps its layer tree
2026-10-29 21:00:45 +07:00
BFlat 38406ee2b6 Merge pull request #4588 from storytold/fix/direct-double-click-exits-isolation
Fix #4466: a Direct Selection double-click outside isolated art leaves isolation mode
2026-10-29 21:00:28 +07:00
BFlat 28d1b9d829 Merge pull request #4587 from gjrtimmer/fix/icon
Web build: show the app icon as the tab and home-screen icon
2026-10-29 21:00:08 +07:00
BFlat b2528ef01e Merge pull request #4584 from Taha-Mahmoodi/fix/2754-soft-return
Fix #2754: Shift+Enter inserts a soft return (forced line break)
2026-10-29 20:59:48 +07:00
dotCooCoo 41dda1029f Character: Cmd/Ctrl+Alt+K highlights the kerning and Cmd/Ctrl+Alt+Shift+F highlights the font name
Squashed from #4390 onto main.
2026-10-29 20:48:21 +07:00
dotCooCoo 5fa538ee1c Flare: the docs say Space keeps the turn and moves the flare only after the drag starts 2026-10-29 20:48:00 +07:00
dotCooCoo 6f7a6b3e67 Docs: clarify initial Space sizing and record Flare history 2026-10-29 20:48:00 +07:00
dotCooCoo c479d2eeaf Flare: rotate rays by drag distance instead of event count 2026-10-29 20:47:57 +07:00
dotCooCoo ec2744f844 Flare: the rays turn a step for each drag update up or down, and Shift holds the turn
While the center was dragged out, the rays pointed at the pointer, as a
polygon's first corner does, and Shift put them back in their original
orientation. In the reference app they turn by a step for each update
of the drag as the pointer moves up or down, and Shift stops the turn
where it is.

Each update of the center drag in which the pointer's document y grows
now adds 0.1 radian (about 5.73°) to the rays' turn, one in which it
falls takes 0.1 radian away, and one at the same y leaves the turn as
it is. Shift held keeps the turn, and turning goes on from there once
Shift is let go. Space held moves the flare without turning the rays.
General › Constrain Angle no longer sets the turn under Shift.

Docs: docs/mcp.md, docs/target-app-parity.md.
2026-10-29 20:47:53 +07:00
dotCooCoo 997826c400 Flare: a release with Space held moves the flare to the release point
The release that places the rings' end point applied the pointer's last
movement to the end point only, so with Space held the flare changed
shape instead of moving. The release now moves the center by that
movement as well. The progress doc says how Shift and General >
Constrain Angle set the rays' orientation.
2026-10-29 20:47:50 +07:00
dotCooCoo 11d65eb8a8 Flare: the drag turns the rays, Shift keeps their orientation and Space moves the flare
The reference app's Flare tool rotates the rays as the center is dragged
out, Shift constrains them to their original orientation, and Space
held moves the shape being drawn. VectorCraft's Flare tool drew the
rays in one fixed orientation and ignored Shift and Space.

shape.flare takes rotation (degrees, clockwise), which turns the rays
about the center and leaves the halo, the center and the rings as they
are. While the center is dragged out, the rays turn with the pointer,
as a polygon's first corner does, and a drag straight up leaves them
unturned. Shift keeps them unturned, or turned by General › Constrain
Angle as a polygon drawn with Shift is. Space held during the center
drag or the drag that places the rings' end point moves the flare at
its current size, and the drag goes on from there when Space is let
go, as with the shape tools.

Docs: docs/mcp.md, docs/target-app-parity.md.
2026-10-29 20:47:47 +07:00
dotCooCoo 85a0adc5b8 Direct Selection: a further Alt-click adds the path's group, then the next group up
Squashed from #4381 onto main.
2026-10-29 20:47:39 +07:00
bflatastic e446a9a69b i18n: Turkish "Place" is the command (Yerleştir), not the noun (Yer)
The Place dialog's title and button, its undo step and the Libraries panel's Place item read "Yer" (a place, a location). They all name the command, "Yerleştir".
2026-10-29 20:36:15 +07:00