Commit Graph
11920 Commits
Author SHA1 Message Date
BFlat c2f97d2efa Merge pull request #6961 from dotCooCoo/fix/gradient-repeat-runs
Gradients: a repeated gradient with many stops keeps every run
2026-11-13 05:22:59 +07:00
BFlat 71d717b1da Merge pull request #6940 from dotCooCoo/feat/learn-tool-locator
Learn: a tool's name in a tutorial step shows where the tool is
2026-11-13 04:26:05 +07:00
BFlat 3434e46240 Merge pull request #6825 from dotCooCoo/feat/custom-arrowheads
Stroke: custom arrowheads from an arrowheads file join the arrowhead menus
2026-11-13 04:25:55 +07:00
BFlat 10e87ff993 Merge pull request #6873 from dotCooCoo/fix/transform-effect-scales-raster-effects
Effects: a Transform effect transforms the raster effects listed before it
2026-11-13 04:25:45 +07:00
BFlat 321aa13251 Merge pull request #6962 from dotCooCoo/fix/trace-tinted-photos
Image Trace: sepia, single-hue and duotone photos are smoothed as gray photos are
2026-11-13 04:25:36 +07:00
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 da84e53b30 Merge pull request #6864 from jmverges/fix/6856-ai-type-pattern-paint
.ai import: type filled or stroked with a pattern keeps its pattern
2026-11-13 04:25:16 +07:00
dotCooCoo c513114674 Gradients: Expand reports a capped gradient as unavailable
- object.expand.info reports no gradient or fill to expand for a
  gradient that repeats in more runs across its box than are written,
  matching object.expand, which leaves it a gradient. For a path that a
  painting live effect draws, it measures each piece the effect returns.
- CSS writes a repeating gradient's stop positions, and a repeating
  radial gradient's radius, with enough decimals that their rounding
  adds up to at most a hundredth of a period across the box (at least
  four for positions and three for the radius).
- docs/mcp.md says that sharp steps and swatch-linked stops are the last
  to be left out rather than always kept, and that the CSS conic limit
  counts stops before midpoints and Perceptual curves add more.
2026-11-12 12:55:54 -08: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 bb10f74019 Merge pull request #6875 from dotCooCoo/fix/window-menu-panel-toggle
Window menu: a panel's entry shows the panel Tab hid instead of closing it
2026-11-13 03:28:26 +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 653ecc8216 Merge pull request #6935 from dotCooCoo/fix/eps-linear-time-test-steps
EPS tests: the reader's long tests check counts and shared state instead of a 20 s limit
2026-11-13 03:27:59 +07:00
BFlat e98d88ec7a Merge pull request #6880 from dotCooCoo/fix/i18n-plugin-messages
i18n: plug-in host errors are translated in every complete catalog
2026-11-13 03:27:51 +07:00
BFlat 484915de53 Merge pull request #6947 from dotCooCoo/fix/shortcut-rows-same-name
Keyboard Shortcuts: rows with the same name get names of their own
2026-11-13 03:27:42 +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 9507b88bad Merge pull request #6953 from dotCooCoo/fix/canvas-still-wait-placed-generation
Canvas: each document keeps its own placed-bitmap value in the frame key
2026-11-13 03:27:26 +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 f976979a2f Merge pull request #6955 from dotCooCoo/fix/blend-profiles-follow-key-start
Blend: stroke profiles turn with a key path started at another anchor
2026-11-13 03:27:08 +07:00
jmverges b783bb13ad Merge remote-tracking branch 'upstream/main' into fix/ai-type-pattern-paint
# Conflicts:
#	docs/file-format-parity.md
2026-11-12 20:19:19 +00:00
dotCooCoo 197d033b4f Merge main into feat/custom-arrowheads 2026-11-12 12:04:01 -08:00
dotCooCoo 780d00671a MCP: the UI catalog lists learn.locateTool
crates/mcp/src/ui_catalog.rs is regenerated from crates/ui-egui/src/menus/ui_commands.rs, so `cargo xtask ui-commands --check` passes.
2026-11-12 11:59:18 -08:00
BFlat 41f384bffc Merge pull request #6921 from dotCooCoo/fix/ai-save-cmyk-equivalents-stable
.ai save: RGB and named colors keep their CMYK equivalents when a reopened file is saved
2026-11-13 02:47:37 +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 ace6e9839d Merge pull request #6926 from dotCooCoo/feat/recent-colors-to-swatches
Color: a recent color drags into the Swatches panel to become a swatch
2026-11-13 02:46:48 +07:00
BFlat 86f8a6dcbd Merge pull request #6927 from dotCooCoo/fix/roughen-size-zero
Effects: Roughen at size 0 keeps the outline
2026-11-13 02:46:39 +07:00
BFlat 977ed77b72 Merge pull request #6916 from dotCooCoo/feat/font-menu-wide-layout
Font menu: one wide layout wherever it opens, with larger samples
2026-11-13 02:46:30 +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 d22d3ced48 Merge pull request #6931 from dotCooCoo/fix/eps-cshow-kshow-restore-font
EPS import: cshow and kshow procedures see the font PLRM gives them
2026-11-13 02:46:10 +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
BFlat dd96af8b0f Merge pull request #6923 from dotCooCoo/chore/craft-update-e98299546
Updates: take craft-update from craft-libs main at e98299546
2026-11-13 02:45:51 +07:00
BFlat e263a9c7d6 Merge pull request #6895 from makesomethingshit/fix/6865-ai-oversized-artboard
Fix #6865: Keep oversized artboards when opening editing data
2026-11-13 02:45:43 +07:00
dotCooCoo 7c4414fed7 Learn: a located tool's toolbar comes to the front and a tall flyout scrolls
- A Learn link that locates a tool on a toolbar made with New Toolbar
  brings that toolbar to the front once before its button is marked, so
  another floating toolbar no longer covers the mark. A group torn off
  into a strip still brings the strip to the front instead.
- A docked flyout whose rows are taller than the window scrolls them, and
  a Learn link scrolls the located row into view before marking it. The
  mark is clipped to the rows' view.
2026-11-12 11:44:48 -08:00
dotCooCoo eee6fb51fd Image Trace: sepia, single-hue and duotone photos are smoothed as gray photos are
Color and Grayscale traces smoothed a gray photo before choosing its
colors, but a tinted photo with the same tones skipped smoothing: the
0.065 error rule applied only to pictures whose channels stay within 8
levels of each other. A picture whose opaque pixels lie, 19 in 20, within
6 levels of one tone curve now takes the same rule. The curve runs
through the median color of each 8-level stretch along the colors' main
direction, and a pixel on it must also lie within 6 levels of the plane
the colors spread along most, so art in several unrelated colors is not
counted. The sixteen-versus-eight exception still keeps clean flat art
on the flat-art route.
2026-11-12 11:39:53 -08:00
dotCooCoo 0691e1acbe Gradients: keep every run of a repeated gradient with many stops
When a repeated or reflected gradient needs more stops than a limit
allows, each run now leaves out the stops that change its colors
least, so every run is still written, instead of writing fewer runs
and padding the rest with the last color. Each run keeps its ends,
sharp steps, swatch-linked stops, tint and CMYK ink changes and spans
shaped by an off-center midpoint, and the colors are compared as the
gradient's method mixes them. This applies to gradients along or across
a stroke, CSS conic gradients, and PDF, EPS and .ai export.

- Outline Stroke's mesh fits the gradient to at most 1,024 stops, and
  splits a stroke into several meshes when one would hold more than
  2^20 points.
- Object > Expand leaves a gradient as it is when the box needs more
  than 256 runs, instead of expanding only the first runs.
- CSS writes the stop positions of repeating gradients with four
  decimals, so the period stays in place across the box.
- A swatch chip of a gradient that repeats gets at least four grid
  cells a run along each side (at most one a point, and 128), so it
  does not show one color when the count matches the chip's cells.
- docs/mcp.md states the stop limits and the PDF import sample budget.
2026-11-12 11:30:44 -08:00
dotCooCoo 6da0e0f115 Tests: the shadow-on-each-fill test installs its own plug-in id
a_shadow_on_each_fill_a_painted_effect_returns_follows_the_transform_after_it
installed test.engine.twofills, which
a_second_painted_effect_on_a_fill_keeps_the_piece_s_other_fills also
installs with a different module. Installed plug-ins are kept for the
whole test process, so running the two tests in parallel could run one
test's effect with the other's module. The test now installs
test.engine.shadowedfills.
2026-11-12 11:29:37 -08:00
dotCooCoo 9d8df6f27f Type: Bunri-Kinshi finds a pair by its clusters in right-to-left justification
Single Word Justification adds no space inside an inseparable pair. A
right-to-left line draws the second half's cluster before the first half,
with the cluster's glyphs in logical order, so a dash followed by a
combining mark puts the mark next to the first dash. The pair is now found
from the two neighboring clusters instead of neighboring glyph indices.
2026-11-12 11:05:35 -08: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 7a77bd3381 Merge main into fix/window-menu-panel-toggle 2026-11-12 10:56:53 -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