Commit Graph
6652 Commits
Author SHA1 Message Date
dotCooCoo b3f1d57ecf Graphic Styles: addFromLibrary treats ids: null as left out
graphicStyle.addFromLibrary with apply: true and ids: null tried to
apply the style to no objects and failed with "no such objects" when
nothing was selected. A null `ids` now behaves as leaving `ids` out:
the style is applied to the selection when there is one, and only added
otherwise.
2026-10-30 23:44:10 +07:00
dotCooCoo ae0ce1888d Libraries: library loads check name before reading the file
swatch.library.load, graphicStyle.loadLibrary, symbol.loadLibrary and
brush.loadLibrary read the whole file or decoded data before checking
`name`, so a call with a `name` that is not a string read the file
first, and with a missing file reported the file error instead of the
parameter error. The shared loader now checks every parameter before it
reads anything.
2026-10-30 23:44:05 +07:00
dotCooCoo 16db8b6a1a PDF export: bound a colorized image's color channel
A colorized image's color channel is the paint's samples repeated once a
pixel, and nothing bounded its size: an image colorized in Registration in
a document with many spot swatches could allocate without limit, and an
overflowing length panicked inside repeat. The length is now computed with
checked arithmetic and refused above MAX_RASTER_ALLOC, the image's own
decode budget, and the export leaves such an image out with the existing
"an image couldn't be decoded" warning instead of drawing it uncolored.
2026-10-30 23:43:57 +07:00
BFlat 07188ce11b Merge pull request #4725 from dotCooCoo/feat/spiral-drag-winds-decay
Spiral tool: Alt-drag adds or removes winds and Ctrl/Cmd-drag changes the decay
2026-10-30 23:41:49 +07:00
dotCooCoo 88e2177fec Spiral tool: Alt-drag adds or removes whole winds of four segments
Alt in a spiral drag now rounds the fitted segment count to whole winds
of four segments, counted from the segment count when Alt went down.
Ctrl/Cmd takes precedence when both keys are held, and switching back to
Alt starts from the current count with the held inner end kept. Arrow
keys, Escape, release and a new drag clear the held Alt count.

Tests cover both keys together, a switch mid-drag, Escape, the 2 to 1000
bounds and the committed path's anchor count. docs/mcp.md and
docs/target-app-parity.md describe the rule.
2026-10-30 23:17:01 +07:00
dotCooCoo 856c602310 Spiral tool: Alt-drag adds or removes segments, and Ctrl/Cmd-drag changes the decay
The reference app adds or subtracts winds from a spiral with Alt-drag
and changes its decay rate with Ctrl/Cmd-drag. VectorCraft's Spiral
tool did nothing with either key during a drag.

While a spiral is dragged out, Alt or Ctrl/Cmd keeps the spiral's
inner end at the distance from the center it had when the key went
down, and the outer end follows the pointer. With Alt the number of
segments changes to the nearest whole number that fits, within 2 to
1000, so dragging outward adds segments and dragging inward removes
them. With Ctrl/Cmd the decay changes to fit, within 5 to 99.99
percent, the decays a spiral is drawn with. When both keys are held,
Ctrl/Cmd changes the decay. Up/Down with a key still held move the
held radius to the new segment count. The new values stay when the
key is let go, and as the Spiral tool's segments and decay options
for the next spiral. Both keys also work with a 5 percent decay and
hundreds of segments.

Docs: docs/mcp.md, docs/target-app-parity.md.
2026-10-30 23:17:01 +07:00
BFlat f30a77e2d4 Merge pull request #4724 from storytold/fix/3d-on-live-type
3D Extrude & Bevel, Inflate and Rotate apply to type, which stays editable (#4715)
2026-10-30 23:16:42 +07:00
bflatastic f4be2b9006 3D Extrude & Bevel, Inflate and Rotate apply to type, which stays editable (#4715) 2026-10-30 23:03:51 +07:00
BFlat b151163183 Merge pull request #4721 from storytold/feat/addon-live-halftone
Add-ons: Color Effects — live Vector Halftone effect
2026-10-30 22:39:49 +07:00
bflatastic f4c245286e Add-ons: Color Effects — live Vector Halftone effect
Effect › Color Effects › Vector Halftone… (addon.color.halftone, also in
Object › Plug-ins › Color Effects) draws its object as the halftone dots
Object › Vector Halftone makes, live: mono (one dot colour, or each dot in
the art's colour under it) or CMYK screens, the five dot shapes,
frequency, angle, invert and clip to the art's outline.

- The screens, dots and caps move to vectorcraft_effects::addons::halftone,
  shared by the command (its behaviour and tests unchanged) and the effect.
- The renderer samples the art (vectorcraft_render::addons::halftone) and
  keeps the dots by the object's content and what it reads from the
  document, so unchanged art isn't sampled again; past 100000 cells per
  screen the object draws as it is.
- Expand Appearance turns the object into its dots, and the SVG, PDF, EPS
  and AI exporters write them as paths.
- Its dialog reuses the command's fields, without Keep Original.

Deferred: stochastic and radial patterns, a dot-gain curve, per-screen
separation settings, type or symbols as dots.
2026-10-30 22:13:33 +07:00
BFlat efcc334553 Merge pull request #4486 from dotCooCoo/feat/text-styles-select-all-unused
Text styles: Select All Unused highlights the unused styles, and Delete deletes them all
2026-10-30 21:35:34 +07:00
dotCooCoo 3b724a0a79 Text styles: Select All Unused highlights the unused styles, and Delete deletes them all
Squashed from #4486 onto main.
2026-10-30 21:16:33 +07:00
BFlat 6049ddbcd8 Merge pull request #4709 from storytold/feat/addon-parametric-shapes
Add-ons: Parametric Shape Tool — re-editable stars, polygons, rings, arrows, gears and more
2026-10-30 21:15:21 +07:00
bflatastic 27ed249b1f Add-ons: Parametric Shape Tool — re-editable stars, polygons, rings, arrows, gears and more
Path Precision Tools gains the Parametric Shape Tool: ten kinds of shape
(rectangle, ellipse, polygon, star, ring, arrow, cross, heart, gear,
speech bubble) that stay editable as numbers.

- Geometry in vectorcraft_pathops::addons::pathtools::shapes: each kind's
  outline, corner rounding limited to the middle of a side, a fingerprint
  of the outline, recovery of centre, size and rotation after a move,
  turn or scale, and recognition of plain rectangles, ellipses and
  regular polygons.
- The tool (parametricShape, All Tools drawer and Object › Plug-ins ›
  Path Precision Tools only, no shortcut): drag from the centre (Shift:
  45° steps), arrow keys change the count and values while dragging,
  handles edit a selected shape, double-click places one.
- Commands addon.pathtools.shape.create / .set / .convert, one undo step
  each; params checked (counts 3..1000, sizes up to 16384 pt).
- A shape keeps its numbers in one object-data entry (vc-pathtools-shape)
  that SVG export already leaves out; anchor edits make it a plain path.
- Parametric Shape panel, cursor stand-in, catalog rows in all 25
  languages, docs and tests.
2026-10-30 20:55:14 +07:00
BFlat b496226ab5 Merge pull request #4463 from danngreen/feat/library-drop-place
Libraries panel: art and colors dragged in are added where they are dropped
2026-10-30 20:52:36 +07:00
BFlat ce8e344735 Merge pull request #4691 from kler/swedish-ui-2026-10-30
i18n(sv): translate 32 new strings, use the agreed terms in 11
2026-10-30 20:52:20 +07:00
Dan Green 10838300f1 Libraries: an add that cannot be placed makes no "My Library"
With no library yet, library.add made and saved "My Library" before it
looked for the group or item to place the new one by, so a bad `group`,
`before` or `after` failed but left an empty library behind. The new
library is now kept only once the item is in it.
2026-10-30 20:20:17 +07:00
Dan Green 7688b41a40 Libraries panel: art and colours dragged in are added where they are dropped
Art dragged off the canvas and colours dragged in from elsewhere (swatches, another library's)
used to be added at the end of the ungrouped items, wherever they were dropped. They now land
as items dragged within the list do: on another item of their kind, just before or after it by
the pointer's half and in its group; on a group, into it; away from the items, ungrouped at the
end as before.

library.add takes group and before/after, placed as library.moveItem places an item (the
placement is shared). A library change that fails partway now leaves the library as it was.
2026-10-30 20:20:17 +07:00
Patrik LermonandClaude Opus 5.5 d38994c77d i18n(sv): translate 32 new strings, use the agreed terms in 11
Brings the Swedish catalog up to date with upstream main (a8ec515e1).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 20:20:14 +07:00
BFlat 435fa962dd Merge pull request #4701 from ashokram-si/feat/gradient-presets-g13
Gradient panel: presets to apply, save and delete (G13)
2026-10-30 20:17:44 +07:00
BFlat 3b743f4543 Merge pull request #4561 from adambelis/fork/feat/control-bar-distribute
feat: show six Distribute Objects buttons in Control bar when 2+ objects selected (Illustrator parity)
2026-10-30 20:17:28 +07:00
BFlat 63caf3f047 Merge pull request #4702 from mockydevs/fix/pdf-large-mesh-shading
PDF import: large mesh shadings and mesh-painted strokes come in as gradient meshes
2026-10-30 20:17:14 +07:00
BFlat 865df773ed Merge pull request #4698 from mockydevs/fix/ai-empty-page-followups
.ai import: an empty page with skipped content isn't taken for empty; outlines asked for are given
2026-10-30 20:16:58 +07:00
BFlat 0e49b47167 Merge pull request #4697 from mockydevs/fix/ai-mesh-unread
.ai/EPS import: read gradient meshes in named colours, mixed colour spaces and large grids
2026-10-30 20:16:43 +07:00
bflatastic 051b5d8583 Docs: one area-table row each for Path operations and Colour again 2026-10-30 19:50:57 +07:00
ashokram-si 7a2fc777f4 Gradient panel: presets to apply, save and delete (G13)
People reuse the same gradients across documents and rebuilt them by
hand. The Gradient panel now has a Presets menu: the presets of the
app's built-in gradient libraries, grouped by library (theme), then
the saved ones. Choosing one gives the gradient behind the active
proxy (or a solid paint) the preset's type, stops, method and dither,
keeping its placement, as one undo step, through paint.editGradient.
The panel menu saves the current gradient as a preset (named in a
dialog) and deletes saved ones; Hide/Show Presets toggles the row.

Saved presets are kept with the preferences, next to the other user
preset lists (width profiles, flattener, perspective). Stops linked to
a document swatch keep their colour, unlinked, since a preset is used
in other documents. Built-in presets can't be deleted; names are
unique.

Commands: gradient.presets.list, .apply, .save and .delete. The menu's
rows are drawn only while in view, as its headings are.

Tests: engine tests for list, apply (fill and stroke, placement kept,
one undo step), save (unique names, unlinked swatch stops) and delete;
panel tests for applying from the menu and saving, deleting and
hiding presets from the panel menu, including scrolling the menu to
the saved presets. Docs: gaps G13, target-app and UI parity, ROADMAP.
2026-10-30 19:50:25 +07:00
Adam 55bfb7033e feat: show six Distribute Objects buttons in Control bar when 2+ objects selected (Illustrator parity)
Squashed from #4561 onto main.
2026-10-30 19:50:23 +07:00
bflatastic b127918be5 PDF import: a mesh-painted stroke's outline keeps dash and tolerance in reason 2026-10-30 19:45:52 +07:00
Don Omondi 75e8f69734 PDF import: large mesh shadings and mesh-painted strokes come in as gradient meshes
Patch and triangle mesh shadings of more than 4,096 patches, and strokes
painted with a mesh shading, came in as a flat grey. Illustrator writes
meshes of up to 14,355 patches, and writes a freeform gradient on a
stroke as a stroke painted with a type 7 shading.

- MAX_PATCHES is 16,384, as in the .ai editing-data reader.
- A stroke painted with a mesh shading is the meshes clipped to the area
  the stroke paints (stroke_outline: width, caps, joins, miter limit and
  dashes, built in the path's space and then transformed); draw_meshes
  always clips a stroke's meshes.
2026-10-30 19:44:50 +07:00
Don Omondi 4f5d270ae9 .ai import: an empty page with skipped content isn't empty; outlines asked for are given
Two follow-ups to the empty-page fallback:

- A page counts as empty only when nothing on it was skipped: its only
  notes are the page's own (art off the artboards, art past the page). A
  page whose only content couldn't be read, such as an image that can't
  be decoded, keeps its notes and goes through the usual check against
  the editing data, instead of being replaced by it unchecked.
- With textAs: outlines, the document read from the editing data alone
  has its type outlined. The usual path takes outlines from the page,
  but an empty page (or a text-only placeholder, #1387) has none to give.
2026-10-30 19:44:45 +07:00
Don Omondi c0ee9c1986 .ai/EPS import: read gradient meshes in named colours, mixed colour spaces and large grids
A mesh in the editing data that the reader couldn't read made the whole
file come in as its page or PDF part, without its layers. Three cases
were rejected that files write routinely:

- A mesh starts grey, and `/CS` is written only where the colour space
  changes, before the corner it applies to, even within a patch. Meshes
  with no `/CS`, or one that changed between corners, were unread.
- Named colours (`[c m y k /DeviceCMYK (name) /Process]` or `/Spot`) and
  `/NChannel` inks: each corner gives the tint, 1 being the full colour.
- Grids over 64 patches a side or 4,096 patches (files have 97 x 72).

Each corner now takes the colour space last set before it; named
colours paint at their tint and inks overprint at theirs; the limits
are 128 a side and 16,384 patches.
2026-10-30 19:44:41 +07:00
BFlat ed733b7d91 Merge pull request #4703 from storytold/feat/smart-pen-marquee
Smart Pen: an Alt-drag away from paths selects the points inside a marquee
2026-10-30 19:41:40 +07:00
bflatastic 884966c161 Smart Pen: an Alt-drag away from paths selects the points inside a marquee 2026-10-30 19:10:45 +07:00
BFlat 3dc3550c2f Merge pull request #4700 from storytold/fix/presentation-mode-artboard
Presentation Mode fits the active artboard and hides selections, guides, grids and artboard edges
2026-10-30 19:02:28 +07:00
BFlat e1f4e65030 Merge pull request #4699 from storytold/feat/addon-color-select
Add-ons: Color Effects — select by color kind (spot colors, color effects, RGB, CMYK and grayscale images)
2026-10-30 19:02:12 +07:00
bflatastic e214b3c981 Presentation Mode fits the active artboard and hides selections, guides, grids and artboard edges 2026-10-30 18:20:11 +07:00
bflatastic 992055204f Add-ons: Color Effects — select by color kind (spot colors, color effects, RGB, CMYK and grayscale images) 2026-10-30 18:20:06 +07:00
BFlat 3d62a009fd Merge pull request #4696 from storytold/fix/gradient-stop-popover-eyedropper
Gradient stop popover: an eyedropper samples the stop's colour from the art (#4681)
2026-10-30 18:08:52 +07:00
BFlat de68fc5ea3 Merge pull request #4695 from storytold/fix/screen-modes-full-screen
Full Screen and Presentation Mode fill the screen (#4365)
2026-10-30 18:08:35 +07:00
bflatastic 9ec7805e54 Gradient stop popover: an eyedropper samples the stop's colour from the art (#4681) 2026-10-30 17:49:06 +07:00
bflatastic 70512352bf Full Screen and Presentation Mode fill the screen (#4365) 2026-10-30 17:49:01 +07:00
BFlat fd81700273 Merge pull request #4694 from storytold/fix/hide-artboards
View › Hide Artboards hides their edges and shows the canvas as paper (#4038)
2026-10-30 17:37:09 +07:00
BFlat 8a9d2654a6 Merge pull request #4693 from storytold/fix/exif-orientation
Place: a photo's EXIF orientation turns it upright (#4284)
2026-10-30 17:36:51 +07:00
BFlat 7f54589fd6 Merge pull request #4692 from storytold/fix/task-bar-click-flash
Contextual Task Bar: stays up through a click on another object, hides only for a drag (#4681)
2026-10-30 17:36:35 +07:00
BFlat 8a28aaa28e Merge pull request #4690 from storytold/fix/draw-inside-indicator
Draw Inside marks the corners of the object it draws into (#4319)
2026-10-30 17:36:20 +07:00
BFlat 8954e31658 Merge pull request #4624 from wjrichards/fix/flatpak-wayland-clipboard
Linux clipboard: copy text through the core Wayland protocol
2026-10-30 17:36:02 +07:00
BFlat a8d2883b41 Merge pull request #4682 from Taha-Mahmoodi/fix/4638-color-halftone-radius-input
Fix #4638: clamp bounded effect length inputs on commit and reject invalid input visibly
2026-10-30 17:35:45 +07:00
BFlat 3e14933252 Merge pull request #4683 from jayzed80/fix/outline-stroke-huge-width
fix(pathops): a huge stroke width with round joins no longer panics Outline Stroke
2026-10-30 17:35:27 +07:00
bflatastic ad1bb39d62 View › Hide Artboards hides their edges and shows the canvas as paper (#4038)
Squashed from #4694 onto main.
2026-10-30 17:15:48 +07:00
bflatastic 0d891b9cb4 Docs: EXIF orientation on Place (#4284) 2026-10-30 17:15:39 +07:00