Commit Graph
7772 Commits
Author SHA1 Message Date
BFlat 653ecc8216 Merge pull request #6935 from dotCooCoo/fix/eps-linear-time-test-steps
EPS tests: the reader's long tests check counts and shared state instead of a 20 s limit
2026-11-13 03:27:59 +07:00
BFlat e98d88ec7a Merge pull request #6880 from dotCooCoo/fix/i18n-plugin-messages
i18n: plug-in host errors are translated in every complete catalog
2026-11-13 03:27:51 +07:00
BFlat 484915de53 Merge pull request #6947 from dotCooCoo/fix/shortcut-rows-same-name
Keyboard Shortcuts: rows with the same name get names of their own
2026-11-13 03:27:42 +07:00
BFlat 8e9d9b7f89 Merge pull request #6948 from dotCooCoo/test/findfiles-remove-temp-trees
Tests: findfiles tests remove the folder trees they make
2026-11-13 03:27:34 +07:00
BFlat 9507b88bad Merge pull request #6953 from dotCooCoo/fix/canvas-still-wait-placed-generation
Canvas: each document keeps its own placed-bitmap value in the frame key
2026-11-13 03:27:26 +07:00
BFlat 28d97a82a8 Merge pull request #6954 from dotCooCoo/fix/trace-logo-flatness-own-colors
Image Trace: Flat Logo judges flat art by the image's own colors
2026-11-13 03:27:17 +07:00
BFlat f976979a2f Merge pull request #6955 from dotCooCoo/fix/blend-profiles-follow-key-start
Blend: stroke profiles turn with a key path started at another anchor
2026-11-13 03:27:08 +07:00
BFlat 41f384bffc Merge pull request #6921 from dotCooCoo/fix/ai-save-cmyk-equivalents-stable
.ai save: RGB and named colors keep their CMYK equivalents when a reopened file is saved
2026-11-13 02:47:37 +07:00
BFlat bc882d1fc0 Merge pull request #6910 from dotCooCoo/fix/library-ids-and-save-replies
MCP: a hidden library's shown id names it in requests, and replies hide its path wherever it appears
2026-11-13 02:47:27 +07:00
BFlat a2899e538b Merge pull request #6894 from dotCooCoo/fix/read-roots-error-messages
Automation: errors name a path outside the read roots by its file name
2026-11-13 02:47:17 +07:00
BFlat 813b24b0a5 Merge pull request #6835 from dotCooCoo/feat/blend-canvas-easing-handles
Blend: on-canvas widgets set a selected blend's color shift and easing
2026-11-13 02:47:08 +07:00
BFlat e58807ce07 Merge pull request #6851 from dotCooCoo/fix/recovery-held-crashed-areas
Data Recovery: restore and discard act on copies kept by an area they already hold
2026-11-13 02:46:57 +07:00
BFlat ace6e9839d Merge pull request #6926 from dotCooCoo/feat/recent-colors-to-swatches
Color: a recent color drags into the Swatches panel to become a swatch
2026-11-13 02:46:48 +07:00
BFlat 86f8a6dcbd Merge pull request #6927 from dotCooCoo/fix/roughen-size-zero
Effects: Roughen at size 0 keeps the outline
2026-11-13 02:46:39 +07:00
BFlat 977ed77b72 Merge pull request #6916 from dotCooCoo/feat/font-menu-wide-layout
Font menu: one wide layout wherever it opens, with larger samples
2026-11-13 02:46:30 +07:00
BFlat 339e33a4df Merge pull request #6905 from dotCooCoo/fix/type-size-range-error
Type: text.create and the type style commands refuse a size outside 0.1 to 1296 pt
2026-11-13 02:46:20 +07:00
BFlat d22d3ced48 Merge pull request #6931 from dotCooCoo/fix/eps-cshow-kshow-restore-font
EPS import: cshow and kshow procedures see the font PLRM gives them
2026-11-13 02:46:10 +07:00
BFlat 036c563635 Merge pull request #6820 from dotCooCoo/feat/brushes-ink-wash-library
Brushes: built-in Ink and Wash library with tapered ink, brush pen and wash brushes
2026-11-13 02:46:00 +07:00
BFlat e263a9c7d6 Merge pull request #6895 from makesomethingshit/fix/6865-ai-oversized-artboard
Fix #6865: Keep oversized artboards when opening editing data
2026-11-13 02:45:43 +07:00
dotCooCoo 74e61c9b74 Image Trace: Flat Logo judges flat art by the image's own colors
With logoColors named, Flat Logo measured how flat the image is against
the named colors. A solid pixel counts as flat only within 22 (RGB
distance) of one of those colors or white. Flat art whose named colors
were 20 levels off in every channel was refused as not flat, and the
refusal score of a gradient changed with the names.

The check now uses the image's own colors, found the same way as when
no colors are named. It looks for as many colors as are named, with
white, or as the Colors setting gives, whichever is more. How far the named colors are
from the image's colors no longer changes whether the image is refused.

This changes one existing behavior: an image with large areas of a
color that was not named used to be refused, and it is now traced in
the named colors.

Docs: docs/image-trace-adjustments.md, docs/target-app-parity.md, the
imageTrace.make params text.
2026-11-12 10:48:20 -08:00
BFlat fa29ea67b9 Merge pull request #6933 from storytold/fix/hpgl-ew-adaptive-line
Dashes fitted to corners take a subpath with no segments
2026-11-13 01:43:44 +07:00
dotCooCoo c7780becb3 Tests: findfiles tests remove the folder trees they make
tree() in crates/engine/src/cmd/findfiles/tests.rs returns a Tree guard
that holds the canonical path and removes the folder with everything in
it when it is dropped, also when the test panics. When the removal
fails, the guard gives the owner read, write and search permission on
every folder in the tree (Unix; links are not followed) and removes it
again, so a test that panics while a folder is locked leaves nothing
behind. A removal that still fails is ignored.

tree() empties the folder temp_dir returns in place instead of removing
and remaking it, so on Unix the folder keeps the owner-only mode that
temp_dir sets.
2026-11-12 10:38:06 -08:00
dotCooCoo 092f28feb3 Canvas: each document keeps its own placed-bitmap value in the frame key
The canvas cache key held the process-wide placed-document bitmap
generation, so a bitmap made for a file that only another document holds
changed every document's key, and the next frame differed from the
frame shown in more than the view. In the web build, which has no render
worker, a heavy canvas then rendered in the middle of a pan instead of
waiting until the view was still. On desktop the pan dropped its
low-resolution fill, and the render worker did not copy pixels from its
last frame.

Each document now keeps its own value, checked once per generation
change, as the plug-in key is. The value moves to the current generation
when the document shows a placed document of a file whose bitmap was
made. A file kept only for Undo does not count. When more bitmaps were
made since the last check than are recorded, the value moves when the
document shows a placed document of one of its images. After the
value moves, the part of the frame to draw again comes from the bitmaps
made since the last check before the move, so bitmaps made earlier for
other documents no longer make the whole frame render.

The canvas tests that retried or tolerated a new frame when another test
made a bitmap now assert without those workarounds.
2026-11-12 10:38:06 -08:00
dotCooCoo 7b97708c43 Blend: stroke profiles turn with a key path started at another anchor
When a blend starts a key's path elsewhere (an open path clicked at its
last anchor, a closed path turned to another start or reversed to match
the other key's winding), the steps now read that key's width profile,
pen pressure, tilt, bearing and rotation along the turned path, and a
reversed open path's arrowheads swap ends. A width profile's sides swap
when its path is reversed, a closed path's samples move past the new
start keeping the step at the old one, and a split width span is sampled
so its curve keeps its shape. A key whose subpaths turned differently
keeps its stroke as it is.

Width profiles in the steps also keep their discontinuous points instead
of only the width before them, and are sampled between their points so
each key's curve keeps its shape where the other key adds points; keys
whose points sit at the same positions are not sampled, so a preset on
both keys stays that preset. A sample of one key that lies within a
millionth of the other key's step no longer hides that step.
2026-11-12 10:38:00 -08:00
dotCooCoo 41f6400993 Keyboard Shortcuts: rows with the same name get names of their own
Several rows of Edit › Keyboard Shortcuts had the same group and label,
so a user could not tell them apart: the four Window › Other Library…
commands, File › New… (file.new and file.newDialog), Type › Fit
Headline (text.fitHeadline and type.fitHeadline), Ui › Reset Panel (the
character and paragraph style options) and File › Continue in
Background (export and open).

Rows that would share an English name now take a name of their own:
- a command that an item of the menu bar runs is listed under that
  item's menu path, for example Window › Swatch Libraries › Other
  Library…;
- a command whose id extends another command's id is listed under that
  command's label, for example Character Style Options › Reset Panel;
- the rows that still share a name show their id after it, except the
  one row an item of the menu bar runs, so File › New… stays the New
  Document dialog's row and file.new is File › New… (file.new). Two
  filter plug-ins with the same menu path and label show their ids too.

shortcuts.list gives the new group of the first two kinds of rows in
`group`. The dialog's search finds a row by the id it shows. A message
about a shortcut that is already in use names every row that has it by
its whole name, with its group, instead of its label alone.
2026-11-12 10:32:03 -08:00
dotCooCoo 8816b22f41 Merge main into fix/i18n-plugin-messages 2026-11-12 10:10:15 -08:00
BFlat a15a4abc5c Merge pull request #6751 from dotCooCoo/feat/eps-save-use-artboards
EPS: Save As shows Use Artboards, off by default, and the box fits all visible art
2026-11-13 00:51:58 +07:00
BFlat c62d1d8713 Merge pull request #6908 from dotCooCoo/fix/actions-toggle-limits
Actions: recording, step exclusions and set edits keep sets that Load Actions reads
2026-11-13 00:50:37 +07:00
BFlat a4357a7ad5 Merge pull request #6915 from dotCooCoo/fix/assign-profile-keeps-color-settings
Color management: assigning the working profiles keeps the active color settings
2026-11-13 00:50:24 +07:00
BFlat 30fbb81778 Merge pull request #6918 from dotCooCoo/fix/blend-steps-interpolate-pen-data
Blend: steps of brushed strokes interpolate the pen pressure, tilt and angles
2026-11-13 00:50:15 +07:00
BFlat f63827478c Merge pull request #6892 from dotCooCoo/fix/trace-gray-photos-smoothed
Image Trace: gray photos are smoothed before tracing, as color photos are
2026-11-13 00:49:52 +07:00
BFlat 80359e415f Merge pull request #6874 from dotCooCoo/fix/script-failed-run-keeps-no-place
Scripts: a named engine keeps no source map for a run whose script does not compile
2026-11-13 00:49:38 +07:00
BFlat 77d8113073 Merge pull request #6924 from dotCooCoo/fix/followup-5139
.ai import: cite the sources of the Distort & Transform effect keys
2026-11-13 00:49:28 +07:00
BFlat 8bf4de0a5a Merge pull request #6919 from dotCooCoo/feat/bbox-follows-move-and-draw
Selection: Show Bounding Box While Moving and Drawing shows the box during moves and shape drawing
2026-11-13 00:49:17 +07:00
bflatastic cfce336215 Dashes fitted to corners take a subpath with no segments
An HP-GL wedge of almost no radius drawn with an adaptive line type
(LT-1;EW0.000001,0,0;) leaves a lone moveto. Fitting the dashes to its
corners indexed the empty segment list and panicked while rendering. Such
a subpath now uses the exact plan, which has no runs to fit.

Found by import_fuzz::random_hpgl_instructions_never_panic.
2026-11-13 00:47:30 +07:00
dotCooCoo 369de5bc4c Merge main into fix/read-roots-error-messages 2026-11-12 09:45:21 -08:00
dotCooCoo 812cf5f4cd .ai save: RGB values are written in the working RGB space
Plain RGB fills and strokes and RGB gradient stops were written with
their display RGB values. The reader reads those values as working RGB,
so with a working RGB space other than sRGB a reopened file was saved
with different RGB values and CMYK equivalents. They are now written
with the color's own RGB values, as global process and spot colors
already were.

A spot color in a gradient stop now writes its RGB values from its full
color as the palette writes it (Lab to four decimals and clamped), the
same values its CMYK equivalent comes from.
2026-11-12 09:40:31 -08:00
dotCooCoo 6213d1c471 EPS tests: the reader's long tests check counts and shared state instead of a 20 s limit
many_tiling_patterns_and_spot_inks_read_in_linear_time checked that a
program setting 200,000 different tiling patterns and 200,001 spot inks
reads within 20 s of wall-clock time. It reads in about 4 s alone; while
the crate's full test suite ran in parallel it took more than 20 s and
failed.

In test builds, the tiling pattern lookup now counts on its thread how
many patterns it compared with the one it looked for (tilings_compared,
gated with cfg(test) like SELECTOR_TESTS in the SVG reader's CSS). The
test, renamed many_tiling_patterns_are_found_again_through_a_hash, reads
through import on a thread of its own and asserts that its 200,000
lookups compared at most 200,000 patterns in all. When every pattern
hashes alike, as when each lookup went through every pattern made so
far, the lookups compare 19,999,900,000 and the test fails. The test
still reads the 200,001 spot inks and checks their swatches, but it does
not count or time their lookups.

The other tests that read through read_soon wait 300 s instead of 20 s,
as a guard against a read that never ends; their budgets and limits
decide what they check. work_on_the_longest_dash_pattern_ends_soon (4.5 s
alone) now also checks that the states gsave, grestore, gstate,
currentgstate and setgstate save, make or set hold the one 65,535-entry
dash pattern, so a copy of the pattern in any of them fails it.
2026-11-12 09:38:05 -08:00
dotCooCoo 60fd410906 Merge main into fix/type-size-range-error 2026-11-12 09:30:29 -08:00
dotCooCoo 075fff4c6d Merge main into fix/library-ids-and-save-replies 2026-11-12 09:29:20 -08:00
dotCooCoo 4e8cd99fff Merge main into feat/font-menu-wide-layout 2026-11-12 09:28:19 -08:00
dotCooCoo 3e46408ab5 EPS import: cshow and kshow procedures see the font PLRM gives them
In a CID-keyed font whose CIDFont the file only names, a cshow procedure
now runs with the CIDFont as the current font, rootfont gives the
composite font, and the procedure gets each code's last byte. A show in
the CIDFont shows the character of that code, and any other string is a
rangecheck error. The current font is restored after each procedure.

A kshow procedure no longer leaves a font it sets current: the current
font is restored when the procedure completes, for every font, and a
kshow the procedure runs sees the font the procedure set.

In GBT-H and CNS2-H, whose mappings are not read, a byte that starts no
row-and-cell code is a code of its own.

docs/gaps.md dates this G9 work in a bullet of its own.
2026-11-12 09:25:14 -08:00
dotCooCoo bccb0f177e Merge main into fix/i18n-plugin-messages 2026-11-12 09:23:31 -08:00
makesomethingshit 777fb2fa42 Merge upstream/main into fix/6865-ai-oversized-artboard 2026-11-13 02:19:20 +09:00
dotCooCoo c8a6b4d9c3 MCP: a base64 thumbnail in a reply is sent as it is
Under automation read roots, a reply's base64 `thumbnail` (a library
item's PNG in `library.get`, a page's PNG in `document.pdfInfo`) was
searched for hidden library paths like any other text, so a short path
that happened to occur in the encoded bytes was rewritten and the image
broke. `thumbnail` now joins `dataBase64`, `pngBase64` and
`thumbnailBase64` as encoded data that is left unchanged; text under it
that is not base64 is still searched.
2026-11-12 09:12:40 -08:00
dotCooCoo f42b46e5eb Merge main into fix/recovery-held-crashed-areas 2026-11-12 09:00:02 -08:00
dotCooCoo 2d46dcc533 Actions: a deleted recording action does not limit recorded commands
When the action New Action made for the recording in progress is deleted,
Stop Playing/Recording keeps none of the recorded steps. The step and
file limits measured a new action in the original set instead, so a
recorded command could be refused while the set's file was near 8 MiB.
The recording now has no target in that case, and no limit applies.
2026-11-12 08:59:08 -08:00
dotCooCoo 5a7d445807 Merge main into fix/script-failed-run-keeps-no-place 2026-11-12 08:55:15 -08:00
dotCooCoo 91e1412d77 Effects: Roughen at size 0 keeps the outline
With Size 0, Roughen moved no point but still replaced each segment
with its Detail's points joined by straight lines (Corner) or by a
smoothed curve through them (Smooth), so a curved path lost its shape.

At Size 0 each segment is now split at the Detail spacing into pieces
of equal length on the segment itself, with `pathtools::insert_at`: a
straight segment gets corner points without handles, and a curve gets
smooth points whose handles follow it. The path keeps its outline with
Smooth or Corner points alike. The params text of `distort.roughen`
describes size 0.

`insert_at` now counts the anchors added before each returned mark in
one pass. It counted them again for every split segment, which took
quadratic time on a path with many split segments. Its results are
unchanged.

Existing documents with a Roughen of Size 0 on a curved path, or with
Smooth points, draw differently.

This is VectorCraft's own rule. What Roughen does is described in
https://helpx.adobe.com/illustrator/desktop/manage-objects/reshape-transform-objects/distort-and-transform-effects-in-illustrator.html
2026-11-12 08:55:07 -08:00
BFlat 2304b38f19 Merge pull request #6907 from dotCooCoo/feat/art-brush-width-pen-pose
Brushes: Art Brush Options' Width can follow the pen's tilt, bearing and rotation
2026-11-12 23:54:29 +07:00