Commit Graph
1658 Commits
Author SHA1 Message Date
BFlat fcfad959ff Merge pull request #7588 from dotCooCoo/fix/mesh-point-color-panel
Color: the panels show the color and opacity of picked gradient mesh points
2026-11-15 00:41:54 +07:00
BFlat 53cc597fbd Merge pull request #7554 from dotCooCoo/fix/place-text-utf16-no-bom
Place: text files in UTF-16 without a byte-order mark place as UTF-16
2026-11-15 00:41:11 +07:00
BFlat 9735165c40 Merge pull request #7556 from dotCooCoo/fix/rasterfilters-deterministic
Tests: raster effects draw the same twice while another test assigns a document profile
2026-11-15 00:40:50 +07:00
BFlat 8c5494bccc Merge pull request #7342 from dotCooCoo/feat/live-paint-selection-double-click
Live Paint: a Live Paint Selection double-click selects the connected faces or edges
2026-11-15 00:40:41 +07:00
BFlat 3d895d9ac7 Merge pull request #7448 from dotCooCoo/fix/reverse-path-profiles
Paths: Reverse Path Direction turns the stroke's width profile and pen records with the path
2026-11-15 00:40:08 +07:00
BFlat d89f593bfa Merge pull request #7380 from ncic/pencil-cursors
Pencil: shows where a stroke continues, connects and closes
2026-11-15 00:38:01 +07:00
FredApps 676f0524cc Merge pull request #1203 from FredApps/fix/spiral-decay-setting-20261011
Keep Spiral decay settings consistent with drawn geometry
2026-11-14 16:22:35 +01:00
BFlat edefbd0e7d Merge pull request #7449 from dotCooCoo/fix/links-stored-brush-art
Links: placed images in stored brush art get Links rows
2026-11-14 21:55:20 +07:00
BFlat 66d24335e1 Merge pull request #7599 from dotCooCoo/fix/trace-hand-in-same-document
Image Trace: a finished trace is applied only to the document it was made in
2026-11-14 21:54:04 +07:00
BFlat 68b246851b Merge pull request #7261 from dotCooCoo/fix/smooth-keeps-closed-start
Smooth tool: smoothing over a closed path's first anchor keeps its start
2026-11-14 21:53:16 +07:00
BFlat 5762ec729b Merge pull request #7598 from dotCooCoo/fix/symbol-art-bounds-nested
Symbols: a symbol nested in symbol art is measured by its own art
2026-11-14 21:53:07 +07:00
BFlat 6e3ec907de Merge pull request #7592 from dotCooCoo/fix/brush-freehand-unknown-brush
Brushes: brush.freehand refuses a brush or style it cannot use
2026-11-14 21:52:42 +07:00
BFlat 158558c3d5 Merge pull request #7539 from dotCooCoo/fix/perspective-grid-noop-undo
Perspective: reapplying the current grid preset adds no undo step
2026-11-14 21:52:35 +07:00
BFlat b2b82ddbd6 Merge pull request #7464 from dotCooCoo/fix/followup-7305
Path: path.setHandle to the handle's own point leaves a smooth anchor unchanged
2026-11-14 21:52:26 +07:00
BFlat 508a0b0180 Merge pull request #7597 from dotCooCoo/fix/separations-spot-stop-plates
Print: a spot gradient stop prints its process plates on the separations
2026-11-14 21:51:47 +07:00
BFlat 4807a2b6de Merge pull request #7596 from dotCooCoo/test/swatch-batch-spot-options-defaults
Swatches: test Spot Colors options and Default Swatches replace in a batch
2026-11-14 21:51:21 +07:00
BFlat ca546d0831 Merge pull request #7473 from dotCooCoo/fix/map-links-stop-plates
Swatches: a gradient stop unlinked from its spot swatch also drops its plates
2026-11-14 21:50:25 +07:00
BFlat 4c9d678863 Merge pull request #7591 from dotCooCoo/fix/swatch-edit-gradient-aspect
Swatches: a replacement gradient or pattern is stored the way a new swatch stores it
2026-11-14 21:50:09 +07:00
BFlat 98324db329 Merge pull request #7460 from dotCooCoo/fix/plugin-store-folder-lock
Plug-ins: windows and processes take turns on the Plug-ins folder
2026-11-14 21:49:19 +07:00
dotCooCoo f6ad3ecc01 Merge main into feat/live-paint-selection-double-click
# Conflicts:
#	docs/target-app-parity.md
2026-11-14 06:28:52 -08:00
ncic cd89999939 Merge remote-tracking branch 'upstream/main' into pencil-cursors
# Conflicts:
#	docs/target-app-parity.md
2026-11-14 14:42:23 +01:00
BFlat 3c15649730 Merge pull request #7427 from dotCooCoo/fix/live-paint-expand-drawn-stroke
Live Paint: Expand keeps the faces and edges that draw
2026-11-14 20:37:59 +07:00
BFlat c8230b469a Merge pull request #7422 from dotCooCoo/fix/dcs-placement-clip-keeps-file-clip
Place: Placement Options clip a DCS image inside its file's clipping path
2026-11-14 20:37:10 +07:00
BFlat f8faab6597 Merge pull request #7429 from dotCooCoo/fix/live-shape-replay-negative-radius
Live Shapes: saved object.setLiveShape steps with a negative radius or out-of-range sides replay again
2026-11-14 20:36:38 +07:00
dotCooCoo 01359bc753 Image Trace: a trace made off the UI thread applies only in its own document
A trace handed in for imageTrace.make or imageTrace.makeAndExpand was
matched by its object, image, pixels and settings alone, so a trace made
in one document could stand in for the command in another open document
with the same image and settings. The trace's inputs now carry the
document's uid: TraceRun::current is false in any other document, and the
commands there drop the trace handed in and trace their own image, as one
undo step.

Test: a_trace_run_applies_only_in_its_own_document.
2026-11-14 05:11:34 -08:00
dotCooCoo bc24ad5352 Symbols: a symbol nested in symbol art is measured by its own art
Document::symbol_art_bounds measured a symbol's art without the
document, so an instance of another symbol in that art counted as the
20 x 20 square. It now measures the art through SymbolBoxes, so a nested
instance takes its own symbol's art, and an inline graphic of the outer
symbol is sized by it and follows it when that symbol changes.

- The inline resolve order also follows the instances that size a
  symbol's art, so a symbol is measured after the type in the art of
  the symbols it holds is laid out again.
- A symbol whose art reaches itself through an instance and an inline
  graphic is an empty slot. Only instances that the measurement uses
  count, so one a clipping path hides adds no dependency.
- A missing symbol, a symbol without art, a symbol that holds an
  instance of itself, and nesting 32 deep still measure as the square.
- SymbolBoxes finds symbols through a name index built once, and the
  inline resolve pass and inline_art_bounds share one index, instead
  of scanning the symbol list for each lookup.
2026-11-14 05:10:41 -08:00
dotCooCoo 893af5b3d6 Merge main into fix/perspective-grid-noop-undo 2026-11-14 05:07:49 -08:00
dotCooCoo bad6ee22ea Merge main into fix/place-text-utf16-no-bom 2026-11-14 04:55:27 -08:00
dotCooCoo 3474f7d123 Swatches: test Spot Colors options and Default Swatches replace in a batch
swatch.spotOptions and swatch.resetDefaults {replace: true} rewrite the
fill and stroke for new art through map_default_paints, which also runs
for command.batch steps. Two tests now run each command on its own and
as a batch step followed by a rectangle, and check that the default
paints and the rectangles match: a Lab spot link keeps its tint and
takes the Lab values or their CMYK equivalent in both directions, and a
link to a swatch the replace removes is dropped while the color stays.
Both tests fail when map_default_paints skips every interaction.

The progress line for swatch steps in a batch names the two commands and
the new tests.
2026-11-14 04:54:25 -08:00
dotCooCoo 6ab46b5fd8 Print: a spot gradient stop prints its process plates on the separations
A gradient stop linked to a spot ink that also carries process plates
(a DeviceN stop opened from a PDF) printed only its spot tint: print
separations and Separations Preview left its Cyan, Magenta, Yellow and
Black plates blank. They now print the stop's plates beside the tint.
With spots printed as process, each process plate prints the stop's
plate layered with the spot tint's process equivalent, as a separated
image's spot plates layer. Plates beside no spot link, or beside
Registration, still print nothing of their own.

The color visitor also skipped a freeform gradient's points, so print
plates kept their display colors and Document Color Mode left them
unconverted. The points are now visited as unlinked colors.
2026-11-14 04:46:10 -08:00
dotCooCoo be9be8c1bd Swatches: a replacement gradient or pattern is stored as a new swatch stores it
swatch.edit stored a replacement gradient without its placement, so a
radial gradient with an aspect, Alt-dropped on a gradient swatch or
given as `paint`, lost that aspect, while swatch.new keeps it and
applies the swatch with it. A gradient given an aspect without `start`
and `end` lost the aspect in both commands. A replacement pattern kept
the tile transform of the swatch it came from, while swatch.new stores
a pattern untransformed, and `paint: {pattern: name}`, which an Alt-drop
of a pattern fill sends, was refused.

swatch.edit and swatch.new now store a gradient or pattern through one
helper: a gradient keeps its aspect, with or without a vector, and holds
no swatch link, and a pattern is untransformed. swatch.edit takes a
pattern by name, as swatch.new does.
2026-11-14 04:45:04 -08:00
dotCooCoo f37c5c293e Brushes: brush.freehand refuses a brush or style it cannot use
brush.freehand drew the plain path when `brush` named no brush in the
document or was not a string, and drew a pencil stroke for any `style`
other than "brush". It now refuses an unknown name with "no brush named
`<name>`", as brush.apply and brush.setCurrent do, a `brush` that is not
a string, and a `style` other than "pencil" or "brush". The document does
not change and no undo step is recorded. A `brush` left out or null still
draws the plain path.

The Paintbrush skips a tool brush or current brush that has been deleted
and paints with the other, or draws the plain path when neither is in the
document, so a stroke after a brush is deleted is not refused.
2026-11-14 04:41:02 -08:00
dotCooCoo 00767dcf57 Color: picked gradient mesh points are the color the panels show and edit
With points of a gradient mesh picked (Mesh tool, Direct Selection or the
Lasso), a solid fill color from the Color panel recolors just those points,
but the Fill proxy, the Color panel, the Color Wheel and the Control bar's
fill chip kept showing the mesh object's own fill, so the panel's sliders
jumped back after each drag.

- The new `Session::fill_mesh_points` resolves the targets as
  `paint.setFill` does: the picked points of every selected mesh, unless the
  Appearance panel's active row is a fill or an object of a symbol instance
  is selected. When the first selected object is a mesh among them, the Fill
  proxy (`paint.proxies`) shows its first picked point's color, and "?"
  compares the picked points' colors with each other and with the other
  selected objects' fills.
- `Session::mesh_points_picked` lists the points `transparency.set` fades: it
  is empty while the Appearance panel's active row takes the opacity, and
  `transparency.info` and the Transparency panel now follow it there too.
- The cached "?" state and the Transparency panel's values are recomputed when
  other points are picked, which gives the document no new revision.
- The Control bar's opacity shows the first picked point's opacity, which
  `transparency.set` changes then.
- The `paint.setFill` and `transparency.set` params texts name the picked
  points instead of the point last clicked, and the `paint.proxies` text,
  docs/mcp.md and the progress doc describe what the panels show.
2026-11-14 04:32:44 -08:00
ncic fc47e4782b Pencil: Use Precise Cursors shows the plain crosshair again; a far close is a straight segment 2026-11-14 13:23:22 +01:00
FredApps c9a199ff91 Merge branch 'main' into fix/spiral-decay-setting-20261011 2026-11-14 13:15:33 +01:00
ncic bdaaff534c Merge remote-tracking branch 'upstream/main' into pencil-cursors
# Conflicts:
#	docs/ui-parity.md
2026-11-14 12:31:28 +01:00
dotCooCoo bbf3e5ca7e Merge main into fix/plugin-store-folder-lock 2026-11-14 03:22:06 -08:00
dotCooCoo 04b90d88d0 Tests: raster effects draw the same twice while another test assigns a document profile
tests::newdoc::a_profile_brings_the_color_profile_its_file_carries and
tests::saveoptions::an_embedded_profile_is_restored give their front
document a non-sRGB RGB profile. That profile becomes the process-wide
active color settings and stays active until a document without one
comes to the front. Every color the engine test process renders goes
through those settings, so the test
tests::rasterfilters::each_effect_changes_the_canvas_and_draws_the_same_twice
could draw the same art in two colors and fail with "<effect> is
deterministic".

The two tests now run again in a child process of the test binary
through a shared helper, tests::in_own_process. The SVG Drop Shadow test
for a non-sRGB working space uses the helper in place of its own copy,
and the GLOBAL doc comment in tests/colormgmt.rs names this route.

The rasterfilters test now checks that the color settings are the
defaults before it draws and that nothing replaced them while it drew.
A test that changes them in the same process makes it fail with "another
test changed the color settings while this one drew".

With the three tests run together (--test-threads=3) on Linux, the
rasterfilters test failed 10 of 10 runs without the child processes,
each time with that message, and passed 10 of 10 with them.
2026-11-14 03:13:56 -08:00
dotCooCoo 347458aff7 Place: text files in UTF-16 without a byte-order mark place as UTF-16
File › Place of a text file with the Unicode character set read UTF-16
only after a byte-order mark. Without one, UTF-16 text was read as UTF-8
(or the 8-bit set): characters outside U+0001 to U+00FF came out as
other characters, and each CR LF placed as two paragraph breaks.

Place now reads a file without a byte-order mark as UTF-16 by the rule
Import Data Sets uses, through the shared byte-order helper: an even
length, at least half of the two-byte units holding a NUL byte, the
byte order that reads a line break (for one line, the order its NUL
bytes give), and valid UTF-16 with no NUL character in that order. Any
other file is read as before, as UTF-8 or else the platform's 8-bit set.

Docs: docs/mcp.md, file.place params text, docs/target-app-parity.md.
2026-11-14 03:05:40 -08:00
dotCooCoo 2249b71e03 Merge main into fix/followup-7305 2026-11-14 02:38:29 -08:00
dotCooCoo 7694627a39 Perspective: reapplying the current grid preset adds no undo step
perspective.grid.preset stored the preset's grid every time, so applying
the preset the document already holds recorded an undo step that changed
nothing. It now compares the new grid with the stored one, as
perspective.grid.set does through grid_kept, and records a step only when
the grid changes. When only whether the grid shows or its active plane
differs, the preset sets them without an undo step, as
perspective.grid.show and perspective.plane.set do.
2026-11-14 02:35:48 -08:00
FredApps 4552915aae Tests: spiral decay is per full wind on main, so four segments give the decay 2026-11-14 11:35:04 +01:00
dotCooCoo 9834c58b66 Merge main into fix/links-stored-brush-art 2026-11-14 02:26:44 -08:00
dotCooCoo ad31fe9527 Merge main into fix/reverse-path-profiles 2026-11-14 02:21:25 -08:00
ruchirguitar 831c477ad6 Symbols: built-in Weather Icons symbol library 2026-11-14 15:43:16 +05:30
dotCooCoo 0846f1eaf7 Merge main into fix/live-shape-replay-negative-radius 2026-11-14 02:12:21 -08:00
dotCooCoo 997aaa61b9 Merge main into fix/live-paint-expand-drawn-stroke 2026-11-14 02:08:40 -08:00
dotCooCoo a041fe04f0 Merge main into fix/dcs-placement-clip-keeps-file-clip 2026-11-14 02:08:11 -08:00
dotCooCoo 3c58bec2ed Merge main into fix/smooth-keeps-closed-start 2026-11-14 02:00:55 -08:00
dotCooCoo d9f80a15fd Merge main into fix/map-links-stop-plates 2026-11-14 01:57:06 -08:00