Commit Graph
7200 Commits
Author SHA1 Message Date
BFlat f77dcc8ec4 Merge pull request #5056 from dotCooCoo/fix/pdf-perceptual-gradient-mixed-inks
PDF export: a Perceptual gradient that mixes spot and process inks keeps its inks
2026-11-01 11:28:01 +07:00
BFlat e36488ee95 Merge pull request #5028 from dotCooCoo/fix/export-for-screens-numbers-taken-names-r
Export for Screens: a second file with a taken name is numbered instead of skipped
2026-11-01 11:27:49 +07:00
BFlat 7c40cc4220 Merge pull request #5064 from dotCooCoo/feat/symbol-edit-mode
Symbols: Edit Symbol opens the symbol in its own editing mode, and every instance follows each edit
2026-11-01 11:27:34 +07:00
BFlat da022c9e60 Merge pull request #5061 from dotCooCoo/feat/touch-type-rotated-characters
Type: Touch Type moves a character rotated near 90 degrees across its line
2026-11-01 11:27:18 +07:00
BFlat 2f6252f086 Merge pull request #5063 from dotCooCoo/fix/character-panel-mixed-toggles
Type: Character panel toggles show off for a mixed selection, and text.setFormat checks on/off values
2026-11-01 11:26:59 +07:00
BFlat e365620311 Merge pull request #5026 from dotCooCoo/feat/character-font-height-reference-r
Character: Font Size can measure the cap height, x-height or ICF box
2026-11-01 11:26:46 +07:00
BFlat 3153f6eb00 Merge pull request #5065 from dotCooCoo/fix/ai-os15
.ai import: envelopes open as live envelopes
2026-11-01 11:26:29 +07:00
BFlat 6047570089 Merge pull request #5059 from dotCooCoo/fix/ai-os16-onpath
.ai import: Objects on Path groups open live with their path, Pivot and Rotate
2026-11-01 11:26:14 +07:00
BFlat 071f5cbb43 Merge pull request #5057 from dotCooCoo/fix/ai-os13
.ai import: template layers and ruler guides open as they were set
2026-11-01 11:25:59 +07:00
dotCooCoo 38bb213917 PDF export: a Perceptual gradient that mixes spot and process inks keeps its inks
A Perceptual linear or radial gradient that mixes spot colors with each
other or with CMYK or gray stops was written as an image in process
colors. It is now written as a DeviceN shading of its inks, with the
stops on its Perceptual curve: at each one, the inks of the two stops on
either side are mixed at the weight where the two colors mixed in
display RGB have the OKLab lightness of the color on the curve.

- Gradient::ink_mixes gives the curve's stops as weights between stops,
  under the same 4,096-stop limit as ink_tints.
- Perceptual gradients that mix a spot color with RGB or Lab stops,
  dithered fills and freeform gradients stay images, and the warning
  now names those cases.
2026-11-01 11:09:09 +07:00
dotCooCoo 7e5e099f8e Export for Screens: a second file with a taken name is numbered instead of skipped
Squashed from #5028 onto main.
2026-11-01 11:09:08 +07:00
dotCooCoo ff036557fb Symbols: Edit Symbol opens the symbol in its own editing mode, and every instance follows each edit
Squashed from #5064 onto main.
2026-11-01 11:09:03 +07:00
dotCooCoo 5716a996ab Type: Touch Type moves a character rotated near 90 degrees across its line
Baseline shift now moves a character in the line's frame, outside
Character Rotation, so a positive shift moves a character up from its
line at any rotation, and the character turns about its shifted pen
position. The Touch Type tool splits a drag into its part along the line
(kerning) and its part up from the line (baseline shift) at every
rotation; before, within about 6 degrees of a quarter turn it dropped
the cross-line part.

Characters that already combine a rotation with a baseline shift are
drawn in a new position. Their stored values do not change.

- text: glyph transform order, PositionedGlyph::pivot (the turning
  point), tab leaders in the same order
- tools: Touch Type splits drags against the line's up axis and measures
  rotate-handle turns about the shifted pen position
- engine: text.touchType description; dy is up from the line
- docs: mcp.md Touch Type paragraph, target-app-parity.md progress line
2026-11-01 11:08:57 +07:00
dotCooCoo 94ef9b87c2 Type: Character panel toggles show off for a mixed selection, and text.setFormat checks on/off values
The Character panel's All Caps, Underline and Strikethrough buttons, and
its menu's All Caps, Underline, Strikethrough, Proportional Metrics,
Tate-chu-yoko and No Break, read the first selected character's style.
With only some characters marked they could show on, and choosing one
turned the attribute off for every character. They now show on only
when every selected character has the attribute, and a click on a mixed
selection turns it on for all, as Small Caps and Standard Vertical Roman
Alignment do. type.underline (Cmd+Shift+U) underlines a mixed selection
the same way. The Character Alignment and Digits submenus check no item
while the selected characters differ.

text.setFormat ignored a value that was not true or false for underline,
strikethrough, allCaps, proportionalMetrics, tateChuYoko,
standardVerticalRoman, noBreak, hyphenate, hyphenateCapitalized and
romanHangingPunctuation. It now refuses it with "`<key>` must be true or
false" and changes nothing, as text.setRangeStyle does.
2026-11-01 11:08:56 +07:00
dotCooCoo 427bce12b0 Character: Font Size can measure the cap height, x-height or ICF box
Squashed from #5026 onto main.
2026-11-01 11:08:55 +07:00
dotCooCoo af133b1ee4 .ai import: envelopes open as live envelopes
An envelope in a .ai's editing data opened as its distorted art, with
its mesh and contents dropped. It now opens as a live envelope of its
contents: a warp with its style, bend, distortions and orientation, a
mesh with its points and handles, or a top object with its outline,
with Envelope Options, Fidelity and Edit Contents.

The envelope replaces its drawn art only when VectorCraft draws it like
that art, with a budget so that live envelopes don't make the file open
from its PDF part. When the layers still differ too much from the page,
the drawn art is put back. An envelope that can't be read, or that
draws differently, keeps its drawn art with a note. Envelopes of type
keep their drawn art and hidden type as before.
2026-11-01 11:08:49 +07:00
dotCooCoo c027947362 .ai import: Objects on Path groups open live with their path, Pivot and Rotate
Squashed from #5059 onto main.
2026-11-01 11:08:47 +07:00
dotCooCoo 70651f585e .ai import: template layers and ruler guides open as they were set
The editing data's layer options set a template layer from the flag four
places after the colour index. The colour index of nine-operand options,
and the colour index and dimming percentage of eleven and twelve operand
options, are read from their own places (they were read one place later).

A straight (N) * guide path directly on a layer that runs across the
whole canvas, or from edge to edge of one artboard, opens as a ruler
guide on that layer (an artboard guide of that artboard); other guide
paths stay guide paths. Guides scale with the document when its editing
data is in the units of a UserUnit page, and an EPS that keeps only its
first artboard keeps only that artboard's guides.

Fixes #779
2026-11-01 11:08:18 +07:00
Dylan M. Taylor 469c7a421e ci: grant packages write permission to release workflow 2026-10-31 23:43:01 -04:00
BFlat 3b5fa80be3 Merge pull request #5060 from storytold/fix/artboard-panel-reorder-4687
Fix #4687: the Artboards panel reorders artboards by dragging a row
2026-11-01 10:32:11 +07:00
bflatastic 9b9f0918f0 Fix #4687: the Artboards panel reorders artboards by dragging a row 2026-11-01 10:17:29 +07:00
BFlat 42b07e35e3 Merge pull request #5022 from mockydevs/feat/export-all-open-4920
Fix #4920: Document Tools exports every open document
2026-11-01 09:38:50 +07:00
BFlat 03d54404c2 Merge pull request #5050 from dotCooCoo/fix/ai-unread-object-keeps-layers-r
.ai import: one object the reader can't read comes in as the page's art, and the layers stay
2026-11-01 09:38:34 +07:00
BFlat b359a7a63d Merge pull request #4949 from dotCooCoo/fix/eyedropper-blend-envelope
Eyedropper: Shift-click samples a blend's steps and an envelope's distorted art
2026-11-01 09:38:18 +07:00
BFlat 50113ea99a Merge pull request #5044 from dotCooCoo/feat/knife-straight-cut-smart-guides
Knife: a straight cut's ends snap to the anchors and paths Smart Guides snap to
2026-11-01 09:38:04 +07:00
BFlat a17ba4e304 Merge pull request #5045 from dotCooCoo/fix/doc-cfb-fuzz
Tests: .doc import fuzzing also damages the compound-file container
2026-11-01 09:37:49 +07:00
bflatastic 2d95cd667b Document Tools: catalog rows for Export All Open Documents, and its failure message as one translatable message 2026-11-01 09:24:25 +07:00
Don Omondi 1e8ac2434c Fix #4920: Document Tools exports every open document
addon.document.exportAllOpen {folder, format?} writes a copy of every
open document to one folder as Save a Copy does, each named after its
document with taken names numbered so no file is replaced. Documents
keep their paths and modified state, the active one stays active, and a
document that can't be written is reported while the others are still
written. Object > Plug-ins > Document Tools gets Export All Open
Documents as PDF and as SVG, which ask for the folder.
2026-11-01 09:24:25 +07:00
dotCooCoo 18b9c6113e .ai import: one object the reader can't read comes in as the page's art, and the layers stay
Squashed from #5050 onto main.
2026-11-01 09:24:23 +07:00
dotCooCoo 8362b7532c Eyedropper: Shift-click samples a blend's steps and an envelope's distorted art
Squashed from #4949 onto main.
2026-11-01 09:24:18 +07:00
dotCooCoo b253356b4d Knife: a straight cut's ends snap to the anchors and paths Smart Guides snap to
Squashed from #5044 onto main.
2026-11-01 09:24:13 +07:00
dotCooCoo c38607a5ae Tests: .doc import fuzzing also damages the compound-file container
A new text_import_fuzz case builds a valid Word 97-2003 document (version
3 or 4 compound file, its streams in the mini stream or in FAT sectors),
checks that it places, and then damages the container itself: header
fields, the sector and mini sector shifts, FAT and mini FAT entries,
directory entry fields and stream sizes, single bytes, and truncation.

Session::execute turns a panic into EngineError::Internal, so the cases
in this file did not fail when an import panicked. They now go through
no_panic, as import_fuzz.rs does.
2026-11-01 09:24:09 +07:00
BFlat 58e98510d1 Merge pull request #5048 from storytold/feat/expand-dashes-4922
Fix #4922: Expand Dashes into Paths
2026-11-01 09:23:32 +07:00
BFlat 50228cd6fd Merge pull request #5047 from storytold/feat/glyphs-highlight-4908
Fix #4908: Glyphs panel highlights the selected character
2026-11-01 09:23:16 +07:00
bflatastic 84336967aa Fix #4922: Expand Dashes into Paths 2026-11-01 09:08:07 +07:00
bflatastic 317423c514 Fix #4908: Glyphs panel highlights the selected character 2026-11-01 09:08:04 +07:00
BFlat 209e66d01a Merge pull request #5019 from dotCooCoo/feat/grid-drag-divider-skews
Grid tools: F, V, X and C change the divider skews by 10 while a grid is dragged out
2026-11-01 08:49:00 +07:00
BFlat b07e13876d Merge pull request #5021 from dotCooCoo/feat/live-paint-bucket-options
Live Paint: Live Paint Bucket Options set what a click paints and the highlight
2026-11-01 08:48:45 +07:00
BFlat 7ee6fb9ebc Merge pull request #5020 from dotCooCoo/feat/standard-vertical-roman-alignment
Type: Standard Vertical Roman Alignment stands half-width characters upright in vertical type
2026-11-01 08:48:33 +07:00
BFlat 0bf3ac5f2f Merge pull request #5018 from dotCooCoo/fix/pdf-perceptual-gradient-spot-ink
PDF export: a Perceptual gradient of one spot ink's tints keeps its ink
2026-11-01 08:48:19 +07:00
BFlat 028a602665 Merge pull request #5010 from dotCooCoo/fix/opacity-mask-layer-on-top
Transparency: a layer on top gives its topmost object as the opacity mask
2026-11-01 08:48:04 +07:00
217c01836b ci(xtask): print the i18n report without recompiling the workspace (#5001)
* ci: i18n report without a rebuild; PR print runs stop saving caches

- xtask ci: the i18n report selects the whole workspace as the test stage did. With
  `-p vectorcraft-ui-egui` alone cargo resolved features differently and recompiled for about
  3.5 minutes. `cargo xtask i18n-report` on its own still builds only that crate.
- print.yml: only main saves the desktop-print cache. Each PR saved its own 1.3 GB cache that
  only that PR can read (6.3 GB across five PRs), pushing the repository past its 10 GB limit
  and evicting caches main's gate restores.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* ci(xtask): i18n report selects the test run's targets too

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

The test run builds --lib --bins --tests; a binary target's dependencies (the desktop app's
eframe features) could still resolve differently under --lib alone. Match the selection
exactly, and drop --quiet so a rebuild would show in the log.

* ci: leave print.yml unchanged

print.yml still runs its own jobs, and CLAUDE.md (CI workflows) keeps additions out of such files.
The cache churn it causes goes to craft-common-actions instead. This PR is now the xtask change only.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: FredApps <FredApps@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-01 02:47:50 +01:00
BFlat 575545378c Merge pull request #5014 from dotCooCoo/fix/shortcut-backtick-macos
Tests: the backtick menu test passes on macOS
2026-11-01 08:47:37 +07:00
dotCooCoo d72022daf5 Grid tools: F, V, X and C change the divider skews by 10 while a grid is dragged out
Squashed from #5019 onto main.
2026-11-01 08:33:02 +07:00
dotCooCoo f07b9ab765 Live Paint: Live Paint Bucket Options set what a click paints and the highlight
Double-clicking the Live Paint Bucket did nothing, and the tool always
filled on a click, stroked on Shift-click and highlighted in red at
4 px. It now opens Live Paint Bucket Options with Paint Fills, Paint
Strokes, Highlight, Color and Width.

- Paint Fills (on) and Paint Strokes (off) set what a click paints.
  With Paint Strokes alone, a click strokes the edge within 4 px of the
  pointer. With both on, a click strokes an edge within 4 px and
  otherwise fills the face. With both off, a click paints nothing.
- Shift switches Paint Fills alone to Paint Strokes alone and back, and
  switches both to Paint Fills alone. With the defaults, Shift-click
  strokes the edge as before.
- Highlight turns the outline of the face or edge under the pointer on
  or off; Color (a layer color or a custom color) and Width (1 to 20 px)
  set it. With Paint Strokes alone, a selection of ordinary paths no
  longer highlights a region, since a click there paints nothing.
- The options are tool options (tool.setOption {tool:
  "livePaintBucket"}): they last across tool switches and are saved
  with the preferences.

Docs: docs/mcp.md, docs/target-app-parity.md.
2026-11-01 08:32:57 +07:00
dotCooCoo ece78f052f Type: Standard Vertical Roman Alignment stands half-width characters upright in vertical type
Character panel menu > Standard Vertical Roman Alignment, with Show East
Asian Options, is now a check item. It sets a new character attribute,
`standardVerticalRoman` (text.setFormat, text.setRangeStyle), off by
default and saved only when on. In vertical type the marked Latin
letters, digits and other characters that would lie on their side stand
upright one below the other, each in its upright cell. Spaces keep their
width and tate-chu-yoko blocks stay across the column. Horizontal type
keeps the mark and does not change. A combining mark shaped as its own
glyph turns with its letter, in Latin and CJK upright type alike.

Character Style Options labels the Character Alignment row "Character
Alignment" and gives Standard Vertical Roman Alignment its own checkbox.
Reset Panel turns the attribute off. PDF and SVG export place the glyphs
from the layout and need no change.
2026-11-01 08:32:55 +07:00
dotCooCoo ac896cfe3d PDF export: a Perceptual gradient of one spot ink's tints keeps its ink
A Perceptual linear or radial gradient was always written as an image,
so a gradient of spot ink tints lost its plate, and no warning named the
spot ink.

PDF export now writes a Perceptual gradient whose stops are tints of one
spot color (and paper white) as a Separation shading in that ink. Its
tints follow the gradient's curve: at each stop the renderer places on
the curve, the tint with the OKLab lightness of the color there.

Dithered fills, freeform gradients and Perceptual gradients that mix a
spot color with other colors are still images, and the export now warns
when such a gradient has stops linked to a spot swatch that its spot
colors are written in process colors.
2026-11-01 08:32:54 +07:00
dotCooCoo 482c011233 Transparency: a layer's art on a locked artboard or in a hidden or locked parent is not taken for an opacity mask
Make Opacity Mask expands a layer among its targets to the art that can
be edited: an object in a sublayer of a hidden or locked layer, or on a
locked artboard, is neither the mask nor masked, so it stays where it is.
2026-11-01 08:32:54 +07:00
dotCooCoo d0834e6834 Transparency: a layer on top gives its topmost object as the opacity mask
Make Opacity Mask took the topmost target as the mask. When that target was
a layer (a targeted layer above the art, or `ids` ending in a layer id), the
whole layer was removed from the layer tree and became the mask art. A layer
on top now stands for its visible, unlocked art, as a layer below the mask
already does: its topmost object is the mask and the rest of its art is
masked with the art below. A top layer with no such art is refused and the
document is left unchanged.
2026-11-01 08:32:54 +07:00
FredAppsandClaude Opus 5.5 b0294122e8 ci: leave print.yml unchanged
print.yml still runs its own jobs, and CLAUDE.md (CI workflows) keeps additions out of such files.
The cache churn it causes goes to craft-common-actions instead. This PR is now the xtask change only.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-01 08:32:53 +07:00