Document Info's Brushes category now lists the brushes the artwork's
strokes draw with, each once with its type (Calligraphic, Scatter, Art,
Pattern or Bristle), as the Document Info panel help page describes:
https://helpx.adobe.com/illustrator/desktop/get-started/learn-the-basics/document-info-panel.html
Without Selection Only the category used to list every brush in the
Brushes panel, used or not; it now lists only the brushes art uses.
document.info adds `brushes` ([{name, type}]) and `panelBrushNames`
(the Brushes panel's brushes), and `brushNames` holds the used brushes.
Hidden strokes, strokes with no paint or width, guides, paths with no
segment, type that draws no characters, groups' and layers' own strokes,
compound path members' own strokes and image strokes without a shape
are left out. A brush the panel does not hold is listed as missing,
with a null type, and a name two panel brushes share takes the type of
the brush the renderer draws with.
Color and Grayscale traces smoothed a gray photo before choosing its
colors, but a tinted photo with the same tones skipped smoothing: the
0.065 error rule applied only to pictures whose channels stay within 8
levels of each other. A picture whose opaque pixels lie, 19 in 20, within
6 levels of one tone curve now takes the same rule. The curve runs
through the median color of each 8-level stretch along the colors' main
direction, and a pixel on it must also lie within 6 levels of the plane
the colors spread along most, so art in several unrelated colors is not
counted. The sixteen-versus-eight exception still keeps clean flat art
on the flat-art route.
A Transform effect on a group reshaped its members' paths but left the
raster effects inside it at their own values: a member's Drop Shadow
kept its 10 pt offset under a 200% Transform effect, and with Scale
Strokes & Effects on, it scaled by the mean scale without turning. The
same held for the raster effects of an object's own fills and strokes
under the object's Transform effect.
- A Transform effect that moves the art once now transforms the raster
effects of a group's members (their own and their fills' and
strokes'), of nested groups, of the art of the linked opacity masks
in it and of an object's fills and strokes, after the members' own
Transform effects: sizes scale by the mean scale and a Drop Shadow's
offset turns, reflects and scales. A raster effect that a member's
own Transform effect with copies or random holds back keeps its value
through that effect and still transforms with the group's. Scale
Strokes & Effects does not scale them a second time. A group's or
object's Transform effect that makes copies or moves at random leaves
them as before.
- The canvas, the redraw region, export, Expand Appearance, Object ›
Expand and Outline Stroke read the same values.
- The Transform effect's params text and docs/target-app-parity.md
describe the rule.
A path inside a compound path given in ids was replaced by a group inside the
compound path, which reads its members as paths, so the edges did not draw. The
compound path is now expanded in its place. The panel's Quick Actions show on
the Object tab of Revolve (Classic), not on its Rotation tab, as for the other
effects with an Object tab.
When a repeated or reflected gradient needs more stops than a limit
allows, each run now leaves out the stops that change its colors
least, so every run is still written, instead of writing fewer runs
and padding the rest with the last color. Each run keeps its ends,
sharp steps, swatch-linked stops, tint and CMYK ink changes and spans
shaped by an off-center midpoint, and the colors are compared as the
gradient's method mixes them. This applies to gradients along or across
a stroke, CSS conic gradients, and PDF, EPS and .ai export.
- Outline Stroke's mesh fits the gradient to at most 1,024 stops, and
splits a stroke into several meshes when one would hold more than
2^20 points.
- Object > Expand leaves a gradient as it is when the box needs more
than 256 runs, instead of expanding only the first runs.
- CSS writes the stop positions of repeating gradients with four
decimals, so the period stays in place across the box.
- A swatch chip of a gradient that repeats gets at least four grid
cells a run along each side (at most one a point, and 128), so it
does not show one color when the count matches the chip's cells.
- docs/mcp.md states the stop limits and the PDF import sample budget.
A bevel join, and a miter join whose miter limit bevels a corner, end the
stroke at the outer corners of the two segments they join. The visual box
measured such a corner as if the stroke reached half its weight round it:
a 40 x 100 pt triangle with a 20 pt stroke and a miter limit of 2 measured
10 pt above its tip, where the stroke paints about 1.96 pt above it. Use
Preview Bounds, and the alignment and sizing that use it, took that box.
- With bevel and miter joins, closed paths and open paths with round or
projecting caps are now measured along their segments, as butt-capped
open paths already were, with the miter tips the limit keeps and the
caps added. Round joins still reach half the weight round each corner,
the round caps of dashes, which can end at a corner, reach half the
weight all round, and the projecting caps of dashes reach the diagonal
of their square. The visual box of
such a stroke can be smaller than before and is never larger. A path
with no width, such as a rectangle sized to 0 pt wide, turns back at
its ends, where the join bevels, so its box no longer reaches past them.
- object.setBounds with Use Preview Bounds measures an object as drawn
when a beveled or mitered corner, or a butt cap, is on a segment at a
slant. Before, a closed path with miter spikes the limit keeps missed
the size typed when the width and height were out of proportion.
- A click past a bevel or a butt cap, by more than the click tolerance,
no longer selects the stroke. Strokes with a width profile or with
dashes that have round or projecting caps, and the ends of curves that
bend more tightly than half the weight, keep the round reach.
- Paths measured along their segments skip the segments that cannot
reach past the box measured so far, which starts with the path's own
bounds.
Effects apply in the order they are listed, so an effect listed after a
Transform effect applies to the art the Transform effect made, at its
own values, as an object's later effects do after the object's
Transform effect. With Scale Strokes & Effects on, a fill's or stroke's
own Transform effect scaled the effects listed after it in that fill's
or stroke's list by the mean scale: a 300% Transform turned a 5 pt
Offset Path after it into a 15 pt one, and a Drop Shadow after it took
three times its offset. With Transform Patterns or Scale Strokes &
Effects on, an SVG filter after it also had the origin of its user space
moved.
- The effects after such a Transform effect now keep their values, on
the transformed art and on each copy, on every fill and stroke a
live-effect plug-in paints the piece with, and when the copies are
counted against the effect budget.
- With Transform Objects off, the effects before it keep their values
too.
- The Transform params text, docs/target-app-parity.md and docs/gaps.md
describe the rule, and drop the note that listed an object's later
effects keeping their distances as a shortfall.
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.
A process color can't colorize a grayscale image that has an alpha channel,
and paint.setFill refuses that combination. Remove Background gave such an
image an alpha channel and kept its process colorize color. It now refuses
the run, changing nothing, when an image it is given is gray and colorized
with a process color. It checks this before any image is decoded. Another
image in the document that already has that combination does not affect a
run on other images. Black, white and spot colors still colorize the result.
The rule check_colorized applies to each image is now one function,
paint::gray_colorized_with_process, which both checks call.
Docs: docs/mcp.md (Remove Background), docs/target-app-parity.md.
When a Tabs panel indent marker gave the paragraphs of a threaded story
values of their own, the panel sent one text.setFormat for each
paragraph, and the story flowed through its frames again after every
one of them. text.setFormat now takes paragraphIndents, a list of
{id, start, leftIndent?, firstLineIndent?} entries, one per paragraph.
It checks every entry before it changes anything, rebuilds each type
object's paragraph styles once and makes the whole change one edit, so
the story flows again once. The markers send one such command inside
the same labeled command.batch, and a drag that changes no paragraph
runs nothing.
- With the Selection tool, a marker drag on any frame of a threaded
story now sets every paragraph of the story, in its locked and hidden
frames too.
- The single-value form of text.setFormat fails, naming the key, when a
number such as leftIndent is given as a string, a switch or a list.
- A null value of any text.setFormat attribute leaves it as it is, as an
omitted one does. A call whose attributes are all null fails with
"nothing to change" and records no edit and no undo step.
- A text.setFormat call whose values are the ones the text already has
returns its ids and records no edit, no undo step and no new revision.
Docs: docs/mcp.md, docs/target-app-parity.md.
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.
Edit > Assign Profile wrote the profiles it assigned into the working
settings of Edit > Color Settings. Color Settings then showed the
assigned profile as the working space, and the next change in Color
Settings saved that profile for the next start.
The working settings are now kept apart from the settings in effect.
Assign Profile still makes the profiles it assigns the ones colors show
and convert through, and assigning none puts the working space back.
Color Settings shows and saves only the working settings, and a change
there keeps the profiles the document in front is assigned in use.
color.removeProfile refuses only a working space: removing an assigned
profile in use puts the working space in its place, and loading that
profile again puts it back in use.
Public reference: "Changing the color profile for a document" and
"About color working spaces",
https://help.adobe.com/archive/en_US/illustrator/cs3/illustrator_cs3_help.pdf#page=150
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.
Paragraph panel menu > Bunri-Kinshi (with the East Asian options) and
text.setFormat {bunriKinshi} turn it on per paragraph. A line then
never breaks inside two em dashes, two horizontal ellipses, two two-dot
leaders or the two halves of a vertical kana repeat mark, the pairs W3C
JLREQ lists for class cl-08 (https://www.w3.org/TR/jlreq/#cl-08), nor
inside a chain of em dashes. Both composers, vertical type, Kinsoku
Shori Type, hyphenation and No Break follow it, and a pair wider than
the line stays whole on it. Justification and letter spacing add no
space inside a pair.
The setting works only with a Kinsoku Set: with Kinsoku Set None the
paragraph keeps the value without effect and the menu item is
unavailable. It is off by default, saved with the paragraph only when
on, carried by paragraph styles (Paragraph Style Options > East Asian
Composition Settings), and turned off by Reset Panel. A value that is
not true or false is refused. The .ai editing data has no field for it,
so saving reports a paragraph with it on and a pair in it as left out.
Docs: docs/mcp.md, docs/target-app-parity.md.
A tool step in the Learn panel now draws the tool's name as a link. Clicking
it, or pressing Enter or Space on it, runs the new learn.locateTool command,
which marks the tool where the current layout shows it without choosing it
(the help page:
https://helpx.adobe.com/illustrator/desktop/get-started/learn-the-basics/learn-skills-quick-skill-guide.html).
- A tool shown on its toolbar button has the button marked, and a toolbar
that has scrolled it out of view scrolls it back.
- A tool in a collapsed group opens the group's flyout with its row marked;
the group keeps the tool it shows.
- A group torn off into a strip comes to the front with the tool marked.
- Toolbars made with New Toolbar are searched after the Tools panel.
- A tool that no shown toolbar holds is marked in the All Tools drawer.
- A Tools panel hidden with Window › Tools shows again. In Presentation
Mode, or while Tab hides the toolbars, the reply is "unavailable" with a
reason.
- The mark is a 2 pt outline in the selection color. It lasts 3 seconds,
until Escape (also when Escape closes the All Tools drawer), or until the
next link replaces it. These are VectorCraft's own rules.
The command takes a tool id and rejects a missing, non-string or unknown id.
Catalog steps mark the linked name in brackets, and the catalog test checks
that each one names its tool. Rows for the command and the link's hover text
are added to every complete catalog.
Docs: docs/mcp.md, docs/target-app-parity.md, docs/ui-parity.md.
Twist was read as a live effect only on an unstroked path or compound
path whose segments were all straight, and on those at any angle.
- A curved path or compound path, or a group, with nothing stroked and
no guide in it now opens with its Twist live when the twist is at
most 90° either way. Larger twists on these keep the file's drawn
look. The 90° limit is VectorCraft's own.
- Paths and compound paths with straight segments and nothing stroked
keep their Twist live at any angle, as before, guides included.
- Stroked objects keep the drawn look, as before.
- .ai save keeps a link to a Twist graphic style on the objects the
reader reads it on, and leaves it out, with the style-link warning,
on the others.
Docs: docs/file-format-parity.md, docs/target-app-parity.md.
SVG Options gets an Include Variable Data checkbox (the `variableData`
option, off by default). With it on, the saved SVG carries the document's
text variables, its data sets' text values and each text variable's bound
type object as a `variableSets` element, in the layout Load Variable
Library already reads. A bound object is named by its element id in a
`docRef="id('...')"` attribute; an object without an id gets one.
Opening such an SVG reads the variable data back: the text variables, the
data sets (none active) and the bindings, so choosing a data set changes
the type again. Variable data that Load Variable Library would refuse is
left out with a warning, and the art opens. Markup that only looks like
the element (in comments, CDATA sections, processing instructions or the
document type declaration) is skipped.
Variables of other kinds, names XML can't hold, more than 256 text
variables or 1,000 data sets, and variable data over 8 MiB or 2,000,000
XML nodes are left out of the file, each with a warning. Type written as
outlines opens as art, so its variables are written unbound, with a
warning.
css.export read `scope` and `path` with a lenient string lookup, so a
value of the wrong type (`5`, `true`, `["all"]`, `null`) was treated as
left out: the selection was exported, or the CSS came back as data
instead of being written. Both keys are now checked before anything is
generated or written, and a supplied value that is not a string is an
error ("`scope` must be a string", "`path` must be a string"). A
left-out scope still exports the selection, and a left-out path still
returns the CSS.
css.generate and css.export with scope "all" do not use `ids` or `id`,
but a malformed one is now an error there too, as it already is for the
selection.
A layer expanded to its edges keeps the paths made into guides inside it, as it keeps its ruler
guides. A clipping group with Revolve and Rotate is cut for Revolve, the effect the canvas draws,
so its fills go in one piece and art with more fills than a 3D effect takes still expands.
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.