Commit Graph
8167 Commits
Author SHA1 Message Date
BFlat 90bf6fbcae Merge pull request #5598 from dotCooCoo/fix/ai-open-skips-pdf-part
PDF/.ai import: a file whose type all comes from its text document opens without its PDF part
2026-11-04 20:05:22 +07:00
BFlat 1c166b6c29 Merge pull request #5599 from dotCooCoo/fix/twist-format-migration
Native files: documents from before 0.21.0 keep their Twist turning as saved
2026-11-04 20:05:05 +07:00
BFlat 06170e1902 Merge pull request #5597 from dotCooCoo/fix/font-wheel-floating
Font fields: handle wheel input in floating native windows
2026-11-04 20:04:49 +07:00
BFlat 06b03f78ff Merge pull request #5589 from dotCooCoo/fix/add-new-fill-copies-row
Appearance: Add New Fill's params text says it copies the active row's paint
2026-11-04 20:04:32 +07:00
BFlat 2b206f2150 Merge pull request #5596 from dotCooCoo/fix/perceptual-pdf-shading-help
Gradient: method help names the PDF Separation and DeviceN shadings
2026-11-04 20:04:16 +07:00
dotCooCoo 9275b902a9 PDF/.ai import: a file whose type all comes from its text document opens without its PDF part
A PDF-compatible .ai (or a PDF saved with the editing data) now opens
from its layers without its PDF part being imported, and without being
compared with its page, when:

- its text document makes the type of every text object, hidden ones
  included, at least one text object shows, and none is drawn by the
  appearance of the layer or group it is in;
- its layers hold no unread object, no placed file with a second
  placement and no live envelope with drawn art to fall back on, and
  no image too large to read;
- it declares no large canvas, and its artboards are its pages' trim
  boxes one for one, in points or in the first page's UserUnit.

A file whose layers draw differently from its page then opens from its
layers instead of its PDF part. The bleed comes from the pages' bleed
boxes. The check runs only when no pages are picked, layers and the
editing data are on, the crop box is asked for and type comes in as
text. Files saved without PDF compatibility, files whose PDF part
draws only type or nothing, and files whose PDF part's content can't
be read take the same path when they qualify: their bleed comes from
the pages' bleed boxes, pages in units larger than a point draw them
at their size in points, and the note that the PDF part couldn't be
read is not given, since its content is not read.

Files that don't qualify open as before, and the editing data decoded
and read for the check is reused after the PDF part is imported
(layered_ai_from).

When a file whose PDF part can't be read is scaled up to its size in
points, its text wraps are now laid out again at that size, and the
default graphic styles of a file without graphic styles of its own are
no longer scaled. The same applies on the new path.
2026-11-04 19:41:56 +07:00
dotCooCoo 3f9545c962 Native files: documents from before 0.21.0 keep their Twist turning as saved
#5139 (in 0.21.0) made a positive Twist angle turn clockwise, but
documents saved by earlier releases stored their angles with the other
sign and reopened twisted the other way.

The document version (FORMAT_VERSION) goes from 1 to 2. Opening a
version 1 document negates its Twist angles (in layers, opacity-mask
art, Shaper edits, symbols, graph designs, pattern swatches, graphic
styles and brush definitions), unless the file is of the current file
version and its generator is VectorCraft 0.21.0 or later. The document
opens and saves as version 2. A save for an older file version, which
only apps before 0.21.0 read, writes a version 1 document with the
angles negated back. Graphic style libraries (.vcstyles) go to version
2: a version 1 library's Twist angles are negated when it is read.
Readers do not check either version, so older builds open the new files
as before.
2026-11-04 19:41:51 +07:00
dotCooCoo d9499bc0a3 Handle font wheel input in native viewports 2026-11-04 19:41:47 +07:00
dotCooCoo 27fc855246 Appearance: Add New Fill takes the active row's paint, as before
Add New Fill again copies only the active fill row's paint; Duplicate
Item copies a whole row. The params text of appearance.addFill and
appearance.addStroke now says the new fill or stroke takes the paint
(and for a stroke, the weight) of the row it starts from, and a test
pins the paint-only copy.
2026-11-04 19:41:42 +07:00
dotCooCoo db468928d4 Appearance: Add New Fill copies the whole active fill row
With a fill row active, Add New Fill copied only the row's paint and
reset its opacity, blend mode, visibility, overprint and effects. The
new row is now a copy of the whole active row, as the command's
description says.
2026-11-04 19:41:42 +07:00
dotCooCoo 5626a1614c Gradient: method help names the PDF Separation and DeviceN shadings
The `method` text of `paint.editGradient` and the Method paragraph in
docs/mcp.md said SVG and PDF exports draw a Perceptual gradient as an
image. PDF writes an eligible one natively: tints of one spot ink as a
Separation shading in that ink, and spot inks mixed with other spot,
CMYK or gray inks as a DeviceN shading. Gradients without spot stops,
with RGB or Lab stops, dithered fills and curves with too many stops
still become images there. Both texts now say so.
2026-11-04 19:41:38 +07:00
BFlat bfc42c9482 Merge pull request #5593 from dotCooCoo/fix/pdf-spot-gradient-limits
Docs: list PDF spot gradients written as images in process colors
2026-11-04 19:39:55 +07:00
BFlat 55fef3ed6b Merge pull request #5592 from dotCooCoo/fix/setstyle-warning-skips-protected
Type: the font warning leaves out characters Missing Glyph Protection kept
2026-11-04 19:39:40 +07:00
BFlat e3e7250aa2 Merge pull request #5591 from dotCooCoo/fix/appearance-active-row-each-target
Appearance: the active row is matched in each selected object on its own
2026-11-04 19:39:24 +07:00
dotCooCoo a3aae55ceb Docs: list PDF spot gradients written as images in process colors
PDF export writes a dithered gradient fill with spot stops, and a
Perceptual spot gradient with RGB or Lab stops other than white or more
than 4,096 stops on its curve, as an image in process colors. Add these
cases to the M3 roadmap rows and the color area's remaining work, and
correct the evidence line that said every Perceptual spot gradient
becomes an image.
2026-11-04 19:19:07 +07:00
dotCooCoo 95b3fbfec9 Type: the font warning leaves out characters Missing Glyph Protection kept
text.setStyle and text.setRangeStyle collected the fonts for their
warning after Missing Glyph Protection had run. A character the new font
has no glyph for keeps its earlier font, and when that font was not
available the warning named it, although the command did not set it.

protect_missing_glyphs now returns the byte ranges that kept their font,
and both commands leave those ranges out of the warning's fonts.
2026-11-04 19:19:04 +07:00
dotCooCoo bc2af8df35 Appearance: the active row is matched in each selected object on its own
Reduce to Basic Appearance and Add New Fill matched the Appearance
panel's active row only when every selected object had an equal row.
With three objects whose third had a different lower fill, the second
object lost the match too: Reduce kept its top fill instead of the
active one, and Add New Fill put the copy on top instead of above the
active row.

items_per_target now matches each object against the first one
separately, so an object keeps the match whenever it has an equal row.
2026-11-04 19:19:00 +07:00
BFlat af8be8dc2e Merge pull request #5587 from dotCooCoo/fix/backtick-text-pairing
Keyboard Shortcuts: the backtick key's label ignores the next key's text on the web
2026-11-04 19:18:01 +07:00
BFlat e41d583ddd Merge pull request #5586 from dotCooCoo/fix/text-tweaker-range
Text Tweaker: align byte ranges to character boundaries
2026-11-04 19:17:45 +07:00
BFlat 9b2ec6e85a Merge pull request #5585 from dotCooCoo/fix/kerning-parentheses-wrap
Character: Kerning reads (10+5)*2 as nothing instead of 10+5*2
2026-11-04 19:17:33 +07:00
dotCooCoo 7a3c09c05d Keyboard Shortcuts: the backtick key's label ignores the next key's text on the web
eframe's web build sends each key's text before its press. When several
keys arrive in one frame, the editor paired the backtick press with the
text typed by the key after it, so a shortcut on that key could show the
next key's character. The editor now pairs each text with its press
through `shortcuts::typing_presses`, which shortcut dispatch already
uses, for both event orders.
2026-11-04 18:56:43 +07:00
dotCooCoo af14fe3d59 Align Text Tweaker ranges to character boundaries 2026-11-04 18:56:40 +07:00
dotCooCoo a7266dd10a Character: Kerning reads (10+5)*2 as nothing instead of 10+5*2
Numeric fields dropped every parenthesis before reading a value, so
(10+5)*2 typed into a field committed 20. Only the Kerning field, which
shows its automatic value as (12), now drops one pair of parentheses
around the whole text. Parentheses anywhere else are refused, and fields
without that display refuse them too.
2026-11-04 18:56:36 +07:00
BFlat 42de898d01 Merge pull request #5541 from dotCooCoo/feat/navigator-panel-options
Navigator: Panel Options sets the view box color and draws dashed lines as solid
2026-11-04 18:54:17 +07:00
BFlat 110441e363 Merge pull request #5540 from dotCooCoo/fix/style-attrs-range
Validate character style numeric dimensions
2026-11-04 18:54:00 +07:00
BFlat cabafe3bfb Merge pull request #5581 from dotCooCoo/fix/layer-color-refuses-alpha
Layers: a layer or gap color with an alpha part is refused instead of losing its alpha
2026-11-04 18:53:43 +07:00
BFlat 19014392f8 Merge pull request #5574 from dotCooCoo/fix/dialog-color-refuses-alpha
Dialogs: a color with an alpha part is refused instead of losing its alpha
2026-11-04 18:53:27 +07:00
BFlat 0f2b927378 Merge pull request #5577 from dotCooCoo/fix/same-symbol-reference-docs
Select: describe which object Same Symbol Instance compares with
2026-11-04 18:53:11 +07:00
BFlat 57777a333d Merge pull request #5583 from dotCooCoo/fix/global-edit-options-close
Global Edit: the options dropdowns close when Global Edit starts
2026-11-04 18:53:00 +07:00
BFlat 2f565dd212 Merge pull request #5580 from dotCooCoo/fix/kerning-mixed-modes
Type: Kerning menu lists Auto and Optical for mixed kerning modes
2026-11-04 18:52:45 +07:00
BFlat 4443c594e9 Merge pull request #5579 from dotCooCoo/fix/prefs-reapply-keeps-render-threads
Preferences: a Render Threads change before the first UI pass restarts the canvas renderer
2026-11-04 18:52:30 +07:00
BFlat edbe4d42bb Merge pull request #5576 from dotCooCoo/fix/pattern-done-gives-back-lent-type-tool
Type: Done during a Cmd press does not save empty point type
2026-11-04 18:52:15 +07:00
BFlat 9af799cf8b Merge pull request #5575 from dotCooCoo/fix/backquote-at-release
Canvas: a drag's release reads Backtick as it was at the button-up
2026-11-04 18:52:05 +07:00
BFlat 0476998117 Merge pull request #5572 from dotCooCoo/fix/optical-arabic-test-craft-fonts-guard
Tests: skip the Arabic Optical kerning test without craft-fonts
2026-11-04 18:51:49 +07:00
BFlat f21b3c4b13 Merge pull request #5571 from dotCooCoo/fix/direct-marquee-long-path
Direct Selection: a marquee over a long path tests its segments without building a path for each
2026-11-04 18:51:34 +07:00
BFlat 38521de60b Merge pull request #5570 from dotCooCoo/fix/hide-others-locked-layer-and-guides
Object: Unselected Artwork keeps groups that hold a selected layer or a locked guide
2026-11-04 18:51:19 +07:00
BFlat 75a961c282 Merge pull request #5569 from dotCooCoo/fix/ai-incomplete-brush-object-counted
.ai import: a brush object without a name counts as a brush left out
2026-11-04 18:51:04 +07:00
BFlat 5ddf7c2948 Merge pull request #5568 from dotCooCoo/fix/held-escape-after-tools-cancel
Shortcuts: a held Escape that cancels a Tools or ruler move skips the tool
2026-11-04 18:50:52 +07:00
BFlat d15b10f054 Merge pull request #5567 from dotCooCoo/fix/node-render-anti-alias
Render: node renders follow the anti-aliasing option
2026-11-04 18:50:36 +07:00
BFlat fcc3620050 Merge pull request #5566 from dotCooCoo/fix/select-same-text-skips-template-layers
Select: the font Same commands skip type on a template sublayer
2026-11-04 18:50:21 +07:00
dotCooCoo 6fa0d6e4e0 Navigator: cached raster effects follow Draw Dashed Lines as Solid Lines
The raster-effect cache key now includes the setting, so a renderer that
draws the same art with it on and then off no longer reuses a drop
shadow or other raster effect made with the other setting.
2026-11-04 18:29:29 +07:00
dotCooCoo ddf3373cf0 Navigator: translate the Light Red view box preset
Add a Light Red row next to Light Blue in all 26 catalogs, so the preset
name in Panel Options shows in the interface language.
2026-11-04 18:29:28 +07:00
dotCooCoo 30f903bf60 Navigator: Panel Options sets the view box color and draws dashed lines as solid
The Navigator panel menu's Panel Options… is enabled and opens a dialog with
the view box color (a preset or a custom color; Light Red, today's color, is
the default) and Draw Dashed Lines as Solid Lines, off by default, which draws
dashed strokes without their dashes in the panel's thumbnail only. The
options are kept with the UI state, and ui.navigatorPanelOptions sets them.

RenderOptions::solid_dashes draws dashed strokes as solid lines, including
type strokes and the silhouettes of stroke effects.
2026-11-04 18:29:28 +07:00
dotCooCoo a403e75802 Validate character style numeric dimensions
Squashed from #5540 onto main.
2026-11-04 18:29:25 +07:00
dotCooCoo d79f5ccb75 Layers: a layer or gap color with an alpha part is refused instead of losing its alpha
layer.setProps, layer.new, layer.newSublayer and livePaint.gapOptions read
an 8-digit hex color such as #ff000080 as #ff0000 and set it without its
alpha. They now refuse it with the error a bad color already gets, and
change nothing. #rgba was already refused. #rrggbb, #rgb, a preset index
and a preset name are read as before.
2026-11-04 18:29:17 +07:00
dotCooCoo 12508e6c60 Dialogs: a color with an alpha part is refused instead of losing its alpha
`Color::from_hex` reads `#rrggbbaa` and keeps only its first six digits, so
a `color` set to `#ff000080` through `ui.dialog.set` was applied as
`#ff0000` without an error by Tile Edge Color, Live Paint Selection Tool
Options, Live Paint Bucket Options and Gap Options.

- A new `checked` next to `resolve` in `dialogs/tile_edge_color.rs` gives
  the existing "is not a colour" error for an 8-digit hex color, and
  otherwise reads the color as `resolve` does. `resolve` is unchanged, so
  the swatches the dialogs draw with it show such a color by its RGB as
  before.
- Each of the four dialogs' OK checks the color with `checked` first, and
  leaves the dialog open with nothing changed. Tile Edge Color and Gap
  Options already refused `#rgba`, which `from_hex` does not read. Live
  Paint Selection and Live Paint Bucket used to ignore a color they could
  not read, such as `#f008`, and apply their other fields; their OK now
  refuses it.
- With Preview on, Gap Options sends no color for a `#rrggbbaa` value, so
  the groups keep their own color, and the previewed gaps draw in black.

Docs: the params text, docs/mcp.md, docs/control-protocol.md and
docs/target-app-parity.md.
2026-11-04 18:29:13 +07:00
dotCooCoo f65cd179f8 Docs: re-wrap the select.same paragraph in docs/mcp.md 2026-11-04 18:29:09 +07:00
dotCooCoo 8762242dfe Select: describe which object Same Symbol Instance compares with
The params text of select.same.symbolInstance, docs/mcp.md and
docs/target-app-parity.md now say that the object compared with can be
of any kind (a group member selected on its own, or an object that is
not a symbol instance, which leaves the selection empty), and that new
art on a locked artboard is not passed over while it stays selected.
A test covers the three cases.
2026-11-04 18:29:09 +07:00
dotCooCoo dbfe3fdc38 Global Edit: the options dropdowns close when Global Edit starts
The Global Edit Options dropdowns in the Control bar and in the
Properties panel's Quick Actions turn their button off while Global
Edit is on, but a popup that was already open stayed open and still
changed the options. Both dropdowns now close their popup while Global
Edit is on, and it stays closed after Global Edit stops until the
button is clicked again.
2026-11-04 18:29:06 +07:00
dotCooCoo f11df30d23 Type: Kerning menu lists Auto and Optical for mixed kerning modes
A selection that mixed kerning modes left the Kerning dropdown without
its Auto and Optical entries, so one mode could not be set on all of
it. The menu now lists both entries with neither checked.
2026-11-04 18:29:03 +07:00