Commit Graph
12808 Commits
Author SHA1 Message Date
dotCooCoo fecf724501 Smart Guides: Parametric Shape and Slice tools snap as the drawing tools do
The Parametric Shape tool's center and the Slice tool's corners snapped
with Smart Guides to the bounds of the art only, so View › Snap to Glyph
had no effect on them, and neither did the anchors and segments of
paths that the other drawing tools snap to. The point dragged out from a
Parametric Shape's center did not snap at all, and neither tool showed
Smart Guides while hovering before a press.

Both tools now snap through the drawing tools' shared snapping
(DrawSnap). A Parametric Shape's center (from a drag or a double-click),
the point dragged out from it, and a slice's corners land on glyph
guides and on path anchors and segments. The guides show while hovering
and during the drag. When a ruler guide then takes a slice corner, the
Smart Guides are no longer shown. A click with the Parametric Shape tool
still draws nothing when its center snaps a few pixels from the pointer.

Docs: docs/mcp.md, docs/target-app-parity.md.
2026-11-13 18:50:03 -08:00
BFlat 9fcfc81cc2 Merge pull request #7336 from dotCooCoo/fix/i18n-scan-gaps
i18n: the untranslated report checks the effects, map_err messages and schema phrases
2026-11-14 08:40:23 +07:00
BFlat c1efdbdaae Merge pull request #7255 from dotCooCoo/fix/folder-prefs-out-of-recorded-steps
Actions: keep folder preferences out of saved sets and confined replies
2026-11-14 08:40:15 +07:00
BFlat 5ccb284e34 Merge pull request #7335 from dotCooCoo/fix/live-paint-noop-undo
Live Paint: an edit that changes nothing records no undo step
2026-11-14 08:40:06 +07:00
BFlat bf3cf422e2 Merge pull request #7311 from dotCooCoo/fix/ai-graphs-keep-data
PDF/.ai import: graphs keep their data and settings when their records read whole
2026-11-14 08:39:57 +07:00
BFlat 99011cba0c Merge pull request #7288 from dotCooCoo/fix/task-bar-wraps-on-narrow-canvas
Contextual Task Bar: actions wrap onto more rows on a narrow canvas
2026-11-14 08:39:49 +07:00
BFlat 12117a48f9 Merge pull request #7324 from dotCooCoo/fix/edit-colors-no-change-undo
Edit Colors: no undo step when a recolor changes nothing
2026-11-14 08:39:40 +07:00
BFlat 3f7bbd4494 Merge pull request #7329 from dotCooCoo/fix/ruler-guides-nodes-one-pass
Guides: stripping and mapping ruler guides look at each child of a layer once
2026-11-14 08:39:32 +07:00
BFlat b0a2dfd448 Merge pull request #7309 from dotCooCoo/fix/de-message-rows
i18n: German has a row for 1,804 of the messages the untranslated report lists
2026-11-14 08:39:21 +07:00
BFlat 83ed754450 Merge pull request #7326 from dotCooCoo/fix/trace-jpeg-blocks
Image Trace: a JPEG's 8 x 8 blocks no longer trace as staircase steps
2026-11-14 08:39:13 +07:00
BFlat 6cc5dca69e Merge pull request #7315 from dotCooCoo/fix/it-message-rows
i18n: Italian translates 1,802 more status and error messages
2026-11-14 08:39:04 +07:00
BFlat c028cf6ab1 Merge pull request #7332 from dotCooCoo/fix/type-outlines-keep-appearance
Type: Create Outlines keeps the type object's own fills and strokes
2026-11-14 08:38:56 +07:00
BFlat e69fb10ff3 Merge pull request #7341 from dotCooCoo/fix/pt-br-message-rows
i18n: Brazilian Portuguese translates 1,812 of the status and error messages the untranslated report lists
2026-11-14 08:38:47 +07:00
BFlat 043e008194 Merge pull request #7196 from dotCooCoo/fix/item-4459
Brushes: strokes draw with the first of two brushes with one name
2026-11-14 08:38:40 +07:00
BFlat f336609146 Merge pull request #7339 from dotCooCoo/docs/linux-title-bar-frame
Docs: the Linux title bar paragraphs describe the frame the desktop draws
2026-11-14 08:38:32 +07:00
BFlat 71cef8ac8d Merge pull request #7214 from dotCooCoo/fix/i18n-select-a-path-reason
i18n: the "select a path" reason is translated in every complete-message language
2026-11-14 07:34:41 +07:00
BFlat 92d9604726 Merge pull request #7264 from dotCooCoo/fix/confined-svg-export-script-paths
MCP: SVG export by a confined caller refuses script links outside its read roots
2026-11-14 07:34:26 +07:00
BFlat 02f8a5ce88 Merge pull request #7317 from dotCooCoo/fix/app-bar-button-layout
Title bar: the app bar places its window buttons by the desktop's button layout
2026-11-14 07:34:18 +07:00
BFlat f14aa09bbf Merge pull request #7226 from dotCooCoo/fix/legacy-ai-type-kerning
PDF/.ai import: legacy type keeps manual kerning, discretionary hyphens and language
2026-11-14 07:34:10 +07:00
BFlat c79a21c8b7 Merge pull request #7320 from dotCooCoo/fix/graph-design-art-appearance
Graphs: Appearance and effect commands leave a design's art in a series out
2026-11-14 07:33:59 +07:00
BFlat 0c976db26c Merge pull request #7319 from dotCooCoo/fix/ai-wrap-options-saved
.ai save: the editing copy keeps text wrap Offset and Invert Wrap
2026-11-14 07:33:50 +07:00
BFlat 8009ea8e6d Merge pull request #7313 from dotCooCoo/fix/background-document-bounds
Type: a document replaced in the back measures its type when it is replaced
2026-11-14 07:33:42 +07:00
BFlat c6d580af4b Merge pull request #7280 from dotCooCoo/fix/colored-solid-faces-one-order-limit
3D: solid-color fills and strokes under colored lights draw their faces in one depth order
2026-11-14 07:33:34 +07:00
BFlat d8ae18c02f Merge pull request #7318 from dotCooCoo/fix/guides-layers-one-pass
Guides: removing and editing artboard guides visits each layer once
2026-11-14 07:33:26 +07:00
BFlat 80df489dde Merge pull request #7321 from dotCooCoo/fix/brush-wobble
Brushes: art along a smooth curve keeps smooth edges
2026-11-14 07:33:17 +07:00
BFlat 13abf355c6 Merge pull request #7323 from dotCooCoo/fix/trace-palette-flat-ground
Image Trace: a nearly flat dark ground keeps one color in a Limited palette
2026-11-14 07:33:05 +07:00
BFlat 239152b6c8 Merge pull request #7303 from dotCooCoo/fix/slanted-seam-tolerance
Area type: lines stop at a gap between slanted contours however narrow
2026-11-14 07:32:55 +07:00
dotCooCoo 40f69a1204 Docs: the Brushes panel lists the second brush of a repeated name in its own numbered row
Reading a brush library numbers the second brush of a repeated name, so
the panel's row of that name previews and drags the first brush, and the
second brush has a numbered row of its own.
2026-11-13 16:27:27 -08:00
dotCooCoo c6211b35ab Docs: the Linux title bar paragraphs describe the frame the desktop draws
docs/control-protocol.md said the window has no OS decorations on
Windows and Linux. On Linux and the BSDs the app bar is the title bar by
default only on a Wayland session without server-side decorations, such
as GNOME, in a window not opened through XWayland; elsewhere the desktop
draws the frame unless VectorCraft Title Bar on Every Desktop or
VECTORCRAFT_TITLEBAR=app turns the app frame on. The paragraph now says
so.

docs/development.md said the custom title bar is the Linux default. It
now says where the app bar is the default title bar. The comment on
CUSTOM_TITLEBAR in apps/vectorcraft/src/titlebar.rs made the same
Windows and Linux claim and now names Windows only.
2026-11-13 16:24:44 -08:00
dotCooCoo 64f80a5eb5 Tests: the Brushes panel lists the second brush of a repeated name as Twin 2
Reading a brush library now numbers the second and later brushes of a
repeated name, so the panel lists Twin and Twin 2 rather than two Twin
rows. The test expects those rows, and checks that rows of one name that
reach the panel unnumbered still preview and drag the first.
2026-11-13 16:17:57 -08:00
dotCooCoo d358baf9cc i18n: Brazilian Portuguese translates 1,812 of the status and error messages the untranslated report lists
pt-br is in COMPLETE_MESSAGES, but the untranslated report listed 1,851
status and error messages with no pt-br row, so with the interface in
Brazilian Portuguese those messages showed in English.

- pt-br.tsv gains 1,812 `@msg` rows. The translations are VectorCraft's
  own, written from the English meaning with the catalog's terms.
  Placeholders, backticked names, command ids, parameter names,
  double-quoted values and bare true, false and null stay as the English
  writes them.
- The 39 messages that open #7211, #7214, #7116 and #7330 add pt-br rows
  for are left out. bundled_catalogs_are_consistent rejects a second row
  for the same key.
- The Portuguese row of docs/localization-parity.md gives the catalog's
  counts: 9,260 rows, 3,445 of them `@msg` and 48 `@msgplural`.
2026-11-13 16:13:53 -08:00
dotCooCoo c0e70819f4 i18n: the untranslated report checks the effects, map_err messages and schema phrases
The untranslated report missed messages that reach the status bar:

- MESSAGE_CRATES now includes effects, color, render, three-d and pathops,
  whose errors the engine and the effects pass on (SVG filters, swatch
  libraries, raster sizes and encoders, 3D solids, path operations).
- The scan reads the messages a .map_err closure returns, from each if
  branch, match arm and the last expression of a block, the messages of
  a handler that .map_err(name) names (a closure bound with let, or a
  function), and the message given to a variant of an enum whose name
  ends in Fail (CompileFail::Syntax). The steps of a script result's
  path ([{i}]{place}, .{k}{place}) are not messages.
- The report and the VECTORCRAFT_I18N_DUMP_MESSAGES dump include the
  phrases a parameter schema's error builds at run time (SCHEMA_PHRASES).

Missing translations stay report-only. On main at 0b29b2b1f6 the report
lists 126 more messages, missing in all 23 languages that translate
every message: 43,084 missing rows before, 45,983 after.
2026-11-13 16:06:26 -08:00
dotCooCoo d5509c3b6c Guides: stripping and mapping ruler guides look at each child of a layer once
Node::strip_ruler_guides and Node::map_ruler_guide_positions asked a
layer whether its whole subtree held a ruler guide, then asked each
sublayer the same question again when filtering the children and again
when the recursive call started. A layer nested d deep was tested
2d + 1 times, so a chain of N layers cost about N^2 layer tests.

strip_ruler_guides runs when a document's objects are placed or pasted
(Clipboard::from_document), when a copy of the document is saved
(Document::guides_to_saved) and when a temporary editing layer is
removed (Document::remove_edit_layer). map_ruler_guide_positions runs
when an imported EPS is scaled.

A new held_guides reads the layer once and records which children are
ruler guides and which sublayers hold one; strip_held and map_held then
visit and copy only those sublayers. The guides removed, the order f is
called in, the art and its order, and the sharing of layers without a
guide are the same as before. Neither method records an undo step.
2026-11-13 15:58:43 -08:00
dotCooCoo 9a355b1a75 i18n: German leaves out the rows #7211, #7214 and #7116 add
Open #7211, #7214 and #7116 add German rows for 38 of the messages this
branch translates. A second row for the same key fails
bundled_catalogs_are_consistent once both sides merge, so this branch
drops its 38 rows and leaves those messages to the other pull requests.
The German lines in docs/localization-parity.md and
docs/target-app-parity.md give the new counts.
2026-11-13 15:58:36 -08:00
dotCooCoo dd411ec6b4 Image Trace: a JPEG's 8 x 8 blocks no longer trace as staircase steps
A JPEG rounds each 8 x 8 block's tone on its own, which leaves a small
step at every block edge. Where a dark ground changes slowly, those steps
decided which of two palette colors a whole block got, and the trace
followed the block edges as a staircase.

The new deblock pass finds the block grid in the image: the mean step
between neighboring opaque pixels must peak at the same one of eight
positions at both block edges of a 16 px span, across and down. Cropped
JPEGs and JPEGs saved in another format are found the same way; pictures
of flat 8 x 8 cells are not. At each block edge, a stretch of eight lines
whose step is under the limit and whose pixels hold no edge has the step
spread over the eight pixels around the edge, as the deblocking filters
of ITU-T H.263 Annex J and MPEG-4 Part 2 Annex F.3.1 do. Larger steps are
kept. The limit, the edge guard and how much of each line's own step is
smoothed depend on the mode: Black and White smooths only the smallest
steps, and traces of more than 16 colors move every line of a stretch
by the same amount. The pass runs before the photo pre-filter and works
in strips of rows, so only its output is as large as the image.
2026-11-13 15:47:30 -08:00
dotCooCoo 76d99d6afb Merge main into fix/ai-graphs-keep-data 2026-11-13 15:46:07 -08:00
dotCooCoo c477db87ba Live Paint: an edit that changes nothing records no undo step
A Live Paint Bucket click or drag over faces that already have the
fill, a stroke on an edge that already has the paint and width, Gap
Options with the options the groups have and no gap to close, and Make
or Merge given one Live Paint group alone now leave the document, the
undo and redo steps and the saved state as they are, and reply as
usual. Such a fill or stroke also leaves the recent colors as they are.

Gap Options with Close Gaps With Paths makes a group's faces again only
when it adds a path or what paint stops at changes, so the faces keep
their ids otherwise.
2026-11-13 15:39:04 -08:00
dotCooCoo a8a0316da7 Type: Create Outlines keeps the type object's own fills and strokes
Type > Create Outlines dropped the fills and strokes of the type object
itself (the items around the Appearance panel's Characters row), so the
outlines no longer drew what the type drew. On type without effects of
its own, Object > Expand outlines the type with the same command, so it
lost them before Fill or Stroke could expand them.

- Create Outlines puts those items on paths of the type's whole outline:
  the items below the Characters row on one path under the glyph paths,
  the others on one path over them, in their order. Unplaced gradients
  are fixed to the type's layout box, as the canvas paints them.
- object.expand.info reports the type object's own strokes, pattern
  fills and gradient fills, measuring a gradient on the whole outline.
  It counts them only when the type has an outline: type of only spaces
  reports none of them.
- The stroke flag of object.expand.info counts every stroke Outline
  Stroke outlines, not only the topmost one, for paths as well as type.
  Expand skipped Stroke for a visible stroke under a stroke with no
  paint.

Create Outlines still does not carry over the type object's own effects.

Docs: docs/mcp.md, docs/target-app-parity.md.
2026-11-13 15:39:04 -08:00
dotCooCoo 9484b116ab Tests: screen-mode drags and popups start clear of the task bar
In Full Screen Mode with Menu Bar and Full Screen Mode the canvas is
about 390 pt wide, so the Contextual Task Bar under the selected
rectangle now wraps onto a second row and covers the canvas's center.
The middle-button pan, hand, zoom and context menu tests pressed there
and reached the bar instead of the canvas. They now press low on the
canvas, at a point the helper checks is clear of the bar.
2026-11-13 15:31:04 -08:00
dotCooCoo 71fab5bd81 Merge main into fix/it-message-rows 2026-11-13 15:30:48 -08:00
dotCooCoo 9594d39bd5 Edit Colors: no undo step when a recolor changes nothing
Invert Colors, the Convert to commands, Saturate, Adjust Color Balance,
the Blend commands and Recolor Artwork recorded an undo step even when
they changed no color, for example Invert Colors with fills and strokes
off, Saturate at 0 or a second Blend Front to Back. The empty step also
cleared the redo steps. paint.invert and paint.complement on whole
objects, Apply as Filter (addon.color.filter) and Apply Nearest Swatch
run the same pass and did the same.

These commands now run on a copy of the document and record the step
only when something changed. Convert to Indexed Color uses the same
helper. Recolor Artwork also compares the documents when it counted no
recolored paint, so rewriting a color group's swatches still records
its step.
2026-11-13 15:29:04 -08:00
BFlat 0b29b2b1f6 Merge pull request #7267 from dotCooCoo/fix/doc-info-values-translated
Document Info: values show in the interface language
2026-11-14 06:27:27 +07:00
BFlat 4a0f4b924e Merge pull request #7305 from dotCooCoo/fix/one-anchor-edit-no-remeasure
Path: anchor edits on a long selected path skip measuring it for the canvas check
2026-11-14 06:27:14 +07:00
BFlat b6fb2212c4 Merge pull request #7308 from dotCooCoo/fix/canvas-range-guides-one-pass
Canvas range: removed guides are looked up through sets, and nested layers are walked once
2026-11-14 06:27:05 +07:00
BFlat 26de97ee06 Merge pull request #7299 from dotCooCoo/fix/type-commands-thread-lookup
Type: thread checks look up the threads once per command
2026-11-14 06:26:56 +07:00
BFlat f6e84df143 Merge pull request #7306 from dotCooCoo/fix/path-type-rtl-fit
Type on a path: overflowing right-to-left type shows the longest start that fits
2026-11-14 06:26:48 +07:00
BFlat efba8bfd89 Merge pull request #7295 from dotCooCoo/fix/negative-wrap-offset
Text Wrap: a negative Offset lets text run into the wrap object
2026-11-14 06:26:39 +07:00
BFlat be1810e0c9 Merge pull request #7263 from dotCooCoo/feat/smooth-free-end-tangent
Smooth tool: an open path's end turns with the smoothing when a drag reaches it
2026-11-14 06:26:31 +07:00
BFlat 6fa41d4f76 Merge pull request #7304 from dotCooCoo/fix/graph-series-object-opacity-other-commands
Graphs: Global Edit, Randomize Opacity and Sort Objects keep what they give a series
2026-11-14 06:26:22 +07:00
BFlat 2beda0487e Merge pull request #7251 from ncic/snap-labels
Snap to Point draws no Smart Guides labels or lines with Smart Guides off
2026-11-14 06:26:14 +07:00