Commit Graph
11457 Commits
Author SHA1 Message Date
dotCooCoo 438a39fdf4 Render: blend steps' drop shadows draw under an opacity mask with Clip off
An object with an opacity mask draws offscreen over the bounds the
renderer gives it. For a live object (a blend, envelope or repeat) those
bounds took in effects in symbol art and brush art inside it, but not a
path's own effects, so with Clip off the drop shadows of a blend's steps
were cut off at the steps' bounds and did not draw where the mask art
leaves them uncovered. The bounds now also take in how far each path's
own effects paint past it.
2026-11-12 05:09:18 -08:00
BFlat 61650e44a2 Merge pull request #6814 from dotCooCoo/feat/brush-replace-art
Brushes: Alt-drag art onto a brush to replace its art
2026-11-12 16:02:52 +07:00
BFlat 87c0d5cb5e Merge pull request #6826 from dotCooCoo/feat/3d-classic-rotate
3D (Classic): Rotate (Classic) turns flat art in 3D with the No Shading and Diffuse surfaces
2026-11-12 16:02:41 +07:00
BFlat 744c37d12f Merge pull request #6669 from dotCooCoo/feat/dynamic-text-release-path
Type: Release Type on a Path keeps the size Dynamic Text drew the type at
2026-11-12 16:02:25 +07:00
BFlat 183b2ed7e4 Merge pull request #6770 from dotCooCoo/feat/learn-panel
Learn: a Learn panel lists tutorials by skill, opened from Explore tutorials on the app bar
2026-11-12 16:02:15 +07:00
BFlat 5a215aaece Merge pull request #6828 from dotCooCoo/fix/recovery-left-copy-marker
Data Recovery: another app leaves a copy alone until its app writes it again
2026-11-12 16:02:02 +07:00
BFlat 3ed0dc64a8 Merge pull request #6656 from dotCooCoo/fix/inspect-library-ids-whole
MCP: a hidden library's shown id names it in requests, and replies hide its path wherever it appears
2026-11-12 16:01:54 +07:00
BFlat 70ba41bb2b Merge pull request #6819 from dotCooCoo/fix/ids-without-selection-registry-flake
Tests: the id and ids comparisons leave plug-in effects out of effect.list's catalog
2026-11-12 16:01:45 +07:00
BFlat 8448e5c18f Merge pull request #6788 from dotCooCoo/feat/e4x-xml-xpath
JS: XML and XMLList xpath evaluates XPath 1.0 expressions
2026-11-12 16:01:37 +07:00
BFlat 6c5dd39521 Merge pull request #6823 from Hamza0101/fix/stroke-set-group-own-stroke
Stroke options on a group with its own stroke edit that stroke (#6739)
2026-11-12 16:01:28 +07:00
BFlat eb608bb8b5 Merge pull request #6813 from dotCooCoo/feat/brush-place-art
Brushes: drag a brush onto the canvas to place a copy of its art
2026-11-12 15:14:18 +07:00
BFlat edeca27469 Merge pull request #6785 from dotCooCoo/fix/read-roots-save-export-results
MCP: save, export and package replies leave out paths outside a confined client's read roots
2026-11-12 15:14:09 +07:00
BFlat bf9c8b4e59 Merge pull request #6806 from dotCooCoo/fix/recovery-missing-folder
Data Recovery: a folder error names the folder that is missing or is not a folder
2026-11-12 15:13:59 +07:00
BFlat 1a7aa834db Merge pull request #6786 from dotCooCoo/fix/save-export-show-every-note
Save and Export: the status bar's hover lists every note
2026-11-12 15:13:51 +07:00
BFlat dcab893acd Merge pull request #6791 from dotCooCoo/feat/styles-painted-sketched-library
Graphic Styles: a built-in Painted and Sketched library adds watercolor, charcoal and ink styles
2026-11-12 15:13:39 +07:00
BFlat fd4bf3999c Merge pull request #6810 from dotCooCoo/fix/shortcut-opens-menu-dialog
Shortcuts: a single-key shortcut opens its menu item's slider or dialog
2026-11-12 15:13:30 +07:00
BFlat 0d550c6e6d Merge pull request #6796 from dotCooCoo/feat/patterns-grit-textures
Swatch libraries: Patterns › Grit Textures adds seamless grain, speckle and stipple patterns
2026-11-12 15:13:22 +07:00
BFlat 0ad57dc872 Merge pull request #6811 from dotCooCoo/fix/effect-refresh-deferred-nested
MCP: effect.refreshDeferred takes objects in symbol, pattern, brush and mask art
2026-11-12 15:13:13 +07:00
BFlat c8f31dd8a9 Merge pull request #6804 from dotCooCoo/fix/script-checker-name-escapes
Script checker: names with escaped characters are read as names
2026-11-12 15:13:04 +07:00
BFlat ba2aefb5dd Merge pull request #6815 from dotCooCoo/feat/para-style-options-tabs
Paragraph Styles: Style Options edits a style's tab stops
2026-11-12 15:12:55 +07:00
BFlat 6121418e0c Merge pull request #6783 from dotCooCoo/fix/js-flat-charges-heap
Scripts: operators, JSON.stringify and join count a flattened string against the heap limit
2026-11-12 15:12:46 +07:00
BFlat 27d00baaad Merge pull request #6689 from danngreen/feat/ruler-origin-snap
Rulers: the origin dragged out of the rulers' corner snaps as a drawn point does
2026-11-12 15:12:35 +07:00
dotCooCoo 1d103695c4 Data Recovery: a keeps- entry counts only in an area this account can lock
An entry `<area>/keeps-<left area>` kept the copies in the left area
whenever the lock check on `<area>` failed, so an entry in a folder of
another account, or in one whose lock file can't be opened, kept a
crashed app's copies from being offered. Such an entry now keeps
nothing: only an area that this session holds, or that a running app of
this account has locked, keeps the copies it names.
2026-11-12 00:12:16 -08:00
dotCooCoo 05dcab0284 Data Recovery: another app leaves a copy alone until its app writes it again
When a running app has to leave its recovery area (its lock file was
removed and another app locked the area), its copies stay in the old area
until it writes them again in its new area. Only that app knew this, so
once the other app let the old area go, any app could offer, restore or
discard those copies while their app still ran.

The app now writes an entry `<new area>/keeps-<old area>` in its own area
while copies of its documents are left in the old one, and removes it
when none are. Another app that finds an area unlocked checks for such an
entry, and treats the area as a running app's while the area that names
it is held. After a crash the new area is no longer held, so the copies
are offered as before. The heartbeat writes the entry again if it was
removed.
2026-11-11 23:46:07 -08:00
dotCooCoo 08de741ca9 3D (Classic): Rotate (Classic) turns flat art in 3D with the No Shading and Diffuse surfaces
Effect › 3D and Materials › 3D (Classic) › Rotate (Classic)… turns every
fill and stroke as one flat plane, as Rotate does, and shades it with the
classic No Shading or Diffuse surface.

- `effect.apply` with `threeD.classicRotate`: the Position rotation and
  Perspective, `surface` (`none` or `diffuse`), the classic lights,
  Ambient Light, Blend Steps and Shading Color. It has no highlight, no
  Draw Hidden Faces and no shadow.
- The dialog shows Position on the Rotation tab and the surface and
  lights on the Lighting tab, with no Object tab.
- Groups and layers turn about one shared center, and the effect also
  goes on a fill or stroke, as Rotate's does.
- `effect.lightingPreset` refuses it, as it refuses the other classic
  3D effects.
- Unknown parameters, numbers out of range, bad flags, a surface other
  than No Shading or Diffuse and bad shading colors are refused with an
  error.
2026-11-11 23:44:11 -08:00
dotCooCoo 656d63e4d2 Merge main into feat/learn-panel 2026-11-11 23:31:06 -08:00
dotCooCoo 55570c10d1 Merge main into fix/inspect-library-ids-whole 2026-11-11 23:31:03 -08:00
dotCooCoo 07c6f11abc Merge main into feat/e4x-xml-xpath 2026-11-11 23:31:02 -08:00
dotCooCoo 2c6bd2826b Merge main into feat/dynamic-text-release-path 2026-11-11 23:31:01 -08:00
BFlat 48e066f475 Merge pull request #6755 from dotCooCoo/fix/ui-params-wrong-type
Commands: app and control channel params of the wrong type are refused
2026-11-12 14:17:29 +07:00
BFlat 8782f6c697 Merge pull request #6794 from dotCooCoo/feat/blend-create-spine
Blend: the Blend panel's Create Spine menu sets whether new blends get a spine
2026-11-12 14:17:20 +07:00
BFlat 9a4c36dfed Merge pull request #6771 from dotCooCoo/fix/e4x-scope-name-assign
JavaScript: a bare E4X name inside with or a filter can be assigned
2026-11-12 14:17:08 +07:00
BFlat 5e63104d88 Merge pull request #6800 from dotCooCoo/fix/plugin-automation-install-approval
Plug-ins: an install that automation asked for is not approved in its dialog
2026-11-12 14:16:59 +07:00
BFlat 4c2912100e Merge pull request #6795 from dotCooCoo/fix/pdfx-check-skips-strings
PDF/X: names inside a string or a comment no longer fail the standard check
2026-11-12 14:16:50 +07:00
BFlat f00acd0228 Merge pull request #6802 from dotCooCoo/fix/plugin-manifest-commands-errors
Plug-ins: a wrongly shaped `commands` value gets an error every catalog translates
2026-11-12 14:16:41 +07:00
BFlat abfd776ef4 Merge pull request #6797 from dotCooCoo/feat/dxf-leave-out-images-hatches
DXF: export options leave placed images and fill hatches out, and CNC / CAM turns both off
2026-11-12 14:16:20 +07:00
BFlat 354a12be3f Merge pull request #6805 from dotCooCoo/fix/read-roots-prefs
MCP: preferences replies leave out folders outside a confined client's read roots
2026-11-12 14:16:11 +07:00
BFlat 1b448d671d Merge pull request #6801 from dotCooCoo/docs/dxf-cnc-preset-shipped
Docs: the DXF CNC / CAM preset is listed as shipped
2026-11-12 14:16:02 +07:00
BFlat 4899c51f3e Merge pull request #6803 from dotCooCoo/feat/dynamic-text-release
Type: Convert To Point Type turns Dynamic Text off, keeping the sizes Block set
2026-11-12 14:15:54 +07:00
BFlat 053dc7ab8c Merge pull request #6746 from dotCooCoo/fix/plugin-ignored-grants-shared
Plug-ins: a grant one session stops counting stops counting for every session in the process on its folder
2026-11-12 14:15:46 +07:00
BFlat ccfe14f671 Merge pull request #6799 from Hassan1305/docs-6340-followup
Commands: draw_shape and object.reflect say which way they turn (#6340 follow-up)
2026-11-12 14:15:37 +07:00
dotCooCoo 8b4fdabb11 Tests: the id and ids comparisons leave plug-in effects out of effect.list's catalog
effect.list's catalog lists the plug-ins installed in the process-wide
registry, which the plug-in tests change while the id and ids comparisons
run in the same test binary. Both comparisons, id against ids of one and
ids against the selection, now take the plug-in effects (plugin.<id>) out
of effect.list's catalog before comparing. The built-in catalog, applied,
activeItem, errors and the document are still compared.
2026-11-11 23:12:33 -08:00
dotCooCoo 5d8065e929 3D (Classic): Revolve (Classic) sweeps a profile with Angle, Cap and Offset and the classic surfaces
Effect › 3D and Materials › 3D (Classic) › Revolve (Classic)… sweeps the
profile round a vertical axis, as Revolve does, and draws every face with
the Wireframe, No Shading, Diffuse and Plastic surfaces of Extrude & Bevel
(Classic).

- `effect.apply` with `threeD.classicRevolve`: Angle (0 to 360), Cap,
  Offset (0 to 1000 pt) from the left or right edge of the profile's
  bounds, the Position rotation and Perspective, and the classic lights,
  Ambient Light, highlight, Blend Steps and Shading Color.
- Groups and layers revolve about one shared axis, and the effect also
  goes on a fill or stroke, as Revolve's does.
- `effect.lightingPreset` refuses it, as it refuses Extrude & Bevel
  (Classic).
- Revolve faces carry their view-space normal, and
  `three_d::revolve_facets` hands them to the classic surface code.
- Unknown parameters, numbers out of range and bad flags, edges,
  surfaces and colors are refused with an error.
2026-11-11 23:04:22 -08:00
dotCooCoo 44d5d20f58 Paragraph Styles: Style Options edits a style's tab stops
Paragraph Style Options and New Paragraph Style gain a Tabs section. It
lists the style's stops and edits the selected stop's Alignment, position
(X:, or Y: for vertical type), Leader and Align On character. Add puts a
left stop 36 pt past the furthest one, Delete Tab removes the selected
stop, and Clear All Tabs leaves the style with no stops. OK sorts the
stops by position and keeps the stop edited last when two share one
position. Reset Panel removes the style's tabs.

paraStyle.new, paraStyle.setAttrs and paraStyle.edit check changed tabs
stop by stop: at most 256 stops, and each changed stop's position from 0
to 100000 pt and leader of at most 8 characters. Stops the style already
has are kept as they are. Changed tabs are sorted by position, keeping
the first of stops at one position. text.tabs.set rejects a leader longer
than 8 characters, an Align On value of more than one character and more
than 256 stops. Loading paragraph styles skips a style whose indents,
spacing, hyphenation, justification or tabs are out of range.

Docs: docs/mcp.md, docs/target-app-parity.md.
2026-11-11 23:02:47 -08:00
dotCooCoo 49c8a380a1 Scripts: flattening a rope keeps it rooted while its copy is reserved
flat_charged and the property-key path now root the rope itself, so a string held only by
native code (a getter's result for ++o.x, a valueOf result, a toString key) still counts
what it holds when the reservation collects. The per-call roots for these cases are removed.
2026-11-11 23:02:45 -08:00
dotCooCoo e846710e85 MCP: the css.exportFile catalog entry matches its desktop description 2026-11-11 23:02:26 -08:00
Hamza 280ca031b5 Stroke options on a group with its own stroke edit that stroke
stroke.set without an item always went to the painted leaves, so a join
set on a group whose stroke is its own (a row in the group's stack)
left that stroke alone and gave every member without a stroke a new
black 1 pt one: on a PDF map, every glyph path got an outline. A
selected group or layer with a stroke row of its own now edits that
row, as the Stroke panel does with the group targeted; other targets
reach their leaves as before. A stroke row made for options alone
(cap, join, miter limit, dashes, alignment) has no paint, so nothing
becomes visible; a weight, an arrowhead or a profile still gives the
black stroke.

Fixes #6739
2026-11-12 12:01:40 +05:00
dotCooCoo c2c560eeaa Scripts: a String object's character is read along its rope when the copy does not fit
When the flattened copy of a String object's concatenated string would pass the heap limit
before a collection can run, the indexed read walks the rope to the unit instead, taking a
unit of fuel for each node it visits, so no copy is made.
2026-11-11 22:57:35 -08:00
dotCooCoo f388a795ce Script checker: a private name that starts with a directive's name is read to its end
Inside braces, a line such as `#include$size = 1` was taken for an `#include` line, because only the ASCII letters, digits and `_` after the `#` were compared with the directive names. The name now runs over every character a name may hold, written out or as an escape, before the comparison.
2026-11-11 22:49:43 -08:00
dotCooCoo 40283f4a38 Scripts: loose equality and the JSON space string keep a converted string rooted while it is flattened 2026-11-11 22:49:15 -08:00