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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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