Commit Graph
7902 Commits
Author SHA1 Message Date
vangel76andClaude Sonnet 5.5 0a2935cf8f Booleans: limit of one unit, crop outside shortcut, tests (#5465)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-04 08:13:12 +07:00
vangel76andClaude Sonnet 5.5 e951095617 Path booleans: refuse out-of-range input, guard the contour pass, cuts report refusals (#5465)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-04 08:13:12 +07:00
Dylan M. Taylor 9cd997b9aa address review: draw a line for curves with far-out start or control points in flatten 2026-11-04 08:13:07 +07:00
Dylan M. Taylor 0e64aca557 Bound work: flattening of huge curves, print layout past the page limit, script-check file names 2026-11-04 08:13:07 +07:00
ruchirguitarandClaude Opus 5.5 079f5389a6 opening::poll stops once a file it opens asks a question
Of two files read off the UI thread and ready in the same frame, the
first could open and ask about its links or fonts, and the second then
became the active document under that dialog. poll now checks
may_switch after each file it opens too, and leaves the rest for a
later frame.

The queued-reopen test also checks that a later queued activation
stays queued.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 08:13:04 +07:00
ruchirguitarandClaude Opus 5.5 e2c8c503c1 opening::poll stops once a queued reopen asks a question
A document asked for again while a dialog was open, and closed
meanwhile, opens again when the dialog closes and may ask about its
links or fonts. poll went on to finish the files read meanwhile, and
each became the active document under that dialog. It now checks
may_switch after each queued activation and leaves the rest, and the
files ready to open, for a later frame.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 08:13:04 +07:00
ruchirguitarandClaude Opus 5.5 72cf1a9b3c Queued tab activations keep the file access scope they were asked in
A document asked for again while a dialog was open was queued by path
only, and opened later in the scope of the frame that ran the queue. A
request confined to automation roots could then read a file outside
them, if the document was closed meanwhile and its path became a link
out of the roots. Each queued activation now carries its ScopeHandle
and runs in it, as background opens already do.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 08:13:04 +07:00
ruchirguitarandClaude Opus 5.5 8f66e2b694 Focusing an open tab closes Home, checks read roots and waits for dialogs
Follow-ups to #5369 (#5420), from its last review:

- Home shown over the document asked for again gives way to it.
- Automation confined to some folders can't reach an open document
  outside them: open_file checks read access before looking for a tab.
- While a dialog or a drag acts on the active document, a document asked
  for again comes to the front once it ends (opening::poll), as a file
  that finishes opening already does.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-04 08:13:04 +07:00
dotCooCoo 65f55d65ea .ai save: errors and notes name the legacy or non-PDF-compatible .ai
Option errors and notes for a .ai save called the file a
"PDF-compatible .ai" even when the save wrote a version 7 file
(aiVersion: "7") or a file without PDF content (pdfCompatible: false).

- Option errors: a version 7 .ai is now called a "legacy .ai
  (version 7)" in the errors for its artboard, artboards and range
  options. A .ai saved without PDF content is called a
  "non-PDF-compatible .ai" in every .ai option error (includeLinked and
  embedProfiles included), and a "non-PDF-compatible .ait template"
  when Save as Template writes it. aiVersion: "7" takes precedence over
  pdfCompatible: false, as it does when the file is written.
- The error for encoding a version 7 .ai of several artboards as one
  file names the legacy .ai.
- The note for a native option the file does not read (version,
  preview, precision) names the same kind of file.
- The error for aiVersion: "7" on a .ait template no longer says that a
  .ait template is always PDF-compatible, since Save as Template writes
  one without PDF content. It now reads "aiVersion 7 writes legacy .ai
  files, not .ait templates", with its rows in the message catalogs
  updated.

A PDF-compatible file keeps its name.
2026-11-04 08:12:56 +07:00
dotCooCoo 1246c62095 DXF: paths of lines and circular arcs export as polylines with bulges
A path made of straight segments and circular arcs (a slot, a D shape,
a rounded rectangle, a pie) was written as one SPLINE, or as a flattened
polyline in R12. It is now one polyline whose vertices carry a bulge
(group 42) for each arc: an LWPOLYLINE in R14 and later, a POLYLINE with
VERTEX entities in R12 and R13, closed when the path is closed. Each run
of cubics on one circle becomes one arc. A path with any other curve
stays a SPLINE, and whole circles, arcs and ellipses keep their CIRCLE,
ARC and ELLIPSE entities.

- The circle test's tolerance is 5e-4 of the smaller of the radius and
  the curve's extent, so a shallow curve that is not circular is no
  longer written as an ARC.
- The drawing extents take each ARC's and each bulge's furthest points.

Part of #1299
2026-11-04 08:12:52 +07:00
dotCooCoo 40175d90c7 Geometry: inverses and conjugates by small affines are no longer refused
A projection now counts as invertible when its determinant, or its
adjugate's determinant, is more than 1e-15 times the largest of the six
products that determinant sums. The adjugate of the adjugate is the map
times a number, so the inverse of a projection that inverts also inverts,
is stored and reads back. The adjugate's cofactors are formed with exact
products, so the inverse of that inverse gives back the original map up
to scale, within 1e-6 of each row's largest entry, and a map whose third
row is the sum of its first two is still refused.

Homography::conjugated and Node::transform_projection judged the affine
map by an absolute determinant of 1e-15, so a scale by 1e-8 left type and
symbol instances in perspective with their old projection. Both now use
Homography::affine_is_invertible, which compares the determinant with
the two products it sums at any scale of the map. An affine map whose
determinant or inverse is not finite, such as a scale by 1e200 or
1e-200, is inverted through Homography::inverse. When the direct product
underflows to a map that is not invertible, as for a projection stored
at a subnormal scale, conjugated forms it again with its powers of two
kept apart.

- crates/geom/src/projective.rs: the_inverse_of_an_invertible_map_is_invertible,
  conjugating_does_not_depend_on_the_scale_of_the_affine,
  conjugating_a_map_at_a_tiny_scale_gives_an_invertible_map
- crates/doc/src/node/tests.rs: a_projection_follows_the_transform_or_is_removed
  covers an invertible scale by 1e-8 and a singular map at that size
2026-11-04 08:12:48 +07:00
dotCooCoo dc8808fe5e Read compound effects when opening effect dialogs 2026-11-04 08:12:44 +07:00
dotCooCoo 04e154510a Edit Original: read PhotoCraft's App Paths entry as UTF-16 on Windows
The lookup ran reg.exe and decoded its output as UTF-8, but reg.exe
writes in the console's code page, so a registered path with characters
outside ASCII came back wrong, and characters outside that code page
came back as "?". The path is now read with RegGetValueW.
2026-11-04 08:12:40 +07:00
dotCooCoo 9051b70028 Measure tool: Shift does not turn the end to the opposite step
With Snap to Point alone, an anchor behind the start could pull the
projected end behind it, and the measurement read 180 degrees from the
pointer's step. Such an end is now turned back onto the pointer's step,
keeping its length, as an end rounded nearer another step is.
2026-11-04 08:12:37 +07:00
dotCooCoo aeafc359ea Measure tool: Shift keeps the end on the pointer's step after the grid rounds it
With a Constrain Angle other than 0, the grid point a Shift-drag's end
rounds to can lie nearer another 45-degree step, and the measurement then
reported that step. A Shift-drag from (0, 0) to (5, -3) with a 30-degree
Constrain Angle and a 9 pt grid measured -15 degrees instead of 30. The
end is now turned back onto the step nearest the pointer's direction,
keeping its length.
2026-11-04 08:12:37 +07:00
dotCooCoo 4c0e0b959a Commit pending dimensions only on pointer release 2026-11-04 08:12:34 +07:00
dotCooCoo aca6e98423 Keep Blend reset after a dropped press 2026-11-04 08:12:31 +07:00
dotCooCoo 19edd2bcc9 Docs: replace quoted help-page sentences with plain statements
docs/mcp.md (dataset.import) and docs/gaps.md (Recolor Artwork ›
Assign, Average & Join) quoted sentences from the reference app's help
pages. Each quote is replaced by a plain statement of the behavior, and
each help-page link stays as the source.
2026-11-04 08:12:28 +07:00
dotCooCoo 309b092f72 Remove copied Action Options wording from documentation 2026-11-04 08:12:25 +07:00
dotCooCoo 9fd7d0a733 Type: place a contour-point caret on a composite as the outline is drawn
With SCALED_COMPONENT_OFFSET, a component's offset now scales each axis
by the length of that axis's basis vector, as the outline loader does,
instead of going through the whole matrix. A rotated or skewed
component's caret no longer lands away from its drawn point.
UNSCALED_COMPONENT_OFFSET now turns the scaling off when both flags are
set.
2026-11-04 08:12:22 +07:00
dotCooCoo 98ef01a6d3 Type: bound the glyphs a contour-point caret lookup reads
A composite glyph whose components expand into glyphs with no points
could make the contour-point caret lookup read billions of glyphs. The
whole lookup now shares a budget of 65,536 glyph reads and gives no
caret when it runs out, so the caret falls back to dividing the advance.
2026-11-04 08:12:22 +07:00
dotCooCoo 817bfceda3 Resolve GDEF contour-point ligature carets 2026-11-04 08:12:22 +07:00
dotCooCoo cdd014c4e7 Type: the stop inside an upright ligature on a vertical path follows its drawn cell
On a path, vertical type turns an upright glyph about its pen, so its cell
runs from 0.12 em before the pen to 0.88 em after it without the font's
vertical metrics. The ligature caret, a click and the selection measured
the cell from the pen instead. They now take the cell where the glyph's
transform draws it, with its placement, baseline shift, Horizontal Scale
and Skew.
2026-11-04 08:12:18 +07:00
dotCooCoo 9250f2bfe6 Clear stale Find Font warning after successful replacement 2026-11-04 08:12:15 +07:00
dotCooCoo 1ad74d1ddf Type: reject doubly signed OpenType feature tags 2026-11-04 08:12:12 +07:00
dotCooCoo c6e47fece3 Render: keep the automatic thread helper out of Wasm libraries 2026-11-04 08:12:09 +07:00
Dylan M. Taylor 4338ef75e3 MCP: render_preview and window captures decode the app's PNG under size limits (#5445) 2026-11-03 17:28:38 -05:00
BFlat 1008166fa7 Merge pull request #5420 from ruchirguitar/fix/open-focuses-existing-document
Fix #5369: every way of opening a file focuses its open tab
2026-11-04 00:17:09 +07:00
BFlat a41da81c60 Merge pull request #5366 from dotCooCoo/fix/touch-type-rtl-move
Type: move right-to-left characters with Touch Type
2026-11-04 00:16:51 +07:00
ruchirguitar 5bb682c61e Fix #5369: every way of opening a file focuses its open tab
Squashed from #5420 onto main.
2026-11-03 23:58:01 +07:00
dotCooCoo cdae392fe0 Type: guard Touch Type movement at direction boundaries 2026-11-03 23:57:53 +07:00
dotCooCoo dfc25c85e4 Type: move right-to-left characters with Touch Type 2026-11-03 23:57:53 +07:00
BFlat ce9761d08f Merge pull request #5362 from dotCooCoo/feat/super-lasso
Add Enclosing Lasso as an optional tool
2026-11-03 23:56:05 +07:00
BFlat 75242074ac Merge pull request #5404 from dotCooCoo/feat/kashida-characters
Type: Character menu Kashidas controls selected text
2026-11-03 23:55:47 +07:00
BFlat 4950798e64 Merge pull request #5419 from storytold/fix/sec-testkit-temp-owner
Testkit: a reused temp dir must belong to this user
2026-11-03 23:55:29 +07:00
BFlat 5657281a9b Merge pull request #5418 from storytold/fix/sec-ui-carry-automation-scope
UI: opening, file picks and the render worker keep the automation roots they started under
2026-11-03 23:55:12 +07:00
BFlat 311c42bcef Merge pull request #5417 from storytold/fix/sec-ui-automation-handoffs
UI: automation can't open the browser or viewer; Preview in Browser stays in its folder; Graph Data is bounded
2026-11-03 23:54:56 +07:00
BFlat 8fbf1f20c0 Merge pull request #5416 from storytold/fix/sec-font-checkout-confinement
Fonts build: craft-fonts manifest paths stay inside the checkout; licences are published as text
2026-11-03 23:54:41 +07:00
BFlat 6711da4d8c Merge pull request #5415 from storytold/fix/sec-render-fx-symbol-budget
Render: symbol instances with effects use the symbol budget; CMYK decodes are admitted; checked Targa size
2026-11-03 23:54:25 +07:00
BFlat 5d02c43eec Merge pull request #5414 from storytold/fix/sec-text-paragraph-runs
Type: a paragraph looks only at its own runs
2026-11-03 23:54:11 +07:00
BFlat e8d1e486d3 Merge pull request #5412 from storytold/fix/sec-trace-raster-bounds
Trace: empty and mismatched rasters, and large swatch libraries, take bounded work
2026-11-03 23:53:56 +07:00
BFlat 138f023247 Merge pull request #5411 from storytold/fix/sec-tools-bounded-loops
Tools: Shape Builder hatch lines are counted; Liquify simplification is linear
2026-11-03 23:53:40 +07:00
BFlat ed6bfddf75 Merge pull request #5410 from storytold/fix/sec-pdf-import-bounds
PDF: bound marked-content lookup, ASCII85, editing-data hashing, image decodes and ink warnings
2026-11-03 23:53:24 +07:00
BFlat 97d440ebe6 Merge pull request #5408 from storytold/fix/sec-svg-css-string-escapes
CSS export: line breaks and angle brackets in names can't end a CSS string
2026-11-03 23:53:08 +07:00
BFlat e3fc6c4339 Merge pull request #5407 from storytold/fix/sec-svg-glyph-raster-only
SVG glyphs: keep only typed raster data URLs, and no links
2026-11-03 23:52:53 +07:00
BFlat a4f614f3d3 Merge pull request #5406 from storytold/fix/sec-svg-entity-estimate
SVG: the entity expansion cap counts every declaration and refuses names it can't follow
2026-11-03 23:52:38 +07:00
BFlat caf6e2baf9 Merge pull request #5405 from storytold/fix/sec-svg-name-suffixes
SVG: CSS class names and imported symbol names take linear work
2026-11-03 23:52:22 +07:00
bflatastic 66c4393018 Enclosing Lasso: a neutral tool id, a longer loop cap, the screen-reader test keeps its doc comment 2026-11-03 23:31:00 +07:00
dotCooCoo bbbce4318f Add Enclosing Lasso as an optional tool
Squashed from #5362 onto main.
2026-11-03 23:30:06 +07:00
dotCooCoo 63ac1395fd Type: control Kashidas for selected characters 2026-11-03 23:29:52 +07:00