Commit Graph
3540 Commits
Author SHA1 Message Date
dotCooCoo 3fc78187ec TIFF: planar grayscale files with extra channels, and planar CMYK files, open and place
TIFFs that store each channel as its own plane (PlanarConfiguration 2)
did not open, place or relink when they were CMYK or grayscale with
extra channels: the image decoder refuses planar CMYK, and the readers
for CMYK inks and for extra samples returned nothing for planar files.

The two readers now read every plane through the tiff crate and put
each pixel's samples together. A planar CMYK TIFF keeps its ink
amounts and is stored as a CMYK TIFF with each pixel's inks together,
at the file's resolution. Grayscale TIFFs with an alpha channel or
other extra channels, and CMYK TIFFs with alpha, read as their chunky
versions do.

A TIFF whose header claims more strips or tiles than the tiff decoder
can count is refused as too large to draw. The decoder multiplies
those counts without a check, which panics in builds with overflow
checks.

Part of #1466.

Docs: docs/file-format-parity.md, docs/target-app-parity.md.
2026-10-17 13:49:49 +07:00
dotCooCoo 5a3e833ec8 Type: a click in a Devanagari syllable goes to its nearer end, and shaping is tested
A syllable drawn with several glyphs that share one cluster, such as a
pre-base i matra and its consonant (कि), had a caret stop at the edge
of each glyph. A click just right of the matra, in the left half of
the syllable, put the caret after the syllable. byte_in_line now takes
one extent for each cluster, and type on a path compares the click
with the middle of the cluster, from the start of its first glyph to
the end of its last.

New tests with an installed OpenType Devanagari font check that क्ष
forms one conjunct glyph, that र्क draws the reph after its base, that
कि draws the matra before its consonant, that Ka with a nukta matches
the precomposed क़, and that each syllable is one cluster with the
arrow keys stopping at its ends. They print SKIPPED when no such font
is installed.

Docs: docs/localization-parity.md (Hindi row), docs/target-app-parity.md.
2026-10-17 13:49:49 +07:00
dotCooCoo 5bdd9d539f Variables: Import Data Sets… reads tab-separated files and files without a name column
dataset.import read only commas between cells and refused a file whose
first header cell wasn't `name`. A value that didn't match its
variable's kind, and a repeated data set name, were reported with the
row's record number, which is not the file line after a blank line or a
quoted line break. A data set name over 255 characters gave no line.

- When the header row, read with tabs between cells, has a tab and no
  comma outside quotes, tabs separate the cells. A quoted cell may then
  hold tabs and commas.
- Without a `name` column every header cell is a variable, and the rows
  take the first free names Data Set 1, Data Set 2 and so on, as Capture
  Data Set and blank name cells do. A first header cell `name`, in any
  case, still holds the data set names.
- Value errors, a repeated data set name and a name over 255 characters
  give the file line the row starts on.
- The Variables panel's Import Data Sets… dialog also lists .tsv files.
- import_fuzz.rs imports random text, random bytes and mutated exports,
  comma- and tab-separated, into a document with bound text, visibility
  and graph variables, selects up to three of the imported data sets in
  turn, and exports every data set.

Docs: docs/mcp.md, docs/target-app-parity.md.
2026-10-17 13:49:49 +07:00
dotCooCoo a285efda46 Print: Print, Print Preview and Print Setup take a print preset by name
file.print, print.preview and print.setup took print settings only as
settings, so an agent had to read a preset with print.presets.list and
copy its settings into the call. They now take preset, the name of
[Default] or of a saved print preset in any case. The preset's settings
are used instead of the document's, settings applies over them, and
print.setup saves them with the document as one undo step. An unknown
name is a parameter error that lists the presets. The app's file.print
with params passes preset on to the engine.

Docs: docs/mcp.md, docs/target-app-parity.md.
2026-10-17 13:49:49 +07:00
dotCooCoo d5e44b321e Swatches: Alt-click on a swatch recolors the selected gradient stop
With a gradient stop selected, an Alt-click on a color swatch painted
the inactive Fill or Stroke, as it does with no stop selected. The
reference app's Default keyboard shortcuts page lists "Apply swatch
color to active (or selected) color stop: Alt-click swatch in the
Swatches panel" for the Gradient panel.

Now, when the active Fill or Stroke is a linear or radial gradient with
a selected stop, an Alt-click on a color swatch or a tint swatch
recolors that stop in one undo step, and the stop stays selected. The
stop changes as a drop of the same swatch on the Gradient panel's ramp
changes it (drop_color and dropped_link in panels/gradient.rs): it
becomes fully opaque, and a global or spot color or a tint stays
linked, so editing the swatch recolors the stop.
With a freeform gradient, the selected point takes the color through
paint.freeform.setPoint. With no stop or point selected, Alt-click
paints the inactive Fill or Stroke as before. The Fill and Stroke chip
popovers show the same swatches and behave the same.

Docs: docs/control-protocol.md, docs/target-app-parity.md.
2026-10-17 13:49:49 +07:00
bflatastic 6902e1ab3f Dialogs: drop the slider wrappers nothing calls since the named ones 2026-10-17 13:49:49 +07:00
dotCooCoo f0bb2760c9 Accessibility: buttons, toggles, checkboxes and sliders have names for screen readers
The controls that the shared widgets draw had no name in the
accessibility tree: icon, flat, primary, secondary and split buttons,
chips, toggles, checkboxes, radio buttons, tabs, sliders, the angle
dial, the Reference Point's squares, the spinner and preset arrows and
the searchable combo boxes. Screen readers announced each clickable one
as an unnamed element of unknown role, and a disabled icon button was
not in the tree. The Color Guide's library button, the Color Themes
Save button and the status bar's artboard buttons also had no name.

Each helper in widgets.rs except color_field now gives its response a
role, a name and its state. The name is the text, label or translated
tool tip the helper shows. The spinner, the preset arrow, the angle
dial, the harmony wheel and the Reference Point's squares, which show
none, are named "Step up or down", "Presets", "Angle", "Color wheel"
and Top Left to Bottom Right. A toggle, checkbox, radio button, tab or
Reference Point square reports whether it is on, an icon button reports
that it is pressed while it is lit, the angle dial reports its angle,
and a searchable combo box reports the text it shows. A checkbox or
radio button drawn without text is named by the label beside it. The
Tools panel's tool buttons, flyout rows and floating strips are named
by their tools' tool tips, with the active tool pressed. The title
bar's column toggle, the tear-off bars, a floating strip's close box
and the Color, Gradient and None buttons are named by their tool tips.

The status bar's First, Previous, Next and Last Artboard buttons now
have tool tips, and the Fill and Stroke chips' tool tips are
translated. The six new strings (the four artboard tips, "Color wheel"
and "Step up or down") have rows in every catalog.

split_button, chip_button, color_slider, channel_slider and the dialog
form's slider_field and slider_rail keep their arguments. New _named
variants beside them take the arrow's tool tip, the chip's tool tip or
the slider's name, and every caller in the tree uses them.

Docs: docs/target-app-parity.md.
2026-10-17 13:49:49 +07:00
bflatastic a71f8eb56a Persistence: startup reads at most 256 MB of stored colour profiles (#2174) 2026-10-17 13:49:48 +07:00
vangel76andClaude Opus 5.5 a8e45f0e2d Persistence: saved PDF presets and loaded ICC profiles survive a restart (#2168, #2174)
PDF presets are kept one file each in a PDF Presets folder, ICC profiles as copies in a Color Profiles folder, next to the preferences; the desktop app and vectorcraft-cli use them. Adds color.removeProfile.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 13:49:48 +07:00
bflatastic 51f8582c25 MCP: a cancelled export keeps no partly drawn tile or raster, and its message is translated (#2165) 2026-10-17 13:49:48 +07:00
vangel76andClaude Opus 5.5 9122ed0a7e MCP: cancel long exports, answer while one runs, report progress (#2165, #2171, #2172)
The MCP server read one line, ran it and answered it before reading the next,
so notifications/cancelled was never seen during a call and every request
(even ping) waited behind a running export.

- vectorcraft_doc::cancel: a thread-local cancel token and progress sink that
  long work polls. Checkpoints: PDF pages, PDF flattening, geometry bake,
  raster-effect flattening, drawing objects, raster artboards, and before any
  file is written. A cancelled command returns EngineError::Cancelled and
  changes nothing.
- Server::serve reads on its own thread: notifications/cancelled drops a
  queued request or stops the running one (no reply, as the MCP spec says),
  engine-free requests (ping, the list methods, prompts/get) are answered at
  once, a request that would wait behind a call running for 2 s is refused
  with -32003 naming that call, and _meta.progressToken gets
  notifications/progress (page n of m). Queue and output are bounded.
- The remote backend stops waiting for the app when the call is cancelled.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 13:49:48 +07:00
vangel76andClaude Opus 5.5 6920adf092 PDF export: report RGB colours and images in a CMYK document (#2162)
A CMYK document holding RGB colours or images separates them into CMYK on export, and dark ones come out as rich blacks. The export report now says how many there are.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 13:49:48 +07:00
vangel76andClaude Opus 5.5 1eb9bea82a Inspect: scope document.inspect / doc_inspect by ids, kind, limit and offset (#2167)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 13:49:48 +07:00
bflatastic d55b4f77cf AI import: cite the published format specification by its title 2026-10-17 13:49:48 +07:00
Roman Vasilyev 8b8c164e3f CI: simplify boolean guards and translate EPS mask errors 2026-10-17 13:48:06 +07:00
Roman Vasilyev 4ed644d98d EPS: preserve editable Illustrator art and filter raster page comparison 2026-10-17 13:48:05 +07:00
BFlat 26644850fc Merge pull request #2484 from vangel76/fix/2332-corner-radius-to-neighbour
Live Corners: a corner rounds until its cut reaches its neighbours (#2332)
2026-10-17 13:45:25 +07:00
BFlat 8735dbc6fd Merge pull request #2237 from EuanTop/fix/2208-native-font-name-fallback
Fix native font labels when only legacy names are localized
2026-10-17 13:45:10 +07:00
BFlat c266083acd Merge pull request #2510 from vangel76/fix/2426-innerglow-pattern
Render: Inner Glow on a pattern fill draws along the edges, not at the top left (#2426)
2026-10-17 13:44:51 +07:00
BFlat a3dc3ca68e Merge pull request #2482 from vangel76/fix/2432-dimension-shift-preview
Dimension tool: Shift preview, snap indicator, clicks snap onto lines and anchors (#2432, #2516)
2026-10-17 13:44:37 +07:00
BFlat d82eafce7a Merge pull request #2487 from vangel76/fix/2457-tab-line-width
Type: a tab takes its width when area type breaks and justifies its lines (#2457)
2026-10-17 13:44:23 +07:00
BFlat f3ff11ff45 Merge pull request #2478 from vangel76/fix/2413-text-create-bounds
Type: text.create and text.createInPath return the new type's bounds (#2413)
2026-10-17 13:44:11 +07:00
BFlat cb33850e9c Merge pull request #2475 from vangel76/fix/2343-zigzag-smooth-wave
Effects: Zig Zag Smooth points draw a continuous wave (#2343)
2026-10-17 13:43:59 +07:00
BFlat a1372d498a Merge pull request #2486 from vangel76/fix/2451-transform-gradient
Effects: a Transform effect on a group paints each copy with its own gradient (#2451)
2026-10-17 13:43:48 +07:00
BFlat b9cc13beff Merge pull request #2477 from vangel76/fix/2476-effects-craft-fonts-skip
Effects: skip type tests when built without craft-fonts (#2476)
2026-10-17 13:43:37 +07:00
BFlat b5cadb9412 Merge pull request #2640 from storytold/pr/2585-quick-trace-docs
docs: quick Image Trace presets trace at once; the Image Trace button opens the controls (#2585)
2026-10-17 13:43:17 +07:00
BFlat 981f28469e Merge pull request #2566 from dotCooCoo/fix/artboard-commands-bad-index
Artboards: commands given an index that names no artboard fail instead of editing another one
2026-10-17 13:42:03 +07:00
BFlat 0072594442 Merge pull request #2568 from Silvertree2010/fix/h2255-graph-data-csv-does-not-round-tr
Quote graph data CSV labels so they round-trip through graph.setData
2026-10-17 13:41:52 +07:00
BFlat d27a356007 Merge pull request #2579 from dotCooCoo/fix/raster-effects-ppi-on-load
Document Raster Effects Settings: a file's resolution outside 1 to 2400 ppi opens in range
2026-10-17 13:41:40 +07:00
BFlat 02a0ad2541 Merge pull request #2599 from dotCooCoo/fix/appearance-inline-text-typing
Appearance: the inline effect editor's text fields keep what is typed
2026-10-17 13:41:29 +07:00
BFlat 71eae2559d Merge pull request #2601 from dotCooCoo/feat/space-shift-rotate-view
Rotate View: a Space+Shift drag rotates the view from any tool
2026-10-17 13:41:18 +07:00
BFlat c61fd7085f Merge pull request #2583 from dotCooCoo/fix/presentation-mode-non-editable
View: in Presentation Mode no key but ←, → and Escape acts, and no context menu opens
2026-10-17 13:41:06 +07:00
BFlat e9c6c53b2a Merge pull request #2613 from dotCooCoo/feat/links-shift-range
Links: Shift-click selects a range of links
2026-10-17 13:40:56 +07:00
BFlat 8aef393aab Merge pull request #2612 from dotCooCoo/feat/graphic-styles-shift-range
Graphic Styles: Shift-click selects a range of styles
2026-10-17 13:40:41 +07:00
BFlat c94f93ddc0 Merge pull request #2618 from dotCooCoo/fix/library-panel-click-anchor
Libraries: a plain click sets where a Shift-click range starts
2026-10-17 13:40:26 +07:00
BFlat 8b8607db8c Merge pull request #2620 from dotCooCoo/fix/issue-2384
Part of #2384: imported PDF text keeps its place after wide gaps between words
2026-10-17 13:40:11 +07:00
BFlat c600673648 Merge pull request #2622 from odgrim/fix/intertwine-expand-2540
Fix #2540: Object → Expand expands Intertwine groups
2026-10-17 13:39:54 +07:00
BFlat 63fc56f327 Merge pull request #2511 from vangel76/feat/2412-export-rect
Export: raster document.export takes a page rectangle (#2412)
2026-10-17 13:39:39 +07:00
BFlat da90552ee5 Merge pull request #2495 from vangel76/fix/2494-gradient-chip-angle
Gradient chips: follow the angle and the gradient type (#2494)
2026-10-17 13:39:24 +07:00
BFlat d60f3b12ff Merge pull request #2499 from vangel76/fix/2421-floating-panel-opaque
Panels: floating panel groups paint an opaque background (#2421)
2026-10-17 13:39:11 +07:00
BFlat 92fa9cbab2 Merge pull request #2498 from vangel76/fix/2383-merge-selected-sublayer
Layers: Merge Selected with a layer and its sublayer highlighted merges into the last top-level layer (#2383)
2026-10-17 13:38:47 +07:00
BFlat 8d185babb4 Merge pull request #2514 from vangel76/fix/2415-overprint-same-colour
Overprint Preview: a colour overprinting itself stays that colour (#2415)
2026-10-17 13:38:34 +07:00
BFlat 0e3ce7744b Merge pull request #2503 from vangel76/fix/2493-generic-cmyk-black-roundtrip
Color: Generic CMYK black round-trips through hex (#2493)
2026-10-17 13:38:22 +07:00
BFlat d5a3422dcd Merge pull request #2517 from vangel76/fix/2323-overflow-marker
Type: selected overflowing type shows its red out port with any tool (#2323)
2026-10-17 13:38:07 +07:00
BFlat 1d19d84493 Merge pull request #2518 from vangel76/fix/2217-kerning-caret
Character: the Kerning field at a caret kerns the pair, not the whole text (#2217)
2026-10-17 13:37:54 +07:00
BFlat 1686e6748e Merge pull request #2519 from vangel76/fix/2221-png-srgb
PNG export: an sRGB chunk marks the colours as sRGB (#2221)
2026-10-17 13:37:42 +07:00
BFlat d67290253d Merge pull request #2502 from vangel76/fix/2450-wayland-cursor-theme
Wayland: pointer returns over panels and menus after a tool cursor (#2450)
2026-10-17 13:37:17 +07:00
BFlat 4064ef8656 Merge pull request #2570 from dotCooCoo/fix/zoom-hint-test-language-race
Tests: a language one ui-egui test sets no longer translates the tests running beside it
2026-10-17 13:36:59 +07:00
BFlat ffd343f058 Merge pull request #2605 from dotCooCoo/fix/cli-test-stale-temp-folders
Tests: CLI tests do not fail on folders an earlier run left behind
2026-10-17 13:36:44 +07:00
BFlat 938fb5bce6 Merge pull request #2463 from dotCooCoo/fix/action-batch-wasm-unused-import
Lint: action_batch.rs compiles without an unused import on wasm32
2026-10-17 13:36:26 +07:00