Commit Graph
876 Commits
Author SHA1 Message Date
BFlat f242b0752f Merge pull request #6590 from dotCooCoo/fix/text-style-leading-strict
Type: text.setStyle refuses a leading with trailing text
2026-11-11 20:08:46 +07:00
BFlat a2e34903e9 Merge pull request #6577 from dotCooCoo/fix/script-rethrown-error-place
Scripts: an error $.evalFile could not run, caught and thrown again, is reported where it was thrown again
2026-11-11 19:44:23 +07:00
dotCooCoo 07664847bd Type: text.setStyle refuses a leading with trailing text
`leading: "12abc"` set 12 pt leading and returned success, while `size`
and `tracking` in the same command refused trailing text. `leading` now
reads its value with `length_given`, so a string must be a whole number
or a length with a unit. The error message is unchanged.
2026-11-11 04:24:11 -08:00
BFlat 8ea341d57f Merge pull request #6579 from dotCooCoo/fix/legacy-ai-flatten-side-limit
Legacy .ai export: a long transparent image is flattened whole
2026-11-11 19:15:04 +07:00
BFlat e8a570cb0e Merge pull request #6578 from dotCooCoo/fix/print-bitmap-side-limit
Print: Print as Bitmap prints all of a page longer than 32,768 pixels
2026-11-11 19:05:50 +07:00
BFlat a5a42e45ac Merge pull request #6576 from dotCooCoo/fix/pasted-svg-filter-size-limit
Effects: a pasted SVG filter at the size limit still draws under its new name
2026-11-11 19:00:06 +07:00
dotCooCoo c8475771b9 Merge main into fix/script-rethrown-error-place 2026-11-11 03:59:08 -08:00
BFlat c443a25016 Merge pull request #6569 from dotCooCoo/feat/script-strict-on
Scripts: #strict on runs the script with strict write checks instead of refusing it
2026-11-11 18:45:03 +07:00
BFlat 7e9633e3cb Merge pull request #6573 from dotCooCoo/fix/rasterize-side-limit
Rasterize: art longer than 32,768 pixels at the resolution is refused, not cut off
2026-11-11 18:35:36 +07:00
BFlat 31971bc090 Merge pull request #6555 from dotCooCoo/feat/plugin-effect-open-budget
Plug-ins: live effects of a document's first view share a 2,000 ms budget
2026-11-11 18:22:28 +07:00
dotCooCoo ea0dd5fda5 Legacy .ai export: a long transparent image is flattened whole
Saving a legacy .ai of version 7 flattens each transparent image at its own
resolution, limited only by total pixels. The renderer draws at most 32,768
pixels a side, so an image that came out longer than that at its resolution
was cut off and placed as if whole: the part past that length showed the art
under it without the image. The resolution is now lowered until the longest
side fits.
2026-11-11 03:22:06 -08:00
dotCooCoo 68f3095cfd Print: Print as Bitmap prints all of a page longer than 32,768 pixels
Print as Bitmap limited each page's image to 65,535 pixels a side, but the
renderer draws at most 32,768. A 9000 x 100 pt artboard at a 300 ppi raster
effects resolution printed as an image that stopped at 7,864 pt and was
placed as if whole. The resolution is now lowered until the longest side
fits.
2026-11-11 03:21:57 -08:00
BFlat d5c75d3699 Merge pull request #6567 from dotCooCoo/fix/flatten-long-area-side-limit
Flatten Transparency: a long rasterized area is placed whole
2026-11-11 18:16:31 +07:00
dotCooCoo df5d061b30 Scripts: an error $.evalFile could not run, caught and thrown again, is reported where it was thrown again
A failure $.evalFile raised for a file it could not run was placed by
matching the uncaught error's message against the last such failure. A
script that caught the failure and threw it again later, or threw a new
error whose message held its text, was reported at the failed file's line
instead of the second throw.

The failure now carries a mark (HostError::Marked) with the exception.
A catch clause drops the mark, a throw raises the value without one, and
a finally block that ends normally throws it on with its mark, nested
finally blocks included. Realm::error_mark gives the mark of the error a
run ended with, and the engine looks up the file, line and column by it.
2026-11-11 03:14:42 -08:00
dotCooCoo 8ebcc88c2e Effects: a pasted SVG filter at the size limit still draws under its new name
Pasted art whose SVG filter is renamed to a free name ("Soft 2") had
the new name written into the filter's id. For a filter at the 64 KB
limit the longer id made it too long to draw, so the pasted art lost
the effect. Paste now takes the first free name under which the filter
still fits: a shorter start of its name ("Sof"), else a free letter or
digit. The filter's id is always the effect's name.
2026-11-11 03:03:55 -08:00
dotCooCoo ee40cc10d7 Rasterize: art longer than 32,768 pixels at the resolution is refused, not cut off
Object > Rasterize and the redrawn path of Crop Image allowed images up to
65,535 pixels a side, but the renderer draws at most 32,768. A 100 x 5569 pt
rectangle rasterized at 600 ppi came back 32,768 pixels tall, and the bottom
29% of the art was gone. Such an image is now refused like one over the
64 megapixel limit, and the art stays as it was.
2026-11-11 02:55:59 -08:00
BFlat 5d9d412f8c Merge pull request #6565 from dotCooCoo/fix/glyph-alternate-noop-ligature
Glyphs: gid null inside a ligature reports the ligature
2026-11-11 17:47:51 +07:00
BFlat 6244ac54bf Merge pull request #6560 from dotCooCoo/fix/pasted-svg-filter-names
Effects: pasted art keeps an SVG filter whose name the document gives another filter
2026-11-11 17:37:26 +07:00
dotCooCoo 1da6e899d3 Merge main into feat/script-strict-on 2026-11-11 02:33:33 -08:00
BFlat 6a2b5b9c06 Merge pull request #6459 from Messhias/feat/g5-style-lib-status-effects
G5: built-in Status Effects graphic style library
2026-11-11 17:30:34 +07:00
dotCooCoo c81ae88c85 Flatten Transparency: a long rasterized area is placed whole
The flattener limited an image's resolution only by its total pixels, while
the renderer draws at most 32,768 pixels a side. A long area, such as a narrow
see-through gradient strip down a 2 m banner at 1200 ppi, came back cut off
at that length and was placed as if whole, so the rest of the strip was lost
in Flatten Transparency and in PDF/X-1a, PDF/X-3 and PDF 1.3 exports. The
resolution is now also limited by the longest side, as raster effects are.
2026-11-11 02:23:59 -08:00
BFlat 9a28264cfe Merge pull request #6557 from dotCooCoo/feat/script-alert-confirm-prompt
Scripts: alert, confirm and prompt open dialogs with Stop, and headless runs take their answers from script.run
2026-11-11 17:13:46 +07:00
dotCooCoo 08eca05731 Scripts: #strict on runs the script with strict write checks instead of refusing it
`#strict on` and `//@strict on` no longer end the run as unsupported. They
turn on the checks the dollar-object help page gives for `$.strict`
(https://extendscript.docsforadobe.dev/extendscript-tools-features/dollar-object/):
an assignment to a read-only property throws a TypeError, and so does a new
property on an object that takes none.

VectorCraft's own rules: a getter-only property counts as read-only; the
objects that take no new properties are the non-extensible ones
(preventExtensions, seal, freeze, and the frozen vc and $ objects); the last
`#strict` line of the script and its includes sets the whole run, and runs
without one are unchanged; eval and Function take the checks of the code
that compiles them; a file $.evalFile runs keeps its own line's checks for
its code and functions, or takes the caller's without one. The rest of ES5
strict mode stays with 'use strict'.

The js crate carries the setting per compiled source
(Realm::set_strict_writes, and a strict_writes callback on
HostItem::Evaluator), and applies it only to property assignments.
2026-11-11 02:04:49 -08:00
dotCooCoo 67462cf049 Glyphs: gid null inside a ligature reports the ligature
When text.setGlyphAlternate leaves the text unchanged, it now reads
the glyph from the unchanged text. A character after the first in a run
that holds a glyph choice could be reported with its own glyph instead
of the ligature drawn for it, which text.glyphAlternates reports.
2026-11-11 01:54:02 -08:00
BFlat d56ec4830d Merge pull request #6554 from dotCooCoo/fix/set-glyph-alternate-drawn-gid
Glyphs: text.setGlyphAlternate with gid null reports the glyph drawn
2026-11-11 16:47:58 +07:00
dotCooCoo 32e22cb442 Effects: pasted art keeps an SVG filter whose name the document gives another filter
Pasted art whose svg.filter effect named one of the document's SVG filters
but drew another definition kept that name, so editing or deleting the
document's filter rewrote the pasted art's filter. Paste now renames such
a filter to a free name ("Soft 2") when the art comes from another
document or from SVG, and takes the document's filter when the art is
pasted back into the document it was copied from. Symbols, patterns,
brushes and graphic styles on the clipboard follow the same rule.
2026-11-11 01:44:11 -08:00
Fabio William Conceição 3c44a8ad7c G5: built-in Status Effects graphic style library
Eight style libraries; MCP docs list Status Effects and catch up Symbol libraries with UI Frames and Map Markers.
2026-11-11 09:38:28 +00:00
BFlat 4986f66fe2 Merge pull request #6442 from Messhias/feat/g5-symbol-lib-inventory-icons
G5: built-in Inventory Icons symbol library
2026-11-11 16:12:59 +07:00
dotCooCoo c0adc6e9d7 Merge main into feat/script-alert-confirm-prompt 2026-11-11 01:09:54 -08:00
BFlat e9f98f0d2f Merge pull request #6546 from jmverges/fix/6541-tracking-horizontal-scale
Type: tracking and manual kerning take the Horizontal Scale
2026-11-11 16:05:27 +07:00
dotCooCoo 1851f8769a Glyphs: text.setGlyphAlternate with gid null reports the glyph drawn
With no glyph choice left on the character, text.setGlyphAlternate
returned the font's default glyph for it: 0 for a character the font
lacks, which a fallback font draws, and the lowercase glyph for a
letter under All Caps. It now reports the glyph the character is drawn
with, as text.glyphAlternates does.
2026-11-11 01:05:16 -08:00
Fabio William Conceição 50bf4fc5a3 G5: built-in Inventory Icons symbol library 2026-11-11 08:34:55 +00:00
BFlat b37241f5ae Merge pull request #6547 from dotCooCoo/fix/appearance-active-row-aligned-remove
Appearance: aligned Remove Item and Duplicate Item keep the active row
2026-11-11 15:33:06 +07:00
dotCooCoo e22f4c4ec5 Merge main into feat/plugin-effect-open-budget 2026-11-11 00:11:50 -08:00
jmverges af29e7b71a Merge remote-tracking branch 'upstream/main' into fix/tracking-horizontal-scale
# Conflicts:
#	docs/file-format-parity.md
2026-11-11 08:10:00 +00:00
BFlat 03266ce4b7 Merge pull request #6537 from dotCooCoo/fix/expand-tinted-symbol-adjustment
Expand Appearance: tinted symbols keep their colors under a color adjustment
2026-11-11 15:00:39 +07:00
dotCooCoo 99b7fb0ab8 Appearance: aligned Remove Item and Duplicate Item keep the active row
After an aligned Remove Item or Duplicate Item, the active row was
re-pointed by the indices of the first object in paint order. When the
first selected object paints above the others, its own rows that changed
are different ones, so the active row could be dropped or land on the
wrong row, and a later paint edit changed that row instead.

The active row now follows the rows removed or copied in the first
selected object's own stack.

Follows #5591.
2026-11-10 23:58:23 -08:00
BFlat 902f217ef6 Merge pull request #6539 from dotCooCoo/fix/break-link-keeps-new-art-selected
Symbols: Break Link keeps new art on a locked artboard selected
2026-11-11 14:52:56 +07:00
BFlat 05f2be5588 Merge pull request #6528 from dotCooCoo/fix/insert-anchor-keeps-selection
Paths: Add Anchor Point keeps the same anchors and segments selected
2026-11-11 14:48:16 +07:00
BFlat 0127ed3ec9 Merge pull request #6536 from dotCooCoo/feat/script-include-directives
Scripts: #include and the other preprocessor lines run, and $.evalFile runs a file
2026-11-11 14:31:44 +07:00
BFlat dac55268e3 Merge pull request #6529 from dotCooCoo/fix/store-put-size-bound
Stores: saving a preset, profile or plug-in reads at most one byte past it from the file it replaces
2026-11-11 14:17:50 +07:00
jmvergesandClaude Opus 5.5 df50bbf0f3 Type: tracking and manual kerning take the Horizontal Scale
In horizontal type, tracking and manual kerning are now thousandths of
the em as the Horizontal Scale draws it: at 50%, a tracking of 100 adds
0.05 em after each character. They were added at the full em while the
glyph advances took the scale, so narrow tracked type drifted from the
page of users' .ai files letter by letter. That page writes such type's
character spacing as the tracking itself in a text space as wide as the
scale, which PDF scales by it (ISO 32000-1 9.4.4). Vertical type keeps
the full em: its advances down the column don't all take the scale.

vectorcraft_text::spacing_scale gives the factor. Shaping, inline
graphics and the Optical pairs use it, and so do the conversions from
points back to thousandths of an em: the automatic kerning the Character
panel reads and Touch Type's limits (glyph_em), Combine Point Text, and
PDF import, whose tracking is now the file's Tc. Scale Text Attributes
now keeps tracked type where a horizontal stretch drew it.
SVG export writes letter-spacing in thousandths of the font size it
writes (the vertical scale), so uniformly scaled type keeps its spacing
in a viewer.

Type with both a Horizontal Scale other than 100% and tracking or manual
kerning lays out differently than before, in every document.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-11 07:16:55 +00:00
dotCooCoo de5323efb6 Expand Appearance: tinted symbols keep their colors under a color adjustment
Expand Appearance on a symbol instance with a fill tint and a color
adjustment applied the adjustment to the untinted art, so the expanded
colors differed from the canvas. The expand path now passes the tinted
instance art to adjust_in_document.
2026-11-10 23:05:53 -08:00
dotCooCoo 988bfeb6ec Symbols: Break Link keeps new art on a locked artboard selected
Break Link to Symbol on an instance just placed on a locked artboard
selected nothing: the art that replaced the instance has a new id, so the
locked-artboard check did not see it as new art. The art of an instance
that was new art is now checked without the locked artboards, and the
session keeps it selected as new art. The art of an older instance on a
locked artboard, named by id, is still left out of the selection.
2026-11-10 22:54:05 -08:00
dotCooCoo e74f953b7b Merge main into feat/plugin-effect-open-budget 2026-11-10 22:49:07 -08:00
dotCooCoo 2fc07fe3c0 Merge main into feat/script-alert-confirm-prompt
# Conflicts:
#	crates/engine/src/tests.rs
#	crates/ui-egui/src/app.rs
#	docs/target-app-parity.md
2026-11-10 22:40:45 -08:00
dotCooCoo 08387a22ec Merge main into feat/script-include-directives 2026-11-10 22:39:32 -08:00
dotCooCoo 1f1b7a8b7c Scripts: test that an include ending in a carriage return keeps the next line's number 2026-11-10 22:36:45 -08:00
BFlat b421c03d03 Merge pull request #6525 from dotCooCoo/feat/scripts-folder
Scripts: File › Scripts lists the Scripts folder, subfolders as submenus
2026-11-11 13:33:56 +07:00
dotCooCoo fdbf85d4c8 Stores: saving a preset, profile or plug-in reads at most one byte past it from the file it replaces
Before writing a PDF preset, ICC profile, plug-in, Color Settings,
disabled list or grants file, the store compared the new bytes with the
file already there by reading the whole file into memory, so a large file
left in the folder was read in full. The comparison now reads at most one
byte more than the new content.
2026-11-10 22:24:39 -08:00