Commit Graph
7944 Commits
Author SHA1 Message Date
BFlat 2ac2ac0926 Merge pull request #5449 from storytold/about-credits-columns
About: credits tables fit without side-scrolling and their columns resize
2026-11-04 09:21:24 +07:00
BFlat 2ac542d6b5 Merge pull request #5453 from FrancoJacquet/fix/stroke-set-unknown-keys
Check stroke.set params: a misnamed key is refused (#1442)
2026-11-04 09:20:54 +07:00
BFlat 15690df5a1 Merge pull request #5470 from vangel76/perf/trace-parallel-component-fit
Image Trace: fit the components of a layer in parallel, in chunks (#5464)
2026-11-04 09:20:34 +07:00
BFlat 1af19f722c Merge pull request #5469 from vangel76/perf/trace-all-within-hasher
Image Trace: all_within hashes its grid cells with a small hasher (#5463)
2026-11-04 09:20:19 +07:00
BFlat 52fc5424a7 Merge pull request #5467 from vangel76/perf/trace-denoise-union-find
Image Trace: noise removal keeps its regions in u32 arrays (#5462)
2026-11-04 09:20:05 +07:00
BFlat ae5f581615 Merge pull request #5458 from vangel76/perf/5454-trace-smooth-weight-table
Trace: look up the smoothing weights instead of computing them per pixel (#5454)
2026-11-04 09:19:50 +07:00
BFlat 9705a6056c Merge pull request #5441 from storytold/fix/sec-linear-scans-r7
Linear-time scans: Add Anchor Points, swatch library adds, export placements, width profiles, symbolism previews
2026-11-04 09:19:35 +07:00
BFlat c93fe25666 Merge pull request #5460 from vangel76/perf/5455-offset-spurious-check
Offset Path: skip far segments and stop early in the spurious-contour check (#5455)
2026-11-04 09:19:21 +07:00
BFlat 25fd04c0d8 Merge pull request #5474 from vangel76/fix/pathops-input-hardening
Path booleans: refuse out-of-range input, guard the contour pass, cuts report refusals (#5465)
2026-11-04 09:19:06 +07:00
BFlat 599baf89fe Merge pull request #5443 from storytold/fix/sec-bounded-flatten-print
Bound work: flattening of huge curves, print layout past the page limit, script-check file names
2026-11-04 09:18:50 +07:00
BFlat 36315a2f0e Merge pull request #5437 from ruchirguitar/fix/5369-activation-follow-ups
Opening an already-open file: close Home, check read roots, wait for dialogs (#5369 follow-ups)
2026-11-04 09:18:39 +07:00
BFlat f3fed07f4a Merge pull request #5471 from dotCooCoo/fix/ai-save-option-errors
.ai save: errors and notes name the legacy or non-PDF-compatible .ai
2026-11-04 09:18:23 +07:00
BFlat ba9038cbfa Merge pull request #5466 from dotCooCoo/feat/dxf-lines-and-arcs-as-bulged-polylines
DXF: paths of lines and circular arcs export as polylines with bulges
2026-11-04 09:18:07 +07:00
BFlat 43f01fe230 Merge pull request #5472 from dotCooCoo/fix/projective-conjugated-scale-invariant
Geometry: inverses and conjugates by small affines are no longer refused
2026-11-04 09:17:53 +07:00
BFlat 88ff58b081 Merge pull request #5428 from dotCooCoo/fix/effect-dialog-compound-target
Read compound effects when opening effect dialogs
2026-11-04 09:17:39 +07:00
BFlat f563cb8b5d Merge pull request #5440 from dotCooCoo/fix/photocraft-app-paths-unicode
Edit Original: read PhotoCraft's App Paths entry as UTF-16 on Windows
2026-11-04 09:17:24 +07:00
BFlat 75ab8ecd7e Merge pull request #5438 from dotCooCoo/fix/measure-shift-keeps-step
Measure tool: Shift keeps the end on the pointer's step after the grid rounds it
2026-11-04 09:17:09 +07:00
BFlat 56ca3a7375 Merge pull request #5432 from dotCooCoo/fix/dimension-drop-placement
Keep dropped placement presses from creating dimensions
2026-11-04 09:16:53 +07:00
BFlat 5cb5ed1dd1 Merge pull request #5434 from dotCooCoo/fix/blend-drop-pick
Keep Blend reset after a dropped press
2026-11-04 09:16:39 +07:00
BFlat 3d5755da94 Merge pull request #5435 from dotCooCoo/fix/mcp-docs-own-wording
Docs: replace quoted help-page sentences with plain statements
2026-11-04 09:16:23 +07:00
BFlat 32a5b20b71 Merge pull request #5433 from dotCooCoo/fix/actions-doc-wording
Use original wording for Action Options documentation
2026-11-04 09:16:13 +07:00
BFlat 84303c7ad2 Merge pull request #5452 from dotCooCoo/fix/gdef-caret-formats
Resolve GDEF contour-point ligature carets
2026-11-04 09:15:58 +07:00
BFlat 399204566a Merge pull request #5468 from dotCooCoo/fix/vertical-path-upright-hit
Type: the stop inside an upright ligature on a vertical path follows its drawn cell
2026-11-04 09:15:43 +07:00
BFlat f3f25150e3 Merge pull request #5425 from dotCooCoo/fix/find-font-skip-status
Clear stale Find Font warning after successful replacement
2026-11-04 09:15:29 +07:00
BFlat a220bbbf51 Merge pull request #5473 from dotCooCoo/fix/ot-tag-double-sign
Reject doubly signed OpenType feature tags
2026-11-04 09:15:13 +07:00
BFlat ea587a1c0b Merge pull request #5430 from dotCooCoo/fix/render-native-thread-helper
Render: keep the native thread helper out of Wasm libraries
2026-11-04 09:14:59 +07:00
FredAppsandClaude Opus 5.5 b91f527c91 About: credits tables fit without side-scrolling and their columns resize
The Contributors table and the Models table were egui Grids inside a
two-way scroll area: they opened wider than the dialog, so they scrolled
sideways, and Company and Model sat almost touching. Both are now
egui_extras tables. Each column opens at the width of its header and widest
cell, the spare width goes to the text columns (Name; Company and Model),
and every column edge can be dragged. Widening a column grows the table
like a spreadsheet, and only then does it scroll sideways; the header stays
put while the rows scroll. Counts and dates are right-aligned and every
cell is vertically centred.

The sorted column stays highlighted and its direction shows on the
toolbar's sort-order button, so headers no longer reserve room for an
arrow. The opening widths come from fit_widths, a pure function with unit
tests that a fitted table fills its room exactly and that only the text
columns give way when room is short.

The About dialog opens 820 points wide, so every column fits at its natural width.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 08:13:55 +07:00
Franco Jacquet c16c833c58 Check stroke.set params: a misnamed key is refused (#1442)
Squashed from #5453 onto main.
2026-11-04 08:13:52 +07:00
vangel76andClaude Sonnet 5.5 f258124086 Component fit chunking: review fixes (#5464)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-04 08:13:32 +07:00
vangel76andClaude Sonnet 5.5 007e15ad8b Image Trace: fit the components of a layer in parallel, in chunks (#5464)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-04 08:13:32 +07:00
vangel76andClaude Sonnet 5.5 6ede10de4d all_within hasher: mix the high bits into the low ones (#5463)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-04 08:13:28 +07:00
vangel76andClaude Sonnet 5.5 f4ba106e39 Image Trace: all_within hashes its grid cells with a small hasher (#5463)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-04 08:13:28 +07:00
vangel76andClaude Sonnet 5.5 c0465969c8 Denoise: comment fixes from review (#5462)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-04 08:13:25 +07:00
vangel76andClaude Sonnet 5.5 63b8c88168 Image Trace: noise removal keeps its regions in u32 arrays (#5462)
Regions are a linked list of pixels with a union-find over region ids instead of a Vec<usize> per region and BTreeMaps per merge. Same merge order and output; about 2.7x less peak memory and up to 1.9x faster on 25 MP noisy labels.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-04 08:13:25 +07:00
vangel76andClaude Sonnet 5.5 f75616af54 contributors: set display name for vangel76
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-04 08:13:22 +07:00
vangel76andClaude Sonnet 5.5 a84ab2f14a contributors: credit vangel76 as Valentin Klein
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-04 08:13:22 +07:00
vangel76andClaude Sonnet 5.5 df3f18329e Trace: cover the column pass and mixed pairs in the smoothing tests (#5454)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-04 08:13:22 +07:00
vangel76andClaude Sonnet 5.5 5bc34676ce Trace: look up the smoothing weights instead of computing them per pixel (#5454)
The bilateral smoothing pass worked out a squared colour distance, a powi, a
division and a weight for every pixel and neighbour, and called round() per
channel. The distance is a whole number up to 195,075, so the weights come from
a table built once per trace, and the rounding is a truncation plus a compare
that gives the same level as round() for 0..=255. Rows are read through slices.

The output is byte for byte what it was; tests compare the pass with the old
formula on several images and on every pair of grey levels.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-04 08:13:22 +07:00
Dylan M. Taylor fc83e5c5b9 address review: same distance test in width profile lower bound; preview the whole drag when a symbolism tool deactivates 2026-11-04 08:13:18 +07:00
Dylan M. Taylor 13b0bbe639 Linear-time scans: Add Anchor Points, swatch library adds, placed-document export, width profiles, symbolism previews
Add Anchor Points builds the new anchor list in one pass, Swatch Library add looks names up in sets, full_documents dedups placed keys with a set, width profile lookups and mark insertion use binary search, and the symbolism tools cap and thin the previews of a long drag as Liquify does.
2026-11-04 08:13:18 +07:00
vangel76andClaude Sonnet 5.5 63aeefbd6c Offset Path: scale the box slack with the coordinates and tighten the tests (#5455)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-04 08:13:15 +07:00
vangel76andClaude Sonnet 5.5 445e954ec9 Offset Path: skip far segments and stop at the first near one in the spurious-contour check (#5455)
For every hole (when growing) or island (when insetting), the check measured the
distance to every segment of the input with the nearest-point search and took the
minimum, so the cost grew with holes x segments. Segment bounding boxes are now
computed once, a segment whose box is farther than the offset distance is skipped,
and the search stops at the first segment that is close enough. The decision is the
same as before; a test compares it with the old full scan on random segment sets.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-04 08:13:15 +07:00
vangel76andClaude Sonnet 5.5 0a2935cf8f Booleans: limit of one unit, crop outside shortcut, tests (#5465)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-04 08:13:12 +07:00
vangel76andClaude Sonnet 5.5 e951095617 Path booleans: refuse out-of-range input, guard the contour pass, cuts report refusals (#5465)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-04 08:13:12 +07:00
Dylan M. Taylor 9cd997b9aa address review: draw a line for curves with far-out start or control points in flatten 2026-11-04 08:13:07 +07:00
Dylan M. Taylor 0e64aca557 Bound work: flattening of huge curves, print layout past the page limit, script-check file names 2026-11-04 08:13:07 +07:00
ruchirguitarandClaude Opus 5.5 079f5389a6 opening::poll stops once a file it opens asks a question
Of two files read off the UI thread and ready in the same frame, the
first could open and ask about its links or fonts, and the second then
became the active document under that dialog. poll now checks
may_switch after each file it opens too, and leaves the rest for a
later frame.

The queued-reopen test also checks that a later queued activation
stays queued.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 08:13:04 +07:00
ruchirguitarandClaude Opus 5.5 e2c8c503c1 opening::poll stops once a queued reopen asks a question
A document asked for again while a dialog was open, and closed
meanwhile, opens again when the dialog closes and may ask about its
links or fonts. poll went on to finish the files read meanwhile, and
each became the active document under that dialog. It now checks
may_switch after each queued activation and leaves the rest, and the
files ready to open, for a later frame.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 08:13:04 +07:00
ruchirguitarandClaude Opus 5.5 72cf1a9b3c Queued tab activations keep the file access scope they were asked in
A document asked for again while a dialog was open was queued by path
only, and opened later in the scope of the frame that ran the queue. A
request confined to automation roots could then read a file outside
them, if the document was closed meanwhile and its path became a link
out of the roots. Each queued activation now carries its ScopeHandle
and runs in it, as background opens already do.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 08:13:04 +07:00
ruchirguitarandClaude Opus 5.5 8f66e2b694 Focusing an open tab closes Home, checks read roots and waits for dialogs
Follow-ups to #5369 (#5420), from its last review:

- Home shown over the document asked for again gives way to it.
- Automation confined to some folders can't reach an open document
  outside them: open_file checks read access before looking for a tab.
- While a dialog or a drag acts on the active document, a document asked
  for again comes to the front once it ends (opening::poll), as a file
  that finishes opening already does.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 08:13:04 +07:00