Commit Graph
3899 Commits
Author SHA1 Message Date
Don Omondi b8886d3da4 .ai import: try a placed file at its box's corner when the layers differ
A placed (linked) file is put where its matrix takes the canvas point of
art space's origin (the centre of %AI3_TemplateBox). In many files the
matrix takes the corner of the box the file is written with instead, so
the image landed far off its artboard, the layers differed from the
page, and the file came in as its PDF part.

The reader keeps that second placement for each placed file where the
two differ. When the layers don't draw as the page, they are compared
again with those files at their box's corner, and used if that draws
as the page. Files whose layers already match keep their placement.
2026-10-30 09:46:56 +07:00
bflatastic beb0ae6515 SVG export: rectangles, circles, ellipses, lines and straight paths as SVG shape elements (#4652) 2026-10-30 09:45:59 +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
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
bflatastic bef094a121 Direct Selection: copy the segment's anchors (clippy) 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
bflatastic 23ba6ae4c1 Path: Average & Join with a corner or smooth choice, Cmd+Alt+Shift+J (G1) 2026-10-30 06:37:12 +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
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
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
bflatastic f1211e7c89 Separations Preview: hidden plates leave raster images too (#4153) 2026-10-30 04:25:27 +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
bflatastic 5d4b4b9b35 Type: Character panel › Show Snap to Glyph Options (#4232) 2026-10-30 02:41:25 +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
bflatastic 790fdf815f Tests: the Eraser's options include its Size mode and variation 2026-10-30 01:13:27 +07:00
bflatastic cd86609729 Tests: the Eraser pressure test checks each mode's own widths 2026-10-30 01:13:27 +07:00
bflatastic 71fbdf5ff0 Eraser: Size follows the pen pressure too (#3961)
Eraser Tool Options' Size takes Fixed or Pressure and a Variation as the
Blob Brush's does: the tool records the pen, and path.eraseRegion outlines
the squashed drag at the pen's widths, stretched back to the tip's angle
and roundness. The pressure parsing and outline move to draw2's common
helpers, shared by both commands.
2026-10-30 01:13:20 +07:00
bflatastic c65286666c Blob Brush: Size follows the pen pressure (#4590)
Blob Brush Tool Options' Size takes Fixed or Pressure and a Variation, as
the brush options' Size does: with Pressure the brush is Size − Variation
wide where the pen presses lightest and Size + Variation where it presses
hardest. The tool records the pen pressure of each point and shows each
step of the drag as wide as the pen pressed there; path.blob takes
[x, y, pressure] points with sizeMode and sizeVariation and outlines the
stroke with that width profile. A stroke without pressure keeps the Size,
and Fixed with no variation stays the default.

https://helpx.adobe.com/illustrator/desktop/paint-and-fill/learn-painting-basics/blob-brush-options-and-best-practices.html
2026-10-30 01:13:13 +07:00
VoiceLessQ 3301db5817 Image Trace: starting a background trace asks for a frame
The frame a trace starts in may already have asked for its next one before the trace started, so with no input the finished trace could wait. From the review of #4617.
2026-10-30 00:15:59 +07:00
VoiceLessQ 2e54e882d6 Image Trace: a library colour changed meanwhile makes a background trace stale, and running traces keep frames coming
From the review of #4605. TraceParams::swatches isn't in the settings' JSON (serde skip), so a Document Library trace whose swatches were edited while it ran still applied, with the old colours; the trace's inputs now hold them. The 100 ms repaint that keeps background work moving left traces out, so without input a finished trace could wait for the next event.
2026-10-30 00:15:59 +07:00
Taha-Mahmoodi 887328db03 Fix #4420: import attached recolor adjustment layers as color overlays
In Affinity Designer, Recolor Adjustment layers (RcRA) can be attached to
vector groups/shapes via AdCh. Lightness 1.0 recolors target elements to
white. Import visible RcRA layers as ColorOverlay effects and apply them
during node appearance evaluation.
2026-10-30 00:15:58 +07:00
Don Omondi 42884e4ee7 test: the highlighted CMYK mesh PDF must have fills to check 2026-10-30 00:15:58 +07:00
Don Omondi 239286ca83 Fix #3232: a CMYK gradient mesh keeps its K when lightened
Create Gradient Mesh's To Center / To Edge highlight lightened every point
towards RGB white, so a CMYK (or grey) point became display RGB. A patch with
any non-CMYK corner then mixes in RGB, and the PDF writer separated those
colours back to CMYK with K = 0, moving ink off the K plate. Points now
lighten towards white in their own colour model (no ink for CMYK), so the
mesh stays CMYK and K shrinks with the other inks. Flat meshes (highlight 0)
already kept their inks.
2026-10-30 00:15:58 +07:00
bflatastic 5165b6eb1d Pathfinder: live compound shapes (Make, Shape Mode, Release, Expand Compound Shape)
Squashed from #4621 onto main.
2026-10-30 00:15:58 +07:00
dotCooCoo 1538733954 Images: a fill color colorizes grayscale and 1-bit images
Squashed from #4431 onto main.
2026-10-30 00:15:57 +07:00
dotCooCoo 567060393e Recolor Artwork and swatch libraries: parameters of the wrong form are errors
Squashed from #4492 onto main.
2026-10-30 00:15:56 +07:00
dotCooCoo d5cbeb6cc7 Direct Selection: a marquee selects area type's frame anchors
Squashed from #4435 onto main.
2026-10-30 00:15:56 +07:00
dotCooCoo dc9106939e File formats: a PCX palette cut short is refused
An 8-bit PCX file whose image data is followed by the palette marker
(0x0C) and fewer than 768 color bytes was read as gray levels. The reader
now notes where the run-length encoded image data ends, and when the
palette marker follows it without all 768 colors, refuses the file as cut
short. An 8-bit file with nothing after its image data still reads as
gray levels, and a gray level of 12 that falls 769 bytes before the end of
such a file is read as a pixel instead of as the palette marker.
2026-10-30 00:15:56 +07:00
dotCooCoo f32699bea7 File formats: PCX (.pcx) files open and place
A new reader, written from the ZSoft PCX Technical Reference Manual, decodes
the run-length encoded scan lines of 1-bit images in the header palette's
first two colors (black and white when the version has no palette or the two
colors are the same), 1-bit images in two to four planes and 4-bit images
with the header's palette (the EGA colors for versions 0 and 3), 2-bit CGA
images in the colors that the header's CGA background and palette settings
pick, 8-bit images with the 256-color palette after the image data (gray
levels without one) and 24-bit images in three planes. The image is stored as PNG at the resolution of the header's HDpi and
VDpi fields.

Open and Place list PCX, and pasting a copied .pcx file and Glass's Load
Texture… read it by its header. A file of another depth or plane count, one
cut short and one whose pixels as RGBA pass the pixel allowance are refused
with a message before its pixels are decoded. The desktop packaging does not
associate .pcx files, and no export writes them.

Docs: docs/file-format-parity.md, docs/target-app-parity.md, docs/mcp.md,
docs/releasing.md.
2026-10-30 00:15:56 +07:00
dotCooCoo c3cd065ef3 Character and Paragraph Styles: Alt-click on New asks for the new style's name
Squashed from #4402 onto main.
2026-10-30 00:15:55 +07:00
dotCooCoo 0ee5fc0a9e Type: Cmd/Ctrl+Shift+U underlines, and Cmd/Ctrl+Alt+Shift+C and H toggle the line composer and hyphenation
Squashed from #4383 onto main.
2026-10-30 00:15:55 +07:00
dotCooCoo 316d28407f Window: Cmd+F6 and Cmd+Shift+F6 go to the next and previous document
Squashed from #4377 onto main.
2026-10-30 00:15:55 +07:00
bflatastic 148517f3eb Artboard labels: one helper for the artboards the Artboard tool labels itself 2026-10-30 00:15:54 +07:00
el-j 7064969327 fix(canvas): resolve clippy wildcard import and rebase conflicts on canvas artboards 2026-10-30 00:15:54 +07:00
el-j 1670fe4c41 fix(canvas): capture Shift from pointer events for artboard label selection 2026-10-30 00:15:54 +07:00
el-j 49a05508ab fix(canvas): allow multi-selecting artboards via Shift-click on canvas label (#4484) 2026-10-30 00:15:54 +07:00
VoiceLessQ 401706ff8b PDF import: each Contents object is read once when naming a refused stream
Pages that share one Contents array made the name of a refused stream read that array once per page, quadratic in a crafted file. Each object is now read once, and a page's own array as before. From the review of #4612.
2026-10-30 00:15:54 +07:00
VoiceLessQ f0865193a8 PDF import: a page's content listed in an array object is named as content
A page's Contents can be an array written as an object of its own (/Contents 6 0 R). Its streams were named "a stream in it": the reference was compared with the stream, not the array's items. From the review of #4603.
2026-10-29 23:39:24 +07:00
Ridzzz0Alam c403ad762f Properties: Properties doesn't offer Offset Path and Simplify for type alone (#2238)
The Quick Actions listed Object › Path's Offset Path and Simplify for every
selection, but both take paths: with type selected, the dialog opened and
could only fail ("Offset Path: select paths"). They are now left out when
every selected object is type, as Lock and Isolate Group are when they can't
run; live type offsets through the Appearance panel's Effect › Path ›
Offset Path, which works on type.
2026-10-29 23:39:21 +07:00
el-j 82e4fc422c perf(effects): reorder pure-translation Transform copies after round-join terminal Offset Path (#4145)
Follow-up to #4345 / #4145 per maintainer guidance from @bflatastic.

- In `crates/effects/src/geometry.rs` & `crates/effects/src/reshape.rs`:
  - Implements `optimize_geometry_effects`: reorders pure-translation Transform effects
    with copies after a terminal round-join Offset Path effect when the effective style is safe
    (NonZero fill and no stroke).
  - Offsetting a union equals the union of offsets for round (Minkowski) offsets; moving
    pure-translation copies after the terminal offset evaluates Offset Path once on the base
    geometry rather than over dozens of multiplied copies, turning O(copies * segments) planar
    sweep explosion into a single fast offset plus lightweight affine copies.
  - Safely commutes across multiple consecutive pure-translation Transform effects.
  - Preserves exact visual geometry by leaving miter, bevel, EvenOdd, stroked, or non-terminal
    effect stacks in their original order.
- Added comprehensive unit and regression tests in `crates/effects/src/tests.rs`.
- Added contributor entry in `contributors/people.toml`.
2026-10-29 23:15:08 +07:00
Taha-Mahmoodi 46cc03b50a Fix #4459: retain text properties when copying text across documents 2026-10-29 23:14:47 +07:00
bflatastic 2d92634371 Brushes: bent art keeps its curves (#3926)
Pattern, art and auto-corner brushes used to flatten the art into chords
wherever the path bends, so Expand Brush Strokes left polygons with
hundreds of corner anchors. Each art segment now comes out as cubics
matched to the bent segment's ends and derivatives and halved until they
hold to a quarter of the flattening tolerance (never below the 0.05 pt
the path is flattened to). Anchors stay anchors, lines that stay straight
stay lines, and the halving is capped in depth and in anchors: where the
fit would take more anchors than the chords, or the map gives points that
are not finite, that subpath falls back to the chords, now without the
non-finite points.

A 4-anchor circle tile round a 400 pt circle: 68 anchors a tile -> about 9,
all with handles, 0.04 pt from the bent art against 0.19 for the chords;
stroke_pieces 169 -> 244 us for the 31-tile stroke.
2026-10-29 22:44:12 +07:00