Commit Graph
10704 Commits
Author SHA1 Message Date
dotCooCoo 3698a76c5d File formats: JPEG XL refuses colors left in a profile that is not an RGB one
A color JPEG XL image whose embedded ICC profile the decoder cannot convert to sRGB kept its samples as stored and lost the profile when that profile was not an RGB one, so the image drew those samples as sRGB. It is now refused as unreadable, as a gray image in such a profile already is.
2026-11-01 08:09:11 -08:00
dotCooCoo 7f843e1e4a .ai import: objects with a variable-width stroke come in as their drawn outline
The editing data keeps each styled object's drawn look, the outline as
the file draws it, next to the editable path. An object whose art style
was one stroke with a width profile came in as a live stroke instead, and
VectorCraft's width profile does not draw these strokes at the widths the
file draws them, so outlines no longer met the fills built against them.

Such an object now comes in as its drawn look, as other styles that
VectorCraft cannot draw the same way already do. Type keeps the stroke
and its profile live, since its drawn look cannot be retyped. The import
warning for drawn looks now names variable-width strokes.
2026-11-01 07:59:14 -08:00
dotCooCoo e6ae67154d Merge main into feat/jxl-import 2026-11-01 07:56:25 -08:00
dotCooCoo baeef1ec05 Blend: an edit merged into an open undo group drops the first pick
An edit merged into the newest undo step (an undo group) left
History::step unchanged, so a first pick made while the group was open
survived the edit. The newest step now takes a new number whenever it is
extended.
2026-11-01 07:12:43 -08:00
dotCooCoo f1fd255120 .ai import: version 7 palettes keep their swatches without names
Version 7 files write each palette swatch as its paint and `Pc`, with no
name. The reader only kept a swatch with a name before `Pc`, so such a
palette gave no swatches and the document got the default set.

A swatch without a name is now named by its spot color, gradient or
pattern, or by its values in the format the swatch import already uses
for unnamed colors ("Gray K=25", "C=25 M=0 Y=0 K=0"). `Pn` and a `Pc`
with no paint before it add nothing. Named swatches keep their names.

An operator the reader does not know, or a `Pg`, now ends the paint
before it, so a later `(name) Pc` no longer takes that paint. The
swatch limit is kept with a running count instead of summing every
group at each `Pc`.
2026-11-01 06:55:53 -08:00
dotCooCoo 4b663906e9 Blend: tests for a pick dropped by Redo and for the history step
A Redo made outside the Blend tool drops its first pick, as an edit or an
Undo does, and two picks with no edit between them blend. History::step
changes with each new step, Undo and Redo, also when an Undo and a new
edit leave as many steps as before, and stays the same for a selection
change and for an edit merged into an undo group.
2026-11-01 06:53:56 -08:00
dotCooCoo 52061b1029 Undo: tests for the default history budget with no memory reading, 0, small and large memory
history_budget_for takes the memory reading itself, so the 1 GiB fallback for no reading
or 0 is tested with the quarter, the 64 MiB floor and a reading of 2 GiB, as a cgroup limit
lower than the installed memory gives. The budget is unchanged.
2026-11-01 06:52:08 -08:00
dotCooCoo 827e137b5c Paste: in front or back of a compound path's member, other art goes beside the compound path
With a member of a compound path selected, Paste in Front and Paste in Back
put the clipboard's objects next to that member, inside the compound path,
whatever they were. A pasted group, compound path or type object then sat
inside a compound path, which holds only paths. The model-based test
`random_command_sequences` stops on this with "compound #N has a non-path
child".

When the clipboard holds anything other than paths, the objects now go
right above or below the compound path. Paths still go next to the member,
inside the compound path.
2026-11-01 06:42:33 -08:00
dotCooCoo a4436388cc Batch: a folder source's file name keeps a backslash on Linux and macOS
Output stems for a folder batch went through safe_file_name, which turns
`\` and `:` into `-`, so `a\b.svg` on Linux was written as `a-b.svg`.
The stem now only loses trailing periods and spaces and gets `-` after a
Windows device name, and keeps every other character.
2026-11-01 06:35:40 -08:00
dotCooCoo b5cf31950b Merge main into feat/kinsoku-shori-type 2026-11-01 06:26:35 -08:00
dotCooCoo fd973bdf48 Tests: Outline Stroke with Round Corners, no effect, hidden effects, blur and undo 2026-11-01 06:23:42 -08:00
dotCooCoo 1f24099dd9 .ai save: test that a file opens from its VectorCraft document when the editing copy differs
A .ai whose editing copy for other apps holds no transparency, while the VectorCraft document it carries holds 50% opacity, opens in VectorCraft with the opacity of the VectorCraft document. Read with native: false, the same file gives the editing copy.
2026-11-01 06:22:13 -08:00
dotCooCoo db40218790 Type: Crisp and Strong reshape the inner edge of a character stroke
A run's solid fill and its stroke no longer share one edge group, so the
stroke's edge inside the characters takes the method. docs/mcp.md says the
native document an SVG, PDF or EPS file carries keeps each frame's method.
2026-11-01 06:08:13 -08:00
vangel76andClaude Sonnet 5.5 6241ef6e2b Merge upstream/main into fix/2414-svg-classes
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-01 14:56:38 +01:00
dotCooCoo 01798d86ab Native format: tests for exact saves, rounding halves, closed and tiny paths
Without `precision` 500 coordinates of every size reopen bit for bit and a
second save writes the same bytes. Halves round away from zero, a closed
path keeps its closing anchor on its first one, a shape smaller than one
step collapses onto one point, coordinates at the edge of the canvas round
to the asked places, and saving a rounded file again at the same precision
writes the same bytes. docs/mcp.md states these rules.
2026-11-01 05:38:12 -08:00
dotCooCoo fc6178d021 Recolor Artwork: spell color the American way in the new comments and test names 2026-11-01 05:26:35 -08:00
dotCooCoo 74b8d31183 Merge main into feat/character-anti-aliasing-method-r 2026-11-01 05:13:53 -08:00
dotCooCoo 9b853004d5 Recolor Artwork: a slider edit changes the color mode of its own row only
The color sliders now mark the row they edit with `model: "new"`
instead of a dialog-wide flag, and `recolor.apply` reads a row's own
`model` before the command's. Rows the sliders did not edit keep each
color's model, so with RGB art and a CMYK color group, a slider edit of
one row no longer turns the other rows' art CMYK. Another edit of the
row's new color, Reset and rows reduced again remove the mark, and
`recolor.randomize` moves it with its new color.
2026-11-01 02:06:46 -08:00
05d5f99fd7 ci: run the desktop printing check through the shared gate (#5062)
* ci: run the desktop printing check through the shared gate

print.yml ran its own Windows job, which the CI workflow rules phase out, and each PR saved its
own ~1.3 GB cache. The same commands now run through craft-common-actions' gate.yml on
windows-2022, without craft-fonts, nextest or the wasm target as before. The gate never saves
from a pull request; a manual run on main seeds the cache. storytold/craft-common-actions#118.

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

* ci: call the shared gate at main

storytold/craft-common-actions#119 is merged, so main's gate takes an empty packages list.

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 10:55:12 +01:00
dotCooCoo 1323965312 Recolor Artwork: Tint shows only with art and previews the color the art takes
A dialog opened on a color group or on loose colors no longer offers Tint for a spot color of
the library: OK saves only the new colors, so a tint set there was lost. The row shows the
process modes instead.

The Tint rail and a tinted row's new color chip show a Lab spot color as art linked to it shows
it: the working-CMYK equivalent while the Spot Colors options use CMYK values, with its inks
scaled.
2026-11-01 01:40:08 -08:00
dotCooCoo 333450b862 Recolor Artwork: rebuilt rows discard a slider edit's color mode
Changing the color count, a Preserve option or Limit to Library rebuilds the rows from the art's colors, which discards a slider edit. The dialog now also forgets that edit, so preview and OK give the art the rebuilt rows' colors in the art's own model instead of the rows' models.
2026-11-01 01:18:07 -08:00
dotCooCoo f242b9caa6 Recolor Artwork: a row's tint stays with its spot color
A wheel drag or a harmony rule on the Edit tab now removes a row's tint
when it gives the row another new color, as the color sliders, the hex
field and the Color Picker already do. With Limit to Library, an edit
that snaps back to the row's own color keeps the tint.

recolor.randomize moves each row's tint with its new color when it
shuffles the order, and removes the tint from a color that saturation
and brightness changes.
2026-11-01 01:55:46 -07:00
dotCooCoo 5e1a50c75a Linux: hold spawning while the title bar test starts its child process
On Linux and the BSDs, the_titlebar_variable_decides_the_frame_before_the_window_opens now
holds spawning() while it starts each child test process, as the portal save test does around
dbus-daemon, so the child does not keep a copy of a GPU start test's locked start file.
2026-11-01 01:52:37 -07:00
dotCooCoo a1c908fbd2 Linux: test VECTORCRAFT_TITLEBAR read from the environment with System Title Bar off and on
Runs the test binary again with VECTORCRAFT_TITLEBAR set to app, system,
desktop and an unknown value, and checks titlebar_override, custom_titlebar
with no saved preferences and with System Title Bar off and on, and the
window decorations native_options sets before the window opens. On macOS
and Windows the variable is not read.
2026-11-01 00:06:04 -07:00
dotCooCoo c50fe0220d Recolor Artwork: Reset discards slider edits and reads the art's own colors
Reset now also clears the slider edit, so the preview and OK keep each
color's model again instead of sending model "new". Changing the Colors
count, a Preserve flag or Limit to Library, or pressing Reset, with the
preview on reduced the previewed colors, so the rows no longer matched
the art; the preview is now rolled back before the colors are reduced.

The Tint mode follows the swatch recolor.apply links: the first library
swatch of the library color nearest the row's new color, shown as Tint
only when that swatch is a spot color.
2026-10-31 23:52:06 -07:00
dotCooCoo e725c4920c Tests: nested clip groups in isolation mode and Direct Selection drags
- isolation_reaches_hidden_art_only_for_the_isolated_clip_group: with the
  outer clip group isolated, clicks and marquees take the art its own mask
  hides, while an inner clip group's mask still clips that group's art;
  isolating the inner group or its art reaches the inner hidden art.
- isolation_lets_direct_selection_take_the_art_a_clip_group_hides now
  continues the press with a drag on the same tool and checks the Move
  step and its preview, for Direct Selection and Group Selection.
2026-10-31 22:26:08 -07:00
dotCooCoo 83227d368d Merge main into feat/character-anti-aliasing-method-r
# Conflicts:
#	crates/engine/src/cmd/panelcmds.rs
#	crates/ui-egui/src/panels/character.rs
2026-10-31 22:16:39 -07:00
dotCooCoo 46cb088eae Recolor Artwork: color sliders edit the selected row's new color in a chosen mode
The Assign tab gets a Color Mode menu (HSB, RGB, CMYK, Lab, and Tint when
the row's new color is a spot color of the Limit to Library library) and
its sliders under the rows. They edit the first selected row's new color
and are disabled with no row selected. Once they have edited a color in a
mode, the preview and OK send recolor.apply with model "new", so the art
takes the color in that mode.

recolor.apply rows take an optional tint (percent, default 100): art linked
to the row's global or spot library swatch takes that share of its tint.
recolor.randomize keeps a row's tint.
2026-10-31 21:42:42 -07:00
dotCooCoo 24b509aca1 i18n: add the antiAlias message in Bulgarian, Bosnian, Danish, Indonesian and Dutch 2026-10-31 21:29:23 -07:00
dotCooCoo d9dc0ea7e7 Merge main into feat/character-anti-aliasing-method-r
# Conflicts:
#	crates/engine/src/cmd/panelcmds.rs
#	crates/ui-egui/src/panels/character.rs
2026-10-31 21:29:22 -07:00
BFlat 1c4a7831eb Merge pull request #5067 from storytold/feat/nearest-swatch-4923
Fix #4923: Find Nearest Swatch in the document or a swatch library
2026-11-01 11:28:39 +07:00
BFlat d94392db1f Merge pull request #5055 from mockydevs/fix/export-all-one-file-4920
Export All Open Documents: one file per copy (#4920 follow-up)
2026-11-01 11:28:23 +07:00
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 e1440a3a90 Paragraph: Kinsoku Shori Type chooses Push In First, Push Out First or Push Out Only
The Paragraph panel menu (with the East Asian options) gains Kinsoku Shori
Type, and text.setFormat takes kinsokuType. Where the Kinsoku Set keeps a
character off the start of the next line or the end of this one, Push In
First sets it on the line and closes the line's gaps next to CJK
characters to fit, each by at most a tenth of an em of the character
before it; a line that cannot close up that much, or that holds a tab,
pushes out. With Optical Margin Alignment or Roman Hanging Punctuation
on, the gaps that hanging punctuation keeps open are not counted. Push
Out First pushes in only when pushing out would leave the line more than
an em short. Push Out Only, the default, is the line breaking area type
had before, so existing documents lay out unchanged. The setting does
nothing with Kinsoku Set None, is saved only when it is not Push Out
Only, and paragraph styles carry it. Reset Panel sets it back to Push
Out Only.

Docs: docs/mcp.md, docs/type-parity.md, docs/target-app-parity.md.
2026-10-31 21:14:57 -07:00
dotCooCoo b949038a2b .ai save: the editing copy draws the artboards' background colors
The PDF pages of a .ai draw each artboard's background color (Include
Artboard Fill, on by default), but the editing copy of the art left it
out, so the two differed and the file reopened from its PDF part. The
editing copy now takes the same option.
2026-10-31 21:09:39 -07:00
bflatastic a76d9215da Fix #4923: Find Nearest Swatch matches colours to a library's swatches
Object > Plug-ins > Color Effects > Find Nearest Swatch... picks a
library (the document's swatches, a built-in library, or a library or
colour book the user saved or loaded) and Fill and Stroke, and lists
each colour of the selection with its three closest swatches and their
CIEDE2000 difference. Apply gives each colour its nearest swatch as one
undo step.

- addon.color.nearestSwatch (a query): the closest swatches of a
  library to each colour of the selection's fills and strokes (solid
  colours and gradient stops, inside groups and type), or to a colour
  given, with deltaE; count 1..50.
- addon.color.applyNearestSwatch: recolours those paints (and gradient
  meshes) to their nearest swatch; global and spot swatches link, and a
  library's swatches the colours take are added to the document first
  (as swatch.library.add adds them), so a spot colour stays spot.
- The library picker Image Trace's Document Library uses moves to the
  Swatches panel module and is shared.
- No colour book data ships: only libraries VectorCraft computes or the
  user loads are searched.
2026-11-01 11:09:11 +07:00
Don Omondi 6d6757c929 Export All Open Documents: every page and artboard, linked data included
Each format's copy options are given in full, so no remembered option
applies: PDF and .ai copies write every page (range all), SVG copies
the art of every artboard in one file (useArtboards false), native,
.ai and EPS copies include linked files' data.
2026-11-01 11:09:10 +07:00
Don Omondi c101576df3 Fix #4920: one file per copy
Each copy is saved with images embedded and artboards together, so a
document last saved with linked SVG images writes no image files beside
its copy; any other file a save reports is reserved for the copies still
to come.
2026-11-01 11:09:10 +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