Commit Graph
8740 Commits
Author SHA1 Message Date
Don Omondi 74b5966bbd Stroke Weight Up and Down: Cmd/Ctrl+Alt+. and , step the selected strokes' weight (#5797) 2026-11-06 16:19:37 +07:00
BFlat f4b56474d4 Merge pull request #5909 from mockydevs/fix/svg-blur-linearrgb-5877
SVG import: Gaussian blurs keep color-interpolation-filters; Gaussian Blur can blur in linear light (#5877)
2026-11-06 17:19:02 +08:00
Don Omondi 41ceaadc7e SVG import: Gaussian blurs keep color-interpolation-filters; Gaussian Blur can blur in linear light (#5877) 2026-11-06 16:05:55 +07:00
BFlat 702f4100fd Merge pull request #5908 from mockydevs/feat/pdf-export-url-links-5785
PDF and .ai export: objects' URLs become clickable links (#5785)
2026-11-06 17:01:56 +08:00
Don Omondi dbbe8a9298 PDF and .ai export: objects' URLs become clickable links (#5785)
Each visible object with a URL (Attributes panel) is written as a Link
annotation with a URI action over its bounds on the page, trimmed to its
clipping groups. Hidden objects, non-printing layers and printed sheets get
none; PDF/X files leave them out with a warning. URIs are percent-encoded
to 7-bit ASCII.
2026-11-06 15:48:02 +07:00
BFlat a0d496251a Merge pull request #5906 from dotCooCoo/fix/legacy-ai-colorized-images
Legacy .ai export: black-and-white colorized images save as image masks
2026-11-06 16:47:09 +08:00
BFlat 8dc5da6d1f Merge pull request #5905 from mockydevs/fix/svg-gradient-linearrgb-5878
SVG import: gradients with color-interpolation="linearRGB" mix their stops in linear light (#5878)
2026-11-06 16:46:52 +08:00
BFlat 54c975a085 Merge pull request #5903 from dotCooCoo/fix/ai-swatch-name-collisions
.ai import: a pattern or color named as another swatch keeps its swatch
2026-11-06 16:46:34 +08:00
BFlat 543762c599 Merge pull request #5904 from mockydevs/fix/blend-spine-review
Blend spine: moveAnchor refuses `with` alongside `handle`; spine built once per overlay and drag
2026-11-06 16:46:18 +08:00
dotCooCoo d58d47312f Legacy .ai export: black-and-white colorized images save as image masks
A colorized image whose pixels are all black or white (or clear) is
written as a 1-bit image mask (ImageMask 1): its color as the fill, a 0
bit for each black pixel and a 1 bit for each white or clear one. The
legacy reader opens it colorized again with the same clear pixels, so
the engine no longer flattens or omits it. Other colorized images are
written with their color in their pixels, over white, with the note
for transparent images.
2026-11-06 15:33:35 +07:00
Don Omondi 427ec0017c SVG import: gradients with color-interpolation="linearRGB" mix their stops in linear light (#5878) 2026-11-06 15:33:02 +07:00
dotCooCoo 968bf1dc48 .ai import: a pattern or color named as another swatch keeps its swatch
Squashed from #5903 onto main.
2026-11-06 15:33:00 +07:00
Don Omondi 149eee2c70 Blend spine: moveAnchor refuses with alongside handle; spine built once per overlay and drag
object.blend.spine.moveAnchor now refuses any supplied `with` (even an
empty list) together with `handle`. Direct Selection builds the blend
spine once when drawing the picked points and once per drag preview,
instead of once per picked point. Part of #5285.
2026-11-06 15:32:52 +07:00
BFlat 07c814597d Merge pull request #5899 from dotCooCoo/fix/tab-stops-string-params
Reject invalid Tab Stop string parameters
2026-11-06 16:32:38 +08:00
BFlat 5788e043d9 Merge pull request #5828 from mockydevs/feat/f2-rename-5324
Layers: F2 renames the selected layer, group or object (#5324)
2026-11-06 16:32:21 +08:00
dotCooCoo 8f81e142a5 Reject invalid Tab Stop string parameters 2026-11-06 15:20:17 +07:00
Don Omondi 00b09002cf Layers: Rename opens the selected layer, group or object's name field (#5324) 2026-11-06 15:14:20 +07:00
BFlat 683ccdf8dc Merge pull request #5897 from dotCooCoo/fix/restyled-empty-frame-keeps-style
Text: a restyled empty frame keeps its style before an unedited empty frame
2026-11-06 16:09:53 +08:00
dotCooCoo f48ac15d08 Text: a restyled empty frame keeps its style before an unedited empty frame
When a frame's text ends with a paragraph break and the next frame is empty, restyling that empty frame was undone on reflow: an unedited empty frame after it gave the story's last paragraph its own style again. A restyled empty frame now keeps its style against unedited empty frames that follow it. Unedited empty frames before it, later frames with text and later restyled frames still give the paragraph their style, as before.
2026-11-06 14:56:28 +07:00
BFlat 5e7c331745 Merge pull request #5896 from adikshan11/fix/automation-superscript-device-names
Automation roots: refuse COM¹ to LPT³ as Windows device names
2026-11-06 15:46:42 +08:00
Adithya Shankaran a455e72bf8 Automation roots: refuse COM¹ to LPT³ as Windows device names 2026-11-06 14:34:58 +07:00
BFlat 91efec6cec Merge pull request #5895 from kler/swedish-ui-2026-11-06
i18n(sv): translate 1432 new strings, use the agreed terms in 2
2026-11-06 15:34:21 +08:00
BFlat 267ea8a852 Merge pull request #5894 from jayzed80/fix/eps-bitshift-min
fix(eps): bitshift by the most negative integer no longer overflows on negation
2026-11-06 15:34:06 +08:00
Patrik LermonandClaude Opus 5.5 d98e8e44c7 i18n(sv): translate 1432 new strings, use the agreed terms in 2
Brings the Swedish catalog up to date with upstream main (4fc4c6576).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-06 14:21:42 +07:00
jayzed80 543b0de0b4 fix(eps): bitshift by the most negative integer no longer overflows on negation
Negating i64::MIN panicked in debug builds. Use saturating_neg, as Op::Neg already does.
2026-11-06 14:21:38 +07:00
BFlat ab95d51b1f Merge pull request #5893 from dotCooCoo/fix/empty-thread-frame-style
Text: empty later frames preserve an edited paragraph style
2026-11-06 15:21:27 +08:00
dotCooCoo b0f383a1ab Text: empty later frames preserve an edited paragraph style 2026-11-06 14:08:37 +07:00
BFlat 1444ce9e0f Merge pull request #5892 from dotCooCoo/docs/ai-symbols-need-layers
Docs: .ai symbols are read with the file's layers
2026-11-06 15:04:23 +08:00
dotCooCoo def29d0f97 Docs: .ai symbols are read with the file's layers
A .ai that comes in as its page or PDF part (editing data with no layers, layers that can't be read, or a page fallback) gets none of the editing data's symbols: layered_ai_from fills symbols only from build_from. The editing-data paragraph now says so.
2026-11-06 14:04:04 +07:00
BFlat c7b717d801 Merge pull request #5888 from dotCooCoo/fix/flag-params-switch-or
Commands: true/false flags reject other values everywhere
2026-11-06 14:48:04 +08:00
BFlat 804c3b09d8 Merge pull request #5886 from dotCooCoo/fix/ai-no-layers-active-artboard
.ai import: a file whose editing data has no layers also opens on its active artboard
2026-11-06 14:47:49 +08:00
dotCooCoo b5da39d7b5 Commands: true/false flags reject other values everywhere
The remaining flags under crates/engine/src/cmd that read a boolean with
get(..).and_then(Value::as_bool).unwrap_or(..) now go through switch_or,
so a value such as "false" or 1 is an error instead of the default.
Omitting a flag or giving null keeps the old behavior.

- effect.move: copy
- aligned on the appearance.*, stroke.set, transparency.set and effect.*
  commands, checked before any early return
- transparency.viewOpacityMask: on
- view.printTiling: on
- plugin.install: replace and allowHeavy, checked for every plug-in
- edit.clear: guides, and path.deleteAnchors' read of it
- text.create and text.createInPath: vertical (already refused by
  check_switches, so their behavior is unchanged)
2026-11-06 13:47:16 +07:00
dotCooCoo 31456a0cec .ai import: a file whose editing data has no layers also opens on its active artboard 2026-11-06 13:47:16 +07:00
BFlat 4fc4c65763 Merge pull request #5885 from dotCooCoo/fix/ai-tab-stops-shared
.ai import: legacy type keeps one copy of tab stops its paragraphs share
2026-11-06 14:34:55 +08:00
dotCooCoo aac21aa076 .ai import: legacy type keeps one copy of tab stops its paragraphs share 2026-11-06 13:22:36 +07:00
BFlat 08be8b2d7c Merge pull request #5883 from dotCooCoo/fix/profile-stroke-crop
Rendering: open width-profile strokes outline only near the view
2026-11-06 13:56:09 +08:00
BFlat 8585fd28c2 Merge pull request #5884 from dotCooCoo/test/fitted-text-scale-changes-fit
Tests: a fitted text test changes its fit scale
2026-11-06 13:55:59 +08:00
BFlat 27e9f331ad Merge pull request #5882 from ruchirguitar/i18n/hindi-complete
i18n: add Hindi interface and message catalog
2026-11-06 13:55:48 +08:00
dotCooCoo e6819a86f0 Rendering: open width-profile strokes outline only near the view 2026-11-06 12:42:33 +07:00
dotCooCoo b75b1548d4 Tests: a fitted text test changes its fit scale
The regression test for rebuilding fitted area type after a scale change
used text that overflowed at the minimum size both before and after the
change, so both layouts used the same fit scale and the pixel comparison
did not depend on the fit.

The fixture is now 2 pt type in a small frame, drawn 20 times zoomed in.
It fits at 0.7 of its size, and at 0.733 after a 1.5 times scale. The
test asserts that the two fit scales differ and that the words set at the
earlier fit draw different pixels, and keeps the comparison with a fresh
renderer and the check that the geometry is not reused.
2026-11-06 12:42:26 +07:00
ruchirguitar 70f798b71d i18n: add Hindi interface and message catalog 2026-11-06 12:40:10 +07:00
BFlat 1ab03cb2a1 Merge pull request #5881 from dotCooCoo/fix/selected-hover-widgets
Selection: empty-canvas hover skips distant widgets in large selections
2026-11-06 13:18:56 +08:00
dotCooCoo 2fa3276789 Selection: empty-canvas hover skips distant widgets in large selections 2026-11-06 12:06:27 +07:00
BFlat 6b3a34f016 Merge pull request #5880 from dotCooCoo/docs/format-parity-guides-known-failures
Docs: the .ai notes no longer list guides as a known failure
2026-11-06 13:04:43 +08:00
dotCooCoo 0473fcad58 Docs: the .ai notes no longer list guides as a known failure
The Known failures bullet in docs/file-format-parity.md kept stale copies
of its earlier wording after several merges: guides were still listed as
lost although they open as ruler guides since #5057, and the same clauses
about #868, #1027 and #758 repeated several times. The bullet now states
each fact once, and keeps every legacy .ai reading note it carried.
2026-11-06 12:04:14 +07:00
BFlat 22ff7db4ce Merge pull request #5879 from dotCooCoo/perf/direct-cursor-single-hit
Reuse hit result for Direct Selection cursor
2026-11-06 12:43:57 +08:00
dotCooCoo 64c38d29c7 Reuse hit result for Direct Selection cursor 2026-11-06 11:31:21 +07:00
BFlat 17e56e3dc9 Merge pull request #5874 from dotCooCoo/fix/new-art-basic-boolean-param
Reject invalid New Art Basic parameters
2026-11-06 12:31:07 +08:00
dotCooCoo 8a730bab6b Reject invalid New Art Basic parameters 2026-11-06 11:15:35 +07:00
BFlat 3c7d9e1f90 Merge pull request #5873 from dotCooCoo/perf/long-path-hover
Speed up hover hits on long plain paths
2026-11-06 12:14:58 +08:00