Commit Graph
14127 Commits
Author SHA1 Message Date
Christian Lappin 1c8503f3e2 fix(mcp): route Rotate View gestures to the canvas (#6322) 2026-11-09 13:50:36 -05:00
HassanKhan f8ca2c09cb Merge remote-tracking branch 'upstream/main' into feat-4936-auto-spell-check
# Conflicts:
#	docs/gaps.md
#	docs/roadmap.md
#	docs/target-app-parity.md
#	docs/type-parity.md
2026-11-09 23:50:29 +05:00
Ahmed Gomaa 8692b090d0 PDF import tests: ActualText geometry fixtures embed Source Sans 3
Three geometry fixtures used unembedded Helvetica, so the reader fell
back to Source Sans 3 widths where Helvetica is not installed (CI) and
fitted the line length instead of placing glyphs exactly; the following
"C" then landed about 3 pt off its untagged comparison. Embed the
bundled Source Sans 3 with matching explicit widths. Every assertion and
the 0.05 pt tolerance are unchanged.
2026-11-09 20:49:36 +02:00
Ahmed Gomaa 9fda083329 Merge remote-tracking branch 'upstream/main' into fix/pdf-import-actualtext 2026-11-09 20:49:32 +02:00
HassanKhan ff1079b3ce Auto Spell Check: underline the unknown words of the type on the canvas (part of #4936) 2026-11-09 23:41:41 +05:00
jmvergesandClaude Opus 5.5 ca59598cd7 PDF import: Separation images keep their ink (#6314)
An image in a Separation color space opened as an RGB image: its spot ink
was lost (no plate in Separations Preview), and Fill and Recolor Artwork
didn't reach its color.

It now opens as a grayscale image of its tints (white where it lays no
ink, black at 100 %, its Decode array applied; 1 to 16 bits a sample, or
one gray channel from its JPEG, CCITT, JBIG2 or JPEG 2000 decoder),
colorized by its ink at 100 %: the spot swatch, a process plate's CMYK
color, or Registration. Its mask becomes its opacity mask, as a CMYK
image's does. The ink is found by the image's color space among those the
file defines, once per image. The ink None, an ink whose color can't be
told, images inside an alpha soft mask, inline images and DeviceN images
open as before; samples that can't be read open in RGB with a warning, and
the ink gets no swatch.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-09 18:39:46 +00:00
BFlat 9dc4c33529 Merge pull request #6330 from thisisgomaa/fix/pdf-export-mark-text
PDF export: letters with marks are written once in the text layer
2026-11-10 01:29:17 +07:00
Christian Lappin 78a72a523b test(text): preserve duplicate glyph occurrence order (#6323) 2026-11-09 13:04:03 -05:00
Christian Lappin 99a6e40323 test(layers): synchronize thumbnail queue assertion (#6318) 2026-11-09 12:50:22 -05:00
BFlat 9cf3a4e5b6 Merge pull request #6334 from JonRC/fix/eps-missing-fonts-of-the-document
EPS import names the missing fonts of the document's type (#6326 follow-up)
2026-11-10 00:49:58 +07:00
Ahmed Gomaa 95a2527585 Merge remote-tracking branch 'upstream/main' into fix/pdf-export-mark-text 2026-11-09 19:47:08 +02:00
Ahmed Gomaa ad4b4f881e Merge remote-tracking branch 'upstream/main' into fix/pdf-import-actualtext 2026-11-09 19:46:57 +02:00
BFlat 14d545e875 Merge pull request #6329 from Messhias/feat/g5-symbol-lib-ui-frames
G5: built-in UI Frames symbol library with default 9-slice
2026-11-10 00:29:14 +07:00
Ahmed Gomaa 9ffea06f82 Merge remote-tracking branch 'upstream/main' into fix/pdf-export-mark-text 2026-11-09 19:12:24 +02:00
Ahmed Gomaa f2c4743072 Merge remote-tracking branch 'upstream/main' into fix/pdf-import-actualtext 2026-11-09 19:12:14 +02:00
JonRC d439d734e6 EPS import names the missing fonts of the document's type (#6326 follow-up)
The warning #6326 added listed the families `set_text` met while the
page ran. An Illustrator EPS can be rebuilt from its editing copy,
whose type may be in other fonts than the page's, and `stringwidth` and
`charpath` reach `set_text` without adding any type. The families are
now taken from the text objects of the document the import gives (its
layers and its symbols), once each, in the order the type comes,
whichever path built it.
2026-11-09 14:01:27 -03:00
Drew Dibble baa5bab2ea Docs: the 3D-bounds map's sweeps and bound, and the change in the parity doc's revision history 2026-11-09 09:54:50 -07:00
Drew Dibble bd779077e5 Merge main into type-3d-redraw
# Conflicts:
#	crates/ui-egui/src/canvas/tests.rs
#	docs/target-app-parity.md
2026-11-09 09:49:25 -07:00
Drew Dibble 0f75f8e9da Canvas redraw: each version's trace source read from its own node; the 3D-bounds map's bound documented
Diff took the Image Trace flag of the old version for both sides when it
read each version's first member. Both versions have the same extras
there (same_but_members), so the result was right, but each side now
reads its own node.

The doc of Renderer's three_d_bounds now says what adds an entry, when
entries are swept, and the bound that follows: about twice the live 3D
art plus 1024 entries.
2026-11-09 09:48:50 -07:00
Fabio William Conceição a668f44780 G5: assert default 9-slice on every UI Frames symbol
Keep the library test aligned with SymbolNineSlice::default() for Panel, Button and Bar.
2026-11-09 16:40:13 +00:00
Fabio William Conceição e5ef855903 G5: size UI Frames so default 9-slice keeps round corners
Button and Bar were shorter than 4x their corner radius, so the default guides cut through the curves on a vertical resize.
2026-11-09 16:29:22 +00:00
Fabio William Conceição bd9b1696e0 G5: built-in UI Frames symbol library with default 9-slice
Add Panel, Button and Bar HUD chrome as a second original symbol library so games can drop resizable UI frames without inventing art each time.
2026-11-09 16:29:22 +00:00
BFlat 9086ff3e96 Merge pull request #6325 from Silvertree2010/fix/h15445-graph-csv-parser-does-not-strip
Strip leading byte-order mark in graph CSV parser
2026-11-09 23:16:56 +07:00
Ahmed Gomaa 9b797c06d1 PDF export: letters with marks are written once in the text layer
A mark glyph's vertical translation started a new draw_glyphs batch, so
krilla received the cluster's source range again and mapped its
characters twice. Copying or searching the exported PDF then found
doubled letters for Arabic harakat in any font, and for every dotted
letter in fonts that draw dots as zero-advance mark glyphs (Noto Sans,
Naskh and Kufi Arabic).

Keep compatible glyphs on the same layout line in one batch and carry
their relative vertical placement as per-glyph y_offset; horizontal
placement is unchanged (next_x - x advances). Font, size, linear
transform, line/column, paint run, list marker and hyphen boundaries
still split batches. Krilla keeps owning cluster mappings and
ActualText. No importer change.

Regressions decode the content stream and ToUnicode maps: one batch per
layout line, no duplicated cluster assignment, one ActualText per
multi-glyph cluster, contours within 0.05 pt of outline export; mixed
scripts, vertical columns, path rotations and PDF/X variants covered.
The reader round-trip stays an ignored test until the importer consumes
ActualText (#6165).

Addresses #6309.
2026-11-09 18:13:14 +02:00
BFlat 09aedd417d Merge pull request #6326 from JonRC/fix/eps-missing-fonts-warning
Fix #6320: EPS import warns about fonts that aren't available
2026-11-09 23:12:31 +07:00
makesomethingshit 9c4a17e345 #6307: Put spinner revision beside the numeric-field history 2026-11-10 00:59:32 +09:00
dotCooCoo 33f04522f8 JavaScript: an attribute placed among XML children goes in as text
ECMA-357 sends a single attribute given to [[Insert]] through [[Replace]], which makes a text node. A list holding an attribute went into the children as the attribute itself, changed its parent and stayed on its old owner. Each attribute now goes in as a new text node with its value, and it stays on its owner. A list assigned such a value holds the new text nodes, and an attribute does not count against the depth limit.
2026-11-09 07:58:49 -08:00
makesomethingshit e56f95270c #6307: Preserve concurrent parity revision entries 2026-11-10 00:58:06 +09:00
makesomethingshit 804e6d5b14 #6307: Keep parity evidence away from the changing header 2026-11-10 00:57:12 +09:00
makesomethingshit 898db5d72d #6307: Keep spinner evidence separate from shared status lines 2026-11-10 00:53:11 +09:00
dotCooCoo 01673695af JavaScript: a computed XML name or attribute run cannot add markup
An embedded expression used as a tag or attribute name must now be one XML
name, and one used as a run of attributes must hold only name="value"
attributes separated by white space. Anything else throws SyntaxError, so a
script string cannot add an attribute, close the tag or add a child.

{name}={value} in a tag now reads as a computed attribute name, as in the
example in ECMA-357 section 11.1.4.
2026-11-09 07:47:29 -08:00
makesomethingshit 5bf0f337df #6307: Keep numeric spinner arrows repeating while held 2026-11-10 00:45:55 +09:00
Ahmed Gomaa 6e71211a16 PDF import: preserve authored text in ActualText spans
Editable PDF import derived characters from glyph Unicode/CID mappings
even when the enclosing marked-content sequence supplied /ActualText.
A span that paints "xy" but says "AB", followed by "C", imported "xyC".

Track the outermost replacement owner per span (absent, explicitly
empty, consumed), decode it with the existing PDF text-string decoder,
emit it once at the first placeable glyph, and let the remaining glyphs
of the span advance the pen without phantom character slots or
inferred spaces. Authored stretches keep their logical order while
adjacent ordinary text still goes through visual-to-logical
reconstruction. Glyph identity still drives font matching. Depth and
size are bounded; oversized or unbalanced spans fall back to glyph
mappings with a warning.

Outlines mode and PDF export are unchanged. Parity docs updated,
scores unchanged.

Fixes #6165.
2026-11-09 17:43:28 +02:00
dotCooCoo 80ef5d5f53 JavaScript: a limit while a list or named match replaces XML children leaves the tree intact
Replacing a child with a list, inserting a list, and assigning or
replacing by name now check the depth and take all fuel and heap before
the first change. A limit no longer leaves the old child removed, part
of a list inserted or one of several matches gone.

appendChild and assignment past the end of a list remove their empty
placeholder when the assignment stops. A list that takes an earlier
sibling at an index keeps that node in its slot.
2026-11-09 07:37:24 -08:00
dotCooCoo 775d72ddff Merge main into feat/js-e4x-xml 2026-11-09 07:35:58 -08:00
BFlat 7875114168 Merge pull request #6308 from Messhias/feat/g5-dynamic-symbol-part-appearance
G5: dynamic symbol parts take opacity, blend and non-solid paint
2026-11-09 22:31:51 +07:00
JonRC ddbc0d545a Fix #6320: EPS import warns about fonts that aren't available
Type set in a family that isn't available keeps its name and shows in
the fallback font, as in PDF import, but EPS import said nothing. It
now notes each such family once, in the order its type comes (at most
64), and ends with PDF import's warning: "fonts that aren't available
show in the fallback font until they are: <families>".

Tests that set type in fonts the test machine may lack (Helvetica,
Ryumin, made-up names) check the program's warnings without that note,
since which fonts are installed depends on the machine.
2026-11-09 12:31:17 -03:00
dotCooCoo d225a20195 Merge main into feat/js-e4x-xml 2026-11-09 07:28:10 -08:00
BFlat 67c7cbda51 Merge pull request #6321 from jmverges/fix/6313-pdf-image-mask-colorized
PDF import: image masks open colorized by the color they are painted in (#6313)
2026-11-09 22:26:37 +07:00
NetterSilverandClaude Haiku 5.5 511bb23999 Strip leading byte-order mark in graph CSV parser
Found while testing crates/engine/src/cmd/graph/data.rs:45-47 (parse_csv)

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-09 15:25:52 +00:00
dotCooCoo dbfd3f8a80 JavaScript: XML rejects reserved namespace bindings and names
The XML parser now throws SyntaxError when markup binds the xml or xmlns prefix or either fixed URI against the Namespaces in XML rules. addNamespace, setName, setLocalName and setNamespace throw TypeError for the same bindings and leave the node unchanged.

A new element or attribute cannot be in the xmlns namespace, and an attribute in no namespace cannot be named xmlns. The xmlns URI cannot be the default XML namespace. These assignments throw TypeError.
2026-11-09 07:22:20 -08:00
Taha-Mahmoodi 367131d73d Merge origin/main 2026-11-09 19:43:16 +04:30
Taha-Mahmoodi f19f95f9e0 Merge origin/main 2026-11-09 19:42:31 +04:30
dotCooCoo 237ba7a483 JavaScript: a limit during an XML insert, delete or put leaves the tree intact
insertChild, prependChild, replace and list assignment take their heap
and fuel before moving a node out of its old parent. Replace past the
last child charges before the push, so a child is never left without
its parent link. Deleting a child or attribute by name, assigning an
attribute or assigning text to an element take the fuel for the whole
step before emptying the node. normalize removes the next text node
before it stores the joined text.
2026-11-09 07:09:12 -08:00
dotCooCoo 7cce6cd129 Merge main into feat/js-e4x-xml 2026-11-09 06:54:18 -08:00
dotCooCoo f85c555014 JavaScript: run E4X XML literals and the XML, XMLList, Namespace and QName objects behind an option
With `Options::e4x` set, vectorcraft-js runs ECMA-357 (2nd edition):
XML and XMLList literals with embedded expressions, the `..`, `.@`,
`.*`, `.()` and `::` selectors, assignment and `delete` on selected
nodes, `for each`, `default xml namespace`, and the four objects with
their methods and settings. The option is off by default, and without
it the syntax and globals do not exist.

Parsing, serializing, comparing and copying trees use no native stack,
and each takes fuel and counts against the heap limit. Inserting a node
into itself or its descendants throws a TypeError before the tree
changes. A literal or XML string nested past `Options::max_depth` gives
a SyntaxError, and a tree built past that depth stops at the heap limit.
`XML.prototype.xpath` is not provided.
2026-11-09 06:50:32 -08:00
BFlat c66cb516e2 Merge pull request #6317 from dotCooCoo/fix/pdf-cmyk-gradient-image
PDF export: dithered and Perceptual CMYK gradients stay CMYK
2026-11-09 21:46:10 +07:00
Taha-Mahmoodi 32911997ad Merge remote-tracking branch 'origin/main' into fix/import-document-title
# Conflicts:
#	docs/gaps.md
#	docs/target-app-parity.md
2026-11-09 19:15:30 +04:30
jmvergesandClaude Opus 5.5 def928c0dc PDF import: image masks open colorized by the color they are painted in (#6313)
A PDF image mask (`/ImageMask true`) painted in a solid color opened as an
RGB image with the color in its pixels: Fill and Recolor Artwork didn't
reach the color, a spot color lost its ink, and the same mask painted again
in another color took the first one, because the painted image was cached
by the mask alone, and so did an uncolored pattern whose cell draws a mask.

It now opens as a grayscale image of what it paints, colorized by that
color, as the .ai reader opens a 1-bit image mask (#5790). A spot color
keeps its swatch and tint. The page's walk counts paths, not images, so the
ink is found from the color space. Readings of a pattern cell are told
apart by colorized images' colors too. Inside an alpha soft mask, or
painted with a pattern, a mask opens as before.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-09 14:43:13 +00:00
Fabio William Conceição 84e7d55bc8 G5: finish Eyedropper and undo wording for a picked part
copyFrom only writes paints enabled for pickup and apply, and paint, Transparency and the Eyedropper record an undo step only when the override changes.
2026-11-09 14:42:18 +00:00