Commit Graph
13024 Commits
Author SHA1 Message Date
dotCooCoo 8e6a9e5b71 Merge main into fix/inspect-library-ids-whole 2026-11-11 20:54:59 -08:00
dotCooCoo 0996268f87 JavaScript: a host evaluator's whole source must fit in the heap before it is encoded
The fuel and heap checks for a host evaluator's source were split into a third
before encoding and the rest after, so a source whose whole UTF-16 text did not
fit in the heap could still be encoded and parsed. The whole encoded size is now
reserved before encoding. A source over the source limit is still refused as a
syntax error.
2026-11-11 20:54:00 -08:00
dotCooCoo 7f8d314885 Merge main into feat/eps-save-use-artboards
# Conflicts:
#	docs/mcp.md
2026-11-11 20:49:46 -08:00
dotCooCoo 480d2763e0 Merge feat/eps-save-use-artboards into fix/options-dialog-menus 2026-11-11 20:48:58 -08:00
dotCooCoo 651041fc0c Merge main into fix/options-dialog-menus
# Conflicts:
#	docs/mcp.md
2026-11-11 20:48:58 -08:00
makesomethingshit 88894ef27c Merge latest main and retain Live Paint and Eyedropper evidence 2026-11-12 13:48:23 +09:00
makesomethingshit dfa8403ed0 Fix #6373: Keep painting through long Live Paint drags 2026-11-12 13:46:51 +09:00
dotCooCoo 35be7952c8 Save and Export: the status bar's hover lists every note
A save or an export with several notes named only the first of them in
the status bar, with the count, and the others could not be seen. The
status bar now keeps every note of a save or an export for the status
message's hover, as it does for an open's notes since #6752: resting
the pointer on the message lists them in the order the reply gives them
(a save's notes start with what the format loses), and screen readers
receive the list after the message. The status text is unchanged.

This covers Save, Save As, Save a Copy, Save as Template, Save a
Timestamped Copy, Save as PDF, Export As, Export Selection, Export for
Screens, Asset Export, Save for Web, Preview in Browser, Save for Office
Documents, Text Export Options, a print to a file and the CSS Properties
panel's export. The open, the saves and the exports read a reply's notes
through one helper.

Docs: docs/mcp.md and the css.exportFile params text,
docs/control-protocol.md, docs/target-app-parity.md.
2026-11-11 20:44:53 -08:00
dotCooCoo 987dd18aff File formats: HP-GL (.plt) plots export for pen plotters and cutters
VectorCraft could open and place HP-GL plot files but not write them,
so art for a pen plotter or a vinyl cutter had to go through another
program.

Export As, document.export and Export Selection now write HP-GL.
vectorcraft_cad::hpgl::export draws each visible path once along its
own line: a filled shape is its closed outline and a stroked path its
center line. Type is drawn as glyph outlines, a gradient mesh as its
outline, and a symbol instance as its art with its effects and the
instance's stain. Clipping masks cut the art they clip, and the art is
cut at the artboard's edges. Hidden and non-printing layers, hidden objects,
objects at 0% opacity, template layers, guides and placed images are
left out. Coordinates are plotter units (1016 to the inch, y up) from
the artboard's bottom-left corner or its center, and art more than
8,388,607 units from the origin is cut off.

Each color is a pen, in the order the plot first draws in it (up to
255), or a pen table maps each path to the pen of the nearest color.
With Use Artboards every file of the export uses the same numbering.
The pens draw in turn, each in paint order or, with sortPaths, nearest
path first. Curves are flattened to curveTolerance (0.1 pt by default).
hpglVersion "hpgl" writes IN, SP, PU and PD; "hpgl2" also writes the
palette (NP, PC) and each pen's paths as one encoded polyline (PE).
Options are checked, and Export As writes the file with the defaults.
Plots read back by the HP-GL reader give the same lines.

Docs: docs/mcp.md, docs/control-protocol.md, docs/file-format-parity.md,
docs/target-app-parity.md.
2026-11-11 20:44:32 -08:00
BFlat aa4657e1ce Merge pull request #6704 from dotCooCoo/fix/shape-tool-handles-scale
Shape tools: a drag on a bounding-box handle scales the selection
2026-11-12 11:43:06 +07:00
BFlat a5312e7b0b Merge pull request #6745 from dotCooCoo/fix/shortcut-snapshot-plugin-race
Keyboard Shortcuts: a plug-in installed while the menus are walked no longer leaves the keymap a row short
2026-11-12 11:42:58 +07:00
dotCooCoo cd262fa6e8 MCP: save, export and package replies leave out paths outside a confined client's read roots
A client confined with --automation-read-root could learn paths it was
not given and may not read from the replies of several commands. Each
one now names such a path only when no read roots are in force or the
path is inside them:

- document.save and file.save, file.saveAs, file.saveCopy and
  file.saveAsTemplate (app.save and engine.execute) without a path:
  the document's own file, the files of separate artboards and linked
  files are left out or named by file name, and the folder a save
  suggests is left out.
- document.exportForScreens with the folder of an exportPreset: the
  ZIP path is left out and files are relative to that folder.
- document.exportSettings, document.exportPresets.list and
  document.exportPresets.export: a kept folder outside the read roots
  is left out of the reply and of the presets file the export writes.
- file.package: warnings, missingLinks and the report name a file
  outside the read roots by its file name. A link's stored path, read
  from the document's folder when it is relative, decides, also when
  its file was found under another path.
- document.info: an image linked to a file outside the read roots has
  link null, and its Linked Images row names the file alone.

docs/mcp.md and the params text describe the rule.
2026-11-11 20:42:57 -08:00
BFlat dec6717379 Merge pull request #6726 from dotCooCoo/feat/hpgl-import
File formats: HP-GL (.plt) plot files open and place
2026-11-12 11:42:46 +07:00
BFlat b93b6d6a4f Merge pull request #6729 from dotCooCoo/feat/control-bar-align-to
Control bar: an Align To menu follows the Align buttons
2026-11-12 11:42:38 +07:00
BFlat b945662f75 Merge pull request #6700 from dotCooCoo/fix/script-files-followups
Scripts: File and Folder exists checks the kind, encode keeps slashes, every call is counted
2026-11-12 11:42:26 +07:00
BFlat 3baa943174 Merge pull request #6693 from dotCooCoo/fix/pdfa-14-long-pages
PDF: a PDF/A-2b file at PDF 1.4 writes long pages as PDF 1.6 with a UserUnit
2026-11-12 11:42:17 +07:00
BFlat cd92345707 Merge pull request #6759 from dotCooCoo/fix/js-tosource-property-flags
Scripts: toSource refuses read-only, non-configurable and non-extensible data it cannot write back
2026-11-12 11:42:09 +07:00
BFlat d843a4f1ec Merge pull request #6670 from dotCooCoo/fix/plugin-put-back-result
Plug-ins: an update left in the store by a failed put-back turns a disabled plug-in on
2026-11-12 11:42:01 +07:00
BFlat 5e181e2aec Merge pull request #6699 from dotCooCoo/fix/links-read-roots
MCP: links.list, links.check, links.info and document.open leave out paths outside the read roots
2026-11-12 11:41:52 +07:00
BFlat 95325e8ef0 Merge pull request #6694 from dotCooCoo/feat/char-style-options-tcy-offsets
Type: Character Style Options sets Tate-chu-yoko Up/Down and Left/Right
2026-11-12 11:41:41 +07:00
BFlat d349c4b586 Merge pull request #6775 from dotCooCoo/feat/image-remove-background
Image Tools: Remove Background clears an image's background in its pixels
2026-11-12 11:41:32 +07:00
BFlat 3ba9ae2b47 Merge pull request #6738 from christianlappin/codex/fix-6404-eyedropper-text-scale
Fix Eyedropper font size and horizontal scale on transformed text
2026-11-12 11:41:23 +07:00
BFlat ea3a4ec373 Merge pull request #3145 from adambelis/feat/width-smooth-profile
Width profiles run smooth between their points
2026-11-12 11:41:15 +07:00
makesomethingshit 7a5486d15d Merge upstream main into Live Paint Bucket fix 2026-11-12 13:39:41 +09:00
dotCooCoo b172e3672d JavaScript: for each evaluates its target before reading the value
A for each loop read the property's value before evaluating its target,
so a target such as (o.p = 2, t).v, t[(o.p = 3, 'w')] or a bare
@[(o.p = 2, 'k')] stored the value from before the target ran. The
target's object and name are now evaluated first and the value is read
after them (ECMA-357 section 12.3).
2026-11-11 20:39:02 -08:00
dotCooCoo e2eb364f83 Scripts: operators, JSON.stringify and join count a flattened string against the heap limit
Flattening a concatenated string copies its units into a new buffer. The
string built-ins reserve that copy with flat_charged, but several other
paths flattened without it, so a script could build copies the heap limit
never saw:

- the relational operators (`<`, `>`, `<=`, `>=`) on two strings, `==`
  between a string and a number, unary `+` and every other ToNumber of a
  string, and reading a character by index (`s[0]`)
- a property name made from an object whose toString returns a long
  string, and a long string used as a property name, which now reserves
  its copy before it is made instead of after
- direct `eval` of a concatenated source
- `JSON.stringify` of a string value and its `space` argument
- `Array.prototype.join`'s separator and each string element it writes

Property names and eval source reserve the copy's heap bytes without
taking fuel.
2026-11-11 20:35:33 -08:00
dotCooCoo 3fd653a25a EPS: Save As shows the saved artboard as the range when Use Artboards was on
A save that set useArtboards: true and named an artboard with artboard
or artboards, without range, wrote that artboard, but file.formatOptions
reported the default range. The Save As dialog then opened on All, and
OK saved every artboard. file.formatOptions now reports those artboards
as the range unless Use Artboards was saved off.
2026-11-11 20:35:16 -08:00
dotCooCoo 8b768bb27b Merge main into fix/inspect-library-ids-whole 2026-11-11 20:32:17 -08:00
dotCooCoo 66d21471ae Gradients: diamond gradients run the stops from the center out to a square
A new gradient kind, `diamond`, runs its stops from the center (the
start) out to a square with a corner at the end of the vector; the
aspect stretches the square across the vector into a rhombus. The
Gradient panel's Type row has a Diamond button, the Gradient tool draws
the square with the aspect handle and center ring, and a gradient
fitted to an object covers its box.

- Model and canvas: the level is |x| + |y| in the square's frame; a
  square with no area (no vector, an aspect of 0, numbers out of range)
  paints the last stop. The canvas draws it as pixels, out to a
  stroke's miters, caps and arrowheads. Transforms keep the vector and
  take the mapped size across it as the aspect.
- Commands: `paint.setFill`, `paint.editGradient` and
  `paint.setGradientGeom` take `kind: "diamond"`; a negative aspect or
  a focal point is an error. A conic or diamond gradient that a plug-in
  returns with a focal point loses the focal point.
- Gradient tool: dragging the aspect handle of a radial or diamond
  gradient whose file gave it a negative aspect now sets a positive
  aspect; only a conic's negative aspect mirrors it.
- Export: PDF, SVG, EPS and legacy .ai write four linear gradients, one
  for each quarter of the square, clipped to the shape (PDF as axial
  shadings). PDF and SVG write an image for translucent stops, a
  dithered fill or a flat square, and for the Perceptual method unless
  PDF writes the stops as spot color shadings. SVG writes a diamond on
  type characters as a radial gradient through the corners, and so
  does CSS. A swatch library saved as CSS gets four corner layers, a
  value for the `background` property (a circle when the swatch is
  turned by an angle that is not a multiple of 90 degrees). The .ai
  editing data holds a radial gradient through the corners. The
  document exports give a warning.
- SVG export: a stroke drawn as an image, as conic wedges or as diamond
  quarters now covers the miters, caps and arrowheads that reach past
  its paint box.
- PDF import reads a function-based shading whose color is the same
  along each square about the origin of its space as a diamond.
- Object > Expand gives nested squares or a mesh of rings.

Docs: docs/mcp.md, docs/target-app-parity.md.
2026-11-11 20:27:48 -08:00
dotCooCoo bd41117153 Merge main into perf/flatten-opaque-chain 2026-11-11 20:24:15 -08:00
dotCooCoo eff5765b07 Docs: Flatten Transparency's evidence line states when opaque art joins a group in its first sentence 2026-11-11 20:12:22 -08:00
dotCooCoo 69c3da175c Actions: Batch refuses options of the wrong type before it writes
action.batch read its true/false options with a fallback, so
{"stopOnError": "false"} kept stopping on the first error, and a
number for a string option such as label or datasetFileNaming was
dropped or turned into an empty string. The source check also ran
after the destination folder was made.

includeSubdirs, overrideOpen, overrideSave, overrideExport and
stopOnError now take only true or false, and source, folder,
destination, destinationFolder, datasetFileNaming and label take only
a string. Any other value is an error naming the key, given before the
destination folder is made or a file is opened. A null reads as a key
left out. The params text and docs/mcp.md say so.
2026-11-11 20:11:50 -08:00
dotCooCoo bd717a9018 Merge main into fix/script-sleep-reads-doc-cancel 2026-11-11 20:01:26 -08:00
dotCooCoo 8bd437687a Scripts: a canceled request stops a sleeping or waiting run at its next slice
script_pump read vectorcraft_doc::cancel only after the guard that keeps
a run waiting, so a run asleep in $.sleep went on waiting until its wake
time (up to 1,000 ms), and a run waiting at a dialog or for approval to
grow waited until someone answered. The check now runs before that
guard, after the dialog-failure check, so a canceled request ends the
run at the next slice and every document goes back.
2026-11-11 20:01:25 -08:00
dotCooCoo 903a626be6 Merge main into feat/learn-panel 2026-11-11 19:59:52 -08:00
dotCooCoo 225535b369 Merge main into feat/document-setup-color 2026-11-11 19:59:50 -08:00
dotCooCoo a9e7dfb2f8 Merge main into fix/options-dialog-menus 2026-11-11 19:59:50 -08:00
dotCooCoo d1ceb73b39 Merge main into fix/recovery-retake-lock 2026-11-11 19:59:49 -08:00
dotCooCoo 9197094803 Merge main into fix/plugin-approval-held-input 2026-11-11 19:59:35 -08:00
dotCooCoo c073ae2cb8 Merge main into fix/js-finally-sites-gc-test 2026-11-11 19:59:34 -08:00
dotCooCoo ccaaac26b0 Merge main into fix/e4x-xml-declaration-check 2026-11-11 19:59:33 -08:00
dotCooCoo 2ca196cb9c Merge main into fix/e4x-scope-name-assign 2026-11-11 19:59:32 -08:00
dotCooCoo f3b089f83f Merge main into feat/styles-textures-library 2026-11-11 19:59:30 -08:00
dotCooCoo a447b78ac4 Merge main into fix/plugin-grants-delete-test-portable 2026-11-11 19:59:24 -08:00
dotCooCoo d5044de8b1 MCP: another platform's absolute path is outside the read roots everywhere
Outside Windows, a path that starts with a drive (`C:`) or a `\` is read
as a name in the working folder, so with the working folder inside a
read root it passed the read check. ui.inspect then kept it in recorded
action steps and replies did not hide it when a request sent it. The
check now counts such a path as outside the read roots wherever the
control channel and the library commands check a path.
2026-11-11 19:59:09 -08:00
dotCooCoo ff3067c7f7 Layers: the thumbnail drag test measures renders by a test clock
row_thumbnails_wait_for_the_end_of_a_drag expected every row's
thumbnail to render in the first pass. The UI thread renders row
thumbnails for at most 8 ms of wall-clock time per pass, so on a busy
machine the first pass rendered only some rows, the next pass rendered
the rest, and the test failed at "and stay".

The thumbnail cache now takes a clock in tests (as the app's
now_override does for idle scheduling). The drag test gives every
render no time, and a new test gives each render 5 ms and checks that
three rows render two in the first pass and one in the next. The 8 ms
budget and the release build are unchanged.
2026-11-11 19:58:59 -08:00
dotCooCoo 7c28138ce3 Commands: pointer packets are read whole before any event runs
A headless or control channel pointer packet now checks every event's kind,
coordinates and mods before it sends any of them, so a malformed later event
no longer leaves the earlier ones applied. A mods value that is not an object,
such as an array, is refused. Rotate View takes null mods as omitted. The MCP
docs name the params that refuse null.
2026-11-11 19:57:39 -08:00
BFlat fd6b8f6c97 Merge pull request #6762 from storytold/fix/3d-part-tuple
3D: the shadow passes read the six-field solid parts again
2026-11-12 10:55:41 +07:00
dotCooCoo d151f3f5d0 JavaScript: source that eval and Function compile takes fuel before it is parsed
Direct and indirect eval, Function and host evaluators parsed and compiled
their source before taking any fuel or checking the heap, so a script with a
small fuel limit could make the interpreter parse megabytes of source in a
handful of instructions. Interp::prepare_source now takes one unit of fuel for
each UTF-16 code unit and checks that the source text fits in the heap before
the source is flattened, parsed or compiled. A host evaluator's string takes
the fuel for a third of its bytes before it is encoded, and the rest after.

Limits::fuel and the maxFuel row in docs/mcp.md say so.
2026-11-11 19:52:06 -08:00
dotCooCoo c792bdf0d3 Plug-ins: a key or button held before the approval's OK took input approves nothing
The install approval's OK now also waits for these to be let go of:

- Enter or Space held down while OK was disabled, whose key repeat
  clicked OK once it had the keyboard focus.
- A pointer button held while OK was disabled, even after another
  button is pressed once OK takes input.
- A pointer button held on the question before, when a new question
  takes its place.

The wait also starts over when the window lost the focus since the
frame before, even if it has the focus again by the next frame.
2026-11-11 19:49:06 -08:00