Commit Graph
3677 Commits
Author SHA1 Message Date
BFlat b8d23007e8 Merge pull request #6964 from dotCooCoo/fix/shaper-stroke-click-construction
Shaper: a click on an original shape's outline enters Construction mode
2026-11-13 04:25:26 +07:00
BFlat 80f909a162 Merge pull request #6936 from dotCooCoo/fix/css-export-scope-type
CSS: css.export refuses a scope or path that is not a string
2026-11-13 03:29:20 +07:00
BFlat 3e35a03a3d Merge pull request #6937 from dotCooCoo/fix/artboard-new-subpoint-sides
Artboards: artboard.new keeps a side below 1 pt as given
2026-11-13 03:29:11 +07:00
BFlat bb3f5c6d1a Merge pull request #6827 from dotCooCoo/fix/read-roots-document-replies
MCP: document.inspect and document.json leave out paths outside a confined client's read roots
2026-11-13 03:29:01 +07:00
BFlat f4767e89ff Merge pull request #6945 from dotCooCoo/feat/svg-variable-data
SVG: Save As SVG can include the document's variables and data sets
2026-11-13 03:28:53 +07:00
BFlat 06ee4cac00 Merge pull request #6952 from dotCooCoo/fix/remove-background-colorized-gray
Remove Background: a gray image colorized with a process color is refused
2026-11-13 03:28:44 +07:00
BFlat b7062daa6b Merge pull request #6951 from dotCooCoo/fix/proof-view-unchanged
Color management: proof view commands redraw only when the view changes
2026-11-13 03:28:34 +07:00
BFlat 87485971b0 Merge pull request #6959 from dotCooCoo/fix/item-transform-later-raster-effects
Effects: a fill's or stroke's own Transform effect leaves the effects listed after it unscaled
2026-11-13 03:28:16 +07:00
BFlat bfd7b3dc00 Merge pull request #6944 from dotCooCoo/feat/bunri-kinshi
Type: Bunri-Kinshi keeps inseparable character pairs on one line
2026-11-13 03:28:08 +07:00
BFlat 8e9d9b7f89 Merge pull request #6948 from dotCooCoo/test/findfiles-remove-temp-trees
Tests: findfiles tests remove the folder trees they make
2026-11-13 03:27:34 +07:00
BFlat 28d97a82a8 Merge pull request #6954 from dotCooCoo/fix/trace-logo-flatness-own-colors
Image Trace: Flat Logo judges flat art by the image's own colors
2026-11-13 03:27:17 +07:00
BFlat bc882d1fc0 Merge pull request #6910 from dotCooCoo/fix/library-ids-and-save-replies
MCP: a hidden library's shown id names it in requests, and replies hide its path wherever it appears
2026-11-13 02:47:27 +07:00
BFlat a2899e538b Merge pull request #6894 from dotCooCoo/fix/read-roots-error-messages
Automation: errors name a path outside the read roots by its file name
2026-11-13 02:47:17 +07:00
BFlat 813b24b0a5 Merge pull request #6835 from dotCooCoo/feat/blend-canvas-easing-handles
Blend: on-canvas widgets set a selected blend's color shift and easing
2026-11-13 02:47:08 +07:00
BFlat e58807ce07 Merge pull request #6851 from dotCooCoo/fix/recovery-held-crashed-areas
Data Recovery: restore and discard act on copies kept by an area they already hold
2026-11-13 02:46:57 +07:00
BFlat 339e33a4df Merge pull request #6905 from dotCooCoo/fix/type-size-range-error
Type: text.create and the type style commands refuse a size outside 0.1 to 1296 pt
2026-11-13 02:46:20 +07:00
BFlat 036c563635 Merge pull request #6820 from dotCooCoo/feat/brushes-ink-wash-library
Brushes: built-in Ink and Wash library with tapered ink, brush pen and wash brushes
2026-11-13 02:46:00 +07:00
dotCooCoo 85b3740cca Effects: a fill's or stroke's own Transform effect leaves the effects listed after it unscaled
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.
2026-11-12 10:59:21 -08:00
dotCooCoo 74e61c9b74 Image Trace: Flat Logo judges flat art by the image's own colors
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.
2026-11-12 10:48:20 -08:00
BFlat fa29ea67b9 Merge pull request #6933 from storytold/fix/hpgl-ew-adaptive-line
Dashes fitted to corners take a subpath with no segments
2026-11-13 01:43:44 +07:00
dotCooCoo 451c308ed4 Remove Background: a gray image colorized with a process color is refused
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.
2026-11-12 10:41:22 -08:00
dotCooCoo c7780becb3 Tests: findfiles tests remove the folder trees they make
tree() in crates/engine/src/cmd/findfiles/tests.rs returns a Tree guard
that holds the canonical path and removes the folder with everything in
it when it is dropped, also when the test panics. When the removal
fails, the guard gives the owner read, write and search permission on
every folder in the tree (Unix; links are not followed) and removes it
again, so a test that panics while a folder is locked leaves nothing
behind. A removal that still fails is ignored.

tree() empties the folder temp_dir returns in place instead of removing
and remaking it, so on Unix the folder keeps the owner-only mode that
temp_dir sets.
2026-11-12 10:38:06 -08:00
dotCooCoo 344d756bf6 Color management: proof view commands redraw only when the view changes
view.proofSetup, view.proofColors, view.overprintPreview and
view.separationsPreview stored the proof view and raised every open
document's revision on each run. They did this also when the request
asked for the view that was already showing, for example Proof Colors on
while it is on, or Proof Setup with no params. Each such run redrew every
canvas. When the active document's revision changes, the canvas also
sends a tool that asks for it a new hover event, although the pointer has
not moved.

- The four commands compare the new proof view with the current one. When
  the two are equal, the commands leave the view and the revisions as
  they are. Separations Preview's visible plates are compared as a set,
  so the same plates in another order do not redraw.
- view.separationsPreview with `plates` naming a plate twice shows it
  once, so one `toggle` of that plate hides it.
- color.loadProfile with a new file of the CMYK profile that Proof Setup
  targets gives the documents new revisions, as it does for a working
  space. Before, running Proof Setup again redrew the documents through
  the new file; it now leaves an unchanged view alone.
- color.removeProfile gives the documents new revisions only when Proof
  Setup targets the removed profile.
2026-11-12 10:32:02 -08:00
dotCooCoo 9371a9ea51 Merge main into fix/read-roots-document-replies 2026-11-12 10:27:20 -08:00
dotCooCoo 40f4c920e7 Type: Bunri-Kinshi keeps inseparable character pairs on one line
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.
2026-11-12 10:26:11 -08:00
dotCooCoo 1132cf0c79 SVG: Save As SVG can include the document's variables and data sets
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.
2026-11-12 10:18:22 -08:00
dotCooCoo 70a4c44033 Effects: every fill a painted effect returns follows the Transform effect
A painted live effect on a fill can return a piece with several fills,
each a copy of that fill with its effects. A Transform effect after it
moved the piece, but only the first returned fill's raster effects
followed it: with a Drop Shadow before the painted effect and a 200%
Transform effect after it, the first fill's shadow offset became 20 pt
and the second fill's stayed 10 pt. Each returned fill and stroke now
takes the followed values.
2026-11-12 10:08:53 -08:00
dotCooCoo da39713031 CSS: css.export refuses a scope or path that is not a string
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.
2026-11-12 10:06:56 -08:00
BFlat a15a4abc5c Merge pull request #6751 from dotCooCoo/feat/eps-save-use-artboards
EPS: Save As shows Use Artboards, off by default, and the box fits all visible art
2026-11-13 00:51:58 +07:00
BFlat c62d1d8713 Merge pull request #6908 from dotCooCoo/fix/actions-toggle-limits
Actions: recording, step exclusions and set edits keep sets that Load Actions reads
2026-11-13 00:50:37 +07:00
BFlat a4357a7ad5 Merge pull request #6915 from dotCooCoo/fix/assign-profile-keeps-color-settings
Color management: assigning the working profiles keeps the active color settings
2026-11-13 00:50:24 +07:00
BFlat 80359e415f Merge pull request #6874 from dotCooCoo/fix/script-failed-run-keeps-no-place
Scripts: a named engine keeps no source map for a run whose script does not compile
2026-11-13 00:49:38 +07:00
BFlat 8bf4de0a5a Merge pull request #6919 from dotCooCoo/feat/bbox-follows-move-and-draw
Selection: Show Bounding Box While Moving and Drawing shows the box during moves and shape drawing
2026-11-13 00:49:17 +07:00
bflatastic cfce336215 Dashes fitted to corners take a subpath with no segments
An HP-GL wedge of almost no radius drawn with an adaptive line type
(LT-1;EW0.000001,0,0;) leaves a lone moveto. Fitting the dashes to its
corners indexed the empty segment list and panicked while rendering. Such
a subpath now uses the exact plan, which has no runs to fit.

Found by import_fuzz::random_hpgl_instructions_never_panic.
2026-11-13 00:47:30 +07:00
dotCooCoo 369de5bc4c Merge main into fix/read-roots-error-messages 2026-11-12 09:45:21 -08:00
dotCooCoo 4b9a611189 artboard.new: keep sides below 1 pt as given
artboard.new no longer raises a width or height below 1 pt to 1 pt, and artboard.setProps raises only a supplied side, so an edit to a small artboard's name or lock keeps its size.
2026-11-12 09:39:51 -08:00
dotCooCoo 60fd410906 Merge main into fix/type-size-range-error 2026-11-12 09:30:29 -08:00
dotCooCoo 075fff4c6d Merge main into fix/library-ids-and-save-replies 2026-11-12 09:29:20 -08:00
dotCooCoo 87d1f0b3d7 Merge main into fix/transform-effect-scales-raster-effects 2026-11-12 09:23:19 -08:00
dotCooCoo 2d66758ce4 MCP: document.json checks brush art and relative link paths against the read roots
Under --automation-read-root, document.json names a linked image or
placed file in a stored brush's art outside the read roots by its file
name alone, as it does in the layers. A stored brush entry that does not
read as a brush is left out of the reply, and a stored brush library
that is not a list becomes an empty one. A link whose file is inside the
read roots loses its stored relative path when that path leads outside
them, from the folder of the file the document was read from or from the
document's own folder.
2026-11-12 09:19:15 -08:00
dotCooCoo f42b46e5eb Merge main into fix/recovery-held-crashed-areas 2026-11-12 09:00:02 -08:00
dotCooCoo 5a7d445807 Merge main into fix/script-failed-run-keeps-no-place 2026-11-12 08:55:15 -08:00
BFlat 2304b38f19 Merge pull request #6907 from dotCooCoo/feat/art-brush-width-pen-pose
Brushes: Art Brush Options' Width can follow the pen's tilt, bearing and rotation
2026-11-12 23:54:29 +07:00
BFlat dc68ae950c Merge pull request #6912 from dotCooCoo/fix/new-document-side-limit
New Document: file.new and artboard.new take the same largest artboard side
2026-11-12 23:54:11 +07:00
BFlat 6a695a01ec Merge pull request #6847 from dotCooCoo/feat/weed-box-and-lines
Cutting Tools: Weed Box and Lines adds a weed box and weeding lines around art
2026-11-12 23:54:01 +07:00
BFlat a6aac579c0 Merge pull request #6904 from dotCooCoo/feat/ai-editing-data-s6c
.ai save: the editing copy keeps brushes and brushed paths
2026-11-12 23:53:38 +07:00
BFlat e618783377 Merge pull request #6084 from Taha-Mahmoodi/feat/glyph-alternates
Glyphs: alternates keep the word joined (feature values, one-piece shaping, unencoded glyphs)
2026-11-12 23:53:13 +07:00
dotCooCoo 9df4a83f07 Merge main into feat/blend-canvas-easing-handles 2026-11-12 08:46:06 -08:00
dotCooCoo fc1a08edbd Merge main into feat/brushes-ink-wash-library 2026-11-12 08:46:00 -08:00
dotCooCoo 5006ba5a2e Merge main into feat/eps-save-use-artboards 2026-11-12 08:45:42 -08:00