Commit Graph
6710 Commits
Author SHA1 Message Date
BFlat 0e7e41e786 Merge pull request #4665 from storytold/dependabot/cargo/cargo-patch-7373e1a9e8
chore(deps): bump the cargo-patch group across 2 directories with 4 updates
2026-10-31 02:42:29 +07:00
dependabot[bot] 414aad10bd chore(deps): bump the cargo-patch group across 2 directories with 4 updates
Bumps the cargo-patch group with 3 updates in the / directory: [rustix](https://github.com/bytecodealliance/rustix), [clipboard-win](https://github.com/DoumanAsh/clipboard-win) and [smallvec](https://github.com/servo/rust-smallvec).
Bumps the cargo-patch group with 1 update in the /crates/plugins/example directory: [serde_json](https://github.com/serde-rs/json).


Updates `rustix` from 1.1.5 to 1.1.6
- [Release notes](https://github.com/bytecodealliance/rustix/releases)
- [Changelog](https://github.com/bytecodealliance/rustix/blob/main/CHANGES.md)
- [Commits](https://github.com/bytecodealliance/rustix/compare/v1.1.5...v1.1.6)

Updates `clipboard-win` from 5.4.1 to 5.4.3
- [Commits](https://github.com/DoumanAsh/clipboard-win/commits)

Updates `smallvec` from 1.16.3 to 1.16.4
- [Release notes](https://github.com/servo/rust-smallvec/releases)
- [Commits](https://github.com/servo/rust-smallvec/compare/v1.16.3...v1.16.4)

Updates `serde_json` from 1.0.151 to 1.0.154
- [Release notes](https://github.com/serde-rs/json/releases)
- [Commits](https://github.com/serde-rs/json/compare/v1.0.151...v1.0.154)

Updates `serde_json` from 1.0.151 to 1.0.154
- [Release notes](https://github.com/serde-rs/json/releases)
- [Commits](https://github.com/serde-rs/json/compare/v1.0.151...v1.0.154)

---
updated-dependencies:
- dependency-name: clipboard-win
  dependency-version: 5.4.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo-patch
- dependency-name: rustix
  dependency-version: 1.1.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo-patch
- dependency-name: serde_json
  dependency-version: 1.0.154
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo-patch
- dependency-name: serde_json
  dependency-version: 1.0.154
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo-patch
- dependency-name: smallvec
  dependency-version: 1.16.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: cargo-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-10-31 02:23:04 +07:00
BFlat 5a4313ccf5 Merge pull request #4741 from storytold/feat/addon-cleanup-text
Add-ons: Artwork Cleanup — text tools
2026-10-31 02:22:21 +07:00
BFlat 998da41a23 Merge pull request #4733 from dotCooCoo/fix/swatch-anchor-doc-switch
Swatches: a Shift-click after switching documents starts a new range
2026-10-31 02:22:02 +07:00
BFlat 9c12aaa078 Merge pull request #4743 from mockydevs/fix/ai-path-type-spacing
.ai import: space type on a path round curves as the file lays it out
2026-10-31 02:21:46 +07:00
BFlat c3de273f0b Merge pull request #4742 from mockydevs/fix/ai-placed-closer-placement
.ai import: put placed files where they draw closer to the page
2026-10-31 02:21:30 +07:00
BFlat 6cbf1fa093 Merge pull request #4740 from mockydevs/fix/ai-rank5
.ai/EPS import: crop marks after the layers and type inside placed PDFs no longer lose the layers
2026-10-31 02:21:17 +07:00
BFlat ff62b8cd64 Merge pull request #4744 from mockydevs/fix/eps-mesh-transparency
.ai/EPS import: a gradient mesh takes the transparency written after it
2026-10-31 02:21:02 +07:00
BFlat 198aec3014 Merge pull request #4738 from mockydevs/fix/ai-mesh-weights
.ai/EPS import: read gradient mesh corners whose handle weights are 0
2026-10-31 02:20:46 +07:00
bflatastic e556dacbb6 Add-ons: Artwork Cleanup — text tools
Object › Plug-ins › Artwork Cleanup and a hideable Text row in its panel
gain text tools, each one undo step:
- Break Text into Lines / Paragraphs / Words / Glyphs: point type pieces
  placed by the glyph of their first character, keeping their styles.
- Combine Point Text: one-line point type merged into as few objects as
  it can, every glyph staying where it was (tracking and spaces, checked
  against the layout).
- Split Text at Cursor, Remove Line Breaks, Remove Paragraph Breaks,
  Set Alignment, Keep Position, Reset Text Transform and Replace
  Missing Fonts.
2026-10-31 02:05:58 +07:00
dotCooCoo a0da3faffe Swatches: a Shift-click after switching documents starts a new range
The panel cleared its swatch selection when the active document or the
selected art changed, but kept the Shift-click range anchor. A Shift-click
in the other document then selected every swatch from a name clicked in
the first document (for example White) to the clicked one. The anchor is
now cleared with the selection, so the Shift-click selects only the
clicked swatch.
2026-10-31 02:05:55 +07:00
Don Omondi 1a5f0fb099 fix(ai-import): space type on a path round curves as the file lays it out
Type on a path from the editing data's text document came in at the
font's advances, while the file's own layout (and its page) closes the
glyphs up round the outside of a curve and opens them up round the
inside, even where the frame keeps no spacing. Round a circle the type
ran on past where the page ends it.

The spacing (Type on a Path Options > Spacing) that reproduces the
layout is now fitted from the layout's glyph positions, advances and
turns, using the text engine's own model, and set on the imported text
object. Corners and straight runs are left out of the fit.
2026-10-31 02:05:52 +07:00
Don Omondi 7b4a65e231 fix(ai-import): put placed files where they draw closer to the page
The corner placement of placed files was tried only when the first
placement failed the comparison with the page. A small logo in the wrong
place differs too little to fail, so it stayed there. When the corner
placement draws closer to the page and still matches it, use it.
2026-10-31 02:05:48 +07:00
Don Omondi 67c8d86c6f .ai import: a page's type inside placed files needs no text object
A .ai whose layers hold placed (linked) PDFs and no text object came in as
its PDF part, saying its layers had no text objects for its page's text.
The PDF part draws each placed file, type and all, where the layers show
its preview, so type that lies inside the placed files (at either of their
placements) is theirs and needs no text object. Type outside them still
does.
2026-10-31 02:05:43 +07:00
Don Omondi 2d4e9dc9c9 EPS import: the printer's crop marks after the layers aren't art outside them
An Illustrator EPS draws its crop marks after the last layer, between
%AI3_BeginCrops and %AI3_EndCrops (inside userdict /AI3_noCropMarks known
not { ... } if). The reader took them for art outside the layers, and the
whole file came in as its page in one layer. The section is now skipped,
as other non-art sections are; the crop area is %AI3_Cropmarks.
2026-10-31 02:05:42 +07:00
Don Omondi e5481bda98 fix(eps): a gradient mesh takes the transparency written after it
In the editing data of a .ai or EPS file, a gradient mesh's own state
(`Xy`) comes right after its `/End X!`, before its `Xd` and `XW`, as a
group's comes after its `U`. The reader took it as the next object's, so
a Multiply shadow mesh came in as Normal and painted opaque white over
the art under it, while the file's page shows the shadow.

An `Xy` read straight after a mesh ends now also applies to that mesh.
An `Xy` after the mesh's `Xd` and `XW` stays the next object's.
2026-10-31 02:05:39 +07:00
Don Omondi dc6af04dcc fix(ai-import): read mesh corners whose handle weights are 0
Some files write a handle weight of 0 on some gradient mesh corners. The
reader took only weights of 1, so the mesh and the whole file's layers
were unread. A weight of 0 draws as the same cubic edge against the files'
pages; other weights still leave the mesh unread.
2026-10-31 02:05:35 +07:00
BFlat 8614c9dfe8 Merge pull request #4722 from nine-codes/bosnian-language-support
bs: Add Bosnian (bs) to the interface languages
2026-10-31 02:03:44 +07:00
BFlat aa90b104c6 Merge pull request #4737 from storytold/fix/testkit-fresh-temp-dirs
Testkit: temp_dir starts empty in each process, so a reused process id can't fail a test
2026-10-31 02:03:29 +07:00
bflatastic 63a5889895 bs: language names keep their own name in the picker 2026-10-31 01:31:09 +07:00
nine-codesandClaude Opus 5.5 64b92627c2 Add Bosnian (bs) to the interface languages
bs.tsv: Bosnian (Latin script, Ijekavian) catalog covering every key of
VectorCraft's other catalogs, its wording shared with storytold/craft-i18n
locales/bs/ and the strings craft-i18n lacks translated new. Every bs-*
locale selects it; counts use one/few/other. Locale and plural tests,
localization docs and an attribution entry (AI-assisted, not yet
reviewed by a native speaker).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013Tayw8nmxoLLmKv13jK93z
2026-10-31 01:17:11 +07:00
bflatastic f38cdaeaa7 Testkit: temp_dir starts empty in each process, so a reused process id can't fail a test 2026-10-31 01:17:06 +07:00
BFlat 2166aca02e Merge pull request #4734 from storytold/feat/addon-duotone
Add-ons: Color Effects — Duotone effect and Print Ink Fixes
2026-10-31 00:52:57 +07:00
BFlat 41c3f71880 Merge pull request #4735 from storytold/fix/4711-drag-modifiers
Canvas: Shift, Alt and Cmd/Ctrl pressed or released mid-drag apply with the pointer held still
2026-10-31 00:52:41 +07:00
BFlat 259faa3dba Merge pull request #4705 from dotCooCoo/fix/trace-library-global-swatch-same-color
Image Trace: Document Library links to a global swatch that shares a process swatch's color
2026-10-31 00:52:27 +07:00
BFlat a5b3d2cf6d Merge pull request #4714 from dotCooCoo/feat/perspective-selection-copy-drag
Perspective Selection: Cmd/Ctrl+Alt-drag copies objects in perspective
2026-10-31 00:52:06 +07:00
BFlat 071a94ce4a Merge pull request #4729 from mockydevs/fix/ai-import-review-followups
.ai import: outlines from the editing data keep their look and threads; mesh corners with non-numbers are unread
2026-10-31 00:51:49 +07:00
BFlat e8b3d1a6cb Merge pull request #4727 from mockydevs/fix/ai-cropped-page-units-and-pages
.ai import: pages cropped to the art in UserUnit units, and their copies' type
2026-10-31 00:51:31 +07:00
BFlat 319027c456 Merge pull request #4723 from mockydevs/fix/ai-placed-retry-unpruned
.ai import: weigh unseen text again at the placed files' other placement
2026-10-31 00:51:12 +07:00
BFlat aeb827ff89 Merge pull request #4708 from mockydevs/fix/ai-all-caps-text
.ai import: keep All Caps and Small Caps on type from the editing data
2026-10-31 00:50:52 +07:00
BFlat 4f5a2c87ed Merge pull request #4730 from dotCooCoo/feat/pathfinder-repeat-shortcut
Pathfinder: Cmd+4 repeats the last Pathfinder operation
2026-10-31 00:50:33 +07:00
BFlat 64ae5ee8de Merge pull request #4706 from dotCooCoo/fix/pencil-alt-smooth-fidelity
Pencil and Blob Brush: Alt smooths with the Smooth tool's Fidelity
2026-10-31 00:50:21 +07:00
BFlat 7f7c943595 Merge pull request #4726 from dotCooCoo/feat/knife-straight-cuts
Knife: Alt cuts in a straight line and Shift+Alt cuts at 45° steps
2026-10-31 00:50:04 +07:00
BFlat feb2aafb6c Merge pull request #4713 from dotCooCoo/fix/new-style-highlight
Character and Paragraph Styles: a style made by the New style dialog or the panel menu is highlighted
2026-10-31 00:49:40 +07:00
BFlat 1dd6fcf199 Merge pull request #4731 from dotCooCoo/fix/invert-colorize
Images: color edits recolor a colorized image's fill
2026-10-31 00:49:23 +07:00
BFlat ed0b1c7dc7 Merge pull request #4720 from dotCooCoo/fix/pdf-colorize-transparency
PDF: colorized images count as transparency for PDF 1.3 and PDF/X
2026-10-31 00:49:05 +07:00
BFlat d90eee669f Merge pull request #4718 from dotCooCoo/fix/stylelib-ids-null
Graphic Styles: addFromLibrary treats ids: null as left out
2026-10-31 00:48:50 +07:00
BFlat d6fcc5ac4e Merge pull request #4717 from dotCooCoo/fix/stylelib-name-check
Libraries: library loads check name before reading the file
2026-10-31 00:48:34 +07:00
BFlat dc2c46f4ae Merge pull request #4716 from dotCooCoo/fix/pdf-image-repeat-bound
PDF export: bound a colorized image's color channel
2026-10-31 00:48:17 +07:00
bflatastic ebc5b7038c Add-ons: Color Effects — Duotone effect and Print Ink Fixes
Effect › Color Effects › Duotone… (addon.color.duotone, also in Object ›
Plug-ins › Color Effects) prints the grey-equivalent tone of each colour
with one to four inks, each with its own tone curve. It is a colour
adjustment like the add-on's others, so it stacks with them and works as
a filter through addon.color.filter.

- One tone of a swatch the document has gives a tint of that swatch,
  linked, so a spot tone separates onto its plate; several tones give
  the CMYK mix of their tints (the inks overprint, so they multiply).
- Colour adjustments now map paints with their swatch links
  (ColorMap::apply_link); the existing adjustments behave as before.
- Skip Objects with Spot Colors leaves spot-linked colours as they are.
- The dialog has a row per tone and the picked tone's curve (the Curves
  graph, reused), its points and Reset to Linear / Inverse.

Print Ink Fixes (addon.color.printFixes, Object › Plug-ins › Color
Effects › Print Ink Fixes…) scales CMYK colours over a total ink limit
down to it, removes white overprint and sets black overprint (Overprint
Black's logic) in a CMYK document, as one undo step, and reports what
changed. RGB documents are refused.

The panel opens both under Inks.

Deferred: an opaque undercoat, tones for type only, extra gradient stops
for smoother tints, curve flip and all-100 % buttons.
2026-10-31 00:26:18 +07:00
bflatastic 79fe17934a Canvas: Shift, Alt and Cmd/Ctrl pressed or released mid-drag apply with the pointer held still (#4711) 2026-10-31 00:26:15 +07:00
dotCooCoo a2d3841579 Image Trace: look up library swatches once per trace
Each traced path filtered the whole library for its color, twice when
no swatch of that color was linked. The color-to-paint lookup is now
built once before the paths are filled. The first linked swatch of a
color still gives the fill, and the first swatch of that color
otherwise.
2026-10-30 23:57:40 +07:00
dotCooCoo 65f7d3a699 Image Trace: Document Library links to a global swatch that shares a process swatch's color
When a process swatch listed before a global or spot swatch showed the
same color, a traced fill of that color took the process swatch and
stayed unlinked. Of the swatches that trace as one color, the first
linked one now gives the fill, and the first one otherwise.
2026-10-30 23:57:40 +07:00
dotCooCoo 8f56899df9 Perspective Selection: Cmd/Ctrl+Alt-drag copies objects in perspective
With the Perspective Selection tool, Ctrl+Alt-drag (Command+Option-drag on
macOS) now copies objects on their perspective plane, as Alt/Option-drag
does. Before, Cmd/Ctrl lent the last selection tool even with Alt held, so
the drag made a flat copy. Cmd/Ctrl alone still lends the last selection
tool, and the cursor follows the same rule.
2026-10-30 23:57:36 +07:00
Don Omondi 66c797a59b .ai import: outlines from the editing data keep their look and threads; mesh corners with non-numbers are unread
Follow-ups to the review of #4697 and #4698:

- With textAs: outlines, a .ai saved without PDF compatibility, read
  from its editing data alone, has its type outlined too, as an empty
  page or a text-only placeholder already did.
- Threaded type read from the editing data holds its story in its first
  frame: it now flows through its frames before it is outlined, so each
  frame's outlines show the text it holds, and the outlined frames
  leave their threads.
- Each outline group keeps its type's opacity, blend mode, isolation,
  opacity mask and effects (the same carry-over the flattener uses).
- A gradient-mesh corner (/N) holding anything but numbers is unread,
  instead of being read with the numbers after it shifted into its
  colour and opacity.
2026-10-30 23:55:32 +07:00
Don Omondi 1d58ea947d fix(ai-import): pages cropped to the art in UserUnit units, and their copies' type
A page cropped to the art is recognised in a UserUnit page's units too,
when the art's box is the page in those units and the artboard isn't the
page in points. Such pages are taken only when every page is the art's
box, and only the first page's type is read: the later pages are copies
whose type was moved by the first page's offset and could fill the
layers' text objects twice.
2026-10-30 23:55:28 +07:00
Don Omondi 75958ce7da fix(ai-import): weigh unseen text again at the placed files' other placement
prune_unseen ran before the retry that moves placed files to their box's
corner, and that retry cloned the pruned layers: text an image covered
only at its first placement was already gone, so the file came in without
it or as its PDF part. Clone the layers before pruning and prune each
placement on its own.
2026-10-30 23:55:22 +07:00
Don Omondi 530605d4fc fix(ai-import): keep All Caps and Small Caps on type from the text document
Character attribute 12 of the editing data's text document is the case
(1 Small Caps, 2 All Caps). The reader skipped it, so type set in All Caps
came in as typed, in lower or mixed case where the page draws capitals.
Map it onto CharStyle::all_caps and CharStyle::small_caps.
2026-10-30 23:55:16 +07:00
dotCooCoo b4899e665d Pathfinder: batch steps set the operation Cmd+4 repeats
A successful command.batch now records its last Unite, Intersect or other
Pathfinder step as the operation Repeat Pathfinder runs, so playing an
action from the Actions panel updates it. A batch that fails and rolls back
leaves the previous operation in place. action.batch, which runs an action
over other files or data sets, does not set it.
2026-10-30 23:52:27 +07:00
dotCooCoo 7d97c633b7 Pencil and Blob Brush: Alt smooths with the Smooth tool's Fidelity
When Alt switches the Pencil (with Alt key toggles to Smooth Tool on)
or the Blob Brush to the Smooth tool, the drag sent the drawing tool's
own Fidelity (1.5 by default) to path.smoothRegion. The Smooth tool
sends its own Fidelity (2.5 by default, set in Smooth Tool Options).

Both tools now smooth with the Smooth tool's Fidelity. The engine gives
them the stored Smooth Fidelity when it makes the tool, and again when
Smooth Tool Options changes while one of them is active. Each tool's
own Fidelity still sets how its strokes are fitted.
2026-10-30 23:52:26 +07:00