After Select All in a threaded story whose edited frame is empty, the
panel's commands style the text of every frame, but the checkbox rows,
Stylistic Sets and the East Asian items read only the empty frame. They
now read the runs of every frame, leaving out runs with no text while
any run has text, so a feature the story's text has shows checked and a
click turns it off.
An action or journal entry recorded before Scale and Reflect followed the
turned bounding box has no basis value. Replayed, such a step now acts along
the page's axes, as it did when it was recorded; steps recorded now carry
basis "box" and replay along the box. The built-in Reflect Horizontal action
names basis "box", so it keeps reflecting across the box's own axis.
The symbol test that reflects a turned instance names basis "page", which
is the reflection it was written for.
Object › Distribute follows Object › Align and lists Horizontal
Distribute Left, Center and Right, Vertical Distribute Top, Center and
Bottom, Horizontal Distribute Space and Vertical Distribute Space. Each
item runs the button's `align.distribute*` command, so it uses Align To,
the key object and the Distribute Spacing value, and with the Artboard
tool chosen it spaces the selected artboards.
Unit::parse took one level of recursion per + - * / sign, so a text such
as "1+1+...+1" with 200,000 terms overflowed the stack and aborted the
process. Every number field, parse_number and every command parameter read
as a length went through it.
Text with more than 128 + - * / signs now reads as nothing; text with 128
or fewer reads as before. docs/mcp.md states the limit for length strings.
The test a_very_long_expression_reads_as_nothing aborted with a stack
overflow before the change.
At a Type tool caret the panel's commands style all of the text, but the
checkbox rows, Stylistic Sets and the H or V Style and Roman Italics
items showed only the caret's style. A click could then turn a feature
off for the whole text while most of it did not have the feature. At a
caret they now read every character of the text: a mixed row shows a
dash, a mixed item shows unchecked, and a click turns the feature on
throughout.
The PSB row of docs/file-format-parity.md says the merged image comes in
clipped by the file's clipping path, as the PSD row does, and
docs/target-app-parity.md's evidence list gets a line for it.
The measurement that runs before the style cascade and usvg now covers
the inputs that still got past it:
- usvg matches a selector without keeping what it found, so one whose
leftmost part matches nothing tests every set of ancestors in turn.
The measurement counts those tests for each copy and stops at
50,000,000; past that the SVG is refused with "the SVG's style sheets
take too long to match". An SVG image's matching stops at what the
SVG showing it left.
- A test counts one more for every 16 attributes a lookup scans and
every 16 bytes of the value it compares, so many classes against a
long class list count the work they do, in usvg's matching and in
the import's own cascade.
- The declarations the import's own cascade keeps, once per element,
count toward the 64 MB, including those of `:not()` rules, which usvg
drops. Each `:not()` alternative counts as a test.
- A linked SVG file is measured before its cascade runs. The linked SVG
files share one measurement: once they pass the limits together, the
files after that are shown without their links. The tests a file past
the limits made still count.
- SVG images share the element limit and the selector tests with the
SVG showing them, as they already shared the 64 MB.
The svg_filters reader measures its SVG before the cascade too.