Commit Graph
6556 Commits
Author SHA1 Message Date
BFlat 4cc6482bd9 Merge pull request #4660 from mockydevs/fix/ai-tilde-operator
.ai import: a placed file on %_ lines no longer drops the layers
2026-10-30 09:18:04 +07:00
BFlat 501ebb5637 Merge pull request #4661 from C0uki/ja-updates-and-trace
i18n(ja): translate the update check and the trace progress labels
2026-10-30 09:17:48 +07:00
BFlat 19bded06c2 Merge pull request #4663 from datatimp/fix/4637-max-radius-feedback
Effect dialogs keep a typed distance within the effect's range
2026-10-30 09:17:34 +07:00
Don Omondi 380a3cfcff .ai import: a placed file on %_ lines no longer drops the layers
A placed (linked) file written as an object's editable copy, on %_
lines after its drawn look, has its %AI5_BeginPlace and %AI5_EndPlace
markers on those lines too. The lexer dropped comments after %_ that
don't start a section, so the placed file never began, the ~ that ends
it was an operator the reader didn't know, and the whole file came in
as its PDF part. The lexer now returns those two markers from %_ lines,
and the preview reader skips the %_ its header line starts with.
2026-10-30 09:01:24 +07:00
C0ukiandClaude Sonnet 5.5 f398f319da i18n(ja): translate the update check and the trace progress labels
The Help > Check for Updates… item, the update window and the Image Trace
progress labels had no ja row and drew English. Wording follows the
PhotoCraft ja catalog for the update strings.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01K5NRZNWfaSLBWVzV8hivyS
2026-10-30 09:01:17 +07:00
datatimp 6a80e43b68 Effect dialogs keep a typed distance within the effect's range (#4637) 2026-10-30 09:01:11 +07:00
BFlat afc6255ac2 Merge pull request #4653 from mockydevs/fix/pdf-export-mesh-shading
PDF export: gradient meshes as smooth Type 6 patch shadings
2026-10-30 08:42:44 +07:00
BFlat deaf697882 Merge pull request #4651 from mockydevs/fix/ai-blank-pdf-part
.ai import: a file whose PDF part is an empty page opens from its editing data
2026-10-30 08:42:26 +07:00
BFlat 5849ce24b3 Merge pull request #4658 from mockydevs/fix/ai-page-cropped-to-art
.ai import: a PDF part cropped to the art no longer hides the layers
2026-10-30 08:42:10 +07:00
BFlat dce393ff71 Merge pull request #4659 from storytold/fix/units-guides-reopen
Guides: a ruler guide shows while dragged with Real-time Drawing off (#4646)
2026-10-30 08:27:39 +07:00
Don Omondi 43db0c00bc PDF export: gradient meshes as smooth Type 6 patch shadings
PDF export (and the PDF-compatible .ai it writes) cut each gradient mesh
patch into 8 x 8 flat-coloured quads. Viewers showed colour bands and
hairline seams between them, and files with many meshes became very
large and slow to write.

An opaque mesh is now written as one Type 6 (Coons patch) shading
(ISO 32000-1, 8.7.4.5.7) filling its outline, through the PDF writer's
MeshGradient: each patch blends its corner colours bilinearly, as the
canvas draws it. Colours go through page_color as other fills do, and a
mesh mixing RGB with other models goes through RGB. A mesh with
see-through points, an invalid one, or one past the coordinate range
keeps the quads.
2026-10-30 08:15:20 +07:00
Don Omondi 87cb19c589 .ai import: a file whose PDF part is an empty page opens from its editing data
Squashed from #4651 onto main.
2026-10-30 08:15:16 +07:00
Don Omondi 0f1b70f8b1 .ai import: a PDF part cropped to the art no longer hides the layers
A PDF-compatible .ai whose PDF part's pages are cropped to its art (each
page the box of all the art, the editing data's bounding box) rather
than to its artboards came in as that PDF part: the editing data's
artboard wasn't the page's size, so its layers were refused. With
several artboards every page held all the art, so the document had a
copy of everything per page.

When the artboard isn't the page's size but the editing data's bounding
box is, the layers are compared with the page on that box and keep
their artboards. The comparison of their art with the page still
decides whether they are used.
2026-10-30 08:15:04 +07:00
bflatastic 494de9dfa2 Guides: a ruler guide shows while dragged with Real-time Drawing off (#4646)
With Preferences > Performance > Real-time Drawing and Editing off, tool
previews are deferred to the release, so a guide dragged out of a ruler
(guide.add) or moved with a selection tool (guide.move) showed only its
position label until the button was released. Guide previews now always
apply as the guide is dragged: the guide is all such a drag shows.

#4646's units and guides lost on reopen don't reproduce for a native
file: a new millimetre document's ruler guides and units survive Save,
Close and Open in .vectorcraft, PDF, .ai and EPS (new regression test,
and live in the app with Background Save). An SVG saved without Preserve
Editing reopens in pixels with no guides, as the reporter saw.
2026-10-30 08:13:49 +07:00
BFlat dfa2b2176f Merge pull request #4657 from storytold/fix/marquee-segments
Direct Selection: a marquee over part of a segment selects it (#4654)
2026-10-30 07:43:08 +07:00
bflatastic bef094a121 Direct Selection: copy the segment's anchors (clippy) 2026-10-30 07:13:52 +07:00
bflatastic 8fcc58d134 Docs: a Direct Selection marquee selects the segments it crosses (#4654) 2026-10-30 07:13:52 +07:00
bflatastic 859de8b03b Direct Selection: a marquee over part of a segment selects it (#4654) 2026-10-30 07:13:51 +07:00
BFlat ec00793935 Merge pull request #4655 from storytold/feat/join-corner-smooth
Path: Average & Join with a corner or smooth choice, Cmd+Alt+Shift+J (G1)
2026-10-30 07:01:38 +07:00
bflatastic 23ba6ae4c1 Path: Average & Join with a corner or smooth choice, Cmd+Alt+Shift+J (G1) 2026-10-30 06:37:12 +07:00
BFlat a5da285e54 Merge pull request #4648 from mockydevs/fix/emf-pattern-brush-3911
Fix #3911: EMF export writes a pattern fill as one shape per part of its tile
2026-10-30 06:13:25 +07:00
BFlat 87475ab3a6 Merge pull request #4650 from Silvertree2010/fix/h3974-blend-between-a-dashed-stroke-wi
Close all gaps in solid-like dash pattern for odd-length dashes
2026-10-30 06:13:11 +07:00
Don Omondi 2e3a4ec604 Fix #3911: EMF export writes a pattern fill as one shape per part of its tile
A pattern fill was written to EMF as every tile's art, each tile in a clip
of its own, with the brush made again for each part: a rotated two-colour
stripe fill of a 360 x 260 pt rectangle took 473 fills, 246 clips and
122 KB.

When the tiles can't overlap (a grid or brick tiling whose art stays in its
tile), each tile's clip is left out where what it clips lies inside it
already (a convex clip holding every control point of the fills), and the
n-th fill of every tile becomes one path. The picture is the same: the
tiles don't overlap, and the fill's own clip still trims them. That fill
is now 2 fills and 1 clip, 61 KB; unrotated, 99 KB becomes 33 KB.

Tiles that overlap, hex tilings, and tiles holding strokes, images or
clips that cut are written as before, their parts off the page left out.
2026-10-30 05:52:37 +07:00
NetterSilverandClaude Haiku 5.5 d38e3b9015 Close all gaps in solid-like dash pattern for odd-length dashes
Found while testing crates/doc/src/blend.rs:197-201 (lerp_dash, solid_like)

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-30 05:52:33 +07:00
Dylan M. Taylor 60833ae800 packaging: Flatpak finds and prints to CUPS printers (#4634)
* packaging: Flatpak finds and prints to CUPS printers

The Print dialog listed no printers in the Flatpak: the runtime has libcups but not
lpstat/lp, the sandbox couldn't reach the CUPS socket, and driverless network printers
(lpstat -e) need Avahi. Bundle lpstat/lp/lpoptions from CUPS 2.4.20 (Apache-2.0,
statically linked, licence installed) and grant --socket=cups and
--system-talk-name=org.freedesktop.Avahi in both manifests.

* packaging: Flatpak reads the user's CUPS settings (~/.cups, read-only)

Review (CodeRabbit): without it the sandbox's lp/lpstat ignore the user's default
printer and saved options (lpoptions) and a print server named in their client.conf.

* packaging: Flatpak CUPS tools reach the host socket when client.conf names a custom path

Review: Flatpak mounts the host's CUPS socket at /var/run/cups/cups.sock whatever
path ~/.cups/client.conf or CUPS_SERVER names, so lp/lpstat/lpoptions now run through
a wrapper that points a socket path missing in the sandbox there. Server names
(remote servers) and sockets that exist are left alone. Tested in the sandbox:
CUPS_SERVER=/run/custom/cups.sock lists the host's printers through the wrapper and
none without it; a host name is passed through unchanged.

* packaging: redirect a custom CUPS socket only when it is the one Flatpak mounted

Review (CodeRabbit): Flatpak picks the socket it mounts at /var/run/cups/cups.sock
with stricter rules than CUPS (flatpak-run-cups.c: a socket CUPS_SERVER, else the
first line spelled exactly "ServerName /path" in ~/.cups/client.conf, else the
default), while CUPS reads the keyword in any case and takes the last ServerName. The
wrapper now redirects only when CUPS' socket is the one Flatpak chose, so a job can't
reach a different server; otherwise CUPS fails on the missing path.

* packaging: never redirect a CUPS_SERVER the sandbox was given

Review (CodeRabbit): Flatpak picks the socket it mounts from the host's CUPS_SERVER,
so one set by flatpak run --env or an override may not be what it mounted. The
wrapper now leaves any CUPS_SERVER alone and redirects only a client.conf socket that
matches Flatpak's choice; otherwise CUPS fails on the missing path instead of
reaching a different server.

* packaging: point CUPS at the mounted socket only when it is the one Flatpak chose, else fail

Review (CodeRabbit): with a custom socket listed first and the default last in
~/.cups/client.conf, Flatpak mounts the custom one at /var/run/cups/cups.sock while
CUPS picks the last line, finds that path, and talks to the custom server. The
wrapper now compares CUPS' socket with Flatpak's choice even when the path exists:
equal, CUPS is pointed at the mount; different, the tool fails with an error instead
of reaching another server.
2026-10-29 18:51:06 -04:00
BFlat 640131a053 Merge pull request #4640 from mockydevs/fix/ai-editing-data-by-memory-3510
Fix #3510: editing data past 512 MiB opens with its layers where memory allows
2026-10-30 05:35:05 +07:00
BFlat ee9f7e028e Merge pull request #4649 from storytold/fix/prefs-that-act
Docs: audit which Preferences options act (G12)
2026-10-30 05:19:11 +07:00
bflatastic bcd6f65369 Preferences: audit which options act (G12)
Every Preferences dialog option is read by shipped code, by its field or
its key, except five, each waiting on a subsystem of its own: Open
Documents As Tabs (documents in floating windows, G7), Units > East Asian
Type, Hyphenation > Default Language, Scratch Disks, and the legacy vector
clipboard. Highlight Alternate Glyphs, Real-time Drawing and the Devices
options, still listed as stored-only, act. Docs only.
2026-10-30 05:18:12 +07:00
Don Omondi 68ad249efd Fix #3510: editing data past 512 MiB opens with its layers where memory allows
A layered .ai or Illustrator EPS whose editing data (embedded rasters,
mostly) unpacks past 512 MiB opened as its PDF part or printed page, in
one layer, with "it decompresses to more than 512 MB" (#4628 on 0.17.0
hit the older 256 MiB limit the same way).

The limit is now an eighth of installed memory, from 512 MiB (what every
64-bit build read before) to 2 GiB: 1 GiB on an 8 GiB machine, 2 GiB on
16 GiB or more. Reading takes about as much memory again as the data
(1.1 GB of data with 24 embedded 4096 x 4096 images peaked 1.1 GB above
the start), so the ceiling keeps a small file that unpacks without end
from taking a large machine's memory. 32-bit and web builds keep 256 MiB.
vectorcraft_render::installed_memory exposes the reading the image cache
already sizes itself from.
2026-10-30 05:07:58 +07:00
BFlat 3c792ded2f Merge pull request #4641 from mockydevs/fix/prefs-survive-relaunch-4625
Fix #4625: UI settings survive a relaunch and a second window
2026-10-30 05:01:37 +07:00
BFlat 21b774252f Merge pull request #4642 from mockydevs/fix/task-bar-direct-selection-4469
Fix #4469: Direct Selection's task bar offers the path's anchor actions
2026-10-30 05:01:19 +07:00
BFlat 4cc73e52d1 Merge pull request #4645 from mockydevs/fix/direct-select-drag-to-panels-4233
Fix #4233: Direct Selection drags art onto Asset Export and the other panels
2026-10-30 05:00:58 +07:00
Don Omondi 9095cdf926 Fix #4625: UI settings survive a relaunch and a second window
Two ways the next launch came back with settings from before:

- The workspace, panels, toolbars and other settings kept only in the UI
  state were written only on quitting (Preferences OK already saved at
  once, #1747). A session ended any other way lost them. The app now
  saves within 2 seconds of a change, and only when something changed.
- Each launch is its own process, so two windows are common (opening a
  second file from the file manager). A window wrote back the whole
  state it started from when it quit, so the one quitting last put back
  the settings it read at its start, even with nothing changed in it.
  A window now saves only what it changed since it last read or saved,
  merged into the file as it is: each UI field, and each engine
  preference on its own. A setting both windows changed takes the last
  save.

The status line, open dialog and other fields a start resets neither
trigger a save nor replace another window's.
2026-10-30 04:47:12 +07:00
Don Omondi 1c43827df1 docs: record #4469 in the UI history without touching the status line
Keeps this branch's doc change apart from the other open UI-parity edit, so
the two merge in either order.
2026-10-30 04:47:08 +07:00
Don Omondi 4fe7e0ae6b Fix #4469: Direct Selection's task bar offers the path's anchor actions
With the Direct Selection tool active (after the bar's Edit Path, or
switching to it) and a path selected whole, the Contextual Task Bar kept
the Selection tool's Edit Path, Offset Path and Simplify: its anchor
actions showed only for anchors picked out one by one.

The public overview lists, for a path the Direct Selection tool selects,
Simplify and the anchor actions. A path selected whole now offers Corner
and Smooth (path.convertAnchors converts every anchor of a fully
selected path), Connect for an open path, and Simplify. Remove Anchor
Points and Cut Path need anchors picked out and still wait for them.
Edit Path, which only switches to the tool already in use, is left out,
for compound paths too.
2026-10-30 04:47:08 +07:00
Don Omondi 6fe71df1cf Fix #4233: Direct Selection drags art onto Asset Export and the other panels
Art dragged off the canvas reached the panels (Asset Export, Graphic
Styles, Swatches, Symbols) only from the Selection tool: drag_art_out
checked for that tool by id. With the Direct Selection or Group
Selection tool the move stayed on the canvas, so nothing dropped.

Those tools now hand over a move too when every selected object is
selected whole (a press on its fill). A drag of anchor points or
segments, which they also call Move, stays a reshape and isn't handed
to the panels.
2026-10-30 04:47:04 +07:00
BFlat 224cdc08d6 Merge pull request #4647 from storytold/fix/separations-images
Separations Preview: hidden plates leave raster images too (#4153)
2026-10-30 04:45:20 +07:00
bflatastic f1211e7c89 Separations Preview: hidden plates leave raster images too (#4153) 2026-10-30 04:25:27 +07:00
BFlat 00f3e13540 Merge pull request #4639 from storytold/feat/mesh-multi-points
Gradient Mesh: select several mesh points; move, color and opacity reach them all (#4207, #4208, #4170)
2026-10-30 04:09:51 +07:00
bflatastic d56bbb49ff Gradient Mesh: select several mesh points; move, color and opacity reach them all (#4207, #4208, #4170) 2026-10-30 03:37:43 +07:00
BFlat 6b3a6b8788 Merge pull request #4636 from storytold/feat/snap-to-glyph-options
Type: Character panel › Show Snap to Glyph Options (#4232)
2026-10-30 03:03:56 +07:00
bflatastic 5d4b4b9b35 Type: Character panel › Show Snap to Glyph Options (#4232) 2026-10-30 02:41:25 +07:00
BFlat fffc2b747f Merge pull request #4629 from wjrichards/fix/clipboard-retry-backoff
Linux clipboard: stop the retry storm
2026-10-30 02:19:58 +07:00
wjrichardsandClaude Opus 5.5 1f6effa0cf Docs: G10 says plainly that Copy and Paste with other apps still don't work in the GNOME Flatpak
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 02:19:33 +07:00
wjrichardsandClaude Opus 5.5 c988af83b5 Linux clipboard: stop the retry storm
The Flatpak on GNOME has no X11 (fallback-x11 on a Wayland session) and GNOME offers
no data-control protocol, so arboard::Clipboard::new() failed every time. The handle
was kept only on success, so the background Paste check reconnected to the compositor
and logged a warning every 250 ms: 267k warnings in 18 h, the 16 MB log full in 3 h.

- A clipboard that can't be opened is tried again after 1 s, doubling to a minute.
  A Copy or Paste of the user's retries at most once a second.
- The outage is logged once (WARN) and its end once (INFO), across the UI's and the
  background check's handles.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 02:19:33 +07:00
BFlat f4d995647b Merge pull request #4631 from storytold/feat/align-glyph-bounds
Align: Align to Glyph Bounds for point and area type (#4231)
2026-10-30 02:18:29 +07:00
bflatastic 063c06b560 Prefs: the Align to Glyph Bounds comment on its own line 2026-10-30 02:01:58 +07:00
bflatastic 513b02233f Align: Align to Glyph Bounds for point and area type (#4231) 2026-10-30 02:01:58 +07:00
BFlat 2ad24732ae Merge pull request #4630 from storytold/docs/status-lines
Docs: cut the progress docs' status lines back to their latest change
2026-10-30 02:00:33 +07:00
bflatastic c0bd20b6a2 Docs: cut the progress docs' status lines back to their latest change
Merges kept prepending each side's whole summary as "previously: …", so
target-app-parity.md's status line had grown to 66 MB (839 copies of its
Target clause), gaps.md's and ui-parity.md's to over 1 MB. Each status
line now names its latest change only, as the progress-docs standard has
it; the revision histories keep the earlier ones.
2026-10-30 01:46:33 +07:00