Commit Graph
4727 Commits
Author SHA1 Message Date
Dylan M. Taylor 0f7156169b ci: add sonar-project.properties to use CI-based analysis
Presence of this file marks the project ineligible for SonarCloud Automatic
Analysis, resolving the CI-vs-automatic-analysis conflict.
2026-10-21 15:56:13 -04:00
Dylan M. Taylor a4c21343bb ci: add SonarCloud scan via shared reusable workflow
Calls storytold/craft-common-actions/.github/workflows/sonarcloud.yml@main
with secrets: inherit. Adds SonarCloud badge to README where missing and
removes the redundant sonar-project.properties (config now passed by the
reusable workflow).
2026-10-21 15:47:07 -04:00
BFlat 8a48680ad2 Merge pull request #3457 from nrq6993-a11y/stream/vc-issue-3446-expand-stroke-round-caps
Expand stroke: compact plain stroke spines before outlining
2026-10-22 02:31:43 +07:00
bflatastic dd2f5da98c Expand stroke: compact plain stroke spines before outlining
Squashed from #3457 onto main.
2026-10-22 02:21:59 +07:00
BFlat 19c7d61f8a Merge pull request #3460 from dotCooCoo/fix/live-paint-tools-skip-hidden-faces
Live Paint: the Live Paint tools and livePaint.fill skip hidden faces
2026-10-22 02:12:20 +07:00
BFlat 9effb4e44e Merge pull request #2520 from vangel76/fix/2170-recolor-model
Recolor: recolor.apply takes a model option for the new colour's model (#2170)
2026-10-22 02:12:09 +07:00
dotCooCoo 4bd55029e8 Live Paint: the Live Paint tools and livePaint.fill skip hidden faces
A face hidden on its own (for example with Object > Hide after Live
Paint Selection picks it) while its Live Paint group stays visible was
still highlighted, selected by Live Paint Selection and filled by the
Live Paint Bucket, and it kept the face of a group behind it from being
picked.

live_paint_at and lp_part_at now take the front-most face that is not
hidden (visible_face_at). A point on a hidden face falls through to the
visible face of a group behind it; where there is none, an edge pick
takes the nearest visible edge as it does outside the faces.
livePaint.fill also skips hidden faces. With group, a point on a hidden
face is an error. With ids, it fills the face there of another Live
Paint group among the objects, or else fails and does not merge the
group.

Docs: docs/mcp.md.
2026-10-22 02:01:58 +07:00
bflatastic 62776d5f46 Recolor: recolor.apply takes a model option for the new colour's model (#2170)
Squashed from #2520 onto main.
2026-10-22 02:01:57 +07:00
BFlat 44104b67ca Merge pull request #3456 from nrq6993-a11y/stream/vc-featD-g4-snap-to-glyph-parity
G4: Mark Snap to Glyph done in parity docs and test the menu toggle
2026-10-22 01:35:37 +07:00
BFlat e2d75c7ba6 Merge pull request #3174 from KaboomFox/p8-filter-effects
Plug-ins: filters read and set effects and stroke styles (G17)
2026-10-22 01:35:21 +07:00
Cursor Agentandnrq6993-a11y 59f4b753dd G4: mark Snap to Glyph done in parity docs and test the menu toggle
## Summary
Aligns parity checklists with shipped View › Snap to Glyph behaviour (#3124):
when Smart Guides are on, drawing tools snap to live-text baselines and glyph
bounds via `view.snapToGlyph`. Adds a headless test that `view.snapToGlyph`
toggles the UI view flag like Illustrator’s menu item.

## Tests
- `vectorcraft-ui-egui`: `snap_to_glyph_menu_command_toggles_the_view_flag`
- Existing `tools::text_tests::snap_to_glyph_lines_up_new_point_type_with_a_baseline`

Part of gap G4

Co-authored-by: nrq6993-a11y <nrq6993-a11y@users.noreply.github.com>
2026-10-22 01:25:51 +07:00
Louise FoxandClaude Opus 5.5 8bc117eb8b Plug-ins: doc comments for the functions the filter changes touch
The docstring check of the review counts the functions a pull request
touches: effect.apply, effect.setParams, plugin.run, the line cap
name, the reader of an output object and seven of the object tests had
no doc comment. Each now says what it does or checks; the join and cap
names get one each.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HhvnnnD5fTFupK8WWq35un
2026-10-22 01:25:51 +07:00
Louise FoxandClaude Opus 5.5 78105cc695 Plug-ins: filters read and set effects and stroke styles (G17)
A filter could reshape and repaint objects, but not set the stroke's
join, cap or miter limit, nor the effects an object's appearance holds.
A tool that prepares objects for a live effect (a sheet of samples,
each with the effect at its own settings) had to leave the user to
apply the effect to each object by hand.

- Each input stroke has its join, cap and miterLimit beside its paint
  and width (live effects get the same, through the shared encoder),
  and each object its own effect records, {id, params, visible}.
- An output stroke may set them (miter limit clamped to 1-500), and an
  output object's "effects" replaces its own effects.
- The host admits each record as effect.apply does: an effect that
  effect.list lists or an installed live-effect plug-in, parameters it
  takes (filled in to their defaults; a plug-in's checked against its
  manifest), one 3D effect that fits the object (its fills' and
  strokes' own effects counted), and the texture of an effect with
  Load Texture (Glass, Texturizer) as the effect stores it, never a
  file to read. A record the object already had stays as
  it is, so a filter that hands its input back changes nothing. One
  refused record refuses the whole output and the document stays as
  it was.

The plug-ins crate checks the records' form; which effects exist is the
engine's to say (objects::AdmitEffects, engine plugin::admit_effects).
effects::validate_three_d is the one check of whether a 3D effect fits
an object, for effect.apply, effect.setParams and the filters.

A path handed back as it was now stays the live shape it was: write()
dropped a live rectangle's or ellipse's parameters whenever the output
held a path, changed or not, so a filter that returned its input
turned a live rectangle into a plain path.

objects/tests.rs checks the round trip, stroke styles on existing and
new strokes, the host's refusal, the bad forms refused, and a live
rectangle handed back unchanged (a plain path before the fix);
tests_plugins.rs runs filters that set a built-in and a plug-in effect,
an echo that changes nothing, and six refused outputs.
CRAFT_PLUGIN_FRAME_WASM=<folder> saves a test filter to try in the app.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HhvnnnD5fTFupK8WWq35un
2026-10-22 01:25:50 +07:00
BFlat ff021918a6 Merge pull request #3096 from nrq6993-a11y/stream/vc-feat3-g2-artistic-fresco
G2: Effect › Artistic › Fresco raster filter
2026-10-22 01:25:22 +07:00
BFlat 45f806d307 Merge pull request #3010 from nrq6993-a11y/stream/vc-feat1-g2-sketch-torn-edges
G2: Effect › Sketch › Torn Edges raster filter
2026-10-22 01:25:06 +07:00
BFlat fe71ee2d75 Merge pull request #3399 from nrq6993-a11y/stream/vc-featD-manual-tate-chu-yoko
Character panel Tate-chu-yoko marks vertical type as a horizontal block
2026-10-22 01:24:50 +07:00
bflatastic 74ec2751ed Docs: Photoshop filter count after Fresco and Torn Edges (54/57), one row each 2026-10-22 01:15:10 +07:00
bflatastic eb9e064254 G2: Effect › Artistic › Fresco raster filter
Squashed from #3096 onto main.
2026-10-22 01:15:09 +07:00
bflatastic 5925e6339a G2: Effect › Sketch › Torn Edges raster filter
Squashed from #3010 onto main.
2026-10-22 01:06:25 +07:00
bflatastic b45bb3dd54 Character panel Tate-chu-yoko marks vertical type as a horizontal block
Squashed from #3399 onto main.
2026-10-22 01:06:24 +07:00
BFlat 875f98d211 Merge pull request #3453 from lehni/update/canvas-upload
Canvas: each update copies the rendered frame whole instead of pixel by pixel
2026-10-22 01:06:01 +07:00
BFlat c21ac5ca02 Merge pull request #3452 from nrq6993-a11y/stream/vc-feat-3343-pmd-unsupported
3343: recognize PageMaker .pmd on open with a clear message
2026-10-22 01:05:39 +07:00
BFlat 3987fdfca7 Merge pull request #3063 from nrq6993-a11y/stream/vc-feat1-g2-pathfinder-soft-mix
G2: Effect › Pathfinder › Soft Mix blends overlapping CMYK fills
2026-10-22 01:05:23 +07:00
BFlat 9439087946 Merge pull request #3412 from nrq6993-a11y/stream/vc-featD-g4-system-layout
G4: System Layout spaces every text object in whole points
2026-10-22 01:05:06 +07:00
Jürg Lehni a92f0264c2 Canvas: each update copies the rendered frame whole instead of pixel by pixel
The renderer's pixels and egui's are both premultiplied RGBA8, so color_image copies the bytes in one go. At 3456×2234 that takes 0.9 ms instead of 3.4 ms per update, at 5120×2880 1.6 ms instead of 6.8 ms. Every rendered image the UI shows (canvas, thumbnails, previews) goes through it.
2026-10-22 00:54:44 +07:00
Cursor Agentandnrq6993-a11y 1824829931 #3343: recognize PageMaker .pmd on open with a clear message
## Summary
Opening or placing a .pmd file now fails with a dedicated unsupported-format
hint (like DWG and PICT), telling users to export PDF or EPS from PageMaker
instead of a generic unknown-format error. document.formats lists PageMaker
in its unsupported table.

## Tests
- formats_list_dxf_and_what_can_not_be_written
- dwg_and_pict_say_what_to_use_instead (includes brochure.PMD open)

Part of storytold/vectorcraft#3343

Co-authored-by: nrq6993-a11y <nrq6993-a11y@users.noreply.github.com>
2026-10-22 00:54:43 +07:00
bflatastic a5c0c29b25 G2: Effect › Pathfinder › Soft Mix blends overlapping CMYK fills
Squashed from #3063 onto main.
2026-10-22 00:54:43 +07:00
bflatastic adbe0566a6 G4: System Layout spaces every text object in whole points
Squashed from #3412 onto main.
2026-10-22 00:54:43 +07:00
BFlat 675b759a37 Merge pull request #2708 from dotCooCoo/fix/i18n-scan-reads-bad-messages
i18n: the message scan reads errors made with bad() and error variants, and new ones need rows
2026-10-22 00:51:36 +07:00
BFlat d58888a95c Merge pull request #3028 from nrq6993-a11y/stream/vc-feat3-g2-artistic-colored-pencil
G2: Effect › Artistic › Colored Pencil raster filter
2026-10-22 00:51:06 +07:00
BFlat e0bef14664 Merge pull request #3415 from lehni/fix/path-type-rtl-overflow
Type on a path: right-to-left text that overflows shows its start
2026-10-22 00:50:49 +07:00
dotCooCoo a3e7dc9e41 i18n: the message scan reads errors made with bad() and error variants, and new ones need rows
complete_languages_translate_every_message read a message literal only
right after a marker such as Err( or Other(. It did not read the
message given to the engine's bad(cmd, ...), so this test did not
require a row for a parameter error. It also did not read the messages
given to the engine's err() and error(), to the PDF writer's bad() and
failed(), or to an error enum's variant such as PsError::Limit(...).
1,122 of these messages have no row in any complete catalog.

The scan now reads those messages, a literal or a format! string, in
the same template form as the catalogs' rows. It skips PsError::Ps and
EngineError::UnknownCommand, whose first argument is a PostScript error
name or a command id. The 1,122 messages are listed in
untranslated_messages.txt next to the tests, together with the 71 that
pull requests open at 009384b add without rows, and the test lets a
listed message through whether or not it has rows. Every other message
needs a row in each complete catalog, so a new message made this way
fails the test until it has its rows.
VECTORCRAFT_I18N_DUMP_UNTRANSLATED=<file> writes the messages in the
sources that lack a row. No catalog rows change.

Docs: docs/development.md, docs/localization-parity.md.
2026-10-22 00:40:10 +07:00
BFlat f381513cbe Merge pull request #3044 from nrq6993-a11y/stream/vc-feat3-g2-artistic-rough-pastels
G2: Effect › Artistic › Rough Pastels raster filter
2026-10-22 00:38:27 +07:00
BFlat f5011c7454 Merge pull request #3035 from nrq6993-a11y/stream/vc-feat3-g2-artistic-underpainting
G2: Effect › Artistic › Underpainting raster filter
2026-10-22 00:38:11 +07:00
BFlat ab9b054164 Merge pull request #3032 from nrq6993-a11y/stream/vc-feat3-g2-artistic-paint-daubs
G2: Effect › Artistic › Paint Daubs raster filter
2026-10-22 00:37:54 +07:00
BFlat cb84ffcfa1 Merge pull request #3038 from nrq6993-a11y/stream/vc-feat3-g2-artistic-palette-knife
G2: Effect › Artistic › Palette Knife raster filter
2026-10-22 00:37:37 +07:00
bflatastic 0c9a7a89a0 Docs: Photoshop filter count after Colored Pencil (52/57), one Artistic row 2026-10-22 00:31:30 +07:00
bflatastic 03a2da13ba G2: Effect › Artistic › Colored Pencil raster filter
Squashed from #3028 onto main.
2026-10-22 00:30:39 +07:00
Jürg Lehni 83a5978d6e Type on a path: right-to-left text that overflows shows its start
Its glyphs were put in visual order and then cut where the path ran out, which kept the text's end. Now the longest start of the text, in reading order, whose glyphs fit in visual order is laid out, as area type does with each line it breaks, by the same rules that place the line: steps where the glyphs sit, hanging punctuation and the path beyond the brackets.
2026-10-22 00:30:08 +07:00
BFlat c6677df848 Merge pull request #2853 from dotCooCoo/feat/load-variable-library
Variables: Load Variable Library… reads a variable library's text variables and data sets
2026-10-22 00:28:05 +07:00
BFlat d783e1565c Merge pull request #3431 from addibble/feat/ui-egui-bundled-fonts-feature
Text: an embedder of the egui panels may leave the bundled fonts out
2026-10-22 00:27:48 +07:00
BFlat 56235323a1 Merge pull request #3417 from KnottyDyes/squad/pdf-import-tracked-text
PDF import: letter-spaced text keeps its word spaces
2026-10-22 00:27:36 +07:00
BFlat 322b4852e2 Merge pull request #3428 from dotCooCoo/fix/commands-refuse-booleans-and-numbers-as-text
Commands: a boolean or number given as text is refused
2026-10-22 00:27:17 +07:00
BFlat ebce8f12df Merge pull request #3448 from midasdf/jp/ruby
Type: ruby (ふりがな) for live text
2026-10-22 00:26:59 +07:00
BFlat 76b6d31646 Merge pull request #3442 from alpha-rock/feature/3d-light-presets
Add lighting presets to 3D effects
2026-10-22 00:26:40 +07:00
BFlat 52a94d5a84 Merge pull request #3445 from dotCooCoo/feat/docinfo-repeat-objects
Document Info: a Repeat Objects category lists the document's repeats
2026-10-22 00:26:22 +07:00
BFlat 4408e9fedb Merge pull request #3430 from addibble/feat/properties-clip-group-quick-actions
G1: Properties: Edit Clipping Path and Edit Contents for one clip group
2026-10-22 00:26:05 +07:00
BFlat 0756fb0948 Merge pull request #2970 from nrq6993-a11y/stream/vc-issue-2178-pathfinder-ungroup
Fix #2178: Pathfinder Unite groups disconnected islands for Ungroup
2026-10-22 00:25:33 +07:00
bflatastic 3c6d2b371e Docs: Photoshop filter count after the Artistic batch (51/57) 2026-10-22 00:23:51 +07:00
bflatastic 695f7c0d4b G2: Effect › Artistic › Underpainting raster filter
Squashed from #3035 onto main.
2026-10-22 00:23:50 +07:00