Commit Graph
4974 Commits
Author SHA1 Message Date
dotCooCoo c44392a4d0 Merge main into fix/graph-series-paint-visible-rows 2026-11-13 08:49:20 -08:00
BFlat 10c84a909e Merge pull request #7173 from dotCooCoo/fix/assigned-profile-follows-front-document
Color: assigned profiles follow the document in front
2026-11-13 23:45:03 +07:00
dotCooCoo d92e63257b Merge main into fix/smooth-fidelity-screen-pixels 2026-11-13 08:44:25 -08:00
dotCooCoo b018a849ab Arrowheads: keep agents to the arrowheads file inside their read roots
Under automation read roots, stroke.arrowheads.list gives `file` as
null for an arrowheads file outside them and names it by its file name
in `error`. stroke.arrowheads.edit and stroke.arrowheads.reload refuse
such a file with the root-check error, naming it by its file name:
edit makes no folder or file and neither opens nor activates the file,
and reload does not read it. Inside the roots, edit opens the file
under the client's roots. The Stroke panel menu is not confined.
2026-11-13 08:42:37 -08:00
dotCooCoo 0663c76be1 Envelopes: a partly transparent image keeps its alpha where its warp pieces overlap
An envelope or the Warp effect cuts an image into triangle pieces that
reach a little past their edges, so neighbors overlap and no seams show.
On an image with alpha, the overlap drew that alpha twice: a 50% image
came out about 75% opaque along every cell edge and diagonal.

- The pieces now form a knockout group, and each piece is marked as a
  warp piece (`warp_piece`) whose knockout shape is its whole triangle,
  so where pieces overlap only the top one draws.
- The canvas knocks each piece out by its triangle at full coverage.
- SVG and PDF draw the pieces of a partly transparent image (its pixels,
  opacity, color mask or colorize paint) through one mask each, of the
  later triangles that reach it; pixels on a triangle's antialiased edge
  come out slightly lighter there. Pieces of an opaque image are drawn
  one over another as before.
- SVG writes one copy of the image for pieces cut by opacity masks
  (Preserve Shape Using Transparency) too.
- A cell count past the generated-object budget makes an empty group
  instead of overflowing.

Docs: docs/target-app-parity.md.
2026-11-13 08:38:48 -08:00
dotCooCoo d1c8ff78de Context menu: Smooth… on a selected path opens the Smooth slider
A right-click on a selection that holds a path (a path, a group of
paths, a compound path, or anchors selected with Direct Selection) lists
Smooth…, after Join and Average… and the anchor entries when those are
listed. It opens the slider that Object › Path › Smooth opens, which
previews the result until OK keeps it as one undo step. With nothing,
only type or a group of type selected, Smooth… is not listed.

Docs: docs/mcp.md, docs/target-app-parity.md.
2026-11-13 08:35:40 -08:00
dotCooCoo 6b5e596de0 Color: the out-of-gamut warning updates after a profile change
The Color panel and Color Picker cached their out-of-gamut warning and
correction for the last color only. Assigning the document another CMYK
profile, removing it, or changing the working CMYK space in Color
Settings left the old warning showing until the color changed.

The cache entry now also holds the active color settings and the
registered profiles' generation, so the warning is checked again when
either changes. The comments and the color.gamutCheck params text name
the CMYK space actually used: the document's assigned CMYK profile, else
the working CMYK space.
2026-11-13 08:35:13 -08:00
dotCooCoo 3c463fa5fb Brushes: strokes draw with the first of two brushes with one name
When a document holds two brushes with the same name, the canvas drew
a stroke that names it with the last of them, while brush.get, Brush
Options, expanding, outlining and the SVG, PDF, EPS and .ai exports
took the first. Document Info gave the last one's type, and every row
of that name in the Brushes panel previewed and dragged the last one.

The renderer, Document Info and the Brushes panel now take the first
brush of a name, so the canvas, the panel and the exports agree.
2026-11-13 08:34:40 -08:00
BFlat a2adbf61e6 Merge pull request #7106 from dotCooCoo/feat/custom-toolbar-dock
Toolbars: toolbars made with New Toolbar dock along the window's edges
2026-11-13 23:32:06 +07:00
BFlat 7f92d8ffc2 Merge pull request #7149 from dotCooCoo/fix/document-info-labels-translated
i18n: Document Info shows every category title and count label in the interface language
2026-11-13 23:31:57 +07:00
BFlat e74c2d04df Merge pull request #7083 from dotCooCoo/fix/simplify-line-keeps-tangent
Simplify: a refitted curve becomes a line only when its joins stay smooth
2026-11-13 23:31:37 +07:00
BFlat 4c072b320c Merge pull request #7136 from dotCooCoo/fix/command-batch-artboards
Artboards: a batch's Fit to Artwork Bounds step fits every selected artboard
2026-11-13 23:31:28 +07:00
BFlat 538e471783 Merge pull request #7163 from dotCooCoo/feat/live-paint-bucket-cursor
Live Paint: the bucket shows a filled bucket over a face and a brush over an edge
2026-11-13 23:31:19 +07:00
BFlat d3bb35ff61 Merge pull request #7154 from dotCooCoo/fix/3d-walls-depth-sort
3D: fill walls and dashed or profiled strokes draw in depth order where they overlap
2026-11-13 23:31:09 +07:00
BFlat b7a9bd6e29 Merge pull request #7169 from dotCooCoo/fix/join-coincident-one-pass
Join: merge a run of coincident anchors in one pass over the path
2026-11-13 23:31:00 +07:00
dotCooCoo bc9280967a Image Trace: staircases of longer steps in smooth areas trace as slopes
Where a band border in a gradient or a shaded area runs at a slant, its
pixels form a staircase whose steps are two or more pixels long. When one
piece of outline also runs along a sharp edge in the image, that piece as
a whole is not the contour of a smooth area, and the outline kept a
corner at every step, so the border was traced as a series of right-angle
steps.

subpixel::outline now reads a run of three or more edges of 1 to 8 px,
each turning one way where it starts and the other where it ends, with no
junction on it, as a staircase when the run's own cracks pass
subpixel::low_contrast. A run is cut at any step whose own cracks show half
of the step between the two colors or more. Its edges are steps, as
one-pixel steps already were: no corner where two of them meet, and one
point at the middle of each, moved by the mean of its cracks' shifts. The
corner where a run meets an edge that is not a step stays, so a straight
edge longer than 8 px next to a staircase stays straight. Two one-pixel
steps inside a run are read as part of the slope and do not make a notch.
Longer steps, staircases along a sharp edge and Black and White traces
keep their corners. The runs are the same from either side of the border.

On gradient and photo inputs most traces take fewer anchors. Some rows get
worse: 6 Colors on gradient and photo leaves a gap of 0.9 px (was 1.2) and
an overlap of 1.0 px (was 0.8), High Fidelity Photo with Gradients on a
blurred input takes 50 anchors (was 47), and on a synthetic 800 px photo
the 95th percentile of High Fidelity Photo's pixel difference rises from
6.33 to 6.67 and 16 Colors leaves 2 staircases of 2 px steps or more where
it left none.

Docs: docs/target-app-parity.md, docs/image-trace-quality.md.
2026-11-13 08:29:28 -08:00
dotCooCoo 137bc11a2c Merge main into fix/smooth-fidelity-screen-pixels 2026-11-13 08:28:42 -08:00
dotCooCoo bc7eddeb5d Expand: type reports a gradient only when Fill expands one of its outlines
object.expand.info reported a gradient (and a fill) to expand for any
type whose characters have a gradient fill. Expand outlines type first,
and each outline then holds the run's gradient on its own box, so a
gradient that repeats or reflects in more than 256 runs across every
outline stays a gradient: the dialog enabled options that changed
nothing.

- The query now measures the paths type.createOutlines makes of the
  glyphs, ruby glyphs and underline and strikethrough bars, each with
  its run's paint, and reports a gradient when one of them expands. It
  lays the text out only when a run has a gradient fill, stops at the
  first outline that expands, and does not change the document. Type in
  symbol art, blends and repeats goes through the same check.
- docs/mcp.md says when gradient is false; docs/target-app-parity.md
  gets an evidence line.
2026-11-13 08:27:09 -08:00
dotCooCoo 5f77b65aa2 Gradients: Hue Clockwise and Hue Counterclockwise mix stops around the hue wheel
The Gradient panel's Method menu gets two methods of VectorCraft's own
beside Classic and Perceptual. They mix a linear, radial, conic or
diamond gradient's colors around the hue wheel: hue, saturation and
brightness each change evenly from one stop to the next, and the hue
angle keeps one direction, as the fixed-direction rules of
https://www.w3.org/TR/css-color-4/#hue-interpolation do. Hue Clockwise
lowers the angle (red, magenta, blue), which is clockwise on the color
wheels, and Hue Counterclockwise raises it (red, yellow, green).

Two stops whose hues are less than half a color level apart count as
one hue and keep it, so a color and a tint or shade of it do not turn
the whole wheel. A stop whose RGB numbers are less than half a color
level apart is gray and takes the hue of the stop it mixes with, and
black takes that stop's saturation too.

- `paint.editGradient` and `paint.setFill` take `method: hue-clockwise`
  or `hue-counterclockwise`, in any case, with a space or an underscore
  for the hyphen or without it; other spellings are an error. The native
  file writes `HueClockwise` and `HueCounterclockwise`.
- The canvas and raster exports draw the gradient through stops on its
  curve, within half a color level.
- Reverse turns the method the other way with the stops, and a Reflect
  spread is repeated from the curve's stops, so both keep the colors.
- SVG and PDF write the gradient as an RGB image, CMYK and spot color
  stops included, with the spot warning. EPS writes a shading in process
  colors with a warning for spot stops. A legacy .ai file and the .ai
  editing data get the colors between the stops as stops of their own,
  in process colors, at most 256, with a warning. CSS gets those stops
  too.
- The `method` error names the four values, in every catalog.
- The Method menu is as wide as its longest name in the interface
  language, within the panel.

Docs: docs/mcp.md, docs/plugins.md, docs/target-app-parity.md, ROADMAP.
2026-11-13 08:26:57 -08:00
dotCooCoo d41cf0d053 Merge main into feat/objects-on-path-detach 2026-11-13 08:26:49 -08:00
dotCooCoo 9b027bb43a Merge main into fix/image-icc-16bit-kept 2026-11-13 08:25:53 -08:00
dotCooCoo c9d85d61db Merge main into feat/actions-record-into-selected 2026-11-13 08:24:12 -08:00
jmverges 24bcdb5116 Merge remote-tracking branch 'upstream/main' into fix/page-check-typed-envelopes
# Conflicts:
#	crates/eps/src/import/ai.rs
#	docs/file-format-parity.md
#	docs/target-app-parity.md
2026-11-13 16:22:41 +00:00
dotCooCoo e11c21ce98 MCP: an old app's window capture goes through a private temporary folder
An app that does not send the image back wrote the window capture to
vectorcraft-window-<pid>.png directly in the system's temporary folder.
On a shared Unix temporary folder another user could put a link at
that name, and the app would then overwrite the file it points to. A
failed read also left the file behind.

The capture now goes to window.png in a new folder made for it inside
the temporary folder (owner-only on Unix; a name that is taken is
skipped). The folder is removed after the read, also when the app or
the read fails.
2026-11-13 08:19:07 -08:00
BFlat 9395fb9cec Merge pull request #7160 from dotCooCoo/fix/svg-image-orientation
SVG import: raster images follow their EXIF or TIFF orientation
2026-11-13 23:16:49 +07:00
dotCooCoo 87ad60ec42 Merge main into fix/graph-series-group-appearance 2026-11-13 08:15:48 -08:00
BFlat ebd7568b69 Merge pull request #7124 from dotCooCoo/fix/control-bar-trailing-separator
Control bar: no separator is left at the end of the bar when the controls after it are hidden
2026-11-13 23:15:28 +07:00
BFlat 4cad65c603 Merge pull request #7150 from dotCooCoo/fix/thread-frame-measure-needed-paragraphs
Type: a threaded story measures each frame with the paragraphs it needs
2026-11-13 23:15:01 +07:00
dotCooCoo c764652469 Merge main into fix/script-line-numbers 2026-11-13 08:14:59 -08:00
BFlat dad9116ef7 Merge pull request #7156 from dotCooCoo/fix/justify-after-last-tab
Justify: a line with a tab spreads the text after its last tab to the edge
2026-11-13 23:14:52 +07:00
BFlat f97e81afd7 Merge pull request #7159 from dotCooCoo/fix/delete-cut-per-subpath-anchors
Paths: Delete, Cut and Cut Path read each subpath's own selected anchors
2026-11-13 23:14:36 +07:00
dotCooCoo 9a1d36c57e Merge main into fix/graph-series-paint-visible-rows 2026-11-13 08:14:30 -08:00
dotCooCoo b8ab31ff50 Merge main into fix/graph-series-paint-other-commands 2026-11-13 08:13:53 -08:00
dotCooCoo 4b695aafb1 Merge main into fix/painted-effect-every-item 2026-11-13 08:12:58 -08:00
dotCooCoo a68b843d8c Merge main into feat/ai-image-warp-live 2026-11-13 08:12:50 -08:00
HassanKhan 04d1fd9edf Merge remote-tracking branch 'upstream/main' into feat-6304-font-height-icons
# Conflicts:
#	docs/target-app-parity.md
2026-11-13 21:12:42 +05:00
dotCooCoo 3348b41796 Merge main into fix/freehand-tolerance-low-zoom 2026-11-13 08:12:01 -08:00
dotCooCoo 1db47f6488 Merge main into fix/script-namespace-heap-limit 2026-11-13 08:11:30 -08:00
dotCooCoo d9ebfa53e6 Docs: the quit's clipboard handle order holds only when the check lets go in time 2026-11-13 08:11:26 -08:00
dotCooCoo 9b8dc7c731 Merge main into fix/actions-recording-limit-notice 2026-11-13 08:11:15 -08:00
dotCooCoo cd7e209934 PDF: pages longer than 200 in are written at full size in points by default
PDF export without a PDF/X or PDF/A standard writes pages longer than
200 in at full size in points instead of with a UserUnit scale.
longPagesInPoints is now on by default in PdfSettings, the built-in
presets and the Save PDF dialog. Turning it off writes such a page with a
UserUnit from PDF 1.6 on, as before. PDF/A-2b files keep the UserUnit,
and .ai saves keep it unless longPagesInPoints: true is passed.

Docs: params text, docs/mcp.md, docs/target-app-parity.md.
2026-11-13 08:10:42 -08:00
Drew Dibble 26af1c7aa4 Merge remote-tracking branch 'upstream/main' into seam-round-joins
# Conflicts:
#	docs/target-app-parity.md
2026-11-13 09:09:32 -07:00
dotCooCoo 9d8704912d Merge main into fix/brush-library-names-translated 2026-11-13 08:07:42 -08:00
dotCooCoo e13384ebb4 Merge main into fix/blend-without-spine-widget 2026-11-13 08:06:40 -08:00
BFlat cb061d6a2c Merge pull request #7085 from dotCooCoo/feat/learn-next-up
Learn: View more opens a tutorial's practice sample, and Next Up shows the next tutorial
2026-11-13 23:05:29 +07:00
BFlat 6326acb122 Merge pull request #7070 from dotCooCoo/feat/recolor-prominent-colors
Recolor Artwork: the Prominent Colors bar weighs the art's colors
2026-11-13 23:05:19 +07:00
BFlat 25553f21fe Merge pull request #7123 from dotCooCoo/fix/actions-insert-menu-item-ui-commands
Actions: Insert Menu Item adds Object › Align and View menu commands
2026-11-13 23:05:00 +07:00
BFlat e0e97e8ed1 Merge pull request #7153 from dotCooCoo/fix/blend-spine-binary-search
Blend: find the spine segment for an arc length with a binary search
2026-11-13 23:04:50 +07:00
BFlat be99b8895d Merge pull request #7155 from dotCooCoo/fix/hindi-message-terms
i18n: Hindi messages keep their English meaning and the catalog's terms
2026-11-13 23:04:40 +07:00
BFlat 508c1b658e Merge pull request #7096 from dotCooCoo/feat/ai-save-envelopes
PDF/.ai save: envelopes stay editable when the file is reopened
2026-11-13 23:04:30 +07:00