Commit Graph
14341 Commits
Author SHA1 Message Date
dotCooCoo fa9d678cc1 Merge feat/psd-import-options into feat/psd-import-options-import-slices-after-7649 2026-11-15 00:46:07 -08:00
dotCooCoo 8afaaec3f8 Merge main into feat/psd-import-options-import-slices-after-7649 2026-11-15 00:16:53 -08:00
dotCooCoo 116c8bae3c Place: PSD files placed without Show Import Options take the last PSD Import Options
With Show Import Options off, a PSD or PSB file placed on its own and
embedded takes the conversion, hidden-layer and Import Slices choices
made last in PSD Import Options, as text and DXF files take theirs.
An importSlices or hiddenLayers the params give is kept. Files from
bytes, which have no file to link to, are embedded even when the Place
dialog's Link is on, alone and in the place cursor. With Show Import
Options on, each PSD file of the place cursor asks for its options.
2026-11-15 00:16:48 -08:00
BFlat df984b2a02 Merge pull request #7551 from dotCooCoo/fix/hi-missing-message-rows
i18n: Hindi translates 116 status and error messages that its catalog lacked
2026-11-15 14:43:12 +07:00
BFlat 97c3226d72 Merge pull request #7773 from dotCooCoo/feat/variables-panel-sort-columns
Variables: Variables, Objects and type columns sort the variable list
2026-11-15 14:43:04 +07:00
BFlat 6fe176f997 Merge pull request #7428 from dotCooCoo/feat/ai-save-nested-envelope
.ai save: type in an envelope stays editable
2026-11-15 14:42:55 +07:00
BFlat 871dc96f7d Merge pull request #7775 from dotCooCoo/feat/recolor-new-row
Recolor Artwork: New Row adds a row that current colors can be merged into
2026-11-15 14:42:46 +07:00
BFlat c495d50752 Merge pull request #7756 from dotCooCoo/fix/clip-path-item-effects-order
Effects: a painted clipping path's fill and stroke effects apply before a group's
2026-11-15 14:42:37 +07:00
BFlat d4ab89f6e4 Merge pull request #7780 from dotCooCoo/fix/a-background-file-save-or-failed-completion
Status bar: a background save or failed job keeps a newer status line
2026-11-15 14:42:29 +07:00
BFlat a768464705 Merge pull request #7785 from dotCooCoo/fix/automatic-keeps-every-level-of-clean-16-level
Image Trace: Automatic keeps every level of clean flat art of up to 16 levels
2026-11-15 14:42:13 +07:00
BFlat 04b91c748e Merge pull request #7648 from dotCooCoo/feat/graph-type-dialog
Graphs: Graph Type is a dialog of its own with type buttons and a page per axis
2026-11-15 14:42:05 +07:00
BFlat 0995c130d1 Merge pull request #7211 from dotCooCoo/fix/composite-font-error-translations
i18n: translate the composite font errors in the complete-message languages
2026-11-15 13:51:57 +07:00
BFlat 4a5f07b8c3 Merge pull request #7753 from dotCooCoo/feat/info-panel-tool-readouts
Info: the panel shows the move, transform, Zoom and Paintbrush values of the tool in use
2026-11-15 13:50:30 +07:00
BFlat 8e1e344f84 Merge pull request #7752 from dotCooCoo/fix/perspective-infer-followups
Perspective: Automatic Plane Positioning checks a held plane's own place and finds skewed intersections
2026-11-15 13:50:21 +07:00
BFlat 941277aa38 Merge pull request #7747 from dotCooCoo/feat/3d-render-wireframe
3D and Materials: Render Settings › Wireframe draws the live 3D effect as its faces' edges
2026-11-15 13:50:13 +07:00
BFlat 0cef4fa727 Merge pull request #7743 from dotCooCoo/fix/legacy-ai-artboard
.ai import: legacy PostScript .ai files open on their own artboard
2026-11-15 13:50:00 +07:00
BFlat 35a0d5ab04 Merge pull request #7755 from dotCooCoo/fix/clip-type-paint-export
Clipping: painted type keeps its fill and stroke in a group with geometry effects
2026-11-15 13:49:52 +07:00
BFlat fd6b3fb9a9 Merge pull request #7748 from dotCooCoo/feat/live-paint-selection-triple-click
Live Paint: a Live Paint Selection triple-click selects the parts of the same paint
2026-11-15 13:49:42 +07:00
BFlat 4ca206fea9 Merge pull request #7749 from dotCooCoo/fix/svg-textpath-pathlength
SVG import: textPath startOffset follows the path's pathLength
2026-11-15 13:49:33 +07:00
BFlat b43372361e Merge pull request #7746 from dotCooCoo/fix/replace-clipped-psd-keeps-transform
Place: a plain image replacing a clipped PSD keeps its scale and rotation
2026-11-15 13:49:22 +07:00
BFlat bdfd445eef Merge pull request #7662 from ruchirguitar/feat/style-neon-glow
Graphic Styles: built-in Neon & Glow graphic style library
2026-11-15 13:49:11 +07:00
dotCooCoo 6f9f9dfa95 Image Trace: Automatic keeps every level of clean flat art of up to 16 levels
Automatic counted flat art's colors with a median cut that never splits a
box narrower than 24 levels, so evenly spaced levels about 17 apart (gray)
or 13 apart (sepia) shared boxes: 16 clean gray levels traced in 14 colors
and 16 sepia levels in 9.

When flat art's pixels fall in 2 to 16 histogram bins, each holding at
least the share a color needs to be counted, and every two bins lie at
least 12 levels apart on some channel, Automatic now takes one color per
bin. If mixed-color merging then finds two of those colors mixed through
each other (dithering, or a thin region beside a close level), the picture
is counted by median cut as before, with rare colors added.

Anti-aliased art whose levels lie more than 20 apart is counted level by
level too, because its blended edge pixels are left out of the count.
Noisy pictures, anti-aliased art whose levels lie 20 or fewer apart and
pictures of 17 levels or more are counted as before, and continuous-tone
classification is unchanged.
2026-11-14 22:33:16 -08:00
dotCooCoo f0a7c76bce Merge main into fix/a-background-file-save-or-failed-completion 2026-11-14 22:26:06 -08:00
dotCooCoo c5b8754eb7 Recolor Artwork: New Row adds a row that current colors can be merged into
The Assign tab has a New Row button before Merge. With art selected it
adds a row with no current colors above the first selected row, or at
the top, with that row's new color, and selects it. Merge with the new
row first moves the other rows' current colors into it, and they take
its new color. The row shows an empty slot until then.

An empty row recolors nothing and does not count toward Colors. OK
sends it with the other rows. recolor.apply adds no library swatch for
it and gives a rewritten color group no color from it, in the dialog's
groupColors and in the command's default.
2026-11-14 22:22:55 -08:00
dotCooCoo d5ccac5646 Variables: Variables, Objects and type columns sort the variable list
The Variables panel drew each variable as one "name · object" line in
the order the variables were defined, with no headers and no sorting.

The list now has three columns with headers: the type icon, Variables
and Objects. A click on a header sorts the list by that column, and a
second click reverses the order. The new command variable.sort {by:
name|object|type|none, descending?} sets the order, which is panel
state: not saved and not an undo step. variable.list lists the
variables in that order and reports it as sort. An unknown by, or a
descending that is not true or false, is an error.
2026-11-14 22:21:08 -08:00
dotCooCoo e70272b592 Effects: a painted clipping path's stroke keeps its Transform stroke scaling
A fill or stroke of a painted clipping path whose Transform effect scales
strokes or moves patterns is now drawn through its art, as an export bakes
such a path, so a 2 pt stroke scaled to 200 % paints at 4 pt.

The HPGL writer closes the stroke pieces of a clipping path whose fill
paints, as it closes the outline of any filled path.
2026-11-14 22:16:28 -08:00
dotCooCoo d0b69af348 Merge main into feat/psd-import-options-import-slices-after-7649 2026-11-14 22:06:58 -08:00
dotCooCoo dd01ae03f7 PSD: the slices' version 6 descriptors share one limit of values
Each record's look-ahead descriptor read started with its own allowance
of 200,000 values, so a file with 10,000 records could make one Open read
about two billion. The descriptors of a slices resource now spend one
allowance between them, and a look-ahead that runs it out refuses the
slices with a warning instead of being read past.
2026-11-14 21:51:22 -08:00
dotCooCoo 5aa061376f Merge main into feat/psd-import-options 2026-11-14 21:44:38 -08:00
dotCooCoo 496cdb54f5 Merge main into feat/ai-save-nested-envelope 2026-11-14 21:44:34 -08:00
BFlat 78be970bc3 Merge pull request #7437 from dotCooCoo/fix/tr-draw-label
i18n: Turkish Draw labels use the drawing verb instead of a tied game
2026-11-15 12:38:28 +07:00
BFlat 1a596c0362 Merge pull request #7653 from dotCooCoo/fix/svg-export-confined-image-links
MCP: SVG output under read roots refuses to name a linked image file outside them
2026-11-15 12:38:16 +07:00
BFlat 82b0c915a3 Merge pull request #7734 from dotCooCoo/feat/place-show-import-options
Place: Show Import Options asks for each file's import options, or uses the ones confirmed last
2026-11-15 12:38:07 +07:00
BFlat b4bd916141 Merge pull request #7737 from dotCooCoo/feat/select-similar-button
Control bar: Select Similar Objects selects by the attribute its menu keeps
2026-11-15 12:37:57 +07:00
dotCooCoo db1feeea10 Effects: a painted clipping path's fill and stroke effects apply before a group's
A clipping path that paints a fill or stroke kept the geometry effects of
those fills and strokes live, so a geometry effect on the clip group or on
a group around it reshaped the path first and the fill's or stroke's
effect applied after it, on the canvas and in export alike. Unpainted
clipping paths already applied them first.

The clipping path now becomes one path per fill and stroke with those
effects applied, as an unpainted one does, in a group marked as such
pieces (`NodeExtras::clip_pieces`, saved with the document). `clip_paint`
paints that group's fill pieces behind the clipped art and its stroke
pieces over it, as the path paints its fills and strokes, also after an
effect around it turns a piece into a compound path or puts it in a group.
The clip group's visual bounds take in the stroke pieces' width, and HP-GL
export draws the clipping path once, in its stroke pieces.

An export of a painted clipping path with such effects in a clip group
without effects of its own also keeps its fill and stroke now, where the
baked pieces painted nothing.
2026-11-14 21:37:54 -08:00
BFlat 6dd478a420 Merge pull request #7456 from dotCooCoo/feat/ai-save-envelope-case
.ai save: a top object with uneven sides stays a live envelope
2026-11-15 12:37:47 +07:00
BFlat acf04dd00f Merge pull request #7724 from dotCooCoo/fix/ai-off-artboard-art
.ai import: symbol instances in older files are read, so art outside the artboard opens
2026-11-15 12:37:39 +07:00
BFlat a1f10d4566 Merge pull request #7643 from dotCooCoo/fix/aligned-paint-rows-of-design-art
Graphs: aligned paint and stroke rows given with a design's art are rows of its stack
2026-11-15 12:37:29 +07:00
BFlat ba350c2e9f Merge pull request #7745 from dotCooCoo/fix/svg-css-not-rule-budget
SVG import: :not() rules test only the rules indexed for the element
2026-11-15 12:37:19 +07:00
BFlat 8fa6a7b881 Merge pull request #7742 from dotCooCoo/fix/swatch-conflict-paste-document
Swatch Conflict: OK pastes nothing after another document became active
2026-11-15 12:37:11 +07:00
dotCooCoo 814cae044f Clipping: painted type keeps its fill and stroke in a group with geometry effects
A clip group whose clipping path is type with a fill or stroke lost that
paint when a group around it had a geometry effect. Outlining the type
for the effect replaced it with a group of glyph outlines, and a group
paints nothing as a clipping path. Distort effects lost it on the canvas
and in SVG and PDF; Transform effects that only move lost it in SVG and
PDF when other type in the group stayed type.

The type's outlines now clip, its fills become art behind the clipped
art inside the clip, and its strokes become art over it outside the
clip, as the canvas draws an unaffected clip group.
2026-11-14 21:34:17 -08:00
dotCooCoo bcadfc7ac8 Info: the panel follows the tool in use
While the Selection, Direct Selection or Group Selection tool moves the
selection, or the Gradient tool draws a vector, W and H show the change
in x and y, with the distance and the angle under them. A Scale tool
drag shows its percentages; a Rotate, Reflect or Shear tool drag shows
the center of the selection's box and its angles. The Zoom tool adds the
magnification and the Paintbrush the name of its brush.

W and H follow Use Preview Bounds. With several objects selected, the
panel shows only the fill, stroke and type values they share, and Show
Options adds a tint's swatch and percentage and a gradient's swatch name.

- Tool::readout and Readout (crates/tools/src/readout.rs).
- info.readout returns the selection's size and the tool's readout.
- Docs: docs/mcp.md, docs/ui-parity.md.
2026-11-14 21:31:28 -08:00
dotCooCoo 4516cff69a Perspective: Automatic Plane Positioning checks a held plane's own place and finds skewed intersections
- perspective.grid.set rejects an offset that puts a plane behind the
  viewer even while Automatic Plane Positioning holds that plane, so the
  plane does not vanish when positioning ends.
- The gridline intersection nearest the pointer is found on strongly
  skewed planes: each drawn line is searched at the point nearest the
  pointer on the page, instead of a few cells around the pointer's
  inverse.
- Moves while an artboard name is pressed no longer reach the tool as
  hover, so Shift does not position the plane while the button is down.
2026-11-14 21:26:52 -08:00
dotCooCoo 923ba3d1bb 3D and Materials: the 3D area row lists Render Settings › Wireframe and its tests 2026-11-14 21:22:26 -08:00
dotCooCoo 38edd52b3c Graph Type: keep the dialog to its document and current data
- OK closes without a change when another document became active while
  the dialog was open, since graph ids repeat between documents.
- The calculated tick values are recalculated when the document's
  revision changes, so a data edit made while the dialog is open gives
  Override Calculated Values the new values.
- Each overridden Minimum, Maximum or Divisions that still holds the
  value calculated before takes the new calculated value on its own, so
  a value typed beside it stays, and a value the graph had when the
  dialog opened is kept.
- With Override Calculated Values off, the dimmed Minimum, Maximum and
  Divisions fields show the calculated values that OK applies.
2026-11-14 21:17:48 -08:00
dotCooCoo 9762e124fc SVG import: textPath startOffset follows the path's pathLength
A startOffset given as a length now counts in the units of the
referenced element's pathLength, so pathLength="100" on a path 400
long puts startOffset="50" at 200. A percentage stays a share of the
computed length. A pathLength of 0 keeps an offset of 0 at the start
and puts any other offset past the end, and an offset too large to
scale starts at the path's end instead of its start.

https://www.w3.org/TR/SVG2/text.html#TextLayoutAlgorithm
https://www.w3.org/TR/SVG2/paths.html#PathLengthAttribute
2026-11-14 21:14:20 -08:00
dotCooCoo 27a0dc89d4 3D and Materials: Render Settings › Wireframe draws the live 3D effect as its faces' edges
The 3D and Materials panel gets a Render Settings menu with Wireframe.
Extrude & Bevel, Revolve, Inflate and Rotate take a `render` parameter,
`{mode: "shaded" | "wireframe"}`. In wireframe mode the effect stays
live and draws the edges Expand as Wireframes gives, each once, as
0.5 pt black strokes with round joins, with no shadow or graphics. The
object's own opacity, blending mode and opacity mask apply to the mesh.

Commands that set wireframe mode are checked against the edges it
draws: the shaded surface's paint copies, graphics and shadow limits do
not refuse them. A `render` value that is not an object holding only a
valid `mode`, and `render` on the 3D (Classic) effects, are refused.

Docs: docs/three-d.md, docs/mcp.md, docs/effects-parity.md,
docs/target-app-parity.md.
2026-11-14 21:04:33 -08:00
dotCooCoo d62de12db6 Live Paint: Live Paint Selection triple-click selects parts of the same paint
A triple-click with the Live Paint Selection tool on a face now selects
every face of its group with that face's fill, and on an edge every edge
of its group that draws with that edge's stroke paint. Hidden faces and
edges are left out. Before, a triple-click selected only what its third
click selected.

With Shift held, the parts are toggled from the selection there was
before the clicks: the tool keeps what the double-click and the Shift
clicks of the series toggled, and the triple-click toggles those back.

docs/target-app-parity.md's Live Paint Selection line says so.
2026-11-14 21:02:05 -08:00
dotCooCoo 82308b647f Merge main into fix/a-background-file-save-or-failed-completion 2026-11-14 20:58:21 -08:00
dotCooCoo bee46530d8 Place: a plain image replacing a clipped PSD keeps its scale and rotation
Replace measured the image inside a PSD or PSB file's clip group only
when the new file brought its own clipping path. A plain image placed
with `replace` over such a clip group took only the group's center and
came in at 100%, losing the image's scale and rotation. The image in
the group is now measured whenever the new art is an image, clipped or
not.
2026-11-14 20:40:45 -08:00