Commit Graph
3428 Commits
Author SHA1 Message Date
dotCooCoo db2bbcf405 Images: sampling and recoloring check an image's RGBA size without overflowing
Before the Eyedropper samples an image, or Edit Colors, Recolor Artwork
or a color adjustment effect recolors an embedded one, `rgba_within` reads
the image's size from its header and checks its size as RGBA against the
allowance. The check multiplied width × height × 4 in 64 bits. A TIFF's
sides go up to 2^32 - 1 pixels, so a header of 2^31 × 2^31 pixels
overflowed that product: debug and test builds panicked with "attempt to
multiply with overflow", and release builds wrapped it to 0 before the
decoder's own 512 MB limit refused the image.

The check now compares width × height with the allowance divided by 4.
Every size whose RGBA bytes fit in 64 bits gets the same answer as
before, and a larger one is refused.
2026-10-17 12:48:19 +07:00
dotCooCoo 9bee299dd5 Render: an export no longer warns about images another thread could not decode
A raster export compared the process-wide count of images that could
not be decoded before and after it drew, and warned that "an image
couldn't be decoded and is missing from the picture" when the count
rose. Any other thread that failed to decode an image in that time
raised the count too: a second export, the UI thread drawing the
canvas, or the canvas, thumbnail and placed-document workers drawing a
document with such an image. The export then warned about an image it
does not contain. In the engine's tests,
options_not_applied_yet_and_document_features_warn failed in 5 of 60
runs of the tests_raster and tests_pdf* tests.

The count is now kept per thread. An export reads it on the thread it
draws on. That thread decodes every image the export draws that is not
already in the shared image store, and an image that failed to decode
is never stored.
2026-10-17 12:48:19 +07:00
dotCooCoo 0f987812b0 Render: check an image's RGBA size before decoding it
The renderer decoded each image within its 2 GB allowance (512 MB in
the web build) and then converted it to RGBA. The decoder holds the
decoded image, before conversion, to that allowance, so an image stored
with fewer than four bytes a pixel (gray, 1-bit, gray with alpha, or
RGB without alpha) could take up to four times as much (4/3 times for
RGB) once converted, and as much again as the pixmap drawn from it.

The renderer now reads the image's size from its header first. When
width × height × 4 is over the allowance it does not decode the image
and handles it as one it can't decode: the renderer draws nothing for
it, and a raster export warns that an image is missing. Images within
the allowance are decoded and drawn as before.
2026-10-17 12:48:19 +07:00
BFlat 49bdc5cdd4 Merge pull request #1510 from marcoarnulfo/fix/ai-layers-collapsed
Layers: a .ai another app wrote opens with its top-level layers closed, as its groups
2026-10-17 12:46:37 +07:00
BFlat 7a8387f467 Merge pull request #1365 from Messhias/feat/394-highlight-alternate-glyphs
Part of #394: Highlight Alternate Glyphs paints pink behind OpenType substitutions
2026-10-17 12:46:18 +07:00
BFlat 12758df31f Merge pull request #2334 from bobtherobot/feat/tool-cursors
Cursors: 36 more tool states get cursors of their own, listed in cursors.toml
2026-10-17 12:46:03 +07:00
BFlat a76faaa21f Merge pull request #2393 from pechnikov2026-star/i18n-nl-da-hi-id
i18n: add Dutch, Danish, Hindi and Indonesian interfaces
2026-10-17 12:45:46 +07:00
BFlat 21a9da7360 Merge pull request #2379 from dotCooCoo/fix/macos-save-format-menu
Fix #866: macOS save sheets have a Format menu again
2026-10-17 12:45:28 +07:00
Marco Arnulfo f31d91bf1a Layers: a .ai another app wrote opens with its top-level layers closed, as its groups (fixes #1475) 2026-10-17 12:26:14 +07:00
bflatastic 52771905e6 Part of #394: rustfmt the alternate-glyph test 2026-10-17 12:26:14 +07:00
Fabio William Conceição 0ffe0c7c0e Part of #394: Highlight Alternate Glyphs defaults to off. 2026-10-17 12:26:13 +07:00
Fabio William Conceição 8689863fbf Part of #394: Highlight Alternate Glyphs paints pink behind OpenType substitutions. 2026-10-17 12:26:13 +07:00
Michael GiesonandClaude Opus 5.5 2d0da1472f Cursors: 36 more tool states get cursors of their own, listed in cursors.toml
Node editing as the public manual describes it: Direct Selection's anchor squares (hollow
or filled), Reshape Segment over a curved segment, Group Selection's plus (also Direct
Selection with Alt), the arrow hollow while a drag snaps, and Alt-copy arrowheads. The
Anchor Point caret, the Curvature pen and Free Transform's side-shear arrows (ShearH,
ShearV) are drawn in code. Lasso, the freehand, symbolism and other tools return cursors
of their own that borrow their old look until drawn (Cursor::stand_in).

crates/tools/src/cursors.toml lists every Cursor value, when it shows and its hotspot,
for whoever draws them; `cargo xtask cursors` (in ci) warns about a missing, unknown,
repeated or incomplete entry and never fails. The busy cursor is listed as missing (G1).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-17 12:26:12 +07:00
sanches 816097c6bf i18n: add Dutch, Danish and Indonesian interfaces
Complete catalogs for nl, da and id, registered with their locales. Hindi from the same PR waits for a Devanagari UI font decision (with Lao and Georgian), and the strings main gained since the catalogs were written are added.
2026-10-17 12:26:11 +07:00
dotCooCoo 1d7ad173aa Fix #866: macOS save sheets have a Format menu again
On macOS, the save sheets of Save As, Save a Copy and the first Save of
a new document have a Format menu again, and the Save as Template sheet
now has one too. The panel is an NSSavePanel built in
apps/vectorcraft/src/mac_save_format.rs, and the menu is its accessory
view, set before beginSheetModalForWindow:completionHandler: shows the
sheet. The menu from #1235 was added after rfd had begun the sheet, and
recent macOS versions dismissed the sheet at once (#1800, #1831,
#1518); #1855 removed it.

Choosing a format changes the extension in the name field and puts
that format's extension first in the allowed file types, which AppKit
adds to a name typed without one. A name typed with another listed
extension is saved in that format. Save panels with one file type and
the open and folder panels are still shown by rfd.

Docs: docs/target-app-parity.md, docs/ui-parity.md.
2026-10-17 12:26:10 +07:00
BFlat 8bc6532928 Merge pull request #2399 from storytold/pr/release-0.12.0
Release: VectorCraft v0.12.0
v0.12.0
2026-10-16 18:28:18 +07:00
bflatastic 4791c88809 Release: VectorCraft v0.12.0
What's new for users since v0.11.0:

- A restyled interface: Medium Dark with a coral accent by default, a choice
  of accent colours, and a Classic colour scheme (User Interface › Color
  Scheme) with the neutral greys of earlier versions.
- New tools and commands: Object › Intertwine and the Intertwine tool, the
  Dimension tool, Export for Screens name patterns, folders and presets,
  File › Automate › Batch, Sample Color from Screen, Release Guides into
  paths, Update Selection, Rotate View to Selection and Rotate View presets,
  Outline Object, the Halftone Pattern effect, canvas scroll bars, the
  Hyphenation dialog, Legacy .ai export and portable mode on Windows.
- Canvas editing: the ellipse pie widget, the Shaper Group arrow, E for an
  enclosed marquee, Unlock from a right-click on locked objects, Blob Brush
  Keep Selected and Merge Only with Selection, Simplify's angle threshold and
  straight lines, Distribute with a spacing from a key object, and Ctrl/Cmd+
  Enter for proportional W and H.
- Type: font size steps of five, reset horizontal scale, reset tracking and
  kerning, Align Stroke on live type, and Find and Replace that keeps
  paragraph styles.
- Variables: image and graph variables, data set CSV import and export.
- Import: many .ai, EPS and PDF fidelity fixes (images, gradients, meshes,
  patterns, layers, File Info), damaged PDFs no longer crash the importer,
  and .ai, .ait and .svgz files copied in a file manager paste as art.
- Image Trace keeps tiny parts, thin outlines, shared corners and junctions,
  and Noise no longer splits merged regions.
- MCP: draw_path and draw_shape as batch steps with dashes, caps and effects,
  and command listings filtered by query and menu.
- Languages: Swedish, Finnish, Greek and Bulgarian, and Brazilian Portuguese
  completed.
- Windows: a graphics driver crash leaves that adapter out at the next start,
  and a maximized window stays clear of the taskbar.
2026-10-16 18:28:02 +07:00
BFlat 06b33b0d2d Merge pull request #2385 from dotCooCoo/fix/hidden-widgets-ignore-clicks
Hide Edges: the hidden bounding box, type widget and corner widgets do not answer the pointer
2026-10-16 16:13:37 +07:00
BFlat 4664907fdc Merge pull request #2386 from dotCooCoo/feat/release-ruler-guides
Guides: Release Guides turns selected ruler guides into paths
2026-10-16 16:13:22 +07:00
dotCooCoo 35b9d5a645 Hide Edges: the hidden bounding box, type widget and corner widgets do not answer the pointer
With View › Hide Edges on, the canvas does not draw the bounding box,
the type widget beside it or the Live Corners widgets, but the
selection tools still answered the pointer on them. A press on a hidden
corner widget rounded the corners, a drag from a hidden handle scaled
the selection, a double-click on the hidden type widget converted the
type, and the cursor changed over each of them.

While edges are hidden, the app now tells the tools that the bounding
box and the corner widgets are off. A press at their places reaches the
art or the canvas under them.

Docs: docs/target-app-parity.md.
2026-10-16 16:07:22 +07:00
dotCooCoo 18b472092e Guides: Release Guides turns selected ruler guides into paths
View › Guides › Release Guides only cleared the guide flag on paths
made with Make Guides. Ruler guides could not become paths by any
route, and with only ruler guides selected the command released every
guide path in the document instead.

Release Guides now also releases the selected ruler guides. Each one
becomes an open straight path with no fill or stroke at the top of the
guide's layer: an artboard guide runs across its artboard, and a
canvas guide runs across the bounds of all the artboards. The ruler
guide is deleted, the released paths are selected, and the release is
one undo step. With no guide selected, every guide path is released,
as before.

view.guides.release takes index (a ruler guide) and ids (guide paths,
and the guide paths inside them). Both are refused while guides are
locked, and index takes only a guide on a shown, unlocked layer.

Docs: docs/mcp.md, docs/target-app-parity.md.
2026-10-16 16:07:21 +07:00
BFlat 32a3362e7b Merge pull request #1319 from FredApps/fix/dxf-closed-spline-1299-20261012
Preserve explicit closed flags in DXF SPLINE export
2026-10-16 15:55:05 +07:00
BFlat 4bb469563b Merge pull request #1406 from marcoarnulfo/feat/portable-mode
Portable mode: a portable.txt beside the executable keeps the settings in VectorCraftData (#1366)
2026-10-16 15:54:48 +07:00
BFlat d59733937a Merge pull request #2348 from Gamedirection/feat/batch-export
Export for Screens: batch exporting with name patterns, folders and presets (#1935)
2026-10-16 15:54:32 +07:00
BFlat 1799fa533e Merge pull request #2310 from dotCooCoo/feat/hyphenation-options
Paragraph: the Hyphenation dialog sets each paragraph's hyphenation limits
2026-10-16 15:54:14 +07:00
BFlat b32017d44f Merge pull request #2197 from turtwig/artboard-edit-fixes
Artboard editing: fit on double-click, rename on the canvas, and highlight the active artboard
2026-10-16 15:54:00 +07:00
BFlat 0c9b65c931 Merge pull request #1368 from andeecollard/fix/trace-noise-regions
Fix Image Trace Noise splitting previously merged regions
2026-10-16 15:53:44 +07:00
BFlat 2d230dc31a Merge pull request #2205 from andeecollard/fix/trace-junction-returning-pieces
Image Trace: retain pieces returning to a junction
2026-10-16 15:53:29 +07:00
BFlat c06c794e5a Merge pull request #2297 from switch87/stroke-align-type-2294
Fix #2294: Align Stroke inside or outside on live type
2026-10-16 15:45:55 +07:00
BFlat 143e4d78e7 Merge pull request #2308 from dotCooCoo/feat/print-overflow-warning
Print: Print and Print Preview warn about type that doesn't fit its frame
2026-10-16 15:45:42 +07:00
BFlat cb3915d230 Merge pull request #2319 from dotCooCoo/feat/outline-object-effect
Effects: Effect › Path › Outline Object turns type into live, editable outlines
2026-10-16 15:45:27 +07:00
BFlat 93913c7906 Merge pull request #2320 from dotCooCoo/fix/art-bounds-take-in-effects
Export: the art's bounds take in the effects of groups, type and images
2026-10-16 15:45:12 +07:00
BFlat c459285f42 Merge pull request #2333 from dotCooCoo/feat/outline-object-type-item-effects
Type: geometry effects on a type object's own fills and strokes are drawn and exported
2026-10-16 15:44:58 +07:00
BFlat e31a39ec40 Merge pull request #2338 from dotCooCoo/feat/update-selection
Select: Update Selection replaces the recalled saved selection with the current selection
2026-10-16 15:44:42 +07:00
BFlat 36deb67f20 Merge pull request #2340 from marcoarnulfo/feat/scrollbars
Canvas: scroll bars along the window's right and bottom edges (#2322)
2026-10-16 15:44:25 +07:00
BFlat fec2ac402b Merge pull request #2357 from dotCooCoo/feat/simplify-more-options
Simplify: add Corner Point Angle Threshold, Convert to Straight Lines and Show Original Path
2026-10-16 15:44:09 +07:00
BFlat 8593c15b90 Merge pull request #2359 from dotCooCoo/fix/rotated-view-canvas
Rotate View: fitting, the Zoom marquee, canvas guides and the Navigator follow a turned view
2026-10-16 15:43:52 +07:00
BFlat 6d4ad17954 Merge pull request #2365 from marcoarnulfo/feat/halftone
Effects: Effect › Sketch › Halftone Pattern redraws an object through a halftone screen of dots, rings or lines
2026-10-16 15:43:41 +07:00
BFlat c401df19d0 Merge pull request #2367 from dotCooCoo/feat/blob-brush-merge-selection
Blob Brush: Keep selected and Merge only with selection options
2026-10-16 15:43:24 +07:00
BFlat 743801b255 Merge pull request #2368 from dotCooCoo/feat/canvas-unlock-menu
Canvas: a right-click on locked objects offers Unlock with each object's name
2026-10-16 15:43:08 +07:00
BFlat f39b01174c Merge pull request #2370 from dotCooCoo/feat/ellipse-pie-widget
Ellipse: dragging a pie widget on the canvas sets its pie angle
2026-10-16 15:42:52 +07:00
BFlat 0f786df95e Merge pull request #2373 from dotCooCoo/feat/enclosed-marquee
Selection: pressing E while dragging a marquee selects only the objects inside it
2026-10-16 15:42:37 +07:00
BFlat 4ee4bff9b6 Merge pull request #2374 from Messhias/feat/symbol-export-type
G5: Symbol Options Export Type (Graphic / Movie Clip)
2026-10-16 15:42:21 +07:00
BFlat 233ad71bd6 Merge pull request #2376 from dotCooCoo/feat/shaper-mode-widget
Shaper: an arrow widget switches a Shaper Group between Face Selection and Construction mode
2026-10-16 15:42:04 +07:00
FredApps 0e97cf1d4b test(cad): round-trip closed DXF SPLINE flags through export and import (#1299)
#1320 (write) and #1318 (read) landed on main; this keeps only the missing
regression: explicitly closed control-point splines export with the closed
bit and re-import closed, while open paths (even with coincident endpoints)
stay open, across every SPLINE-capable DXF version.
2026-10-16 15:27:55 +07:00
Marco Arnulfo 830dea80e0 Docs: where the portable marker goes on macOS, AppImage and Flatpak; keep a portable copy where only you can write (#1366) 2026-10-16 15:27:55 +07:00
GameDirection 6fc79c33b7 Export for Screens: batch exporting with name patterns, folders and presets (#1935)
Issue #1935 asks for batch exports of many logo variations in many
formats, each format in its own folder. This builds on Export for
Screens, which already writes every chosen artboard in every format row.

Names: a file name pattern (`name`) names every file alike. Tokens:
<filename> (the document), <name> (the artboard, asset, layer or
object), <index>, a run of # (a counter, zero-padded to the run's
length, from counterStart; counterPer item or file), YYYYMMDD,
YYYY-MM-DD, <date>, <time>, <YYYY>, <MM>, <DD>, <format>, <scale> and
<suffix>. A trailing .ext is dropped. Words are not changed: only the
date patterns and the bracketed tokens are. `date` sets the day (the
default is today, UTC). Different files that a pattern names alike get
-2, -3... Without a pattern, two rows with one name still write the
first row only, as before.

Folders: `folders` puts all files in one folder, a folder per row (as
Create Sub-folders did), per extension, per item, or per item and then
extension.

What is exported: besides artboards, assets and the full document,
`layers` (each layer's art alone, sublayers included) and `selection`
(one file of the selection, or a file per object).

Formats: rows can also be EPS, AI and VectorCraft (a document of the
item alone, its one artboard). A PDF row with printer's marks (PDF
Print in the dialog: trim, registration, colour bars, page information,
suffix -print) sits next to a plain PDF row.

Presets: document.exportPresets.list, .save and .delete keep batch
export presets with the preferences, and `exportPreset` uses one under
the call's own params. Built-in: Logo Package (SVG, PNG 1x and 2x, PDF
and print PDF, a folder per format) and Print-Ready PDF.

Dialog: Layers and Selection tabs with thumbnails; an Export Preset
menu with Save and Delete; Folders; File Name with Insert for the
tokens, Start at, Prefix, and an example of the first file's name. The
OK button says Export Layer or Export Selection on those tabs.

Tests: the pattern tokens, the request's example (SVG, PNG, PDF and
print PDF for artboards 1-3, a folder per extension, the print PDF a
bigger page), folders by item and both, the counter by item and by
file, numbered duplicates, layers and the selection, EPS, AI and
VectorCraft per artboard, presets (built-in, saved, used, replaced,
deleted, kept with the preferences), bad params, and the dialog (every
tab, the example name, a pattern export into folders, the Layers and
Selection tabs, presets applied and saved). The three tests that
refused EPS and VectorCraft rows now check those files. New labels
are translated in all 19 catalogs.
2026-10-16 15:27:55 +07:00
dotCooCoo 24583effe0 Paragraph: the Hyphenation dialog sets each paragraph's hyphenation limits
The Paragraph panel menu's Hyphenation… was always disabled, and
automatic hyphenation used fixed limits: words of 6 letters or more,
3 letters on each side of the hyphen, any number of hyphenated lines
in a row, and capitalized words hyphenated.

Each paragraph now has hyphenation options: Words Longer Than, After
First, Before Last, Hyphen Limit, Hyphenation Zone and Hyphenate
Capitalized Words. The defaults are the fixed limits, and documents
keep their line breaks. The options are saved only when they differ
from the defaults. text.setFormat takes wordsLongerThan, afterFirst,
beforeLast, hyphenLimit, hyphenationZone and hyphenateCapitalized, and
paragraph styles carry the options. Hyphen Limit applies with both
composers. Hyphenation Zone applies with the Single-line Composer: a
line whose text before the next word already ends within the zone
breaks before that word instead of hyphenating it.

Hyphenation… is enabled with type selected and opens a Hyphenation
dialog (ui.hyphenation) on the values the Paragraph panel shows. OK
runs text.setFormat with the values that changed, as one undo step.

Docs: docs/mcp.md, docs/target-app-parity.md.
2026-10-16 15:27:55 +07:00
Marco Arnulfo d21040d746 Portable mode: the marker beside the .app or .AppImage, a first-start copy of the profile, nothing under NO_PREFS (#1366)
The install folder is where the user sees the app: next to VectorCraft.app on
macOS (nothing is written inside the signed bundle) and next to the .AppImage
file on Linux ($APPIMAGE; the mounted executable's folder is read-only).

The first time VectorCraftData is created, the settings in the user's profile
are copied into it, so a portable zip that gains portable.txt keeps its users'
settings; the originals stay, a second start copies nothing, a copy that fails
halfway is logged and left as it is.

VECTORCRAFT_NO_PREFS never looks for the marker or creates the folder; a
portable copy skips the one-time read of DrawCraft's old settings; the
unwritable-folder warning goes to the log only (eprintln! panics on a closed
standard error).
2026-10-16 15:27:55 +07:00
Marco Arnulfo 9e44139641 Docs: deleting portable.txt returns settings to the user profile (#1366) 2026-10-16 15:27:55 +07:00