Commit Graph
6959 Commits
Author SHA1 Message Date
dotCooCoo e8b1f1187d Tests: a pixel layer nested in Affinity text stays an image inside the clip
objects_nested_in_text_are_clipped_by_the_type now also nests a 4 x 4 Rstr pixel layer under the TxtA and checks that it is read as an image in the clipping group, next to the shape.
2026-10-31 23:29:39 +07:00
dotCooCoo a48ab7f8c6 Fix #3325: art nested in Affinity text is clipped to the characters
An Affinity text object whose children are nested in it (an image dragged
into artistic text, for example) opened as a plain group, so the image
was drawn over the text. The text now becomes a clip group whose
clipping path is the type, as a shape with children already does: the
nested art shows only inside the characters, with the characters' fill
behind it and their stroke over it.
2026-10-31 23:29:39 +07:00
dotCooCoo 77bdf478e4 Perspective: a homography product that overflows is refused instead of stored or drawn
Homography::then_after returned products whose entries could overflow to
infinity or become NaN. A move, transform or grid reproject of type or a
symbol instance whose stored projection has large finite entries stored such
a product, and the type was then drawn flat, since a projection that is not
finite reads as none.

- Homography::checked_then_after returns None when an entry of the product
  is not finite.
- project_node composes each type and symbol instance projection with it and
  returns false, leaving the object as it is, when one would not be finite;
  moves and transforms in perspective and Define Perspective Grid with
  reproject then return the horizon error and leave the document unchanged.
- transform_map, attach_homography and size_homography return None for such
  a product.
- Edit Text returns the horizon error, and does not enter isolation mode,
  when the type cannot be shown flat where it is drawn.
2026-10-31 23:29:37 +07:00
dotCooCoo f9e78eb144 Appearance: effect.apply reports the active row's object, and an empty aligned target list is an error
effect.apply now reports the item of the first selected object, whose row
the active item is. With nothing selected, an explicit aligned item returns
the command's error instead of an internal error.
2026-10-31 23:29:35 +07:00
dotCooCoo a32d6364ec Appearance: paint, stroke and effect edits change the active row of the first selected object
The Appearance panel's active row is a row of the first selected object's
stack, but fill, stroke, gradient and effect edits matched it against the
object that paints first. When the selection was made top object first and
the objects' stacks differ, an edit changed another row: with the red fill
of [red, white, Stroke] active above a [white, Stroke] object, Fill set the
white row instead.

These edits now match the active row against the first selected object (or
the compound path holding it), as Add New Fill and Reduce to Basic
Appearance already do. Gradient edits also read whether the active row is a
fill or a stroke from that object.
2026-10-31 23:29:35 +07:00
dotCooCoo 4c32032d34 Part of #3602: a node thumbnail reports the size it is drawn at
render_node_thumbnail_with draws into a context of size.clamp(1,
MAX_CONTEXT_SIDE) pixels but reported width and height as the requested
size, so a size of 0 gave a 0x0 image holding 4 bytes. The view was
also built from the requested size, and the fit scale (size - 2) /
extent was 0 or negative at sizes 1 and 2, so the art drew nothing or
mirrored.

The thumbnail now reports the side it draws, builds the view from it,
and drops the 1-pixel margin when the side is too small to keep one.

Test: node_thumbnail_reports_the_size_it_draws.
2026-10-31 23:29:33 +07:00
BFlat 403d8bc215 Merge pull request #4930 from storytold/fix/4892-single-instance
Fix #4892: a file opened while VectorCraft runs opens in that window
2026-10-31 23:28:38 +07:00
BFlat db8a278239 Merge pull request #4929 from storytold/fix/smooth-parity
Smooth: Auto-Smooth takes a shaky line to one curve, and direct-selected anchors smooth only their section
2026-10-31 23:28:24 +07:00
bflatastic 9b17e38a5c Fix #4892: a file opened while VectorCraft runs opens in that window 2026-10-31 23:11:00 +07:00
bflatastic f0da383749 Smooth: the slider smooths bumps and jags into curves, and smooths only a direct-selected section 2026-10-31 23:10:56 +07:00
BFlat 01b498c478 Merge pull request #4907 from storytold/fix/4893-new-doc-preset
Fix #4893: New Document saves a preset after More Settings
2026-10-31 22:41:58 +07:00
BFlat 28f2fa44b3 Merge pull request #4906 from storytold/fix/4882-rasterize-cmyk
Fix #4882: Rasterize to CMYK makes a CMYK image
2026-10-31 22:41:43 +07:00
BFlat 61551b5dea Merge pull request #4902 from storytold/docs/roadmap-2026-10-31
Docs: ROADMAP progress log for 2026-10-31
2026-10-31 22:41:19 +07:00
BFlat eebd67fa18 Merge pull request #4904 from storytold/fix/4890-4891-direct-selection
Fix #4890, #4891: Direct Selection's Alt-marquee and center point
2026-10-31 22:40:58 +07:00
BFlat f1e45bef7e Merge pull request #4903 from storytold/feat/arrange-tools
Add-ons: Arrange Tools — Arrange in Grid, Swap, Replace with Top Object, Set Size of Each, Zoom to Selection
2026-10-31 22:40:43 +07:00
bflatastic 06043139e6 Fix #4893: New Document saves a preset after More Settings 2026-10-31 22:22:30 +07:00
bflatastic cd2b5f77a4 Fix #4882: Rasterize to CMYK makes a CMYK image 2026-10-31 22:22:27 +07:00
bflatastic 9b407edbbe Docs: ROADMAP progress log for 2026-10-31 2026-10-31 22:22:23 +07:00
bflatastic 83c158703a Fix #4891: Direct Selection selects and moves an object by its center point
Docs: ui-parity and target-app-parity rows for #4890 and #4891.
2026-10-31 22:22:19 +07:00
bflatastic 427de74f37 Fix #4890: Alt with Direct Selection marquee-selects whole paths 2026-10-31 22:22:17 +07:00
bflatastic ca0785573d Add-ons: Arrange Tools — Arrange in Grid, Swap, Replace with Top Object, Set Size of Each, Zoom to Selection
A built-in add-on in Object › Plug-ins › Arrange Tools (#4830, #4831, #4832, #4833, #4834):

- addon.arrange.grid lays the top-level selected objects out in rows and
  columns, a row or a column (stacking order from the back, visual bounds,
  each object centred in its cell), from the selection's top-left or
  centred on the artboard.
- addon.arrange.swap swaps two objects' bounds centres, and with `size`
  their widths and heights.
- addon.arrange.replace puts a copy of the topmost selected object centred
  on each of the others, in its stacking place, kept, stretched or fitted
  in proportion; the replaced objects are deleted unless `keep`.
- addon.arrange.size gives each selected object an exact width and/or
  height about a reference point.
- addon.arrange.zoomSelection (a UI command) fits the active view to the
  selection.

Places and sizes are measured as object.setBounds measures them (its
transform, now also available per object), strokes scale as Scale Strokes
& Effects says, each command is one undo step, and Arrange in Grid,
Replace with Top Object and Set Size of Each open previewed dialogs.
Catalog rows, command sweep cases, docs/mcp.md, parity docs and the
ROADMAP progress log.
2026-10-31 22:22:15 +07:00
BFlat cf142e7f38 Merge pull request #4895 from storytold/feat/export-for-screens-parity
Export for Screens: the dialog works as Illustrator's
2026-10-31 21:58:40 +07:00
bflatastic 46e165731c Docs: Export for Screens laid out as Illustrator's 2026-10-31 21:43:13 +07:00
bflatastic 7a2acbc178 Export for Screens: the dialog is laid out as Illustrator's 2026-10-31 21:43:13 +07:00
bflatastic b8e5f7088f Export for Screens: Export PDFs As Single file writes the artboards as one PDF's pages 2026-10-31 21:43:13 +07:00
BFlat 07580b66be Merge pull request #4889 from storytold/fix/4826-join-point-text
Fix #4826: Artwork Cleanup's Join Point Text stacks one-line type into one object
2026-10-31 21:03:20 +07:00
BFlat 9214dd6b34 Merge pull request #4795 from marshiyar/contributors/add-marshiyar
contributors: add names for marshiyar
2026-10-31 21:03:05 +07:00
BFlat 7b09b3bd85 Merge pull request #4888 from yssy1982/fix-svg-image-rendering
Respect SVG image-rendering pixelated attribute
2026-10-31 21:02:50 +07:00
BFlat 95c60b120b Merge pull request #4884 from Silvertree2010/fix/h4820-perspective-grid-color-parser-ac
Reject repeated '#' in perspective grid colour parser
2026-10-31 21:02:36 +07:00
BFlat ef3a31ba5b Merge pull request #4881 from Silvertree2010/fix/h4725-enhanced-preset-gives-high-fidel
Fix enhanced_preset Shapes for decorated High Fidelity Photo names
2026-10-31 21:02:23 +07:00
BFlat 75812f0d95 Merge pull request #4880 from dotCooCoo/fix/nl-brush-term-penseel
i18n: Dutch names a brush "penseel" everywhere
2026-10-31 21:02:09 +07:00
bflatastic 54b0c7266c Fix #4826: Artwork Cleanup's Join Point Text stacks one-line type into one object 2026-10-31 20:44:15 +07:00
marshiyar 40dd6db6e1 contributors: add names for marshiyar 2026-10-31 20:44:13 +07:00
Shunsuke Yoshizawa aaeb1b2b35 Respect SVG image-rendering pixelated attribute 2026-10-31 20:44:09 +07:00
NetterSilverandClaude Haiku 5.5 6664e366e7 Reject repeated '#' in perspective grid colour parser
Found while testing crates/tools/src/distort/perspective/define.rs:84-86 (Rgb::parse)

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-31 20:44:07 +07:00
NetterSilverandClaude Haiku 5.5 c0872ff9c6 Fix enhanced_preset Shapes for decorated High Fidelity Photo names
Found while testing crates/trace/src/params.rs:248-251 (enhanced_preset)

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-31 20:44:04 +07:00
dotCooCoo b0f6174c37 i18n: Dutch names a brush 'penseel' everywhere, with neuter agreement 2026-10-31 20:44:01 +07:00
BFlat d3c6394a2f Merge pull request #4887 from storytold/fix/4817-blend-options-quick-action
Fix #4817: Properties' Quick Actions has Blend Options for a selected blend with any tool
2026-10-31 20:19:26 +07:00
BFlat df511afa02 Merge pull request #4886 from storytold/fix/4835-duplicate-type
Fix #4835: Artwork Cleanup's Duplicate Objects finds type set twice in the same place
2026-10-31 20:19:12 +07:00
BFlat d50d1fbcce Merge pull request #4883 from storytold/fix/4803-floating-panel-enter
Fix #4803: Enter or Escape in a floating panel's field stays in the field
2026-10-31 20:18:57 +07:00
BFlat 4d002d0436 Merge pull request #4800 from marshiyar/fix/3584-eps-op-costs
EPS import: big operators are charged for the bytes and objects they touch (#3584)
2026-10-31 20:18:40 +07:00
BFlat cdc906b355 Merge pull request #4815 from mockydevs/fix/pdf-font-name-matching
PDF import: installed fonts named with hyphens or a composite font's CMap are found
2026-10-31 20:18:26 +07:00
BFlat fb4abfa07d Merge pull request #4785 from SusieeTheLinuxUser/fix/nevercrash-svg-convolve-overflow
SVG import: a feConvolveMatrix order that overflows usvg's multiply is refused
2026-10-31 20:18:10 +07:00
BFlat 16444ebb14 Merge pull request #4786 from mockydevs/fix/lam-alef-review-followup
Type: lam-alef highlight follow-up: optional features, all marks, exact ligature test (#394)
2026-10-31 20:17:54 +07:00
BFlat 748b400bc3 Merge pull request #4788 from Silvertree2010/fix/h4129-dataset-csv-export-import-loses
Keep an empty text value in dataset CSV export and import
2026-10-31 20:17:40 +07:00
BFlat 3cb5433823 Merge pull request #4796 from mockydevs/fix/dxf-fusion-3085
Fix #3085: DXF LAYOUT objects write only the group codes the DXF Reference defines
2026-10-31 20:17:25 +07:00
BFlat d4c4dd3b46 Merge pull request #4798 from marshiyar/fix/3599-guard-history
Engine guard: a recovered panic restores every document's undo history and the active document (#3599)
2026-10-31 20:17:10 +07:00
BFlat a22c13aef1 Merge pull request #4793 from mockydevs/fix/eps-envelope-edited-contents
.ai/EPS import: an envelope's contents being edited aren't read as art
2026-10-31 20:16:55 +07:00
BFlat cafc13143e Merge pull request #4790 from mockydevs/fix/eps-dictionary-art-state
.ai/EPS import: a transparency set in a dictionary's art stays after it
2026-10-31 20:16:41 +07:00
BFlat 5047391eeb Merge pull request #4791 from mockydevs/fix/eps-area-type-first-line
.ai/EPS import: area type's first line goes where the file lays it out
2026-10-31 20:16:27 +07:00