Commit Graph
8063 Commits
Author SHA1 Message Date
dotCooCoo 4aa8a8b0c8 Layers: Template always locks the layer in Layer Options
Template sets Lock again even when Lock was set in the dialog before it,
so a template layer is always locked. Only a Dim Images set before
Template keeps its value.
2026-11-04 14:56:41 +07:00
dotCooCoo 2ac1fa4cce Layers: Layer Options keeps a Lock or Dim Images that was set before Template changes
Setting Template in the dialog (the checkbox, or ui.dialog.set of template)
also set Lock and Dim Images, replacing a value set in the dialog earlier.
That value was then sent to every selected row, and ui.dialog.set gave
different results depending on the order of its fields. A Lock or Dim Images
set in the dialog now keeps its value when Template changes.
2026-11-04 14:56:41 +07:00
dotCooCoo e5834f7686 .ai import: the layers are compared with every page of a multi-artboard file
A .ai file whose PDF part has a page for each artboard had its layers
compared with the first page only. Art that the layers drew on a later
artboard and its page didn't, or that a later page drew and the layers
didn't, opened from the layers with no warning, and a text object that a
later page doesn't draw stayed.

When the PDF part has a page for every artboard, each page is now
compared with the layers on its artboard, and the comparison fails when
any page differs by more than it allows. Text objects that a later page
doesn't draw are weighed there and left out, unless their layer doesn't
print. Art that differs on a later page is handled as on the first page:
such files now open from their PDF part with the usual warning, where
they opened from their layers before. A PDF part with pages for some of
the artboards, or with its pages cropped to the art, is still compared
on its first page only. Pages are compared until their comparison
drawings take 8,388,608 pixels (about 67 letter-size pages, or 4 when the
PDF part is only images), and at most 128 pages are compared. The type
share in the import's note is now that of the page whose type differs
most.

The layers are drawn once for the pages of the same size and cut into
each page's part. Each page moves by less than half a pixel to start on
a whole pixel, and the column or row the move takes past its artboard
isn't compared. Each page's drawing and result are kept until the layers
change, for the last two documents weighed. Taking a text object out
draws again only the pages within reach of it (every page when type
wraps).

An artboard, or the page of an EPS's editing data, whose sides are within
half a point of its page's is drawn on an area of the page's size, so
both drawings have the same number of pixels. Before, such a file could
open without its layers when the half point changed the rounded size of
its drawing, even when its layers matched the page.

Docs: docs/mcp.md, docs/target-app-parity.md.
2026-11-04 14:56:38 +07:00
dotCooCoo f15a16f2c1 Render: placed-document bitmaps draw undecoded-image marks when the view does
On screen, a placed document is drawn from a bitmap made in the
background, and that bitmap was rendered with the default options. An
image inside the placed file whose pixels cannot be decoded therefore
drew nothing in the bitmap, even though the canvas marks such images
with a crossed box. The bitmap now follows the frame's
mark_undecoded_images setting, the bitmap cache keys on it, and a
bitmap standing in for one still being made has the same setting.
2026-11-04 14:56:36 +07:00
dotCooCoo b9d3881872 Docs: state the stop limit for Perceptual spot gradient shadings
PDF export writes a Perceptual spot gradient as a Separation or DeviceN shading only when its expanded curve has at most 4,096 stops (MAX_INK_TINTS in crates/color/src/gradient.rs). Longer curves are written as images, with the process-color warning.
2026-11-04 14:56:35 +07:00
BFlat d977fd9181 Merge pull request #5447 from dotCooCoo/feat/ot-stylistic-sets
Add font-aware OpenType stylistic sets menu
2026-11-04 14:31:00 +07:00
BFlat d702bdfc23 Merge pull request #5527 from dotCooCoo/fix/parity-doc-wording
Docs: name glows with shadows in the pan raster entry, and mark VectorCraft's own values
2026-11-04 14:30:44 +07:00
BFlat afce54206a Merge pull request #5524 from dotCooCoo/fix/live-paint-face-attribution
Live Paint: preserve face colors at shared curved boundaries
2026-11-04 14:30:29 +07:00
BFlat e2a551226f Merge pull request #5523 from dotCooCoo/fix/continued-paragraph-typed-list
Type: typing a list's start in a continued paragraph starts no list
2026-11-04 14:30:14 +07:00
dotCooCoo 3bd1514acb Type: offer stylistic sets only for an installed font, by their own names
A font that is not installed offered the sets of the face drawn in its place; the menu now offers none. Set names the font supplies are shown as they are, without UI translation.
2026-11-04 14:09:34 +07:00
dotCooCoo 4fa4862613 Type: translate the numbered stylistic set label
StylisticSet.name now holds only a name the font supplies. The OpenType panel shows a set without one as `Set {n}` through tl!, so the label is translated, and each UI catalog has a `Set {n}` row.
2026-11-04 14:08:30 +07:00
dotCooCoo 1858da4106 Type: use selected font version for stylistic sets 2026-11-04 14:08:30 +07:00
dotCooCoo b72c822f1d Add font-aware OpenType stylistic sets menu 2026-11-04 14:08:30 +07:00
dotCooCoo d46079b872 Docs: name glows with shadows in the pan raster entry, and mark VectorCraft's own values
The panning entry says a Drop Shadow or Outer Glow raster holds the
shadow or glow of group members outside the view. The Blob Brush
Fidelity entry keeps its citation on the option and states that the
slider and field range and the 1.5 pt default are VectorCraft's own
values. The Escape in Selection tool drags entry is stated as
VectorCraft's own behavior.
2026-11-04 14:08:26 +07:00
dotCooCoo f7bebdeaf0 Live Paint: preserve face colors at shared curved boundaries
Capture sweep-piece source attribution before endpoint pinning can move its
midpoint off the original outlines. Keep the existing lookup after pinning
when the original piece has no source.

Add planar coverage and native compound Make/Expand/undo regressions, and
document the existing front-most source-fill rule.
2026-11-04 14:08:23 +07:00
dotCooCoo ccf4252a73 Type: typing a list's start in a continued paragraph starts no list
In a threaded frame whose first paragraph continues from the frame
before, the text at the frame's start is not the start of a paragraph,
and the frame draws no list marker for it. Typing "* " or "1. " there
removed the characters and set a list that never showed. typed_list_at
now returns None for that paragraph.
2026-11-04 14:08:20 +07:00
BFlat e492106a51 Merge pull request #5422 from dotCooCoo/feat/action-exclude-step
Actions: exclude recorded steps from playback
2026-11-04 14:01:43 +07:00
BFlat 5602f0a2eb Merge pull request #5522 from dotCooCoo/fix/same-font-isolated-group-on-layer
Select: the font Same commands look through a selected group that holds the isolated group
2026-11-04 14:01:31 +07:00
BFlat e44b76a9c2 Merge pull request #5521 from dotCooCoo/fix/picker-rgb-fields-test
Tests: the Color Picker's R, G and B fields show the working RGB values
2026-11-04 14:01:15 +07:00
dotCooCoo 251cc964a5 Actions: exclude recorded steps from playback
Squashed from #5422 onto main.
2026-11-04 13:42:33 +07:00
dotCooCoo a9a2c4dee8 Select: the font Same commands look through a selected group that holds the isolated group
With a group isolated, a selected layer or group that holds the isolated
group is not selectable itself, so the type inside the isolated group was
never reached and the font Same commands returned "select a text object".
The walk now goes through such a layer or group to the type inside the
isolated group that can be selected.
2026-11-04 13:42:03 +07:00
dotCooCoo 8733f3c65d Tests: the Color Picker's R, G and B fields show the working RGB values
The new test opens the Color Picker in each working RGB profile and reads
the R, G and B fields the dialog draws. It fails when the fields show the
display sRGB values instead.
2026-11-04 13:42:00 +07:00
BFlat 695c967a33 Merge pull request #5517 from dotCooCoo/fix/ai-save-missing-artboard
.ai save: an artboard the document does not have is refused, as an export refuses it
2026-11-04 13:36:27 +07:00
BFlat e20eba502e Merge pull request #5515 from dotCooCoo/fix/ai-look-copies-type-docs
Docs: cite where a group's or layer's effect comes from in the .ai look copies entry
2026-11-04 13:36:13 +07:00
dotCooCoo d18499613c .ai save: an artboard the document does not have is refused, as an export refuses it
A save as .ai or .ait (file.saveCopy, file.saveAs, document.save and
file.saveAsTemplate) set range to "all" before the file was written.
The one exception was a legacy .ai of version 7 given a range, which
its encoder checks. Every other save accepted an artboard, artboards or
range that names an artboard the document does not have (artboards: [5]
on a document of three artboards) and wrote every artboard.
document.export refuses the same value.

The save now refuses such a value with the export's error, under the
name of the command that was run, and writes no file. A range that is
not text, such as range: 42, was also replaced by "all". The save now
leaves it for the encoder, which refuses it as an export does. An
artboard the document has, or an empty artboards list, is still saved
with every artboard, and a legacy .ai still writes the artboards of its
range.
2026-11-04 13:16:24 +07:00
dotCooCoo a35f3a0fee Docs: cite where a group's or layer's effect comes from in the .ai look copies entry
The evidence entry for type in copies that a layer's or group's drawn look
draws now cites the help page that describes effects on a group or a layer,
and says that matching the page's type with a copy is VectorCraft's own rule.
2026-11-04 13:16:20 +07:00
BFlat eed006d808 Merge pull request #5510 from dotCooCoo/fix/same-reference-skips-unreachable
Select: Same commands take their reference from an object that can be selected
2026-11-04 13:09:25 +07:00
BFlat c2e4117c8c Merge pull request #5512 from dotCooCoo/fix/new-action-clears-set-range
Actions: New Action leaves its set as the only selected set
2026-11-04 13:09:10 +07:00
BFlat e553135ce9 Merge pull request #5513 from dotCooCoo/fix/mcp-docs-vertical-and-action-duplicate
MCP docs: vertical text uses vert alternates, and duplicate defaults to the current set
2026-11-04 13:08:55 +07:00
dotCooCoo 6cbfb83c65 Select: Same commands take their reference from an object that can be selected
Select > Same > Fill Color, Stroke Color, Fill & Stroke, Stroke Weight,
Opacity, Blending Mode, Appearance, Shape, Graphic Style and Appearance
Attribute compared the other objects with the first selected object,
even when select.set had put a hidden or locked object, one on a
template layer or one outside the isolated group first. They now take
the first selected object that the Select commands could select, in
selection order, and keep the compound path and isolation rules for it.
A selection that holds no such object returns "nothing selected".
2026-11-04 12:50:38 +07:00
dotCooCoo 6a8e381dfa Actions: New Action leaves its set as the only selected set
New Action in the current set of a Shift-selected range kept the whole range
selected. After the new action was deleted, Delete Selection asked about every
set of the range. The set recorded into is now the only selected set, as it is
when Record starts a recording.
2026-11-04 12:50:35 +07:00
dotCooCoo d9cfaf9041 MCP docs: vertical text uses vert alternates, and duplicate defaults to the current set
add_text's vertical option turns on the OpenType vert feature, so the docs no
longer say it leaves glyph orientation unchanged. ui.actionSet.duplicate uses
the current set when set is omitted, with or without action.
2026-11-04 12:50:33 +07:00
BFlat 0ccf9d4fdd Merge pull request #5507 from dotCooCoo/fix/color-panel-working-components
Color controls: preserve working RGB components in numeric edits
2026-11-04 12:46:26 +07:00
BFlat b22a2ca9e3 Merge pull request #5508 from dotCooCoo/fix/same-font-reference-in-selected-layer
Select: the font Same commands take their reference from the type on a selected layer
2026-11-04 12:46:11 +07:00
BFlat bd67e54853 Merge pull request #5506 from dotCooCoo/fix/break-link-opacity-mask
Symbols: Break Link keeps the instance's opacity mask
2026-11-04 12:45:55 +07:00
BFlat 0854434fa3 Merge pull request #5509 from ruchirguitar/fix/4924-text-tweaker-review
Text Tweaker: refuse ranges that aren't whole bytes, make no step when nothing changes (#4924)
2026-11-04 12:45:40 +07:00
BFlat e76cc68070 Merge pull request #5487 from dotCooCoo/fix/text-range-stroke
Fix range text stroke weight defaults and scaling
2026-11-04 12:45:26 +07:00
dotCooCoo c54c4567c7 Color controls: preserve working RGB components in numeric edits
Read RGB and HSB numbers in the active working RGB space in the Color panel
and Color Picker. Keep native values through hex and web-safe controls and
cache live components by native color and color settings.
2026-11-04 12:44:49 +07:00
dotCooCoo f581aa8a56 Select: the font Same commands take their reference from the type on a selected layer
A layer that was selected (for example with select.set) gave no reference to
Select > Same > Font Family, Font Family & Style, Font Family, Style & Size,
Font Size and the text fill and stroke color commands: the layer itself is
not selectable, so the type on it was never reached and the command returned
"select a text object". A selected layer or sublayer now gives the type on it
that can be selected. A hidden, locked or template layer gives none.
2026-11-04 12:44:48 +07:00
dotCooCoo 5c224a0d08 Symbols: Break Link keeps the instance's opacity mask
Break Link to Symbol dropped the instance's opacity mask. The art now
keeps it, or a group around the art holds it when the symbol's art has
a mask of its own. The objects in the instance's mask art count against
Break Link's limit of 1,000,000 objects.
2026-11-04 12:44:46 +07:00
ruchirguitarandClaude Opus 5.5 bf58f605fe Text Tweaker: refuse ranges that aren't whole bytes, make no step when nothing changes (#4924)
A `start` or `end` such as -1 or 1.5 was read as absent and changed text
before the range; it is now refused. Characters that already have the value
are left out, so a run that changes nothing returns count 0 and makes no
undo step. docs/mcp.md cites the public formatting-type page.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 12:44:44 +07:00
dotCooCoo 0dba3afea9 Docs: the 1 pt default stroke weight on type is in the type's own units
docs/mcp.md says that the default weight text.setStyle and text.setRangeStyle give an unweighted stroke is in the type's own units, so scaled type draws it wider, while strokeWidth and strokeOptions lengths are in document points.
2026-11-04 12:44:43 +07:00
dotCooCoo 79102f6104 Tests: range stroke weight test joins the character stroke tests
The test moves from an inline module in cmd/textedit.rs to
tests/charstroke.rs and uses that file's helpers. docs/mcp.md says that
text.setRangeStyle gives a range's stroke a 1 pt weight as text.setStyle
does, and that its strokeWidth and strokeOptions lengths are in document
points.
2026-11-04 12:44:42 +07:00
dotCooCoo b5301ca74d Fix range text stroke weight defaults and scaling 2026-11-04 12:44:42 +07:00
BFlat 01f30fdbce Merge pull request #5505 from dotCooCoo/fix/ai-look-copies-type
.ai import: copies drawn by a layer's or group's look keep their type
2026-11-04 12:18:30 +07:00
BFlat c938184831 Merge pull request #5503 from dotCooCoo/fix/ai-comparison-patch-pitch
.ai import: boxes of differing patches on an image-only page use the comparison raster's pixel size
2026-11-04 12:18:15 +07:00
dotCooCoo 22c2e2c9bd .ai import: copies drawn by a layer's or group's look keep their type
When an effect on a layer or a group draws copies of its art, the editing
data holds the type of each copy inside the drawn look. The reader skipped
that type, so the copies came in without text objects, the page's type for
them was given to other groups by painting order, and the import noted that
a text object may be in another group than it was.

The reader now keeps such type as a text slot without a story, in the
copy's group. The page's type that lies over a copy's other art (at least
half of it in the art's box) goes to that copy's slots by painting order,
before the rest is given out. Of overlapping copies, the one that holds
more of it takes it, and the smaller one on a tie. When the page's type
outside the copies is too little for the other text objects, a copy with
more of the page's text objects than slots leaves the extra ones to them.
A slot that gets no type
is removed and not counted as a text object that couldn't be read.

Type beside a copy's art, and every copy's type in a file past the import's
text-object limits or opened with its type as outlines, goes as before. A
text object with an appearance keeps its own type as before.
2026-11-04 12:06:08 +07:00
dotCooCoo a0c9726491 .ai import: boxes of differing patches on an image-only page use the pixel size of the comparison raster
The comparison of an image-only page draws at four times the comparison
scale and resizes the result to the comparison size. The two sizes round
differently along the shorter side, so a pixel is not 1/scale points
wide. A box at the far edge of a large page moved by up to 0.625/scale
points and could lie outside the object that holds it, so the import
used the PDF part instead of the layers. The boxes now use the size the
raster was drawn at.
2026-11-04 12:06:06 +07:00
BFlat 3c59751ebd Merge pull request #5501 from dotCooCoo/feat/graph-marks-keep-opacity
Graphs: series marks keep a fill or stroke opacity when the graph is drawn again
2026-11-04 11:59:28 +07:00
BFlat bb8a56e9d5 Merge pull request #5499 from storytold/fix/sec-engine-plugins-budgets
Cap radar graph dimensions, resume slice-name suffix search, weigh plug-in cache keys
2026-11-04 11:59:16 +07:00