Commit Graph
4562 Commits
Author SHA1 Message Date
dotCooCoo fb7176565d Tests: the one-paint style fuzz case applies the styles it loads
The fuzz case also loads its .ai library with graphicStyle.loadLibrary,
applies every style to the rich document's objects and then applies a
red 2 pt stroke style read before the fuzzed one, and checks that the
stroke style reaches the objects whenever the fuzzed text is only paint
operators.
2026-11-12 22:16:56 -08:00
dotCooCoo 304fdfeb35 Merge main into fix/3d-face-budget-per-object
The i18n test that main added for 3D refusals calls validate_three_d_at with this branch's (Option<usize>, usize) position: effect 0 of appearance item 0 is (Some(0), 0).
2026-11-12 22:07:00 -08:00
dotCooCoo c11cb9c180 Place: test DCS transparency with clip groups, clipping layers and nested clips
Adds a test with a half-transparent square that its own clip group,
its clipping layer, or two nested clipping paths together hide, so the
square no longer marks the DCS image under it.
2026-11-12 22:04:56 -08:00
dotCooCoo dc92be2391 Place: only a DCS clipping path turns the plain group back into a clip group
A plain group holding just the image becomes its clip group again only
when the image takes its DCS file's clipping path. When Placement Options
clip the image, it goes into a new clip group as before, so a group the
user made around the image alone stays a plain group.
2026-11-12 22:02:31 -08:00
dotCooCoo 0676016741 Place: the DCS check on open agrees with a full read for short or corrupt files
The check that decides whether a linked EPS file is DCS now gets the
file's size. When the bytes read hold the whole file, it reads them as a
full read does. A binary EPS header whose PostScript or TIFF preview ends
past the end of the file names no plates, so such a file keeps its
preview with lowResProxyEps on instead of going missing.
2026-11-12 21:59:28 -08:00
dotCooCoo af7c5d0432 3D: check an object's solids after the geometry effects before the effect
Validation built the Extrude & Bevel, Inflate and Rotate solids from the
stored shape, while drawing, Export 3D Object and Expand as Wireframes
build them after the geometry effects before the 3D effect. A Transform
effect with copies before Extrude & Bevel could pass the check and then
draw the source art. Validation now reshapes the object, the fill or
stroke, or a group's members with those effects first.

validate_three_d_at and validate_three_d_at_in take the effect's index
for an effect on the object too, so an edit checks the effects before
that effect, and effect.apply checks a new effect after the others.
2026-11-12 21:47:53 -08:00
dotCooCoo 4316f819a8 Envelopes: the Mesh tool and Direct Selection edit a warp envelope's points
A selected warp envelope now shows the points of its surface on a 4x4
grid (8x8 or 16x16 where 4x4 strays more than 0.1% of the warp's
diagonal from it). object.mesh.movePoint, movePoints, addLine,
deletePoint and object.envelope.setMeshPoint accept a warp: the first
edit turns it into a mesh envelope on that grid and applies the edit as
one undo step, so Undo or Escape gives the warp back with its style and
bend. An edit that moves no point leaves the warp and adds no undo
step. A warp that no such grid follows (some version 0 maps) shows no
points and its edits fail without changing anything.

movePoints and setPointColor on a gradient mesh record no undo step
when they change no point.
2026-11-12 21:37:21 -08:00
dotCooCoo e4fdc10b99 Place: a DCS file that regains its clipping path clips the group that stayed
When a linked file lost its clipping path, the clip group holding the
image stayed as a plain group of the image. When the file had a clipping
path again, the image went into a new clip group inside that plain group,
so each round nested one more group. The plain group holding just the
image now becomes its clip group again, in the layers and in symbol,
pattern, graph design and mask art.
2026-11-12 21:30:06 -08:00
dotCooCoo 2d2ac65b2c Place: DCS links reopen with their plates under the low-resolution EPS proxy
With the lowResProxyEps preference on, opening a document kept the saved
preview of a linked DCS file, so the link showed as EPS without its
plates. Opening now reads the first 1 MiB of each such EPS file and reads
a DCS file in full. The whole file is read only when a binary EPS header
puts the PostScript past those bytes or the header comments run past
them. Other EPS files keep their preview.
2026-11-12 21:30:06 -08:00
BFlat 1b9aa07e65 Merge pull request #6995 from dotCooCoo/feat/actions-insert-select-path
Actions: Insert Select Path stores the selected path as a step
2026-11-13 12:27:58 +07:00
BFlat bae885e393 Merge pull request #6876 from dotCooCoo/feat/outline-object-image-alpha
Effects: Outline Object on an image's fill or stroke follows its opaque pixels
2026-11-13 12:27:50 +07:00
BFlat ef3beb9401 Merge pull request #7027 from dotCooCoo/fix/followup-6985
Fonts: Find Font skips patterns and inline graphics that draw nothing, and Refresh Font List lays out type in art again
2026-11-13 12:27:33 +07:00
BFlat 65138198a8 Merge pull request #7033 from dotCooCoo/fix/colorize-missing-link-fill
Colorize: a fill color recolors a colorized image whose link is missing
2026-11-13 12:27:18 +07:00
dotCooCoo a7c82ac7f2 Links: test a DCS image in a symbol updated and relinked by its id
The symbol's image keeps following its DCS file's clipping path when it is
updated by the id links.list gives it, and loses that path when it is
relinked to a plain image.
2026-11-12 21:24:12 -08:00
dotCooCoo 38049325e7 Free Transform: handles, shear and distort follow the rotated bounding box
After a rotation the Selection tool already shows and drags a bounding
box turned with the objects, but the Free Transform tool still used the
page-aligned box. Its handles sat on the wrong corners, a side handle
scaled along the page axes, and Perspective Distort and Free Distort
started from a box that did not match the art.

- The Free Transform tool keeps the selection's turned box for the
  drag. Handles, the rotate zone and the move zone are read in its
  frame; a handle scales along the selection's own sides from the
  opposite handle (or the center with Alt) and snaps as the Selection
  tool's does; Cmd/Ctrl on a side handle shears along that side; the
  outline, handles and cursors are drawn on the turned box.
- Perspective Distort and Free Distort move the corners of the turned
  box. `object.distort` takes `angle?` (degrees): `from`, or the
  selection's bounds without it, is then a box in the frame turned by
  that angle. Upright boxes send the same params as before.
- The Scale and Reflect tools, their dialogs and commands, and the
  Transform panel's flips keep the page's axes.

Docs: docs/mcp.md, docs/target-app-parity.md.
2026-11-12 21:19:58 -08:00
dotCooCoo 226ac437b9 Type: Warichu stacks selected characters on lines inside their line
The Character panel menu has Warichu and Warichu Settings… with Show East
Asian Options. Warichu characters are set at a percentage of their size
and stacked on 1 to 6 lines inside their line: one above the other in
horizontal type and side by side in vertical type. Warichu Settings sets
Lines, Line Gap, Scale and Alignment.

- text.setFormat and text.setRangeStyle take warichu, warichuLines,
  warichuGap, warichuScale and warichuAlign; ui.warichuSettings opens
  the dialog.
- A stretch of warichu characters is one block that stays whole on one
  line. The canvas and every export draw the stacked lines; SVG, PDF and
  the .ai writers write such type as outlines, as they do ruby. Type on a
  path sets the characters at their own size.
- The attributes are saved natively, carried by character styles and
  translated in every complete catalog.

Docs: docs/mcp.md, docs/type-parity.md.
2026-11-12 21:13:21 -08:00
dotCooCoo 41b8114865 Font menu: Show samples on white draws each sample in dark type on a white area
A new Type preference, Show samples on white (`fontSamplesOnWhite`, off
by default), draws each family's sample in every font menu, and in
Type → Font in the in-window menu bar, in the Light brightness's text
color on a white area, in every interface brightness. A row's white
area is drawn while its sample is still rendering, and leaves 2 pt above
and below it where a highlighted row's color shows. The family names and
the rest of the menu keep the interface's colors. Preferences dims the
checkbox while Enable in-menu font previews is off.

Docs: docs/mcp.md (prefs), docs/target-app-parity.md evidence line.
2026-11-12 21:12:37 -08:00
dotCooCoo 7b6b6af7b1 Type: the Mojikumi Set menu offers the predefined spacing sets
The Paragraph panel's Mojikumi Set lists None, YakumonoHankaku,
GyomatsuYakumonoHankaku, GyomatsuYakumonoZenkaku and YakumonoZenkaku,
then Line-end Punctuation Half Width, and text.setFormat {mojikumi}
takes yakumonoHankaku, gyomatsuYakumonoHankaku, gyomatsuYakumonoZenkaku
and yakumonoZenkaku besides none and lineEndHalf.

The spacing of each set is VectorCraft's own rule, built on the help
page's one-line description of each set:
- YakumonoHankaku sets every bracket, comma and full stop half width,
  takes a quarter em off each side of a middle dot, and puts a quarter
  em between Japanese and Latin letters or digits.
- GyomatsuYakumonoHankaku keeps punctuation full width inside a line,
  sets an opening bracket starting a line flush and a closing mark
  ending it half width, and takes the quarter em after a middle dot
  ending a line off.
- GyomatsuYakumonoZenkaku keeps punctuation full width and adds the
  quarter em between Japanese and Latin text.
- YakumonoZenkaku sets characters as None does.

Both composers and vertical type measure each line as it is set. A
right-to-left paragraph, whose line ends are measured untrimmed, also
draws them untrimmed, and a right-to-left line that ends between a
Japanese and a Latin character is measured without the quarter em the
set adds there. With a Desired glyph scaling other than 100%, the
space a set takes off before an opening bracket or middle dot, and the
Japanese-Latin space recorded at a line's end, scale with the glyph.

The sets save with the document and paragraph styles; new type and
Reset Panel keep Line-end Punctuation Half Width. SVG export lays type
with middle dots out again for its positioned spans. A .ai save
reports a paragraph with one of the new sets as left out.

Docs: docs/mcp.md, docs/target-app-parity.md, docs/type-parity.md,
docs/gaps.md.
2026-11-12 21:07:44 -08:00
dotCooCoo d8b6f4cd02 Layers: Paste Remembers Layers puts art back into the sublayer it was copied from
Copy now remembers the whole chain of layers around each object, not only
the name of the nearest one. With Paste Remembers Layers on:

- In the same document, art goes back into the sublayer it came from while
  that sublayer exists, even after it was moved, so two sublayers of the
  same name in different layers stay apart. A deleted sublayer is made
  again inside the layer that held it.
- In another document, the sublayer and the layers around it are matched
  by name from the top level down; of repeated names, the topmost chain
  that matches the most names wins, a shown and unlocked one first. A
  missing sublayer is made inside its layer, and a missing layer on top
  with the sublayer inside it, in the paste's undo step.
- When the matched layer, or a layer around it, is hidden or locked, the
  paste fails with "the target layer is locked or hidden" and nothing is
  pasted, instead of putting art in a hidden layer or making a second
  layer of the same name.
2026-11-12 21:02:59 -08:00
dotCooCoo 26182f6f80 Merge main into fix/nested-link-ids 2026-11-12 20:48:49 -08:00
dotCooCoo 149f4243b2 Place: DCS transparency interactions look only at what clipping paths show
Show DCS Transparency Interactions compared full object bounds, so a
transparent object over the part of a DCS image that its clipping path
hides marked the image. Bounds are now cut to the clipping paths of the
clip groups and clipping layers that hold each object.
2026-11-12 20:45:43 -08:00
dotCooCoo 47fbe1c14a Patterns: Delete, Cancel and rename reach a graph's stored paints
The series fill and stroke and the label fill and stroke a graph keeps
for its next redraw are now in the paint traversal, so Delete Pattern
and canceling a new pattern make them no paint and a Pattern Options
rename renames them. Before, a later graph.setData drew the paint of a
missing pattern again. Global swatch edits reach the same paints.

The progress-doc line now says that only canceling a new pattern clears
its paints; canceling the edit of an existing pattern puts the
definition, and after a rename the old name, back.
2026-11-12 20:43:38 -08:00
dotCooCoo a992a14997 Merge main into feat/pict-open-place 2026-11-12 20:41:24 -08:00
dotCooCoo 145ac9d30a 3D: an object's fill and stroke solids share one face limit
Extrude & Bevel (both kinds) and Inflate built every fill and stroke
solid of an object, each up to 163,840 faces, before any check, so one
effect on a path with many strokes or a group with many members could
build several times that. The solids are now built in order and their
faces counted together: once they pass 163,840 (VectorCraft's own
limit), no later solid is built, the object draws its source art, and
effect.apply, effect.setParams, Export 3D Object and Expand as
Wireframes report "The 3D surface is too complex; simplify the shape".
A stroke left out for its own limits is not counted.

Export 3D Object now builds Extrude & Bevel (Classic) meshes with the
Classic bevel options, so the exported solid matches the drawn one.
2026-11-12 20:40:25 -08:00
dotCooCoo 26ab0f2523 Symbols: 9-slice guides may lie outside the symbol's art
A 9-slice guide can now be placed outside the symbol's art, by dragging
it past the art's edge in symbol editing mode, by symbol.options
nineSliceGuides, or by a Symbol Options field below 0% or above 100%.
A scaled instance then scales by the cells its art falls in.

- Each guide is a fraction from its edge in -16..16, and the two guides
  of an axis keep their order (left + right < 1, top + bottom < 1).
- A guide past an edge cuts the art at that edge, so that side's outer
  cell holds no art. With both guides of an axis past opposite edges,
  the art scales as a whole along it. With both past the same edge, the
  art keeps its size in the outer cell at the other edge.
- Symbol Options shows the guides with three decimals, and OK keeps a
  field that was not changed at its exact value.
- Native files keep the guides exactly. SVG and .ai write such an
  instance as its placed art, without guides.

Docs: docs/mcp.md, docs/target-app-parity.md, docs/gaps.md.
2026-11-12 20:40:05 -08:00
dotCooCoo 29649a9d35 .ai import: graphic styles of one paint open with their fill and stroke
A style written as one paint (`/SimpleStyle` with its paint operators)
was read as a style with no fill and no stroke. A graphic style library
listed it, and applying it cleared the object's fill and stroke.

Such a style now reads as the fill and stroke its `stroke fill Xd`
turns on, with the stroke's width, caps, joins, miter limit and dashes,
and its `Xy` transparency. A style whose paint is not read here (a
gradient or pattern fill, a pattern stroke, no `Xd`) is left out of the
library instead of coming in empty.

Part of #3349.
2026-11-12 20:34:42 -08:00
BFlat f062dd7ed2 Merge pull request #6932 from dotCooCoo/feat/dcs-linked-spot-plates
Place: DCS files link with their spot plates as spot swatches and separate on their own inks
2026-11-13 11:27:13 +07:00
dotCooCoo f5bfe0c425 Effects: effect.apply refuses a wrongly typed parameter that has no default
effect.apply, appearance.addEffect and effect.setParams checked an effect
parameter's type only when the effect has a dialog default for the key. Keys
that only the params text names were stored as given: an Outline Stroke with
`width: "10 pt"` drew at the stroke's own weight, and a Gaussian Blur with
`linear: 1` blurred in linear light.

- The earlier 3D `perspective`, `lightAzimuth` and `lightElevation`,
  Scribble's `variation` and Outline Stroke's `width` must be numbers, and
  Gaussian Blur's `linear` must be true or false. A test walks every effect
  so a new key without a default needs a listed type or a check of its own.
- The `style` of Crop Marks must be `roman` or `japanese`, and `null` is
  refused. Any other value drew as Roman.
- An installed plug-in effect's parameters are checked against its manifest
  when the command runs, as plugin.run already checks the effect records a
  filter returns.
- effect.setParams with `warpStyle` checks the parameters against the new
  Warp style's effect, as it already did for a 3D effect's new
  `threeDType`. It checked them against the old style.
- effect.setParams refuses a `visible` that is not true or false, such as
  `1` or `"false"`, when called and when a step plays, and nothing changes.
  Before, the value was ignored and the rest of the call applied. `null`
  still leaves the visibility as it is.

A step of command.batch is refused the same way. A replayed journal or
action still plays a wrongly typed effect parameter, as it plays a key the
effect no longer takes.

Docs: docs/mcp.md, docs/target-app-parity.md.
2026-11-12 20:27:09 -08:00
BFlat 465091d7d2 Merge pull request #7031 from dotCooCoo/fix/followup-6920
Print: notes of what a print loses come before notes on options
2026-11-13 11:26:54 +07:00
BFlat 5e17d47370 Merge pull request #7029 from dotCooCoo/fix/followup-6718
Pen: Space held during a closing drag moves the first anchor
2026-11-13 11:26:39 +07:00
dotCooCoo 21dbcf6307 Links: list and manage linked art in symbols, graph designs, patterns and masks by id
Linked images and placed documents kept only in symbols, graph designs,
pattern swatches or opacity masks now have ids of their own. links.list
lists them after the layers' own, one row per stored object, with an
owner naming what holds them; links.check, the missing, modified and
updated files reported on open, the link watch and links.findFiles
report them by id; relink (All Instances included), update, embed,
placementOptions, info and image.info act on them. links.goTo on one
clears the selection and returns onCanvas: false with its owner, and the
Links panel says the link has no place on the canvas.

- Document::visit_stored, stored_node and stored_node_mut find objects
  in every stored art. fix_next_id counts their ids and gives an object
  there whose id is 0, past the id range or already used a new one,
  updating Objects on Path references to renamed children.
- Copies of masked objects give the mask art new ids, and symbols and
  patterns that placed art brings from another document take ids of the
  document they join.
- The Links panel picks such rows in the panel itself, drops the pick
  when the canvas selection changes, and draws their thumbnails from a
  lookup made once per list refresh. Select by Link Status leaves them
  out, as it cannot select them.
2026-11-12 20:16:54 -08:00
dotCooCoo ac76040014 Merge main into feat/outline-object-image-alpha 2026-11-12 20:16:33 -08:00
dotCooCoo 8aee6a9ede Merge main into fix/colorize-missing-link-fill 2026-11-12 19:57:08 -08:00
dotCooCoo 71da62dab2 File formats: PICT pictures open and place
File > Open and File > Place read QuickDraw pictures, versions 1 and 2,
from .pct, .pic and .pict files, with or without the file's 512 bytes
of application data; a version 2 picture also opens by its content.
The reader plays the opcodes of Apple's Opcodes in Pictures table on
the metafile player: lines, rectangles, rounded rectangles, ovals,
arcs, polygons and regions become paths, text becomes point type in
the font the picture names, bitmaps, pixel maps and QuickTime JPEG
images become images, and the clip region clips what follows it.
Place puts the picture in one group clipped to its frame. What isn't
read comes back as warnings, and a picture cut short keeps what came
before it. PICT is not written.

Images whose transform flattens them no longer leave their pixel data
in the document. Formats whose signature starts the file are detected
before PICT, which is known by bytes 522 or 10.

Docs: docs/mcp.md, docs/file-format-parity.md, docs/target-app-parity.md.
2026-11-12 19:52:06 -08:00
dotCooCoo b9b960d717 Fonts: Find Font skips the patterns of inline graphics without decorations
The characters of an inline graphic draw no glyph, so their fill and
stroke paint only their underline and strikethrough (not on a path or in
vertical type) and the ruby readings that layout draws with them (a
reading takes the paint of the first base character on its line, and
type on a path has no ruby). Without one, their pattern no longer counts
as painted for Find, selection-only Change and Print.
2026-11-12 19:52:05 -08:00
dotCooCoo 302586960c Colorize: a fill color recolors a colorized image whose link is missing
A colorized image whose linked file is missing shows the placeholder
preview, whose pixels are not grayscale. paint.setFill skipped such an
image and added a fill item instead, while the Fill proxy showed the
image's colorize color. A solid color now replaces the colorize color.
While that color is a spot color, black or white, a process color is
refused, since the relinked pixels may have an alpha channel.
2026-11-12 19:32:47 -08:00
BFlat e899f3fdb4 Merge pull request #6881 from dotCooCoo/feat/image-color-mask
Image Tools: Color Mask hides chosen colors of an image without changing its pixels
2026-11-13 10:27:04 +07:00
BFlat efc3c9491a Merge pull request #7018 from dotCooCoo/fix/followup-6991
Recolor Artwork: the Color Theme Picker keeps symbol art and clipped image reads within their limits
2026-11-13 10:26:37 +07:00
BFlat 703fb03d65 Merge pull request #7006 from dotCooCoo/fix/mesh-locate-winding
Mesh: a point on a mesh's outline locates on its edge on every side
2026-11-13 10:26:18 +07:00
dotCooCoo 9c1c7dee7e Print: notes of what a print loses come before notes on options
A print to a file and the print preview list their notes as saves and
exports do since #6920: what the job leaves out of the document or prints
differently first (art outside the imageable area, type in a fallback
font, transparency flattened for PostScript), then the notes on the
options (halftone screens and a fixed flatness that aren't written, copies
per sheet that don't fit, a printer profile left out, ink options that
name no ink). Each kind keeps the order it is given in.

The print layout, the PDF print and the PDF print plan return the notes
on the options in `setting_notes` beside `warnings`, as `ExportReport`
does. The status message after a print to a file names the first note,
so a fixed flatness no longer hides type printed in a fallback font.
2026-11-12 19:13:13 -08:00
dotCooCoo f6d8af3ed6 Merge main into feat/dcs-linked-spot-plates 2026-11-12 19:09:51 -08:00
dotCooCoo b64b4802f8 Merge main into feat/actions-insert-select-path 2026-11-12 19:01:39 -08:00
dotCooCoo 1587cb84f7 Pen: Space held during a closing drag moves the first anchor
Space held while dragging out a new anchor already moved it, handles and
all, but the closing drag skipped it, so the closing anchor could not be
repositioned. The closing drag now moves the first anchor by as far as the
pointer moves while Space is held, its handles with it, and the drag
shapes the handles round the new place once Space is released.

path.close takes `at: [x, y]`, which moves the first anchor, its handles
with it, before `in` and `out` are placed. docs/mcp.md and the Pen line
in docs/target-app-parity.md describe it.
2026-11-12 18:55:10 -08:00
dotCooCoo 99f896f9b8 Place: DCS links follow their plate files, clips and document swatches
- The link watch and links.updateChanged look at a DCS file's plate files
  of their own, so a changed plate file is read again.
- links.update and links.relink apply the file's clipping path to the
  images in symbols, graph designs, patterns and masks too. When the new
  file has no clipping path, a clip group holding the old file's clipping
  path loses that path and stays as a plain group of the image, keeping
  its id, name, visibility and transparency. The image keeps that path with its plates to tell it from a
  clipping mask made in the document; a clipping path given another fill
  rule in the document stays. An even-odd clipping path in the file is
  kept as the same area under the nonzero rule.
- links.update and links.relink return the swatch warnings file.place
  gives, including two files that add one ink in two colors.
- links.relink with copy fails for a DCS file with plate files of its own.
- file.place answers the image id of a clipped DCS placement as image,
  and checks page and crop for a DCS file as it does for an EPS file.
- Print separations and Separations Preview take a spot plate's color
  from the document's swatch of its ink, and a reduced image's plates
  keep their coverage.
- Show DCS Transparency Interactions counts a transparent DCS image and
  characters filled or stroked with a transparent gradient.
- %%PlateFile names keep their spaces, and header bytes that are not
  UTF-8 are read as Latin-1.
- A plate program that draws more than one image, art besides its image,
  or its image through a clipping path is an error naming the plate
  instead of printing the wrong ink.
- Nested clipping paths around the composite clip the image together.
- A kept image with more plates than are read, or more TIFF directories
  than its composite and plates, is the CMYK image of its composite
  only, not a set of plates cut short.
- swatch.unused counts a spot or process swatch as used only while an
  image the art shows has a spot plate of its name.
2026-11-12 18:43:04 -08:00
dotCooCoo 48e5f09371 Fonts: Find Font skips inline graphics that draw nothing
An inline graphic in overset characters, or one named on a run that holds
other characters, draws no symbol, so Find, selection-only Change and Print
no longer reach its symbol's type through it.
2026-11-12 18:41:36 -08:00
dotCooCoo 5d71656ca7 Fonts: Find Font skips the patterns of overset characters
Characters of area type or type on a path that don't fit draw nothing, so
their character fill or stroke no longer counts as painting its pattern for
Find and selection-only Change, as Print already leaves them out.
2026-11-12 18:41:36 -08:00
dotCooCoo 5f320422a7 Fonts: Find Font skips patterns at 0% opacity and follows inline graphics
- A fill or stroke at an opacity of 0 no longer counts as painting its
  pattern, so Find, selection-only Change and Print leave that pattern's
  type out.
- Text whose inline graphics draw a symbol shows that symbol's type: Find
  selects it, and selection-only Change and the font list reach the type
  through it, also through a pattern whose art holds such text.
- Refresh Font List lays out again the type in opacity masks and in the
  art of symbols and patterns, and inline graphics, on the layers and in
  that art, take the new size of their symbols' art.
2026-11-12 18:41:36 -08:00
dotCooCoo 6a14e086de Tests: the legacy .ai Color Mask test reads the notes on the options
Saving with transparentImages "omit" now reports its note in the notes on
the options rather than in the warnings, so the test compares every note
the export gives.
2026-11-12 18:34:42 -08:00
BFlat c94577e3bf Merge pull request #6946 from dotCooCoo/feat/actions-select-object
Actions: Select Object selects objects by their Attributes note during playback
2026-11-13 09:30:34 +07:00
BFlat 23cae99a84 Merge pull request #7011 from dotCooCoo/fix/expand-symbol-item-effects
Effects: a symbol instance's fill or stroke effects reshape its art and expand
2026-11-13 09:30:26 +07:00