Commit Graph
2197 Commits
Author SHA1 Message Date
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 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 087da1c743 Docs: document.open's pages sentence for a .ai without PDF compatibility appears once
docs/mcp.md said twice that `pages` naming every page of a .ai saved
without PDF compatibility opens it from its editing data, once with the
file named and once as "such a file". The paragraph also ended in the
middle of a sentence: "`clipboard.importPdf` takes every object of its
editing".

The sentence now appears once, with the file named, and the paragraph
ends with "its editing data."

Docs: docs/mcp.md.
2026-11-12 18:35:22 -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
BFlat 34cc6fd47a Merge pull request #7004 from dotCooCoo/fix/schema-too-deep-bad-params
MCP: a parameter nested too deeply is refused as bad parameters, not as an internal error
2026-11-13 09:30:07 +07:00
BFlat 274ec46a51 Merge pull request #7012 from dotCooCoo/fix/followup-6887
New Document: profiles bring their color profiles and link base
2026-11-13 09:29:58 +07:00
BFlat d860886a95 Merge pull request #7013 from dotCooCoo/feat/curvature-modifiers
Curvature: Alt-click on an open end goes on from it, and starts a path with a corner
2026-11-13 09:29:34 +07:00
dotCooCoo 7380b2475d Mesh: a color at a mesh envelope's point records no undo step
A mesh envelope's points carry no color, so object.mesh.addLine with
a color at a point the envelope already has changes nothing. It now
compares only the envelope's points and handles and records no undo
step. The command text and docs/mcp.md say so.
2026-11-12 18:23:31 -08:00
dotCooCoo fe1d56f339 Mesh: adding a line at a mesh point records no undo step
object.mesh.addLine at a point that is already a mesh point (a corner,
a point on an edge or inside) adds neither a row nor a column, yet it
recorded an undo step. The lines are now added to a copy of the object
first: when the grid stays the same, including a mesh envelope stored
without handles, the command returns the point's index and records
nothing. A new color at the point is still one undo step.
2026-11-12 18:06:23 -08:00
dotCooCoo 25c1a56755 Patterns: canceling a new pattern leaves no swatch or paint of it
Cancel on a pattern that Make created for the edit now removes every
swatch of it, a color group's included, and turns every paint of it
left in the document into no paint: art outside the editing layer,
opacity mask art, type runs, symbol definitions, graph designs, other
patterns' tiles (a copy Save a Copy made included), graphic and
character styles, brush art, and the fill, stroke and appearance new
art takes. Delete Pattern clears its paints in the same places, and a
Pattern Options rename renames them there; both reached only the
layers before. Delete's `unpainted` counts the document paints it
cleared.

Cancel after a Pattern Options rename during the edit gives the
pattern its old name back with its swatches and paints, unless another
pattern, swatch or color group has taken that name; before, the
definition went back to the old name while its swatches and paints
kept the new one.

Undo and Redo restore new art's paints with the document, including
the appearance inherited from the selection with New Art Has Basic
Appearance off. A rename preview that is replaced or canceled starts
again from the paints the interaction began with, and a canceled
preview takes the selection's appearance again.
2026-11-12 17:42:59 -08:00
dotCooCoo 93155b0e3f Recolor Artwork: the Color Theme Picker keeps symbol art and clipped image reads within their limits
The symbol instances the picker reads now share one limit of 16,000,000
placed objects, charged through charge_symbol_art and counted as the
renderer counts them, so deeply nested or heavily repeated instances
stop there. An instance whose art would pass the limit is left out with
its own paints, as the canvas draws none of it. Pattern tiles carry the
count in and out, and their art is read one level deeper than the
object the pattern fills, so a chain of patterns shares the depth limit
with the art around it; a pattern cut short there is read again where
it is used less deep.

The pixels read inside clip groups are now tested against at most
4,000,000 clipping-path elements in all. The clipped reads of one image
share the work, a read outside clip groups keeps its own pixel budget,
and when the work left can't test a pixel of every clipped read, the
reads that fit are kept in order and the rest are left out.
ImageBlob::sample_pixels takes a pixel budget for each pick.
2026-11-12 17:40:51 -08:00
dotCooCoo df155042d4 Merge main into feat/image-color-mask 2026-11-12 17:40:13 -08:00
BFlat f7a03f7899 Merge pull request #6991 from dotCooCoo/feat/recolor-theme-picker
Recolor Artwork: the Color Theme Picker picks new colors from the art on the canvas
2026-11-13 08:31:13 +07:00
BFlat 39f7d33e22 Merge pull request #6943 from dotCooCoo/feat/color-rgb-percent
Color: a double-click right of an RGB field switches between percent and 0 to 255
2026-11-13 08:31:01 +07:00
BFlat 8bd948f9b4 Merge pull request #6996 from dotCooCoo/fix/align-artboard-distribute
Align: artboard Distribute buttons need three artboards with Align to Selection
2026-11-13 08:30:39 +07:00
BFlat 2716eab08e Merge pull request #6975 from dotCooCoo/fix/followup-6841
Document Info: Spot Color Objects leaves out fills and strokes at opacity 0
2026-11-13 08:30:19 +07:00
BFlat a6f89f8c85 Merge pull request #6976 from dotCooCoo/fix/followup-6847
Cutting Tools: weeding lines stop at an outline that lies on a line
2026-11-13 08:29:58 +07:00
dotCooCoo 057db09c12 Curvature: Alt-click on an open end goes on from it, and starts a path with a corner
An Alt-click on an end of a selected open path makes that end the current
point without converting it, so the next click extends the path from it.
This applies to the other end too while one end is current; a plain click
there still closes the path. Alt-click on any other point still toggles it
between smooth and corner, and a double-click toggles any point, ends
included. An Alt-click that starts a new path places a corner point, as
later Alt-clicks do.

Changed behavior: an Alt-click on an end of a selected open path no longer
converts it; double-click converts it.

Help page: https://helpx.adobe.com/illustrator/desktop/draw-shapes-and-paths/draw-shapes/draw-shapes-with-the-curvature-tool.html
2026-11-12 17:23:58 -08:00
dotCooCoo bc97a8f897 New Document: profiles bring their color profiles and link base
Follow-up to #6887.

- file.new installs the color profiles a New Document profile's file
  carries when they are missing, as document.open does, so the new
  document's assigned profile draws and a save embeds it. A color
  profile that can't be used is listed in the result's `warnings` and
  shown in the status bar.
- The new document's links find their files through relative paths
  from the profile's file (`links_from`), as
  edit.newDocumentFromState sets it.
- When the read roots leave out the profiles folder, profileError's
  reason no longer names the folder's path.
2026-11-12 17:22:28 -08:00
dotCooCoo e51685dc23 Effects: a symbol instance's fill or stroke effects reshape its art and expand
A geometry effect on a symbol instance's topmost fill now reshapes the
filled shapes of the symbol's art, and one on its topmost stroke reshapes
the stroked shapes, keeping their colors, strokes and other detail. Only
a visible topmost fill or stroke with an opacity above 0 counts. Clipping
paths, guides and opacity-mask art keep their shapes; a group's own fills
and strokes in the art take the effects; a nested instance passes them on
to its own art, except one whose symbol holds the outer symbol.

The canvas, Use Preview Bounds and the drawn bounds, SVG and PDF export
and Object > Expand Appearance use the same art. Expand Appearance is
enabled for such an instance and turns it into an editable group in one
undo step. Bounds measure the art with a dynamic symbol's overrides, as
the canvas draws it.

Existing documents with a geometry effect on a symbol instance's fill or
stroke draw differently: before, the effect drew nothing.
2026-11-12 17:15:04 -08:00
dotCooCoo 61f170a761 Mesh: a point on a mesh's outline locates on its edge on every side
A point exactly on a gradient mesh's outline located on the top and left
edges but not on the bottom and right ones, where the nonzero winding
number is 0. object.mesh.addLine and Create Gradient Mesh at a point there
reported the point outside the mesh, and the Eyedropper did not sample it,
while the hit test selects the mesh there.

locate_within now takes the nearest point of the edge for a point within
a millionth of a point of the outline, with any tolerance, and returns
nothing for a point that is not finite. A point just outside still needs
a tolerance.
2026-11-12 16:56:22 -08:00
BFlat 89e22cb608 Merge pull request #6987 from dotCooCoo/fix/number-param-wrong-type
MCP: a required number given as a string is refused as the wrong type, not reported as missing
2026-11-13 07:49:01 +07:00
BFlat 0d553f9a4d Merge pull request #6985 from dotCooCoo/fix/fonts-in-masks-and-patterns
Fonts: Find Font, Replace Missing Fonts and font lists include type in opacity masks and patterns
2026-11-13 07:48:52 +07:00
BFlat 24af0c146a Merge pull request #6938 from dotCooCoo/fix/pdf-large-page-export
Export As: a PDF without artboards opens Save PDF and its options
2026-11-13 07:48:44 +07:00
BFlat b4bc86c45c Merge pull request #6942 from dotCooCoo/feat/cjk-insert-aki
Type: Insert Aki Left and Right add space before and after a character
2026-11-13 07:48:24 +07:00
dotCooCoo 06db8adae9 MCP: a parameter nested too deeply is refused as bad parameters
A value that nests past a command schema's 16-level limit was reported
as an internal error ("please report this bug"). It is now a parameter
error that names the value's path, like the schema's other refusals; a
schema that is wrong in itself is still an internal error.

The schema check now also refuses a list of ids or a point inside 16
lists, since every value of those types is a list and the value check
refuses a list at that depth. A color there still takes a string.

Docs: docs/mcp.md, docs/target-app-parity.md.
2026-11-12 16:45:18 -08:00
dotCooCoo b1a3ec4a97 Merge main into feat/color-rgb-percent 2026-11-12 16:15:23 -08:00
BFlat 4b344e91ce Merge pull request #6960 from dotCooCoo/feat/3d-graphics-planar
3D and Materials: map graphics onto the planar faces of 3D objects
2026-11-13 07:10:09 +07:00
BFlat 2d22db13ff Merge pull request #6978 from dotCooCoo/fix/docinfo-brush-type-translations
Document Info: Brushes shows brush types in the interface language
2026-11-13 07:10:00 +07:00
dotCooCoo d3375c1656 Color: Toggle RGB Percent switches the RGB units from the keyboard
The double-click right of an RGB field was the only way to switch R, G and B
between percent and 0 to 255 from the UI. ui.colorRgbPercent (Toggle RGB
Percent) is listed in the command palette and in Keyboard Shortcuts without a
default key, and switches the same setting. A parameter answers an error and
changes nothing. The label has a row in every complete catalog.
2026-11-12 16:04:30 -08:00
dotCooCoo 2b975d620e Actions: Insert Select Path stores the selected path as a step
The Actions panel menu has Insert Select Path, after Insert Menu Item.
With one whole path or compound path selected, it inserts a Select
Path step into the action being recorded, or after the selected action
or step. Playing the step selects that path again.

- New engine command `select.storedPath {id, fingerprint}`. The step
  stores the path's object id and a fingerprint of its geometry and
  fill rule ("v1:" and 16 lowercase hex digits, FNV-1a 64). Playback
  selects the path only while it exists unchanged and can be selected;
  otherwise the step fails and the selection stays as it was. A path
  on a locked artboard is refused in isolation mode too.
- Capture refuses an empty selection, several objects, selected
  anchors or segments alone, groups, type, guides, a path selected
  together with ruler guides, a member of a compound path, and hidden,
  locked or template art.
- New UI command `ui.action.insertSelectPath {set?, action?, step?}`.
  Step rows show "Select Path".
- `.vcactions` files that hold a Select Path step are written as
  version 4. Reading accepts versions 1 to 4 and refuses a Select Path
  step with invalid params.
- Rows for the new labels and messages in every catalog.

Docs: docs/mcp.md, docs/target-app-parity.md.
2026-11-12 16:02:00 -08:00
dotCooCoo 632830947a Merge main into feat/recolor-theme-picker
Xf::new is test-only on main now: the Color Theme Picker's canvas layer builds its view transform with Xf::at and the canvas's interface zoom.
2026-11-12 15:54:28 -08:00
dotCooCoo c97cea8a65 Align: artboard Distribute buttons need three artboards with Align to Selection
With the Artboard tool chosen and Align to Selection, two selected artboards are the first and the last of the distribution, so the Align panel's and the Control bar's Distribute buttons are off until three are selected. With Align to Artboard the spacing places the second artboard from the active one, and two are enough.

The Distribute Spacing field takes negative values with the Artboard tool chosen, as artboard.distributeSpacing overlaps the artboards with a negative spacing. With other tools its lowest value stays 0.

Art inside two overlapping artboards now goes with the one first in artboard order when the artboard Align and Distribute commands move them, and stays when that artboard stays, as in the other artboard edits.
2026-11-12 15:49:46 -08:00
dotCooCoo 3efdf4ab9c MCP: a required number given as a string is refused as the wrong type, not reported as missing
A command that needs a number, such as `x` of `shape.rectangle`, `intensity`
of `edit.colors.saturate` or `index` of `object.envelope.setMeshPoint`,
answered "missing number `x`" both when the key was left out and when it was
given as a value that is not a number, such as "40". A value that is given but
is not a number is now refused with "`x` must be a number, not "40"", the
message the optional number checks already use, showing the value as given.
A key left out or given as null is still a missing number. Neither error
changes the document or records an undo step.

Docs: docs/mcp.md, docs/target-app-parity.md.
2026-11-12 15:44:02 -08:00
dotCooCoo 5beed58f0f PDF export: the art-bounds warning appears only with Preserve Editing on
A PDF of the art's bounds never carries Preserve Editing data, and the
export adds its warning only when Preserve Editing was on. docs/mcp.md
and the document.exportPdf params text now say so.
2026-11-12 15:41:04 -08:00
dotCooCoo 52867e7096 Fonts: Find Font, Replace Missing Fonts and font lists include type in opacity masks and patterns
Find Font and Replace Missing Fonts looked only at the type on the layers
and in symbols, and the font list behind the export warning, Package and
the Missing Fonts dialog skipped opacity masks and pattern swatches.

- text.fonts lists the type in opacity masks (on objects and layers,
  disabled masks and masks inside other art included) and in pattern
  swatches, a swatch that nothing paints with included. A pattern's type
  counts once however many objects it paints. With selectionOnly, the
  masks of the selected objects and the symbols and patterns they show.
- select.font also selects the objects whose mask holds the font and the
  objects painted with a pattern whose art uses it (visible fills and
  strokes wider than 0). A layer's mask and an unused swatch select
  nothing.
- text.replaceFont changes that type in one undo step. Type in the mask
  of a hidden or locked object, and the type of a pattern that only
  hidden or locked selected objects paint with, keeps its font and is
  counted in skipped.
- addon.cleanup.replaceFonts replaces missing fonts in masks and
  patterns, hidden or locked type included.
- text.missingFonts, File > Package and the export warning read masks
  and patterns too.
- document.info's fonts for the whole document (the Fonts and Font
  Details categories and the text report) include the same type. With
  selectionOnly the list stays the selected type's fonts.

While a mask or pattern is edited, its type is taken from the editing
layer only.
2026-11-12 15:29:22 -08:00
dotCooCoo 6c280fa05a Control bar: dragging the gripper away from both docked edges floats the bar
Dragging the Control bar's gripper and releasing it within 24 points of
the top (under the menu bar) or the bottom of the window docks the bar
at that edge, as before. Released farther from both edges, the bar now
floats over the window under the pointer, 800 points wide or as wide as
the window, without taking room from the canvas. A floating bar's
gripper moves it or docks it again, and its panel menu keeps Dock to Top
and Dock to Bottom, neither checked while it floats.

- window.control.dock takes edge "float"; a floating bar floats where it
  last floated, first at 60, 80 in window points.
- Escape cancels a gripper drag, and a release outside the window leaves
  the bar where it was. In a window too short for a floating bar between
  the two zones, a release docks it at the nearer edge. A floating bar is
  kept inside a window that shrinks.
- Workspaces and preferences keep whether the bar floats and where;
  older ones dock it at the edge they name. Menus stop at the window's
  bottom while the bar floats.

Docs: docs/mcp.md, docs/target-app-parity.md.
2026-11-12 15:25:11 -08:00
dotCooCoo d5a02ee872 Merge main into feat/3d-graphics-planar 2026-11-12 15:19:09 -08:00
dotCooCoo 31b669a0a1 Recolor Artwork: the Color Theme Picker picks new colors from the art on the canvas
The Color Theme Picker button beside the Assign and Edit tabs turns on
picking from the canvas. A click takes the color palette of the object a
Selection tool click takes there, a drag takes the palette of the art
inside its marquee, and Shift adds more picks. The rows that are not
excluded take the palette as their new colors and the art previews them;
OK keeps the recolor as one undo step.

- recolor.pickTheme {picks, colors?} returns the palette of the art
  picked: visible fills and strokes, gradient stops, text, mesh points,
  pattern tiles, symbol art, colorize colors and image pixels. Clip
  groups, clipping opacity masks and isolation mode limit it to what
  shows, and it changes nothing.
- Each object read weighs the same; similar colors merge (k-means in Lab)
  into at most `colors`, most used first. Image reads are bounded (65,536
  pixels a pick, 1,048,576 pixels and 64 images in all), and past 4,096
  distinct colors, close colors merge before clustering.
- The dialog's themePicker and themePicks fields drive it from
  ui.dialog.set. A new Colors count keeps the picks.
2026-11-12 15:16:23 -08:00
BFlat b4505a76de Merge pull request #6887 from dotCooCoo/feat/new-document-profiles
New Document: each preset category starts documents from its own profile
2026-11-13 06:11:41 +07:00
BFlat d61ad77529 Merge pull request #6909 from dotCooCoo/feat/align-artboards
Align: the Align panel aligns and distributes the selected artboards
2026-11-13 06:11:32 +07:00
BFlat a55606e66b Merge pull request #6949 from dotCooCoo/fix/assign-profile-working-spaces
Color management: Assign Profile leaves the working spaces of Color Settings
2026-11-13 06:11:15 +07:00
dotCooCoo 68fe1dbaea Merge main into feat/actions-select-object 2026-11-12 15:11:08 -08:00
dotCooCoo 5494e1aaa7 Merge main into feat/color-rgb-percent 2026-11-12 15:11:03 -08:00